From dc001423ede77608570aa900f6f245cb3b0fbd76 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Wed, 26 Aug 2020 09:23:15 -0500 Subject: [PATCH 1/4] Remove dependency on pytest-subtests. --- requirements-dev.txt | 1 - tests/test_project.py | 131 +++++++++++++++++++----------------------- 2 files changed, 58 insertions(+), 74 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index bef682c06..c827bc8b2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,7 +5,6 @@ numpy==1.19.1 pandas==1.1.0; implementation_name=='cpython' pymongo==3.11.0; implementation_name=='cpython' pytest-cov==2.10.0 -pytest-subtests==0.3.2 pytest==6.0.1 ruamel.yaml==0.16.10 tables==3.6.1; implementation_name=='cpython' diff --git a/tests/test_project.py b/tests/test_project.py index fba2f0c9e..34f56ccb6 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -1480,85 +1480,68 @@ def test_import_own_project(self): assert len(tmp_project) == len(self.project) -class TestProjectRepresentation(TestProjectBase): +def add_jobs_homogeneous(project, num_jobs): + # Add jobs with many different state points + valid_sp_values = [None, 0, 1, 0.0, 1.0, True, False, [0, 1, 2], [0, 1.0, False]] + for i in range(num_jobs): + project.open_job( + {'{}_{}'.format(i, j): v + for j, v in enumerate(valid_sp_values)}).init() + +def add_jobs_heterogeneous(project, num_jobs): + # Add jobs with many different state points valid_sp_values = [None, 0, 1, 0.0, 1.0, True, False, [0, 1, 2], [0, 1.0, False]] + for i in range(num_jobs): + for v in valid_sp_values: + project.open_job(dict(a=v)).init() + + +project_repr_generators = [ + (add_jobs_homogeneous, 0), + (add_jobs_homogeneous, 10), + (add_jobs_homogeneous, 200), + (add_jobs_heterogeneous, 0), + (add_jobs_heterogeneous, 10), + (add_jobs_heterogeneous, 200)] + + +class TestProjectRepresentation(TestProjectBase): num_few_jobs = 10 num_many_jobs = 200 - def call_repr_methods(self, subtests): - - with subtests.test(of='project'): - with subtests.test(type='str'): - str(self.project) - with subtests.test(type='repr'): - assert eval(repr(self.project)) == self.project - with subtests.test(type='html'): - for use_pandas in (True, False): - type(self.project)._use_pandas_for_html_repr = use_pandas - with subtests.test(use_pandas=use_pandas): - if use_pandas and not PANDAS: - raise pytest.skip('requires use_pandas') - self.project._repr_html_() - - with subtests.test(of='JobsCursor'): - for filter_ in (None, ): - with subtests.test(filter=filter_): - with subtests.test(type='str'): - str(self.project.find_jobs(filter_)) - with subtests.test(type='repr'): - q = self.project.find_jobs(filter_) - assert eval(repr(q)) == q - with subtests.test(type='html'): - for use_pandas in (True, False): - type(self.project)._use_pandas_for_html_repr = use_pandas - with subtests.test(use_pandas=use_pandas): - if use_pandas and not PANDAS: - raise pytest.skip('requires use_pandas') - self.project.find_jobs(filter_)._repr_html_() - - with subtests.test(of='Schema'): - schema = self.project.detect_schema() - with subtests.test(type='str'): - str(schema) - with subtests.test(type='repr'): - repr(schema) - with subtests.test(type='html'): - schema._repr_html_() - - def test_repr_no_jobs(self, subtests): - self.call_repr_methods(subtests) - - def test_repr_few_jobs_homogeneous(self, subtests): - # Many jobs with many different state points - for i in range(self.num_few_jobs): - self.project.open_job( - {'{}_{}'.format(i, j): v - for j, v in enumerate(self.valid_sp_values)}).init() - self.call_repr_methods(subtests) - - def test_repr_many_jobs_homogeneous(self, subtests): - # Many jobs with many different state points - for i in range(self.num_many_jobs): - self.project.open_job( - {'{}_{}'.format(i, j): v - for j, v in enumerate(self.valid_sp_values)}).init() - self.call_repr_methods(subtests) - - def test_repr_few_jobs_heterogeneous(self, subtests): - # Many jobs with many different state points - for i in range(self.num_few_jobs): - for v in self.valid_sp_values: - self.project.open_job(dict(a=v)).init() - self.call_repr_methods(subtests) - - def test_repr_many_jobs_heterogeneous(self, subtests): - # Many jobs with many different state points - for i in range(self.num_many_jobs): - for v in self.valid_sp_values: - self.project.open_job(dict(a=v)).init() - self.call_repr_methods(subtests) + @pytest.mark.parametrize("project_generator,num_jobs", project_repr_generators) + def test_project_repr_methods(self, project_generator, num_jobs): + project_generator(self.project, num_jobs) + str(self.project) + assert eval(repr(self.project)) == self.project + for use_pandas in (True, False): + type(self.project)._use_pandas_for_html_repr = use_pandas + if use_pandas and not PANDAS: + raise pytest.skip('requires use_pandas') + self.project._repr_html_() + + @pytest.mark.parametrize("project_generator,num_jobs", project_repr_generators) + def test_JobsCursor_repr_methods(self, project_generator, num_jobs): + project_generator(self.project, num_jobs) + for filter_ in (None, ): + str(self.project.find_jobs(filter_)) + q = self.project.find_jobs(filter_) + assert eval(repr(q)) == q + for use_pandas in (True, False): + type(self.project)._use_pandas_for_html_repr = use_pandas + if use_pandas and not PANDAS: + raise pytest.skip('requires use_pandas') + self.project.find_jobs(filter_)._repr_html_() + + @pytest.mark.parametrize("project_generator,num_jobs", project_repr_generators) + def test_Schema_repr_methods(self, project_generator, num_jobs): + project_generator(self.project, num_jobs) + schema = self.project.detect_schema() + str(schema) + repr(schema) + schema._repr_html_() class TestLinkedViewProject(TestProjectBase): @@ -2280,6 +2263,7 @@ class TestProjectStore(TestProjectStoreBase, test_h5store.TestH5Store): the project data interface opens one instance of H5Store. This test will (and should) fail using the project data interface. """ + def test_assign_valid_types_within_same_file(self): pass @@ -2291,6 +2275,7 @@ class TestProjectStoreOpen(TestProjectStoreBase, test_h5store.TestH5StoreOpen): the project data interface opens one instance of H5Store. This test will (and should) fail using the project data interface. """ + def test_open_write_and_read_only(self): pass From dab41fbaa108de117b664237715964da3020015e Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Wed, 26 Aug 2020 09:28:36 -0500 Subject: [PATCH 2/4] Update changelog. --- changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.txt b/changelog.txt index 91d82ffbb..3eb0e6f9d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -34,6 +34,7 @@ Removed +++++++ - Dropped support for Python 3.5 (#340). The signac project will follow the `NEP 29 deprecation policy `_ going forward. + - Removed dependency on ``pytest-subtests`` (#379). [1.4.0] -- 2020-02-28 From f80ab4d1225c6d2dad972da4aef26b639eb9c87c Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Wed, 26 Aug 2020 15:48:43 -0500 Subject: [PATCH 3/4] Expand tests for project str, repr. --- tests/test_project.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/test_project.py b/tests/test_project.py index 34f56ccb6..423bea8d2 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -1514,7 +1514,9 @@ class TestProjectRepresentation(TestProjectBase): @pytest.mark.parametrize("project_generator,num_jobs", project_repr_generators) def test_project_repr_methods(self, project_generator, num_jobs): project_generator(self.project, num_jobs) - str(self.project) + assert len(str(self.project)) > 0 + assert 'project' in str(self.project) + assert len(repr(self.project)) > 0 assert eval(repr(self.project)) == self.project for use_pandas in (True, False): type(self.project)._use_pandas_for_html_repr = use_pandas @@ -1526,7 +1528,8 @@ def test_project_repr_methods(self, project_generator, num_jobs): def test_JobsCursor_repr_methods(self, project_generator, num_jobs): project_generator(self.project, num_jobs) for filter_ in (None, ): - str(self.project.find_jobs(filter_)) + assert len(str(self.project.find_jobs(filter_))) > 0 + assert len(repr(self.project.find_jobs(filter_))) > 0 q = self.project.find_jobs(filter_) assert eval(repr(q)) == q for use_pandas in (True, False): @@ -1539,8 +1542,8 @@ def test_JobsCursor_repr_methods(self, project_generator, num_jobs): def test_Schema_repr_methods(self, project_generator, num_jobs): project_generator(self.project, num_jobs) schema = self.project.detect_schema() - str(schema) - repr(schema) + assert len(str(schema)) > 0 + assert len(repr(schema)) > 0 schema._repr_html_() From af3295c06d5bf5ee538bfa9a75c60a0e37e120b2 Mon Sep 17 00:00:00 2001 From: Bradley Dice Date: Wed, 9 Sep 2020 13:57:27 -0500 Subject: [PATCH 4/4] Use module-level constant for valid state point values. --- tests/test_project.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/test_project.py b/tests/test_project.py index 423bea8d2..c620daa5f 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -1480,20 +1480,21 @@ def test_import_own_project(self): assert len(tmp_project) == len(self.project) +VALID_SP_VALUES = [None, 0, 1, 0.0, 1.0, True, False, [0, 1, 2], [0, 1.0, False]] + + def add_jobs_homogeneous(project, num_jobs): # Add jobs with many different state points - valid_sp_values = [None, 0, 1, 0.0, 1.0, True, False, [0, 1, 2], [0, 1.0, False]] for i in range(num_jobs): project.open_job( {'{}_{}'.format(i, j): v - for j, v in enumerate(valid_sp_values)}).init() + for j, v in enumerate(VALID_SP_VALUES)}).init() def add_jobs_heterogeneous(project, num_jobs): # Add jobs with many different state points - valid_sp_values = [None, 0, 1, 0.0, 1.0, True, False, [0, 1, 2], [0, 1.0, False]] for i in range(num_jobs): - for v in valid_sp_values: + for v in VALID_SP_VALUES: project.open_job(dict(a=v)).init()