chronaxis 0.1.0.dev0__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.
- chronaxis/__init__.py +72 -0
- chronaxis/__main__.py +12 -0
- chronaxis/analysis_cli.py +181 -0
- chronaxis/batch/__init__.py +14 -0
- chronaxis/batch/api.py +46 -0
- chronaxis/batch/cli.py +48 -0
- chronaxis/batch/config.py +37 -0
- chronaxis/batch/models.py +202 -0
- chronaxis/batch/process_transport.py +149 -0
- chronaxis/batch/process_tree.py +72 -0
- chronaxis/batch/publication.py +41 -0
- chronaxis/batch/runner.py +236 -0
- chronaxis/batch/templates.py +42 -0
- chronaxis/can_dependencies.py +42 -0
- chronaxis/cli.py +193 -0
- chronaxis/configuration/__init__.py +46 -0
- chronaxis/configuration/cli.py +41 -0
- chronaxis/configuration/diagnostics.py +107 -0
- chronaxis/configuration/explanation.py +233 -0
- chronaxis/configuration/file_tools.py +140 -0
- chronaxis/configuration/imports.py +144 -0
- chronaxis/configuration/initialization.py +36 -0
- chronaxis/configuration/json_parser.py +114 -0
- chronaxis/configuration/models.py +74 -0
- chronaxis/configuration/origins.py +90 -0
- chronaxis/configuration/overrides.py +55 -0
- chronaxis/configuration/resolution.py +150 -0
- chronaxis/configuration/template_catalog.py +68 -0
- chronaxis/configuration/templates/batch/analysis-annotated.yaml +18 -0
- chronaxis/configuration/templates/batch/analysis-minimal.yaml +18 -0
- chronaxis/configuration/templates/batch/annotated.yaml +6 -0
- chronaxis/configuration/templates/batch/minimal.yaml +6 -0
- chronaxis/configuration/templates/can-asc/annotated.yaml +18 -0
- chronaxis/configuration/templates/can-asc/minimal.yaml +18 -0
- chronaxis/configuration/templates/can-blf/annotated.yaml +18 -0
- chronaxis/configuration/templates/can-blf/minimal.yaml +18 -0
- chronaxis/configuration/templates/can-export/annotated.yaml +23 -0
- chronaxis/configuration/templates/can-export/minimal.yaml +23 -0
- chronaxis/configuration/templates/catalog.json +233 -0
- chronaxis/configuration/templates/charge-session/annotated.yaml +38 -0
- chronaxis/configuration/templates/charge-session/minimal.yaml +38 -0
- chronaxis/configuration/templates/command-response/annotated.yaml +32 -0
- chronaxis/configuration/templates/command-response/minimal.yaml +36 -0
- chronaxis/configuration/templates/fault-window/annotated.yaml +25 -0
- chronaxis/configuration/templates/fault-window/minimal.yaml +27 -0
- chronaxis/configuration/templates/ini-mapping/annotated.yaml +20 -0
- chronaxis/configuration/templates/ini-mapping/minimal.yaml +20 -0
- chronaxis/configuration/templates/raw-can-csv/annotated.yaml +34 -0
- chronaxis/configuration/templates/raw-can-csv/minimal.yaml +35 -0
- chronaxis/configuration/templates/shared/charge-session.asc +5 -0
- chronaxis/configuration/templates/shared/command-response.asc +8 -0
- chronaxis/configuration/templates/shared/fault-window.asc +5 -0
- chronaxis/configuration/templates/shared/power.asc +7 -0
- chronaxis/configuration/templates/shared/sample.asc +6 -0
- chronaxis/configuration/templates/shared/sample.blf +0 -0
- chronaxis/configuration/templates/shared/sample.csv +5 -0
- chronaxis/configuration/templates/shared/sample.dbc +11 -0
- chronaxis/configuration/templates/shared/signals.csv +6 -0
- chronaxis/configuration/templates/shared/source.ini +5 -0
- chronaxis/configuration/templates/shared/stability.asc +9 -0
- chronaxis/configuration/templates/shared/teaching.dbc +27 -0
- chronaxis/configuration/templates/shared/threshold.asc +7 -0
- chronaxis/configuration/templates/signal-csv/annotated.yaml +27 -0
- chronaxis/configuration/templates/signal-csv/minimal.yaml +27 -0
- chronaxis/configuration/templates/signal-export/annotated.yaml +27 -0
- chronaxis/configuration/templates/signal-export/minimal.yaml +29 -0
- chronaxis/configuration/templates/stability/annotated.yaml +35 -0
- chronaxis/configuration/templates/stability/minimal.yaml +35 -0
- chronaxis/configuration/templates/threshold/annotated.yaml +22 -0
- chronaxis/configuration/templates/threshold/minimal.yaml +22 -0
- chronaxis/configuration/yaml_parser.py +125 -0
- chronaxis/core/__init__.py +71 -0
- chronaxis/core/binding.py +449 -0
- chronaxis/core/calculation_series_join.py +106 -0
- chronaxis/core/calculations.py +435 -0
- chronaxis/core/calculations_memory_numpy.py +136 -0
- chronaxis/core/calculations_memory_reference.py +165 -0
- chronaxis/core/calculations_numpy.py +298 -0
- chronaxis/core/calculations_reference.py +294 -0
- chronaxis/core/condition_evidence.py +182 -0
- chronaxis/core/conditional_integral_result.py +43 -0
- chronaxis/core/conditional_integral_terms.py +146 -0
- chronaxis/core/conditional_integral_terms_numpy.py +148 -0
- chronaxis/core/conditional_integral_terms_reference.py +111 -0
- chronaxis/core/conditional_time_reduction.py +118 -0
- chronaxis/core/conditional_time_reduction_numpy.py +223 -0
- chronaxis/core/conditional_time_reduction_reference.py +213 -0
- chronaxis/core/declarations.py +192 -0
- chronaxis/core/decoded_binding.py +197 -0
- chronaxis/core/direct_message.py +387 -0
- chronaxis/core/export_interpolation.py +54 -0
- chronaxis/core/expression.py +642 -0
- chronaxis/core/expression_numpy.py +314 -0
- chronaxis/core/expression_reference.py +272 -0
- chronaxis/core/integral_result.py +53 -0
- chronaxis/core/integral_sum.py +77 -0
- chronaxis/core/integral_sum_numpy.py +224 -0
- chronaxis/core/integral_sum_reference.py +148 -0
- chronaxis/core/integral_terms.py +119 -0
- chronaxis/core/integral_terms_numpy.py +127 -0
- chronaxis/core/integral_terms_reference.py +91 -0
- chronaxis/core/mean_weights_numpy.py +29 -0
- chronaxis/core/mean_weights_reference.py +27 -0
- chronaxis/core/message_binding.py +305 -0
- chronaxis/core/models.py +485 -0
- chronaxis/core/normalize_numpy.py +396 -0
- chronaxis/core/numeric.py +472 -0
- chronaxis/core/numeric_numpy.py +440 -0
- chronaxis/core/record_intervals.py +115 -0
- chronaxis/core/sample_reduction.py +161 -0
- chronaxis/core/sample_reduction_numpy.py +160 -0
- chronaxis/core/sample_reduction_reference.py +154 -0
- chronaxis/core/selection.py +74 -0
- chronaxis/core/sequence.py +160 -0
- chronaxis/core/sequence_reference.py +248 -0
- chronaxis/core/stability.py +249 -0
- chronaxis/core/start_end.py +169 -0
- chronaxis/core/state.py +494 -0
- chronaxis/core/state_numpy.py +296 -0
- chronaxis/core/temporal.py +373 -0
- chronaxis/core/temporal_clock.py +25 -0
- chronaxis/core/temporal_memory_numpy.py +163 -0
- chronaxis/core/temporal_memory_reference.py +161 -0
- chronaxis/core/temporal_numpy.py +345 -0
- chronaxis/core/temporal_reference.py +304 -0
- chronaxis/core/time_reduction.py +190 -0
- chronaxis/core/time_reduction_numpy.py +205 -0
- chronaxis/core/time_reduction_reference.py +203 -0
- chronaxis/core/types.py +105 -0
- chronaxis/core/units.py +81 -0
- chronaxis/core/validation.py +94 -0
- chronaxis/core/window_delta.py +123 -0
- chronaxis/core/window_delta_numpy.py +78 -0
- chronaxis/core/window_delta_reference.py +69 -0
- chronaxis/core/windows.py +224 -0
- chronaxis/core/windows_numpy.py +78 -0
- chronaxis/core/windows_reference.py +61 -0
- chronaxis/execution/__init__.py +6 -0
- chronaxis/execution/batch_signal_groups.py +122 -0
- chronaxis/execution/bindings.py +296 -0
- chronaxis/execution/boundaries.py +568 -0
- chronaxis/execution/calculation_blocks.py +338 -0
- chronaxis/execution/calculation_values.py +55 -0
- chronaxis/execution/can_batch_reader.py +356 -0
- chronaxis/execution/can_reader.py +948 -0
- chronaxis/execution/can_reference_template.py +61 -0
- chronaxis/execution/condition_evidence.py +370 -0
- chronaxis/execution/conditional_integral_facts.py +310 -0
- chronaxis/execution/conditional_integral_reduction.py +216 -0
- chronaxis/execution/csv_observation.py +524 -0
- chronaxis/execution/csv_reader.py +662 -0
- chronaxis/execution/current_message_calculation.py +225 -0
- chronaxis/execution/driver_expression.py +274 -0
- chronaxis/execution/expressions.py +618 -0
- chronaxis/execution/frame_capture.py +245 -0
- chronaxis/execution/groups.py +236 -0
- chronaxis/execution/historical_conditional_blocks.py +264 -0
- chronaxis/execution/historical_conditional_integral.py +226 -0
- chronaxis/execution/historical_conditional_time_calculation.py +368 -0
- chronaxis/execution/historical_integral.py +219 -0
- chronaxis/execution/historical_observation.py +372 -0
- chronaxis/execution/historical_sample_calculation.py +338 -0
- chronaxis/execution/historical_selection_rows.py +300 -0
- chronaxis/execution/historical_time_calculation.py +341 -0
- chronaxis/execution/history.py +572 -0
- chronaxis/execution/history_records.py +225 -0
- chronaxis/execution/hold.py +448 -0
- chronaxis/execution/integral_facts.py +311 -0
- chronaxis/execution/integral_reduction.py +216 -0
- chronaxis/execution/legacy_frame_samples.py +94 -0
- chronaxis/execution/memory_reader.py +247 -0
- chronaxis/execution/message_bindings.py +293 -0
- chronaxis/execution/message_delivery.py +37 -0
- chronaxis/execution/observed_ingestion.py +551 -0
- chronaxis/execution/raw_signal_groups.py +192 -0
- chronaxis/execution/record_alarm_duration.py +114 -0
- chronaxis/execution/record_delta_condition.py +167 -0
- chronaxis/execution/record_diagnostics.py +87 -0
- chronaxis/execution/record_event_durations.py +143 -0
- chronaxis/execution/record_export_samples.py +94 -0
- chronaxis/execution/record_exports.py +155 -0
- chronaxis/execution/record_integral.py +196 -0
- chronaxis/execution/record_point_buffer.py +101 -0
- chronaxis/execution/record_rule_timeline.py +344 -0
- chronaxis/execution/record_sample.py +46 -0
- chronaxis/execution/record_sample_series.py +29 -0
- chronaxis/execution/record_scope_calculations.py +290 -0
- chronaxis/execution/record_selection.py +62 -0
- chronaxis/execution/record_sequences.py +199 -0
- chronaxis/execution/record_session_calculations.py +778 -0
- chronaxis/execution/record_signal_export.py +133 -0
- chronaxis/execution/record_source_cursor.py +295 -0
- chronaxis/execution/record_time_calculation.py +322 -0
- chronaxis/execution/record_time_indexes.py +143 -0
- chronaxis/execution/record_value_history.py +160 -0
- chronaxis/execution/record_windows.py +229 -0
- chronaxis/execution/required_expression.py +52 -0
- chronaxis/execution/retained_metadata.py +71 -0
- chronaxis/execution/run_session.py +402 -0
- chronaxis/execution/scanned_signal_proof.py +550 -0
- chronaxis/execution/signal_validity.py +40 -0
- chronaxis/execution/state.py +280 -0
- chronaxis/execution/temporal_buffer.py +508 -0
- chronaxis/execution/text_can_reader.py +359 -0
- chronaxis/execution/timeline.py +309 -0
- chronaxis/execution/timeline_multi.py +415 -0
- chronaxis/execution/window_delta_events.py +220 -0
- chronaxis/execution/window_replay.py +350 -0
- chronaxis/execution/windows.py +173 -0
- chronaxis/guide/README.md +70 -0
- chronaxis/guide/api/AnalysisError.md +14 -0
- chronaxis/guide/api/AnalysisPlan.md +96 -0
- chronaxis/guide/api/AnalysisResult.md +398 -0
- chronaxis/guide/api/AnalysisRunner.md +155 -0
- chronaxis/guide/api/BatchJob.md +19 -0
- chronaxis/guide/api/BatchJobResult.md +61 -0
- chronaxis/guide/api/BatchPlan.md +48 -0
- chronaxis/guide/api/BatchReport.md +108 -0
- chronaxis/guide/api/BatchRunner.md +84 -0
- chronaxis/guide/api/OutputManifest.md +23 -0
- chronaxis/guide/api/PlanFragment.md +47 -0
- chronaxis/guide/api/PlanValidationError.md +98 -0
- chronaxis/guide/api/PresetSpec.md +63 -0
- chronaxis/guide/api/ResultClosedError.md +14 -0
- chronaxis/guide/api/RunMetadata.md +100 -0
- chronaxis/guide/api/TimeConversion.md +29 -0
- chronaxis/guide/api/TimeOverflowError.md +17 -0
- chronaxis/guide/api/build_preset.md +36 -0
- chronaxis/guide/api/checked_add_ns.md +30 -0
- chronaxis/guide/api/convert_time.md +40 -0
- chronaxis/guide/api/explain_analysis_plan.md +38 -0
- chronaxis/guide/api/index.json +185 -0
- chronaxis/guide/api/load_analysis_plan.md +34 -0
- chronaxis/guide/api/load_batch_plan.md +36 -0
- chronaxis/guide/api/parse_datetime_ns.md +35 -0
- chronaxis/guide/api/parse_duration.md +30 -0
- chronaxis/guide/api/resolve_preset_roles.md +37 -0
- chronaxis/guide/api/run_batch.md +38 -0
- chronaxis/guide/api/shift_times_reference.md +33 -0
- chronaxis/guide/api/time_deltas_reference.md +37 -0
- chronaxis/guide/api/validate_analysis_plan.md +38 -0
- chronaxis/guide/en/README.md +74 -0
- chronaxis/guide/en/api/AnalysisError.md +14 -0
- chronaxis/guide/en/api/AnalysisPlan.md +93 -0
- chronaxis/guide/en/api/AnalysisResult.md +398 -0
- chronaxis/guide/en/api/AnalysisRunner.md +191 -0
- chronaxis/guide/en/api/BatchJob.md +17 -0
- chronaxis/guide/en/api/BatchJobResult.md +43 -0
- chronaxis/guide/en/api/BatchPlan.md +37 -0
- chronaxis/guide/en/api/BatchReport.md +52 -0
- chronaxis/guide/en/api/BatchRunner.md +51 -0
- chronaxis/guide/en/api/OutputManifest.md +23 -0
- chronaxis/guide/en/api/PlanFragment.md +33 -0
- chronaxis/guide/en/api/PlanValidationError.md +58 -0
- chronaxis/guide/en/api/PresetSpec.md +51 -0
- chronaxis/guide/en/api/ResultClosedError.md +14 -0
- chronaxis/guide/en/api/RunMetadata.md +100 -0
- chronaxis/guide/en/api/TimeConversion.md +23 -0
- chronaxis/guide/en/api/TimeOverflowError.md +14 -0
- chronaxis/guide/en/api/build_preset.md +23 -0
- chronaxis/guide/en/api/checked_add_ns.md +21 -0
- chronaxis/guide/en/api/convert_time.md +25 -0
- chronaxis/guide/en/api/explain_analysis_plan.md +30 -0
- chronaxis/guide/en/api/index.json +185 -0
- chronaxis/guide/en/api/load_analysis_plan.md +27 -0
- chronaxis/guide/en/api/load_batch_plan.md +28 -0
- chronaxis/guide/en/api/parse_datetime_ns.md +23 -0
- chronaxis/guide/en/api/parse_duration.md +20 -0
- chronaxis/guide/en/api/resolve_preset_roles.md +23 -0
- chronaxis/guide/en/api/run_batch.md +39 -0
- chronaxis/guide/en/api/shift_times_reference.md +21 -0
- chronaxis/guide/en/api/time_deltas_reference.md +22 -0
- chronaxis/guide/en/api/validate_analysis_plan.md +29 -0
- chronaxis/guide/en/fields/analysis/calculations-all-1.json +345 -0
- chronaxis/guide/en/fields/analysis/calculations-all-2.json +300 -0
- chronaxis/guide/en/fields/analysis/calculations-all-3.json +84 -0
- chronaxis/guide/en/fields/analysis/config_version-all-1.json +24 -0
- chronaxis/guide/en/fields/analysis/dataset-all-1.json +344 -0
- chronaxis/guide/en/fields/analysis/derived-all-1.json +147 -0
- chronaxis/guide/en/fields/analysis/diagnostics-all-1.json +69 -0
- chronaxis/guide/en/fields/analysis/execution-all-1.json +167 -0
- chronaxis/guide/en/fields/analysis/imports-all-1.json +39 -0
- chronaxis/guide/en/fields/analysis/intervals-all-1.json +173 -0
- chronaxis/guide/en/fields/analysis/message_calculations-all-1.json +345 -0
- chronaxis/guide/en/fields/analysis/message_calculations-all-2.json +270 -0
- chronaxis/guide/en/fields/analysis/metadata-all-1.json +24 -0
- chronaxis/guide/en/fields/analysis/outputs-all-1.json +332 -0
- chronaxis/guide/en/fields/analysis/outputs-all-2.json +319 -0
- chronaxis/guide/en/fields/analysis/outputs-all-3.json +321 -0
- chronaxis/guide/en/fields/analysis/outputs-all-4.json +236 -0
- chronaxis/guide/en/fields/analysis/outputs-all-5.json +246 -0
- chronaxis/guide/en/fields/analysis/outputs-all-6.json +214 -0
- chronaxis/guide/en/fields/analysis/overrides-all-1.json +104 -0
- chronaxis/guide/en/fields/analysis/presets-charge_session-1.json +398 -0
- chronaxis/guide/en/fields/analysis/presets-charge_session-2.json +114 -0
- chronaxis/guide/en/fields/analysis/presets-command_response-1.json +376 -0
- chronaxis/guide/en/fields/analysis/presets-fault_context-1.json +285 -0
- chronaxis/guide/en/fields/analysis/presets-threshold_excursion-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-condition_duration-1.json +344 -0
- chronaxis/guide/en/fields/analysis/rules-condition_duration-2.json +27 -0
- chronaxis/guide/en/fields/analysis/rules-debounce-1.json +335 -0
- chronaxis/guide/en/fields/analysis/rules-falling_edge-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-hysteresis-1.json +334 -0
- chronaxis/guide/en/fields/analysis/rules-hysteresis-2.json +27 -0
- chronaxis/guide/en/fields/analysis/rules-rising_edge-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-start_end-1.json +333 -0
- chronaxis/guide/en/fields/analysis/rules-start_end-2.json +60 -0
- chronaxis/guide/en/fields/analysis/rules-start_only-1.json +334 -0
- chronaxis/guide/en/fields/analysis/rules-window_delta-1.json +338 -0
- chronaxis/guide/en/fields/analysis/rules-window_delta-2.json +96 -0
- chronaxis/guide/en/fields/analysis/sequences-all-1.json +378 -0
- chronaxis/guide/en/fields/analysis/sequences-all-2.json +70 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-1.json +349 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-2.json +297 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-3.json +323 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-4.json +192 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-1.json +327 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-2.json +312 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-3.json +294 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-4.json +253 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-5.json +44 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-1.json +318 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-3.json +311 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-4.json +69 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-1.json +317 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-3.json +317 -0
- chronaxis/guide/en/fields/analysis/sources-memory-1.json +332 -0
- chronaxis/guide/en/fields/analysis/sources-memory-2.json +125 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-1.json +330 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-10.json +233 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-11.json +225 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-12.json +228 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-13.json +226 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-14.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-15.json +227 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-16.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-17.json +238 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-18.json +239 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-19.json +233 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-20.json +242 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-21.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-22.json +228 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-23.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-24.json +223 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-25.json +290 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-26.json +131 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-3.json +297 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-4.json +226 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-5.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-6.json +227 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-7.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-8.json +238 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-9.json +239 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-1.json +331 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-2.json +307 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-3.json +315 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-1.json +319 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-2.json +307 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-3.json +312 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-4.json +113 -0
- chronaxis/guide/en/fields/analysis/windows-all-1.json +361 -0
- chronaxis/guide/en/fields/analysis/windows-all-2.json +187 -0
- chronaxis/guide/en/fields/batch/backend-all-1.json +26 -0
- chronaxis/guide/en/fields/batch/batch_version-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/fail_fast-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/inputs-all-1.json +161 -0
- chronaxis/guide/en/fields/batch/jobs-all-1.json +58 -0
- chronaxis/guide/en/fields/batch/process_count-all-1.json +23 -0
- chronaxis/guide/en/fields/batch/source-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/template-all-1.json +22 -0
- chronaxis/guide/en/fields/definitions/derived-all-1.json +121 -0
- chronaxis/guide/en/fields/definitions/signals-all-1.json +336 -0
- chronaxis/guide/en/fields/definitions/signals-all-2.json +307 -0
- chronaxis/guide/en/fields/definitions/signals-all-3.json +290 -0
- chronaxis/guide/en/fields/definitions/signals-all-4.json +347 -0
- chronaxis/guide/en/fields/definitions/signals-all-5.json +297 -0
- chronaxis/guide/en/fields/definitions/signals-all-6.json +259 -0
- chronaxis/guide/en/fields/definitions/signals-all-7.json +117 -0
- chronaxis/guide/en/fields/definitions/sources-all-1.json +332 -0
- chronaxis/guide/en/fields/definitions/sources-all-10.json +306 -0
- chronaxis/guide/en/fields/definitions/sources-all-11.json +294 -0
- chronaxis/guide/en/fields/definitions/sources-all-12.json +212 -0
- chronaxis/guide/en/fields/definitions/sources-all-13.json +217 -0
- chronaxis/guide/en/fields/definitions/sources-all-14.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-15.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-16.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-17.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-18.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-19.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-2.json +323 -0
- chronaxis/guide/en/fields/definitions/sources-all-20.json +217 -0
- chronaxis/guide/en/fields/definitions/sources-all-21.json +210 -0
- chronaxis/guide/en/fields/definitions/sources-all-22.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-23.json +218 -0
- chronaxis/guide/en/fields/definitions/sources-all-24.json +209 -0
- chronaxis/guide/en/fields/definitions/sources-all-25.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-26.json +218 -0
- chronaxis/guide/en/fields/definitions/sources-all-27.json +224 -0
- chronaxis/guide/en/fields/definitions/sources-all-28.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-29.json +205 -0
- chronaxis/guide/en/fields/definitions/sources-all-3.json +303 -0
- chronaxis/guide/en/fields/definitions/sources-all-30.json +298 -0
- chronaxis/guide/en/fields/definitions/sources-all-31.json +315 -0
- chronaxis/guide/en/fields/definitions/sources-all-32.json +306 -0
- chronaxis/guide/en/fields/definitions/sources-all-33.json +209 -0
- chronaxis/guide/en/fields/definitions/sources-all-4.json +336 -0
- chronaxis/guide/en/fields/definitions/sources-all-5.json +299 -0
- chronaxis/guide/en/fields/definitions/sources-all-6.json +307 -0
- chronaxis/guide/en/fields/definitions/sources-all-7.json +320 -0
- chronaxis/guide/en/fields/definitions/sources-all-8.json +303 -0
- chronaxis/guide/en/fields/definitions/sources-all-9.json +315 -0
- chronaxis/guide/en/fields/index.json +3450 -0
- chronaxis/guide/en/fields/mapping/aliases-all-1.json +91 -0
- chronaxis/guide/en/fields/mapping/analysis-all-1.json +382 -0
- chronaxis/guide/en/fields/mapping/analysis-all-10.json +301 -0
- chronaxis/guide/en/fields/mapping/analysis-all-11.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-12.json +311 -0
- chronaxis/guide/en/fields/mapping/analysis-all-13.json +314 -0
- chronaxis/guide/en/fields/mapping/analysis-all-14.json +310 -0
- chronaxis/guide/en/fields/mapping/analysis-all-15.json +297 -0
- chronaxis/guide/en/fields/mapping/analysis-all-16.json +226 -0
- chronaxis/guide/en/fields/mapping/analysis-all-17.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-18.json +227 -0
- chronaxis/guide/en/fields/mapping/analysis-all-19.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-2.json +323 -0
- chronaxis/guide/en/fields/mapping/analysis-all-20.json +221 -0
- chronaxis/guide/en/fields/mapping/analysis-all-21.json +237 -0
- chronaxis/guide/en/fields/mapping/analysis-all-22.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-23.json +222 -0
- chronaxis/guide/en/fields/mapping/analysis-all-24.json +231 -0
- chronaxis/guide/en/fields/mapping/analysis-all-25.json +225 -0
- chronaxis/guide/en/fields/mapping/analysis-all-26.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-27.json +228 -0
- chronaxis/guide/en/fields/mapping/analysis-all-28.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-29.json +223 -0
- chronaxis/guide/en/fields/mapping/analysis-all-3.json +318 -0
- chronaxis/guide/en/fields/mapping/analysis-all-30.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-31.json +218 -0
- chronaxis/guide/en/fields/mapping/analysis-all-32.json +239 -0
- chronaxis/guide/en/fields/mapping/analysis-all-33.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-34.json +225 -0
- chronaxis/guide/en/fields/mapping/analysis-all-35.json +228 -0
- chronaxis/guide/en/fields/mapping/analysis-all-36.json +226 -0
- chronaxis/guide/en/fields/mapping/analysis-all-37.json +244 -0
- chronaxis/guide/en/fields/mapping/analysis-all-38.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-39.json +299 -0
- chronaxis/guide/en/fields/mapping/analysis-all-4.json +297 -0
- chronaxis/guide/en/fields/mapping/analysis-all-40.json +311 -0
- chronaxis/guide/en/fields/mapping/analysis-all-41.json +310 -0
- chronaxis/guide/en/fields/mapping/analysis-all-42.json +346 -0
- chronaxis/guide/en/fields/mapping/analysis-all-43.json +267 -0
- chronaxis/guide/en/fields/mapping/analysis-all-44.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-45.json +279 -0
- chronaxis/guide/en/fields/mapping/analysis-all-46.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-47.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-48.json +294 -0
- chronaxis/guide/en/fields/mapping/analysis-all-49.json +253 -0
- chronaxis/guide/en/fields/mapping/analysis-all-5.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-50.json +346 -0
- chronaxis/guide/en/fields/mapping/analysis-all-51.json +324 -0
- chronaxis/guide/en/fields/mapping/analysis-all-52.json +335 -0
- chronaxis/guide/en/fields/mapping/analysis-all-53.json +317 -0
- chronaxis/guide/en/fields/mapping/analysis-all-54.json +316 -0
- chronaxis/guide/en/fields/mapping/analysis-all-55.json +302 -0
- chronaxis/guide/en/fields/mapping/analysis-all-56.json +319 -0
- chronaxis/guide/en/fields/mapping/analysis-all-57.json +334 -0
- chronaxis/guide/en/fields/mapping/analysis-all-58.json +333 -0
- chronaxis/guide/en/fields/mapping/analysis-all-59.json +359 -0
- chronaxis/guide/en/fields/mapping/analysis-all-6.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-60.json +303 -0
- chronaxis/guide/en/fields/mapping/analysis-all-61.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-62.json +301 -0
- chronaxis/guide/en/fields/mapping/analysis-all-63.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-64.json +367 -0
- chronaxis/guide/en/fields/mapping/analysis-all-65.json +334 -0
- chronaxis/guide/en/fields/mapping/analysis-all-66.json +358 -0
- chronaxis/guide/en/fields/mapping/analysis-all-67.json +349 -0
- chronaxis/guide/en/fields/mapping/analysis-all-68.json +331 -0
- chronaxis/guide/en/fields/mapping/analysis-all-69.json +304 -0
- chronaxis/guide/en/fields/mapping/analysis-all-7.json +303 -0
- chronaxis/guide/en/fields/mapping/analysis-all-70.json +349 -0
- chronaxis/guide/en/fields/mapping/analysis-all-71.json +288 -0
- chronaxis/guide/en/fields/mapping/analysis-all-72.json +316 -0
- chronaxis/guide/en/fields/mapping/analysis-all-73.json +266 -0
- chronaxis/guide/en/fields/mapping/analysis-all-74.json +227 -0
- chronaxis/guide/en/fields/mapping/analysis-all-75.json +239 -0
- chronaxis/guide/en/fields/mapping/analysis-all-76.json +274 -0
- chronaxis/guide/en/fields/mapping/analysis-all-77.json +380 -0
- chronaxis/guide/en/fields/mapping/analysis-all-78.json +313 -0
- chronaxis/guide/en/fields/mapping/analysis-all-79.json +338 -0
- chronaxis/guide/en/fields/mapping/analysis-all-8.json +292 -0
- chronaxis/guide/en/fields/mapping/analysis-all-80.json +304 -0
- chronaxis/guide/en/fields/mapping/analysis-all-81.json +140 -0
- chronaxis/guide/en/fields/mapping/analysis-all-9.json +332 -0
- chronaxis/guide/en/fields/mapping/io_policy-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/mapping_version-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/path_base-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/sections-all-1.json +402 -0
- chronaxis/guide/en/fields/mapping/sections-all-2.json +232 -0
- chronaxis/guide/en/semantics.md +70 -0
- chronaxis/guide/en/tasks.json +290 -0
- chronaxis/guide/en/workflow.md +41 -0
- chronaxis/guide/examples/analysis-imports.yaml +22 -0
- chronaxis/guide/examples/analysis.yaml +23 -0
- chronaxis/guide/examples/batch-minimal.yaml +3 -0
- chronaxis/guide/examples/conditional-energy.yaml +36 -0
- chronaxis/guide/examples/data/activity.csv +6 -0
- chronaxis/guide/examples/data/can/activity.asc +11 -0
- chronaxis/guide/examples/data/can/calculation-minimal.asc +6 -0
- chronaxis/guide/examples/data/can/conditional-energy/part-1.asc +92 -0
- chronaxis/guide/examples/data/can/conditional-energy/part-2.asc +36 -0
- chronaxis/guide/examples/data/can/conditional-energy/signals.dbc +10 -0
- chronaxis/guide/examples/data/can/execution-comparison.asc +12 -0
- chronaxis/guide/examples/data/can/execution-report.asc +4 -0
- chronaxis/guide/examples/data/can/expression-extended.asc +11 -0
- chronaxis/guide/examples/data/can/interval-actual.asc +6 -0
- chronaxis/guide/examples/data/can/preset-charge-energy.asc +15 -0
- chronaxis/guide/examples/data/can/preset-charge-minimal.asc +11 -0
- chronaxis/guide/examples/data/can/preset-command-automatic.asc +11 -0
- chronaxis/guide/examples/data/can/preset-fault-context.asc +7 -0
- chronaxis/guide/examples/data/can/preset-threshold-delay.asc +7 -0
- chronaxis/guide/examples/data/can/preset-threshold-partial.asc +7 -0
- chronaxis/guide/examples/data/can/quality.asc +6 -0
- chronaxis/guide/examples/data/can/quickstart-parts/part1.asc +4 -0
- chronaxis/guide/examples/data/can/quickstart-parts/part2.asc +3 -0
- chronaxis/guide/examples/data/can/quickstart.asc +6 -0
- chronaxis/guide/examples/data/can/rule-condition_duration-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-condition_duration-minimal.asc +19 -0
- chronaxis/guide/examples/data/can/rule-debounce-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-falling_edge-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-hysteresis-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-start_end-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-start_only-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-window_delta-extended.asc +19 -0
- chronaxis/guide/examples/data/can/sequence-outcomes.asc +19 -0
- chronaxis/guide/examples/data/can/signal-types.asc +13 -0
- chronaxis/guide/examples/data/can/start-end.asc +30 -0
- chronaxis/guide/examples/data/can/teaching-base.asc +58 -0
- chronaxis/guide/examples/data/can/teaching.dbc +53 -0
- chronaxis/guide/examples/data/joint-current.csv +5 -0
- chronaxis/guide/examples/data/joint.asc +5 -0
- chronaxis/guide/examples/data/joint.dbc +7 -0
- chronaxis/guide/examples/data/message-clean.asc +6 -0
- chronaxis/guide/examples/data/message-direction.asc +7 -0
- chronaxis/guide/examples/data/message-direction.dbc +7 -0
- chronaxis/guide/examples/data/power.blf +0 -0
- chronaxis/guide/examples/data/power.dbc +6 -0
- chronaxis/guide/examples/data/quality.csv +5 -0
- chronaxis/guide/examples/data/raw-can-example.csv +5 -0
- chronaxis/guide/examples/data/signal-types.csv +5 -0
- chronaxis/guide/examples/data/signals.csv +6 -0
- chronaxis/guide/examples/data/timing.asc +6 -0
- chronaxis/guide/examples/data/timing.dbc +11 -0
- chronaxis/guide/examples/export-can-minimal.yaml +24 -0
- chronaxis/guide/examples/input-csv-minimal.yaml +23 -0
- chronaxis/guide/examples/preset-charge-energy.yaml +41 -0
- chronaxis/guide/examples/preset-charge-minimal.yaml +31 -0
- chronaxis/guide/examples/preset-fault-context.yaml +27 -0
- chronaxis/guide/examples/quality.yaml +19 -0
- chronaxis/guide/examples/sequence-outcomes.yaml +39 -0
- chronaxis/guide/examples/shared/definitions.yaml +14 -0
- chronaxis/guide/examples/signal-enum-minimal.yaml +19 -0
- chronaxis/guide/examples/signal-number-conversion.yaml +24 -0
- chronaxis/guide/examples/window-merged.yaml +28 -0
- chronaxis/guide/fields/analysis/calculations-all-1.json +360 -0
- chronaxis/guide/fields/analysis/calculations-all-2.json +299 -0
- chronaxis/guide/fields/analysis/calculations-all-3.json +70 -0
- chronaxis/guide/fields/analysis/config_version-all-1.json +24 -0
- chronaxis/guide/fields/analysis/dataset-all-1.json +344 -0
- chronaxis/guide/fields/analysis/derived-all-1.json +147 -0
- chronaxis/guide/fields/analysis/diagnostics-all-1.json +69 -0
- chronaxis/guide/fields/analysis/execution-all-1.json +167 -0
- chronaxis/guide/fields/analysis/imports-all-1.json +39 -0
- chronaxis/guide/fields/analysis/intervals-all-1.json +173 -0
- chronaxis/guide/fields/analysis/message_calculations-all-1.json +360 -0
- chronaxis/guide/fields/analysis/message_calculations-all-2.json +255 -0
- chronaxis/guide/fields/analysis/metadata-all-1.json +24 -0
- chronaxis/guide/fields/analysis/outputs-all-1.json +349 -0
- chronaxis/guide/fields/analysis/outputs-all-2.json +302 -0
- chronaxis/guide/fields/analysis/outputs-all-3.json +321 -0
- chronaxis/guide/fields/analysis/outputs-all-4.json +253 -0
- chronaxis/guide/fields/analysis/outputs-all-5.json +244 -0
- chronaxis/guide/fields/analysis/outputs-all-6.json +199 -0
- chronaxis/guide/fields/analysis/overrides-all-1.json +104 -0
- chronaxis/guide/fields/analysis/presets-charge_session-1.json +398 -0
- chronaxis/guide/fields/analysis/presets-charge_session-2.json +114 -0
- chronaxis/guide/fields/analysis/presets-command_response-1.json +376 -0
- chronaxis/guide/fields/analysis/presets-fault_context-1.json +285 -0
- chronaxis/guide/fields/analysis/presets-threshold_excursion-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-condition_duration-1.json +344 -0
- chronaxis/guide/fields/analysis/rules-condition_duration-2.json +27 -0
- chronaxis/guide/fields/analysis/rules-debounce-1.json +335 -0
- chronaxis/guide/fields/analysis/rules-falling_edge-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-hysteresis-1.json +334 -0
- chronaxis/guide/fields/analysis/rules-hysteresis-2.json +27 -0
- chronaxis/guide/fields/analysis/rules-rising_edge-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-start_end-1.json +349 -0
- chronaxis/guide/fields/analysis/rules-start_end-2.json +44 -0
- chronaxis/guide/fields/analysis/rules-start_only-1.json +334 -0
- chronaxis/guide/fields/analysis/rules-window_delta-1.json +356 -0
- chronaxis/guide/fields/analysis/rules-window_delta-2.json +78 -0
- chronaxis/guide/fields/analysis/sequences-all-1.json +394 -0
- chronaxis/guide/fields/analysis/sequences-all-2.json +54 -0
- chronaxis/guide/fields/analysis/signals-variant-1-1.json +349 -0
- chronaxis/guide/fields/analysis/signals-variant-1-2.json +297 -0
- chronaxis/guide/fields/analysis/signals-variant-1-3.json +340 -0
- chronaxis/guide/fields/analysis/signals-variant-1-4.json +175 -0
- chronaxis/guide/fields/analysis/signals-variant-2-1.json +327 -0
- chronaxis/guide/fields/analysis/signals-variant-2-2.json +335 -0
- chronaxis/guide/fields/analysis/signals-variant-2-3.json +289 -0
- chronaxis/guide/fields/analysis/signals-variant-2-4.json +270 -0
- chronaxis/guide/fields/analysis/sources-can_asc-1.json +318 -0
- chronaxis/guide/fields/analysis/sources-can_asc-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-can_asc-3.json +311 -0
- chronaxis/guide/fields/analysis/sources-can_asc-4.json +69 -0
- chronaxis/guide/fields/analysis/sources-can_blf-1.json +317 -0
- chronaxis/guide/fields/analysis/sources-can_blf-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-can_blf-3.json +317 -0
- chronaxis/guide/fields/analysis/sources-memory-1.json +347 -0
- chronaxis/guide/fields/analysis/sources-memory-2.json +110 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-1.json +330 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-10.json +233 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-11.json +225 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-12.json +228 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-13.json +226 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-14.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-15.json +227 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-16.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-17.json +238 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-18.json +239 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-19.json +233 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-20.json +242 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-21.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-22.json +228 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-23.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-24.json +223 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-25.json +290 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-26.json +131 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-3.json +297 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-4.json +226 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-5.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-6.json +227 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-7.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-8.json +238 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-9.json +239 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-1.json +331 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-2.json +327 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-3.json +295 -0
- chronaxis/guide/fields/analysis/sources-variant-6-1.json +319 -0
- chronaxis/guide/fields/analysis/sources-variant-6-2.json +327 -0
- chronaxis/guide/fields/analysis/sources-variant-6-3.json +314 -0
- chronaxis/guide/fields/analysis/sources-variant-6-4.json +91 -0
- chronaxis/guide/fields/analysis/windows-all-1.json +361 -0
- chronaxis/guide/fields/analysis/windows-all-2.json +187 -0
- chronaxis/guide/fields/batch/backend-all-1.json +26 -0
- chronaxis/guide/fields/batch/batch_version-all-1.json +22 -0
- chronaxis/guide/fields/batch/fail_fast-all-1.json +22 -0
- chronaxis/guide/fields/batch/inputs-all-1.json +161 -0
- chronaxis/guide/fields/batch/jobs-all-1.json +58 -0
- chronaxis/guide/fields/batch/process_count-all-1.json +23 -0
- chronaxis/guide/fields/batch/source-all-1.json +22 -0
- chronaxis/guide/fields/batch/template-all-1.json +22 -0
- chronaxis/guide/fields/definitions/derived-all-1.json +121 -0
- chronaxis/guide/fields/definitions/signals-all-1.json +336 -0
- chronaxis/guide/fields/definitions/signals-all-2.json +307 -0
- chronaxis/guide/fields/definitions/signals-all-3.json +305 -0
- chronaxis/guide/fields/definitions/signals-all-4.json +352 -0
- chronaxis/guide/fields/definitions/signals-all-5.json +311 -0
- chronaxis/guide/fields/definitions/signals-all-6.json +254 -0
- chronaxis/guide/fields/definitions/signals-all-7.json +88 -0
- chronaxis/guide/fields/definitions/sources-all-1.json +332 -0
- chronaxis/guide/fields/definitions/sources-all-10.json +307 -0
- chronaxis/guide/fields/definitions/sources-all-11.json +280 -0
- chronaxis/guide/fields/definitions/sources-all-12.json +209 -0
- chronaxis/guide/fields/definitions/sources-all-13.json +219 -0
- chronaxis/guide/fields/definitions/sources-all-14.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-15.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-16.json +232 -0
- chronaxis/guide/fields/definitions/sources-all-17.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-18.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-19.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-2.json +336 -0
- chronaxis/guide/fields/definitions/sources-all-20.json +228 -0
- chronaxis/guide/fields/definitions/sources-all-21.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-22.json +232 -0
- chronaxis/guide/fields/definitions/sources-all-23.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-24.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-25.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-26.json +228 -0
- chronaxis/guide/fields/definitions/sources-all-27.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-28.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-29.json +227 -0
- chronaxis/guide/fields/definitions/sources-all-3.json +306 -0
- chronaxis/guide/fields/definitions/sources-all-30.json +333 -0
- chronaxis/guide/fields/definitions/sources-all-31.json +302 -0
- chronaxis/guide/fields/definitions/sources-all-32.json +319 -0
- chronaxis/guide/fields/definitions/sources-all-33.json +89 -0
- chronaxis/guide/fields/definitions/sources-all-4.json +336 -0
- chronaxis/guide/fields/definitions/sources-all-5.json +313 -0
- chronaxis/guide/fields/definitions/sources-all-6.json +292 -0
- chronaxis/guide/fields/definitions/sources-all-7.json +319 -0
- chronaxis/guide/fields/definitions/sources-all-8.json +315 -0
- chronaxis/guide/fields/definitions/sources-all-9.json +318 -0
- chronaxis/guide/fields/index.json +3432 -0
- chronaxis/guide/fields/mapping/aliases-all-1.json +91 -0
- chronaxis/guide/fields/mapping/analysis-all-1.json +382 -0
- chronaxis/guide/fields/mapping/analysis-all-10.json +307 -0
- chronaxis/guide/fields/mapping/analysis-all-11.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-12.json +329 -0
- chronaxis/guide/fields/mapping/analysis-all-13.json +294 -0
- chronaxis/guide/fields/mapping/analysis-all-14.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-15.json +280 -0
- chronaxis/guide/fields/mapping/analysis-all-16.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-17.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-18.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-19.json +237 -0
- chronaxis/guide/fields/mapping/analysis-all-2.json +342 -0
- chronaxis/guide/fields/mapping/analysis-all-20.json +233 -0
- chronaxis/guide/fields/mapping/analysis-all-21.json +244 -0
- chronaxis/guide/fields/mapping/analysis-all-22.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-23.json +226 -0
- chronaxis/guide/fields/mapping/analysis-all-24.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-25.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-26.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-27.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-28.json +237 -0
- chronaxis/guide/fields/mapping/analysis-all-29.json +233 -0
- chronaxis/guide/fields/mapping/analysis-all-3.json +322 -0
- chronaxis/guide/fields/mapping/analysis-all-30.json +244 -0
- chronaxis/guide/fields/mapping/analysis-all-31.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-32.json +226 -0
- chronaxis/guide/fields/mapping/analysis-all-33.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-34.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-35.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-36.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-37.json +291 -0
- chronaxis/guide/fields/mapping/analysis-all-38.json +315 -0
- chronaxis/guide/fields/mapping/analysis-all-39.json +304 -0
- chronaxis/guide/fields/mapping/analysis-all-4.json +312 -0
- chronaxis/guide/fields/mapping/analysis-all-40.json +307 -0
- chronaxis/guide/fields/mapping/analysis-all-41.json +292 -0
- chronaxis/guide/fields/mapping/analysis-all-42.json +333 -0
- chronaxis/guide/fields/mapping/analysis-all-43.json +296 -0
- chronaxis/guide/fields/mapping/analysis-all-44.json +322 -0
- chronaxis/guide/fields/mapping/analysis-all-45.json +298 -0
- chronaxis/guide/fields/mapping/analysis-all-46.json +347 -0
- chronaxis/guide/fields/mapping/analysis-all-47.json +302 -0
- chronaxis/guide/fields/mapping/analysis-all-48.json +263 -0
- chronaxis/guide/fields/mapping/analysis-all-49.json +301 -0
- chronaxis/guide/fields/mapping/analysis-all-5.json +313 -0
- chronaxis/guide/fields/mapping/analysis-all-50.json +336 -0
- chronaxis/guide/fields/mapping/analysis-all-51.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-52.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-53.json +334 -0
- chronaxis/guide/fields/mapping/analysis-all-54.json +339 -0
- chronaxis/guide/fields/mapping/analysis-all-55.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-56.json +336 -0
- chronaxis/guide/fields/mapping/analysis-all-57.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-58.json +333 -0
- chronaxis/guide/fields/mapping/analysis-all-59.json +325 -0
- chronaxis/guide/fields/mapping/analysis-all-6.json +323 -0
- chronaxis/guide/fields/mapping/analysis-all-60.json +334 -0
- chronaxis/guide/fields/mapping/analysis-all-61.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-62.json +289 -0
- chronaxis/guide/fields/mapping/analysis-all-63.json +383 -0
- chronaxis/guide/fields/mapping/analysis-all-64.json +357 -0
- chronaxis/guide/fields/mapping/analysis-all-65.json +375 -0
- chronaxis/guide/fields/mapping/analysis-all-66.json +351 -0
- chronaxis/guide/fields/mapping/analysis-all-67.json +346 -0
- chronaxis/guide/fields/mapping/analysis-all-68.json +317 -0
- chronaxis/guide/fields/mapping/analysis-all-69.json +313 -0
- chronaxis/guide/fields/mapping/analysis-all-7.json +306 -0
- chronaxis/guide/fields/mapping/analysis-all-70.json +326 -0
- chronaxis/guide/fields/mapping/analysis-all-71.json +316 -0
- chronaxis/guide/fields/mapping/analysis-all-72.json +264 -0
- chronaxis/guide/fields/mapping/analysis-all-73.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-74.json +241 -0
- chronaxis/guide/fields/mapping/analysis-all-75.json +273 -0
- chronaxis/guide/fields/mapping/analysis-all-76.json +382 -0
- chronaxis/guide/fields/mapping/analysis-all-77.json +328 -0
- chronaxis/guide/fields/mapping/analysis-all-78.json +338 -0
- chronaxis/guide/fields/mapping/analysis-all-79.json +304 -0
- chronaxis/guide/fields/mapping/analysis-all-8.json +309 -0
- chronaxis/guide/fields/mapping/analysis-all-80.json +140 -0
- chronaxis/guide/fields/mapping/analysis-all-9.json +329 -0
- chronaxis/guide/fields/mapping/io_policy-all-1.json +19 -0
- chronaxis/guide/fields/mapping/mapping_version-all-1.json +19 -0
- chronaxis/guide/fields/mapping/path_base-all-1.json +19 -0
- chronaxis/guide/fields/mapping/sections-all-1.json +402 -0
- chronaxis/guide/fields/mapping/sections-all-2.json +232 -0
- chronaxis/guide/lookup.py +90 -0
- chronaxis/guide/manifest.json +614 -0
- chronaxis/guide/run_analysis.py +34 -0
- chronaxis/guide/schemas/analysis.schema.json +8451 -0
- chronaxis/guide/schemas/batch-v1.schema.json +172 -0
- chronaxis/guide/schemas/definitions.schema.json +29 -0
- chronaxis/guide/schemas/legacy-import-v1.schema.json +143 -0
- chronaxis/guide/semantics.md +62 -0
- chronaxis/guide/tasks.json +290 -0
- chronaxis/guide/workflow.md +38 -0
- chronaxis/legacy/__init__.py +46 -0
- chronaxis/legacy/batch_read.py +412 -0
- chronaxis/legacy/batch_validation.py +134 -0
- chronaxis/legacy/batch_wire.py +264 -0
- chronaxis/legacy/batch_worker.py +417 -0
- chronaxis/legacy/binding.py +154 -0
- chronaxis/legacy/dbc_cycles.py +47 -0
- chronaxis/legacy/decode_policy.py +28 -0
- chronaxis/legacy/disjunction.py +79 -0
- chronaxis/legacy/export_worker.py +147 -0
- chronaxis/legacy/export_write.py +378 -0
- chronaxis/legacy/message_store.py +562 -0
- chronaxis/legacy/process_read.py +526 -0
- chronaxis/legacy/raw_store.py +341 -0
- chronaxis/legacy/records.py +709 -0
- chronaxis/legacy/required_records.py +122 -0
- chronaxis/legacy/sum.py +403 -0
- chronaxis/legacy/sum_numpy.py +43 -0
- chronaxis/legacy/updates.py +277 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/can_processor.py +138 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/file_processor.py +218 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/utils.py +447 -0
- chronaxis/legacy/worker.py +352 -0
- chronaxis/migration/__init__.py +11 -0
- chronaxis/migration/api.py +270 -0
- chronaxis/migration/ini.py +110 -0
- chronaxis/migration/legacy_sum.py +304 -0
- chronaxis/migration/models.py +83 -0
- chronaxis/migration/publication.py +230 -0
- chronaxis/migration/sclicer.py +241 -0
- chronaxis/migration/slope.py +78 -0
- chronaxis/migration/start_end.py +48 -0
- chronaxis/planning/__init__.py +19 -0
- chronaxis/planning/channels.py +30 -0
- chronaxis/planning/checks.py +447 -0
- chronaxis/planning/config_groups.py +215 -0
- chronaxis/planning/dbc_defaults.py +88 -0
- chronaxis/planning/export_options.py +247 -0
- chronaxis/planning/input_defaults.py +62 -0
- chronaxis/planning/input_paths.py +124 -0
- chronaxis/planning/input_requirements.py +250 -0
- chronaxis/planning/inputs.py +306 -0
- chronaxis/planning/intervals.py +242 -0
- chronaxis/planning/legacy_execution.py +38 -0
- chronaxis/planning/message_calculations.py +171 -0
- chronaxis/planning/models.py +369 -0
- chronaxis/planning/nodes.py +355 -0
- chronaxis/planning/plan.py +294 -0
- chronaxis/planning/preset_models.py +211 -0
- chronaxis/planning/record_execution.py +76 -0
- chronaxis/planning/reports.py +523 -0
- chronaxis/planning/sequences.py +91 -0
- chronaxis/planning/signal_groups.py +61 -0
- chronaxis/planning/signal_validity.py +46 -0
- chronaxis/planning/text_inputs.py +110 -0
- chronaxis/presets.py +270 -0
- chronaxis/results/__init__.py +34 -0
- chronaxis/results/analysis_outcome.py +67 -0
- chronaxis/results/artifact_exports.py +212 -0
- chronaxis/results/binding_metadata.py +54 -0
- chronaxis/results/budget.py +138 -0
- chronaxis/results/can_metadata.py +247 -0
- chronaxis/results/codec.py +246 -0
- chronaxis/results/errors.py +25 -0
- chronaxis/results/export_files.py +216 -0
- chronaxis/results/frame_exports.py +299 -0
- chronaxis/results/frame_patch.py +186 -0
- chronaxis/results/frame_rebuild.py +458 -0
- chronaxis/results/frame_sort.py +223 -0
- chronaxis/results/input_diagnostics.py +51 -0
- chronaxis/results/manifest.py +343 -0
- chronaxis/results/merge_runs.py +207 -0
- chronaxis/results/owned_directory.py +32 -0
- chronaxis/results/raw_exports.py +689 -0
- chronaxis/results/readable.py +355 -0
- chronaxis/results/readable_format.py +94 -0
- chronaxis/results/result.py +734 -0
- chronaxis/results/rows.py +57 -0
- chronaxis/results/signal_exports.py +209 -0
- chronaxis/results/signal_grid.py +219 -0
- chronaxis/results/spool.py +421 -0
- chronaxis/results/summary.py +350 -0
- chronaxis/results/text_can_metadata.py +64 -0
- chronaxis/results/threshold_metadata.py +105 -0
- chronaxis/runner.py +121 -0
- chronaxis/sources/__init__.py +23 -0
- chronaxis/sources/asc.py +412 -0
- chronaxis/sources/blf.py +101 -0
- chronaxis/sources/can_spec.py +179 -0
- chronaxis/sources/can_updates.py +160 -0
- chronaxis/sources/csv_spec.py +133 -0
- chronaxis/sources/descriptions.py +65 -0
- chronaxis/sources/memory.py +299 -0
- chronaxis/sources/models.py +497 -0
- chronaxis/sources/packing.py +170 -0
- chronaxis/sources/protocol.py +221 -0
- chronaxis/sources/raw_can.py +62 -0
- chronaxis/sources/raw_csv.py +470 -0
- chronaxis/sources/raw_csv_layout.py +310 -0
- chronaxis/sources/signal_csv.py +608 -0
- chronaxis/sources/text_can_decode.py +421 -0
- chronaxis/sources/text_can_ref.py +48 -0
- chronaxis/sources/text_can_spec.py +61 -0
- chronaxis/timebase/__init__.py +19 -0
- chronaxis/timebase/conversion.py +364 -0
- chronaxis/timebase/numpy_ops.py +104 -0
- chronaxis/user_guide.py +81 -0
- chronaxis-0.1.0.dev0.dist-info/METADATA +172 -0
- chronaxis-0.1.0.dev0.dist-info/RECORD +917 -0
- chronaxis-0.1.0.dev0.dist-info/WHEEL +5 -0
- chronaxis-0.1.0.dev0.dist-info/entry_points.txt +2 -0
- chronaxis-0.1.0.dev0.dist-info/licenses/LICENSE +21 -0
- chronaxis-0.1.0.dev0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""静态读取受支持INI语法并保字段位置,不实例化旧ConfigManager。
|
|
2
|
+
|
|
3
|
+
输入为已解码文本和本次局部报告字段列表;输出公开ConfigParser对象及原段序。
|
|
4
|
+
Sclicer保持旧option小写规则,ChrgInfo保持大小写及仅分号注释。预扫描拒DEFAULT、插值、重复和多行继承,
|
|
5
|
+
随后仍用标准ConfigParser核语法;不读外部INI、DBC、日志或环境变量。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import configparser
|
|
9
|
+
import re
|
|
10
|
+
from dataclasses import replace
|
|
11
|
+
|
|
12
|
+
from .models import LegacyFieldMapping, LegacyImportIssue
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ImportProblem(Exception):
|
|
16
|
+
"""仅在本包内部传递一条配置语义问题,不接管I/O或取消异常。"""
|
|
17
|
+
|
|
18
|
+
def __init__(self, issue: LegacyImportIssue):
|
|
19
|
+
"""保原问题;参数: issue;返回: None;异常: 无。"""
|
|
20
|
+
self.issue = issue
|
|
21
|
+
super().__init__(issue.message)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def problem(code, origin, path, message, line=None, column=None):
|
|
25
|
+
"""抛有限语义问题;参数: 机器码及定位;返回: 无;异常: ImportProblem。"""
|
|
26
|
+
raise ImportProblem(LegacyImportIssue(code, origin, path, message, line, column))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def field_path(section, key):
|
|
30
|
+
"""生成稳定INI位置;参数: 原段名/规范键;返回: str;异常: 无。"""
|
|
31
|
+
return '[' + section + '].' + key
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def locate(fields, section, key=None):
|
|
35
|
+
"""查原字段定位;参数: 已收集字段/段/可选键;返回: 行列tuple;异常: 无。"""
|
|
36
|
+
prefix = '[' + section + '].'
|
|
37
|
+
for item in fields:
|
|
38
|
+
matches = item.path == field_path(section, key) if key is not None else item.path.startswith(prefix)
|
|
39
|
+
if matches:
|
|
40
|
+
return item.line, item.column
|
|
41
|
+
return None, None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def mark(fields, section, key, target, status='mapped', message='按显式映射转换'):
|
|
45
|
+
"""更新本次局部字段去向;参数: 字段列表和处理事实;返回: None;异常: 无。"""
|
|
46
|
+
for index, item in enumerate(fields):
|
|
47
|
+
if item.path == field_path(section, key):
|
|
48
|
+
fields[index] = replace(item, target=target, status=status, message=message)
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def parse_ini(text, fields, *, preserve_case=False):
|
|
53
|
+
"""预扫有限INI位置并用标准解析器复核,不允许多行或隐式继承。
|
|
54
|
+
|
|
55
|
+
参数: text原文本;fields本次输出列表;preserve_case选择ChrgInfo大小写及分号口径。
|
|
56
|
+
返回: (ConfigParser, 段名到头部行号dict)。异常: ImportProblem为配置语法错误;
|
|
57
|
+
MemoryError/取消原样传播。Sclicer无inline注释;ChrgInfo的井号不是INI注释。
|
|
58
|
+
"""
|
|
59
|
+
headers, seen, section, previous_indent = {}, set(), None, None
|
|
60
|
+
for line_number, line in enumerate(text.splitlines(), 1):
|
|
61
|
+
if preserve_case:
|
|
62
|
+
# 与旧ConfigParser相同:分号在行首或紧随空白时开始inline注释。
|
|
63
|
+
# 不把a;b误截为a,也不因注释中的%(...)误报有效字段插值。
|
|
64
|
+
for position, char in enumerate(line):
|
|
65
|
+
if char == ';' and (position == 0 or line[position - 1].isspace()):
|
|
66
|
+
line = line[:position]
|
|
67
|
+
break
|
|
68
|
+
stripped = line.strip()
|
|
69
|
+
comments = (';',) if preserve_case else ('#', ';')
|
|
70
|
+
if not stripped or stripped.startswith(comments):
|
|
71
|
+
continue
|
|
72
|
+
header = re.fullmatch(r'\[([^\]]+)\]\s*(?:[;#].*)?', stripped)
|
|
73
|
+
if header:
|
|
74
|
+
section = header.group(1)
|
|
75
|
+
if section == 'DEFAULT':
|
|
76
|
+
problem('unsupported_default', 'ini', '[DEFAULT]', '不支持DEFAULT继承', line_number, 1)
|
|
77
|
+
if section in headers:
|
|
78
|
+
problem('duplicate_section', 'ini', '[' + section + ']', '重复INI段', line_number, 1)
|
|
79
|
+
headers[section], previous_indent = line_number, None
|
|
80
|
+
continue
|
|
81
|
+
indent = len(line) - len(line.lstrip())
|
|
82
|
+
if previous_indent is not None and indent > previous_indent:
|
|
83
|
+
problem('unsupported_multiline', 'ini', '[' + str(section) + ']',
|
|
84
|
+
'不支持INI多行续值', line_number, indent + 1)
|
|
85
|
+
match = re.fullmatch(r'([^:=]+?)\s*[:=]\s*(.*)', stripped)
|
|
86
|
+
if section is None or match is None:
|
|
87
|
+
problem('invalid_ini', 'ini', '[' + str(section) + ']', '需要段内单行key=value', line_number, 1)
|
|
88
|
+
original_key, value = match.group(1).strip(), match.group(2).strip()
|
|
89
|
+
key = original_key if preserve_case else original_key.lower()
|
|
90
|
+
path = field_path(section, key)
|
|
91
|
+
if not key or (section, key) in seen:
|
|
92
|
+
problem('duplicate_option', 'ini', path, '字段为空或按旧大小写规则重复', line_number, indent + 1)
|
|
93
|
+
seen.add((section, key))
|
|
94
|
+
fields.append(LegacyFieldMapping('ini', path, value, line_number, indent + 1,
|
|
95
|
+
None, 'pending', '尚未转换'))
|
|
96
|
+
if '%(' in value or '${' in value:
|
|
97
|
+
problem('unsupported_interpolation', 'ini', path, '不支持插值,须提供显式值', line_number, indent + 1)
|
|
98
|
+
previous_indent = indent
|
|
99
|
+
parser = configparser.ConfigParser(interpolation=None, strict=True,
|
|
100
|
+
comment_prefixes=(';',) if preserve_case else ('#', ';'),
|
|
101
|
+
inline_comment_prefixes=(';',) if preserve_case else None)
|
|
102
|
+
if preserve_case:
|
|
103
|
+
parser.optionxform = str
|
|
104
|
+
try:
|
|
105
|
+
parser.read_string(text)
|
|
106
|
+
except configparser.Error as error:
|
|
107
|
+
problem('invalid_ini', 'ini', '$', str(error), getattr(error, 'lineno', None), 1)
|
|
108
|
+
if not headers:
|
|
109
|
+
problem('empty_ini', 'ini', '$', 'INI没有可转换段')
|
|
110
|
+
return parser, headers
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"""静态迁移ChrgInfo当前消息公式,保原参数顺序、缺值门控和分桶定位。
|
|
2
|
+
|
|
3
|
+
输入为已按旧大小写/分号口径解析的INI及显式mapping;输出仅追加独立分析
|
|
4
|
+
字典的message_calculations与有限报告。period/factor沿旧float文本解析;只有global
|
|
5
|
+
在float文本失败后通过受限AST原序计算。公式只替换Name;
|
|
6
|
+
不执行eval、旧ConfigManager、DBC、reader或数据扫描。旧完整触发/缓存不支持。
|
|
7
|
+
正负分桶复用已接入raw_decoded-v1,不改贡献符号、周期、单位或普通数值核。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import ast
|
|
11
|
+
from dataclasses import replace
|
|
12
|
+
from math import isfinite
|
|
13
|
+
|
|
14
|
+
from ..core.message_binding import ExpressionParameter
|
|
15
|
+
from ..legacy.records import PROFILE_ID, field_from_dict
|
|
16
|
+
from .ini import field_path, locate, mark, problem
|
|
17
|
+
from .models import LegacyImportIssue
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _reject(fields, headers, section, key, code, message):
|
|
21
|
+
"""拒绝原字段并保真实位置;参数: 定位/原因;返回: 无;异常: ImportProblem。"""
|
|
22
|
+
line, column = locate(fields, section, key)
|
|
23
|
+
if line is None:
|
|
24
|
+
line, column = headers[section], 1
|
|
25
|
+
problem(code, 'ini', field_path(section, key), message, line, column)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _targets(fields, section, key, targets, message='保原字段并显式映射'):
|
|
29
|
+
"""为一原字段保每个真实目标,不把多路径拼成无法解析的字符串。
|
|
30
|
+
|
|
31
|
+
参数: fields局部报告列表、原位置、targets目标tuple和说明。返回: None。
|
|
32
|
+
异常: 无;原字段缺失由必填校验处理。相同global可映射多个section参数。
|
|
33
|
+
"""
|
|
34
|
+
matches = [(index, item) for index, item in enumerate(fields) if item.path == field_path(section, key)]
|
|
35
|
+
if not matches:
|
|
36
|
+
return
|
|
37
|
+
index, original = matches[0]
|
|
38
|
+
existing = {item.target for _, item in matches if item.target is not None}
|
|
39
|
+
for target in targets:
|
|
40
|
+
if target in existing:
|
|
41
|
+
continue
|
|
42
|
+
mapped = replace(original, target=target, status='mapped', message=message)
|
|
43
|
+
if fields[index].status == 'pending':
|
|
44
|
+
fields[index] = mapped
|
|
45
|
+
else:
|
|
46
|
+
fields.append(mapped)
|
|
47
|
+
existing.add(target)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _constant(text, fields, headers, section, key, *, float_only=False):
|
|
51
|
+
"""保旧float优先口径,只有global允许有界纯数字AST回退。
|
|
52
|
+
|
|
53
|
+
参数: 原文本及INI位置;float_only限定旧period/factor。返回: 原生int/float;
|
|
54
|
+
不重排结合顺序或先舍入,坏factor不静默沿旧fallback=1.0。
|
|
55
|
+
异常: ImportProblem为非法、过大、非有限或除零;资源/取消原错传播。
|
|
56
|
+
"""
|
|
57
|
+
code = 'invalid_factor' if float_only and key.startswith('factor') else 'invalid_constant'
|
|
58
|
+
try:
|
|
59
|
+
number = float(text)
|
|
60
|
+
except (ValueError, OverflowError) as error:
|
|
61
|
+
if float_only:
|
|
62
|
+
explanation = ('旧factor只接受float文本,旧坏值fallback=1.0不能静默转成新计算值;'
|
|
63
|
+
if key.startswith('factor') else '旧period只接受float文本,不计算四则表达式;')
|
|
64
|
+
_reject(fields, headers, section, key, code, explanation + str(error))
|
|
65
|
+
else:
|
|
66
|
+
if not isfinite(number):
|
|
67
|
+
_reject(fields, headers, section, key, code, '参数必须是有限FLOAT64')
|
|
68
|
+
return number
|
|
69
|
+
# 只有旧global曾在float失败后eval;这里仅实现无名称/调用的安全数字子集。
|
|
70
|
+
try:
|
|
71
|
+
tree = ast.parse(text, mode='eval')
|
|
72
|
+
except (SyntaxError, ValueError, RecursionError) as error:
|
|
73
|
+
_reject(fields, headers, section, key, 'invalid_constant', str(error))
|
|
74
|
+
# 限定配置运算规模,不为禁止的指数/位移或巨型中间整数分配无界空间。
|
|
75
|
+
if sum(1 for _ in ast.walk(tree)) > 1024:
|
|
76
|
+
_reject(fields, headers, section, key, 'invalid_constant', '常量AST超过1024节点')
|
|
77
|
+
|
|
78
|
+
def evaluate(node, depth=0):
|
|
79
|
+
"""按原树逐节点算数;参数: 节点和深度;返回: 数值;异常: ValueError/算术错误。"""
|
|
80
|
+
if depth > 32:
|
|
81
|
+
raise ValueError('常量AST超过32层')
|
|
82
|
+
if isinstance(node, ast.Constant) and type(node.value) in (int, float):
|
|
83
|
+
value = node.value
|
|
84
|
+
elif isinstance(node, ast.UnaryOp) and isinstance(node.op, (ast.UAdd, ast.USub)):
|
|
85
|
+
value = evaluate(node.operand, depth + 1)
|
|
86
|
+
value = value if isinstance(node.op, ast.UAdd) else -value
|
|
87
|
+
elif isinstance(node, ast.BinOp) and isinstance(node.op, (ast.Add, ast.Sub, ast.Mult, ast.Div)):
|
|
88
|
+
left, right = evaluate(node.left, depth + 1), evaluate(node.right, depth + 1)
|
|
89
|
+
if isinstance(node.op, ast.Add):
|
|
90
|
+
value = left + right
|
|
91
|
+
elif isinstance(node.op, ast.Sub):
|
|
92
|
+
value = left - right
|
|
93
|
+
elif isinstance(node.op, ast.Mult):
|
|
94
|
+
if type(left) is int and type(right) is int and left.bit_length() + right.bit_length() > 4096:
|
|
95
|
+
raise ValueError('常量中间整数超过4096位')
|
|
96
|
+
value = left * right
|
|
97
|
+
else:
|
|
98
|
+
value = left / right
|
|
99
|
+
else:
|
|
100
|
+
raise ValueError('常量仅允许有限数字、括号、正负及加减乘除')
|
|
101
|
+
if type(value) is int and value.bit_length() > 4096 or type(value) is float and not isfinite(value):
|
|
102
|
+
raise ValueError('常量中间值非有限或整数过大')
|
|
103
|
+
return value
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
value = evaluate(tree.body)
|
|
107
|
+
number = float(value)
|
|
108
|
+
if not isfinite(number) or type(value) is int and int(number) != value:
|
|
109
|
+
raise ValueError('参数必须能精确表示为有限FLOAT64')
|
|
110
|
+
return value
|
|
111
|
+
except (ValueError, OverflowError, ZeroDivisionError) as error:
|
|
112
|
+
_reject(fields, headers, section, key, 'invalid_constant', str(error))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _formula(text, signals, parameters, aliases, fields, headers, section):
|
|
116
|
+
"""保数值公式顺序并精确替换signal Name,参数不改名。
|
|
117
|
+
|
|
118
|
+
参数: 原文本、原signal/参数名称集合、显式alias和原位置。返回: 新DSL文本。
|
|
119
|
+
异常: ImportProblem为危险AST、未知名、缺alias或未使用signal门控。
|
|
120
|
+
"""
|
|
121
|
+
try:
|
|
122
|
+
tree = ast.parse(text, mode='eval')
|
|
123
|
+
except (SyntaxError, ValueError, RecursionError) as error:
|
|
124
|
+
_reject(fields, headers, section, 'expr', 'invalid_expression', str(error))
|
|
125
|
+
allowed = (ast.Expression, ast.Name, ast.Load, ast.Constant, ast.BinOp, ast.UnaryOp,
|
|
126
|
+
ast.Add, ast.Sub, ast.Mult, ast.Div, ast.UAdd, ast.USub)
|
|
127
|
+
names = set()
|
|
128
|
+
for node in ast.walk(tree):
|
|
129
|
+
if not isinstance(node, allowed) or isinstance(node, ast.Constant) and type(node.value) not in (int, float):
|
|
130
|
+
_reject(fields, headers, section, 'expr', 'unsafe_expression', 'legacy_sum仅支持纯数值公式,不支持调用/属性/条件语法')
|
|
131
|
+
if isinstance(node, ast.Name):
|
|
132
|
+
names.add(node.id)
|
|
133
|
+
if node.id not in signals and node.id not in parameters:
|
|
134
|
+
_reject(fields, headers, section, 'expr', 'unknown_expression_name', '未声明原变量:' + node.id)
|
|
135
|
+
unused = set(signals) - names
|
|
136
|
+
if unused:
|
|
137
|
+
_reject(fields, headers, section, 'expr', 'unused_signal_gate',
|
|
138
|
+
'旧配置即使expr未使用也要求字段存在,不能丢弃缺值门控:' + ', '.join(sorted(unused)))
|
|
139
|
+
for node in ast.walk(tree):
|
|
140
|
+
if isinstance(node, ast.Name) and node.id in signals:
|
|
141
|
+
if node.id not in aliases:
|
|
142
|
+
_reject(fields, headers, section, node.id, 'missing_alias', '缺少原signal变量的显式alias')
|
|
143
|
+
node.id = aliases[node.id]
|
|
144
|
+
return ast.unparse(ast.fix_missing_locations(tree))
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _io_fields(parser, fields, headers, issues):
|
|
148
|
+
"""保旧I/O及完整替代政策;参数: 原解析和报告;返回: None;异常: ImportProblem。"""
|
|
149
|
+
for section, allowed in (('input', ('ini_path', 'dbc_path', 'msg_path')),
|
|
150
|
+
('output', ('log_path', 'result_path', 'log_level'))):
|
|
151
|
+
if parser.has_section(section):
|
|
152
|
+
for key in parser.options(section):
|
|
153
|
+
if key not in allowed:
|
|
154
|
+
_reject(fields, headers, section, key, 'unknown_option', '未知旧I/O配置项')
|
|
155
|
+
mark(fields, section, key, '$.analysis.sources' if section == 'input' else '$.analysis.outputs',
|
|
156
|
+
'replaced', '旧I/O由explicit_mapping替代,保原值但不创建旧日志/结果目录')
|
|
157
|
+
issues.append(LegacyImportIssue('explicit_io_mapping', 'mapping', '$.analysis',
|
|
158
|
+
'报文格式、显式文件顺序、DBC、时钟、请求和输出全部来自mapping;不继承旧CWD、目录批处理或旧日志副作用', level='warning'))
|
|
159
|
+
issues.append(LegacyImportIssue('current_message_difference', 'plan', '$.message_calculations',
|
|
160
|
+
'使用current_message-v1本条字段,不复用旧触发/cache;每次AnalysisRunner会话独立累计,同刻消息分别计数', level='warning'))
|
|
161
|
+
issues.append(LegacyImportIssue('empty_sum_difference', 'plan', '$.message_calculations',
|
|
162
|
+
'无匹配/全跳过保None及原因,有贡献零和为0.0;区别于旧累加器初始0,贡献不舍入且仅最终round6', level='warning'))
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def convert_legacy_sum(parser, headers, mapping, analysis, fields, issues):
|
|
166
|
+
"""整份生成普通或正负legacy指标,保字段、参数及输出标签的逐项关系。
|
|
167
|
+
|
|
168
|
+
参数: 旧口径parser/headers、六键mapping、独立analysis和局部报告列表。
|
|
169
|
+
返回: None;只填新message_calculations。异常: ImportProblem为原配置/映射拒绝;
|
|
170
|
+
不把解析成功或声明SHA当作实际CAN输入/DBC已验证,不修改数值核。
|
|
171
|
+
"""
|
|
172
|
+
sections = [name for name in parser.sections() if name.startswith('integral_')]
|
|
173
|
+
# 先定位具体未支持段,再检查mapping集合,不能用笼统缺mapping掩盖旧trigger。
|
|
174
|
+
for section in parser.sections():
|
|
175
|
+
if section not in ('input', 'output', 'global') and section not in sections:
|
|
176
|
+
problem('unsupported_section', 'ini', '[' + section + ']',
|
|
177
|
+
'不支持旧完整trigger/cache、Sclicer或其它段', headers[section], 1)
|
|
178
|
+
if not sections:
|
|
179
|
+
problem('missing_integral', 'ini', '$', '至少需要一个integral_段')
|
|
180
|
+
if set(mapping['sections']) != set(sections):
|
|
181
|
+
problem('section_mapping_mismatch', 'mapping', '$.sections', 'sections必须恰好映射全部原integral_段')
|
|
182
|
+
_io_fields(parser, fields, headers, issues)
|
|
183
|
+
globals_ = {}
|
|
184
|
+
if parser.has_section('global'):
|
|
185
|
+
for key, text in parser.items('global', raw=True):
|
|
186
|
+
globals_[key] = _constant(text, fields, headers, 'global', key)
|
|
187
|
+
analysis['message_calculations'] = []
|
|
188
|
+
for section in sections:
|
|
189
|
+
signals, factors = {}, {}
|
|
190
|
+
for key, text in parser.items(section, raw=True):
|
|
191
|
+
if key.startswith('signal_'):
|
|
192
|
+
if not text.strip():
|
|
193
|
+
_reject(fields, headers, section, key, 'missing_signal_field', '原signal字段名不能为空')
|
|
194
|
+
signals[key] = text.strip()
|
|
195
|
+
elif key.startswith('factor'):
|
|
196
|
+
factors[key] = _constant(text, fields, headers, section, key, float_only=True)
|
|
197
|
+
elif key not in ('period', 'expr', 'disjunction'):
|
|
198
|
+
_reject(fields, headers, section, key, 'unknown_option', '未知或未支持的旧积分配置项')
|
|
199
|
+
for key in ('period', 'expr'):
|
|
200
|
+
if not parser.has_option(section, key):
|
|
201
|
+
_reject(fields, headers, section, key, 'missing_option', '缺少必填原字段:' + key)
|
|
202
|
+
if not signals:
|
|
203
|
+
_reject(fields, headers, section, 'expr', 'missing_signal_mapping', '旧积分至少要求一个signal_*')
|
|
204
|
+
# 保旧四层优先关系的审计,但新模式不模拟覆盖,任何冲突均明确拒绝。
|
|
205
|
+
groups = ({'period': _constant(parser.get(section, 'period', raw=True), fields, headers, section, 'period', float_only=True)},
|
|
206
|
+
signals, factors, globals_)
|
|
207
|
+
occupied = set()
|
|
208
|
+
for group in groups:
|
|
209
|
+
overlap = occupied.intersection(group)
|
|
210
|
+
if overlap:
|
|
211
|
+
_reject(fields, headers, section, 'expr', 'variable_override', '旧period→signals→factors→global发生覆盖:' + ', '.join(sorted(overlap)))
|
|
212
|
+
occupied.update(group)
|
|
213
|
+
parameters = {**groups[0], **factors, **globals_}
|
|
214
|
+
selected = mapping['sections'][section]
|
|
215
|
+
required = {'name', 'source', 'unit', 'message_policy', 'update_message', 'parameter_units'}
|
|
216
|
+
if type(selected) is not dict or set(selected) != required:
|
|
217
|
+
problem('invalid_section_mapping', 'mapping', '$.sections.' + section, '积分映射必须精确包含六个合同字段')
|
|
218
|
+
if selected['message_policy'] != 'current_message-v1':
|
|
219
|
+
problem('invalid_message_policy', 'mapping', '$.sections.' + section + '.message_policy', '必须显式选择current_message-v1')
|
|
220
|
+
units = selected['parameter_units']
|
|
221
|
+
if type(units) is not dict or set(units) != set(parameters):
|
|
222
|
+
missing = sorted(set(parameters) - set(units)) if type(units) is dict else sorted(parameters)
|
|
223
|
+
extra = sorted(set(units) - set(parameters)) if type(units) is dict else []
|
|
224
|
+
problem('parameter_units_mismatch', 'mapping', '$.sections.' + section + '.parameter_units',
|
|
225
|
+
'parameter_units须恰好覆盖全部period/factor/global名称;缺少' + repr(missing) + ';多余' + repr(extra))
|
|
226
|
+
typed_parameters = {}
|
|
227
|
+
for name, value in parameters.items():
|
|
228
|
+
try:
|
|
229
|
+
parameter = ExpressionParameter(name, value, units[name])
|
|
230
|
+
except (TypeError, ValueError) as error:
|
|
231
|
+
problem('invalid_parameter', 'mapping', '$.sections.' + section + '.parameter_units.' + name, str(error))
|
|
232
|
+
typed_parameters[name] = {'value': parameter.value, 'unit': parameter.unit}
|
|
233
|
+
expression = _formula(parser.get(section, 'expr', raw=True), signals, parameters,
|
|
234
|
+
mapping['aliases'], fields, headers, section)
|
|
235
|
+
source = next((item for item in analysis['sources'] if item.get('name') == selected['source']), None)
|
|
236
|
+
# 新版本可显式把同一公式映射到文本原始报文,profile如实标识实际读取路径。
|
|
237
|
+
text_source = (source is not None
|
|
238
|
+
and source.get('source_type') in ('can_asc', 'asc_or_blf', 'raw_can_csv'))
|
|
239
|
+
if not text_source and (source is None or source.get('source_type') != 'can_blf'
|
|
240
|
+
or source.get('legacy_profile', PROFILE_ID) != PROFILE_ID):
|
|
241
|
+
problem('invalid_legacy_source', 'mapping', '$.sections.' + section + '.source',
|
|
242
|
+
'需要BLF/sclicer-functions-v1,或schema2明确声明的ASC/原始报文CSV来源')
|
|
243
|
+
profile = 'can-text-v1' if text_source else source.get('legacy_profile', PROFILE_ID)
|
|
244
|
+
for key, original_signal in signals.items():
|
|
245
|
+
definitions = [item for item in analysis['signals'] if item.get('name') == mapping['aliases'][key]]
|
|
246
|
+
if len(definitions) != 1:
|
|
247
|
+
_reject(fields, headers, section, key, 'invalid_signal_field', 'signal_*必须唯一映射至完整CAN信号声明')
|
|
248
|
+
definition = definitions[0]
|
|
249
|
+
try:
|
|
250
|
+
field = field_from_dict(definition.get('field'))
|
|
251
|
+
except (TypeError, ValueError) as error:
|
|
252
|
+
_reject(fields, headers, section, key, 'invalid_signal_field', str(error))
|
|
253
|
+
# alias只替换表达式变量名,不能借同消息同单位偷偷接到另一个原字段。
|
|
254
|
+
if definition.get('source') != selected['source'] or field.signal != original_signal:
|
|
255
|
+
_reject(fields, headers, section, key, 'signal_field_mismatch',
|
|
256
|
+
'目标必须属于本来源且完整CAN定位.signal等于原signal_*文本:' + original_signal)
|
|
257
|
+
direction = parser.get(section, 'disjunction', fallback=None, raw=True)
|
|
258
|
+
direction_alias = None
|
|
259
|
+
if direction:
|
|
260
|
+
direction_alias = mapping['aliases'].get(direction)
|
|
261
|
+
definitions = [item for item in analysis['signals'] if item.get('name') == direction_alias]
|
|
262
|
+
if direction_alias is None or len(definitions) != 1:
|
|
263
|
+
_reject(fields, headers, section, 'disjunction', 'missing_direction_alias', '方向原字段必须显式且唯一映射至信号别名')
|
|
264
|
+
definition = definitions[0]
|
|
265
|
+
try:
|
|
266
|
+
field = field_from_dict(definition.get('field'))
|
|
267
|
+
except (TypeError, ValueError) as error:
|
|
268
|
+
_reject(fields, headers, section, 'disjunction', 'invalid_direction_field', str(error))
|
|
269
|
+
if definition.get('source') != selected['source'] or field.signal != direction:
|
|
270
|
+
_reject(fields, headers, section, 'disjunction', 'direction_field_mismatch', '方向必须属于本来源且完整CAN定位.signal等于原disjunction文本')
|
|
271
|
+
start = len(analysis['message_calculations'])
|
|
272
|
+
buckets = ('positive', 'negative') if direction else (None,)
|
|
273
|
+
base_id = selected['name']
|
|
274
|
+
if type(base_id) is not str:
|
|
275
|
+
problem('invalid_calculation_id', 'mapping', '$.sections.' + section + '.name', 'id必须是原生文本')
|
|
276
|
+
for bucket in buckets:
|
|
277
|
+
calculation = {'name': base_id if bucket is None else base_id + '_' + bucket,
|
|
278
|
+
'source': selected['source'], 'profile': profile, 'operation': 'legacy_sum',
|
|
279
|
+
'update_message': selected['update_message'], 'expr': expression, 'unit': selected['unit'],
|
|
280
|
+
'parameters': typed_parameters, 'message_policy': selected['message_policy']}
|
|
281
|
+
if bucket is not None:
|
|
282
|
+
calculation['split_by_sign'] = {'signal': direction_alias, 'bucket': bucket, 'value_policy': 'raw_decoded-v1'}
|
|
283
|
+
analysis['message_calculations'].append(calculation)
|
|
284
|
+
indexes = tuple(range(start, len(analysis['message_calculations'])))
|
|
285
|
+
_targets(fields, section, 'expr', tuple(f'$.message_calculations[{index}].expr' for index in indexes))
|
|
286
|
+
for key in signals:
|
|
287
|
+
signal_index = next(index for index, item in enumerate(analysis['signals'])
|
|
288
|
+
if item.get('name') == mapping['aliases'][key])
|
|
289
|
+
_targets(fields, section, key, (f'$.signals[{signal_index}].field',))
|
|
290
|
+
for name in parameters:
|
|
291
|
+
origin = 'global' if name in globals_ else section
|
|
292
|
+
_targets(fields, origin, name, tuple(f'$.message_calculations[{index}].parameters.{name}.value' for index in indexes))
|
|
293
|
+
if direction:
|
|
294
|
+
_targets(fields, section, 'disjunction', tuple(f'$.message_calculations[{index}].split_by_sign.signal' for index in indexes))
|
|
295
|
+
old_base = section.replace('integral_', '')
|
|
296
|
+
for index, suffix in zip(indexes, ('+', '-')):
|
|
297
|
+
issues.append(LegacyImportIssue('disjunction_output_mapping', 'ini', field_path(section, 'disjunction'),
|
|
298
|
+
old_base + suffix + ' → ' + analysis['message_calculations'][index]['name'],
|
|
299
|
+
*locate(fields, section, 'disjunction'), level='warning'))
|
|
300
|
+
issues.append(LegacyImportIssue('disjunction_quality_difference', 'ini', field_path(section, 'disjunction'),
|
|
301
|
+
'原值分桶不abs/不施scale或TTL;缺方向记MISSING_INPUT,NaN/±Inf记NONFINITE_INPUT;区别于旧缺失按0及±Inf入桶',
|
|
302
|
+
*locate(fields, section, 'disjunction'), level='warning'))
|
|
303
|
+
elif parser.has_option(section, 'disjunction'):
|
|
304
|
+
mark(fields, section, 'disjunction', None, 'replaced', '原空disjunction不分桶')
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""保存旧配置导入的冻结报告,不把静态转换当作数据运行证明。
|
|
2
|
+
|
|
3
|
+
输入为导入器已经定位的配置事实;输出为固定类型结果和可供CLI写出的原生
|
|
4
|
+
JSON字典。原INI字节单独保留,字段和问题保持原顺序。本模块不读写文件、
|
|
5
|
+
执行表达式或导入任何旧配置对象,失败结果不能携带部分成功计划。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from ..planning import AnalysisPlan
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class LegacyImportIssue:
|
|
17
|
+
"""定位一个错误或明确迁移差异;行列以1开始,非文本位置可为None。"""
|
|
18
|
+
|
|
19
|
+
code: str
|
|
20
|
+
origin: str
|
|
21
|
+
path: str
|
|
22
|
+
message: str
|
|
23
|
+
line: int | None = None
|
|
24
|
+
column: int | None = None
|
|
25
|
+
level: str = 'error'
|
|
26
|
+
|
|
27
|
+
def to_dict(self) -> dict:
|
|
28
|
+
"""转换固定问题字段;参数: 无;返回: JSON对象;异常: 无。"""
|
|
29
|
+
return {name: getattr(self, name) for name in
|
|
30
|
+
('code', 'origin', 'path', 'message', 'line', 'column', 'level')}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class LegacyFieldMapping:
|
|
35
|
+
"""保一项原INI字段、文本定位及处理去向,不因替代I/O丢弃原值。"""
|
|
36
|
+
|
|
37
|
+
origin: str
|
|
38
|
+
path: str
|
|
39
|
+
value: str
|
|
40
|
+
line: int
|
|
41
|
+
column: int
|
|
42
|
+
target: str | None
|
|
43
|
+
status: str
|
|
44
|
+
message: str
|
|
45
|
+
|
|
46
|
+
def to_dict(self) -> dict:
|
|
47
|
+
"""转换固定字段事实;参数: 无;返回: JSON对象;异常: 无。"""
|
|
48
|
+
return {name: getattr(self, name) for name in
|
|
49
|
+
('origin', 'path', 'value', 'line', 'column', 'target', 'status', 'message')}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True)
|
|
53
|
+
class LegacyImportReport:
|
|
54
|
+
"""区分整份成功与失败,SHA只证明配置身份,不证明来源数据已读。"""
|
|
55
|
+
|
|
56
|
+
status: str
|
|
57
|
+
mode: str
|
|
58
|
+
source_name: str
|
|
59
|
+
source_sha256: str
|
|
60
|
+
mapping_identity: str | None
|
|
61
|
+
device_label: str
|
|
62
|
+
fields: tuple[LegacyFieldMapping, ...]
|
|
63
|
+
issues: tuple[LegacyImportIssue, ...]
|
|
64
|
+
plan_identity: str | None
|
|
65
|
+
|
|
66
|
+
def to_dict(self) -> dict:
|
|
67
|
+
"""生成独立JSON报告;参数: 无;返回: dict;异常: 无。
|
|
68
|
+
|
|
69
|
+
流程: 仅展开固定报告对象,原INI和AnalysisPlan不会被反射序列化。
|
|
70
|
+
"""
|
|
71
|
+
return {'status': self.status, 'mode': self.mode, 'source_name': self.source_name,
|
|
72
|
+
'source_sha256': self.source_sha256, 'mapping_identity': self.mapping_identity,
|
|
73
|
+
'device_label': self.device_label, 'fields': [item.to_dict() for item in self.fields],
|
|
74
|
+
'issues': [item.to_dict() for item in self.issues], 'plan_identity': self.plan_identity}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@dataclass(frozen=True)
|
|
78
|
+
class LegacyImportResult:
|
|
79
|
+
"""返回完整计划或None,同时保留同一个不可变原INI字节对象。"""
|
|
80
|
+
|
|
81
|
+
plan: 'AnalysisPlan | None'
|
|
82
|
+
report: LegacyImportReport
|
|
83
|
+
original_ini: bytes
|