summaryrefslogtreecommitdiffstats
path: root/tests/test_sdist.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_sdist.py')
-rw-r--r--tests/test_sdist.py152
1 files changed, 152 insertions, 0 deletions
diff --git a/tests/test_sdist.py b/tests/test_sdist.py
new file mode 100644
index 0000000..0ddcb82
--- /dev/null
+++ b/tests/test_sdist.py
@@ -0,0 +1,152 @@
+import ast
+from os.path import join as pjoin
+from pathlib import Path
+import pytest
+from shutil import which, copy, copytree
+import sys
+import tarfile
+from tempfile import TemporaryDirectory
+from testpath import assert_isfile, MockCommand
+
+from flit import sdist, common
+
+samples_dir = Path(__file__).parent / 'samples'
+
+def test_auto_packages():
+ module = common.Module('package1', samples_dir / 'package1')
+ packages, pkg_data = sdist.auto_packages(module)
+ assert packages == ['package1', 'package1.subpkg', 'package1.subpkg2']
+ assert pkg_data == {'': ['*'],
+ 'package1': ['data_dir/*'],
+ 'package1.subpkg': ['sp_data_dir/*'],
+ }
+
+def test_make_sdist():
+ # Smoke test of making a complete sdist
+ if not which('git'):
+ pytest.skip("requires git")
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'package1' / 'pyproject.toml')
+ with TemporaryDirectory() as td:
+ td = Path(td)
+ builder.build(td)
+ sdist_file = td / 'package1-0.1.tar.gz'
+ assert_isfile(sdist_file)
+
+ with tarfile.open(str(sdist_file)) as tf:
+ assert 'package1-0.1/setup.py' in tf.getnames()
+
+
+def test_sdist_no_setup_py():
+ # Smoke test of making a complete sdist
+ if not which('git'):
+ pytest.skip("requires git")
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'package1' / 'pyproject.toml')
+ with TemporaryDirectory() as td:
+ td = Path(td)
+ builder.build(td, gen_setup_py=False)
+ sdist_file = td / 'package1-0.1.tar.gz'
+ assert_isfile(sdist_file)
+
+ with tarfile.open(str(sdist_file)) as tf:
+ assert 'package1-0.1/setup.py' not in tf.getnames()
+
+
+LIST_FILES = """\
+#!{python}
+import sys
+from os.path import join
+if '--deleted' not in sys.argv:
+ files = [
+ 'foo',
+ join('dir1', 'bar'),
+ join('dir1', 'subdir', 'qux'),
+ join('dir2', 'abc'),
+ join('dist', 'def'),
+ ]
+ mode = '{vcs}'
+ if mode == 'git':
+ print('\\0'.join(files), end='\\0')
+ elif mode == 'hg':
+ for f in files:
+ print(f)
+"""
+
+LIST_FILES_GIT = LIST_FILES.format(python=sys.executable, vcs='git')
+LIST_FILES_HG = LIST_FILES.format(python=sys.executable, vcs='hg')
+
+
+def test_get_files_list_git(copy_sample):
+ td = copy_sample('module1_toml')
+ (td / '.git').mkdir()
+
+ builder = sdist.SdistBuilder.from_ini_path(td / 'pyproject.toml')
+ with MockCommand('git', LIST_FILES_GIT):
+ files = builder.select_files()
+
+ assert set(files) == {
+ 'foo', pjoin('dir1', 'bar'), pjoin('dir1', 'subdir', 'qux'),
+ pjoin('dir2', 'abc')
+ }
+
+def test_get_files_list_hg(tmp_path):
+ dir1 = tmp_path / 'dir1'
+ copytree(str(samples_dir / 'module1_toml'), str(dir1))
+ (tmp_path / '.hg').mkdir()
+ builder = sdist.SdistBuilder.from_ini_path(dir1 / 'pyproject.toml')
+ with MockCommand('hg', LIST_FILES_HG):
+ files = builder.select_files()
+
+ assert set(files) == {
+ 'bar', pjoin('subdir', 'qux')
+ }
+
+def get_setup_assigns(setup):
+ """Parse setup.py, execute assignments, return the namespace"""
+ setup_ast = ast.parse(setup)
+ # Select only assignment statements
+ 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)
+ return ns
+
+def test_make_setup_py():
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'package1' / 'pyproject.toml')
+ ns = get_setup_assigns(builder.make_setup_py())
+ assert ns['packages'] == ['package1', 'package1.subpkg', 'package1.subpkg2']
+ assert 'install_requires' not in ns
+ assert ns['entry_points'] == \
+ {'console_scripts': ['pkg_script = package1:main']}
+
+def test_make_setup_py_reqs():
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'extras' / 'pyproject.toml')
+ ns = get_setup_assigns(builder.make_setup_py())
+ assert ns['install_requires'] == ['toml']
+ assert ns['extras_require'] == {'test': ['pytest'], 'custom': ['requests']}
+
+def test_make_setup_py_reqs_envmark():
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'requires-envmark' / 'pyproject.toml')
+ ns = get_setup_assigns(builder.make_setup_py())
+ assert ns['install_requires'] == ['requests']
+ assert ns['extras_require'] == {":python_version == '2.7'": ['pathlib2']}
+
+def test_make_setup_py_reqs_extra_envmark():
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'requires-extra-envmark' / 'pyproject.toml')
+ ns = get_setup_assigns(builder.make_setup_py())
+ assert ns['extras_require'] == {'test:python_version == "2.7"': ['pathlib2']}
+
+def test_make_setup_py_package_dir_src():
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'packageinsrc' / 'pyproject.toml')
+ ns = get_setup_assigns(builder.make_setup_py())
+ assert ns['package_dir'] == {'': 'src'}
+
+def test_make_setup_py_ns_pkg():
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'ns1-pkg' / 'pyproject.toml')
+ setup = builder.make_setup_py()
+ ns = get_setup_assigns(setup)
+ assert ns['packages'] == ['ns1', 'ns1.pkg']
+
+def test_make_setup_py_ns_pkg_mod():
+ builder = sdist.SdistBuilder.from_ini_path(samples_dir / 'ns1-pkg-mod' / 'pyproject.toml')
+ setup = builder.make_setup_py()
+ ns = get_setup_assigns(setup)
+ assert ns['packages'] == ['ns1']