microbootstrap 1.4.2__tar.gz → 1.5.0__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 (38) hide show
  1. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/PKG-INFO +7 -1
  2. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/README.md +6 -0
  3. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/granian_server.py +3 -1
  4. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/opentelemetry_instrument.py +23 -1
  5. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/sentry_instrument.py +42 -0
  6. microbootstrap-1.5.0/pyproject.toml +173 -0
  7. microbootstrap-1.4.2/pyproject.toml → microbootstrap-1.5.0/pyproject.toml.orig +4 -1
  8. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/__init__.py +0 -0
  9. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/__init__.py +0 -0
  10. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/base.py +0 -0
  11. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/fastapi.py +0 -0
  12. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/fastmcp.py +0 -0
  13. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/faststream.py +0 -0
  14. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/bootstrappers/litestar.py +0 -0
  15. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/__init__.py +0 -0
  16. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/fastapi.py +0 -0
  17. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/fastmcp.py +0 -0
  18. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/faststream.py +0 -0
  19. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/config/litestar.py +0 -0
  20. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/console_writer.py +0 -0
  21. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/exceptions.py +0 -0
  22. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/helpers.py +0 -0
  23. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/__init__.py +0 -0
  24. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/base.py +0 -0
  25. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/cors_instrument.py +0 -0
  26. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/health_checks_instrument.py +0 -0
  27. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/instrument_box.py +0 -0
  28. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/logging_instrument.py +0 -0
  29. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/prometheus_instrument.py +0 -0
  30. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/pyroscope_instrument.py +0 -0
  31. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments/swagger_instrument.py +0 -0
  32. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/instruments_setupper.py +0 -0
  33. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/middlewares/__init__.py +0 -0
  34. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/middlewares/fastapi.py +0 -0
  35. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/middlewares/fastmcp.py +0 -0
  36. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/middlewares/litestar.py +0 -0
  37. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/py.typed +0 -0
  38. {microbootstrap-1.4.2 → microbootstrap-1.5.0}/microbootstrap/settings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: microbootstrap
3
- Version: 1.4.2
3
+ Version: 1.5.0
4
4
  Summary: Package for bootstrapping new micro-services
5
5
  Keywords: python,microservice,bootstrap,opentelemetry,logging,error-tracing,litestar,fastapi,fastmcp,mcp
6
6
  Author: community-of-python
@@ -378,6 +378,8 @@ class YourSettings(BaseServiceSettings):
378
378
  sentry_additional_params: dict[str, typing.Any] = {}
379
379
  sentry_tags: dict[str, str] | None = None
380
380
  sentry_opentelemetry_trace_url_template: str | None = None
381
+ sentry_opentelemetry_baggage_keys: set[str] = set()
382
+ sentry_opentelemetry_baggage_url_templates: dict[str, str] = {}
381
383
 
382
384
  ... # Other settings here
383
385
  ```
@@ -397,6 +399,8 @@ Parameter descriptions:
397
399
  - `sentry_additional_params` - Additional parameters to pass to Sentry SDK.
398
400
  - `sentry_tags` - Tags to apply to all Sentry events.
399
401
  - `sentry_opentelemetry_trace_url_template` - Template for OpenTelemetry trace URLs to add to Sentry events (example: `"https://example.com/traces/{trace_id}"`).
402
+ - `sentry_opentelemetry_baggage_keys` - Baggage keys to copy into searchable Sentry tags.
403
+ - `sentry_opentelemetry_baggage_url_templates` - Maps baggage keys to URL templates added to Sentry event extra data as `<key>_url`. The placeholder must match the baggage key and its value is URL-encoded (example: `{"conversation_id": "https://example.com/logs/{conversation_id}"}`).
400
404
 
401
405
  ### [Prometheus](https://prometheus.io/)
402
406
 
@@ -502,6 +506,7 @@ class YourSettings(BaseServiceSettings):
502
506
  opentelemetry_insecure: bool = True
503
507
  opentelemetry_instrumentors: list[OpenTelemetryInstrumentor] = []
504
508
  opentelemetry_exclude_urls: list[str] = []
509
+ opentelemetry_baggage_span_attributes: dict[str, str] = {}
505
510
 
506
511
  ... # Other settings here
507
512
  ```
@@ -519,6 +524,7 @@ Parameters description:
519
524
  - `opentelemetry_exclude_urls` - list of ignored urls.
520
525
  - `opentelemetry_log_traces` - traces will be logged to stdout.
521
526
  - `opentelemetry_generate_health_check_spans` - generate spans for health check handlers if `True`
527
+ - `opentelemetry_baggage_span_attributes` - maps allowed baggage keys to attributes added to local server and consumer spans.
522
528
 
523
529
  These settings are subsequently passed to [opentelemetry](https://opentelemetry.io/), finalizing your Opentelemetry integration.
524
530
 
@@ -313,6 +313,8 @@ class YourSettings(BaseServiceSettings):
313
313
  sentry_additional_params: dict[str, typing.Any] = {}
314
314
  sentry_tags: dict[str, str] | None = None
315
315
  sentry_opentelemetry_trace_url_template: str | None = None
316
+ sentry_opentelemetry_baggage_keys: set[str] = set()
317
+ sentry_opentelemetry_baggage_url_templates: dict[str, str] = {}
316
318
 
317
319
  ... # Other settings here
318
320
  ```
@@ -332,6 +334,8 @@ Parameter descriptions:
332
334
  - `sentry_additional_params` - Additional parameters to pass to Sentry SDK.
333
335
  - `sentry_tags` - Tags to apply to all Sentry events.
334
336
  - `sentry_opentelemetry_trace_url_template` - Template for OpenTelemetry trace URLs to add to Sentry events (example: `"https://example.com/traces/{trace_id}"`).
337
+ - `sentry_opentelemetry_baggage_keys` - Baggage keys to copy into searchable Sentry tags.
338
+ - `sentry_opentelemetry_baggage_url_templates` - Maps baggage keys to URL templates added to Sentry event extra data as `<key>_url`. The placeholder must match the baggage key and its value is URL-encoded (example: `{"conversation_id": "https://example.com/logs/{conversation_id}"}`).
335
339
 
336
340
  ### [Prometheus](https://prometheus.io/)
337
341
 
@@ -437,6 +441,7 @@ class YourSettings(BaseServiceSettings):
437
441
  opentelemetry_insecure: bool = True
438
442
  opentelemetry_instrumentors: list[OpenTelemetryInstrumentor] = []
439
443
  opentelemetry_exclude_urls: list[str] = []
444
+ opentelemetry_baggage_span_attributes: dict[str, str] = {}
440
445
 
441
446
  ... # Other settings here
442
447
  ```
@@ -454,6 +459,7 @@ Parameters description:
454
459
  - `opentelemetry_exclude_urls` - list of ignored urls.
455
460
  - `opentelemetry_log_traces` - traces will be logged to stdout.
456
461
  - `opentelemetry_generate_health_check_spans` - generate spans for health check handlers if `True`
462
+ - `opentelemetry_baggage_span_attributes` - maps allowed baggage keys to attributes added to local server and consumer spans.
457
463
 
458
464
  These settings are subsequently passed to [opentelemetry](https://opentelemetry.io/), finalizing your Opentelemetry integration.
459
465
 
@@ -27,13 +27,15 @@ GRANIAN_LOG_LEVELS_MAP = {
27
27
  def create_granian_server(
28
28
  target: str,
29
29
  settings: ServerConfig,
30
+ *,
31
+ interface: Interfaces = Interfaces.ASGI,
30
32
  **granian_options: typing.Any, # noqa: ANN401
31
33
  ) -> GranianServer[typing.Any]:
32
34
  return granian.Granian(
33
35
  target=target,
34
36
  address=settings.server_host,
35
37
  port=settings.server_port,
36
- interface=Interfaces.ASGI,
38
+ interface=interface,
37
39
  workers=settings.server_workers_count,
38
40
  log_level=GRANIAN_LOG_LEVELS_MAP[getattr(settings, "logging_log_level", logging.INFO)],
39
41
  reload=settings.server_reload,
@@ -6,6 +6,7 @@ import typing
6
6
 
7
7
  import pydantic
8
8
  import structlog
9
+ from opentelemetry import baggage
9
10
  from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
10
11
  from opentelemetry.instrumentation.dependencies import DependencyConflictError
11
12
  from opentelemetry.instrumentation.environment_variables import OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
@@ -15,7 +16,7 @@ from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor
15
16
  from opentelemetry.sdk.trace import TracerProvider as SdkTracerProvider
16
17
  from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter, SimpleSpanProcessor
17
18
  from opentelemetry.semconv.resource import ResourceAttributes
18
- from opentelemetry.trace import format_span_id, set_tracer_provider
19
+ from opentelemetry.trace import SpanKind, format_span_id, set_tracer_provider
19
20
  from opentelemetry.util._importlib_metadata import entry_points
20
21
 
21
22
  from microbootstrap.instruments.base import BaseInstrumentConfig, Instrument
@@ -66,6 +67,7 @@ class OpentelemetryConfig(BaseInstrumentConfig):
66
67
  )
67
68
  opentelemetry_log_traces: bool = False
68
69
  opentelemetry_generate_health_check_spans: bool = True
70
+ opentelemetry_baggage_span_attributes: dict[str, str] = pydantic.Field(default_factory=dict)
69
71
 
70
72
 
71
73
  @typing.runtime_checkable
@@ -95,6 +97,22 @@ def _format_span(readable_span: ReadableSpan) -> str:
95
97
  return typing.cast("str", readable_span.to_json(indent=None)) + os.linesep
96
98
 
97
99
 
100
+ class BaggageSpanProcessor(SpanProcessor):
101
+ def __init__(self, baggage_span_attributes: dict[str, str]) -> None:
102
+ self.baggage_span_attributes = baggage_span_attributes
103
+
104
+ def on_start(self, span: Span, parent_context: Context | None = None) -> None:
105
+ if span.kind not in {SpanKind.SERVER, SpanKind.CONSUMER}:
106
+ return
107
+
108
+ for baggage_key, span_attribute in self.baggage_span_attributes.items():
109
+ if (value := baggage.get_baggage(baggage_key, context=parent_context)) is not None:
110
+ span.set_attribute(span_attribute, str(value))
111
+
112
+ def on_end(self, span: ReadableSpan) -> None:
113
+ pass
114
+
115
+
98
116
  class BaseOpentelemetryInstrument(Instrument[OpentelemetryConfigT]):
99
117
  instrument_name = "Opentelemetry"
100
118
  ready_condition = "Provide all necessary config parameters"
@@ -145,6 +163,10 @@ class BaseOpentelemetryInstrument(Instrument[OpentelemetryConfigT]):
145
163
  resource: typing.Final = resources.Resource.create(attributes=attributes)
146
164
 
147
165
  self.tracer_provider = SdkTracerProvider(resource=resource)
166
+ if self.instrument_config.opentelemetry_baggage_span_attributes:
167
+ self.tracer_provider.add_span_processor(
168
+ BaggageSpanProcessor(self.instrument_config.opentelemetry_baggage_span_attributes),
169
+ )
148
170
  if self.instrument_config.pyroscope_endpoint and pyroscope:
149
171
  self.tracer_provider.add_span_processor(PyroscopeSpanProcessor())
150
172
 
@@ -2,10 +2,12 @@ from __future__ import annotations
2
2
  import contextlib
3
3
  import functools
4
4
  import typing
5
+ import urllib.parse
5
6
 
6
7
  import orjson
7
8
  import pydantic
8
9
  import sentry_sdk
10
+ from opentelemetry import baggage
9
11
  from sentry_sdk import _types as sentry_types
10
12
  from sentry_sdk.integrations import Integration # noqa: TC002
11
13
 
@@ -26,6 +28,8 @@ class SentryConfig(BaseInstrumentConfig):
26
28
  sentry_tags: dict[str, str] | None = None
27
29
  sentry_before_send: typing.Callable[[typing.Any, typing.Any], typing.Any | None] | None = None
28
30
  sentry_opentelemetry_trace_url_template: str | None = None
31
+ sentry_opentelemetry_baggage_keys: set[str] = pydantic.Field(default_factory=set)
32
+ sentry_opentelemetry_baggage_url_templates: dict[str, str] = pydantic.Field(default_factory=dict)
29
33
 
30
34
 
31
35
  IGNORED_STRUCTLOG_ATTRIBUTES: typing.Final = frozenset({"event", "level", "logger", "tracing", "timestamp"})
@@ -72,6 +76,34 @@ def add_trace_url_to_event(
72
76
  return event
73
77
 
74
78
 
79
+ def enrich_sentry_event_from_opentelemetry_baggage(
80
+ baggage_keys: set[str],
81
+ baggage_url_templates: dict[str, str],
82
+ event: sentry_types.Event,
83
+ _hint: sentry_types.Hint,
84
+ ) -> sentry_types.Event:
85
+ baggage_values = {
86
+ key: value
87
+ for key in baggage_keys.union(baggage_url_templates)
88
+ if (value := baggage.get_baggage(key)) is not None
89
+ }
90
+ if not baggage_values:
91
+ return event
92
+
93
+ if tag_values := {key: str(baggage_values[key]) for key in baggage_keys if key in baggage_values}:
94
+ event.setdefault("tags", {}).update(tag_values)
95
+
96
+ for key, url_template in baggage_url_templates.items():
97
+ placeholder = f"{{{key}}}"
98
+ if key not in baggage_values or placeholder not in url_template:
99
+ continue
100
+ event.setdefault("extra", {})[f"{key}_url"] = url_template.replace(
101
+ placeholder,
102
+ urllib.parse.quote(str(baggage_values[key]), safe=""),
103
+ )
104
+ return event
105
+
106
+
75
107
  def wrap_before_send_callbacks(*callbacks: sentry_types.EventProcessor | None) -> sentry_types.EventProcessor:
76
108
  def run_before_send(event: sentry_types.Event, hint: sentry_types.Hint) -> sentry_types.Event | None:
77
109
  for callback in callbacks:
@@ -109,6 +141,16 @@ class SentryInstrument(Instrument[SentryConfig]):
109
141
  )
110
142
  if self.instrument_config.sentry_opentelemetry_trace_url_template
111
143
  else None,
144
+ functools.partial(
145
+ enrich_sentry_event_from_opentelemetry_baggage,
146
+ self.instrument_config.sentry_opentelemetry_baggage_keys,
147
+ self.instrument_config.sentry_opentelemetry_baggage_url_templates,
148
+ )
149
+ if (
150
+ self.instrument_config.sentry_opentelemetry_baggage_keys
151
+ or self.instrument_config.sentry_opentelemetry_baggage_url_templates
152
+ )
153
+ else None,
112
154
  self.instrument_config.sentry_before_send,
113
155
  ),
114
156
  integrations=self.instrument_config.sentry_integrations,
@@ -0,0 +1,173 @@
1
+ [project]
2
+ name = "microbootstrap"
3
+ description = "Package for bootstrapping new micro-services"
4
+ readme = "README.md"
5
+ requires-python = ">=3.10,<4"
6
+ keywords = [
7
+ "python",
8
+ "microservice",
9
+ "bootstrap",
10
+ "opentelemetry",
11
+ "logging",
12
+ "error-tracing",
13
+ "litestar",
14
+ "fastapi",
15
+ "fastmcp",
16
+ "mcp",
17
+ ]
18
+ classifiers = [
19
+ "Typing :: Typed",
20
+ "Topic :: Software Development :: Build Tools",
21
+ "Operating System :: MacOS",
22
+ "Operating System :: Microsoft",
23
+ "Operating System :: POSIX :: Linux",
24
+ "Intended Audience :: Developers",
25
+ "Programming Language :: Python",
26
+ "Programming Language :: Python :: 3",
27
+ "Programming Language :: Python :: 3 :: Only",
28
+ "Programming Language :: Python :: 3.10",
29
+ "Programming Language :: Python :: 3.11",
30
+ "Programming Language :: Python :: 3.12",
31
+ "Programming Language :: Python :: 3.13",
32
+ "Programming Language :: Python :: 3.14",
33
+ ]
34
+ dependencies = [
35
+ "eval-type-backport>=0.2",
36
+ "opentelemetry-api>=1.30.0",
37
+ "opentelemetry-exporter-otlp>=1.15.0",
38
+ "opentelemetry-exporter-prometheus-remote-write>=0.46b0",
39
+ "opentelemetry-instrumentation>=0.46b0",
40
+ "opentelemetry-instrumentation-system-metrics>=0.46b0",
41
+ "opentelemetry-sdk>=1.30.0",
42
+ "pydantic-settings>=2",
43
+ "rich>=13",
44
+ "sentry-sdk>=2.7",
45
+ "structlog>=24",
46
+ "pyroscope-io>=1.0.0; platform_system != 'Windows'",
47
+ "opentelemetry-distro[otlp]>=0.54b1",
48
+ "opentelemetry-instrumentation-aio-pika>=0.54b1",
49
+ "opentelemetry-instrumentation-aiohttp-client>=0.54b1",
50
+ "opentelemetry-instrumentation-aiokafka>=0.54b1",
51
+ "opentelemetry-instrumentation-asyncpg>=0.54b1",
52
+ "opentelemetry-instrumentation-httpx>=0.54b1",
53
+ "opentelemetry-instrumentation-logging>=0.54b1",
54
+ "opentelemetry-instrumentation-redis>=0.54b1",
55
+ "opentelemetry-instrumentation-psycopg>=0.54b1",
56
+ "opentelemetry-instrumentation-sqlalchemy>=0.54b1",
57
+ "opentelemetry-instrumentation-asyncio>=0.54b1",
58
+ "opentelemetry-instrumentation-asgi>=0.46b0",
59
+ "orjson>=3.10.18",
60
+ ]
61
+ version = "1.5.0"
62
+
63
+ [[project.authors]]
64
+ name = "community-of-python"
65
+
66
+ [project.optional-dependencies]
67
+ fastapi = [
68
+ "fastapi>=0.100",
69
+ "fastapi-offline-docs>=1",
70
+ "opentelemetry-instrumentation-fastapi>=0.46b0",
71
+ "prometheus-fastapi-instrumentator>=6.1",
72
+ ]
73
+ litestar = [
74
+ "litestar>=2.9",
75
+ "litestar-offline-docs>=1",
76
+ "prometheus-client>=0.20",
77
+ ]
78
+ granian = ["granian[reload]>=1"]
79
+ faststream = [
80
+ "faststream~=0.6.2",
81
+ "prometheus-client>=0.20",
82
+ ]
83
+ fastmcp = [
84
+ "fastmcp>=2,<4",
85
+ "prometheus-client>=0.20",
86
+ ]
87
+
88
+ [dependency-groups]
89
+ dev = [
90
+ "anyio>=4.8.0",
91
+ "httpx>=0.28.1",
92
+ "mypy>=1.14.1",
93
+ "pre-commit>=4.0.1",
94
+ "pytest>=8.3.4",
95
+ "pytest-cov>=6.0.0",
96
+ "pytest-mock>=3.14.0",
97
+ "pytest-xdist>=3.6.1",
98
+ "redis>=5.2.1",
99
+ "ruff>=0.9.1",
100
+ "trio>=0.28.0",
101
+ "typing-extensions>=4.12.2",
102
+ ]
103
+
104
+ [build-system]
105
+ requires = ["uv_build"]
106
+ build-backend = "uv_build"
107
+
108
+ [tool.uv.build-backend]
109
+ module-name = "microbootstrap"
110
+ module-root = ""
111
+
112
+ [tool.mypy]
113
+ plugins = ["pydantic.mypy"]
114
+ files = [
115
+ "microbootstrap",
116
+ "tests",
117
+ ]
118
+ python_version = "3.10"
119
+ strict = true
120
+ pretty = true
121
+ show_error_codes = true
122
+
123
+ [tool.ruff]
124
+ target-version = "py310"
125
+ line-length = 120
126
+
127
+ [tool.ruff.format]
128
+ exclude = ["README.md"]
129
+ docstring-code-format = true
130
+
131
+ [tool.ruff.lint]
132
+ select = ["ALL"]
133
+ ignore = [
134
+ "CPY001",
135
+ "EM",
136
+ "FBT",
137
+ "TRY003",
138
+ "FIX002",
139
+ "TD003",
140
+ "D1",
141
+ "D106",
142
+ "D203",
143
+ "D213",
144
+ "G004",
145
+ "FA",
146
+ "COM812",
147
+ "ISC001",
148
+ "PLR0917",
149
+ ]
150
+
151
+ [tool.ruff.lint.isort]
152
+ no-lines-before = [
153
+ "standard-library",
154
+ "local-folder",
155
+ ]
156
+ lines-after-imports = 2
157
+
158
+ [tool.ruff.lint.extend-per-file-ignores]
159
+ "tests/*.py" = [
160
+ "S101",
161
+ "S311",
162
+ ]
163
+ "examples/*.py" = ["INP001"]
164
+
165
+ [tool.coverage.report]
166
+ exclude_also = [
167
+ "if typing.TYPE_CHECKING:",
168
+ 'class \w+\(typing.Protocol\):',
169
+ ]
170
+ omit = ["tests/*"]
171
+
172
+ [tool.pytest.ini_options]
173
+ addopts = "--cov=. -p no:warnings --cov-report term-missing"
@@ -58,7 +58,7 @@ dependencies = [
58
58
  "opentelemetry-instrumentation-asgi>=0.46b0",
59
59
  "orjson>=3.10.18",
60
60
  ]
61
- version = "1.4.2"
61
+ version = "1.5.0"
62
62
  authors = [{ name = "community-of-python" }]
63
63
 
64
64
  [project.optional-dependencies]
@@ -114,11 +114,13 @@ target-version = "py310"
114
114
  line-length = 120
115
115
 
116
116
  [tool.ruff.format]
117
+ exclude = ["README.md"]
117
118
  docstring-code-format = true
118
119
 
119
120
  [tool.ruff.lint]
120
121
  select = ["ALL"]
121
122
  ignore = [
123
+ "CPY001",
122
124
  "EM",
123
125
  "FBT",
124
126
  "TRY003",
@@ -132,6 +134,7 @@ ignore = [
132
134
  "FA",
133
135
  "COM812",
134
136
  "ISC001",
137
+ "PLR0917",
135
138
  ]
136
139
 
137
140
  [tool.ruff.lint.isort]