ragger 1.40.2__tar.gz → 1.40.4__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 (178) hide show
  1. {ragger-1.40.2 → ragger-1.40.4}/.github/workflows/build_and_tests.yml +33 -3
  2. {ragger-1.40.2 → ragger-1.40.4}/.github/workflows/codeql-analysis.yml +4 -7
  3. {ragger-1.40.2 → ragger-1.40.4}/.github/workflows/fast-checks.yml +1 -1
  4. {ragger-1.40.2 → ragger-1.40.4}/CHANGELOG.md +12 -0
  5. {ragger-1.40.2/src/ragger.egg-info → ragger-1.40.4}/PKG-INFO +1 -1
  6. {ragger-1.40.2 → ragger-1.40.4}/ledger_app.toml +1 -1
  7. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/__version__.py +3 -3
  8. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/navigator/navigation_scenario.py +25 -30
  9. {ragger-1.40.2 → ragger-1.40.4/src/ragger.egg-info}/PKG-INFO +1 -1
  10. {ragger-1.40.2 → ragger-1.40.4}/src/ragger.egg-info/SOURCES.txt +5 -0
  11. ragger-1.40.4/tests/snapshots/apex_p/waiting_screen/00000.png +0 -0
  12. ragger-1.40.4/tests/snapshots/apex_p/waiting_screen/00001.png +0 -0
  13. ragger-1.40.4/tests/snapshots/apex_p/waiting_screen/00002.png +0 -0
  14. ragger-1.40.4/tests/snapshots/apex_p/waiting_screen/00003.png +0 -0
  15. ragger-1.40.4/tests/snapshots/apex_p/waiting_screen/00004.png +0 -0
  16. ragger-1.40.4/tests/snapshots/flex/waiting_screen/00000.png +0 -0
  17. ragger-1.40.4/tests/snapshots/flex/waiting_screen/00001.png +0 -0
  18. ragger-1.40.4/tests/snapshots/flex/waiting_screen/00002.png +0 -0
  19. ragger-1.40.4/tests/snapshots/flex/waiting_screen/00003.png +0 -0
  20. ragger-1.40.4/tests/snapshots/flex/waiting_screen/00004.png +0 -0
  21. ragger-1.40.4/tests/snapshots/stax/waiting_screen/00001.png +0 -0
  22. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/stax/waiting_screen/00002.png +0 -0
  23. ragger-1.40.4/tests/snapshots/stax/waiting_screen/00003.png +0 -0
  24. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/backend/test_physical_backend.py +1 -1
  25. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/utils/test_misc.py +1 -1
  26. ragger-1.40.2/tests/snapshots/flex/waiting_screen/00000.png +0 -0
  27. ragger-1.40.2/tests/snapshots/flex/waiting_screen/00001.png +0 -0
  28. ragger-1.40.2/tests/snapshots/flex/waiting_screen/00002.png +0 -0
  29. ragger-1.40.2/tests/snapshots/flex/waiting_screen/00003.png +0 -0
  30. ragger-1.40.2/tests/snapshots/flex/waiting_screen/00004.png +0 -0
  31. ragger-1.40.2/tests/snapshots/stax/waiting_screen/00001.png +0 -0
  32. ragger-1.40.2/tests/snapshots/stax/waiting_screen/00003.png +0 -0
  33. {ragger-1.40.2 → ragger-1.40.4}/.codeql-config.yaml +0 -0
  34. {ragger-1.40.2 → ragger-1.40.4}/.gitattributes +0 -0
  35. {ragger-1.40.2 → ragger-1.40.4}/.github/workflows/documentation.yml +0 -0
  36. {ragger-1.40.2 → ragger-1.40.4}/.github/workflows/force-rebase.yml +0 -0
  37. {ragger-1.40.2 → ragger-1.40.4}/.gitignore +0 -0
  38. {ragger-1.40.2 → ragger-1.40.4}/LICENSE +0 -0
  39. {ragger-1.40.2 → ragger-1.40.4}/MANIFEST.in +0 -0
  40. {ragger-1.40.2 → ragger-1.40.4}/README.md +0 -0
  41. {ragger-1.40.2 → ragger-1.40.4}/doc/Makefile +0 -0
  42. {ragger-1.40.2 → ragger-1.40.4}/doc/_static/layout.css +0 -0
  43. {ragger-1.40.2 → ragger-1.40.4}/doc/_templates/layout.html +0 -0
  44. {ragger-1.40.2 → ragger-1.40.4}/doc/architecture.rst +0 -0
  45. {ragger-1.40.2 → ragger-1.40.4}/doc/conf.py +0 -0
  46. {ragger-1.40.2 → ragger-1.40.4}/doc/faq.rst +0 -0
  47. {ragger-1.40.2 → ragger-1.40.4}/doc/glossary.rst +0 -0
  48. {ragger-1.40.2 → ragger-1.40.4}/doc/images/navigate.draw +0 -0
  49. {ragger-1.40.2 → ragger-1.40.4}/doc/images/navigate.svg +0 -0
  50. {ragger-1.40.2 → ragger-1.40.4}/doc/images/ragger.png +0 -0
  51. {ragger-1.40.2 → ragger-1.40.4}/doc/images/stax_infos.png +0 -0
  52. {ragger-1.40.2 → ragger-1.40.4}/doc/images/stax_welcome.png +0 -0
  53. {ragger-1.40.2 → ragger-1.40.4}/doc/images/usage.draw +0 -0
  54. {ragger-1.40.2 → ragger-1.40.4}/doc/images/usage.svg +0 -0
  55. {ragger-1.40.2 → ragger-1.40.4}/doc/index.rst +0 -0
  56. {ragger-1.40.2 → ragger-1.40.4}/doc/installation.rst +0 -0
  57. {ragger-1.40.2 → ragger-1.40.4}/doc/rationale.rst +0 -0
  58. {ragger-1.40.2 → ragger-1.40.4}/doc/source.rst +0 -0
  59. {ragger-1.40.2 → ragger-1.40.4}/doc/tutorial.rst +0 -0
  60. {ragger-1.40.2 → ragger-1.40.4}/doc/tutorial_conftest.rst +0 -0
  61. {ragger-1.40.2 → ragger-1.40.4}/doc/tutorial_installation.rst +0 -0
  62. {ragger-1.40.2 → ragger-1.40.4}/doc/tutorial_screen.rst +0 -0
  63. {ragger-1.40.2 → ragger-1.40.4}/pyproject.toml +0 -0
  64. {ragger-1.40.2 → ragger-1.40.4}/setup.cfg +0 -0
  65. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/__init__.py +0 -0
  66. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/backend/__init__.py +0 -0
  67. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/backend/interface.py +0 -0
  68. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/backend/ledgercomm.py +0 -0
  69. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/backend/ledgerwallet.py +0 -0
  70. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/backend/physical_backend.py +0 -0
  71. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/backend/speculos.py +0 -0
  72. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/backend/stub.py +0 -0
  73. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/bip/__init__.py +0 -0
  74. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/bip/path.py +0 -0
  75. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/bip/seed.py +0 -0
  76. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/conftest/__init__.py +0 -0
  77. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/conftest/base_conftest.py +0 -0
  78. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/conftest/configuration.py +0 -0
  79. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/error.py +0 -0
  80. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/firmware/__init__.py +0 -0
  81. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/firmware/structs.py +0 -0
  82. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/firmware/touch/__init__.py +0 -0
  83. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/firmware/touch/element.py +0 -0
  84. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/firmware/touch/layouts.py +0 -0
  85. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/firmware/touch/positions.py +0 -0
  86. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/firmware/touch/screen.py +0 -0
  87. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/firmware/touch/use_cases.py +0 -0
  88. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/__init__.py +0 -0
  89. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanos_body.png +0 -0
  90. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanos_leftbutton.png +0 -0
  91. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanos_rightbutton.png +0 -0
  92. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanosp_body.png +0 -0
  93. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanosp_leftbutton.png +0 -0
  94. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanosp_rightbutton.png +0 -0
  95. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanox_body.png +0 -0
  96. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanox_leftbutton.png +0 -0
  97. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/nanox_rightbutton.png +0 -0
  98. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/stax_body.png +0 -0
  99. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/swipe_left_action.png +0 -0
  100. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/swipe_right_action.png +0 -0
  101. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/assets/touch_action.png +0 -0
  102. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/interface.py +0 -0
  103. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/gui/process.py +0 -0
  104. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/logger.py +0 -0
  105. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/navigator/__init__.py +0 -0
  106. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/navigator/instruction.py +0 -0
  107. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/navigator/nano_navigator.py +0 -0
  108. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/navigator/navigator.py +0 -0
  109. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/navigator/touch_navigator.py +0 -0
  110. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/py.typed +0 -0
  111. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/utils/__init__.py +0 -0
  112. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/utils/misc.py +0 -0
  113. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/utils/packing.py +0 -0
  114. {ragger-1.40.2 → ragger-1.40.4}/src/ragger/utils/structs.py +0 -0
  115. {ragger-1.40.2 → ragger-1.40.4}/src/ragger.egg-info/dependency_links.txt +0 -0
  116. {ragger-1.40.2 → ragger-1.40.4}/src/ragger.egg-info/requires.txt +0 -0
  117. {ragger-1.40.2 → ragger-1.40.4}/src/ragger.egg-info/top_level.txt +0 -0
  118. {ragger-1.40.2 → ragger-1.40.4}/template/.dispatch_to_your_test_folder +0 -0
  119. {ragger-1.40.2 → ragger-1.40.4}/template/conftest.py +0 -0
  120. {ragger-1.40.2 → ragger-1.40.4}/template/usage.md +0 -0
  121. {ragger-1.40.2 → ragger-1.40.4}/tests/__init__.py +0 -0
  122. {ragger-1.40.2 → ragger-1.40.4}/tests/functional/__init__.py +0 -0
  123. {ragger-1.40.2 → ragger-1.40.4}/tests/functional/backend/__init__.py +0 -0
  124. {ragger-1.40.2 → ragger-1.40.4}/tests/functional/backend/test_speculos.py +0 -0
  125. {ragger-1.40.2 → ragger-1.40.4}/tests/functional/conftest.py +0 -0
  126. {ragger-1.40.2 → ragger-1.40.4}/tests/functional/navigator/__init__.py +0 -0
  127. {ragger-1.40.2 → ragger-1.40.4}/tests/functional/navigator/test_navigator.py +0 -0
  128. {ragger-1.40.2 → ragger-1.40.4}/tests/functional/test_boilerplate.py +0 -0
  129. {ragger-1.40.2 → ragger-1.40.4}/tests/pytest.ini +0 -0
  130. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/generic/00000.png +0 -0
  131. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/generic/00001.png +0 -0
  132. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/generic/00002.png +0 -0
  133. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/generic/00003.png +0 -0
  134. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/generic/00004.png +0 -0
  135. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare/00000.png +0 -0
  136. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare/00001.png +0 -0
  137. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare/00002.png +0 -0
  138. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare/00003.png +0 -0
  139. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare/00004.png +0 -0
  140. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare/00005.png +0 -0
  141. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare/00006.png +0 -0
  142. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare/00007.png +0 -0
  143. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare_no_golden/00000.png +0 -0
  144. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare_wrong_golden/00000.png +0 -0
  145. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_and_compare_wrong_golden/00001.png +0 -0
  146. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_until_text_and_compare/00000.png +0 -0
  147. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_until_text_and_compare/00001.png +0 -0
  148. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_until_text_and_compare/00002.png +0 -0
  149. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/nanos/test_navigate_until_text_and_compare/00003.png +0 -0
  150. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/stax/waiting_screen/00000.png +0 -0
  151. {ragger-1.40.2 → ragger-1.40.4}/tests/snapshots/stax/waiting_screen/00004.png +0 -0
  152. {ragger-1.40.2 → ragger-1.40.4}/tests/stubs.py +0 -0
  153. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/__init__.py +0 -0
  154. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/backend/__init__.py +0 -0
  155. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/backend/test_interface.py +0 -0
  156. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/backend/test_ledgercomm.py +0 -0
  157. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/backend/test_ledgerwallet.py +0 -0
  158. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/backend/test_speculos.py +0 -0
  159. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/backend/test_stub.py +0 -0
  160. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/bip/test_path.py +0 -0
  161. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/bip/test_seed.py +0 -0
  162. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/conftests/__init__.py +0 -0
  163. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/conftests/test_base_conftest.py +0 -0
  164. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/firmware/test_structs_Firmware.py +0 -0
  165. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/firmware/touch/test_element.py +0 -0
  166. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/firmware/touch/test_screen_FullScreen.py +0 -0
  167. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/firmware/touch/test_screen_MetaScreen.py +0 -0
  168. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/helpers.py +0 -0
  169. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/navigator/__init__.py +0 -0
  170. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/navigator/test_nano_navigator.py +0 -0
  171. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/navigator/test_navigation_scenario.py +0 -0
  172. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/navigator/test_navigator.py +0 -0
  173. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/navigator/test_touch_navigator.py +0 -0
  174. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/test_error_ApplicationError.py +0 -0
  175. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/utils/__init__.py +0 -0
  176. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/utils/test_packing.py +0 -0
  177. {ragger-1.40.2 → ragger-1.40.4}/tests/unit/utils/test_path.py +0 -0
  178. {ragger-1.40.2 → ragger-1.40.4}/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,18 @@ 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.4] - 2025-11-20
9
+
10
+ ### Fixed
11
+
12
+ - Fix navigation in functions `xxx_with_warning` with multiple warning screens for Nano on NBGL
13
+
14
+ ## [1.40.3] - 2025-11-06
15
+
16
+ ### Fixed
17
+
18
+ - Add new parameter in `navigation_scenario` functions `xxx_with_warning` to specify the number of warning screens
19
+
8
20
  ## [1.40.2] - 2025-09-09
9
21
 
10
22
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ragger
3
- Version: 1.40.2
3
+ Version: 1.40.4
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.4'
32
+ __version_tuple__ = version_tuple = (1, 40, 4)
33
33
 
34
- __commit_id__ = commit_id = 'g178742d51'
34
+ __commit_id__ = commit_id = 'gfbba4eeb8'
@@ -19,17 +19,24 @@ 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 = []
38
+ self.dismiss_warning += [NavInsID.RIGHT_CLICK] * (nb_warnings - 1)
39
+ self.dismiss_warning += [NavInsID.BOTH_CLICK]
33
40
  # navigation scenario when running an App compiled with nbgl sdk library
34
41
  if use_case == UseCase.ADDRESS_CONFIRMATION:
35
42
  self.pattern = r"^(Accept risk|Accept|Approve|Sign|Confirm)$" if approve else r"^(Cancel|Reject)$"
@@ -54,7 +61,7 @@ class NavigationScenarioData:
54
61
 
55
62
  elif device.touchable:
56
63
  self.navigation = NavInsID.SWIPE_CENTER_TO_LEFT
57
- self.dismiss_warning = [NavInsID.USE_CASE_CHOICE_REJECT]
64
+ self.dismiss_warning = [NavInsID.USE_CASE_CHOICE_REJECT] * nb_warnings
58
65
 
59
66
  if use_case == UseCase.ADDRESS_CONFIRMATION:
60
67
  if approve:
@@ -133,10 +140,7 @@ class NavigateWithScenario:
133
140
  test_name: Optional[str] = None,
134
141
  custom_screen_text: Optional[str] = None,
135
142
  do_comparison: bool = True):
136
- scenario = NavigationScenarioData(self.device,
137
- self.backend,
138
- UseCase.TX_REVIEW,
139
- approve=True)
143
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.TX_REVIEW, True)
140
144
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
141
145
 
142
146
  def review_approve_with_warning(self,
@@ -144,11 +148,10 @@ class NavigateWithScenario:
144
148
  test_name: Optional[str] = None,
145
149
  custom_screen_text: Optional[str] = None,
146
150
  do_comparison: bool = True,
147
- warning_path: str = "warning"):
148
- scenario = NavigationScenarioData(self.device,
149
- self.backend,
150
- UseCase.TX_REVIEW,
151
- approve=True)
151
+ warning_path: str = "warning",
152
+ nb_warnings: int = 1):
153
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.TX_REVIEW, True,
154
+ nb_warnings)
152
155
  self._navigate_warning(scenario, test_name, do_comparison, warning_path)
153
156
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
154
157
 
@@ -157,10 +160,7 @@ class NavigateWithScenario:
157
160
  test_name: Optional[str] = None,
158
161
  custom_screen_text: Optional[str] = None,
159
162
  do_comparison: bool = True):
160
- scenario = NavigationScenarioData(self.device,
161
- self.backend,
162
- UseCase.TX_REVIEW,
163
- approve=False)
163
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.TX_REVIEW, False)
164
164
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
165
165
 
166
166
  def review_reject_with_warning(self,
@@ -168,11 +168,10 @@ class NavigateWithScenario:
168
168
  test_name: Optional[str] = None,
169
169
  custom_screen_text: Optional[str] = None,
170
170
  do_comparison: bool = True,
171
- warning_path: str = "warning"):
172
- scenario = NavigationScenarioData(self.device,
173
- self.backend,
174
- UseCase.TX_REVIEW,
175
- approve=False)
171
+ warning_path: str = "warning",
172
+ nb_warnings: int = 1):
173
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.TX_REVIEW, False,
174
+ nb_warnings)
176
175
  self._navigate_warning(scenario, test_name, do_comparison, warning_path)
177
176
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
178
177
 
@@ -181,10 +180,8 @@ class NavigateWithScenario:
181
180
  test_name: Optional[str] = None,
182
181
  custom_screen_text: Optional[str] = None,
183
182
  do_comparison: bool = True):
184
- scenario = NavigationScenarioData(self.device,
185
- self.backend,
186
- UseCase.ADDRESS_CONFIRMATION,
187
- approve=True)
183
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.ADDRESS_CONFIRMATION,
184
+ True)
188
185
  self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
189
186
 
190
187
  def address_review_reject(self,
@@ -192,8 +189,6 @@ class NavigateWithScenario:
192
189
  test_name: Optional[str] = None,
193
190
  custom_screen_text: Optional[str] = None,
194
191
  do_comparison: bool = True):
195
- scenario = NavigationScenarioData(self.device,
196
- self.backend,
197
- UseCase.ADDRESS_CONFIRMATION,
198
- approve=False)
192
+ scenario = NavigationScenarioData(self.device, self.backend, UseCase.ADDRESS_CONFIRMATION,
193
+ False)
199
194
  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.4
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