planar 0.5.0__py3-none-any.whl → 0.8.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 +155 -283
- planar/ai/agent_base.py +170 -0
- planar/ai/agent_utils.py +7 -0
- planar/ai/pydantic_ai.py +638 -0
- planar/ai/test_agent_serialization.py +1 -1
- planar/app.py +64 -20
- planar/cli.py +39 -27
- planar/config.py +45 -36
- planar/db/db.py +2 -1
- planar/files/storage/azure_blob.py +343 -0
- planar/files/storage/base.py +7 -0
- planar/files/storage/config.py +70 -7
- planar/files/storage/s3.py +6 -6
- planar/files/storage/test_azure_blob.py +435 -0
- planar/logging/formatter.py +17 -4
- planar/logging/test_formatter.py +327 -0
- planar/registry_items.py +2 -1
- planar/routers/agents_router.py +3 -1
- planar/routers/files.py +11 -2
- planar/routers/models.py +14 -1
- planar/routers/test_agents_router.py +1 -1
- planar/routers/test_files_router.py +49 -0
- planar/routers/test_routes_security.py +5 -7
- planar/routers/test_workflow_router.py +270 -3
- planar/routers/workflow.py +95 -36
- planar/rules/models.py +36 -39
- planar/rules/test_data/account_dormancy_management.json +223 -0
- planar/rules/test_data/airline_loyalty_points_calculator.json +262 -0
- planar/rules/test_data/applicant_risk_assessment.json +435 -0
- planar/rules/test_data/booking_fraud_detection.json +407 -0
- planar/rules/test_data/cellular_data_rollover_system.json +258 -0
- planar/rules/test_data/clinical_trial_eligibility_screener.json +437 -0
- planar/rules/test_data/customer_lifetime_value.json +143 -0
- planar/rules/test_data/import_duties_calculator.json +289 -0
- planar/rules/test_data/insurance_prior_authorization.json +443 -0
- planar/rules/test_data/online_check_in_eligibility_system.json +254 -0
- planar/rules/test_data/order_consolidation_system.json +375 -0
- planar/rules/test_data/portfolio_risk_monitor.json +471 -0
- planar/rules/test_data/supply_chain_risk.json +253 -0
- planar/rules/test_data/warehouse_cross_docking.json +237 -0
- planar/rules/test_rules.py +750 -6
- planar/scaffold_templates/planar.dev.yaml.j2 +6 -6
- planar/scaffold_templates/planar.prod.yaml.j2 +9 -5
- planar/scaffold_templates/pyproject.toml.j2 +1 -1
- planar/security/auth_context.py +21 -0
- planar/security/{jwt_middleware.py → auth_middleware.py} +70 -17
- planar/security/authorization.py +9 -15
- planar/security/tests/test_auth_middleware.py +162 -0
- planar/sse/proxy.py +4 -9
- planar/test_app.py +92 -1
- planar/test_cli.py +81 -59
- planar/test_config.py +17 -14
- planar/testing/fixtures.py +325 -0
- planar/testing/planar_test_client.py +5 -2
- planar/utils.py +41 -1
- planar/workflows/execution.py +1 -1
- planar/workflows/orchestrator.py +5 -0
- planar/workflows/serialization.py +12 -6
- planar/workflows/step_core.py +3 -1
- planar/workflows/test_serialization.py +9 -1
- {planar-0.5.0.dist-info → planar-0.8.0.dist-info}/METADATA +30 -5
- planar-0.8.0.dist-info/RECORD +166 -0
- planar/.__init__.py.un~ +0 -0
- planar/._version.py.un~ +0 -0
- planar/.app.py.un~ +0 -0
- planar/.cli.py.un~ +0 -0
- planar/.config.py.un~ +0 -0
- planar/.context.py.un~ +0 -0
- planar/.db.py.un~ +0 -0
- planar/.di.py.un~ +0 -0
- planar/.engine.py.un~ +0 -0
- planar/.files.py.un~ +0 -0
- planar/.log_context.py.un~ +0 -0
- planar/.log_metadata.py.un~ +0 -0
- planar/.logging.py.un~ +0 -0
- planar/.object_registry.py.un~ +0 -0
- planar/.otel.py.un~ +0 -0
- planar/.server.py.un~ +0 -0
- planar/.session.py.un~ +0 -0
- planar/.sqlalchemy.py.un~ +0 -0
- planar/.task_local.py.un~ +0 -0
- planar/.test_app.py.un~ +0 -0
- planar/.test_config.py.un~ +0 -0
- planar/.test_object_config.py.un~ +0 -0
- planar/.test_sqlalchemy.py.un~ +0 -0
- planar/.test_utils.py.un~ +0 -0
- planar/.util.py.un~ +0 -0
- planar/.utils.py.un~ +0 -0
- planar/ai/.__init__.py.un~ +0 -0
- planar/ai/._models.py.un~ +0 -0
- planar/ai/.agent.py.un~ +0 -0
- planar/ai/.agent_utils.py.un~ +0 -0
- planar/ai/.events.py.un~ +0 -0
- planar/ai/.files.py.un~ +0 -0
- planar/ai/.models.py.un~ +0 -0
- planar/ai/.providers.py.un~ +0 -0
- planar/ai/.pydantic_ai.py.un~ +0 -0
- planar/ai/.pydantic_ai_agent.py.un~ +0 -0
- planar/ai/.pydantic_ai_provider.py.un~ +0 -0
- planar/ai/.step.py.un~ +0 -0
- planar/ai/.test_agent.py.un~ +0 -0
- planar/ai/.test_agent_serialization.py.un~ +0 -0
- planar/ai/.test_providers.py.un~ +0 -0
- planar/ai/.utils.py.un~ +0 -0
- planar/ai/providers.py +0 -1088
- planar/ai/test_agent.py +0 -1298
- planar/ai/test_providers.py +0 -463
- planar/db/.db.py.un~ +0 -0
- planar/files/.config.py.un~ +0 -0
- planar/files/.local.py.un~ +0 -0
- planar/files/.local_filesystem.py.un~ +0 -0
- planar/files/.model.py.un~ +0 -0
- planar/files/.models.py.un~ +0 -0
- planar/files/.s3.py.un~ +0 -0
- planar/files/.storage.py.un~ +0 -0
- planar/files/.test_files.py.un~ +0 -0
- planar/files/storage/.__init__.py.un~ +0 -0
- planar/files/storage/.base.py.un~ +0 -0
- planar/files/storage/.config.py.un~ +0 -0
- planar/files/storage/.context.py.un~ +0 -0
- planar/files/storage/.local_directory.py.un~ +0 -0
- planar/files/storage/.test_local_directory.py.un~ +0 -0
- planar/files/storage/.test_s3.py.un~ +0 -0
- planar/human/.human.py.un~ +0 -0
- planar/human/.test_human.py.un~ +0 -0
- planar/logging/.__init__.py.un~ +0 -0
- planar/logging/.attributes.py.un~ +0 -0
- planar/logging/.formatter.py.un~ +0 -0
- planar/logging/.logger.py.un~ +0 -0
- planar/logging/.otel.py.un~ +0 -0
- planar/logging/.tracer.py.un~ +0 -0
- planar/modeling/.mixin.py.un~ +0 -0
- planar/modeling/.storage.py.un~ +0 -0
- planar/modeling/orm/.planar_base_model.py.un~ +0 -0
- planar/object_config/.object_config.py.un~ +0 -0
- planar/routers/.__init__.py.un~ +0 -0
- planar/routers/.agents_router.py.un~ +0 -0
- planar/routers/.crud.py.un~ +0 -0
- planar/routers/.decision.py.un~ +0 -0
- planar/routers/.event.py.un~ +0 -0
- planar/routers/.file_attachment.py.un~ +0 -0
- planar/routers/.files.py.un~ +0 -0
- planar/routers/.files_router.py.un~ +0 -0
- planar/routers/.human.py.un~ +0 -0
- planar/routers/.info.py.un~ +0 -0
- planar/routers/.models.py.un~ +0 -0
- planar/routers/.object_config_router.py.un~ +0 -0
- planar/routers/.rule.py.un~ +0 -0
- planar/routers/.test_object_config_router.py.un~ +0 -0
- planar/routers/.test_workflow_router.py.un~ +0 -0
- planar/routers/.workflow.py.un~ +0 -0
- planar/rules/.decorator.py.un~ +0 -0
- planar/rules/.runner.py.un~ +0 -0
- planar/rules/.test_rules.py.un~ +0 -0
- planar/security/.jwt_middleware.py.un~ +0 -0
- planar/sse/.constants.py.un~ +0 -0
- planar/sse/.example.html.un~ +0 -0
- planar/sse/.hub.py.un~ +0 -0
- planar/sse/.model.py.un~ +0 -0
- planar/sse/.proxy.py.un~ +0 -0
- planar/testing/.client.py.un~ +0 -0
- planar/testing/.memory_storage.py.un~ +0 -0
- planar/testing/.planar_test_client.py.un~ +0 -0
- planar/testing/.predictable_tracer.py.un~ +0 -0
- planar/testing/.synchronizable_tracer.py.un~ +0 -0
- planar/testing/.test_memory_storage.py.un~ +0 -0
- planar/testing/.workflow_observer.py.un~ +0 -0
- planar/workflows/.__init__.py.un~ +0 -0
- planar/workflows/.builtin_steps.py.un~ +0 -0
- planar/workflows/.concurrency_tracing.py.un~ +0 -0
- planar/workflows/.context.py.un~ +0 -0
- planar/workflows/.contrib.py.un~ +0 -0
- planar/workflows/.decorators.py.un~ +0 -0
- planar/workflows/.durable_test.py.un~ +0 -0
- planar/workflows/.errors.py.un~ +0 -0
- planar/workflows/.events.py.un~ +0 -0
- planar/workflows/.exceptions.py.un~ +0 -0
- planar/workflows/.execution.py.un~ +0 -0
- planar/workflows/.human.py.un~ +0 -0
- planar/workflows/.lock.py.un~ +0 -0
- planar/workflows/.misc.py.un~ +0 -0
- planar/workflows/.model.py.un~ +0 -0
- planar/workflows/.models.py.un~ +0 -0
- planar/workflows/.notifications.py.un~ +0 -0
- planar/workflows/.orchestrator.py.un~ +0 -0
- planar/workflows/.runtime.py.un~ +0 -0
- planar/workflows/.serialization.py.un~ +0 -0
- planar/workflows/.step.py.un~ +0 -0
- planar/workflows/.step_core.py.un~ +0 -0
- planar/workflows/.sub_workflow_runner.py.un~ +0 -0
- planar/workflows/.sub_workflow_scheduler.py.un~ +0 -0
- planar/workflows/.test_concurrency.py.un~ +0 -0
- planar/workflows/.test_concurrency_detection.py.un~ +0 -0
- planar/workflows/.test_human.py.un~ +0 -0
- planar/workflows/.test_lock_timeout.py.un~ +0 -0
- planar/workflows/.test_orchestrator.py.un~ +0 -0
- planar/workflows/.test_race_conditions.py.un~ +0 -0
- planar/workflows/.test_serialization.py.un~ +0 -0
- planar/workflows/.test_suspend_deserialization.py.un~ +0 -0
- planar/workflows/.test_workflow.py.un~ +0 -0
- planar/workflows/.tracing.py.un~ +0 -0
- planar/workflows/.types.py.un~ +0 -0
- planar/workflows/.util.py.un~ +0 -0
- planar/workflows/.utils.py.un~ +0 -0
- planar/workflows/.workflow.py.un~ +0 -0
- planar/workflows/.workflow_wrapper.py.un~ +0 -0
- planar/workflows/.wrappers.py.un~ +0 -0
- planar-0.5.0.dist-info/RECORD +0 -289
- {planar-0.5.0.dist-info → planar-0.8.0.dist-info}/WHEEL +0 -0
- {planar-0.5.0.dist-info → planar-0.8.0.dist-info}/entry_points.txt +0 -0
@@ -19,12 +19,15 @@ class PlanarTestClient(AsyncClient):
|
|
19
19
|
|
20
20
|
@asynccontextmanager
|
21
21
|
async def planar_test_client(
|
22
|
-
app: PlanarApp, connection_string: str, observer: WorkflowObserver
|
22
|
+
app: PlanarApp, connection_string: str, observer: WorkflowObserver | None = None
|
23
23
|
):
|
24
24
|
# Override the db manager with a new one that uses test database
|
25
25
|
app.db_manager = DatabaseManager(connection_string)
|
26
26
|
app.db_manager.connect()
|
27
|
-
|
27
|
+
if observer:
|
28
|
+
app.on_workflow_notification = observer.on_workflow_notification
|
29
|
+
app.sse_proxy.enable_builtin_hub = False
|
30
|
+
app.sse_proxy.hub_url = ""
|
28
31
|
|
29
32
|
async with PlanarTestClient(app) as client:
|
30
33
|
# run the app lifespan
|
planar/utils.py
CHANGED
@@ -3,7 +3,7 @@ import functools
|
|
3
3
|
import inspect
|
4
4
|
import random
|
5
5
|
from datetime import UTC, datetime
|
6
|
-
from typing import Any, Callable, Coroutine, ParamSpec, TypeVar
|
6
|
+
from typing import Any, Callable, Coroutine, Iterable, ParamSpec, TypeVar
|
7
7
|
|
8
8
|
from inflection import pluralize, underscore
|
9
9
|
|
@@ -68,3 +68,43 @@ def exponential_backoff_with_jitter(
|
|
68
68
|
actual_delay = delay + random.uniform(-jitter, jitter)
|
69
69
|
|
70
70
|
return max(1, actual_delay) # Ensure at least 1 second
|
71
|
+
|
72
|
+
|
73
|
+
def partition[T](
|
74
|
+
predicate: Callable[[T], bool], iterable: Iterable[T]
|
75
|
+
) -> tuple[list[T], list[T]]:
|
76
|
+
"""
|
77
|
+
Partition an iterable into two lists based on a predicate function.
|
78
|
+
|
79
|
+
Returns a tuple of two lists:
|
80
|
+
- First list contains all items for which predicate(item) is False
|
81
|
+
- Second list contains all items for which predicate(item) is True
|
82
|
+
|
83
|
+
This matches the behavior of more_itertools.partition.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
predicate: A function that takes an item and returns True or False
|
87
|
+
iterable: Any iterable of items to partition
|
88
|
+
|
89
|
+
Returns:
|
90
|
+
A tuple of (false_items, true_items)
|
91
|
+
|
92
|
+
Examples:
|
93
|
+
>>> is_even = lambda x: x % 2 == 0
|
94
|
+
>>> partition(is_even, [1, 2, 3, 4, 5, 6])
|
95
|
+
([1, 3, 5], [2, 4, 6])
|
96
|
+
|
97
|
+
>>> is_uppercase = lambda s: s.isupper()
|
98
|
+
>>> partition(is_uppercase, "Hello WORLD")
|
99
|
+
(['e', 'l', 'l', 'o', ' '], ['H', 'W', 'O', 'R', 'L', 'D'])
|
100
|
+
"""
|
101
|
+
false_items: list[T] = []
|
102
|
+
true_items: list[T] = []
|
103
|
+
|
104
|
+
for item in iterable:
|
105
|
+
if predicate(item):
|
106
|
+
true_items.append(item)
|
107
|
+
else:
|
108
|
+
false_items.append(item)
|
109
|
+
|
110
|
+
return false_items, true_items
|
planar/workflows/execution.py
CHANGED
planar/workflows/orchestrator.py
CHANGED
@@ -169,6 +169,11 @@ class WorkflowOrchestrator:
|
|
169
169
|
)
|
170
170
|
).all()
|
171
171
|
|
172
|
+
if len(workflow_ids) == query_limit:
|
173
|
+
logger.info(
|
174
|
+
"query limit reached, more workflows might be available",
|
175
|
+
query_limit=query_limit,
|
176
|
+
)
|
172
177
|
for workflow_id in workflow_ids:
|
173
178
|
task = create_task(
|
174
179
|
self.__resume_workflow(
|
@@ -9,7 +9,7 @@ from the database.
|
|
9
9
|
import inspect
|
10
10
|
import uuid
|
11
11
|
from dataclasses import fields, is_dataclass
|
12
|
-
from datetime import datetime, timedelta
|
12
|
+
from datetime import date, datetime, timedelta
|
13
13
|
from decimal import Decimal
|
14
14
|
from types import UnionType
|
15
15
|
from typing import (
|
@@ -54,7 +54,7 @@ def serialize_primitive(value: Any) -> Any:
|
|
54
54
|
return str(value)
|
55
55
|
elif isinstance(value, uuid.UUID):
|
56
56
|
return str(value)
|
57
|
-
elif isinstance(value, datetime):
|
57
|
+
elif isinstance(value, (datetime, date)):
|
58
58
|
return value.isoformat()
|
59
59
|
elif isinstance(value, timedelta):
|
60
60
|
# Represent timedelta as a dict
|
@@ -81,6 +81,8 @@ def deserialize_primitive(value: Any, type_hint: Type) -> Any:
|
|
81
81
|
return uuid.UUID(value)
|
82
82
|
elif type_hint is datetime:
|
83
83
|
return datetime.fromisoformat(value)
|
84
|
+
elif type_hint is date:
|
85
|
+
return date.fromisoformat(value)
|
84
86
|
elif type_hint is timedelta:
|
85
87
|
if isinstance(value, dict) and all(
|
86
88
|
k in value for k in ("days", "seconds", "microseconds")
|
@@ -118,7 +120,9 @@ def serialize_value(value: Any) -> Any:
|
|
118
120
|
if isinstance(value, list):
|
119
121
|
return [serialize_value(v) for v in value]
|
120
122
|
|
121
|
-
if isinstance(
|
123
|
+
if isinstance(
|
124
|
+
value, (bool, int, float, Decimal, uuid.UUID, datetime, timedelta, date)
|
125
|
+
):
|
122
126
|
return serialize_primitive(value)
|
123
127
|
|
124
128
|
return value
|
@@ -331,7 +335,9 @@ def deserialize_result(
|
|
331
335
|
|
332
336
|
# Use explicit return_type if provided
|
333
337
|
if return_type is not None:
|
334
|
-
logger.debug(
|
338
|
+
logger.debug(
|
339
|
+
"using explicitly provided return type", return_type=str(return_type)
|
340
|
+
)
|
335
341
|
return deserialize_value(result, return_type)
|
336
342
|
|
337
343
|
# Otherwise, fallback to inferring from function signature
|
@@ -377,7 +383,7 @@ def deserialize_result(
|
|
377
383
|
# Not a generic type requiring inference, or inference not possible/needed.
|
378
384
|
logger.debug(
|
379
385
|
"using signature return type hint directly",
|
380
|
-
return_type_hint=return_type_hint,
|
386
|
+
return_type_hint=str(return_type_hint),
|
381
387
|
)
|
382
388
|
return deserialize_value(result, return_type_hint)
|
383
389
|
|
@@ -398,7 +404,7 @@ def deserialize_result(
|
|
398
404
|
concrete_return_type = return_origin[final_arg] # type: ignore
|
399
405
|
logger.debug(
|
400
406
|
"constructed concrete return type",
|
401
|
-
concrete_return_type=concrete_return_type,
|
407
|
+
concrete_return_type=str(concrete_return_type),
|
402
408
|
)
|
403
409
|
return deserialize_value(result, concrete_return_type)
|
404
410
|
except Exception:
|
planar/workflows/step_core.py
CHANGED
@@ -137,7 +137,9 @@ def _step(
|
|
137
137
|
session = get_session()
|
138
138
|
ctx = get_context()
|
139
139
|
ctx.current_step_id += 1
|
140
|
-
logger.debug(
|
140
|
+
logger.debug(
|
141
|
+
"executing step", step_name=name, args=str(args), kwargs=kwargs
|
142
|
+
)
|
141
143
|
step_id = ctx.current_step_id
|
142
144
|
validate_repeated_call_args = False
|
143
145
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import uuid
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from datetime import datetime, timedelta
|
3
|
+
from datetime import date, datetime, timedelta
|
4
4
|
from decimal import Decimal
|
5
5
|
from typing import Any, List, Optional, Union
|
6
6
|
|
@@ -67,6 +67,10 @@ def test_serialize_primitive():
|
|
67
67
|
test_dt = datetime(2023, 5, 15, 12, 30, 45)
|
68
68
|
assert serialize_primitive(test_dt) == test_dt.isoformat()
|
69
69
|
|
70
|
+
# Test date
|
71
|
+
test_date = date(2023, 5, 15)
|
72
|
+
assert serialize_primitive(test_date) == test_date.isoformat()
|
73
|
+
|
70
74
|
# Test timedelta
|
71
75
|
test_td = timedelta(days=1, hours=2, minutes=30)
|
72
76
|
serialized_td = serialize_primitive(test_td)
|
@@ -93,6 +97,10 @@ def test_deserialize_primitive():
|
|
93
97
|
test_dt = datetime(2023, 5, 15, 12, 30, 45)
|
94
98
|
assert deserialize_primitive(test_dt.isoformat(), datetime) == test_dt
|
95
99
|
|
100
|
+
# Test date
|
101
|
+
test_date = date(2023, 5, 15)
|
102
|
+
assert deserialize_primitive(test_date.isoformat(), date) == test_date
|
103
|
+
|
96
104
|
# Test timedelta as dict
|
97
105
|
test_td = timedelta(days=1, hours=2, minutes=30)
|
98
106
|
serialized_td = {"days": 1, "seconds": (2 * 3600) + (30 * 60), "microseconds": 0}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: planar
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.8.0
|
4
4
|
Summary: Add your description here
|
5
5
|
License-Expression: LicenseRef-Proprietary
|
6
6
|
Requires-Python: >=3.12
|
@@ -9,12 +9,12 @@ Requires-Dist: aiosqlite>=0.21.0
|
|
9
9
|
Requires-Dist: alembic>=1.14.1
|
10
10
|
Requires-Dist: anthropic>=0.49.0
|
11
11
|
Requires-Dist: asyncpg
|
12
|
-
Requires-Dist: boto3
|
12
|
+
Requires-Dist: boto3>=1.39.15
|
13
13
|
Requires-Dist: cedarpy>=4.1.0
|
14
14
|
Requires-Dist: fastapi[standard]>=0.115.7
|
15
15
|
Requires-Dist: inflection>=0.5.1
|
16
16
|
Requires-Dist: openai>=1.75
|
17
|
-
Requires-Dist: pydantic-ai-slim>=0.
|
17
|
+
Requires-Dist: pydantic-ai-slim[anthropic,bedrock,google,openai]>=0.7.5
|
18
18
|
Requires-Dist: pygments>=2.19.1
|
19
19
|
Requires-Dist: pyjwt[crypto]
|
20
20
|
Requires-Dist: python-multipart>=0.0.20
|
@@ -23,6 +23,10 @@ Requires-Dist: sqlmodel>=0.0.22
|
|
23
23
|
Requires-Dist: typer>=0.15.2
|
24
24
|
Requires-Dist: typing-extensions>=4.12.2
|
25
25
|
Requires-Dist: zen-engine>=0.40.0
|
26
|
+
Provides-Extra: azure
|
27
|
+
Requires-Dist: aiohttp>=3.8.0; extra == 'azure'
|
28
|
+
Requires-Dist: azure-identity>=1.15.0; extra == 'azure'
|
29
|
+
Requires-Dist: azure-storage-blob>=12.19.0; extra == 'azure'
|
26
30
|
Provides-Extra: otel
|
27
31
|
Requires-Dist: opentelemetry-api>=1.34.1; extra == 'otel'
|
28
32
|
Requires-Dist: opentelemetry-exporter-otlp>=1.34.1; extra == 'otel'
|
@@ -245,8 +249,10 @@ logging:
|
|
245
249
|
|
246
250
|
The API docs can then be accessed on http://127.0.0.1:8000/docs
|
247
251
|
|
248
|
-
## Testing
|
249
252
|
|
253
|
+
## Planar Development
|
254
|
+
|
255
|
+
### Testing
|
250
256
|
We use pytest for testing Planar:
|
251
257
|
|
252
258
|
- To run the tests: `uv run pytest`
|
@@ -275,7 +281,7 @@ To disable SQLite testing:
|
|
275
281
|
PLANAR_TEST_SQLITE=0 uv run pytest
|
276
282
|
```
|
277
283
|
|
278
|
-
|
284
|
+
### Pre-commit hooks
|
279
285
|
|
280
286
|
We use [pre-commit](https://pre-commit.com/) to manage pre-commit hooks. To install the pre-commit hooks, run the following command:
|
281
287
|
|
@@ -283,3 +289,22 @@ We use [pre-commit](https://pre-commit.com/) to manage pre-commit hooks. To inst
|
|
283
289
|
uv tool install pre-commit
|
284
290
|
uv tool run pre-commit install
|
285
291
|
```
|
292
|
+
|
293
|
+
### Cairo SVG
|
294
|
+
|
295
|
+
For some tests we use Cairo SVG to PNG conversion. This is done using the [cairosvg](https://cairosvg.org/) library, but requires the core Cairo libraries to be installed in the system.
|
296
|
+
|
297
|
+
#### Linux
|
298
|
+
|
299
|
+
Cairo dependencies should already be installed.
|
300
|
+
|
301
|
+
#### MacOS
|
302
|
+
|
303
|
+
To install cairo, run the following command:
|
304
|
+
|
305
|
+
```bash
|
306
|
+
brew install cairo libffi pkg-config
|
307
|
+
export DYLD_FALLBACK_LIBRARY_PATH="/opt/homebrew/lib:${DYLD_FALLBACK_LIBRARY_PATH}"
|
308
|
+
```
|
309
|
+
|
310
|
+
|
@@ -0,0 +1,166 @@
|
|
1
|
+
planar/__init__.py,sha256=FAYRGjuJOH2Y_XYFA0-BrRFjuKdPzIShNbaYwJbtu6A,499
|
2
|
+
planar/_version.py,sha256=dZWiMFvyJ9WmUBmP_1Yn0Ze7otmWd3MrPYqf8mefKr4,18
|
3
|
+
planar/app.py,sha256=SKIpNY1K6NFF4_20kDxT40BIfJotiyhjNPwjU7P8_Ek,18695
|
4
|
+
planar/cli.py,sha256=2ObR5XkLGbdbnDqp5mrBzDVhSacHCNsVNSHnXkrMQzQ,9593
|
5
|
+
planar/config.py,sha256=NHNrvJl8h1QkUHUxZ96Th_v1TSxoxf8u0C4CA1VBr2k,17557
|
6
|
+
planar/object_registry.py,sha256=RMleX5XE8OKDxlnMeyLpJ1Y280duub-tx1smR1zTlDg,3219
|
7
|
+
planar/registry_items.py,sha256=UhZRIpbSoa_CV9OTl17pJfRLxItYp4Pxd9f5ZbJkGaM,2055
|
8
|
+
planar/session.py,sha256=xLS9WPvaiy9nr2Olju1-C-7_sU5VXK8RuNdjuKndul4,1020
|
9
|
+
planar/task_local.py,sha256=pyvT0bdzAn15HL2yQUs9YrU5MVXh9njQt9MH51AGljs,1102
|
10
|
+
planar/test_app.py,sha256=5dYhOW6lRbAx2X270DfqktkJ5IfuqfowX6bwxM1WQAM,4865
|
11
|
+
planar/test_cli.py,sha256=faR6CSuooHHyyB5Yt-p8CIr7mGtKrrU2TLQbc4Oe9bA,13834
|
12
|
+
planar/test_config.py,sha256=HcmDu1nwKZZhzHQLGVyP9oxje-_g_XubEsvzRj28QPg,14328
|
13
|
+
planar/test_object_config.py,sha256=izn4s2HmSDWpGtgpOTDmKeUYN2-63WDR1QtVQrT-x00,20135
|
14
|
+
planar/test_object_registry.py,sha256=R7IwbB2GACm2HUuVZTeVY4V12XB9_JgSSeppPxiCdfs,480
|
15
|
+
planar/test_sqlalchemy.py,sha256=F0aKqm5tStQj_Mqjh50kiLX4r7kphBFDOUDu_Iw7S3s,5573
|
16
|
+
planar/test_utils.py,sha256=gKenXotj36SN_bb3bQpYPfD8t06IjnGBQqEgWpujHcA,3086
|
17
|
+
planar/utils.py,sha256=v7q9AJyWgQWl9VPSN_0qxw3rBvYe-_Pb_KcwqSsjOFU,3103
|
18
|
+
planar/ai/__init__.py,sha256=ABOKvqQOLlVJkptcvXcuLjVZZWEsK8h-1RyFGK7kib8,231
|
19
|
+
planar/ai/agent.py,sha256=kcrFLQzIU7QPGNjgl_7irP1jJOReHs8EYz8-_H_TV0A,11929
|
20
|
+
planar/ai/agent_base.py,sha256=X4Gl4PmxyxD_HLnVyxK7fnhKgmudznrGwcv5nMzAXWs,5349
|
21
|
+
planar/ai/agent_utils.py,sha256=r7WGGMs5fCo5MlLX5vPlA9ry0mMzpSuf4Ro6Gnvp2TQ,5966
|
22
|
+
planar/ai/models.py,sha256=Rxvt00kCaQzbU59LcYDegK7kV8qYTRVH3YhU3ufuJCY,3532
|
23
|
+
planar/ai/pydantic_ai.py,sha256=IAVavvbqp7KIUpwFQwWf5hXtsxn2yMxIjl2NjeL3EsE,23423
|
24
|
+
planar/ai/test_agent_serialization.py,sha256=zYLIxhYdFhOZzBrEBoQNyYLyNcNxWwaMTkjt_ARTkZk,8073
|
25
|
+
planar/ai/utils.py,sha256=WVBW0TGaoKytC4bNd_a9lXrBf5QsDRut4GBcA53U2Ww,3116
|
26
|
+
planar/db/__init__.py,sha256=SNgB6unQ1f1E9dB9O-KrsPsYM17KLsgOW1u0ajqs57I,318
|
27
|
+
planar/db/alembic.ini,sha256=8G9IWbmF61Vwp1BXbkNOXTTgCEUMBQhOK_e-nnpnSYY,4309
|
28
|
+
planar/db/db.py,sha256=dELx4CHZkOAxFgHsW8qPlx2kUZ8J7cTlU6rHljMV_vg,12102
|
29
|
+
planar/db/alembic/env.py,sha256=cowI6O_4BMJPqDAukkbg69lzdsE44soi3ysxKGXbS_w,5207
|
30
|
+
planar/db/alembic/script.py.mako,sha256=Cl7ixgLNtLk1gF5xFNXOnC9YYLX4cpFd8yHtEyY0_dY,699
|
31
|
+
planar/db/alembic/versions/3476068c153c_initial_system_tables_migration.py,sha256=1FbzJyfapjegM-Mxd3HMMVA-8zVU6AnrnzEgIoc6eoQ,13204
|
32
|
+
planar/files/__init__.py,sha256=fms64l32M8hPK0SINXxNCykr2EpjBTcdgnezVgaCwkc,120
|
33
|
+
planar/files/models.py,sha256=zbZvMkoqoSnn7yOo26SRtEgtlHJbFIvwSht75APHQXk,6145
|
34
|
+
planar/files/test_files.py,sha256=2GFAz39dIf6-bhmJaDFeOpS2sZN7VnLI60ky-e170Mc,8921
|
35
|
+
planar/files/storage/azure_blob.py,sha256=PzCm8ZpyAMH9-N6VscTlLpud-CBLcQX9qC6YjbOSfZg,12316
|
36
|
+
planar/files/storage/base.py,sha256=KO7jyKwjKg5fNSLvhxJWE-lsypv6LXXf7bgA34aflwY,2495
|
37
|
+
planar/files/storage/config.py,sha256=jE9Dn6cG_a4x9pdaZkasOxjyWkK6hmplLrPjEsRXGLM,3473
|
38
|
+
planar/files/storage/context.py,sha256=Qadlz4T-FQ1A0TdGsOfuNmM679ohayU7oaexUpT8AY0,361
|
39
|
+
planar/files/storage/local_directory.py,sha256=1SsEfr0Ud9TvSQJneDl_M-D7AFYixLE9t-bVIiY3aSI,7395
|
40
|
+
planar/files/storage/s3.py,sha256=1861rSw3kplXtugUWD7mdSD_EnPSHME1mGc82V69r5g,8234
|
41
|
+
planar/files/storage/test_azure_blob.py,sha256=OFYpns6JyeCCBHCoLz56uUHR6tWWeSZldUant5llczI,14200
|
42
|
+
planar/files/storage/test_local_directory.py,sha256=KtzRfjtZUew1U-KETtD2mb6ywwX6HmjzaaeixOP0Ebg,5751
|
43
|
+
planar/files/storage/test_s3.py,sha256=QG-CH7fiaRmQRwffnqG2mLRrw9LIlR2-xRyHs6Wuspo,10565
|
44
|
+
planar/human/__init__.py,sha256=FwpV-FFssKKlvKSjWoI4gJB1XTMaNb1UNCSBxjAtIBw,147
|
45
|
+
planar/human/human.py,sha256=-oRtN_8bCtSV7Sxku7yG4rof7T5pr4j18Cfm3u4Z3PM,14925
|
46
|
+
planar/human/models.py,sha256=Cec1Y9NGGtuAl1ZhqNc9PWIq__BbiWVTh7IYKR4yl3w,2317
|
47
|
+
planar/human/test_human.py,sha256=GlbTjCNeAAfcwVIPq1TRiH0ojSgAU0i3oMc2yQe0xVo,13226
|
48
|
+
planar/logging/__init__.py,sha256=BW101gskQS3C2agKSDiJEy4L-j5z6BP1AwEfd2JMXHM,254
|
49
|
+
planar/logging/attributes.py,sha256=SB-lC-Osa55zXkX2UAWm56vKXvHgbF7TmhGnSiBWejk,1529
|
50
|
+
planar/logging/context.py,sha256=mGVpL-276VWpRUIGlkGwbn9gkATqFS7lcFn1aM0v-eQ,384
|
51
|
+
planar/logging/formatter.py,sha256=NMDhpo7ezsfGO7cPwOWbClqODviEgSjqHCoqrCCIu2c,3560
|
52
|
+
planar/logging/logger.py,sha256=vj3-z2ea0J1ppgDpJBsrueA3jg5kjk9ceIo-4tWarXk,2650
|
53
|
+
planar/logging/otel.py,sha256=bD1wgKTon1ooq3JIWc_i0_d_ejxw8_a5YPFuizRa5ic,1734
|
54
|
+
planar/logging/test_formatter.py,sha256=nzlZFUC1JD4Imcy1H7VaFhwjrHzRc_oQLXWZXiN7iGA,11695
|
55
|
+
planar/modeling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
56
|
+
planar/modeling/field_helpers.py,sha256=9SOHTWPzjlaiq7RF88wjug3NvAywFurcHn651YL_SNY,1903
|
57
|
+
planar/modeling/json_schema_generator.py,sha256=NDqPkWQA_I7ywQXCEQfj5ub9u5KAFEcSQpXVkrCluV4,2864
|
58
|
+
planar/modeling/mixins/__init__.py,sha256=Lwg5eL4VFfv61FRBvH5OZqIyfrSogxQlYLUDnWnSorg,320
|
59
|
+
planar/modeling/mixins/auditable.py,sha256=WP7aDWVn1j22ZffKzYRpu23JQJ4vvHCU1qxcbgChwhc,1619
|
60
|
+
planar/modeling/mixins/test_auditable.py,sha256=zIa63_0Y19wMF7oIvMcOj7RoIVH7ztQzis9kHFEKKR8,2912
|
61
|
+
planar/modeling/mixins/test_timestamp.py,sha256=oLKPvr8oUdjJPJRif81nn4YV_uwbxql_ojjXdKI7j7E,4366
|
62
|
+
planar/modeling/mixins/test_uuid_primary_key.py,sha256=t9ZoB0dS4jjJVrHic7EeEh_g3eZeYV3mr0ylv3Kr1Io,1575
|
63
|
+
planar/modeling/mixins/timestamp.py,sha256=-eHndCWztDiOxfCI2UknmphGeoHMJVDJG1Lz4KtkQUA,1641
|
64
|
+
planar/modeling/mixins/uuid_primary_key.py,sha256=O1BtuXk5GdsfpwTS6nGZm1GNi0pdXKQ6Kt2f5ZjiuMc,453
|
65
|
+
planar/modeling/orm/__init__.py,sha256=QwPgToKEf_gCdjAjKKmgh0xLTHGsboK1kH1a1a0tSy0,339
|
66
|
+
planar/modeling/orm/planar_base_entity.py,sha256=nL1kT2k__F9Lmo1SW2XEfB6vJi_Fg72u-wW1F79eFTs,959
|
67
|
+
planar/modeling/orm/query_filter_builder.py,sha256=Q2qWojo1Pzkt3HY1DdkBINlsP7uTOg1OOSUmwlzjTs8,5335
|
68
|
+
planar/modeling/orm/reexports.py,sha256=sP7nw8e1yp1cahpfsefO84P5n4TNnBRk1jVHuCuH4U4,290
|
69
|
+
planar/object_config/__init__.py,sha256=8LbI3teg3jCKoUznZ7cal22C1URnHtJMpBokCHZQUWo,352
|
70
|
+
planar/object_config/models.py,sha256=nCyK82JitZwzGwbaBa-dZVxHPnL51ZJ6h87a-KEwHAw,3078
|
71
|
+
planar/object_config/object_config.py,sha256=MgaL-jBFJJtP6ipZ2eJs-KMhj94V_sT3QCSoVTpYP3Y,13609
|
72
|
+
planar/routers/__init__.py,sha256=B_ZEbBuosX4ahPfvWZsyMIPmQm0rt6ail4nJA6NLfOk,379
|
73
|
+
planar/routers/agents_router.py,sha256=plshAbCDuk1eNQB9H0wVZbcZ6dGqgL9ffEcwHcklTm8,6821
|
74
|
+
planar/routers/entity_router.py,sha256=7Y1LDSqI_ovoOGr9DGylGM8BmRxF-WSPQSwITJHc6NE,4841
|
75
|
+
planar/routers/event.py,sha256=yvzzMQaKRoS2A0KSjQTyWcfmBzpt8xPNDfVW50XUSCw,2961
|
76
|
+
planar/routers/files.py,sha256=udu6PeZ9AuOpNyJete21rWAVQyE0qnC7tnSyJ97AH4Y,5644
|
77
|
+
planar/routers/human.py,sha256=m_CbH97_QGmzriui_xopLOq-2D1kR0WgvO92fMaFeBQ,5010
|
78
|
+
planar/routers/info.py,sha256=HQa-mumw4zitG61V9isJlZ3cMr8pEwlB54Ct_LrpJDo,4473
|
79
|
+
planar/routers/models.py,sha256=RwXjXpJw2uyluM4Fjc34UA0Jm7J95cUjbmTTarD_P9k,4669
|
80
|
+
planar/routers/object_config_router.py,sha256=zA8-gGBQp1-Gm3uCC4WJ6nLicFwt4CsCqCYLFp1lRN8,4802
|
81
|
+
planar/routers/rule.py,sha256=d6giUwYRKzxQFPeoWbe8Ylp2Cxd71_uK8yoS9NrOOBg,3563
|
82
|
+
planar/routers/test_agents_router.py,sha256=d_d_lZT5zuSxNY2MEu51SmgLRGNZ3yCpGUooAXLpEaY,6082
|
83
|
+
planar/routers/test_files_router.py,sha256=_uYpRJkxSxyjFJAG7aj3letx25iDSkaOgZDTRHfU8TU,1559
|
84
|
+
planar/routers/test_object_config_router.py,sha256=HBOsQZXccPuWOLCPxEsduSd93loswUsbSk3eTM6KHRc,11389
|
85
|
+
planar/routers/test_routes_security.py,sha256=DsyEbpaNsLGTE_aWhs_KyePJxw2qTBviP2Tn-GZj3T8,5508
|
86
|
+
planar/routers/test_rule_router.py,sha256=gCJO7-NVjkio-0ZHY2hNgPvubN-0NAPA3Hg5Jcrwe70,17203
|
87
|
+
planar/routers/test_workflow_router.py,sha256=rjK1Eau-YWs3vZbuJ50Ae_8I8_8TfxQA0F8I2HeDl9o,16572
|
88
|
+
planar/routers/workflow.py,sha256=8R35ENZeB5Mdt7WfH2zZ75BPg2oQ9d8kL47P1qvP-7Q,18045
|
89
|
+
planar/rules/__init__.py,sha256=gl5FSqLJMVPa04jqKtNNNH3alWeUsxq5CR71gmK-Xyk,662
|
90
|
+
planar/rules/decorator.py,sha256=nxT17n9uwfXMOlk5lliw_cRS7Y83gMI6CQdrf_pB5yk,6666
|
91
|
+
planar/rules/models.py,sha256=vC38JLeGzmU87L8BX4AyVJLJHmRYjWRmoHQ6S6ZlhPg,10186
|
92
|
+
planar/rules/rule_configuration.py,sha256=B2G6mPnfxA277nF-Gr-B_Uely-ZOhz2jAhiwQMZuY-k,6508
|
93
|
+
planar/rules/runner.py,sha256=KIPrt_ri50qotvDLOY9xly40bNTWRh8GVT2kEJFFtFo,1714
|
94
|
+
planar/rules/test_rules.py,sha256=6M7CSg1bwn7O7DOoNi38vyVG4UmPQfRFxEO9qGE6rz0,52011
|
95
|
+
planar/rules/test_data/account_dormancy_management.json,sha256=9aMMELZrF5DTBluMKUXJptxwULEcva4GHEyaapIeerY,4776
|
96
|
+
planar/rules/test_data/airline_loyalty_points_calculator.json,sha256=7S1koMe60yR3h2VQys34oLy5ynhsEQ5wadMLPHCRQZA,5689
|
97
|
+
planar/rules/test_data/applicant_risk_assessment.json,sha256=rj-Q13NczdNt00x5wrvGLalw5IfdT1j-_RvpwCZa7Fc,9994
|
98
|
+
planar/rules/test_data/booking_fraud_detection.json,sha256=HCAsUIIlaPL8Ph3jtUFVi2vTZxZW53-XggjDWEoXmi4,10027
|
99
|
+
planar/rules/test_data/cellular_data_rollover_system.json,sha256=8GjkKqqzK7usSa5KAvUwkD2CzW5JtLGECjlD5gH-vHk,6317
|
100
|
+
planar/rules/test_data/clinical_trial_eligibility_screener.json,sha256=VV0RzWdThBNlIffuyklqAcKtRq-aOLHpcXX28IR9qOU,11152
|
101
|
+
planar/rules/test_data/customer_lifetime_value.json,sha256=ZYeISNOsgT7zLcddeNrrrHlrocDlDBmSfOlQqhu3PTE,3562
|
102
|
+
planar/rules/test_data/import_duties_calculator.json,sha256=JsXuvkiGQF6MxrgrIhFC1UxDCtO9nQpxtKKXwOQ1VYs,9062
|
103
|
+
planar/rules/test_data/insurance_prior_authorization.json,sha256=27_jET4mmpuzLeOzVF5xi7c9IexX1UJTKsIoQGQ0n8c,12145
|
104
|
+
planar/rules/test_data/online_check_in_eligibility_system.json,sha256=c6zCGojFN6c-CnuvG93zqlCZIrMccnOGAPMZVoMfirg,6114
|
105
|
+
planar/rules/test_data/order_consolidation_system.json,sha256=kWJuVHAfAqsDW2xVdxHbtJTlfolQ_SM6_GISgnxsYB8,9803
|
106
|
+
planar/rules/test_data/portfolio_risk_monitor.json,sha256=tTvQOJJLhakGxG4CnA9fdBIECstJnp0B8ogFADkdy8s,15168
|
107
|
+
planar/rules/test_data/supply_chain_risk.json,sha256=fO0wV5ZnsZQpOP19Zp2troTMADaX0-KMpCxG_uHG198,7263
|
108
|
+
planar/rules/test_data/warehouse_cross_docking.json,sha256=IPfcgNkY2sds301BeW6CjgFtK_zRyr27gI3UcqCB2Uo,5549
|
109
|
+
planar/scaffold_templates/main.py.j2,sha256=HcV0PVzcyRDaJvNdDQIFiDR1MJlLquNQzNO9oNkCKDQ,322
|
110
|
+
planar/scaffold_templates/planar.dev.yaml.j2,sha256=bUvPZKJDzSEjK1hffgs4RYWSMfOzViVP0_nOG0iw4T8,797
|
111
|
+
planar/scaffold_templates/planar.prod.yaml.j2,sha256=DCWYIam7pdTMgWlWOcPNgDma5MHmH_QqjUO722SKE_4,555
|
112
|
+
planar/scaffold_templates/pyproject.toml.j2,sha256=zD8UaEwK3uUYoGQuFuPZZCNdvqNS0faGrNHbD081DAU,182
|
113
|
+
planar/scaffold_templates/app/__init__.py.j2,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
114
|
+
planar/scaffold_templates/app/db/entities.py.j2,sha256=wg9O3JtRaRMKlDtoWHHodyNRL0s1UILvsr9fCQ_O2-4,279
|
115
|
+
planar/scaffold_templates/app/flows/process_invoice.py.j2,sha256=nVJ5BlhOkHFEGkBuQNEF5G2P5HA1FGx25NSS5RXBUsw,1728
|
116
|
+
planar/security/auth_context.py,sha256=i63JkHQ3oXNlTis7GIKRkZJbkcvZhD2jVDuO7blgbSc,5068
|
117
|
+
planar/security/auth_middleware.py,sha256=Grrm0i2bstWZ83ukrNZsHvFbNzffN0rvbbCcb2OxRY0,5746
|
118
|
+
planar/security/authorization.py,sha256=zoej88_VINVNSDXm7u2LJbwOpMqmXBKj_pmCaPTar7M,11721
|
119
|
+
planar/security/default_policies.cedar,sha256=ACZqs-74iTQHypuKwfyyvIhXaRRn0MuRc98zTFGnFYU,1070
|
120
|
+
planar/security/security_context.py,sha256=vzfwiDJRzq8snaENrJddG5Ei-UUq_a5hkInMEOZf0mM,496
|
121
|
+
planar/security/tests/test_auth_middleware.py,sha256=GjAyJYAR6jF_zGG85ZKY-E_e_aoqjK8qiHSalv2T2rk,6206
|
122
|
+
planar/security/tests/test_authorization_context.py,sha256=cnsC3V13NBJwzyIwZaM9wu_vergcnmVhwB3khVH7G-o,2364
|
123
|
+
planar/security/tests/test_cedar_basics.py,sha256=i1jLPjlJT1n_97onbeDYVpnwAzU2PmHvIPvaJSH1J2U,1026
|
124
|
+
planar/security/tests/test_cedar_policies.py,sha256=-Vn_CQgCUAVg7YhdUd34FsOjNL1EmY_o92r-fzmknP8,4848
|
125
|
+
planar/security/tests/test_jwt_principal_context.py,sha256=nGElTLtXbabkAxd3kXVpSFdH7kvSzHzSkp89g5Vu5Hc,4691
|
126
|
+
planar/sse/constants.py,sha256=jE3SooTEWPuuL_Bi6DisJYMR9pKOiHVfboU2h5QTJRg,22
|
127
|
+
planar/sse/example.html,sha256=SgTJbdJ3B1F1DxLC2YWuX2F1XVwKcTjX34CbJCXoCTM,4144
|
128
|
+
planar/sse/hub.py,sha256=5jhfk7zdCivau3TT1MxU2qtvETSskhqEiXzt-t0sRpE,6859
|
129
|
+
planar/sse/model.py,sha256=fU_Fx9LS2ouS6-Dj1TIF-PLGul9YratKWafoWfZR1gc,123
|
130
|
+
planar/sse/proxy.py,sha256=aJGo_-JIeQ0xSmE4HJdulZxIgCVRsBMMXqqSqtPvTvo,9177
|
131
|
+
planar/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
132
|
+
planar/testing/fixtures.py,sha256=UEg12Ohj2Oip94CrC_wQ9rch71wctUZ1fYNryJLsPUY,9149
|
133
|
+
planar/testing/memory_storage.py,sha256=apcuFisC3hW9KiU3kO8zwHQ6oK9Lu20NSX5fJ0LSZUY,2824
|
134
|
+
planar/testing/planar_test_client.py,sha256=qPkI_ZHZho_38PpdSmEjcRBO1iHcIx3dOwo7c02Am10,1979
|
135
|
+
planar/testing/synchronizable_tracer.py,sha256=SWeta1CgwGsN5duC0FR8NyXOQ1b1L8nDpvGdjZVJ9Bg,4938
|
136
|
+
planar/testing/test_memory_storage.py,sha256=So32XL0gbLDFMTl-WJN445x9jL6O8Qsqw8IRaiZnsPs,4797
|
137
|
+
planar/testing/workflow_observer.py,sha256=mEHlPy1KGbUw-1tJPbju_O349LBx0zOzeUznvrBWkSo,2977
|
138
|
+
planar/workflows/__init__.py,sha256=yFrrtKYUCx4jBPpHdEWDfKQgZXzGyr9voj5lFe9C-_w,826
|
139
|
+
planar/workflows/context.py,sha256=93kPSmYniqjX_lv6--eUUPnzZEKZJi6IPaAjrT-hFRY,1271
|
140
|
+
planar/workflows/contrib.py,sha256=b7WhCancxNCKO63mJCez9MahwMQc5_3zQxr_soJoXCY,6478
|
141
|
+
planar/workflows/decorators.py,sha256=Lsq9ZZdY60rv8-9Ok029x_kE4bHBvRqbfWZ8O0QRNfw,7960
|
142
|
+
planar/workflows/events.py,sha256=xYGGTwbKFnqhFFI7SuoFIaEeS5oWOLS-1nP9MW0uOhs,6007
|
143
|
+
planar/workflows/exceptions.py,sha256=G2Q4ZhaJwybMLpnpzXJNvKtFqUsEw7Vh0cRMkVxP7PU,927
|
144
|
+
planar/workflows/execution.py,sha256=8c4a2L1qRMPQrCEJ8-sEk-gJi_xKq5gYKDSWSbSspVI,7479
|
145
|
+
planar/workflows/lock.py,sha256=QU5_y_n8RHOC7ppLicH7yWX-Ni7N93hlB14D2zXOQ8A,8773
|
146
|
+
planar/workflows/misc.py,sha256=g3XVRMeU9mgDRi_6RgFdydLEqvTAg49wbIGlmC7kOu8,140
|
147
|
+
planar/workflows/models.py,sha256=54z19XaMp-OP9qE_HT2yhK12u8NC4ZD7SgwY8sGjyw4,5567
|
148
|
+
planar/workflows/notifications.py,sha256=FnGTEFu8_uQ1jIbSnJfhTs6wmPqW8U2-l-SclYrLHlI,2834
|
149
|
+
planar/workflows/orchestrator.py,sha256=rneB1yOPDZiJcHFbD6UDZ4juU77iSBK1eu1gOFm58vM,15480
|
150
|
+
planar/workflows/query.py,sha256=38B5SLwXf3AlA_1ChR5DicFWdcUqzpQzMkuAUCNHafI,8838
|
151
|
+
planar/workflows/serialization.py,sha256=v3eqUS0odUFS7PnIrKyKUrK-feIv0ssxEp2VxjkddyI,13733
|
152
|
+
planar/workflows/step_core.py,sha256=e-O-SP_1ufr3EYwuvu3O4I06aoqMxu_tpvHAUO-pMWg,14161
|
153
|
+
planar/workflows/step_metadata.py,sha256=7hwcIm6ot8m-iUXSYCbPmkg6bWegF6_RJ1stInvaFII,10903
|
154
|
+
planar/workflows/step_testing_utils.py,sha256=WiTwxB4mM2y6dW7CJ3PlIR1BkBodSxQV7-S25pQ3Ycs,2361
|
155
|
+
planar/workflows/sub_workflow_runner.py,sha256=EpS7DhhXRbC6ABm-Sho6Uyxh2TqCjcTPDYvcTQN4FjY,8313
|
156
|
+
planar/workflows/test_concurrency_detection.py,sha256=yfgvLOMkPaK7EiW4ihm1KQx82Y-s9pB6uJhBfDi7PwQ,4528
|
157
|
+
planar/workflows/test_lock_timeout.py,sha256=WAQttTjmetTLiDHb9j0o_ydvF6j4TV1SaY_iNH8Y5vk,5746
|
158
|
+
planar/workflows/test_serialization.py,sha256=JfaveBRQTNMkucqkTorIMGcvi8S0j6uRtboFaWpCmes,39586
|
159
|
+
planar/workflows/test_suspend_deserialization.py,sha256=ddw2jToSJ-ebQ0RfT7KWTRMCOs1nis1lprQiGIGuaJ0,7751
|
160
|
+
planar/workflows/test_workflow.py,sha256=KArm9m44IBXKY9j4v_O74MAweFN6jEb7tVRomziaeFU,64011
|
161
|
+
planar/workflows/tracing.py,sha256=E7E_kj2VBQisDqrllviIshbvOmB9QcEeRwMapunqio4,2732
|
162
|
+
planar/workflows/wrappers.py,sha256=KON6RGg1D6yStboNbuMEeTXRpPTEa8S6Elh1tOnMAlM,1149
|
163
|
+
planar-0.8.0.dist-info/METADATA,sha256=D4RMLkoOUDNlZgbuEjMrnTjV4ga6FHJ3ZtxeC2uUe6A,12020
|
164
|
+
planar-0.8.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
165
|
+
planar-0.8.0.dist-info/entry_points.txt,sha256=ZtFgrZ0eeoVmhLA51ESipK0nHg2t_prjW0Cm8WhpP54,95
|
166
|
+
planar-0.8.0.dist-info/RECORD,,
|
planar/.__init__.py.un~
DELETED
Binary file
|
planar/._version.py.un~
DELETED
Binary file
|
planar/.app.py.un~
DELETED
Binary file
|
planar/.cli.py.un~
DELETED
Binary file
|
planar/.config.py.un~
DELETED
Binary file
|
planar/.context.py.un~
DELETED
Binary file
|
planar/.db.py.un~
DELETED
Binary file
|
planar/.di.py.un~
DELETED
Binary file
|
planar/.engine.py.un~
DELETED
Binary file
|
planar/.files.py.un~
DELETED
Binary file
|
planar/.log_context.py.un~
DELETED
Binary file
|
planar/.log_metadata.py.un~
DELETED
Binary file
|
planar/.logging.py.un~
DELETED
Binary file
|
planar/.object_registry.py.un~
DELETED
Binary file
|
planar/.otel.py.un~
DELETED
Binary file
|
planar/.server.py.un~
DELETED
Binary file
|
planar/.session.py.un~
DELETED
Binary file
|
planar/.sqlalchemy.py.un~
DELETED
Binary file
|
planar/.task_local.py.un~
DELETED
Binary file
|
planar/.test_app.py.un~
DELETED
Binary file
|
planar/.test_config.py.un~
DELETED
Binary file
|
Binary file
|
planar/.test_sqlalchemy.py.un~
DELETED
Binary file
|
planar/.test_utils.py.un~
DELETED
Binary file
|
planar/.util.py.un~
DELETED
Binary file
|
planar/.utils.py.un~
DELETED
Binary file
|
planar/ai/.__init__.py.un~
DELETED
Binary file
|
planar/ai/._models.py.un~
DELETED
Binary file
|
planar/ai/.agent.py.un~
DELETED
Binary file
|
planar/ai/.agent_utils.py.un~
DELETED
Binary file
|
planar/ai/.events.py.un~
DELETED
Binary file
|
planar/ai/.files.py.un~
DELETED
Binary file
|
planar/ai/.models.py.un~
DELETED
Binary file
|
planar/ai/.providers.py.un~
DELETED
Binary file
|
planar/ai/.pydantic_ai.py.un~
DELETED
Binary file
|
Binary file
|
Binary file
|
planar/ai/.step.py.un~
DELETED
Binary file
|
planar/ai/.test_agent.py.un~
DELETED
Binary file
|
Binary file
|
planar/ai/.test_providers.py.un~
DELETED
Binary file
|
planar/ai/.utils.py.un~
DELETED
Binary file
|