Repository: python-poetry/poetry

Issue:
poetry lock adds duplicate hashes when using multiple constraint dependences
- [x] I am on the [latest](https://github.com/python-poetry/poetry/releases/latest) Poetry version.
- [x] I have searched the [issues](https://github.com/python-poetry/poetry/issues) of this repo and believe that this is not a duplicate.
- [x] If an exception occurs when executing a command, I executed it again in debug mode (`-vvv` option).

<!-- -->

- **OS version and name**: macOS
- **Poetry version**: 1.2.0
- **Link of a [Gist](https://gist.github.com/) with the contents of your pyproject.toml file**: https://gist.github.com/intgr/efc96c44c3919189c3757275f0239eb6

## Issue

With a dependency specification like
```toml
python-ldap = [
  { platform = "linux", version = "3.4.0" },
  { platform = "win32", url = "https://download.lfd.uci.edu/pythonlibs/archived/python_ldap-3.4.0-cp310-cp310-win_amd64.whl" },
]
```

Every time I run `poetry lock --no-update`, Poetry adds duplicated hashes for `python-ldap` to the `poetry.lock` file.

After the first lock command, the content ends with:
```toml
python-ldap = [
    {file = "python-ldap-3.4.0.tar.gz", hash = "sha256:60464c8fc25e71e0fd40449a24eae482dcd0fb7fcf823e7de627a6525b3e0d12"},
]
```
After the second run, it's:
```toml
python-ldap = [
    {file = "python-ldap-3.4.0.tar.gz", hash = "sha256:60464c8fc25e71e0fd40449a24eae482dcd0fb7fcf823e7de627a6525b3e0d12"},
    {file = "python-ldap-3.4.0.tar.gz", hash = "sha256:60464c8fc25e71e0fd40449a24eae482dcd0fb7fcf823e7de627a6525b3e0d12"},
]
```
Etc, every run adds yet another entry there.

The contents of the lockfile should be deterministic.

Poetry does not add all hashes for multiple constraint dependences
- [x] I am on the [latest](https://github.com/python-poetry/poetry/releases/latest) Poetry version.
- [x] I have searched the [issues](https://github.com/python-poetry/poetry/issues) of this repo and believe that this is not a duplicate.
- [x] If an exception occurs when executing a command, I executed it again in debug mode (`-vvv` option).

<!--
-->

- **OS version and name**: Linux, win32
- **Poetry version**: 1.2.0
- **Link of a [Gist](https://gist.github.com/) with the contents of your pyproject.toml file**: https://gist.github.com/intgr/efc96c44c3919189c3757275f0239eb6

## Issue
The same example as in #6327. If package to be installed depends on the OS:
```toml
python-ldap = [
  { platform = "linux", version = "3.4.0" },
  { platform = "win32", url = "https://download.lfd.uci.edu/pythonlibs/archived/python_ldap-3.4.0-cp310-cp310-win_amd64.whl" },
]
```

Running `poetry lock` on Linux only adds hashes for the Linux version of the package. poetry.lock only contains:
```toml
python-ldap = [
    {file = "python-ldap-3.4.0.tar.gz", hash = "sha256:60464c8fc25e71e0fd40449a24eae482dcd0fb7fcf823e7de627a6525b3e0d12"},
]
```

And this is despite the fact that on Linux, `poetry lock` every time re-downloads the Windows package again.
```
Resolving dependencies... Downloading https://download.lfd.uci.edu/pythonlibs/archived/python_ldap-3.4.0-cp310-cp310-win_amd64.whl   9%
```

Using this lockfile, `poetry install` on Windows causes the following error (note, this has different version numbers, I don't have Windows myself to reproduce cleanly)
```
 • Updating python-ldap (3.3.1 .../AppData/Local/pypoetry/Cache/artifacts/df/70f0/b890a4118f494cdc75350af78a5bd590e52b9edd2788ca3e01001d1ef1/python_ldap-3.3.1-cp310-cp310-win_amd64.whl -> 3.3.1 .../python_ldap-3.3.1-cp310-cp310-win_amd64.whl)

 RuntimeError
 Hash for python-ldap (3.3.1 http://.../python_ldap-3.3.1-cp310-cp310-win_amd64.whl) from archive python_ldap-3.3.1-cp310-cp310-win_amd64.whl not found in known hashes (was: sha256:a2822da1c27d6d15d2d3a7ccfda4f156810ab525acb5895d56e00611ae4c50f7)

 at ...\lib\site-packages\poetry\installation\executor.py:670 in _validate_archive_hash
      666│         archive_hash: str = "sha256:" + file_dep.hash()
      667│         known_hashes = {f["hash"] for f in package.files}                     
      668│                                                                               
      669│         if archive_hash not in known_hashes:                                  
    → 670│             raise RuntimeError(                                               
      671│                 f"Hash for {package} from archive {archive.name} not found in"
      672│                 f" known hashes (was: {archive_hash})"                        
      673│             )
      674│
```

I believe this is a regression in Poetry 1.2.0. It seems 1.1.14 simply ignored the missing hash on Windows, but 1.2 is stricter and fails because of it.



Discussion:
relevant code should be this loop if anyone is interested in figuring out a fix: https://github.com/python-poetry/poetry/blob/a613347bf0a9fd7b7ec782cd45222b3a0f0e7401/src/poetry/packages/locker.py#L204-L220

I imagine we're getting two similar package_specs and not doing anything to de-duplicate the things they have in common
All locked filenames/hashes are duplicated once for each direct origin dependency among the multiple constraints dependencies. This issue doesn't occur in poetry 1.1 because direct origin dependencies are always updated (even with `--no-update` flag). I created a PR to fix this regression.
As a work-around, it seems manually editing `poetry.lock` to add the hash solves the problem: poetry lock does not remove it, and the install succeeds on Windows.
poetry has never stored hashes for url dependencies, and I don't think this is a regression.

poetry goes "if I have any hashes for this package, then this file had better match one of them".  But since it only stored hashes for the non-url package (which has always been the case), that fails.

I haven't tried to reproduce so may be misreading: but so far as I can see this code was much the same at earlier releases, here's 1.1.15 https://github.com/python-poetry/poetry/blob/46bf7fd3d1797b75ad9b07adc280039d93414e07/poetry/installation/executor.py#L616
> poetry has never stored hashes for url dependencies

I didn't claim Poetry stored hashes for url dependencies in ealier versions.

The issue is: why does it expect to find a hash for this particular url dependency if it doesn't store them?

I don't know how to answer your question without just saying what I already said so here goes:

> poetry goes "if I have any hashes for this package, then this file had better match one of them". But since it only stored hashes for the non-url package (which has always been the case), that fails.
Actually, just another effect of the same bug as #6327. Thus, same fix.

As already mentioned the missing hashes are not a regression, but the failing installation is a regression.

Resolving patch:
diff --git a/src/poetry/packages/locker.py b/src/poetry/packages/locker.py
--- a/src/poetry/packages/locker.py
+++ b/src/poetry/packages/locker.py
@@ -47,7 +47,8 @@
 
 
 class Locker:
-    _VERSION = "1.1"
+    _VERSION = "2.0"
+    _READ_VERSION_RANGE = ">=1,<3"
 
     _legacy_keys = ["dependencies", "source", "extras", "dev-dependencies"]
     _relevant_keys = [*_legacy_keys, "group"]
@@ -116,8 +117,9 @@ def locked_repository(self) -> LockfileRepository:
             if source_type in ["directory", "file"]:
                 url = self._lock.path.parent.joinpath(url).resolve().as_posix()
 
+            name = info["name"]
             package = Package(
-                info["name"],
+                name,
                 info["version"],
                 info["version"],
                 source_type=source_type,
@@ -130,9 +132,19 @@ def locked_repository(self) -> LockfileRepository:
             package.category = info.get("category", "main")
             package.optional = info["optional"]
             metadata = cast("dict[str, Any]", lock_data["metadata"])
-            name = info["name"]
-            if "hashes" in metadata:
-                # Old lock so we create dummy files from the hashes
+
+            # Storing of package files and hashes has been through a few generations in
+            # the lockfile, we can read them all:
+            #
+            # - latest and preferred is that this is read per package, from
+            #   package.files
+            # - oldest is that hashes were stored in metadata.hashes without filenames
+            # - in between those two, hashes were stored alongside filenames in
+            #   metadata.files
+            package_files = info.get("files")
+            if package_files is not None:
+                package.files = package_files
+            elif "hashes" in metadata:
                 hashes = cast("dict[str, Any]", metadata["hashes"])
                 package.files = [{"name": h, "hash": h} for h in hashes[name]]
             elif source_type in {"git", "directory", "url"}:
@@ -233,8 +245,6 @@ def set_lock_data(self, root: Package, packages: list[Package]) -> bool:
                 assert isinstance(package_files, Array)
                 files[package["name"]] = package_files.multiline(True)
 
-            del package["files"]
-
         lock = document()
         lock.add(comment(GENERATED_COMMENT))
         lock["package"] = package_specs
@@ -249,7 +259,6 @@ def set_lock_data(self, root: Package, packages: list[Package]) -> bool:
             "lock-version": self._VERSION,
             "python-versions": root.python_versions,
             "content-hash": self._content_hash,
-            "files": files,
         }
 
         if not self.is_locked() or lock != self.lock_data:
@@ -297,11 +306,7 @@ def _get_lock_data(self) -> TOMLDocument:
         metadata = cast("Table", lock_data["metadata"])
         lock_version = Version.parse(metadata.get("lock-version", "1.0"))
         current_version = Version.parse(self._VERSION)
-        # We expect the locker to be able to read lock files
-        # from the same semantic versioning range
-        accepted_versions = parse_constraint(
-            f"^{Version.from_parts(current_version.major, 0)}"
-        )
+        accepted_versions = parse_constraint(self._READ_VERSION_RANGE)
         lock_version_allowed = accepted_versions.allows(lock_version)
         if lock_version_allowed and current_version < lock_version:
             logger.warning(


Test patch:
diff --git a/tests/console/commands/self/test_remove_plugins.py b/tests/console/commands/self/test_remove_plugins.py
--- a/tests/console/commands/self/test_remove_plugins.py
+++ b/tests/console/commands/self/test_remove_plugins.py
@@ -55,7 +55,7 @@ def install_plugin(installed: Repository) -> None:
             "python-versions": "^3.6",
             "platform": "*",
             "content-hash": "123456789",
-            "hashes": {"poetry-plugin": []},
+            "files": {"poetry-plugin": []},
         },
     }
     system_pyproject_file.parent.joinpath("poetry.lock").write_text(
diff --git a/tests/console/commands/test_lock.py b/tests/console/commands/test_lock.py
--- a/tests/console/commands/test_lock.py
+++ b/tests/console/commands/test_lock.py
@@ -146,7 +146,7 @@ def test_lock_no_update(
 
     assert len(packages) == len(locked_repository.packages)
 
-    assert locker.lock_data["metadata"].get("lock-version") == "1.1"
+    assert locker.lock_data["metadata"].get("lock-version") == "2.0"
 
     for package in packages:
         assert locked_repository.find_packages(package.to_dependency())
diff --git a/tests/console/commands/test_show.py b/tests/console/commands/test_show.py
--- a/tests/console/commands/test_show.py
+++ b/tests/console/commands/test_show.py
@@ -87,7 +87,7 @@ def test_show_basic_with_installed_packages(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": [], "pytest": []},
+                "files": {"cachy": [], "pendulum": [], "pytest": []},
             },
         }
     )
@@ -168,7 +168,7 @@ def _configure_project_with_groups(poetry: Poetry, installed: Repository) -> Non
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": [], "pytest": []},
+                "files": {"cachy": [], "pendulum": [], "pytest": []},
             },
         }
     )
@@ -293,7 +293,7 @@ def test_show_basic_with_installed_packages_single(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": []},
+                "files": {"cachy": []},
             },
         }
     )
@@ -335,7 +335,7 @@ def test_show_basic_with_installed_packages_single_canonicalized(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"foo-bar": []},
+                "files": {"foo-bar": []},
             },
         }
     )
@@ -390,7 +390,7 @@ def test_show_basic_with_not_installed_packages_non_decorated(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -446,7 +446,7 @@ def test_show_basic_with_not_installed_packages_decorated(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -516,7 +516,7 @@ def test_show_latest_non_decorated(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -586,7 +586,7 @@ def test_show_latest_decorated(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -655,7 +655,7 @@ def test_show_outdated(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -699,7 +699,7 @@ def test_show_outdated_with_only_up_to_date_packages(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": []},
+                "files": {"cachy": []},
             },
         }
     )
@@ -768,7 +768,7 @@ def test_show_outdated_has_prerelease_but_not_allowed(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -843,7 +843,7 @@ def test_show_outdated_has_prerelease_and_allowed(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -912,7 +912,7 @@ def test_show_outdated_formatting(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -1029,7 +1029,7 @@ def test_show_outdated_local_dependencies(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {
+                "files": {
                     "cachy": [],
                     "pendulum": [],
                     "demo": [],
@@ -1136,7 +1136,7 @@ def test_show_outdated_git_dev_dependency(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": [], "demo": [], "pytest": []},
+                "files": {"cachy": [], "pendulum": [], "demo": [], "pytest": []},
             },
         }
     )
@@ -1235,7 +1235,7 @@ def test_show_outdated_no_dev_git_dev_dependency(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": [], "demo": [], "pytest": []},
+                "files": {"cachy": [], "pendulum": [], "demo": [], "pytest": []},
             },
         }
     )
@@ -1296,7 +1296,7 @@ def test_show_hides_incompatible_package(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -1353,7 +1353,7 @@ def test_show_all_shows_incompatible_package(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": []},
+                "files": {"cachy": [], "pendulum": []},
             },
         }
     )
@@ -1429,7 +1429,7 @@ def test_show_non_dev_with_basic_installed_packages(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": [], "pytest": []},
+                "files": {"cachy": [], "pendulum": [], "pytest": []},
             },
         }
     )
@@ -1505,7 +1505,7 @@ def test_show_with_group_only(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": [], "pytest": []},
+                "files": {"cachy": [], "pendulum": [], "pytest": []},
             },
         }
     )
@@ -1580,7 +1580,7 @@ def test_show_with_optional_group(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": [], "pytest": []},
+                "files": {"cachy": [], "pendulum": [], "pytest": []},
             },
         }
     )
@@ -1642,7 +1642,7 @@ def test_show_tree(tester: CommandTester, poetry: Poetry, installed: Repository)
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "msgpack-python": []},
+                "files": {"cachy": [], "msgpack-python": []},
             },
         }
     )
@@ -1709,7 +1709,7 @@ def test_show_tree_no_dev(tester: CommandTester, poetry: Poetry, installed: Repo
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "msgpack-python": [], "pytest": []},
+                "files": {"cachy": [], "msgpack-python": [], "pytest": []},
             },
         }
     )
@@ -1768,7 +1768,7 @@ def test_show_tree_why_package(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"a": [], "b": [], "c": []},
+                "files": {"a": [], "b": [], "c": []},
             },
         }
     )
@@ -1825,7 +1825,7 @@ def test_show_tree_why(tester: CommandTester, poetry: Poetry, installed: Reposit
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"a": [], "b": [], "c": []},
+                "files": {"a": [], "b": [], "c": []},
             },
         }
     )
@@ -1894,7 +1894,7 @@ def test_show_required_by_deps(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"cachy": [], "pendulum": [], "msgpack-python": []},
+                "files": {"cachy": [], "pendulum": [], "msgpack-python": []},
             },
         }
     )
@@ -1983,7 +1983,7 @@ def test_show_dependency_installed_from_git_in_dev(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"demo": [], "pendulum": []},
+                "files": {"demo": [], "pendulum": []},
             },
         }
     )
diff --git a/tests/fixtures/old_lock/updated.lock b/tests/fixtures/old_lock/updated.lock
deleted file mode 100644
--- a/tests/fixtures/old_lock/updated.lock
+++ /dev/null
@@ -1,152 +0,0 @@
-[[package]]
-name = "certifi"
-version = "2020.6.20"
-description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "chardet"
-version = "3.0.4"
-description = "Universal encoding detector for Python 2 and 3"
-category = "main"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "docker"
-version = "4.3.1"
-description = "A Python library for the Docker Engine API."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.dependencies]
-pywin32 = {version = "227", markers = "sys_platform == \"win32\""}
-requests = ">=2.14.2,<2.18.0 || >2.18.0"
-six = ">=1.4.0"
-websocket-client = ">=0.32.0"
-
-[package.extras]
-ssh = ["paramiko (>=2.4.2)"]
-tls = ["pyOpenSSL (>=17.5.0)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"]
-
-[[package]]
-name = "idna"
-version = "2.10"
-description = "Internationalized Domain Names in Applications (IDNA)"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[[package]]
-name = "pywin32"
-version = "227"
-description = "Python for Window Extensions"
-category = "main"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "requests"
-version = "2.24.0"
-description = "Python HTTP for Humans."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-chardet = ">=3.0.2,<4"
-idna = ">=2.5,<3"
-urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"
-
-[package.extras]
-security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
-socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
-
-[[package]]
-name = "six"
-version = "1.15.0"
-description = "Python 2 and 3 compatibility utilities"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
-
-[[package]]
-name = "urllib3"
-version = "1.25.10"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
-
-[package.extras]
-brotli = ["brotlipy (>=0.6.0)"]
-secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"]
-socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
-
-[[package]]
-name = "websocket-client"
-version = "0.57.0"
-description = "WebSocket client for Python. hybi13 is supported."
-category = "main"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-six = "*"
-
-[metadata]
-lock-version = "1.1"
-python-versions = "^3.8"
-content-hash = "bb4c2f3c089b802c1930b6acbeed04711d93e9cdfd9a003eb17518a6d9f350c6"
-
-[metadata.files]
-certifi = [
-    {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
-    {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"},
-]
-chardet = [
-    {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
-    {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
-]
-docker = [
-    {file = "docker-4.3.1-py2.py3-none-any.whl", hash = "sha256:13966471e8bc23b36bfb3a6fb4ab75043a5ef1dac86516274777576bed3b9828"},
-    {file = "docker-4.3.1.tar.gz", hash = "sha256:bad94b8dd001a8a4af19ce4becc17f41b09f228173ffe6a4e0355389eef142f2"},
-]
-idna = [
-    {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
-    {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
-]
-pywin32 = [
-    {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"},
-    {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"},
-    {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"},
-    {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"},
-    {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"},
-    {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"},
-    {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"},
-    {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"},
-    {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"},
-    {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"},
-    {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"},
-    {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"},
-]
-requests = [
-    {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"},
-    {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"},
-]
-six = [
-    {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
-    {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
-]
-urllib3 = [
-    {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"},
-    {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"},
-]
-websocket-client = [
-    {file = "websocket_client-0.57.0-py2.py3-none-any.whl", hash = "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549"},
-    {file = "websocket_client-0.57.0.tar.gz", hash = "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010"},
-]
diff --git a/tests/fixtures/outdated_lock/poetry.lock b/tests/fixtures/outdated_lock/poetry.lock
--- a/tests/fixtures/outdated_lock/poetry.lock
+++ b/tests/fixtures/outdated_lock/poetry.lock
@@ -6,6 +6,14 @@ category = "main"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "certifi-2020.6.20-py2.py3-none-any.whl"
+hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"
+
+[[package.files]]
+file = "certifi-2020.6.20.tar.gz"
+hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"
+
 [[package]]
 name = "chardet"
 version = "3.0.4"
@@ -14,6 +22,14 @@ category = "main"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "chardet-3.0.4-py2.py3-none-any.whl"
+hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+
+[[package.files]]
+file = "chardet-3.0.4.tar.gz"
+hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
+
 [[package]]
 name = "docker"
 version = "4.3.0"
@@ -22,6 +38,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
+[[package.files]]
+file = "docker-4.3.0-py2.py3-none-any.whl"
+hash = "sha256:ba118607b0ba6bfc1b236ec32019a355c47b5d012d01d976467d4692ef443929"
+
+[[package.files]]
+file = "docker-4.3.0.tar.gz"
+hash = "sha256:431a268f2caf85aa30613f9642da274c62f6ee8bae7d70d968e01529f7d6af93"
+
 [package.dependencies]
 pywin32 = {version = "227", markers = "sys_platform == \"win32\""}
 requests = ">=2.14.2,<2.18.0 || >2.18.0"
@@ -40,6 +64,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "idna-2.10-py2.py3-none-any.whl"
+hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
+
+[[package.files]]
+file = "idna-2.10.tar.gz"
+hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"
+
 [[package]]
 name = "pywin32"
 version = "227"
@@ -48,6 +80,54 @@ category = "main"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "pywin32-227-cp27-cp27m-win32.whl"
+hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"
+
+[[package.files]]
+file = "pywin32-227-cp27-cp27m-win_amd64.whl"
+hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"
+
+[[package.files]]
+file = "pywin32-227-cp35-cp35m-win32.whl"
+hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"
+
+[[package.files]]
+file = "pywin32-227-cp35-cp35m-win_amd64.whl"
+hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"
+
+[[package.files]]
+file = "pywin32-227-cp36-cp36m-win32.whl"
+hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"
+
+[[package.files]]
+file = "pywin32-227-cp36-cp36m-win_amd64.whl"
+hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"
+
+[[package.files]]
+file = "pywin32-227-cp37-cp37m-win32.whl"
+hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"
+
+[[package.files]]
+file = "pywin32-227-cp37-cp37m-win_amd64.whl"
+hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"
+
+[[package.files]]
+file = "pywin32-227-cp38-cp38-win32.whl"
+hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"
+
+[[package.files]]
+file = "pywin32-227-cp38-cp38-win_amd64.whl"
+hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"
+
+[[package.files]]
+file = "pywin32-227-cp39-cp39-win32.whl"
+hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"
+
+[[package.files]]
+file = "pywin32-227-cp39-cp39-win_amd64.whl"
+hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"
+
 [[package]]
 name = "requests"
 version = "2.24.0"
@@ -56,6 +136,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
+[[package.files]]
+file = "requests-2.24.0-py2.py3-none-any.whl"
+hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
+
+[[package.files]]
+file = "requests-2.24.0.tar.gz"
+hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"
+
 [package.dependencies]
 certifi = ">=2017.4.17"
 chardet = ">=3.0.2,<4"
@@ -74,6 +162,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 
+[[package.files]]
+file = "six-1.15.0-py2.py3-none-any.whl"
+hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
+
+[[package.files]]
+file = "six-1.15.0.tar.gz"
+hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"
+
 [[package]]
 name = "urllib3"
 version = "1.25.10"
@@ -82,6 +178,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 
+[[package.files]]
+file = "urllib3-1.25.10-py2.py3-none-any.whl"
+hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"
+
+[[package.files]]
+file = "urllib3-1.25.10.tar.gz"
+hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"
+
 [package.extras]
 brotli = ["brotlipy (>=0.6.0)"]
 secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"]
@@ -95,58 +199,18 @@ category = "main"
 optional = false
 python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "websocket_client-0.57.0-py2.py3-none-any.whl"
+hash = "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549"
+
+[[package.files]]
+file = "websocket_client-0.57.0.tar.gz"
+hash = "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010"
+
 [package.dependencies]
 six = "*"
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "^3.8"
 content-hash = "2f47de5e052dabeff3c1362d3a37b5cfcaf9bbe9d9ce1681207e72ca1f4dab55"
-
-[metadata.files]
-certifi = [
-    {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
-    {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"},
-]
-chardet = [
-    {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
-    {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
-]
-docker = [
-    {file = "docker-4.3.0-py2.py3-none-any.whl", hash = "sha256:ba118607b0ba6bfc1b236ec32019a355c47b5d012d01d976467d4692ef443929"},
-    {file = "docker-4.3.0.tar.gz", hash = "sha256:431a268f2caf85aa30613f9642da274c62f6ee8bae7d70d968e01529f7d6af93"},
-]
-idna = [
-    {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
-    {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
-]
-pywin32 = [
-    {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"},
-    {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"},
-    {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"},
-    {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"},
-    {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"},
-    {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"},
-    {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"},
-    {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"},
-    {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"},
-    {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"},
-    {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"},
-    {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"},
-]
-requests = [
-    {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"},
-    {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"},
-]
-six = [
-    {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
-    {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
-]
-urllib3 = [
-    {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"},
-    {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"},
-]
-websocket-client = [
-    {file = "websocket_client-0.57.0-py2.py3-none-any.whl", hash = "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549"},
-    {file = "websocket_client-0.57.0.tar.gz", hash = "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010"},
-]
diff --git a/tests/fixtures/up_to_date_lock/poetry.lock b/tests/fixtures/up_to_date_lock/poetry.lock
--- a/tests/fixtures/up_to_date_lock/poetry.lock
+++ b/tests/fixtures/up_to_date_lock/poetry.lock
@@ -6,6 +6,14 @@ category = "main"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "certifi-2020.12.5-py2.py3-none-any.whl"
+hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"
+
+[[package.files]]
+file = "certifi-2020.12.5.tar.gz"
+hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"
+
 [[package]]
 name = "chardet"
 version = "4.0.0"
@@ -14,6 +22,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
+[[package.files]]
+file = "chardet-4.0.0-py2.py3-none-any.whl"
+hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"
+
+[[package.files]]
+file = "chardet-4.0.0.tar.gz"
+hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"
+
 [[package]]
 name = "docker"
 version = "4.3.1"
@@ -22,6 +38,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
+[[package.files]]
+file = "docker-4.3.1-py2.py3-none-any.whl"
+hash = "sha256:13966471e8bc23b36bfb3a6fb4ab75043a5ef1dac86516274777576bed3b9828"
+
+[[package.files]]
+file = "docker-4.3.1.tar.gz"
+hash = "sha256:bad94b8dd001a8a4af19ce4becc17f41b09f228173ffe6a4e0355389eef142f2"
+
 [package.dependencies]
 pywin32 = {version = "227", markers = "sys_platform == \"win32\""}
 requests = ">=2.14.2,<2.18.0 || >2.18.0"
@@ -40,6 +64,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "idna-2.10-py2.py3-none-any.whl"
+hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
+
+[[package.files]]
+file = "idna-2.10.tar.gz"
+hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"
+
 [[package]]
 name = "pywin32"
 version = "227"
@@ -48,6 +80,54 @@ category = "main"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "pywin32-227-cp27-cp27m-win32.whl"
+hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"
+
+[[package.files]]
+file = "pywin32-227-cp27-cp27m-win_amd64.whl"
+hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"
+
+[[package.files]]
+file = "pywin32-227-cp35-cp35m-win32.whl"
+hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"
+
+[[package.files]]
+file = "pywin32-227-cp35-cp35m-win_amd64.whl"
+hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"
+
+[[package.files]]
+file = "pywin32-227-cp36-cp36m-win32.whl"
+hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"
+
+[[package.files]]
+file = "pywin32-227-cp36-cp36m-win_amd64.whl"
+hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"
+
+[[package.files]]
+file = "pywin32-227-cp37-cp37m-win32.whl"
+hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"
+
+[[package.files]]
+file = "pywin32-227-cp37-cp37m-win_amd64.whl"
+hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"
+
+[[package.files]]
+file = "pywin32-227-cp38-cp38-win32.whl"
+hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"
+
+[[package.files]]
+file = "pywin32-227-cp38-cp38-win_amd64.whl"
+hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"
+
+[[package.files]]
+file = "pywin32-227-cp39-cp39-win32.whl"
+hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"
+
+[[package.files]]
+file = "pywin32-227-cp39-cp39-win_amd64.whl"
+hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"
+
 [[package]]
 name = "requests"
 version = "2.25.1"
@@ -56,6 +136,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
+[[package.files]]
+file = "requests-2.25.1-py2.py3-none-any.whl"
+hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"
+
+[[package.files]]
+file = "requests-2.25.1.tar.gz"
+hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"
+
 [package.dependencies]
 certifi = ">=2017.4.17"
 chardet = ">=3.0.2,<5"
@@ -74,6 +162,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 
+[[package.files]]
+file = "six-1.15.0-py2.py3-none-any.whl"
+hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
+
+[[package.files]]
+file = "six-1.15.0.tar.gz"
+hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"
+
 [[package]]
 name = "urllib3"
 version = "1.26.3"
@@ -82,6 +178,14 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 
+[[package.files]]
+file = "urllib3-1.26.3-py2.py3-none-any.whl"
+hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"
+
+[[package.files]]
+file = "urllib3-1.26.3.tar.gz"
+hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"
+
 [package.extras]
 brotli = ["brotlipy (>=0.6.0)"]
 secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
@@ -95,58 +199,18 @@ category = "main"
 optional = false
 python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "websocket_client-0.58.0-py2.py3-none-any.whl"
+hash = "sha256:44b5df8f08c74c3d82d28100fdc81f4536809ce98a17f0757557813275fbb663"
+
+[[package.files]]
+file = "websocket_client-0.58.0.tar.gz"
+hash = "sha256:63509b41d158ae5b7f67eb4ad20fecbb4eee99434e73e140354dc3ff8e09716f"
+
 [package.dependencies]
 six = "*"
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "^3.8"
 content-hash = "0cd068218f235c162f7b74bc8faf4ce3387b82daee1c1bb7a97af034f27ee116"
-
-[metadata.files]
-certifi = [
-    {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"},
-    {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"},
-]
-chardet = [
-    {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
-    {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
-]
-docker = [
-    {file = "docker-4.3.1-py2.py3-none-any.whl", hash = "sha256:13966471e8bc23b36bfb3a6fb4ab75043a5ef1dac86516274777576bed3b9828"},
-    {file = "docker-4.3.1.tar.gz", hash = "sha256:bad94b8dd001a8a4af19ce4becc17f41b09f228173ffe6a4e0355389eef142f2"},
-]
-idna = [
-    {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
-    {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
-]
-pywin32 = [
-    {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"},
-    {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"},
-    {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"},
-    {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"},
-    {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"},
-    {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"},
-    {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"},
-    {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"},
-    {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"},
-    {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"},
-    {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"},
-    {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"},
-]
-requests = [
-    {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
-    {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
-]
-six = [
-    {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
-    {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
-]
-urllib3 = [
-    {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"},
-    {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"},
-]
-websocket-client = [
-    {file = "websocket_client-0.58.0-py2.py3-none-any.whl", hash = "sha256:44b5df8f08c74c3d82d28100fdc81f4536809ce98a17f0757557813275fbb663"},
-    {file = "websocket_client-0.58.0.tar.gz", hash = "sha256:63509b41d158ae5b7f67eb4ad20fecbb4eee99434e73e140354dc3ff8e09716f"},
-]
diff --git a/tests/installation/fixtures/extras-with-dependencies.test b/tests/installation/fixtures/extras-with-dependencies.test
--- a/tests/installation/fixtures/extras-with-dependencies.test
+++ b/tests/installation/fixtures/extras-with-dependencies.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,6 +14,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -21,6 +23,7 @@ description = ""
 category = "main"
 optional = true
 python-versions = "*"
+files = []
 
 [package.dependencies]
 D = "^1.0"
@@ -32,17 +35,12 @@ description = ""
 category = "main"
 optional = true
 python-versions = "*"
+files = []
 
 [extras]
 foo = ["C"]
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-B = []
-C = []
-D = []
diff --git a/tests/installation/fixtures/extras.test b/tests/installation/fixtures/extras.test
--- a/tests/installation/fixtures/extras.test
+++ b/tests/installation/fixtures/extras.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,6 +14,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -21,6 +23,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "D"
@@ -29,17 +32,12 @@ description = ""
 category = "main"
 optional = true
 python-versions = "*"
+files = []
 
 [extras]
 foo = ["D"]
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-B = []
-C = []
-D = []
diff --git a/tests/installation/fixtures/install-no-dev.test b/tests/installation/fixtures/install-no-dev.test
--- a/tests/installation/fixtures/install-no-dev.test
+++ b/tests/installation/fixtures/install-no-dev.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,6 +14,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -21,13 +23,9 @@ description = ""
 category = "dev"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
-"B" = []
-"C" = []
diff --git a/tests/installation/fixtures/no-dependencies.test b/tests/installation/fixtures/no-dependencies.test
--- a/tests/installation/fixtures/no-dependencies.test
+++ b/tests/installation/fixtures/no-dependencies.test
@@ -2,7 +2,5 @@ package = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
diff --git a/tests/installation/fixtures/remove.test b/tests/installation/fixtures/remove.test
--- a/tests/installation/fixtures/remove.test
+++ b/tests/installation/fixtures/remove.test
@@ -5,11 +5,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
diff --git a/tests/installation/fixtures/update-with-lock.test b/tests/installation/fixtures/update-with-lock.test
--- a/tests/installation/fixtures/update-with-lock.test
+++ b/tests/installation/fixtures/update-with-lock.test
@@ -5,11 +5,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
diff --git a/tests/installation/fixtures/update-with-locked-extras.test b/tests/installation/fixtures/update-with-locked-extras.test
--- a/tests/installation/fixtures/update-with-locked-extras.test
+++ b/tests/installation/fixtures/update-with-locked-extras.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 "B" = {version = "^1.0", optional = true}
@@ -20,6 +21,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -28,6 +30,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "D"
@@ -36,14 +39,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
-"B" = []
-"C" = []
-"D" = []
diff --git a/tests/installation/fixtures/with-category-change.test b/tests/installation/fixtures/with-category-change.test
--- a/tests/installation/fixtures/with-category-change.test
+++ b/tests/installation/fixtures/with-category-change.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,15 +14,12 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 A = "^1.0"
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
-"B" = []
diff --git a/tests/installation/fixtures/with-conditional-dependency.test b/tests/installation/fixtures/with-conditional-dependency.test
--- a/tests/installation/fixtures/with-conditional-dependency.test
+++ b/tests/installation/fixtures/with-conditional-dependency.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = ">=3.5"
+files = []
 
 [package.requirements]
 python = ">=3.5,<4.0"
@@ -16,14 +17,12 @@ description = ""
 category = "main"
 optional = false
 python-versions = ">=3.6"
+files = []
 
 [package.requirements]
 python = ">=3.6,<4.0"
 
 [metadata]
 python-versions = "~2.7 || ^3.4"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
diff --git a/tests/installation/fixtures/with-dependencies-extras.test b/tests/installation/fixtures/with-dependencies-extras.test
--- a/tests/installation/fixtures/with-dependencies-extras.test
+++ b/tests/installation/fixtures/with-dependencies-extras.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,6 +14,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 C = {version = "^1.0", optional = true}
@@ -27,13 +29,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
-"B" = []
-"C" = []
diff --git a/tests/installation/fixtures/with-dependencies-nested-extras.test b/tests/installation/fixtures/with-dependencies-nested-extras.test
--- a/tests/installation/fixtures/with-dependencies-nested-extras.test
+++ b/tests/installation/fixtures/with-dependencies-nested-extras.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 B = {version = "^1.0", optional = true, extras = ["C"]}
@@ -19,6 +20,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 C = {version = "^1.0", optional = true}
@@ -33,13 +35,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
-"B" = []
-"C" = []
diff --git a/tests/installation/fixtures/with-dependencies.test b/tests/installation/fixtures/with-dependencies.test
--- a/tests/installation/fixtures/with-dependencies.test
+++ b/tests/installation/fixtures/with-dependencies.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,12 +14,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
-"B" = []
diff --git a/tests/installation/fixtures/with-directory-dependency-poetry-transitive.test b/tests/installation/fixtures/with-directory-dependency-poetry-transitive.test
--- a/tests/installation/fixtures/with-directory-dependency-poetry-transitive.test
+++ b/tests/installation/fixtures/with-directory-dependency-poetry-transitive.test
@@ -6,6 +6,10 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 version = "0.1.0"
 
+[[package.files]]
+file = "demo-0.1.0-py2.py3-none-any.whl"
+hash = "sha256:70e704135718fffbcbf61ed1fc45933cfd86951a744b681000eaaa75da31f17a"
+
 [package.dependencies]
 pendulum = ">=1.4.4"
 
@@ -24,6 +28,7 @@ develop = false
 name = "inner-directory-project"
 optional = false
 python-versions = "*"
+files = []
 version = "1.2.4"
 
 [package.source]
@@ -36,6 +41,7 @@ description = ""
 name = "pendulum"
 optional = false
 python-versions = "*"
+files = []
 version = "1.4.4"
 
 [[package]]
@@ -45,6 +51,7 @@ develop = false
 name = "project-with-extras"
 optional = false
 python-versions = "*"
+files = []
 version = "1.2.3"
 
 [package.extras]
@@ -62,6 +69,7 @@ develop = false
 name = "project-with-transitive-directory-dependencies"
 optional = false
 python-versions = "*"
+files = []
 version = "1.2.3"
 
 [package.dependencies]
@@ -79,6 +87,7 @@ develop = false
 name = "project-with-transitive-file-dependencies"
 optional = false
 python-versions = "*"
+files = []
 version = "1.2.3"
 
 [package.dependencies]
@@ -91,15 +100,5 @@ url = "project_with_transitive_file_dependencies"
 
 [metadata]
 content-hash = "123456789"
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
-
-[metadata.files]
-demo = [
-    {file = "demo-0.1.0-py2.py3-none-any.whl", hash = "sha256:70e704135718fffbcbf61ed1fc45933cfd86951a744b681000eaaa75da31f17a"},
-]
-inner-directory-project = []
-pendulum = []
-project-with-extras = []
-project-with-transitive-directory-dependencies = []
-project-with-transitive-file-dependencies = []
diff --git a/tests/installation/fixtures/with-directory-dependency-poetry.test b/tests/installation/fixtures/with-directory-dependency-poetry.test
--- a/tests/installation/fixtures/with-directory-dependency-poetry.test
+++ b/tests/installation/fixtures/with-directory-dependency-poetry.test
@@ -4,6 +4,7 @@ category = "main"
 name = "pendulum"
 optional = false
 python-versions = "*"
+files = []
 version = "1.4.4"
 
 [[package]]
@@ -13,6 +14,7 @@ develop = false
 name = "project-with-extras"
 optional = false
 python-versions = "*"
+files = []
 version = "1.2.3"
 
 [package.dependencies]
@@ -28,9 +30,5 @@ url = "tests/fixtures/project_with_extras"
 
 [metadata]
 content-hash = "123456789"
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
-
-[metadata.files]
-project-with-extras = []
-pendulum = []
diff --git a/tests/installation/fixtures/with-directory-dependency-setuptools.test b/tests/installation/fixtures/with-directory-dependency-setuptools.test
--- a/tests/installation/fixtures/with-directory-dependency-setuptools.test
+++ b/tests/installation/fixtures/with-directory-dependency-setuptools.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "pendulum"
@@ -13,6 +14,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "project-with-setup"
@@ -22,6 +24,7 @@ description = "Demo project."
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.source]
 type = "directory"
@@ -33,10 +36,5 @@ pendulum = ">=1.4.4"
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-cachy = []
-project-with-setup = []
-pendulum = []
diff --git a/tests/installation/fixtures/with-duplicate-dependencies-update.test b/tests/installation/fixtures/with-duplicate-dependencies-update.test
--- a/tests/installation/fixtures/with-duplicate-dependencies-update.test
+++ b/tests/installation/fixtures/with-duplicate-dependencies-update.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 B = "^2.0"
@@ -16,6 +17,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 C = "1.5"
@@ -27,13 +29,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-B = []
-C = []
diff --git a/tests/installation/fixtures/with-duplicate-dependencies.test b/tests/installation/fixtures/with-duplicate-dependencies.test
--- a/tests/installation/fixtures/with-duplicate-dependencies.test
+++ b/tests/installation/fixtures/with-duplicate-dependencies.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 B = [
@@ -19,6 +20,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 C = "1.2"
@@ -30,6 +32,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 C = "1.5"
@@ -41,6 +44,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -49,13 +53,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-B = []
-C = []
diff --git a/tests/installation/fixtures/with-file-dependency-transitive.test b/tests/installation/fixtures/with-file-dependency-transitive.test
--- a/tests/installation/fixtures/with-file-dependency-transitive.test
+++ b/tests/installation/fixtures/with-file-dependency-transitive.test
@@ -6,6 +6,10 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 version = "0.1.0"
 
+[[package.files]]
+file = "demo-0.1.0-py2.py3-none-any.whl"
+hash = "sha256:70e704135718fffbcbf61ed1fc45933cfd86951a744b681000eaaa75da31f17a"
+
 [package.dependencies]
 pendulum = ">=1.4.4"
 
@@ -24,6 +28,7 @@ develop = false
 name = "inner-directory-project"
 optional = false
 python-versions = "*"
+files = []
 version = "1.2.4"
 
 [package.source]
@@ -36,6 +41,7 @@ description = ""
 name = "pendulum"
 optional = false
 python-versions = "*"
+files = []
 version = "1.4.4"
 
 [[package]]
@@ -45,6 +51,7 @@ develop = false
 name = "project-with-transitive-file-dependencies"
 optional = false
 python-versions = "*"
+files = []
 version = "1.2.3"
 
 [package.dependencies]
@@ -57,13 +64,5 @@ url = "project_with_transitive_file_dependencies"
 
 [metadata]
 content-hash = "123456789"
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
-
-[metadata.files]
-demo = [
-    {file = "demo-0.1.0-py2.py3-none-any.whl", hash = "sha256:70e704135718fffbcbf61ed1fc45933cfd86951a744b681000eaaa75da31f17a"},
-]
-inner-directory-project = []
-pendulum = []
-project-with-transitive-file-dependencies = []
diff --git a/tests/installation/fixtures/with-file-dependency.test b/tests/installation/fixtures/with-file-dependency.test
--- a/tests/installation/fixtures/with-file-dependency.test
+++ b/tests/installation/fixtures/with-file-dependency.test
@@ -6,6 +6,10 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "demo-0.1.0-py2.py3-none-any.whl"
+hash = "sha256:70e704135718fffbcbf61ed1fc45933cfd86951a744b681000eaaa75da31f17a"
+
 [package.source]
 type = "file"
 url = "tests/fixtures/distributions/demo-0.1.0-py2.py3-none-any.whl"
@@ -24,14 +28,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-demo = [
-    {file = "demo-0.1.0-py2.py3-none-any.whl", hash = "sha256:70e704135718fffbcbf61ed1fc45933cfd86951a744b681000eaaa75da31f17a"},
-]
-pendulum = []
diff --git a/tests/installation/fixtures/with-multiple-updates.test b/tests/installation/fixtures/with-multiple-updates.test
--- a/tests/installation/fixtures/with-multiple-updates.test
+++ b/tests/installation/fixtures/with-multiple-updates.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 B = ">=1.0.1"
@@ -20,6 +21,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -28,6 +30,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -36,13 +39,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "~2.7 || ^3.4"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-B = []
-C = []
diff --git a/tests/installation/fixtures/with-optional-dependencies.test b/tests/installation/fixtures/with-optional-dependencies.test
--- a/tests/installation/fixtures/with-optional-dependencies.test
+++ b/tests/installation/fixtures/with-optional-dependencies.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = true
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -13,6 +14,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 D = "^1.2"
@@ -24,16 +26,12 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [extras]
 foo = ["A"]
 
 [metadata]
 python-versions = "~2.7 || ^3.4"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-C = []
-D = []
diff --git a/tests/installation/fixtures/with-platform-dependencies.test b/tests/installation/fixtures/with-platform-dependencies.test
--- a/tests/installation/fixtures/with-platform-dependencies.test
+++ b/tests/installation/fixtures/with-platform-dependencies.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = true
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,6 +14,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -21,6 +23,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 D = "^1.2"
@@ -32,17 +35,12 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [extras]
 foo = ["A"]
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-B = []
-C = []
-D = []
diff --git a/tests/installation/fixtures/with-prereleases.test b/tests/installation/fixtures/with-prereleases.test
--- a/tests/installation/fixtures/with-prereleases.test
+++ b/tests/installation/fixtures/with-prereleases.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,12 +14,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"A" = []
-"B" = []
diff --git a/tests/installation/fixtures/with-pypi-repository.test b/tests/installation/fixtures/with-pypi-repository.test
--- a/tests/installation/fixtures/with-pypi-repository.test
+++ b/tests/installation/fixtures/with-pypi-repository.test
@@ -6,6 +6,14 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "attrs-17.4.0-py2.py3-none-any.whl"
+hash = "sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450"
+
+[[package.files]]
+file = "attrs-17.4.0.tar.gz"
+hash = "sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9"
+
 [package.extras]
 dev = ["coverage", "hypothesis", "pympler", "pytest", "six", "sphinx", "zope.interface", "zope.interface"]
 docs = ["sphinx", "zope.interface"]
@@ -19,6 +27,14 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "colorama-0.3.9-py2.py3-none-any.whl"
+hash = "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda"
+
+[[package.files]]
+file = "colorama-0.3.9.tar.gz"
+hash = "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1"
+
 [[package]]
 name = "funcsigs"
 version = "1.0.2"
@@ -27,6 +43,14 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "funcsigs-1.0.2-py2.py3-none-any.whl"
+hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"
+
+[[package.files]]
+file = "funcsigs-1.0.2.tar.gz"
+hash = "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"
+
 [[package]]
 name = "more-itertools"
 version = "4.1.0"
@@ -35,6 +59,18 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "more-itertools-4.1.0.tar.gz"
+hash = "sha256:c9ce7eccdcb901a2c75d326ea134e0886abfbea5f93e91cc95de9507c0816c44"
+
+[[package.files]]
+file = "more_itertools-4.1.0-py2-none-any.whl"
+hash = "sha256:11a625025954c20145b37ff6309cd54e39ca94f72f6bb9576d1195db6fa2442e"
+
+[[package.files]]
+file = "more_itertools-4.1.0-py3-none-any.whl"
+hash = "sha256:0dd8f72eeab0d2c3bd489025bb2f6a1b8342f9b198f6fc37b52d15cfa4531fea"
+
 [package.dependencies]
 six = ">=1.0.0,<2.0.0"
 
@@ -46,6 +82,10 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "pluggy-0.6.0.tar.gz"
+hash = "sha256:7f8ae7f5bdf75671a718d2daf0a64b7885f74510bcd98b1a0bb420eb9a9d0cff"
+
 [[package]]
 name = "py"
 version = "1.5.3"
@@ -54,6 +94,14 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "py-1.5.3-py2.py3-none-any.whl"
+hash = "sha256:983f77f3331356039fdd792e9220b7b8ee1aa6bd2b25f567a963ff1de5a64f6a"
+
+[[package.files]]
+file = "py-1.5.3.tar.gz"
+hash = "sha256:29c9fab495d7528e80ba1e343b958684f4ace687327e6f789a94bf3d1915f881"
+
 [[package]]
 name = "pytest"
 version = "3.5.0"
@@ -62,6 +110,14 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "pytest-3.5.0-py2.py3-none-any.whl"
+hash = "sha256:6266f87ab64692112e5477eba395cfedda53b1933ccd29478e671e73b420c19c"
+
+[[package.files]]
+file = "pytest-3.5.0.tar.gz"
+hash = "sha256:fae491d1874f199537fd5872b5e1f0e74a009b979df9d53d1553fd03da1703e1"
+
 [package.dependencies]
 py = ">=1.5.0"
 six = ">=1.10.0"
@@ -80,6 +136,14 @@ category = "dev"
 optional = false
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*"
 
+[[package.files]]
+file = "setuptools-39.2.0-py2.py3-none-any.whl"
+hash = "sha256:8fca9275c89964f13da985c3656cb00ba029d7f3916b37990927ffdf264e7926"
+
+[[package.files]]
+file = "setuptools-39.2.0.zip"
+hash = "sha256:f7cddbb5f5c640311eb00eab6e849f7701fa70bf6a183fc8a2c33dd1d1672fb2"
+
 [package.extras]
 certs = ["certifi (==2016.9.26)"]
 ssl = ["wincertstore (==0.2)"]
@@ -92,45 +156,15 @@ category = "dev"
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "six-1.11.0-py2.py3-none-any.whl"
+hash = "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
+
+[[package.files]]
+file = "six-1.11.0.tar.gz"
+hash = "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9"
+
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-attrs = [
-    {file = "attrs-17.4.0-py2.py3-none-any.whl", hash = "sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450"},
-    {file = "attrs-17.4.0.tar.gz", hash = "sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9"},
-]
-colorama = [
-    {file = "colorama-0.3.9-py2.py3-none-any.whl", hash = "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda"},
-    {file = "colorama-0.3.9.tar.gz", hash = "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1"},
-]
-funcsigs = [
-    {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"},
-    {file = "funcsigs-1.0.2.tar.gz", hash = "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"},
-]
-more-itertools = [
-    {file = "more-itertools-4.1.0.tar.gz", hash = "sha256:c9ce7eccdcb901a2c75d326ea134e0886abfbea5f93e91cc95de9507c0816c44"},
-    {file = "more_itertools-4.1.0-py2-none-any.whl", hash = "sha256:11a625025954c20145b37ff6309cd54e39ca94f72f6bb9576d1195db6fa2442e"},
-    {file = "more_itertools-4.1.0-py3-none-any.whl", hash = "sha256:0dd8f72eeab0d2c3bd489025bb2f6a1b8342f9b198f6fc37b52d15cfa4531fea"},
-]
-pluggy = [
-    {file = "pluggy-0.6.0.tar.gz", hash = "sha256:7f8ae7f5bdf75671a718d2daf0a64b7885f74510bcd98b1a0bb420eb9a9d0cff"},
-]
-py = [
-    {file = "py-1.5.3-py2.py3-none-any.whl", hash = "sha256:983f77f3331356039fdd792e9220b7b8ee1aa6bd2b25f567a963ff1de5a64f6a"},
-    {file = "py-1.5.3.tar.gz", hash = "sha256:29c9fab495d7528e80ba1e343b958684f4ace687327e6f789a94bf3d1915f881"},
-]
-pytest = [
-    {file = "pytest-3.5.0-py2.py3-none-any.whl", hash = "sha256:6266f87ab64692112e5477eba395cfedda53b1933ccd29478e671e73b420c19c"},
-    {file = "pytest-3.5.0.tar.gz", hash = "sha256:fae491d1874f199537fd5872b5e1f0e74a009b979df9d53d1553fd03da1703e1"},
-]
-setuptools = [
-    {file = "setuptools-39.2.0-py2.py3-none-any.whl", hash = "sha256:8fca9275c89964f13da985c3656cb00ba029d7f3916b37990927ffdf264e7926"},
-    {file = "setuptools-39.2.0.zip", hash = "sha256:f7cddbb5f5c640311eb00eab6e849f7701fa70bf6a183fc8a2c33dd1d1672fb2"},
-]
-six = [
-    {file = "six-1.11.0-py2.py3-none-any.whl", hash = "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"},
-    {file = "six-1.11.0.tar.gz", hash = "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9"},
-]
diff --git a/tests/installation/fixtures/with-python-versions.test b/tests/installation/fixtures/with-python-versions.test
--- a/tests/installation/fixtures/with-python-versions.test
+++ b/tests/installation/fixtures/with-python-versions.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "B"
@@ -13,6 +14,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "C"
@@ -21,13 +23,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "~2.7 || ^3.3"
+files = []
 
 [metadata]
 python-versions = "~2.7 || ^3.4"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-B = []
-C = []
diff --git a/tests/installation/fixtures/with-same-version-url-dependencies.test b/tests/installation/fixtures/with-same-version-url-dependencies.test
--- a/tests/installation/fixtures/with-same-version-url-dependencies.test
+++ b/tests/installation/fixtures/with-same-version-url-dependencies.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = []
 
 [package.source]
 type = "url"
@@ -24,6 +25,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = []
 
 [package.source]
 type = "url"
@@ -43,12 +45,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-demo = []
-pendulum = []
diff --git a/tests/installation/fixtures/with-sub-dependencies.test b/tests/installation/fixtures/with-sub-dependencies.test
--- a/tests/installation/fixtures/with-sub-dependencies.test
+++ b/tests/installation/fixtures/with-sub-dependencies.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 D = "^1.0"
@@ -16,6 +17,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 C = "~1.2"
@@ -27,6 +29,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "D"
@@ -35,14 +38,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-A = []
-B = []
-C = []
-D = []
diff --git a/tests/installation/fixtures/with-url-dependency.test b/tests/installation/fixtures/with-url-dependency.test
--- a/tests/installation/fixtures/with-url-dependency.test
+++ b/tests/installation/fixtures/with-url-dependency.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = []
 
 [package.source]
 type = "url"
@@ -24,12 +25,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-demo = []
-pendulum = []
diff --git a/tests/installation/fixtures/with-vcs-dependency-with-extras.test b/tests/installation/fixtures/with-vcs-dependency-with-extras.test
--- a/tests/installation/fixtures/with-vcs-dependency-with-extras.test
+++ b/tests/installation/fixtures/with-vcs-dependency-with-extras.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 develop = false
 
 [package.dependencies]
@@ -27,6 +28,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "cleo"
@@ -35,13 +37,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-demo = []
-pendulum = []
-cleo = []
diff --git a/tests/installation/fixtures/with-vcs-dependency-without-ref.test b/tests/installation/fixtures/with-vcs-dependency-without-ref.test
--- a/tests/installation/fixtures/with-vcs-dependency-without-ref.test
+++ b/tests/installation/fixtures/with-vcs-dependency-without-ref.test
@@ -5,6 +5,7 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 develop = false
 
 [package.dependencies]
@@ -23,12 +24,9 @@ description = ""
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-demo = []
-pendulum = []
diff --git a/tests/installation/fixtures/with-wheel-dependency-no-requires-dist.test b/tests/installation/fixtures/with-wheel-dependency-no-requires-dist.test
--- a/tests/installation/fixtures/with-wheel-dependency-no-requires-dist.test
+++ b/tests/installation/fixtures/with-wheel-dependency-no-requires-dist.test
@@ -6,16 +6,15 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
+[[package.files]]
+file = "demo-0.1.0-py2.py3-none-any.whl"
+hash = "sha256:c25eb81459126848a1788eb3520d1a32014eb51ce3d3bae88c56bfdde4ce02db"
+
 [package.source]
 type = "file"
 url = "tests/fixtures/wheel_with_no_requires_dist/demo-0.1.0-py2.py3-none-any.whl"
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-demo = [
-    {file = "demo-0.1.0-py2.py3-none-any.whl", hash = "sha256:c25eb81459126848a1788eb3520d1a32014eb51ce3d3bae88c56bfdde4ce02db"},
-]
diff --git a/tests/installation/test_installer.py b/tests/installation/test_installer.py
--- a/tests/installation/test_installer.py
+++ b/tests/installation/test_installer.py
@@ -275,7 +275,7 @@ def test_run_update_after_removing_dependencies(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -351,7 +351,7 @@ def _configure_run_install_dev(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -480,7 +480,7 @@ def test_run_install_does_not_remove_locked_packages_if_installed_but_not_requir
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {package_a.name: [], package_b.name: [], package_c.name: []},
+                "files": {package_a.name: [], package_b.name: [], package_c.name: []},
             },
         }
     )
@@ -550,7 +550,7 @@ def test_run_install_removes_locked_packages_if_installed_and_synchronization_is
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {package_a.name: [], package_b.name: [], package_c.name: []},
+                "files": {package_a.name: [], package_b.name: [], package_c.name: []},
             },
         }
     )
@@ -621,7 +621,7 @@ def test_run_install_removes_no_longer_locked_packages_if_installed(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {package_a.name: [], package_b.name: [], package_c.name: []},
+                "files": {package_a.name: [], package_b.name: [], package_c.name: []},
             },
         }
     )
@@ -699,7 +699,7 @@ def test_run_install_with_synchronization(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {pkg.name: [] for pkg in locked_packages},
+                "files": {pkg.name: [] for pkg in locked_packages},
             },
         }
     )
@@ -741,7 +741,7 @@ def test_run_whitelist_add(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": []},
+                "files": {"A": []},
             },
         }
     )
@@ -798,7 +798,7 @@ def test_run_whitelist_remove(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": []},
+                "files": {"A": [], "B": []},
             },
         }
     )
@@ -1370,7 +1370,7 @@ def test_run_with_prereleases(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": []},
+                "files": {"A": []},
             },
         }
     )
@@ -1414,7 +1414,7 @@ def test_run_changes_category_if_needed(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": []},
+                "files": {"A": []},
             },
         }
     )
@@ -1461,7 +1461,7 @@ def test_run_update_all_with_lock(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": []},
+                "files": {"A": []},
             },
         }
     )
@@ -1520,7 +1520,7 @@ def test_run_update_with_locked_extras(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -1662,7 +1662,7 @@ def test_run_install_duplicate_dependencies_different_constraints_with_lock(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -1737,7 +1737,7 @@ def test_run_update_uninstalls_after_removal_transient_dependency(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": []},
+                "files": {"A": [], "B": []},
             },
         }
     )
@@ -1835,7 +1835,7 @@ def test_run_install_duplicate_dependencies_different_constraints_with_lock_upda
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -2126,7 +2126,7 @@ def test_update_multiple_times_with_split_dependencies_is_idempotent(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": []},
+                "files": {"A": [], "B": []},
             },
         }
     )
@@ -2451,7 +2451,7 @@ def test_installer_should_use_the_locked_version_of_git_dependencies(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"demo": [], "pendulum": []},
+                "files": {"demo": [], "pendulum": []},
             },
         }
     )
diff --git a/tests/installation/test_installer_old.py b/tests/installation/test_installer_old.py
--- a/tests/installation/test_installer_old.py
+++ b/tests/installation/test_installer_old.py
@@ -215,7 +215,7 @@ def test_run_update_after_removing_dependencies(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -292,7 +292,7 @@ def test_run_install_no_group(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -389,7 +389,7 @@ def test_run_install_with_synchronization(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {pkg.name: [] for pkg in locked_packages},
+                "files": {pkg.name: [] for pkg in locked_packages},
             },
         }
     )
@@ -434,7 +434,7 @@ def test_run_whitelist_add(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": []},
+                "files": {"A": []},
             },
         }
     )
@@ -491,7 +491,7 @@ def test_run_whitelist_remove(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": []},
+                "files": {"A": [], "B": []},
             },
         }
     )
@@ -1013,7 +1013,7 @@ def test_run_with_prereleases(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": []},
+                "files": {"A": []},
             },
         }
     )
@@ -1057,7 +1057,7 @@ def test_run_changes_category_if_needed(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": []},
+                "files": {"A": []},
             },
         }
     )
@@ -1104,7 +1104,7 @@ def test_run_update_all_with_lock(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": []},
+                "files": {"A": []},
             },
         }
     )
@@ -1163,7 +1163,7 @@ def test_run_update_with_locked_extras(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -1307,7 +1307,7 @@ def test_run_install_duplicate_dependencies_different_constraints_with_lock(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -1385,7 +1385,7 @@ def test_run_update_uninstalls_after_removal_transient_dependency(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": []},
+                "files": {"A": [], "B": []},
             },
         }
     )
@@ -1486,7 +1486,7 @@ def test_run_install_duplicate_dependencies_different_constraints_with_lock_upda
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": [], "C": []},
+                "files": {"A": [], "B": [], "C": []},
             },
         }
     )
@@ -1742,7 +1742,7 @@ def test_update_multiple_times_with_split_dependencies_is_idempotent(
                 "python-versions": "*",
                 "platform": "*",
                 "content-hash": "123456789",
-                "hashes": {"A": [], "B": []},
+                "files": {"A": [], "B": []},
             },
         }
     )
diff --git a/tests/packages/test_locker.py b/tests/packages/test_locker.py
--- a/tests/packages/test_locker.py
+++ b/tests/packages/test_locker.py
@@ -105,6 +105,14 @@ def test_lock_file_data_is_ordered(locker: Locker, root: ProjectPackage):
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "bar"
+hash = "123"
+
+[[package.files]]
+file = "foo"
+hash = "456"
+
 [package.dependencies]
 B = "^1.0"
 
@@ -116,6 +124,10 @@ def test_lock_file_data_is_ordered(locker: Locker, root: ProjectPackage):
 optional = false
 python-versions = "*"
 
+[[package.files]]
+file = "baz"
+hash = "345"
+
 [[package]]
 name = "B"
 version = "1.2"
@@ -123,6 +135,7 @@ def test_lock_file_data_is_ordered(locker: Locker, root: ProjectPackage):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [[package]]
 name = "git-package"
@@ -131,6 +144,7 @@ def test_lock_file_data_is_ordered(locker: Locker, root: ProjectPackage):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 develop = false
 
 [package.source]
@@ -146,6 +160,7 @@ def test_lock_file_data_is_ordered(locker: Locker, root: ProjectPackage):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 develop = false
 
 [package.source]
@@ -162,6 +177,7 @@ def test_lock_file_data_is_ordered(locker: Locker, root: ProjectPackage):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.source]
 type = "url"
@@ -174,26 +190,16 @@ def test_lock_file_data_is_ordered(locker: Locker, root: ProjectPackage):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.source]
 type = "url"
 url = "https://example.org/url-package-1.0-cp39-win_amd64.whl"
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-A = [
-    {{file = "bar", hash = "123"}},
-    {{file = "foo", hash = "456"}},
-    {{file = "baz", hash = "345"}},
-]
-B = []
-git-package = []
-git-package-subdir = []
-url-package = []
 """  # noqa: E800
 
     assert content == expected
@@ -210,6 +216,7 @@ def test_locker_properly_loads_extras(locker: Locker):
 category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = []
 
 [package.dependencies]
 msgpack = "*"
@@ -224,12 +231,9 @@ def test_locker_properly_loads_extras(locker: Locker):
 redis = ["redis (>=2.10.5)"]
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "~2.7 || ^3.4"
 content-hash = "c3d07fca33fba542ef2b2a4d75bf5b48d892d21a830e2ad9c952ba5123a52f77"
-
-[metadata.files]
-cachecontrol = []
 """  # noqa: E800
 
     locker.lock.write(tomlkit.parse(content))
@@ -257,6 +261,7 @@ def test_locker_properly_loads_nested_extras(locker: Locker):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 b = {{version = "^1.0", optional = true, extras = "c"}}
@@ -271,6 +276,7 @@ def test_locker_properly_loads_nested_extras(locker: Locker):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 c = {{version = "^1.0", optional = true}}
@@ -285,16 +291,12 @@ def test_locker_properly_loads_nested_extras(locker: Locker):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"a" = []
-"b" = []
-"c" = []
 """  # noqa: E800
 
     locker.lock.write(tomlkit.parse(content))
@@ -339,6 +341,7 @@ def test_locker_properly_loads_extras_legacy(locker: Locker):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 b = {{version = "^1.0", optional = true}}
@@ -353,15 +356,12 @@ def test_locker_properly_loads_extras_legacy(locker: Locker):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
 python-versions = "*"
-lock-version = "1.1"
+lock-version = "2.0"
 content-hash = "123456789"
-
-[metadata.files]
-"a" = []
-"b" = []
 """  # noqa: E800
 
     locker.lock.write(tomlkit.parse(content))
@@ -390,6 +390,7 @@ def test_locker_properly_loads_subdir(locker: Locker) -> None:
 optional = false
 python-versions = "*"
 develop = false
+files = []
 
 [package.source]
 type = "git"
@@ -399,12 +400,9 @@ def test_locker_properly_loads_subdir(locker: Locker) -> None:
 subdirectory = "subdir"
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-git-package-subdir = []
 """
     locker.lock.write(tomlkit.parse(content))
 
@@ -551,14 +549,12 @@ def test_lock_packages_with_null_description(locker: Locker, root: ProjectPackag
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-A = []
 """  # noqa: E800
 
     assert content == expected
@@ -585,6 +581,7 @@ def test_lock_file_should_not_have_mixed_types(locker: Locker, root: ProjectPack
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 B = [
@@ -596,12 +593,9 @@ def test_lock_file_should_not_have_mixed_types(locker: Locker, root: ProjectPack
 foo = ["B (>=1.0.0)"]
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-A = []
 """  # noqa: E800
 
     with locker.lock.open(encoding="utf-8") as f:
@@ -621,6 +615,7 @@ def test_reading_lock_file_should_raise_an_error_on_invalid_data(locker: Locker)
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.extras]
 foo = ["bar"]
@@ -629,12 +624,9 @@ def test_reading_lock_file_should_raise_an_error_on_invalid_data(locker: Locker)
 foo = ["bar"]
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-A = []
 """  # noqa: E800
     with locker.lock.open("w", encoding="utf-8") as f:
         f.write(content)
@@ -672,6 +664,7 @@ def test_locking_legacy_repository_package_should_include_source_section(
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.source]
 type = "legacy"
@@ -679,12 +672,9 @@ def test_locking_legacy_repository_package_should_include_source_section(
 reference = "legacy"
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-A = []
 """  # noqa: E800
 
     assert content == expected
@@ -699,8 +689,6 @@ def test_locker_should_emit_warnings_if_lock_version_is_newer_but_allowed(
 lock-version = "{version}"
 python-versions = "~2.7 || ^3.4"
 content-hash = "c3d07fca33fba542ef2b2a4d75bf5b48d892d21a830e2ad9c952ba5123a52f77"
-
-[metadata.files]
 """
     caplog.set_level(logging.WARNING, logger="poetry.packages.locker")
 
@@ -728,11 +716,9 @@ def test_locker_should_raise_an_error_if_lock_version_is_newer_and_not_allowed(
 # {GENERATED_COMMENT}
 
 [metadata]
-lock-version = "2.0"
+lock-version = "3.0"
 python-versions = "~2.7 || ^3.4"
 content-hash = "c3d07fca33fba542ef2b2a4d75bf5b48d892d21a830e2ad9c952ba5123a52f77"
-
-[metadata.files]
 """  # noqa: E800
     caplog.set_level(logging.WARNING, logger="poetry.packages.locker")
 
@@ -763,17 +749,15 @@ def test_extras_dependencies_are_ordered(locker: Locker, root: ProjectPackage):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 B = {{version = "^1.0.0", extras = ["a", "b", "c"], optional = true}}
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-A = []
 """  # noqa: E800
 
     with locker.lock.open(encoding="utf-8") as f:
@@ -785,10 +769,7 @@ def test_extras_dependencies_are_ordered(locker: Locker, root: ProjectPackage):
 def test_locker_should_neither_emit_warnings_nor_raise_error_for_lower_compatible_versions(  # noqa: E501
     locker: Locker, caplog: LogCaptureFixture
 ):
-    current_version = Version.parse(Locker._VERSION)
-    older_version = ".".join(
-        [str(current_version.major), str(current_version.minor - 1)]
-    )
+    older_version = "1.1"
     content = f"""\
 [metadata]
 lock-version = "{older_version}"
@@ -856,6 +837,7 @@ def test_locker_dumps_dependency_information_correctly(
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.dependencies]
 B = {{path = "project_with_extras", develop = true}}
@@ -865,12 +847,9 @@ def test_locker_dumps_dependency_information_correctly(
 F = {{git = "https://github.com/python-poetry/poetry.git", branch = "foo"}}
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-A = []
 """  # noqa: E800
 
     assert content == expected
@@ -902,6 +881,7 @@ def test_locker_dumps_subdir(locker: Locker, root: ProjectPackage) -> None:
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 develop = false
 
 [package.source]
@@ -912,12 +892,9 @@ def test_locker_dumps_subdir(locker: Locker, root: ProjectPackage) -> None:
 subdirectory = "subdir"
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-git-package-subdir = []
 """  # noqa: E800
 
     assert content == expected
@@ -954,18 +931,16 @@ def test_locker_dumps_dependency_extras_in_correct_order(
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.extras]
 B = ["first (==1.0.0)", "second (==1.0.0)", "third (==1.0.0)"]
 C = ["first (==1.0.0)", "second (==1.0.0)", "third (==1.0.0)"]
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-A = []
 """  # noqa: E800
 
     assert content == expected
@@ -985,6 +960,7 @@ def test_locked_repository_uses_root_dir_of_package(
 optional = false
 python-versions = "^2.7.9"
 develop = true
+file = []
 
 [package.dependencies]
 lib-b = {{path = "../libB", develop = true}}
@@ -994,13 +970,9 @@ def test_locked_repository_uses_root_dir_of_package(
 url = "lib/libA"
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-lib-a = []
-lib-b = []
 """  # noqa: E800
 
     locker.lock.write(tomlkit.parse(content))
@@ -1126,6 +1098,7 @@ def test_lock_file_resolves_file_url_symlinks(root: ProjectPackage):
 category = "main"
 optional = false
 python-versions = "*"
+files = []
 
 [package.source]
 type = "file"
@@ -1141,12 +1114,9 @@ def test_lock_file_resolves_file_url_symlinks(root: ProjectPackage):
 resolved_reference = "123456"
 
 [metadata]
-lock-version = "1.1"
+lock-version = "2.0"
 python-versions = "*"
 content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
-
-[metadata.files]
-local-package = []
 """  # noqa: E800
 
             assert content == expected