Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-poetry for openSUSE:Factory 
checked in at 2022-08-27 11:50:06
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-poetry (Old)
 and      /work/SRC/openSUSE:Factory/.python-poetry.new.2083 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-poetry"

Sat Aug 27 11:50:06 2022 rev:17 rq:999443 version:1.1.15

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-poetry/python-poetry.changes      
2022-07-10 23:15:17.144944765 +0200
+++ /work/SRC/openSUSE:Factory/.python-poetry.new.2083/python-poetry.changes    
2022-08-27 11:50:09.201851229 +0200
@@ -1,0 +2,9 @@
+Fri Aug 26 16:23:30 UTC 2022 - Ben Greiner <c...@bnavigator.de>
+
+- Update to 1.1.15
+  * Poetry now fallback to gather metadata for dependencies via
+    pep517 if parsing pyproject.toml fail (#6206)
+  * Extras and extras dependencies are now sorted in lock file
+    (#6207)
+
+-------------------------------------------------------------------

Old:
----
  poetry-1.1.14.tar.gz

New:
----
  poetry-1.1.15.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-poetry.spec ++++++
--- /var/tmp/diff_new_pack.lME4PG/_old  2022-08-27 11:50:09.825852570 +0200
+++ /var/tmp/diff_new_pack.lME4PG/_new  2022-08-27 11:50:09.829852578 +0200
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python3-%{**}}
 %define skip_python2 1
 Name:           python-poetry
-Version:        1.1.14
+Version:        1.1.15
 Release:        0
 Summary:        Python dependency management and packaging
 License:        MIT
@@ -37,33 +37,36 @@
 BuildRequires:  %{python_module cachy >= 0.3.0}
 BuildRequires:  %{python_module cleo >= 0.8.1}
 BuildRequires:  %{python_module clikit >= 0.6.2}
+BuildRequires:  %{python_module crashtest >= 0.3.0}
 BuildRequires:  %{python_module html5lib >= 1.0}
 BuildRequires:  %{python_module importlib-metadata if %python-base < 3.6}
 BuildRequires:  %{python_module keyring >= 21.2.0}
 # cachecontrol[filecache]
 BuildRequires:  %{python_module lockfile >= 0.9}
 BuildRequires:  %{python_module packaging >= 20.4}
+BuildRequires:  %{python_module pexpect >= 4.7.0}
 BuildRequires:  %{python_module pip}
-BuildRequires:  %{python_module pkginfo >= 1.5}
+BuildRequires:  %{python_module pkginfo >= 1.4}
 BuildRequires:  %{python_module poetry-core >= 1.0.7}
 BuildRequires:  %{python_module requests >= 2.18}
 BuildRequires:  %{python_module requests-toolbelt >= 0.9.1}
 BuildRequires:  %{python_module shellingham >= 1.1}
 BuildRequires:  %{python_module tomlkit >= 0.7.0}
-BuildRequires:  %{python_module virtualenv}
+BuildRequires:  %{python_module virtualenv >= 20.0.26}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
 Requires:       python-CacheControl >= 0.12.9
 Requires:       python-cachy >= 0.3.0
-Requires:       python-cleo >= 0.8.0
+Requires:       python-cleo >= 0.8.1
 Requires:       python-clikit >= 0.6.2
+Requires:       python-crashtest >= 0.3.0
 Requires:       python-html5lib >= 1.0
 Requires:       python-keyring >= 21.2.0
 # cachecontrol[filecache]
 Requires:       python-lockfile >= 0.9
 Requires:       python-packaging >= 20.4
 Requires:       python-pexpect >= 4.7.0
-Requires:       python-pkginfo >= 1.5
+Requires:       python-pkginfo >= 1.4
 Requires:       python-poetry-core >= 1.0.7
 Requires:       python-requests >= 2.18
 Requires:       python-requests-toolbelt >= 0.9.1

++++++ poetry-1.1.14.tar.gz -> poetry-1.1.15.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/CHANGELOG.md 
new/poetry-1.1.15/CHANGELOG.md
--- old/poetry-1.1.14/CHANGELOG.md      2022-07-08 15:30:02.000000000 +0200
+++ new/poetry-1.1.15/CHANGELOG.md      2022-08-22 12:34:10.000000000 +0200
@@ -1,14 +1,21 @@
 # Change Log
 
+## [1.1.15] - 2022-08-22
+
+### Changed
+
+- Poetry now fallback to gather metadata for dependencies via pep517 if 
parsing pyproject.toml fail 
([#6206](https://github.com/python-poetry/poetry/pull/6206))
+- Extras and extras dependencies are now sorted in lock file 
([#6207](https://github.com/python-poetry/poetry/pull/6207))
+
 ## [1.1.14] - 2022-07-08
 
-## Fixed
+### Fixed
 
 - Fixed an issue where dependencies hashes could not be retrieved when locking 
due to a breaking change on PyPI JSON API 
([#5973](https://github.com/python-poetry/poetry/pull/5973))
 
 ## [1.1.13] - 2022-02-09
 
-## Fixed
+### Fixed
 
 - Fixed an issue where envs in MSYS2 always reported as broken 
([#4942](https://github.com/python-poetry/poetry/pull/4942))
 - Fixed an issue where conda envs in windows are always reported as broken 
([#5008](https://github.com/python-poetry/poetry/pull/5008))
@@ -1183,7 +1190,8 @@
 
 
 
-[Unreleased]: https://github.com/python-poetry/poetry/compare/1.1.14...1.1
+[Unreleased]: https://github.com/python-poetry/poetry/compare/1.1.15...1.1
+[1.1.15]: https://github.com/python-poetry/poetry/releases/tag/1.1.15
 [1.1.14]: https://github.com/python-poetry/poetry/releases/tag/1.1.14
 [1.1.13]: https://github.com/python-poetry/poetry/releases/tag/1.1.13
 [1.1.12]: https://github.com/python-poetry/poetry/releases/tag/1.1.12
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/docs/_index.md 
new/poetry-1.1.15/docs/_index.md
--- old/poetry-1.1.14/docs/_index.md    2022-07-08 15:30:02.000000000 +0200
+++ new/poetry-1.1.15/docs/_index.md    2022-08-22 12:34:10.000000000 +0200
@@ -32,10 +32,10 @@
 from the rest of your system by vendorizing its dependencies. This is the
 recommended way of installing `poetry`.
 
-{{% note %}}
-The `get-poetry.py` script described here will be replaced in Poetry 1.2 by 
`install-poetry.py`.
+{{% warning %}}
+The `get-poetry.py` script described here will be replaced in Poetry 1.2 by 
`install.python-poetry.org`.
 From Poetry **1.1.7 onwards**, you can already use this script as described 
[here]({{< relref "docs/master/#installation" >}}).
-{{% /note %}}
+{{% /warning %}}
 
 ### osx / linux / bashonwindows install instructions
 ```bash
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/poetry/__version__.py 
new/poetry-1.1.15/poetry/__version__.py
--- old/poetry-1.1.14/poetry/__version__.py     2022-07-08 15:30:02.000000000 
+0200
+++ new/poetry-1.1.15/poetry/__version__.py     2022-08-22 12:34:10.000000000 
+0200
@@ -1 +1 @@
-__version__ = "1.1.14"
+__version__ = "1.1.15"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/poetry/inspection/info.py 
new/poetry-1.1.15/poetry/inspection/info.py
--- old/poetry-1.1.14/poetry/inspection/info.py 2022-07-08 15:30:02.000000000 
+0200
+++ new/poetry-1.1.15/poetry/inspection/info.py 2022-08-22 12:34:10.000000000 
+0200
@@ -437,7 +437,12 @@
         # Note: we ignore any setup.py file at this step
         # TODO: add support for handling non-poetry PEP-517 builds
         if PyProjectTOML(path.joinpath("pyproject.toml")).is_poetry_project():
-            return Factory().create_poetry(path).package
+            try:
+                return Factory().create_poetry(path).package
+            except RuntimeError:
+                return None
+
+        return None
 
     @classmethod
     def _pep517_metadata(cls, path):  # type (Path) -> PackageInfo
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/poetry/installation/executor.py 
new/poetry-1.1.15/poetry/installation/executor.py
--- old/poetry-1.1.14/poetry/installation/executor.py   2022-07-08 
15:30:02.000000000 +0200
+++ new/poetry-1.1.15/poetry/installation/executor.py   2022-08-22 
12:34:10.000000000 +0200
@@ -513,34 +513,39 @@
             legacy_pip = self._env.pip_version < 
self._env.pip_version.__class__(
                 19, 0, 0
             )
-            package_poetry = 
Factory().create_poetry(pyproject.file.path.parent)
 
-            if package.develop and not package_poetry.package.build_script:
-                from poetry.masonry.builders.editable import EditableBuilder
+            try:
+                package_poetry = 
Factory().create_poetry(pyproject.file.path.parent)
+            except RuntimeError:
+                package_poetry = None
+
+            if package_poetry is not None:
+                if package.develop and not package_poetry.package.build_script:
+                    from poetry.masonry.builders.editable import 
EditableBuilder
+
+                    # This is a Poetry package in editable mode
+                    # we can use the EditableBuilder without going through pip
+                    # to install it, unless it has a build script.
+                    builder = EditableBuilder(package_poetry, self._env, 
NullIO())
+                    builder.build()
+
+                    return 0
+                elif legacy_pip or package_poetry.package.build_script:
+                    from poetry.core.masonry.builders.sdist import SdistBuilder
+
+                    # We need to rely on creating a temporary setup.py
+                    # file since the version of pip does not support
+                    # build-systems
+                    # We also need it for non-PEP-517 packages
+                    builder = SdistBuilder(package_poetry)
+
+                    with builder.setup_py():
+                        if package.develop:
+                            args.append("-e")
 
-                # This is a Poetry package in editable mode
-                # we can use the EditableBuilder without going through pip
-                # to install it, unless it has a build script.
-                builder = EditableBuilder(package_poetry, self._env, NullIO())
-                builder.build()
-
-                return 0
-            elif legacy_pip or package_poetry.package.build_script:
-                from poetry.core.masonry.builders.sdist import SdistBuilder
-
-                # We need to rely on creating a temporary setup.py
-                # file since the version of pip does not support
-                # build-systems
-                # We also need it for non-PEP-517 packages
-                builder = SdistBuilder(package_poetry)
-
-                with builder.setup_py():
-                    if package.develop:
-                        args.append("-e")
+                        args.append(req)
 
-                    args.append(req)
-
-                    return self.run_pip(*args)
+                        return self.run_pip(*args)
 
         if package.develop:
             args.append("-e")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/poetry/installation/pip_installer.py 
new/poetry-1.1.15/poetry/installation/pip_installer.py
--- old/poetry-1.1.14/poetry/installation/pip_installer.py      2022-07-08 
15:30:02.000000000 +0200
+++ new/poetry-1.1.15/poetry/installation/pip_installer.py      2022-08-22 
12:34:10.000000000 +0200
@@ -202,34 +202,39 @@
             legacy_pip = self._env.pip_version < 
self._env.pip_version.__class__(
                 19, 0, 0
             )
-            package_poetry = 
Factory().create_poetry(pyproject.file.path.parent)
 
-            if package.develop and not package_poetry.package.build_script:
-                from poetry.masonry.builders.editable import EditableBuilder
+            try:
+                package_poetry = 
Factory().create_poetry(pyproject.file.path.parent)
+            except RuntimeError:
+                package_poetry = None
+
+            if package_poetry is not None:
+                if package.develop and not package_poetry.package.build_script:
+                    from poetry.masonry.builders.editable import 
EditableBuilder
+
+                    # This is a Poetry package in editable mode
+                    # we can use the EditableBuilder without going through pip
+                    # to install it, unless it has a build script.
+                    builder = EditableBuilder(package_poetry, self._env, 
NullIO())
+                    builder.build()
+
+                    return 0
+                elif legacy_pip or package_poetry.package.build_script:
+                    from poetry.core.masonry.builders.sdist import SdistBuilder
+
+                    # We need to rely on creating a temporary setup.py
+                    # file since the version of pip does not support
+                    # build-systems
+                    # We also need it for non-PEP-517 packages
+                    builder = SdistBuilder(package_poetry)
+
+                    with builder.setup_py():
+                        if package.develop:
+                            args.append("-e")
 
-                # This is a Poetry package in editable mode
-                # we can use the EditableBuilder without going through pip
-                # to install it, unless it has a build script.
-                builder = EditableBuilder(package_poetry, self._env, NullIO())
-                builder.build()
-
-                return 0
-            elif legacy_pip or package_poetry.package.build_script:
-                from poetry.core.masonry.builders.sdist import SdistBuilder
-
-                # We need to rely on creating a temporary setup.py
-                # file since the version of pip does not support
-                # build-systems
-                # We also need it for non-PEP-517 packages
-                builder = SdistBuilder(package_poetry)
-
-                with builder.setup_py():
-                    if package.develop:
-                        args.append("-e")
+                        args.append(req)
 
-                    args.append(req)
-
-                    return self.run(*args)
+                        return self.run(*args)
 
         if package.develop:
             args.append("-e")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/poetry/packages/locker.py 
new/poetry-1.1.15/poetry/packages/locker.py
--- old/poetry-1.1.14/poetry/packages/locker.py 2022-07-08 15:30:02.000000000 
+0200
+++ new/poetry-1.1.15/poetry/packages/locker.py 2022-08-22 12:34:10.000000000 
+0200
@@ -570,14 +570,14 @@
                         data["dependencies"][k].append(constraint)
 
         if package.extras:
-            extras = {}
-            for name, deps in package.extras.items():
+            extras = OrderedDict()
+            for name, deps in sorted(package.extras.items()):
                 # TODO: This should use dep.to_pep_508() once this is fixed
                 # https://github.com/python-poetry/poetry-core/pull/102
-                extras[name] = [
+                extras[name] = sorted(
                     dep.base_pep_508_name if not dep.constraint.is_any() else 
dep.name
                     for dep in deps
-                ]
+                )
 
             data["extras"] = extras
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/pyproject.toml 
new/poetry-1.1.15/pyproject.toml
--- old/poetry-1.1.14/pyproject.toml    2022-07-08 15:30:02.000000000 +0200
+++ new/poetry-1.1.15/pyproject.toml    2022-08-22 12:34:10.000000000 +0200
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "poetry"
-version = "1.1.14"
+version = "1.1.15"
 description = "Python dependency management and packaging made easy."
 authors = [
     "S??bastien Eustace <sebast...@eustace.io>"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/poetry-1.1.14/tests/fixtures/inspection/demo_poetry_package/pyproject.toml 
new/poetry-1.1.15/tests/fixtures/inspection/demo_poetry_package/pyproject.toml
--- 
old/poetry-1.1.14/tests/fixtures/inspection/demo_poetry_package/pyproject.toml  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/poetry-1.1.15/tests/fixtures/inspection/demo_poetry_package/pyproject.toml  
    2022-08-22 12:34:10.000000000 +0200
@@ -0,0 +1,15 @@
+[tool.poetry]
+name = "demo-poetry"
+version = "0.1.0"
+description = ""
+authors = ["John Doe <j...@example.com.com>"]
+
+[tool.poetry.dependencies]
+python = "^3.10"
+pendulum = "*"
+
+[tool.poetry.dev-dependencies]
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/tests/inspection/test_info.py 
new/poetry-1.1.15/tests/inspection/test_info.py
--- old/poetry-1.1.14/tests/inspection/test_info.py     2022-07-08 
15:30:02.000000000 +0200
+++ new/poetry-1.1.15/tests/inspection/test_info.py     2022-08-22 
12:34:10.000000000 +0200
@@ -127,6 +127,22 @@
     demo_check_info(info)
 
 
+def test_info_from_poetry_directory_fallback_on_poetry_create_error(mocker):
+    mock_create_poetry = mocker.patch(
+        "poetry.inspection.info.Factory.create_poetry", 
side_effect=RuntimeError
+    )
+    mock_get_poetry_package = mocker.spy(PackageInfo, "_get_poetry_package")
+    mock_get_pep517_metadata = mocker.patch(
+        "poetry.inspection.info.PackageInfo._pep517_metadata"
+    )
+
+    PackageInfo.from_directory(FIXTURE_DIR_INSPECTIONS / "demo_poetry_package")
+
+    assert mock_create_poetry.call_count == 1
+    assert mock_get_poetry_package.call_count == 1
+    assert mock_get_pep517_metadata.call_count == 1
+
+
 def test_info_from_requires_txt():
     info = PackageInfo.from_metadata(
         FIXTURE_DIR_INSPECTIONS / "demo_only_requires_txt.egg-info"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/poetry-1.1.14/tests/installation/fixtures/with-pypi-repository.test 
new/poetry-1.1.15/tests/installation/fixtures/with-pypi-repository.test
--- old/poetry-1.1.14/tests/installation/fixtures/with-pypi-repository.test     
2022-07-08 15:30:02.000000000 +0200
+++ new/poetry-1.1.15/tests/installation/fixtures/with-pypi-repository.test     
2022-08-22 12:34:10.000000000 +0200
@@ -7,7 +7,7 @@
 python-versions = "*"
 
 [package.extras]
-dev = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface", 
"sphinx", "zope.interface"]
+dev = ["coverage", "hypothesis", "pympler", "pytest", "six", "sphinx", 
"zope.interface", "zope.interface"]
 docs = ["sphinx", "zope.interface"]
 tests = ["coverage", "hypothesis", "pympler", "pytest", "six", 
"zope.interface"]
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/tests/installation/test_executor.py 
new/poetry-1.1.15/tests/installation/test_executor.py
--- old/poetry-1.1.14/tests/installation/test_executor.py       2022-07-08 
15:30:02.000000000 +0200
+++ new/poetry-1.1.15/tests/installation/test_executor.py       2022-08-22 
12:34:10.000000000 +0200
@@ -358,3 +358,53 @@
     )
 
     assert archive == link_cached
+
+
+def test_executer_fallback_on_poetry_create_error(
+    mocker, config, pool, io, tmp_dir, mock_file_downloads,
+):
+    import poetry.installation.executor
+
+    mock_pip_install = mocker.patch.object(
+        poetry.installation.executor.Executor, "run_pip"
+    )
+    mock_sdist_builder = 
mocker.patch("poetry.core.masonry.builders.sdist.SdistBuilder")
+    mock_editable_builder = mocker.patch(
+        "poetry.masonry.builders.editable.EditableBuilder"
+    )
+    mock_create_poetry = mocker.patch(
+        "poetry.factory.Factory.create_poetry", side_effect=RuntimeError
+    )
+
+    config.merge({"cache-dir": tmp_dir})
+
+    env = MockEnv(path=Path(tmp_dir))
+    executor = Executor(env, pool, config, io)
+
+    directory_package = Package(
+        "simple-project",
+        "1.2.3",
+        source_type="directory",
+        source_url=Path(__file__)
+        .parent.parent.joinpath("fixtures/simple_project")
+        .resolve()
+        .as_posix(),
+    )
+
+    return_code = executor.execute([Install(directory_package)])
+
+    expected = """
+Package operations: 1 install, 0 updates, 0 removals
+  ??? Installing simple-project (1.2.3 {source_url})
+""".format(
+        source_url=directory_package.source_url
+    )
+
+    expected = set(expected.splitlines())
+    output = set(io.fetch_output().splitlines())
+    assert output == expected
+    assert return_code == 0
+    assert mock_create_poetry.call_count == 1
+    assert mock_sdist_builder.call_count == 0
+    assert mock_editable_builder.call_count == 0
+    assert mock_pip_install.call_count == 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/poetry-1.1.14/tests/installation/test_pip_installer.py 
new/poetry-1.1.15/tests/installation/test_pip_installer.py
--- old/poetry-1.1.14/tests/installation/test_pip_installer.py  2022-07-08 
15:30:02.000000000 +0200
+++ new/poetry-1.1.15/tests/installation/test_pip_installer.py  2022-08-22 
12:34:10.000000000 +0200
@@ -216,3 +216,35 @@
     # any command in the virtual environment should trigger the error message
     output = tmp_venv.run("python", "-m", "site")
     assert "Error processing line 1 of {}".format(pth_file_candidate) not in 
output
+
+
+def test_install_directory_fallback_on_poetry_create_error(mocker, tmp_venv, 
pool):
+    import poetry.installation.pip_installer
+
+    mock_create_poetry = mocker.patch(
+        "poetry.factory.Factory.create_poetry", side_effect=RuntimeError
+    )
+    mock_sdist_builder = 
mocker.patch("poetry.core.masonry.builders.sdist.SdistBuilder")
+    mock_editable_builder = mocker.patch(
+        "poetry.masonry.builders.editable.EditableBuilder"
+    )
+    mock_pip_install = mocker.patch.object(
+        poetry.installation.pip_installer.PipInstaller, "run"
+    )
+
+    package = Package(
+        "demo",
+        "1.0.0",
+        source_type="directory",
+        source_url=str(
+            Path(__file__).parent.parent / 
"fixtures/inspection/demo_poetry_package"
+        ),
+    )
+
+    installer = PipInstaller(tmp_venv, NullIO(), pool)
+    installer.install_directory(package)
+
+    assert mock_create_poetry.call_count == 1
+    assert mock_sdist_builder.call_count == 0
+    assert mock_editable_builder.call_count == 0
+    assert mock_pip_install.call_count == 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/poetry-1.1.14/tests/packages/test_locker.py 
new/poetry-1.1.15/tests/packages/test_locker.py
--- old/poetry-1.1.14/tests/packages/test_locker.py     2022-07-08 
15:30:02.000000000 +0200
+++ new/poetry-1.1.15/tests/packages/test_locker.py     2022-08-22 
12:34:10.000000000 +0200
@@ -598,6 +598,49 @@
     assert expected == content
 
 
+def test_locker_dumps_dependency_extras_in_correct_order(locker, root):
+    root_dir = Path(__file__).parent.parent.joinpath("fixtures")
+    package_a = get_package("A", "1.0.0")
+    Factory.create_dependency("B", "1.0.0", root_dir=root_dir)
+    Factory.create_dependency("C", "1.0.0", root_dir=root_dir)
+    package_first = Factory.create_dependency("first", "1.0.0", 
root_dir=root_dir)
+    package_second = Factory.create_dependency("second", "1.0.0", 
root_dir=root_dir)
+    package_third = Factory.create_dependency("third", "1.0.0", 
root_dir=root_dir)
+
+    package_a.extras = {
+        "C": [package_third, package_second, package_first],
+        "B": [package_first, package_second, package_third],
+    }
+
+    locker.set_lock_data(root, [package_a])
+
+    with locker.lock.open(encoding="utf-8") as f:
+        content = f.read()
+
+    expected = """[[package]]
+name = "A"
+version = "1.0.0"
+description = ""
+category = "main"
+optional = false
+python-versions = "*"
+
+[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"
+python-versions = "*"
+content-hash = 
"115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
+
+[metadata.files]
+A = []
+"""
+
+    assert content == expected
+
+
 @pytest.mark.skipif(sys.version_info[:2] == (3, 5), reason="Skip for Python 
3.5")
 def test_locked_repository_uses_root_dir_of_package(locker, mocker):
     content = """\

Reply via email to