def test_as_cwd(tmpdir): with tmpdir.as_cwd(): workdir.options.path = 'test_as_cwd' os.mkdir(workdir.options.path) with workdir.as_cwd(): assert os.getcwd() == os.path.join(str(tmpdir), 'test_as_cwd') assert os.getcwd() == str(tmpdir)
def task_package(args): release_version = args['--release-version'] suppress_output = not args['--stream-command-output'] workdir.sync() with workdir.as_cwd(): config_dict = _get_config_or_die(calling_task='package', required_params=[ 'create_wheel', 'readme_to_rst', 'pypi_repository', 'pypi_verify_ssl' ]) pypi_repository = config_dict['pypi_repository'] pypi_verify_ssl = config_dict['pypi_verify_ssl'] project_name = project.get_project_name() package_name = _get_package_name_or_die() _check_and_set_version(release_version, package_name, project_name, pypi_repository, pypi_verify_ssl) if config_dict['readme_to_rst']: if project.project_has_readme_md(): try: project.convert_readme_to_rst() except project.ProjectError as e: if 'could not convert' in str(e): logger.error(e) raise SystemExit(1) else: logger.info(e) _create_packages(config_dict['create_wheel'], suppress_output) logger.info('successfully packaged {}=={}'.format(project_name, release_version))
def task_register(args): release_version = args['--release-version'] suppress_output = not args['--stream-command-output'] workdir.sync() with workdir.as_cwd(): config_dict = _get_config_or_die( calling_task='register', required_params=['pypi_repository', 'pypi_verify_ssl']) pypi_repository = config_dict['pypi_repository'] pypi_verify_ssl = config_dict['pypi_verify_ssl'] project_name = project.get_project_name() package_name = _get_package_name_or_die() packaged_files = project.get_packaged_files(package_name) if len(packaged_files) == 0: if not release_version: release_version = project.get_version(package_name) if not project.version_is_valid(release_version): logger.info('using version 0.0 for registration purposes') release_version = '0.0' _check_and_set_version(release_version, package_name, project_name, pypi_repository, pypi_verify_ssl) _create_packages(create_wheel=False, suppress_output=suppress_output) packaged_files = project.get_packaged_files(package_name) package_path = packaged_files[0] result = _call_twine(['register', package_path], pypi_repository, suppress_output) if result.exitval or '(400)' in result.stdout: _log_failure_and_die('failed to register project', result, log_full_result=suppress_output) logger.info('successfully registered {} with [{}]'.format( project_name, pypi_repository))
def task_tag(args): if not os.path.isdir(workdir.options.path): logger.error('{} does not exist, cannot fetch tag version!'.format( workdir.options.path)) raise SystemExit(1) with workdir.as_cwd(): config_dict = _get_config_or_die(calling_task='upload', required_params=['git_remote_name']) git_remote_name = config_dict['git_remote_name'] package_name = _get_package_name_or_die() release_version = project.get_version(package_name, ignore_cache=True) # this part actually happens outside of the working directory! repo = git.Repo() if repo.is_dirty(): logger.error('cannot create tag, repo is dirty') raise SystemExit(1) if git_remote_name not in [x.name for x in repo.remotes]: logger.error( 'cannot push tag to remote "{}" as it is not defined in repo'. format(git_remote_name)) raise SystemExit(1) repo.create_tag( path=release_version, message='tag {} created by hatchery'.format(release_version)) repo.remotes[git_remote_name].push(tags=True) logger.info('version {} tagged and pushed!'.format(release_version))
def test_has_file(tmpdir): with tmpdir.as_cwd(): workdir.options.path = 'test_has_file' workdir.create() with workdir.as_cwd(): open('myfile', 'w').close() assert workdir.has_file('myfile') is True assert workdir.has_file('notthere') is False
def _create_packages(create_wheel, suppress_output): with workdir.as_cwd(): setup_args = ['sdist'] if create_wheel: setup_args.append('bdist_wheel') result = executor.setup(setup_args, suppress_output=suppress_output) if result.exitval: _log_failure_and_die('failed to package project', result, log_full_result=suppress_output)
def task_test(args): suppress_output = not args['--stream-command-output'] workdir.sync() with workdir.as_cwd(): config_dict = _get_config_or_die(calling_task='test', required_params=['test_command']) test_commands = config_dict['test_command'] if not funcy.is_list(test_commands): test_commands = [test_commands] for cmd_str in test_commands: result = executor.call(cmd_str, suppress_output=suppress_output) if result.exitval: _log_failure_and_die('tests failed', result, log_full_result=suppress_output) logger.info('testing completed successfully')
def task_upload(args): suppress_output = not args['--stream-command-output'] if not os.path.isdir(workdir.options.path): logger.error('{} does not exist, nothing to upload!'.format( workdir.options.path)) raise SystemExit(1) with workdir.as_cwd(): config_dict = _get_config_or_die( calling_task='upload', required_params=['pypi_repository', 'pypi_verify_ssl']) pypi_repository = config_dict['pypi_repository'] pypi_verify_ssl = config_dict['pypi_verify_ssl'] project_name = project.get_project_name() package_name = _get_package_name_or_die() if project.multiple_packaged_versions(package_name): logger.error( 'multiple package versions found, refusing to upload -- run `hatchery clean`' ) raise SystemExit(1) release_version = project.get_version(package_name, ignore_cache=True) _valid_version_or_die(release_version) _latest_version_or_die(release_version, project_name, pypi_repository, pypi_verify_ssl) result = _call_twine(['upload', 'dist/*'], pypi_repository, suppress_output) if result.exitval: if 'not allowed to edit' in result.stderr: logger.error( 'could not upload packages, try `hatchery register`') else: _log_failure_and_die('failed to upload packages', result, log_full_result=suppress_output) raise SystemExit(1) logger.info('successfully uploaded {}=={} to [{}]'.format( project_name, release_version, pypi_repository))