opensafely 2.0.2__tar.gz → 2.0.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 (239) hide show
  1. {opensafely-2.0.2 → opensafely-2.0.4}/PKG-INFO +1 -1
  2. opensafely-2.0.4/opensafely/VERSION +1 -0
  3. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/__init__.py +1 -1
  4. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/api.py +20 -151
  5. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/constant.py +441 -0
  6. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/md.py +175 -114
  7. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/models.py +20 -3
  8. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/utils.py +63 -66
  9. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/version.py +1 -1
  10. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/__init__.py +2 -0
  11. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/cli.py +9 -5
  12. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/codec.py +12 -8
  13. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/compat.py +4 -2
  14. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/core.py +323 -109
  15. opensafely-2.0.4/opensafely/_vendor/idna/package_data.py +1 -0
  16. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/uts46data.py +55 -54
  17. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/loading.py +2 -2
  18. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/outputs.py +2 -1
  19. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/validation.py +1 -2
  20. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/executors/volumes.py +11 -3
  21. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/PKG-INFO +1 -1
  22. opensafely-2.0.2/opensafely/VERSION +0 -1
  23. opensafely-2.0.2/opensafely/_vendor/idna/package_data.py +0 -1
  24. {opensafely-2.0.2 → opensafely-2.0.4}/LICENSE +0 -0
  25. {opensafely-2.0.2 → opensafely-2.0.4}/README.md +0 -0
  26. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/__init__.py +0 -0
  27. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/__init__.py +0 -0
  28. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/__main__.py +0 -0
  29. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/cacert.pem +0 -0
  30. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/core.py +0 -0
  31. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/py.typed +0 -0
  32. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/__main__.py +0 -0
  33. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/cd.py +0 -0
  34. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/cli/__init__.py +0 -0
  35. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/cli/__main__.py +0 -0
  36. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/legacy.py +0 -0
  37. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/py.typed +0 -0
  38. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/distro/__init__.py +0 -0
  39. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/distro/__main__.py +0 -0
  40. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/distro/distro.py +0 -0
  41. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/distro/py.typed +0 -0
  42. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/__main__.py +0 -0
  43. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/idnadata.py +0 -0
  44. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/intranges.py +0 -0
  45. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/py.typed +0 -0
  46. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/_logs/__init__.py +0 -0
  47. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/_logs/_internal/__init__.py +0 -0
  48. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/_logs/py.typed +0 -0
  49. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/_logs/severity/__init__.py +0 -0
  50. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/attributes/__init__.py +0 -0
  51. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/attributes/py.typed +0 -0
  52. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/baggage/__init__.py +0 -0
  53. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/baggage/propagation/__init__.py +0 -0
  54. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/baggage/py.typed +0 -0
  55. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/context/__init__.py +0 -0
  56. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/context/context.py +0 -0
  57. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/context/contextvars_context.py +0 -0
  58. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/context/py.typed +0 -0
  59. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/environment_variables/__init__.py +0 -0
  60. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/environment_variables/py.typed +0 -0
  61. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/__init__.py +0 -0
  62. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/_internal/__init__.py +0 -0
  63. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/_internal/instrument.py +0 -0
  64. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/_internal/observation.py +0 -0
  65. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/py.typed +0 -0
  66. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagate/__init__.py +0 -0
  67. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagate/py.typed +0 -0
  68. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagators/_envcarrier.py +0 -0
  69. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagators/composite.py +0 -0
  70. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagators/py.typed +0 -0
  71. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagators/textmap.py +0 -0
  72. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/py.typed +0 -0
  73. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/__init__.py +0 -0
  74. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/propagation/__init__.py +0 -0
  75. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/propagation/tracecontext.py +0 -0
  76. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/py.typed +0 -0
  77. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/span.py +0 -0
  78. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/status.py +0 -0
  79. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/_decorator.py +0 -0
  80. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/_importlib_metadata.py +0 -0
  81. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/_once.py +0 -0
  82. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/_providers.py +0 -0
  83. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/py.typed +0 -0
  84. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/re.py +0 -0
  85. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/types.py +0 -0
  86. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/version/__init__.py +0 -0
  87. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/version/py.typed +0 -0
  88. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/__init__.py +0 -0
  89. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/__main__.py +0 -0
  90. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/constants.py +0 -0
  91. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/exceptions.py +0 -0
  92. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/features.py +0 -0
  93. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/legacy.py +0 -0
  94. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/main.py +0 -0
  95. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/models.py +0 -0
  96. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline.pyi +0 -0
  97. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/__init__.py +0 -0
  98. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/__version__.py +0 -0
  99. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/_internal_utils.py +0 -0
  100. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/_types.py +0 -0
  101. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/adapters.py +0 -0
  102. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/api.py +0 -0
  103. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/auth.py +0 -0
  104. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/certs.py +0 -0
  105. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/compat.py +0 -0
  106. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/cookies.py +0 -0
  107. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/exceptions.py +0 -0
  108. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/help.py +0 -0
  109. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/hooks.py +0 -0
  110. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/models.py +0 -0
  111. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/packages.py +0 -0
  112. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/py.typed +0 -0
  113. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/sessions.py +0 -0
  114. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/status_codes.py +0 -0
  115. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/structures.py +0 -0
  116. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/utils.py +0 -0
  117. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/__init__.py +0 -0
  118. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/anchor.py +0 -0
  119. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/comments.py +0 -0
  120. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/compat.py +0 -0
  121. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/composer.py +0 -0
  122. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/configobjwalker.py +0 -0
  123. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/constructor.py +0 -0
  124. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/cyaml.py +0 -0
  125. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/dumper.py +0 -0
  126. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/emitter.py +0 -0
  127. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/error.py +0 -0
  128. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/events.py +0 -0
  129. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/loader.py +0 -0
  130. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/main.py +0 -0
  131. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/nodes.py +0 -0
  132. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/parser.py +0 -0
  133. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/py.typed +0 -0
  134. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/reader.py +0 -0
  135. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/representer.py +0 -0
  136. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/resolver.py +0 -0
  137. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scalarbool.py +0 -0
  138. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scalarfloat.py +0 -0
  139. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scalarint.py +0 -0
  140. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scalarstring.py +0 -0
  141. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scanner.py +0 -0
  142. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/serializer.py +0 -0
  143. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/timestamp.py +0 -0
  144. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/tokens.py +0 -0
  145. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/util.py +0 -0
  146. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/typing_extensions.py +0 -0
  147. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/typing_extensions.pyi +0 -0
  148. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/__init__.py +0 -0
  149. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/_base_connection.py +0 -0
  150. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/_collections.py +0 -0
  151. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/_request_methods.py +0 -0
  152. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/_version.py +0 -0
  153. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/connection.py +0 -0
  154. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/connectionpool.py +0 -0
  155. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/__init__.py +0 -0
  156. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/__init__.py +0 -0
  157. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/connection.py +0 -0
  158. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/fetch.py +0 -0
  159. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/request.py +0 -0
  160. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/response.py +0 -0
  161. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/pyopenssl.py +0 -0
  162. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/socks.py +0 -0
  163. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/exceptions.py +0 -0
  164. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/fields.py +0 -0
  165. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/filepost.py +0 -0
  166. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/http2/__init__.py +0 -0
  167. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/http2/connection.py +0 -0
  168. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/http2/probe.py +0 -0
  169. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/poolmanager.py +0 -0
  170. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/py.typed +0 -0
  171. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/response.py +0 -0
  172. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/__init__.py +0 -0
  173. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/connection.py +0 -0
  174. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/proxy.py +0 -0
  175. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/request.py +0 -0
  176. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/response.py +0 -0
  177. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/retry.py +0 -0
  178. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/ssl_.py +0 -0
  179. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/ssl_match_hostname.py +0 -0
  180. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/ssltransport.py +0 -0
  181. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/timeout.py +0 -0
  182. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/url.py +0 -0
  183. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/util.py +0 -0
  184. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/wait.py +0 -0
  185. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/clean.py +0 -0
  186. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/codelists.py +0 -0
  187. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/execute.py +0 -0
  188. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/info.py +0 -0
  189. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/__init__.py +0 -0
  190. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/actions.py +0 -0
  191. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/cli/__init__.py +0 -0
  192. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/cli/local_run.py +0 -0
  193. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/cli/migrate.py +0 -0
  194. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/config.py +0 -0
  195. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/create_or_update_jobs.py +0 -0
  196. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/executors/__init__.py +0 -0
  197. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/executors/local.py +0 -0
  198. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/job_executor.py +0 -0
  199. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/__init__.py +0 -0
  200. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/database.py +0 -0
  201. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/docker.py +0 -0
  202. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/git.py +0 -0
  203. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/github_validators.py +0 -0
  204. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/log_utils.py +0 -0
  205. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/lru_dict.py +0 -0
  206. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/path_utils.py +0 -0
  207. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/string_utils.py +0 -0
  208. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/subprocess_utils.py +0 -0
  209. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/yaml_utils.py +0 -0
  210. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/models.py +0 -0
  211. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/queries.py +0 -0
  212. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/reusable_actions.py +0 -0
  213. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/run.py +0 -0
  214. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/tracing.py +0 -0
  215. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jupyter.py +0 -0
  216. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/launch.py +0 -0
  217. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/pull.py +0 -0
  218. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/rstudio.py +0 -0
  219. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/unzip.py +0 -0
  220. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/upgrade.py +0 -0
  221. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/utils.py +0 -0
  222. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/SOURCES.txt +0 -0
  223. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/dependency_links.txt +0 -0
  224. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/entry_points.txt +0 -0
  225. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/requires.txt +0 -0
  226. {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/top_level.txt +0 -0
  227. {opensafely-2.0.2 → opensafely-2.0.4}/pyproject.toml +0 -0
  228. {opensafely-2.0.2 → opensafely-2.0.4}/setup.cfg +0 -0
  229. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_clean.py +0 -0
  230. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_codelists.py +0 -0
  231. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_execute.py +0 -0
  232. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_info.py +0 -0
  233. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_init.py +0 -0
  234. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_launch.py +0 -0
  235. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_packaging.py +0 -0
  236. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_pull.py +0 -0
  237. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_unzip.py +0 -0
  238. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_upgrade.py +0 -0
  239. {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensafely
3
- Version: 2.0.2
3
+ Version: 2.0.4
4
4
  Summary: Command line tool for running OpenSAFELY studies locally.
5
5
  Author-email: OpenSAFELY <tech@opensafely.org>
6
6
  License: GPL-3.0
@@ -0,0 +1 @@
1
+ v2.0.4
@@ -15,7 +15,7 @@ Basic usage:
15
15
 
16
16
  Others methods and usages are available - see the full documentation
17
17
  at <https://github.com/Ousret/charset_normalizer>.
18
- :copyright: (c) 2021 by Ahmed TAHRI
18
+ :copyright: (c) Ahmed TAHRI
19
19
  :license: MIT, see LICENSE for more details.
20
20
  """
21
21
 
@@ -140,16 +140,14 @@ def from_bytes(
140
140
  if is_too_small_sequence:
141
141
  logger.log(
142
142
  TRACE,
143
- "Trying to detect encoding from a tiny portion of ({}) byte(s).".format(
144
- length
145
- ),
143
+ "Trying to detect encoding from a tiny portion of (%i) byte(s).",
144
+ length,
146
145
  )
147
146
  elif is_too_large_sequence:
148
147
  logger.log(
149
148
  TRACE,
150
- "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format(
151
- length
152
- ),
149
+ "Using lazy str decoding because the payload is quite large, (%i) byte(s).",
150
+ length,
153
151
  )
154
152
 
155
153
  prioritized_encodings: list[str] = []
@@ -170,12 +168,6 @@ def from_bytes(
170
168
  tested_but_hard_failure: list[str] = []
171
169
  tested_but_soft_failure: list[str] = []
172
170
  soft_failure_skip: set[str] = set()
173
- success_fast_tracked: set[str] = set()
174
-
175
- # Cache for decoded payload deduplication: hash(decoded_payload) -> (mean_mess_ratio, cd_ratios_merged, passed)
176
- # When multiple encodings decode to the exact same string, we can skip the expensive
177
- # mess_ratio and coherence_ratio analysis and reuse the results from the first encoding.
178
- payload_result_cache: dict[int, tuple[float, list[tuple[str, float]], bool]] = {}
179
171
 
180
172
  # Avoid unoptimized RSS usage.
181
173
  # this cache is mostly interesting for
@@ -222,7 +214,7 @@ def from_bytes(
222
214
  sig_encoding, sig_payload = identify_sig_or_bom(sequences)
223
215
 
224
216
  if sig_encoding is not None:
225
- prioritized_encodings.append(sig_encoding)
217
+ prioritized_encodings.insert(0, sig_encoding)
226
218
  logger.log(
227
219
  TRACE,
228
220
  "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.",
@@ -278,15 +270,6 @@ def from_bytes(
278
270
  )
279
271
  continue
280
272
 
281
- # Skip encodings that were already fast-tracked from a similar successful encoding.
282
- if encoding_iana in success_fast_tracked:
283
- logger.log(
284
- TRACE,
285
- "Skipping %s: already fast-tracked from a similar successful encoding.",
286
- encoding_iana,
287
- )
288
- continue
289
-
290
273
  try:
291
274
  is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana)
292
275
  except (ModuleNotFoundError, ImportError): # Defensive:
@@ -484,12 +467,16 @@ def from_bytes(
484
467
  early_stop_count = max_chunk_gave_up
485
468
  lazy_str_hard_failure = True
486
469
 
487
- # We might want to check the sequence again with the whole content
488
- # Only if initial MD tests passes
470
+ mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0
471
+
472
+ # We might want to check the sequence again with the whole content,
473
+ # but only if initial MD tests passed.
489
474
  if (
490
475
  not lazy_str_hard_failure
491
476
  and is_too_large_sequence
492
477
  and not is_multi_byte_decoder
478
+ and mean_mess_ratio < threshold
479
+ and early_stop_count < max_chunk_gave_up
493
480
  ):
494
481
  try:
495
482
  sequences[int(50e3) :].decode(encoding_iana, errors="strict")
@@ -503,17 +490,10 @@ def from_bytes(
503
490
  tested_but_hard_failure.append(encoding_iana)
504
491
  continue
505
492
 
506
- mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0
507
493
  if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up:
508
494
  tested_but_soft_failure.append(encoding_iana)
509
495
  if encoding_iana in IANA_SUPPORTED_SIMILAR:
510
496
  soft_failure_skip.update(IANA_SUPPORTED_SIMILAR[encoding_iana])
511
- # Cache this soft-failure so identical decoding from other encodings
512
- # can be skipped immediately.
513
- if decoded_payload is not None and not is_multi_byte_decoder:
514
- payload_result_cache.setdefault(
515
- hash(decoded_payload), (mean_mess_ratio, [], False)
516
- )
517
497
  logger.log(
518
498
  TRACE,
519
499
  "%s was excluded because of initial chaos probing. Gave up %i time(s). "
@@ -593,111 +573,6 @@ def from_bytes(
593
573
  tested_but_hard_failure.append(encoding_iana)
594
574
  continue
595
575
 
596
- # Payload-hash deduplication: if another encoding already decoded to the
597
- # exact same string, reuse its mess_ratio and coherence results entirely.
598
- # This is strictly more general than the old IANA_SUPPORTED_SIMILAR approach
599
- # because it catches ALL identical decoding, not just pre-mapped ones.
600
- if decoded_payload is not None and not is_multi_byte_decoder:
601
- payload_hash: int = hash(decoded_payload)
602
- cached = payload_result_cache.get(payload_hash)
603
- if cached is not None:
604
- cached_mess, cached_cd, cached_passed = cached
605
- if cached_passed:
606
- # The previous encoding with identical output passed chaos probing.
607
- fast_match = CharsetMatch(
608
- sequences,
609
- encoding_iana,
610
- cached_mess,
611
- bom_or_sig_available,
612
- cached_cd,
613
- (
614
- decoded_payload
615
- if (
616
- not is_too_large_sequence
617
- or encoding_iana
618
- in [specified_encoding, "ascii", "utf_8"]
619
- )
620
- else None
621
- ),
622
- preemptive_declaration=specified_encoding,
623
- )
624
- results.append(fast_match)
625
- success_fast_tracked.add(encoding_iana)
626
- logger.log(
627
- TRACE,
628
- "%s fast-tracked (identical decoded payload to a prior encoding, chaos=%f %%).",
629
- encoding_iana,
630
- round(cached_mess * 100, ndigits=3),
631
- )
632
-
633
- if (
634
- encoding_iana in [specified_encoding, "ascii", "utf_8"]
635
- and cached_mess < 0.1
636
- ):
637
- if cached_mess == 0.0:
638
- logger.debug(
639
- "Encoding detection: %s is most likely the one.",
640
- fast_match.encoding,
641
- )
642
- if explain:
643
- logger.removeHandler(explain_handler)
644
- logger.setLevel(previous_logger_level)
645
- return CharsetMatches([fast_match])
646
- early_stop_results.append(fast_match)
647
-
648
- if (
649
- len(early_stop_results)
650
- and (specified_encoding is None or specified_encoding in tested)
651
- and "ascii" in tested
652
- and "utf_8" in tested
653
- ):
654
- probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment]
655
- logger.debug(
656
- "Encoding detection: %s is most likely the one.",
657
- probable_result.encoding,
658
- )
659
- if explain:
660
- logger.removeHandler(explain_handler)
661
- logger.setLevel(previous_logger_level)
662
- return CharsetMatches([probable_result])
663
-
664
- continue
665
- else:
666
- # The previous encoding with identical output failed chaos
667
- # probing. Unreachable when the current candidate passed
668
- # probing on the identical payload (deterministic ratios),
669
- # kept for structural parity with the historic flow.
670
- tested_but_soft_failure.append(encoding_iana)
671
- logger.log(
672
- TRACE,
673
- "%s fast-skipped (identical decoded payload to a prior encoding that failed chaos probing).",
674
- encoding_iana,
675
- )
676
- # Prepare fallbacks for special encodings even when skipped.
677
- if enable_fallback and encoding_iana in [
678
- "ascii",
679
- "utf_8",
680
- specified_encoding,
681
- "utf_16",
682
- "utf_32",
683
- ]:
684
- fallback_entry = CharsetMatch(
685
- sequences,
686
- encoding_iana,
687
- threshold,
688
- bom_or_sig_available,
689
- [],
690
- decoded_payload,
691
- preemptive_declaration=specified_encoding,
692
- )
693
- if encoding_iana == specified_encoding:
694
- fallback_specified = fallback_entry
695
- elif encoding_iana == "ascii":
696
- fallback_ascii = fallback_entry
697
- else:
698
- fallback_u8 = fallback_entry
699
- continue
700
-
701
576
  logger.log(
702
577
  TRACE,
703
578
  "%s passed initial chaos probing. Mean measured chaos is %f %%",
@@ -713,9 +588,9 @@ def from_bytes(
713
588
  if target_languages:
714
589
  logger.log(
715
590
  TRACE,
716
- "{} should target any language(s) of {}".format(
717
- encoding_iana, str(target_languages)
718
- ),
591
+ "%s should target any language(s) of %s",
592
+ encoding_iana,
593
+ target_languages,
719
594
  )
720
595
 
721
596
  cd_ratios = []
@@ -746,9 +621,9 @@ def from_bytes(
746
621
  if cd_ratios_merged:
747
622
  logger.log(
748
623
  TRACE,
749
- "We detected language {} using {}".format(
750
- cd_ratios_merged, encoding_iana
751
- ),
624
+ "We detected language %s using %s",
625
+ cd_ratios_merged,
626
+ encoding_iana,
752
627
  )
753
628
 
754
629
  current_match = CharsetMatch(
@@ -770,13 +645,6 @@ def from_bytes(
770
645
 
771
646
  results.append(current_match)
772
647
 
773
- # Cache the successful result for payload-hash deduplication.
774
- if decoded_payload is not None and not is_multi_byte_decoder:
775
- payload_result_cache.setdefault(
776
- hash(decoded_payload),
777
- (mean_mess_ratio, cd_ratios_merged, True),
778
- )
779
-
780
648
  # Count post-definitive same-family SB successes for the early termination cap.
781
649
  # Only count low-mess encodings (< 2%) toward the cap. High-mess encodings are
782
650
  # marginal results that shouldn't prevent better-quality candidates from being
@@ -812,10 +680,11 @@ def from_bytes(
812
680
  and "ascii" in tested
813
681
  and "utf_8" in tested
814
682
  ):
815
- probable_result = early_stop_results.best() # type: ignore[assignment]
683
+ probable_result = early_stop_results.best()
684
+ assert probable_result is not None
816
685
  logger.debug(
817
686
  "Encoding detection: %s is most likely the one.",
818
- probable_result.encoding, # type: ignore[union-attr]
687
+ probable_result.encoding,
819
688
  )
820
689
  if explain: # Defensive: ensure exit path clean handler
821
690
  logger.removeHandler(explain_handler)