planar 0.8.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 +19 -3
- planar/ai/agent_base.py +1 -5
- planar/ai/agent_utils.py +0 -72
- planar/ai/models.py +30 -0
- planar/ai/pydantic_ai.py +12 -11
- 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_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.8.0.dist-info → planar-0.9.0.dist-info}/METADATA +5 -1
- {planar-0.8.0.dist-info → planar-0.9.0.dist-info}/RECORD +25 -19
- {planar-0.8.0.dist-info → planar-0.9.0.dist-info}/WHEEL +0 -0
- {planar-0.8.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,13 +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/agent_base.py,sha256=
|
21
|
-
planar/ai/agent_utils.py,sha256=
|
22
|
-
planar/ai/models.py,sha256=
|
23
|
-
planar/ai/pydantic_ai.py,sha256=
|
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
|
24
25
|
planar/ai/test_agent_serialization.py,sha256=zYLIxhYdFhOZzBrEBoQNyYLyNcNxWwaMTkjt_ARTkZk,8073
|
25
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
|
26
32
|
planar/db/__init__.py,sha256=SNgB6unQ1f1E9dB9O-KrsPsYM17KLsgOW1u0ajqs57I,318
|
27
33
|
planar/db/alembic.ini,sha256=8G9IWbmF61Vwp1BXbkNOXTTgCEUMBQhOK_e-nnpnSYY,4309
|
28
34
|
planar/db/db.py,sha256=dELx4CHZkOAxFgHsW8qPlx2kUZ8J7cTlU6rHljMV_vg,12102
|
@@ -70,7 +76,7 @@ planar/object_config/__init__.py,sha256=8LbI3teg3jCKoUznZ7cal22C1URnHtJMpBokCHZQ
|
|
70
76
|
planar/object_config/models.py,sha256=nCyK82JitZwzGwbaBa-dZVxHPnL51ZJ6h87a-KEwHAw,3078
|
71
77
|
planar/object_config/object_config.py,sha256=MgaL-jBFJJtP6ipZ2eJs-KMhj94V_sT3QCSoVTpYP3Y,13609
|
72
78
|
planar/routers/__init__.py,sha256=B_ZEbBuosX4ahPfvWZsyMIPmQm0rt6ail4nJA6NLfOk,379
|
73
|
-
planar/routers/agents_router.py,sha256=
|
79
|
+
planar/routers/agents_router.py,sha256=trb1JPYVlaV7O2uoYvKIrLuTNGP_PmQSLZmXYFWrHkg,8251
|
74
80
|
planar/routers/entity_router.py,sha256=7Y1LDSqI_ovoOGr9DGylGM8BmRxF-WSPQSwITJHc6NE,4841
|
75
81
|
planar/routers/event.py,sha256=yvzzMQaKRoS2A0KSjQTyWcfmBzpt8xPNDfVW50XUSCw,2961
|
76
82
|
planar/routers/files.py,sha256=udu6PeZ9AuOpNyJete21rWAVQyE0qnC7tnSyJ97AH4Y,5644
|
@@ -82,11 +88,11 @@ planar/routers/rule.py,sha256=d6giUwYRKzxQFPeoWbe8Ylp2Cxd71_uK8yoS9NrOOBg,3563
|
|
82
88
|
planar/routers/test_agents_router.py,sha256=d_d_lZT5zuSxNY2MEu51SmgLRGNZ3yCpGUooAXLpEaY,6082
|
83
89
|
planar/routers/test_files_router.py,sha256=_uYpRJkxSxyjFJAG7aj3letx25iDSkaOgZDTRHfU8TU,1559
|
84
90
|
planar/routers/test_object_config_router.py,sha256=HBOsQZXccPuWOLCPxEsduSd93loswUsbSk3eTM6KHRc,11389
|
85
|
-
planar/routers/test_routes_security.py,sha256=
|
91
|
+
planar/routers/test_routes_security.py,sha256=lXHeYg_th4UaDWeANM-dzONF8p2bEtwXJYYUlftE9R8,5556
|
86
92
|
planar/routers/test_rule_router.py,sha256=gCJO7-NVjkio-0ZHY2hNgPvubN-0NAPA3Hg5Jcrwe70,17203
|
87
93
|
planar/routers/test_workflow_router.py,sha256=rjK1Eau-YWs3vZbuJ50Ae_8I8_8TfxQA0F8I2HeDl9o,16572
|
88
94
|
planar/routers/workflow.py,sha256=8R35ENZeB5Mdt7WfH2zZ75BPg2oQ9d8kL47P1qvP-7Q,18045
|
89
|
-
planar/rules/__init__.py,sha256=
|
95
|
+
planar/rules/__init__.py,sha256=lF3F8Rdf2ottjiJu0IeBdqhg1bckLhOqZFI2t-8KItM,474
|
90
96
|
planar/rules/decorator.py,sha256=nxT17n9uwfXMOlk5lliw_cRS7Y83gMI6CQdrf_pB5yk,6666
|
91
97
|
planar/rules/models.py,sha256=vC38JLeGzmU87L8BX4AyVJLJHmRYjWRmoHQ6S6ZlhPg,10186
|
92
98
|
planar/rules/rule_configuration.py,sha256=B2G6mPnfxA277nF-Gr-B_Uely-ZOhz2jAhiwQMZuY-k,6508
|
@@ -107,8 +113,8 @@ planar/rules/test_data/portfolio_risk_monitor.json,sha256=tTvQOJJLhakGxG4CnA9fdB
|
|
107
113
|
planar/rules/test_data/supply_chain_risk.json,sha256=fO0wV5ZnsZQpOP19Zp2troTMADaX0-KMpCxG_uHG198,7263
|
108
114
|
planar/rules/test_data/warehouse_cross_docking.json,sha256=IPfcgNkY2sds301BeW6CjgFtK_zRyr27gI3UcqCB2Uo,5549
|
109
115
|
planar/scaffold_templates/main.py.j2,sha256=HcV0PVzcyRDaJvNdDQIFiDR1MJlLquNQzNO9oNkCKDQ,322
|
110
|
-
planar/scaffold_templates/planar.dev.yaml.j2,sha256=
|
111
|
-
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
|
112
118
|
planar/scaffold_templates/pyproject.toml.j2,sha256=zD8UaEwK3uUYoGQuFuPZZCNdvqNS0faGrNHbD081DAU,182
|
113
119
|
planar/scaffold_templates/app/__init__.py.j2,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
114
120
|
planar/scaffold_templates/app/db/entities.py.j2,sha256=wg9O3JtRaRMKlDtoWHHodyNRL0s1UILvsr9fCQ_O2-4,279
|
@@ -134,7 +140,7 @@ planar/testing/memory_storage.py,sha256=apcuFisC3hW9KiU3kO8zwHQ6oK9Lu20NSX5fJ0LS
|
|
134
140
|
planar/testing/planar_test_client.py,sha256=qPkI_ZHZho_38PpdSmEjcRBO1iHcIx3dOwo7c02Am10,1979
|
135
141
|
planar/testing/synchronizable_tracer.py,sha256=SWeta1CgwGsN5duC0FR8NyXOQ1b1L8nDpvGdjZVJ9Bg,4938
|
136
142
|
planar/testing/test_memory_storage.py,sha256=So32XL0gbLDFMTl-WJN445x9jL6O8Qsqw8IRaiZnsPs,4797
|
137
|
-
planar/testing/workflow_observer.py,sha256=
|
143
|
+
planar/testing/workflow_observer.py,sha256=0Q2xsYuZzNGXHZVwvXBqL9KXPsdIXuSZGBJAxHopzJw,2976
|
138
144
|
planar/workflows/__init__.py,sha256=yFrrtKYUCx4jBPpHdEWDfKQgZXzGyr9voj5lFe9C-_w,826
|
139
145
|
planar/workflows/context.py,sha256=93kPSmYniqjX_lv6--eUUPnzZEKZJi6IPaAjrT-hFRY,1271
|
140
146
|
planar/workflows/contrib.py,sha256=b7WhCancxNCKO63mJCez9MahwMQc5_3zQxr_soJoXCY,6478
|
@@ -145,7 +151,7 @@ planar/workflows/execution.py,sha256=8c4a2L1qRMPQrCEJ8-sEk-gJi_xKq5gYKDSWSbSspVI
|
|
145
151
|
planar/workflows/lock.py,sha256=QU5_y_n8RHOC7ppLicH7yWX-Ni7N93hlB14D2zXOQ8A,8773
|
146
152
|
planar/workflows/misc.py,sha256=g3XVRMeU9mgDRi_6RgFdydLEqvTAg49wbIGlmC7kOu8,140
|
147
153
|
planar/workflows/models.py,sha256=54z19XaMp-OP9qE_HT2yhK12u8NC4ZD7SgwY8sGjyw4,5567
|
148
|
-
planar/workflows/notifications.py,sha256=
|
154
|
+
planar/workflows/notifications.py,sha256=JrObfWD-uRZJlZLMSDJDqjDuXfYAoRSLfgEeyoy98Vs,3795
|
149
155
|
planar/workflows/orchestrator.py,sha256=rneB1yOPDZiJcHFbD6UDZ4juU77iSBK1eu1gOFm58vM,15480
|
150
156
|
planar/workflows/query.py,sha256=38B5SLwXf3AlA_1ChR5DicFWdcUqzpQzMkuAUCNHafI,8838
|
151
157
|
planar/workflows/serialization.py,sha256=v3eqUS0odUFS7PnIrKyKUrK-feIv0ssxEp2VxjkddyI,13733
|
@@ -160,7 +166,7 @@ planar/workflows/test_suspend_deserialization.py,sha256=ddw2jToSJ-ebQ0RfT7KWTRMC
|
|
160
166
|
planar/workflows/test_workflow.py,sha256=KArm9m44IBXKY9j4v_O74MAweFN6jEb7tVRomziaeFU,64011
|
161
167
|
planar/workflows/tracing.py,sha256=E7E_kj2VBQisDqrllviIshbvOmB9QcEeRwMapunqio4,2732
|
162
168
|
planar/workflows/wrappers.py,sha256=KON6RGg1D6yStboNbuMEeTXRpPTEa8S6Elh1tOnMAlM,1149
|
163
|
-
planar-0.
|
164
|
-
planar-0.
|
165
|
-
planar-0.
|
166
|
-
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,,
|
File without changes
|
File without changes
|