zepben.ewb 1.0.0b1__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/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 +173 -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/column.py +37 -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 +142 -0
- zepben/ewb/database/sqlite/tables/table_metadata_data_sources.py +21 -0
- zepben/ewb/database/sqlite/tables/table_version.py +38 -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 +35 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_kind.py +113 -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 +82 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_cooling_type.py +56 -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 +292 -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 +55 -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 +45 -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 +67 -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 +67 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_function_kind.py +43 -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 +25 -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 +150 -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 +46 -0
- zepben/ewb/model/cim/iec61968/metering/meter.py +26 -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 +28 -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 +124 -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 +234 -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 +201 -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 +26 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/orientation_kind.py +27 -0
- zepben/ewb/model/cim/iec61970/base/domain/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/domain/unit_symbol.py +492 -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 +37 -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 +16 -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 +38 -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 +46 -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 +105 -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 +28 -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 +44 -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 +43 -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 +92 -0
- zepben/ewb/services/common/translator/base_proto2cim.py +112 -0
- zepben/ewb/services/common/translator/service_differences.py +81 -0
- zepben/ewb/services/common/translator/util.py +78 -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 +34 -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 +71 -0
- zepben/ewb/services/network/tracing/networktrace/actions/tree_node.py +37 -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 +450 -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 +125 -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 +1782 -0
- zepben/ewb/services/network/translator/network_enum_mappers.py +78 -0
- zepben/ewb/services/network/translator/network_proto2cim.py +2147 -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 +34 -0
- zepben/ewb/streaming/get/included_energizing_containers.py +34 -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 +185 -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 +189 -0
- zepben_ewb-1.0.0b1.dist-info/METADATA +102 -0
- zepben_ewb-1.0.0b1.dist-info/RECORD +639 -0
- zepben_ewb-1.0.0b1.dist-info/WHEEL +5 -0
- zepben_ewb-1.0.0b1.dist-info/licenses/LICENSE +374 -0
- zepben_ewb-1.0.0b1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
# Copyright 2024 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
|
+
from math import isnan
|
|
6
|
+
from types import MemberDescriptorType
|
|
7
|
+
from typing import get_type_hints, Dict, Type, Callable, Any, TypeVar, Optional, Union, List, Tuple
|
|
8
|
+
|
|
9
|
+
from zepben.ewb import BaseService, IdentifiedObject, Organisation, Document, OrganisationRole
|
|
10
|
+
from zepben.ewb.model.cim.iec61970.base.core.name import Name
|
|
11
|
+
from zepben.ewb.model.cim.iec61970.base.core.name_type import NameType
|
|
12
|
+
from zepben.ewb.services.common.difference import ObjectDifference, Difference, ValueDifference, ReferenceDifference, CollectionDifference, IndexedDifference
|
|
13
|
+
from zepben.ewb.services.common.translator.service_differences import ServiceDifferences
|
|
14
|
+
|
|
15
|
+
T = TypeVar("T")
|
|
16
|
+
R = TypeVar('R')
|
|
17
|
+
K = TypeVar('K')
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class BaseServiceComparator:
|
|
21
|
+
|
|
22
|
+
def __init__(self):
|
|
23
|
+
def _is_valid_compare_func(func_name, func):
|
|
24
|
+
if not func_name.startswith("_compare_"):
|
|
25
|
+
return False
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
type_hints = get_type_hints(func)
|
|
29
|
+
return ((len(type_hints) == 3)
|
|
30
|
+
and ("source" in type_hints)
|
|
31
|
+
and ("target" in type_hints)
|
|
32
|
+
and ("return" in type_hints)
|
|
33
|
+
and (type_hints["source"] == type_hints["target"])
|
|
34
|
+
and (issubclass(type_hints["return"], ObjectDifference))
|
|
35
|
+
)
|
|
36
|
+
except TypeError:
|
|
37
|
+
return False
|
|
38
|
+
|
|
39
|
+
def _find_comparisons_for_type(type_of: Type):
|
|
40
|
+
for k, v in type_of.__dict__.items():
|
|
41
|
+
if _is_valid_compare_func(k, v):
|
|
42
|
+
self._compare_by_type[get_type_hints(v)["source"]] = v
|
|
43
|
+
for base_of in type_of.__bases__:
|
|
44
|
+
_find_comparisons_for_type(base_of)
|
|
45
|
+
|
|
46
|
+
self._compare_by_type: Dict[Type, Callable[[Any, T, T], ObjectDifference]] = {}
|
|
47
|
+
_find_comparisons_for_type(type(self))
|
|
48
|
+
|
|
49
|
+
def compare_services(self, source: BaseService, target: BaseService, compare_name_types: bool = True) -> ServiceDifferences:
|
|
50
|
+
"""
|
|
51
|
+
Run the compare with the specified optional checks
|
|
52
|
+
|
|
53
|
+
:param source: The service to use as the source
|
|
54
|
+
:param target: The service to use as the target
|
|
55
|
+
:param compare_name_types: Optional parameter to suppress comparing name types
|
|
56
|
+
|
|
57
|
+
:return: The differences detected between the source and the target
|
|
58
|
+
"""
|
|
59
|
+
differences = ServiceDifferences(
|
|
60
|
+
lambda mrid: source.get(mrid, default=None),
|
|
61
|
+
lambda mrid: target.get(mrid, default=None),
|
|
62
|
+
lambda name: source.get_name_type(name),
|
|
63
|
+
lambda name: target.get_name_type(name)
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
for s in source.objects():
|
|
67
|
+
t = target.get(s.mrid, default=None)
|
|
68
|
+
if t:
|
|
69
|
+
source_type = type(s)
|
|
70
|
+
if source_type != type(t):
|
|
71
|
+
differences.add_to_missing_from_source(s.mrid)
|
|
72
|
+
differences.add_to_missing_from_target(s.mrid)
|
|
73
|
+
else:
|
|
74
|
+
diff = self._try_compare(source_type, s, t)
|
|
75
|
+
if diff.differences:
|
|
76
|
+
differences.add_modifications(s.mrid, diff)
|
|
77
|
+
else:
|
|
78
|
+
differences.add_to_missing_from_target(s.mrid)
|
|
79
|
+
|
|
80
|
+
for t in target.objects():
|
|
81
|
+
if t.mrid not in source:
|
|
82
|
+
differences.add_to_missing_from_source(t.mrid)
|
|
83
|
+
|
|
84
|
+
if compare_name_types:
|
|
85
|
+
for s in source.name_types:
|
|
86
|
+
try:
|
|
87
|
+
t = target.get_name_type(s.name)
|
|
88
|
+
difference = self._compare_name_type(s, t)
|
|
89
|
+
if difference.differences:
|
|
90
|
+
differences.add_modifications(s.name, difference)
|
|
91
|
+
except KeyError:
|
|
92
|
+
differences.add_to_missing_from_target(s.name)
|
|
93
|
+
|
|
94
|
+
for t in target.name_types:
|
|
95
|
+
try:
|
|
96
|
+
source.get_name_type(t.name)
|
|
97
|
+
except KeyError:
|
|
98
|
+
differences.add_to_missing_from_source(t.name)
|
|
99
|
+
|
|
100
|
+
return differences
|
|
101
|
+
|
|
102
|
+
def compare_objects(self, source: T, target: T) -> ObjectDifference:
|
|
103
|
+
"""
|
|
104
|
+
Compare the attributes of two objects. See :class:`ObjectDifference`.
|
|
105
|
+
|
|
106
|
+
:param source: the source object to compare
|
|
107
|
+
:param target: the target object to compare
|
|
108
|
+
|
|
109
|
+
:return: The differences detected between the source and the target
|
|
110
|
+
"""
|
|
111
|
+
source_type = type(source)
|
|
112
|
+
target_type = type(target)
|
|
113
|
+
|
|
114
|
+
if source_type != target_type:
|
|
115
|
+
raise ValueError(f"source and target must be of the same type. {source_type.__name__} vs {target_type.__name__}")
|
|
116
|
+
return self._try_compare(source_type, source, target)
|
|
117
|
+
|
|
118
|
+
def _try_compare(self, source_type: Type, s: T, t: T) -> ObjectDifference:
|
|
119
|
+
try:
|
|
120
|
+
compare = self._compare_by_type[source_type]
|
|
121
|
+
except KeyError:
|
|
122
|
+
raise AssertionError(f"INTERNAL ERROR: Attempted to compare {source_type.__name__} which is not registered with the comparator.")
|
|
123
|
+
|
|
124
|
+
return compare(self, s, t)
|
|
125
|
+
|
|
126
|
+
def _compare_organisation(self, source: Organisation, target: Organisation) -> ObjectDifference:
|
|
127
|
+
return self._compare_identified_object(ObjectDifference(source, target))
|
|
128
|
+
|
|
129
|
+
def _compare_identified_object(self, diff: ObjectDifference) -> ObjectDifference:
|
|
130
|
+
self._compare_values(diff, IdentifiedObject.mrid, IdentifiedObject.name, IdentifiedObject.description)
|
|
131
|
+
self._compare_names(diff, IdentifiedObject.names)
|
|
132
|
+
return diff
|
|
133
|
+
|
|
134
|
+
def _compare_name_type(self, source: NameType, target: NameType) -> ObjectDifference:
|
|
135
|
+
diff = ObjectDifference(source, target)
|
|
136
|
+
|
|
137
|
+
self._compare_values(diff, NameType.description)
|
|
138
|
+
|
|
139
|
+
def compare_names(s: Name, t: Name) -> bool:
|
|
140
|
+
return s.name == t.name and s.type.name == t.type.name and s.identified_object.mrid == t.identified_object.mrid
|
|
141
|
+
|
|
142
|
+
differences = CollectionDifference()
|
|
143
|
+
|
|
144
|
+
for s_name in source.names:
|
|
145
|
+
if not [t_name for t_name in target.names if compare_names(s_name, t_name)]:
|
|
146
|
+
differences.missing_from_target.append(s_name)
|
|
147
|
+
|
|
148
|
+
for t_name in target.names:
|
|
149
|
+
if not [s_name for s_name in source.names if compare_names(s_name, t_name)]:
|
|
150
|
+
differences.missing_from_source.append(t_name)
|
|
151
|
+
|
|
152
|
+
if differences.missing_from_source or differences.missing_from_target:
|
|
153
|
+
diff.differences[NameType.names.fget.__name__] = differences
|
|
154
|
+
return diff
|
|
155
|
+
|
|
156
|
+
def _compare_document(self, diff: ObjectDifference) -> ObjectDifference:
|
|
157
|
+
self._compare_values(diff, Document.title, Document.created_date_time, Document.author_name, Document.type, Document.status, Document.comment)
|
|
158
|
+
return self._compare_identified_object(diff)
|
|
159
|
+
|
|
160
|
+
def _compare_organisation_role(self, diff: ObjectDifference) -> ObjectDifference:
|
|
161
|
+
self._compare_id_references(diff, OrganisationRole.organisation)
|
|
162
|
+
return self._compare_identified_object(diff)
|
|
163
|
+
|
|
164
|
+
def _compare_values(self, diff: ObjectDifference, *properties) -> ObjectDifference:
|
|
165
|
+
for it in properties:
|
|
166
|
+
if isinstance(it, property):
|
|
167
|
+
self._add_if_different(diff, it.fget.__name__, self._calculate_values_diff(it, diff))
|
|
168
|
+
else:
|
|
169
|
+
self._add_if_different(diff, it.__name__, self._calculate_values_diff(it, diff))
|
|
170
|
+
return diff
|
|
171
|
+
|
|
172
|
+
def _compare_floats(self, diff: ObjectDifference, *properties) -> ObjectDifference:
|
|
173
|
+
for it in properties:
|
|
174
|
+
if isinstance(it, property):
|
|
175
|
+
self._add_if_different(diff, it.fget.__name__, self._calculate_float_diff(it, diff))
|
|
176
|
+
else:
|
|
177
|
+
self._add_if_different(diff, it.__name__, self._calculate_float_diff(it, diff))
|
|
178
|
+
return diff
|
|
179
|
+
|
|
180
|
+
def _compare_id_references(self, diff: ObjectDifference, *properties) -> ObjectDifference:
|
|
181
|
+
for it in properties:
|
|
182
|
+
if isinstance(it, property):
|
|
183
|
+
self._add_if_different(diff, it.fget.__name__, self._calculate_id_reference_diff(it, diff))
|
|
184
|
+
else:
|
|
185
|
+
self._add_if_different(diff, it.__name__, self._calculate_id_reference_diff(it, diff))
|
|
186
|
+
return diff
|
|
187
|
+
|
|
188
|
+
def _compare_names(self, diff: ObjectDifference, *properties) -> ObjectDifference:
|
|
189
|
+
for it in properties:
|
|
190
|
+
if isinstance(it, property):
|
|
191
|
+
self._add_if_different(diff, it.fget.__name__, self.calculate_name_diff(it, diff))
|
|
192
|
+
else:
|
|
193
|
+
self._add_if_different(diff, it.__name__, self.calculate_name_diff(it, diff))
|
|
194
|
+
return diff
|
|
195
|
+
|
|
196
|
+
def _compare_id_reference_collections(self, diff: ObjectDifference, *properties) -> ObjectDifference:
|
|
197
|
+
for it in properties:
|
|
198
|
+
self._add_if_different(diff, it.fget.__name__, self._calculate_id_reference_collection_diff(it, diff))
|
|
199
|
+
return diff
|
|
200
|
+
|
|
201
|
+
def _compare_indexed_id_reference_collections(self, diff: ObjectDifference, *properties) -> ObjectDifference:
|
|
202
|
+
for it in properties:
|
|
203
|
+
self._add_if_different(diff, it.fget.__name__, self._calculate_indexed_id_reference_collection_diff(it, diff))
|
|
204
|
+
return diff
|
|
205
|
+
|
|
206
|
+
def _compare_indexed_value_collections(self, diff: ObjectDifference, *properties) -> ObjectDifference:
|
|
207
|
+
for it in properties:
|
|
208
|
+
self._add_if_different(diff, it.fget.__name__, self._calculate_indexed_value_collection_diff(it, diff))
|
|
209
|
+
return diff
|
|
210
|
+
|
|
211
|
+
def _compare_unordered_value_collection(self, diff: ObjectDifference, key_selector: Callable[[K], R], *properties):
|
|
212
|
+
for it in properties:
|
|
213
|
+
self._add_if_different(diff, it.fget.__name__, self._calculate_unordered_value_collection_diff(it, key_selector, diff))
|
|
214
|
+
return diff
|
|
215
|
+
|
|
216
|
+
@staticmethod
|
|
217
|
+
def _add_if_different(diff: ObjectDifference, name: str, difference: Optional[Difference]):
|
|
218
|
+
if difference:
|
|
219
|
+
diff.differences[name] = difference
|
|
220
|
+
|
|
221
|
+
@staticmethod
|
|
222
|
+
def _calculate_values_diff(prop: Union[MemberDescriptorType, property], diff: ObjectDifference) -> Optional[ValueDifference]:
|
|
223
|
+
if isinstance(prop, property):
|
|
224
|
+
s_val = getattr(diff.source, prop.fget.__name__) if diff.source else None
|
|
225
|
+
t_val = getattr(diff.target, prop.fget.__name__) if diff.target else None
|
|
226
|
+
else:
|
|
227
|
+
s_val = getattr(diff.source, prop.__name__) if diff.source else None
|
|
228
|
+
t_val = getattr(diff.target, prop.__name__) if diff.target else None
|
|
229
|
+
|
|
230
|
+
if (type(s_val) == float) or (type(t_val) == float):
|
|
231
|
+
raise TypeError(f"Using wrong comparator for {prop}, use _calculate_float_diff instead.")
|
|
232
|
+
|
|
233
|
+
if s_val == t_val:
|
|
234
|
+
return None
|
|
235
|
+
else:
|
|
236
|
+
return ValueDifference(s_val, t_val)
|
|
237
|
+
|
|
238
|
+
@staticmethod
|
|
239
|
+
def _calculate_float_diff(prop: Union[MemberDescriptorType, property], diff: ObjectDifference) -> Optional[ValueDifference]:
|
|
240
|
+
if isinstance(prop, property):
|
|
241
|
+
s_val = getattr(diff.source, prop.fget.__name__) if diff.source else None
|
|
242
|
+
t_val = getattr(diff.target, prop.fget.__name__) if diff.target else None
|
|
243
|
+
else:
|
|
244
|
+
s_val = getattr(diff.source, prop.__name__) if diff.source else None
|
|
245
|
+
t_val = getattr(diff.target, prop.__name__) if diff.target else None
|
|
246
|
+
|
|
247
|
+
if s_val == t_val:
|
|
248
|
+
return None
|
|
249
|
+
elif (s_val is not None) and (t_val is not None) and isnan(s_val) and isnan(t_val):
|
|
250
|
+
return None
|
|
251
|
+
else:
|
|
252
|
+
return ValueDifference(s_val, t_val)
|
|
253
|
+
|
|
254
|
+
@staticmethod
|
|
255
|
+
def _calculate_id_reference_diff(prop: Union[MemberDescriptorType, property], diff: ObjectDifference) -> Optional[ReferenceDifference]:
|
|
256
|
+
if isinstance(prop, property):
|
|
257
|
+
s_ref = getattr(diff.source, prop.fget.__name__) if diff.source else None
|
|
258
|
+
t_ref = getattr(diff.target, prop.fget.__name__) if diff.target else None
|
|
259
|
+
else:
|
|
260
|
+
s_ref = getattr(diff.source, prop.__name__) if diff.source else None
|
|
261
|
+
t_ref = getattr(diff.target, prop.__name__) if diff.target else None
|
|
262
|
+
|
|
263
|
+
if (s_ref is None) and (t_ref is None):
|
|
264
|
+
return None
|
|
265
|
+
elif (s_ref is not None) and (t_ref is not None) and (s_ref.mrid == t_ref.mrid):
|
|
266
|
+
return None
|
|
267
|
+
else:
|
|
268
|
+
return ReferenceDifference(s_ref, t_ref)
|
|
269
|
+
|
|
270
|
+
def calculate_name_diff(self, prop: property, diff: ObjectDifference) -> Optional[CollectionDifference]:
|
|
271
|
+
differences = CollectionDifference()
|
|
272
|
+
|
|
273
|
+
if isinstance(prop, property):
|
|
274
|
+
source_collection = list(getattr(diff.source, prop.fget.__name__)) if diff.source else None
|
|
275
|
+
target_collection = list(getattr(diff.target, prop.fget.__name__)) if diff.target else None
|
|
276
|
+
else:
|
|
277
|
+
source_collection = list(getattr(diff.source, prop.__name__)) if diff.source else None
|
|
278
|
+
target_collection = list(getattr(diff.target, prop.__name__)) if diff.target else None
|
|
279
|
+
|
|
280
|
+
source_name_type_names: List[Tuple[str, str]] = []
|
|
281
|
+
for source_io in source_collection:
|
|
282
|
+
source_name_type_names.append((source_io.type.name, source_io.name))
|
|
283
|
+
if not next((io for io in target_collection if (io.name == source_io.name) and (io.type.name == source_io.type.name)), None):
|
|
284
|
+
differences.missing_from_target.append(source_io)
|
|
285
|
+
|
|
286
|
+
for target_io in target_collection:
|
|
287
|
+
if not next((io for io in source_collection if (io.name == target_io.name) and (io.type.name == target_io.type.name)), None):
|
|
288
|
+
differences.missing_from_source.append(target_io)
|
|
289
|
+
|
|
290
|
+
return self._none_if_empty(differences)
|
|
291
|
+
|
|
292
|
+
def _calculate_id_reference_collection_diff(self, prop: property, diff: ObjectDifference) -> Optional[CollectionDifference]:
|
|
293
|
+
differences = CollectionDifference()
|
|
294
|
+
source_collection = list(getattr(diff.source, prop.fget.__name__))
|
|
295
|
+
target_collection = list(getattr(diff.target, prop.fget.__name__))
|
|
296
|
+
|
|
297
|
+
source_mrids = set()
|
|
298
|
+
for s_obj in source_collection:
|
|
299
|
+
source_mrids.add(s_obj.mrid)
|
|
300
|
+
t_obj = next((it for it in target_collection if it.mrid == s_obj.mrid), None)
|
|
301
|
+
if t_obj is None:
|
|
302
|
+
differences.missing_from_target.append(s_obj)
|
|
303
|
+
|
|
304
|
+
for it in target_collection:
|
|
305
|
+
if it.mrid not in source_mrids:
|
|
306
|
+
differences.missing_from_source.append(it)
|
|
307
|
+
|
|
308
|
+
return self._none_if_empty(differences)
|
|
309
|
+
|
|
310
|
+
def _calculate_indexed_id_reference_collection_diff(self, prop: property, diff: ObjectDifference) -> Optional[CollectionDifference]:
|
|
311
|
+
differences = CollectionDifference()
|
|
312
|
+
source_list = list(getattr(diff.source, prop.fget.__name__))
|
|
313
|
+
target_list = list(getattr(diff.target, prop.fget.__name__))
|
|
314
|
+
|
|
315
|
+
for index, s_obj in enumerate(source_list):
|
|
316
|
+
try:
|
|
317
|
+
t_obj = target_list[index]
|
|
318
|
+
except IndexError:
|
|
319
|
+
t_obj = None
|
|
320
|
+
|
|
321
|
+
if t_obj is None:
|
|
322
|
+
differences.missing_from_target.append(IndexedDifference(index, ReferenceDifference(s_obj, None)))
|
|
323
|
+
elif t_obj.mrid != s_obj.mrid:
|
|
324
|
+
differences.modifications.append(IndexedDifference(index, ReferenceDifference(s_obj, t_obj)))
|
|
325
|
+
|
|
326
|
+
for index in range(len(source_list), len(target_list)):
|
|
327
|
+
differences.missing_from_source.append(IndexedDifference(index, ReferenceDifference(None, target_list[index])))
|
|
328
|
+
|
|
329
|
+
return self._none_if_empty(differences)
|
|
330
|
+
|
|
331
|
+
def _calculate_indexed_value_collection_diff(self, prop: property, diff: ObjectDifference) -> Optional[CollectionDifference]:
|
|
332
|
+
differences = CollectionDifference()
|
|
333
|
+
source_list = list(getattr(diff.source, prop.fget.__name__))
|
|
334
|
+
target_list = list(getattr(diff.target, prop.fget.__name__))
|
|
335
|
+
|
|
336
|
+
for index, source_value in enumerate(source_list):
|
|
337
|
+
try:
|
|
338
|
+
target_value = target_list[index]
|
|
339
|
+
except IndexError:
|
|
340
|
+
target_value = None
|
|
341
|
+
|
|
342
|
+
if target_value is None:
|
|
343
|
+
differences.missing_from_target.append(IndexedDifference(index, ValueDifference(source_value, None)))
|
|
344
|
+
elif target_value != source_value:
|
|
345
|
+
differences.modifications.append(IndexedDifference(index, ValueDifference(source_value, target_value)))
|
|
346
|
+
|
|
347
|
+
for index in range(len(source_list), len(target_list)):
|
|
348
|
+
differences.missing_from_source.append(IndexedDifference(index, ValueDifference(None, target_list[index])))
|
|
349
|
+
|
|
350
|
+
return self._none_if_empty(differences)
|
|
351
|
+
|
|
352
|
+
def _calculate_unordered_value_collection_diff(self, prop: property, key_selector: Callable[[R], K], diff: ObjectDifference) -> Optional[CollectionDifference]:
|
|
353
|
+
differences = CollectionDifference()
|
|
354
|
+
source_list = sorted(list(getattr(diff.source, prop.fget.__name__)), key=key_selector)
|
|
355
|
+
target_list = sorted(list(getattr(diff.target, prop.fget.__name__)), key=key_selector)
|
|
356
|
+
|
|
357
|
+
source_index = 0
|
|
358
|
+
target_index = 0
|
|
359
|
+
|
|
360
|
+
while source_index < len(source_list) and target_index < len(target_list):
|
|
361
|
+
source_item = source_list[source_index]
|
|
362
|
+
target_item = target_list[target_index]
|
|
363
|
+
|
|
364
|
+
source_check = key_selector(source_item)
|
|
365
|
+
target_check = key_selector(target_item)
|
|
366
|
+
|
|
367
|
+
if source_check == target_check:
|
|
368
|
+
if source_item != target_item:
|
|
369
|
+
differences.modifications.append(ValueDifference(source_item, target_item))
|
|
370
|
+
source_index += 1
|
|
371
|
+
target_index += 1
|
|
372
|
+
elif source_check < target_check:
|
|
373
|
+
differences.missing_from_target.append(ValueDifference(source_item, None))
|
|
374
|
+
source_index += 1
|
|
375
|
+
else:
|
|
376
|
+
differences.missing_from_source.append(ValueDifference(None, target_item))
|
|
377
|
+
target_index += 1
|
|
378
|
+
|
|
379
|
+
while target_index < len(target_list):
|
|
380
|
+
differences.missing_from_source.append(ValueDifference(None, target_list[target_index]))
|
|
381
|
+
target_index += 1
|
|
382
|
+
|
|
383
|
+
while source_index < len(source_list):
|
|
384
|
+
differences.missing_from_target.append(ValueDifference(source_list[source_index], None))
|
|
385
|
+
source_index += 1
|
|
386
|
+
|
|
387
|
+
return self._none_if_empty(differences)
|
|
388
|
+
|
|
389
|
+
@staticmethod
|
|
390
|
+
def _none_if_empty(diff: CollectionDifference):
|
|
391
|
+
if not diff.missing_from_source and not diff.missing_from_target and not diff.modifications:
|
|
392
|
+
return None
|
|
393
|
+
else:
|
|
394
|
+
return diff
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Copyright 2024 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
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import Optional, Any, List, Dict, TypeVar
|
|
7
|
+
|
|
8
|
+
from zepben.ewb import IdentifiedObject
|
|
9
|
+
|
|
10
|
+
T = TypeVar("T")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass()
|
|
14
|
+
class Difference:
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass()
|
|
19
|
+
class ValueDifference(Difference):
|
|
20
|
+
source_value: Optional[Any]
|
|
21
|
+
target_value: Optional[Any]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass()
|
|
25
|
+
class CollectionDifference(Difference):
|
|
26
|
+
missing_from_target: List[Any] = field(default_factory=list)
|
|
27
|
+
missing_from_source: List[Any] = field(default_factory=list)
|
|
28
|
+
modifications: List[Difference] = field(default_factory=list)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass()
|
|
32
|
+
class ObjectDifference(Difference):
|
|
33
|
+
source: T
|
|
34
|
+
target: T
|
|
35
|
+
differences: Dict[str, Difference] = field(default_factory=dict)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass()
|
|
39
|
+
class ReferenceDifference(Difference):
|
|
40
|
+
source: Optional[IdentifiedObject]
|
|
41
|
+
target_value: Optional[IdentifiedObject]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass()
|
|
45
|
+
class IndexedDifference(Difference):
|
|
46
|
+
index: int
|
|
47
|
+
difference: Difference
|
|
@@ -0,0 +1,55 @@
|
|
|
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__ = [""]
|
|
7
|
+
|
|
8
|
+
import os.path
|
|
9
|
+
from enum import Enum
|
|
10
|
+
from typing import Type, TypeVar, Generic
|
|
11
|
+
|
|
12
|
+
from google.protobuf.descriptor import EnumValueDescriptor
|
|
13
|
+
# noinspection PyPackageRequirements
|
|
14
|
+
from google.protobuf.internal.enum_type_wrapper import EnumTypeWrapper
|
|
15
|
+
|
|
16
|
+
TCimEnum = TypeVar("TCimEnum", bound=Enum)
|
|
17
|
+
TProtoEnum = TypeVar("TProtoEnum")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# NOTE: EnumMapper has been deliberately left out of the package exports as it is not public API.
|
|
21
|
+
class EnumMapper(Generic[TCimEnum, TProtoEnum]):
|
|
22
|
+
"""
|
|
23
|
+
A class for mapping between CIM and protobuf variants of the same Enum.
|
|
24
|
+
|
|
25
|
+
NOTE: There is no need to do the reverse map back to CIM as the python version uses ints that can just be used to construct the enum directly.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, cim_enum: Type[TCimEnum], pb_enum: EnumTypeWrapper):
|
|
29
|
+
pb_common_key = self._common_prefix(pb_enum)
|
|
30
|
+
|
|
31
|
+
cim_by_key = {self._extract_key_from_cim(it): it for it in cim_enum}
|
|
32
|
+
pb_by_key = {self._extract_key_from_pb(it, pb_common_key): it for it in pb_enum.DESCRIPTOR.values}
|
|
33
|
+
|
|
34
|
+
self._cim_to_proto = {cim: pb_by_key[key] for key, cim in cim_by_key.items()}
|
|
35
|
+
|
|
36
|
+
def to_pb(self, cim: TCimEnum) -> TProtoEnum:
|
|
37
|
+
"""Convert the CIM enum value to the equivalent protobuf variant."""
|
|
38
|
+
return self._cim_to_proto[cim].number
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def _extract_key(name: str) -> str:
|
|
42
|
+
return name.upper().replace("_", "")
|
|
43
|
+
|
|
44
|
+
def _extract_key_from_cim(self, enum: Enum) -> str:
|
|
45
|
+
# We use the calculated `short_name` for the CIM enum, rather than just the `name`, for cases where we override the name. e.g. UnitSymbol.
|
|
46
|
+
# noinspection PyUnresolvedReferences
|
|
47
|
+
return self._extract_key(enum.short_name)
|
|
48
|
+
|
|
49
|
+
def _extract_key_from_pb(self, enum: EnumValueDescriptor, pb_common_key: str) -> str:
|
|
50
|
+
return self._extract_key(enum.name.removeprefix(pb_common_key))
|
|
51
|
+
|
|
52
|
+
@staticmethod
|
|
53
|
+
def _common_prefix(pb_enum: EnumTypeWrapper) -> str:
|
|
54
|
+
"""Find the common starting for the protobuf enum."""
|
|
55
|
+
return os.path.commonprefix([it for it in pb_enum.keys()])
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Copyright 2024 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__ = ["DataSource"]
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class DataSource(object):
|
|
14
|
+
source: str
|
|
15
|
+
version: str
|
|
16
|
+
timestamp: datetime = datetime.now()
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Copyright 2024 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__ = ["MetadataCollection"]
|
|
7
|
+
|
|
8
|
+
from typing import List, Generator
|
|
9
|
+
|
|
10
|
+
from zepben.ewb.services.common.meta.data_source import DataSource
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class MetadataCollection:
|
|
14
|
+
|
|
15
|
+
def __init__(self):
|
|
16
|
+
super().__init__()
|
|
17
|
+
self._data_sources: List[DataSource] = []
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def data_sources(self) -> Generator[DataSource, None, None]:
|
|
21
|
+
for source in self._data_sources:
|
|
22
|
+
yield source
|
|
23
|
+
|
|
24
|
+
def num_sources(self) -> int:
|
|
25
|
+
return len(self._data_sources)
|
|
26
|
+
|
|
27
|
+
def add(self, data_source: DataSource):
|
|
28
|
+
self._data_sources.append(data_source)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Copyright 2024 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
|
+
# noinspection PyPackageRequirements,PyUnresolvedReferences
|
|
7
|
+
from google.protobuf.timestamp_pb2 import Timestamp as PBTimestamp
|
|
8
|
+
from zepben.protobuf.metadata.metadata_data_pb2 import DataSource as PBDataSource
|
|
9
|
+
from zepben.protobuf.metadata.metadata_data_pb2 import ServiceInfo as PBServiceInfo
|
|
10
|
+
|
|
11
|
+
from zepben.ewb import DataSource, ServiceInfo
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def data_source_to_pb(ds: DataSource) -> PBDataSource:
|
|
15
|
+
ts = PBTimestamp()
|
|
16
|
+
ts.FromDatetime(ds.timestamp)
|
|
17
|
+
return PBDataSource(
|
|
18
|
+
source=ds.source,
|
|
19
|
+
version=ds.version,
|
|
20
|
+
timestamp=ts
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def data_source_from_pb(pb: PBDataSource) -> DataSource:
|
|
25
|
+
# noinspection PyArgumentList
|
|
26
|
+
return DataSource(
|
|
27
|
+
source=pb.source,
|
|
28
|
+
version=pb.version,
|
|
29
|
+
timestamp=pb.timestamp.ToDatetime() if pb.timestamp != PBTimestamp() else None
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def service_info_to_pb(si: ServiceInfo) -> PBServiceInfo:
|
|
34
|
+
return PBServiceInfo(
|
|
35
|
+
title=si.title,
|
|
36
|
+
version=si.version,
|
|
37
|
+
dataSources=[data_source_to_pb(ds) for ds in si.data_sources]
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def service_info_from_pb(pb: PBServiceInfo) -> ServiceInfo:
|
|
42
|
+
# noinspection PyArgumentList
|
|
43
|
+
return ServiceInfo(
|
|
44
|
+
title=pb.title,
|
|
45
|
+
version=pb.version,
|
|
46
|
+
data_sources=[data_source_from_pb(ds_pb) for ds_pb in pb.dataSources]
|
|
47
|
+
)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Copyright 2024 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__ = ["ServiceInfo"]
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING, List
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.dataclassy import dataclass
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from zepben.ewb import DataSource
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(slots=True)
|
|
18
|
+
class ServiceInfo(object):
|
|
19
|
+
"""Container for `Service` metadata"""
|
|
20
|
+
title: str
|
|
21
|
+
version: str
|
|
22
|
+
data_sources: List[DataSource]
|