planar 0.7.0__py3-none-any.whl → 0.9.0__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.
- planar/_version.py +1 -1
- planar/ai/agent.py +169 -318
- planar/ai/agent_base.py +166 -0
- planar/ai/agent_utils.py +4 -69
- planar/ai/models.py +30 -0
- planar/ai/pydantic_ai.py +86 -17
- planar/ai/test_agent_serialization.py +1 -1
- planar/app.py +1 -7
- planar/config.py +2 -0
- planar/data/__init__.py +17 -0
- planar/data/config.py +49 -0
- planar/data/dataset.py +272 -0
- planar/data/exceptions.py +19 -0
- planar/data/test_dataset.py +354 -0
- planar/dependencies.py +30 -0
- planar/routers/agents_router.py +52 -4
- planar/routers/test_agents_router.py +1 -1
- planar/routers/test_routes_security.py +3 -2
- planar/rules/__init__.py +12 -18
- planar/scaffold_templates/planar.dev.yaml.j2 +9 -0
- planar/scaffold_templates/planar.prod.yaml.j2 +14 -0
- planar/testing/workflow_observer.py +2 -2
- planar/workflows/notifications.py +39 -3
- {planar-0.7.0.dist-info → planar-0.9.0.dist-info}/METADATA +5 -1
- {planar-0.7.0.dist-info → planar-0.9.0.dist-info}/RECORD +27 -24
- planar/ai/providers.py +0 -1088
- planar/ai/pydantic_ai_agent.py +0 -329
- planar/ai/test_agent.py +0 -1298
- planar/ai/test_providers.py +0 -463
- {planar-0.7.0.dist-info → planar-0.9.0.dist-info}/WHEEL +0 -0
- {planar-0.7.0.dist-info → planar-0.9.0.dist-info}/entry_points.txt +0 -0
planar/routers/agents_router.py
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
import asyncio
|
2
|
-
|
2
|
+
import json
|
3
|
+
from typing import Any, AsyncGenerator
|
3
4
|
|
4
5
|
from fastapi import APIRouter, BackgroundTasks, HTTPException
|
5
6
|
from fastapi.responses import StreamingResponse
|
6
7
|
from pydantic import BaseModel
|
7
8
|
|
8
|
-
from planar.ai.agent_utils import
|
9
|
-
from planar.ai.models import AgentConfig
|
9
|
+
from planar.ai.agent_utils import agent_configuration
|
10
|
+
from planar.ai.models import AgentConfig, AgentEventEmitter, AgentEventType
|
10
11
|
from planar.ai.utils import AgentSerializeable, serialize_agent
|
11
12
|
from planar.logging import get_logger
|
12
13
|
from planar.object_config.object_config import ConfigValidationError
|
@@ -17,6 +18,7 @@ from planar.security.authorization import (
|
|
17
18
|
validate_authorization_for,
|
18
19
|
)
|
19
20
|
from planar.session import get_engine, session_context
|
21
|
+
from planar.utils import utc_now
|
20
22
|
|
21
23
|
logger = get_logger(__name__)
|
22
24
|
|
@@ -29,6 +31,52 @@ class AgentSimulationData[T](BaseModel):
|
|
29
31
|
input_value: str | T
|
30
32
|
|
31
33
|
|
34
|
+
class SimulationAgentEvent:
|
35
|
+
def __init__(
|
36
|
+
self,
|
37
|
+
event_type: AgentEventType,
|
38
|
+
data: BaseModel | str | None,
|
39
|
+
):
|
40
|
+
self.event_type = event_type
|
41
|
+
self.data = data
|
42
|
+
self.timestamp = utc_now().isoformat()
|
43
|
+
|
44
|
+
|
45
|
+
class SimulationAgentEventEmitter(AgentEventEmitter):
|
46
|
+
def __init__(self):
|
47
|
+
self.queue: asyncio.Queue[SimulationAgentEvent] = asyncio.Queue()
|
48
|
+
|
49
|
+
def emit(self, event_type: AgentEventType, data: BaseModel | str | None):
|
50
|
+
event = SimulationAgentEvent(event_type, data)
|
51
|
+
self.queue.put_nowait(event)
|
52
|
+
|
53
|
+
async def get_events(self) -> AsyncGenerator[str, None]:
|
54
|
+
while True:
|
55
|
+
event = await self.queue.get()
|
56
|
+
|
57
|
+
if isinstance(event.data, BaseModel):
|
58
|
+
data = {
|
59
|
+
"data": event.data.model_dump(),
|
60
|
+
"event_type": event.event_type,
|
61
|
+
}
|
62
|
+
else:
|
63
|
+
data = {
|
64
|
+
"data": event.data,
|
65
|
+
"event_type": event.event_type,
|
66
|
+
}
|
67
|
+
|
68
|
+
yield f"data: {json.dumps(data)}\n\n"
|
69
|
+
|
70
|
+
self.queue.task_done()
|
71
|
+
|
72
|
+
if event.event_type in (AgentEventType.COMPLETED, AgentEventType.ERROR):
|
73
|
+
break
|
74
|
+
|
75
|
+
def is_empty(self) -> bool:
|
76
|
+
"""Check if the queue is empty."""
|
77
|
+
return self.queue.empty()
|
78
|
+
|
79
|
+
|
32
80
|
class AgentEvent(BaseModel):
|
33
81
|
"""Model representing a single event emitted by the agent."""
|
34
82
|
|
@@ -147,7 +195,7 @@ def create_agent_router(object_registry: ObjectRegistry) -> APIRouter:
|
|
147
195
|
logger.warning("agent not found for simulation", agent_name=agent_name)
|
148
196
|
raise HTTPException(status_code=404, detail="Agent not found")
|
149
197
|
|
150
|
-
emitter =
|
198
|
+
emitter = SimulationAgentEventEmitter()
|
151
199
|
|
152
200
|
# Create a copy of the request data to avoid sharing data between tasks
|
153
201
|
request_copy = request.model_copy()
|
@@ -61,8 +61,9 @@ def restrictive_policy_file(tmp_path):
|
|
61
61
|
|
62
62
|
|
63
63
|
@pytest.fixture(name="app_with_restricted_authz")
|
64
|
-
def create_app_with_restricted_authz(restrictive_policy_file):
|
65
|
-
|
64
|
+
def create_app_with_restricted_authz(tmp_path, restrictive_policy_file):
|
65
|
+
db_path = tmp_path / "test_authz_router.db"
|
66
|
+
config = sqlite_config(str(db_path))
|
66
67
|
config.security = SecurityConfig(
|
67
68
|
authz=AuthzConfig(enabled=True, policy_file=restrictive_policy_file)
|
68
69
|
)
|
planar/rules/__init__.py
CHANGED
@@ -1,23 +1,17 @@
|
|
1
|
-
import
|
2
|
-
from typing import Any
|
1
|
+
from typing import TYPE_CHECKING, Mapping, Tuple
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
"
|
3
|
+
from planar.dependencies import lazy_exports
|
4
|
+
|
5
|
+
_DEFERRED_IMPORTS: Mapping[str, Tuple[str, str]] = {
|
6
|
+
"rule": (".decorator", "rule"),
|
7
|
+
"Rule": (".models", "Rule"),
|
8
|
+
"RuleSerializeable": (".models", "RuleSerializeable"),
|
8
9
|
}
|
9
10
|
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from .decorator import rule
|
13
|
+
from .models import Rule, RuleSerializeable
|
10
14
|
|
11
|
-
|
12
|
-
"""
|
13
|
-
Lazily import modules to avoid circular dependencies.
|
14
|
-
This is called by the Python interpreter when a module attribute is accessed
|
15
|
-
that cannot be found in the module's __dict__.
|
16
|
-
PEP 562
|
17
|
-
"""
|
18
|
-
if name in _DEFERRED_IMPORTS:
|
19
|
-
module_path = _DEFERRED_IMPORTS[name]
|
20
|
-
module = importlib.import_module(module_path, __name__)
|
21
|
-
return getattr(module, name)
|
15
|
+
__all__ = ["Rule", "RuleSerializeable", "rule"]
|
22
16
|
|
23
|
-
|
17
|
+
lazy_exports(__name__, _DEFERRED_IMPORTS)
|
@@ -32,3 +32,12 @@ logging:
|
|
32
32
|
# the following lines to enable INFO level for the whole application (except sqlalchemy.engine, which must be enabled above)
|
33
33
|
# "":
|
34
34
|
# level: INFO
|
35
|
+
|
36
|
+
# Uncomment to enable data features with Ducklake
|
37
|
+
# data:
|
38
|
+
# catalog:
|
39
|
+
# type: duckdb
|
40
|
+
# path: .data/catalog.ducklake
|
41
|
+
# storage:
|
42
|
+
# backend: localdir
|
43
|
+
# directory: .data/ducklake_files
|
@@ -30,3 +30,17 @@ security:
|
|
30
30
|
ai_providers:
|
31
31
|
openai:
|
32
32
|
api_key: ${OPENAI_API_KEY}
|
33
|
+
|
34
|
+
# Uncomment to enable data features with Ducklake
|
35
|
+
# data:
|
36
|
+
# catalog:
|
37
|
+
# type: postgres
|
38
|
+
# host: ${DB_HOST}
|
39
|
+
# port: ${DB_PORT}
|
40
|
+
# user: ${DB_USER}
|
41
|
+
# password: ${DB_PASSWORD}
|
42
|
+
# db: ducklake_catalog
|
43
|
+
# storage:
|
44
|
+
# backend: s3
|
45
|
+
# region: us-west-2
|
46
|
+
# bucket_name: ${S3_DATA_BUCKET}
|
@@ -21,9 +21,9 @@ class WorkflowObserver:
|
|
21
21
|
) -> UUID:
|
22
22
|
"""Extract workflow_id from notification data"""
|
23
23
|
if isinstance(notification.data, Workflow):
|
24
|
-
return notification.
|
24
|
+
return notification.workflow_id
|
25
25
|
else:
|
26
|
-
return notification.
|
26
|
+
return notification.workflow_id
|
27
27
|
|
28
28
|
def on_workflow_notification(self, notification: WorkflowNotification):
|
29
29
|
workflow_id = UUID(str(self._get_workflow_id_from_notification(notification)))
|
@@ -2,10 +2,12 @@ from contextlib import asynccontextmanager
|
|
2
2
|
from contextvars import ContextVar
|
3
3
|
from enum import Enum
|
4
4
|
from typing import Callable, Union
|
5
|
+
from uuid import UUID
|
5
6
|
|
6
7
|
from pydantic import BaseModel
|
7
8
|
|
8
9
|
from planar.logging import get_logger
|
10
|
+
from planar.workflows.context import get_context
|
9
11
|
from planar.workflows.models import Workflow, WorkflowStep
|
10
12
|
|
11
13
|
logger = get_logger(__name__)
|
@@ -20,11 +22,19 @@ class Notification(str, Enum):
|
|
20
22
|
STEP_RUNNING = "step-running"
|
21
23
|
STEP_SUCCEEDED = "step-succeeded"
|
22
24
|
STEP_FAILED = "step-failed"
|
25
|
+
AGENT_TEXT = "agent-text"
|
26
|
+
AGENT_THINK = "agent-think"
|
27
|
+
|
28
|
+
|
29
|
+
class AgentEventData(BaseModel):
|
30
|
+
data: str
|
31
|
+
step_id: int
|
23
32
|
|
24
33
|
|
25
34
|
class WorkflowNotification(BaseModel):
|
26
35
|
kind: Notification
|
27
|
-
|
36
|
+
workflow_id: UUID
|
37
|
+
data: Union[Workflow, WorkflowStep, AgentEventData]
|
28
38
|
|
29
39
|
|
30
40
|
WorkflowNotificationCallback = Callable[[WorkflowNotification], None]
|
@@ -38,7 +48,9 @@ def workflow_notify(workflow: Workflow, kind: Notification):
|
|
38
48
|
callback = workflow_notification_callback_var.get(None)
|
39
49
|
if callback is not None:
|
40
50
|
logger.debug("notifying workflow event", kind=kind, workflow_id=workflow.id)
|
41
|
-
callback(
|
51
|
+
callback(
|
52
|
+
WorkflowNotification(kind=kind, workflow_id=workflow.id, data=workflow)
|
53
|
+
)
|
42
54
|
|
43
55
|
|
44
56
|
def workflow_started(workflow: Workflow):
|
@@ -70,7 +82,9 @@ def step_notify(step: WorkflowStep, kind: Notification):
|
|
70
82
|
workflow_id=step.workflow_id,
|
71
83
|
step_id=step.step_id,
|
72
84
|
)
|
73
|
-
callback(
|
85
|
+
callback(
|
86
|
+
WorkflowNotification(kind=kind, workflow_id=step.workflow_id, data=step)
|
87
|
+
)
|
74
88
|
|
75
89
|
|
76
90
|
def step_running(step: WorkflowStep):
|
@@ -85,6 +99,28 @@ def step_failed(step: WorkflowStep):
|
|
85
99
|
return step_notify(step, Notification.STEP_FAILED)
|
86
100
|
|
87
101
|
|
102
|
+
def agent_notify(kind: Notification, data: str):
|
103
|
+
callback = workflow_notification_callback_var.get(None)
|
104
|
+
if callback is not None:
|
105
|
+
context = get_context()
|
106
|
+
logger.debug("notifying agent event", kind=kind)
|
107
|
+
callback(
|
108
|
+
WorkflowNotification(
|
109
|
+
kind=kind,
|
110
|
+
workflow_id=context.workflow_id,
|
111
|
+
data=AgentEventData(data=data, step_id=context.step_stack[-1].step_id),
|
112
|
+
)
|
113
|
+
)
|
114
|
+
|
115
|
+
|
116
|
+
def agent_think(data: str):
|
117
|
+
agent_notify(Notification.AGENT_THINK, data)
|
118
|
+
|
119
|
+
|
120
|
+
def agent_text(data: str):
|
121
|
+
agent_notify(Notification.AGENT_TEXT, data)
|
122
|
+
|
123
|
+
|
88
124
|
@asynccontextmanager
|
89
125
|
async def workflow_notification_context(callback: WorkflowNotificationCallback):
|
90
126
|
"""Context manager for setting up and tearing down Workflow notification context"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: planar
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.9.0
|
4
4
|
Summary: Add your description here
|
5
5
|
License-Expression: LicenseRef-Proprietary
|
6
6
|
Requires-Python: >=3.12
|
@@ -27,6 +27,10 @@ Provides-Extra: azure
|
|
27
27
|
Requires-Dist: aiohttp>=3.8.0; extra == 'azure'
|
28
28
|
Requires-Dist: azure-identity>=1.15.0; extra == 'azure'
|
29
29
|
Requires-Dist: azure-storage-blob>=12.19.0; extra == 'azure'
|
30
|
+
Provides-Extra: data
|
31
|
+
Requires-Dist: ducklake>=0.1.1; extra == 'data'
|
32
|
+
Requires-Dist: ibis-framework[duckdb]>=10.8.0; extra == 'data'
|
33
|
+
Requires-Dist: polars>=1.31.0; extra == 'data'
|
30
34
|
Provides-Extra: otel
|
31
35
|
Requires-Dist: opentelemetry-api>=1.34.1; extra == 'otel'
|
32
36
|
Requires-Dist: opentelemetry-exporter-otlp>=1.34.1; extra == 'otel'
|
@@ -1,8 +1,9 @@
|
|
1
1
|
planar/__init__.py,sha256=FAYRGjuJOH2Y_XYFA0-BrRFjuKdPzIShNbaYwJbtu6A,499
|
2
|
-
planar/_version.py,sha256=
|
3
|
-
planar/app.py,sha256=
|
2
|
+
planar/_version.py,sha256=4bF_N3mS34eGDXoMdYuijyM1JYXxzz7J-NCugplemp0,18
|
3
|
+
planar/app.py,sha256=1X0ZPW7nmf6RhMzQgjtyKD_WO-E4tjM7ItOP-bjvocQ,18505
|
4
4
|
planar/cli.py,sha256=2ObR5XkLGbdbnDqp5mrBzDVhSacHCNsVNSHnXkrMQzQ,9593
|
5
|
-
planar/config.py,sha256=
|
5
|
+
planar/config.py,sha256=ghZNDqncwPK3LjvkMkv0BNnN1w-7ALpDBZWc1-JanTE,17634
|
6
|
+
planar/dependencies.py,sha256=PH78fGk3bQfGnz-AphxH49307Y0XVgl3EY0LdGJnoik,1008
|
6
7
|
planar/object_registry.py,sha256=RMleX5XE8OKDxlnMeyLpJ1Y280duub-tx1smR1zTlDg,3219
|
7
8
|
planar/registry_items.py,sha256=UhZRIpbSoa_CV9OTl17pJfRLxItYp4Pxd9f5ZbJkGaM,2055
|
8
9
|
planar/session.py,sha256=xLS9WPvaiy9nr2Olju1-C-7_sU5VXK8RuNdjuKndul4,1020
|
@@ -16,16 +17,18 @@ planar/test_sqlalchemy.py,sha256=F0aKqm5tStQj_Mqjh50kiLX4r7kphBFDOUDu_Iw7S3s,557
|
|
16
17
|
planar/test_utils.py,sha256=gKenXotj36SN_bb3bQpYPfD8t06IjnGBQqEgWpujHcA,3086
|
17
18
|
planar/utils.py,sha256=v7q9AJyWgQWl9VPSN_0qxw3rBvYe-_Pb_KcwqSsjOFU,3103
|
18
19
|
planar/ai/__init__.py,sha256=ABOKvqQOLlVJkptcvXcuLjVZZWEsK8h-1RyFGK7kib8,231
|
19
|
-
planar/ai/agent.py,sha256=
|
20
|
-
planar/ai/
|
21
|
-
planar/ai/
|
22
|
-
planar/ai/
|
23
|
-
planar/ai/pydantic_ai.py,sha256=
|
24
|
-
planar/ai/
|
25
|
-
planar/ai/test_agent.py,sha256=B_eHcycNRQ_43-H_mTXsRyyvTYUCqu8ickPCTkYcXcE,44429
|
26
|
-
planar/ai/test_agent_serialization.py,sha256=LZlgk147A8OM5DPuSLjEjVy16N4vdaAQvXv_8OJDSK4,8064
|
27
|
-
planar/ai/test_providers.py,sha256=JEaIr0ex-02ij8Tl5X4vAfsAbp7nV2I0Wj0wIu6MBRQ,16282
|
20
|
+
planar/ai/agent.py,sha256=flgHU00LRT-UcP0TjMqDigi2jwWq6UoMpmCZSOTyyB0,12428
|
21
|
+
planar/ai/agent_base.py,sha256=iOOiUwbTiqckrZ-ZtlpkPCjSNE117gMwxrdgegO-P-0,5303
|
22
|
+
planar/ai/agent_utils.py,sha256=Yug1lt3uT7zLJ0X9uUBpKEomxucKaZiEUBIcf-RZILo,4052
|
23
|
+
planar/ai/models.py,sha256=aH61vkHJEhmupvGJHS87Nv7bpCpcfBJDO-N8k3k2ixc,4292
|
24
|
+
planar/ai/pydantic_ai.py,sha256=lYWtnIclOLRiEpBJi5r6Ey8gDBVlQIHTFa3iEzUNqWY,23525
|
25
|
+
planar/ai/test_agent_serialization.py,sha256=zYLIxhYdFhOZzBrEBoQNyYLyNcNxWwaMTkjt_ARTkZk,8073
|
28
26
|
planar/ai/utils.py,sha256=WVBW0TGaoKytC4bNd_a9lXrBf5QsDRut4GBcA53U2Ww,3116
|
27
|
+
planar/data/__init__.py,sha256=LwrWl925w1CN0aW645Wpj_kDp0B8j5SsPzjr9iyrcmI,285
|
28
|
+
planar/data/config.py,sha256=zp6ChI_2MUMbupEVQNY-BxzcdLvejXG33DCp0BujGVU,1209
|
29
|
+
planar/data/dataset.py,sha256=5SdOh7NzJdTpuleNkoA_UA-C4WJM8mcNLcvGsRIiqIs,10150
|
30
|
+
planar/data/exceptions.py,sha256=AlhGQ_TReyEzfPSlqoXCjoZ1206Ut7dS4lrukVfGHaw,358
|
31
|
+
planar/data/test_dataset.py,sha256=w2kay2PE-BhkryM3cOKX0nzSr2G0nCJxDuW1QCeFbyk,9985
|
29
32
|
planar/db/__init__.py,sha256=SNgB6unQ1f1E9dB9O-KrsPsYM17KLsgOW1u0ajqs57I,318
|
30
33
|
planar/db/alembic.ini,sha256=8G9IWbmF61Vwp1BXbkNOXTTgCEUMBQhOK_e-nnpnSYY,4309
|
31
34
|
planar/db/db.py,sha256=dELx4CHZkOAxFgHsW8qPlx2kUZ8J7cTlU6rHljMV_vg,12102
|
@@ -73,7 +76,7 @@ planar/object_config/__init__.py,sha256=8LbI3teg3jCKoUznZ7cal22C1URnHtJMpBokCHZQ
|
|
73
76
|
planar/object_config/models.py,sha256=nCyK82JitZwzGwbaBa-dZVxHPnL51ZJ6h87a-KEwHAw,3078
|
74
77
|
planar/object_config/object_config.py,sha256=MgaL-jBFJJtP6ipZ2eJs-KMhj94V_sT3QCSoVTpYP3Y,13609
|
75
78
|
planar/routers/__init__.py,sha256=B_ZEbBuosX4ahPfvWZsyMIPmQm0rt6ail4nJA6NLfOk,379
|
76
|
-
planar/routers/agents_router.py,sha256=
|
79
|
+
planar/routers/agents_router.py,sha256=trb1JPYVlaV7O2uoYvKIrLuTNGP_PmQSLZmXYFWrHkg,8251
|
77
80
|
planar/routers/entity_router.py,sha256=7Y1LDSqI_ovoOGr9DGylGM8BmRxF-WSPQSwITJHc6NE,4841
|
78
81
|
planar/routers/event.py,sha256=yvzzMQaKRoS2A0KSjQTyWcfmBzpt8xPNDfVW50XUSCw,2961
|
79
82
|
planar/routers/files.py,sha256=udu6PeZ9AuOpNyJete21rWAVQyE0qnC7tnSyJ97AH4Y,5644
|
@@ -82,14 +85,14 @@ planar/routers/info.py,sha256=HQa-mumw4zitG61V9isJlZ3cMr8pEwlB54Ct_LrpJDo,4473
|
|
82
85
|
planar/routers/models.py,sha256=RwXjXpJw2uyluM4Fjc34UA0Jm7J95cUjbmTTarD_P9k,4669
|
83
86
|
planar/routers/object_config_router.py,sha256=zA8-gGBQp1-Gm3uCC4WJ6nLicFwt4CsCqCYLFp1lRN8,4802
|
84
87
|
planar/routers/rule.py,sha256=d6giUwYRKzxQFPeoWbe8Ylp2Cxd71_uK8yoS9NrOOBg,3563
|
85
|
-
planar/routers/test_agents_router.py,sha256=
|
88
|
+
planar/routers/test_agents_router.py,sha256=d_d_lZT5zuSxNY2MEu51SmgLRGNZ3yCpGUooAXLpEaY,6082
|
86
89
|
planar/routers/test_files_router.py,sha256=_uYpRJkxSxyjFJAG7aj3letx25iDSkaOgZDTRHfU8TU,1559
|
87
90
|
planar/routers/test_object_config_router.py,sha256=HBOsQZXccPuWOLCPxEsduSd93loswUsbSk3eTM6KHRc,11389
|
88
|
-
planar/routers/test_routes_security.py,sha256=
|
91
|
+
planar/routers/test_routes_security.py,sha256=lXHeYg_th4UaDWeANM-dzONF8p2bEtwXJYYUlftE9R8,5556
|
89
92
|
planar/routers/test_rule_router.py,sha256=gCJO7-NVjkio-0ZHY2hNgPvubN-0NAPA3Hg5Jcrwe70,17203
|
90
93
|
planar/routers/test_workflow_router.py,sha256=rjK1Eau-YWs3vZbuJ50Ae_8I8_8TfxQA0F8I2HeDl9o,16572
|
91
94
|
planar/routers/workflow.py,sha256=8R35ENZeB5Mdt7WfH2zZ75BPg2oQ9d8kL47P1qvP-7Q,18045
|
92
|
-
planar/rules/__init__.py,sha256=
|
95
|
+
planar/rules/__init__.py,sha256=lF3F8Rdf2ottjiJu0IeBdqhg1bckLhOqZFI2t-8KItM,474
|
93
96
|
planar/rules/decorator.py,sha256=nxT17n9uwfXMOlk5lliw_cRS7Y83gMI6CQdrf_pB5yk,6666
|
94
97
|
planar/rules/models.py,sha256=vC38JLeGzmU87L8BX4AyVJLJHmRYjWRmoHQ6S6ZlhPg,10186
|
95
98
|
planar/rules/rule_configuration.py,sha256=B2G6mPnfxA277nF-Gr-B_Uely-ZOhz2jAhiwQMZuY-k,6508
|
@@ -110,8 +113,8 @@ planar/rules/test_data/portfolio_risk_monitor.json,sha256=tTvQOJJLhakGxG4CnA9fdB
|
|
110
113
|
planar/rules/test_data/supply_chain_risk.json,sha256=fO0wV5ZnsZQpOP19Zp2troTMADaX0-KMpCxG_uHG198,7263
|
111
114
|
planar/rules/test_data/warehouse_cross_docking.json,sha256=IPfcgNkY2sds301BeW6CjgFtK_zRyr27gI3UcqCB2Uo,5549
|
112
115
|
planar/scaffold_templates/main.py.j2,sha256=HcV0PVzcyRDaJvNdDQIFiDR1MJlLquNQzNO9oNkCKDQ,322
|
113
|
-
planar/scaffold_templates/planar.dev.yaml.j2,sha256=
|
114
|
-
planar/scaffold_templates/planar.prod.yaml.j2,sha256=
|
116
|
+
planar/scaffold_templates/planar.dev.yaml.j2,sha256=I5-IqX7GJm6qA91WtUMw43L4hKACqgnER_H2racim4c,998
|
117
|
+
planar/scaffold_templates/planar.prod.yaml.j2,sha256=FahJ2atDtvVH7IUCatGq6h9hmyF8meeiWC8RLfWphOQ,867
|
115
118
|
planar/scaffold_templates/pyproject.toml.j2,sha256=zD8UaEwK3uUYoGQuFuPZZCNdvqNS0faGrNHbD081DAU,182
|
116
119
|
planar/scaffold_templates/app/__init__.py.j2,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
117
120
|
planar/scaffold_templates/app/db/entities.py.j2,sha256=wg9O3JtRaRMKlDtoWHHodyNRL0s1UILvsr9fCQ_O2-4,279
|
@@ -137,7 +140,7 @@ planar/testing/memory_storage.py,sha256=apcuFisC3hW9KiU3kO8zwHQ6oK9Lu20NSX5fJ0LS
|
|
137
140
|
planar/testing/planar_test_client.py,sha256=qPkI_ZHZho_38PpdSmEjcRBO1iHcIx3dOwo7c02Am10,1979
|
138
141
|
planar/testing/synchronizable_tracer.py,sha256=SWeta1CgwGsN5duC0FR8NyXOQ1b1L8nDpvGdjZVJ9Bg,4938
|
139
142
|
planar/testing/test_memory_storage.py,sha256=So32XL0gbLDFMTl-WJN445x9jL6O8Qsqw8IRaiZnsPs,4797
|
140
|
-
planar/testing/workflow_observer.py,sha256=
|
143
|
+
planar/testing/workflow_observer.py,sha256=0Q2xsYuZzNGXHZVwvXBqL9KXPsdIXuSZGBJAxHopzJw,2976
|
141
144
|
planar/workflows/__init__.py,sha256=yFrrtKYUCx4jBPpHdEWDfKQgZXzGyr9voj5lFe9C-_w,826
|
142
145
|
planar/workflows/context.py,sha256=93kPSmYniqjX_lv6--eUUPnzZEKZJi6IPaAjrT-hFRY,1271
|
143
146
|
planar/workflows/contrib.py,sha256=b7WhCancxNCKO63mJCez9MahwMQc5_3zQxr_soJoXCY,6478
|
@@ -148,7 +151,7 @@ planar/workflows/execution.py,sha256=8c4a2L1qRMPQrCEJ8-sEk-gJi_xKq5gYKDSWSbSspVI
|
|
148
151
|
planar/workflows/lock.py,sha256=QU5_y_n8RHOC7ppLicH7yWX-Ni7N93hlB14D2zXOQ8A,8773
|
149
152
|
planar/workflows/misc.py,sha256=g3XVRMeU9mgDRi_6RgFdydLEqvTAg49wbIGlmC7kOu8,140
|
150
153
|
planar/workflows/models.py,sha256=54z19XaMp-OP9qE_HT2yhK12u8NC4ZD7SgwY8sGjyw4,5567
|
151
|
-
planar/workflows/notifications.py,sha256=
|
154
|
+
planar/workflows/notifications.py,sha256=JrObfWD-uRZJlZLMSDJDqjDuXfYAoRSLfgEeyoy98Vs,3795
|
152
155
|
planar/workflows/orchestrator.py,sha256=rneB1yOPDZiJcHFbD6UDZ4juU77iSBK1eu1gOFm58vM,15480
|
153
156
|
planar/workflows/query.py,sha256=38B5SLwXf3AlA_1ChR5DicFWdcUqzpQzMkuAUCNHafI,8838
|
154
157
|
planar/workflows/serialization.py,sha256=v3eqUS0odUFS7PnIrKyKUrK-feIv0ssxEp2VxjkddyI,13733
|
@@ -163,7 +166,7 @@ planar/workflows/test_suspend_deserialization.py,sha256=ddw2jToSJ-ebQ0RfT7KWTRMC
|
|
163
166
|
planar/workflows/test_workflow.py,sha256=KArm9m44IBXKY9j4v_O74MAweFN6jEb7tVRomziaeFU,64011
|
164
167
|
planar/workflows/tracing.py,sha256=E7E_kj2VBQisDqrllviIshbvOmB9QcEeRwMapunqio4,2732
|
165
168
|
planar/workflows/wrappers.py,sha256=KON6RGg1D6yStboNbuMEeTXRpPTEa8S6Elh1tOnMAlM,1149
|
166
|
-
planar-0.
|
167
|
-
planar-0.
|
168
|
-
planar-0.
|
169
|
-
planar-0.
|
169
|
+
planar-0.9.0.dist-info/METADATA,sha256=ak3k4S6dRs-2cuotMeuTZ2Egv0syC2rHER_zL706OFk,12199
|
170
|
+
planar-0.9.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
171
|
+
planar-0.9.0.dist-info/entry_points.txt,sha256=ZtFgrZ0eeoVmhLA51ESipK0nHg2t_prjW0Cm8WhpP54,95
|
172
|
+
planar-0.9.0.dist-info/RECORD,,
|