def gen_frozensetup(package_dir, output): """Generate a frozen setup suitable for distribution. """ from poetry.masonry.builders import sdist from poetry.factory import Factory factory = Factory() poetry = factory.create_poetry(package_dir) sdist.SETUP = SETUP_TEMPLATE # the alternative to monkey patching is carrying forward a # 100 line method. See SETUP_TEMPLATE comments above. class FrozenBuilder(sdist.SdistBuilder): @classmethod def convert_dependencies(cls, package, dependencies): reqs, default = locked_deps(package, poetry) resolve_source_deps(poetry, package, reqs, frozen=True) return reqs, default builder = FrozenBuilder(poetry, None, None) setup_content = builder.build_setup() with open(os.path.join(package_dir, output), 'wb') as fh: fh.write(b'# Automatically generated from pyproject.toml\n') fh.write(b'# flake8: noqa\n') fh.write(setup_content)
def gen_setup(package_dir): """Generate a setup suitable for dev compatibility with pip. """ from poetry.masonry.builders import sdist from poetry.factory import Factory factory = Factory() poetry = factory.create_poetry(package_dir) # the alternative to monkey patching is carrying forward a # 100 line method. See SETUP_TEMPLATE comments above. sdist.SETUP = SETUP_TEMPLATE class SourceDevBuilder(sdist.SdistBuilder): # to enable poetry with a monorepo, we have internal deps # as source path dev dependencies, when we go to generate # setup.py we need to ensure that the source deps are # recorded faithfully. @classmethod def convert_dependencies(cls, package, dependencies): reqs, default = super().convert_dependencies(package, dependencies) resolve_source_deps(poetry, package, reqs) return reqs, default builder = SourceDevBuilder(poetry, None, None) setup_content = builder.build_setup() with open(os.path.join(package_dir, 'setup.py'), 'wb') as fh: fh.write(b'# Automatically generated from poetry/pyproject.toml\n') fh.write(b'# flake8: noqa\n') fh.write(setup_content)
def make_setup_if_not_exists(): ''' If python package without setup.py (for example Poetry) ''' if not os.path.exists('setup.py') and os.path.exists('setup.cfg'): from poetry.masonry.builders.sdist import SdistBuilder from poetry.factory import Factory factory = Factory() poetry = factory.create_poetry('.') sdist_builder = SdistBuilder(poetry, None, None) setuppy_blob = sdist_builder.build_setup() with open('setup.py', 'wb') as unit: unit.write(setuppy_blob) unit.write(b'\n# This setup.py was autogenerated using poetry.\n') pass
# poetry when there is no setup.py and an extension needs to be compiled. # See https://github.com/python-poetry/poetry/issues/1516. Running this # script creates a setup.py filled out with information generated by # poetry when parsing the pyproject.toml. import os import sys # If there is a global installation of poetry, prefer that. poetry_python_lib = os.path.expanduser('~/.poetry/lib') sys.path.append(os.path.realpath(poetry_python_lib)) try: from poetry.masonry.builders.sdist import SdistBuilder from poetry.factory import Factory except (ImportError, ModuleNotFoundError) as ee: raise ImportError('install poetry by doing pip install poetry to use ' f'this script: {ee}') # Generate a Poetry object that knows about the metadata in pyproject.toml factory = Factory() poetry = factory.create_poetry(os.path.dirname(__file__)) # Use the SdistBuilder to genrate a blob for setup.py sdist_builder = SdistBuilder(poetry, None, None) setuppy_blob = sdist_builder.build_setup() with open('setup.py', 'wb') as unit: unit.write(setuppy_blob) unit.write(b'\n# This setup.py was autogenerated using poetry.\n')