diff --git a/changelog.txt b/changelog.txt
index 9baa08f3..24e74b2b 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -54,7 +54,7 @@ Removed
  - The ability to pass indexes to various ``Project`` methods (#599).
  - The following ``JobsCursor`` methods: ``groupbydoc``, ``next`` (#601, #604).
  - The ``Project.config`` property is no longer mutable. Use the command line ``$ signac config`` to modify configuration (#608, #246, #244).
- - The following config related functions: ``get_config``, ``load_config``, ``read_config_file``, ``search_standard_dirs`` (#674, #753, #789, #847).
+ - The config module and all its functions, all of which have been made private (#674, #753, #789, #847, #877).
  - ``Project`` subclasses can no longer define a ``Job`` subclass to use (#588, #693).
  - The ``Collection`` class (#664, #667, #683).
  - The ``project`` CLI subcommand (#752).
diff --git a/signac/__main__.py b/signac/__main__.py
index b18f54c8..7211be8e 100644
--- a/signac/__main__.py
+++ b/signac/__main__.py
@@ -29,7 +29,15 @@ except ImportError:
 else:
     READLINE = True
 
-from . import config, get_project, init_project
+from . import get_project, init_project
+from ._config import (
+    PROJECT_CONFIG_FN,
+    USER_CONFIG_FN,
+    _Config,
+    _load_config,
+    _locate_config_dir,
+    _read_config_file,
+)
 from ._utility import _add_verbosity_argument, _print_err, _query_yes_no, _safe_relpath
 from ._vendor.configobj import Section, flatten_errors
 from .diff import diff_jobs
@@ -663,12 +671,12 @@ def main_config_show(args):
     if args.local and args.globalcfg:
         raise ValueError("You can specify either -l/--local or -g/--global, not both.")
     elif args.local:
-        if os.path.isfile(config.PROJECT_CONFIG_FN):
-            cfg = config._read_config_file(config.PROJECT_CONFIG_FN)
+        if os.path.isfile(PROJECT_CONFIG_FN):
+            cfg = _read_config_file(PROJECT_CONFIG_FN)
     elif args.globalcfg:
-        cfg = config._read_config_file(config.USER_CONFIG_FN)
+        cfg = _read_config_file(USER_CONFIG_FN)
     else:
-        cfg = config._load_config(config._locate_config_dir(os.getcwd()))
+        cfg = _load_config(_locate_config_dir(os.getcwd()))
     if not cfg:
         if args.local:
             mode = "local"
@@ -686,7 +694,7 @@ def main_config_show(args):
     if not isinstance(cfg, Section):
         print(cfg)
     else:
-        for line in config._Config(cfg).write():
+        for line in _Config(cfg).write():
             print(line)
 
 
@@ -717,12 +725,12 @@ def main_config_verify(args):
     if args.local and args.globalcfg:
         raise ValueError("You can specify either -l/--local or -g/--global, not both.")
     elif args.local:
-        if os.path.isfile(config.PROJECT_CONFIG_FN):
-            cfg = config._read_config_file(config.PROJECT_CONFIG_FN)
+        if os.path.isfile(PROJECT_CONFIG_FN):
+            cfg = _read_config_file(PROJECT_CONFIG_FN)
     elif args.globalcfg:
-        cfg = config._read_config_file(config.USER_CONFIG_FN)
+        cfg = _read_config_file(USER_CONFIG_FN)
     else:
-        cfg = config._load_config(config._locate_config_dir(os.getcwd()))
+        cfg = _load_config(_locate_config_dir(os.getcwd()))
     if not cfg:
         if args.local:
             mode = "local"
@@ -746,16 +754,16 @@ def main_config_set(args):
     if args.local and args.globalcfg:
         raise ValueError("You can specify either -l/--local or -g/--global, not both.")
     elif args.local:
-        if os.path.isfile(config.PROJECT_CONFIG_FN):
-            fn_config = config.PROJECT_CONFIG_FN
+        if os.path.isfile(PROJECT_CONFIG_FN):
+            fn_config = PROJECT_CONFIG_FN
     elif args.globalcfg:
-        fn_config = config.USER_CONFIG_FN
+        fn_config = USER_CONFIG_FN
     else:
         raise ValueError(
             "You need to specify either -l/--local or -g/--global "
             "to specify which configuration to modify."
         )
-    cfg = config._read_config_file(fn_config)
+    cfg = _read_config_file(fn_config)
     keys = args.key.split(".")
     if len(args.value) == 0:
         raise ValueError("No value argument provided!")
diff --git a/signac/config.py b/signac/_config.py
similarity index 100%
rename from signac/config.py
rename to signac/_config.py
diff --git a/signac/migration/v1_to_v2.py b/signac/migration/v1_to_v2.py
index e2da1e52..224c1d58 100644
--- a/signac/migration/v1_to_v2.py
+++ b/signac/migration/v1_to_v2.py
@@ -15,11 +15,10 @@ This migration involves the following changes:
 
 import os
 
-from signac._synced_collections.backends.collection_json import BufferedJSONAttrDict
-from signac._vendor import configobj
-from signac.config import _get_project_config_fn
-from signac.project import Project
-
+from .._config import _get_project_config_fn
+from .._synced_collections.backends.collection_json import BufferedJSONAttrDict
+from .._vendor import configobj
+from ..project import Project
 from .v0_to_v1 import _load_config_v1
 
 # A minimal v2 config.
diff --git a/signac/project.py b/signac/project.py
index fe43f5cb..54c76bf9 100644
--- a/signac/project.py
+++ b/signac/project.py
@@ -20,10 +20,7 @@ from multiprocessing.pool import ThreadPool
 from tempfile import TemporaryDirectory
 from threading import RLock
 
-from ._search_indexer import _SearchIndexer
-from ._synced_collections.backends.collection_json import BufferedJSONAttrDict
-from ._utility import _mkdir_p, _nested_dicts_to_dotted_keys, _split_and_print_progress
-from .config import (
+from ._config import (
     _Config,
     _get_project_config_fn,
     _load_config,
@@ -31,6 +28,9 @@ from .config import (
     _raise_if_older_schema,
     _read_config_file,
 )
+from ._search_indexer import _SearchIndexer
+from ._synced_collections.backends.collection_json import BufferedJSONAttrDict
+from ._utility import _mkdir_p, _nested_dicts_to_dotted_keys, _split_and_print_progress
 from .errors import (
     DestinationExistsError,
     IncompatibleSchemaVersion,

diff --git a/tests/test_job.py b/tests/test_job.py
index 3979461f..85df7de8 100644
--- a/tests/test_job.py
+++ b/tests/test_job.py
@@ -12,7 +12,8 @@ from tempfile import TemporaryDirectory
 
 import pytest
 
-import signac.config
+import signac
+from signac._config import _load_config
 from signac.errors import (
     DestinationExistsError,
     InvalidKeyError,
@@ -64,7 +65,7 @@ class TestJobBase:
         request.addfinalizer(self._tmp_dir.cleanup)
         self._tmp_pr = os.path.join(self._tmp_dir.name, "pr")
         os.mkdir(self._tmp_pr)
-        self.config = signac.config._load_config()
+        self.config = _load_config()
         self.project = self.project_class.init_project(path=self._tmp_pr)
 
     def tearDown(self):
diff --git a/tests/test_project.py b/tests/test_project.py
index e5c9cca6..42b860b3 100644
--- a/tests/test_project.py
+++ b/tests/test_project.py
@@ -22,7 +22,7 @@ from packaging import version
 from test_job import TestJobBase
 
 import signac
-from signac.config import (
+from signac._config import (
     PROJECT_CONFIG_FN,
     _get_project_config_fn,
     _load_config,
diff --git a/tests/test_shell.py b/tests/test_shell.py
index 83fd1d37..073223e7 100644
--- a/tests/test_shell.py
+++ b/tests/test_shell.py
@@ -12,7 +12,7 @@ import pytest
 from test_project import _initialize_v1_project
 
 import signac
-from signac import config
+from signac._config import USER_CONFIG_FN, _Config, _load_config, _read_config_file
 
 # Skip linked view tests on Windows
 WINDOWS = sys.platform == "win32"
@@ -743,18 +743,18 @@ class TestBasicShell:
 
         self.call("python -m signac init".split())
         out = self.call("python -m signac config --local show".split()).strip()
-        cfg = config._read_config_file(".signac/config")
-        expected = config._Config(cfg).write()
+        cfg = _read_config_file(".signac/config")
+        expected = _Config(cfg).write()
         assert out.split(os.linesep) == expected
 
         out = self.call("python -m signac config show".split()).strip()
-        cfg = config._load_config()
-        expected = config._Config(cfg).write()
+        cfg = _load_config()
+        expected = _Config(cfg).write()
         assert out.split(os.linesep) == expected
 
         out = self.call("python -m signac config --global show".split()).strip()
-        cfg = config._read_config_file(config.USER_CONFIG_FN)
-        expected = config._Config(cfg).write()
+        cfg = _read_config_file(USER_CONFIG_FN)
+        expected = _Config(cfg).write()
         assert out.split(os.linesep) == expected
 
     def test_config_set(self):
@@ -769,12 +769,12 @@ class TestBasicShell:
         assert "[x]" in cfg
         assert "y = z" in cfg
 
-        backup_config = os.path.exists(config.USER_CONFIG_FN)
-        global_config_path_backup = config.USER_CONFIG_FN + ".tmp"
+        backup_config = os.path.exists(USER_CONFIG_FN)
+        global_config_path_backup = USER_CONFIG_FN + ".tmp"
         try:
             # Make a backup of the global config if it exists
             if backup_config:
-                shutil.copy2(config.USER_CONFIG_FN, global_config_path_backup)
+                shutil.copy2(USER_CONFIG_FN, global_config_path_backup)
 
             # Test the global config CLI
             self.call("python -m signac config --global set b c".split())
@@ -785,9 +785,9 @@ class TestBasicShell:
             # Revert the global config to its previous state (or remove it if
             # it did not exist)
             if backup_config:
-                shutil.move(global_config_path_backup, config.USER_CONFIG_FN)
+                shutil.move(global_config_path_backup, USER_CONFIG_FN)
             else:
-                os.remove(config.USER_CONFIG_FN)
+                os.remove(USER_CONFIG_FN)
 
     def test_config_verify(self):
         # no config file

Make config module internal
The config.py module no longer contains any public APIs. The only publicly visible items are the constants `PROJECT_CONFIG_FN` and `USER_CONFIG_FN`. Should we change this module to `_config`? If so, do we want to keep those two variables public so that users can easily and programmatically see where to expect signac's config files to be stored? To do so I would suggest importing those into `signac/__init__.py` and adding them to `__all__` in that package.
tests/test_job.py::TestJobID::test_builtins tests/test_job.py::TestJobID::test_shuffle tests/test_job.py::TestJobID::test_nested tests/test_job.py::TestJobID::test_sequences_identity tests/test_job.py::TestJob::test_repr tests/test_job.py::TestJob::test_str tests/test_job.py::TestJob::test_eq tests/test_job.py::TestJob::test_isfile tests/test_job.py::TestJob::test_copy tests/test_job.py::TestJob::test_deepcopy tests/test_job.py::TestJob::test_project_access_from_job tests/test_job.py::TestJob::test_custom_project_access_from_job tests/test_job.py::TestJobSpInterface::test_interface_read_only tests/test_job.py::TestJobSpInterface::test_interface_contains tests/test_job.py::TestJobSpInterface::test_interface_read_write tests/test_job.py::TestJobSpInterface::test_interface_job_identity_change tests/test_job.py::TestJobSpInterface::test_interface_nested_kws tests/test_job.py::TestJobSpInterface::test_interface_lists tests/test_job.py::TestJobSpInterface::test_interface_reserved_keywords tests/test_job.py::TestJobSpInterface::test_interface_illegal_type tests/test_job.py::TestJobSpInterface::test_interface_rename tests/test_job.py::TestJobSpInterface::test_interface_copy tests/test_job.py::TestJobSpInterface::test_interface_deepcopy tests/test_job.py::TestJobSpInterface::test_interface_add tests/test_job.py::TestJobSpInterface::test_interface_delete tests/test_job.py::TestJobSpInterface::test_interface_destination_conflict tests/test_job.py::TestJobSpInterface::test_interface_multiple_changes tests/test_job.py::TestJobSpInterface::test_valid_sp_key_types tests/test_job.py::TestJobSpInterface::test_invalid_sp_key_types tests/test_job.py::TestJobSpInterface::test_valid_doc_key_types tests/test_job.py::TestJobSpInterface::test_invalid_doc_key_types tests/test_job.py::TestConfig::test_config_str tests/test_job.py::TestJobOpenAndClosing::test_init tests/test_job.py::TestJobOpenAndClosing::test_chained_init tests/test_job.py::TestJobOpenAndClosing::test_construction tests/test_job.py::TestJobOpenAndClosing::test_open_job_close tests/test_job.py::TestJobOpenAndClosing::test_open_job_close_manual tests/test_job.py::TestJobOpenAndClosing::test_open_job_close_with_error tests/test_job.py::TestJobOpenAndClosing::test_reopen_job tests/test_job.py::TestJobOpenAndClosing::test_close_nonopen_job tests/test_job.py::TestJobOpenAndClosing::test_close_job_while_open tests/test_job.py::TestJobOpenAndClosing::test_open_job_recursive tests/test_job.py::TestJobOpenAndClosing::test_corrupt_workspace tests/test_job.py::TestJobDocument::test_get_set tests/test_job.py::TestJobDocument::test_del tests/test_job.py::TestJobDocument::test_get_set_doc tests/test_job.py::TestJobDocument::test_set_set_doc tests/test_job.py::TestJobDocument::test_get_set_nested tests/test_job.py::TestJobDocument::test_get_set_nested_doc tests/test_job.py::TestJobDocument::test_assign tests/test_job.py::TestJobDocument::test_assign_doc tests/test_job.py::TestJobDocument::test_copy_document tests/test_job.py::TestJobDocument::test_update tests/test_job.py::TestJobDocument::test_clear_document tests/test_job.py::TestJobDocument::test_reopen tests/test_job.py::TestJobDocument::test_concurrency tests/test_job.py::TestJobDocument::test_remove tests/test_job.py::TestJobDocument::test_clear_job tests/test_job.py::TestJobDocument::test_reset tests/test_job.py::TestJobDocument::test_doc tests/test_job.py::TestJobDocument::test_sp_formatting tests/test_job.py::TestJobDocument::test_doc_formatting tests/test_project.py::TestProject::test_repr tests/test_project.py::TestProject::test_str tests/test_project.py::TestProject::test_path tests/test_project.py::TestProject::test_workspace_directory tests/test_project.py::TestProject::test_config_modification tests/test_project.py::TestProject::test_workspace_directory_exists tests/test_project.py::TestProject::test_fn tests/test_project.py::TestProject::test_isfile tests/test_project.py::TestProject::test_document tests/test_project.py::TestProject::test_doc tests/test_project.py::TestProject::test_no_workspace_warn_on_find tests/test_project.py::TestProject::test_workspace_broken_link_error_on_find tests/test_project.py::TestProject::test_workspace_read_only_path tests/test_project.py::TestProject::test_find_jobs tests/test_project.py::TestProject::test_find_jobs_JobsCursor_contains tests/test_project.py::TestProject::test_find_jobs_arithmetic_operators tests/test_project.py::TestProject::test_find_jobs_logical_operators tests/test_project.py::TestProject::test_len_project tests/test_project.py::TestProject::test_len_find_jobs tests/test_project.py::TestProject::test_iteration tests/test_project.py::TestProject::test_open_job_by_id tests/test_project.py::TestProject::test_open_job_no_id_or_statepoint tests/test_project.py::TestProject::test_open_job_by_abbreviated_id tests/test_project.py::TestProject::test_missing_statepoint_file tests/test_project.py::TestProject::test_corrupted_statepoint_file tests/test_project.py::TestProject::test_rename_workspace tests/test_project.py::TestProject::test_repair_corrupted_workspace tests/test_project.py::TestProject::test_index tests/test_project.py::TestProject::test_custom_project tests/test_project.py::TestProject::test_project_contains tests/test_project.py::TestProject::test_JobsCursor_contains tests/test_project.py::TestProject::test_job_move tests/test_project.py::TestProject::test_job_clone tests/test_project.py::TestProject::test_schema_init tests/test_project.py::TestProject::test_schema tests/test_project.py::TestProject::test_schema_subset tests/test_project.py::TestProject::test_schema_difference tests/test_project.py::TestProject::test_schema_format tests/test_project.py::TestProject::test_jobs_groupby tests/test_project.py::TestProject::test_temp_project tests/test_project.py::TestProjectExportImport::test_export tests/test_project.py::TestProjectExportImport::test_export_single_job tests/test_project.py::TestProjectExportImport::test_export_custom_path_function tests/test_project.py::TestProjectExportImport::test_export_custom_path_string_modify_tree_flat tests/test_project.py::TestProjectExportImport::test_export_custom_path_string_modify_tree_tree tests/test_project.py::TestProjectExportImport::test_export_custom_path_string_modify_flat_flat tests/test_project.py::TestProjectExportImport::test_export_custom_path_string_modify_flat_tree tests/test_project.py::TestProjectExportImport::test_export_custom_path_string tests/test_project.py::TestProjectExportImport::test_export_move tests/test_project.py::TestProjectExportImport::test_export_custom_path_function_move tests/test_project.py::TestProjectExportImport::test_export_import_tarfile tests/test_project.py::TestProjectExportImport::test_export_import_tarfile_zipped_longname tests/test_project.py::TestProjectExportImport::test_export_import_tarfile_zipped tests/test_project.py::TestProjectExportImport::test_export_import_zipfile tests/test_project.py::TestProjectExportImport::test_export_import tests/test_project.py::TestProjectExportImport::test_export_import_conflict tests/test_project.py::TestProjectExportImport::test_export_import_conflict_synced tests/test_project.py::TestProjectExportImport::test_export_import_conflict_synced_with_args tests/test_project.py::TestProjectExportImport::test_export_import_schema_callable tests/test_project.py::TestProjectExportImport::test_export_import_schema_callable_non_unique tests/test_project.py::TestProjectExportImport::test_export_import_simple_path tests/test_project.py::TestProjectExportImport::test_export_import_simple_path_nested_with_schema tests/test_project.py::TestProjectExportImport::test_export_import_simple_path_with_float tests/test_project.py::TestProjectExportImport::test_export_import_complex_path tests/test_project.py::TestProjectExportImport::test_export_import_simple_path_schema_from_path tests/test_project.py::TestProjectExportImport::test_export_import_simple_path_schema_from_path_float tests/test_project.py::TestProjectExportImport::test_export_import_complex_path_nested_schema_from_path tests/test_project.py::TestProjectExportImport::test_import_own_project tests/test_project.py::TestProjectRepresentation::test_Schema_repr_methods[add_jobs_homogeneous-0] tests/test_project.py::TestProjectRepresentation::test_Schema_repr_methods[add_jobs_homogeneous-10] tests/test_project.py::TestProjectRepresentation::test_Schema_repr_methods[add_jobs_homogeneous-200] tests/test_project.py::TestProjectRepresentation::test_Schema_repr_methods[add_jobs_heterogeneous-0] tests/test_project.py::TestProjectRepresentation::test_Schema_repr_methods[add_jobs_heterogeneous-10] tests/test_project.py::TestProjectRepresentation::test_Schema_repr_methods[add_jobs_heterogeneous-200] tests/test_project.py::TestLinkedViewProject::test_create_linked_view tests/test_project.py::TestLinkedViewProject::test_create_linked_view_homogeneous_schema_tree tests/test_project.py::TestLinkedViewProject::test_create_linked_view_homogeneous_schema_tree_tree tests/test_project.py::TestLinkedViewProject::test_create_linked_view_homogeneous_schema_tree_flat tests/test_project.py::TestLinkedViewProject::test_create_linked_view_homogeneous_schema_flat_flat tests/test_project.py::TestLinkedViewProject::test_create_linked_view_homogeneous_schema_flat_tree tests/test_project.py::TestLinkedViewProject::test_create_linked_view_homogeneous_schema_nested tests/test_project.py::TestLinkedViewProject::test_create_linked_view_homogeneous_schema_nested_provide_partial_path tests/test_project.py::TestLinkedViewProject::test_create_linked_view_heterogeneous_disjoint_schema tests/test_project.py::TestLinkedViewProject::test_create_linked_view_heterogeneous_disjoint_schema_nested tests/test_project.py::TestLinkedViewProject::test_create_linked_view_heterogeneous_fizz_schema_flat tests/test_project.py::TestLinkedViewProject::test_create_linked_view_heterogeneous_schema_nested tests/test_project.py::TestLinkedViewProject::test_create_linked_view_heterogeneous_schema_nested_partial_homogenous_path_provide tests/test_project.py::TestLinkedViewProject::test_create_linked_view_heterogeneous_schema_problematic tests/test_project.py::TestLinkedViewProject::test_create_linked_view_with_slash_raises_error tests/test_project.py::TestLinkedViewProject::test_create_linked_view_duplicate_paths tests/test_project.py::TestCachedProject::test_str tests/test_project.py::TestCachedProject::test_path tests/test_project.py::TestCachedProject::test_workspace_directory tests/test_project.py::TestCachedProject::test_config_modification tests/test_project.py::TestCachedProject::test_workspace_directory_exists tests/test_project.py::TestCachedProject::test_fn tests/test_project.py::TestCachedProject::test_isfile tests/test_project.py::TestCachedProject::test_document tests/test_project.py::TestCachedProject::test_doc tests/test_project.py::TestCachedProject::test_no_workspace_warn_on_find tests/test_project.py::TestCachedProject::test_workspace_broken_link_error_on_find tests/test_project.py::TestCachedProject::test_workspace_read_only_path tests/test_project.py::TestCachedProject::test_find_jobs tests/test_project.py::TestCachedProject::test_find_jobs_JobsCursor_contains tests/test_project.py::TestCachedProject::test_find_jobs_arithmetic_operators tests/test_project.py::TestCachedProject::test_find_jobs_logical_operators tests/test_project.py::TestCachedProject::test_len_project tests/test_project.py::TestCachedProject::test_len_find_jobs tests/test_project.py::TestCachedProject::test_iteration tests/test_project.py::TestCachedProject::test_open_job_by_id tests/test_project.py::TestCachedProject::test_open_job_no_id_or_statepoint tests/test_project.py::TestCachedProject::test_open_job_by_abbreviated_id tests/test_project.py::TestCachedProject::test_missing_statepoint_file tests/test_project.py::TestCachedProject::test_corrupted_statepoint_file tests/test_project.py::TestCachedProject::test_rename_workspace tests/test_project.py::TestCachedProject::test_repair_corrupted_workspace tests/test_project.py::TestCachedProject::test_index tests/test_project.py::TestCachedProject::test_custom_project tests/test_project.py::TestCachedProject::test_project_contains tests/test_project.py::TestCachedProject::test_JobsCursor_contains tests/test_project.py::TestCachedProject::test_job_move tests/test_project.py::TestCachedProject::test_job_clone tests/test_project.py::TestCachedProject::test_schema_init tests/test_project.py::TestCachedProject::test_schema tests/test_project.py::TestCachedProject::test_schema_subset tests/test_project.py::TestCachedProject::test_schema_difference tests/test_project.py::TestCachedProject::test_schema_format tests/test_project.py::TestCachedProject::test_jobs_groupby tests/test_project.py::TestCachedProject::test_temp_project tests/test_project.py::TestCachedProject::test_repr tests/test_project.py::TestProjectInit::test_get_project tests/test_project.py::TestProjectInit::test_get_project_non_local tests/test_project.py::TestProjectInit::test_init tests/test_project.py::TestProjectInit::test_nested_project tests/test_project.py::TestProjectInit::test_get_job_valid_workspace tests/test_project.py::TestProjectInit::test_get_job_invalid_workspace tests/test_project.py::TestProjectInit::test_get_job_nested_project tests/test_project.py::TestProjectInit::test_get_job_subdir tests/test_project.py::TestProjectInit::test_get_job_nested_project_subdir tests/test_project.py::TestProjectInit::test_get_job_symlink_other_project tests/test_project.py::TestProjectSchema::test_project_schema_versions tests/test_project.py::TestSchemaMigration::test_project_schema_version_migration[True-True-True] tests/test_project.py::TestSchemaMigration::test_project_schema_version_migration[True-True-False] tests/test_project.py::TestSchemaMigration::test_project_schema_version_migration[True-False-True] tests/test_project.py::TestSchemaMigration::test_project_schema_version_migration[True-False-False] tests/test_project.py::TestSchemaMigration::test_project_schema_version_migration[False-True-True] tests/test_project.py::TestSchemaMigration::test_project_schema_version_migration[False-True-False] tests/test_project.py::TestSchemaMigration::test_project_schema_version_migration[False-False-True] tests/test_project.py::TestSchemaMigration::test_project_schema_version_migration[False-False-False] tests/test_project.py::TestSchemaMigration::test_project_init_old_schema tests/test_project.py::TestProjectPickling::test_pickle_project_empty tests/test_project.py::TestProjectPickling::test_pickle_project_with_jobs tests/test_project.py::TestProjectPickling::test_pickle_jobs_directly tests/test_shell.py::TestBasicShell::test_print_usage tests/test_shell.py::TestBasicShell::test_version tests/test_shell.py::TestBasicShell::test_help tests/test_shell.py::TestBasicShell::test_init_project tests/test_shell.py::TestBasicShell::test_job_with_argument tests/test_shell.py::TestBasicShell::test_job_with_argument_workspace tests/test_shell.py::TestBasicShell::test_job_with_argument_create_workspace tests/test_shell.py::TestBasicShell::test_statepoint tests/test_shell.py::TestBasicShell::test_document tests/test_shell.py::TestBasicShell::test_view_single tests/test_shell.py::TestBasicShell::test_view tests/test_shell.py::TestBasicShell::test_view_prefix tests/test_shell.py::TestBasicShell::test_view_incomplete_path_spec tests/test_shell.py::TestBasicShell::test_find tests/test_shell.py::TestBasicShell::test_diff tests/test_shell.py::TestBasicShell::test_clone tests/test_shell.py::TestBasicShell::test_move tests/test_shell.py::TestBasicShell::test_remove tests/test_shell.py::TestBasicShell::test_schema tests/test_shell.py::TestBasicShell::test_sync tests/test_shell.py::TestBasicShell::test_sync_merge tests/test_shell.py::TestBasicShell::test_sync_document tests/test_shell.py::TestBasicShell::test_sync_file tests/test_shell.py::TestBasicShell::test_export tests/test_shell.py::TestBasicShell::test_import tests/test_shell.py::TestBasicShell::test_import_sync tests/test_shell.py::TestBasicShell::test_shell tests/test_shell.py::TestBasicShell::test_shell_with_jobs tests/test_shell.py::TestBasicShell::test_shell_with_jobs_and_selection tests/test_shell.py::TestBasicShell::test_shell_with_jobs_and_selection_only_one_job tests/test_shell.py::TestBasicShell::test_config_show tests/test_shell.py::TestBasicShell::test_config_set tests/test_shell.py::TestBasicShell::test_config_verify tests/test_shell.py::TestBasicShell::test_update_cache tests/test_shell.py::TestBasicShell::test_migrate_v1_to_v2