ledgered 0.7.1.dev2__tar.gz → 0.7.2.dev6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/.github/workflows/build_and_tests.yml +5 -2
  2. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/.github/workflows/fast-checks.yml +1 -0
  3. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/CHANGELOG.md +24 -10
  4. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/PKG-INFO +7 -4
  5. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/pyproject.toml +6 -3
  6. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/__version__.py +2 -2
  7. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/cli.py +29 -15
  8. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered.egg-info/PKG-INFO +7 -4
  9. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/functional/manifest/test_cli.py +7 -1
  10. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/functional/test_github.py +1 -1
  11. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/.github/workflows/codeql-analysis.yml +0 -0
  12. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/.gitignore +0 -0
  13. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/LICENSE +0 -0
  14. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/README.md +0 -0
  15. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/doc/binary.md +0 -0
  16. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/doc/manifest.md +0 -0
  17. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/setup.cfg +0 -0
  18. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/__init__.py +0 -0
  19. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/binary.py +0 -0
  20. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/github.py +0 -0
  21. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/__init__.py +0 -0
  22. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/app.py +0 -0
  23. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/constants.py +0 -0
  24. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/errors.py +0 -0
  25. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/manifest.py +0 -0
  26. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/tests.py +0 -0
  27. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/use_cases.py +0 -0
  28. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/manifest/utils.py +0 -0
  29. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/serializers.py +0 -0
  30. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered/utils/__init__.py +0 -0
  31. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered.egg-info/SOURCES.txt +0 -0
  32. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered.egg-info/dependency_links.txt +0 -0
  33. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered.egg-info/entry_points.txt +0 -0
  34. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered.egg-info/requires.txt +0 -0
  35. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/src/ledgered.egg-info/top_level.txt +0 -0
  36. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/_data/Cargo.toml +0 -0
  37. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/_data/Makefile +0 -0
  38. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/_data/full_correct.toml +0 -0
  39. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/_data/ledger_app.toml +0 -0
  40. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/_data/minimal.toml +0 -0
  41. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/_data/one_leaf.toml +0 -0
  42. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/functional/__init__.py +0 -0
  43. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/functional/conftest.py +0 -0
  44. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/functional/manifest/__init__.py +0 -0
  45. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/__init__.py +0 -0
  46. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/manifest/__init__.py +0 -0
  47. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/manifest/test_app.py +0 -0
  48. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/manifest/test_manifest.py +0 -0
  49. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/manifest/test_tests.py +0 -0
  50. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/manifest/test_use_cases.py +0 -0
  51. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/test_binary.py +0 -0
  52. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/test_github.py +0 -0
  53. {ledgered-0.7.1.dev2 → ledgered-0.7.2.dev6}/tests/unit/test_serializers.py +0 -0
@@ -25,7 +25,7 @@ jobs:
25
25
  strategy:
26
26
  fail-fast: false
27
27
  matrix:
28
- python_version: ['3.8', '3.9', '3.10', '3.11']
28
+ python_version: ['3.9', '3.10', '3.11', '3.12', '3.13']
29
29
  steps:
30
30
  - name: Clone
31
31
  uses: actions/checkout@v4
@@ -69,8 +69,11 @@ jobs:
69
69
 
70
70
  - name: Build Ledgered Python package
71
71
  run: |
72
+ # Needed to workaround this bug https://github.com/pypa/setuptools/issues/4759
73
+ # To be removed when it's fixed
74
+ pip install -U packaging
72
75
  pip install --upgrade pip build twine
73
- python -m build; \
76
+ python -m build
74
77
  pip install .
75
78
  python -m twine check dist/*
76
79
  echo "TAG_VERSION=$(python -c 'from ledgered import __version__; print(__version__)')" >> "$GITHUB_ENV"
@@ -61,3 +61,4 @@ jobs:
61
61
  with:
62
62
  builtin: clear,rare
63
63
  check_filenames: true
64
+ ignore_words_list: assertIn,crate,
@@ -5,46 +5,60 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+
9
+ ## [0.8.0] - 2025-??-??
10
+
11
+ ### Added
12
+
13
+ - `ledger-manifest`: new `--url` argument allows to parse manifest from an application GH repository
14
+ rather than a local file.
15
+
16
+ ### Changed
17
+
18
+ - Package tested & published on Python3.12 and 3.13. Python 3.8 support is dropped.
19
+
20
+
8
21
  ## [0.7.1] - 2024-04-30
9
22
 
10
23
  ### Fixed
11
24
 
12
25
  - Clean error management when there is not `ledger_app.toml` manifest to access to on a given
13
- repository/branch
26
+ repository/branch.
27
+
14
28
 
15
29
  ## [0.7.0] - 2024-04-12
16
30
 
17
31
  ### Added
18
32
 
19
- - Added wrapper around GitHub API to ease manipulating Ledger application repositories
33
+ - Added wrapper around GitHub API to ease manipulating Ledger application repositories.
20
34
 
21
35
 
22
36
  ## [0.6.3] - 2024-03-26
23
37
 
24
38
  ### Fixed
25
39
 
26
- - ledger-binary: NanoS SDK has a unique `target_version` section.
40
+ - `ledger-binary`: NanoS SDK has a unique `target_version` section.
27
41
 
28
42
 
29
43
  ## [0.6.2] - 2024-03-26
30
44
 
31
45
  ### Fixed
32
46
 
33
- - ledger-binary: Striping occasional trailing newlines in metadata content.
47
+ - `ledger-binary`: Striping occasional trailing newlines in metadata content.
34
48
 
35
49
 
36
50
  ## [0.6.1] - 2024-03-26
37
51
 
38
52
  ### Fixed
39
53
 
40
- - ledger-binary: Adding Rust application specific metadata sections.
54
+ - `ledger-binary`: Adding Rust application specific metadata sections.
41
55
 
42
56
 
43
57
  ## [0.6.0] - 2024-03-26
44
58
 
45
59
  ### Added
46
60
 
47
- - ledger-binary: Adding an utilitary to parse embedded application ELF file metadatas.
61
+ - `ledger-binary`: Adding an utilitary to parse embedded application ELF file metadatas.
48
62
 
49
63
  ### Changed
50
64
 
@@ -55,7 +69,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
55
69
 
56
70
  ### Added
57
71
 
58
- - ledger-manifest: "Europa" is now a valid `app.devices` value.
72
+ - `ledger-manifest`: "Europa" is now a valid `app.devices` value.
59
73
 
60
74
  ### Removed
61
75
 
@@ -100,14 +114,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
100
114
 
101
115
  ### Fixed
102
116
 
103
- - ledger-manifest: typo `test` instead of `tests` was leading to runtime AttributeError.
117
+ - `ledger-manifest`: typo `test` instead of `tests` was leading to runtime AttributeError.
104
118
 
105
119
 
106
120
  ## [0.2.0] - 2023-10-19
107
121
 
108
122
  ### Changed
109
123
 
110
- - ledger-manifest: devices are output as a list "[...]" rather than a set "{...}" for easier
124
+ - `ledger-manifest`: devices are output as a list "[...]" rather than a set "{...}" for easier
111
125
  reusability.
112
126
 
113
127
 
@@ -115,5 +129,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
115
129
 
116
130
  ### Added
117
131
 
118
- - 'ledgered' library Python package
132
+ - `ledgered` library Python package
119
133
  - Application 'ledger_app.toml' manifest parser utilitary
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: ledgered
3
- Version: 0.7.1.dev2
3
+ Version: 0.7.2.dev6
4
4
  Summary: Python tools, utils, libraries, to be used with Ledger cryptodevices
5
5
  Author-email: Ledger <hello@ledger.fr>
6
6
  License: MIT License
@@ -27,14 +27,17 @@ License: MIT License
27
27
 
28
28
  Project-URL: Home, https://github.com/LedgerHQ/ledgered
29
29
  Classifier: License :: OSI Approved :: MIT License
30
- Classifier: Programming Language :: Python :: 3.8
30
+ Classifier: Programming Language :: Python :: 3
31
31
  Classifier: Programming Language :: Python :: 3.9
32
32
  Classifier: Programming Language :: Python :: 3.10
33
33
  Classifier: Programming Language :: Python :: 3.11
34
+ Classifier: Programming Language :: Python :: 3.12
35
+ Classifier: Programming Language :: Python :: 3.13
34
36
  Classifier: Operating System :: POSIX :: Linux
35
37
  Classifier: Operating System :: Microsoft :: Windows
36
38
  Classifier: Operating System :: MacOS :: MacOS X
37
- Requires-Python: >=3.7
39
+ Classifier: Typing :: Typed
40
+ Requires-Python: >=3.9
38
41
  Description-Content-Type: text/markdown
39
42
  License-File: LICENSE
40
43
  Requires-Dist: toml
@@ -1,6 +1,6 @@
1
1
  [build-system]
2
2
  requires = [
3
- "setuptools>=45",
3
+ "setuptools>=65",
4
4
  "setuptools_scm[toml]>=6.2",
5
5
  "wheel"
6
6
  ]
@@ -16,16 +16,19 @@ readme = { file = "README.md", content-type = "text/markdown" }
16
16
  license = { file = "LICENSE" }
17
17
  classifiers = [
18
18
  "License :: OSI Approved :: MIT License",
19
- "Programming Language :: Python :: 3.8",
19
+ "Programming Language :: Python :: 3",
20
20
  "Programming Language :: Python :: 3.9",
21
21
  "Programming Language :: Python :: 3.10",
22
22
  "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
23
25
  "Operating System :: POSIX :: Linux",
24
26
  "Operating System :: Microsoft :: Windows",
25
27
  "Operating System :: MacOS :: MacOS X",
28
+ "Typing :: Typed",
26
29
  ]
27
30
  dynamic = [ "version" ]
28
- requires-python = ">=3.7"
31
+ requires-python = ">=3.9"
29
32
  dependencies = [
30
33
  "toml",
31
34
  "pyelftools",
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.7.1.dev2'
16
- __version_tuple__ = version_tuple = (0, 7, 1, 'dev2')
15
+ __version__ = version = '0.7.2.dev6'
16
+ __version_tuple__ = version_tuple = (0, 7, 2, 'dev6')
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
  from typing import Dict
8
8
 
9
9
  from .constants import MANIFEST_FILE_NAME
10
+ from ..github import GitHubLedgerHQ
10
11
  from .manifest import Manifest
11
12
  from .utils import getLogger
12
13
 
@@ -41,7 +42,7 @@ def set_parser() -> ArgumentParser:
41
42
  "'ledger_app.toml' manifest")
42
43
 
43
44
  # generic options
44
- parser.add_argument('-v', '--verbose', action='count', default=0)
45
+ parser.add_argument("-v", "--verbose", action="count", default=0)
45
46
  parser.add_argument("-c",
46
47
  "--check",
47
48
  required=False,
@@ -52,37 +53,43 @@ def set_parser() -> ArgumentParser:
52
53
  # display options
53
54
  parser.add_argument("manifest",
54
55
  type=Path,
55
- help=f"The manifest file, generally '{MANIFEST_FILE_NAME}' at the root of "
56
- "the application's repository")
56
+ help=f"The manifest file (generally '{MANIFEST_FILE_NAME}' at the root of "
57
+ "the application's repository), or the name of the app if the `--url` "
58
+ "option is activated")
59
+ parser.add_argument("-u",
60
+ "--url",
61
+ action="store_true",
62
+ default=False,
63
+ help="Tells if the `manifest` is a repository HTTP URL rather than a file")
57
64
  parser.add_argument("-os",
58
65
  "--output-sdk",
59
66
  required=False,
60
- action='store_true',
67
+ action="store_true",
61
68
  default=False,
62
69
  help="outputs the SDK type")
63
70
  parser.add_argument("-ob",
64
71
  "--output-build-directory",
65
72
  required=False,
66
- action='store_true',
73
+ action="store_true",
67
74
  default=False,
68
75
  help="outputs the build directory (where the Makefile in C app, or the "
69
76
  "Cargo.toml in Rust app is expected to be)")
70
77
  parser.add_argument("-od",
71
78
  "--output-devices",
72
79
  required=False,
73
- action='store_true',
80
+ action="store_true",
74
81
  default=False,
75
82
  help="outputs the list of devices supported by the application")
76
83
  parser.add_argument("-otu",
77
84
  "--output-tests-unit-directory",
78
85
  required=False,
79
- action='store_true',
86
+ action="store_true",
80
87
  default=False,
81
88
  help="outputs the directory of the unit tests. Fails if none")
82
89
  parser.add_argument("-otp",
83
90
  "--output-tests-pytest-directory",
84
91
  required=False,
85
- action='store_true',
92
+ action="store_true",
86
93
  default=False,
87
94
  help="outputs the directory of the pytest (functional) tests. Fails if "
88
95
  "none")
@@ -108,11 +115,9 @@ def set_parser() -> ArgumentParser:
108
115
  return parser
109
116
 
110
117
 
111
- def main(): # pragma: no cover
118
+ def main() -> None: # pragma: no cover
112
119
  logger = getLogger()
113
120
  args = set_parser().parse_args()
114
- assert args.manifest.is_file(), f"'{args.manifest.resolve()}' does not appear to be a file."
115
- manifest = args.manifest.resolve()
116
121
 
117
122
  # verbosity
118
123
  if args.verbose == 1:
@@ -121,7 +126,14 @@ def main(): # pragma: no cover
121
126
  logger.setLevel(logging.DEBUG)
122
127
 
123
128
  logger.info("Loading the manifest")
124
- repo_manifest = Manifest.from_path(manifest)
129
+ repo_manifest: Manifest
130
+ if args.url:
131
+ repo_manifest = GitHubLedgerHQ().get_app(str(args.manifest)).manifest
132
+ else:
133
+ assert args.manifest.is_file(), f"'{args.manifest.resolve()}' does not appear to be a file."
134
+ manifest = args.manifest.resolve()
135
+
136
+ repo_manifest = Manifest.from_path(manifest)
125
137
 
126
138
  # check directory path against manifest data
127
139
  if args.check is not None:
@@ -131,7 +143,7 @@ def main(): # pragma: no cover
131
143
 
132
144
  # no check
133
145
  logger.info("Displaying manifest info")
134
- display_content = defaultdict(dict)
146
+ display_content: Dict = defaultdict(dict)
135
147
 
136
148
  if args.output_build_directory:
137
149
  display_content["build_directory"] = str(repo_manifest.app.build_directory)
@@ -142,7 +154,7 @@ def main(): # pragma: no cover
142
154
  display_content["devices"] = list(repo_manifest.app.devices)
143
155
 
144
156
  if args.output_use_cases is not None:
145
- use_cases = repo_manifest.use_cases.json
157
+ use_cases = repo_manifest.use_cases.json if repo_manifest.use_cases else dict()
146
158
  non_empty = len(use_cases) > 0
147
159
  if len(args.output_use_cases) != 0:
148
160
  use_cases = {k: v for (k, v) in use_cases.items() if k in args.output_use_cases}
@@ -152,7 +164,9 @@ def main(): # pragma: no cover
152
164
  display_content["use_cases"] = use_cases
153
165
 
154
166
  if args.output_tests_dependencies is not None:
155
- dependencies = repo_manifest.tests.dependencies.json
167
+ dependencies = dict()
168
+ if repo_manifest.tests is not None and repo_manifest.tests.dependencies is not None:
169
+ dependencies = repo_manifest.tests.dependencies.json
156
170
  non_empty = len(dependencies) > 0
157
171
  if len(args.output_tests_dependencies) != 0:
158
172
  dependencies = {
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: ledgered
3
- Version: 0.7.1.dev2
3
+ Version: 0.7.2.dev6
4
4
  Summary: Python tools, utils, libraries, to be used with Ledger cryptodevices
5
5
  Author-email: Ledger <hello@ledger.fr>
6
6
  License: MIT License
@@ -27,14 +27,17 @@ License: MIT License
27
27
 
28
28
  Project-URL: Home, https://github.com/LedgerHQ/ledgered
29
29
  Classifier: License :: OSI Approved :: MIT License
30
- Classifier: Programming Language :: Python :: 3.8
30
+ Classifier: Programming Language :: Python :: 3
31
31
  Classifier: Programming Language :: Python :: 3.9
32
32
  Classifier: Programming Language :: Python :: 3.10
33
33
  Classifier: Programming Language :: Python :: 3.11
34
+ Classifier: Programming Language :: Python :: 3.12
35
+ Classifier: Programming Language :: Python :: 3.13
34
36
  Classifier: Operating System :: POSIX :: Linux
35
37
  Classifier: Operating System :: Microsoft :: Windows
36
38
  Classifier: Operating System :: MacOS :: MacOS X
37
- Requires-Python: >=3.7
39
+ Classifier: Typing :: Typed
40
+ Requires-Python: >=3.9
38
41
  Description-Content-Type: text/markdown
39
42
  License-File: LICENSE
40
43
  Requires-Dist: toml
@@ -98,7 +98,8 @@ class TestCLIMain(TestCase):
98
98
  output_tests_unit_directory=False,
99
99
  output_tests_pytest_directory=False,
100
100
  output_tests_dependencies=None,
101
- json=False
101
+ json=False,
102
+ url=False,
102
103
  )
103
104
  self.patcher1 = patch("ledgered.manifest.cli.print", PrintMock())
104
105
  self.patcher2 = patch("ledgered.manifest.cli.set_parser")
@@ -216,6 +217,11 @@ class TestCLIMain(TestCase):
216
217
  with self.assertRaises(SystemExit):
217
218
  main()
218
219
 
220
+ def test_loading_from_url(self):
221
+ self.args.manifest = "app-boilerplate"
222
+ self.args.url = True
223
+ self.assertIsNone(main())
224
+
219
225
 
220
226
  class TestCLIset_parser(TestCase):
221
227
 
@@ -48,4 +48,4 @@ def test_exchange_variant(exchange):
48
48
 
49
49
  def test_starknet_makefile_path(gh):
50
50
  app = gh.get_app("app-starknet")
51
- assert app.makefile_path == Path("./Cargo.toml")
51
+ assert app.makefile_path == Path("./starknet/Cargo.toml")
File without changes
File without changes
File without changes
File without changes