great-expectations-cloud 20240523.0.dev0__py3-none-any.whl → 20251124.0.dev1__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.
Files changed (33) hide show
  1. great_expectations_cloud/agent/__init__.py +3 -0
  2. great_expectations_cloud/agent/actions/__init__.py +8 -5
  3. great_expectations_cloud/agent/actions/agent_action.py +21 -6
  4. great_expectations_cloud/agent/actions/draft_datasource_config_action.py +45 -24
  5. great_expectations_cloud/agent/actions/generate_data_quality_check_expectations_action.py +557 -0
  6. great_expectations_cloud/agent/actions/list_asset_names.py +65 -0
  7. great_expectations_cloud/agent/actions/run_checkpoint.py +74 -27
  8. great_expectations_cloud/agent/actions/run_metric_list_action.py +11 -5
  9. great_expectations_cloud/agent/actions/run_scheduled_checkpoint.py +67 -0
  10. great_expectations_cloud/agent/actions/run_window_checkpoint.py +66 -0
  11. great_expectations_cloud/agent/actions/utils.py +35 -0
  12. great_expectations_cloud/agent/agent.py +444 -101
  13. great_expectations_cloud/agent/cli.py +2 -2
  14. great_expectations_cloud/agent/config.py +19 -5
  15. great_expectations_cloud/agent/event_handler.py +49 -12
  16. great_expectations_cloud/agent/exceptions.py +9 -0
  17. great_expectations_cloud/agent/message_service/asyncio_rabbit_mq_client.py +80 -14
  18. great_expectations_cloud/agent/message_service/subscriber.py +8 -5
  19. great_expectations_cloud/agent/models.py +197 -20
  20. great_expectations_cloud/agent/utils.py +84 -0
  21. great_expectations_cloud/logging/logging_cfg.py +20 -4
  22. great_expectations_cloud/py.typed +0 -0
  23. {great_expectations_cloud-20240523.0.dev0.dist-info → great_expectations_cloud-20251124.0.dev1.dist-info}/METADATA +54 -46
  24. great_expectations_cloud-20251124.0.dev1.dist-info/RECORD +34 -0
  25. {great_expectations_cloud-20240523.0.dev0.dist-info → great_expectations_cloud-20251124.0.dev1.dist-info}/WHEEL +1 -1
  26. great_expectations_cloud/agent/actions/data_assistants/__init__.py +0 -8
  27. great_expectations_cloud/agent/actions/data_assistants/run_missingness_data_assistant.py +0 -45
  28. great_expectations_cloud/agent/actions/data_assistants/run_onboarding_data_assistant.py +0 -45
  29. great_expectations_cloud/agent/actions/data_assistants/utils.py +0 -123
  30. great_expectations_cloud/agent/actions/list_table_names.py +0 -76
  31. great_expectations_cloud-20240523.0.dev0.dist-info/RECORD +0 -32
  32. {great_expectations_cloud-20240523.0.dev0.dist-info → great_expectations_cloud-20251124.0.dev1.dist-info}/entry_points.txt +0 -0
  33. {great_expectations_cloud-20240523.0.dev0.dist-info → great_expectations_cloud-20251124.0.dev1.dist-info/licenses}/LICENSE +0 -0
@@ -1,45 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- from typing_extensions import override
6
-
7
- from great_expectations_cloud.agent.actions.agent_action import ActionResult, AgentAction
8
- from great_expectations_cloud.agent.actions.data_assistants.utils import (
9
- DataAssistantType,
10
- build_action_result,
11
- build_batch_request,
12
- )
13
- from great_expectations_cloud.agent.event_handler import register_event_action
14
- from great_expectations_cloud.agent.models import RunMissingnessDataAssistantEvent
15
-
16
- if TYPE_CHECKING:
17
- from great_expectations.data_context import CloudDataContext
18
-
19
-
20
- class RunMissingnessDataAssistantAction(AgentAction[RunMissingnessDataAssistantEvent]):
21
- def __init__(self, context: CloudDataContext):
22
- super().__init__(context=context)
23
- self._data_assistant = self._context.assistants.missingness
24
-
25
- @override
26
- def run(
27
- self,
28
- event: RunMissingnessDataAssistantEvent,
29
- id: str,
30
- ) -> ActionResult:
31
- batch_request = build_batch_request(context=self._context, event=event)
32
-
33
- data_assistant_result = self._data_assistant.run(
34
- batch_request=batch_request,
35
- )
36
- return build_action_result(
37
- context=self._context,
38
- data_assistant_name=DataAssistantType.MISSINGNESS,
39
- event=event,
40
- data_assistant_result=data_assistant_result,
41
- id=id,
42
- )
43
-
44
-
45
- register_event_action("0", RunMissingnessDataAssistantEvent, RunMissingnessDataAssistantAction)
@@ -1,45 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- from typing_extensions import override
6
-
7
- from great_expectations_cloud.agent.actions.agent_action import ActionResult, AgentAction
8
- from great_expectations_cloud.agent.actions.data_assistants.utils import (
9
- DataAssistantType,
10
- build_action_result,
11
- build_batch_request,
12
- )
13
- from great_expectations_cloud.agent.event_handler import register_event_action
14
- from great_expectations_cloud.agent.models import RunOnboardingDataAssistantEvent
15
-
16
- if TYPE_CHECKING:
17
- from great_expectations.data_context import CloudDataContext
18
-
19
-
20
- class RunOnboardingDataAssistantAction(AgentAction[RunOnboardingDataAssistantEvent]):
21
- def __init__(self, context: CloudDataContext):
22
- super().__init__(context=context)
23
- self._data_assistant = self._context.assistants.onboarding
24
-
25
- @override
26
- def run(
27
- self,
28
- event: RunOnboardingDataAssistantEvent,
29
- id: str,
30
- ) -> ActionResult:
31
- batch_request = build_batch_request(context=self._context, event=event)
32
-
33
- data_assistant_result = self._data_assistant.run(
34
- batch_request=batch_request,
35
- )
36
- return build_action_result(
37
- context=self._context,
38
- data_assistant_name=DataAssistantType.ONBOARDING,
39
- event=event,
40
- data_assistant_result=data_assistant_result,
41
- id=id,
42
- )
43
-
44
-
45
- register_event_action("0", RunOnboardingDataAssistantEvent, RunOnboardingDataAssistantAction)
@@ -1,123 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import enum
4
- from datetime import datetime
5
- from typing import TYPE_CHECKING
6
-
7
- from great_expectations.datasource.fluent import Datasource as FluentDatasource
8
- from great_expectations.exceptions import DataContextError
9
-
10
- from great_expectations_cloud.agent.actions.agent_action import (
11
- ActionResult,
12
- )
13
- from great_expectations_cloud.agent.models import (
14
- CreatedResource,
15
- RunDataAssistantEvent,
16
- )
17
-
18
- if TYPE_CHECKING:
19
- from great_expectations.core import ExpectationSuite
20
- from great_expectations.core.batch import BatchRequest
21
- from great_expectations.data_context.data_context import CloudDataContext
22
- from great_expectations.rule_based_profiler.data_assistant_result.data_assistant_result import (
23
- DataAssistantResult,
24
- )
25
-
26
-
27
- class DataAssistantType(str, enum.Enum):
28
- MISSINGNESS = "Missingness"
29
- ONBOARDING = "Onboarding"
30
-
31
-
32
- def build_batch_request(
33
- context: CloudDataContext,
34
- event: RunDataAssistantEvent,
35
- ) -> BatchRequest:
36
- datasource = context.get_datasource(datasource_name=event.datasource_name)
37
- if not isinstance(datasource, FluentDatasource):
38
- raise TypeError( # noqa: TRY003 # one off error
39
- "The RunDataAssistant Action can only be used with a fluent-style Data Source."
40
- )
41
-
42
- asset = datasource.get_asset(asset_name=event.data_asset_name)
43
- try:
44
- batch_request = asset.build_batch_request()
45
- except ValueError as e:
46
- raise ValueError( # noqa: TRY003 # one off error
47
- "The RunDataAssistant Action for data assistant cannot be used with an "
48
- "in-memory Data Asset."
49
- ) from e
50
-
51
- return batch_request
52
-
53
-
54
- def build_action_result(
55
- context: CloudDataContext,
56
- data_assistant_name: DataAssistantType,
57
- event: RunDataAssistantEvent,
58
- data_assistant_result: DataAssistantResult,
59
- id: str,
60
- ) -> ActionResult:
61
- if event.expectation_suite_name is not None:
62
- expectation_suite_name = event.expectation_suite_name
63
- else:
64
- expectation_suite_name = f"{event.data_asset_name} {data_assistant_name.value} Suite"
65
-
66
- checkpoint_name = f"{event.data_asset_name} {data_assistant_name.value} Checkpoint"
67
-
68
- # build tz aware timestamp
69
- tz = datetime.now().astimezone().tzinfo
70
- timestamp = datetime.now(tz=tz)
71
-
72
- # ensure we have unique names for created resources
73
- try:
74
- context.get_expectation_suite(expectation_suite_name=expectation_suite_name)
75
- # if that didn't error, this name exists, so we add the timestamp
76
- expectation_suite_name = f"{expectation_suite_name} {timestamp}"
77
- except DataContextError:
78
- # resource is unique
79
- pass
80
-
81
- try:
82
- context.get_checkpoint(name=checkpoint_name)
83
- # if that didn't error, this name exists, so we add the timestamp
84
- checkpoint_name = f"{checkpoint_name} {timestamp}"
85
- except DataContextError:
86
- # resource is unique
87
- pass
88
-
89
- expectation_suite: ExpectationSuite = data_assistant_result.get_expectation_suite(
90
- expectation_suite_name=expectation_suite_name
91
- )
92
- context.add_expectation_suite(expectation_suite=expectation_suite)
93
-
94
- checkpoint_config = {
95
- "name": checkpoint_name,
96
- "validations": [
97
- {
98
- "expectation_suite_name": expectation_suite_name,
99
- "expectation_suite_ge_cloud_id": expectation_suite.ge_cloud_id,
100
- "batch_request": {
101
- "datasource_name": event.datasource_name,
102
- "data_asset_name": event.data_asset_name,
103
- },
104
- }
105
- ],
106
- "config_version": 1,
107
- "class_name": "Checkpoint",
108
- }
109
-
110
- checkpoint = context.add_checkpoint(**checkpoint_config)
111
-
112
- expectation_suite_id = expectation_suite.ge_cloud_id
113
- checkpoint_id = checkpoint.ge_cloud_id
114
- if expectation_suite_id is None or checkpoint_id is None:
115
- raise ValueError("Cloud backed resources must have an ID.") # noqa: TRY003 # one off error
116
- return ActionResult(
117
- id=id,
118
- type=event.type,
119
- created_resources=[
120
- CreatedResource(resource_id=expectation_suite_id, type="ExpectationSuite"),
121
- CreatedResource(resource_id=checkpoint_id, type="Checkpoint"),
122
- ],
123
- )
@@ -1,76 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- from great_expectations.compatibility import pydantic
6
- from great_expectations.compatibility.sqlalchemy import inspect
7
- from great_expectations.core.http import create_session
8
- from great_expectations.datasource.fluent import SQLDatasource
9
- from great_expectations.exceptions import GXCloudError
10
- from typing_extensions import override
11
-
12
- from great_expectations_cloud.agent.actions.agent_action import (
13
- ActionResult,
14
- AgentAction,
15
- )
16
- from great_expectations_cloud.agent.config import (
17
- GxAgentEnvVars,
18
- generate_config_validation_error_text,
19
- )
20
- from great_expectations_cloud.agent.event_handler import register_event_action
21
- from great_expectations_cloud.agent.models import (
22
- ListTableNamesEvent,
23
- )
24
-
25
- if TYPE_CHECKING:
26
- from great_expectations.compatibility.sqlalchemy.engine import Inspector
27
-
28
-
29
- class ListTableNamesAction(AgentAction[ListTableNamesEvent]):
30
- @override
31
- def run(self, event: ListTableNamesEvent, id: str) -> ActionResult:
32
- datasource_name: str = event.datasource_name
33
- datasource = self._context.get_datasource(datasource_name=datasource_name)
34
- if not isinstance(datasource, SQLDatasource):
35
- raise TypeError( # noqa: TRY003 # one off error
36
- f"This operation requires a SQL Data Source but got {type(datasource).__name__}."
37
- )
38
-
39
- inspector: Inspector = inspect(datasource.get_engine())
40
- table_names: list[str] = inspector.get_table_names()
41
-
42
- self._add_or_update_table_names_list(
43
- datasource_id=str(datasource.id), table_names=table_names
44
- )
45
-
46
- return ActionResult(
47
- id=id,
48
- type=event.type,
49
- created_resources=[],
50
- )
51
-
52
- def _add_or_update_table_names_list(self, datasource_id: str, table_names: list[str]) -> None:
53
- try:
54
- cloud_config = GxAgentEnvVars()
55
- except pydantic.ValidationError as validation_err:
56
- raise RuntimeError(
57
- generate_config_validation_error_text(validation_err)
58
- ) from validation_err
59
-
60
- session = create_session(access_token=cloud_config.gx_cloud_access_token)
61
- response = session.patch(
62
- url=f"{cloud_config.gx_cloud_base_url}/organizations/"
63
- f"{cloud_config.gx_cloud_organization_id}/datasources/{datasource_id}",
64
- json={"table_names": table_names},
65
- )
66
- if response.status_code != 204: # noqa: PLR2004
67
- raise GXCloudError(
68
- message=f"ListTableNamesAction encountered an error while connecting to GX Cloud. "
69
- f"Unable to update "
70
- f"table_names for Data Source with ID"
71
- f"={datasource_id}.",
72
- response=response,
73
- )
74
-
75
-
76
- register_event_action("0", ListTableNamesEvent, ListTableNamesAction)
@@ -1,32 +0,0 @@
1
- great_expectations_cloud/__init__.py,sha256=1mr5RDyA2N38eynvEfVbuYIbjFadeJfqZ-X9CrqYiVo,150
2
- great_expectations_cloud/agent/__init__.py,sha256=et60Glanwmrnnj3I_gL7fQDIz-gWB3jgO6u8Ag8Klho,244
3
- great_expectations_cloud/agent/actions/__init__.py,sha256=Sxiu30lGA-5CB9-WFbKTv4agJP_0hgqvUZBJZFkb8uo,733
4
- great_expectations_cloud/agent/actions/agent_action.py,sha256=_Is2wPxYirSh6jRVZbo_hYPW3vy5hqsd-tMGgl3-o3U,763
5
- great_expectations_cloud/agent/actions/data_assistants/__init__.py,sha256=yBfQEyYMBNTMjoMTvaTxuwz6WnOPUhHRUPLoHAINgc4,316
6
- great_expectations_cloud/agent/actions/data_assistants/run_missingness_data_assistant.py,sha256=zOvGGcSnD9W9FcmhV6LEv3fI8YN31-43-FwaLM47b-I,1511
7
- great_expectations_cloud/agent/actions/data_assistants/run_onboarding_data_assistant.py,sha256=IlRy8LwMhcllf42OznmL5XF6dUnRz7AnOQ5CHzzGRWc,1503
8
- great_expectations_cloud/agent/actions/data_assistants/utils.py,sha256=gXOvAoJ_cPUeH8u9H30cPC8zAAfPBr_xICuyztvEuus,4279
9
- great_expectations_cloud/agent/actions/draft_datasource_config_action.py,sha256=auYIglyrL6ja0Nags8uAOjrLfdtuxP_Rpp_9XIpkvjs,4171
10
- great_expectations_cloud/agent/actions/list_table_names.py,sha256=1WiuT8IuRmqKYbF7IMGkXBm-VIAaWQgmpUw7UDfJ1So,2881
11
- great_expectations_cloud/agent/actions/run_checkpoint.py,sha256=CTpD78XwSjj9sKC0yzvmd2t7N1s7kKx3Lp3m1ZERk4A,2041
12
- great_expectations_cloud/agent/actions/run_metric_list_action.py,sha256=RSjEfESKjn2xKeOoLiWrm0Af6ghh0MWPiMwgu_2BmXY,2993
13
- great_expectations_cloud/agent/actions/unknown.py,sha256=mtWw9tDZqGZSiUWj7PtIlLFJ1dM-7AHBX3SO16-u2EM,739
14
- great_expectations_cloud/agent/agent.py,sha256=NOit0OSy4e-ELzeKYM01gnRrZTFFRnNIbwq7YzffzPo,17221
15
- great_expectations_cloud/agent/agent_warnings.py,sha256=9-xl_AI2V9Py4o7KzFOQjG3lYx-vZ36fq4w2iiPNiUw,362
16
- great_expectations_cloud/agent/cli.py,sha256=wdf8uhYM_gsQOgGTcu6irRKB8k5HmtB9-fSm1ym8XhM,2851
17
- great_expectations_cloud/agent/config.py,sha256=bUypxGky-dzTsITtfWOzJjUSoSReKYdOa9e8UFNduIY,858
18
- great_expectations_cloud/agent/constants.py,sha256=SAEtcOwI-SxZiZSVoCFfEC5oCtYdgmyUmK7for_zg_Q,246
19
- great_expectations_cloud/agent/event_handler.py,sha256=_0sC_ooay_8dbNx9ddR9eUaGT_cc_QvED7omDfBtL3g,4632
20
- great_expectations_cloud/agent/exceptions.py,sha256=Gl5QJp1dCjNwFxfWsKY2FShajMlrzkkqVW_1CrJbmGs,1360
21
- great_expectations_cloud/agent/message_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- great_expectations_cloud/agent/message_service/asyncio_rabbit_mq_client.py,sha256=mAdXGXZ0nY1o4qCbZRU8CWwA06tRhlhU8-4PFHlOh6Q,9260
23
- great_expectations_cloud/agent/message_service/subscriber.py,sha256=sCGwee3qmCU0h7dSUAyTUhNTICuP1gqZpr3udrio0VQ,5836
24
- great_expectations_cloud/agent/models.py,sha256=UHOk2tySSlXSeWBycQ4AIQpbK8BbYlen6hpJ-vPwsdY,3562
25
- great_expectations_cloud/agent/run.py,sha256=V33RLoB1PFmJ0h0RfHG4SB5lN_Za8tW2Dua6GUpN9yY,639
26
- great_expectations_cloud/logging/README.md,sha256=vbwU689x8SkGjzoBYQzZOzAvh28fR0RCa1XY5WD-Dgs,1762
27
- great_expectations_cloud/logging/logging_cfg.py,sha256=TYP4jCuCY4PbMbct7arUhhLEPNJdI0CAtYgPaS80Dlw,5918
28
- great_expectations_cloud-20240523.0.dev0.dist-info/LICENSE,sha256=_JJnoX6N_OkrAwlCRizCwil0tIjDAy2TG3GiJ50sM6k,2084
29
- great_expectations_cloud-20240523.0.dev0.dist-info/METADATA,sha256=JBWa_KazpmYPwRI1CIktwwKYwDKdOJsZJo924YKgXyA,11112
30
- great_expectations_cloud-20240523.0.dev0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
31
- great_expectations_cloud-20240523.0.dev0.dist-info/entry_points.txt,sha256=ofJgdeS2gSzxXLyCAjfNhIaN1wmSyR7EAMs5qhVaXE4,68
32
- great_expectations_cloud-20240523.0.dev0.dist-info/RECORD,,