pineforge-codegen 0.7.3__tar.gz → 0.7.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 (389) hide show
  1. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/PKG-INFO +1 -1
  2. pineforge_codegen-0.7.4/VERSION +1 -0
  3. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/glue.py +3 -3
  4. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/__init__.py +39 -0
  5. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/input.py +142 -1
  6. pineforge_codegen-0.7.4/tests/test_extract_inputs.py +107 -0
  7. pineforge_codegen-0.7.4/tests/test_glue_smoke.py +43 -0
  8. pineforge_codegen-0.7.3/VERSION +0 -1
  9. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/dependabot.yml +0 -0
  10. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/workflows/gate.yml +0 -0
  11. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/workflows/publish-pyodide.yml +0 -0
  12. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/workflows/release.yml +0 -0
  13. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/workflows/test.yml +0 -0
  14. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.gitignore +0 -0
  15. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/CLAUDE.md +0 -0
  16. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/LEGAL.md +0 -0
  17. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/LICENSE +0 -0
  18. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/PYODIDE_TARGET +0 -0
  19. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/README.md +0 -0
  20. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/docs/codegen-coverage-gaps.md +0 -0
  21. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/compare.mjs +0 -0
  22. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/oracle.py +0 -0
  23. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/run-gate.mjs +0 -0
  24. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/selftest.mjs +0 -0
  25. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/npm/README.md +0 -0
  26. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/npm/index.mjs +0 -0
  27. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/npm/package.json +0 -0
  28. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/package-lock.json +0 -0
  29. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/package.json +0 -0
  30. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/__init__.py +0 -0
  31. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/base.py +0 -0
  32. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/call_handlers.py +0 -0
  33. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/contracts.py +0 -0
  34. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/diagnostics.py +0 -0
  35. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/tables.py +0 -0
  36. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/types.py +0 -0
  37. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/ast_nodes.py +0 -0
  38. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/__init__.py +0 -0
  39. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/base.py +0 -0
  40. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/emit_top.py +0 -0
  41. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/helpers.py +0 -0
  42. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
  43. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/security.py +0 -0
  44. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/ta.py +0 -0
  45. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/tables.py +0 -0
  46. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/types.py +0 -0
  47. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/visit_call.py +0 -0
  48. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/visit_expr.py +0 -0
  49. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/visit_stmt.py +0 -0
  50. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/errors.py +0 -0
  51. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/lexer.py +0 -0
  52. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/parser.py +0 -0
  53. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/pragmas.py +0 -0
  54. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/signatures.py +0 -0
  55. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/support_checker.py +0 -0
  56. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/symbols.py +0 -0
  57. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/tokens.py +0 -0
  58. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/tv_input_choices.py +0 -0
  59. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pyproject.toml +0 -0
  60. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/scripts/build-npm-package.mjs +0 -0
  61. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/scripts/dump-tables.py +0 -0
  62. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/scripts/worker-template.mjs +0 -0
  63. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/__init__.py +0 -0
  64. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/_compile.py +0 -0
  65. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/chart_bg_color.pine +0 -0
  66. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
  67. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
  68. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/divergent_last_bar_index.pine +0 -0
  69. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/divergent_time_close.pine +0 -0
  70. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/export_func.pine +0 -0
  71. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/footprint_new.pine +0 -0
  72. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
  73. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
  74. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
  75. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
  76. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_color.pine +0 -0
  77. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_math.pine +0 -0
  78. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_str.pine +0 -0
  79. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
  80. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
  81. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_ta.pine +0 -0
  82. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
  83. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
  84. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
  85. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
  86. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
  87. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
  88. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
  89. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
  90. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
  91. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
  92. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
  93. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
  94. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
  95. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
  96. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
  97. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
  98. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
  99. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
  100. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
  101. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
  102. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
  103. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
  104. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
  105. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
  106. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
  107. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
  108. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
  109. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
  110. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
  111. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
  112. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
  113. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
  114. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
  115. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
  116. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
  117. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
  118. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
  119. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
  120. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
  121. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
  122. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
  123. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
  124. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
  125. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
  126. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
  127. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
  128. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
  129. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
  130. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
  131. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
  132. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
  133. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
  134. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
  135. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
  136. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
  137. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
  138. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
  139. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
  140. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
  141. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
  142. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
  143. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
  144. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
  145. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
  146. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
  147. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
  148. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
  149. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
  150. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
  151. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
  152. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
  153. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
  154. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
  155. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
  156. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
  157. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
  158. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
  159. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
  160. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
  161. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
  162. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
  163. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
  164. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
  165. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
  166. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
  167. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
  168. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
  169. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
  170. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
  171. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
  172. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
  173. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
  174. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
  175. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
  176. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
  177. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
  178. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
  179. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
  180. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
  181. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
  182. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
  183. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
  184. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
  185. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +0 -0
  186. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
  187. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
  188. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
  189. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
  190. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
  191. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
  192. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
  193. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
  194. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
  195. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
  196. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
  197. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
  198. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
  199. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
  200. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
  201. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
  202. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
  203. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
  204. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
  205. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
  206. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
  207. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
  208. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
  209. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
  210. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
  211. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
  212. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
  213. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
  214. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
  215. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
  216. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
  217. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
  218. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
  219. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
  220. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
  221. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
  222. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
  223. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
  224. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
  225. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
  226. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
  227. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
  228. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
  229. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
  230. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
  231. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
  232. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
  233. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
  234. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
  235. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
  236. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
  237. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
  238. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
  239. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
  240. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
  241. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
  242. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
  243. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
  244. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
  245. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
  246. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
  247. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
  248. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
  249. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
  250. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
  251. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
  252. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
  253. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
  254. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
  255. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
  256. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
  257. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
  258. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
  259. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
  260. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
  261. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
  262. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
  263. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
  264. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
  265. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
  266. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
  267. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
  268. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
  269. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
  270. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
  271. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
  272. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
  273. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
  274. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
  275. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
  276. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
  277. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
  278. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
  279. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
  280. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
  281. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
  282. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
  283. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
  284. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
  285. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
  286. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
  287. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
  288. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
  289. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
  290. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
  291. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
  292. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
  293. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
  294. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
  295. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
  296. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
  297. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
  298. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
  299. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
  300. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
  301. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
  302. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
  303. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
  304. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
  305. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
  306. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
  307. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
  308. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
  309. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
  310. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
  311. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
  312. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
  313. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
  314. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
  315. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
  316. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
  317. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
  318. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
  319. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
  320. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
  321. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
  322. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
  323. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
  324. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
  325. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
  326. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
  327. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
  328. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
  329. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
  330. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
  331. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
  332. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
  333. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
  334. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
  335. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
  336. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
  337. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
  338. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
  339. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
  340. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
  341. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
  342. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
  343. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/golden/matrix_eigen_pca.cpp +0 -0
  344. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_analyzer.py +0 -0
  345. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_analyzer_matrix_inference.py +0 -0
  346. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_analyzer_ta_return_types.py +0 -0
  347. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_audit_fixes.py +0 -0
  348. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_determinism.py +0 -0
  349. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_fallthrough_guards.py +0 -0
  350. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_golden.py +0 -0
  351. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_input_getters.py +0 -0
  352. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_matrix_typed.py +0 -0
  353. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_new.py +0 -0
  354. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_compile_corpus.py +0 -0
  355. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_compile_smoke.py +0 -0
  356. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_errors.py +0 -0
  357. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_import_all.py +0 -0
  358. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_input_time_int64.py +0 -0
  359. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_int64_time_storage.py +0 -0
  360. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_lexer.py +0 -0
  361. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_official_surface.py +0 -0
  362. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_parser.py +0 -0
  363. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_security_tf_literal.py +0 -0
  364. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_signatures.py +0 -0
  365. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker.py +0 -0
  366. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
  367. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_color_cast.py +0 -0
  368. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_const_namespaces.py +0 -0
  369. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_dividends_earnings.py +0 -0
  370. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_footprint.py +0 -0
  371. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_input_color.py +0 -0
  372. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_input_source.py +0 -0
  373. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_matrix.py +0 -0
  374. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_security_adjustment.py +0 -0
  375. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_syminfo_gap_fields.py +0 -0
  376. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
  377. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_varip.py +0 -0
  378. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_volume_row.py +0 -0
  379. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_symbols.py +0 -0
  380. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_ta_official_surface.py +0 -0
  381. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpile_division.py +0 -0
  382. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpile_enum_order.py +0 -0
  383. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpile_pf_trace.py +0 -0
  384. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpile_tr_handle_na.py +0 -0
  385. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpiler_matrix_kwargs.py +0 -0
  386. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_typespec_matrix.py +0 -0
  387. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_udt_drawing_field_cleanup.py +0 -0
  388. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_unsupported_reporting.py +0 -0
  389. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_vwap_tuple_unpack.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pineforge-codegen
3
- Version: 0.7.3
3
+ Version: 0.7.4
4
4
  Summary: PineScript v6 to C++ transpiler that targets the pineforge-engine runtime.
5
5
  Project-URL: Homepage, https://github.com/pineforge-4pass/pineforge-codegen-oss
6
6
  Project-URL: Issues, https://github.com/pineforge-4pass/pineforge-codegen-oss/issues
@@ -0,0 +1 @@
1
+ 0.7.4
@@ -9,13 +9,13 @@ import sys
9
9
  if "/codegen" not in sys.path:
10
10
  sys.path.insert(0, "/codegen")
11
11
 
12
- from pineforge_codegen import transpile
12
+ from pineforge_codegen import transpile_full
13
13
  from pineforge_codegen.errors import CompileError
14
14
 
15
15
 
16
16
  def transpile_json(source: str) -> str:
17
17
  try:
18
- cpp = transpile(source)
18
+ full = transpile_full(source)
19
19
  except CompileError as e:
20
20
  diags = []
21
21
  for d in e.diagnostics:
@@ -32,4 +32,4 @@ def transpile_json(source: str) -> str:
32
32
  entry["endCol"] = end_col
33
33
  diags.append(entry)
34
34
  return json.dumps({"ok": False, "error": str(e), "diagnostics": diags})
35
- return json.dumps({"ok": True, "cpp": cpp})
35
+ return json.dumps({"ok": True, "cpp": full["cpp"], "inputs": full["inputs"], "strategyParams": full["strategyParams"]})
@@ -51,3 +51,42 @@ def transpile(pine_source: str, *, check_support: bool = True, filename: str = "
51
51
  # ``if (trace_enabled_) { trace(...); ... }`` block.
52
52
  ctx.pf_trace_pragmas = pragmas
53
53
  return CodeGen(ctx).generate()
54
+
55
+
56
+ def transpile_full(pine_source: str, *, check_support: bool = True,
57
+ filename: str = "<input>") -> dict:
58
+ """Transpile like :func:`transpile`, plus the host-UI input manifest.
59
+
60
+ Runs ONE pipeline pass (Lexer -> Parser -> support check -> Analyzer ->
61
+ CodeGen.generate) and returns the generated C++ alongside the data the
62
+ cloud Studio needs to auto-build a backtest "override params" form:
63
+
64
+ - ``cpp``: the generated C++ source (identical to :func:`transpile`).
65
+ - ``inputs``: a list of ``InputDef`` dicts (one per top-level
66
+ ``var = input.*(...)`` declaration). Each has ``title`` / ``type`` /
67
+ ``default`` and optionally ``min`` / ``max`` / ``step`` / ``options``
68
+ (omitted when the corresponding signature argument is absent or
69
+ references a non-const value). See
70
+ :meth:`CodeGen.extract_input_manifest`.
71
+ - ``strategyParams``: the literal ``strategy(...)`` kwargs the analyzer
72
+ surfaced (e.g. ``initial_capital``, ``pyramiding``).
73
+
74
+ Args mirror :func:`transpile`.
75
+
76
+ Returns:
77
+ ``{"cpp": str, "inputs": list[dict], "strategyParams": dict}``.
78
+ """
79
+ pragmas = extract_pf_trace_pragmas(pine_source)
80
+ tokens = Lexer(pine_source, filename=filename).tokenize()
81
+ ast = Parser(tokens, source=pine_source, filename=filename).parse()
82
+ if check_support:
83
+ check_support_or_raise(ast, filename=filename)
84
+ ctx = Analyzer(ast, filename=filename).analyze()
85
+ ctx.pf_trace_pragmas = pragmas
86
+ gen = CodeGen(ctx)
87
+ cpp = gen.generate()
88
+ return {
89
+ "cpp": cpp,
90
+ "inputs": gen.extract_input_manifest(),
91
+ "strategyParams": dict(ctx.strategy_params),
92
+ }
@@ -15,13 +15,32 @@ Mixin contract — host class must provide:
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
- from ..ast_nodes import FuncCall, Identifier, MemberAccess, StringLiteral
18
+ from ..ast_nodes import (
19
+ BoolLiteral,
20
+ FuncCall,
21
+ Identifier,
22
+ MemberAccess,
23
+ NumberLiteral,
24
+ StringLiteral,
25
+ VarDecl,
26
+ )
19
27
  from .. import signatures as sigs
20
28
 
21
29
 
22
30
  class InputHelper:
23
31
  """``input.*`` call analysis helpers — defaults, titles, getter dispatch, enum guard."""
24
32
 
33
+ # Maps the input function short-name -> the form-facing type tag emitted in
34
+ # the input manifest (consumed by the host UI's override form). ``price``
35
+ # is a float slider, ``time`` an int timestamp; everything string-like
36
+ # collapses to "string".
37
+ _FORM_TYPE = {
38
+ "int": "int", "float": "float", "bool": "bool", "string": "string",
39
+ "source": "source", "enum": "enum", "price": "float", "time": "int",
40
+ "color": "string", "timeframe": "string", "session": "string",
41
+ "symbol": "string", "text_area": "string",
42
+ }
43
+
25
44
  def _is_input_call(self, node: FuncCall) -> bool:
26
45
  """True if ``node`` is an ``input(...)`` or ``input.<type>(...)`` call."""
27
46
  func_name, namespace = self._resolve_callee(node.callee)
@@ -187,3 +206,125 @@ class InputHelper:
187
206
  f"{ename}.{dv.member} is not a member of enum {ename} "
188
207
  "(internal: Analyzer should reject this first)"
189
208
  )
209
+
210
+ # ------------------------------------------------------------------
211
+ # Input manifest extraction (host UI override-form source of truth)
212
+ # ------------------------------------------------------------------
213
+
214
+ def _literal_or_none(self, node):
215
+ """Return a JSON scalar for a *const* literal AST node, else None.
216
+
217
+ ``None`` signals non-const (an identifier, computed expression, …) so
218
+ callers can omit a bound/option that references a runtime value.
219
+ Enum member refs (``Dir.Up``) collapse to the ``"Dir.Up"`` string tag.
220
+ """
221
+ if isinstance(node, StringLiteral):
222
+ return node.value
223
+ # BoolLiteral must be checked before NumberLiteral: a Pine ``true`` is a
224
+ # BoolLiteral (not a NumberLiteral), but guarding the order keeps intent
225
+ # explicit and future-proof against bool/int node overlap.
226
+ if isinstance(node, BoolLiteral):
227
+ return node.value
228
+ if isinstance(node, NumberLiteral):
229
+ return node.value
230
+ # enum member ref like ``Dir.Up`` -> "Dir.Up" (string tag)
231
+ if isinstance(node, MemberAccess) and isinstance(node.object, Identifier):
232
+ return f"{node.object.name}.{node.member}"
233
+ return None
234
+
235
+ def _merged_args(self, node: FuncCall, func_name, namespace):
236
+ """Merge positional args + kwargs into signature-positional order.
237
+
238
+ Returns ``(param_names | None, merged_list)``. Mirrors the merge logic
239
+ in :meth:`_get_input_title` / :meth:`_get_input_default` so manifest
240
+ extraction reads bounds/options off the same positions codegen does.
241
+ """
242
+ if namespace == "input" and func_name in sigs.INPUT_FUNCTIONS:
243
+ names = sigs.get_param_names("input", func_name)
244
+ elif func_name == "input" and namespace is None:
245
+ names = sigs.get_param_names(None, "input")
246
+ else:
247
+ names = None
248
+ merged = list(node.args)
249
+ if names:
250
+ for i, pname in enumerate(names):
251
+ if pname in node.kwargs:
252
+ while len(merged) <= i:
253
+ merged.append(None)
254
+ if merged[i] is None:
255
+ merged[i] = node.kwargs[pname]
256
+ return names, merged
257
+
258
+ def extract_input_manifest(self) -> list[dict]:
259
+ """Walk top-level ``var = input.*(...)`` decls into an InputDef list.
260
+
261
+ Each entry: ``{title, type, default[, min, max, step, options]}``. The
262
+ optional keys are emitted only when the corresponding signature
263
+ argument is a const literal; a bound/option referencing a non-literal
264
+ is omitted (never crashes). One pass over ``self.ctx.ast.body``.
265
+ """
266
+ out: list[dict] = []
267
+ for stmt in self.ctx.ast.body:
268
+ if not (
269
+ isinstance(stmt, VarDecl)
270
+ and isinstance(stmt.value, FuncCall)
271
+ and self._is_input_call(stmt.value)
272
+ ):
273
+ continue
274
+ node = stmt.value
275
+ func_name, namespace = self._resolve_callee(node.callee)
276
+ names, merged = self._merged_args(node, func_name, namespace)
277
+ title = self._get_input_title(node, var_name=stmt.name)
278
+ default_node = self._get_input_default(node)
279
+ default_val = (
280
+ self._literal_or_none(default_node)
281
+ if default_node is not None
282
+ else None
283
+ )
284
+ if namespace == "input":
285
+ form_type = self._FORM_TYPE.get(func_name, "string")
286
+ else:
287
+ # Plain ``input(...)``: Pine types the result by its defval.
288
+ # The codegen already emits the matching scalar getter, so the
289
+ # manifest must mirror that — infer from the resolved default's
290
+ # Python type. ``bool`` MUST be tested before ``int`` because
291
+ # ``isinstance(True, int)`` is True. A None/non-literal default
292
+ # falls back to "string".
293
+ if isinstance(default_val, bool):
294
+ form_type = "bool"
295
+ elif isinstance(default_val, int):
296
+ form_type = "int"
297
+ elif isinstance(default_val, float):
298
+ form_type = "float"
299
+ elif isinstance(default_val, str):
300
+ form_type = "string"
301
+ else:
302
+ form_type = "string"
303
+ entry: dict = {
304
+ "title": title,
305
+ "type": form_type,
306
+ "default": default_val,
307
+ }
308
+ # Pull min/max/step/options by signature param name; emit only
309
+ # const literals so the override form never references a runtime
310
+ # value it can't reproduce.
311
+ if names:
312
+ idx = {n: i for i, n in enumerate(names)}
313
+ for key, pname in (("min", "minval"), ("max", "maxval"), ("step", "step")):
314
+ i = idx.get(pname)
315
+ if i is not None and i < len(merged) and merged[i] is not None:
316
+ v = self._literal_or_none(merged[i])
317
+ # bool is an int subclass — exclude it from numeric bounds
318
+ if isinstance(v, (int, float)) and not isinstance(v, bool):
319
+ entry[key] = v
320
+ oi = idx.get("options")
321
+ if oi is not None and oi < len(merged) and merged[oi] is not None:
322
+ opts_node = merged[oi]
323
+ elems = getattr(opts_node, "elements", None)
324
+ if elems is not None:
325
+ vals = [self._literal_or_none(e) for e in elems]
326
+ # any non-const element -> omit the whole options list
327
+ if vals and all(isinstance(v, str) for v in vals):
328
+ entry["options"] = vals
329
+ out.append(entry)
330
+ return out
@@ -0,0 +1,107 @@
1
+ from pineforge_codegen import transpile_full
2
+
3
+ PREAMBLE = "//@version=6\nstrategy(\"T\")\n"
4
+
5
+
6
+ def _full(body: str):
7
+ return transpile_full(PREAMBLE + body)
8
+
9
+
10
+ def test_int_input_manifest():
11
+ r = _full("length = input.int(14, \"Length\", minval=2, maxval=200, step=2)\n")
12
+ inp = next(i for i in r["inputs"] if i["title"] == "Length")
13
+ assert inp["type"] == "int"
14
+ assert inp["default"] == 14
15
+ assert inp["min"] == 2
16
+ assert inp["max"] == 200
17
+ assert inp["step"] == 2
18
+
19
+
20
+ def test_float_omits_absent_bounds():
21
+ r = _full("mult = input.float(2.0, \"Mult\")\n")
22
+ inp = next(i for i in r["inputs"] if i["title"] == "Mult")
23
+ assert inp["type"] == "float"
24
+ assert inp["default"] == 2.0
25
+ assert "min" not in inp and "max" not in inp
26
+
27
+
28
+ def test_bool_and_title_fallback_to_var_name():
29
+ r = _full("use_x = input.bool(true)\n")
30
+ inp = next(i for i in r["inputs"] if i["title"] == "use_x")
31
+ assert inp["type"] == "bool"
32
+ assert inp["default"] is True
33
+
34
+
35
+ def test_string_options():
36
+ r = _full("mode = input.string(\"a\", \"Mode\", options=[\"a\", \"b\", \"c\"])\n")
37
+ inp = next(i for i in r["inputs"] if i["title"] == "Mode")
38
+ assert inp["type"] == "string"
39
+ assert inp["options"] == ["a", "b", "c"]
40
+
41
+
42
+ def test_non_const_options_omitted():
43
+ # options referencing a non-literal must be omitted, not crash
44
+ r = _full("v = \"x\"\nmode = input.string(\"a\", \"Mode\", options=[v, \"b\"])\n")
45
+ inp = next(i for i in r["inputs"] if i["title"] == "Mode")
46
+ assert "options" not in inp
47
+
48
+
49
+ def test_source_type():
50
+ r = _full("src = input.source(close, \"Source\")\n")
51
+ inp = next(i for i in r["inputs"] if i["title"] == "Source")
52
+ assert inp["type"] == "source"
53
+
54
+
55
+ def test_plain_input_int_form_type():
56
+ r = _full("len = input(10, \"Xi\")\n")
57
+ inp = next(i for i in r["inputs"] if i["title"] == "Xi")
58
+ assert inp["type"] == "int"
59
+ assert inp["default"] == 10
60
+
61
+
62
+ def test_plain_input_float_form_type():
63
+ r = _full("f = input(1.5, \"Xf\")\n")
64
+ inp = next(i for i in r["inputs"] if i["title"] == "Xf")
65
+ assert inp["type"] == "float"
66
+ assert inp["default"] == 1.5
67
+
68
+
69
+ def test_plain_input_bool_form_type():
70
+ r = _full("b = input(true, \"Xb\")\n")
71
+ inp = next(i for i in r["inputs"] if i["title"] == "Xb")
72
+ assert inp["type"] == "bool"
73
+ assert inp["default"] is True
74
+
75
+
76
+ def test_plain_input_string_form_type():
77
+ r = _full("s = input(\"a\", \"Xs\")\n")
78
+ inp = next(i for i in r["inputs"] if i["title"] == "Xs")
79
+ assert inp["type"] == "string"
80
+ assert inp["default"] == "a"
81
+
82
+
83
+ def test_non_const_minval_bound_omitted():
84
+ # minval bound referencing a prior const-assigned identifier is non-literal
85
+ # at the call site -> "min" omitted, no crash, other facets unaffected.
86
+ r = _full("somevar = 2\nlen = input.int(14, \"Len\", minval=somevar, maxval=200, step=2)\n")
87
+ inp = next(i for i in r["inputs"] if i["title"] == "Len")
88
+ assert inp["default"] == 14
89
+ assert "min" not in inp
90
+ assert inp["max"] == 200
91
+ assert inp["step"] == 2
92
+
93
+
94
+ def test_zero_inputs():
95
+ r = _full("a = close + 1\n")
96
+ assert r["inputs"] == []
97
+
98
+
99
+ def test_strategy_params_surfaced():
100
+ r = transpile_full("//@version=6\nstrategy(\"T\", initial_capital=5000, pyramiding=2)\na = close\n")
101
+ assert r["strategyParams"]["initial_capital"] == 5000
102
+ assert r["strategyParams"]["pyramiding"] == 2
103
+
104
+
105
+ def test_cpp_still_returned():
106
+ r = _full("length = input.int(14, \"Length\")\n")
107
+ assert 'get_input_int("Length", 14)' in r["cpp"]
@@ -0,0 +1,43 @@
1
+ """Glue contract smoke test for gate/glue.py.
2
+
3
+ Loads gate/glue.py directly (it carries a `sys.path.insert(0, "/codegen")`
4
+ preamble; `pineforge_codegen` still resolves because the repo root is on
5
+ sys.path when pytest runs from there) and asserts the transpile_json envelope:
6
+
7
+ - valid source -> ok:true with inputs[] and strategyParams (the new manifest)
8
+ - invalid source -> ok:false with a diagnostics key (error branch untouched)
9
+ """
10
+ import importlib.util
11
+ import json
12
+ import os
13
+
14
+ _REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
15
+ _GLUE_PATH = os.path.join(_REPO_ROOT, "gate", "glue.py")
16
+
17
+
18
+ def _load_glue():
19
+ spec = importlib.util.spec_from_file_location("pineforge_glue_under_test", _GLUE_PATH)
20
+ module = importlib.util.module_from_spec(spec)
21
+ spec.loader.exec_module(module)
22
+ return module
23
+
24
+
25
+ def test_valid_source_emits_manifest():
26
+ glue = _load_glue()
27
+ src = (
28
+ "//@version=6\n"
29
+ 'strategy("T", initial_capital=5000)\n'
30
+ 'length = input.int(14, "Length")\n'
31
+ "plot(close)\n"
32
+ )
33
+ d = json.loads(glue.transpile_json(src))
34
+ assert d["ok"] is True
35
+ assert any(i["title"] == "Length" for i in d["inputs"])
36
+ assert d["strategyParams"]["initial_capital"] == 5000
37
+
38
+
39
+ def test_invalid_source_still_returns_error_envelope():
40
+ glue = _load_glue()
41
+ d = json.loads(glue.transpile_json("strategy("))
42
+ assert d["ok"] is False
43
+ assert "diagnostics" in d
@@ -1 +0,0 @@
1
- 0.7.3