log-foundry 0.10.2.dev60__tar.gz → 0.10.2.dev62__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 (60) hide show
  1. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/PKG-INFO +1 -1
  2. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/pyproject.toml +1 -1
  3. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/_fork.py +40 -0
  4. log_foundry-0.10.2.dev62/src/log_foundry/_lifecycle.py +699 -0
  5. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/config.py +8 -1
  6. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/decorator.py +2 -2
  7. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/filtering.py +6 -2
  8. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/logstash.py +7 -1
  9. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/multi.py +7 -3
  10. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/sentry.py +5 -3
  11. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/transform.py +6 -2
  12. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/worker.py +2 -2
  13. log_foundry-0.10.2.dev60/src/log_foundry/_lifecycle.py +0 -176
  14. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/LICENSE +0 -0
  15. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/README.md +0 -0
  16. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/__init__.py +0 -0
  17. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/_diag.py +0 -0
  18. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/api.py +0 -0
  19. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/console.py +0 -0
  20. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/context.py +0 -0
  21. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/ids.py +0 -0
  22. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/model.py +0 -0
  23. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/py.typed +0 -0
  24. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/results.py +0 -0
  25. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sanitize.py +0 -0
  26. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/__init__.py +0 -0
  27. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_batch.py +0 -0
  28. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_chunk.py +0 -0
  29. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_retry.py +0 -0
  30. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_socket.py +0 -0
  31. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_time.py +0 -0
  32. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/base.py +0 -0
  33. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/callback.py +0 -0
  34. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/clickhouse.py +0 -0
  35. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/datadog.py +0 -0
  36. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/elasticsearch.py +0 -0
  37. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/eventhubs.py +0 -0
  38. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/file.py +0 -0
  39. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/firehose.py +0 -0
  40. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/honeycomb.py +0 -0
  41. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/http.py +0 -0
  42. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/kafka.py +0 -0
  43. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/kinesis.py +0 -0
  44. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/logging_sink.py +0 -0
  45. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/loki.py +0 -0
  46. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/memory.py +0 -0
  47. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/mongodb.py +0 -0
  48. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/nats.py +0 -0
  49. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/newrelic.py +0 -0
  50. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/null.py +0 -0
  51. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/postgres.py +0 -0
  52. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/pubsub.py +0 -0
  53. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/rabbitmq.py +0 -0
  54. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/redis.py +0 -0
  55. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/sns.py +0 -0
  56. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/splunk.py +0 -0
  57. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/sqlite.py +0 -0
  58. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/sqs.py +0 -0
  59. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/stdout.py +0 -0
  60. {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/syslog.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: log-foundry
3
- Version: 0.10.2.dev60
3
+ Version: 0.10.2.dev62
4
4
  Summary: Generate logs for your console and JSON events for downstream consumption.
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -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.dev60"
23
+ version = "0.10.2.dev62"
24
24
 
25
25
  [project.optional-dependencies]
26
26
  aws = ["boto3>=1.43.61"] # SQSSink, SNSSink, KinesisSink, FirehoseSink
@@ -366,6 +366,43 @@ def _offers_discard(holder: object) -> bool:
366
366
  return False
367
367
 
368
368
 
369
+ _SKIP_ATTRIBUTE = "_FORK_SKIP"
370
+ """A module's opt-out: attribute names the walk must not read or descend into.
371
+
372
+ **Bookkeeping that pins objects is not live state to repair**, and the difference is invisible
373
+ to a walk that only sees a container. ``_lifecycle._owned`` is the case: SPEC-042 FR-001 requires
374
+ it to hold a **strong** reference to every sink this process ever acquired, so without an opt-out
375
+ the walk reaches sinks the process abandoned several ``configure()`` calls ago — replacing their
376
+ locks, which is merely wasteful, and calling their fork hooks, which is not. Measured: a forked
377
+ child announced a buffer-discard failure for a sink that had been superseded, and a ``FileSink``
378
+ in that state would have its file reopened on every fork for the life of the process.
379
+
380
+ Declared by the module that owns the state rather than listed here, which keeps this module's
381
+ rule that it imports nothing but ``_diag`` (SPEC-039 FR-006). Nothing is lost by skipping: a sink
382
+ that is still *live* is reached through the config and the worker, which are not opted out.
383
+ """
384
+
385
+
386
+ def _skipped_names(holder: object) -> frozenset[str]:
387
+ """Returns the attribute names a holder has opted out of the walk.
388
+
389
+ Args:
390
+ holder: The module, class or instance the walk is about to read.
391
+
392
+ Returns:
393
+ The opted-out names, empty for anything that declares none.
394
+
395
+ Raises:
396
+ None. A malformed or unreadable declaration opts nothing out, so the walk does more work
397
+ rather than less — the safe direction for a repair whose absence is a hang.
398
+ """
399
+ try:
400
+ declared = getattr(holder, _SKIP_ATTRIBUTE, None)
401
+ return frozenset(declared) if declared else frozenset()
402
+ except Exception:
403
+ return frozenset()
404
+
405
+
369
406
  def _reinit_primitives() -> list[Any]:
370
407
  """Replaces every lock and event this package owns, wherever the walk reaches one.
371
408
 
@@ -417,7 +454,10 @@ def _reinit_primitives() -> list[Any]:
417
454
  continue
418
455
  if _offers_discard(holder):
419
456
  buffered.append(holder)
457
+ skip = _skipped_names(holder)
420
458
  for name, value in _namespace_items(holder):
459
+ if name in skip:
460
+ continue
421
461
  fresh = _fresh_primitive(value, memo, keepalive)
422
462
  if fresh is not None:
423
463
  _assign(holder, name, fresh)