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.
- {opensafely-2.0.2 → opensafely-2.0.4}/PKG-INFO +1 -1
- opensafely-2.0.4/opensafely/VERSION +1 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/__init__.py +1 -1
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/api.py +20 -151
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/constant.py +441 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/md.py +175 -114
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/models.py +20 -3
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/utils.py +63 -66
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/version.py +1 -1
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/__init__.py +2 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/cli.py +9 -5
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/codec.py +12 -8
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/compat.py +4 -2
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/core.py +323 -109
- opensafely-2.0.4/opensafely/_vendor/idna/package_data.py +1 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/uts46data.py +55 -54
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/loading.py +2 -2
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/outputs.py +2 -1
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/validation.py +1 -2
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/executors/volumes.py +11 -3
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/PKG-INFO +1 -1
- opensafely-2.0.2/opensafely/VERSION +0 -1
- opensafely-2.0.2/opensafely/_vendor/idna/package_data.py +0 -1
- {opensafely-2.0.2 → opensafely-2.0.4}/LICENSE +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/README.md +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/__main__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/cacert.pem +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/core.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/certifi/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/__main__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/cd.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/cli/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/cli/__main__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/legacy.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/charset_normalizer/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/distro/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/distro/__main__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/distro/distro.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/distro/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/__main__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/idnadata.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/intranges.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/idna/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/_logs/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/_logs/_internal/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/_logs/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/_logs/severity/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/attributes/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/attributes/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/baggage/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/baggage/propagation/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/baggage/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/context/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/context/context.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/context/contextvars_context.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/context/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/environment_variables/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/environment_variables/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/_internal/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/_internal/instrument.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/_internal/observation.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/metrics/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagate/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagate/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagators/_envcarrier.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagators/composite.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagators/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/propagators/textmap.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/propagation/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/propagation/tracecontext.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/span.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/trace/status.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/_decorator.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/_importlib_metadata.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/_once.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/_providers.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/re.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/util/types.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/version/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/opentelemetry/version/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/__main__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/constants.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/exceptions.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/features.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/legacy.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/main.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline/models.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/pipeline.pyi +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/__version__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/_internal_utils.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/_types.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/adapters.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/api.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/auth.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/certs.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/compat.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/cookies.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/exceptions.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/help.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/hooks.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/models.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/packages.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/sessions.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/status_codes.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/structures.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/requests/utils.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/anchor.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/comments.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/compat.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/composer.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/configobjwalker.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/constructor.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/cyaml.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/dumper.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/emitter.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/error.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/events.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/loader.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/main.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/nodes.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/parser.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/reader.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/representer.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/resolver.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scalarbool.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scalarfloat.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scalarint.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scalarstring.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/scanner.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/serializer.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/timestamp.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/tokens.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/ruyaml/util.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/typing_extensions.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/typing_extensions.pyi +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/_base_connection.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/_collections.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/_request_methods.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/_version.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/connection.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/connectionpool.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/connection.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/fetch.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/request.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/emscripten/response.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/pyopenssl.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/contrib/socks.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/exceptions.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/fields.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/filepost.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/http2/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/http2/connection.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/http2/probe.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/poolmanager.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/py.typed +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/response.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/connection.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/proxy.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/request.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/response.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/retry.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/ssl_.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/ssl_match_hostname.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/ssltransport.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/timeout.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/url.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/util.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/_vendor/urllib3/util/wait.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/clean.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/codelists.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/execute.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/info.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/actions.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/cli/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/cli/local_run.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/cli/migrate.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/config.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/create_or_update_jobs.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/executors/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/executors/local.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/job_executor.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/__init__.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/database.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/docker.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/git.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/github_validators.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/log_utils.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/lru_dict.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/path_utils.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/string_utils.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/subprocess_utils.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/lib/yaml_utils.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/models.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/queries.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/reusable_actions.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/run.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jobrunner/tracing.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/jupyter.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/launch.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/pull.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/rstudio.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/unzip.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/upgrade.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely/utils.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/SOURCES.txt +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/dependency_links.txt +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/entry_points.txt +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/requires.txt +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/opensafely.egg-info/top_level.txt +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/pyproject.toml +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/setup.cfg +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_clean.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_codelists.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_execute.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_info.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_init.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_launch.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_packaging.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_pull.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_unzip.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_upgrade.py +0 -0
- {opensafely-2.0.2 → opensafely-2.0.4}/tests/test_utils.py +0 -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)
|
|
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 (
|
|
144
|
-
|
|
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, (
|
|
151
|
-
|
|
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.
|
|
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
|
-
|
|
488
|
-
|
|
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
|
-
"
|
|
717
|
-
|
|
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
|
|
750
|
-
|
|
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()
|
|
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,
|
|
687
|
+
probable_result.encoding,
|
|
819
688
|
)
|
|
820
689
|
if explain: # Defensive: ensure exit path clean handler
|
|
821
690
|
logger.removeHandler(explain_handler)
|