datamasque-python 1.0.0__tar.gz → 1.0.2__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.
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/HISTORY.rst +10 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/PKG-INFO +1 -1
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/__init__.py +2 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/connection.py +10 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/pyproject.toml +1 -1
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/setup.cfg +1 -1
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_connections.py +81 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/uv.lock +1 -1
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/.editorconfig +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/.github/workflows/ci.yml +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/.github/workflows/release-testpypi.yml +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/.github/workflows/release.yml +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/.gitignore +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/.readthedocs.yaml +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/CONTRIBUTING.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/LICENSE +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/MANIFEST.in +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/Makefile +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/NOTICE +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/README.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/base.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/connections.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/discovery.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/dmclient.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/exceptions.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/files.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/ifm.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/license.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/__init__.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/data_selection.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/discovery.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/dm_instance.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/files.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/ifm.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/license.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/pagination.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/ruleset.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/ruleset_library.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/runs.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/status.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/user.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/py.typed +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/ruleset_libraries.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/rulesets.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/runs.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/settings.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/users.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/Makefile +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/client.models.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/client.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/conf.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/contributing.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/history.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/index.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/installation.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/make.bat +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/modules.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/readme.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/docs/usage.rst +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/__init__.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/conftest.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/helpers.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_base.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_discovery.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_files.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_ifm.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_license.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_pagination.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_ruleset_library.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_rulesets.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_runs.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_settings.py +0 -0
- {datamasque_python-1.0.0 → datamasque_python-1.0.2}/tests/test_users.py +0 -0
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
History
|
|
3
3
|
=======
|
|
4
4
|
|
|
5
|
+
1.0.2 (2026-05-14)
|
|
6
|
+
------------------
|
|
7
|
+
|
|
8
|
+
* Added ``DatabricksDeltaS3ConnectionConfig`` for Databricks Delta tables stored in S3.
|
|
9
|
+
|
|
10
|
+
1.0.1 (2026-05-11)
|
|
11
|
+
------------------
|
|
12
|
+
|
|
13
|
+
* Added ``databricks_lakebase`` to ``DatabaseType`` enum.
|
|
14
|
+
|
|
5
15
|
1.0.0 (2026-04-21)
|
|
6
16
|
------------------
|
|
7
17
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: datamasque-python
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: Official Python client for the DataMasque data-masking API.
|
|
5
5
|
Project-URL: Homepage, https://datamasque.com/
|
|
6
6
|
Project-URL: Documentation, https://datamasque-python.readthedocs.io/
|
|
@@ -30,6 +30,7 @@ from datamasque.client.models.connection import (
|
|
|
30
30
|
ConnectionId,
|
|
31
31
|
DatabaseConnectionConfig,
|
|
32
32
|
DatabaseType,
|
|
33
|
+
DatabricksDeltaS3ConnectionConfig,
|
|
33
34
|
DynamoConnectionConfig,
|
|
34
35
|
FileConnectionConfig,
|
|
35
36
|
MongoConnectionConfig,
|
|
@@ -128,6 +129,7 @@ __all__ = [
|
|
|
128
129
|
"DataMasqueUserError",
|
|
129
130
|
"DatabaseConnectionConfig",
|
|
130
131
|
"DatabaseType",
|
|
132
|
+
"DatabricksDeltaS3ConnectionConfig",
|
|
131
133
|
"DiscoveryMatch",
|
|
132
134
|
"DynamoConnectionConfig",
|
|
133
135
|
"FailedToStartError",
|
|
@@ -44,6 +44,7 @@ class DatabaseType(Enum):
|
|
|
44
44
|
mssql_linked = "mssql_linked"
|
|
45
45
|
snowflake = "snowflake"
|
|
46
46
|
mongodb = "mongodb"
|
|
47
|
+
databricks_lakebase = "databricks_lakebase"
|
|
47
48
|
|
|
48
49
|
|
|
49
50
|
class SnowflakeStageLocation(str, Enum):
|
|
@@ -390,10 +391,19 @@ class MountedShareConnectionConfig(FileConnectionConfig):
|
|
|
390
391
|
type: Literal["mounted_share_connection"] = "mounted_share_connection"
|
|
391
392
|
|
|
392
393
|
|
|
394
|
+
class DatabricksDeltaS3ConnectionConfig(FileConnectionConfig):
|
|
395
|
+
"""Connection configuration for Databricks Delta tables stored in S3."""
|
|
396
|
+
|
|
397
|
+
type: Literal["databricks_delta_s3_connection"] = "databricks_delta_s3_connection"
|
|
398
|
+
bucket: str = ""
|
|
399
|
+
iam_role_arn: Optional[str] = None
|
|
400
|
+
|
|
401
|
+
|
|
393
402
|
FILE_TYPE_MAP: dict[str, type[FileConnectionConfig]] = {
|
|
394
403
|
"s3_connection": S3ConnectionConfig,
|
|
395
404
|
"azure_blob_connection": AzureConnectionConfig,
|
|
396
405
|
"mounted_share_connection": MountedShareConnectionConfig,
|
|
406
|
+
"databricks_delta_s3_connection": DatabricksDeltaS3ConnectionConfig,
|
|
397
407
|
}
|
|
398
408
|
|
|
399
409
|
DB_TYPE_MAP: dict[str, type[ConnectionConfig]] = {
|
|
@@ -9,6 +9,7 @@ from datamasque.client.models.connection import (
|
|
|
9
9
|
ConnectionId,
|
|
10
10
|
DatabaseConnectionConfig,
|
|
11
11
|
DatabaseType,
|
|
12
|
+
DatabricksDeltaS3ConnectionConfig,
|
|
12
13
|
DynamoConnectionConfig,
|
|
13
14
|
MongoConnectionConfig,
|
|
14
15
|
MountedShareConnectionConfig,
|
|
@@ -695,6 +696,65 @@ def test_s3_connection_model_validate_no_iam_role():
|
|
|
695
696
|
assert conn.iam_role_arn is None
|
|
696
697
|
|
|
697
698
|
|
|
699
|
+
def test_databricks_delta_s3_connection_model_validate():
|
|
700
|
+
payload = {
|
|
701
|
+
"id": "11223344-5566-7788-99aa-bbccddeeff00",
|
|
702
|
+
"name": "delta_s3",
|
|
703
|
+
"mask_type": "file",
|
|
704
|
+
"type": "databricks_delta_s3_connection",
|
|
705
|
+
"base_directory": "delta/",
|
|
706
|
+
"is_file_mask_source": True,
|
|
707
|
+
"is_file_mask_destination": False,
|
|
708
|
+
"bucket": "my-delta-bucket",
|
|
709
|
+
"iam_role_arn": "arn:aws:iam::111122223333:role/delta-role",
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
conn = DatabricksDeltaS3ConnectionConfig.model_validate(payload)
|
|
713
|
+
|
|
714
|
+
assert isinstance(conn, DatabricksDeltaS3ConnectionConfig)
|
|
715
|
+
assert conn.id == "11223344-5566-7788-99aa-bbccddeeff00"
|
|
716
|
+
assert conn.name == "delta_s3"
|
|
717
|
+
assert conn.bucket == "my-delta-bucket"
|
|
718
|
+
assert conn.base_directory == "delta/"
|
|
719
|
+
assert conn.is_file_mask_source is True
|
|
720
|
+
assert conn.is_file_mask_destination is False
|
|
721
|
+
assert conn.iam_role_arn == "arn:aws:iam::111122223333:role/delta-role"
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
def test_databricks_delta_s3_connection_model_validate_no_iam_role():
|
|
725
|
+
payload = {
|
|
726
|
+
"id": "id-delta",
|
|
727
|
+
"name": "delta_s3",
|
|
728
|
+
"mask_type": "file",
|
|
729
|
+
"type": "databricks_delta_s3_connection",
|
|
730
|
+
"base_directory": "",
|
|
731
|
+
"is_file_mask_source": True,
|
|
732
|
+
"is_file_mask_destination": False,
|
|
733
|
+
"bucket": "my-delta-bucket",
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
conn = DatabricksDeltaS3ConnectionConfig.model_validate(payload)
|
|
737
|
+
assert conn.iam_role_arn is None
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
def test_validate_connection_dispatches_databricks_delta_s3():
|
|
741
|
+
payload = {
|
|
742
|
+
"id": "aabb-ccdd",
|
|
743
|
+
"name": "delta",
|
|
744
|
+
"mask_type": "file",
|
|
745
|
+
"type": "databricks_delta_s3_connection",
|
|
746
|
+
"base_directory": "",
|
|
747
|
+
"is_file_mask_source": False,
|
|
748
|
+
"is_file_mask_destination": True,
|
|
749
|
+
"bucket": "delta-bucket",
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
conn = validate_connection(payload)
|
|
753
|
+
|
|
754
|
+
assert isinstance(conn, DatabricksDeltaS3ConnectionConfig)
|
|
755
|
+
assert conn.bucket == "delta-bucket"
|
|
756
|
+
|
|
757
|
+
|
|
698
758
|
def test_azure_connection_model_validate_blanks_encrypted_connection_string():
|
|
699
759
|
payload = {
|
|
700
760
|
"id": "490502e5-5bf6-4abb-b67b-c6091d40ecf0",
|
|
@@ -768,6 +828,27 @@ def test_database_connection_model_validate_keeps_schema_for_postgres():
|
|
|
768
828
|
assert conn.db_schema == "public"
|
|
769
829
|
|
|
770
830
|
|
|
831
|
+
def test_database_connection_model_validate_databricks_lakebase():
|
|
832
|
+
payload = {
|
|
833
|
+
"id": "abc-lakebase",
|
|
834
|
+
"name": "lakebase",
|
|
835
|
+
"mask_type": "database",
|
|
836
|
+
"db_type": "databricks_lakebase",
|
|
837
|
+
"host": "lakebase-host",
|
|
838
|
+
"port": 5432,
|
|
839
|
+
"database": "lakebasedb",
|
|
840
|
+
"user": "lakebase_user",
|
|
841
|
+
"schema": "public",
|
|
842
|
+
"is_read_only": False,
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
conn = DatabaseConnectionConfig.model_validate(payload)
|
|
846
|
+
|
|
847
|
+
assert isinstance(conn, DatabaseConnectionConfig)
|
|
848
|
+
assert conn.database_type is DatabaseType.databricks_lakebase
|
|
849
|
+
assert conn.db_schema == "public"
|
|
850
|
+
|
|
851
|
+
|
|
771
852
|
def test_mssql_linked_connection_model_validate_includes_linked_server():
|
|
772
853
|
payload = {
|
|
773
854
|
"id": "48a7af45-f63f-4e05-bf9f-7b1cc3a0e89d",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/data_selection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datamasque_python-1.0.0 → datamasque_python-1.0.2}/datamasque/client/models/ruleset_library.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|