opencode-pyneruntime 6.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- opencode_pyneruntime-6.6.4.dist-info/METADATA +281 -0
- opencode_pyneruntime-6.6.4.dist-info/RECORD +261 -0
- opencode_pyneruntime-6.6.4.dist-info/WHEEL +5 -0
- opencode_pyneruntime-6.6.4.dist-info/entry_points.txt +6 -0
- opencode_pyneruntime-6.6.4.dist-info/licenses/LICENSE +201 -0
- opencode_pyneruntime-6.6.4.dist-info/licenses/NOTICE +21 -0
- opencode_pyneruntime-6.6.4.dist-info/top_level.txt +1 -0
- pynecore/__init__.py +6 -0
- pynecore/cli/__init__.py +2 -0
- pynecore/cli/app.py +238 -0
- pynecore/cli/commands/__init__.py +343 -0
- pynecore/cli/commands/benchmark.py +186 -0
- pynecore/cli/commands/compile.py +198 -0
- pynecore/cli/commands/data.py +857 -0
- pynecore/cli/commands/debug.py +63 -0
- pynecore/cli/commands/optimize.py +956 -0
- pynecore/cli/commands/plugin.py +242 -0
- pynecore/cli/commands/run.py +2006 -0
- pynecore/cli/pluggable.py +132 -0
- pynecore/cli/utils/__init__.py +0 -0
- pynecore/cli/utils/api_error_handler.py +168 -0
- pynecore/cli/utils/broker_picker.py +330 -0
- pynecore/cli/utils/error_hook.py +28 -0
- pynecore/cli/utils/keyreader.py +178 -0
- pynecore/cli/utils/provider_picker.py +19 -0
- pynecore/cli/utils/symbol_browser.py +1149 -0
- pynecore/core/__init__.py +0 -0
- pynecore/core/aggregator.py +257 -0
- pynecore/core/bar_magnifier.py +168 -0
- pynecore/core/broker/__init__.py +64 -0
- pynecore/core/broker/defaults.py +113 -0
- pynecore/core/broker/disappearance.py +927 -0
- pynecore/core/broker/emulator.py +345 -0
- pynecore/core/broker/exceptions.py +346 -0
- pynecore/core/broker/idempotency.py +401 -0
- pynecore/core/broker/intent_builder.py +334 -0
- pynecore/core/broker/journal.py +1785 -0
- pynecore/core/broker/models.py +1600 -0
- pynecore/core/broker/native_failsafe_manager.py +1436 -0
- pynecore/core/broker/one_way_emulator.py +1128 -0
- pynecore/core/broker/position.py +787 -0
- pynecore/core/broker/run_identity.py +126 -0
- pynecore/core/broker/software_entry_stop_engine.py +351 -0
- pynecore/core/broker/software_partial_bracket_engine.py +1379 -0
- pynecore/core/broker/spot_inventory.py +1327 -0
- pynecore/core/broker/storage.py +2655 -0
- pynecore/core/broker/store_helpers.py +2161 -0
- pynecore/core/broker/sync_engine.py +16070 -0
- pynecore/core/broker/validation.py +382 -0
- pynecore/core/class_property.py +7 -0
- pynecore/core/config.py +392 -0
- pynecore/core/csv_file.py +547 -0
- pynecore/core/currency.py +262 -0
- pynecore/core/data_converter.py +1002 -0
- pynecore/core/datetime.py +296 -0
- pynecore/core/download_info.py +71 -0
- pynecore/core/download_runner.py +274 -0
- pynecore/core/htf_aggregator.py +181 -0
- pynecore/core/import_hook.py +358 -0
- pynecore/core/instance_state.py +494 -0
- pynecore/core/live_ltf_collector.py +442 -0
- pynecore/core/live_ltf_window.py +189 -0
- pynecore/core/live_runner.py +1347 -0
- pynecore/core/module_property.py +26 -0
- pynecore/core/ohlcv_file.py +1888 -0
- pynecore/core/overload.py +371 -0
- pynecore/core/pine_cast.py +113 -0
- pynecore/core/pine_export.py +95 -0
- pynecore/core/pine_method.py +244 -0
- pynecore/core/pine_range.py +86 -0
- pynecore/core/pine_udt.py +69 -0
- pynecore/core/plugin/__init__.py +394 -0
- pynecore/core/plugin/broker.py +781 -0
- pynecore/core/plugin/cli.py +96 -0
- pynecore/core/plugin/live_provider.py +208 -0
- pynecore/core/plugin/provider.py +331 -0
- pynecore/core/provider_string.py +148 -0
- pynecore/core/random.py +40 -0
- pynecore/core/resampler.py +686 -0
- pynecore/core/safe_convert.py +64 -0
- pynecore/core/script.py +1011 -0
- pynecore/core/script_runner.py +3202 -0
- pynecore/core/security.py +1749 -0
- pynecore/core/security_process.py +1253 -0
- pynecore/core/security_shm.py +456 -0
- pynecore/core/series.py +417 -0
- pynecore/core/strategy_stats.py +669 -0
- pynecore/core/symbol_map.py +134 -0
- pynecore/core/syminfo.py +505 -0
- pynecore/core/viz.py +591 -0
- pynecore/lib/__init__.py +1771 -0
- pynecore/lib/_fixnan.py +32 -0
- pynecore/lib/_math_stateful.py +202 -0
- pynecore/lib/_timeframe_change.py +101 -0
- pynecore/lib/adjustment.py +6 -0
- pynecore/lib/alert.py +39 -0
- pynecore/lib/alert.pyi +14 -0
- pynecore/lib/array.py +1051 -0
- pynecore/lib/barmerge.py +60 -0
- pynecore/lib/barstate.py +30 -0
- pynecore/lib/box.py +415 -0
- pynecore/lib/chart.py +128 -0
- pynecore/lib/color.py +152 -0
- pynecore/lib/color.pyi +50 -0
- pynecore/lib/currency.py +62 -0
- pynecore/lib/dayofweek.py +36 -0
- pynecore/lib/dayofweek.pyi +18 -0
- pynecore/lib/display.py +8 -0
- pynecore/lib/dividends.py +9 -0
- pynecore/lib/earnings.py +11 -0
- pynecore/lib/extend.py +6 -0
- pynecore/lib/font.py +5 -0
- pynecore/lib/footprint.py +79 -0
- pynecore/lib/format.py +11 -0
- pynecore/lib/hline.py +67 -0
- pynecore/lib/hline.pyi +24 -0
- pynecore/lib/label.py +409 -0
- pynecore/lib/line.py +433 -0
- pynecore/lib/linefill.py +93 -0
- pynecore/lib/location.py +11 -0
- pynecore/lib/log.py +362 -0
- pynecore/lib/map.py +150 -0
- pynecore/lib/math.py +385 -0
- pynecore/lib/matrix.py +708 -0
- pynecore/lib/order.py +8 -0
- pynecore/lib/pivotpointtype.py +8 -0
- pynecore/lib/plot.py +95 -0
- pynecore/lib/plot.pyi +33 -0
- pynecore/lib/polyline.py +91 -0
- pynecore/lib/position.py +15 -0
- pynecore/lib/request.py +281 -0
- pynecore/lib/runtime.py +5 -0
- pynecore/lib/scale.py +9 -0
- pynecore/lib/session.py +267 -0
- pynecore/lib/session.pyi +12 -0
- pynecore/lib/shape.py +18 -0
- pynecore/lib/size.py +12 -0
- pynecore/lib/splits.py +4 -0
- pynecore/lib/strategy/__init__.py +4778 -0
- pynecore/lib/strategy/closedtrades.py +347 -0
- pynecore/lib/strategy/closedtrades.pyi +53 -0
- pynecore/lib/strategy/commission.py +9 -0
- pynecore/lib/strategy/direction.py +9 -0
- pynecore/lib/strategy/oca.py +13 -0
- pynecore/lib/strategy/opentrades.py +281 -0
- pynecore/lib/strategy/opentrades.pyi +49 -0
- pynecore/lib/strategy/risk.py +109 -0
- pynecore/lib/string.py +649 -0
- pynecore/lib/syminfo.py +84 -0
- pynecore/lib/ta.py +2230 -0
- pynecore/lib/table.py +290 -0
- pynecore/lib/text.py +17 -0
- pynecore/lib/ticker.py +207 -0
- pynecore/lib/timeframe.py +293 -0
- pynecore/lib/volume_row.py +67 -0
- pynecore/lib/xloc.py +4 -0
- pynecore/lib/yloc.py +5 -0
- pynecore/providers/__init__.py +0 -0
- pynecore/providers/ccxt.py +664 -0
- pynecore/providers/replay.py +187 -0
- pynecore/pynesys/__init__.py +0 -0
- pynecore/pynesys/api.py +498 -0
- pynecore/pynesys/compiler.py +112 -0
- pynecore/standalone.py +99 -0
- pynecore/testing/__init__.py +1 -0
- pynecore/testing/broker_lab/__init__.py +41 -0
- pynecore/testing/broker_lab/__main__.py +5 -0
- pynecore/testing/broker_lab/cli.py +87 -0
- pynecore/testing/broker_lab/generate.py +47 -0
- pynecore/testing/broker_lab/model.py +84 -0
- pynecore/testing/broker_lab/reference.py +645 -0
- pynecore/testing/broker_lab/runner.py +372 -0
- pynecore/testing/broker_lab/scheduler.py +50 -0
- pynecore/testing/broker_lab/subprocess.py +73 -0
- pynecore/transformers/__init__.py +0 -0
- pynecore/transformers/builtin_shadow.py +136 -0
- pynecore/transformers/closure_arguments_transformer.py +428 -0
- pynecore/transformers/display_rewrite.py +140 -0
- pynecore/transformers/dynamic_default.py +147 -0
- pynecore/transformers/function_isolation.py +757 -0
- pynecore/transformers/import_lifter.py +61 -0
- pynecore/transformers/import_normalizer.py +328 -0
- pynecore/transformers/inline_series_hoist.py +178 -0
- pynecore/transformers/input_transformer.py +175 -0
- pynecore/transformers/lib_series.py +201 -0
- pynecore/transformers/locations.py +70 -0
- pynecore/transformers/module_properties.json +3387 -0
- pynecore/transformers/module_property.py +221 -0
- pynecore/transformers/ne_guard.py +70 -0
- pynecore/transformers/persistent.py +320 -0
- pynecore/transformers/persistent_series.py +76 -0
- pynecore/transformers/safe_convert_transformer.py +97 -0
- pynecore/transformers/safe_division_transformer.py +95 -0
- pynecore/transformers/script_requirements.py +308 -0
- pynecore/transformers/security.py +752 -0
- pynecore/transformers/security_instantiation.py +274 -0
- pynecore/transformers/series.py +275 -0
- pynecore/transformers/slot_layout.py +381 -0
- pynecore/transformers/type_checking_stripper.py +25 -0
- pynecore/transformers/unused_series_detector.py +267 -0
- pynecore/types/__init__.py +21 -0
- pynecore/types/alert.py +5 -0
- pynecore/types/barmerge.py +5 -0
- pynecore/types/base.py +39 -0
- pynecore/types/box.py +37 -0
- pynecore/types/chart.py +17 -0
- pynecore/types/color.py +107 -0
- pynecore/types/currency.py +5 -0
- pynecore/types/datetime.py +6 -0
- pynecore/types/display.py +5 -0
- pynecore/types/dividends.py +5 -0
- pynecore/types/earnings.py +5 -0
- pynecore/types/extend.py +5 -0
- pynecore/types/font.py +5 -0
- pynecore/types/footprint.py +41 -0
- pynecore/types/format.py +5 -0
- pynecore/types/hline.py +24 -0
- pynecore/types/ib_persistent.py +8 -0
- pynecore/types/ib_persistent.pyi +10 -0
- pynecore/types/label.py +35 -0
- pynecore/types/line.py +32 -0
- pynecore/types/linefill.py +13 -0
- pynecore/types/location.py +5 -0
- pynecore/types/matrix.py +999 -0
- pynecore/types/na.py +237 -0
- pynecore/types/na.pyi +83 -0
- pynecore/types/ohlcv.py +12 -0
- pynecore/types/order.py +5 -0
- pynecore/types/persistent.py +8 -0
- pynecore/types/persistent.pyi +13 -0
- pynecore/types/pine_types.py +11 -0
- pynecore/types/pine_types.pyi +15 -0
- pynecore/types/pivotpointtype.py +5 -0
- pynecore/types/plot.py +12 -0
- pynecore/types/plot_meta.py +60 -0
- pynecore/types/polyline.py +40 -0
- pynecore/types/position.py +5 -0
- pynecore/types/scale.py +5 -0
- pynecore/types/script_type.py +15 -0
- pynecore/types/series.py +23 -0
- pynecore/types/series.pyi +19 -0
- pynecore/types/session.py +35 -0
- pynecore/types/shape.py +5 -0
- pynecore/types/size.py +5 -0
- pynecore/types/source.py +33 -0
- pynecore/types/splits.py +5 -0
- pynecore/types/strategy.py +45 -0
- pynecore/types/table.py +87 -0
- pynecore/types/text.py +13 -0
- pynecore/types/type_checker.py +7 -0
- pynecore/types/type_checker.pyi +48 -0
- pynecore/types/volume_row.py +36 -0
- pynecore/types/weekdays.py +11 -0
- pynecore/types/xloc.py +5 -0
- pynecore/types/yloc.py +5 -0
- pynecore/utils/__init__.py +0 -0
- pynecore/utils/file_utils.py +50 -0
- pynecore/utils/rich/__init__.py +0 -0
- pynecore/utils/rich/date_column.py +25 -0
- pynecore/utils/sequence_view.py +92 -0
- pynecore/utils/stdlib_checker.py +17 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cross-platform raw key reader for interactive CLI tools.
|
|
3
|
+
|
|
4
|
+
Provides a non-blocking ``read_key()`` returning a high-level ``Key`` enum
|
|
5
|
+
value, a single character (for regular typed text), or ``None`` on timeout.
|
|
6
|
+
The ``raw_terminal()`` context manager switches the controlling terminal
|
|
7
|
+
into cbreak mode on POSIX systems; on Windows it is a no-op since
|
|
8
|
+
``msvcrt`` reads characters directly without echo.
|
|
9
|
+
|
|
10
|
+
SIGWINCH handling is intentionally NOT part of this module — install
|
|
11
|
+
a separate handler if you need resize notifications.
|
|
12
|
+
"""
|
|
13
|
+
import sys
|
|
14
|
+
from enum import Enum, auto
|
|
15
|
+
from contextlib import contextmanager
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Key(Enum):
|
|
19
|
+
"""Special non-character keys."""
|
|
20
|
+
UP = auto()
|
|
21
|
+
DOWN = auto()
|
|
22
|
+
LEFT = auto()
|
|
23
|
+
RIGHT = auto()
|
|
24
|
+
PAGE_UP = auto()
|
|
25
|
+
PAGE_DOWN = auto()
|
|
26
|
+
HOME = auto()
|
|
27
|
+
END = auto()
|
|
28
|
+
ENTER = auto()
|
|
29
|
+
ESC = auto()
|
|
30
|
+
BACKSPACE = auto()
|
|
31
|
+
TAB = auto()
|
|
32
|
+
SHIFT_TAB = auto()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
KeyOrChar = Key | str
|
|
36
|
+
|
|
37
|
+
# Time budget for completing an ESC-prefixed escape sequence before we
|
|
38
|
+
# decide the user actually pressed ESC alone.
|
|
39
|
+
_ESC_SEQ_TIMEOUT = 0.05
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
if sys.platform == 'win32':
|
|
43
|
+
import msvcrt # type: ignore[import-not-found]
|
|
44
|
+
import time
|
|
45
|
+
|
|
46
|
+
_WIN_SPECIAL: dict[str, Key] = {
|
|
47
|
+
'H': Key.UP, 'P': Key.DOWN, 'K': Key.LEFT, 'M': Key.RIGHT,
|
|
48
|
+
'G': Key.HOME, 'O': Key.END, 'I': Key.PAGE_UP, 'Q': Key.PAGE_DOWN,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@contextmanager
|
|
52
|
+
def raw_terminal():
|
|
53
|
+
"""No-op on Windows — msvcrt reads char-by-char without echo."""
|
|
54
|
+
yield
|
|
55
|
+
|
|
56
|
+
def read_key(timeout: float = 0.05) -> KeyOrChar | None:
|
|
57
|
+
"""Read one key event or return ``None`` after ``timeout`` seconds."""
|
|
58
|
+
deadline = time.monotonic() + timeout
|
|
59
|
+
while True:
|
|
60
|
+
if msvcrt.kbhit():
|
|
61
|
+
ch = msvcrt.getwch()
|
|
62
|
+
if ch in ('\xe0', '\x00'):
|
|
63
|
+
code = msvcrt.getwch()
|
|
64
|
+
return _WIN_SPECIAL.get(code)
|
|
65
|
+
if ch == '\r':
|
|
66
|
+
return Key.ENTER
|
|
67
|
+
if ch == '\x08':
|
|
68
|
+
return Key.BACKSPACE
|
|
69
|
+
if ch == '\x1b':
|
|
70
|
+
return Key.ESC
|
|
71
|
+
if ch == '\t':
|
|
72
|
+
return Key.TAB
|
|
73
|
+
return ch
|
|
74
|
+
remaining = deadline - time.monotonic()
|
|
75
|
+
if remaining <= 0:
|
|
76
|
+
return None
|
|
77
|
+
time.sleep(min(0.01, remaining))
|
|
78
|
+
|
|
79
|
+
else:
|
|
80
|
+
import os
|
|
81
|
+
import termios
|
|
82
|
+
import tty
|
|
83
|
+
import select
|
|
84
|
+
|
|
85
|
+
_TILDE_SEQ: dict[str, Key] = {
|
|
86
|
+
'1': Key.HOME, '7': Key.HOME,
|
|
87
|
+
'4': Key.END, '8': Key.END,
|
|
88
|
+
'5': Key.PAGE_UP, '6': Key.PAGE_DOWN,
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@contextmanager
|
|
92
|
+
def raw_terminal():
|
|
93
|
+
"""Switch stdin to cbreak mode; restore on exit.
|
|
94
|
+
|
|
95
|
+
cbreak keeps signal handling (Ctrl+C → SIGINT) enabled, which we
|
|
96
|
+
rely on as a hard-exit path.
|
|
97
|
+
"""
|
|
98
|
+
fd = sys.stdin.fileno()
|
|
99
|
+
old = termios.tcgetattr(fd)
|
|
100
|
+
try:
|
|
101
|
+
tty.setcbreak(fd)
|
|
102
|
+
yield
|
|
103
|
+
finally:
|
|
104
|
+
termios.tcsetattr(fd, termios.TCSADRAIN, old)
|
|
105
|
+
|
|
106
|
+
def _read_byte_within(budget: float) -> int | None:
|
|
107
|
+
"""Read one byte from stdin within ``budget`` seconds.
|
|
108
|
+
|
|
109
|
+
Uses ``os.read`` directly on the file descriptor to bypass Python's
|
|
110
|
+
text-mode buffer — otherwise ``select`` reports no data even when
|
|
111
|
+
the rest of an escape sequence has already been buffered in user
|
|
112
|
+
space, causing arrow keys to be misread as bare ESC.
|
|
113
|
+
"""
|
|
114
|
+
fd = sys.stdin.fileno()
|
|
115
|
+
try:
|
|
116
|
+
r, _, _ = select.select([fd], [], [], budget)
|
|
117
|
+
except InterruptedError:
|
|
118
|
+
return None
|
|
119
|
+
if not r:
|
|
120
|
+
return None
|
|
121
|
+
try:
|
|
122
|
+
b = os.read(fd, 1)
|
|
123
|
+
except (OSError, InterruptedError):
|
|
124
|
+
return None
|
|
125
|
+
if not b:
|
|
126
|
+
return None
|
|
127
|
+
return b[0]
|
|
128
|
+
|
|
129
|
+
def read_key(timeout: float = 0.05) -> KeyOrChar | None:
|
|
130
|
+
"""Read one key event or return ``None`` after ``timeout`` seconds.
|
|
131
|
+
|
|
132
|
+
ESC-prefixed sequences are parsed; a bare ESC (no follow-up within
|
|
133
|
+
``_ESC_SEQ_TIMEOUT``) is returned as ``Key.ESC``.
|
|
134
|
+
"""
|
|
135
|
+
b = _read_byte_within(timeout)
|
|
136
|
+
if b is None:
|
|
137
|
+
return None
|
|
138
|
+
if b == 0x1b: # ESC
|
|
139
|
+
b2 = _read_byte_within(_ESC_SEQ_TIMEOUT)
|
|
140
|
+
if b2 is None or b2 != ord('['):
|
|
141
|
+
return Key.ESC
|
|
142
|
+
b3 = _read_byte_within(_ESC_SEQ_TIMEOUT)
|
|
143
|
+
if b3 is None:
|
|
144
|
+
return Key.ESC
|
|
145
|
+
ch3 = chr(b3)
|
|
146
|
+
if ch3 == 'A':
|
|
147
|
+
return Key.UP
|
|
148
|
+
if ch3 == 'B':
|
|
149
|
+
return Key.DOWN
|
|
150
|
+
if ch3 == 'C':
|
|
151
|
+
return Key.RIGHT
|
|
152
|
+
if ch3 == 'D':
|
|
153
|
+
return Key.LEFT
|
|
154
|
+
if ch3 == 'H':
|
|
155
|
+
return Key.HOME
|
|
156
|
+
if ch3 == 'F':
|
|
157
|
+
return Key.END
|
|
158
|
+
if ch3 == 'Z':
|
|
159
|
+
return Key.SHIFT_TAB
|
|
160
|
+
if ch3.isdigit():
|
|
161
|
+
digits = ch3
|
|
162
|
+
while True:
|
|
163
|
+
bn = _read_byte_within(_ESC_SEQ_TIMEOUT)
|
|
164
|
+
if bn is None:
|
|
165
|
+
return None
|
|
166
|
+
chn = chr(bn)
|
|
167
|
+
if chn == '~':
|
|
168
|
+
break
|
|
169
|
+
digits += chn
|
|
170
|
+
return _TILDE_SEQ.get(digits)
|
|
171
|
+
return None
|
|
172
|
+
if b in (0x0d, 0x0a): # \r, \n
|
|
173
|
+
return Key.ENTER
|
|
174
|
+
if b in (0x7f, 0x08): # DEL, BS
|
|
175
|
+
return Key.BACKSPACE
|
|
176
|
+
if b == 0x09: # \t
|
|
177
|
+
return Key.TAB
|
|
178
|
+
return chr(b)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Interactive picker for installed data-provider plugins."""
|
|
2
|
+
|
|
3
|
+
from typing import NamedTuple
|
|
4
|
+
|
|
5
|
+
from .broker_picker import BrokerPicker
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ProviderChoice(NamedTuple):
|
|
9
|
+
"""Provider entry-point name and its optional human-readable name."""
|
|
10
|
+
|
|
11
|
+
id: str
|
|
12
|
+
name: str = ""
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ProviderPicker(BrokerPicker):
|
|
16
|
+
"""Single-pane provider picker sharing navigation with the broker picker."""
|
|
17
|
+
|
|
18
|
+
def __init__(self, providers: list[ProviderChoice]):
|
|
19
|
+
super().__init__(providers, provider_name="Data", item_name="providers")
|