From 06af3d02ebf0b3daad485477b22e96a090316221 Mon Sep 17 00:00:00 2001 From: Albert DeFusco Date: Wed, 29 Jul 2020 07:20:21 -0400 Subject: [PATCH] tests pass A project file without an env_spec or packages is valid if there is an environment.yml file. --- .../internal/cli/test/test_prepare.py | 2 +- anaconda_project/project.py | 57 ++++++++++--------- anaconda_project/test/test_project.py | 30 +++++----- anaconda_project/test/test_project_ops.py | 5 +- 4 files changed, 50 insertions(+), 44 deletions(-) diff --git a/anaconda_project/internal/cli/test/test_prepare.py b/anaconda_project/internal/cli/test/test_prepare.py index 80dd90e5..ad76a501 100644 --- a/anaconda_project/internal/cli/test/test_prepare.py +++ b/anaconda_project/internal/cli/test/test_prepare.py @@ -103,7 +103,7 @@ def _mock_prepare_do_not_keep_going(project, def main_redis_url(dirname): project_dir_disable_dedicated_env(dirname) - code = main(Args(directory=dirname, all=False, refresh=False)) + code = main(Args(directory=dirname, all=False, refresh=False, python=None)) assert 1 == code with_directory_contents_completing_project_file({DEFAULT_PROJECT_FILENAME: """ diff --git a/anaconda_project/project.py b/anaconda_project/project.py index f768b62a..f0fa272b 100644 --- a/anaconda_project/project.py +++ b/anaconda_project/project.py @@ -829,33 +829,36 @@ def set_env_spec_platforms(project): importable_spec = None if importable_spec is not None: - project_file.set_value(['env_specs', importable_spec.name], importable_spec.to_json()) - project_file.use_changes_without_saving() - # print(project_file._yaml) - # if old is None: - # text = "Environment spec '%s' from %s is not in %s." % (importable_spec.name, importable_filename, - # os.path.basename(project_file.filename)) - # prompt = "Add env spec %s to %s?" % (importable_spec.name, os.path.basename(project_file.filename)) - # else: - # text = "Environment spec '%s' from %s is out of sync with %s. Diff:\n%s" % ( - # importable_spec.name, importable_filename, os.path.basename(project_file.filename), - # importable_spec.diff_from(old)) - # prompt = "Overwrite env spec %s with the changes from %s?" % (importable_spec.name, importable_filename) - - # def overwrite_env_spec_from_importable(project): - # project.project_file.set_value(['env_specs', importable_spec.name], importable_spec.to_json()) - - # def remember_no_import_importable(project): - # project.project_file.set_value(['skip_imports', 'environment'], importable_spec.logical_hash) - - # # we don't set the filename here because it isn't really an error in the - # # file, it ends up reading strangely. - # problems.append( - # ProjectProblem( - # text=text, - # fix_prompt=prompt, - # fix_function=overwrite_env_spec_from_importable, - # no_fix_function=remember_no_import_importable)) + env_specs = project_file.get_value('env_specs', {}) + if not env_specs: + project_file.set_value(['env_specs', importable_spec.name], importable_spec.to_json()) + project_file.use_changes_without_saving() + else: + if old is None: + text = "Environment spec '%s' from %s is not in %s." % (importable_spec.name, importable_filename, + os.path.basename(project_file.filename)) + prompt = "Add env spec %s to %s?" % (importable_spec.name, os.path.basename(project_file.filename)) + else: + text = "Environment spec '%s' from %s is out of sync with %s. Diff:\n%s" % ( + importable_spec.name, importable_filename, os.path.basename(project_file.filename), + importable_spec.diff_from(old)) + prompt = "Overwrite env spec %s with the changes from %s?" % (importable_spec.name, importable_filename) + + def overwrite_env_spec_from_importable(project): + project.project_file.set_value(['env_specs', importable_spec.name], importable_spec.to_json()) + project.save() + + def remember_no_import_importable(project): + project.project_file.set_value(['skip_imports', 'environment'], importable_spec.logical_hash) + + # we don't set the filename here because it isn't really an error in the + # file, it ends up reading strangely. + problems.append( + ProjectProblem( + text=text, + fix_prompt=prompt, + fix_function=overwrite_env_spec_from_importable, + no_fix_function=remember_no_import_importable)) if env_specs_is_empty or env_specs_is_missing: # we do NOT want to add this problem if we merely # failed to parse individual env specs; it must be diff --git a/anaconda_project/test/test_project.py b/anaconda_project/test/test_project.py index 2413434d..32cc7acc 100644 --- a/anaconda_project/test/test_project.py +++ b/anaconda_project/test/test_project.py @@ -2783,14 +2783,15 @@ def check(dirname): def test_auto_fix_env_spec_import(): def check(dirname): project = project_no_dedicated_env(dirname) - assert len(project.problems) == 1 - assert len(project.problem_objects) == 1 - assert len(project.fixable_problems) == 1 - problem = project.problem_objects[0] - assert problem.text == "Environment spec 'stuff' from environment.yml is not in anaconda-project.yml." - assert problem.can_fix - problem.fix(project) + assert len(project.problems) == 0 + assert len(project.problem_objects) == 0 + assert len(project.fixable_problems) == 0 + # problem = project.problem_objects[0] + # assert problem.text == "Environment spec 'stuff' from environment.yml is not in anaconda-project.yml." + # assert problem.can_fix + + # problem.fix(project) project.project_file.save() assert project.problems == [] @@ -2819,14 +2820,15 @@ def check(dirname): def test_auto_fix_requirements_txt_import(): def check(dirname): project = project_no_dedicated_env(dirname) - assert len(project.problems) == 1 - assert len(project.problem_objects) == 1 - assert len(project.fixable_problems) == 1 - problem = project.problem_objects[0] - assert problem.text == "Environment spec 'default' from requirements.txt is not in anaconda-project.yml." - assert problem.can_fix - problem.fix(project) + assert len(project.problems) == 0 + assert len(project.problem_objects) == 0 + assert len(project.fixable_problems) == 0 + # problem = project.problem_objects[0] + # assert problem.text == "Environment spec 'default' from requirements.txt is not in anaconda-project.yml." + # assert problem.can_fix + + # problem.fix(project) project.project_file.save() assert project.problems == [] diff --git a/anaconda_project/test/test_project_ops.py b/anaconda_project/test/test_project_ops.py index 5ac99221..3aa08157 100644 --- a/anaconda_project/test/test_project_ops.py +++ b/anaconda_project/test/test_project_ops.py @@ -176,7 +176,7 @@ def check_create(dirname): }, check_create) -def test_create_no_import_environment_yml_when_not_fix_problems(): +def test_create_no_import_environment_yml_no_problems(): def check_create(dirname): project = project_ops.create(dirname, make_directory=False, @@ -184,7 +184,8 @@ def check_create(dirname): icon='something.png', description="Hello World", fix_problems=False) - assert ["Environment spec 'stuff' from environment.yml is not in anaconda-project.yml."] == project.problems + #assert ["Environment spec 'stuff' from environment.yml is not in anaconda-project.yml."] == project.problems + assert not project.problems with_directory_contents( {