opensafely 2.0.4__tar.gz → 2.1.1__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 (238) hide show
  1. {opensafely-2.0.4 → opensafely-2.1.1}/PKG-INFO +1 -1
  2. opensafely-2.1.1/opensafely/VERSION +1 -0
  3. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/models.py +5 -2
  4. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/validation.py +14 -5
  5. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/actions.py +0 -32
  6. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/config.py +23 -3
  7. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/models.py +1 -1
  8. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/pull.py +0 -2
  9. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely.egg-info/PKG-INFO +1 -1
  10. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_pull.py +0 -2
  11. opensafely-2.0.4/opensafely/VERSION +0 -1
  12. {opensafely-2.0.4 → opensafely-2.1.1}/LICENSE +0 -0
  13. {opensafely-2.0.4 → opensafely-2.1.1}/README.md +0 -0
  14. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/__init__.py +0 -0
  15. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/certifi/__init__.py +0 -0
  16. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/certifi/__main__.py +0 -0
  17. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/certifi/cacert.pem +0 -0
  18. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/certifi/core.py +0 -0
  19. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/certifi/py.typed +0 -0
  20. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/__init__.py +0 -0
  21. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/__main__.py +0 -0
  22. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/api.py +0 -0
  23. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/cd.py +0 -0
  24. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/cli/__init__.py +0 -0
  25. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/cli/__main__.py +0 -0
  26. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/constant.py +0 -0
  27. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/legacy.py +0 -0
  28. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/md.py +0 -0
  29. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/models.py +0 -0
  30. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/py.typed +0 -0
  31. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/utils.py +0 -0
  32. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/charset_normalizer/version.py +0 -0
  33. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/distro/__init__.py +0 -0
  34. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/distro/__main__.py +0 -0
  35. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/distro/distro.py +0 -0
  36. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/distro/py.typed +0 -0
  37. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/__init__.py +0 -0
  38. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/__main__.py +0 -0
  39. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/cli.py +0 -0
  40. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/codec.py +0 -0
  41. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/compat.py +0 -0
  42. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/core.py +0 -0
  43. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/idnadata.py +0 -0
  44. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/intranges.py +0 -0
  45. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/package_data.py +0 -0
  46. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/py.typed +0 -0
  47. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/idna/uts46data.py +0 -0
  48. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/_logs/__init__.py +0 -0
  49. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/_logs/_internal/__init__.py +0 -0
  50. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/_logs/py.typed +0 -0
  51. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/_logs/severity/__init__.py +0 -0
  52. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/attributes/__init__.py +0 -0
  53. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/attributes/py.typed +0 -0
  54. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/baggage/__init__.py +0 -0
  55. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/baggage/propagation/__init__.py +0 -0
  56. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/baggage/py.typed +0 -0
  57. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/context/__init__.py +0 -0
  58. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/context/context.py +0 -0
  59. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/context/contextvars_context.py +0 -0
  60. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/context/py.typed +0 -0
  61. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/environment_variables/__init__.py +0 -0
  62. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/environment_variables/py.typed +0 -0
  63. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/metrics/__init__.py +0 -0
  64. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/metrics/_internal/__init__.py +0 -0
  65. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/metrics/_internal/instrument.py +0 -0
  66. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/metrics/_internal/observation.py +0 -0
  67. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/metrics/py.typed +0 -0
  68. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/propagate/__init__.py +0 -0
  69. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/propagate/py.typed +0 -0
  70. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/propagators/_envcarrier.py +0 -0
  71. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/propagators/composite.py +0 -0
  72. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/propagators/py.typed +0 -0
  73. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/propagators/textmap.py +0 -0
  74. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/py.typed +0 -0
  75. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/trace/__init__.py +0 -0
  76. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/trace/propagation/__init__.py +0 -0
  77. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/trace/propagation/tracecontext.py +0 -0
  78. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/trace/py.typed +0 -0
  79. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/trace/span.py +0 -0
  80. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/trace/status.py +0 -0
  81. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/util/_decorator.py +0 -0
  82. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/util/_importlib_metadata.py +0 -0
  83. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/util/_once.py +0 -0
  84. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/util/_providers.py +0 -0
  85. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/util/py.typed +0 -0
  86. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/util/re.py +0 -0
  87. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/util/types.py +0 -0
  88. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/version/__init__.py +0 -0
  89. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/opentelemetry/version/py.typed +0 -0
  90. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/__init__.py +0 -0
  91. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/__main__.py +0 -0
  92. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/constants.py +0 -0
  93. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/exceptions.py +0 -0
  94. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/features.py +0 -0
  95. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/legacy.py +0 -0
  96. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/loading.py +0 -0
  97. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/main.py +0 -0
  98. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline/outputs.py +0 -0
  99. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/pipeline.pyi +0 -0
  100. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/__init__.py +0 -0
  101. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/__version__.py +0 -0
  102. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/_internal_utils.py +0 -0
  103. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/_types.py +0 -0
  104. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/adapters.py +0 -0
  105. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/api.py +0 -0
  106. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/auth.py +0 -0
  107. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/certs.py +0 -0
  108. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/compat.py +0 -0
  109. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/cookies.py +0 -0
  110. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/exceptions.py +0 -0
  111. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/help.py +0 -0
  112. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/hooks.py +0 -0
  113. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/models.py +0 -0
  114. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/packages.py +0 -0
  115. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/py.typed +0 -0
  116. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/sessions.py +0 -0
  117. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/status_codes.py +0 -0
  118. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/structures.py +0 -0
  119. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/requests/utils.py +0 -0
  120. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/__init__.py +0 -0
  121. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/anchor.py +0 -0
  122. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/comments.py +0 -0
  123. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/compat.py +0 -0
  124. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/composer.py +0 -0
  125. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/configobjwalker.py +0 -0
  126. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/constructor.py +0 -0
  127. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/cyaml.py +0 -0
  128. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/dumper.py +0 -0
  129. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/emitter.py +0 -0
  130. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/error.py +0 -0
  131. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/events.py +0 -0
  132. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/loader.py +0 -0
  133. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/main.py +0 -0
  134. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/nodes.py +0 -0
  135. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/parser.py +0 -0
  136. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/py.typed +0 -0
  137. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/reader.py +0 -0
  138. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/representer.py +0 -0
  139. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/resolver.py +0 -0
  140. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/scalarbool.py +0 -0
  141. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/scalarfloat.py +0 -0
  142. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/scalarint.py +0 -0
  143. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/scalarstring.py +0 -0
  144. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/scanner.py +0 -0
  145. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/serializer.py +0 -0
  146. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/timestamp.py +0 -0
  147. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/tokens.py +0 -0
  148. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/ruyaml/util.py +0 -0
  149. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/typing_extensions.py +0 -0
  150. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/typing_extensions.pyi +0 -0
  151. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/__init__.py +0 -0
  152. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/_base_connection.py +0 -0
  153. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/_collections.py +0 -0
  154. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/_request_methods.py +0 -0
  155. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/_version.py +0 -0
  156. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/connection.py +0 -0
  157. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/connectionpool.py +0 -0
  158. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/contrib/__init__.py +0 -0
  159. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/contrib/emscripten/__init__.py +0 -0
  160. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/contrib/emscripten/connection.py +0 -0
  161. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/contrib/emscripten/fetch.py +0 -0
  162. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/contrib/emscripten/request.py +0 -0
  163. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/contrib/emscripten/response.py +0 -0
  164. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/contrib/pyopenssl.py +0 -0
  165. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/contrib/socks.py +0 -0
  166. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/exceptions.py +0 -0
  167. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/fields.py +0 -0
  168. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/filepost.py +0 -0
  169. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/http2/__init__.py +0 -0
  170. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/http2/connection.py +0 -0
  171. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/http2/probe.py +0 -0
  172. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/poolmanager.py +0 -0
  173. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/py.typed +0 -0
  174. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/response.py +0 -0
  175. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/__init__.py +0 -0
  176. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/connection.py +0 -0
  177. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/proxy.py +0 -0
  178. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/request.py +0 -0
  179. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/response.py +0 -0
  180. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/retry.py +0 -0
  181. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/ssl_.py +0 -0
  182. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/ssl_match_hostname.py +0 -0
  183. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/ssltransport.py +0 -0
  184. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/timeout.py +0 -0
  185. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/url.py +0 -0
  186. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/util.py +0 -0
  187. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/_vendor/urllib3/util/wait.py +0 -0
  188. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/clean.py +0 -0
  189. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/codelists.py +0 -0
  190. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/execute.py +0 -0
  191. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/info.py +0 -0
  192. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/__init__.py +0 -0
  193. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/cli/__init__.py +0 -0
  194. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/cli/local_run.py +0 -0
  195. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/cli/migrate.py +0 -0
  196. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/create_or_update_jobs.py +0 -0
  197. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/executors/__init__.py +0 -0
  198. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/executors/local.py +0 -0
  199. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/executors/volumes.py +0 -0
  200. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/job_executor.py +0 -0
  201. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/__init__.py +0 -0
  202. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/database.py +0 -0
  203. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/docker.py +0 -0
  204. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/git.py +0 -0
  205. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/github_validators.py +0 -0
  206. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/log_utils.py +0 -0
  207. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/lru_dict.py +0 -0
  208. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/path_utils.py +0 -0
  209. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/string_utils.py +0 -0
  210. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/subprocess_utils.py +0 -0
  211. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/lib/yaml_utils.py +0 -0
  212. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/queries.py +0 -0
  213. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/reusable_actions.py +0 -0
  214. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/run.py +0 -0
  215. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jobrunner/tracing.py +0 -0
  216. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/jupyter.py +0 -0
  217. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/launch.py +0 -0
  218. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/rstudio.py +0 -0
  219. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/unzip.py +0 -0
  220. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/upgrade.py +0 -0
  221. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely/utils.py +0 -0
  222. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely.egg-info/SOURCES.txt +0 -0
  223. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely.egg-info/dependency_links.txt +0 -0
  224. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely.egg-info/entry_points.txt +0 -0
  225. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely.egg-info/requires.txt +0 -0
  226. {opensafely-2.0.4 → opensafely-2.1.1}/opensafely.egg-info/top_level.txt +0 -0
  227. {opensafely-2.0.4 → opensafely-2.1.1}/pyproject.toml +0 -0
  228. {opensafely-2.0.4 → opensafely-2.1.1}/setup.cfg +0 -0
  229. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_clean.py +0 -0
  230. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_codelists.py +0 -0
  231. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_execute.py +0 -0
  232. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_info.py +0 -0
  233. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_init.py +0 -0
  234. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_launch.py +0 -0
  235. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_packaging.py +0 -0
  236. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_unzip.py +0 -0
  237. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_upgrade.py +0 -0
  238. {opensafely-2.0.4 → opensafely-2.1.1}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensafely
3
- Version: 2.0.4
3
+ Version: 2.1.1
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.1.1
@@ -212,8 +212,11 @@ class Action:
212
212
 
213
213
  if re.match(r"cohortextractor:\S+ generate_cohort", run.raw):
214
214
  validate_cohortextractor_outputs(action_id, action)
215
- if re.match(r"(ehrql|databuilder):\S+ generate[-_]dataset", run.raw):
216
- validate_ehrql_outputs(action_id, action)
215
+ if match := re.match(
216
+ r"(ehrql|databuilder):\S+ generate[-_](?P<ehrql_type>dataset|measures)",
217
+ run.raw,
218
+ ):
219
+ validate_ehrql_outputs(action_id, action, match.group("ehrql_type"))
217
220
 
218
221
  return action
219
222
 
@@ -156,14 +156,16 @@ def validate_cohortextractor_outputs(action_id: str, action: Action) -> None:
156
156
  )
157
157
 
158
158
 
159
- def validate_ehrql_outputs(action_id: str, action: Action) -> None:
159
+ def validate_ehrql_outputs(action_id: str, action: Action, ehrql_type: str) -> None:
160
160
  """
161
161
  Check ehrQL's output config is valid for this command
162
162
 
163
163
  We can't validate outputs in the Action or Outputs models because we need
164
164
  to look up other fields (eg run).
165
165
  """
166
- if action.outputs.moderately_sensitive or action.outputs.minimally_sensitive:
166
+ if ehrql_type == "dataset" and (
167
+ action.outputs.moderately_sensitive or action.outputs.minimally_sensitive
168
+ ):
167
169
  raise ValidationError(
168
170
  f"`{action_id}` action uses `generate-dataset` and so all outputs must "
169
171
  f"be labelled `highly_sensitive`"
@@ -173,11 +175,18 @@ def validate_ehrql_outputs(action_id: str, action: Action) -> None:
173
175
  if not output_spec:
174
176
  raise ValidationError(
175
177
  f"`{action_id}` action does not provide an `--output` argument specifying "
176
- f"where the results of `generate-dataset` should be stored"
178
+ f"where the results of `generate-{ehrql_type}` should be stored"
177
179
  )
178
180
 
179
- output_patterns = (action.outputs.highly_sensitive or {}).values()
180
- if not output_patterns_match_spec(output_spec, list(output_patterns)):
181
+ if ehrql_type == "dataset":
182
+ output_patterns = list((action.outputs.highly_sensitive or {}).values())
183
+ else:
184
+ assert ehrql_type == "measures"
185
+ output_patterns = list((action.outputs.highly_sensitive or {}).values()) + list(
186
+ (action.outputs.moderately_sensitive or {}).values()
187
+ )
188
+
189
+ if not output_patterns_match_spec(output_spec, output_patterns):
181
190
  expected = expected_pattern_for_spec(output_spec)
182
191
  formatted_patterns = " \n".join(output_patterns)
183
192
  raise ValidationError(
@@ -4,9 +4,6 @@ import shlex
4
4
 
5
5
  from opensafely._vendor.pipeline.exceptions import ProjectValidationError
6
6
  from opensafely._vendor.pipeline.models import Action
7
- from opensafely._vendor.pipeline.outputs import get_output_dirs
8
-
9
- from opensafely.jobrunner.lib.path_utils import ensure_unix_path
10
7
 
11
8
 
12
9
  class UnknownActionError(ProjectValidationError):
@@ -54,27 +51,6 @@ def get_action_specification(config, action_id, using_dummy_data_backend=False):
54
51
  json.dumps(action_spec.config).replace("'", r"\u0027"),
55
52
  ]
56
53
 
57
- # Special case handling for the `cohortextractor generate_cohort` command
58
- if is_cohortextractor_generate_cohort(run_parts):
59
- # Set the size of the dummy data population, if that's what we're
60
- # generating. Possibly this should be moved to the study definition
61
- # anyway, which would make this unnecessary.
62
- if using_dummy_data_backend:
63
- if action_spec.dummy_data_file is not None:
64
- run_parts.append(
65
- f"--dummy-data-file={ensure_unix_path(action_spec.dummy_data_file)}"
66
- )
67
- else:
68
- size = config.expectations.population_size
69
- run_parts.append(f"--expectations-population={size}")
70
-
71
- output_dirs = get_output_dirs(action_spec.outputs)
72
-
73
- if len(output_dirs) == 1:
74
- # Automatically configure the cohortextractor to produce output in the
75
- # directory the `outputs` spec is expecting.
76
- run_parts.append(f"--output-dir={output_dirs[0]}")
77
-
78
54
  run_command = shlex.join(run_parts)
79
55
 
80
56
  return ActionSpecification(
@@ -83,11 +59,3 @@ def get_action_specification(config, action_id, using_dummy_data_backend=False):
83
59
  outputs=action_spec.outputs.dict(),
84
60
  action=action_spec,
85
61
  )
86
-
87
-
88
- def is_cohortextractor_generate_cohort(args):
89
- return (
90
- len(args) > 1
91
- and args[0].startswith("cohortextractor:")
92
- and args[1] == "generate_cohort"
93
- )
@@ -76,7 +76,6 @@ else:
76
76
  USING_DUMMY_DATA_BACKEND = BACKEND == "expectations"
77
77
 
78
78
  ALLOWED_IMAGES = {
79
- "cohortextractor",
80
79
  "databuilder",
81
80
  "ehrql",
82
81
  "stata-mp",
@@ -214,15 +213,36 @@ ENABLE_MAINTENANCE_MODE_THREAD = os.environ.get(
214
213
 
215
214
 
216
215
  # Map known exit codes to user-friendly messages
216
+ # Taken from https://github.com/opensafely-core/job-runner/blob/dd0c916db15168d3d0be0134c1dc1fbb7f54785a/controller/config.py#L160
217
217
  DATABASE_EXIT_CODES = {
218
- # Custom database-related exit codes return from cohortextractor, see
219
- # https://github.com/opensafely-core/cohort-extractor/blob/0a314a909817dbcc48907643e0b6eeff319337db/cohortextractor/cohortextractor.py#L787
218
+ # Custom database-related exit codes return from ehrQL, see e.g.
219
+ # https://github.com/opensafely-core/ehrql/blob/868e07b9d3638996c14a573030ca946765d8fdf9/ehrql/backends/tpp.py#L229-L254
220
+ # These are unlikely to be hit since the CLI always uses dummy data and ehrql's
221
+ # in-memory engine
220
222
  3: (
221
223
  "A transient database error occurred, your job may run "
222
224
  "if you try it again, if it keeps failing then contact tech support"
223
225
  ),
224
226
  4: "New data is being imported into the database, please try again in a few hours",
225
227
  5: "Something went wrong with the database, please contact tech support",
228
+ 6: (
229
+ "Your ehrQL is valid but it produced SQL which is too complex for the database"
230
+ " to run; please contact tech-support so we can help you simplify it."
231
+ ),
232
+ # Other ehrQL exit codes with specific meanings, see:
233
+ # https://github.com/opensafely-core/ehrql/blob/868e07b9d3638996c14a573030ca946765d8fdf9/ehrql/__main__.py#L112
234
+ # https://github.com/opensafely-core/ehrql/blob/868e07b9d3638996c14a573030ca946765d8fdf9/ehrql/exceptions.py#L66
235
+ # Messages have been modified to remove instructions that only apply to real
236
+ # jobs run in the backend (e.g. to check code runs locally, or to contact tech-support)
237
+ 2: ("There was a problem with the command line arguments in your ehrQL action"),
238
+ 10: "There was a problem reading your ehrQL code",
239
+ 11: "There was a problem reading one of the supplied data files",
240
+ 12: "You do not have the required permissions for the ehrQL you are trying to run",
241
+ 13: "Assurance tests failed",
242
+ 14: (
243
+ "Your job was making such slow progress that it was unlikely to complete "
244
+ "successfully"
245
+ ),
226
246
  }
227
247
 
228
248
 
@@ -212,7 +212,7 @@ class Job:
212
212
  commit: str = None
213
213
  # Name of workspace (effectively, the output directory)
214
214
  workspace: str = None
215
- # Only applicable to "generate_cohort" jobs: the name of the database to
215
+ # Only applicable to "generate-dataset" jobs: the name of the database to
216
216
  # query against
217
217
  database_name: str = None
218
218
  # Name of the action (one of the keys in the `actions` dict in
@@ -170,8 +170,6 @@ def remove_deprecated_images(local_images):
170
170
  def get_default_version_for_image(name):
171
171
  if name in ["python", "r", "rstudio"]:
172
172
  return "v2"
173
- elif name == "cohortextractor":
174
- return "latest"
175
173
  else:
176
174
  return "v1"
177
175
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensafely
3
- Version: 2.0.4
3
+ Version: 2.1.1
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
@@ -44,7 +44,6 @@ def test_default_no_local_images(run, capsys):
44
44
  def test_default_no_local_images_force(run, capsys):
45
45
  run.expect(["docker", "info"])
46
46
  expect_local_images(run)
47
- run.expect(["docker", "pull", tag("cohortextractor", version="latest")])
48
47
  run.expect(["docker", "pull", tag("ehrql")])
49
48
  run.expect(["docker", "pull", tag("jupyter")])
50
49
  run.expect(["docker", "pull", tag("python", version="v2")])
@@ -67,7 +66,6 @@ def test_default_no_local_images_force(run, capsys):
67
66
  out, err = capsys.readouterr()
68
67
  assert err == ""
69
68
  assert out.splitlines() == [
70
- "Updating OpenSAFELY cohortextractor:latest image",
71
69
  "Updating OpenSAFELY ehrql:v1 image",
72
70
  "Updating OpenSAFELY jupyter:v1 image",
73
71
  "Updating OpenSAFELY python:v2 image",
@@ -1 +0,0 @@
1
- v2.0.4
File without changes
File without changes
File without changes
File without changes