pycforge 0.15.2__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 (221) hide show
  1. pycforge/__init__.py +8 -0
  2. pycforge/__main__.py +2 -0
  3. pycforge/_version.py +1 -0
  4. pycforge/converter/__init__.py +0 -0
  5. pycforge/converter/analysis/__init__.py +5 -0
  6. pycforge/converter/analysis/functions.py +723 -0
  7. pycforge/converter/analysis/model.py +158 -0
  8. pycforge/converter/analysis/planning.py +464 -0
  9. pycforge/converter/analysis/stage.py +1976 -0
  10. pycforge/converter/analysis/symbols.py +237 -0
  11. pycforge/converter/analysis/validation.py +2166 -0
  12. pycforge/converter/c_output/__init__.py +2 -0
  13. pycforge/converter/c_output/conformance.py +297 -0
  14. pycforge/converter/c_output/renderer.py +220 -0
  15. pycforge/converter/conditional_regions/__init__.py +71 -0
  16. pycforge/converter/conditional_regions/analysis.py +481 -0
  17. pycforge/converter/conditional_regions/lowering.py +579 -0
  18. pycforge/converter/conditional_regions/model.py +243 -0
  19. pycforge/converter/conditional_regions/validation.py +690 -0
  20. pycforge/converter/containers/__init__.py +19 -0
  21. pycforge/converter/containers/analysis.py +542 -0
  22. pycforge/converter/containers/lowering.py +290 -0
  23. pycforge/converter/containers/model.py +146 -0
  24. pycforge/converter/contracts/__init__.py +0 -0
  25. pycforge/converter/contracts/configuration.py +178 -0
  26. pycforge/converter/contracts/identifiers.py +68 -0
  27. pycforge/converter/contracts/versions.py +71 -0
  28. pycforge/converter/core/__init__.py +0 -0
  29. pycforge/converter/core/artifact_io.py +87 -0
  30. pycforge/converter/core/cancellation.py +7 -0
  31. pycforge/converter/core/canonicalization.py +254 -0
  32. pycforge/converter/core/context.py +13 -0
  33. pycforge/converter/core/diagnostics.py +95 -0
  34. pycforge/converter/core/enums.py +23 -0
  35. pycforge/converter/core/fingerprint.py +22 -0
  36. pycforge/converter/core/pipeline.py +8 -0
  37. pycforge/converter/core/progress.py +25 -0
  38. pycforge/converter/core/request.py +50 -0
  39. pycforge/converter/core/resource_policy.py +31 -0
  40. pycforge/converter/core/result.py +23 -0
  41. pycforge/converter/core/serialization.py +36 -0
  42. pycforge/converter/core/stage.py +10 -0
  43. pycforge/converter/core/stage_artifact.py +80 -0
  44. pycforge/converter/core/stage_outcome.py +15 -0
  45. pycforge/converter/decision_trace/__init__.py +0 -0
  46. pycforge/converter/decision_trace/recorder.py +52 -0
  47. pycforge/converter/facade.py +459 -0
  48. pycforge/converter/frontend/__init__.py +4 -0
  49. pycforge/converter/frontend/normalizer.py +59 -0
  50. pycforge/converter/frontend/parser.py +20 -0
  51. pycforge/converter/frontend/source_document.py +93 -0
  52. pycforge/converter/frontend/stages.py +518 -0
  53. pycforge/converter/frontend/validation.py +76 -0
  54. pycforge/converter/io/__init__.py +0 -0
  55. pycforge/converter/io/atomic_writer.py +33 -0
  56. pycforge/converter/ir/__init__.py +1 -0
  57. pycforge/converter/ir/c_ir/__init__.py +4 -0
  58. pycforge/converter/ir/c_ir/builder.py +26 -0
  59. pycforge/converter/ir/c_ir/model.py +318 -0
  60. pycforge/converter/ir/c_ir/serialization.py +88 -0
  61. pycforge/converter/ir/c_ir/validation.py +834 -0
  62. pycforge/converter/ir/python_ir/__init__.py +17 -0
  63. pycforge/converter/ir/python_ir/nodes.py +86 -0
  64. pycforge/converter/keyword_calls/__init__.py +68 -0
  65. pycforge/converter/keyword_calls/analysis.py +458 -0
  66. pycforge/converter/keyword_calls/lowering.py +271 -0
  67. pycforge/converter/keyword_calls/model.py +304 -0
  68. pycforge/converter/keyword_calls/validation.py +802 -0
  69. pycforge/converter/keyword_only_calls/__init__.py +68 -0
  70. pycforge/converter/keyword_only_calls/analysis.py +640 -0
  71. pycforge/converter/keyword_only_calls/lowering.py +376 -0
  72. pycforge/converter/keyword_only_calls/model.py +328 -0
  73. pycforge/converter/keyword_only_calls/validation.py +1357 -0
  74. pycforge/converter/lowering.py +1000 -0
  75. pycforge/converter/modules/__init__.py +13 -0
  76. pycforge/converter/modules/analysis.py +1250 -0
  77. pycforge/converter/modules/lowering.py +200 -0
  78. pycforge/converter/modules/model.py +73 -0
  79. pycforge/converter/modules/stage.py +192 -0
  80. pycforge/converter/numeric_semantics/__init__.py +23 -0
  81. pycforge/converter/numeric_semantics/analysis.py +420 -0
  82. pycforge/converter/numeric_semantics/lowering.py +153 -0
  83. pycforge/converter/numeric_semantics/model.py +123 -0
  84. pycforge/converter/records/__init__.py +34 -0
  85. pycforge/converter/records/analysis.py +1394 -0
  86. pycforge/converter/records/lowering.py +393 -0
  87. pycforge/converter/records/model.py +319 -0
  88. pycforge/converter/rules/__init__.py +3 -0
  89. pycforge/converter/support_templates/__init__.py +49 -0
  90. pycforge/converter/support_templates/assembly.py +106 -0
  91. pycforge/converter/support_templates/factories.py +348 -0
  92. pycforge/converter/support_templates/model.py +159 -0
  93. pycforge/converter/support_templates/registry.py +388 -0
  94. pycforge/converter/telemetry/__init__.py +0 -0
  95. pycforge/converter/telemetry/sink.py +39 -0
  96. pycforge/ide/__init__.py +19 -0
  97. pycforge/ide/__main__.py +5 -0
  98. pycforge/ide/_worker_event_codec.py +276 -0
  99. pycforge/ide/_worker_protocol_json.py +197 -0
  100. pycforge/ide/_worker_protocol_types.py +90 -0
  101. pycforge/ide/_worker_request_codec.py +200 -0
  102. pycforge/ide/_worker_request_data.py +260 -0
  103. pycforge/ide/_worker_result_data.py +343 -0
  104. pycforge/ide/action_contract.py +469 -0
  105. pycforge/ide/action_validation.py +229 -0
  106. pycforge/ide/command_palette.py +223 -0
  107. pycforge/ide/controller.py +904 -0
  108. pycforge/ide/controller_conversion.py +546 -0
  109. pycforge/ide/controller_io.py +205 -0
  110. pycforge/ide/editor.py +951 -0
  111. pycforge/ide/editor_commands_qt.py +274 -0
  112. pycforge/ide/editor_lexical.py +43 -0
  113. pycforge/ide/editor_sidebars.py +236 -0
  114. pycforge/ide/editor_syntax.py +243 -0
  115. pycforge/ide/find_replace.py +535 -0
  116. pycforge/ide/icons.py +91 -0
  117. pycforge/ide/io_service.py +196 -0
  118. pycforge/ide/model.py +164 -0
  119. pycforge/ide/panels.py +903 -0
  120. pycforge/ide/positions.py +220 -0
  121. pycforge/ide/process_worker.py +130 -0
  122. pycforge/ide/qt.py +230 -0
  123. pycforge/ide/qt_actions.py +418 -0
  124. pycforge/ide/qt_close.py +169 -0
  125. pycforge/ide/qt_command_palette.py +297 -0
  126. pycforge/ide/qt_contract.py +220 -0
  127. pycforge/ide/qt_documents.py +590 -0
  128. pycforge/ide/qt_editor_buffers.py +113 -0
  129. pycforge/ide/qt_editor_surfaces.py +112 -0
  130. pycforge/ide/qt_menus.py +324 -0
  131. pycforge/ide/qt_projection.py +500 -0
  132. pycforge/ide/qt_shell.py +348 -0
  133. pycforge/ide/qt_shell_interactions.py +320 -0
  134. pycforge/ide/qt_state.py +393 -0
  135. pycforge/ide/qt_workspace_features.py +398 -0
  136. pycforge/ide/qt_workspace_navigation.py +208 -0
  137. pycforge/ide/qt_workspace_observers.py +173 -0
  138. pycforge/ide/qt_workspace_panels.py +545 -0
  139. pycforge/ide/qt_workspace_widgets.py +228 -0
  140. pycforge/ide/resources/icons/about.svg +1 -0
  141. pycforge/ide/resources/icons/add-document.svg +1 -0
  142. pycforge/ide/resources/icons/brand-mark.svg +1 -0
  143. pycforge/ide/resources/icons/bundle-search.svg +1 -0
  144. pycforge/ide/resources/icons/cancel.svg +1 -0
  145. pycforge/ide/resources/icons/check.svg +1 -0
  146. pycforge/ide/resources/icons/chevron-right.svg +1 -0
  147. pycforge/ide/resources/icons/close.svg +1 -0
  148. pycforge/ide/resources/icons/collapse-all.svg +1 -0
  149. pycforge/ide/resources/icons/command-palette.svg +1 -0
  150. pycforge/ide/resources/icons/convert.svg +1 -0
  151. pycforge/ide/resources/icons/copy.svg +1 -0
  152. pycforge/ide/resources/icons/cut.svg +1 -0
  153. pycforge/ide/resources/icons/decision-trace.svg +1 -0
  154. pycforge/ide/resources/icons/details.svg +1 -0
  155. pycforge/ide/resources/icons/diagnostics.svg +1 -0
  156. pycforge/ide/resources/icons/duplicate-line.svg +1 -0
  157. pycforge/ide/resources/icons/exit.svg +1 -0
  158. pycforge/ide/resources/icons/expand-all.svg +1 -0
  159. pycforge/ide/resources/icons/export.svg +1 -0
  160. pycforge/ide/resources/icons/find.svg +1 -0
  161. pycforge/ide/resources/icons/go-to-line.svg +1 -0
  162. pycforge/ide/resources/icons/go-to-output.svg +1 -0
  163. pycforge/ide/resources/icons/go-to-source.svg +1 -0
  164. pycforge/ide/resources/icons/history.svg +1 -0
  165. pycforge/ide/resources/icons/indent.svg +1 -0
  166. pycforge/ide/resources/icons/link-c.svg +1 -0
  167. pycforge/ide/resources/icons/mappings.svg +1 -0
  168. pycforge/ide/resources/icons/module.svg +1 -0
  169. pycforge/ide/resources/icons/move-down.svg +1 -0
  170. pycforge/ide/resources/icons/move-line-down.svg +1 -0
  171. pycforge/ide/resources/icons/move-line-up.svg +1 -0
  172. pycforge/ide/resources/icons/move-up.svg +1 -0
  173. pycforge/ide/resources/icons/next.svg +1 -0
  174. pycforge/ide/resources/icons/open.svg +1 -0
  175. pycforge/ide/resources/icons/outdent.svg +1 -0
  176. pycforge/ide/resources/icons/outline.svg +1 -0
  177. pycforge/ide/resources/icons/paste.svg +1 -0
  178. pycforge/ide/resources/icons/previous.svg +1 -0
  179. pycforge/ide/resources/icons/primary-module.svg +1 -0
  180. pycforge/ide/resources/icons/redo.svg +1 -0
  181. pycforge/ide/resources/icons/remove-document.svg +1 -0
  182. pycforge/ide/resources/icons/replace.svg +1 -0
  183. pycforge/ide/resources/icons/save-as.svg +1 -0
  184. pycforge/ide/resources/icons/save.svg +1 -0
  185. pycforge/ide/resources/icons/select-all.svg +1 -0
  186. pycforge/ide/resources/icons/settings.svg +1 -0
  187. pycforge/ide/resources/icons/show-c.svg +1 -0
  188. pycforge/ide/resources/icons/split-view.svg +1 -0
  189. pycforge/ide/resources/icons/summary.svg +1 -0
  190. pycforge/ide/resources/icons/telemetry.svg +1 -0
  191. pycforge/ide/resources/icons/toggle-comment.svg +1 -0
  192. pycforge/ide/resources/icons/toggle-fold.svg +1 -0
  193. pycforge/ide/resources/icons/undo.svg +1 -0
  194. pycforge/ide/resources/icons/whitespace.svg +1 -0
  195. pycforge/ide/revisions.py +400 -0
  196. pycforge/ide/search_service.py +280 -0
  197. pycforge/ide/session_history.py +150 -0
  198. pycforge/ide/source_editing.py +417 -0
  199. pycforge/ide/source_structure.py +558 -0
  200. pycforge/ide/source_structure_async.py +191 -0
  201. pycforge/ide/supervisor.py +503 -0
  202. pycforge/ide/theme.py +119 -0
  203. pycforge/ide/theme_stylesheet.py +598 -0
  204. pycforge/ide/theme_workspace_stylesheet.py +155 -0
  205. pycforge/ide/visual_tokens.py +142 -0
  206. pycforge/ide/worker_protocol.py +80 -0
  207. pycforge/ide/workspace_search.py +462 -0
  208. pycforge/ide/workspace_session.py +256 -0
  209. pycforge/laboratory/__init__.py +6 -0
  210. pycforge/laboratory/audits.py +2244 -0
  211. pycforge/laboratory/checkpoint_e.py +2685 -0
  212. pycforge/laboratory/cli.py +119 -0
  213. pycforge/laboratory/exit_codes.py +11 -0
  214. pycforge/laboratory/keyword_audit.py +661 -0
  215. pycforge/laboratory/keyword_only_audit.py +481 -0
  216. pycforge-0.15.2.dist-info/METADATA +209 -0
  217. pycforge-0.15.2.dist-info/RECORD +221 -0
  218. pycforge-0.15.2.dist-info/WHEEL +5 -0
  219. pycforge-0.15.2.dist-info/entry_points.txt +5 -0
  220. pycforge-0.15.2.dist-info/licenses/LICENSE +674 -0
  221. pycforge-0.15.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,243 @@
1
+ """Immutable evidence for Phase 14B conditional temporary regions.
2
+
3
+ The model describes *where* an already-supported scalar operand is evaluated.
4
+ It does not describe a new Python expression, invent a target representation,
5
+ or authorize a helper/runtime facility.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import hashlib
11
+ from dataclasses import dataclass
12
+ from enum import Enum
13
+ from typing import Any
14
+
15
+
16
+ CONDITIONAL_REGION_TABLE_ID = "conditional-region-facts"
17
+ CONDITIONAL_REGION_KEY_DOMAIN = "conditional-region-node-id"
18
+ CONDITIONAL_REGION_LOWERING_SHAPE = "flat-guarded-assignment-v1"
19
+ CONDITIONAL_REGION_TABLE_DEPENDENCIES = (
20
+ "value-category-facts",
21
+ "evaluation-order-facts",
22
+ "call-target-facts",
23
+ "container-access-facts",
24
+ "record-access-facts",
25
+ "numeric-operation-facts",
26
+ )
27
+ CONDITIONAL_REGION_PROVENANCE_EVIDENCE = (
28
+ "exact-scalar-operands",
29
+ "unconditional-prefix",
30
+ "accumulated-result-guard",
31
+ "left-to-right-once",
32
+ "branch-contained-prerequisites",
33
+ "flat-structured-c-ir",
34
+ )
35
+
36
+ CONDITIONAL_REGION_OBLIGATIONS = (
37
+ "scalar-operand-representations-proved",
38
+ "unconditional-prefix-proved",
39
+ "guard-polarity-proved",
40
+ "short-circuit-order-preserved",
41
+ "operands-evaluated-left-to-right-once",
42
+ "prerequisite-statements-branch-contained",
43
+ "intermediate-values-reused-without-reevaluation",
44
+ "structured-c-ir-only",
45
+ "result-materialized-once",
46
+ "allocation-and-cleanup-absent",
47
+ "runtime-failure-channel-unchanged",
48
+ "source-provenance-anchored",
49
+ "cancellation-safe-points-honored",
50
+ "target-contract-exact",
51
+ )
52
+
53
+
54
+ class ConditionalRegionKind(str, Enum):
55
+ BOOLEAN_SHORT_CIRCUIT = "boolean-short-circuit"
56
+ CHAINED_COMPARISON = "chained-comparison"
57
+
58
+
59
+ class ConditionalGuardPolarity(str, Enum):
60
+ NONE = "none"
61
+ WHEN_RESULT_TRUE = "when-result-true"
62
+ WHEN_RESULT_FALSE = "when-result-false"
63
+
64
+
65
+ class ConditionalEvaluationMode(str, Enum):
66
+ UNCONDITIONAL = "unconditional"
67
+ GUARDED = "guarded"
68
+
69
+
70
+ class ConditionalRegionAnalysisCanceled(Exception):
71
+ """Raised internally when cancellation retires conditional analysis."""
72
+
73
+
74
+ class ConditionalRegionValidationCanceled(Exception):
75
+ """Raised when independent reconstruction observes cooperative cancellation."""
76
+
77
+
78
+ class ConditionalRegionAnalysisError(Exception):
79
+ """A source-facing failure to close an otherwise eligible region proof."""
80
+
81
+ def __init__(
82
+ self,
83
+ code: str,
84
+ message: str,
85
+ node_id: str,
86
+ source_span: dict[str, object] | None,
87
+ ) -> None:
88
+ super().__init__(message)
89
+ self.code = code
90
+ self.message = message
91
+ self.node_id = node_id
92
+ self.source_span = source_span
93
+
94
+
95
+ @dataclass(frozen=True, slots=True)
96
+ class ConditionalOperandPlacementFact:
97
+ operand_node_id: str
98
+ ordinal: int
99
+ category: str
100
+ evaluation_mode: ConditionalEvaluationMode
101
+ guard_polarity: ConditionalGuardPolarity
102
+ guard_after_operand_ordinal: int | None
103
+ requires_statement_prelude: bool
104
+ prerequisite_node_ids: tuple[str, ...]
105
+ legacy_direct_safe: bool
106
+
107
+ def to_dict(self) -> dict[str, Any]:
108
+ return {
109
+ "operand_node_id": self.operand_node_id,
110
+ "ordinal": self.ordinal,
111
+ "category": self.category,
112
+ "evaluation_mode": self.evaluation_mode.value,
113
+ "guard_polarity": self.guard_polarity.value,
114
+ "guard_after_operand_ordinal": self.guard_after_operand_ordinal,
115
+ "requires_statement_prelude": self.requires_statement_prelude,
116
+ "prerequisite_node_ids": list(self.prerequisite_node_ids),
117
+ "legacy_direct_safe": self.legacy_direct_safe,
118
+ }
119
+
120
+
121
+ @dataclass(frozen=True, slots=True)
122
+ class ConditionalRegionFact:
123
+ region_id: str
124
+ region_node_id: str
125
+ region_kind: ConditionalRegionKind
126
+ function_node_id: str
127
+ module_id: str
128
+ document_id: str
129
+ logical_name: str
130
+ operator_node_ids: tuple[str, ...]
131
+ operator_kinds: tuple[str, ...]
132
+ operand_node_ids: tuple[str, ...]
133
+ operand_categories: tuple[str, ...]
134
+ unconditional_prefix_count: int
135
+ placements: tuple[ConditionalOperandPlacementFact, ...]
136
+ guarded_operand_node_ids: tuple[str, ...]
137
+ prerequisite_node_ids: tuple[str, ...]
138
+ result_category: str
139
+ result_c_type: str
140
+ evaluation_order: tuple[str, ...]
141
+ operands_evaluated_once: bool
142
+ lowering_shape: str
143
+ allocation_model: str
144
+ cleanup_model: str
145
+ runtime_failure_channel: str
146
+ target_contract: str
147
+
148
+ @property
149
+ def guarded_operand_count(self) -> int:
150
+ return len(self.operand_node_ids) - self.unconditional_prefix_count
151
+
152
+ @property
153
+ def rule_facts(self) -> tuple[str, ...]:
154
+ return (
155
+ f"conditional-region:{self.region_node_id}",
156
+ f"conditional-region-kind:{self.region_kind.value}",
157
+ f"conditional-unconditional-prefix:{self.unconditional_prefix_count}",
158
+ f"conditional-guarded-operand-count:{self.guarded_operand_count}",
159
+ f"conditional-lowering-shape:{self.lowering_shape}",
160
+ f"conditional-target:{self.target_contract}",
161
+ )
162
+
163
+ @property
164
+ def explanation_tokens(self) -> tuple[str, ...]:
165
+ return (
166
+ "conditional-region",
167
+ self.region_kind.value,
168
+ "unconditional-prefix",
169
+ str(self.unconditional_prefix_count),
170
+ "guarded-operands",
171
+ str(self.guarded_operand_count),
172
+ "lowered-as",
173
+ self.lowering_shape,
174
+ )
175
+
176
+ @property
177
+ def provenance_node_ids(self) -> tuple[str, ...]:
178
+ ordered = (
179
+ self.region_node_id,
180
+ self.function_node_id,
181
+ *self.operator_node_ids,
182
+ *self.operand_node_ids,
183
+ *self.prerequisite_node_ids,
184
+ )
185
+ return tuple(dict.fromkeys(ordered))
186
+
187
+ def to_dict(self) -> dict[str, Any]:
188
+ return {
189
+ "region_id": self.region_id,
190
+ "region_node_id": self.region_node_id,
191
+ "region_kind": self.region_kind.value,
192
+ "function_node_id": self.function_node_id,
193
+ "module_id": self.module_id,
194
+ "document_id": self.document_id,
195
+ "logical_name": self.logical_name,
196
+ "operator_node_ids": list(self.operator_node_ids),
197
+ "operator_kinds": list(self.operator_kinds),
198
+ "operand_node_ids": list(self.operand_node_ids),
199
+ "operand_categories": list(self.operand_categories),
200
+ "unconditional_prefix_count": self.unconditional_prefix_count,
201
+ "placements": [item.to_dict() for item in self.placements],
202
+ "guarded_operand_node_ids": list(self.guarded_operand_node_ids),
203
+ "prerequisite_node_ids": list(self.prerequisite_node_ids),
204
+ "result_category": self.result_category,
205
+ "result_c_type": self.result_c_type,
206
+ "evaluation_order": list(self.evaluation_order),
207
+ "operands_evaluated_once": self.operands_evaluated_once,
208
+ "lowering_shape": self.lowering_shape,
209
+ "allocation_model": self.allocation_model,
210
+ "cleanup_model": self.cleanup_model,
211
+ "runtime_failure_channel": self.runtime_failure_channel,
212
+ "target_contract": self.target_contract,
213
+ }
214
+
215
+
216
+ @dataclass(frozen=True, slots=True)
217
+ class ConditionalRegionAnalysis:
218
+ regions: tuple[ConditionalRegionFact, ...]
219
+
220
+
221
+ def conditional_region_id(node_id: str, kind: ConditionalRegionKind) -> str:
222
+ digest = hashlib.sha256(f"{node_id}\x1f{kind.value}".encode("utf-8")).hexdigest()
223
+ return "conditional-region-" + digest[:20]
224
+
225
+
226
+ __all__ = [
227
+ "CONDITIONAL_REGION_KEY_DOMAIN",
228
+ "CONDITIONAL_REGION_LOWERING_SHAPE",
229
+ "CONDITIONAL_REGION_OBLIGATIONS",
230
+ "CONDITIONAL_REGION_PROVENANCE_EVIDENCE",
231
+ "CONDITIONAL_REGION_TABLE_DEPENDENCIES",
232
+ "CONDITIONAL_REGION_TABLE_ID",
233
+ "ConditionalEvaluationMode",
234
+ "ConditionalGuardPolarity",
235
+ "ConditionalOperandPlacementFact",
236
+ "ConditionalRegionAnalysis",
237
+ "ConditionalRegionAnalysisCanceled",
238
+ "ConditionalRegionAnalysisError",
239
+ "ConditionalRegionValidationCanceled",
240
+ "ConditionalRegionFact",
241
+ "ConditionalRegionKind",
242
+ "conditional_region_id",
243
+ ]