def check_run_main(dirname): from os.path import abspath as real_abspath def mock_abspath(path): if path == ".": return dirname else: return real_abspath(path) monkeypatch.setattr('os.path.abspath', mock_abspath) project_dir_disable_dedicated_env(dirname) # double hyphen lets us specify "--foo" as a command name result = _parse_args_and_run_subcommand([ 'conda-kapsel', 'run', '--directory', dirname, '--', '--foo', '--bar' ]) assert 1 == result assert 'file' in executed assert 'args' in executed assert 'env' in executed assert executed['file'].endswith(python_exe) assert executed['args'][0].endswith(python_exe) assert len(executed['args']) == 3 assert '--version' == executed['args'][1] assert '--bar' == executed['args'][2]
def check_run_main(dirname): from os.path import abspath as real_abspath def mock_abspath(path): if path == ".": return dirname else: return real_abspath(path) monkeypatch.setattr('os.path.abspath', mock_abspath) def mock_execvpe(file, args, env): assert file == 'nope' assert args == ['nope'] raise OSError("no such file nope") monkeypatch.setattr('os.execvpe', mock_execvpe) project_dir_disable_dedicated_env(dirname) result = _parse_args_and_run_subcommand(['conda-kapsel', 'run', '--directory', dirname, 'nope']) assert 1 == result out, err = capsys.readouterr() assert "" == out assert "Failed to execute 'nope'" in err
def check(dirname): from shutil import rmtree as real_rmtree _monkeypatch_pwd(monkeypatch, dirname) test_filename = os.path.join(dirname, 'envs', 'foo') # only allow mock to have side effect once # later, when cleaning up directory, allow removal mock_called = [] def mock_remove(path, ignore_errors=False, onerror=None): if path == test_filename and not mock_called: mock_called.append(True) raise Exception('Error') return real_rmtree(path, ignore_errors, onerror) monkeypatch.setattr('shutil.rmtree', mock_remove) code = _parse_args_and_run_subcommand( ['conda-kapsel', 'remove-env-spec', '--name', 'foo']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert ("Failed to remove environment files in %s: Error.\n" % os.path.join(dirname, "envs", "foo")) == err
def check_run_main(dirname): from os.path import abspath as real_abspath def mock_abspath(path): if path == ".": return dirname else: return real_abspath(path) monkeypatch.setattr('os.path.abspath', mock_abspath) def mock_execvpe(file, args, env): assert file == 'nope' assert args == ['nope'] raise OSError("no such file nope") monkeypatch.setattr('os.execvpe', mock_execvpe) project_dir_disable_dedicated_env(dirname) result = _parse_args_and_run_subcommand( ['conda-kapsel', 'run', '--directory', dirname, 'nope']) assert 1 == result out, err = capsys.readouterr() assert "" == out assert "Failed to execute 'nope'" in err
def check(dirname): code = _parse_args_and_run_subcommand(['conda-kapsel', 'upload', '--directory', dirname]) assert code == 0 out, err = capsys.readouterr() assert 'Hello\nYay\n' == out assert '' == err
def check_empty_project(dirname): code = _parse_args_and_run_subcommand(['conda-kapsel', 'list-commands', '--directory', dirname]) assert code == 0 out, err = capsys.readouterr() assert '' == err assert ("No commands found for project: {}\n\n".format(dirname)) == out
def check(dirname): code = _parse_args_and_run_subcommand(['conda-kapsel', 'clean', '--directory', dirname]) assert code == 0 out, err = capsys.readouterr() assert 'Cleaned.\n' == out assert '' == err
def start_local_redis(dirname): project = project_no_dedicated_env(dirname) result = test_redis_provider._prepare_printing_errors(project, environ=minimal_environ()) assert result local_state_file = LocalStateFile.load_for_directory(dirname) state = local_state_file.get_service_run_state('REDIS_URL') assert 'port' in state port = state['port'] assert dict(REDIS_URL=("redis://localhost:" + str(port)), PROJECT_DIR=project.directory_path) == strip_environ(result.environ) assert len(can_connect_args_list) >= 2 pidfile = os.path.join(dirname, "services/REDIS_URL/redis.pid") logfile = os.path.join(dirname, "services/REDIS_URL/redis.log") assert os.path.exists(pidfile) assert os.path.exists(logfile) assert real_can_connect_to_socket(host='localhost', port=port) # now clean it up code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-service', 'REDIS_URL', '--directory', dirname]) assert code == 0 assert not os.path.exists(pidfile) assert not os.path.exists(os.path.join(dirname, "services")) assert not real_can_connect_to_socket(host='localhost', port=port) local_state_file.load() assert dict() == local_state_file.get_service_run_state("REDIS_URL")
def check_run_main(dirname): from os.path import abspath as real_abspath def mock_abspath(path): if path == ".": return dirname else: return real_abspath(path) monkeypatch.setattr('os.path.abspath', mock_abspath) project_dir_disable_dedicated_env(dirname) result = _parse_args_and_run_subcommand(['conda-kapsel', '--verbose', 'run', '--directory', dirname, 'default']) assert 1 == result assert 'file' in executed assert 'args' in executed assert 'env' in executed assert executed['file'].endswith(python_exe) assert executed['args'][0].endswith(python_exe) assert len(executed['args']) == 2 assert '--version' == executed['args'][1] # conda info is cached so may not be here depending on # which other tests run log_lines = ["$ conda info --json", "$ %s --version" % executed['args'][0]] log_lines_without_conda_info = log_lines[1:] def nl(lines): return ("\n".join(lines) + "\n") out, err = capsys.readouterr() assert "" == out assert nl(log_lines) == err or nl(log_lines_without_conda_info) == err
def check_run_main(dirname): from os.path import abspath as real_abspath def mock_abspath(path): if path == ".": return dirname else: return real_abspath(path) monkeypatch.setattr('os.path.abspath', mock_abspath) project_dir_disable_dedicated_env(dirname) for n, i in enumerate(command_line): if i == '<DIRNAME>': command_line[n] = dirname result = _parse_args_and_run_subcommand(command_line) assert 1 == result assert 'file' in executed assert 'args' in executed assert 'env' in executed file_assertion(executed['file']) out, err = capsys.readouterr() assert "" == out assert "" == err return executed['args'][1:]
def check_run_main(dirname): from os.path import abspath as real_abspath def mock_abspath(path): if path == ".": return dirname else: return real_abspath(path) monkeypatch.setattr('os.path.abspath', mock_abspath) project_dir_disable_dedicated_env(dirname) result = _parse_args_and_run_subcommand([ 'conda-kapsel', 'run', '--directory', dirname, 'default', 'foo', '$PATH', '--something' ]) assert 1 == result assert 'file' in executed assert 'args' in executed assert 'env' in executed assert executed['file'].endswith(python_exe) assert executed['args'][0].endswith(python_exe) assert len(executed['args']) == 5 assert '--version' == executed['args'][1] assert 'foo' == executed['args'][2] assert '$PATH' == executed['args'][3] assert '--something' == executed['args'][4]
def check_run_main(dirname): from os.path import abspath as real_abspath def mock_abspath(path): if path == ".": return dirname else: return real_abspath(path) monkeypatch.setattr('os.path.abspath', mock_abspath) project_dir_disable_dedicated_env(dirname) result = _parse_args_and_run_subcommand(['conda-kapsel', 'run', '--directory', dirname, 'default', 'foo', '$PATH', '--something']) assert 1 == result assert 'file' in executed assert 'args' in executed assert 'env' in executed assert executed['file'].endswith(python_exe) assert executed['args'][0].endswith(python_exe) assert len(executed['args']) == 5 assert '--version' == executed['args'][1] assert 'foo' == executed['args'][2] assert '$PATH' == executed['args'][3] assert '--something' == executed['args'][4]
def check(dirname): code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-command', 'test', '--directory', dirname]) assert code == 1 out, err = capsys.readouterr() assert err == "Command: 'test' not found in project file.\n" assert out == ''
def check(dirname): project_dir_disable_dedicated_env(dirname) def mock_is_interactive(): return True monkeypatch.setattr( 'conda_kapsel.commands.console_utils.stdin_is_interactive', mock_is_interactive) inputs = [" ", "foo", "bar"] def mock_console_input(prompt, encrypted): return inputs.pop(0) monkeypatch.setattr( 'conda_kapsel.commands.console_utils.console_input', mock_console_input) res = _parse_args_and_run_subcommand( ['conda-kapsel', 'prepare', '--directory', dirname]) assert res == 0 local_state = LocalStateFile.load_for_directory(dirname) assert local_state.get_value(['variables', 'FOO']) == 'foo' assert local_state.get_value(['variables', 'BAR']) == 'bar'
def check(dirname): project_dir_disable_dedicated_env(dirname) def mock_is_interactive(): return True monkeypatch.setattr( 'conda_kapsel.commands.console_utils.stdin_is_interactive', mock_is_interactive) inputs = ["foo", "bar"] def mock_console_input(prompt, encrypted): return inputs.pop(0) monkeypatch.setattr( 'conda_kapsel.commands.console_utils.console_input', mock_console_input) def mock_set_variables(project, vars_and_values): return SimpleStatus(success=False, description="Set variables FAIL") monkeypatch.setattr('conda_kapsel.project_ops.set_variables', mock_set_variables) res = _parse_args_and_run_subcommand( ['conda-kapsel', 'prepare', '--directory', dirname]) assert res == 1 out, err = capsys.readouterr() assert err == _foo_and_bar_missing + "Set variables FAIL\n"
def check(dirname): project_dir_disable_dedicated_env(dirname) def mock_is_interactive(): return True monkeypatch.setattr( 'conda_kapsel.commands.console_utils.stdin_is_interactive', mock_is_interactive) def mock_console_input(prompt, encrypted): raise Exception("Should not have called this, prompt " + prompt) monkeypatch.setattr( 'conda_kapsel.commands.console_utils.console_input', mock_console_input) res = _parse_args_and_run_subcommand( ['conda-kapsel', 'prepare', '--directory', dirname]) assert res == 1 out, err = capsys.readouterr() assert out == "" assert err == ( "%s: env_specs should be a dictionary from environment name to environment attributes, not 42\n" "Unable to load the project.\n") % os.path.join( dirname, "kapsel.yml")
def check(dirname): code = _parse_args_and_run_subcommand(['conda-kapsel', 'upload', '--directory', dirname]) assert code == 1 out, err = capsys.readouterr() assert '' == out assert ('variables section contains wrong value type 42,' + ' should be dict or list of requirements\n' + 'Unable to load the project.\n') == err
def check_empty_project(dirname): code = _parse_args_and_run_subcommand( ['conda-kapsel', 'list-commands', '--directory', dirname]) assert code == 0 out, err = capsys.readouterr() assert '' == err assert ("No commands found for project: {}\n\n".format(dirname)) == out
def check(dirname): code = _parse_args_and_run_subcommand( ['conda-kapsel', 'remove-command', 'test', '--directory', dirname]) assert code == 1 out, err = capsys.readouterr() assert err == "Command: 'test' not found in project file.\n" assert out == ''
def check_list_empty(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'list-downloads']) assert code == 0 out, err = capsys.readouterr() expected_out = "No downloads found in project.\n" assert out == expected_out
def check_empty(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'list-services']) assert code == 0 out, err = capsys.readouterr() assert err == '' assert out == "No services found for project: {}\n".format(dirname)
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-env-spec', '--name', 'foo']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert "Environment spec foo doesn't exist.\n" == err
def check(dirname): code = _parse_args_and_run_subcommand( ['conda-kapsel', 'upload', '--directory', dirname]) assert code == 0 out, err = capsys.readouterr() assert 'Hello\nYay\n' == out assert '' == err
def check(dirname): code = _parse_args_and_run_subcommand( ['conda-kapsel', 'clean', '--directory', dirname]) assert code == 0 out, err = capsys.readouterr() assert 'Cleaned.\n' == out assert '' == err
def check_empty(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand( ['conda-kapsel', 'list-services']) assert code == 0 out, err = capsys.readouterr() assert err == '' assert out == "No services found for project: {}\n".format(dirname)
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand( ['conda-kapsel', 'remove-env-spec', '--name', 'foo']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert "Environment spec foo doesn't exist.\n" == err
def check(dirname): archivefile = os.path.join(dirname, "foo.zip") code = _parse_args_and_run_subcommand(['conda-kapsel', 'archive', '--directory', dirname, archivefile]) assert code == 0 out, err = capsys.readouterr() assert (' added %s\nCreated project archive %s\n' % (os.path.join( os.path.basename(dirname), "kapsel.yml"), archivefile)) == out assert '' == err
def test_main_help(capsys): code = _parse_args_and_run_subcommand(['project', '--help']) out, err = capsys.readouterr() assert "" == err assert expected_usage_msg == out assert 0 == code
def check_run_nonexistent(dirname): project_dir = os.path.join(dirname, "nope") result = _parse_args_and_run_subcommand(['conda-kapsel', 'run', '--directory', project_dir]) assert 1 == result out, err = capsys.readouterr() assert out == "" assert ("Project directory '%s' does not exist." % project_dir) in err
def check(dirname): code = _parse_args_and_run_subcommand(['conda-kapsel', 'unset-variable', '--directory', dirname, 'FOO']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert ('variables section contains wrong value type 42,' + ' should be dict or list of requirements\n' + 'Unable to load the project.\n') == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'export-env-spec', '--name', 'foo']) assert code == 2 out, err = capsys.readouterr() assert 'ENVIRONMENT_FILE' in err assert '' == out
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-env-spec', '--name', 'foo']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert "At least one environment spec is required; 'foo' is the only one left.\n" == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) exported = os.path.join(dirname, "exported.yml") code = _parse_args_and_run_subcommand(['conda-kapsel', 'export-env-spec', '--name', 'foo', exported]) assert code == 0 out, err = capsys.readouterr() assert '' == err assert ('Exported environment spec foo to %s.\n' % exported) == out
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) _monkeypatch_add_service(monkeypatch, SimpleStatus(success=False, description='Service add FAIL.')) code = _parse_args_and_run_subcommand(['conda-kapsel', 'add-service', 'redis']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert 'Service add FAIL.\n' == err
def check_run_nonexistent(dirname): project_dir = os.path.join(dirname, "nope") result = _parse_args_and_run_subcommand( ['conda-kapsel', 'run', '--directory', project_dir]) assert 1 == result out, err = capsys.readouterr() assert out == "" assert ("Project directory '%s' does not exist." % project_dir) in err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(command) assert code == 1 out, err = capsys.readouterr() assert '' == out assert ('variables section contains wrong value type 42,' + ' should be dict or list of requirements\n' + 'Unable to load the project.\n') == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-service', 'TEST']) assert code == 1 out, err = capsys.readouterr() assert "Service 'TEST' not found in the project file.\n" == err assert '' == out
def check(dirname): archivefile = os.path.join(dirname, "foo.zip") code = _parse_args_and_run_subcommand( ['conda-kapsel', 'archive', '--directory', dirname, archivefile]) assert code == 0 out, err = capsys.readouterr() assert (' added %s\nCreated project archive %s\n' % (os.path.join( os.path.basename(dirname), "kapsel.yml"), archivefile)) == out assert '' == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand( ['conda-kapsel', 'remove-env-spec', '--name', 'foo']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert "At least one environment spec is required; 'foo' is the only one left.\n" == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-env-spec', '--name', 'bar']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert (("%s: env_spec 'bar' for command 'foo' does not appear in the env_specs section\n" % os.path.join( dirname, DEFAULT_PROJECT_FILENAME)) + "Unable to load the project.\n") == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-env-spec', '--name', 'foo']) assert code == 0 out, err = capsys.readouterr() assert '' == err assert ('Deleted environment files in %s.\nRemoved environment foo from the project file.\n' % os.path.join( dirname, "envs", "foo")) == out
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'list-downloads']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert ('variables section contains wrong value type 42,' + ' should be dict or list of requirements\n' + 'Unable to load the project.\n') == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) _monkeypatch_add_env_spec(monkeypatch, SimpleStatus(success=True, description='Environment looks good.')) code = _parse_args_and_run_subcommand(['conda-kapsel', 'add-env-spec', '--name', 'foo']) assert code == 0 out, err = capsys.readouterr() assert ('Environment looks good.\n' + 'Added environment foo to the project file.\n') == out assert '' == err
def test_unarchive_command_error(capsys, monkeypatch): def mock_unarchive(filename, project_dir, parent_dir=None): return SimpleStatus(success=False, description="DESC", logs=['a', 'b'], errors=['c', 'd']) monkeypatch.setattr('conda_kapsel.project_ops.unarchive', mock_unarchive) code = _parse_args_and_run_subcommand(['conda-kapsel', 'unarchive', 'foo.tar.gz', 'bar']) assert code == 1 out, err = capsys.readouterr() assert '' == out assert 'a\nb\nc\nd\nDESC\n' == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'init']) assert code == 0 assert os.path.isfile(os.path.join(dirname, DEFAULT_PROJECT_FILENAME)) out, err = capsys.readouterr() assert ("Project configuration is in %s\n" % (os.path.join(dirname, DEFAULT_PROJECT_FILENAME))) == out assert '' == err
def check(dirname): if append_dir: command.extend(['--directory', dirname]) code = _parse_args_and_run_subcommand(command) assert code == 1 out, err = capsys.readouterr() assert '' == out assert ('variables section contains wrong value type 42,' + ' should be dict or list of requirements\n' + 'Unable to load the project.\n') == err
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand( ['conda-kapsel', 'remove-service', 'TEST']) assert code == 1 out, err = capsys.readouterr() assert "Service 'TEST' not found in the project file.\n" == err assert '' == out
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-download', 'TEST_FILE']) project = Project(dirname) assert not project.downloads assert code == 1 out, err = capsys.readouterr() assert ("Download requirement: TEST_FILE not found.\n") == err assert '' == out
def check(dirname): code = _parse_args_and_run_subcommand(['conda-kapsel', 'add-command', '--directory', dirname, '--env-spec', 'foo', '--type', 'notebook', 'test', 'file.ipynb']) assert code == 0 project = Project(dirname) command = project.project_file.get_value(['commands', 'test']) assert command['notebook'] == 'file.ipynb' assert command['env_spec'] == 'foo' assert len(command.keys()) == 2
def check(dirname): code = _parse_args_and_run_subcommand(['conda-kapsel', 'upload', '--directory', dirname, '--user=foo', '--token=bar']) assert code == 0 out, err = capsys.readouterr() assert 'Hello\nYay\n' == out assert '' == err assert params['kwargs']['token'] == 'bar' assert params['kwargs']['username'] == 'foo'
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand( ['conda-kapsel', 'remove-env-spec', '--name', 'foo']) assert code == 0 out, err = capsys.readouterr() assert '' == err assert ( 'Deleted environment files in %s.\nRemoved environment foo from the project file.\n' % os.path.join(dirname, "envs", "foo")) == out
def check(dirname): _monkeypatch_pwd(monkeypatch, dirname) code = _parse_args_and_run_subcommand(['conda-kapsel', 'remove-download', 'TEST_FILE']) project = Project(dirname) assert not project.downloads assert code == 0 out, err = capsys.readouterr() filename = os.path.join(dirname, 'foo') assert ("Removed downloaded file %s.\nRemoved TEST_FILE from the project file.\n" % filename) == out assert '' == err
def test_main_bad_subcommand(capsys): code = _parse_args_and_run_subcommand(['project', 'foo']) out, err = capsys.readouterr() expected_error_msg = ("usage: conda-kapsel [-h] [-v]\n" " %s\n" " ...\nconda-kapsel: error: invalid choice: 'foo' " "(choose from %s)\n") % (all_subcommands_in_curlies, all_subcommands_comma_space) assert expected_error_msg == err assert "" == out assert 2 == code
def test_main_no_subcommand(capsys): code = _parse_args_and_run_subcommand(['project']) assert 2 == code out, err = capsys.readouterr() assert "" == out expected_error_msg = ('Must specify a subcommand.\n' 'usage: conda-kapsel [-h] [-v]\n' ' %s\n' ' ...\n') % all_subcommands_in_curlies assert expected_error_msg == err
def check(dirname): code = _parse_args_and_run_subcommand([ 'conda-kapsel', 'upload', '--directory', dirname, '--user=foo', '--token=bar' ]) assert code == 0 out, err = capsys.readouterr() assert 'Hello\nYay\n' == out assert '' == err assert params['kwargs']['token'] == 'bar' assert params['kwargs']['username'] == 'foo'