ragger 1.40.2__tar.gz → 1.40.3__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 (173) hide show
  1. {ragger-1.40.2 → ragger-1.40.3}/.github/workflows/build_and_tests.yml +33 -3
  2. {ragger-1.40.2 → ragger-1.40.3}/.github/workflows/codeql-analysis.yml +4 -7
  3. {ragger-1.40.2 → ragger-1.40.3}/.github/workflows/fast-checks.yml +1 -1
  4. {ragger-1.40.2 → ragger-1.40.3}/CHANGELOG.md +6 -0
  5. {ragger-1.40.2/src/ragger.egg-info → ragger-1.40.3}/PKG-INFO +1 -1
  6. {ragger-1.40.2 → ragger-1.40.3}/ledger_app.toml +1 -1
  7. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/__version__.py +3 -3
  8. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/navigator/navigation_scenario.py +23 -30
  9. {ragger-1.40.2 → ragger-1.40.3/src/ragger.egg-info}/PKG-INFO +1 -1
  10. {ragger-1.40.2 → ragger-1.40.3}/src/ragger.egg-info/SOURCES.txt +5 -0
  11. ragger-1.40.3/tests/snapshots/apex_p/waiting_screen/00000.png +0 -0
  12. ragger-1.40.3/tests/snapshots/apex_p/waiting_screen/00001.png +0 -0
  13. ragger-1.40.3/tests/snapshots/apex_p/waiting_screen/00002.png +0 -0
  14. ragger-1.40.3/tests/snapshots/apex_p/waiting_screen/00003.png +0 -0
  15. ragger-1.40.3/tests/snapshots/apex_p/waiting_screen/00004.png +0 -0
  16. ragger-1.40.3/tests/snapshots/flex/waiting_screen/00001.png +0 -0
  17. ragger-1.40.3/tests/snapshots/stax/waiting_screen/00001.png +0 -0
  18. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/backend/test_physical_backend.py +1 -1
  19. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/utils/test_misc.py +1 -1
  20. ragger-1.40.2/tests/snapshots/flex/waiting_screen/00001.png +0 -0
  21. ragger-1.40.2/tests/snapshots/stax/waiting_screen/00001.png +0 -0
  22. {ragger-1.40.2 → ragger-1.40.3}/.codeql-config.yaml +0 -0
  23. {ragger-1.40.2 → ragger-1.40.3}/.gitattributes +0 -0
  24. {ragger-1.40.2 → ragger-1.40.3}/.github/workflows/documentation.yml +0 -0
  25. {ragger-1.40.2 → ragger-1.40.3}/.github/workflows/force-rebase.yml +0 -0
  26. {ragger-1.40.2 → ragger-1.40.3}/.gitignore +0 -0
  27. {ragger-1.40.2 → ragger-1.40.3}/LICENSE +0 -0
  28. {ragger-1.40.2 → ragger-1.40.3}/MANIFEST.in +0 -0
  29. {ragger-1.40.2 → ragger-1.40.3}/README.md +0 -0
  30. {ragger-1.40.2 → ragger-1.40.3}/doc/Makefile +0 -0
  31. {ragger-1.40.2 → ragger-1.40.3}/doc/_static/layout.css +0 -0
  32. {ragger-1.40.2 → ragger-1.40.3}/doc/_templates/layout.html +0 -0
  33. {ragger-1.40.2 → ragger-1.40.3}/doc/architecture.rst +0 -0
  34. {ragger-1.40.2 → ragger-1.40.3}/doc/conf.py +0 -0
  35. {ragger-1.40.2 → ragger-1.40.3}/doc/faq.rst +0 -0
  36. {ragger-1.40.2 → ragger-1.40.3}/doc/glossary.rst +0 -0
  37. {ragger-1.40.2 → ragger-1.40.3}/doc/images/navigate.draw +0 -0
  38. {ragger-1.40.2 → ragger-1.40.3}/doc/images/navigate.svg +0 -0
  39. {ragger-1.40.2 → ragger-1.40.3}/doc/images/ragger.png +0 -0
  40. {ragger-1.40.2 → ragger-1.40.3}/doc/images/stax_infos.png +0 -0
  41. {ragger-1.40.2 → ragger-1.40.3}/doc/images/stax_welcome.png +0 -0
  42. {ragger-1.40.2 → ragger-1.40.3}/doc/images/usage.draw +0 -0
  43. {ragger-1.40.2 → ragger-1.40.3}/doc/images/usage.svg +0 -0
  44. {ragger-1.40.2 → ragger-1.40.3}/doc/index.rst +0 -0
  45. {ragger-1.40.2 → ragger-1.40.3}/doc/installation.rst +0 -0
  46. {ragger-1.40.2 → ragger-1.40.3}/doc/rationale.rst +0 -0
  47. {ragger-1.40.2 → ragger-1.40.3}/doc/source.rst +0 -0
  48. {ragger-1.40.2 → ragger-1.40.3}/doc/tutorial.rst +0 -0
  49. {ragger-1.40.2 → ragger-1.40.3}/doc/tutorial_conftest.rst +0 -0
  50. {ragger-1.40.2 → ragger-1.40.3}/doc/tutorial_installation.rst +0 -0
  51. {ragger-1.40.2 → ragger-1.40.3}/doc/tutorial_screen.rst +0 -0
  52. {ragger-1.40.2 → ragger-1.40.3}/pyproject.toml +0 -0
  53. {ragger-1.40.2 → ragger-1.40.3}/setup.cfg +0 -0
  54. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/__init__.py +0 -0
  55. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/backend/__init__.py +0 -0
  56. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/backend/interface.py +0 -0
  57. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/backend/ledgercomm.py +0 -0
  58. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/backend/ledgerwallet.py +0 -0
  59. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/backend/physical_backend.py +0 -0
  60. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/backend/speculos.py +0 -0
  61. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/backend/stub.py +0 -0
  62. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/bip/__init__.py +0 -0
  63. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/bip/path.py +0 -0
  64. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/bip/seed.py +0 -0
  65. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/conftest/__init__.py +0 -0
  66. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/conftest/base_conftest.py +0 -0
  67. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/conftest/configuration.py +0 -0
  68. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/error.py +0 -0
  69. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/firmware/__init__.py +0 -0
  70. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/firmware/structs.py +0 -0
  71. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/firmware/touch/__init__.py +0 -0
  72. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/firmware/touch/element.py +0 -0
  73. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/firmware/touch/layouts.py +0 -0
  74. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/firmware/touch/positions.py +0 -0
  75. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/firmware/touch/screen.py +0 -0
  76. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/firmware/touch/use_cases.py +0 -0
  77. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/__init__.py +0 -0
  78. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanos_body.png +0 -0
  79. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanos_leftbutton.png +0 -0
  80. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanos_rightbutton.png +0 -0
  81. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanosp_body.png +0 -0
  82. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanosp_leftbutton.png +0 -0
  83. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanosp_rightbutton.png +0 -0
  84. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanox_body.png +0 -0
  85. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanox_leftbutton.png +0 -0
  86. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/nanox_rightbutton.png +0 -0
  87. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/stax_body.png +0 -0
  88. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/swipe_left_action.png +0 -0
  89. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/swipe_right_action.png +0 -0
  90. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/assets/touch_action.png +0 -0
  91. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/interface.py +0 -0
  92. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/gui/process.py +0 -0
  93. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/logger.py +0 -0
  94. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/navigator/__init__.py +0 -0
  95. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/navigator/instruction.py +0 -0
  96. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/navigator/nano_navigator.py +0 -0
  97. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/navigator/navigator.py +0 -0
  98. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/navigator/touch_navigator.py +0 -0
  99. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/py.typed +0 -0
  100. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/utils/__init__.py +0 -0
  101. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/utils/misc.py +0 -0
  102. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/utils/packing.py +0 -0
  103. {ragger-1.40.2 → ragger-1.40.3}/src/ragger/utils/structs.py +0 -0
  104. {ragger-1.40.2 → ragger-1.40.3}/src/ragger.egg-info/dependency_links.txt +0 -0
  105. {ragger-1.40.2 → ragger-1.40.3}/src/ragger.egg-info/requires.txt +0 -0
  106. {ragger-1.40.2 → ragger-1.40.3}/src/ragger.egg-info/top_level.txt +0 -0
  107. {ragger-1.40.2 → ragger-1.40.3}/template/.dispatch_to_your_test_folder +0 -0
  108. {ragger-1.40.2 → ragger-1.40.3}/template/conftest.py +0 -0
  109. {ragger-1.40.2 → ragger-1.40.3}/template/usage.md +0 -0
  110. {ragger-1.40.2 → ragger-1.40.3}/tests/__init__.py +0 -0
  111. {ragger-1.40.2 → ragger-1.40.3}/tests/functional/__init__.py +0 -0
  112. {ragger-1.40.2 → ragger-1.40.3}/tests/functional/backend/__init__.py +0 -0
  113. {ragger-1.40.2 → ragger-1.40.3}/tests/functional/backend/test_speculos.py +0 -0
  114. {ragger-1.40.2 → ragger-1.40.3}/tests/functional/conftest.py +0 -0
  115. {ragger-1.40.2 → ragger-1.40.3}/tests/functional/navigator/__init__.py +0 -0
  116. {ragger-1.40.2 → ragger-1.40.3}/tests/functional/navigator/test_navigator.py +0 -0
  117. {ragger-1.40.2 → ragger-1.40.3}/tests/functional/test_boilerplate.py +0 -0
  118. {ragger-1.40.2 → ragger-1.40.3}/tests/pytest.ini +0 -0
  119. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/flex/waiting_screen/00000.png +0 -0
  120. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/flex/waiting_screen/00002.png +0 -0
  121. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/flex/waiting_screen/00003.png +0 -0
  122. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/flex/waiting_screen/00004.png +0 -0
  123. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/generic/00000.png +0 -0
  124. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/generic/00001.png +0 -0
  125. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/generic/00002.png +0 -0
  126. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/generic/00003.png +0 -0
  127. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/generic/00004.png +0 -0
  128. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare/00000.png +0 -0
  129. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare/00001.png +0 -0
  130. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare/00002.png +0 -0
  131. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare/00003.png +0 -0
  132. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare/00004.png +0 -0
  133. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare/00005.png +0 -0
  134. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare/00006.png +0 -0
  135. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare/00007.png +0 -0
  136. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare_no_golden/00000.png +0 -0
  137. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare_wrong_golden/00000.png +0 -0
  138. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_and_compare_wrong_golden/00001.png +0 -0
  139. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_until_text_and_compare/00000.png +0 -0
  140. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_until_text_and_compare/00001.png +0 -0
  141. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_until_text_and_compare/00002.png +0 -0
  142. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/nanos/test_navigate_until_text_and_compare/00003.png +0 -0
  143. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/stax/waiting_screen/00000.png +0 -0
  144. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/stax/waiting_screen/00002.png +0 -0
  145. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/stax/waiting_screen/00003.png +0 -0
  146. {ragger-1.40.2 → ragger-1.40.3}/tests/snapshots/stax/waiting_screen/00004.png +0 -0
  147. {ragger-1.40.2 → ragger-1.40.3}/tests/stubs.py +0 -0
  148. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/__init__.py +0 -0
  149. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/backend/__init__.py +0 -0
  150. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/backend/test_interface.py +0 -0
  151. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/backend/test_ledgercomm.py +0 -0
  152. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/backend/test_ledgerwallet.py +0 -0
  153. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/backend/test_speculos.py +0 -0
  154. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/backend/test_stub.py +0 -0
  155. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/bip/test_path.py +0 -0
  156. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/bip/test_seed.py +0 -0
  157. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/conftests/__init__.py +0 -0
  158. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/conftests/test_base_conftest.py +0 -0
  159. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/firmware/test_structs_Firmware.py +0 -0
  160. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/firmware/touch/test_element.py +0 -0
  161. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/firmware/touch/test_screen_FullScreen.py +0 -0
  162. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/firmware/touch/test_screen_MetaScreen.py +0 -0
  163. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/helpers.py +0 -0
  164. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/navigator/__init__.py +0 -0
  165. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/navigator/test_nano_navigator.py +0 -0
  166. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/navigator/test_navigation_scenario.py +0 -0
  167. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/navigator/test_navigator.py +0 -0
  168. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/navigator/test_touch_navigator.py +0 -0
  169. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/test_error_ApplicationError.py +0 -0
  170. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/utils/__init__.py +0 -0
  171. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/utils/test_packing.py +0 -0
  172. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/utils/test_path.py +0 -0
  173. {ragger-1.40.2 → ragger-1.40.3}/tests/unit/utils/test_structs.py +0 -0
@@ -36,14 +36,36 @@ jobs:
36
36
  app_branch_name: nanos_baseline
37
37
  upload_app_binaries_artifact: boilerplate_binaries_nanos
38
38
 
39
+ prepare_matrix:
40
+ name: Prepare matrix from TOML file
41
+ runs-on: ubuntu-latest
42
+ outputs:
43
+ devices: ${{ steps.get_devices.outputs.devices }}
44
+ env:
45
+ APP_MANIFEST: "ledger_app.toml"
46
+
47
+ steps:
48
+ - name: Clone
49
+ uses: actions/checkout@v4
50
+ - name: Install ledgered
51
+ run: pip install ledgered
52
+ - name: Get devices from TOML
53
+ id: get_devices
54
+ run: |
55
+ # get device list as a single line json formatted value
56
+ compatible_devices="$(ledger-manifest --output-devices "${APP_MANIFEST}" -j | jq -rc '.devices')"
57
+
58
+ echo "devices=${compatible_devices}" | sed 's/+/p/' >> "${GITHUB_OUTPUT}"
59
+
39
60
  build_install_test:
40
61
  name: Install and test the library
41
- needs: [build_boilerplate_application, build_boilerplate_application_nanos]
62
+ needs: [prepare_matrix, build_boilerplate_application, build_boilerplate_application_nanos]
42
63
  runs-on: ubuntu-latest
43
64
  strategy:
44
65
  fail-fast: false
45
66
  matrix:
46
67
  python_version: ['3.9', '3.10', '3.11', '3.12', '3.13']
68
+ device: ${{ fromJson(needs.prepare_matrix.outputs.devices) }}
47
69
 
48
70
  steps:
49
71
  - name: Clone
@@ -64,13 +86,20 @@ jobs:
64
86
  pip install -U .[tests,all_backends]
65
87
  pip install -U "click>=8"
66
88
 
89
+ - name: Install speculos for Nanos
90
+ if: ${{ matrix.device == 'nanos' }}
91
+ run: |
92
+ pip install -U speculos==v0.25.5
93
+
67
94
  - name: Download app binaries
95
+ if: ${{ matrix.device != 'nanos' }}
68
96
  uses: actions/download-artifact@v4
69
97
  with:
70
98
  name: boilerplate_binaries
71
99
  path: ./build/
72
100
 
73
101
  - name: Download app binaries for Nano S
102
+ if: ${{ matrix.device == 'nanos' }}
74
103
  uses: actions/download-artifact@v4
75
104
  with:
76
105
  name: boilerplate_binaries_nanos
@@ -83,7 +112,7 @@ jobs:
83
112
  run: pytest -v --tb=short tests/unit --cov ragger --cov-report xml
84
113
 
85
114
  - name: Run functional tests and generate coverage
86
- run: pytest -v --tb=short tests/functional --cov ragger --cov-report xml --cov-append --device all
115
+ run: pytest -v --tb=short tests/functional --cov ragger --cov-report xml --cov-append --device ${{ matrix.device }}
87
116
 
88
117
  - name: Upload to codecov.io
89
118
  uses: codecov/codecov-action@v5
@@ -91,6 +120,7 @@ jobs:
91
120
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
92
121
  with:
93
122
  name: codecov-ragger
123
+ flags: ${{ matrix.device }}-py${{ matrix.python_version }}
94
124
 
95
125
  package_and_deploy:
96
126
  name: Build and deploy the Ragger Python package
@@ -100,4 +130,4 @@ jobs:
100
130
  package_name: ragger
101
131
  publish: ${{ startsWith(github.ref, 'refs/tags/') }}
102
132
  secrets:
103
- pypi_token: ${{ secrets.PYPI_PUBLIC_API_TOKEN }}
133
+ pypi_token: ${{ secrets.PYPI_PUBLIC_API_TOKEN }}
@@ -27,16 +27,13 @@ jobs:
27
27
  contents: read
28
28
  security-events: write
29
29
 
30
- strategy:
31
- fail-fast: false
32
-
33
30
  steps:
34
31
  - name: Checkout repository
35
32
  uses: actions/checkout@v4
36
33
 
37
34
  # Initializes the CodeQL tools for scanning.
38
35
  - name: Initialize CodeQL
39
- uses: github/codeql-action/init@v2
36
+ uses: github/codeql-action/init@v3
40
37
  with:
41
38
  languages: "python"
42
39
  # If you wish to specify custom queries, you can do so here or in a config file.
@@ -45,10 +42,10 @@ jobs:
45
42
  # queries: ./path/to/local/query, your-org/your-repo/queries@main
46
43
  queries: +security-and-quality
47
44
 
48
- # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
45
+ # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
49
46
  # If this step fails, then you should remove it and run the build manually (see below)
50
47
  - name: Autobuild
51
- uses: github/codeql-action/autobuild@v2
48
+ uses: github/codeql-action/autobuild@v3
52
49
 
53
50
  # ℹ️ Command-line programs to run using the OS shell.
54
51
  # 📚 https://git.io/JvXDl
@@ -62,6 +59,6 @@ jobs:
62
59
  # make release
63
60
 
64
61
  - name: Perform CodeQL Analysis
65
- uses: github/codeql-action/analyze@v2
62
+ uses: github/codeql-action/analyze@v3
66
63
  with:
67
64
  config-file: .codeql-config.yaml
@@ -64,7 +64,7 @@ jobs:
64
64
  - name: Clone
65
65
  uses: actions/checkout@v4
66
66
  - name: Check misspellings
67
- uses: codespell-project/actions-codespell@v1
67
+ uses: codespell-project/actions-codespell@v2
68
68
  with:
69
69
  builtin: clear,rare
70
70
  check_filenames: true
@@ -5,6 +5,12 @@ 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
+ ## [1.40.3] - 2025-11-06
9
+
10
+ ### Fixed
11
+
12
+ - Add new parameter in `navigation_scenario` functions `xxx_with_warning` to specify the number of warning screens
13
+
8
14
  ## [1.40.2] - 2025-09-09
9
15
 
10
16
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ragger
3
- Version: 1.40.2
3
+ Version: 1.40.3
4
4
  Summary: Testing framework using Speculos and LedgerComm as backends
5
5
  Author-email: Ledger <hello@ledger.fr>
6
6
  Project-URL: Homepage, https://github.com/LedgerHQ/ragger
@@ -2,4 +2,4 @@
2
2
  [app]
3
3
  build_directory = "./"
4
4
  sdk = "C"
5
- devices = ["nanos", "nanos+", "nanox", "stax", "flex"]
5
+ devices = ["nanos", "nanos+", "nanox", "stax", "flex", "apex_p"]
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.40.2'
32
- __version_tuple__ = version_tuple = (1, 40, 2)
31
+ __version__ = version = '1.40.3'
32
+ __version_tuple__ = version_tuple = (1, 40, 3)
33
33
 
34
- __commit_id__ = commit_id = 'g178742d51'
34
+ __commit_id__ = commit_id = 'g21c065416'
@@ -19,17 +19,22 @@ class NavigationScenarioData:
19
19
  dismiss_warning: Sequence[InstructionType]
20
20
  pattern: str = ""
21
21
 
22
- def __init__(self, device: Device, backend: BackendInterface, use_case: UseCase, approve: bool):
22
+ def __init__(self,
23
+ device: Device,
24
+ backend: BackendInterface,
25
+ use_case: UseCase,
26
+ approve: bool,
27
+ nb_warnings: int = 1):
23
28
  if device.is_nano:
24
29
  self.navigation = NavInsID.RIGHT_CLICK
25
30
  self.validation = [NavInsID.BOTH_CLICK]
26
31
 
27
32
  if backend.sdk_graphics == GraphicalLibrary.BAGL:
28
- self.dismiss_warning = [NavInsID.RIGHT_CLICK]
33
+ self.dismiss_warning = [NavInsID.RIGHT_CLICK] * nb_warnings
29
34
  # Legacy navigation scenario when running an App compiled with bagl sdk library
30
35
  self.pattern = r"^(Accept risk|Accept|Approve|Sign|Confirm)$" if approve else r"^(Cancel|Reject)$"
31
36
  else:
32
- self.dismiss_warning = [NavInsID.BOTH_CLICK]
37
+ self.dismiss_warning = [NavInsID.BOTH_CLICK] * nb_warnings
33
38
  # navigation scenario when running an App compiled with nbgl sdk library
34
39
  if use_case == UseCase.ADDRESS_CONFIRMATION:
35
40
  self.pattern = r"^(Accept risk|Accept|Approve|Sign|Confirm)$" if approve else r"^(Cancel|Reject)$"
@@ -54,7 +59,7 @@ class NavigationScenarioData:
54
59
 
55
60
  elif device.touchable:
56
61
  self.navigation = NavInsID.SWIPE_CENTER_TO_LEFT
57
- self.dismiss_warning = [NavInsID.USE_CASE_CHOICE_REJECT]
62
+ self.dismiss_warning = [NavInsID.USE_CASE_CHOICE_REJECT] * nb_warnings
58
63
 
59
64
  if use_case == UseCase.ADDRESS_CONFIRMATION:
60
65
  if approve:
@@ -133,10 +138,7 @@ class NavigateWithScenario:
133
138
  test_name: Optional[str] = None,
134
139
  custom_screen_text: Optional[str] = None,
135
140
  do_comparison: bool = True):
136
- scenario = NavigationScenarioData(self.device,
137
- self.backend,
138
- UseCase.TX_REVIEW,
139
- approve=True)
141
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.TX_REVIEW, True)
140
142
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
141
143
 
142
144
  def review_approve_with_warning(self,
@@ -144,11 +146,10 @@ class NavigateWithScenario:
144
146
  test_name: Optional[str] = None,
145
147
  custom_screen_text: Optional[str] = None,
146
148
  do_comparison: bool = True,
147
- warning_path: str = "warning"):
148
- scenario = NavigationScenarioData(self.device,
149
- self.backend,
150
- UseCase.TX_REVIEW,
151
- approve=True)
149
+ warning_path: str = "warning",
150
+ nb_warnings: int = 1):
151
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.TX_REVIEW, True,
152
+ nb_warnings)
152
153
  self._navigate_warning(scenario, test_name, do_comparison, warning_path)
153
154
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
154
155
 
@@ -157,10 +158,7 @@ class NavigateWithScenario:
157
158
  test_name: Optional[str] = None,
158
159
  custom_screen_text: Optional[str] = None,
159
160
  do_comparison: bool = True):
160
- scenario = NavigationScenarioData(self.device,
161
- self.backend,
162
- UseCase.TX_REVIEW,
163
- approve=False)
161
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.TX_REVIEW, False)
164
162
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
165
163
 
166
164
  def review_reject_with_warning(self,
@@ -168,11 +166,10 @@ class NavigateWithScenario:
168
166
  test_name: Optional[str] = None,
169
167
  custom_screen_text: Optional[str] = None,
170
168
  do_comparison: bool = True,
171
- warning_path: str = "warning"):
172
- scenario = NavigationScenarioData(self.device,
173
- self.backend,
174
- UseCase.TX_REVIEW,
175
- approve=False)
169
+ warning_path: str = "warning",
170
+ nb_warnings: int = 1):
171
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.TX_REVIEW, False,
172
+ nb_warnings)
176
173
  self._navigate_warning(scenario, test_name, do_comparison, warning_path)
177
174
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
178
175
 
@@ -181,10 +178,8 @@ class NavigateWithScenario:
181
178
  test_name: Optional[str] = None,
182
179
  custom_screen_text: Optional[str] = None,
183
180
  do_comparison: bool = True):
184
- scenario = NavigationScenarioData(self.device,
185
- self.backend,
186
- UseCase.ADDRESS_CONFIRMATION,
187
- approve=True)
181
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.ADDRESS_CONFIRMATION,
182
+ True)
188
183
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
189
184
 
190
185
  def address_review_reject(self,
@@ -192,8 +187,6 @@ class NavigateWithScenario:
192
187
  test_name: Optional[str] = None,
193
188
  custom_screen_text: Optional[str] = None,
194
189
  do_comparison: bool = True):
195
- scenario = NavigationScenarioData(self.device,
196
- self.backend,
197
- UseCase.ADDRESS_CONFIRMATION,
198
- approve=False)
190
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.ADDRESS_CONFIRMATION,
191
+ False)
199
192
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ragger
3
- Version: 1.40.2
3
+ Version: 1.40.3
4
4
  Summary: Testing framework using Speculos and LedgerComm as backends
5
5
  Author-email: Ledger <hello@ledger.fr>
6
6
  Project-URL: Homepage, https://github.com/LedgerHQ/ragger
@@ -104,6 +104,11 @@ tests/functional/backend/__init__.py
104
104
  tests/functional/backend/test_speculos.py
105
105
  tests/functional/navigator/__init__.py
106
106
  tests/functional/navigator/test_navigator.py
107
+ tests/snapshots/apex_p/waiting_screen/00000.png
108
+ tests/snapshots/apex_p/waiting_screen/00001.png
109
+ tests/snapshots/apex_p/waiting_screen/00002.png
110
+ tests/snapshots/apex_p/waiting_screen/00003.png
111
+ tests/snapshots/apex_p/waiting_screen/00004.png
107
112
  tests/snapshots/flex/waiting_screen/00000.png
108
113
  tests/snapshots/flex/waiting_screen/00001.png
109
114
  tests/snapshots/flex/waiting_screen/00002.png
@@ -22,7 +22,7 @@ class StubPhysicalBackend(PhysicalBackend):
22
22
  def receive(self) -> RAPDU:
23
23
  return RAPDU(0x9000, b"")
24
24
 
25
- def exchange_raw(self, data: bytes = b"") -> RAPDU:
25
+ def exchange_raw(self, data: bytes = b"", tick_timeout: int = 0) -> RAPDU:
26
26
  return RAPDU(0x9000, b"")
27
27
 
28
28
  @contextmanager
@@ -2,7 +2,7 @@ import os
2
2
  import subprocess
3
3
  from pathlib import Path
4
4
  from unittest import TestCase
5
- from unittest.mock import MagicMock, patch
5
+ from unittest.mock import MagicMock
6
6
 
7
7
  from ragger.error import ExceptionRAPDU
8
8
  from ragger.utils import misc
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes