summaryrefslogtreecommitdiffstats
path: root/flit_core/flit_core/buildapi.py
diff options
context:
space:
mode:
Diffstat (limited to 'flit_core/flit_core/buildapi.py')
-rw-r--r--flit_core/flit_core/buildapi.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/flit_core/flit_core/buildapi.py b/flit_core/flit_core/buildapi.py
new file mode 100644
index 0000000..963bf61
--- /dev/null
+++ b/flit_core/flit_core/buildapi.py
@@ -0,0 +1,83 @@
+"""PEP-517 compliant buildsystem API"""
+import logging
+import io
+import os
+import os.path as osp
+from pathlib import Path
+
+from .common import (
+ Module, make_metadata, write_entry_points, dist_info_name,
+ get_docstring_and_version_via_ast,
+)
+from .config import read_flit_config
+from .wheel import make_wheel_in, _write_wheel_file
+from .sdist import SdistBuilder
+
+log = logging.getLogger(__name__)
+
+# PEP 517 specifies that the CWD will always be the source tree
+pyproj_toml = Path('pyproject.toml')
+
+def get_requires_for_build_wheel(config_settings=None):
+ """Returns a list of requirements for building, as strings"""
+ info = read_flit_config(pyproj_toml)
+ # If we can get version & description from pyproject.toml (PEP 621), or
+ # by parsing the module (_via_ast), we don't need any extra
+ # dependencies. If not, we'll need to try importing it, so report any
+ # runtime dependencies as build dependencies.
+ want_summary = 'description' in info.dynamic_metadata
+ want_version = 'version' in info.dynamic_metadata
+
+ module = Module(info.module, Path.cwd())
+ docstring, version = get_docstring_and_version_via_ast(module)
+
+ if (want_summary and not docstring) or (want_version and not version):
+ return info.metadata.get('requires_dist', [])
+ else:
+ return []
+
+# Requirements to build an sdist are the same as for a wheel
+get_requires_for_build_sdist = get_requires_for_build_wheel
+
+# Requirements to build an editable are the same as for a wheel
+get_requires_for_build_editable = get_requires_for_build_wheel
+
+def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None):
+ """Creates {metadata_directory}/foo-1.2.dist-info"""
+ ini_info = read_flit_config(pyproj_toml)
+ module = Module(ini_info.module, Path.cwd())
+ metadata = make_metadata(module, ini_info)
+
+ dist_info = osp.join(metadata_directory,
+ dist_info_name(metadata.name, metadata.version))
+ os.mkdir(dist_info)
+
+ with io.open(osp.join(dist_info, 'WHEEL'), 'w', encoding='utf-8') as f:
+ _write_wheel_file(f, supports_py2=metadata.supports_py2)
+
+ with io.open(osp.join(dist_info, 'METADATA'), 'w', encoding='utf-8') as f:
+ metadata.write_metadata_file(f)
+
+ if ini_info.entrypoints:
+ with io.open(osp.join(dist_info, 'entry_points.txt'), 'w', encoding='utf-8') as f:
+ write_entry_points(ini_info.entrypoints, f)
+
+ return osp.basename(dist_info)
+
+# Metadata for editable are the same as for a wheel
+prepare_metadata_for_build_editable = prepare_metadata_for_build_wheel
+
+def build_wheel(wheel_directory, config_settings=None, metadata_directory=None):
+ """Builds a wheel, places it in wheel_directory"""
+ info = make_wheel_in(pyproj_toml, Path(wheel_directory))
+ return info.file.name
+
+def build_editable(wheel_directory, config_settings=None, metadata_directory=None):
+ """Builds an "editable" wheel, places it in wheel_directory"""
+ info = make_wheel_in(pyproj_toml, Path(wheel_directory), editable=True)
+ return info.file.name
+
+def build_sdist(sdist_directory, config_settings=None):
+ """Builds an sdist, places it in sdist_directory"""
+ path = SdistBuilder.from_ini_path(pyproj_toml).build(Path(sdist_directory))
+ return path.name