Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge master into develop #2206

Merged
merged 25 commits into from
Mar 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
134aef1
export: fix exporting extras sub-dependencies (#1294)
tommilligan Oct 10, 2019
2966ab1
Support POETRY_HOME for install (#794)
dcramer Oct 10, 2019
3622f8e
* check if relative filename is in excluded file list (#1459)
finswimmer Oct 11, 2019
3a39e5a
Exclude nested items (#784) (#1464)
finswimmer Oct 19, 2019
fedecf6
Merge branch 'master' into develop
sdispater Oct 30, 2019
c64459e
Update dependencies
sdispater Oct 30, 2019
380ac4c
Deprecate allows-prereleases in favor of allow-prereleases for consis…
sdispater Oct 30, 2019
8fd6311
Fix tests for Python 2.7
sdispater Oct 30, 2019
723269d
Merge branch 'master' into develop
sdispater Nov 1, 2019
3bfed00
Fix linting
sdispater Nov 1, 2019
e717aa1
Fix linting
sdispater Nov 1, 2019
2e7d4b3
Fix linting
sdispater Nov 1, 2019
f6e4394
Fix typing import
sdispater Nov 1, 2019
71af5f3
Merge branch 'master' into develop
sdispater Nov 6, 2019
a533905
Correct a couple typos in get-poetry.py (#573)
altendky Nov 13, 2019
39c57cc
Docs: `self:update` changed to `self update` (#1588)
justinmayer Nov 17, 2019
0cf4bd7
Merge branch 'master' into develop
sdispater Jan 10, 2020
4f3d3d0
Merge branch 'master' into merge-master-into-develop
sdispater Jan 10, 2020
f797e17
Merge pull request #1867 from python-poetry/merge-master-into-develop
sdispater Jan 10, 2020
65ab92d
Fix GitHub actions cache issues on develop (#1918)
sdispater Jan 21, 2020
4d05c15
Add --source option to "poetry add" (#1912)
k4nar Jan 31, 2020
7b1fd0c
Merge master into develop (#2070)
sdispater Feb 21, 2020
9e3f606
pre-commit: replace isort mirror with isort upstream (#2118)
abn Mar 8, 2020
54701a1
Add cache list command (#1187)
abn Mar 8, 2020
b0ee465
Merge branch 'master' into merge-master-into-develop
sdispater Mar 20, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ repos:
hooks:
- id: flake8

- repo: https://github.com/pre-commit/mirrors-isort
rev: v4.3.21
- repo: https://github.com/timothycrosley/isort
rev: 4.3.21
hooks:
- id: isort
additional_dependencies: [toml]
Expand Down
1 change: 0 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
- Fixed an error when parsing some git URLs ([#2018](https://github.com/python-poetry/poetry/pull/2018)).



## [1.0.3] - 2020-01-31

### Fixed
Expand Down
12 changes: 12 additions & 0 deletions docs/docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -452,3 +452,15 @@ The `env` command regroups sub commands to interact with the virtualenvs
associated with a specific project.

See [Managing environments](./managing-environments.md) for more information about these commands.

## cache

The `cache` command regroups sub commands to interact with Poetry's cache.

### cache list

The `cache list` command lists Poetry's available caches.

```bash
poetry cache list
```
13 changes: 12 additions & 1 deletion poetry/console/commands/add.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ class AddCommand(EnvCommand, InitCommand):
"Platforms for which the dependency must be installed.",
flag=False,
),
option(
"source",
None,
"Name of the source to use to install the package.",
flag=False,
),
option("allow-prereleases", None, "Accept prereleases."),
option(
"dry-run",
Expand Down Expand Up @@ -86,7 +92,9 @@ def handle(self):
raise ValueError("Package {} is already present".format(name))

requirements = self._determine_requirements(
packages, allow_prereleases=self.option("allow-prereleases")
packages,
allow_prereleases=self.option("allow-prereleases"),
source=self.option("source"),
)

for _constraint in requirements:
Expand Down Expand Up @@ -123,6 +131,9 @@ def handle(self):
if self.option("platform"):
constraint["platform"] = self.option("platform")

if self.option("source"):
constraint["source"] = self.option("source")

if len(constraint) == 1 and "version" in constraint:
constraint = constraint["version"]

Expand Down
4 changes: 3 additions & 1 deletion poetry/console/commands/cache/cache.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from poetry.console.commands.cache.list import CacheListCommand

from ..command import Command
from .clear import CacheClearCommand

Expand All @@ -7,7 +9,7 @@ class CacheCommand(Command):
name = "cache"
description = "Interact with Poetry's cache"

commands = [CacheClearCommand()]
commands = [CacheClearCommand(), CacheListCommand()]

def handle(self):
return self.call("help", self._config.name)
8 changes: 3 additions & 5 deletions poetry/console/commands/cache/clear.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,17 @@ class CacheClearCommand(Command):

def handle(self):
from cachy import CacheManager
from poetry.locations import CACHE_DIR
from poetry.utils._compat import Path
from poetry.locations import REPOSITORY_CACHE_DIR

cache = self.argument("cache")

parts = cache.split(":")
root = parts[0]

base_cache = Path(CACHE_DIR) / "cache" / "repositories"
cache_dir = base_cache / root
cache_dir = REPOSITORY_CACHE_DIR / root

try:
cache_dir.relative_to(base_cache)
cache_dir.relative_to(REPOSITORY_CACHE_DIR)
except ValueError:
raise ValueError("{} is not a valid repository cache".format(root))

Expand Down
21 changes: 21 additions & 0 deletions poetry/console/commands/cache/list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import os

from ..command import Command


class CacheListCommand(Command):

name = "list"
description = "List Poetry's caches."

def handle(self):
from poetry.locations import REPOSITORY_CACHE_DIR

if os.path.exists(str(REPOSITORY_CACHE_DIR)):
caches = list(sorted(REPOSITORY_CACHE_DIR.iterdir()))
if caches:
for cache in caches:
self.line("<info>{}</>".format(cache.name))
return 0

self.line("<warning>No caches found</>")
11 changes: 7 additions & 4 deletions poetry/console/commands/init.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ def handle(self):
f.write(content)

def _determine_requirements(
self, requires, allow_prereleases=False
self, requires, allow_prereleases=False, source=None
): # type: (List[str], bool) -> List[Dict[str, str]]
if not requires:
requires = []
Expand Down Expand Up @@ -299,7 +299,9 @@ def _determine_requirements(
elif "version" not in requirement:
# determine the best version automatically
name, version = self._find_best_version_for_package(
requirement["name"], allow_prereleases=allow_prereleases
requirement["name"],
allow_prereleases=allow_prereleases,
source=source,
)
requirement["version"] = version
requirement["name"] = name
Expand All @@ -314,6 +316,7 @@ def _determine_requirements(
requirement["name"],
requirement["version"],
allow_prereleases=allow_prereleases,
source=source,
)

requirement["name"] = name
Expand All @@ -323,13 +326,13 @@ def _determine_requirements(
return result

def _find_best_version_for_package(
self, name, required_version=None, allow_prereleases=False
self, name, required_version=None, allow_prereleases=False, source=None
): # type: (...) -> Tuple[str, str]
from poetry.version.version_selector import VersionSelector

selector = VersionSelector(self._get_pool())
package = selector.find_best_candidate(
name, required_version, allow_prereleases=allow_prereleases
name, required_version, allow_prereleases=allow_prereleases, source=source
)

if not package:
Expand Down
3 changes: 3 additions & 0 deletions poetry/locations.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from .utils._compat import Path
from .utils.appdirs import user_cache_dir
from .utils.appdirs import user_config_dir


CACHE_DIR = user_cache_dir("pypoetry")
CONFIG_DIR = user_config_dir("pypoetry")

REPOSITORY_CACHE_DIR = Path(CACHE_DIR) / "cache" / "repositories"
4 changes: 2 additions & 2 deletions poetry/repositories/legacy_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

import poetry.packages

from poetry.locations import CACHE_DIR
from poetry.locations import REPOSITORY_CACHE_DIR
from poetry.packages import Package
from poetry.packages import dependency_from_pep_508
from poetry.packages.utils.link import Link
Expand Down Expand Up @@ -174,7 +174,7 @@ def __init__(
self._client_cert = client_cert
self._cert = cert
self._inspector = Inspector()
self._cache_dir = Path(CACHE_DIR) / "cache" / "repositories" / name
self._cache_dir = REPOSITORY_CACHE_DIR / name
self._cache = CacheManager(
{
"default": "releases",
Expand Down
4 changes: 2 additions & 2 deletions poetry/repositories/pypi_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from requests import session
from requests.exceptions import TooManyRedirects

from poetry.locations import CACHE_DIR
from poetry.locations import REPOSITORY_CACHE_DIR
from poetry.packages import Package
from poetry.packages import dependency_from_pep_508
from poetry.packages.utils.link import Link
Expand Down Expand Up @@ -57,7 +57,7 @@ def __init__(self, url="https://pypi.org/", disable_cache=False, fallback=True):
self._disable_cache = disable_cache
self._fallback = fallback

release_cache_dir = Path(CACHE_DIR) / "cache" / "repositories" / "pypi"
release_cache_dir = REPOSITORY_CACHE_DIR / "pypi"
self._cache = CacheManager(
{
"default": "releases",
Expand Down
3 changes: 2 additions & 1 deletion poetry/version/version_selector.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ def find_best_candidate(
package_name, # type: str
target_package_version=None, # type: Union[str, None]
allow_prereleases=False, # type: bool
source=None, # type: str
): # type: (...) -> Union[Package, bool]
"""
Given a package name and optional version,
Expand All @@ -26,7 +27,7 @@ def find_best_candidate(
constraint = parse_constraint("*")

candidates = self._pool.find_packages(
package_name, constraint, allow_prereleases=True
package_name, constraint, allow_prereleases=True, repository=source
)
only_prereleases = all([c.version.is_prerelease() for c in candidates])

Expand Down
68 changes: 68 additions & 0 deletions tests/console/commands/test_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

from cleo.testers import CommandTester

from poetry.repositories.legacy_repository import LegacyRepository
from poetry.semver import Version
from poetry.utils._compat import Path
from tests.helpers import get_dependency
from tests.helpers import get_package
Expand Down Expand Up @@ -634,6 +636,72 @@ def test_add_constraint_with_platform(app, repo, installer):
}


def test_add_constraint_with_source(app, poetry, installer):
repo = LegacyRepository(name="my-index", url="https://my-index.fake")
repo.add_package(get_package("cachy", "0.2.0"))
repo._cache.store("matches").put("cachy:0.2.0", [Version.parse("0.2.0")], 5)

poetry.pool.add_repository(repo)

command = app.find("add")
tester = CommandTester(command)

tester.execute("cachy=0.2.0 --source my-index")

expected = """\

Updating dependencies
Resolving dependencies...

Writing lock file


Package operations: 1 install, 0 updates, 0 removals

- Installing cachy (0.2.0)
"""

assert expected == tester.io.fetch_output()

assert len(installer.installs) == 1

content = app.poetry.file.read()["tool"]["poetry"]

assert "cachy" in content["dependencies"]
assert content["dependencies"]["cachy"] == {
"version": "0.2.0",
"source": "my-index",
}


def test_add_constraint_with_source_that_does_not_exist(app):
command = app.find("add")
tester = CommandTester(command)

with pytest.raises(ValueError) as e:
tester.execute("foo --source i-dont-exist")

assert 'Repository "i-dont-exist" does not exist.' == str(e.value)


def test_add_constraint_not_found_with_source(app, poetry, mocker):
repo = LegacyRepository(name="my-index", url="https://my-index.fake")
mocker.patch.object(repo, "find_packages", return_value=[])

poetry.pool.add_repository(repo)

pypi = poetry.pool.repositories[0]
pypi.add_package(get_package("cachy", "0.2.0"))

command = app.find("add")
tester = CommandTester(command)

with pytest.raises(ValueError) as e:
tester.execute("cachy --source my-index")

assert "Could not find a matching version of package cachy" == str(e.value)


def test_add_to_section_that_does_no_exist_yet(app, repo, installer):
command = app.find("add")
tester = CommandTester(command)
Expand Down
60 changes: 60 additions & 0 deletions tests/console/commands/test_cache.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import uuid

import pytest

from cleo.testers import CommandTester


@pytest.fixture
def repository_cache_dir(monkeypatch, tmpdir):
import poetry.locations
from poetry.utils._compat import Path

path = Path(str(tmpdir))
monkeypatch.setattr(poetry.locations, "REPOSITORY_CACHE_DIR", path)
return path


@pytest.fixture
def repository_one():
return "01_{}".format(uuid.uuid4())


@pytest.fixture
def repository_two():
return "02_{}".format(uuid.uuid4())


@pytest.fixture
def mock_caches(repository_cache_dir, repository_one, repository_two):
(repository_cache_dir / repository_one).mkdir()
(repository_cache_dir / repository_two).mkdir()


def test_cache_list(app, mock_caches, repository_one, repository_two):
command = app.find("cache list")
tester = CommandTester(command)

tester.execute()

expected = """\
{}
{}
""".format(
repository_one, repository_two
)

assert expected == tester.io.fetch_output()


def test_cache_list_empty(app, repository_cache_dir):
command = app.find("cache list")
tester = CommandTester(command)

tester.execute()

expected = """\
No caches found
"""

assert expected == tester.io.fetch_output()