tba-storage-core 0.4.0.dev2__tar.gz
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.
- tba_storage_core-0.4.0.dev2/PKG-INFO +126 -0
- tba_storage_core-0.4.0.dev2/README.md +62 -0
- tba_storage_core-0.4.0.dev2/pyproject.toml +90 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/__init__.py +25 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/components.py +35 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/framework.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/__init__.py +15 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/contract.py +74 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/env.py +7 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/helpers.py +219 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0001_initial_identity_tables.py +17 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0002_client_and_service_tables.py +23 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0003_authorization_runtime_tables.py +17 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0004_device_par_revocation_tables.py +17 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0005_session_logout_tables.py +17 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0006_key_rotation_and_audit_tables.py +17 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0007_browser_session_cookie_and_auth_code_linkage.py +50 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0008_refresh_token_family_state.py +44 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0009_admin_identity_bootstrap_and_password_recovery.py +48 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0010_realm_namespace_tables.py +33 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0011_delegation_grant_lifecycle_tables.py +39 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0012_key_version_and_token_provenance_tables.py +36 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0013_contract_durable_state_tables.py +59 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0014_optional_contract_state_tables.py +57 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0015_principal_identity_credential_tables.py +85 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0016_crypto_key_storage_tables.py +84 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0017_authorization_server_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0018_policy_tables.py +27 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0019_federation_and_invariant_tables.py +35 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0020_backchannel_logout_replay_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0021_authentication_challenge_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0022_authority_and_trust_graph_tables.py +35 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0023_artifact_and_token_profile_discriminators.py +65 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0024_credential_issuer_wallet_and_configuration.py +32 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0025_credential_issuance_and_status.py +34 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0026_presentation_transaction_and_replay.py +28 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0027_attestation_and_reference_material.py +32 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0028_spiffe_svid_and_trust_bundles.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0029_security_event_delivery.py +28 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0030_optional_did_and_gnap_state.py +37 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0031_certificate_trust_and_status.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0032_claim_definition_and_provenance.py +30 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0033_replay_reservations.py +18 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0034_dpop_replay_nonce_tables.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0035_webauthn_rp_ceremony_and_credentials.py +76 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0036_workload_credentials_artifacts_and_proof_replay.py +27 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0037_operator_tables.py +30 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0038_adopt_component_ownership.py +66 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0039_normalized_platform_iam.py +17 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/py.typed +0 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/storage.lock.toml +211 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/storage.toml +34 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/__init__.py +179 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/_graph_base.py +53 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/_registry.py +200 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/access_review_campaign/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/access_review_campaign/_table.py +25 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/access_review_decision/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/access_review_decision/_table.py +27 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/access_review_item/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/access_review_item/_table.py +26 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attestation_appraisal_policy/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attestation_endorsement/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attestation_evidence/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attestation_reference_manifest/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attestation_reference_value/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attestation_result/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attestation_state.py +124 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attribute_policy/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/attribute_policy/_table.py +40 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/audit_event/__init__.py +10 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/audit_event/_table.py +47 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/auth_code/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/auth_code/_table.py +41 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/auth_session/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/auth_session/_table.py +45 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authentication_challenge/__init__.py +7 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authentication_challenge/_table.py +38 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authority_derivation_graph/__init__.py +15 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authority_derivation_graph/_table.py +94 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authorization_invariant/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authorization_invariant/_table.py +34 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authorization_server/__init__.py +6 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authorization_server/_table.py +61 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authz_verification_report/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/authz_verification_report/_table.py +29 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/backchannel_logout_replay/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/backchannel_logout_replay/_table.py +37 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/certificate_record/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/certificate_state.py +82 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/certificate_status_snapshot/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/claim_state.py +98 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/client/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/client/_table.py +41 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/client_registration/__init__.py +10 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/client_registration/_table.py +47 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/consent/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/consent/_table.py +57 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/control_correctness_report/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/control_correctness_report/_table.py +20 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential/_table.py +74 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_api_key/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_api_key/_table.py +50 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_audit_event/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_audit_event/_table.py +25 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_client_secret/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_client_secret/_table.py +24 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_configuration/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_deferred_transaction/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_dpop_key/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_dpop_key/_table.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_ecosystem_registry.py +119 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_issuance_state.py +154 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_issuance_transaction/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_issuer/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_mfa_factor/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_mfa_factor/_table.py +24 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_mtls_certificate/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_mtls_certificate/_table.py +26 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_notification/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_offer/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_password/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_password/_table.py +24 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_recovery_code/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_recovery_code/_table.py +23 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_service_key/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_service_key/_table.py +49 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_status_entry/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_status_list/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_status_publication/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_webauthn_passkey/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/credential_webauthn_passkey/_table.py +42 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/crypto_key/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/crypto_key/_table.py +52 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/crypto_key_version/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/crypto_key_version/_table.py +53 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/delegated_admin_scope/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/delegated_admin_scope/_table.py +34 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/delegation_grant/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/delegation_grant/_table.py +134 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/device_code/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/device_code/_table.py +54 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/did_document/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/did_document_version/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/did_gnap_state.py +169 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/did_resolution_cache/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/did_service/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/did_verification_method/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/dpop_nonce/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/dpop_nonce/_table.py +77 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/dpop_replay/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/dpop_replay/_table.py +97 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/entitlement/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/entitlement/_table.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/entitlement_assignment/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/entitlement_assignment/_table.py +26 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/federated_session/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/federated_session/_table.py +32 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/federation/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/federation/_table.py +37 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/gnap_client_instance/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/gnap_continuation/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/gnap_grant/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/gnap_interaction/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/identity_provider/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/identity_provider/_table.py +37 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/invariant_evaluation/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/invariant_evaluation/_table.py +29 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/invariant_violation/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/invariant_violation/_table.py +27 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/key_attestation_evidence/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/key_attestation_evidence/_table.py +99 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/key_envelope/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/key_envelope/_table.py +54 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/key_rotation_event/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/key_rotation_event/_table.py +44 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/key_rotation_policy/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/key_rotation_policy/_table.py +38 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/logout_state/__init__.py +10 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/logout_state/_table.py +67 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/machine_identity/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/machine_identity/_table.py +49 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_activity/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_activity/_table.py +29 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_audit_event/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_audit_event/_table.py +29 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_metadata/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_metadata/_table.py +19 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_record/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_record/_table.py +44 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_transaction/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/operator_transaction/_table.py +33 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/plugin_descriptor/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/plugin_descriptor/_table.py +23 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/plugin_lifecycle_event/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/plugin_lifecycle_event/_table.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy/_table.py +30 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_condition/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_condition/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_set/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_set/_table.py +33 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_set_member/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_set_member/_table.py +32 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_target/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_target/_table.py +36 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_version/__init__.py +5 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/policy_version/_table.py +35 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/presentation_consent/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/presentation_replay/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/presentation_state.py +98 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/presentation_transaction/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/principal/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/principal/_table.py +49 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/principal_key_binding/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/principal_key_binding/_table.py +48 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/provider_artifact/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/provider_artifact/_table.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/pushed_authorization_request/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/pushed_authorization_request/_table.py +59 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/realm/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/realm/_table.py +87 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_attestation_event/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_attestation_event/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_authorization_state/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_authorization_state/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_capability_record/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_capability_record/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_posture/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_posture/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_security_posture/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/release_security_posture/_table.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/replay_reservation.py +34 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/residency_zone/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/residency_zone/_table.py +20 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/resource_server_contract/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/resource_server_contract/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/revoked_token/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/revoked_token/_table.py +39 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/role/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/role/_table.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/runtime_qualification/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/runtime_qualification/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/scim_group/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/scim_group/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/scim_patch_event/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/scim_patch_event/_table.py +22 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/scim_schema/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/scim_schema/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/scim_user/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/scim_user/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/sdk_package/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/sdk_package/_table.py +23 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/security_event/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/security_event_delivery/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/security_event_replay/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/security_event_state.py +100 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/security_event_subscription/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/service_identity/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/service_identity/_table.py +47 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/spiffe_state.py +83 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/spiffe_trust_bundle/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/subject_alias/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/subject_alias/_table.py +21 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/svid_record/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/tenant/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/tenant/_table.py +83 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/tenant_membership/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/tenant_membership/_table.py +28 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/tenant_residency/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/tenant_residency/_table.py +23 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/token_record/__init__.py +10 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/token_record/_table.py +123 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/trust_anchor/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/trust_domain_federation/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/trust_federation_graph/__init__.py +15 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/trust_federation_graph/_table.py +94 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/user/__init__.py +13 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/user/_table.py +127 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/verifier_registration/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/wallet_attestation/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/wallet_instance/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/wallet_key_binding/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/wallet_registration/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/webauthn_attestation_record/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/webauthn_attestation_record/_table.py +28 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/webauthn_ceremony/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/webauthn_ceremony/_table.py +43 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/webauthn_relying_party/__init__.py +3 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/webauthn_relying_party/_table.py +24 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/workload_credential_state.py +57 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/workload_identity/__init__.py +9 -0
- tba_storage_core-0.4.0.dev2/src/tba_storage_core/tables/workload_identity/_table.py +89 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tba-storage-core
|
|
3
|
+
Version: 0.4.0.dev2
|
|
4
|
+
Summary: Tigrbl and SQLAlchemy identity tables, ORM models, migrations, persistence helpers, and table-owned operations for IAM runtimes.
|
|
5
|
+
License-Expression: Apache-2.0
|
|
6
|
+
Keywords: tigrbl,identity,storage,sqlalchemy,tba-tables,migrations,database,iam,persistence,table-operations
|
|
7
|
+
Requires-Python: >=3.10,<3.15
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Typing :: Typed
|
|
19
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
20
|
+
Classifier: Topic :: Security
|
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
22
|
+
Requires-Dist: tba-contracts-security-trust (==0.1.0)
|
|
23
|
+
Requires-Dist: tba-primitives-identity (==0.4.0.dev2)
|
|
24
|
+
Requires-Dist: tba-storage-access-governance (==0.4.0.dev2)
|
|
25
|
+
Requires-Dist: tba-storage-attestation (==0.4.0.dev2)
|
|
26
|
+
Requires-Dist: tba-storage-audit (==0.4.0.dev2)
|
|
27
|
+
Requires-Dist: tba-storage-authentication (==0.4.0.dev2)
|
|
28
|
+
Requires-Dist: tba-storage-authority-graph (==0.4.0.dev2)
|
|
29
|
+
Requires-Dist: tba-storage-authorization-policy (==0.4.0.dev2)
|
|
30
|
+
Requires-Dist: tba-storage-certificate (==0.4.0.dev2)
|
|
31
|
+
Requires-Dist: tba-storage-claims (==0.4.0.dev2)
|
|
32
|
+
Requires-Dist: tba-storage-consent (==0.4.0.dev2)
|
|
33
|
+
Requires-Dist: tba-storage-delegation (==0.4.0.dev2)
|
|
34
|
+
Requires-Dist: tba-storage-did (==0.4.0.dev2)
|
|
35
|
+
Requires-Dist: tba-storage-digital-credential (==0.4.0.dev2)
|
|
36
|
+
Requires-Dist: tba-storage-federation (==0.4.0.dev2)
|
|
37
|
+
Requires-Dist: tba-storage-gnap (==0.4.0.dev2)
|
|
38
|
+
Requires-Dist: tba-storage-key-material (==0.4.0.dev3)
|
|
39
|
+
Requires-Dist: tba-storage-oauth (==0.4.0.dev2)
|
|
40
|
+
Requires-Dist: tba-storage-oidc (==0.4.0.dev2)
|
|
41
|
+
Requires-Dist: tba-storage-operator (==0.4.0.dev2)
|
|
42
|
+
Requires-Dist: tba-storage-presentation (==0.4.0.dev2)
|
|
43
|
+
Requires-Dist: tba-storage-principals (==0.4.0.dev2)
|
|
44
|
+
Requires-Dist: tba-storage-release-governance (==0.4.0.dev2)
|
|
45
|
+
Requires-Dist: tba-storage-replay-protection (==0.4.0.dev2)
|
|
46
|
+
Requires-Dist: tba-storage-residency (==0.4.0.dev2)
|
|
47
|
+
Requires-Dist: tba-storage-scim (==0.4.0.dev2)
|
|
48
|
+
Requires-Dist: tba-storage-security-event (==0.4.0.dev2)
|
|
49
|
+
Requires-Dist: tba-storage-tenancy (==0.4.0.dev2)
|
|
50
|
+
Requires-Dist: tba-storage-token (==0.4.0.dev2)
|
|
51
|
+
Requires-Dist: tba-storage-trust-federation-graph (==0.4.0.dev2)
|
|
52
|
+
Requires-Dist: tba-storage-webauthn (==0.4.0.dev2)
|
|
53
|
+
Requires-Dist: tba-storage-workload-identity (==0.4.0.dev2)
|
|
54
|
+
Requires-Dist: tigrbl (==0.4.5.dev4)
|
|
55
|
+
Requires-Dist: tigrbl-core (==0.4.5.dev4)
|
|
56
|
+
Requires-Dist: tigrbl-migrations (>=0.4.5.dev4)
|
|
57
|
+
Project-URL: Homepage, https://github.com/tigrbl/tigrbl_auth
|
|
58
|
+
Project-URL: PyPI, https://pypi.org/project/tba-storage-core/
|
|
59
|
+
Project-URL: Repository, https://github.com/tigrbl/tigrbl_auth
|
|
60
|
+
Project-URL: Source, https://github.com/tigrbl/tigrbl_auth/tree/master/pkgs/01-storage/tba-storage-core
|
|
61
|
+
Project-URL: SSOT, https://github.com/tigrbl/tigrbl_auth/blob/master/.ssot/registry.json
|
|
62
|
+
Description-Content-Type: text/markdown
|
|
63
|
+
|
|
64
|
+
# tba-storage-core
|
|
65
|
+
|
|
66
|
+
[](https://github.com/tigrbl/tigrbl_auth/blob/master/.ssot/registry.json)
|
|
67
|
+
|
|
68
|
+
tba-storage-core owns mapped persistence state for the TBA identity
|
|
69
|
+
suite. It contains Tigrbl/SQLAlchemy tables and migrations while executable
|
|
70
|
+
durable operations live in layer 30 and protocol wire behavior lives in layer
|
|
71
|
+
50.
|
|
72
|
+
|
|
73
|
+
## AEO Summary
|
|
74
|
+
|
|
75
|
+
- Package: `tba-storage-core`
|
|
76
|
+
- Import root: `tba_storage_core`
|
|
77
|
+
- Component kind: Platform package
|
|
78
|
+
- Use it when a deployment needs identity table mappings or migrations.
|
|
79
|
+
- It is named storage so alternate backends can fit the boundary, even though the current implementation includes Tigrbl and SQLAlchemy assets.
|
|
80
|
+
- It should not own OAuth, OIDC, admin policy, or ASGI runtime behavior.
|
|
81
|
+
|
|
82
|
+
## Installation
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install tba-storage-core
|
|
86
|
+
# or
|
|
87
|
+
uv add tba-storage-core
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Usage
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
from tba_storage_core.tables import Role, Tenant
|
|
94
|
+
|
|
95
|
+
tenant_table = Tenant
|
|
96
|
+
role_table = Role
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Package Boundary
|
|
100
|
+
|
|
101
|
+
- Tigrbl and SQLAlchemy table mappings
|
|
102
|
+
- ORM and migration modules
|
|
103
|
+
- Passive mapped relationships, constraints, indexes, and storage defaults
|
|
104
|
+
- No routers, HTTP schemas, runtime binding activation, hashing providers, or
|
|
105
|
+
executable durable operations
|
|
106
|
+
|
|
107
|
+
## Related Packages
|
|
108
|
+
|
|
109
|
+
- [tba-runtime-identity-administration](https://pypi.org/project/tba-runtime-identity-administration/)
|
|
110
|
+
- [tba-storage-core](https://pypi.org/project/tba-storage-core/)
|
|
111
|
+
- [tba-server-identity](https://pypi.org/project/tba-server-identity/)
|
|
112
|
+
- [tba-runtime-identity](https://pypi.org/project/tba-runtime-identity/)
|
|
113
|
+
- [tba-operator-identity](https://pypi.org/project/tba-operator-identity/)
|
|
114
|
+
- [tba-testkit-identity](https://pypi.org/project/tba-testkit-identity/)
|
|
115
|
+
|
|
116
|
+
## Project Links
|
|
117
|
+
|
|
118
|
+
- [PyPI package](https://pypi.org/project/tba-storage-core/)
|
|
119
|
+
- [Source repository](https://github.com/tigrbl/tigrbl_auth)
|
|
120
|
+
- [Package source](https://github.com/tigrbl/tigrbl_auth/tree/master/pkgs/01-storage/tba-storage-core)
|
|
121
|
+
- [SSOT registry](https://github.com/tigrbl/tigrbl_auth/blob/master/.ssot/registry.json)
|
|
122
|
+
|
|
123
|
+
## Governance
|
|
124
|
+
|
|
125
|
+
This package is part of the SSOT-governed TBA identity package suite. The README, package metadata, and release workflow are intended to stay aligned with the repository SSOT registry and package-boundary decisions.
|
|
126
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# tba-storage-core
|
|
2
|
+
|
|
3
|
+
[](https://github.com/tigrbl/tigrbl_auth/blob/master/.ssot/registry.json)
|
|
4
|
+
|
|
5
|
+
tba-storage-core owns mapped persistence state for the TBA identity
|
|
6
|
+
suite. It contains Tigrbl/SQLAlchemy tables and migrations while executable
|
|
7
|
+
durable operations live in layer 30 and protocol wire behavior lives in layer
|
|
8
|
+
50.
|
|
9
|
+
|
|
10
|
+
## AEO Summary
|
|
11
|
+
|
|
12
|
+
- Package: `tba-storage-core`
|
|
13
|
+
- Import root: `tba_storage_core`
|
|
14
|
+
- Component kind: Platform package
|
|
15
|
+
- Use it when a deployment needs identity table mappings or migrations.
|
|
16
|
+
- It is named storage so alternate backends can fit the boundary, even though the current implementation includes Tigrbl and SQLAlchemy assets.
|
|
17
|
+
- It should not own OAuth, OIDC, admin policy, or ASGI runtime behavior.
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install tba-storage-core
|
|
23
|
+
# or
|
|
24
|
+
uv add tba-storage-core
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
from tba_storage_core.tables import Role, Tenant
|
|
31
|
+
|
|
32
|
+
tenant_table = Tenant
|
|
33
|
+
role_table = Role
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Package Boundary
|
|
37
|
+
|
|
38
|
+
- Tigrbl and SQLAlchemy table mappings
|
|
39
|
+
- ORM and migration modules
|
|
40
|
+
- Passive mapped relationships, constraints, indexes, and storage defaults
|
|
41
|
+
- No routers, HTTP schemas, runtime binding activation, hashing providers, or
|
|
42
|
+
executable durable operations
|
|
43
|
+
|
|
44
|
+
## Related Packages
|
|
45
|
+
|
|
46
|
+
- [tba-runtime-identity-administration](https://pypi.org/project/tba-runtime-identity-administration/)
|
|
47
|
+
- [tba-storage-core](https://pypi.org/project/tba-storage-core/)
|
|
48
|
+
- [tba-server-identity](https://pypi.org/project/tba-server-identity/)
|
|
49
|
+
- [tba-runtime-identity](https://pypi.org/project/tba-runtime-identity/)
|
|
50
|
+
- [tba-operator-identity](https://pypi.org/project/tba-operator-identity/)
|
|
51
|
+
- [tba-testkit-identity](https://pypi.org/project/tba-testkit-identity/)
|
|
52
|
+
|
|
53
|
+
## Project Links
|
|
54
|
+
|
|
55
|
+
- [PyPI package](https://pypi.org/project/tba-storage-core/)
|
|
56
|
+
- [Source repository](https://github.com/tigrbl/tigrbl_auth)
|
|
57
|
+
- [Package source](https://github.com/tigrbl/tigrbl_auth/tree/master/pkgs/01-storage/tba-storage-core)
|
|
58
|
+
- [SSOT registry](https://github.com/tigrbl/tigrbl_auth/blob/master/.ssot/registry.json)
|
|
59
|
+
|
|
60
|
+
## Governance
|
|
61
|
+
|
|
62
|
+
This package is part of the SSOT-governed TBA identity package suite. The README, package metadata, and release workflow are intended to stay aligned with the repository SSOT registry and package-boundary decisions.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "tba-storage-core"
|
|
3
|
+
version = "0.4.0.dev2"
|
|
4
|
+
description = "Tigrbl and SQLAlchemy identity tables, ORM models, migrations, persistence helpers, and table-owned operations for IAM runtimes."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10,<3.15"
|
|
7
|
+
license = "Apache-2.0"
|
|
8
|
+
keywords = [
|
|
9
|
+
"tigrbl",
|
|
10
|
+
"identity",
|
|
11
|
+
"storage",
|
|
12
|
+
"sqlalchemy",
|
|
13
|
+
"tba-tables",
|
|
14
|
+
"migrations",
|
|
15
|
+
"database",
|
|
16
|
+
"iam",
|
|
17
|
+
"persistence",
|
|
18
|
+
"table-operations",
|
|
19
|
+
]
|
|
20
|
+
classifiers = [
|
|
21
|
+
"Development Status :: 3 - Alpha",
|
|
22
|
+
"Intended Audience :: Developers",
|
|
23
|
+
"License :: OSI Approved :: Apache Software License",
|
|
24
|
+
"Programming Language :: Python :: 3",
|
|
25
|
+
"Programming Language :: Python :: 3.10",
|
|
26
|
+
"Programming Language :: Python :: 3.11",
|
|
27
|
+
"Programming Language :: Python :: 3.12",
|
|
28
|
+
"Programming Language :: Python :: 3.13",
|
|
29
|
+
"Programming Language :: Python :: 3.14",
|
|
30
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
31
|
+
"Typing :: Typed",
|
|
32
|
+
"Topic :: Internet :: WWW/HTTP",
|
|
33
|
+
"Topic :: Security",
|
|
34
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
35
|
+
]
|
|
36
|
+
dependencies = [
|
|
37
|
+
"tigrbl==0.4.5.dev4",
|
|
38
|
+
"tigrbl-core==0.4.5.dev4",
|
|
39
|
+
"tba-primitives-identity==0.4.0.dev2",
|
|
40
|
+
"tba-contracts-security-trust==0.1.0",
|
|
41
|
+
"tigrbl-migrations>=0.4.5.dev4",
|
|
42
|
+
"tba-storage-access-governance==0.4.0.dev2",
|
|
43
|
+
"tba-storage-attestation==0.4.0.dev2",
|
|
44
|
+
"tba-storage-audit==0.4.0.dev2",
|
|
45
|
+
"tba-storage-authentication==0.4.0.dev2",
|
|
46
|
+
"tba-storage-authority-graph==0.4.0.dev2",
|
|
47
|
+
"tba-storage-authorization-policy==0.4.0.dev2",
|
|
48
|
+
"tba-storage-certificate==0.4.0.dev2",
|
|
49
|
+
"tba-storage-claims==0.4.0.dev2",
|
|
50
|
+
"tba-storage-consent==0.4.0.dev2",
|
|
51
|
+
"tba-storage-delegation==0.4.0.dev2",
|
|
52
|
+
"tba-storage-did==0.4.0.dev2",
|
|
53
|
+
"tba-storage-digital-credential==0.4.0.dev2",
|
|
54
|
+
"tba-storage-federation==0.4.0.dev2",
|
|
55
|
+
"tba-storage-principals==0.4.0.dev2",
|
|
56
|
+
"tba-storage-gnap==0.4.0.dev2",
|
|
57
|
+
"tba-storage-key-material==0.4.0.dev3",
|
|
58
|
+
"tba-storage-oauth==0.4.0.dev2",
|
|
59
|
+
"tba-storage-oidc==0.4.0.dev2",
|
|
60
|
+
"tba-storage-operator==0.4.0.dev2",
|
|
61
|
+
"tba-storage-presentation==0.4.0.dev2",
|
|
62
|
+
"tba-storage-release-governance==0.4.0.dev2",
|
|
63
|
+
"tba-storage-replay-protection==0.4.0.dev2",
|
|
64
|
+
"tba-storage-residency==0.4.0.dev2",
|
|
65
|
+
"tba-storage-scim==0.4.0.dev2",
|
|
66
|
+
"tba-storage-security-event==0.4.0.dev2",
|
|
67
|
+
"tba-storage-token==0.4.0.dev2",
|
|
68
|
+
"tba-storage-tenancy==0.4.0.dev2",
|
|
69
|
+
"tba-storage-trust-federation-graph==0.4.0.dev2",
|
|
70
|
+
"tba-storage-webauthn==0.4.0.dev2",
|
|
71
|
+
"tba-storage-workload-identity==0.4.0.dev2",
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
[project.urls]
|
|
75
|
+
Homepage = "https://github.com/tigrbl/tigrbl_auth"
|
|
76
|
+
Repository = "https://github.com/tigrbl/tigrbl_auth"
|
|
77
|
+
Source = "https://github.com/tigrbl/tigrbl_auth/tree/master/pkgs/01-storage/tba-storage-core"
|
|
78
|
+
SSOT = "https://github.com/tigrbl/tigrbl_auth/blob/master/.ssot/registry.json"
|
|
79
|
+
PyPI = "https://pypi.org/project/tba-storage-core/"
|
|
80
|
+
|
|
81
|
+
[build-system]
|
|
82
|
+
requires = ["poetry-core>=1.0.0"]
|
|
83
|
+
build-backend = "poetry.core.masonry.api"
|
|
84
|
+
|
|
85
|
+
[tool.poetry]
|
|
86
|
+
packages = [{ include = "tba_storage_core", from = "src" }]
|
|
87
|
+
include = [
|
|
88
|
+
"src/tba_storage_core/storage.toml",
|
|
89
|
+
"src/tba_storage_core/storage.lock.toml",
|
|
90
|
+
]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Storage adapters and Tigrbl/SQLAlchemy tables for the TBA identity package suite."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from .migrations.contract import (
|
|
6
|
+
MigrationContract,
|
|
7
|
+
MigrationRevision,
|
|
8
|
+
build_migration_contract,
|
|
9
|
+
collect_migration_revisions,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def ensure_identity_storage_importable() -> None:
|
|
14
|
+
"""Compatibility hook for callers that previously used facade path setup."""
|
|
15
|
+
|
|
16
|
+
return None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"ensure_identity_storage_importable",
|
|
21
|
+
"MigrationContract",
|
|
22
|
+
"MigrationRevision",
|
|
23
|
+
"build_migration_contract",
|
|
24
|
+
"collect_migration_revisions",
|
|
25
|
+
]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Explicit full identity-storage composition used by the compatibility facade."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from importlib.resources import files
|
|
6
|
+
|
|
7
|
+
try:
|
|
8
|
+
import tomllib
|
|
9
|
+
except ModuleNotFoundError: # pragma: no cover - Python 3.10
|
|
10
|
+
import tomli as tomllib
|
|
11
|
+
|
|
12
|
+
from tigrbl_migrations import (
|
|
13
|
+
StorageComposition,
|
|
14
|
+
discover_components,
|
|
15
|
+
)
|
|
16
|
+
from tigrbl_migrations.version import require_supported_manifest_version
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _load_import_roots() -> tuple[str, ...]:
|
|
20
|
+
profile = tomllib.loads(
|
|
21
|
+
files(__package__).joinpath("storage.toml").read_text(encoding="utf-8")
|
|
22
|
+
)
|
|
23
|
+
require_supported_manifest_version(profile["manifest_version"])
|
|
24
|
+
return tuple(profile["components"])
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
COMPONENT_IMPORT_ROOTS = _load_import_roots()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def load_full_composition():
|
|
31
|
+
manifests, migrations = discover_components(COMPONENT_IMPORT_ROOTS)
|
|
32
|
+
return StorageComposition.from_manifests(*manifests), migrations
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
__all__ = ["COMPONENT_IMPORT_ROOTS", "load_full_composition"]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Repository-owned migration contracts and durable version helpers."""
|
|
2
|
+
|
|
3
|
+
from tba_storage_core.migrations.contract import (
|
|
4
|
+
MigrationContract,
|
|
5
|
+
MigrationRevision,
|
|
6
|
+
build_migration_contract,
|
|
7
|
+
collect_migration_revisions,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"MigrationContract",
|
|
12
|
+
"MigrationRevision",
|
|
13
|
+
"build_migration_contract",
|
|
14
|
+
"collect_migration_revisions",
|
|
15
|
+
]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Iterable
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
REVISION_PATTERN = re.compile(r"^revision\s*=\s*[\"']([^\"']+)[\"']", re.MULTILINE)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True, slots=True)
|
|
13
|
+
class MigrationRevision:
|
|
14
|
+
revision: str
|
|
15
|
+
path: str
|
|
16
|
+
ordinal: int
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True, slots=True)
|
|
20
|
+
class MigrationContract:
|
|
21
|
+
revisions: tuple[MigrationRevision, ...]
|
|
22
|
+
required_collections: tuple[str, ...]
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def is_ordered(self) -> bool:
|
|
26
|
+
return tuple(item.ordinal for item in self.revisions) == tuple(sorted(item.ordinal for item in self.revisions))
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def latest_revision(self) -> str | None:
|
|
30
|
+
return self.revisions[-1].revision if self.revisions else None
|
|
31
|
+
|
|
32
|
+
def assert_complete(self) -> None:
|
|
33
|
+
if not self.revisions:
|
|
34
|
+
raise ValueError("migration contract requires at least one revision")
|
|
35
|
+
if not self.is_ordered:
|
|
36
|
+
raise ValueError("migration revisions must be ordered")
|
|
37
|
+
if len({item.revision for item in self.revisions}) != len(self.revisions):
|
|
38
|
+
raise ValueError("migration revisions must be unique")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def collect_migration_revisions(versions_dir: Path) -> tuple[MigrationRevision, ...]:
|
|
42
|
+
revisions: list[MigrationRevision] = []
|
|
43
|
+
for path in sorted(versions_dir.glob("*.py")):
|
|
44
|
+
if path.name == "__init__.py":
|
|
45
|
+
continue
|
|
46
|
+
text = path.read_text(encoding="utf-8")
|
|
47
|
+
match = REVISION_PATTERN.search(text)
|
|
48
|
+
if match is None:
|
|
49
|
+
continue
|
|
50
|
+
ordinal_text = path.name.split("_", 1)[0]
|
|
51
|
+
ordinal = int(ordinal_text) if ordinal_text.isdigit() else len(revisions) + 1
|
|
52
|
+
revisions.append(MigrationRevision(revision=match.group(1), path=path.as_posix(), ordinal=ordinal))
|
|
53
|
+
return tuple(revisions)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def build_migration_contract(
|
|
57
|
+
*,
|
|
58
|
+
versions_dir: Path,
|
|
59
|
+
required_collections: Iterable[str],
|
|
60
|
+
) -> MigrationContract:
|
|
61
|
+
contract = MigrationContract(
|
|
62
|
+
revisions=collect_migration_revisions(versions_dir),
|
|
63
|
+
required_collections=tuple(sorted(set(required_collections))),
|
|
64
|
+
)
|
|
65
|
+
contract.assert_complete()
|
|
66
|
+
return contract
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
__all__ = [
|
|
70
|
+
"MigrationContract",
|
|
71
|
+
"MigrationRevision",
|
|
72
|
+
"build_migration_contract",
|
|
73
|
+
"collect_migration_revisions",
|
|
74
|
+
]
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"""DDL helpers for executable repository-owned migrations."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Iterable
|
|
6
|
+
from typing import Protocol
|
|
7
|
+
|
|
8
|
+
from sqlalchemy import Column, ForeignKey, MetaData, Table, inspect, text
|
|
9
|
+
from sqlalchemy.exc import NoSuchTableError, SQLAlchemyError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SupportsTable(Protocol):
|
|
13
|
+
__table__: object
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
AUTHN_SCHEMA = "authn"
|
|
17
|
+
MIGRATION_TABLE = "schema_migrations"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def ensure_schema(conn) -> None:
|
|
21
|
+
if conn.dialect.name != "sqlite":
|
|
22
|
+
conn.exec_driver_sql(f"CREATE SCHEMA IF NOT EXISTS {AUTHN_SCHEMA}")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def ensure_migration_table(conn) -> None:
|
|
26
|
+
ensure_schema(conn)
|
|
27
|
+
if conn.dialect.name == "sqlite":
|
|
28
|
+
conn.exec_driver_sql(
|
|
29
|
+
f"CREATE TABLE IF NOT EXISTS {MIGRATION_TABLE} (revision VARCHAR(128) PRIMARY KEY, applied_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)"
|
|
30
|
+
)
|
|
31
|
+
return
|
|
32
|
+
conn.exec_driver_sql(
|
|
33
|
+
f"CREATE TABLE IF NOT EXISTS {AUTHN_SCHEMA}.{MIGRATION_TABLE} (revision VARCHAR(128) PRIMARY KEY, applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW())"
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def applied_revisions(conn) -> set[str]:
|
|
38
|
+
ensure_migration_table(conn)
|
|
39
|
+
if conn.dialect.name == "sqlite":
|
|
40
|
+
rows = conn.exec_driver_sql(f"SELECT revision FROM {MIGRATION_TABLE}").fetchall()
|
|
41
|
+
else:
|
|
42
|
+
rows = conn.exec_driver_sql(f"SELECT revision FROM {AUTHN_SCHEMA}.{MIGRATION_TABLE}").fetchall()
|
|
43
|
+
return {str(row[0]) for row in rows}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def mark_revision(conn, revision: str) -> None:
|
|
47
|
+
ensure_migration_table(conn)
|
|
48
|
+
table = MIGRATION_TABLE if conn.dialect.name == "sqlite" else f"{AUTHN_SCHEMA}.{MIGRATION_TABLE}"
|
|
49
|
+
conn.execute(text(f"INSERT INTO {table} (revision) VALUES (:revision)"), {"revision": revision})
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def unmark_revision(conn, revision: str) -> None:
|
|
53
|
+
ensure_migration_table(conn)
|
|
54
|
+
table = MIGRATION_TABLE if conn.dialect.name == "sqlite" else f"{AUTHN_SCHEMA}.{MIGRATION_TABLE}"
|
|
55
|
+
conn.execute(text(f"DELETE FROM {table} WHERE revision = :revision"), {"revision": revision})
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _ddl_tables(conn, *models: SupportsTable) -> list[Table]:
|
|
59
|
+
return [model.__table__ for model in models]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def create_tables(conn, *models: SupportsTable) -> None:
|
|
63
|
+
ensure_schema(conn)
|
|
64
|
+
for table in _ddl_tables(conn, *models):
|
|
65
|
+
table.create(bind=conn, checkfirst=True)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def drop_tables(conn, *models: SupportsTable) -> None:
|
|
69
|
+
for table in reversed(_ddl_tables(conn, *models)):
|
|
70
|
+
table.drop(bind=conn, checkfirst=True)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def table_names(conn) -> set[str]:
|
|
74
|
+
inspector = inspect(conn)
|
|
75
|
+
if conn.dialect.name == "sqlite":
|
|
76
|
+
return set(inspector.get_table_names(schema=AUTHN_SCHEMA))
|
|
77
|
+
return set(inspector.get_table_names(schema=AUTHN_SCHEMA))
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def column_names(conn, table: str) -> set[str]:
|
|
81
|
+
inspector = inspect(conn)
|
|
82
|
+
try:
|
|
83
|
+
cols = inspector.get_columns(
|
|
84
|
+
table,
|
|
85
|
+
schema=AUTHN_SCHEMA if conn.dialect.name == "sqlite" else AUTHN_SCHEMA,
|
|
86
|
+
)
|
|
87
|
+
except NoSuchTableError:
|
|
88
|
+
return set()
|
|
89
|
+
return {str(col["name"]) for col in cols}
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _table_name(conn, table: str) -> str:
|
|
93
|
+
return f'"{AUTHN_SCHEMA}"."{table}"'
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _index_name(conn, index: str) -> str:
|
|
97
|
+
if conn.dialect.name == "sqlite":
|
|
98
|
+
return f'"{AUTHN_SCHEMA}"."{index}"'
|
|
99
|
+
return f'"{index}"'
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _copy_sqlalchemy_column(column, *, preserve_foreign_keys: bool = True) -> Column:
|
|
103
|
+
args = [column.type]
|
|
104
|
+
if preserve_foreign_keys:
|
|
105
|
+
for fk in column.foreign_keys:
|
|
106
|
+
target = fk.target_fullname
|
|
107
|
+
if target.startswith(f"{AUTHN_SCHEMA}."):
|
|
108
|
+
target = target[len(AUTHN_SCHEMA) + 1 :]
|
|
109
|
+
args.append(
|
|
110
|
+
ForeignKey(
|
|
111
|
+
target,
|
|
112
|
+
onupdate=fk.onupdate,
|
|
113
|
+
ondelete=fk.ondelete,
|
|
114
|
+
deferrable=fk.deferrable,
|
|
115
|
+
initially=fk.initially,
|
|
116
|
+
name=fk.constraint.name if fk.constraint is not None else None,
|
|
117
|
+
)
|
|
118
|
+
)
|
|
119
|
+
server_default = None
|
|
120
|
+
if column.server_default is not None and getattr(column.server_default, "arg", None) is not None:
|
|
121
|
+
server_default = column.server_default.arg
|
|
122
|
+
return Column(
|
|
123
|
+
column.name,
|
|
124
|
+
*args,
|
|
125
|
+
primary_key=column.primary_key,
|
|
126
|
+
nullable=column.nullable,
|
|
127
|
+
unique=bool(column.unique),
|
|
128
|
+
autoincrement=column.autoincrement,
|
|
129
|
+
server_default=server_default,
|
|
130
|
+
comment=column.comment,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _sqlite_rebuild_without_columns(conn, table: str, columns_to_drop: Iterable[str]) -> None:
|
|
135
|
+
drop_set = {name for name in columns_to_drop if name in column_names(conn, table)}
|
|
136
|
+
if not drop_set:
|
|
137
|
+
return
|
|
138
|
+
|
|
139
|
+
old_meta = MetaData()
|
|
140
|
+
old_table = Table(table, old_meta, schema=AUTHN_SCHEMA, autoload_with=conn)
|
|
141
|
+
keep_columns = [column for column in old_table.columns if column.name not in drop_set]
|
|
142
|
+
if not keep_columns:
|
|
143
|
+
raise ValueError(f"cannot rebuild SQLite table '{table}' without any remaining columns")
|
|
144
|
+
|
|
145
|
+
old_indexes = inspect(conn).get_indexes(table, schema=AUTHN_SCHEMA)
|
|
146
|
+
tmp_table_name = f"__tmp__{table}"
|
|
147
|
+
|
|
148
|
+
conn.exec_driver_sql("PRAGMA foreign_keys=OFF")
|
|
149
|
+
try:
|
|
150
|
+
new_meta = MetaData()
|
|
151
|
+
new_table = Table(
|
|
152
|
+
tmp_table_name,
|
|
153
|
+
new_meta,
|
|
154
|
+
schema=AUTHN_SCHEMA,
|
|
155
|
+
*(_copy_sqlalchemy_column(column, preserve_foreign_keys=False) for column in keep_columns),
|
|
156
|
+
)
|
|
157
|
+
new_table.create(bind=conn, checkfirst=False)
|
|
158
|
+
|
|
159
|
+
keep_names = [column.name for column in keep_columns]
|
|
160
|
+
select_columns = ", ".join(f'"{name}"' for name in keep_names)
|
|
161
|
+
conn.exec_driver_sql(
|
|
162
|
+
f'INSERT INTO {_table_name(conn, tmp_table_name)} ({select_columns}) '
|
|
163
|
+
f'SELECT {select_columns} FROM {_table_name(conn, table)}'
|
|
164
|
+
)
|
|
165
|
+
conn.exec_driver_sql(f'DROP TABLE {_table_name(conn, table)}')
|
|
166
|
+
conn.exec_driver_sql(
|
|
167
|
+
f'ALTER TABLE {_table_name(conn, tmp_table_name)} RENAME TO "{table}"'
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
for index in old_indexes:
|
|
171
|
+
index_columns = list(index.get("column_names") or [])
|
|
172
|
+
if not index_columns or any(name in drop_set for name in index_columns):
|
|
173
|
+
continue
|
|
174
|
+
unique_sql = "UNIQUE " if bool(index.get("unique", False)) else ""
|
|
175
|
+
rendered = ", ".join(f'"{name}"' for name in index_columns)
|
|
176
|
+
conn.exec_driver_sql(
|
|
177
|
+
f"CREATE {unique_sql}INDEX IF NOT EXISTS {_index_name(conn, index['name'])} "
|
|
178
|
+
f'ON "{table}" ({rendered})'
|
|
179
|
+
)
|
|
180
|
+
finally:
|
|
181
|
+
conn.exec_driver_sql("PRAGMA foreign_keys=ON")
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def drop_columns(conn, table: str, columns_to_drop: Iterable[str]) -> None:
|
|
185
|
+
drop_list = [name for name in columns_to_drop if name in column_names(conn, table)]
|
|
186
|
+
if not drop_list:
|
|
187
|
+
return
|
|
188
|
+
|
|
189
|
+
if conn.dialect.name == "sqlite":
|
|
190
|
+
remaining = list(drop_list)
|
|
191
|
+
for name in drop_list:
|
|
192
|
+
try:
|
|
193
|
+
conn.exec_driver_sql(f'ALTER TABLE {_table_name(conn, table)} DROP COLUMN "{name}"')
|
|
194
|
+
remaining.remove(name)
|
|
195
|
+
except SQLAlchemyError:
|
|
196
|
+
continue
|
|
197
|
+
if remaining:
|
|
198
|
+
_sqlite_rebuild_without_columns(conn, table, remaining)
|
|
199
|
+
return
|
|
200
|
+
|
|
201
|
+
rendered_table = _table_name(conn, table)
|
|
202
|
+
for name in drop_list:
|
|
203
|
+
conn.exec_driver_sql(f'ALTER TABLE {rendered_table} DROP COLUMN IF EXISTS "{name}"')
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
__all__ = [
|
|
207
|
+
"AUTHN_SCHEMA",
|
|
208
|
+
"MIGRATION_TABLE",
|
|
209
|
+
"applied_revisions",
|
|
210
|
+
"column_names",
|
|
211
|
+
"create_tables",
|
|
212
|
+
"drop_columns",
|
|
213
|
+
"drop_tables",
|
|
214
|
+
"ensure_migration_table",
|
|
215
|
+
"ensure_schema",
|
|
216
|
+
"mark_revision",
|
|
217
|
+
"table_names",
|
|
218
|
+
"unmark_revision",
|
|
219
|
+
]
|
tba_storage_core-0.4.0.dev2/src/tba_storage_core/migrations/versions/0001_initial_identity_tables.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Executable DDL migration for 0001_initial_identity_tables."""
|
|
2
|
+
|
|
3
|
+
from tba_storage_core.migrations.helpers import create_tables, drop_tables
|
|
4
|
+
from tba_storage_core.tables import Realm, Tenant, User
|
|
5
|
+
|
|
6
|
+
revision = '0001_initial_identity_tables'
|
|
7
|
+
down_revision = None
|
|
8
|
+
branch_labels = None
|
|
9
|
+
depends_on = None
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def upgrade(conn) -> None:
|
|
13
|
+
create_tables(conn, Realm, Tenant, User)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def downgrade(conn) -> None:
|
|
17
|
+
drop_tables(conn, Realm, Tenant, User)
|