Commit c2917480 by Sébastien Eustace

Fix transitive extra dependencies being removed when updating otehr dependency

parent 62fc038d
# Change Log
## [Unreleased]
### Fixed
- Fixed transitive extra dependencies being removed when updating a specific dependency.
## [0.12.4] - 2018-10-21
### Fixed
......
......@@ -348,7 +348,7 @@ class VersionSolver:
else:
dependency = min(*unsatisfied, key=_get_min)
locked = self._get_locked(dependency.name)
locked = self._get_locked(dependency)
if locked is None or not dependency.constraint.allows(locked.version):
try:
packages = self._provider.search_for(dependency)
......@@ -429,17 +429,16 @@ class VersionSolver:
self._incompatibilities[term.dependency.name].append(incompatibility)
def _get_locked(self, package_name): # type: (str) -> Union[Package, None]
if package_name in self._use_latest:
def _get_locked(self, dependency): # type: (Dependency) -> Union[Package, None]
if dependency.name in self._use_latest:
return
locked = self._locked.get(package_name)
locked = self._locked.get(dependency.name)
if not locked:
return
for dep in self._root.all_requires:
if dep.name == locked.name:
locked.requires_extras = dep.extras
if dependency.extras:
locked.requires_extras = dependency.extras
return locked
......
......@@ -85,6 +85,7 @@ class Locker:
package.optional = info["optional"]
package.hashes = lock_data["metadata"]["hashes"][info["name"]]
package.python_versions = info["python-versions"]
package.extras = info.get("extras", {})
if "marker" in info:
package.marker = parse_marker(info["marker"])
......@@ -207,6 +208,12 @@ class Locker:
constraint = {"version": str(dependency.pretty_constraint)}
if dependency.extras:
constraint["extras"] = dependency.extras
if dependency.is_optional():
constraint["optional"] = True
if not dependency.python_constraint.is_any():
constraint["python"] = str(dependency.python_constraint)
......@@ -227,6 +234,16 @@ class Locker:
if not package.marker.is_any():
data["marker"] = str(package.marker)
if package.extras:
extras = {}
for name, deps in package.extras.items():
extras[name] = [
str(dep) if not dep.constraint.is_any() else dep.name
for dep in deps
]
data["extras"] = extras
if dependencies:
for k, constraints in dependencies.items():
if len(constraints) == 1:
......
......@@ -73,7 +73,7 @@ class Pool(BaseRepository):
return package
return None
raise PackageNotFound("Package [{}] not found.".format(name))
def find_packages(
self, name, constraint=None, extras=None, allow_prereleases=False
......
......@@ -66,6 +66,9 @@ class Repository(BaseRepository):
if req.name == dep.name:
dep.activate()
if extras:
package.requires_extras = extras
packages.append(package)
return packages
......
......@@ -7,9 +7,12 @@ optional = false
python-versions = "*"
[package.dependencies]
"B" = "^1.0"
"B" = {version = "^1.0", optional = true}
"C" = {"version" = "^1.0", "python" = ">=2.7,<2.8"}
[package.extras]
foo = ["b"]
[[package]]
name = "B"
version = "1.0"
......
......@@ -15,7 +15,10 @@ optional = false
python-versions = "*"
[package.dependencies]
C = "^1.0"
C = {version = "^1.0", optional = true}
[package.extras]
foo = ["C (^1.0)"]
[[package]]
name = "C"
......
......@@ -22,6 +22,10 @@ optional = false
python-versions = "*"
version = "1.2.3"
[package.extras]
extras_a = ["pendulum (>=1.4.4)"]
extras_b = ["cachy (>=0.2.0)"]
[package.source]
reference = ""
type = "directory"
......
......@@ -23,7 +23,11 @@ python-versions = "*"
version = "1.2.3"
[package.dependencies]
pendulum = ">=1.4.4"
pendulum = {version = ">=1.4.4", optional = true}
[package.extras]
extras_a = ["pendulum (>=1.4.4)"]
extras_b = ["cachy (>=0.2.0)"]
[package.source]
reference = ""
......
......@@ -20,7 +20,7 @@ reference = ""
url = "tests/fixtures/project_with_setup"
[package.dependencies]
cachy = ">=0.2.0"
cachy = {version = ">=0.2.0", extras = ["msgpack"]}
pendulum = ">=1.4.4"
[[package]]
......
......@@ -6,6 +6,11 @@ category = "dev"
optional = false
python-versions = "*"
[package.extras]
dev = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface", "sphinx", "zope.interface"]
docs = ["sphinx", "zope.interface"]
tests = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface"]
[[package]]
name = "colorama"
version = "0.3.9"
......
......@@ -1261,3 +1261,85 @@ def test_installer_test_solver_finds_compatible_package_for_dependency_python_no
assert len(installs) == 1
else:
assert len(installs) == 0
def test_installer_required_extras_should_not_be_removed_when_updating_single_dependency(
installer, locker, repo, package, installed, env, pool
):
package.add_dependency("A", {"version": "^1.0"})
package_a = get_package("A", "1.0.0")
package_a.add_dependency("B", {"version": "^1.0", "extras": ["foo"]})
package_b = get_package("B", "1.0.0")
package_b.add_dependency("C", {"version": "^1.0", "optional": True})
package_b.extras = {"foo": [get_dependency("C")]}
package_c = get_package("C", "1.0.0")
package_d = get_package("D", "1.0.0")
repo.add_package(package_a)
repo.add_package(package_b)
repo.add_package(package_c)
repo.add_package(package_d)
installer.update(True)
installer.run()
assert len(installer.installer.installs) == 3
assert len(installer.installer.updates) == 0
assert len(installer.installer.removals) == 0
package.add_dependency("D", "^1.0")
locker.locked(True)
locker.mock_lock_data(locker.written_data)
installed.add_package(package_a)
installed.add_package(package_b)
installed.add_package(package_c)
installer = Installer(NullIO(), env, package, locker, pool, installed=installed)
installer.update(True)
installer.whitelist(["D"])
installer.run()
assert len(installer.installer.installs) == 1
assert len(installer.installer.updates) == 0
assert len(installer.installer.removals) == 0
def test_installer_required_extras_should_not_be_removed_when_updating_single_dependency_pypi_repository(
locker, repo, package, installed, env
):
pool = Pool()
pool.add_repository(MockRepository())
installer = Installer(NullIO(), env, package, locker, pool, installed=installed)
package.add_dependency("poetry", {"version": "^0.12.0"})
installer.update(True)
installer.run()
assert len(installer.installer.installs) == 3
assert len(installer.installer.updates) == 0
assert len(installer.installer.removals) == 0
package.add_dependency("pytest", "^3.5")
locker.locked(True)
locker.mock_lock_data(locker.written_data)
for pkg in installer.installer.installs:
installed.add_package(pkg)
installer = Installer(NullIO(), env, package, locker, pool, installed=installed)
installer.update(True)
installer.whitelist(["pytest"])
installer.run()
assert len(installer.installer.installs) == 6 if not PY2 else 7
assert len(installer.installer.updates) == 0
assert len(installer.installer.removals) == 0
{
"info": {
"author": "Eric Larson",
"author_email": "eric@ionrock.org",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Environment :: Web Environment",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Topic :: Internet :: WWW/HTTP"
],
"description": "",
"description_content_type": "",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/ionrock/cachecontrol",
"keywords": "requests http caching web",
"license": "",
"maintainer": "",
"maintainer_email": "",
"name": "CacheControl",
"package_url": "https://pypi.org/project/CacheControl/",
"platform": "",
"project_url": "https://pypi.org/project/CacheControl/",
"project_urls": {
"Homepage": "https://github.com/ionrock/cachecontrol"
},
"release_url": "https://pypi.org/project/CacheControl/0.12.5/",
"requires_dist": null,
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"summary": "httplib2 caching for requests",
"version": "0.12.5"
},
"last_serial": 3939938,
"releases": {
"0.12.0": [
{
"comment_text": "",
"digests": {
"md5": "807c457b3b7df9d1f23b1aad7f9c9a22",
"sha256": "ce479e88e697dc088297a5781daa2e812aa0dc888dc439602a308af6f4ff09e8"
},
"downloads": -1,
"filename": "CacheControl-0.12.0.tar.gz",
"has_sig": false,
"md5_digest": "807c457b3b7df9d1f23b1aad7f9c9a22",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13815,
"upload_time": "2017-01-30T05:05:38",
"url": "https://files.pythonhosted.org/packages/41/ae/b9c375b001f13d73c0d8eba2264f6de955769f7cef9140d7fc192814255e/CacheControl-0.12.0.tar.gz"
}
],
"0.12.1": [
{
"comment_text": "",
"digests": {
"md5": "c6c5944d3a6f73bb752a4b4e2e1ffca5",
"sha256": "99c1506b98d53c222493e0ff65904c91aaedd7c8e235cb4f00287ddbbb597072"
},
"downloads": -1,
"filename": "CacheControl-0.12.1.tar.gz",
"has_sig": false,
"md5_digest": "c6c5944d3a6f73bb752a4b4e2e1ffca5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13939,
"upload_time": "2017-03-14T21:42:44",
"url": "https://files.pythonhosted.org/packages/3a/f7/075de886ad249f4ca08615ebd8bec9ce995ed6852790b6d9df38ae059e43/CacheControl-0.12.1.tar.gz"
}
],
"0.12.2": [
{
"comment_text": "",
"digests": {
"md5": "38667f538f36c641eb0b00d0db145823",
"sha256": "d7d919830d7edc5f4b355fa678a2ea49e9ccb67966abc373ec20f93f3f471265"
},
"downloads": -1,
"filename": "CacheControl-0.12.2.tar.gz",
"has_sig": false,
"md5_digest": "38667f538f36c641eb0b00d0db145823",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14327,
"upload_time": "2017-03-27T15:49:21",
"url": "https://files.pythonhosted.org/packages/d2/6c/221f699710a6a643bd9a4324cf22ffb9fb73a089d2bfbed5fe4694f3caaf/CacheControl-0.12.2.tar.gz"
}
],
"0.12.3": [
{
"comment_text": "",
"digests": {
"md5": "45bf98a2e3435438dcee89e519b34195",
"sha256": "a9fc50e216c7c101f4ec4312f012dea501c2859cb256c7a68186a172ab71f632"
},
"downloads": -1,
"filename": "CacheControl-0.12.3.tar.gz",
"has_sig": false,
"md5_digest": "45bf98a2e3435438dcee89e519b34195",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14345,
"upload_time": "2017-05-25T13:49:06",
"url": "https://files.pythonhosted.org/packages/a3/b3/6bb6c1535a283f01fe0c4e9644784756fee2ec080e2a6097f1c59325609e/CacheControl-0.12.3.tar.gz"
}
],
"0.12.4": [
{
"comment_text": "",
"digests": {
"md5": "464675fc575b3a0b841598cb916be516",
"sha256": "a7d21ba4e3633d95ac9fed5be205ee6d1da36bdc4b8914eb7a57ff50b7e5628c"
},
"downloads": -1,
"filename": "CacheControl-0.12.4.tar.gz",
"has_sig": false,
"md5_digest": "464675fc575b3a0b841598cb916be516",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14471,
"upload_time": "2018-01-27T06:24:40",
"url": "https://files.pythonhosted.org/packages/98/f5/76619a63f0e4a1d2f5a1792ebc233a395c648c63d3461dc0331479ef120a/CacheControl-0.12.4.tar.gz"
}
],
"0.12.5": [
{
"comment_text": "",
"digests": {
"md5": "f1baef403e8dd68c5a203e2eb23a0f2e",
"sha256": "cef77effdf51b43178f6a2d3b787e3734f98ade253fa3187f3bb7315aaa42ff7"
},
"downloads": -1,
"filename": "CacheControl-0.12.5.tar.gz",
"has_sig": false,
"md5_digest": "f1baef403e8dd68c5a203e2eb23a0f2e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"size": 14383,
"upload_time": "2018-06-07T14:53:13",
"url": "https://files.pythonhosted.org/packages/5e/f0/2c193ed1f17c97ae539da7e1c2d48b80d8cccb1917163b26a91ca4355aa6/CacheControl-0.12.5.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "f1baef403e8dd68c5a203e2eb23a0f2e",
"sha256": "cef77effdf51b43178f6a2d3b787e3734f98ade253fa3187f3bb7315aaa42ff7"
},
"downloads": -1,
"filename": "CacheControl-0.12.5.tar.gz",
"has_sig": false,
"md5_digest": "f1baef403e8dd68c5a203e2eb23a0f2e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"size": 14383,
"upload_time": "2018-06-07T14:53:13",
"url": "https://files.pythonhosted.org/packages/5e/f0/2c193ed1f17c97ae539da7e1c2d48b80d8cccb1917163b26a91ca4355aa6/CacheControl-0.12.5.tar.gz"
}
]
}
{
"info": {
"author": "Eric Larson",
"author_email": "eric@ionrock.org",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Environment :: Web Environment",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Topic :: Internet :: WWW/HTTP"
],
"description": "",
"description_content_type": "",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/ionrock/cachecontrol",
"keywords": "requests http caching web",
"license": "",
"maintainer": "",
"maintainer_email": "",
"name": "CacheControl",
"package_url": "https://pypi.org/project/CacheControl/",
"platform": "",
"project_url": "https://pypi.org/project/CacheControl/",
"project_urls": {
"Homepage": "https://github.com/ionrock/cachecontrol"
},
"release_url": "https://pypi.org/project/CacheControl/0.12.5/",
"requires_dist": [
"lockfile; extra == \"filecache\""
],
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"summary": "httplib2 caching for requests",
"version": "0.12.5"
},
"last_serial": 3939938,
"releases": {
"0.12.0": [
{
"comment_text": "",
"digests": {
"md5": "807c457b3b7df9d1f23b1aad7f9c9a22",
"sha256": "ce479e88e697dc088297a5781daa2e812aa0dc888dc439602a308af6f4ff09e8"
},
"downloads": -1,
"filename": "CacheControl-0.12.0.tar.gz",
"has_sig": false,
"md5_digest": "807c457b3b7df9d1f23b1aad7f9c9a22",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13815,
"upload_time": "2017-01-30T05:05:38",
"url": "https://files.pythonhosted.org/packages/41/ae/b9c375b001f13d73c0d8eba2264f6de955769f7cef9140d7fc192814255e/CacheControl-0.12.0.tar.gz"
}
],
"0.12.1": [
{
"comment_text": "",
"digests": {
"md5": "c6c5944d3a6f73bb752a4b4e2e1ffca5",
"sha256": "99c1506b98d53c222493e0ff65904c91aaedd7c8e235cb4f00287ddbbb597072"
},
"downloads": -1,
"filename": "CacheControl-0.12.1.tar.gz",
"has_sig": false,
"md5_digest": "c6c5944d3a6f73bb752a4b4e2e1ffca5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13939,
"upload_time": "2017-03-14T21:42:44",
"url": "https://files.pythonhosted.org/packages/3a/f7/075de886ad249f4ca08615ebd8bec9ce995ed6852790b6d9df38ae059e43/CacheControl-0.12.1.tar.gz"
}
],
"0.12.2": [
{
"comment_text": "",
"digests": {
"md5": "38667f538f36c641eb0b00d0db145823",
"sha256": "d7d919830d7edc5f4b355fa678a2ea49e9ccb67966abc373ec20f93f3f471265"
},
"downloads": -1,
"filename": "CacheControl-0.12.2.tar.gz",
"has_sig": false,
"md5_digest": "38667f538f36c641eb0b00d0db145823",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14327,
"upload_time": "2017-03-27T15:49:21",
"url": "https://files.pythonhosted.org/packages/d2/6c/221f699710a6a643bd9a4324cf22ffb9fb73a089d2bfbed5fe4694f3caaf/CacheControl-0.12.2.tar.gz"
}
],
"0.12.3": [
{
"comment_text": "",
"digests": {
"md5": "45bf98a2e3435438dcee89e519b34195",
"sha256": "a9fc50e216c7c101f4ec4312f012dea501c2859cb256c7a68186a172ab71f632"
},
"downloads": -1,
"filename": "CacheControl-0.12.3.tar.gz",
"has_sig": false,
"md5_digest": "45bf98a2e3435438dcee89e519b34195",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14345,
"upload_time": "2017-05-25T13:49:06",
"url": "https://files.pythonhosted.org/packages/a3/b3/6bb6c1535a283f01fe0c4e9644784756fee2ec080e2a6097f1c59325609e/CacheControl-0.12.3.tar.gz"
}
],
"0.12.4": [
{
"comment_text": "",
"digests": {
"md5": "464675fc575b3a0b841598cb916be516",
"sha256": "a7d21ba4e3633d95ac9fed5be205ee6d1da36bdc4b8914eb7a57ff50b7e5628c"
},
"downloads": -1,
"filename": "CacheControl-0.12.4.tar.gz",
"has_sig": false,
"md5_digest": "464675fc575b3a0b841598cb916be516",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14471,
"upload_time": "2018-01-27T06:24:40",
"url": "https://files.pythonhosted.org/packages/98/f5/76619a63f0e4a1d2f5a1792ebc233a395c648c63d3461dc0331479ef120a/CacheControl-0.12.4.tar.gz"
}
],
"0.12.5": [
{
"comment_text": "",
"digests": {
"md5": "f1baef403e8dd68c5a203e2eb23a0f2e",
"sha256": "cef77effdf51b43178f6a2d3b787e3734f98ade253fa3187f3bb7315aaa42ff7"
},
"downloads": -1,
"filename": "CacheControl-0.12.5.tar.gz",
"has_sig": false,
"md5_digest": "f1baef403e8dd68c5a203e2eb23a0f2e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"size": 14383,
"upload_time": "2018-06-07T14:53:13",
"url": "https://files.pythonhosted.org/packages/5e/f0/2c193ed1f17c97ae539da7e1c2d48b80d8cccb1917163b26a91ca4355aa6/CacheControl-0.12.5.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "f1baef403e8dd68c5a203e2eb23a0f2e",
"sha256": "cef77effdf51b43178f6a2d3b787e3734f98ade253fa3187f3bb7315aaa42ff7"
},
"downloads": -1,
"filename": "CacheControl-0.12.5.tar.gz",
"has_sig": false,
"md5_digest": "f1baef403e8dd68c5a203e2eb23a0f2e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
"size": 14383,
"upload_time": "2018-06-07T14:53:13",
"url": "https://files.pythonhosted.org/packages/5e/f0/2c193ed1f17c97ae539da7e1c2d48b80d8cccb1917163b26a91ca4355aa6/CacheControl-0.12.5.tar.gz"
}
]
}
{
"info": {
"author": "OpenStack",
"author_email": "openstack-dev@lists.openstack.org",
"bugtrack_url": null,
"classifiers": [
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: MacOS",
"Operating System :: Microsoft :: Windows :: Windows NT/2000",
"Operating System :: POSIX",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.3",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "",
"description_content_type": null,
"docs_url": "https://pythonhosted.org/lockfile/",
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "http://launchpad.net/pylockfile",
"keywords": "",
"license": "",
"maintainer": "",
"maintainer_email": "",
"name": "lockfile",
"package_url": "https://pypi.org/project/lockfile/",
"platform": "UNKNOWN",
"project_url": "https://pypi.org/project/lockfile/",
"project_urls": {
"Homepage": "http://launchpad.net/pylockfile"
},
"release_url": "https://pypi.org/project/lockfile/0.12.2/",
"requires_dist": null,
"requires_python": "",
"summary": "Platform-independent file locking module",
"version": "0.12.2"
},
"last_serial": 2139845,
"releases": {
"0.12.2": [
{
"comment_text": "",
"digests": {
"md5": "07b04864472c90cdf4452cf250687334",
"sha256": "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"
},
"downloads": -1,
"filename": "lockfile-0.12.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "07b04864472c90cdf4452cf250687334",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 13564,
"upload_time": "2015-11-25T18:29:51",
"url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "a6a1a82957a23afdf44cfdd039b65ff9",
"sha256": "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"
},
"downloads": -1,
"filename": "lockfile-0.12.2.tar.gz",
"has_sig": false,
"md5_digest": "a6a1a82957a23afdf44cfdd039b65ff9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20874,
"upload_time": "2015-11-25T18:29:58",
"url": "https://files.pythonhosted.org/packages/17/47/72cb04a58a35ec495f96984dddb48232b551aafb95bde614605b754fe6f7/lockfile-0.12.2.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "07b04864472c90cdf4452cf250687334",
"sha256": "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"
},
"downloads": -1,
"filename": "lockfile-0.12.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "07b04864472c90cdf4452cf250687334",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 13564,
"upload_time": "2015-11-25T18:29:51",
"url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "a6a1a82957a23afdf44cfdd039b65ff9",
"sha256": "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"
},
"downloads": -1,
"filename": "lockfile-0.12.2.tar.gz",
"has_sig": false,
"md5_digest": "a6a1a82957a23afdf44cfdd039b65ff9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20874,
"upload_time": "2015-11-25T18:29:58",
"url": "https://files.pythonhosted.org/packages/17/47/72cb04a58a35ec495f96984dddb48232b551aafb95bde614605b754fe6f7/lockfile-0.12.2.tar.gz"
}
]
}
{
"info": {
"author": "OpenStack",
"author_email": "openstack-dev@lists.openstack.org",
"bugtrack_url": null,
"classifiers": [
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: MacOS",
"Operating System :: Microsoft :: Windows :: Windows NT/2000",
"Operating System :: POSIX",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.3",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "",
"description_content_type": null,
"docs_url": "https://pythonhosted.org/lockfile/",
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "http://launchpad.net/pylockfile",
"keywords": "",
"license": "",
"maintainer": "",
"maintainer_email": "",
"name": "lockfile",
"package_url": "https://pypi.org/project/lockfile/",
"platform": "UNKNOWN",
"project_url": "https://pypi.org/project/lockfile/",
"project_urls": {
"Homepage": "http://launchpad.net/pylockfile"
},
"release_url": "https://pypi.org/project/lockfile/0.12.2/",
"requires_dist": null,
"requires_python": "",
"summary": "Platform-independent file locking module",
"version": "0.12.2"
},
"last_serial": 2139845,
"releases": {
"0.12.2": [
{
"comment_text": "",
"digests": {
"md5": "07b04864472c90cdf4452cf250687334",
"sha256": "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"
},
"downloads": -1,
"filename": "lockfile-0.12.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "07b04864472c90cdf4452cf250687334",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 13564,
"upload_time": "2015-11-25T18:29:51",
"url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "a6a1a82957a23afdf44cfdd039b65ff9",
"sha256": "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"
},
"downloads": -1,
"filename": "lockfile-0.12.2.tar.gz",
"has_sig": false,
"md5_digest": "a6a1a82957a23afdf44cfdd039b65ff9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20874,
"upload_time": "2015-11-25T18:29:58",
"url": "https://files.pythonhosted.org/packages/17/47/72cb04a58a35ec495f96984dddb48232b551aafb95bde614605b754fe6f7/lockfile-0.12.2.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "07b04864472c90cdf4452cf250687334",
"sha256": "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"
},
"downloads": -1,
"filename": "lockfile-0.12.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "07b04864472c90cdf4452cf250687334",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 13564,
"upload_time": "2015-11-25T18:29:51",
"url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "a6a1a82957a23afdf44cfdd039b65ff9",
"sha256": "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"
},
"downloads": -1,
"filename": "lockfile-0.12.2.tar.gz",
"has_sig": false,
"md5_digest": "a6a1a82957a23afdf44cfdd039b65ff9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 20874,
"upload_time": "2015-11-25T18:29:58",
"url": "https://files.pythonhosted.org/packages/17/47/72cb04a58a35ec495f96984dddb48232b551aafb95bde614605b754fe6f7/lockfile-0.12.2.tar.gz"
}
]
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment