Skip to content

Commit af11b6b

Browse files
authored
builder: install pydeps and requirements simultaneously (#1157)
Minimal fix for #1135. A larger fix will come with 3.0.
1 parent 5b50d9e commit af11b6b

File tree

4 files changed

+47
-18
lines changed

4 files changed

+47
-18
lines changed

charmcraft/charm_builder.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import os
2626
import pathlib
2727
import shutil
28-
import sys
2928
import subprocess
29+
import sys
3030
from typing import List
3131

3232
from charmcraft import instrum
@@ -35,7 +35,6 @@
3535
from charmcraft.jujuignore import JujuIgnore, default_juju_ignore
3636
from charmcraft.utils import make_executable
3737

38-
3938
# Some constants that are used through the code.
4039
WORK_DIRNAME = "work_dir"
4140
VENV_DIRNAME = "venv"
@@ -76,7 +75,7 @@ def __init__(
7675
binary_python_packages: List[str] = None,
7776
python_packages: List[str] = None,
7877
requirements: List[pathlib.Path] = None,
79-
):
78+
) -> None:
8079
self.builddir = builddir
8180
self.installdir = installdir
8281
self.entrypoint = entrypoint
@@ -263,17 +262,15 @@ def _install_dependencies(self, staging_venv_dir):
263262
cmd.extend(self.python_packages) # the python packages to install
264263
_process_run(cmd)
265264

266-
if self.requirement_paths:
267-
# install dependencies from requirement files
265+
if self.requirement_paths or self.charmlib_deps:
268266
cmd = [pip_cmd, "install", "--upgrade", "--no-binary", ":all:"] # base command
269-
for reqspath in self.requirement_paths:
270-
cmd.append("--requirement={}".format(reqspath)) # the dependencies file(s)
271-
_process_run(cmd)
272267

273-
if self.charmlib_deps:
274-
# install charmlibs python dependencies
275-
cmd = [pip_cmd, "install", "--upgrade", "--no-binary", ":all:"] # base command
276-
cmd.extend(self.charmlib_deps) # the python packages to install
268+
if self.requirement_paths:
269+
# install dependencies from requirement files
270+
cmd.extend(f"--requirement={path}" for path in self.requirement_paths)
271+
272+
if self.charmlib_deps:
273+
cmd.extend(self.charmlib_deps)
277274
_process_run(cmd)
278275

279276
def handle_dependencies(self):
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
summary: pack a charm with a specific (old) dependency version
2+
3+
include:
4+
- tests/
5+
6+
prepare: |
7+
tests.pkgs install unzip
8+
charmcraft init --project-dir=charm
9+
cd charm
10+
echo "ops==2.0.0" > requirements.txt
11+
cat <<- EOF >> charmcraft.yaml
12+
parts:
13+
charm:
14+
charm-requirements: [requirements.txt]
15+
EOF
16+
mkdir -p lib/charms/charm/v0/
17+
cat <<- EOF > lib/charms/charm/v0/my_lib.py
18+
PYDEPS = ["ops"]
19+
LIBID = "my_lib"
20+
LIBAPI = 0
21+
LIBPATCH = 1
22+
EOF
23+
restore: |
24+
pushd charm
25+
charmcraft clean
26+
popd
27+
rm -rf charm
28+
execute: |
29+
cd charm
30+
charmcraft pack --verbose
31+
test -f charm*.charm
32+
unzip -p charm_*.charm venv/ops/version.py | MATCH "version = '2.0.0'"

tests/test_charm_builder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,9 +792,10 @@ def test_build_dependencies_virtualenv_all(tmp_path, assert_output):
792792
":all:",
793793
f"--requirement={reqs_file_1}",
794794
f"--requirement={reqs_file_2}",
795+
"pkg5",
796+
"pkg6",
795797
]
796798
),
797-
call([pip_cmd, "install", "--upgrade", "--no-binary", ":all:", "pkg5", "pkg6"]),
798799
]
799800

800801
site_packages_dir = charm_builder._find_venv_site_packages(pathlib.Path(STAGING_VENV_DIRNAME))

tests/test_providers.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,16 @@
1717
import contextlib
1818
import pathlib
1919
import sys
20-
from unittest.mock import Mock, patch, call
20+
from unittest.mock import Mock, call, patch
2121

2222
import pytest
23+
from charmcraft import providers
24+
from charmcraft.config import Base, BasesConfiguration
25+
from charmcraft.snap import CharmcraftSnapConfiguration
2326
from craft_cli import CraftError
2427
from craft_providers import ProviderError, bases, lxd, multipass
2528
from craft_providers.actions.snap_installer import Snap
2629

27-
from charmcraft.config import Base, BasesConfiguration
28-
from charmcraft import providers
29-
from charmcraft.snap import CharmcraftSnapConfiguration
30-
3130

3231
@pytest.fixture()
3332
def mock_provider(mock_instance, fake_provider):

0 commit comments

Comments
 (0)