예제 #1
0
 def do_update_rst_readme(self, statement: cmd2.Statement):
     """
     update README.rst from README.creole
     """
     update_rst_readme(
         package_root=PACKAGE_ROOT,
         filename='README.creole'
     )
def test_update_rst_readme(capsys):
    rest_readme_path = update_rst_readme(package_root=PACKAGE_ROOT,
                                         filename='README.creole')
    captured = capsys.readouterr()
    assert captured.out == 'Generate README.rst from README.creole...nothing changed, ok.\n'
    assert captured.err == ''
    assert isinstance(rest_readme_path, Path)
    assert str(rest_readme_path).endswith('/README.rst')
예제 #3
0
def update_readme():
    return update_rst_readme(
        package_root=PACKAGE_ROOT,
        filename='README.creole'
    )
예제 #4
0
def poetry_publish(package_root, version, log_filename='publish.log', creole_readme=False):
    """
    Helper to build and upload to PyPi, with prechecks.

    Optional arguments are passed to `poetry publish` e.g.:

        $ poetry config repositories.testpypi https://test.pypi.org/simple
        $ poetry run publish --repository=testpypi

    Build and upload to PyPi, if...
        ... __version__ doesn't contains 'dev'
        ... we are on git "master" branch
        ... git repository is 'clean' (no changed files)

    Upload with 'poetry', git tag the current version and git push --tag

    add this to poetry pyproject.toml, e.g.:

        [tool.poetry.scripts]
        publish = 'foo.bar:publish'

    based on:
    https://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/setup_publish.py
    """
    if creole_readme:
        update_rst_readme(package_root=package_root, filename='README.creole')

    for key in ('dev', 'rc'):
        if key in version:
            confirm(f'WARNING: Version contains {key!r}: v{version}\n')
            break

    print('\nCheck if we are on "master" branch:')
    call_info, output = verbose_check_output('git', 'branch', '--no-color')
    print(f'\t{call_info}')
    branch = None
    for line in output.splitlines():
        if line.startswith('* '):
            branch = line.split(' ', 1)[1]
            break
    if branch is None:
        print(f'ERROR get git branch from: {output!r}')
        sys.exit(4)

    if branch == 'master':
        print('OK')
    else:
        confirm(f'\nNOTE: It seems you are not on "master":\n{output}')

    print(f'\nSet version in "pyproject.toml" to: v{version}')
    verbose_check_call('poetry', 'version', version)

    print('\ncheck if if git repro is clean:')
    call_info, output = verbose_check_output('git', 'status', '--porcelain')
    print(f'\t{call_info}')
    if output == '':
        print('OK')
    else:
        print('\n *** ERROR: git repro not clean:')
        print(output)
        sys.exit(1)

    print('\nRun "poetry check":')
    call_info, output = verbose_check_output('poetry', 'check')
    if 'All set!' not in output:
        print(output)
        confirm('Check failed!')
    else:
        print('OK')

    print('\ncheck if pull is needed')
    verbose_check_call('git', 'fetch', '--all')
    call_info, output = verbose_check_output('git', 'log', 'HEAD..origin/master', '--oneline')
    print(f'\t{call_info}')
    if output == '':
        print('OK')
    else:
        print('\n *** ERROR: git repro is not up-to-date:')
        print(output)
        sys.exit(2)
    verbose_check_call('git', 'push', 'origin', branch)

    print('\nCleanup old builds:')

    def rmtree(path):
        path = os.path.abspath(path)
        if os.path.isdir(path):
            print('\tremove tree:', path)
            shutil.rmtree(path)
    rmtree('./dist')
    rmtree('./build')

    print('\nbuild but do not upload...')

    with open(log_filename, 'a') as log:
        log.write('\n')
        log.write('-' * 100)
        log.write('\n')
        call_info, output = verbose_check_output('poetry', 'build', log=log)
        print(f'\t{call_info}')
        log.write(call_info)
        log.write(output)

    print(f'Build log file is here: {log_filename!r}')

    git_tag = f'v{version}'

    print('\ncheck git tag')
    call_info, output = verbose_check_output('git', 'tag')
    if git_tag in output.splitlines():
        print(f'\n *** ERROR: git tag {git_tag!r} already exists!')
        print(output)
        sys.exit(3)
    else:
        print('OK')

    print('\nUpload to PyPi via poetry:')
    args = ['poetry', 'publish'] + sys.argv[1:]
    if '-vvv' not in sys.argv:
        args.append('-vvv')

    try:
        verbose_check_call(*args)
    except subprocess.CalledProcessError:
        print('\nPoetry publish error -> fallback and use twine')
        verbose_check_call('poetry', 'run', 'twine', 'upload', 'dist/*.*')

    print('\ngit tag version')
    verbose_check_call('git', 'tag', git_tag)

    print('\ngit push tag to server')
    verbose_check_call('git', 'push', '--tags')
예제 #5
0
def update_poetry_publish_readme():
    return update_rst_readme(package_root=Path(__file__).parent.parent,
                             filename='README.creole')