c2cwsgiutils 5.2.3__tar.gz → 5.2.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 (65) hide show
  1. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/PKG-INFO +13 -1
  2. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/README.md +7 -0
  3. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/acceptance/connection.py +18 -1
  4. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/auth.py +20 -16
  5. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/broadcast/__init__.py +1 -0
  6. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/client_info.py +10 -0
  7. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/config_utils.py +1 -0
  8. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/db.py +1 -0
  9. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/errors.py +2 -1
  10. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/health_check.py +1 -0
  11. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/pyramid_logging.py +1 -0
  12. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/request_tracking/__init__.py +1 -0
  13. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/request_tracking/_sql.py +3 -2
  14. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/setup_process.py +0 -1
  15. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sql_profiler/__init__.py +1 -0
  16. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sql_profiler/_impl.py +1 -0
  17. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sqlalchemylogger/handlers.py +2 -2
  18. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/stats_pyramid/__init__.py +1 -0
  19. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/pyproject.toml +21 -16
  20. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/LICENSE +0 -0
  21. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/__init__.py +0 -0
  22. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/acceptance/__init__.py +0 -0
  23. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/acceptance/composition.py +0 -0
  24. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/acceptance/image.py +0 -0
  25. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/acceptance/print.py +0 -0
  26. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/acceptance/utils.py +0 -0
  27. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/broadcast/interface.py +0 -0
  28. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/broadcast/local.py +0 -0
  29. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/broadcast/redis.py +0 -0
  30. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/broadcast/utils.py +0 -0
  31. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/coverage_setup.py +0 -0
  32. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/db_maintenance_view.py +0 -0
  33. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/debug/__init__.py +0 -0
  34. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/debug/_listeners.py +0 -0
  35. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/debug/_views.py +0 -0
  36. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/debug/utils.py +0 -0
  37. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/index.py +0 -0
  38. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/loader.py +0 -0
  39. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/logging_view.py +0 -0
  40. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/metrics.py +0 -0
  41. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/models_graph.py +0 -0
  42. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/pretty_json.py +0 -0
  43. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/profiler.py +0 -0
  44. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/prometheus.py +0 -0
  45. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/py.typed +0 -0
  46. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/pyramid.py +0 -0
  47. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/redis_stats.py +0 -0
  48. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/redis_utils.py +0 -0
  49. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/scripts/__init__.py +0 -0
  50. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/scripts/check_es.py +0 -0
  51. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/scripts/genversion.py +0 -0
  52. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/scripts/stats_db.py +0 -0
  53. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/scripts/test_print.py +0 -0
  54. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sentry.py +0 -0
  55. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/services.py +0 -0
  56. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sqlalchemylogger/README.md +0 -0
  57. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sqlalchemylogger/__init__.py +0 -0
  58. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sqlalchemylogger/_filters.py +0 -0
  59. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sqlalchemylogger/_models.py +0 -0
  60. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/sqlalchemylogger/examples/example.py +0 -0
  61. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/stats.py +0 -0
  62. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/stats_pyramid/_db_spy.py +0 -0
  63. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/stats_pyramid/_pyramid_spy.py +0 -0
  64. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/stats_pyramid/_views.py +0 -0
  65. {c2cwsgiutils-5.2.3 → c2cwsgiutils-5.2.4}/c2cwsgiutils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: c2cwsgiutils
3
- Version: 5.2.3
3
+ Version: 5.2.4
4
4
  Summary: Common utilities for Camptocamp WSGI applications
5
5
  Home-page: https://github.com/camptocamp/c2cwsgiutils
6
6
  License: BSD-2-Clause
@@ -37,9 +37,11 @@ Requires-Dist: cee_syslog_handler ; extra == "standard" or extra == "all"
37
37
  Requires-Dist: certifi
38
38
  Requires-Dist: cornice ; extra == "standard" or extra == "all"
39
39
  Requires-Dist: gunicorn ; extra == "standard" or extra == "all"
40
+ Requires-Dist: idna
40
41
  Requires-Dist: lxml ; extra == "standard" or extra == "all"
41
42
  Requires-Dist: netifaces ; extra == "standard" or extra == "all"
42
43
  Requires-Dist: objgraph ; extra == "standard" or extra == "all"
44
+ Requires-Dist: pillow
43
45
  Requires-Dist: psycopg2 ; extra == "standard" or extra == "all"
44
46
  Requires-Dist: pyjwt ; extra == "oauth2" or extra == "all"
45
47
  Requires-Dist: pyramid ; extra == "standard" or extra == "all"
@@ -52,7 +54,10 @@ Requires-Dist: scikit-image ; extra == "test-images"
52
54
  Requires-Dist: scipy
53
55
  Requires-Dist: sentry-sdk ; extra == "standard" or extra == "all"
54
56
  Requires-Dist: ujson ; extra == "standard" or extra == "all"
57
+ Requires-Dist: urllib3
55
58
  Requires-Dist: waitress ; extra == "dev" or extra == "all"
59
+ Requires-Dist: webob
60
+ Requires-Dist: zipp
56
61
  Requires-Dist: zope.interface ; extra == "standard" or extra == "all"
57
62
  Requires-Dist: zope.sqlalchemy ; extra == "standard" or extra == "all"
58
63
  Project-URL: Repository, https://github.com/camptocamp/c2cwsgiutils
@@ -726,3 +731,10 @@ To make a release:
726
731
  - Add the new branch name in the `.github/workflows/rebuild.yaml` and
727
732
  `.github/workflows/audit.yaml` files.
728
733
 
734
+ ## Pserve
735
+
736
+ Pserve will not set the headers in the environment then if you are behind a reverse proxy, you will have
737
+ wrong values in client information, you can force them by using the environment variables:
738
+ `C2CWSGIUTILS_FORCE_PROTO`, `C2CWSGIUTILS_FORCE_HOST` `C2CWSGIUTILS_FORCE_SERVER_NAME` and
739
+ `C2CWSGIUTILS_FORCE_REMOTE_ADDR`.
740
+
@@ -665,3 +665,10 @@ To make a release:
665
665
  - Tag the GIT commit.
666
666
  - Add the new branch name in the `.github/workflows/rebuild.yaml` and
667
667
  `.github/workflows/audit.yaml` files.
668
+
669
+ ## Pserve
670
+
671
+ Pserve will not set the headers in the environment then if you are behind a reverse proxy, you will have
672
+ wrong values in client information, you can force them by using the environment variables:
673
+ `C2CWSGIUTILS_FORCE_PROTO`, `C2CWSGIUTILS_FORCE_HOST` `C2CWSGIUTILS_FORCE_SERVER_NAME` and
674
+ `C2CWSGIUTILS_FORCE_REMOTE_ADDR`.
@@ -159,12 +159,29 @@ class Connection:
159
159
  cache_expected: CacheExpected = CacheExpected.NO,
160
160
  **kwargs: Any,
161
161
  ) -> Any:
162
- """POST the given URL (relative to the root of API)."""
162
+ """PUT the given URL (relative to the root of API)."""
163
163
  with self.session.put(self.base_url + url, headers=self._merge_headers(headers, cors), **kwargs) as r:
164
164
  check_response(r, expected_status, cache_expected)
165
165
  self._check_cors(cors, r)
166
166
  return _get_json(r)
167
167
 
168
+ def patch_json(
169
+ self,
170
+ url: str,
171
+ expected_status: int = 200,
172
+ headers: Optional[Mapping[str, str]] = None,
173
+ cors: bool = True,
174
+ cache_expected: CacheExpected = CacheExpected.NO,
175
+ **kwargs: Any,
176
+ ) -> Any:
177
+ """PATCH the given URL (relative to the root of API)."""
178
+ with self.session.patch(
179
+ self.base_url + url, headers=self._merge_headers(headers, cors), **kwargs
180
+ ) as r:
181
+ check_response(r, expected_status, cache_expected)
182
+ self._check_cors(cors, r)
183
+ return _get_json(r)
184
+
168
185
  def delete(
169
186
  self,
170
187
  url: str,
@@ -217,22 +217,26 @@ def check_access(
217
217
  return check_access_config(
218
218
  request,
219
219
  {
220
- "github_repository": env_or_settings(
221
- settings,
222
- GITHUB_REPOSITORY_ENV,
223
- GITHUB_REPOSITORY_PROP,
224
- "",
225
- )
226
- if repo is None
227
- else repo,
228
- "github_access_type": env_or_settings(
229
- settings,
230
- GITHUB_ACCESS_TYPE_ENV,
231
- GITHUB_ACCESS_TYPE_PROP,
232
- "pull",
233
- )
234
- if access_type is None
235
- else access_type,
220
+ "github_repository": (
221
+ env_or_settings(
222
+ settings,
223
+ GITHUB_REPOSITORY_ENV,
224
+ GITHUB_REPOSITORY_PROP,
225
+ "",
226
+ )
227
+ if repo is None
228
+ else repo
229
+ ),
230
+ "github_access_type": (
231
+ env_or_settings(
232
+ settings,
233
+ GITHUB_ACCESS_TYPE_ENV,
234
+ GITHUB_ACCESS_TYPE_PROP,
235
+ "pull",
236
+ )
237
+ if access_type is None
238
+ else access_type
239
+ ),
236
240
  },
237
241
  )
238
242
 
@@ -1,4 +1,5 @@
1
1
  """Broadcast messages to all the processes of Gunicorn in every containers."""
2
+
2
3
  import functools
3
4
  import logging
4
5
  import warnings
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import re
2
3
  from typing import Any, Callable, Dict
3
4
 
@@ -22,6 +23,15 @@ class Filter:
22
23
  else:
23
24
  _handle_others(environ)
24
25
 
26
+ if "C2CWSGIUTILS_FORCE_PROTO" in os.environ:
27
+ environ["wsgi.url_scheme"] = os.environ["C2CWSGIUTILS_FORCE_PROTO"]
28
+ if "C2CWSGIUTILS_FORCE_HOST" in os.environ:
29
+ environ["HTTP_HOST"] = os.environ["C2CWSGIUTILS_FORCE_HOST"]
30
+ if "C2CWSGIUTILS_FORCE_SERVER_NAME" in os.environ:
31
+ environ["SERVER_NAME"] = os.environ["C2CWSGIUTILS_FORCE_SERVER_NAME"]
32
+ if "C2CWSGIUTILS_FORCE_REMOTE_ADDR" in os.environ:
33
+ environ["REMOTE_ADDR"] = os.environ["C2CWSGIUTILS_FORCE_REMOTE_ADDR"]
34
+
25
35
  return self._application(environ, start_response)
26
36
 
27
37
 
@@ -1,4 +1,5 @@
1
1
  """Private utilities."""
2
+
2
3
  import os
3
4
  from typing import Any, Callable, Mapping, Optional, cast
4
5
 
@@ -1,4 +1,5 @@
1
1
  """SQLalchemy models."""
2
+
2
3
  import logging
3
4
  import re
4
5
  import warnings
@@ -1,4 +1,5 @@
1
1
  """Install exception views to have nice JSON error pages."""
2
+
2
3
  import logging
3
4
  import os
4
5
  import traceback
@@ -20,7 +21,7 @@ DEPRECATED_ENV_KEY = "ERROR_DETAILS_SECRET"
20
21
  LOG = logging.getLogger(__name__)
21
22
  STATUS_LOGGER = {
22
23
  401: LOG.debug,
23
- 500: LOG.error
24
+ 500: LOG.error,
24
25
  # The rest are warnings
25
26
  }
26
27
 
@@ -4,6 +4,7 @@ Setup an health_check API.
4
4
  To use it, create an instance of this class in your application initialization and do a few calls to its
5
5
  methods add_db_check()
6
6
  """
7
+
7
8
  import configparser
8
9
  import copy
9
10
  import logging
@@ -10,6 +10,7 @@ To add some info about requests:
10
10
 
11
11
  A pyramid event handler is installed to setup this filter for the current request.
12
12
  """
13
+
13
14
  import json
14
15
  import logging
15
16
  import logging.config
@@ -3,6 +3,7 @@ Allows to track the request_id in the logs, the DB and others.
3
3
 
4
4
  Adds a c2c_request_id attribute to the Pyramid Request class to access it.
5
5
  """
6
+
6
7
  import logging
7
8
  import urllib.parse
8
9
  import uuid
@@ -5,7 +5,7 @@ from pyramid.threadlocal import get_current_request
5
5
  from sqlalchemy.orm import Session
6
6
 
7
7
 
8
- def _add_session_id(session: Session, _transaction: Any, _connection: Any) -> None:
8
+ def _add_session_id(session: Session, _transaction: Any) -> None:
9
9
  request = get_current_request()
10
10
  if request is not None:
11
11
  session.execute(
@@ -15,4 +15,5 @@ def _add_session_id(session: Session, _transaction: Any, _connection: Any) -> No
15
15
 
16
16
  def init() -> None:
17
17
  """Initialize the SQL alchemy session selector."""
18
- sqlalchemy.event.listen(Session, "after_begin", _add_session_id)
18
+
19
+ sqlalchemy.event.listen(Session, "after_transaction_create", _add_session_id)
@@ -4,7 +4,6 @@ Used by standalone (non-wsgi) processes to setup all the bits and pieces of c2cw
4
4
  Must be imported at the very beginning of the process's life, before any other module is imported.
5
5
  """
6
6
 
7
-
8
7
  import argparse
9
8
  import warnings
10
9
  from typing import Any, Callable, Dict, Optional, TypedDict, cast
@@ -3,6 +3,7 @@ A view (URL=/sql_provider) allowing to enabled/disable a SQL spy.
3
3
 
4
4
  That runs an "EXPLAIN ANALYZE" on every SELECT query going through SQLAlchemy.
5
5
  """
6
+
6
7
  import logging
7
8
  import warnings
8
9
 
@@ -3,6 +3,7 @@ A view (URL=/sql_provider) allowing to enabled/disable a SQL spy.
3
3
 
4
4
  That runs an "EXPLAIN ANALYZE" on every SELECT query going through SQLAlchemy.
5
5
  """
6
+
6
7
  import logging
7
8
  import re
8
9
  from threading import Lock
@@ -76,7 +76,7 @@ class SQLAlchemyHandler(logging.Handler):
76
76
  try:
77
77
  self.session.bulk_save_objects(logs)
78
78
  self.session.commit()
79
- except (SQLAlchemyError):
79
+ except SQLAlchemyError:
80
80
  try:
81
81
  self.create_db()
82
82
  self.session.rollback()
@@ -101,7 +101,7 @@ class SQLAlchemyHandler(logging.Handler):
101
101
  with self.engine.begin() as connection:
102
102
  if not self.engine.dialect.has_schema(connection, self.Log.__table_args__["schema"]):
103
103
  connection.execute(
104
- sqlalchemy.schema.CreateSchema(self.Log.__table_args__["schema"]), # type: ignore
104
+ sqlalchemy.schema.CreateSchema(self.Log.__table_args__["schema"]),
105
105
  )
106
106
  Base.metadata.create_all(self.engine)
107
107
 
@@ -1,4 +1,5 @@
1
1
  """Generate statsd metrics for pyramid and SQLAlchemy events."""
2
+
2
3
  import warnings
3
4
 
4
5
  import pyramid.config
@@ -21,7 +21,7 @@ strict = true
21
21
 
22
22
  [tool.poetry]
23
23
  name = "c2cwsgiutils"
24
- version = "5.2.3"
24
+ version = "5.2.4"
25
25
  description = "Common utilities for Camptocamp WSGI applications"
26
26
  readme = "README.md"
27
27
  authors = ["Camptocamp <info@camptocamp.com>"]
@@ -68,23 +68,23 @@ sentry = "c2cwsgiutils.sentry:filter_factory"
68
68
 
69
69
  [tool.poetry.dependencies]
70
70
  python = ">=3.8,<3.12"
71
- requests = "2.31.0"
72
- pyyaml = { version = "6.0.1" }
71
+ requests = "2.32.3"
72
+ pyyaml = { version = "6.0.2" }
73
73
  alembic = { version = "1.9.4", optional = true }
74
74
  boltons = { version = "21.0.0", optional = true }
75
75
  cornice = { version = "6.0.1", optional = true }
76
- redis = "4.4.4"
77
- gunicorn = { version = "20.1.0", optional = true }
78
- lxml = { version = "4.9.3", optional = true }
76
+ redis = { version = "4.4.4", optional = true }
77
+ gunicorn = { version = "22.0.0", optional = true }
78
+ lxml = { version = "4.9.4", optional = true }
79
79
  netifaces = { version = "0.11.0", optional = true }
80
80
  objgraph = { version = "3.5.0", optional = true }
81
- psycopg2 = { version = "2.9.6", optional = true }
82
- pyramid = { version = "2.0.1", optional = true }
81
+ psycopg2 = { version = "2.9.10", optional = true }
82
+ pyramid = { version = "2.0.2", optional = true }
83
83
  pyramid-tm = { version = "2.5", optional = true }
84
- sentry-sdk = { version = "1.14.0", optional = true }
84
+ sentry-sdk = "2.8.0"
85
85
  ujson = { version = "5.7.0", optional = true }
86
86
  cee_syslog_handler = { version = "0.6.0", optional = true }
87
- SQLAlchemy = { version = "2.0.15", optional = true }
87
+ SQLAlchemy = { version = "2.0.36", optional = true }
88
88
  SQLAlchemy-Utils = { version = "0.39.0", optional = true }
89
89
  "zope.interface" = { version = "5.5.2", optional = true }
90
90
  "zope.sqlalchemy" = { version = "1.6", optional = true }
@@ -92,8 +92,13 @@ pyjwt = { version = "2.6.0", optional = true }
92
92
  requests-oauthlib = { version = "1.3.1", optional = true }
93
93
  waitress = { version = "2.1.2", optional = true }
94
94
  scikit-image = { version = "0.19.3", optional = true }
95
- certifi = "2023.7.22"
96
- scipy = "1.10.1"
95
+ certifi = "2024.7.4"
96
+ scipy = { version = "1.10.1", optional = true }
97
+ pillow = { version = "10.3.0", optional = true }
98
+ urllib3 = "1.26.20"
99
+ idna = { version = "3.7", optional = true }
100
+ zipp = "3.19.3"
101
+ webob = "1.8.9"
97
102
 
98
103
  [tool.poetry.extras]
99
104
  standard = [
@@ -149,16 +154,16 @@ test_images = ["scikit-image"]
149
154
  # pylint = { version = "2.15.6" }
150
155
  prospector = { extras = ["with_bandit", "with_mypy", "with_pyroma"], version = "1.8.4" }
151
156
  coverage = "7.1.0"
152
- junit2html = "30.1.3"
157
+ junit2html = "30.1.6"
153
158
  pytest = "7.2.2"
154
159
  pytest-cov = "4.0.0"
155
160
  pytest-html = "3.2.0"
156
- types-pyyaml = "6.0.12.11"
161
+ types-pyyaml = "6.0.12.20240917"
157
162
  types-requests = "2.28.11.17"
158
163
  types-redis = "4.4.0.6"
159
164
  types-ujson = "5.7.0.5"
160
- types-python-dateutil = "2.8.19.14"
161
- typing_extensions = "4.4.0"
165
+ types-python-dateutil = "2.8.19.20240311"
166
+ typing_extensions = "4.6.3"
162
167
 
163
168
  [build-system]
164
169
  requires = [
File without changes