Skip to content

Commit

Permalink
Merge pull request #79 from zuzukin/build-number
Browse files Browse the repository at this point in the history
Build number
  • Loading branch information
analog-cbarber committed Sep 10, 2023
2 parents 5f501d1 + 7bd562f commit 0a3feac
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 9 deletions.
14 changes: 9 additions & 5 deletions src/whl2conda/api/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ class Wheel2CondaConverter:
dependency_rename: list[DependencyRename]
extra_dependencies: list[str]
interactive: bool = False
build_number: Optional[int] = None

wheel_md: Optional[MetadataFromWheel] = None
conda_pkg_path: Optional[Path] = None
Expand Down Expand Up @@ -386,11 +387,14 @@ def _write_index(
) -> None:
# info/index.json
conda_index_file = conda_info_dir.joinpath("index.json")
# TODO allow build number override (#31)
try:
build_number = int(wheel_md.wheel_build_number)
except ValueError:
build_number = 0

if self.build_number is not None:
build_number = self.build_number
else:
try:
build_number = int(wheel_md.wheel_build_number)
except ValueError:
build_number = 0

conda_index_file.write_text(
json.dumps(
Expand Down
7 changes: 7 additions & 0 deletions src/whl2conda/cli/convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class Whl2CondaArgs:
Parsed arguments
"""

build_number: Optional[int]
build_wheel: bool
dep_renames: Sequence[tuple[str, str]]
dropped_deps: Sequence[str]
Expand Down Expand Up @@ -189,6 +190,11 @@ def _create_argparser(prog: Optional[str] = None) -> argparse.ArgumentParser:
"""
),
)
output_opts.add_argument(
"--build-number",
type=int,
help="Specify build number. Otherwise taken from wheel.",
)

override_opts.add_argument(
"--name",
Expand Down Expand Up @@ -476,6 +482,7 @@ def convert_main(args: Optional[Sequence[str]] = None, prog: Optional[str] = Non
converter.extra_dependencies.extend(pyproj_info.extra_dependencies)
converter.extra_dependencies.extend(parsed.extra_deps)
converter.interactive = interactive
converter.build_number = parsed.build_number

converter.dependency_rename.extend(renames)

Expand Down
25 changes: 25 additions & 0 deletions test/api/test_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,31 @@ def test_simple_wheel(
v1pkg = test_case(simple_wheel).build(CondaPackageFormat.V1)
assert v1pkg.name.endswith(".tar.bz2")

# Repack wheel with build number
dest_dir = test_case.tmp_path / "number"
subprocess.check_call(
["wheel", "unpack", str(simple_wheel), "--dest", str(dest_dir)]
)
unpack_dir = next(dest_dir.glob("*"))
assert unpack_dir.is_dir()
subprocess.check_call(
[
"wheel",
"pack",
str(unpack_dir),
"--build-number",
"42",
"--dest",
str(dest_dir),
]
)
build42whl = next(dest_dir.glob("*.whl"))

test_case(
build42whl,
overwrite=True,
).build()


def test_poetry(
test_case: ConverterTestCaseFactory,
Expand Down
19 changes: 15 additions & 4 deletions test/api/validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,8 @@ def validate(
self._validate_unpacked()

def _parse_wheel_metadata(self, wheel_dir: Path) -> dict[str, Any]:
metdata_files = list(wheel_dir.glob("*.dist-info/METADATA"))
assert metdata_files
md_file = metdata_files[0]
dist_info_dir = next(wheel_dir.glob("*.dist-info"))
md_file = dist_info_dir / "METADATA"
md_msg = email.message_from_string(md_file.read_text())

list_keys = set(s.lower() for s in Wheel2CondaConverter.MULTI_USE_METADATA_KEYS)
Expand All @@ -94,6 +93,12 @@ def _parse_wheel_metadata(self, wheel_dir: Path) -> dict[str, Any]:
md.setdefault(key, []).append(value)
else:
md[key] = value

wheel_file = dist_info_dir / "WHEEL"
wheel_msg = email.message_from_string(wheel_file.read_text())
if build := wheel_msg.get("Build"):
md["build"] = build

return md

def _unpack_package(self, pkg_path: Path) -> Path:
Expand Down Expand Up @@ -203,7 +208,13 @@ def _validate_index(self, info_dir: Path) -> None:
# TODO support pinned python version...
assert index["arch"] is None
assert index['build'] == 'py_0'
assert index['build_number'] == 0 # TODO support setting build #

try:
build_number = int(wheel_md.get("build", 0))
except ValueError:
build_number = 0
assert index['build_number'] == build_number

assert index["platform"] is None
assert index["subdir"] == "noarch"
assert index.get("license") == wheel_md.get(
Expand Down
32 changes: 32 additions & 0 deletions test/cli/test_convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ class CliTestCase:

args: list[str]
interactive: bool
expected_build_number: Optional[int] = None
expected_dependency_renames: list[DependencyRename]
expected_dry_run: bool = False
expected_extra_dependencies: Sequence[str] = ()
Expand Down Expand Up @@ -114,6 +115,7 @@ def __init__(
project_dir: Path,
# optional
interactive: Optional[bool] = None,
expected_build_number: Optional[int] = None,
expected_dry_run: bool = False,
expected_extra_dependencies: Sequence[str] = (),
expected_interactive: bool = True,
Expand All @@ -134,6 +136,7 @@ def __init__(

self.args = list(args)
self.interactive = is_interactive() if interactive is None else interactive
self.expected_build_number = expected_build_number
self.expected_dry_run = expected_dry_run
self.expected_dependency_renames = []
self.expected_extra_dependencies = list(expected_extra_dependencies)
Expand Down Expand Up @@ -267,6 +270,7 @@ def validate_converter(self, converter: Wheel2CondaConverter) -> None:
expected_outdir = os.path.join(expected_root, "dist")
if expected_outdir:
assert converter.out_dir == projects / expected_outdir
assert converter.build_number == self.expected_build_number
assert converter.dry_run is self.expected_dry_run
assert converter.package_name == self.expected_package_name
assert converter.out_format is self.expected_out_fmt
Expand Down Expand Up @@ -319,6 +323,7 @@ def __call__(
args: Sequence[str],
*,
interactive: Optional[bool] = None,
expected_build_number: Optional[int] = None,
expected_dry_run: bool = False,
expected_package_name: str = "",
expected_parser_error: str = "",
Expand All @@ -340,6 +345,7 @@ def __call__(
project_dir=self.project_dir,
args=args,
interactive=interactive,
expected_build_number=expected_build_number,
expected_dry_run=expected_dry_run,
expected_package_name=expected_package_name,
expected_parser_error=expected_parser_error,
Expand Down Expand Up @@ -795,3 +801,29 @@ def test_rename_options(
"quaternion",
"",
).run()

test_case(
[str(simple_wheel), "-R", "[bad", "bad"],
expected_parser_error="Bad dependency rename pattern",
).run()

test_case(
[str(simple_wheel), "-R", "acme-(.*)", "acme.$2"],
expected_parser_error="Bad dependency replacement",
).run()


def test_build_number(
test_case: CliTestCaseFactory,
simple_wheel: Path,
) -> None:
"""Test whl2conda build output directory"""
test_case(
[str(simple_wheel)],
expected_build_number=None,
).run()

test_case(
[str(simple_wheel), "--build-number", "42"],
expected_build_number=42,
).run()
20 changes: 20 additions & 0 deletions test/impl/test_pyproject.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,26 @@ def test_read_pyproject(tmp_path: Path) -> None:
assert pyproj3.extra_dependencies == ("conda-only",)
assert pyproj3.conda_format is CondaPackageFormat.V1

#
# Test poetry name
#
proj_file.write_text(
dedent(
r"""
[build-system]
requires = ["poetry-core","setuptools"]
build-backend = "poetry.core.masonry.api"
[tool.poetry]
name = "poetry.example"
version = "1.0.2"
"""
),
encoding="ascii",
)
pyproj4 = read_pyproject(tmp_path)
assert pyproj4.name == "poetry.example"

#
# Test bad value warnings
#
Expand Down

0 comments on commit 0a3feac

Please sign in to comment.