oscura 0.0.1__py3-none-any.whl → 0.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.
- 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.0.dist-info/METADATA +300 -0
- oscura-0.1.0.dist-info/RECORD +463 -0
- oscura-0.1.0.dist-info/entry_points.txt +2 -0
- {oscura-0.0.1.dist-info → oscura-0.1.0.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.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""TraceKit plugin system.
|
|
2
|
+
|
|
3
|
+
This package provides plugin discovery, registration, and management
|
|
4
|
+
for extending TraceKit functionality.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
>>> from oscura.plugins import discover_plugins, get_plugin
|
|
9
|
+
>>> plugins = discover_plugins()
|
|
10
|
+
>>> for plugin in plugins:
|
|
11
|
+
... print(f"{plugin.name} v{plugin.version}")
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from oscura.plugins.base import (
|
|
15
|
+
PluginBase,
|
|
16
|
+
PluginCapability,
|
|
17
|
+
PluginMetadata,
|
|
18
|
+
)
|
|
19
|
+
from oscura.plugins.cli import (
|
|
20
|
+
PluginInstaller,
|
|
21
|
+
cli_disable_plugin,
|
|
22
|
+
cli_enable_plugin,
|
|
23
|
+
cli_install_plugin,
|
|
24
|
+
cli_list_plugins,
|
|
25
|
+
cli_plugin_info,
|
|
26
|
+
cli_validate_plugin,
|
|
27
|
+
)
|
|
28
|
+
from oscura.plugins.discovery import (
|
|
29
|
+
discover_plugins,
|
|
30
|
+
get_plugin_paths,
|
|
31
|
+
scan_directory,
|
|
32
|
+
)
|
|
33
|
+
from oscura.plugins.isolation import (
|
|
34
|
+
IsolationManager,
|
|
35
|
+
Permission,
|
|
36
|
+
PermissionSet,
|
|
37
|
+
PluginSandbox,
|
|
38
|
+
ResourceLimits,
|
|
39
|
+
get_isolation_manager,
|
|
40
|
+
)
|
|
41
|
+
from oscura.plugins.lifecycle import (
|
|
42
|
+
DependencyGraph,
|
|
43
|
+
DependencyInfo,
|
|
44
|
+
PluginHandle,
|
|
45
|
+
PluginLifecycleManager,
|
|
46
|
+
PluginLoadError,
|
|
47
|
+
PluginState,
|
|
48
|
+
get_lifecycle_manager,
|
|
49
|
+
set_plugin_directories,
|
|
50
|
+
)
|
|
51
|
+
from oscura.plugins.manager import (
|
|
52
|
+
PluginManager,
|
|
53
|
+
get_plugin_manager,
|
|
54
|
+
reset_plugin_manager,
|
|
55
|
+
)
|
|
56
|
+
from oscura.plugins.registry import (
|
|
57
|
+
PluginRegistry,
|
|
58
|
+
get_plugin,
|
|
59
|
+
get_plugin_registry,
|
|
60
|
+
is_compatible,
|
|
61
|
+
list_plugins,
|
|
62
|
+
register_plugin,
|
|
63
|
+
)
|
|
64
|
+
from oscura.plugins.versioning import (
|
|
65
|
+
Migration,
|
|
66
|
+
MigrationManager,
|
|
67
|
+
VersionCompatibilityLayer,
|
|
68
|
+
VersionRange,
|
|
69
|
+
get_migration_manager,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
__all__ = [
|
|
73
|
+
# Base
|
|
74
|
+
"DependencyGraph",
|
|
75
|
+
"DependencyInfo",
|
|
76
|
+
# CLI (PLUG-007)
|
|
77
|
+
"IsolationManager",
|
|
78
|
+
# Isolation (PLUG-004)
|
|
79
|
+
"Migration",
|
|
80
|
+
"MigrationManager",
|
|
81
|
+
"Permission",
|
|
82
|
+
"PermissionSet",
|
|
83
|
+
"PluginBase",
|
|
84
|
+
"PluginCapability",
|
|
85
|
+
# Lifecycle
|
|
86
|
+
"PluginHandle",
|
|
87
|
+
"PluginInstaller",
|
|
88
|
+
"PluginLifecycleManager",
|
|
89
|
+
"PluginLoadError",
|
|
90
|
+
# Manager
|
|
91
|
+
"PluginManager",
|
|
92
|
+
"PluginMetadata",
|
|
93
|
+
# Registry
|
|
94
|
+
"PluginRegistry",
|
|
95
|
+
"PluginSandbox",
|
|
96
|
+
"PluginState",
|
|
97
|
+
"ResourceLimits",
|
|
98
|
+
# Versioning (PLUG-003)
|
|
99
|
+
"VersionCompatibilityLayer",
|
|
100
|
+
"VersionRange",
|
|
101
|
+
"cli_disable_plugin",
|
|
102
|
+
"cli_enable_plugin",
|
|
103
|
+
"cli_install_plugin",
|
|
104
|
+
"cli_list_plugins",
|
|
105
|
+
"cli_plugin_info",
|
|
106
|
+
"cli_validate_plugin",
|
|
107
|
+
# Discovery
|
|
108
|
+
"discover_plugins",
|
|
109
|
+
"get_isolation_manager",
|
|
110
|
+
"get_lifecycle_manager",
|
|
111
|
+
"get_migration_manager",
|
|
112
|
+
"get_plugin",
|
|
113
|
+
"get_plugin_manager",
|
|
114
|
+
"get_plugin_paths",
|
|
115
|
+
"get_plugin_registry",
|
|
116
|
+
"is_compatible",
|
|
117
|
+
"list_plugins",
|
|
118
|
+
"register_plugin",
|
|
119
|
+
"reset_plugin_manager",
|
|
120
|
+
"scan_directory",
|
|
121
|
+
"set_plugin_directories",
|
|
122
|
+
]
|
oscura/plugins/base.py
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"""Plugin base classes and metadata.
|
|
2
|
+
|
|
3
|
+
This module defines the base class for TraceKit plugins and
|
|
4
|
+
the metadata structures for plugin registration.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
>>> class MyDecoder(PluginBase):
|
|
9
|
+
... name = "my_decoder"
|
|
10
|
+
... version = "1.0.0"
|
|
11
|
+
... api_version = "1.0.0"
|
|
12
|
+
...
|
|
13
|
+
... def on_load(self):
|
|
14
|
+
... self.register_protocol("my_protocol")
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from abc import ABC
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
|
+
from enum import Enum, auto
|
|
22
|
+
from typing import TYPE_CHECKING, Any
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from collections.abc import Callable
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class PluginCapability(Enum):
|
|
30
|
+
"""Plugin capability types."""
|
|
31
|
+
|
|
32
|
+
PROTOCOL_DECODER = auto()
|
|
33
|
+
"""Protocol decoder (UART, SPI, etc.)"""
|
|
34
|
+
FILE_LOADER = auto()
|
|
35
|
+
"""File format loader"""
|
|
36
|
+
FILE_EXPORTER = auto()
|
|
37
|
+
"""File format exporter"""
|
|
38
|
+
ANALYZER = auto()
|
|
39
|
+
"""Signal analyzer"""
|
|
40
|
+
ALGORITHM = auto()
|
|
41
|
+
"""Analysis algorithm"""
|
|
42
|
+
VISUALIZATION = auto()
|
|
43
|
+
"""Visualization component"""
|
|
44
|
+
WORKFLOW = auto()
|
|
45
|
+
"""High-level workflow"""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass
|
|
49
|
+
class PluginMetadata:
|
|
50
|
+
"""Plugin metadata and configuration.
|
|
51
|
+
|
|
52
|
+
Attributes:
|
|
53
|
+
name: Unique plugin identifier.
|
|
54
|
+
version: Plugin version (semver).
|
|
55
|
+
api_version: Required TraceKit API version.
|
|
56
|
+
author: Plugin author.
|
|
57
|
+
description: Human-readable description.
|
|
58
|
+
homepage: Plugin homepage URL.
|
|
59
|
+
license: License identifier (SPDX).
|
|
60
|
+
capabilities: List of plugin capabilities.
|
|
61
|
+
dependencies: Required plugins and packages.
|
|
62
|
+
provides: What the plugin provides (protocols, algorithms, etc.).
|
|
63
|
+
path: Path to plugin (set during discovery).
|
|
64
|
+
enabled: Whether plugin is enabled.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
name: str
|
|
68
|
+
version: str
|
|
69
|
+
api_version: str = "1.0.0"
|
|
70
|
+
author: str = ""
|
|
71
|
+
description: str = ""
|
|
72
|
+
homepage: str = ""
|
|
73
|
+
license: str = ""
|
|
74
|
+
capabilities: list[PluginCapability] = field(default_factory=list)
|
|
75
|
+
dependencies: dict[str, str] = field(default_factory=dict)
|
|
76
|
+
provides: dict[str, list[str]] = field(default_factory=dict)
|
|
77
|
+
path: Path | None = None
|
|
78
|
+
enabled: bool = True
|
|
79
|
+
|
|
80
|
+
def __post_init__(self) -> None:
|
|
81
|
+
"""Validate metadata after initialization."""
|
|
82
|
+
if not self.name:
|
|
83
|
+
raise ValueError("Plugin name cannot be empty")
|
|
84
|
+
if not self.version:
|
|
85
|
+
raise ValueError("Plugin version cannot be empty")
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def qualified_name(self) -> str:
|
|
89
|
+
"""Get fully qualified plugin name with version.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
Name in format "name@version".
|
|
93
|
+
"""
|
|
94
|
+
return f"{self.name}@{self.version}"
|
|
95
|
+
|
|
96
|
+
def is_compatible_with(self, api_version: str) -> bool:
|
|
97
|
+
"""Check if plugin is compatible with given API version.
|
|
98
|
+
|
|
99
|
+
Uses semver compatibility rules (major version must match).
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
api_version: TraceKit API version to check against.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
True if compatible.
|
|
106
|
+
"""
|
|
107
|
+
try:
|
|
108
|
+
plugin_major = int(self.api_version.split(".")[0])
|
|
109
|
+
target_major = int(api_version.split(".")[0])
|
|
110
|
+
return plugin_major == target_major
|
|
111
|
+
except (ValueError, IndexError):
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class PluginBase(ABC): # noqa: B024
|
|
116
|
+
"""Base class for all TraceKit plugins.
|
|
117
|
+
|
|
118
|
+
Subclass this to create a plugin. Define class attributes for
|
|
119
|
+
metadata and implement lifecycle methods.
|
|
120
|
+
|
|
121
|
+
Example:
|
|
122
|
+
>>> class UartDecoder(PluginBase):
|
|
123
|
+
... name = "uart_decoder"
|
|
124
|
+
... version = "1.0.0"
|
|
125
|
+
... api_version = "1.0.0"
|
|
126
|
+
... author = "TraceKit Contributors"
|
|
127
|
+
... description = "UART protocol decoder"
|
|
128
|
+
...
|
|
129
|
+
... def on_load(self):
|
|
130
|
+
... self.register_protocol("uart")
|
|
131
|
+
...
|
|
132
|
+
... def on_configure(self, config):
|
|
133
|
+
... self.baud_rate = config.get("baud_rate", 115200)
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
# Required class attributes (override in subclass)
|
|
137
|
+
name: str = ""
|
|
138
|
+
version: str = ""
|
|
139
|
+
api_version: str = "1.0.0"
|
|
140
|
+
|
|
141
|
+
# Optional class attributes
|
|
142
|
+
author: str = ""
|
|
143
|
+
description: str = ""
|
|
144
|
+
homepage: str = ""
|
|
145
|
+
license: str = ""
|
|
146
|
+
capabilities: list[PluginCapability] = [] # noqa: RUF012
|
|
147
|
+
requires_plugins: list[tuple[str, str]] = [] # (name, version_spec) # noqa: RUF012
|
|
148
|
+
|
|
149
|
+
def __init__(self) -> None:
|
|
150
|
+
"""Initialize plugin instance."""
|
|
151
|
+
self._metadata: PluginMetadata | None = None
|
|
152
|
+
self._registered_protocols: list[str] = []
|
|
153
|
+
self._registered_algorithms: list[tuple[str, str, Callable]] = [] # type: ignore[type-arg]
|
|
154
|
+
self._config: dict[str, Any] = {}
|
|
155
|
+
|
|
156
|
+
@property
|
|
157
|
+
def metadata(self) -> PluginMetadata:
|
|
158
|
+
"""Get plugin metadata.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
PluginMetadata instance.
|
|
162
|
+
"""
|
|
163
|
+
if self._metadata is None:
|
|
164
|
+
self._metadata = PluginMetadata(
|
|
165
|
+
name=self.name,
|
|
166
|
+
version=self.version,
|
|
167
|
+
api_version=self.api_version,
|
|
168
|
+
author=self.author,
|
|
169
|
+
description=self.description,
|
|
170
|
+
homepage=self.homepage,
|
|
171
|
+
license=self.license,
|
|
172
|
+
capabilities=list(self.capabilities),
|
|
173
|
+
dependencies=dict(self.requires_plugins),
|
|
174
|
+
)
|
|
175
|
+
return self._metadata
|
|
176
|
+
|
|
177
|
+
def on_load(self) -> None: # noqa: B027
|
|
178
|
+
"""Called when plugin is loaded.
|
|
179
|
+
|
|
180
|
+
Override to register capabilities, initialize resources, etc.
|
|
181
|
+
|
|
182
|
+
References:
|
|
183
|
+
PLUG-002: Plugin Registration - lifecycle hooks
|
|
184
|
+
"""
|
|
185
|
+
|
|
186
|
+
def on_configure(self, config: dict[str, Any]) -> None:
|
|
187
|
+
"""Called when plugin is configured.
|
|
188
|
+
|
|
189
|
+
Override to handle configuration changes.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
config: Plugin configuration dictionary.
|
|
193
|
+
|
|
194
|
+
References:
|
|
195
|
+
PLUG-002: Plugin Registration - lifecycle hooks
|
|
196
|
+
"""
|
|
197
|
+
self._config = config
|
|
198
|
+
|
|
199
|
+
def on_enable(self) -> None: # noqa: B027
|
|
200
|
+
"""Called when plugin is enabled.
|
|
201
|
+
|
|
202
|
+
Override to activate plugin functionality, start services, etc.
|
|
203
|
+
|
|
204
|
+
References:
|
|
205
|
+
PLUG-002: Plugin Registration - lifecycle hooks
|
|
206
|
+
"""
|
|
207
|
+
|
|
208
|
+
def on_disable(self) -> None: # noqa: B027
|
|
209
|
+
"""Called when plugin is disabled.
|
|
210
|
+
|
|
211
|
+
Override to pause plugin functionality, stop services, etc.
|
|
212
|
+
|
|
213
|
+
References:
|
|
214
|
+
PLUG-002: Plugin Registration - lifecycle hooks
|
|
215
|
+
"""
|
|
216
|
+
|
|
217
|
+
def on_unload(self) -> None: # noqa: B027
|
|
218
|
+
"""Called when plugin is unloaded.
|
|
219
|
+
|
|
220
|
+
Override to clean up resources.
|
|
221
|
+
|
|
222
|
+
References:
|
|
223
|
+
PLUG-002: Plugin Registration - lifecycle hooks
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
def register_protocol(self, protocol_name: str) -> None:
|
|
227
|
+
"""Register a protocol decoder capability.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
protocol_name: Protocol identifier (e.g., "uart").
|
|
231
|
+
"""
|
|
232
|
+
self._registered_protocols.append(protocol_name)
|
|
233
|
+
if "protocols" not in self.metadata.provides:
|
|
234
|
+
self.metadata.provides["protocols"] = []
|
|
235
|
+
self.metadata.provides["protocols"].append(protocol_name)
|
|
236
|
+
|
|
237
|
+
def register_algorithm(
|
|
238
|
+
self,
|
|
239
|
+
category: str,
|
|
240
|
+
name: str,
|
|
241
|
+
func: Callable, # type: ignore[type-arg]
|
|
242
|
+
) -> None:
|
|
243
|
+
"""Register an algorithm implementation.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
category: Algorithm category (e.g., "edge_detection").
|
|
247
|
+
name: Algorithm name.
|
|
248
|
+
func: Algorithm function.
|
|
249
|
+
"""
|
|
250
|
+
self._registered_algorithms.append((category, name, func))
|
|
251
|
+
if "algorithms" not in self.metadata.provides:
|
|
252
|
+
self.metadata.provides["algorithms"] = []
|
|
253
|
+
self.metadata.provides["algorithms"].append(f"{category}:{name}")
|
|
254
|
+
|
|
255
|
+
def get_config(self, key: str, default: Any = None) -> Any:
|
|
256
|
+
"""Get configuration value.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
key: Configuration key.
|
|
260
|
+
default: Default value if key not found.
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
Configuration value.
|
|
264
|
+
"""
|
|
265
|
+
return self._config.get(key, default)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
__all__ = [
|
|
269
|
+
"PluginBase",
|
|
270
|
+
"PluginCapability",
|
|
271
|
+
"PluginMetadata",
|
|
272
|
+
]
|