zepben.ewb 1.0.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.
- zepben/ewb/__init__.py +601 -0
- zepben/ewb/auth/__init__.py +10 -0
- zepben/ewb/auth/client/__init__.py +5 -0
- zepben/ewb/auth/client/zepben_token_fetcher.py +273 -0
- zepben/ewb/auth/common/__init__.py +5 -0
- zepben/ewb/auth/common/auth_exception.py +16 -0
- zepben/ewb/auth/common/auth_method.py +28 -0
- zepben/ewb/auth/common/auth_provider_config.py +96 -0
- zepben/ewb/database/__init__.py +4 -0
- zepben/ewb/database/paths/__init__.py +4 -0
- zepben/ewb/database/paths/database_type.py +34 -0
- zepben/ewb/database/paths/ewb_data_file_paths.py +237 -0
- zepben/ewb/database/sql/__init__.py +4 -0
- zepben/ewb/database/sql/column.py +37 -0
- zepben/ewb/database/sql/sql_table.py +142 -0
- zepben/ewb/database/sqlite/__init__.py +4 -0
- zepben/ewb/database/sqlite/common/__init__.py +4 -0
- zepben/ewb/database/sqlite/common/base_cim_reader.py +212 -0
- zepben/ewb/database/sqlite/common/base_cim_writer.py +159 -0
- zepben/ewb/database/sqlite/common/base_collection_reader.py +96 -0
- zepben/ewb/database/sqlite/common/base_collection_writer.py +73 -0
- zepben/ewb/database/sqlite/common/base_database_reader.py +127 -0
- zepben/ewb/database/sqlite/common/base_database_tables.py +137 -0
- zepben/ewb/database/sqlite/common/base_database_writer.py +195 -0
- zepben/ewb/database/sqlite/common/base_entry_writer.py +34 -0
- zepben/ewb/database/sqlite/common/base_service_reader.py +50 -0
- zepben/ewb/database/sqlite/common/base_service_writer.py +104 -0
- zepben/ewb/database/sqlite/common/metadata_collection_reader.py +39 -0
- zepben/ewb/database/sqlite/common/metadata_collection_writer.py +38 -0
- zepben/ewb/database/sqlite/common/metadata_entry_reader.py +45 -0
- zepben/ewb/database/sqlite/common/metadata_entry_writer.py +41 -0
- zepben/ewb/database/sqlite/common/reader_exceptions.py +30 -0
- zepben/ewb/database/sqlite/customer/__init__.py +4 -0
- zepben/ewb/database/sqlite/customer/customer_cim_reader.py +169 -0
- zepben/ewb/database/sqlite/customer/customer_cim_writer.py +137 -0
- zepben/ewb/database/sqlite/customer/customer_database_reader.py +44 -0
- zepben/ewb/database/sqlite/customer/customer_database_tables.py +37 -0
- zepben/ewb/database/sqlite/customer/customer_database_writer.py +45 -0
- zepben/ewb/database/sqlite/customer/customer_service_reader.py +57 -0
- zepben/ewb/database/sqlite/customer/customer_service_writer.py +47 -0
- zepben/ewb/database/sqlite/diagram/__init__.py +4 -0
- zepben/ewb/database/sqlite/diagram/diagram_cim_reader.py +105 -0
- zepben/ewb/database/sqlite/diagram/diagram_cim_writer.py +81 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_reader.py +45 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_tables.py +29 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_writer.py +44 -0
- zepben/ewb/database/sqlite/diagram/diagram_service_reader.py +49 -0
- zepben/ewb/database/sqlite/diagram/diagram_service_writer.py +41 -0
- zepben/ewb/database/sqlite/extensions/__init__.py +4 -0
- zepben/ewb/database/sqlite/extensions/prepared_statement.py +112 -0
- zepben/ewb/database/sqlite/extensions/result_set.py +153 -0
- zepben/ewb/database/sqlite/network/__init__.py +4 -0
- zepben/ewb/database/sqlite/network/network_cim_reader.py +3167 -0
- zepben/ewb/database/sqlite/network/network_cim_writer.py +2561 -0
- zepben/ewb/database/sqlite/network/network_database_reader.py +175 -0
- zepben/ewb/database/sqlite/network/network_database_tables.py +242 -0
- zepben/ewb/database/sqlite/network/network_database_writer.py +43 -0
- zepben/ewb/database/sqlite/network/network_service_reader.py +265 -0
- zepben/ewb/database/sqlite/network/network_service_writer.py +209 -0
- zepben/ewb/database/sqlite/tables/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/associations/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/associations/loop_substation_relationship.py +17 -0
- zepben/ewb/database/sqlite/tables/associations/table_asset_organisation_roles_assets.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_assets_power_system_resources.py +41 -0
- zepben/ewb/database/sqlite/tables/associations/table_battery_units_battery_controls.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_circuits_substations.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_circuits_terminals.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_customer_agreements_pricing_structures.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_end_devices_end_device_functions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_equipment_containers.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_operational_restrictions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_usage_points.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_loops_substations.py +43 -0
- zepben/ewb/database/sqlite/tables/associations/table_pricing_structures_tariffs.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_protected_switches.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_sensors.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_schemes_protection_relay_functions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_synchronous_machines_reactive_capability_curves.py +39 -0
- zepben/ewb/database/sqlite/tables/associations/table_usage_points_end_devices.py +40 -0
- zepben/ewb/database/sqlite/tables/exceptions.py +10 -0
- zepben/ewb/database/sqlite/tables/extensions/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_reclose_delays.py +38 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_relay_info.py +21 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/table_pan_demand_response_functions.py +21 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/table_sites.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_loops.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_lv_feeders.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/table_ev_charging_units.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_distance_relays.py +28 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_thresholds.py +36 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_time_limits.py +34 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_functions.py +24 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_schemes.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_systems.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_voltage_relays.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_battery_controls.py +23 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_power_transformer_end_ratings.py +34 -0
- zepben/ewb/database/sqlite/tables/iec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_cable_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_no_load_tests.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_open_circuit_tests.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_overhead_wire_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_power_transformer_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_short_circuit_tests.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_shunt_compensator_info.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_switch_info.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_end_info.py +46 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_tank_info.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_test.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_wire_info.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_functions.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_info.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_organisation_roles.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_owners.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_assets.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_streetlights.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_structures.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_agreements.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_address_field.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_addresses.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_locations.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_organisation_roles.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_organisations.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_position_points.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_town_details.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_customer_agreements.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_customers.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_pricing_structures.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_tariffs.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_current_transformer_info.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_potential_transformer_info.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_device_functions.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_devices.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_meters.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_usage_points.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/operations/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/operations/table_operational_restrictions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_auxiliary_equipment.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_current_transformers.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_fault_indicators.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_potential_transformers.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_sensors.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_ac_dc_terminals.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_base_voltages.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_conducting_equipment.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_node_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_nodes.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curve_data.py +46 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curves.py +17 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_feeders.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_geographical_regions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_name_types.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_names.py +36 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_sub_geographical_regions.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_substations.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_terminals.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_object_points.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_objects.py +31 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagrams.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_branches.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_equipment.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_battery_units.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_photo_voltaic_units.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_units.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_wind_units.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_accumulators.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_controls.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_discretes.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_io_points.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_measurements.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/protection/table_current_relays.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_controls.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_points.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_sources.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ac_line_segments.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_breakers.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_busbar_sections.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_clamps.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_conductors.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_connectors.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_cuts.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_disconnectors.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_earth_fault_compensators.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_connections.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumer_phases.py +37 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_source_phases.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py +44 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_fuses.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ground_disconnectors.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounding_impedances.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounds.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_jumpers.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_junctions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_linear_shunt_compensators.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_lines.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_load_break_switches.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_impedances.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_line_parameters.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_phase_impedances.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_sequence_impedances.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_petersen_coils.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_phase_impedance_data.py +52 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connection_phases.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connections.py +50 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformer_ends.py +43 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformers.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_protected_switches.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ratio_tap_changers.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reactive_capability_curves.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reclosers.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_controls.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_rotating_machines.py +36 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_series_compensators.py +25 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_static_var_compensator.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_switches.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_synchronous_machines.py +95 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changer_controls.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py +25 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_star_impedances.py +32 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/table_circuits.py +27 -0
- zepben/ewb/database/sqlite/tables/sqlite_table.py +45 -0
- zepben/ewb/database/sqlite/tables/table_metadata_data_sources.py +21 -0
- zepben/ewb/database/sqlite/tables/table_version.py +39 -0
- zepben/ewb/dataclassy/__init__.py +15 -0
- zepben/ewb/dataclassy/dataclass.py +192 -0
- zepben/ewb/dataclassy/decorator.py +35 -0
- zepben/ewb/dataclassy/functions.py +80 -0
- zepben/ewb/examples/__init__.py +6 -0
- zepben/ewb/examples/simple_test_network.py +158 -0
- zepben/ewb/exceptions.py +52 -0
- zepben/ewb/model/__init__.py +4 -0
- zepben/ewb/model/busbranch/__init__.py +4 -0
- zepben/ewb/model/busbranch/bus_branch.py +1051 -0
- zepben/ewb/model/cim/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py +128 -0
- zepben/ewb/model/cim/extensions/iec61968/metering/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py +112 -0
- zepben/ewb/model/cim/extensions/iec61970/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/core/site.py +37 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py +207 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_feeder.py +258 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/production/ev_charging_unit.py +18 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/distance_relay.py +69 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/power_direction_kind.py +36 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_kind.py +112 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py +448 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_scheme.py +97 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_system.py +97 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/relay_setting.py +35 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/voltage_relay.py +20 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control.py +36 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control_mode.py +83 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_cooling_type.py +57 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_end_rated_s.py +26 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/vector_group.py +293 -0
- zepben/ewb/model/cim/extensions/zbex.py +17 -0
- zepben/ewb/model/cim/iec61968/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assetinfo/cable_info.py +15 -0
- zepben/ewb/model/cim/iec61968/assetinfo/no_load_test.py +42 -0
- zepben/ewb/model/cim/iec61968/assetinfo/open_circuit_test.py +42 -0
- zepben/ewb/model/cim/iec61968/assetinfo/overhead_wire_info.py +15 -0
- zepben/ewb/model/cim/iec61968/assetinfo/power_transformer_info.py +103 -0
- zepben/ewb/model/cim/iec61968/assetinfo/short_circuit_test.py +67 -0
- zepben/ewb/model/cim/iec61968/assetinfo/shunt_compensator_info.py +26 -0
- zepben/ewb/model/cim/iec61968/assetinfo/switch_info.py +17 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_end_info.py +137 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_tank_info.py +108 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_test.py +26 -0
- zepben/ewb/model/cim/iec61968/assetinfo/wire_info.py +24 -0
- zepben/ewb/model/cim/iec61968/assetinfo/wire_material_kind.py +57 -0
- zepben/ewb/model/cim/iec61968/assets/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assets/asset.py +154 -0
- zepben/ewb/model/cim/iec61968/assets/asset_container.py +16 -0
- zepben/ewb/model/cim/iec61968/assets/asset_function.py +15 -0
- zepben/ewb/model/cim/iec61968/assets/asset_info.py +19 -0
- zepben/ewb/model/cim/iec61968/assets/asset_organisation_role.py +13 -0
- zepben/ewb/model/cim/iec61968/assets/asset_owner.py +13 -0
- zepben/ewb/model/cim/iec61968/assets/streetlight.py +29 -0
- zepben/ewb/model/cim/iec61968/assets/structure.py +16 -0
- zepben/ewb/model/cim/iec61968/common/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/common/agreement.py +16 -0
- zepben/ewb/model/cim/iec61968/common/document.py +36 -0
- zepben/ewb/model/cim/iec61968/common/location.py +129 -0
- zepben/ewb/model/cim/iec61968/common/organisation.py +15 -0
- zepben/ewb/model/cim/iec61968/common/organisation_role.py +22 -0
- zepben/ewb/model/cim/iec61968/common/position_point.py +44 -0
- zepben/ewb/model/cim/iec61968/common/street_address.py +28 -0
- zepben/ewb/model/cim/iec61968/common/street_detail.py +46 -0
- zepben/ewb/model/cim/iec61968/common/town_detail.py +25 -0
- zepben/ewb/model/cim/iec61968/customers/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/customers/customer.py +93 -0
- zepben/ewb/model/cim/iec61968/customers/customer_agreement.py +107 -0
- zepben/ewb/model/cim/iec61968/customers/customer_kind.py +69 -0
- zepben/ewb/model/cim/iec61968/customers/pricing_structure.py +88 -0
- zepben/ewb/model/cim/iec61968/customers/tariff.py +18 -0
- zepben/ewb/model/cim/iec61968/infiec61968/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/current_transformer_info.py +51 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/potential_transformer_info.py +33 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_construction_kind.py +69 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_function_kind.py +45 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py +87 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/streetlight_lamp_kind.py +27 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infcommon/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infcommon/ratio.py +34 -0
- zepben/ewb/model/cim/iec61968/metering/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/metering/controlled_appliance.py +152 -0
- zepben/ewb/model/cim/iec61968/metering/end_device.py +165 -0
- zepben/ewb/model/cim/iec61968/metering/end_device_function.py +17 -0
- zepben/ewb/model/cim/iec61968/metering/end_device_function_kind.py +48 -0
- zepben/ewb/model/cim/iec61968/metering/meter.py +28 -0
- zepben/ewb/model/cim/iec61968/metering/usage_point.py +186 -0
- zepben/ewb/model/cim/iec61968/operations/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/operations/operational_restriction.py +92 -0
- zepben/ewb/model/cim/iec61970/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/auxiliary_equipment.py +24 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py +37 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/fault_indicator.py +18 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py +38 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer_kind.py +30 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/sensor.py +92 -0
- zepben/ewb/model/cim/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/core/ac_dc_terminal.py +16 -0
- zepben/ewb/model/cim/iec61970/base/core/base_voltage.py +17 -0
- zepben/ewb/model/cim/iec61970/base/core/conducting_equipment.py +198 -0
- zepben/ewb/model/cim/iec61970/base/core/connectivity_node.py +105 -0
- zepben/ewb/model/cim/iec61970/base/core/connectivity_node_container.py +15 -0
- zepben/ewb/model/cim/iec61970/base/core/curve.py +125 -0
- zepben/ewb/model/cim/iec61970/base/core/curve_data.py +29 -0
- zepben/ewb/model/cim/iec61970/base/core/equipment.py +366 -0
- zepben/ewb/model/cim/iec61970/base/core/equipment_container.py +199 -0
- zepben/ewb/model/cim/iec61970/base/core/feeder.py +260 -0
- zepben/ewb/model/cim/iec61970/base/core/geographical_region.py +82 -0
- zepben/ewb/model/cim/iec61970/base/core/identified_object.py +239 -0
- zepben/ewb/model/cim/iec61970/base/core/name.py +36 -0
- zepben/ewb/model/cim/iec61970/base/core/name_type.py +203 -0
- zepben/ewb/model/cim/iec61970/base/core/phase_code.py +202 -0
- zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py +106 -0
- zepben/ewb/model/cim/iec61970/base/core/sub_geographical_region.py +93 -0
- zepben/ewb/model/cim/iec61970/base/core/substation.py +277 -0
- zepben/ewb/model/cim/iec61970/base/core/terminal.py +171 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram.py +109 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py +160 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object_point.py +25 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_style.py +28 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/orientation_kind.py +29 -0
- zepben/ewb/model/cim/iec61970/base/domain/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/domain/unit_symbol.py +494 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_branch.py +113 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_equipment.py +15 -0
- zepben/ewb/model/cim/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/battery_state_kind.py +39 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/battery_unit.py +108 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/photo_voltaic_unit.py +13 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_unit.py +28 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_wind_unit.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/meas/accumulator.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/accumulator_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/analog.py +18 -0
- zepben/ewb/model/cim/iec61970/base/meas/analog_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/control.py +26 -0
- zepben/ewb/model/cim/iec61970/base/meas/discrete.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/discrete_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/iopoint.py +16 -0
- zepben/ewb/model/cim/iec61970/base/meas/measurement.py +60 -0
- zepben/ewb/model/cim/iec61970/base/meas/measurement_value.py +21 -0
- zepben/ewb/model/cim/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/protection/current_relay.py +23 -0
- zepben/ewb/model/cim/iec61970/base/scada/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_control.py +22 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_point.py +16 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_source.py +22 -0
- zepben/ewb/model/cim/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py +214 -0
- zepben/ewb/model/cim/iec61970/base/wires/breaker.py +32 -0
- zepben/ewb/model/cim/iec61970/base/wires/busbar_section.py +19 -0
- zepben/ewb/model/cim/iec61970/base/wires/clamp.py +32 -0
- zepben/ewb/model/cim/iec61970/base/wires/conductor.py +49 -0
- zepben/ewb/model/cim/iec61970/base/wires/connector.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/cut.py +36 -0
- zepben/ewb/model/cim/iec61970/base/wires/disconnector.py +17 -0
- zepben/ewb/model/cim/iec61970/base/wires/earth_fault_compensator.py +21 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_connection.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py +107 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_consumer_phase.py +56 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_source.py +172 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_source_phase.py +45 -0
- zepben/ewb/model/cim/iec61970/base/wires/fuse.py +23 -0
- zepben/ewb/model/cim/iec61970/base/wires/ground.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/ground_disconnector.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/grounding_impedance.py +19 -0
- zepben/ewb/model/cim/iec61970/base/wires/jumper.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/junction.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/line.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/linear_shunt_compensator.py +26 -0
- zepben/ewb/model/cim/iec61970/base/wires/load_break_switch.py +14 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_impedance.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_line_parameter.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_phase_impedance.py +99 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_sequence_impedance.py +43 -0
- zepben/ewb/model/cim/iec61970/base/wires/petersen_coil.py +22 -0
- zepben/ewb/model/cim/iec61970/base/wires/phase_impedance_data.py +37 -0
- zepben/ewb/model/cim/iec61970/base/wires/phase_shunt_connection_kind.py +40 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection.py +524 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection_phase.py +34 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py +217 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py +208 -0
- zepben/ewb/model/cim/iec61970/base/wires/protected_switch.py +96 -0
- zepben/ewb/model/cim/iec61970/base/wires/ratio_tap_changer.py +30 -0
- zepben/ewb/model/cim/iec61970/base/wires/reactive_capability_curve.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/recloser.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +45 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py +173 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_control_mode_kind.py +48 -0
- zepben/ewb/model/cim/iec61970/base/wires/rotating_machine.py +36 -0
- zepben/ewb/model/cim/iec61970/base/wires/series_compensator.py +42 -0
- zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py +59 -0
- zepben/ewb/model/cim/iec61970/base/wires/single_phase_kind.py +107 -0
- zepben/ewb/model/cim/iec61970/base/wires/static_var_compensator.py +40 -0
- zepben/ewb/model/cim/iec61970/base/wires/svc_control_mode.py +30 -0
- zepben/ewb/model/cim/iec61970/base/wires/switch.py +119 -0
- zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py +168 -0
- zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine_kind.py +46 -0
- zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py +150 -0
- zepben/ewb/model/cim/iec61970/base/wires/tap_changer_control.py +49 -0
- zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py +73 -0
- zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py +48 -0
- zepben/ewb/model/cim/iec61970/base/wires/winding_connection.py +45 -0
- zepben/ewb/model/cim/iec61970/infiec61970/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/infiec61970/feeder/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/infiec61970/feeder/circuit.py +144 -0
- zepben/ewb/model/phases.py +168 -0
- zepben/ewb/model/resistance_reactance.py +40 -0
- zepben/ewb/services/__init__.py +4 -0
- zepben/ewb/services/common/__init__.py +16 -0
- zepben/ewb/services/common/base_service.py +383 -0
- zepben/ewb/services/common/base_service_comparator.py +394 -0
- zepben/ewb/services/common/difference.py +47 -0
- zepben/ewb/services/common/enum_mapper.py +55 -0
- zepben/ewb/services/common/meta/__init__.py +4 -0
- zepben/ewb/services/common/meta/data_source.py +16 -0
- zepben/ewb/services/common/meta/metadata_collection.py +28 -0
- zepben/ewb/services/common/meta/metadata_translations.py +47 -0
- zepben/ewb/services/common/meta/service_info.py +22 -0
- zepben/ewb/services/common/reference_resolvers.py +374 -0
- zepben/ewb/services/common/resolver.py +597 -0
- zepben/ewb/services/common/translator/__init__.py +4 -0
- zepben/ewb/services/common/translator/base_cim2proto.py +115 -0
- zepben/ewb/services/common/translator/base_proto2cim.py +146 -0
- zepben/ewb/services/common/translator/service_differences.py +81 -0
- zepben/ewb/services/common/translator/util.py +75 -0
- zepben/ewb/services/customer/__init__.py +4 -0
- zepben/ewb/services/customer/customer_service_comparator.py +52 -0
- zepben/ewb/services/customer/customers.py +23 -0
- zepben/ewb/services/customer/translator/__init__.py +21 -0
- zepben/ewb/services/customer/translator/customer_cim2proto.py +71 -0
- zepben/ewb/services/customer/translator/customer_enum_mappers.py +18 -0
- zepben/ewb/services/customer/translator/customer_proto2cim.py +87 -0
- zepben/ewb/services/diagram/__init__.py +4 -0
- zepben/ewb/services/diagram/diagram_service_comparator.py +39 -0
- zepben/ewb/services/diagram/diagrams.py +107 -0
- zepben/ewb/services/diagram/translator/__init__.py +11 -0
- zepben/ewb/services/diagram/translator/diagram_cim2proto.py +51 -0
- zepben/ewb/services/diagram/translator/diagram_enum_mappers.py +21 -0
- zepben/ewb/services/diagram/translator/diagram_proto2cim.py +61 -0
- zepben/ewb/services/measurement/__init__.py +4 -0
- zepben/ewb/services/measurement/measurements.py +35 -0
- zepben/ewb/services/measurement/translator/__init__.py +6 -0
- zepben/ewb/services/measurement/translator/measurement_cim2proto.py +42 -0
- zepben/ewb/services/measurement/translator/measurement_proto2cim.py +52 -0
- zepben/ewb/services/network/__init__.py +4 -0
- zepben/ewb/services/network/network_extensions.py +119 -0
- zepben/ewb/services/network/network_service.py +302 -0
- zepben/ewb/services/network/network_service_comparator.py +1322 -0
- zepben/ewb/services/network/network_state.py +36 -0
- zepben/ewb/services/network/tracing/__init__.py +4 -0
- zepben/ewb/services/network/tracing/busbranch_trace.py +36 -0
- zepben/ewb/services/network/tracing/connectivity/__init__.py +4 -0
- zepben/ewb/services/network/tracing/connectivity/connectivity_result.py +105 -0
- zepben/ewb/services/network/tracing/connectivity/nominal_phase_path.py +23 -0
- zepben/ewb/services/network/tracing/connectivity/phase_paths.py +70 -0
- zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py +226 -0
- zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_internal.py +64 -0
- zepben/ewb/services/network/tracing/connectivity/transformer_phase_paths.py +202 -0
- zepben/ewb/services/network/tracing/connectivity/xy_candidate_phase_paths.py +235 -0
- zepben/ewb/services/network/tracing/connectivity/xy_phase_step.py +24 -0
- zepben/ewb/services/network/tracing/feeder/__init__.py +4 -0
- zepben/ewb/services/network/tracing/feeder/assign_to_feeders.py +202 -0
- zepben/ewb/services/network/tracing/feeder/assign_to_lv_feeders.py +202 -0
- zepben/ewb/services/network/tracing/feeder/clear_direction.py +80 -0
- zepben/ewb/services/network/tracing/feeder/direction_status.py +133 -0
- zepben/ewb/services/network/tracing/feeder/feeder_direction.py +107 -0
- zepben/ewb/services/network/tracing/feeder/set_direction.py +143 -0
- zepben/ewb/services/network/tracing/find_swer_equipment.py +175 -0
- zepben/ewb/services/network/tracing/networktrace/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/actions/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py +104 -0
- zepben/ewb/services/network/tracing/networktrace/actions/tree_node.py +35 -0
- zepben/ewb/services/network/tracing/networktrace/compute_data.py +60 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py +73 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/direction_condition.py +63 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/equipment_step_limit_condition.py +26 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/equipment_type_step_limit_condition.py +44 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_queue_condition.py +67 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_stop_condition.py +65 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/open_condition.py +39 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace.py +433 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_action_type.py +42 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_queue_next.py +84 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_step.py +128 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_step_path_provider.py +351 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_tracker.py +39 -0
- zepben/ewb/services/network/tracing/networktrace/operators/__init__.py +14 -0
- zepben/ewb/services/network/tracing/networktrace/operators/equipment_container_state_operators.py +264 -0
- zepben/ewb/services/network/tracing/networktrace/operators/feeder_direction_state_operations.py +181 -0
- zepben/ewb/services/network/tracing/networktrace/operators/in_service_state_operators.py +76 -0
- zepben/ewb/services/network/tracing/networktrace/operators/network_state_operators.py +120 -0
- zepben/ewb/services/network/tracing/networktrace/operators/open_state_operators.py +104 -0
- zepben/ewb/services/network/tracing/networktrace/operators/phase_state_operators.py +56 -0
- zepben/ewb/services/network/tracing/networktrace/tracing.py +132 -0
- zepben/ewb/services/network/tracing/phases/__init__.py +4 -0
- zepben/ewb/services/network/tracing/phases/phase_inferrer.py +205 -0
- zepben/ewb/services/network/tracing/phases/phase_status.py +101 -0
- zepben/ewb/services/network/tracing/phases/remove_phases.py +143 -0
- zepben/ewb/services/network/tracing/phases/set_phases.py +490 -0
- zepben/ewb/services/network/tracing/traversal/__init__.py +4 -0
- zepben/ewb/services/network/tracing/traversal/context_value_computer.py +63 -0
- zepben/ewb/services/network/tracing/traversal/debug_logging.py +124 -0
- zepben/ewb/services/network/tracing/traversal/queue.py +112 -0
- zepben/ewb/services/network/tracing/traversal/queue_condition.py +75 -0
- zepben/ewb/services/network/tracing/traversal/step_action.py +83 -0
- zepben/ewb/services/network/tracing/traversal/step_context.py +59 -0
- zepben/ewb/services/network/tracing/traversal/stop_condition.py +57 -0
- zepben/ewb/services/network/tracing/traversal/traversal.py +634 -0
- zepben/ewb/services/network/tracing/traversal/traversal_condition.py +22 -0
- zepben/ewb/services/network/tracing/traversal/weighted_priority_queue.py +85 -0
- zepben/ewb/services/network/tracing/util.py +93 -0
- zepben/ewb/services/network/translator/__init__.py +392 -0
- zepben/ewb/services/network/translator/network_cim2proto.py +1867 -0
- zepben/ewb/services/network/translator/network_enum_mappers.py +78 -0
- zepben/ewb/services/network/translator/network_proto2cim.py +2201 -0
- zepben/ewb/services/services.py +48 -0
- zepben/ewb/streaming/__init__.py +4 -0
- zepben/ewb/streaming/data/__init__.py +4 -0
- zepben/ewb/streaming/data/current_state_event.py +314 -0
- zepben/ewb/streaming/data/current_state_event_batch.py +25 -0
- zepben/ewb/streaming/data/set_current_states_status.py +286 -0
- zepben/ewb/streaming/exceptions.py +14 -0
- zepben/ewb/streaming/get/__init__.py +4 -0
- zepben/ewb/streaming/get/consumer.py +209 -0
- zepben/ewb/streaming/get/customer_consumer.py +111 -0
- zepben/ewb/streaming/get/diagram_consumer.py +107 -0
- zepben/ewb/streaming/get/hierarchy/__init__.py +4 -0
- zepben/ewb/streaming/get/hierarchy/data.py +27 -0
- zepben/ewb/streaming/get/included_energized_containers.py +36 -0
- zepben/ewb/streaming/get/included_energizing_containers.py +36 -0
- zepben/ewb/streaming/get/network_consumer.py +870 -0
- zepben/ewb/streaming/get/query_network_state_client.py +64 -0
- zepben/ewb/streaming/get/query_network_state_service.py +94 -0
- zepben/ewb/streaming/grpc/__init__.py +4 -0
- zepben/ewb/streaming/grpc/auth_token_plugin.py +24 -0
- zepben/ewb/streaming/grpc/connect.py +209 -0
- zepben/ewb/streaming/grpc/grpc.py +107 -0
- zepben/ewb/streaming/grpc/grpc_channel_builder.py +190 -0
- zepben/ewb/streaming/mutations/__init__.py +4 -0
- zepben/ewb/streaming/mutations/update_network_state_client.py +80 -0
- zepben/ewb/streaming/mutations/update_network_state_service.py +61 -0
- zepben/ewb/testing/__init__.py +4 -0
- zepben/ewb/testing/test_network_builder.py +816 -0
- zepben/ewb/types.py +17 -0
- zepben/ewb/util.py +200 -0
- zepben_ewb-1.0.0.dist-info/METADATA +90 -0
- zepben_ewb-1.0.0.dist-info/RECORD +641 -0
- zepben_ewb-1.0.0.dist-info/WHEEL +5 -0
- zepben_ewb-1.0.0.dist-info/licenses/LICENSE +374 -0
- zepben_ewb-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,634 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ["QueueConditionTypes", "StopConditionTypes", "ConditionTypes", "StepActionTypes", "Traversal"]
|
|
9
|
+
|
|
10
|
+
import inspect
|
|
11
|
+
from abc import abstractmethod
|
|
12
|
+
from collections import deque
|
|
13
|
+
from collections.abc import Callable
|
|
14
|
+
from functools import singledispatchmethod
|
|
15
|
+
from logging import Logger
|
|
16
|
+
from typing import List, TypeVar, Generic, Optional, Dict, Union
|
|
17
|
+
|
|
18
|
+
from zepben.ewb import require
|
|
19
|
+
from zepben.ewb.services.network.tracing.traversal.context_value_computer import ContextValueComputer
|
|
20
|
+
from zepben.ewb.services.network.tracing.traversal.debug_logging import DebugLoggingWrapper
|
|
21
|
+
from zepben.ewb.services.network.tracing.traversal.queue import TraversalQueue
|
|
22
|
+
from zepben.ewb.services.network.tracing.traversal.queue_condition import QueueCondition, QueueConditionWithContextValue, ShouldQueue
|
|
23
|
+
from zepben.ewb.services.network.tracing.traversal.step_action import StepAction, StepActionWithContextValue, StepActionFunc
|
|
24
|
+
from zepben.ewb.services.network.tracing.traversal.step_context import StepContext
|
|
25
|
+
from zepben.ewb.services.network.tracing.traversal.stop_condition import StopCondition, StopConditionWithContextValue, ShouldStop
|
|
26
|
+
|
|
27
|
+
T = TypeVar('T')
|
|
28
|
+
U = TypeVar('U')
|
|
29
|
+
D = TypeVar('D', bound='Traversal')
|
|
30
|
+
QT = TypeVar('QT')
|
|
31
|
+
QD = TypeVar('QD')
|
|
32
|
+
|
|
33
|
+
QueueConditionTypes = Union[ShouldQueue, QueueCondition[T]]
|
|
34
|
+
StopConditionTypes = Union[ShouldStop, StopCondition[T]]
|
|
35
|
+
ConditionTypes = Union[QueueConditionTypes, StopConditionTypes]
|
|
36
|
+
StepActionTypes = Union[StepActionFunc, StepAction]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class Traversal(Generic[T, D]):
|
|
40
|
+
"""
|
|
41
|
+
A base traversal class allowing items in a connected graph to be traced.
|
|
42
|
+
It provides the main interface and implementation for traversal logic.
|
|
43
|
+
This class manages conditions, actions, and context values that guide each
|
|
44
|
+
traversal step.
|
|
45
|
+
|
|
46
|
+
This class supports a concept of 'branching', whereby when a new branch is
|
|
47
|
+
created a new child traversal instance is created. The child inherits its
|
|
48
|
+
parents conditions, actions and what it has tracked. However, it knows nothing
|
|
49
|
+
about what its siblings have tracked. This allows traversing both ways around
|
|
50
|
+
loops in the graph.
|
|
51
|
+
|
|
52
|
+
This class is abstract to allow for type-specific implementations for branching
|
|
53
|
+
traversals and custom start item handling.
|
|
54
|
+
|
|
55
|
+
This class is **not thread safe**.
|
|
56
|
+
|
|
57
|
+
`T` The type of object to be traversed.
|
|
58
|
+
`D` The specific type of traversal, extending :class:`Traversal`.
|
|
59
|
+
|
|
60
|
+
:var name: The name of the traversal. Can be used for logging purposes and will be included in all debug logging.
|
|
61
|
+
:var _queue_type: The type of queue to use for processing this traversal.
|
|
62
|
+
:var _parent: The parent traversal, or None if this is a root level traversal. Primarily used to track branching traversals.
|
|
63
|
+
:var _debug_logger: An optional logger to add information about how the trace is processing items.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
class QueueType(Generic[QT, QD]):
|
|
67
|
+
"""
|
|
68
|
+
Defines the types of queues used in the traversal.
|
|
69
|
+
|
|
70
|
+
:var queue_next: Logic for queueing the next item in the traversal.
|
|
71
|
+
:var queue: The primary queue of items.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
queue_next: Traversal.QueueNext[QT]
|
|
75
|
+
queue: TraversalQueue[QT]
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
@abstractmethod
|
|
79
|
+
def queue(self) -> TraversalQueue[QT]:
|
|
80
|
+
raise NotImplementedError
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def branch_queue(self) -> Optional[TraversalQueue[QD]]:
|
|
84
|
+
raise NotImplementedError
|
|
85
|
+
|
|
86
|
+
class BasicQueueType(QueueType[QT, QD]):
|
|
87
|
+
"""
|
|
88
|
+
Basic queue type that handles non-branching item queuing.
|
|
89
|
+
|
|
90
|
+
:param queue_next: Logic for queueing the next item in the traversal.
|
|
91
|
+
:param queue: The primary queue of items.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __init__(self, queue_next: Traversal.QueueNext[QT], queue: TraversalQueue[QT]):
|
|
95
|
+
self.queue_next = queue_next
|
|
96
|
+
self._queue = queue
|
|
97
|
+
self._branch_queue = None
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def queue(self) -> TraversalQueue[QT]:
|
|
101
|
+
"""The primary queue of items."""
|
|
102
|
+
return self._queue
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def branch_queue(self) -> Optional[TraversalQueue[QD]]:
|
|
106
|
+
return self._branch_queue
|
|
107
|
+
|
|
108
|
+
class BranchingQueueType(QueueType[QT, QD]):
|
|
109
|
+
"""
|
|
110
|
+
Branching queue type, supporting operations that may split into separate
|
|
111
|
+
branches during traversal.
|
|
112
|
+
|
|
113
|
+
:param queue_next: Logic for queueing the next item in a branching traversal.
|
|
114
|
+
:param queue_factory: Factory function to create the main queue.
|
|
115
|
+
:param branch_queue_factory: Factory function to create the branch queue.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
def __init__(
|
|
119
|
+
self,
|
|
120
|
+
queue_next: Traversal.BranchingQueueNext[QT],
|
|
121
|
+
queue_factory: Callable[[], TraversalQueue[QT]],
|
|
122
|
+
branch_queue_factory: Callable[[], TraversalQueue[QD]],
|
|
123
|
+
):
|
|
124
|
+
self.queue_next: Traversal.BranchingQueueNext[QT] = queue_next
|
|
125
|
+
self.queue_factory = queue_factory
|
|
126
|
+
self.branch_queue_factory = branch_queue_factory
|
|
127
|
+
|
|
128
|
+
@property
|
|
129
|
+
def queue(self) -> TraversalQueue[QT]:
|
|
130
|
+
return self.queue_factory()
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def branch_queue(self) -> Optional[TraversalQueue[QD]]:
|
|
134
|
+
return self.branch_queue_factory()
|
|
135
|
+
|
|
136
|
+
name: str
|
|
137
|
+
|
|
138
|
+
def __init__(self, queue_type, parent: Optional[D] = None, debug_logger: Logger = None):
|
|
139
|
+
self._queue_type = queue_type
|
|
140
|
+
self._parent: D = parent
|
|
141
|
+
self._debug_logger = DebugLoggingWrapper(self.name, debug_logger) if debug_logger else None
|
|
142
|
+
|
|
143
|
+
if type(queue_type) == Traversal.BasicQueueType:
|
|
144
|
+
self.queue_next = lambda current, context: self._queue_next_non_branching(current, context, self._queue_type.queue_next)
|
|
145
|
+
elif type(queue_type) == Traversal.BranchingQueueType:
|
|
146
|
+
self.queue_next = lambda current, context: self._queue_next_branching(current, context, self._queue_type.queue_next)
|
|
147
|
+
|
|
148
|
+
self.queue: TraversalQueue[T] = queue_type.queue
|
|
149
|
+
self.branch_queue: Optional[TraversalQueue[D]] = queue_type.branch_queue
|
|
150
|
+
self.start_items: deque[T] = deque()
|
|
151
|
+
|
|
152
|
+
self.running: bool = False
|
|
153
|
+
|
|
154
|
+
self.has_run: bool = False
|
|
155
|
+
self.stop_conditions: List[StopCondition[T]] = []
|
|
156
|
+
self.queue_conditions: List[QueueCondition[T]] = []
|
|
157
|
+
self.step_actions: List[StepAction[T]] = []
|
|
158
|
+
self.compute_next_context_funs: Dict[str, ContextValueComputer[T]] = {}
|
|
159
|
+
self.contexts: Dict[T, StepContext] = {}
|
|
160
|
+
|
|
161
|
+
def queue_next(self, current_item: T, context: StepContext):
|
|
162
|
+
raise NotImplementedError
|
|
163
|
+
|
|
164
|
+
@property
|
|
165
|
+
def parent(self):
|
|
166
|
+
return self._parent
|
|
167
|
+
|
|
168
|
+
@parent.setter
|
|
169
|
+
def parent(self, value):
|
|
170
|
+
if self._parent is None:
|
|
171
|
+
self._parent = value
|
|
172
|
+
raise Exception
|
|
173
|
+
|
|
174
|
+
def can_action_item(self, item: T, context: StepContext) -> bool:
|
|
175
|
+
"""
|
|
176
|
+
Determines if the traversal can apply step actions and stop conditions
|
|
177
|
+
on the specified item.
|
|
178
|
+
|
|
179
|
+
:param item: The item to check.
|
|
180
|
+
:param context: The context of the current traversal step.
|
|
181
|
+
:returns: ``True`` if the item can be acted upon; ``False`` otherwise.
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
return True
|
|
185
|
+
|
|
186
|
+
def can_visit_item(self, item: T, context: StepContext) -> bool:
|
|
187
|
+
raise NotImplementedError
|
|
188
|
+
|
|
189
|
+
def create_new_this(self) -> D:
|
|
190
|
+
"""
|
|
191
|
+
Creates a new instance of the traversal for branching purposes.
|
|
192
|
+
|
|
193
|
+
NOTE: Do NOT add the debug logger to this call, as all traces created for
|
|
194
|
+
branching will already have their actions wrapped, and passing the
|
|
195
|
+
debug logger through means you get duplicate wrappers that double,
|
|
196
|
+
triple etc. log the debug messages.
|
|
197
|
+
|
|
198
|
+
:returns: A new traversal instance.
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
raise NotImplementedError
|
|
202
|
+
|
|
203
|
+
@singledispatchmethod
|
|
204
|
+
def add_condition(self, condition: ConditionTypes) -> D:
|
|
205
|
+
"""
|
|
206
|
+
Adds a traversal condition to the traversal.
|
|
207
|
+
|
|
208
|
+
:param condition: The condition to add.
|
|
209
|
+
|
|
210
|
+
:return: this traversal instance.
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
if callable(condition): # Callable[[NetworkTraceStep[T], StepContext], None]
|
|
214
|
+
if len(inspect.getfullargspec(condition).args) == 2:
|
|
215
|
+
return self.add_stop_condition(condition)
|
|
216
|
+
elif len(inspect.getfullargspec(condition).args) == 4:
|
|
217
|
+
return self.add_queue_condition(condition)
|
|
218
|
+
else:
|
|
219
|
+
raise RuntimeError(f'Condition does not match expected: Number of args is not 2(Stop Condition) or 4(QueueCondition)')
|
|
220
|
+
|
|
221
|
+
else:
|
|
222
|
+
raise RuntimeError(
|
|
223
|
+
f'Condition [{condition.__class__.__name__}] does not match expected: '
|
|
224
|
+
+ "[QueueCondition | DirectionCondition | StopCondition | Callable[_,_] | Callable[_,_,_,_]]"
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
@singledispatchmethod
|
|
228
|
+
@add_condition.register(StopCondition)
|
|
229
|
+
def add_stop_condition(self, condition: StopConditionTypes) -> D:
|
|
230
|
+
"""
|
|
231
|
+
Adds a stop condition to the traversal. If any stop condition returns
|
|
232
|
+
``True``, the traversal will not call the callback to queue more items
|
|
233
|
+
from the current item.
|
|
234
|
+
|
|
235
|
+
:param condition: The stop condition to add.
|
|
236
|
+
:return: this traversal instance.
|
|
237
|
+
"""
|
|
238
|
+
|
|
239
|
+
raise RuntimeError(f'Condition [{condition.__class__.__name__}] does not match expected: [StopCondition | StopConditionWithContextValue | Callable]')
|
|
240
|
+
|
|
241
|
+
@add_stop_condition.register(Callable)
|
|
242
|
+
def _(self, condition: ShouldStop):
|
|
243
|
+
return self.add_stop_condition(StopCondition(condition))
|
|
244
|
+
|
|
245
|
+
@add_stop_condition.register
|
|
246
|
+
def _(self, condition: StopCondition):
|
|
247
|
+
|
|
248
|
+
if self._debug_logger is not None:
|
|
249
|
+
self._debug_logger.wrap(condition)
|
|
250
|
+
|
|
251
|
+
self.stop_conditions.append(condition)
|
|
252
|
+
if isinstance(condition, StopConditionWithContextValue):
|
|
253
|
+
self.compute_next_context_funs[condition.key] = condition
|
|
254
|
+
return self
|
|
255
|
+
|
|
256
|
+
def copy_stop_conditions(self, other: Traversal[T, D]) -> D:
|
|
257
|
+
"""
|
|
258
|
+
Copies all the stop conditions from another traversal to this traversal.
|
|
259
|
+
|
|
260
|
+
:param other: The other traversal object to copy from.
|
|
261
|
+
:return: The current traversal instance.
|
|
262
|
+
"""
|
|
263
|
+
|
|
264
|
+
for it in other.stop_conditions:
|
|
265
|
+
self.add_stop_condition(it)
|
|
266
|
+
return self
|
|
267
|
+
|
|
268
|
+
def matches_any_stop_condition(self, item: T, context: StepContext) -> bool:
|
|
269
|
+
for condition in self.stop_conditions:
|
|
270
|
+
if condition.should_stop(item, context):
|
|
271
|
+
return True
|
|
272
|
+
return False
|
|
273
|
+
|
|
274
|
+
@add_condition.register(QueueCondition)
|
|
275
|
+
@singledispatchmethod
|
|
276
|
+
def add_queue_condition(self, condition: QueueConditionTypes) -> D:
|
|
277
|
+
"""
|
|
278
|
+
Adds a queue condition to the traversal.
|
|
279
|
+
Queue conditions determine whether an item should be queued for traversal.
|
|
280
|
+
All registered queue conditions must return true for an item to be queued.
|
|
281
|
+
|
|
282
|
+
:param condition: The queue condition to add.
|
|
283
|
+
:returns: The current traversal instance.
|
|
284
|
+
"""
|
|
285
|
+
|
|
286
|
+
raise RuntimeError(f'Condition [{condition.__class__.__name__}] does not match expected: [QueueCondition | QueueConditionWithContextValue | Callable]')
|
|
287
|
+
|
|
288
|
+
@add_queue_condition.register(Callable)
|
|
289
|
+
def _(self, condition: ShouldQueue):
|
|
290
|
+
return self.add_queue_condition(QueueCondition(condition))
|
|
291
|
+
|
|
292
|
+
@add_queue_condition.register
|
|
293
|
+
def _(self, condition: QueueCondition):
|
|
294
|
+
|
|
295
|
+
if self._debug_logger is not None:
|
|
296
|
+
self._debug_logger.wrap(condition)
|
|
297
|
+
|
|
298
|
+
self.queue_conditions.append(condition)
|
|
299
|
+
if isinstance(condition, QueueConditionWithContextValue):
|
|
300
|
+
self.compute_next_context_funs[condition.key] = condition
|
|
301
|
+
return self
|
|
302
|
+
|
|
303
|
+
def copy_queue_conditions(self, other: Traversal[T, D]) -> D:
|
|
304
|
+
"""
|
|
305
|
+
Copies all queue conditions from another traversal to this traversal.
|
|
306
|
+
|
|
307
|
+
:param other: The other traversal from which to copy queue conditions.
|
|
308
|
+
:returns: The current traversal instance.
|
|
309
|
+
"""
|
|
310
|
+
|
|
311
|
+
for it in other.queue_conditions:
|
|
312
|
+
self.add_queue_condition(it)
|
|
313
|
+
return self
|
|
314
|
+
|
|
315
|
+
@singledispatchmethod
|
|
316
|
+
def add_step_action(self, action: StepActionTypes) -> D:
|
|
317
|
+
"""
|
|
318
|
+
Adds an action to be performed on each item in the traversal, including the
|
|
319
|
+
starting items.
|
|
320
|
+
|
|
321
|
+
:param action: The action to perform on each item.
|
|
322
|
+
:return: The current traversal instance.
|
|
323
|
+
"""
|
|
324
|
+
|
|
325
|
+
raise RuntimeError(f'StepAction [{action.__class__.__name__}] does not match expected: [StepAction | StepActionWithContextValue | Callable]')
|
|
326
|
+
|
|
327
|
+
@add_step_action.register
|
|
328
|
+
def _(self, action: StepAction):
|
|
329
|
+
if self._debug_logger is not None:
|
|
330
|
+
self._debug_logger.wrap(action)
|
|
331
|
+
|
|
332
|
+
self.step_actions.append(action)
|
|
333
|
+
if isinstance(action, StepActionWithContextValue):
|
|
334
|
+
self.compute_next_context_funs[action.key] = action
|
|
335
|
+
return self
|
|
336
|
+
|
|
337
|
+
@add_step_action.register(Callable)
|
|
338
|
+
def _(self, action: StepActionFunc):
|
|
339
|
+
return self.add_step_action(StepAction(action))
|
|
340
|
+
|
|
341
|
+
@singledispatchmethod
|
|
342
|
+
def if_not_stopping(self, action: StepActionTypes) -> D:
|
|
343
|
+
"""
|
|
344
|
+
Adds an action to be performed on each item that does not match any stop condition.
|
|
345
|
+
|
|
346
|
+
:param action: The action to perform on each non-stopping item.
|
|
347
|
+
:return: The current traversal instance.
|
|
348
|
+
"""
|
|
349
|
+
raise RuntimeError(f'StepAction [{action}] does not match expected: [StepAction | StepActionWithContextValue | Callable]')
|
|
350
|
+
|
|
351
|
+
@if_not_stopping.register(Callable)
|
|
352
|
+
def _(self, action: StepActionFunc) -> D:
|
|
353
|
+
return self.add_step_action(lambda it, context: action(it, context) if not context.is_stopping else None)
|
|
354
|
+
|
|
355
|
+
@if_not_stopping.register
|
|
356
|
+
def _(self, action: StepAction) -> D:
|
|
357
|
+
action.apply = lambda it, context: action._func(it, context) if not context.is_stopping else None
|
|
358
|
+
return self.add_step_action(action)
|
|
359
|
+
|
|
360
|
+
@singledispatchmethod
|
|
361
|
+
def if_stopping(self, action: StepActionTypes) -> D:
|
|
362
|
+
"""
|
|
363
|
+
Adds an action to be performed on each item that matches a stop condition.
|
|
364
|
+
|
|
365
|
+
:param action: The action to perform on each stopping item.
|
|
366
|
+
:return: The current traversal instance.
|
|
367
|
+
"""
|
|
368
|
+
raise RuntimeError(f'StepAction [{action}] does not match expected: [StepAction | StepActionWithContextValue | Callable]')
|
|
369
|
+
|
|
370
|
+
@if_stopping.register(Callable)
|
|
371
|
+
def _(self, action: StepActionFunc) -> D:
|
|
372
|
+
return self.add_step_action(lambda it, context: action(it, context) if context.is_stopping else None)
|
|
373
|
+
|
|
374
|
+
@if_stopping.register
|
|
375
|
+
def _(self, action: StepAction) -> D:
|
|
376
|
+
action.apply = lambda it, context: action._func(it, context) if context.is_stopping else None
|
|
377
|
+
return self.add_step_action(action)
|
|
378
|
+
|
|
379
|
+
def copy_step_actions(self, other: Traversal[T, D]) -> D:
|
|
380
|
+
"""
|
|
381
|
+
Copies all the step actions from the passed in traversal to this traversal.
|
|
382
|
+
|
|
383
|
+
:param other: The other traversal object to copy from.
|
|
384
|
+
:return: The current traversal instance.
|
|
385
|
+
"""
|
|
386
|
+
|
|
387
|
+
for it in other.step_actions:
|
|
388
|
+
self.add_step_action(it)
|
|
389
|
+
return self
|
|
390
|
+
|
|
391
|
+
async def apply_step_actions(self, item: T, context: StepContext) -> D:
|
|
392
|
+
for it in self.step_actions:
|
|
393
|
+
try:
|
|
394
|
+
await it.apply(item, context)
|
|
395
|
+
except TypeError:
|
|
396
|
+
pass
|
|
397
|
+
return self
|
|
398
|
+
|
|
399
|
+
def add_context_value_computer(self, computer: ContextValueComputer[T]) -> D:
|
|
400
|
+
"""
|
|
401
|
+
Adds a standalone context value computer to compute additional `StepContext`
|
|
402
|
+
values during traversal.
|
|
403
|
+
|
|
404
|
+
:param computer: The context value computer to add.
|
|
405
|
+
:return: The current traversal instance.
|
|
406
|
+
"""
|
|
407
|
+
|
|
408
|
+
# require(not issubclass(computer.__class__, TraversalCondition), lambda: "`computer` must not be a TraversalCondition. Use `addCondition` to add conditions that also compute context values")
|
|
409
|
+
self.compute_next_context_funs[computer.key] = computer
|
|
410
|
+
return self
|
|
411
|
+
|
|
412
|
+
def copy_context_value_computer(self, other: Traversal[T, D]) -> D:
|
|
413
|
+
"""
|
|
414
|
+
Copies all standalone context value computers from another traversal to this
|
|
415
|
+
traversal.
|
|
416
|
+
That is, it does not copy any `TraversalCondition` registered that also
|
|
417
|
+
implements `ContextValueComputer`
|
|
418
|
+
|
|
419
|
+
:param other: The other traversal from which to copy context value computers.
|
|
420
|
+
:return: The current traversal instance.
|
|
421
|
+
"""
|
|
422
|
+
|
|
423
|
+
for it in other.compute_next_context_funs.values():
|
|
424
|
+
if it.is_standalone_computer():
|
|
425
|
+
self.add_context_value_computer(it)
|
|
426
|
+
return self
|
|
427
|
+
|
|
428
|
+
def _compute_intial_context(self, next_step: T) -> StepContext:
|
|
429
|
+
new_context_data = dict()
|
|
430
|
+
for key, computer in self.compute_next_context_funs.items():
|
|
431
|
+
new_context_data[key] = computer.compute_initial_value(next_step)
|
|
432
|
+
return StepContext(True, False, values=new_context_data)
|
|
433
|
+
|
|
434
|
+
def _compute_next_context(self, current_item: T, context: StepContext, next_step: T, is_branch_start: bool) -> StepContext:
|
|
435
|
+
new_context_data = dict()
|
|
436
|
+
for key, computer in self.compute_next_context_funs.items():
|
|
437
|
+
new_context_data[key] = computer.compute_next_value(next_step, current_item, context.get_value(key))
|
|
438
|
+
|
|
439
|
+
branch_depth = context.branch_depth + 1 if is_branch_start else context.branch_depth
|
|
440
|
+
return StepContext(False, is_branch_start, context.step_number + 1, branch_depth, new_context_data)
|
|
441
|
+
|
|
442
|
+
def add_start_item(self, item: T) -> D:
|
|
443
|
+
"""
|
|
444
|
+
Adds a starting item to the traversal.
|
|
445
|
+
|
|
446
|
+
:param item: The item to add.
|
|
447
|
+
:return: The current traversal instance.
|
|
448
|
+
"""
|
|
449
|
+
|
|
450
|
+
self.start_items.append(item)
|
|
451
|
+
return self
|
|
452
|
+
|
|
453
|
+
async def run(self, start_item: T = None, can_stop_on_start_item: bool = True) -> D:
|
|
454
|
+
"""
|
|
455
|
+
Runs the traversal optionally adding [startItem] to the collection of start items.
|
|
456
|
+
|
|
457
|
+
:param start_item: The item from which to start the traversal. (optional)
|
|
458
|
+
:param can_stop_on_start_item: Indicates if the traversal should check stop conditions
|
|
459
|
+
on the starting item.
|
|
460
|
+
:return: The current traversal instance.
|
|
461
|
+
"""
|
|
462
|
+
|
|
463
|
+
if start_item is not None:
|
|
464
|
+
self.start_items.append(start_item)
|
|
465
|
+
|
|
466
|
+
require(not self.running, lambda: "Traversal is already running")
|
|
467
|
+
|
|
468
|
+
if self.has_run:
|
|
469
|
+
self.reset()
|
|
470
|
+
|
|
471
|
+
self.running = True
|
|
472
|
+
self.has_run = True
|
|
473
|
+
|
|
474
|
+
if self._parent is None and isinstance(self._queue_type, Traversal.BranchingQueueType) and len(self.start_items) > 1:
|
|
475
|
+
self._branch_start_items()
|
|
476
|
+
# Because we don't traverse anything at the top level parent, we need to pass can_stop_at_start item
|
|
477
|
+
# to the child branch only in this case because they are actually start items.
|
|
478
|
+
await self._traverse_branches(can_stop_on_start_item)
|
|
479
|
+
else:
|
|
480
|
+
await self._traverse(can_stop_on_start_item)
|
|
481
|
+
# Child branches should never stop at start items because a branch start item is not a whole trace start item.
|
|
482
|
+
await self._traverse_branches(True)
|
|
483
|
+
|
|
484
|
+
self.running = False
|
|
485
|
+
return self
|
|
486
|
+
|
|
487
|
+
def reset(self) -> D:
|
|
488
|
+
"""
|
|
489
|
+
Resets the traversal to allow it to be reused.
|
|
490
|
+
|
|
491
|
+
:return: The current traversal instance.
|
|
492
|
+
"""
|
|
493
|
+
|
|
494
|
+
require(not self.running, lambda: "Traversal is currently running.")
|
|
495
|
+
self.has_run = False
|
|
496
|
+
self.queue.clear()
|
|
497
|
+
if self.branch_queue is not None:
|
|
498
|
+
self.branch_queue.clear()
|
|
499
|
+
|
|
500
|
+
self.on_reset()
|
|
501
|
+
|
|
502
|
+
return self
|
|
503
|
+
|
|
504
|
+
@abstractmethod
|
|
505
|
+
def on_reset(self):
|
|
506
|
+
"""
|
|
507
|
+
Called when the traversal is reset. Derived classes can override this to
|
|
508
|
+
reset additional state.
|
|
509
|
+
"""
|
|
510
|
+
|
|
511
|
+
raise NotImplementedError()
|
|
512
|
+
|
|
513
|
+
def _branch_start_items(self):
|
|
514
|
+
while len(self.start_items) > 0:
|
|
515
|
+
start_item = self.start_items.popleft()
|
|
516
|
+
if self._can_queue_start_item(start_item):
|
|
517
|
+
branch = self._create_new_branch(start_item, self._compute_intial_context(start_item))
|
|
518
|
+
if self.branch_queue is None:
|
|
519
|
+
raise Exception("INTERNAL ERROR: self.branch_queue should never be null here")
|
|
520
|
+
|
|
521
|
+
self.branch_queue.append(branch)
|
|
522
|
+
|
|
523
|
+
async def _traverse(self, can_stop_on_start_item: bool):
|
|
524
|
+
while len(self.start_items) > 0:
|
|
525
|
+
start_item = self.start_items.popleft()
|
|
526
|
+
|
|
527
|
+
# If the traversal is not a branch we need to compute an initial context and check if it
|
|
528
|
+
# should even be queued to trace. If the traversal is a branch, the branch creators should
|
|
529
|
+
# have only created the branch if the item was eligible to be queued and added the item
|
|
530
|
+
# context as part of the branch creation.
|
|
531
|
+
if self._parent is None:
|
|
532
|
+
if self._can_queue_start_item(start_item):
|
|
533
|
+
self.contexts[start_item] = self._compute_intial_context(start_item)
|
|
534
|
+
self.queue.append(start_item)
|
|
535
|
+
else:
|
|
536
|
+
self.queue.append(start_item)
|
|
537
|
+
|
|
538
|
+
while self.queue.has_next():
|
|
539
|
+
current = self.queue.pop()
|
|
540
|
+
context = self._get_step_context(current)
|
|
541
|
+
can_stop = can_stop_on_start_item or (not context.is_start_item)
|
|
542
|
+
if self.can_visit_item(current, context):
|
|
543
|
+
context.is_stopping = can_stop and self.matches_any_stop_condition(current, context)
|
|
544
|
+
|
|
545
|
+
context.is_actionable_item = self.can_action_item(current, context)
|
|
546
|
+
|
|
547
|
+
if context.is_actionable_item:
|
|
548
|
+
await self.apply_step_actions(current, context)
|
|
549
|
+
|
|
550
|
+
if not context.is_stopping:
|
|
551
|
+
self.queue_next(current, context)
|
|
552
|
+
|
|
553
|
+
def _get_step_context(self, item: T) -> StepContext:
|
|
554
|
+
try:
|
|
555
|
+
context = self.contexts.pop(item)
|
|
556
|
+
return context
|
|
557
|
+
except KeyError:
|
|
558
|
+
raise KeyError("INTERNAL ERROR: Traversal item should always have a context.")
|
|
559
|
+
|
|
560
|
+
def _create_new_branch(self, start_item: T, context: StepContext) -> D:
|
|
561
|
+
# fmt: off
|
|
562
|
+
it = (
|
|
563
|
+
self.create_new_this()
|
|
564
|
+
.copy_queue_conditions(self)
|
|
565
|
+
.copy_step_actions(self)
|
|
566
|
+
.copy_stop_conditions(self)
|
|
567
|
+
.copy_context_value_computer(self)
|
|
568
|
+
)
|
|
569
|
+
# fmt: on
|
|
570
|
+
|
|
571
|
+
it.contexts[start_item] = context
|
|
572
|
+
Traversal.add_start_item(it, start_item)
|
|
573
|
+
return it
|
|
574
|
+
|
|
575
|
+
def _item_queuer(self, current_item: T, current_context) -> Callable[[T], bool]:
|
|
576
|
+
def inner(next_item: T) -> bool:
|
|
577
|
+
next_context = self._compute_next_context(current_item, current_context, next_item, is_branch_start=False)
|
|
578
|
+
if self._can_queue_item(next_item, next_context, current_item, current_context) and self.queue.append(next_item):
|
|
579
|
+
self.contexts[next_item] = next_context
|
|
580
|
+
return True
|
|
581
|
+
else:
|
|
582
|
+
return False
|
|
583
|
+
|
|
584
|
+
return inner
|
|
585
|
+
|
|
586
|
+
def _queue_next_non_branching(self, current: T, current_context: StepContext, queue_next: QueueNext[T]):
|
|
587
|
+
return queue_next.accept(current, current_context, self._item_queuer(current, current_context))
|
|
588
|
+
|
|
589
|
+
def _queue_next_branching(self, current: T, current_context: StepContext, queue_next: BranchingQueueNext[T]):
|
|
590
|
+
def queue_branch(next_item: T):
|
|
591
|
+
next_context = self._compute_next_context(current, current_context, next_item, is_branch_start=True)
|
|
592
|
+
if self._can_queue_item(next_item, next_context, current, current_context):
|
|
593
|
+
branch = self._create_new_branch(next_item, next_context)
|
|
594
|
+
self.branch_queue.append(branch)
|
|
595
|
+
return True
|
|
596
|
+
else:
|
|
597
|
+
return False
|
|
598
|
+
|
|
599
|
+
return queue_next.accept(current, current_context, self._item_queuer(current, current_context), queue_branch)
|
|
600
|
+
|
|
601
|
+
async def _traverse_branches(self, can_stop_on_start_item: bool):
|
|
602
|
+
if self.branch_queue is None:
|
|
603
|
+
return
|
|
604
|
+
|
|
605
|
+
while len(self.branch_queue) > 0:
|
|
606
|
+
next_branch = self.branch_queue.pop()
|
|
607
|
+
if next_branch:
|
|
608
|
+
await next_branch.run(can_stop_on_start_item=can_stop_on_start_item)
|
|
609
|
+
|
|
610
|
+
def _can_queue_item(self, next_item: T, next_context: StepContext, current_item: T, current_context: StepContext) -> bool:
|
|
611
|
+
for it in self.queue_conditions:
|
|
612
|
+
if not it.should_queue(next_item, next_context, current_item, current_context):
|
|
613
|
+
return False
|
|
614
|
+
return True
|
|
615
|
+
|
|
616
|
+
def _can_queue_start_item(self, start_item: T) -> bool:
|
|
617
|
+
for it in self.queue_conditions:
|
|
618
|
+
if not it.should_queue_start_item(start_item):
|
|
619
|
+
return False
|
|
620
|
+
return True
|
|
621
|
+
|
|
622
|
+
class QueueNext(Generic[T]):
|
|
623
|
+
def __init__(self, func):
|
|
624
|
+
self._func = func
|
|
625
|
+
|
|
626
|
+
def accept(self, item: T, context: StepContext, queue_item: Callable[[T], bool]) -> bool:
|
|
627
|
+
return self._func(item, context, queue_item)
|
|
628
|
+
|
|
629
|
+
class BranchingQueueNext(Generic[T]):
|
|
630
|
+
def __init__(self, func):
|
|
631
|
+
self._func = func
|
|
632
|
+
|
|
633
|
+
def accept(self, item: T, context: StepContext, queue_item: Callable[[T], bool], queue_branch: Callable[[T], bool]) -> bool:
|
|
634
|
+
return self._func(item, context, queue_item, queue_branch)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
__all__ = ['TraversalCondition']
|
|
7
|
+
|
|
8
|
+
from typing import TypeVar, Protocol, runtime_checkable
|
|
9
|
+
|
|
10
|
+
T = TypeVar('T')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@runtime_checkable
|
|
14
|
+
class TraversalCondition(Protocol[T]):
|
|
15
|
+
"""
|
|
16
|
+
Protocol, representing a condition used in a traversal.
|
|
17
|
+
Implementations of this interface can influence the traversal process by determining
|
|
18
|
+
things such as the ability to queue items,stop at specific items, or apply other
|
|
19
|
+
conditional logic during traversal
|
|
20
|
+
|
|
21
|
+
T : The type of items being processed
|
|
22
|
+
"""
|