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.
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/PKG-INFO +1 -1
- pineforge_codegen-0.7.4/VERSION +1 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/glue.py +3 -3
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/__init__.py +39 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/input.py +142 -1
- pineforge_codegen-0.7.4/tests/test_extract_inputs.py +107 -0
- pineforge_codegen-0.7.4/tests/test_glue_smoke.py +43 -0
- pineforge_codegen-0.7.3/VERSION +0 -1
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/dependabot.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/workflows/gate.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/workflows/publish-pyodide.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/workflows/release.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.github/workflows/test.yml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/.gitignore +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/CLAUDE.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/LEGAL.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/LICENSE +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/PYODIDE_TARGET +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/README.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/docs/codegen-coverage-gaps.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/compare.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/oracle.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/run-gate.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/gate/selftest.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/npm/README.md +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/npm/index.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/npm/package.json +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/package-lock.json +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/package.json +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/__init__.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/base.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/call_handlers.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/contracts.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/diagnostics.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/tables.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/types.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/ast_nodes.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/__init__.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/base.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/emit_top.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/helpers.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/security.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/ta.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/tables.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/types.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/visit_call.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/visit_expr.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/visit_stmt.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/errors.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/lexer.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/parser.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/pragmas.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/signatures.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/support_checker.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/symbols.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/tokens.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/tv_input_choices.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pyproject.toml +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/scripts/build-npm-package.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/scripts/dump-tables.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/scripts/worker-template.mjs +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/__init__.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/_compile.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/chart_bg_color.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/divergent_last_bar_index.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/divergent_time_close.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/export_func.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/footprint_new.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_color.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_math.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_str.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_ta.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
- {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
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
- {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
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
- {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
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
- {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
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
- {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
- {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
- {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
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
- {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
- {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
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
- {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
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
- {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
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/golden/matrix_eigen_pca.cpp +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_analyzer.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_analyzer_matrix_inference.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_analyzer_ta_return_types.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_audit_fixes.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_determinism.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_fallthrough_guards.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_golden.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_input_getters.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_matrix_typed.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_codegen_new.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_compile_corpus.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_compile_smoke.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_errors.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_import_all.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_input_time_int64.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_int64_time_storage.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_lexer.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_official_surface.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_parser.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_security_tf_literal.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_signatures.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_color_cast.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_const_namespaces.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_dividends_earnings.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_footprint.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_input_color.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_input_source.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_matrix.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_security_adjustment.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_syminfo_gap_fields.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_varip.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_support_checker_volume_row.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_symbols.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_ta_official_surface.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpile_division.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpile_enum_order.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpile_pf_trace.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpile_tr_handle_na.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_transpiler_matrix_kwargs.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_typespec_matrix.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_udt_drawing_field_cleanup.py +0 -0
- {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/test_unsupported_reporting.py +0 -0
- {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
|
+
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
|
|
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
|
-
|
|
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
|
|
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
|
pineforge_codegen-0.7.3/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.7.3
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/call_handlers.py
RENAMED
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/analyzer/diagnostics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/pineforge_codegen/codegen/helpers_syminfo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/chart_bg_color.pine
RENAMED
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/const_ns_shape_free.pine
RENAMED
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/divergent_time_close.pine
RENAMED
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/footprint_new.pine
RENAMED
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/hard_reject_dividends.pine
RENAMED
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/matrix_unknown_elem.pine
RENAMED
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/multi_error_one_line.pine
RENAMED
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/sec_tf_invalid.pine
RENAMED
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_color.pine
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_strategy_fn.pine
RENAMED
|
File without changes
|
{pineforge_codegen-0.7.3 → pineforge_codegen-0.7.4}/tests/gate-corpus/err/unknown_syminfo.pine
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|