Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Serialize whole conaninfo state #11401

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions conans/model/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,8 @@ def full_mode(self):
def load_binary_info(text):
# This is used for search functionality, search prints info from this file
# TODO: Generalize
parser = ConfigParser(text, ["settings", "settings_target", "options", "requires", "conf"],
parser = ConfigParser(text, ["settings", "settings_target", "options", "requires", "conf",
"python_requires", "build_requires"],
raise_unexpected_field=False)

def _loads_settings(settings_text):
Expand All @@ -297,17 +298,23 @@ def _loads_settings(settings_text):
settings = _loads_settings(parser.settings)
settings_target = _loads_settings(parser.settings_target)
options = Options.loads(parser.options)
# TODO: We need to generalize this reading.
requires = parser.requires.splitlines() if parser.requires else []
requires = [r for r in requires if r]
# TODO: Temporary reading of conf as raw lines
conf = parser.conf.splitlines() if parser.conf else []

def parse_list(lines):
ret = lines.splitlines() if lines else []
return [r for r in ret if r]

requires = parse_list(parser.requires)
conf = parse_list(parser.conf)
python_requires = parse_list(parser.python_requires)
build_requires = parse_list(parser.build_requires)

conan_info_json = {"settings": dict(settings),
"options": dict(options.serialize())["options"],
"requires": requires,
"settings_target": dict(settings_target),
"conf": conf
"conf": conf,
"python_requires": python_requires,
"build_requires": build_requires,
}
return conan_info_json

Expand Down
42 changes: 42 additions & 0 deletions conans/test/integration/command_v2/list_package_ids_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,48 @@ def test_wildcard_not_accepted(self):
"reference in the form name/version[@user/channel][#RECIPE_REVISION]"
assert expected_output in self.client.out

def test_list_python_requires(self):
self.client.save({"conanfile.py": GenConanfile()})
self.client.run("export . --name=tool --version=1.1.1")
conanfile = textwrap.dedent("""
from conan import ConanFile
class Pkg(ConanFile):
python_requires ="tool/[*]"
""")
self.client.save({"conanfile.py": conanfile})
self.client.run("create . --name foo --version 1.0")
self.client.run('list packages foo/1.0#latest')

expected_output = textwrap.dedent("""\
Local Cache:
foo/1.0#b2ab5ffa95e8c5c19a5d1198be33103a:170e82ef3a6bf0bbcda5033467ab9d7805b11d0b
python_requires:
tool/1.1.Z
""")
assert self.client.out == expected_output

def test_list_build_requires(self):
self.client.save({"conanfile.py": GenConanfile()})
self.client.run("create . --name=tool --version=1.1.1")
conanfile = textwrap.dedent("""
from conan import ConanFile
class Pkg(ConanFile):
def requirements(self):
# We set the package_id_mode so it is part of the package_id
self.tool_requires("tool/1.1.1", package_id_mode="minor_mode")
""")
self.client.save({"conanfile.py": conanfile})
self.client.run("create . --name foo --version 1.0")
self.client.run('list packages foo/1.0#latest')

expected_output = textwrap.dedent("""\
Local Cache:
foo/1.0#75821be6dc510628d538fffb2f00a51f:d01be73a295dca843e5e198334f86ae7038423d7
build_requires:
tool/1.1.Z
""")
assert self.client.out == expected_output


class TestListPackagesFromRemotes(TestListPackageIdsBase):
def test_by_default_search_only_in_cache(self):
Expand Down