oscura 0.0.1__py3-none-any.whl → 0.1.1__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.
- oscura/__init__.py +813 -8
- oscura/__main__.py +392 -0
- oscura/analyzers/__init__.py +37 -0
- oscura/analyzers/digital/__init__.py +177 -0
- oscura/analyzers/digital/bus.py +691 -0
- oscura/analyzers/digital/clock.py +805 -0
- oscura/analyzers/digital/correlation.py +720 -0
- oscura/analyzers/digital/edges.py +632 -0
- oscura/analyzers/digital/extraction.py +413 -0
- oscura/analyzers/digital/quality.py +878 -0
- oscura/analyzers/digital/signal_quality.py +877 -0
- oscura/analyzers/digital/thresholds.py +708 -0
- oscura/analyzers/digital/timing.py +1104 -0
- oscura/analyzers/eye/__init__.py +46 -0
- oscura/analyzers/eye/diagram.py +434 -0
- oscura/analyzers/eye/metrics.py +555 -0
- oscura/analyzers/jitter/__init__.py +83 -0
- oscura/analyzers/jitter/ber.py +333 -0
- oscura/analyzers/jitter/decomposition.py +759 -0
- oscura/analyzers/jitter/measurements.py +413 -0
- oscura/analyzers/jitter/spectrum.py +220 -0
- oscura/analyzers/measurements.py +40 -0
- oscura/analyzers/packet/__init__.py +171 -0
- oscura/analyzers/packet/daq.py +1077 -0
- oscura/analyzers/packet/metrics.py +437 -0
- oscura/analyzers/packet/parser.py +327 -0
- oscura/analyzers/packet/payload.py +2156 -0
- oscura/analyzers/packet/payload_analysis.py +1312 -0
- oscura/analyzers/packet/payload_extraction.py +236 -0
- oscura/analyzers/packet/payload_patterns.py +670 -0
- oscura/analyzers/packet/stream.py +359 -0
- oscura/analyzers/patterns/__init__.py +266 -0
- oscura/analyzers/patterns/clustering.py +1036 -0
- oscura/analyzers/patterns/discovery.py +539 -0
- oscura/analyzers/patterns/learning.py +797 -0
- oscura/analyzers/patterns/matching.py +1091 -0
- oscura/analyzers/patterns/periodic.py +650 -0
- oscura/analyzers/patterns/sequences.py +767 -0
- oscura/analyzers/power/__init__.py +116 -0
- oscura/analyzers/power/ac_power.py +391 -0
- oscura/analyzers/power/basic.py +383 -0
- oscura/analyzers/power/conduction.py +314 -0
- oscura/analyzers/power/efficiency.py +297 -0
- oscura/analyzers/power/ripple.py +356 -0
- oscura/analyzers/power/soa.py +372 -0
- oscura/analyzers/power/switching.py +479 -0
- oscura/analyzers/protocol/__init__.py +150 -0
- oscura/analyzers/protocols/__init__.py +150 -0
- oscura/analyzers/protocols/base.py +500 -0
- oscura/analyzers/protocols/can.py +620 -0
- oscura/analyzers/protocols/can_fd.py +448 -0
- oscura/analyzers/protocols/flexray.py +405 -0
- oscura/analyzers/protocols/hdlc.py +399 -0
- oscura/analyzers/protocols/i2c.py +368 -0
- oscura/analyzers/protocols/i2s.py +296 -0
- oscura/analyzers/protocols/jtag.py +393 -0
- oscura/analyzers/protocols/lin.py +445 -0
- oscura/analyzers/protocols/manchester.py +333 -0
- oscura/analyzers/protocols/onewire.py +501 -0
- oscura/analyzers/protocols/spi.py +334 -0
- oscura/analyzers/protocols/swd.py +325 -0
- oscura/analyzers/protocols/uart.py +393 -0
- oscura/analyzers/protocols/usb.py +495 -0
- oscura/analyzers/signal_integrity/__init__.py +63 -0
- oscura/analyzers/signal_integrity/embedding.py +294 -0
- oscura/analyzers/signal_integrity/equalization.py +370 -0
- oscura/analyzers/signal_integrity/sparams.py +484 -0
- oscura/analyzers/spectral/__init__.py +53 -0
- oscura/analyzers/spectral/chunked.py +273 -0
- oscura/analyzers/spectral/chunked_fft.py +571 -0
- oscura/analyzers/spectral/chunked_wavelet.py +391 -0
- oscura/analyzers/spectral/fft.py +92 -0
- oscura/analyzers/statistical/__init__.py +250 -0
- oscura/analyzers/statistical/checksum.py +923 -0
- oscura/analyzers/statistical/chunked_corr.py +228 -0
- oscura/analyzers/statistical/classification.py +778 -0
- oscura/analyzers/statistical/entropy.py +1113 -0
- oscura/analyzers/statistical/ngrams.py +614 -0
- oscura/analyzers/statistics/__init__.py +119 -0
- oscura/analyzers/statistics/advanced.py +885 -0
- oscura/analyzers/statistics/basic.py +263 -0
- oscura/analyzers/statistics/correlation.py +630 -0
- oscura/analyzers/statistics/distribution.py +298 -0
- oscura/analyzers/statistics/outliers.py +463 -0
- oscura/analyzers/statistics/streaming.py +93 -0
- oscura/analyzers/statistics/trend.py +520 -0
- oscura/analyzers/validation.py +598 -0
- oscura/analyzers/waveform/__init__.py +36 -0
- oscura/analyzers/waveform/measurements.py +943 -0
- oscura/analyzers/waveform/measurements_with_uncertainty.py +371 -0
- oscura/analyzers/waveform/spectral.py +1689 -0
- oscura/analyzers/waveform/wavelets.py +298 -0
- oscura/api/__init__.py +62 -0
- oscura/api/dsl.py +538 -0
- oscura/api/fluent.py +571 -0
- oscura/api/operators.py +498 -0
- oscura/api/optimization.py +392 -0
- oscura/api/profiling.py +396 -0
- oscura/automotive/__init__.py +73 -0
- oscura/automotive/can/__init__.py +52 -0
- oscura/automotive/can/analysis.py +356 -0
- oscura/automotive/can/checksum.py +250 -0
- oscura/automotive/can/correlation.py +212 -0
- oscura/automotive/can/discovery.py +355 -0
- oscura/automotive/can/message_wrapper.py +375 -0
- oscura/automotive/can/models.py +385 -0
- oscura/automotive/can/patterns.py +381 -0
- oscura/automotive/can/session.py +452 -0
- oscura/automotive/can/state_machine.py +300 -0
- oscura/automotive/can/stimulus_response.py +461 -0
- oscura/automotive/dbc/__init__.py +15 -0
- oscura/automotive/dbc/generator.py +156 -0
- oscura/automotive/dbc/parser.py +146 -0
- oscura/automotive/dtc/__init__.py +30 -0
- oscura/automotive/dtc/database.py +3036 -0
- oscura/automotive/j1939/__init__.py +14 -0
- oscura/automotive/j1939/decoder.py +745 -0
- oscura/automotive/loaders/__init__.py +35 -0
- oscura/automotive/loaders/asc.py +98 -0
- oscura/automotive/loaders/blf.py +77 -0
- oscura/automotive/loaders/csv_can.py +136 -0
- oscura/automotive/loaders/dispatcher.py +136 -0
- oscura/automotive/loaders/mdf.py +331 -0
- oscura/automotive/loaders/pcap.py +132 -0
- oscura/automotive/obd/__init__.py +14 -0
- oscura/automotive/obd/decoder.py +707 -0
- oscura/automotive/uds/__init__.py +48 -0
- oscura/automotive/uds/decoder.py +265 -0
- oscura/automotive/uds/models.py +64 -0
- oscura/automotive/visualization.py +369 -0
- oscura/batch/__init__.py +55 -0
- oscura/batch/advanced.py +627 -0
- oscura/batch/aggregate.py +300 -0
- oscura/batch/analyze.py +139 -0
- oscura/batch/logging.py +487 -0
- oscura/batch/metrics.py +556 -0
- oscura/builders/__init__.py +41 -0
- oscura/builders/signal_builder.py +1131 -0
- oscura/cli/__init__.py +14 -0
- oscura/cli/batch.py +339 -0
- oscura/cli/characterize.py +273 -0
- oscura/cli/compare.py +775 -0
- oscura/cli/decode.py +551 -0
- oscura/cli/main.py +247 -0
- oscura/cli/shell.py +350 -0
- oscura/comparison/__init__.py +66 -0
- oscura/comparison/compare.py +397 -0
- oscura/comparison/golden.py +487 -0
- oscura/comparison/limits.py +391 -0
- oscura/comparison/mask.py +434 -0
- oscura/comparison/trace_diff.py +30 -0
- oscura/comparison/visualization.py +481 -0
- oscura/compliance/__init__.py +70 -0
- oscura/compliance/advanced.py +756 -0
- oscura/compliance/masks.py +363 -0
- oscura/compliance/reporting.py +483 -0
- oscura/compliance/testing.py +298 -0
- oscura/component/__init__.py +38 -0
- oscura/component/impedance.py +365 -0
- oscura/component/reactive.py +598 -0
- oscura/component/transmission_line.py +312 -0
- oscura/config/__init__.py +191 -0
- oscura/config/defaults.py +254 -0
- oscura/config/loader.py +348 -0
- oscura/config/memory.py +271 -0
- oscura/config/migration.py +458 -0
- oscura/config/pipeline.py +1077 -0
- oscura/config/preferences.py +530 -0
- oscura/config/protocol.py +875 -0
- oscura/config/schema.py +713 -0
- oscura/config/settings.py +420 -0
- oscura/config/thresholds.py +599 -0
- oscura/convenience.py +457 -0
- oscura/core/__init__.py +299 -0
- oscura/core/audit.py +457 -0
- oscura/core/backend_selector.py +405 -0
- oscura/core/cache.py +590 -0
- oscura/core/cancellation.py +439 -0
- oscura/core/confidence.py +225 -0
- oscura/core/config.py +506 -0
- oscura/core/correlation.py +216 -0
- oscura/core/cross_domain.py +422 -0
- oscura/core/debug.py +301 -0
- oscura/core/edge_cases.py +541 -0
- oscura/core/exceptions.py +535 -0
- oscura/core/gpu_backend.py +523 -0
- oscura/core/lazy.py +832 -0
- oscura/core/log_query.py +540 -0
- oscura/core/logging.py +931 -0
- oscura/core/logging_advanced.py +952 -0
- oscura/core/memoize.py +171 -0
- oscura/core/memory_check.py +274 -0
- oscura/core/memory_guard.py +290 -0
- oscura/core/memory_limits.py +336 -0
- oscura/core/memory_monitor.py +453 -0
- oscura/core/memory_progress.py +465 -0
- oscura/core/memory_warnings.py +315 -0
- oscura/core/numba_backend.py +362 -0
- oscura/core/performance.py +352 -0
- oscura/core/progress.py +524 -0
- oscura/core/provenance.py +358 -0
- oscura/core/results.py +331 -0
- oscura/core/types.py +504 -0
- oscura/core/uncertainty.py +383 -0
- oscura/discovery/__init__.py +52 -0
- oscura/discovery/anomaly_detector.py +672 -0
- oscura/discovery/auto_decoder.py +415 -0
- oscura/discovery/comparison.py +497 -0
- oscura/discovery/quality_validator.py +528 -0
- oscura/discovery/signal_detector.py +769 -0
- oscura/dsl/__init__.py +73 -0
- oscura/dsl/commands.py +246 -0
- oscura/dsl/interpreter.py +455 -0
- oscura/dsl/parser.py +689 -0
- oscura/dsl/repl.py +172 -0
- oscura/exceptions.py +59 -0
- oscura/exploratory/__init__.py +111 -0
- oscura/exploratory/error_recovery.py +642 -0
- oscura/exploratory/fuzzy.py +513 -0
- oscura/exploratory/fuzzy_advanced.py +786 -0
- oscura/exploratory/legacy.py +831 -0
- oscura/exploratory/parse.py +358 -0
- oscura/exploratory/recovery.py +275 -0
- oscura/exploratory/sync.py +382 -0
- oscura/exploratory/unknown.py +707 -0
- oscura/export/__init__.py +25 -0
- oscura/export/wireshark/README.md +265 -0
- oscura/export/wireshark/__init__.py +47 -0
- oscura/export/wireshark/generator.py +312 -0
- oscura/export/wireshark/lua_builder.py +159 -0
- oscura/export/wireshark/templates/dissector.lua.j2 +92 -0
- oscura/export/wireshark/type_mapping.py +165 -0
- oscura/export/wireshark/validator.py +105 -0
- oscura/exporters/__init__.py +94 -0
- oscura/exporters/csv.py +303 -0
- oscura/exporters/exporters.py +44 -0
- oscura/exporters/hdf5.py +219 -0
- oscura/exporters/html_export.py +701 -0
- oscura/exporters/json_export.py +291 -0
- oscura/exporters/markdown_export.py +367 -0
- oscura/exporters/matlab_export.py +354 -0
- oscura/exporters/npz_export.py +219 -0
- oscura/exporters/spice_export.py +210 -0
- oscura/extensibility/__init__.py +131 -0
- oscura/extensibility/docs.py +752 -0
- oscura/extensibility/extensions.py +1125 -0
- oscura/extensibility/logging.py +259 -0
- oscura/extensibility/measurements.py +485 -0
- oscura/extensibility/plugins.py +414 -0
- oscura/extensibility/registry.py +346 -0
- oscura/extensibility/templates.py +913 -0
- oscura/extensibility/validation.py +651 -0
- oscura/filtering/__init__.py +89 -0
- oscura/filtering/base.py +563 -0
- oscura/filtering/convenience.py +564 -0
- oscura/filtering/design.py +725 -0
- oscura/filtering/filters.py +32 -0
- oscura/filtering/introspection.py +605 -0
- oscura/guidance/__init__.py +24 -0
- oscura/guidance/recommender.py +429 -0
- oscura/guidance/wizard.py +518 -0
- oscura/inference/__init__.py +251 -0
- oscura/inference/active_learning/README.md +153 -0
- oscura/inference/active_learning/__init__.py +38 -0
- oscura/inference/active_learning/lstar.py +257 -0
- oscura/inference/active_learning/observation_table.py +230 -0
- oscura/inference/active_learning/oracle.py +78 -0
- oscura/inference/active_learning/teachers/__init__.py +15 -0
- oscura/inference/active_learning/teachers/simulator.py +192 -0
- oscura/inference/adaptive_tuning.py +453 -0
- oscura/inference/alignment.py +653 -0
- oscura/inference/bayesian.py +943 -0
- oscura/inference/binary.py +1016 -0
- oscura/inference/crc_reverse.py +711 -0
- oscura/inference/logic.py +288 -0
- oscura/inference/message_format.py +1305 -0
- oscura/inference/protocol.py +417 -0
- oscura/inference/protocol_dsl.py +1084 -0
- oscura/inference/protocol_library.py +1230 -0
- oscura/inference/sequences.py +809 -0
- oscura/inference/signal_intelligence.py +1509 -0
- oscura/inference/spectral.py +215 -0
- oscura/inference/state_machine.py +634 -0
- oscura/inference/stream.py +918 -0
- oscura/integrations/__init__.py +59 -0
- oscura/integrations/llm.py +1827 -0
- oscura/jupyter/__init__.py +32 -0
- oscura/jupyter/display.py +268 -0
- oscura/jupyter/magic.py +334 -0
- oscura/loaders/__init__.py +526 -0
- oscura/loaders/binary.py +69 -0
- oscura/loaders/configurable.py +1255 -0
- oscura/loaders/csv.py +26 -0
- oscura/loaders/csv_loader.py +473 -0
- oscura/loaders/hdf5.py +9 -0
- oscura/loaders/hdf5_loader.py +510 -0
- oscura/loaders/lazy.py +370 -0
- oscura/loaders/mmap_loader.py +583 -0
- oscura/loaders/numpy_loader.py +436 -0
- oscura/loaders/pcap.py +432 -0
- oscura/loaders/preprocessing.py +368 -0
- oscura/loaders/rigol.py +287 -0
- oscura/loaders/sigrok.py +321 -0
- oscura/loaders/tdms.py +367 -0
- oscura/loaders/tektronix.py +711 -0
- oscura/loaders/validation.py +584 -0
- oscura/loaders/vcd.py +464 -0
- oscura/loaders/wav.py +233 -0
- oscura/math/__init__.py +45 -0
- oscura/math/arithmetic.py +824 -0
- oscura/math/interpolation.py +413 -0
- oscura/onboarding/__init__.py +39 -0
- oscura/onboarding/help.py +498 -0
- oscura/onboarding/tutorials.py +405 -0
- oscura/onboarding/wizard.py +466 -0
- oscura/optimization/__init__.py +19 -0
- oscura/optimization/parallel.py +440 -0
- oscura/optimization/search.py +532 -0
- oscura/pipeline/__init__.py +43 -0
- oscura/pipeline/base.py +338 -0
- oscura/pipeline/composition.py +242 -0
- oscura/pipeline/parallel.py +448 -0
- oscura/pipeline/pipeline.py +375 -0
- oscura/pipeline/reverse_engineering.py +1119 -0
- oscura/plugins/__init__.py +122 -0
- oscura/plugins/base.py +272 -0
- oscura/plugins/cli.py +497 -0
- oscura/plugins/discovery.py +411 -0
- oscura/plugins/isolation.py +418 -0
- oscura/plugins/lifecycle.py +959 -0
- oscura/plugins/manager.py +493 -0
- oscura/plugins/registry.py +421 -0
- oscura/plugins/versioning.py +372 -0
- oscura/py.typed +0 -0
- oscura/quality/__init__.py +65 -0
- oscura/quality/ensemble.py +740 -0
- oscura/quality/explainer.py +338 -0
- oscura/quality/scoring.py +616 -0
- oscura/quality/warnings.py +456 -0
- oscura/reporting/__init__.py +248 -0
- oscura/reporting/advanced.py +1234 -0
- oscura/reporting/analyze.py +448 -0
- oscura/reporting/argument_preparer.py +596 -0
- oscura/reporting/auto_report.py +507 -0
- oscura/reporting/batch.py +615 -0
- oscura/reporting/chart_selection.py +223 -0
- oscura/reporting/comparison.py +330 -0
- oscura/reporting/config.py +615 -0
- oscura/reporting/content/__init__.py +39 -0
- oscura/reporting/content/executive.py +127 -0
- oscura/reporting/content/filtering.py +191 -0
- oscura/reporting/content/minimal.py +257 -0
- oscura/reporting/content/verbosity.py +162 -0
- oscura/reporting/core.py +508 -0
- oscura/reporting/core_formats/__init__.py +17 -0
- oscura/reporting/core_formats/multi_format.py +210 -0
- oscura/reporting/engine.py +836 -0
- oscura/reporting/export.py +366 -0
- oscura/reporting/formatting/__init__.py +129 -0
- oscura/reporting/formatting/emphasis.py +81 -0
- oscura/reporting/formatting/numbers.py +403 -0
- oscura/reporting/formatting/standards.py +55 -0
- oscura/reporting/formatting.py +466 -0
- oscura/reporting/html.py +578 -0
- oscura/reporting/index.py +590 -0
- oscura/reporting/multichannel.py +296 -0
- oscura/reporting/output.py +379 -0
- oscura/reporting/pdf.py +373 -0
- oscura/reporting/plots.py +731 -0
- oscura/reporting/pptx_export.py +360 -0
- oscura/reporting/renderers/__init__.py +11 -0
- oscura/reporting/renderers/pdf.py +94 -0
- oscura/reporting/sections.py +471 -0
- oscura/reporting/standards.py +680 -0
- oscura/reporting/summary_generator.py +368 -0
- oscura/reporting/tables.py +397 -0
- oscura/reporting/template_system.py +724 -0
- oscura/reporting/templates/__init__.py +15 -0
- oscura/reporting/templates/definition.py +205 -0
- oscura/reporting/templates/index.html +649 -0
- oscura/reporting/templates/index.md +173 -0
- oscura/schemas/__init__.py +158 -0
- oscura/schemas/bus_configuration.json +322 -0
- oscura/schemas/device_mapping.json +182 -0
- oscura/schemas/packet_format.json +418 -0
- oscura/schemas/protocol_definition.json +363 -0
- oscura/search/__init__.py +16 -0
- oscura/search/anomaly.py +292 -0
- oscura/search/context.py +149 -0
- oscura/search/pattern.py +160 -0
- oscura/session/__init__.py +34 -0
- oscura/session/annotations.py +289 -0
- oscura/session/history.py +313 -0
- oscura/session/session.py +445 -0
- oscura/streaming/__init__.py +43 -0
- oscura/streaming/chunked.py +611 -0
- oscura/streaming/progressive.py +393 -0
- oscura/streaming/realtime.py +622 -0
- oscura/testing/__init__.py +54 -0
- oscura/testing/synthetic.py +808 -0
- oscura/triggering/__init__.py +68 -0
- oscura/triggering/base.py +229 -0
- oscura/triggering/edge.py +353 -0
- oscura/triggering/pattern.py +344 -0
- oscura/triggering/pulse.py +581 -0
- oscura/triggering/window.py +453 -0
- oscura/ui/__init__.py +48 -0
- oscura/ui/formatters.py +526 -0
- oscura/ui/progressive_display.py +340 -0
- oscura/utils/__init__.py +99 -0
- oscura/utils/autodetect.py +338 -0
- oscura/utils/buffer.py +389 -0
- oscura/utils/lazy.py +407 -0
- oscura/utils/lazy_imports.py +147 -0
- oscura/utils/memory.py +836 -0
- oscura/utils/memory_advanced.py +1326 -0
- oscura/utils/memory_extensions.py +465 -0
- oscura/utils/progressive.py +352 -0
- oscura/utils/windowing.py +362 -0
- oscura/visualization/__init__.py +321 -0
- oscura/visualization/accessibility.py +526 -0
- oscura/visualization/annotations.py +374 -0
- oscura/visualization/axis_scaling.py +305 -0
- oscura/visualization/colors.py +453 -0
- oscura/visualization/digital.py +337 -0
- oscura/visualization/eye.py +420 -0
- oscura/visualization/histogram.py +281 -0
- oscura/visualization/interactive.py +858 -0
- oscura/visualization/jitter.py +702 -0
- oscura/visualization/keyboard.py +394 -0
- oscura/visualization/layout.py +365 -0
- oscura/visualization/optimization.py +1028 -0
- oscura/visualization/palettes.py +446 -0
- oscura/visualization/plot.py +92 -0
- oscura/visualization/power.py +290 -0
- oscura/visualization/power_extended.py +626 -0
- oscura/visualization/presets.py +467 -0
- oscura/visualization/protocols.py +932 -0
- oscura/visualization/render.py +207 -0
- oscura/visualization/rendering.py +444 -0
- oscura/visualization/reverse_engineering.py +791 -0
- oscura/visualization/signal_integrity.py +808 -0
- oscura/visualization/specialized.py +553 -0
- oscura/visualization/spectral.py +811 -0
- oscura/visualization/styles.py +381 -0
- oscura/visualization/thumbnails.py +311 -0
- oscura/visualization/time_axis.py +351 -0
- oscura/visualization/waveform.py +367 -0
- oscura/workflow/__init__.py +13 -0
- oscura/workflow/dag.py +377 -0
- oscura/workflows/__init__.py +58 -0
- oscura/workflows/compliance.py +280 -0
- oscura/workflows/digital.py +272 -0
- oscura/workflows/multi_trace.py +502 -0
- oscura/workflows/power.py +178 -0
- oscura/workflows/protocol.py +492 -0
- oscura/workflows/reverse_engineering.py +639 -0
- oscura/workflows/signal_integrity.py +227 -0
- oscura-0.1.1.dist-info/METADATA +300 -0
- oscura-0.1.1.dist-info/RECORD +463 -0
- oscura-0.1.1.dist-info/entry_points.txt +2 -0
- {oscura-0.0.1.dist-info → oscura-0.1.1.dist-info}/licenses/LICENSE +1 -1
- oscura-0.0.1.dist-info/METADATA +0 -63
- oscura-0.0.1.dist-info/RECORD +0 -5
- {oscura-0.0.1.dist-info → oscura-0.1.1.dist-info}/WHEEL +0 -0
oscura/core/debug.py
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"""Debug mode and verbosity control infrastructure.
|
|
2
|
+
|
|
3
|
+
This module provides programmatic debug mode control with multiple
|
|
4
|
+
verbosity levels for troubleshooting and diagnostics.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
>>> from oscura.core.debug import enable_debug, is_debug_enabled, debug_context
|
|
9
|
+
>>> enable_debug(level='verbose')
|
|
10
|
+
>>> if is_debug_enabled():
|
|
11
|
+
... logger.debug("Extra diagnostic information")
|
|
12
|
+
>>> with debug_context(level='trace'):
|
|
13
|
+
... # Temporarily increase verbosity
|
|
14
|
+
... analyze_complex_signal()
|
|
15
|
+
|
|
16
|
+
References:
|
|
17
|
+
- Debugging and diagnostic best practices
|
|
18
|
+
- Python logging levels integration
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import contextvars
|
|
24
|
+
import logging
|
|
25
|
+
import os
|
|
26
|
+
from enum import IntEnum
|
|
27
|
+
from typing import Any, Literal
|
|
28
|
+
|
|
29
|
+
# Context variable for debug state
|
|
30
|
+
_debug_level: contextvars.ContextVar[int] = contextvars.ContextVar("debug_level", default=0)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class DebugLevel(IntEnum):
|
|
34
|
+
"""Debug verbosity levels.
|
|
35
|
+
|
|
36
|
+
Levels:
|
|
37
|
+
DISABLED: No debug output (0)
|
|
38
|
+
MINIMAL: Basic debug info (1)
|
|
39
|
+
NORMAL: Standard debug info (2)
|
|
40
|
+
VERBOSE: Detailed debug info (3)
|
|
41
|
+
TRACE: Very detailed trace info (4)
|
|
42
|
+
|
|
43
|
+
References:
|
|
44
|
+
LOG-007: Programmatic Debug Mode
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
DISABLED = 0
|
|
48
|
+
MINIMAL = 1
|
|
49
|
+
NORMAL = 2
|
|
50
|
+
VERBOSE = 3
|
|
51
|
+
TRACE = 4
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# String to enum mapping
|
|
55
|
+
_LEVEL_MAP: dict[str, DebugLevel] = {
|
|
56
|
+
"disabled": DebugLevel.DISABLED,
|
|
57
|
+
"minimal": DebugLevel.MINIMAL,
|
|
58
|
+
"normal": DebugLevel.NORMAL,
|
|
59
|
+
"verbose": DebugLevel.VERBOSE,
|
|
60
|
+
"trace": DebugLevel.TRACE,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def enable_debug(
|
|
65
|
+
level: Literal["minimal", "normal", "verbose", "trace"] = "normal",
|
|
66
|
+
) -> None:
|
|
67
|
+
"""Enable debug mode with specified verbosity level.
|
|
68
|
+
|
|
69
|
+
Sets the global debug level and adjusts logging configuration
|
|
70
|
+
accordingly. Higher levels include all output from lower levels.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
level: Debug verbosity level.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
>>> enable_debug(level='verbose')
|
|
77
|
+
>>> # Now all debug logging at verbose level is active
|
|
78
|
+
|
|
79
|
+
>>> enable_debug(level='trace')
|
|
80
|
+
>>> # Extremely detailed trace logging
|
|
81
|
+
|
|
82
|
+
References:
|
|
83
|
+
LOG-007: Programmatic Debug Mode
|
|
84
|
+
"""
|
|
85
|
+
debug_level = _LEVEL_MAP[level]
|
|
86
|
+
_debug_level.set(debug_level)
|
|
87
|
+
|
|
88
|
+
# Adjust logging level based on debug level
|
|
89
|
+
from oscura.core.logging import set_log_level
|
|
90
|
+
|
|
91
|
+
if debug_level == DebugLevel.TRACE:
|
|
92
|
+
set_log_level("DEBUG") # Most verbose
|
|
93
|
+
elif debug_level >= DebugLevel.NORMAL:
|
|
94
|
+
set_log_level("DEBUG")
|
|
95
|
+
elif debug_level == DebugLevel.MINIMAL:
|
|
96
|
+
set_log_level("INFO")
|
|
97
|
+
else:
|
|
98
|
+
set_log_level("WARNING")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def disable_debug() -> None:
|
|
102
|
+
"""Disable debug mode.
|
|
103
|
+
|
|
104
|
+
Resets debug level to DISABLED and sets logging to WARNING.
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
>>> disable_debug()
|
|
108
|
+
>>> # Debug output is now suppressed
|
|
109
|
+
|
|
110
|
+
References:
|
|
111
|
+
LOG-007: Programmatic Debug Mode
|
|
112
|
+
"""
|
|
113
|
+
_debug_level.set(DebugLevel.DISABLED)
|
|
114
|
+
|
|
115
|
+
from oscura.core.logging import set_log_level
|
|
116
|
+
|
|
117
|
+
set_log_level("WARNING")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def is_debug_enabled(min_level: DebugLevel = DebugLevel.MINIMAL) -> bool:
|
|
121
|
+
"""Check if debug mode is enabled at or above the specified level.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
min_level: Minimum debug level to check for.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
True if debug is enabled at or above min_level.
|
|
128
|
+
|
|
129
|
+
Example:
|
|
130
|
+
>>> enable_debug(level='verbose')
|
|
131
|
+
>>> is_debug_enabled()
|
|
132
|
+
True
|
|
133
|
+
>>> is_debug_enabled(DebugLevel.TRACE)
|
|
134
|
+
False
|
|
135
|
+
|
|
136
|
+
References:
|
|
137
|
+
LOG-007: Programmatic Debug Mode
|
|
138
|
+
"""
|
|
139
|
+
current = _debug_level.get()
|
|
140
|
+
return current >= min_level
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def get_debug_level() -> DebugLevel:
|
|
144
|
+
"""Get the current debug level.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
Current debug level enum value.
|
|
148
|
+
|
|
149
|
+
Example:
|
|
150
|
+
>>> level = get_debug_level()
|
|
151
|
+
>>> if level >= DebugLevel.VERBOSE:
|
|
152
|
+
... print("Verbose debugging enabled")
|
|
153
|
+
|
|
154
|
+
References:
|
|
155
|
+
LOG-007: Programmatic Debug Mode
|
|
156
|
+
"""
|
|
157
|
+
return DebugLevel(_debug_level.get())
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class debug_context:
|
|
161
|
+
"""Context manager for temporary debug level changes.
|
|
162
|
+
|
|
163
|
+
Temporarily sets a debug level for the duration of a code block,
|
|
164
|
+
then restores the previous level.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
level: Debug level to set within the context.
|
|
168
|
+
|
|
169
|
+
Example:
|
|
170
|
+
>>> # Normal debug level
|
|
171
|
+
>>> with debug_context(level='trace'):
|
|
172
|
+
... # Temporarily enable trace-level debugging
|
|
173
|
+
... analyze_signal(complex_data)
|
|
174
|
+
>>> # Back to normal debug level
|
|
175
|
+
|
|
176
|
+
References:
|
|
177
|
+
LOG-007: Programmatic Debug Mode
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
def __init__(
|
|
181
|
+
self,
|
|
182
|
+
level: Literal["disabled", "minimal", "normal", "verbose", "trace"],
|
|
183
|
+
):
|
|
184
|
+
"""Initialize debug context.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
level: Debug level to set within the context.
|
|
188
|
+
"""
|
|
189
|
+
self.level = _LEVEL_MAP[level]
|
|
190
|
+
self.token: contextvars.Token | None = None # type: ignore[type-arg]
|
|
191
|
+
self.previous_log_level: str | None = None
|
|
192
|
+
|
|
193
|
+
def __enter__(self) -> debug_context:
|
|
194
|
+
"""Enter the debug context and set new level."""
|
|
195
|
+
# Save current debug level
|
|
196
|
+
self.token = _debug_level.set(self.level)
|
|
197
|
+
|
|
198
|
+
# Adjust logging
|
|
199
|
+
from oscura.core.logging import get_logger
|
|
200
|
+
|
|
201
|
+
root_logger = get_logger("oscura")
|
|
202
|
+
self.previous_log_level = logging.getLevelName(root_logger.level)
|
|
203
|
+
|
|
204
|
+
# Set appropriate log level for debug level
|
|
205
|
+
from oscura.core.logging import set_log_level
|
|
206
|
+
|
|
207
|
+
if self.level in (DebugLevel.TRACE, DebugLevel.VERBOSE, DebugLevel.NORMAL):
|
|
208
|
+
set_log_level("DEBUG")
|
|
209
|
+
elif self.level == DebugLevel.MINIMAL:
|
|
210
|
+
set_log_level("INFO")
|
|
211
|
+
else:
|
|
212
|
+
set_log_level("WARNING")
|
|
213
|
+
|
|
214
|
+
return self
|
|
215
|
+
|
|
216
|
+
def __exit__(self, *args: Any) -> None:
|
|
217
|
+
"""Exit the debug context and restore previous level."""
|
|
218
|
+
# Restore debug level
|
|
219
|
+
if self.token:
|
|
220
|
+
_debug_level.reset(self.token)
|
|
221
|
+
|
|
222
|
+
# Restore logging level
|
|
223
|
+
if self.previous_log_level:
|
|
224
|
+
from oscura.core.logging import set_log_level
|
|
225
|
+
|
|
226
|
+
set_log_level(self.previous_log_level)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def should_log_debug(min_level: DebugLevel = DebugLevel.NORMAL) -> bool:
|
|
230
|
+
"""Check if debug logging should occur at specified level.
|
|
231
|
+
|
|
232
|
+
Helper function for conditional debug logging.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
min_level: Minimum level required for logging.
|
|
236
|
+
|
|
237
|
+
Returns:
|
|
238
|
+
True if current debug level meets or exceeds min_level.
|
|
239
|
+
|
|
240
|
+
Example:
|
|
241
|
+
>>> if should_log_debug(DebugLevel.VERBOSE):
|
|
242
|
+
... logger.debug("Detailed diagnostic: %s", expensive_computation())
|
|
243
|
+
|
|
244
|
+
References:
|
|
245
|
+
LOG-007: Programmatic Debug Mode
|
|
246
|
+
"""
|
|
247
|
+
return is_debug_enabled(min_level)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def configure_debug_from_env() -> None:
|
|
251
|
+
"""Configure debug mode from environment variables.
|
|
252
|
+
|
|
253
|
+
Reads OSCURA_DEBUG environment variable and sets debug level
|
|
254
|
+
accordingly.
|
|
255
|
+
|
|
256
|
+
Environment Variables:
|
|
257
|
+
OSCURA_DEBUG: Debug level (minimal, normal, verbose, trace)
|
|
258
|
+
|
|
259
|
+
Example:
|
|
260
|
+
>>> import os
|
|
261
|
+
>>> os.environ['OSCURA_DEBUG'] = 'verbose'
|
|
262
|
+
>>> configure_debug_from_env()
|
|
263
|
+
|
|
264
|
+
References:
|
|
265
|
+
LOG-007: Programmatic Debug Mode
|
|
266
|
+
"""
|
|
267
|
+
debug_env = os.environ.get("OSCURA_DEBUG", "").lower()
|
|
268
|
+
if debug_env in _LEVEL_MAP:
|
|
269
|
+
enable_debug(level=debug_env) # type: ignore[arg-type]
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def debug_log(
|
|
273
|
+
logger: logging.Logger,
|
|
274
|
+
message: str,
|
|
275
|
+
min_level: DebugLevel = DebugLevel.NORMAL,
|
|
276
|
+
**kwargs: Any,
|
|
277
|
+
) -> None:
|
|
278
|
+
"""Conditionally log debug message based on debug level.
|
|
279
|
+
|
|
280
|
+
Only logs if current debug level meets or exceeds min_level.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
logger: Logger to use for output.
|
|
284
|
+
message: Message to log.
|
|
285
|
+
min_level: Minimum debug level required.
|
|
286
|
+
**kwargs: Additional keyword arguments for logger.
|
|
287
|
+
|
|
288
|
+
Example:
|
|
289
|
+
>>> from oscura.core.logging import get_logger
|
|
290
|
+
>>> logger = get_logger(__name__)
|
|
291
|
+
>>> debug_log(logger, "Processing FFT", DebugLevel.VERBOSE, samples=1000)
|
|
292
|
+
|
|
293
|
+
References:
|
|
294
|
+
LOG-007: Programmatic Debug Mode
|
|
295
|
+
"""
|
|
296
|
+
if is_debug_enabled(min_level):
|
|
297
|
+
logger.debug(message, **kwargs)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
# Auto-configure from environment on import
|
|
301
|
+
configure_debug_from_env()
|