programgarden 2.5.2__tar.gz → 2.5.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. {programgarden-2.5.2 → programgarden-2.5.4}/PKG-INFO +2 -2
  2. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/execution_storage.py +2 -1
  3. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/incremental_build.py +1 -1
  4. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_semantics.py +5 -1
  5. {programgarden-2.5.2 → programgarden-2.5.4}/pyproject.toml +2 -2
  6. {programgarden-2.5.2 → programgarden-2.5.4}/README.md +0 -0
  7. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/__init__.py +0 -0
  8. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/binding_validator.py +0 -0
  9. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/client.py +0 -0
  10. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/code_worker.py +0 -0
  11. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/context.py +0 -0
  12. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/__init__.py +0 -0
  13. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/adjustment_delivery.py +0 -0
  14. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/broker_evidence.py +0 -0
  15. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/broker_order_totals.py +0 -0
  16. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/broker_snapshot.py +0 -0
  17. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/checkpoint_manager.py +0 -0
  18. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/db_naming.py +0 -0
  19. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/fill_reconciler.py +0 -0
  20. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/order_cancellation.py +0 -0
  21. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/order_recovery.py +0 -0
  22. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/owned_order_cancellation.py +0 -0
  23. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/position_reconciliation.py +0 -0
  24. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/query_builder.py +0 -0
  25. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/workflow_position_tracker.py +0 -0
  26. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/database/workflow_risk_tracker.py +0 -0
  27. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/deep_fixtures.py +0 -0
  28. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/executor.py +0 -0
  29. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/futures_orderable.py +0 -0
  30. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/futures_pnl.py +0 -0
  31. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/futures_read_evidence.py +0 -0
  32. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/managed_order_control.py +0 -0
  33. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/node_runner.py +0 -0
  34. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/order_lifecycle.py +0 -0
  35. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/plugin/__init__.py +0 -0
  36. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/plugin/sandbox.py +0 -0
  37. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/providers/__init__.py +0 -0
  38. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/providers/llm_errors.py +0 -0
  39. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/providers/llm_provider.py +0 -0
  40. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/reconnect_handler.py +0 -0
  41. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_contracts.py +0 -0
  42. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_events.py +0 -0
  43. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_external.py +0 -0
  44. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_order_adapter.py +0 -0
  45. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_orders.py +0 -0
  46. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_scenarios.py +0 -0
  47. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_sources.py +0 -0
  48. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_sqlite.py +0 -0
  49. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/replay_triggers.py +0 -0
  50. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/resolver.py +0 -0
  51. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/resource/__init__.py +0 -0
  52. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/resource/context.py +0 -0
  53. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/resource/limiter.py +0 -0
  54. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/resource/monitor.py +0 -0
  55. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/resource/throttle.py +0 -0
  56. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/semantic_rules.py +0 -0
  57. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/tools/__init__.py +0 -0
  58. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/tools/credential_tools.py +0 -0
  59. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/tools/definition_tools.py +0 -0
  60. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/tools/event_tools.py +0 -0
  61. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/tools/job_tools.py +0 -0
  62. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/tools/registry_tools.py +0 -0
  63. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/tools/sqlite_tools.py +0 -0
  64. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/validation_recommender.py +0 -0
  65. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/validation_replay.py +0 -0
  66. {programgarden-2.5.2 → programgarden-2.5.4}/programgarden/valuation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: programgarden
3
- Version: 2.5.2
3
+ Version: 2.5.4
4
4
  Summary: ProgramGarden - 노드 기반 자동매매 DSL 실행 엔진
5
5
  License-Expression: AGPL-3.0-or-later
6
6
  Author: 프로그램동산
@@ -16,7 +16,7 @@ Requires-Dist: croniter (>=6.0.0,<7.0.0)
16
16
  Requires-Dist: litellm (>=1.40.0)
17
17
  Requires-Dist: lxml (>=6.0.2,<7.0.0)
18
18
  Requires-Dist: programgarden-community (>=2.3.1,<3.0.0)
19
- Requires-Dist: programgarden-core (>=2.5.2,<3.0.0)
19
+ Requires-Dist: programgarden-core (>=2.5.3,<3.0.0)
20
20
  Requires-Dist: programgarden-finance (>=2.0.1,<3.0.0)
21
21
  Requires-Dist: psutil (>=6.0.0,<7.0.0)
22
22
  Requires-Dist: psycopg2-binary (>=2.9.11,<3.0.0)
@@ -182,7 +182,8 @@ def prepare_execution_storage(data_dir, *, project_id, workflow_id, execution_id
182
182
  dest.execute("INSERT INTO managed_execution_storage VALUES (1, ?, ?, ?)",
183
183
  (project_id, execution_id, source[0].name if source else None))
184
184
  dest.commit()
185
- with temporary.open("rb") as handle:
185
+ # Windows rejects fsync on a read-only descriptor (EBADF); open for writing.
186
+ with temporary.open("r+b") as handle:
186
187
  os.fsync(handle.fileno())
187
188
  os.link(temporary, target) # Exclusive atomic publication, no overwrite.
188
189
  return ExecutionStorageLease(key, target, "adopted" if source else "created", locks)
@@ -60,7 +60,7 @@ def runtime_identity() -> str:
60
60
  packages = {}
61
61
  for name in ("programgarden", "programgarden-core", "programgarden-community", "programgarden-finance",
62
62
  "pydantic", "pydantic-core", "numpy", "pandas", "scipy", "tzdata", "pytz", "croniter", "aiosqlite",
63
- "pyportfolioopt", "quantstats", "scikit-learn", "statsmodels"):
63
+ "pyportfolioopt", "quantstats", "scikit-learn", "statsmodels", "exchange-calendars"):
64
64
  try:
65
65
  packages[name] = importlib.metadata.version(name)
66
66
  except importlib.metadata.PackageNotFoundError:
@@ -372,7 +372,11 @@ def _time_rules(node_type: str, role: str) -> List[Dict[str, Any]]:
372
372
  "max_duration_hours": {"default": None, "gt": 0}, "pin": "range_not_const"},
373
373
  ]
374
374
  if node_type == "SessionGateNode":
375
- return [{"id": "evaluate_at_fixture_instant"}] # validation_replay.py:276-283
375
+ return [{"id": "evaluate_at_fixture_instant"},
376
+ {"id": "optional_exchange_calendar", "field": "exchange_calendar",
377
+ "supported": ["XNYS", "XNAS"], "mode": "intersect_configured_windows",
378
+ "holidays": True, "early_closes": True, "live_halts": False,
379
+ "failure": "allowed_false", "close_exclusive": True}] # validation_replay.py:276-283
376
380
  if node_type == "TradingHoursFilterNode":
377
381
  return [{"id": "wait_blocks_replay"}] # replay_triggers.py:62-71
378
382
  if node_type == "ThrottleNode":
@@ -5,7 +5,7 @@ authors = [
5
5
  homepage = "https://programgarden.com"
6
6
  requires-python = ">=3.12"
7
7
  name = "programgarden"
8
- version = "2.5.2"
8
+ version = "2.5.4"
9
9
  license = "AGPL-3.0-or-later"
10
10
  description = "ProgramGarden - 노드 기반 자동매매 DSL 실행 엔진"
11
11
  readme = "README.md"
@@ -36,7 +36,7 @@ litellm = ">=1.40.0"
36
36
  # 로 통째 실패한다(1.35.1 의 조용한 TypeError 보다 강한 모듈 로드 실패).
37
37
  # (1.26.0 이후로도 context.py 는 WorkflowPnLEvent(**event_data) 에 personal_metrics
38
38
  # 를 무조건 실으므로 그 하한 근거도 이 상한에 포함된다.)
39
- programgarden-core = "^2.5.2"
39
+ programgarden-core = "^2.5.3"
40
40
  programgarden-finance = "^2.0.1"
41
41
  programgarden-community = "^2.3.1"
42
42
 
File without changes