def test_find_packages(): poetry = Poetry.create(project("complete")) builder = SdistBuilder(poetry, NullEnv(), NullIO()) base = project("complete") include = PackageInclude(base, "my_package") pkg_dir, packages, pkg_data = builder.find_packages(include) assert pkg_dir is None assert packages == [ "my_package", "my_package.sub_pkg1", "my_package.sub_pkg2" ] assert pkg_data == { "": ["*"], "my_package": ["data1/*"], "my_package.sub_pkg2": ["data2/*"], } poetry = Poetry.create(project("source_package")) builder = SdistBuilder(poetry, NullEnv(), NullIO()) base = project("source_package") include = PackageInclude(base, "package_src", "src") pkg_dir, packages, pkg_data = builder.find_packages(include) assert pkg_dir == str(base / "src") assert packages == ["package_src"] assert pkg_data == {"": ["*"]}
def test_complete(): module_path = fixtures_dir / 'complete' builder = CompleteBuilder(Poetry.create(module_path), NullVenv(True), NullIO()) builder.build() whl = module_path / 'dist' / 'my_package-1.2.3-py3-none-any.whl' assert whl.exists() zip = zipfile.ZipFile(str(whl)) try: entry_points = zip.read('my_package-1.2.3.dist-info/entry_points.txt') assert decode(entry_points.decode()) == """\ [console_scripts] my-2nd-script=my_package:main2 my-script=my_package:main """ wheel_data = decode(zip.read('my_package-1.2.3.dist-info/WHEEL')) assert wheel_data == """\ Wheel-Version: 1.0 Generator: poetry {} Root-Is-Purelib: true Tag: py3-none-any """.format(__version__) wheel_data = decode(zip.read('my_package-1.2.3.dist-info/METADATA')) assert wheel_data == """\ Metadata-Version: 2.1 Name: my-package Version: 1.2.3 Summary: Some description. Home-page: https://poetry.eustace.io/ License: MIT Keywords: packaging,dependency,poetry Author: Sébastien Eustace Author-email: [email protected] Requires-Python: >=3.6,<4.0 Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Topic :: Software Development :: Build Tools Classifier: Topic :: Software Development :: Libraries :: Python Modules Provides-Extra: time Requires-Dist: cachy[msgpack] (>=0.2.0,<0.3.0) Requires-Dist: cleo (>=0.6,<0.7) Requires-Dist: pendulum (>=1.4,<2.0); extra == "time" Description-Content-Type: text/x-rst My Package ========== """ finally: zip.close()
def test_wheel_prerelease(): module_path = fixtures_dir / "prerelease" WheelBuilder.make(Poetry.create(str(module_path)), NullEnv(), NullIO()) whl = module_path / "dist" / "prerelease-0.1b1-py2.py3-none-any.whl" assert whl.exists()
def test_wheel_package(): module_path = fixtures_dir / 'complete' WheelBuilder.make(Poetry.create(str(module_path)), NullVenv(), NullIO()) whl = module_path / 'dist' / 'my_package-1.2.3-py3-none-any.whl' assert whl.exists()
def installer(package, pool, locker, venv, installed): return Installer(NullIO(), venv, package, locker, pool, installed=installed)
def _inspect_sdist_with_setup(self, sdist_dir): info = {"requires_python": None, "requires_dist": None} setup = sdist_dir / "setup.py" if not setup.exists(): return info venv = Venv.create(NullIO()) current_dir = os.getcwd() os.chdir(sdist_dir.as_posix()) try: venv.run("python", "setup.py", "egg_info") egg_info = list(sdist_dir.glob("**/*.egg-info"))[0] meta = pkginfo.UnpackedSDist(str(egg_info)) if meta.requires_python: info["requires_python"] = meta.requires_python if meta.requires_dist: info["requires_dist"] = list(meta.requires_dist) else: requires = egg_info / "requires.txt" if requires.exists(): with requires.open() as f: info["requires_dist"] = parse_requires(f.read()) except Exception: pass os.chdir(current_dir) return info
def test_wheel_module(): module_path = fixtures_dir / 'module1' WheelBuilder.make(Poetry.create(str(module_path)), NullVenv(), NullIO()) whl = module_path / 'dist' / 'module1-0.1-py2.py3-none-any.whl' assert whl.exists()
def test_with_src_module_dir(): poetry = Poetry.create(project('source_package')) builder = SdistBuilder(poetry, NullVenv(), NullIO()) # Check setup.py setup = builder.build_setup() setup_ast = ast.parse(setup) setup_ast.body = [n for n in setup_ast.body if isinstance(n, ast.Assign)] ns = {} exec(compile(setup_ast, filename="setup.py", mode="exec"), ns) assert ns['package_dir'] == {'': 'src'} assert ns['packages'] == [ 'package_src', ] builder.build() sdist = fixtures_dir / 'source_package' / 'dist' / 'package-src-0.1.tar.gz' assert sdist.exists() tar = tarfile.open(str(sdist), 'r') assert 'package-src-0.1/src/package_src/__init__.py' in tar.getnames() assert 'package-src-0.1/src/package_src/module.py' in tar.getnames()
def test_with_src_module_dir(): poetry = Poetry.create(project("source_package")) builder = SdistBuilder(poetry, NullVenv(), NullIO()) # Check setup.py setup = builder.build_setup() setup_ast = ast.parse(setup) setup_ast.body = [n for n in setup_ast.body if isinstance(n, ast.Assign)] ns = {} exec(compile(setup_ast, filename="setup.py", mode="exec"), ns) assert ns["package_dir"] == {"": "src"} assert ns["packages"] == ["package_src"] builder.build() sdist = fixtures_dir / "source_package" / "dist" / "package-src-0.1.tar.gz" assert sdist.exists() tar = tarfile.open(str(sdist), "r") assert "package-src-0.1/src/package_src/__init__.py" in tar.getnames() assert "package-src-0.1/src/package_src/module.py" in tar.getnames()
def test_package_src(): module_path = fixtures_dir / "source_package" builder = CompleteBuilder( Poetry.create(module_path), NullEnv(execute=True), NullIO() ) builder.build() sdist = module_path / "dist" / "package-src-0.1.tar.gz" assert sdist.exists() with tarfile.open(str(sdist), "r") as tar: assert "package-src-0.1/src/package_src/module.py" in tar.getnames() whl = module_path / "dist" / "package_src-0.1-py2.py3-none-any.whl" assert whl.exists() zip = zipfile.ZipFile(str(whl)) try: assert "package_src/__init__.py" in zip.namelist() assert "package_src/module.py" in zip.namelist() finally: zip.close()
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): """Builds a wheel, places it in wheel_directory""" info = WheelBuilder.make_in(poetry, NullIO(), Path(wheel_directory)) return info.file.name
def test_make_setup(): poetry = Poetry.create(project("complete")) builder = SdistBuilder(poetry, NullEnv(), NullIO()) setup = builder.build_setup() setup_ast = ast.parse(setup) setup_ast.body = [n for n in setup_ast.body if isinstance(n, ast.Assign)] ns = {} exec(compile(setup_ast, filename="setup.py", mode="exec"), ns) assert ns["packages"] == [ "my_package", "my_package.sub_pkg1", "my_package.sub_pkg2", ] assert ns["install_requires"] == [ "cachy[msgpack]>=0.2.0,<0.3.0", "cleo>=0.6,<0.7" ] assert ns["entry_points"] == { "console_scripts": [ "extra-script = my_package.extra:main[time]", "my-2nd-script = my_package:main2", "my-script = my_package:main", ] } assert ns["extras_require"] == {"time": ["pendulum>=1.4,<2.0"]}
def test_complete(): module_path = fixtures_dir / 'complete' builder = CompleteBuilder(Poetry.create(module_path), NullVenv(True), NullIO()) builder.build() whl = module_path / 'dist' / 'my_package-1.2.3-py3-none-any.whl' assert whl.exists zip = zipfile.ZipFile(whl) try: entry_points = zip.read('my_package-1.2.3.dist-info/entry_points.txt') assert entry_points.decode() == """\ [console_scripts] my-2nd-script=my_package:main2 my-script=my_package:main """ wheel_data = zip.read('my_package-1.2.3.dist-info/WHEEL').decode() assert wheel_data == f"""\ Wheel-Version: 1.0 Generator: poetry {__version__} Root-Is-Purelib: true Tag: py3-none-any """ finally: zip.close()
def test_package_with_include(mocker): # Patch git module to return specific excluded files p = mocker.patch("poetry.vcs.git.Git.get_ignored_files") p.return_value = [ str( Path(__file__).parent / "fixtures" / "with-include" / "extra_dir" / "vcs_excluded.txt"), str( Path(__file__).parent / "fixtures" / "with-include" / "extra_dir" / "sub_pkg" / "vcs_excluded.txt"), ] module_path = fixtures_dir / "with-include" WheelBuilder.make(Poetry.create(str(module_path)), NullEnv(), NullIO()) whl = module_path / "dist" / "with_include-1.2.3-py3-none-any.whl" assert whl.exists() with zipfile.ZipFile(str(whl)) as z: names = z.namelist() assert len(names) == len(set(names)) assert "with_include-1.2.3.dist-info/LICENSE" in names assert "extra_dir/__init__.py" in names assert "extra_dir/vcs_excluded.txt" in names assert "extra_dir/sub_pkg/__init__.py" in names assert "extra_dir/sub_pkg/vcs_excluded.txt" not in names assert "my_module.py" in names assert "notes.txt" in names assert "package_with_include/__init__.py" in names
def test_make_setup(): poetry = Poetry.create(project('complete')) builder = SdistBuilder(poetry, NullVenv(), NullIO()) setup = builder.build_setup() setup_ast = ast.parse(setup) setup_ast.body = [n for n in setup_ast.body if isinstance(n, ast.Assign)] ns = {} exec(compile(setup_ast, filename="setup.py", mode="exec"), ns) assert ns['packages'] == [ 'my_package', 'my_package.sub_pkg1', 'my_package.sub_pkg2' ] assert ns['install_requires'] == [ 'cleo (>=0.6.0.0,<0.7.0.0)' ] assert ns['entry_points'] == { 'console_scripts': [ 'my-script = my_package:main', 'my-2nd-script = my_package:main2', ] } assert ns['extras_require'] == { 'time': [ 'pendulum (>=1.4.0.0,<2.0.0.0)' ] }
def build_sdist(sdist_directory, config_settings=None): """Builds an sdist, places it in sdist_directory""" poetry = Poetry.create(".") path = SdistBuilder(poetry, SystemEnv(Path(sys.prefix)), NullIO()).build(Path(sdist_directory)) return unicode(path.name)
def test_make_pkg_info(mocker): get_metadata_content = mocker.patch( "poetry.masonry.builders.builder.Builder.get_metadata_content") poetry = Poetry.create(project("complete")) builder = SdistBuilder(poetry, NullEnv(), NullIO()) builder.build_pkg_info() assert get_metadata_content.called
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): """Builds a wheel, places it in wheel_directory""" poetry = Poetry.create(".") return unicode( WheelBuilder.make_in( poetry, SystemEnv(Path(sys.prefix)), NullIO(), Path(wheel_directory) ) )
def test_proper_python_requires_if_single_version_specified(): poetry = Poetry.create(project("simple_version")) builder = SdistBuilder(poetry, NullVenv(), NullIO()) pkg_info = builder.build_pkg_info() p = Parser() parsed = p.parsestr(to_str(pkg_info)) assert parsed["Requires-Python"] == ">=3.6,<3.7"
def test_proper_python_requires_if_three_digits_precision_version_specified(): poetry = Poetry.create(project("single_python")) builder = SdistBuilder(poetry, NullEnv(), NullIO()) pkg_info = builder.build_pkg_info() p = Parser() parsed = p.parsestr(to_str(pkg_info)) assert parsed["Requires-Python"] == "==2.7.15"
def test_package_with_include(mocker): # Patch git module to return specific excluded files p = mocker.patch("poetry.vcs.git.Git.get_ignored_files") p.return_value = [ str( Path(__file__).parent / "fixtures" / "with-include" / "extra_dir" / "vcs_excluded.txt" ), str( Path(__file__).parent / "fixtures" / "with-include" / "extra_dir" / "sub_pkg" / "vcs_excluded.txt" ), ] poetry = Poetry.create(project("with-include")) builder = SdistBuilder(poetry, NullEnv(), NullIO()) # Check setup.py setup = builder.build_setup() setup_ast = ast.parse(setup) setup_ast.body = [n for n in setup_ast.body if isinstance(n, ast.Assign)] ns = {} exec(compile(setup_ast, filename="setup.py", mode="exec"), ns) assert "package_dir" not in ns assert ns["packages"] == ["extra_dir", "extra_dir.sub_pkg", "package_with_include"] assert ns["package_data"] == {"": ["*"]} assert ns["modules"] == ["my_module"] builder.build() sdist = fixtures_dir / "with-include" / "dist" / "with-include-1.2.3.tar.gz" assert sdist.exists() with tarfile.open(str(sdist), "r") as tar: names = tar.getnames() assert len(names) == len(set(names)) assert "with-include-1.2.3/LICENSE" in names assert "with-include-1.2.3/README.rst" in names assert "with-include-1.2.3/extra_dir/__init__.py" in names assert "with-include-1.2.3/extra_dir/vcs_excluded.txt" in names assert "with-include-1.2.3/extra_dir/sub_pkg/__init__.py" in names assert "with-include-1.2.3/extra_dir/sub_pkg/vcs_excluded.txt" not in names assert "with-include-1.2.3/my_module.py" in names assert "with-include-1.2.3/notes.txt" in names assert "with-include-1.2.3/package_with_include/__init__.py" in names assert "with-include-1.2.3/pyproject.toml" in names assert "with-include-1.2.3/setup.py" in names assert "with-include-1.2.3/PKG-INFO" in names
def test_prelease(): poetry = Poetry.create(project('prerelease')) builder = SdistBuilder(poetry, NullVenv(), NullIO()) builder.build() sdist = fixtures_dir / 'prerelease' / 'dist' / 'prerelease-0.1b1.tar.gz' assert sdist.exists()
def test_prelease(): poetry = Poetry.create(project("prerelease")) builder = SdistBuilder(poetry, NullEnv(), NullIO()) builder.build() sdist = fixtures_dir / "prerelease" / "dist" / "prerelease-0.1b1.tar.gz" assert sdist.exists()
def test_make_pkg_info_any_python(): poetry = Poetry.create(project("module1")) builder = SdistBuilder(poetry, NullEnv(), NullIO()) pkg_info = builder.build_pkg_info() p = Parser() parsed = p.parsestr(to_str(pkg_info)) assert "Requires-Python" not in parsed
def test_package(): poetry = Poetry.create(project('complete')) builder = SdistBuilder(poetry, NullVenv(), NullIO()) builder.build() sdist = fixtures_dir / 'complete' / 'dist' / 'my-package-1.2.3.tar.gz' assert sdist.exists()
def test_wheel_localversionlabel(): module_path = fixtures_dir / "localversionlabel" WheelBuilder.make(Poetry.create(str(module_path)), NullEnv(), NullIO()) local_version_string = "localversionlabel-0.1b1+gitbranch.buildno.1" whl = module_path / "dist" / (local_version_string + "-py2.py3-none-any.whl") assert whl.exists() with zipfile.ZipFile(str(whl)) as z: assert local_version_string + ".dist-info/METADATA" in z.namelist()
def test_metadata_homepage_default(): builder = Builder( Poetry.create(Path(__file__).parent / "fixtures" / "simple_version"), NullEnv(), NullIO(), ) metadata = Parser().parsestr(builder.get_metadata_content()) assert metadata["Home-page"] is None
def test_wheel_package(): module_path = fixtures_dir / "complete" WheelBuilder.make(Poetry.create(str(module_path)), NullEnv(), NullIO()) whl = module_path / "dist" / "my_package-1.2.3-py3-none-any.whl" assert whl.exists() with zipfile.ZipFile(str(whl)) as z: assert "my_package/sub_pkg1/__init__.py" in z.namelist()
def test_wheel_module_src(): module_path = fixtures_dir / "source_file" WheelBuilder.make(Poetry.create(str(module_path)), NullEnv(), NullIO()) whl = module_path / "dist" / "module_src-0.1-py2.py3-none-any.whl" assert whl.exists() with zipfile.ZipFile(str(whl)) as z: assert "module_src.py" in z.namelist()
def install_directory(self, package): from poetry.io import NullIO from poetry.masonry.builder import SdistBuilder from poetry.poetry import Poetry from poetry.utils._compat import decode from poetry.utils.env import NullEnv from poetry.utils.toml_file import TomlFile if package.root_dir: req = os.path.join(package.root_dir, package.source_url) else: req = os.path.realpath(package.source_url) args = ["install", "--no-deps", "-U"] pyproject = TomlFile(os.path.join(req, "pyproject.toml")) has_poetry = False has_build_system = False if pyproject.exists(): pyproject_content = pyproject.read() has_poetry = ("tool" in pyproject_content and "poetry" in pyproject_content["tool"]) # Even if there is a build system specified # pip as of right now does not support it fully # TODO: Check for pip version when proper PEP-517 support lands # has_build_system = ("build-system" in pyproject_content) setup = os.path.join(req, "setup.py") has_setup = os.path.exists(setup) if not has_setup and has_poetry and (package.develop or not has_build_system): # We actually need to rely on creating a temporary setup.py # file since pip, as of this comment, does not support # build-system for editable packages # We also need it for non-PEP-517 packages builder = SdistBuilder(Poetry.create(pyproject.parent), NullEnv(), NullIO()) with open(setup, "w", encoding="utf-8") as f: f.write(decode(builder.build_setup())) if package.develop: args.append("-e") args.append(req) if self._vendor_path: args += ["-t", self._vendor_path] try: return self.run(*args) finally: if not has_setup and os.path.exists(setup): os.remove(setup)