log-foundry 0.10.2.dev89__tar.gz → 0.10.2.dev90__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 (59) hide show
  1. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/PKG-INFO +3 -2
  2. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/README.md +2 -1
  3. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/pyproject.toml +38 -3
  4. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/LICENSE +0 -0
  5. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/__init__.py +0 -0
  6. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/_diag.py +0 -0
  7. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/_fork.py +0 -0
  8. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/_lifecycle.py +0 -0
  9. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/api.py +0 -0
  10. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/config.py +0 -0
  11. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/console.py +0 -0
  12. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/context.py +0 -0
  13. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/decorator.py +0 -0
  14. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/ids.py +0 -0
  15. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/model.py +0 -0
  16. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/py.typed +0 -0
  17. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/results.py +0 -0
  18. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sanitize.py +0 -0
  19. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/__init__.py +0 -0
  20. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/_batch.py +0 -0
  21. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/_chunk.py +0 -0
  22. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/_retry.py +0 -0
  23. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/_socket.py +0 -0
  24. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/_time.py +0 -0
  25. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/base.py +0 -0
  26. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/callback.py +0 -0
  27. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/clickhouse.py +0 -0
  28. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/datadog.py +0 -0
  29. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/elasticsearch.py +0 -0
  30. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/eventhubs.py +0 -0
  31. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/file.py +0 -0
  32. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/filtering.py +0 -0
  33. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/firehose.py +0 -0
  34. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/honeycomb.py +0 -0
  35. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/http.py +0 -0
  36. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/kafka.py +0 -0
  37. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/kinesis.py +0 -0
  38. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/logging_sink.py +0 -0
  39. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/logstash.py +0 -0
  40. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/loki.py +0 -0
  41. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/memory.py +0 -0
  42. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/mongodb.py +0 -0
  43. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/multi.py +0 -0
  44. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/nats.py +0 -0
  45. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/newrelic.py +0 -0
  46. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/null.py +0 -0
  47. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/postgres.py +0 -0
  48. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/pubsub.py +0 -0
  49. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/rabbitmq.py +0 -0
  50. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/redis.py +0 -0
  51. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/sentry.py +0 -0
  52. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/sns.py +0 -0
  53. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/splunk.py +0 -0
  54. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/sqlite.py +0 -0
  55. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/sqs.py +0 -0
  56. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/stdout.py +0 -0
  57. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/syslog.py +0 -0
  58. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/sinks/transform.py +0 -0
  59. {log_foundry-0.10.2.dev89 → log_foundry-0.10.2.dev90}/src/log_foundry/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: log-foundry
3
- Version: 0.10.2.dev89
3
+ Version: 0.10.2.dev90
4
4
  Summary: Generate logs for your console and JSON events for downstream consumption.
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -1296,7 +1296,8 @@ bound each *value* — an event of many bounded values can still be large; see
1296
1296
 
1297
1297
  ```bash
1298
1298
  poetry install --with dev # set up (Python 3.12+)
1299
- poetry run pytest # test
1299
+ poetry run pytest # test (runs in parallel by default; see addopts)
1300
+ poetry run pytest -n 0 # ...serially, when debugging a failure
1300
1301
  poetry run ruff check . # lint (line-length 100)
1301
1302
  poetry run mypy # typecheck (strict, over src/)
1302
1303
  ```
@@ -1260,7 +1260,8 @@ bound each *value* — an event of many bounded values can still be large; see
1260
1260
 
1261
1261
  ```bash
1262
1262
  poetry install --with dev # set up (Python 3.12+)
1263
- poetry run pytest # test
1263
+ poetry run pytest # test (runs in parallel by default; see addopts)
1264
+ poetry run pytest -n 0 # ...serially, when debugging a failure
1264
1265
  poetry run ruff check . # lint (line-length 100)
1265
1266
  poetry run mypy # typecheck (strict, over src/)
1266
1267
  ```
@@ -20,7 +20,7 @@ dependencies = [
20
20
  ]
21
21
 
22
22
  # Optional features. Install with: pip install log-foundry[aws]
23
- version = "0.10.2.dev89"
23
+ version = "0.10.2.dev90"
24
24
 
25
25
  [project.optional-dependencies]
26
26
  aws = ["boto3>=1.43.61"] # SQSSink, SNSSink, KinesisSink, FirehoseSink
@@ -67,7 +67,7 @@ pytest-cov = "^7.1.0"
67
67
  # CPU, because the bounds this library promises (a 30 s shutdown budget, a backoff, a
68
68
  # wedged drain) are proved by waiting for them. Two tests block 30 s each. Distributing
69
69
  # across processes therefore buys almost the whole wall clock back — measured 125.9 s ->
70
- # 40.8 s at `-n 8 --dist load` — where caching the dependency install could only ever
70
+ # 34.8 s at `-n 12 --dist worksteal` — where caching the dependency install could only ever
71
71
  # save the 18 s that install takes.
72
72
  pytest-xdist = "^3.8"
73
73
  # Bounded to a minor, not left open. Ruff's DEFAULT rule set is not stable across minors —
@@ -114,7 +114,42 @@ build-backend = "poetry_dynamic_versioning.backend"
114
114
  testpaths = ["tests"]
115
115
  pythonpath = ["src"] # src layout: make `import log_foundry` work without an install
116
116
  asyncio_mode = "auto" # async test functions run without an explicit marker
117
- addopts = "--strict-markers"
117
+ # `-n 12 --dist worksteal` lives HERE rather than in the CI workflow, so the gate a developer runs
118
+ # before pushing is the same command CI runs, at the same speed: ~133 s -> ~35 s locally, and the
119
+ # pre-push gate is where those 98 s are actually paid for by a human waiting. It also removes a
120
+ # divergence — with the flags only in CI, an order-dependent failure could appear there and be
121
+ # unreproducible with a bare `poetry run pytest`.
122
+ #
123
+ # The suite is sleep-bound, not CPU-bound (~133 s of wall clock at well under 10% CPU), because
124
+ # this library's promises ARE bounds and a bound is proved by waiting for it; two tests in
125
+ # test_orphan_sink_handoff.py block 30 s each. That is why the count is a fixed 12 rather than
126
+ # `auto`: workers here are overwhelmingly blocked rather than computing, so `auto` — the CPU
127
+ # count, which is 4 on a GitHub runner — leaves most of the win on the table.
128
+ #
129
+ # `--dist worksteal`, NOT `--dist load`, and this was learned the expensive way. `load` hands each
130
+ # worker a fixed slice up front, so the allocation is a deterministic function of the test list —
131
+ # and when SPEC-047 added a handful of NATS tests, both 30 s tests landed in the SAME slice and
132
+ # the parallel run went from 40.8 s to 71.4 s (three runs, spread 0.1 s: not luck, and it would
133
+ # have stayed green in CI while quietly costing 30 s a run). `worksteal` lets an idle worker take
134
+ # work from a busy one, which is exactly the long-tail shape here. Measured on the same tree,
135
+ # 1,899 passed / 7 skipped every time:
136
+ #
137
+ # serial 133.4 s -n 8 --dist worksteal 40.0 s
138
+ # -n 8 --dist load 71.4 s -n 12 --dist worksteal 34.8 s <- chosen
139
+ # -n 12 --dist load 38.4 s -n 16 --dist worksteal 34.1 s (knee)
140
+ #
141
+ # `loadfile` is worse than either: it keeps a module on one worker, pinning those two 30 s tests
142
+ # to one process and flooring the run at ~72 s — measured at both -n 8 and -n 12, though not at
143
+ # every worker count, since `-n 1 --dist loadfile` is 125.4 s.
144
+ #
145
+ # TO OVERRIDE, PASS `-n 0` — it disables distribution entirely (verified: no workers are created)
146
+ # and is the right flag for debugging a failure, for `--pdb`, or for reading interleaved output.
147
+ # `tests/integration` is run that way in CI for a stronger reason than convenience: those tests
148
+ # share nine real services, so distributing them would have them reading each other's writes.
149
+ # That one is ENFORCED, not merely configured -- `tests/integration/conftest.py` refuses a
150
+ # distributed session, so deleting `-n 0` from the workflow fails loudly instead of producing the
151
+ # intermittent cross-talk it used to.
152
+ addopts = "--strict-markers -n 12 --dist worksteal"
118
153
 
119
154
  [tool.ruff]
120
155
  src = ["src", "tests"]