c2cwsgiutils 6.0.10.dev9__py3-none-any.whl → 6.1.0__py3-none-any.whl

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 (56) hide show
  1. c2cwsgiutils/__init__.py +14 -11
  2. c2cwsgiutils/acceptance/__init__.py +2 -3
  3. c2cwsgiutils/acceptance/connection.py +1 -2
  4. c2cwsgiutils/acceptance/image.py +9 -17
  5. c2cwsgiutils/acceptance/package-lock.json +270 -1062
  6. c2cwsgiutils/acceptance/package.json +2 -2
  7. c2cwsgiutils/acceptance/print.py +7 -3
  8. c2cwsgiutils/acceptance/utils.py +1 -3
  9. c2cwsgiutils/auth.py +43 -37
  10. c2cwsgiutils/broadcast/__init__.py +16 -16
  11. c2cwsgiutils/broadcast/interface.py +3 -3
  12. c2cwsgiutils/broadcast/local.py +1 -0
  13. c2cwsgiutils/broadcast/redis.py +13 -12
  14. c2cwsgiutils/client_info.py +13 -5
  15. c2cwsgiutils/config_utils.py +1 -0
  16. c2cwsgiutils/coverage_setup.py +4 -3
  17. c2cwsgiutils/db.py +36 -41
  18. c2cwsgiutils/db_maintenance_view.py +13 -13
  19. c2cwsgiutils/debug/__init__.py +2 -2
  20. c2cwsgiutils/debug/_listeners.py +1 -1
  21. c2cwsgiutils/debug/_views.py +7 -6
  22. c2cwsgiutils/debug/utils.py +9 -9
  23. c2cwsgiutils/errors.py +13 -14
  24. c2cwsgiutils/health_check.py +25 -30
  25. c2cwsgiutils/index.py +14 -16
  26. c2cwsgiutils/loader.py +1 -1
  27. c2cwsgiutils/logging_view.py +12 -12
  28. c2cwsgiutils/models_graph.py +0 -1
  29. c2cwsgiutils/pretty_json.py +0 -1
  30. c2cwsgiutils/prometheus.py +1 -7
  31. c2cwsgiutils/pyramid.py +0 -1
  32. c2cwsgiutils/pyramid_logging.py +2 -1
  33. c2cwsgiutils/redis_stats.py +9 -9
  34. c2cwsgiutils/redis_utils.py +19 -18
  35. c2cwsgiutils/request_tracking/__init__.py +14 -13
  36. c2cwsgiutils/request_tracking/_sql.py +0 -1
  37. c2cwsgiutils/scripts/genversion.py +5 -5
  38. c2cwsgiutils/scripts/stats_db.py +19 -17
  39. c2cwsgiutils/scripts/test_print.py +5 -5
  40. c2cwsgiutils/sentry.py +55 -20
  41. c2cwsgiutils/services.py +2 -2
  42. c2cwsgiutils/setup_process.py +0 -2
  43. c2cwsgiutils/sql_profiler/__init__.py +6 -6
  44. c2cwsgiutils/sql_profiler/_impl.py +19 -17
  45. c2cwsgiutils/sqlalchemylogger/README.md +30 -13
  46. c2cwsgiutils/sqlalchemylogger/handlers.py +12 -11
  47. c2cwsgiutils/stats_pyramid/__init__.py +1 -5
  48. c2cwsgiutils/stats_pyramid/_db_spy.py +2 -2
  49. c2cwsgiutils/stats_pyramid/_pyramid_spy.py +0 -1
  50. c2cwsgiutils/version.py +11 -5
  51. {c2cwsgiutils-6.0.10.dev9.dist-info → c2cwsgiutils-6.1.0.dist-info}/LICENSE +1 -1
  52. {c2cwsgiutils-6.0.10.dev9.dist-info → c2cwsgiutils-6.1.0.dist-info}/METADATA +12 -12
  53. c2cwsgiutils-6.1.0.dist-info/RECORD +67 -0
  54. {c2cwsgiutils-6.0.10.dev9.dist-info → c2cwsgiutils-6.1.0.dist-info}/WHEEL +1 -1
  55. c2cwsgiutils-6.0.10.dev9.dist-info/RECORD +0 -67
  56. {c2cwsgiutils-6.0.10.dev9.dist-info → c2cwsgiutils-6.1.0.dist-info}/entry_points.txt +0 -0
@@ -14,7 +14,7 @@ from sqlalchemy_utils import create_database, database_exists
14
14
  from c2cwsgiutils.sqlalchemylogger._filters import ContainsExpression, DoesNotContainExpression
15
15
  from c2cwsgiutils.sqlalchemylogger._models import Base, create_log_class
16
16
 
17
- LOG = logging.getLogger(__name__)
17
+ _LOG = logging.getLogger(__name__)
18
18
 
19
19
 
20
20
  class SQLAlchemyHandler(logging.Handler):
@@ -30,28 +30,28 @@ class SQLAlchemyHandler(logging.Handler):
30
30
  contains_expression: str = "",
31
31
  ) -> None:
32
32
  super().__init__()
33
- # initialize DB session
33
+ # Initialize DB session
34
34
  self.engine = create_engine(sqlalchemy_url["url"])
35
- self.Log = create_log_class(
35
+ self.Log = create_log_class( # pylint: disable=invalid-name
36
36
  tablename=sqlalchemy_url.get("tablename", "logs"),
37
37
  tableargs=sqlalchemy_url.get("tableargs", None), # type: ignore
38
38
  )
39
39
  Base.metadata.bind = self.engine
40
40
  self.session = sessionmaker(bind=self.engine)() # noqa
41
- # initialize log queue
41
+ # Initialize log queue
42
42
  self.log_queue: Any = queue.Queue()
43
- # initialize a thread to process the logs Asynchronously
43
+ # Initialize a thread to process the logs Asynchronously
44
44
  self.condition = threading.Condition()
45
45
  self.processor_thread = threading.Thread(target=self._processor, daemon=True)
46
46
  self.processor_thread.start()
47
- # initialize filters
47
+ # Initialize filters
48
48
  if does_not_contain_expression:
49
49
  self.addFilter(DoesNotContainExpression(does_not_contain_expression))
50
50
  if contains_expression:
51
51
  self.addFilter(ContainsExpression(contains_expression))
52
52
 
53
53
  def _processor(self) -> None:
54
- LOG.debug("%s: starting processor thread", __name__)
54
+ _LOG.debug("%s: starting processor thread", __name__)
55
55
  while True:
56
56
  logs = []
57
57
  time_since_last = time.perf_counter()
@@ -70,7 +70,7 @@ class SQLAlchemyHandler(logging.Handler):
70
70
  ):
71
71
  self._write_logs(logs)
72
72
  break
73
- LOG.debug("%s: stopping processor thread", __name__)
73
+ _LOG.debug("%s: stopping processor thread", __name__)
74
74
 
75
75
  def _write_logs(self, logs: list[Any]) -> None:
76
76
  try:
@@ -85,12 +85,13 @@ class SQLAlchemyHandler(logging.Handler):
85
85
  except Exception as e: # pylint: disable=broad-except
86
86
  # if we really cannot commit the log to DB, do not lock the
87
87
  # thread and do not crash the application
88
- LOG.critical(e)
88
+ _LOG.critical(e)
89
89
  finally:
90
90
  self.session.expunge_all()
91
91
 
92
92
  def create_db(self) -> None:
93
- LOG.info("%s: creating new database", __name__)
93
+ """Create the database if it does not exist."""
94
+ _LOG.info("%s: creating new database", __name__)
94
95
  if not database_exists(self.engine.url):
95
96
  create_database(self.engine.url)
96
97
  # FIXME: we should not access directly the private __table_args__
@@ -101,7 +102,7 @@ class SQLAlchemyHandler(logging.Handler):
101
102
  with self.engine.begin() as connection:
102
103
  if not self.engine.dialect.has_schema(connection, self.Log.__table_args__["schema"]):
103
104
  connection.execute(
104
- sqlalchemy.schema.CreateSchema(self.Log.__table_args__["schema"]),
105
+ sqlalchemy.schema.CreateSchema(self.Log.__table_args__["schema"]), # type: ignore
105
106
  )
106
107
  Base.metadata.create_all(self.engine)
107
108
 
@@ -10,7 +10,6 @@ from c2cwsgiutils.stats_pyramid import _pyramid_spy
10
10
 
11
11
  def init(config: pyramid.config.Configurator) -> None:
12
12
  """Initialize the whole stats module, for backward compatibility."""
13
-
14
13
  warnings.warn("init function is deprecated; use includeme instead")
15
14
  includeme(config)
16
15
 
@@ -20,17 +19,14 @@ def includeme(config: pyramid.config.Configurator) -> None:
20
19
  Initialize the whole stats pyramid module.
21
20
 
22
21
  Arguments:
23
-
24
22
  config: The Pyramid config
25
23
  """
26
-
27
24
  _pyramid_spy.init(config)
28
25
  init_db_spy()
29
26
 
30
27
 
31
28
  def init_db_spy() -> None:
32
29
  """Initialize the database spy."""
33
-
34
- from . import _db_spy
30
+ from . import _db_spy # pylint: disable=import-outside-toplevel
35
31
 
36
32
  _db_spy.init()
@@ -10,7 +10,7 @@ from sqlalchemy.orm import Session
10
10
 
11
11
  from c2cwsgiutils import prometheus
12
12
 
13
- LOG = logging.getLogger(__name__)
13
+ _LOG = logging.getLogger(__name__)
14
14
 
15
15
  _PROMETHEUS_DB_SUMMARY = prometheus_client.Summary(
16
16
  prometheus.build_metric_name("database"),
@@ -71,7 +71,7 @@ def _create_sqlalchemy_timer_cb(what: str) -> Callable[..., Any]:
71
71
 
72
72
  def after(*_args: Any, **_kwargs: Any) -> None:
73
73
  _PROMETHEUS_DB_SUMMARY.labels({"query": what}).observe(time.perf_counter() - start)
74
- LOG.debug("Execute statement '%s' in %d.", what, time.perf_counter() - start)
74
+ _LOG.debug("Execute statement '%s' in %d.", what, time.perf_counter() - start)
75
75
 
76
76
  return after
77
77
 
@@ -86,7 +86,6 @@ def init(config: pyramid.config.Configurator) -> None: # pragma: nocover
86
86
  Subscribe to Pyramid events in order to get some stats on route time execution.
87
87
 
88
88
  Arguments:
89
-
90
89
  config: The Pyramid config
91
90
  """
92
91
  config.add_subscriber(_request_callback, pyramid.events.NewRequest)
c2cwsgiutils/version.py CHANGED
@@ -8,7 +8,7 @@ from typing import Optional, cast
8
8
  import prometheus_client
9
9
  import pyramid.config
10
10
 
11
- from c2cwsgiutils import config_utils, prometheus
11
+ from c2cwsgiutils import auth, config_utils, prometheus
12
12
 
13
13
  _VERSIONS_PATH = "/app/versions.json"
14
14
  _LOG = logging.getLogger(__name__)
@@ -41,17 +41,23 @@ def init(config: pyramid.config.Configurator) -> None:
41
41
  includeme(config)
42
42
 
43
43
 
44
+ class _View:
45
+ def __init__(self, versions: dict[str, dict[str, str]]) -> None:
46
+ self.versions = versions
47
+
48
+ def __call__(self, request: pyramid.request.Request) -> dict[str, dict[str, str]]:
49
+ auth.auth_view(request)
50
+ return self.versions
51
+
52
+
44
53
  def includeme(config: pyramid.config.Configurator) -> None:
45
54
  """Initialize the versions view."""
46
-
47
55
  if os.path.isfile(_VERSIONS_PATH):
48
56
  versions = _read_versions()
49
57
  config.add_route(
50
58
  "c2c_versions", config_utils.get_base_path(config) + r"/versions.json", request_method="GET"
51
59
  )
52
- config.add_view(
53
- lambda request: versions, route_name="c2c_versions", renderer="fast_json", http_cache=0
54
- )
60
+ config.add_view(_View(versions), route_name="c2c_versions", renderer="fast_json", http_cache=0)
55
61
  _LOG.info("Installed the /versions.json service")
56
62
  git_hash = versions["main"]["git_hash"]
57
63
 
@@ -1,4 +1,4 @@
1
- Copyright (c) 2015-2023, Camptocamp SA
1
+ Copyright (c) 2015-2024, Camptocamp SA
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: c2cwsgiutils
3
- Version: 6.0.10.dev9
3
+ Version: 6.1.0
4
4
  Summary: Common utilities for Camptocamp WSGI applications
5
5
  Home-page: https://github.com/camptocamp/c2cwsgiutils
6
6
  License: BSD-2-Clause
7
7
  Keywords: geo,gis,sqlalchemy,orm,wsgi
8
8
  Author: Camptocamp
9
9
  Author-email: info@camptocamp.com
10
- Requires-Python: >=3.9
10
+ Requires-Python: >=3.10
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Environment :: Plugins
13
13
  Classifier: Framework :: Pyramid
@@ -17,9 +17,10 @@ Classifier: License :: OSI Approved :: BSD License
17
17
  Classifier: Operating System :: OS Independent
18
18
  Classifier: Programming Language :: Python
19
19
  Classifier: Programming Language :: Python :: 3
20
- Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
23
24
  Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
24
25
  Classifier: Typing :: Typed
25
26
  Provides-Extra: alembic
@@ -38,13 +39,10 @@ Requires-Dist: SQLAlchemy-Utils ; extra == "standard" or extra == "webserver" or
38
39
  Requires-Dist: alembic ; extra == "standard" or extra == "alembic" or extra == "all"
39
40
  Requires-Dist: boltons ; extra == "tests" or extra == "all"
40
41
  Requires-Dist: cee_syslog_handler
41
- Requires-Dist: certifi
42
42
  Requires-Dist: cornice ; extra == "standard" or extra == "webserver" or extra == "all"
43
43
  Requires-Dist: gunicorn ; extra == "standard" or extra == "webserver" or extra == "all"
44
- Requires-Dist: idna
45
44
  Requires-Dist: lxml ; extra == "tests" or extra == "all"
46
45
  Requires-Dist: objgraph ; extra == "debug" or extra == "all"
47
- Requires-Dist: pillow
48
46
  Requires-Dist: prometheus-client ; extra == "standard" or extra == "webserver" or extra == "all"
49
47
  Requires-Dist: psycopg2 ; extra == "standard" or extra == "webserver" or extra == "all"
50
48
  Requires-Dist: pyjwt ; extra == "standard" or extra == "oauth2" or extra == "all"
@@ -56,12 +54,9 @@ Requires-Dist: redis ; extra == "standard" or extra == "broadcast" or extra == "
56
54
  Requires-Dist: requests
57
55
  Requires-Dist: requests-oauthlib ; extra == "standard" or extra == "oauth2" or extra == "all"
58
56
  Requires-Dist: scikit-image ; extra == "test-images"
59
- Requires-Dist: scipy
60
57
  Requires-Dist: sentry-sdk ; extra == "standard" or extra == "sentry" or extra == "all"
61
58
  Requires-Dist: ujson
62
- Requires-Dist: urllib3
63
59
  Requires-Dist: waitress ; extra == "dev" or extra == "all"
64
- Requires-Dist: webob
65
60
  Requires-Dist: zope.interface ; extra == "standard" or extra == "webserver" or extra == "all"
66
61
  Requires-Dist: zope.sqlalchemy ; extra == "standard" or extra == "webserver" or extra == "all"
67
62
  Project-URL: Repository, https://github.com/camptocamp/c2cwsgiutils
@@ -69,7 +64,7 @@ Description-Content-Type: text/markdown
69
64
 
70
65
  # Camptocamp WSGI utilities
71
66
 
72
- This is a Python 3 library providing common tools for Camptocamp WSGI
67
+ This is a Python 3 library (>=3.5) providing common tools for Camptocamp WSGI
73
68
  applications:
74
69
 
75
70
  - Provide prometheus metrics
@@ -730,11 +725,16 @@ A few other environment variables can be used to tune the info sent with each re
730
725
  - `SENTRY_CLIENT_IGNORE_EXCEPTIONS`: list (coma separated) of exceptions to ignore (defaults to SystemExit)
731
726
  - `SENTRY_TAG_...`: to add other custom tags
732
727
  - `SENTRY_LEVEL`: starting from what logging level to send events to Sentry (defaults to ERROR)
733
- - `SENTRY_TRACES_SAMPLE_RATE`: The percentage of events to send to sentry in order to compute the performance. Value between 0 and 1, default is 0.
728
+ - `SENTRY_TRACES_SAMPLE_RATE`: The percentage of events to send to sentry in order to compute the performance. Value between 0 and 1 (default is 0)
729
+ - `SENTRY_INTEGRATION_LOGGING`: If set to 0, the Sentry integration will not log anything (default is 1)
730
+ - `SENTRY_INTEGRATION_PYRAMID`: If set to 0, the Sentry integration with Pyramid will not be enabled (default is 1)
731
+ - `SENTRY_INTEGRATION_SQLALCHEMY`: If set to 0, the Sentry integration with SQLAlchemy will not be enabled (default is 1)
732
+ - `SENTRY_INTEGRATION_REDIS`: If set to 0, the Sentry integration with Redis will not be enabled (default is 1)
733
+ - `SENTRY_INTEGRATION_ASYNCIO`: If set to 0, the Sentry integration with asyncio will not be enabled (default is 1)
734
734
 
735
735
  # Developer info
736
736
 
737
- You will need `docker` (>=1.12.0), `docker-compose` (>=1.10.0) and
737
+ You will need `docker` (>=1.12.0), `docker compose` and
738
738
  `make` installed on the machine to play with this project.
739
739
  Check available versions of `docker-engine` with
740
740
  `apt-get policy docker-engine` and eventually force install the
@@ -0,0 +1,67 @@
1
+ c2cwsgiutils/__init__.py,sha256=HVSc-4O8i2aB0ozEI4AI8Xsb-4S6fAwhl8uRhv-DsFg,4057
2
+ c2cwsgiutils/acceptance/__init__.py,sha256=TJA1yzmyPujkg80oj-LBj2ueOQVYL8HLW87pejWTIDY,1501
3
+ c2cwsgiutils/acceptance/connection.py,sha256=yqChhHBpYhQL0Cb7K8FqeP16jg1UtmxGAi6Tw1TXEbI,9783
4
+ c2cwsgiutils/acceptance/image.py,sha256=Xtwvb1Y-Pczbw9kHn5OhJokogwbBvx5McLvcuGPzzog,8935
5
+ c2cwsgiutils/acceptance/package-lock.json,sha256=wgKDMcWE-Cd-f0ydfdLRBD1RFanC9BalKEFAIE1Vzl4,47777
6
+ c2cwsgiutils/acceptance/package.json,sha256=ZqTk9KD6zpCIGlF7w7HKp8bj2OOr19xl2hQ8sfbF4PI,101
7
+ c2cwsgiutils/acceptance/print.py,sha256=qdh6pqlHgkIjUCJxS3rcgpOV4fDk9RxFlkfH5aAwDsQ,2567
8
+ c2cwsgiutils/acceptance/screenshot.js,sha256=FAJYIWOLJFMm0MNggKzo3mIybtN-VtKLdMzPhQ9pO1g,2041
9
+ c2cwsgiutils/acceptance/utils.py,sha256=zLvWqqPLBGCzGAtmIqidao66BKmER_Du1AfKCEhoc-I,1892
10
+ c2cwsgiutils/auth.py,sha256=ljTUPYGpEkkDg6ifOegXS1Q1JlcRth0P5vbMCs7VK6k,9585
11
+ c2cwsgiutils/broadcast/__init__.py,sha256=mYiTVL34QkJkEjxURlDIE7bmwZaEPT9Lw9zMwbiVtL0,4470
12
+ c2cwsgiutils/broadcast/interface.py,sha256=AkDT_m0eXTQp3mmMLf9KRtpXnWoVhJpb_UNjCbHM-3I,665
13
+ c2cwsgiutils/broadcast/local.py,sha256=kQp6OWcRU-nx7uEBAXwdMum_rOz3LSj6fyL_R12QrMY,1139
14
+ c2cwsgiutils/broadcast/redis.py,sha256=xCcGSr7jr6QdFM-YZzFFaySQis1xKb0HqqbGR8qjSNM,5202
15
+ c2cwsgiutils/broadcast/utils.py,sha256=0fQZXPu3p_5LEJpGenJwiiMxECQjJhjZBjIkBk8h-ng,272
16
+ c2cwsgiutils/client_info.py,sha256=wkKhEF3WF9xf6aGTovrxh6C1QnZaW0Z5vwQ5zQsWfvw,3944
17
+ c2cwsgiutils/config_utils.py,sha256=vkBu-3GQsE94NOBOvT5FE-Ij29EUrKnDsmdUdtu_yzo,1524
18
+ c2cwsgiutils/coverage_setup.py,sha256=BrdjYUmqYl1C-gHuKA7EI5gbQs8Dtdeb2eZKtzr-5L0,909
19
+ c2cwsgiutils/db.py,sha256=JT5F9Dqm2r0Jsh3w3CX79ngAUtakMLpf1secfN1nQnk,16106
20
+ c2cwsgiutils/db_maintenance_view.py,sha256=58F-p9drkhCI99GoLRPIqT5U-Pm8ckSSUEl-tNxMmjU,3088
21
+ c2cwsgiutils/debug/__init__.py,sha256=GkYNt2fU5PFykw9HmqPEwZrF2mTJumjSu54pp38EhOM,1325
22
+ c2cwsgiutils/debug/_listeners.py,sha256=RZYwQRh86rU-Vtjxc3xOZL2A8D_5LHIBd-xWAMQCrj0,4421
23
+ c2cwsgiutils/debug/_views.py,sha256=53BflHhtLwtgS2uFJYg2jUEZaFhCI-iYWfSxu5B2swc,7554
24
+ c2cwsgiutils/debug/utils.py,sha256=sIKZHQ8empzxE2OI3h7Uce8cvv4O7AD1y_VYeZfLVCA,2320
25
+ c2cwsgiutils/errors.py,sha256=-hWLQ1qDlh9kn06-33U2c39BbOxuCvJIkBkdxriE5mo,6644
26
+ c2cwsgiutils/health_check.py,sha256=OhfPcApBht1qtBOX8e8pdeq3QwF4FbgGkofjqpl8GvQ,20068
27
+ c2cwsgiutils/index.py,sha256=VeCqbSvlJvQDwN213qqjQyhi7wb6eWLy0IKkApn-ufk,16759
28
+ c2cwsgiutils/loader.py,sha256=vU7yEobl9TlSFZwdLI2eF1ceUJ6xgiu2re31HA5sw1g,623
29
+ c2cwsgiutils/logging_view.py,sha256=d0UkvYRGkVUMY9_vbjEzXmm8-6CCec2B43a3mJAqWyw,3370
30
+ c2cwsgiutils/models_graph.py,sha256=q5dW_gZ5iUZCzBya5Kpy57y9oqsG-rGi9AvrXCDgYqs,2679
31
+ c2cwsgiutils/pretty_json.py,sha256=WQlgNVeWPD_QMEjkNq5rFVGdFwQ7xDyICf0uxj0Hu2U,1697
32
+ c2cwsgiutils/profiler.py,sha256=3tIwoDSzOKQ06ug_U6j5VDR1BQ9auUOqdJRRLRhDoHw,739
33
+ c2cwsgiutils/prometheus.py,sha256=XV_SSm0nT09MD8EEl2a4xtd2busO3r--JyboU9OvWaQ,6576
34
+ c2cwsgiutils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ c2cwsgiutils/pyramid.py,sha256=MnVMskHMlJ4KQDjDR7CQdYaH70YXOtJ-1ThTPBqa03c,1387
36
+ c2cwsgiutils/pyramid_logging.py,sha256=M4XtWQZStreEoyC5qlwxcDDKCp4PZOr9SN05GnaYvvA,3732
37
+ c2cwsgiutils/redis_stats.py,sha256=8OTVRcElESgM6qjN944MOjoYRb0FGcQgo3JmDglfpPw,1632
38
+ c2cwsgiutils/redis_utils.py,sha256=02QoBGSjfBwKsWk-4DrXT8119HuUJuV_ezW7bc-Rv8s,4734
39
+ c2cwsgiutils/request_tracking/__init__.py,sha256=9Fp505q5zKjqfm9MuM7BDiYsx_pdg4vViNAr43OWYuk,4132
40
+ c2cwsgiutils/request_tracking/_sql.py,sha256=ZOQ3hD5z-WasfBzNig75fjrCvw4tGr1rhWOv97iLYws,572
41
+ c2cwsgiutils/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ c2cwsgiutils/scripts/genversion.py,sha256=lpGqU5wNSKdoOMDwVjFvWJVPEzdk0P8Tpfk7NLcrTok,1990
43
+ c2cwsgiutils/scripts/stats_db.py,sha256=kGCWBpG6gp_yDH3eZwEOujrvlyM0g97po6-EyjV8SXU,10413
44
+ c2cwsgiutils/scripts/test_print.py,sha256=NSXc0a2DZvKXjZYc2yr6oF72PCpeyL3GJthNFxGErEA,2101
45
+ c2cwsgiutils/sentry.py,sha256=su_t2SHxx_zK-gQfotmDbgbSdwTQdFvkgJnqcrQU7ps,6494
46
+ c2cwsgiutils/services.py,sha256=AxdiH2S8gfEQpOY36R4WqKtJ-3P4OXhx0srTm5G5070,1569
47
+ c2cwsgiutils/setup_process.py,sha256=VSiyVaQ65btIEBql1sBCZpOjCr0QQjRbcVDY2I7GbLM,3426
48
+ c2cwsgiutils/sql_profiler/__init__.py,sha256=2bh5s4xqPLUl7EPnm75R1RDKtc098PgZLHkwHGfS-94,907
49
+ c2cwsgiutils/sql_profiler/_impl.py,sha256=6qkXMhDGcheCDwOH09gFJDrtXRsngkvm29icZWZMtMI,3797
50
+ c2cwsgiutils/sqlalchemylogger/README.md,sha256=qXfyhGC4Kbt-Ye_geTPm_1InpclhthmKZpc66rqB4as,2018
51
+ c2cwsgiutils/sqlalchemylogger/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ c2cwsgiutils/sqlalchemylogger/_filters.py,sha256=OJQ9_WA-fd9fMZ7TUNFzHHTPI6msw2NVBl5RoeYFnGw,752
53
+ c2cwsgiutils/sqlalchemylogger/_models.py,sha256=A9SQ8AqUazCMemVjp5p_1x4bZG3LAYW9pOXT84FdNkE,1471
54
+ c2cwsgiutils/sqlalchemylogger/examples/example.py,sha256=n48dJdUi1FH1hfBMAbfHLGPSb1bOVD8pXMxXB57PnpQ,460
55
+ c2cwsgiutils/sqlalchemylogger/handlers.py,sha256=MJi9vJgVpu0-uf8-iJzYMPhv5kHa0SGnpNUkcflLh98,4894
56
+ c2cwsgiutils/static/favicon-16x16.png,sha256=LKk6RFvb3NlPIZdDfAodE8H9IN8KM6CMGnMx4vOHlUQ,887
57
+ c2cwsgiutils/static/favicon-32x32.png,sha256=i4ucx08zAZARd8e7JTMGK-gb5WcOmyuDN6IN4brsEOo,1216
58
+ c2cwsgiutils/stats_pyramid/__init__.py,sha256=alSRhpCa5Kh9JnMnR5XqcMqr5wyL8ogROprrfsIl_qU,786
59
+ c2cwsgiutils/stats_pyramid/_db_spy.py,sha256=A61t6VKIrRRIjbyZTldmAUl_Q3ZDVFYqyxjuntzmllc,2919
60
+ c2cwsgiutils/stats_pyramid/_pyramid_spy.py,sha256=sbkXXdzzylnd6XHzegJdshD0mzCY8RLsL1WncclsFfE,3208
61
+ c2cwsgiutils/templates/index.html.mako,sha256=Ey9ppHLe-eFGYXYPV5Z2WbMBSif86sYPiTviksnG7TI,1362
62
+ c2cwsgiutils/version.py,sha256=1ghPu-aKMJdfCSUrxgBENNqNQ-7JMKJr6tS14dDmW4Q,3110
63
+ c2cwsgiutils-6.1.0.dist-info/LICENSE,sha256=r7ueGz9Fl2Bv3rmeQy0DEtohLmAiufRaCuv6Y5fyNhE,1304
64
+ c2cwsgiutils-6.1.0.dist-info/METADATA,sha256=1QQd238n0vCqmUsf0Fn6jJLIX1XcLx-qlBmAe9DLICY,34404
65
+ c2cwsgiutils-6.1.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
66
+ c2cwsgiutils-6.1.0.dist-info/entry_points.txt,sha256=ujgqMTL1awN9qDg8WXmrF7m0fgR-hslUM6zKH86pvy0,703
67
+ c2cwsgiutils-6.1.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.7.0
2
+ Generator: poetry-core 1.9.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,67 +0,0 @@
1
- c2cwsgiutils/__init__.py,sha256=YHZ6OY8BvFrZAoBpbEWmAZ-60nqDer_CKHgY-LSHAKs,3986
2
- c2cwsgiutils/acceptance/__init__.py,sha256=vjtpPfu0kbXUOYMx15Z8713IfPFZA9XnkUKkIFtVj_M,1500
3
- c2cwsgiutils/acceptance/connection.py,sha256=w478x_UiPNebOX-IC7UBgpSGbUYRZBjHsA-Vpqvtic0,9742
4
- c2cwsgiutils/acceptance/image.py,sha256=Ka3ImTnxBu-sfJ75_nWqL5-pEzM_s8kz9uG9LHtw1nE,9105
5
- c2cwsgiutils/acceptance/package-lock.json,sha256=4yTZzM-H70T2HlUnaFCZjsPQTWORWYoxR90XNR79gf0,82738
6
- c2cwsgiutils/acceptance/package.json,sha256=Oi49FMSNc8CVrAcH2JmoL1D3sbL4t7XtHivoNo88FO0,102
7
- c2cwsgiutils/acceptance/print.py,sha256=j5K1c2Kn0eEnhgdbZNBVkdscK02pQhtPIh6lJzHMJcM,2323
8
- c2cwsgiutils/acceptance/screenshot.js,sha256=FAJYIWOLJFMm0MNggKzo3mIybtN-VtKLdMzPhQ9pO1g,2041
9
- c2cwsgiutils/acceptance/utils.py,sha256=-NgLlG_oQj3P_ZiK293RG7ZHPumg0WrDwo_APOI3WG4,1851
10
- c2cwsgiutils/auth.py,sha256=73NkFu4mKeDwulECRabSFhpNUKoEfP-0M3JnTQ9lJ3s,9333
11
- c2cwsgiutils/broadcast/__init__.py,sha256=Ae0qU6nP0G6Qa6Zi-vJK4Om8T9HKxmaz5-uOAJKZZdE,4360
12
- c2cwsgiutils/broadcast/interface.py,sha256=jE8BSy9N7xnPmq5U0m852sFFhx46c7Uo9SyFJTCde9o,636
13
- c2cwsgiutils/broadcast/local.py,sha256=24aIRdFOR2CXZfp_F2R_S1QW-yon3EyTM6TvljWVlP0,1083
14
- c2cwsgiutils/broadcast/redis.py,sha256=sxBsYZtMNXMOck6a_Mcb3QZjjW4lPTxnImTfL1vv14g,5085
15
- c2cwsgiutils/broadcast/utils.py,sha256=0fQZXPu3p_5LEJpGenJwiiMxECQjJhjZBjIkBk8h-ng,272
16
- c2cwsgiutils/client_info.py,sha256=Wj27ssVuxPMZrXKM9HUZtuj3026RTQPHdiOHGq_me4g,3595
17
- c2cwsgiutils/config_utils.py,sha256=N_DPNRCBmeomhv2cJN5OQALrTAG29FCCk3VeugWrBwI,1523
18
- c2cwsgiutils/coverage_setup.py,sha256=fES0sdhFy6oaeOCuP1qjjm7PQL9l_O8rUKZhRvRBRwQ,839
19
- c2cwsgiutils/db.py,sha256=N_9zxxXYKiKwfNxs5KsunKYb_gUZQkTrlw6HZu5qsgQ,16174
20
- c2cwsgiutils/db_maintenance_view.py,sha256=ejSNCv7vZIDjXctDTWTXEYTnUYFVVNIecFLeDlCkDBA,3076
21
- c2cwsgiutils/debug/__init__.py,sha256=80zdAZnE9cwgQW1odE2aOauIxYsG5CQpWvHPcslRue8,1239
22
- c2cwsgiutils/debug/_listeners.py,sha256=sXXHbPHQaSRMrzUC2ryiSDsBXuTdVbpQOxmMmhZ3n90,4378
23
- c2cwsgiutils/debug/_views.py,sha256=zUeIshxBshBrlTz0p1I1LUi6HiJBOAAiDPrlOJsziQA,7522
24
- c2cwsgiutils/debug/utils.py,sha256=TPlJC5qKeFnvbgq1xjlfrrRgDcV5kIR69IPJgNcIZQY,2311
25
- c2cwsgiutils/errors.py,sha256=LUhZF3BW1i-v20x3EE-rZbT-TpdugpxiW7p5iCAu73Q,6723
26
- c2cwsgiutils/health_check.py,sha256=O-GGS0aicTuMz4gqE-btk8ipzVi5allDe6sFuyOANOA,19977
27
- c2cwsgiutils/index.py,sha256=7kgL4U_SN8boNHpnpB18v4ofScp-fJunsbnHpxbWlow,16707
28
- c2cwsgiutils/loader.py,sha256=x_yHRTDzzlQ61fHonWnnG01xdqFuXpbGZMNN--tN25U,622
29
- c2cwsgiutils/logging_view.py,sha256=W6-dFTz00hLt6BGJ8V3-4ip4AdxTyPG2W5vQjIuKiQs,3357
30
- c2cwsgiutils/models_graph.py,sha256=laip8EdhI2hoGZVAotdrsgMwiNbwsJPjknKkRq1eEq0,2680
31
- c2cwsgiutils/pretty_json.py,sha256=f1-oecFX9hub1nD32mmZRjOTIxhV8bVSt3Meqw68sNU,1698
32
- c2cwsgiutils/profiler.py,sha256=3tIwoDSzOKQ06ug_U6j5VDR1BQ9auUOqdJRRLRhDoHw,739
33
- c2cwsgiutils/prometheus.py,sha256=ZjHMG0zIKKJaadNp6pkSjXVTLAQS9AjlNwBH8HNJnfY,6558
34
- c2cwsgiutils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- c2cwsgiutils/pyramid.py,sha256=H-b5abZvxt9MkMFjyWOjWzPa02YRhZR6LDiMCaYLq5s,1388
36
- c2cwsgiutils/pyramid_logging.py,sha256=vVPrkAKZoIwb6SPf-omZDGyiKfElBf5yo_dPaIo-8ko,3730
37
- c2cwsgiutils/redis_stats.py,sha256=triLtzryGXJKvCUw4TreYpF22BpUKPdrMp30ZGKsXwU,1545
38
- c2cwsgiutils/redis_utils.py,sha256=OkgUqbZcuCa-LjcFXZ-cDN94dYi746P1FHRWExdYP8U,4615
39
- c2cwsgiutils/request_tracking/__init__.py,sha256=5SxMqBV3_w6SyykB1FFKug7XqzwdPhQdQOZ4VKUM4A8,4039
40
- c2cwsgiutils/request_tracking/_sql.py,sha256=47OtVn3g5QpCCWyl8w6V1xVjbf0ahrw4r9ijjRKXDz4,573
41
- c2cwsgiutils/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- c2cwsgiutils/scripts/genversion.py,sha256=GKmD08-H83hiKqXxy4odABuWqD5gADs_YEzM3TzHxEA,1985
43
- c2cwsgiutils/scripts/stats_db.py,sha256=QNwtEKznCgOKg4ZsAFED9ISS-THgdwD2km_oVoII5XU,10317
44
- c2cwsgiutils/scripts/test_print.py,sha256=UeOZa7jTazgEq5BRJD6lq-u9K6G4movf-sOVKTEs1cQ,2096
45
- c2cwsgiutils/sentry.py,sha256=-IzACZWI7YNi-dWtNrYlhdTysm8gRVzJSqK94wg3maU,5031
46
- c2cwsgiutils/services.py,sha256=qz51oCZOC0Lj2_ig4UuHIm0ZZO3FfpFTxrXBWZ_oaNo,1567
47
- c2cwsgiutils/setup_process.py,sha256=RKZGQdcKvHh_YU2mA-J5FQ01XNGj-SevcPNQB0439rs,3428
48
- c2cwsgiutils/sql_profiler/__init__.py,sha256=lZYq83LYlm_P4uNMv0WU_B9Obl90YaNzkqWtteUHadg,876
49
- c2cwsgiutils/sql_profiler/_impl.py,sha256=0UWSZDEm2E9Zeujd8UFRu0cIyyHBMxXxdmzt0cmuv0s,3702
50
- c2cwsgiutils/sqlalchemylogger/README.md,sha256=WEyJSrBjedtX1FFrYiq4oMaWMt1fNxRkJYmJWnAoz3g,1552
51
- c2cwsgiutils/sqlalchemylogger/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- c2cwsgiutils/sqlalchemylogger/_filters.py,sha256=OJQ9_WA-fd9fMZ7TUNFzHHTPI6msw2NVBl5RoeYFnGw,752
53
- c2cwsgiutils/sqlalchemylogger/_models.py,sha256=A9SQ8AqUazCMemVjp5p_1x4bZG3LAYW9pOXT84FdNkE,1471
54
- c2cwsgiutils/sqlalchemylogger/examples/example.py,sha256=n48dJdUi1FH1hfBMAbfHLGPSb1bOVD8pXMxXB57PnpQ,460
55
- c2cwsgiutils/sqlalchemylogger/handlers.py,sha256=Ne98D0-N2B0nnNxEb7VZc2Ril8bnvEiurb6Sra9Px74,4785
56
- c2cwsgiutils/static/favicon-16x16.png,sha256=LKk6RFvb3NlPIZdDfAodE8H9IN8KM6CMGnMx4vOHlUQ,887
57
- c2cwsgiutils/static/favicon-32x32.png,sha256=i4ucx08zAZARd8e7JTMGK-gb5WcOmyuDN6IN4brsEOo,1216
58
- c2cwsgiutils/stats_pyramid/__init__.py,sha256=7P10LjLv3c-ObEDGuYmRF_RFt7fRmO80ruqTGQAyC6w,747
59
- c2cwsgiutils/stats_pyramid/_db_spy.py,sha256=ZGRdrI17Bdl3mzaLjfPyAaEW3KK8Pikrgi-0WmH7zCs,2917
60
- c2cwsgiutils/stats_pyramid/_pyramid_spy.py,sha256=P212MGGl2VV_7UU4AXZA-rOuF7ouaONRklZwpas2wc8,3209
61
- c2cwsgiutils/templates/index.html.mako,sha256=Ey9ppHLe-eFGYXYPV5Z2WbMBSif86sYPiTviksnG7TI,1362
62
- c2cwsgiutils/version.py,sha256=z4of1DDr6J7PDw4AUOz31Gp63khgXf3JfiIaoWUM-9I,2870
63
- c2cwsgiutils-6.0.10.dev9.dist-info/LICENSE,sha256=rM6IWxociA3daRkXnNLYOxGndT5fbs3BfVZCA2Xgt-g,1304
64
- c2cwsgiutils-6.0.10.dev9.dist-info/METADATA,sha256=ND32SJN7J_FV4E9xjBkz445YUglwigXZ7rHvmjut4qo,33919
65
- c2cwsgiutils-6.0.10.dev9.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
66
- c2cwsgiutils-6.0.10.dev9.dist-info/entry_points.txt,sha256=ujgqMTL1awN9qDg8WXmrF7m0fgR-hslUM6zKH86pvy0,703
67
- c2cwsgiutils-6.0.10.dev9.dist-info/RECORD,,