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,30 @@
|
|
|
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__ = ["TableTransformerEnds"]
|
|
7
|
+
|
|
8
|
+
from abc import ABC
|
|
9
|
+
from typing import List, Generator
|
|
10
|
+
|
|
11
|
+
from zepben.ewb.database.sqlite.tables.column import Column, Nullable
|
|
12
|
+
from zepben.ewb.database.sqlite.tables.iec61970.base.core.table_identified_objects import TableIdentifiedObjects
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TableTransformerEnds(TableIdentifiedObjects, ABC):
|
|
16
|
+
|
|
17
|
+
def __init__(self):
|
|
18
|
+
super().__init__()
|
|
19
|
+
self.end_number: Column = self._create_column("end_number", "INTEGER", Nullable.NOT_NULL)
|
|
20
|
+
self.terminal_mrid: Column = self._create_column("terminal_mrid", "TEXT", Nullable.NULL)
|
|
21
|
+
self.base_voltage_mrid: Column = self._create_column("base_voltage_mrid", "TEXT", Nullable.NULL)
|
|
22
|
+
self.grounded: Column = self._create_column("grounded", "BOOLEAN", Nullable.NOT_NULL)
|
|
23
|
+
self.r_ground: Column = self._create_column("r_ground", "NUMBER", Nullable.NULL)
|
|
24
|
+
self.x_ground: Column = self._create_column("x_ground", "NUMBER", Nullable.NULL)
|
|
25
|
+
self.star_impedance_mrid: Column = self._create_column("star_impedance_mrid", "TEXT", Nullable.NULL)
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def non_unique_index_columns(self) -> Generator[List[Column], None, None]:
|
|
29
|
+
yield from super().non_unique_index_columns
|
|
30
|
+
yield [self.star_impedance_mrid]
|
|
@@ -0,0 +1,32 @@
|
|
|
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__ = ["TableTransformerStarImpedances"]
|
|
7
|
+
|
|
8
|
+
from typing import List, Generator
|
|
9
|
+
|
|
10
|
+
from zepben.ewb.database.sqlite.tables.column import Column, Nullable
|
|
11
|
+
from zepben.ewb.database.sqlite.tables.iec61970.base.core.table_identified_objects import TableIdentifiedObjects
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TableTransformerStarImpedances(TableIdentifiedObjects):
|
|
15
|
+
|
|
16
|
+
def __init__(self):
|
|
17
|
+
super().__init__()
|
|
18
|
+
# Note r, r0, x, x0 use nullable number types.
|
|
19
|
+
self.r: Column = self._create_column("R", "NUMBER", Nullable.NULL)
|
|
20
|
+
self.r0: Column = self._create_column("R0", "NUMBER", Nullable.NULL)
|
|
21
|
+
self.x: Column = self._create_column("X", "NUMBER", Nullable.NULL)
|
|
22
|
+
self.x0: Column = self._create_column("X0", "NUMBER", Nullable.NULL)
|
|
23
|
+
self.transformer_end_info_mrid: Column = self._create_column("transformer_end_info_mrid", "TEXT", Nullable.NULL)
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def name(self) -> str:
|
|
27
|
+
return "transformer_star_impedances"
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def unique_index_columns(self) -> Generator[List[Column], None, None]:
|
|
31
|
+
yield from super().unique_index_columns
|
|
32
|
+
yield [self.transformer_end_info_mrid]
|
|
@@ -0,0 +1,27 @@
|
|
|
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__ = ["TableCircuits"]
|
|
7
|
+
|
|
8
|
+
from typing import List, Generator
|
|
9
|
+
|
|
10
|
+
from zepben.ewb.database.sqlite.tables.column import Column, Nullable
|
|
11
|
+
from zepben.ewb.database.sqlite.tables.iec61970.base.wires.table_lines import TableLines
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TableCircuits(TableLines):
|
|
15
|
+
|
|
16
|
+
def __init__(self):
|
|
17
|
+
super().__init__()
|
|
18
|
+
self.loop_mrid: Column = self._create_column("loop_mrid", "TEXT", Nullable.NULL)
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def name(self) -> str:
|
|
22
|
+
return "circuits"
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def non_unique_index_columns(self) -> Generator[List[Column], None, None]:
|
|
26
|
+
yield from super().non_unique_index_columns
|
|
27
|
+
yield [self.loop_mrid]
|
|
@@ -0,0 +1,142 @@
|
|
|
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__ = ["SqliteTable"]
|
|
9
|
+
|
|
10
|
+
from abc import abstractmethod
|
|
11
|
+
from typing import List, Optional, Type, Any, Generator
|
|
12
|
+
|
|
13
|
+
from zepben.ewb.database.sqlite.tables.column import Column, Nullable
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# @dataclass(slots=True)
|
|
17
|
+
class SqliteTable(object):
|
|
18
|
+
"""
|
|
19
|
+
Represents a table in an Sqlite Database. This class should be extended and initialised to build the DDL for a Table.
|
|
20
|
+
Methods that need to be overridden are those marked @abstractmethod.
|
|
21
|
+
Methods that can be optionally overridden are unique_index_columns() and non_unique_index_columns().
|
|
22
|
+
Columns must be assigned in __init__ and column_index must be incremented for each Column created.
|
|
23
|
+
See existing implementations such as TableVersion for examples.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
column_index: int = 0
|
|
27
|
+
"""Used to specify index of the column in the table during initialisation. Always increment BEFORE creating a Column. Indices start from 1."""
|
|
28
|
+
|
|
29
|
+
_column_set: Optional[List[Column]] = None
|
|
30
|
+
_create_table_sql: Optional[str] = None
|
|
31
|
+
_prepared_insert_sql: Optional[str] = None
|
|
32
|
+
_prepared_update_sql: Optional[str] = None
|
|
33
|
+
_create_indexes_sql: Optional[List[str]] = None
|
|
34
|
+
_select_sql: Optional[str] = None
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def name(self) -> str:
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# NOTE: This function is called `description` in teh JVM SDK, but in the python SDK this
|
|
43
|
+
# conflicts with the `description` column of `TableIdentifiedObjects`.
|
|
44
|
+
#
|
|
45
|
+
def describe(self) -> str:
|
|
46
|
+
return self.name.replace("_", " ")
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def create_table_sql(self):
|
|
50
|
+
return self._create_table_sql if self._create_table_sql else self._build_create_table_sql()
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def prepared_insert_sql(self):
|
|
54
|
+
return self._prepared_insert_sql if self._prepared_insert_sql else self._build_prepared_insert_sql()
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def create_indexes_sql(self):
|
|
58
|
+
return self._create_indexes_sql if self._create_indexes_sql else self._build_indexes_sql()
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def select_sql(self):
|
|
62
|
+
return self._select_sql if self._select_sql else self._build_select_sql()
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def prepared_update_sql(self):
|
|
66
|
+
return self._prepared_update_sql if self._prepared_update_sql else self._build_prepared_update_sql()
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def unique_index_columns(self) -> Generator[List[Column], None, None]:
|
|
70
|
+
# To make this a generator we need to `yield`, but we have nothing to yield by default, so trick it by yielding from an empty for-loop.
|
|
71
|
+
for it in []:
|
|
72
|
+
yield it
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def non_unique_index_columns(self) -> Generator[List[Column], None, None]:
|
|
76
|
+
# To make this a generator we need to `yield`, but we have nothing to yield by default, so trick it by yielding from an empty for-loop.
|
|
77
|
+
for it in []:
|
|
78
|
+
yield it
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def column_set(self) -> List[Column]:
|
|
82
|
+
return self._column_set if self._column_set else self._build_column_set(self.__class__, self)
|
|
83
|
+
|
|
84
|
+
def _build_column_set(self, clazz: Type[Any], instance: SqliteTable) -> List[Column]:
|
|
85
|
+
"""
|
|
86
|
+
Builds the list of columns for use in DDL statements for this table.
|
|
87
|
+
|
|
88
|
+
:param clazz: The class of this table.
|
|
89
|
+
:param instance:
|
|
90
|
+
:return:
|
|
91
|
+
"""
|
|
92
|
+
cols = list()
|
|
93
|
+
for field, x in instance.__dict__.items():
|
|
94
|
+
if isinstance(x, Column):
|
|
95
|
+
if x.query_index != len(cols) + 1:
|
|
96
|
+
raise ValueError(
|
|
97
|
+
f"Field {field} in SQL Table class {clazz.__name__} is using an invalid column index. "
|
|
98
|
+
f"Did you forget to increment column_index, or did you skip one?"
|
|
99
|
+
)
|
|
100
|
+
cols.append(x)
|
|
101
|
+
|
|
102
|
+
if len(set([c.name for c in cols])) != len(cols):
|
|
103
|
+
raise ValueError("You have a duplicate column names, go fix that.")
|
|
104
|
+
|
|
105
|
+
self._column_set = sorted(cols, key=lambda it: it.query_index)
|
|
106
|
+
return self._column_set
|
|
107
|
+
|
|
108
|
+
def _build_create_table_sql(self) -> str:
|
|
109
|
+
self._create_table_sql = f"CREATE TABLE {self.name} ({', '.join([str(c) for c in self.column_set])})"
|
|
110
|
+
return self._create_table_sql
|
|
111
|
+
|
|
112
|
+
def _build_prepared_insert_sql(self) -> str:
|
|
113
|
+
self._prepared_insert_sql = f"INSERT INTO {self.name} ({', '.join([c.name for c in self.column_set])}) " \
|
|
114
|
+
f"VALUES ({', '.join(['?' for _ in self.column_set])})"
|
|
115
|
+
return self._prepared_insert_sql
|
|
116
|
+
|
|
117
|
+
def _build_indexes_sql(self) -> List[str]:
|
|
118
|
+
statements = []
|
|
119
|
+
for index_col in self.unique_index_columns:
|
|
120
|
+
statements.append(self._build_index_sql(index_col, True))
|
|
121
|
+
for index_col in self.non_unique_index_columns:
|
|
122
|
+
statements.append(self._build_index_sql(index_col, False))
|
|
123
|
+
self._create_indexes_sql = statements
|
|
124
|
+
return self._create_indexes_sql
|
|
125
|
+
|
|
126
|
+
def _build_index_sql(self, index_col: List[Column], is_unique: bool):
|
|
127
|
+
id_string = f"{self.name}_{'_'.join(map(lambda c: c.name, index_col))}"
|
|
128
|
+
col_string = ', '.join(map(lambda c: c.name, index_col))
|
|
129
|
+
return f"CREATE {'UNIQUE ' if is_unique else ''}INDEX {id_string} ON {self.name} ({col_string})"
|
|
130
|
+
|
|
131
|
+
def _build_select_sql(self) -> str:
|
|
132
|
+
self._select_sql = f"SELECT {', '.join([c.name for c in self.column_set])} FROM {self.name}"
|
|
133
|
+
return self._select_sql
|
|
134
|
+
|
|
135
|
+
def _build_prepared_update_sql(self) -> str:
|
|
136
|
+
self._prepared_update_sql = f"UPDATE {self.name} SET {', '.join([f'{c.name} = ?' for c in self.column_set])}"
|
|
137
|
+
return self._prepared_update_sql
|
|
138
|
+
|
|
139
|
+
def _create_column(self, name: str, type_: str, nullable: Nullable = Nullable.NONE) -> Column:
|
|
140
|
+
self.column_index += 1
|
|
141
|
+
# noinspection PyArgumentList
|
|
142
|
+
return Column(self.column_index, name, type_, nullable)
|
|
@@ -0,0 +1,21 @@
|
|
|
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__ = ["TableMetadataDataSources"]
|
|
7
|
+
|
|
8
|
+
from zepben.ewb.database.sqlite.tables.column import Column, Nullable
|
|
9
|
+
from zepben.ewb.database.sqlite.tables.sqlite_table import SqliteTable
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TableMetadataDataSources(SqliteTable):
|
|
13
|
+
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.source: Column = self._create_column("source", "TEXT", Nullable.NOT_NULL)
|
|
16
|
+
self.version: Column = self._create_column("version", "TEXT", Nullable.NOT_NULL)
|
|
17
|
+
self.timestamp: Column = self._create_column("timestamp", "TEXT", Nullable.NOT_NULL)
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def name(self) -> str:
|
|
21
|
+
return "metadata_data_sources"
|
|
@@ -0,0 +1,38 @@
|
|
|
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__ = ["TableVersion"]
|
|
7
|
+
|
|
8
|
+
import sqlite3
|
|
9
|
+
from sqlite3 import Cursor
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.database.sqlite.tables.column import Column, Nullable
|
|
13
|
+
from zepben.ewb.database.sqlite.tables.sqlite_table import SqliteTable
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TableVersion(SqliteTable):
|
|
17
|
+
SUPPORTED_VERSION = 59
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.version: Column = self._create_column("version", "TEXT", Nullable.NOT_NULL)
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def name(self) -> str:
|
|
24
|
+
return "version"
|
|
25
|
+
|
|
26
|
+
def get_version(self, cur: Cursor) -> Optional[int]:
|
|
27
|
+
"""
|
|
28
|
+
Helper function to read the version from the database.
|
|
29
|
+
"""
|
|
30
|
+
try:
|
|
31
|
+
cur.execute(self.select_sql)
|
|
32
|
+
rows = cur.fetchall()
|
|
33
|
+
if len(rows) == 1:
|
|
34
|
+
return int(rows[0][0])
|
|
35
|
+
except sqlite3.Error:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
return None
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# LICENCE EXCLUDED
|
|
2
|
+
"""
|
|
3
|
+
Copyright (C) 2020 biqqles.
|
|
4
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
Forked from https://github.com/biqqles/dataclassy/tree/v0.6.2
|
|
9
|
+
"""
|
|
10
|
+
from .decorator import dataclass, make_dataclass
|
|
11
|
+
from .dataclass import DataClass, Internal
|
|
12
|
+
from .functions import fields, values, as_dict, as_tuple, replace
|
|
13
|
+
|
|
14
|
+
# aliases intended for migration from dataclasses
|
|
15
|
+
asdict, astuple = as_dict, as_tuple
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# LICENCE EXCLUDED
|
|
2
|
+
"""
|
|
3
|
+
Copyright (C) 2020 biqqles.
|
|
4
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
This file contains the internal mechanism that makes data classes
|
|
9
|
+
work, as well as functions which operate on them.
|
|
10
|
+
|
|
11
|
+
Forked from https://github.com/biqqles/dataclassy/tree/v0.6.2 with this additional bugfix:
|
|
12
|
+
https://github.com/biqqles/dataclassy/commit/ec9273ca02e5caefc08c923112fa9eeecf517246
|
|
13
|
+
"""
|
|
14
|
+
from types import FunctionType as Function
|
|
15
|
+
from typing import Any, Dict, Generic, Hashable, TypeVar
|
|
16
|
+
from reprlib import recursive_repr
|
|
17
|
+
|
|
18
|
+
DataClass = Any # type hint for variables that should be data class instances
|
|
19
|
+
T = TypeVar('T')
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Internal(Generic[T]):
|
|
23
|
+
"""This type hint wrapper represents a field that is internal to the data class and is, for example, not to be
|
|
24
|
+
shown in a repr."""
|
|
25
|
+
@classmethod
|
|
26
|
+
def is_internal(cls, annotation):
|
|
27
|
+
return getattr(annotation, '__origin__', None) is cls or \
|
|
28
|
+
(type(annotation) is str and cls.__name__ in annotation)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class DataClassMeta(type):
|
|
32
|
+
"""The metaclass for a data class."""
|
|
33
|
+
DEFAULT_OPTIONS = dict(init=True, repr=True, eq=True, iter=False, frozen=False, kwargs=False, slots=False,
|
|
34
|
+
order=False, unsafe_hash=True, hide_internals=True)
|
|
35
|
+
|
|
36
|
+
def __new__(mcs, name, bases, dict_, **kwargs):
|
|
37
|
+
# collect annotations, defaults, slots and options from this class' ancestors, in definition order
|
|
38
|
+
all_annotations = {}
|
|
39
|
+
all_defaults = {}
|
|
40
|
+
all_slots = set()
|
|
41
|
+
options = dict(mcs.DEFAULT_OPTIONS)
|
|
42
|
+
|
|
43
|
+
dataclass_bases = [vars(b) for b in bases if hasattr(b, '__dataclass__')]
|
|
44
|
+
for b in dataclass_bases + [dict_]:
|
|
45
|
+
all_annotations.update(b.get('__annotations__', {}))
|
|
46
|
+
all_defaults.update(b.get('__defaults__', dict_))
|
|
47
|
+
all_slots.update(b.get('__slots__', set()))
|
|
48
|
+
options.update(b.get('__dataclass__', {}))
|
|
49
|
+
options.update(kwargs)
|
|
50
|
+
|
|
51
|
+
# fill out this class' dict and store defaults, annotations and decorator options for future subclasses
|
|
52
|
+
dict_.update(all_defaults)
|
|
53
|
+
dict_['__defaults__'] = all_defaults
|
|
54
|
+
dict_['__annotations__'] = all_annotations
|
|
55
|
+
dict_['__dataclass__'] = options
|
|
56
|
+
|
|
57
|
+
# delete what will become stale references so that Python creates new ones
|
|
58
|
+
del dict_['__dict__'], dict_['__weakref__']
|
|
59
|
+
|
|
60
|
+
# create/apply generated methods and attributes
|
|
61
|
+
user_init = type(dict_.get('__init__')) is Function
|
|
62
|
+
|
|
63
|
+
if options['slots']:
|
|
64
|
+
# values with default values must only be present in slots, not dict, otherwise Python will interpret them
|
|
65
|
+
# as read only
|
|
66
|
+
for d in all_annotations.keys() & all_defaults.keys():
|
|
67
|
+
del dict_[d]
|
|
68
|
+
dict_['__slots__'] = all_annotations.keys() - all_slots
|
|
69
|
+
elif '__slots__' in dict_:
|
|
70
|
+
# if the slots option has been removed from an inheriting dataclass we must remove descriptors and __slots__
|
|
71
|
+
for d in all_annotations.keys() - all_defaults.keys() & dict_.keys():
|
|
72
|
+
del dict_[d]
|
|
73
|
+
del dict_['__slots__']
|
|
74
|
+
if options['init']:
|
|
75
|
+
dict_.setdefault('__new__', _generate_new(all_annotations, all_defaults, user_init,
|
|
76
|
+
options['kwargs'], options['frozen']))
|
|
77
|
+
if options['repr']:
|
|
78
|
+
dict_.setdefault('__repr__', recursive_repr()(__repr__))
|
|
79
|
+
if options['eq']:
|
|
80
|
+
dict_.setdefault('__eq__', __eq__)
|
|
81
|
+
if options['iter']:
|
|
82
|
+
dict_.setdefault('__iter__', __iter__)
|
|
83
|
+
if options['frozen']:
|
|
84
|
+
dict_['__delattr__'] = dict_['__setattr__'] = __setattr__
|
|
85
|
+
if options['order']:
|
|
86
|
+
dict_.setdefault('__lt__', __lt__)
|
|
87
|
+
if (options['eq'] and options['frozen']) or options['unsafe_hash']:
|
|
88
|
+
dict_.setdefault('__hash__', __hash__)
|
|
89
|
+
|
|
90
|
+
return type.__new__((DataClassInit if options['init'] and user_init else mcs), name, bases, dict_)
|
|
91
|
+
|
|
92
|
+
def __init__(cls, *args, **kwargs):
|
|
93
|
+
# warn the user if they try to use __post_init__
|
|
94
|
+
if hasattr(cls, '__post_init__'):
|
|
95
|
+
raise TypeError('dataclassy does not use __post_init__. You should rename this method __init__')
|
|
96
|
+
|
|
97
|
+
if cls.__dataclass__['eq'] and cls.__dataclass__['order']:
|
|
98
|
+
from functools import total_ordering
|
|
99
|
+
total_ordering(cls)
|
|
100
|
+
|
|
101
|
+
# determine a static expression for an instance's fields as a tuple, then evaluate this to create a property
|
|
102
|
+
# allowing efficient representation for internal methods
|
|
103
|
+
tuple_expr = f'({", ".join((*(f"self.{f}" for f in fields(cls)), ""))})' # "" ensures closing comma
|
|
104
|
+
cls.__tuple__ = property(eval(f'lambda self: {tuple_expr}'))
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class DataClassInit(DataClassMeta):
|
|
108
|
+
"""In the case that a custom __init__ is defined, remove arguments used by __new__ before calling it."""
|
|
109
|
+
def __call__(cls, *args, **kwargs):
|
|
110
|
+
args = iter(args)
|
|
111
|
+
new_kwargs = dict(zip(cls.__annotations__, args)) # convert positional args to keyword for __new__
|
|
112
|
+
instance = cls.__new__(cls, **new_kwargs, **kwargs)
|
|
113
|
+
|
|
114
|
+
for parameter in kwargs.keys() & cls.__annotations__.keys():
|
|
115
|
+
del kwargs[parameter]
|
|
116
|
+
|
|
117
|
+
instance.__init__(*args, **kwargs)
|
|
118
|
+
return instance
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def __signature__(cls):
|
|
122
|
+
"""Defining a __call__ breaks inspect.signature. Lazily generate a Signature object ourselves."""
|
|
123
|
+
import inspect
|
|
124
|
+
parameters = tuple(inspect.signature(cls.__new__).parameters.values())
|
|
125
|
+
return inspect.Signature(parameters[1:]) # remove 'cls' to transform parameters of __new__ into those of class
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _generate_new(annotations: Dict, defaults: Dict, user_init: bool, gen_kwargs: bool, frozen: bool) -> Function:
|
|
129
|
+
"""Generate and return a __new__ method for a data class which has as parameters all fields of the data class.
|
|
130
|
+
When the data class is initialised, arguments to this function are applied to the fields of the new instance. Using
|
|
131
|
+
__new__ frees up __init__, allowing it to be defined by the user to perform additional, custom initialisation.
|
|
132
|
+
|
|
133
|
+
If __init__ is defined, all arguments to __new__ become keyword-only, and the custom __call__ converts positional
|
|
134
|
+
arguments to keyword arguments. This prevents ambiguity during attempts to pass the same argument twice,
|
|
135
|
+
positionally and as a keyword."""
|
|
136
|
+
arguments = [a for a in annotations if a not in defaults]
|
|
137
|
+
default_arguments = [f'{a}={a}' for a in annotations if a in defaults]
|
|
138
|
+
kw_only = ['*'] if user_init and (arguments or default_arguments) else []
|
|
139
|
+
kwargs = ['**kwargs'] if gen_kwargs or user_init else [] # pass through unknown keyword arguments to __init__
|
|
140
|
+
|
|
141
|
+
parameters = ', '.join(kw_only + arguments + default_arguments + kwargs)
|
|
142
|
+
|
|
143
|
+
# determine what to do with arguments before assignment. If the argument matches a mutable default, make a copy
|
|
144
|
+
references = {n: f'{n}.copy() if {n} is self.__defaults__[{n!r}] else {n}'
|
|
145
|
+
if n in defaults and hasattr(defaults[n], 'copy') else n for n in annotations}
|
|
146
|
+
|
|
147
|
+
# if the class is frozen, use the necessary but slightly slower object.__setattr__
|
|
148
|
+
assignments = [f'object.__setattr__(self, {n!r}, {r})' if frozen else f'self.{n} = {r}'
|
|
149
|
+
for n, r in references.items()]
|
|
150
|
+
|
|
151
|
+
# generate the function
|
|
152
|
+
signature = f'def __new__(cls, {parameters}):'
|
|
153
|
+
body = [f'self = object.__new__(cls)', *assignments, 'return self']
|
|
154
|
+
|
|
155
|
+
exec('\n\t'.join([signature, *body]), {}, defaults)
|
|
156
|
+
function = defaults.pop('__new__')
|
|
157
|
+
function.__annotations__ = annotations
|
|
158
|
+
return function
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# generic method implementations common to all data classes
|
|
162
|
+
# these are currently relatively inefficient - it would be better to cache an expression for a class' tuple
|
|
163
|
+
from .functions import values, fields
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def __eq__(self: DataClass, other: DataClass):
|
|
167
|
+
return type(self) is type(other) and self.__tuple__ == other.__tuple__
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def __lt__(self: DataClass, other: DataClass):
|
|
171
|
+
if isinstance(other, type(self)):
|
|
172
|
+
return self.__tuple__ < other.__tuple__
|
|
173
|
+
return NotImplemented
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def __hash__(self):
|
|
177
|
+
# currently not ideal since gives no warning if a field expected to be hashable is not
|
|
178
|
+
return hash((type(self), *(v for v in self.__tuple__ if v is isinstance(v, Hashable))))
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def __iter__(self):
|
|
182
|
+
return iter(self.__tuple__)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def __repr__(self):
|
|
186
|
+
show_internals = not self.__dataclass__['hide_internals']
|
|
187
|
+
field_values = ', '.join(f'{f}={v!r}' for f, v in values(self, show_internals).items())
|
|
188
|
+
return f'{type(self).__name__}({field_values})'
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def __setattr__(self, *args):
|
|
192
|
+
raise AttributeError('Frozen class')
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# LICENCE EXCLUDED
|
|
2
|
+
"""
|
|
3
|
+
Copyright (C) 2020 biqqles.
|
|
4
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
This file contains code relating to dataclassy's decorator.
|
|
9
|
+
|
|
10
|
+
Forked from https://github.com/biqqles/dataclassy/tree/v0.6.2
|
|
11
|
+
"""
|
|
12
|
+
from typing import Any, Dict, Optional
|
|
13
|
+
from .dataclass import DataClassMeta
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def dataclass(cls: Optional[type] = None, *, meta=DataClassMeta, **options):
|
|
17
|
+
"""The decorator used to apply DataClassMeta, or optionally a subclass of that metaclass, to a class."""
|
|
18
|
+
assert issubclass(meta, DataClassMeta)
|
|
19
|
+
|
|
20
|
+
def apply_metaclass(to_class, metaclass=meta):
|
|
21
|
+
"""Apply a metaclass to a class."""
|
|
22
|
+
dict_ = dict(vars(to_class), __metaclass__=metaclass)
|
|
23
|
+
return metaclass(to_class.__name__, to_class.__bases__, dict_, **options)
|
|
24
|
+
|
|
25
|
+
if cls: # if decorator used with no arguments, apply metaclass to the class immediately
|
|
26
|
+
if not isinstance(cls, type):
|
|
27
|
+
raise TypeError('This decorator takes no explicit positional arguments')
|
|
28
|
+
return apply_metaclass(cls)
|
|
29
|
+
return apply_metaclass # otherwise, return function for later evaluation
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def make_dataclass(name: str, fields: Dict[str, type], defaults: Dict[str, Any], bases=(), **options) -> type:
|
|
33
|
+
"""Dynamically create a data class with name `name`, fields `fields`, default field values `defaults` and
|
|
34
|
+
inheriting from `bases`."""
|
|
35
|
+
return dataclass(type(name, bases, dict(defaults, __annotations__=fields)), **options)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# LICENCE EXCLUDED
|
|
2
|
+
"""
|
|
3
|
+
Copyright (C) 2020 biqqles.
|
|
4
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
This file defines functions which operate on data classes.
|
|
9
|
+
|
|
10
|
+
Forked from https://github.com/biqqles/dataclassy/tree/v0.6.2
|
|
11
|
+
"""
|
|
12
|
+
from typing import Any, Callable, Dict, Tuple, Type
|
|
13
|
+
|
|
14
|
+
from .dataclass import DataClassMeta, DataClass, Internal
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def is_dataclass(obj: Any) -> bool:
|
|
18
|
+
"""Return True if the given object is a data class as implemented in this package, otherwise False."""
|
|
19
|
+
return isinstance(obj, DataClassMeta) or is_dataclass_instance(obj)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def is_dataclass_instance(obj: Any) -> bool:
|
|
23
|
+
"""Return True if the given object is an instance of a data class, otherwise False."""
|
|
24
|
+
return isinstance(type(obj), DataClassMeta)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def fields(dataclass: Type[DataClass], internals=False) -> Dict[str, Type]:
|
|
28
|
+
"""Return a dict of `dataclass`'s fields and their types. `internals` selects whether to include internal fields.
|
|
29
|
+
`dataclass` can be either a data class or an instance of a data class. A field is defined as a class-level variable
|
|
30
|
+
with a type annotation."""
|
|
31
|
+
assert is_dataclass(dataclass)
|
|
32
|
+
return _filter_annotations(dataclass.__annotations__, internals)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def values(dataclass: DataClass, internals=False) -> Dict[str, Any]:
|
|
36
|
+
"""Return a dict of `dataclass`'s fields and their values. `internals` selects whether to include internal fields.
|
|
37
|
+
`dataclass` must be an instance of a data class. A field is defined as a class-level variable with a type
|
|
38
|
+
annotation."""
|
|
39
|
+
assert is_dataclass_instance(dataclass)
|
|
40
|
+
return {f: getattr(dataclass, f) for f in fields(dataclass, internals)}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def as_dict(dataclass: DataClass, dict_factory=dict) -> Dict[str, Any]:
|
|
44
|
+
"""Recursively create a dict of a dataclass instance's fields and their values.
|
|
45
|
+
This function is recursively called on data classes, named tuples and iterables."""
|
|
46
|
+
assert is_dataclass_instance(dataclass)
|
|
47
|
+
return _recurse_structure(dataclass, dict_factory)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def as_tuple(dataclass: DataClass) -> Tuple:
|
|
51
|
+
"""Recursively create a tuple of the values of a dataclass instance's fields, in definition order.
|
|
52
|
+
This function is recursively called on data classes, named tuples and iterables."""
|
|
53
|
+
assert is_dataclass_instance(dataclass)
|
|
54
|
+
return _recurse_structure(dataclass, lambda k_v: tuple(v for k, v in k_v))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def replace(dataclass: DataClass, **changes) -> DataClass:
|
|
58
|
+
"""Return a new copy of `dataclass` with field values replaced as specified in `changes`."""
|
|
59
|
+
return type(dataclass)(**dict(values(dataclass, internals=True), **changes))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _filter_annotations(annotations: Dict[str, Type], internals: bool) -> Dict[str, Type]:
|
|
63
|
+
"""Filter an annotations dict for to remove or keep internal fields."""
|
|
64
|
+
return annotations if internals else {f: a for f, a in annotations.items()
|
|
65
|
+
if not f.startswith('_') and not Internal.is_internal(a)}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _recurse_structure(var: Any, iter_proc: Callable) -> Any:
|
|
69
|
+
"""Recursively convert an arbitrarily nested structure beginning at `var`, copying and processing any iterables
|
|
70
|
+
encountered with `iter_proc`."""
|
|
71
|
+
if is_dataclass(var):
|
|
72
|
+
var = values(var, internals=True)
|
|
73
|
+
if hasattr(var, '_asdict'): # handle named tuples
|
|
74
|
+
# noinspection PyCallingNonCallable, PyProtectedMember
|
|
75
|
+
var = var._asdict()
|
|
76
|
+
if isinstance(var, dict):
|
|
77
|
+
return iter_proc((_recurse_structure(k, iter_proc), _recurse_structure(v, iter_proc)) for k, v in var.items())
|
|
78
|
+
if isinstance(var, (list, tuple)):
|
|
79
|
+
return type(var)(_recurse_structure(e, iter_proc) for e in var)
|
|
80
|
+
return var
|
|
@@ -0,0 +1,6 @@
|
|
|
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 zepben.ewb.examples.simple_test_network import *
|