provablyfine 0.1.0__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 (246) hide show
  1. provablyfine-0.1.0/.github/workflows/ci.yml +48 -0
  2. provablyfine-0.1.0/.github/workflows/release.yml +148 -0
  3. provablyfine-0.1.0/.gitignore +15 -0
  4. provablyfine-0.1.0/.pre-commit-config.yaml +14 -0
  5. provablyfine-0.1.0/LICENCE.md +660 -0
  6. provablyfine-0.1.0/Makefile +51 -0
  7. provablyfine-0.1.0/PKG-INFO +133 -0
  8. provablyfine-0.1.0/README.md +94 -0
  9. provablyfine-0.1.0/RELEASE.md +41 -0
  10. provablyfine-0.1.0/docs/getting-started.md +144 -0
  11. provablyfine-0.1.0/docs/index.md +37 -0
  12. provablyfine-0.1.0/docs/javascripts/version-banner.js +25 -0
  13. provablyfine-0.1.0/docs/js/clipboard.js +13 -0
  14. provablyfine-0.1.0/mkdocs.yml +63 -0
  15. provablyfine-0.1.0/podman/pf-host.Containerfile +16 -0
  16. provablyfine-0.1.0/podman/scripts/detect-sshd-port.sh +42 -0
  17. provablyfine-0.1.0/podman/units/pf-host-bastion.service +22 -0
  18. provablyfine-0.1.0/podman/units/pf-host-init.service +17 -0
  19. provablyfine-0.1.0/podman/units/pf-host-init.socket +10 -0
  20. provablyfine-0.1.0/podman/units/pf-host-refresh.service +15 -0
  21. provablyfine-0.1.0/podman/units/pf-host-refresh.timer +10 -0
  22. provablyfine-0.1.0/pyproject.toml +139 -0
  23. provablyfine-0.1.0/scripts/check-imports +29 -0
  24. provablyfine-0.1.0/scripts/pf +32 -0
  25. provablyfine-0.1.0/scripts/pf-bastion +30 -0
  26. provablyfine-0.1.0/scripts/pf-dev +33 -0
  27. provablyfine-0.1.0/scripts/pf-server +34 -0
  28. provablyfine-0.1.0/scripts/pfa +33 -0
  29. provablyfine-0.1.0/scripts/pfat +31 -0
  30. provablyfine-0.1.0/scripts/rotate +28 -0
  31. provablyfine-0.1.0/src/provablyfine/__init__.py +0 -0
  32. provablyfine-0.1.0/src/provablyfine/anet/__init__.py +5 -0
  33. provablyfine-0.1.0/src/provablyfine/anet/base.py +52 -0
  34. provablyfine-0.1.0/src/provablyfine/anet/conftest.py +137 -0
  35. provablyfine-0.1.0/src/provablyfine/anet/exceptions.py +2 -0
  36. provablyfine-0.1.0/src/provablyfine/anet/http.py +130 -0
  37. provablyfine-0.1.0/src/provablyfine/anet/mux.py +458 -0
  38. provablyfine-0.1.0/src/provablyfine/anet/socket.py +88 -0
  39. provablyfine-0.1.0/src/provablyfine/anet/sockets.py +57 -0
  40. provablyfine-0.1.0/src/provablyfine/anet/ssl.py +182 -0
  41. provablyfine-0.1.0/src/provablyfine/anet/stream.py +48 -0
  42. provablyfine-0.1.0/src/provablyfine/anet/test_http.py +232 -0
  43. provablyfine-0.1.0/src/provablyfine/anet/test_mux.py +403 -0
  44. provablyfine-0.1.0/src/provablyfine/anet/test_socket.py +152 -0
  45. provablyfine-0.1.0/src/provablyfine/anet/test_ssl.py +192 -0
  46. provablyfine-0.1.0/src/provablyfine/anet/test_stream.py +238 -0
  47. provablyfine-0.1.0/src/provablyfine/api/__init__.py +0 -0
  48. provablyfine-0.1.0/src/provablyfine/api/app.py +189 -0
  49. provablyfine-0.1.0/src/provablyfine/api/app_db.py +372 -0
  50. provablyfine-0.1.0/src/provablyfine/api/config.py +64 -0
  51. provablyfine-0.1.0/src/provablyfine/api/context.py +109 -0
  52. provablyfine-0.1.0/src/provablyfine/api/converters.py +586 -0
  53. provablyfine-0.1.0/src/provablyfine/api/crypto_policy.py +9 -0
  54. provablyfine-0.1.0/src/provablyfine/api/db.py +225 -0
  55. provablyfine-0.1.0/src/provablyfine/api/dependencies.py +36 -0
  56. provablyfine-0.1.0/src/provablyfine/api/endpoints/__init__.py +37 -0
  57. provablyfine-0.1.0/src/provablyfine/api/endpoints/audit_log.py +23 -0
  58. provablyfine-0.1.0/src/provablyfine/api/endpoints/auth.py +92 -0
  59. provablyfine-0.1.0/src/provablyfine/api/endpoints/auth_endpoint.py +158 -0
  60. provablyfine-0.1.0/src/provablyfine/api/endpoints/auth_http_sig.py +92 -0
  61. provablyfine-0.1.0/src/provablyfine/api/endpoints/auth_oauth2.py +258 -0
  62. provablyfine-0.1.0/src/provablyfine/api/endpoints/auth_oidc.py +180 -0
  63. provablyfine-0.1.0/src/provablyfine/api/endpoints/bastion.py +88 -0
  64. provablyfine-0.1.0/src/provablyfine/api/endpoints/boundary.py +151 -0
  65. provablyfine-0.1.0/src/provablyfine/api/endpoints/debug.py +21 -0
  66. provablyfine-0.1.0/src/provablyfine/api/endpoints/directory.py +29 -0
  67. provablyfine-0.1.0/src/provablyfine/api/endpoints/identity.py +321 -0
  68. provablyfine-0.1.0/src/provablyfine/api/endpoints/initialize.py +182 -0
  69. provablyfine-0.1.0/src/provablyfine/api/endpoints/public.py +30 -0
  70. provablyfine-0.1.0/src/provablyfine/api/endpoints/role.py +135 -0
  71. provablyfine-0.1.0/src/provablyfine/api/endpoints/ssh.py +265 -0
  72. provablyfine-0.1.0/src/provablyfine/api/endpoints/tag.py +65 -0
  73. provablyfine-0.1.0/src/provablyfine/api/endpoints/tenant.py +152 -0
  74. provablyfine-0.1.0/src/provablyfine/api/grant.py +503 -0
  75. provablyfine-0.1.0/src/provablyfine/api/middleware.py +43 -0
  76. provablyfine-0.1.0/src/provablyfine/api/model/__init__.py +27 -0
  77. provablyfine-0.1.0/src/provablyfine/api/model/audit_log.py +42 -0
  78. provablyfine-0.1.0/src/provablyfine/api/model/auth_config.py +77 -0
  79. provablyfine-0.1.0/src/provablyfine/api/model/bastion.py +146 -0
  80. provablyfine-0.1.0/src/provablyfine/api/model/boundary.py +110 -0
  81. provablyfine-0.1.0/src/provablyfine/api/model/denylist.py +21 -0
  82. provablyfine-0.1.0/src/provablyfine/api/model/grant.py +229 -0
  83. provablyfine-0.1.0/src/provablyfine/api/model/identity.py +131 -0
  84. provablyfine-0.1.0/src/provablyfine/api/model/identity_invitation_key.py +74 -0
  85. provablyfine-0.1.0/src/provablyfine/api/model/oidc_key.py +47 -0
  86. provablyfine-0.1.0/src/provablyfine/api/model/role.py +109 -0
  87. provablyfine-0.1.0/src/provablyfine/api/model/signing_key.py +38 -0
  88. provablyfine-0.1.0/src/provablyfine/api/model/utils.py +13 -0
  89. provablyfine-0.1.0/src/provablyfine/api/oauth2_providers.py +8 -0
  90. provablyfine-0.1.0/src/provablyfine/api/registry_db.py +63 -0
  91. provablyfine-0.1.0/src/provablyfine/api/responses.py +34 -0
  92. provablyfine-0.1.0/src/provablyfine/api/rotate.py +80 -0
  93. provablyfine-0.1.0/src/provablyfine/api/schemas/__init__.py +17 -0
  94. provablyfine-0.1.0/src/provablyfine/api/schemas/audit.py +20 -0
  95. provablyfine-0.1.0/src/provablyfine/api/schemas/auth.py +112 -0
  96. provablyfine-0.1.0/src/provablyfine/api/schemas/base.py +7 -0
  97. provablyfine-0.1.0/src/provablyfine/api/schemas/bastion.py +42 -0
  98. provablyfine-0.1.0/src/provablyfine/api/schemas/boundary.py +44 -0
  99. provablyfine-0.1.0/src/provablyfine/api/schemas/directory.py +33 -0
  100. provablyfine-0.1.0/src/provablyfine/api/schemas/grant.py +196 -0
  101. provablyfine-0.1.0/src/provablyfine/api/schemas/identity.py +99 -0
  102. provablyfine-0.1.0/src/provablyfine/api/schemas/jwk.py +34 -0
  103. provablyfine-0.1.0/src/provablyfine/api/schemas/problem.py +10 -0
  104. provablyfine-0.1.0/src/provablyfine/api/schemas/role.py +45 -0
  105. provablyfine-0.1.0/src/provablyfine/api/schemas/ssh.py +43 -0
  106. provablyfine-0.1.0/src/provablyfine/api/schemas/tag.py +30 -0
  107. provablyfine-0.1.0/src/provablyfine/api/schemas/tenant.py +28 -0
  108. provablyfine-0.1.0/src/provablyfine/api/server.py +65 -0
  109. provablyfine-0.1.0/src/provablyfine/api/signature.py +264 -0
  110. provablyfine-0.1.0/src/provablyfine/api/test_grant.py +579 -0
  111. provablyfine-0.1.0/src/provablyfine/base64url.py +20 -0
  112. provablyfine-0.1.0/src/provablyfine/bastion/__init__.py +3 -0
  113. provablyfine-0.1.0/src/provablyfine/bastion/app.py +179 -0
  114. provablyfine-0.1.0/src/provablyfine/bastion/atomic.py +28 -0
  115. provablyfine-0.1.0/src/provablyfine/bastion/control_app.py +68 -0
  116. provablyfine-0.1.0/src/provablyfine/bastion/exceptions.py +2 -0
  117. provablyfine-0.1.0/src/provablyfine/bastion/fdstore.py +82 -0
  118. provablyfine-0.1.0/src/provablyfine/bastion/http.py +204 -0
  119. provablyfine-0.1.0/src/provablyfine/bastion/relay.py +232 -0
  120. provablyfine-0.1.0/src/provablyfine/bastion/server.py +135 -0
  121. provablyfine-0.1.0/src/provablyfine/bastion/systemd.py +72 -0
  122. provablyfine-0.1.0/src/provablyfine/bastion/test_atomic.py +97 -0
  123. provablyfine-0.1.0/src/provablyfine/bastion/trusted_key.py +55 -0
  124. provablyfine-0.1.0/src/provablyfine/cli/__init__.py +0 -0
  125. provablyfine-0.1.0/src/provablyfine/cli/grant.py +38 -0
  126. provablyfine-0.1.0/src/provablyfine/cli/login.py +213 -0
  127. provablyfine-0.1.0/src/provablyfine/cli/pf/__init__.py +0 -0
  128. provablyfine-0.1.0/src/provablyfine/cli/pf/bastion_cli.py +274 -0
  129. provablyfine-0.1.0/src/provablyfine/cli/pf/dev_bastion_cli.py +55 -0
  130. provablyfine-0.1.0/src/provablyfine/cli/pf/main.py +147 -0
  131. provablyfine-0.1.0/src/provablyfine/cli/pf/openssh_cli.py +93 -0
  132. provablyfine-0.1.0/src/provablyfine/cli/pf/openssh_host_init.py +249 -0
  133. provablyfine-0.1.0/src/provablyfine/cli/pf/ssh_cli.py +200 -0
  134. provablyfine-0.1.0/src/provablyfine/cli/pfa/__init__.py +0 -0
  135. provablyfine-0.1.0/src/provablyfine/cli/pfa/audit_log_cli.py +56 -0
  136. provablyfine-0.1.0/src/provablyfine/cli/pfa/auth_cli.py +173 -0
  137. provablyfine-0.1.0/src/provablyfine/cli/pfa/bastion_cli.py +115 -0
  138. provablyfine-0.1.0/src/provablyfine/cli/pfa/boundary_cli.py +186 -0
  139. provablyfine-0.1.0/src/provablyfine/cli/pfa/grant_cli.py +278 -0
  140. provablyfine-0.1.0/src/provablyfine/cli/pfa/identity_cli.py +220 -0
  141. provablyfine-0.1.0/src/provablyfine/cli/pfa/main.py +149 -0
  142. provablyfine-0.1.0/src/provablyfine/cli/pfa/role_cli.py +200 -0
  143. provablyfine-0.1.0/src/provablyfine/cli/pfa/tag_cli.py +90 -0
  144. provablyfine-0.1.0/src/provablyfine/cli/pfa/tenant_cli.py +103 -0
  145. provablyfine-0.1.0/src/provablyfine/cli/yaml_utils.py +18 -0
  146. provablyfine-0.1.0/src/provablyfine/client/__init__.py +5 -0
  147. provablyfine-0.1.0/src/provablyfine/client/aio.py +311 -0
  148. provablyfine-0.1.0/src/provablyfine/client/configuration.py +31 -0
  149. provablyfine-0.1.0/src/provablyfine/client/exceptions.py +6 -0
  150. provablyfine-0.1.0/src/provablyfine/client/http_client.py +365 -0
  151. provablyfine-0.1.0/src/provablyfine/client/schemas.py +629 -0
  152. provablyfine-0.1.0/src/provablyfine/client/ssh_utils.py +30 -0
  153. provablyfine-0.1.0/src/provablyfine/client/sync.py +688 -0
  154. provablyfine-0.1.0/src/provablyfine/jwk.py +405 -0
  155. provablyfine-0.1.0/src/provablyfine/log.py +139 -0
  156. provablyfine-0.1.0/src/provablyfine/ssh/__init__.py +3 -0
  157. provablyfine-0.1.0/src/provablyfine/ssh/agent.py +143 -0
  158. provablyfine-0.1.0/src/provablyfine/ssh/buffer.py +94 -0
  159. provablyfine-0.1.0/src/provablyfine/ssh/cert.py +213 -0
  160. provablyfine-0.1.0/src/provablyfine/ssh/constants.py +7 -0
  161. provablyfine-0.1.0/src/provablyfine/ssh/exceptions.py +6 -0
  162. provablyfine-0.1.0/src/provablyfine/ssh/serde.py +143 -0
  163. provablyfine-0.1.0/src/provablyfine/ssh/test_buffer.py +47 -0
  164. provablyfine-0.1.0/src/provablyfine/ssh/test_serde.py +170 -0
  165. provablyfine-0.1.0/src/provablyfine/ssh/test_ssh_keygen.py +314 -0
  166. provablyfine-0.1.0/src/provablyfine/test_jwk.py +253 -0
  167. provablyfine-0.1.0/src/provablyfine/tui/__init__.py +0 -0
  168. provablyfine-0.1.0/src/provablyfine/tui/_utils.py +4 -0
  169. provablyfine-0.1.0/src/provablyfine/tui/app.py +74 -0
  170. provablyfine-0.1.0/src/provablyfine/tui/async_client.py +66 -0
  171. provablyfine-0.1.0/src/provablyfine/tui/audit_log_list.py +43 -0
  172. provablyfine-0.1.0/src/provablyfine/tui/auth_list.py +219 -0
  173. provablyfine-0.1.0/src/provablyfine/tui/auth_view.py +116 -0
  174. provablyfine-0.1.0/src/provablyfine/tui/auto_complete.py +75 -0
  175. provablyfine-0.1.0/src/provablyfine/tui/base.py +39 -0
  176. provablyfine-0.1.0/src/provablyfine/tui/bastion_list.py +134 -0
  177. provablyfine-0.1.0/src/provablyfine/tui/bastion_view.py +174 -0
  178. provablyfine-0.1.0/src/provablyfine/tui/boundary_list.py +118 -0
  179. provablyfine-0.1.0/src/provablyfine/tui/boundary_view.py +198 -0
  180. provablyfine-0.1.0/src/provablyfine/tui/checkbox_input.py +107 -0
  181. provablyfine-0.1.0/src/provablyfine/tui/clipboard.py +44 -0
  182. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/__init__.py +24 -0
  183. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/base.py +242 -0
  184. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/boundary.py +77 -0
  185. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/identity.py +128 -0
  186. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/role.py +77 -0
  187. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/screens.py +89 -0
  188. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/ssh_command.py +53 -0
  189. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/ssh_port_forward.py +43 -0
  190. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/ssh_shell.py +57 -0
  191. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/tag.py +66 -0
  192. provablyfine-0.1.0/src/provablyfine/tui/grant_edit/tenant.py +73 -0
  193. provablyfine-0.1.0/src/provablyfine/tui/grant_list.py +155 -0
  194. provablyfine-0.1.0/src/provablyfine/tui/header.py +72 -0
  195. provablyfine-0.1.0/src/provablyfine/tui/home.py +70 -0
  196. provablyfine-0.1.0/src/provablyfine/tui/identity_list.py +220 -0
  197. provablyfine-0.1.0/src/provablyfine/tui/identity_view.py +174 -0
  198. provablyfine-0.1.0/src/provablyfine/tui/member_list.py +49 -0
  199. provablyfine-0.1.0/src/provablyfine/tui/relogin.py +256 -0
  200. provablyfine-0.1.0/src/provablyfine/tui/role_list.py +117 -0
  201. provablyfine-0.1.0/src/provablyfine/tui/role_view.py +194 -0
  202. provablyfine-0.1.0/src/provablyfine/tui/setup.py +380 -0
  203. provablyfine-0.1.0/src/provablyfine/tui/tag_list.py +94 -0
  204. provablyfine-0.1.0/src/provablyfine/tui/tenant_list.py +101 -0
  205. provablyfine-0.1.0/src/provablyfine/tui/test_clipboard.py +30 -0
  206. provablyfine-0.1.0/src/provablyfine/tui/test_utils.py +17 -0
  207. provablyfine-0.1.0/tests/.gitignore +1 -0
  208. provablyfine-0.1.0/tests/__init__.py +0 -0
  209. provablyfine-0.1.0/tests/access-control-identity-create.t.jinja +26 -0
  210. provablyfine-0.1.0/tests/access-control-identity-delete.t.jinja +50 -0
  211. provablyfine-0.1.0/tests/access-control-identity-fixture.sh +33 -0
  212. provablyfine-0.1.0/tests/access-control-identity-invite.t.jinja +29 -0
  213. provablyfine-0.1.0/tests/access-control-identity-read.t.jinja +19 -0
  214. provablyfine-0.1.0/tests/access-control-identity-tag.t.jinja +41 -0
  215. provablyfine-0.1.0/tests/access-control-identity-update.t.jinja +25 -0
  216. provablyfine-0.1.0/tests/access-control-identity.t +27 -0
  217. provablyfine-0.1.0/tests/access-control-tag.t.jinja +93 -0
  218. provablyfine-0.1.0/tests/audit-log.t +45 -0
  219. provablyfine-0.1.0/tests/auth.t +202 -0
  220. provablyfine-0.1.0/tests/bastion-crud.t +140 -0
  221. provablyfine-0.1.0/tests/bastion.t +51 -0
  222. provablyfine-0.1.0/tests/bastion_reload.t +96 -0
  223. provablyfine-0.1.0/tests/bastion_restart.t +79 -0
  224. provablyfine-0.1.0/tests/boundaries.t +139 -0
  225. provablyfine-0.1.0/tests/conftest.py +591 -0
  226. provablyfine-0.1.0/tests/fixture.sh +6 -0
  227. provablyfine-0.1.0/tests/generic-exception-handler.t +20 -0
  228. provablyfine-0.1.0/tests/identity.t +54 -0
  229. provablyfine-0.1.0/tests/mock_oidc.py +282 -0
  230. provablyfine-0.1.0/tests/permission.t +42 -0
  231. provablyfine-0.1.0/tests/roles.t +82 -0
  232. provablyfine-0.1.0/tests/ssh.t +101 -0
  233. provablyfine-0.1.0/tests/ssh_bastion.t +64 -0
  234. provablyfine-0.1.0/tests/tags.t +85 -0
  235. provablyfine-0.1.0/tests/tenant-isolation.t +112 -0
  236. provablyfine-0.1.0/tests/tenant.t +51 -0
  237. provablyfine-0.1.0/tests/test_bastion.py +17 -0
  238. provablyfine-0.1.0/tests/test_bastion_reload.py +19 -0
  239. provablyfine-0.1.0/tests/test_bastion_restart.py +23 -0
  240. provablyfine-0.1.0/tests/test_cram.py +32 -0
  241. provablyfine-0.1.0/tests/test_oidc.py +336 -0
  242. provablyfine-0.1.0/tests/test_openssh.py +19 -0
  243. provablyfine-0.1.0/tests/test_openssh_bastion.py +21 -0
  244. provablyfine-0.1.0/tests/test_tui.py +1014 -0
  245. provablyfine-0.1.0/tests/utils.py +28 -0
  246. provablyfine-0.1.0/tests/validation-error.t +13 -0
@@ -0,0 +1,48 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - mathieu
8
+ pull_request:
9
+ branches:
10
+ - main
11
+
12
+ jobs:
13
+ lint:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v6
17
+ - uses: astral-sh/setup-uv@v8.1.0
18
+ - name: Run pyright
19
+ run: uv run pyright
20
+ - name: Run ruff check
21
+ run: uv run ruff check
22
+ - name: Run ruff format
23
+ run: uv run ruff format --check
24
+ - name: Check imports
25
+ run: ./scripts/check-imports
26
+ - name: Check license compatibility
27
+ run: uv run licensecheck
28
+
29
+ test:
30
+ runs-on: ubuntu-latest
31
+ strategy:
32
+ matrix:
33
+ python-version: ["3.12", "3.13", "3.14"]
34
+ steps:
35
+ - uses: actions/checkout@v6
36
+ - uses: astral-sh/setup-uv@v8.1.0
37
+ with:
38
+ python-version: ${{ matrix.python-version }}
39
+ - name: Install podman
40
+ run: sudo apt-get update && sudo apt-get install -y podman openssh-client socat
41
+ - name: Run tests
42
+ run: uv run pytest --basetemp=/tmp/pf-test-logs
43
+ - name: Upload test logs
44
+ if: failure()
45
+ uses: actions/upload-artifact@v4
46
+ with:
47
+ name: test-logs-${{ matrix.python-version }}
48
+ path: /tmp/pf-test-logs/
@@ -0,0 +1,148 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v[0-9]+.[0-9]+.[0-9]+'
7
+
8
+ permissions:
9
+ contents: write
10
+ id-token: write
11
+
12
+ jobs:
13
+ validate:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: astral-sh/setup-uv@v4
18
+ - name: Check tag matches pyproject.toml version
19
+ run: |
20
+ TAG_VERSION="${GITHUB_REF_NAME#v}"
21
+ PKG_VERSION=$(uv version --short)
22
+ if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then
23
+ echo "Tag $GITHUB_REF_NAME does not match pyproject.toml version $PKG_VERSION"
24
+ exit 1
25
+ fi
26
+
27
+ lint:
28
+ needs: validate
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ - uses: astral-sh/setup-uv@v4
33
+ - name: Run pyright
34
+ run: uv run pyright
35
+ - name: Run ruff check
36
+ run: uv run ruff check
37
+ - name: Run ruff format
38
+ run: uv run ruff format --check
39
+ - name: Check imports
40
+ run: ./scripts/check-imports
41
+ - name: Check license compatibility
42
+ run: uv run licensecheck
43
+
44
+ test:
45
+ needs: validate
46
+ runs-on: ubuntu-latest
47
+ strategy:
48
+ matrix:
49
+ python-version: ["3.12", "3.13", "3.14"]
50
+ steps:
51
+ - uses: actions/checkout@v4
52
+ - uses: astral-sh/setup-uv@v4
53
+ with:
54
+ python-version: ${{ matrix.python-version }}
55
+ - name: Install podman
56
+ run: sudo apt-get update && sudo apt-get install -y podman
57
+ - name: Run tests
58
+ run: uv run pytest --basetemp=/tmp/pf-test-logs
59
+ - name: Upload test logs
60
+ if: failure()
61
+ uses: actions/upload-artifact@v4
62
+ with:
63
+ name: test-logs-${{ matrix.python-version }}
64
+ path: /tmp/pf-test-logs/
65
+
66
+ docs:
67
+ needs: [lint, test]
68
+ runs-on: ubuntu-latest
69
+ steps:
70
+ - uses: actions/checkout@v4
71
+ with:
72
+ fetch-depth: 0
73
+ token: ${{ secrets.GITHUB_TOKEN }}
74
+ - uses: astral-sh/setup-uv@v4
75
+ - name: Configure git for mike
76
+ run: |
77
+ git config user.name "github-actions[bot]"
78
+ git config user.email "github-actions[bot]@users.noreply.github.com"
79
+ - name: Deploy docs
80
+ run: |
81
+ VERSION=$(uv version --short)
82
+ uv run mike deploy --push --update-aliases "$VERSION" latest
83
+
84
+ build:
85
+ needs: [lint, test]
86
+ runs-on: ubuntu-latest
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+ - uses: astral-sh/setup-uv@v4
90
+ - name: Build distribution
91
+ run: uv build
92
+ - uses: actions/upload-artifact@v4
93
+ with:
94
+ name: dist
95
+ path: dist/
96
+
97
+ publish-pypi:
98
+ needs: [build, docs]
99
+ runs-on: ubuntu-latest
100
+ environment: pypi
101
+ steps:
102
+ - uses: actions/download-artifact@v4
103
+ with:
104
+ name: dist
105
+ path: dist/
106
+ - name: Publish to PyPI
107
+ uses: pypa/gh-action-pypi-publish@release/v1
108
+
109
+ build-squashfs:
110
+ needs: build
111
+ runs-on: ubuntu-latest
112
+ steps:
113
+ - uses: actions/checkout@v4
114
+ - name: Install podman and squashfs-tools
115
+ run: sudo apt-get update && sudo apt-get install -y podman squashfs-tools
116
+ - name: Build squashfs
117
+ run: |
118
+ VERSION=$(uv version --short)
119
+ mkdir -p rootfs
120
+ podman build -f podman/pf-host.Containerfile -t pf-host-build .
121
+ CONTAINER=$(podman create pf-host-build)
122
+ podman export "$CONTAINER" | tar -x -C rootfs/
123
+ podman rm "$CONTAINER"
124
+ mksquashfs rootfs/ "pf-host_${VERSION}.raw" -comp zstd -noappend
125
+ - uses: actions/upload-artifact@v4
126
+ with:
127
+ name: squashfs
128
+ path: "pf-host_*.raw"
129
+
130
+ github-release:
131
+ needs: [publish-pypi, build-squashfs]
132
+ runs-on: ubuntu-latest
133
+ steps:
134
+ - uses: actions/download-artifact@v4
135
+ with:
136
+ name: dist
137
+ path: dist/
138
+ - uses: actions/download-artifact@v4
139
+ with:
140
+ name: squashfs
141
+ path: squashfs/
142
+ - name: Create GitHub Release
143
+ uses: softprops/action-gh-release@v2
144
+ with:
145
+ files: |
146
+ dist/*
147
+ squashfs/*
148
+ generate_release_notes: true
@@ -0,0 +1,15 @@
1
+ **/__pycache__/*
2
+ **/*.egg-info/*
3
+ **/*.swp
4
+ **/*.db
5
+ **/*.json
6
+ **/*.key
7
+ **/*.pub
8
+ **/*.orig
9
+ **/*.rej
10
+ **/*.patch
11
+ **/*.swo
12
+ .coverage*
13
+ uv.lock
14
+ site
15
+ .idea
@@ -0,0 +1,14 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.9.0
4
+ hooks:
5
+ - id: ruff # linter
6
+ args: [--fix]
7
+ - id: ruff-format # formatter
8
+ - repo: local
9
+ hooks:
10
+ - id: check-from-imports
11
+ name: Ban from-imports for everything except relative imports
12
+ entry: scripts/check-imports
13
+ language: python
14
+ types: [python]