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.
- c2cwsgiutils/__init__.py +14 -11
- c2cwsgiutils/acceptance/__init__.py +2 -3
- c2cwsgiutils/acceptance/connection.py +1 -2
- c2cwsgiutils/acceptance/image.py +9 -17
- c2cwsgiutils/acceptance/package-lock.json +270 -1062
- c2cwsgiutils/acceptance/package.json +2 -2
- c2cwsgiutils/acceptance/print.py +7 -3
- c2cwsgiutils/acceptance/utils.py +1 -3
- c2cwsgiutils/auth.py +43 -37
- c2cwsgiutils/broadcast/__init__.py +16 -16
- c2cwsgiutils/broadcast/interface.py +3 -3
- c2cwsgiutils/broadcast/local.py +1 -0
- c2cwsgiutils/broadcast/redis.py +13 -12
- c2cwsgiutils/client_info.py +13 -5
- c2cwsgiutils/config_utils.py +1 -0
- c2cwsgiutils/coverage_setup.py +4 -3
- c2cwsgiutils/db.py +36 -41
- c2cwsgiutils/db_maintenance_view.py +13 -13
- c2cwsgiutils/debug/__init__.py +2 -2
- c2cwsgiutils/debug/_listeners.py +1 -1
- c2cwsgiutils/debug/_views.py +7 -6
- c2cwsgiutils/debug/utils.py +9 -9
- c2cwsgiutils/errors.py +13 -14
- c2cwsgiutils/health_check.py +25 -30
- c2cwsgiutils/index.py +14 -16
- c2cwsgiutils/loader.py +1 -1
- c2cwsgiutils/logging_view.py +12 -12
- c2cwsgiutils/models_graph.py +0 -1
- c2cwsgiutils/pretty_json.py +0 -1
- c2cwsgiutils/prometheus.py +1 -7
- c2cwsgiutils/pyramid.py +0 -1
- c2cwsgiutils/pyramid_logging.py +2 -1
- c2cwsgiutils/redis_stats.py +9 -9
- c2cwsgiutils/redis_utils.py +19 -18
- c2cwsgiutils/request_tracking/__init__.py +14 -13
- c2cwsgiutils/request_tracking/_sql.py +0 -1
- c2cwsgiutils/scripts/genversion.py +5 -5
- c2cwsgiutils/scripts/stats_db.py +19 -17
- c2cwsgiutils/scripts/test_print.py +5 -5
- c2cwsgiutils/sentry.py +55 -20
- c2cwsgiutils/services.py +2 -2
- c2cwsgiutils/setup_process.py +0 -2
- c2cwsgiutils/sql_profiler/__init__.py +6 -6
- c2cwsgiutils/sql_profiler/_impl.py +19 -17
- c2cwsgiutils/sqlalchemylogger/README.md +30 -13
- c2cwsgiutils/sqlalchemylogger/handlers.py +12 -11
- c2cwsgiutils/stats_pyramid/__init__.py +1 -5
- c2cwsgiutils/stats_pyramid/_db_spy.py +2 -2
- c2cwsgiutils/stats_pyramid/_pyramid_spy.py +0 -1
- c2cwsgiutils/version.py +11 -5
- {c2cwsgiutils-6.0.10.dev9.dist-info → c2cwsgiutils-6.1.0.dist-info}/LICENSE +1 -1
- {c2cwsgiutils-6.0.10.dev9.dist-info → c2cwsgiutils-6.1.0.dist-info}/METADATA +12 -12
- c2cwsgiutils-6.1.0.dist-info/RECORD +67 -0
- {c2cwsgiutils-6.0.10.dev9.dist-info → c2cwsgiutils-6.1.0.dist-info}/WHEEL +1 -1
- c2cwsgiutils-6.0.10.dev9.dist-info/RECORD +0 -67
- {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
|
-
|
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
|
-
#
|
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
|
-
#
|
41
|
+
# Initialize log queue
|
42
42
|
self.log_queue: Any = queue.Queue()
|
43
|
-
#
|
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
|
-
#
|
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
|
-
|
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
|
-
|
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
|
-
|
88
|
+
_LOG.critical(e)
|
89
89
|
finally:
|
90
90
|
self.session.expunge_all()
|
91
91
|
|
92
92
|
def create_db(self) -> None:
|
93
|
-
|
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
|
-
|
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
|
-
|
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,13 +1,13 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: c2cwsgiutils
|
3
|
-
Version: 6.0
|
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.
|
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
|
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
|
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,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,,
|
File without changes
|