xrdclient 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 (272) hide show
  1. xrdclient-0.1.0/.github/workflows/ci.yml +125 -0
  2. xrdclient-0.1.0/.github/workflows/publish.yml +37 -0
  3. xrdclient-0.1.0/.gitignore +22 -0
  4. xrdclient-0.1.0/COPYING +674 -0
  5. xrdclient-0.1.0/LICENSE +165 -0
  6. xrdclient-0.1.0/PKG-INFO +387 -0
  7. xrdclient-0.1.0/README.md +349 -0
  8. xrdclient-0.1.0/SECURITY.md +151 -0
  9. xrdclient-0.1.0/benchmarks/bench.py +339 -0
  10. xrdclient-0.1.0/benchmarks/compare.py +582 -0
  11. xrdclient-0.1.0/docs/api.md +213 -0
  12. xrdclient-0.1.0/docs/async.md +178 -0
  13. xrdclient-0.1.0/docs/auth.md +329 -0
  14. xrdclient-0.1.0/docs/cli.md +232 -0
  15. xrdclient-0.1.0/docs/compat-cookbook.md +829 -0
  16. xrdclient-0.1.0/docs/compat-reference.md +578 -0
  17. xrdclient-0.1.0/docs/compat-troubleshooting.md +290 -0
  18. xrdclient-0.1.0/docs/compat.md +140 -0
  19. xrdclient-0.1.0/docs/config.md +261 -0
  20. xrdclient-0.1.0/docs/copying.md +401 -0
  21. xrdclient-0.1.0/docs/easy.md +169 -0
  22. xrdclient-0.1.0/docs/errors.md +168 -0
  23. xrdclient-0.1.0/docs/files.md +359 -0
  24. xrdclient-0.1.0/docs/filesystem.md +359 -0
  25. xrdclient-0.1.0/docs/fsspec.md +106 -0
  26. xrdclient-0.1.0/docs/http.md +215 -0
  27. xrdclient-0.1.0/docs/index.md +102 -0
  28. xrdclient-0.1.0/docs/interop.md +198 -0
  29. xrdclient-0.1.0/docs/maintainability.md +88 -0
  30. xrdclient-0.1.0/docs/migrating.md +216 -0
  31. xrdclient-0.1.0/docs/performance.md +301 -0
  32. xrdclient-0.1.0/docs/porting.md +386 -0
  33. xrdclient-0.1.0/docs/quickstart.md +147 -0
  34. xrdclient-0.1.0/docs/s3.md +170 -0
  35. xrdclient-0.1.0/docs/safety.md +150 -0
  36. xrdclient-0.1.0/docs/security.md +1 -0
  37. xrdclient-0.1.0/docs/superpowers/plans/2026-07-31-pyxrootd-client-roadmap.md +644 -0
  38. xrdclient-0.1.0/docs/superpowers/plans/2026-09-29-xrdcl-functionality-plan.md +150 -0
  39. xrdclient-0.1.0/docs/superpowers/specs/2026-07-31-pyxrootd-client-design.md +1036 -0
  40. xrdclient-0.1.0/docs/testing.md +335 -0
  41. xrdclient-0.1.0/docs/typing.md +68 -0
  42. xrdclient-0.1.0/examples/gsi_copy_benchmark.py +493 -0
  43. xrdclient-0.1.0/examples/pyxrootd/README.md +115 -0
  44. xrdclient-0.1.0/examples/pyxrootd/async_callbacks.py +85 -0
  45. xrdclient-0.1.0/examples/pyxrootd/checksum_query.py +48 -0
  46. xrdclient-0.1.0/examples/pyxrootd/copy_process.py +88 -0
  47. xrdclient-0.1.0/examples/pyxrootd/dirlist.py +52 -0
  48. xrdclient-0.1.0/examples/pyxrootd/env_settings.py +36 -0
  49. xrdclient-0.1.0/examples/pyxrootd/error_handling.py +68 -0
  50. xrdclient-0.1.0/examples/pyxrootd/file_io.py +64 -0
  51. xrdclient-0.1.0/examples/pyxrootd/glob_files.py +50 -0
  52. xrdclient-0.1.0/examples/pyxrootd/install_hook.py +47 -0
  53. xrdclient-0.1.0/examples/pyxrootd/locate.py +41 -0
  54. xrdclient-0.1.0/examples/pyxrootd/namespace_ops.py +62 -0
  55. xrdclient-0.1.0/examples/pyxrootd/open_flags.py +50 -0
  56. xrdclient-0.1.0/examples/pyxrootd/read_chunks.py +41 -0
  57. xrdclient-0.1.0/examples/pyxrootd/read_lines.py +46 -0
  58. xrdclient-0.1.0/examples/pyxrootd/run_all.py +349 -0
  59. xrdclient-0.1.0/examples/pyxrootd/simple_copy.py +48 -0
  60. xrdclient-0.1.0/examples/pyxrootd/stat_and_ping.py +57 -0
  61. xrdclient-0.1.0/examples/pyxrootd/sync_changed.py +109 -0
  62. xrdclient-0.1.0/examples/pyxrootd/timeouts.py +51 -0
  63. xrdclient-0.1.0/examples/pyxrootd/url_parsing.py +41 -0
  64. xrdclient-0.1.0/examples/pyxrootd/vector_read.py +39 -0
  65. xrdclient-0.1.0/examples/pyxrootd/xattrs.py +60 -0
  66. xrdclient-0.1.0/maintainability.json +18 -0
  67. xrdclient-0.1.0/mkdocs.yml +94 -0
  68. xrdclient-0.1.0/pyproject.toml +128 -0
  69. xrdclient-0.1.0/src/xrdclient/__init__.py +249 -0
  70. xrdclient-0.1.0/src/xrdclient/_compat.py +86 -0
  71. xrdclient-0.1.0/src/xrdclient/_log.py +96 -0
  72. xrdclient-0.1.0/src/xrdclient/aio.py +1040 -0
  73. xrdclient-0.1.0/src/xrdclient/auth/__init__.py +399 -0
  74. xrdclient-0.1.0/src/xrdclient/auth/base.py +107 -0
  75. xrdclient-0.1.0/src/xrdclient/auth/gsi.py +678 -0
  76. xrdclient-0.1.0/src/xrdclient/auth/kerberos/__init__.py +22 -0
  77. xrdclient-0.1.0/src/xrdclient/auth/kerberos/asn1.py +524 -0
  78. xrdclient-0.1.0/src/xrdclient/auth/kerberos/caches.py +99 -0
  79. xrdclient-0.1.0/src/xrdclient/auth/kerberos/ccache.py +303 -0
  80. xrdclient-0.1.0/src/xrdclient/auth/kerberos/kcm.py +254 -0
  81. xrdclient-0.1.0/src/xrdclient/auth/kerberos/kdc.py +152 -0
  82. xrdclient-0.1.0/src/xrdclient/auth/kerberos/keyring.py +334 -0
  83. xrdclient-0.1.0/src/xrdclient/auth/kerberos/model.py +119 -0
  84. xrdclient-0.1.0/src/xrdclient/auth/kerberos/profile.py +256 -0
  85. xrdclient-0.1.0/src/xrdclient/auth/kerberos/tgs.py +234 -0
  86. xrdclient-0.1.0/src/xrdclient/auth/krb5.py +272 -0
  87. xrdclient-0.1.0/src/xrdclient/auth/prompt.py +196 -0
  88. xrdclient-0.1.0/src/xrdclient/auth/simple.py +51 -0
  89. xrdclient-0.1.0/src/xrdclient/auth/sss.py +251 -0
  90. xrdclient-0.1.0/src/xrdclient/auth/ztn.py +206 -0
  91. xrdclient-0.1.0/src/xrdclient/cli/__init__.py +214 -0
  92. xrdclient-0.1.0/src/xrdclient/cli/cp.py +598 -0
  93. xrdclient-0.1.0/src/xrdclient/cli/fs.py +721 -0
  94. xrdclient-0.1.0/src/xrdclient/client/__init__.py +9 -0
  95. xrdclient-0.1.0/src/xrdclient/client/_fattr.py +70 -0
  96. xrdclient-0.1.0/src/xrdclient/client/_zip.py +203 -0
  97. xrdclient-0.1.0/src/xrdclient/client/bulk.py +494 -0
  98. xrdclient-0.1.0/src/xrdclient/client/file.py +1461 -0
  99. xrdclient-0.1.0/src/xrdclient/client/filesystem.py +1252 -0
  100. xrdclient-0.1.0/src/xrdclient/compat/__init__.py +59 -0
  101. xrdclient-0.1.0/src/xrdclient/compat/client/__init__.py +86 -0
  102. xrdclient-0.1.0/src/xrdclient/compat/client/_args.py +67 -0
  103. xrdclient-0.1.0/src/xrdclient/compat/client/_channels.py +54 -0
  104. xrdclient-0.1.0/src/xrdclient/compat/client/_convert.py +275 -0
  105. xrdclient-0.1.0/src/xrdclient/compat/client/_dispatch.py +217 -0
  106. xrdclient-0.1.0/src/xrdclient/compat/client/_status.py +171 -0
  107. xrdclient-0.1.0/src/xrdclient/compat/client/_version.py +7 -0
  108. xrdclient-0.1.0/src/xrdclient/compat/client/copyprocess.py +489 -0
  109. xrdclient-0.1.0/src/xrdclient/compat/client/env.py +455 -0
  110. xrdclient-0.1.0/src/xrdclient/compat/client/file.py +557 -0
  111. xrdclient-0.1.0/src/xrdclient/compat/client/filesystem.py +599 -0
  112. xrdclient-0.1.0/src/xrdclient/compat/client/finalize.py +30 -0
  113. xrdclient-0.1.0/src/xrdclient/compat/client/flags.py +174 -0
  114. xrdclient-0.1.0/src/xrdclient/compat/client/glob_funcs.py +89 -0
  115. xrdclient-0.1.0/src/xrdclient/compat/client/responses.py +458 -0
  116. xrdclient-0.1.0/src/xrdclient/compat/client/tape.py +393 -0
  117. xrdclient-0.1.0/src/xrdclient/compat/client/url.py +114 -0
  118. xrdclient-0.1.0/src/xrdclient/compat/client/utils.py +81 -0
  119. xrdclient-0.1.0/src/xrdclient/compat/client/xattr.py +53 -0
  120. xrdclient-0.1.0/src/xrdclient/config.py +538 -0
  121. xrdclient-0.1.0/src/xrdclient/copy/__init__.py +28 -0
  122. xrdclient-0.1.0/src/xrdclient/copy/engine.py +1300 -0
  123. xrdclient-0.1.0/src/xrdclient/copy/limits.py +149 -0
  124. xrdclient-0.1.0/src/xrdclient/copy/replicas.py +270 -0
  125. xrdclient-0.1.0/src/xrdclient/copy/tpc.py +290 -0
  126. xrdclient-0.1.0/src/xrdclient/crypto/__init__.py +124 -0
  127. xrdclient-0.1.0/src/xrdclient/crypto/aes.py +238 -0
  128. xrdclient-0.1.0/src/xrdclient/crypto/blowfish.py +188 -0
  129. xrdclient-0.1.0/src/xrdclient/crypto/checksum.py +122 -0
  130. xrdclient-0.1.0/src/xrdclient/crypto/crc32c.py +136 -0
  131. xrdclient-0.1.0/src/xrdclient/crypto/crc64.py +58 -0
  132. xrdclient-0.1.0/src/xrdclient/crypto/delegation.py +281 -0
  133. xrdclient-0.1.0/src/xrdclient/crypto/der.py +234 -0
  134. xrdclient-0.1.0/src/xrdclient/crypto/rfc3961.py +340 -0
  135. xrdclient-0.1.0/src/xrdclient/crypto/rsa.py +412 -0
  136. xrdclient-0.1.0/src/xrdclient/crypto/sigver.py +191 -0
  137. xrdclient-0.1.0/src/xrdclient/crypto/trust.py +139 -0
  138. xrdclient-0.1.0/src/xrdclient/crypto/x509.py +431 -0
  139. xrdclient-0.1.0/src/xrdclient/doctor.py +416 -0
  140. xrdclient-0.1.0/src/xrdclient/easy.py +391 -0
  141. xrdclient-0.1.0/src/xrdclient/errors.py +366 -0
  142. xrdclient-0.1.0/src/xrdclient/flags.py +453 -0
  143. xrdclient-0.1.0/src/xrdclient/fsspec_impl.py +499 -0
  144. xrdclient-0.1.0/src/xrdclient/http/__init__.py +35 -0
  145. xrdclient-0.1.0/src/xrdclient/http/client.py +654 -0
  146. xrdclient-0.1.0/src/xrdclient/http/dav.py +744 -0
  147. xrdclient-0.1.0/src/xrdclient/http/file.py +493 -0
  148. xrdclient-0.1.0/src/xrdclient/http/tape.py +256 -0
  149. xrdclient-0.1.0/src/xrdclient/http/tpc.py +341 -0
  150. xrdclient-0.1.0/src/xrdclient/io/__init__.py +207 -0
  151. xrdclient-0.1.0/src/xrdclient/io/raw.py +222 -0
  152. xrdclient-0.1.0/src/xrdclient/path.py +303 -0
  153. xrdclient-0.1.0/src/xrdclient/proto/__init__.py +25 -0
  154. xrdclient-0.1.0/src/xrdclient/proto/buffer.py +174 -0
  155. xrdclient-0.1.0/src/xrdclient/proto/constants.py +320 -0
  156. xrdclient-0.1.0/src/xrdclient/proto/frames.py +164 -0
  157. xrdclient-0.1.0/src/xrdclient/proto/machine.py +945 -0
  158. xrdclient-0.1.0/src/xrdclient/proto/requests.py +1011 -0
  159. xrdclient-0.1.0/src/xrdclient/proto/responses.py +675 -0
  160. xrdclient-0.1.0/src/xrdclient/py.typed +0 -0
  161. xrdclient-0.1.0/src/xrdclient/s3/__init__.py +34 -0
  162. xrdclient-0.1.0/src/xrdclient/s3/fs.py +837 -0
  163. xrdclient-0.1.0/src/xrdclient/s3/sigv4.py +219 -0
  164. xrdclient-0.1.0/src/xrdclient/session/__init__.py +9 -0
  165. xrdclient-0.1.0/src/xrdclient/session/bulk.py +639 -0
  166. xrdclient-0.1.0/src/xrdclient/session/deadline.py +93 -0
  167. xrdclient-0.1.0/src/xrdclient/session/pool.py +345 -0
  168. xrdclient-0.1.0/src/xrdclient/session/router.py +732 -0
  169. xrdclient-0.1.0/src/xrdclient/session/sync.py +800 -0
  170. xrdclient-0.1.0/src/xrdclient/testing/__init__.py +35 -0
  171. xrdclient-0.1.0/src/xrdclient/testing/__main__.py +13 -0
  172. xrdclient-0.1.0/src/xrdclient/testing/faults.py +363 -0
  173. xrdclient-0.1.0/src/xrdclient/testing/http.py +724 -0
  174. xrdclient-0.1.0/src/xrdclient/testing/s3.py +522 -0
  175. xrdclient-0.1.0/src/xrdclient/testing/server.py +1482 -0
  176. xrdclient-0.1.0/src/xrdclient/transport/__init__.py +27 -0
  177. xrdclient-0.1.0/src/xrdclient/transport/base.py +84 -0
  178. xrdclient-0.1.0/src/xrdclient/transport/memory.py +79 -0
  179. xrdclient-0.1.0/src/xrdclient/transport/sync.py +95 -0
  180. xrdclient-0.1.0/src/xrdclient/types.py +425 -0
  181. xrdclient-0.1.0/src/xrdclient/url.py +363 -0
  182. xrdclient-0.1.0/tests/_gsi.py +191 -0
  183. xrdclient-0.1.0/tests/_kcmd.py +330 -0
  184. xrdclient-0.1.0/tests/_keys.py +107 -0
  185. xrdclient-0.1.0/tests/_krb5_mit.py +35 -0
  186. xrdclient-0.1.0/tests/_krb5kdc.py +493 -0
  187. xrdclient-0.1.0/tests/_pki.py +311 -0
  188. xrdclient-0.1.0/tests/_xrootd.py +151 -0
  189. xrdclient-0.1.0/tests/conftest.py +199 -0
  190. xrdclient-0.1.0/tests/test_aes.py +136 -0
  191. xrdclient-0.1.0/tests/test_aio.py +759 -0
  192. xrdclient-0.1.0/tests/test_aio_surface.py +90 -0
  193. xrdclient-0.1.0/tests/test_append.py +97 -0
  194. xrdclient-0.1.0/tests/test_auth.py +712 -0
  195. xrdclient-0.1.0/tests/test_benchmarks.py +70 -0
  196. xrdclient-0.1.0/tests/test_buffer.py +95 -0
  197. xrdclient-0.1.0/tests/test_bulk.py +552 -0
  198. xrdclient-0.1.0/tests/test_bulk_integrity.py +244 -0
  199. xrdclient-0.1.0/tests/test_cli.py +1118 -0
  200. xrdclient-0.1.0/tests/test_client.py +1754 -0
  201. xrdclient-0.1.0/tests/test_compat.py +246 -0
  202. xrdclient-0.1.0/tests/test_compat_xrdcl.py +933 -0
  203. xrdclient-0.1.0/tests/test_config.py +323 -0
  204. xrdclient-0.1.0/tests/test_conformance_http.py +850 -0
  205. xrdclient-0.1.0/tests/test_conformance_io.py +350 -0
  206. xrdclient-0.1.0/tests/test_conformance_opaque.py +271 -0
  207. xrdclient-0.1.0/tests/test_conformance_semantics.py +468 -0
  208. xrdclient-0.1.0/tests/test_conformance_session.py +191 -0
  209. xrdclient-0.1.0/tests/test_conformance_wire.py +385 -0
  210. xrdclient-0.1.0/tests/test_copy.py +1026 -0
  211. xrdclient-0.1.0/tests/test_copy_integrity.py +175 -0
  212. xrdclient-0.1.0/tests/test_copy_options.py +1082 -0
  213. xrdclient-0.1.0/tests/test_coverage_core.py +368 -0
  214. xrdclient-0.1.0/tests/test_coverage_misc.py +255 -0
  215. xrdclient-0.1.0/tests/test_crypto.py +461 -0
  216. xrdclient-0.1.0/tests/test_data_streams_default.py +312 -0
  217. xrdclient-0.1.0/tests/test_datapath.py +445 -0
  218. xrdclient-0.1.0/tests/test_deadline.py +364 -0
  219. xrdclient-0.1.0/tests/test_default_config_interop.py +98 -0
  220. xrdclient-0.1.0/tests/test_delegation.py +610 -0
  221. xrdclient-0.1.0/tests/test_der.py +110 -0
  222. xrdclient-0.1.0/tests/test_doctor.py +288 -0
  223. xrdclient-0.1.0/tests/test_easy.py +316 -0
  224. xrdclient-0.1.0/tests/test_errors.py +157 -0
  225. xrdclient-0.1.0/tests/test_faults.py +475 -0
  226. xrdclient-0.1.0/tests/test_fcntl_template_zip.py +467 -0
  227. xrdclient-0.1.0/tests/test_flags.py +176 -0
  228. xrdclient-0.1.0/tests/test_frames.py +447 -0
  229. xrdclient-0.1.0/tests/test_fsspec.py +329 -0
  230. xrdclient-0.1.0/tests/test_gsi.py +708 -0
  231. xrdclient-0.1.0/tests/test_gsi_delegation_interop.py +238 -0
  232. xrdclient-0.1.0/tests/test_http.py +1212 -0
  233. xrdclient-0.1.0/tests/test_http_names.py +125 -0
  234. xrdclient-0.1.0/tests/test_http_redirect_credentials.py +157 -0
  235. xrdclient-0.1.0/tests/test_http_timeouts.py +99 -0
  236. xrdclient-0.1.0/tests/test_interop.py +504 -0
  237. xrdclient-0.1.0/tests/test_io.py +345 -0
  238. xrdclient-0.1.0/tests/test_krb5.py +632 -0
  239. xrdclient-0.1.0/tests/test_krb5_crypto.py +439 -0
  240. xrdclient-0.1.0/tests/test_krb5_interop.py +201 -0
  241. xrdclient-0.1.0/tests/test_krb5_kcm.py +586 -0
  242. xrdclient-0.1.0/tests/test_krb5_keyring.py +558 -0
  243. xrdclient-0.1.0/tests/test_krb5_mit.py +351 -0
  244. xrdclient-0.1.0/tests/test_krb5_protocol.py +696 -0
  245. xrdclient-0.1.0/tests/test_machine.py +889 -0
  246. xrdclient-0.1.0/tests/test_maintainability.py +175 -0
  247. xrdclient-0.1.0/tests/test_mtls.py +130 -0
  248. xrdclient-0.1.0/tests/test_parity.py +312 -0
  249. xrdclient-0.1.0/tests/test_path.py +312 -0
  250. xrdclient-0.1.0/tests/test_plane.py +704 -0
  251. xrdclient-0.1.0/tests/test_plane_interop.py +72 -0
  252. xrdclient-0.1.0/tests/test_pool.py +556 -0
  253. xrdclient-0.1.0/tests/test_prompt.py +711 -0
  254. xrdclient-0.1.0/tests/test_pyxrootd_compat.py +1924 -0
  255. xrdclient-0.1.0/tests/test_pyxrootd_compat_newapi.py +796 -0
  256. xrdclient-0.1.0/tests/test_pyxrootd_examples.py +124 -0
  257. xrdclient-0.1.0/tests/test_redirects.py +458 -0
  258. xrdclient-0.1.0/tests/test_request_path.py +340 -0
  259. xrdclient-0.1.0/tests/test_responses.py +638 -0
  260. xrdclient-0.1.0/tests/test_rmtree_symlinks.py +222 -0
  261. xrdclient-0.1.0/tests/test_rsa.py +253 -0
  262. xrdclient-0.1.0/tests/test_s3.py +900 -0
  263. xrdclient-0.1.0/tests/test_safety.py +195 -0
  264. xrdclient-0.1.0/tests/test_session.py +301 -0
  265. xrdclient-0.1.0/tests/test_surface.py +635 -0
  266. xrdclient-0.1.0/tests/test_testing.py +602 -0
  267. xrdclient-0.1.0/tests/test_transport.py +363 -0
  268. xrdclient-0.1.0/tests/test_typing.py +94 -0
  269. xrdclient-0.1.0/tests/test_url.py +255 -0
  270. xrdclient-0.1.0/tests/test_x509.py +387 -0
  271. xrdclient-0.1.0/tools/maintainability.py +733 -0
  272. xrdclient-0.1.0/tools/pyxrootd_upstream.py +238 -0
@@ -0,0 +1,125 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ env:
14
+ FORCE_COLOR: "1"
15
+
16
+ jobs:
17
+ lint:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.12"
24
+ - run: pip install -e ".[dev]"
25
+ - name: ruff
26
+ run: ruff check src tests benchmarks tools examples
27
+ - name: mypy --strict
28
+ run: mypy
29
+ - name: maintainability burn-down (must reach zero)
30
+ run: python tools/maintainability.py check
31
+
32
+ test:
33
+ runs-on: ${{ matrix.os }}
34
+ strategy:
35
+ fail-fast: false
36
+ matrix:
37
+ os: [ubuntu-latest]
38
+ python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
39
+ include:
40
+ - os: macos-latest
41
+ python-version: "3.12"
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+ - uses: actions/setup-python@v5
45
+ with:
46
+ python-version: ${{ matrix.python-version }}
47
+ # The point of the library is that it needs nothing compiled; installing
48
+ # the fsspec extra as well keeps that adapter's tests from silently
49
+ # skipping on every run.
50
+ - run: pip install -e ".[dev]"
51
+ # pytest-cov rather than `coverage run`, because the workers xdist
52
+ # spawns are separate processes and only pytest-cov collects them all.
53
+ # `fail_under = 100` on proto/, crypto/ and client/ comes from
54
+ # pyproject.toml, so the gate lives with the configuration.
55
+ - name: pytest
56
+ run: >-
57
+ pytest -q -p no:cacheprovider -n auto
58
+ -m "not interop and not parity"
59
+ --cov=xrdclient --cov-report=term-missing
60
+
61
+ interop:
62
+ # A real daemon, because a fake written from the same reading of the
63
+ # specification as the client would agree with a misreading.
64
+ runs-on: ubuntu-latest
65
+ steps:
66
+ - uses: actions/checkout@v4
67
+ - uses: conda-incubator/setup-miniconda@v3
68
+ with:
69
+ python-version: "3.12"
70
+ channels: conda-forge
71
+ auto-activate-base: false
72
+ activate-environment: interop
73
+ - name: install xrootd and the official bindings
74
+ shell: bash -el {0}
75
+ run: conda install -y xrootd
76
+ - name: install
77
+ shell: bash -el {0}
78
+ run: pip install -e ".[dev]"
79
+ - name: interop and parity
80
+ shell: bash -el {0}
81
+ run: |
82
+ xrootd -v
83
+ pytest -q -p no:cacheprovider -m "interop or parity"
84
+
85
+ docs:
86
+ runs-on: ubuntu-latest
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+ - uses: actions/setup-python@v5
90
+ with:
91
+ python-version: "3.12"
92
+ - run: pip install -e ".[docs]"
93
+ # --strict turns a broken link or a page missing from the nav into a
94
+ # failure, which is the only way documentation stays true.
95
+ - run: mkdocs build --strict
96
+
97
+ performance:
98
+ # A gate, not a report: every case in benchmarks/compare.py must be won
99
+ # against the official XRootD bindings on the same runner, by both the
100
+ # native API and xrdclient.compat. Rounds are paired and interleaved and
101
+ # a win must pass a one-sided sign test, so a noisy runner cannot turn a
102
+ # loss into a pass by luck - only into a failure, which is re-runnable.
103
+ runs-on: ubuntu-latest
104
+ steps:
105
+ - uses: actions/checkout@v4
106
+ - uses: conda-incubator/setup-miniconda@v3
107
+ with:
108
+ python-version: "3.12"
109
+ channels: conda-forge
110
+ activate-environment: bench
111
+ - shell: bash -el {0}
112
+ run: conda install -y xrootd
113
+ - shell: bash -el {0}
114
+ run: pip install -e .
115
+ - name: loopback
116
+ shell: bash -el {0}
117
+ run: python benchmarks/compare.py --gate --size 64 --rounds 15 --json loopback.json
118
+ - name: 2 ms round trip
119
+ shell: bash -el {0}
120
+ run: python benchmarks/compare.py --gate --size 64 --rounds 15 --rtt 2 --json rtt2.json
121
+ - if: always()
122
+ uses: actions/upload-artifact@v4
123
+ with:
124
+ name: performance
125
+ path: "*.json"
@@ -0,0 +1,37 @@
1
+ # Builds the sdist and wheel on a version tag and uploads them to PyPI through
2
+ # trusted publishing (no API token: PyPI trusts this workflow's OIDC identity,
3
+ # registered under the project's "Publishing" settings).
4
+ name: Publish
5
+
6
+ on:
7
+ push:
8
+ tags: ["v*"]
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.12"
18
+ - run: pip install build twine
19
+ - run: python -m build
20
+ - run: twine check dist/*
21
+ - uses: actions/upload-artifact@v4
22
+ with:
23
+ name: dist
24
+ path: dist/
25
+
26
+ publish:
27
+ needs: build
28
+ runs-on: ubuntu-latest
29
+ environment: pypi
30
+ permissions:
31
+ id-token: write
32
+ steps:
33
+ - uses: actions/download-artifact@v4
34
+ with:
35
+ name: dist
36
+ path: dist/
37
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,22 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+
4
+ # Build artefacts
5
+ build/
6
+ dist/
7
+ *.egg-info/
8
+ site/
9
+
10
+ # Tooling caches and coverage data
11
+ .coverage
12
+ .coverage.*
13
+ htmlcov/
14
+ .mypy_cache/
15
+ .pytest_cache/
16
+ .ruff_cache/
17
+ .tox/
18
+ .venv/
19
+ venv/
20
+
21
+ # Generated datasets
22
+ /datasets/