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.
Files changed (261) hide show
  1. opencode_pyneruntime-6.6.4.dist-info/METADATA +281 -0
  2. opencode_pyneruntime-6.6.4.dist-info/RECORD +261 -0
  3. opencode_pyneruntime-6.6.4.dist-info/WHEEL +5 -0
  4. opencode_pyneruntime-6.6.4.dist-info/entry_points.txt +6 -0
  5. opencode_pyneruntime-6.6.4.dist-info/licenses/LICENSE +201 -0
  6. opencode_pyneruntime-6.6.4.dist-info/licenses/NOTICE +21 -0
  7. opencode_pyneruntime-6.6.4.dist-info/top_level.txt +1 -0
  8. pynecore/__init__.py +6 -0
  9. pynecore/cli/__init__.py +2 -0
  10. pynecore/cli/app.py +238 -0
  11. pynecore/cli/commands/__init__.py +343 -0
  12. pynecore/cli/commands/benchmark.py +186 -0
  13. pynecore/cli/commands/compile.py +198 -0
  14. pynecore/cli/commands/data.py +857 -0
  15. pynecore/cli/commands/debug.py +63 -0
  16. pynecore/cli/commands/optimize.py +956 -0
  17. pynecore/cli/commands/plugin.py +242 -0
  18. pynecore/cli/commands/run.py +2006 -0
  19. pynecore/cli/pluggable.py +132 -0
  20. pynecore/cli/utils/__init__.py +0 -0
  21. pynecore/cli/utils/api_error_handler.py +168 -0
  22. pynecore/cli/utils/broker_picker.py +330 -0
  23. pynecore/cli/utils/error_hook.py +28 -0
  24. pynecore/cli/utils/keyreader.py +178 -0
  25. pynecore/cli/utils/provider_picker.py +19 -0
  26. pynecore/cli/utils/symbol_browser.py +1149 -0
  27. pynecore/core/__init__.py +0 -0
  28. pynecore/core/aggregator.py +257 -0
  29. pynecore/core/bar_magnifier.py +168 -0
  30. pynecore/core/broker/__init__.py +64 -0
  31. pynecore/core/broker/defaults.py +113 -0
  32. pynecore/core/broker/disappearance.py +927 -0
  33. pynecore/core/broker/emulator.py +345 -0
  34. pynecore/core/broker/exceptions.py +346 -0
  35. pynecore/core/broker/idempotency.py +401 -0
  36. pynecore/core/broker/intent_builder.py +334 -0
  37. pynecore/core/broker/journal.py +1785 -0
  38. pynecore/core/broker/models.py +1600 -0
  39. pynecore/core/broker/native_failsafe_manager.py +1436 -0
  40. pynecore/core/broker/one_way_emulator.py +1128 -0
  41. pynecore/core/broker/position.py +787 -0
  42. pynecore/core/broker/run_identity.py +126 -0
  43. pynecore/core/broker/software_entry_stop_engine.py +351 -0
  44. pynecore/core/broker/software_partial_bracket_engine.py +1379 -0
  45. pynecore/core/broker/spot_inventory.py +1327 -0
  46. pynecore/core/broker/storage.py +2655 -0
  47. pynecore/core/broker/store_helpers.py +2161 -0
  48. pynecore/core/broker/sync_engine.py +16070 -0
  49. pynecore/core/broker/validation.py +382 -0
  50. pynecore/core/class_property.py +7 -0
  51. pynecore/core/config.py +392 -0
  52. pynecore/core/csv_file.py +547 -0
  53. pynecore/core/currency.py +262 -0
  54. pynecore/core/data_converter.py +1002 -0
  55. pynecore/core/datetime.py +296 -0
  56. pynecore/core/download_info.py +71 -0
  57. pynecore/core/download_runner.py +274 -0
  58. pynecore/core/htf_aggregator.py +181 -0
  59. pynecore/core/import_hook.py +358 -0
  60. pynecore/core/instance_state.py +494 -0
  61. pynecore/core/live_ltf_collector.py +442 -0
  62. pynecore/core/live_ltf_window.py +189 -0
  63. pynecore/core/live_runner.py +1347 -0
  64. pynecore/core/module_property.py +26 -0
  65. pynecore/core/ohlcv_file.py +1888 -0
  66. pynecore/core/overload.py +371 -0
  67. pynecore/core/pine_cast.py +113 -0
  68. pynecore/core/pine_export.py +95 -0
  69. pynecore/core/pine_method.py +244 -0
  70. pynecore/core/pine_range.py +86 -0
  71. pynecore/core/pine_udt.py +69 -0
  72. pynecore/core/plugin/__init__.py +394 -0
  73. pynecore/core/plugin/broker.py +781 -0
  74. pynecore/core/plugin/cli.py +96 -0
  75. pynecore/core/plugin/live_provider.py +208 -0
  76. pynecore/core/plugin/provider.py +331 -0
  77. pynecore/core/provider_string.py +148 -0
  78. pynecore/core/random.py +40 -0
  79. pynecore/core/resampler.py +686 -0
  80. pynecore/core/safe_convert.py +64 -0
  81. pynecore/core/script.py +1011 -0
  82. pynecore/core/script_runner.py +3202 -0
  83. pynecore/core/security.py +1749 -0
  84. pynecore/core/security_process.py +1253 -0
  85. pynecore/core/security_shm.py +456 -0
  86. pynecore/core/series.py +417 -0
  87. pynecore/core/strategy_stats.py +669 -0
  88. pynecore/core/symbol_map.py +134 -0
  89. pynecore/core/syminfo.py +505 -0
  90. pynecore/core/viz.py +591 -0
  91. pynecore/lib/__init__.py +1771 -0
  92. pynecore/lib/_fixnan.py +32 -0
  93. pynecore/lib/_math_stateful.py +202 -0
  94. pynecore/lib/_timeframe_change.py +101 -0
  95. pynecore/lib/adjustment.py +6 -0
  96. pynecore/lib/alert.py +39 -0
  97. pynecore/lib/alert.pyi +14 -0
  98. pynecore/lib/array.py +1051 -0
  99. pynecore/lib/barmerge.py +60 -0
  100. pynecore/lib/barstate.py +30 -0
  101. pynecore/lib/box.py +415 -0
  102. pynecore/lib/chart.py +128 -0
  103. pynecore/lib/color.py +152 -0
  104. pynecore/lib/color.pyi +50 -0
  105. pynecore/lib/currency.py +62 -0
  106. pynecore/lib/dayofweek.py +36 -0
  107. pynecore/lib/dayofweek.pyi +18 -0
  108. pynecore/lib/display.py +8 -0
  109. pynecore/lib/dividends.py +9 -0
  110. pynecore/lib/earnings.py +11 -0
  111. pynecore/lib/extend.py +6 -0
  112. pynecore/lib/font.py +5 -0
  113. pynecore/lib/footprint.py +79 -0
  114. pynecore/lib/format.py +11 -0
  115. pynecore/lib/hline.py +67 -0
  116. pynecore/lib/hline.pyi +24 -0
  117. pynecore/lib/label.py +409 -0
  118. pynecore/lib/line.py +433 -0
  119. pynecore/lib/linefill.py +93 -0
  120. pynecore/lib/location.py +11 -0
  121. pynecore/lib/log.py +362 -0
  122. pynecore/lib/map.py +150 -0
  123. pynecore/lib/math.py +385 -0
  124. pynecore/lib/matrix.py +708 -0
  125. pynecore/lib/order.py +8 -0
  126. pynecore/lib/pivotpointtype.py +8 -0
  127. pynecore/lib/plot.py +95 -0
  128. pynecore/lib/plot.pyi +33 -0
  129. pynecore/lib/polyline.py +91 -0
  130. pynecore/lib/position.py +15 -0
  131. pynecore/lib/request.py +281 -0
  132. pynecore/lib/runtime.py +5 -0
  133. pynecore/lib/scale.py +9 -0
  134. pynecore/lib/session.py +267 -0
  135. pynecore/lib/session.pyi +12 -0
  136. pynecore/lib/shape.py +18 -0
  137. pynecore/lib/size.py +12 -0
  138. pynecore/lib/splits.py +4 -0
  139. pynecore/lib/strategy/__init__.py +4778 -0
  140. pynecore/lib/strategy/closedtrades.py +347 -0
  141. pynecore/lib/strategy/closedtrades.pyi +53 -0
  142. pynecore/lib/strategy/commission.py +9 -0
  143. pynecore/lib/strategy/direction.py +9 -0
  144. pynecore/lib/strategy/oca.py +13 -0
  145. pynecore/lib/strategy/opentrades.py +281 -0
  146. pynecore/lib/strategy/opentrades.pyi +49 -0
  147. pynecore/lib/strategy/risk.py +109 -0
  148. pynecore/lib/string.py +649 -0
  149. pynecore/lib/syminfo.py +84 -0
  150. pynecore/lib/ta.py +2230 -0
  151. pynecore/lib/table.py +290 -0
  152. pynecore/lib/text.py +17 -0
  153. pynecore/lib/ticker.py +207 -0
  154. pynecore/lib/timeframe.py +293 -0
  155. pynecore/lib/volume_row.py +67 -0
  156. pynecore/lib/xloc.py +4 -0
  157. pynecore/lib/yloc.py +5 -0
  158. pynecore/providers/__init__.py +0 -0
  159. pynecore/providers/ccxt.py +664 -0
  160. pynecore/providers/replay.py +187 -0
  161. pynecore/pynesys/__init__.py +0 -0
  162. pynecore/pynesys/api.py +498 -0
  163. pynecore/pynesys/compiler.py +112 -0
  164. pynecore/standalone.py +99 -0
  165. pynecore/testing/__init__.py +1 -0
  166. pynecore/testing/broker_lab/__init__.py +41 -0
  167. pynecore/testing/broker_lab/__main__.py +5 -0
  168. pynecore/testing/broker_lab/cli.py +87 -0
  169. pynecore/testing/broker_lab/generate.py +47 -0
  170. pynecore/testing/broker_lab/model.py +84 -0
  171. pynecore/testing/broker_lab/reference.py +645 -0
  172. pynecore/testing/broker_lab/runner.py +372 -0
  173. pynecore/testing/broker_lab/scheduler.py +50 -0
  174. pynecore/testing/broker_lab/subprocess.py +73 -0
  175. pynecore/transformers/__init__.py +0 -0
  176. pynecore/transformers/builtin_shadow.py +136 -0
  177. pynecore/transformers/closure_arguments_transformer.py +428 -0
  178. pynecore/transformers/display_rewrite.py +140 -0
  179. pynecore/transformers/dynamic_default.py +147 -0
  180. pynecore/transformers/function_isolation.py +757 -0
  181. pynecore/transformers/import_lifter.py +61 -0
  182. pynecore/transformers/import_normalizer.py +328 -0
  183. pynecore/transformers/inline_series_hoist.py +178 -0
  184. pynecore/transformers/input_transformer.py +175 -0
  185. pynecore/transformers/lib_series.py +201 -0
  186. pynecore/transformers/locations.py +70 -0
  187. pynecore/transformers/module_properties.json +3387 -0
  188. pynecore/transformers/module_property.py +221 -0
  189. pynecore/transformers/ne_guard.py +70 -0
  190. pynecore/transformers/persistent.py +320 -0
  191. pynecore/transformers/persistent_series.py +76 -0
  192. pynecore/transformers/safe_convert_transformer.py +97 -0
  193. pynecore/transformers/safe_division_transformer.py +95 -0
  194. pynecore/transformers/script_requirements.py +308 -0
  195. pynecore/transformers/security.py +752 -0
  196. pynecore/transformers/security_instantiation.py +274 -0
  197. pynecore/transformers/series.py +275 -0
  198. pynecore/transformers/slot_layout.py +381 -0
  199. pynecore/transformers/type_checking_stripper.py +25 -0
  200. pynecore/transformers/unused_series_detector.py +267 -0
  201. pynecore/types/__init__.py +21 -0
  202. pynecore/types/alert.py +5 -0
  203. pynecore/types/barmerge.py +5 -0
  204. pynecore/types/base.py +39 -0
  205. pynecore/types/box.py +37 -0
  206. pynecore/types/chart.py +17 -0
  207. pynecore/types/color.py +107 -0
  208. pynecore/types/currency.py +5 -0
  209. pynecore/types/datetime.py +6 -0
  210. pynecore/types/display.py +5 -0
  211. pynecore/types/dividends.py +5 -0
  212. pynecore/types/earnings.py +5 -0
  213. pynecore/types/extend.py +5 -0
  214. pynecore/types/font.py +5 -0
  215. pynecore/types/footprint.py +41 -0
  216. pynecore/types/format.py +5 -0
  217. pynecore/types/hline.py +24 -0
  218. pynecore/types/ib_persistent.py +8 -0
  219. pynecore/types/ib_persistent.pyi +10 -0
  220. pynecore/types/label.py +35 -0
  221. pynecore/types/line.py +32 -0
  222. pynecore/types/linefill.py +13 -0
  223. pynecore/types/location.py +5 -0
  224. pynecore/types/matrix.py +999 -0
  225. pynecore/types/na.py +237 -0
  226. pynecore/types/na.pyi +83 -0
  227. pynecore/types/ohlcv.py +12 -0
  228. pynecore/types/order.py +5 -0
  229. pynecore/types/persistent.py +8 -0
  230. pynecore/types/persistent.pyi +13 -0
  231. pynecore/types/pine_types.py +11 -0
  232. pynecore/types/pine_types.pyi +15 -0
  233. pynecore/types/pivotpointtype.py +5 -0
  234. pynecore/types/plot.py +12 -0
  235. pynecore/types/plot_meta.py +60 -0
  236. pynecore/types/polyline.py +40 -0
  237. pynecore/types/position.py +5 -0
  238. pynecore/types/scale.py +5 -0
  239. pynecore/types/script_type.py +15 -0
  240. pynecore/types/series.py +23 -0
  241. pynecore/types/series.pyi +19 -0
  242. pynecore/types/session.py +35 -0
  243. pynecore/types/shape.py +5 -0
  244. pynecore/types/size.py +5 -0
  245. pynecore/types/source.py +33 -0
  246. pynecore/types/splits.py +5 -0
  247. pynecore/types/strategy.py +45 -0
  248. pynecore/types/table.py +87 -0
  249. pynecore/types/text.py +13 -0
  250. pynecore/types/type_checker.py +7 -0
  251. pynecore/types/type_checker.pyi +48 -0
  252. pynecore/types/volume_row.py +36 -0
  253. pynecore/types/weekdays.py +11 -0
  254. pynecore/types/xloc.py +5 -0
  255. pynecore/types/yloc.py +5 -0
  256. pynecore/utils/__init__.py +0 -0
  257. pynecore/utils/file_utils.py +50 -0
  258. pynecore/utils/rich/__init__.py +0 -0
  259. pynecore/utils/rich/date_column.py +25 -0
  260. pynecore/utils/sequence_view.py +92 -0
  261. pynecore/utils/stdlib_checker.py +17 -0
@@ -0,0 +1,198 @@
1
+ import os
2
+ import tomllib
3
+ import time
4
+ from pathlib import Path
5
+ from datetime import datetime
6
+
7
+ import typer
8
+ from rich.console import Console
9
+ from rich.progress import Progress, SpinnerColumn, TextColumn
10
+ from rich.table import Table
11
+
12
+ from ..app import app, app_state
13
+ from ..utils.api_error_handler import APIErrorHandler
14
+ from pynecore.pynesys.compiler import PyneComp
15
+ from ...utils.file_utils import copy_mtime
16
+
17
+ __all__ = []
18
+
19
+ console = Console()
20
+
21
+
22
+ def _print_usage(compiler: PyneComp, sleep: float = 0):
23
+ """Print usage statistics in a nicely formatted table."""
24
+ usage = compiler.get_usage()
25
+
26
+ # Create the main usage table
27
+ table = Table(title="API Usage Statistics", show_header=True, header_style="bold magenta")
28
+ table.add_column("Period", style="cyan", no_wrap=True)
29
+ table.add_column("Used", style="bold red", justify="right")
30
+ table.add_column("Limit", style="bold green", justify="right")
31
+ table.add_column("Remaining", style="bold yellow", justify="right")
32
+ table.add_column("Reset At", style="dim")
33
+
34
+ # Add daily usage
35
+ table.add_row(
36
+ "Daily",
37
+ str(usage.daily.used),
38
+ str(usage.daily.limit),
39
+ str(usage.daily.remaining),
40
+ usage.daily.reset_at.strftime("%Y-%m-%d %H:%M:%S UTC")
41
+ )
42
+
43
+ # Add hourly usage
44
+ table.add_row(
45
+ "Hourly",
46
+ str(usage.hourly.used),
47
+ str(usage.hourly.limit),
48
+ str(usage.hourly.remaining),
49
+ usage.hourly.reset_at.strftime("%Y-%m-%d %H:%M:%S UTC")
50
+ )
51
+
52
+ console.print(table)
53
+
54
+ # Show API key expiration information
55
+ try:
56
+ # Sleep to wait for usage is saved in the background of the DB
57
+ if sleep > 0:
58
+ time.sleep(sleep)
59
+
60
+ token_info = compiler.validate_api_key()
61
+ if token_info.valid and token_info.expiration:
62
+ print()
63
+ expiry_table = Table(title="API Key Information", show_header=True, header_style="bold magenta")
64
+ expiry_table.add_column("Property", style="cyan", no_wrap=True)
65
+ expiry_table.add_column("Value", style="white")
66
+
67
+ # Calculate days remaining
68
+ now = datetime.now()
69
+ days_remaining = (token_info.expiration - now).days
70
+ hours_remaining = (token_info.expiration - now).total_seconds() / 3600
71
+
72
+ # Format expiration time
73
+ expiry_str = token_info.expiration.strftime("%Y-%m-%d %H:%M:%S")
74
+
75
+ # Add rows
76
+ expiry_table.add_row("Expires At", expiry_str)
77
+
78
+ if days_remaining > 0:
79
+ expiry_table.add_row("Days Remaining", f"{days_remaining} days")
80
+ elif hours_remaining > 0:
81
+ expiry_table.add_row("Hours Remaining", f"{hours_remaining:.1f} hours")
82
+ else:
83
+ expiry_table.add_row("Status", "[red]EXPIRED[/red]")
84
+
85
+ console.print(expiry_table)
86
+ except (AttributeError, ValueError, TypeError) as e:
87
+ print()
88
+ console.print(f"[yellow]⚠[/yellow] Could not validate API key expiration: {str(e)}")
89
+ console.print("[dim]API key information unavailable[/dim]")
90
+
91
+
92
+ # noinspection PyShadowingBuiltins
93
+ @app.command()
94
+ def compile(
95
+ script: Path = typer.Argument(
96
+ None, file_okay=True, dir_okay=False,
97
+ help="Path to Pine Script file (.pine extension) or name of script in [cyan]scripts[/cyan] directory"
98
+ ),
99
+ output: Path | None = typer.Option(
100
+ None, "--output", "-o",
101
+ help="Output Python file path (defaults to same name with .py extension)"
102
+ ),
103
+ strict: bool = typer.Option(
104
+ False, "--strict", '-s',
105
+ help="Enable strict compilation mode with enhanced error checking"
106
+ ),
107
+ force: bool = typer.Option(
108
+ False, "--force", "-f",
109
+ help="Force recompilation even if output file is up-to-date"
110
+ ),
111
+ api_key: str | None = typer.Option(
112
+ None, "--api-key", "-a",
113
+ help="PyneSys API key (overrides configuration file)",
114
+ envvar="PYNESYS_API_KEY"
115
+ ),
116
+ show_usage: bool = typer.Option(
117
+ False, "--usage", "-u",
118
+ help="Print API usage statistics after compilation"
119
+ )
120
+ ):
121
+ """
122
+ Compile Pine Script to Python using PyneSys API.
123
+
124
+ The system automatically searches for the workdir folder in the current and parent directories.
125
+ If not found, it creates or uses a workdir folder in the current directory.
126
+
127
+ Only version 6 is supported (no v4 or v5 support).
128
+ API key can be provided via --api-key or via config file: [cyan]workdir/config/api.toml[/cyan].
129
+
130
+ If no script is provided, will print usage statistics and exit.
131
+ """
132
+
133
+ # Read api.toml configuration
134
+ api_config = {}
135
+ try:
136
+ with open(app_state.config_dir / 'api.toml', 'rb') as f:
137
+ api_config = tomllib.load(f)['api']
138
+ except KeyError:
139
+ console.print("[red]Invalid API config file (api.toml)![/red]")
140
+ raise typer.Exit(1)
141
+ except FileNotFoundError:
142
+ pass
143
+
144
+ # Override API key if provided
145
+ if api_key:
146
+ api_config['api_key'] = api_key
147
+
148
+ # Override API URL if provided via environment variable
149
+ api_url = os.getenv("PYNESYS_API_URL")
150
+ if api_url:
151
+ api_config['base_url'] = api_url
152
+
153
+ # Create the compiler instance
154
+ compiler = PyneComp(**api_config)
155
+
156
+ # Ensure script was provided
157
+ if not script:
158
+ _print_usage(compiler)
159
+ raise typer.Exit(0)
160
+
161
+ # Ensure .py extension
162
+ if script.suffix != ".pine":
163
+ script = script.with_suffix(".pine")
164
+ # Expand script path
165
+ if len(script.parts) == 1:
166
+ script = app_state.scripts_dir / script
167
+
168
+ # Determine output path
169
+ out_path: Path = output if output is not None else script.with_suffix('.py')
170
+
171
+ # Check if compilation is needed (smart compilation)
172
+ if not compiler.needs_compilation(script, out_path) and not force:
173
+ console.print(f"[green]✓[/green] Output file is up-to-date: {output}")
174
+ console.print("[dim]Use --force to recompile anyway[/dim]")
175
+ return
176
+
177
+ # Compile script
178
+ with APIErrorHandler(console):
179
+ with Progress(
180
+ SpinnerColumn(finished_text="[green]✓"),
181
+ TextColumn("[progress.description]{task.description}"),
182
+ console=console
183
+ ) as progress:
184
+ task = progress.add_task("Compiling Pine Script...", total=1)
185
+
186
+ # Compile the .pine file to .py
187
+ out_path = compiler.compile(script, out_path, force=force, strict=strict)
188
+
189
+ progress.update(task, completed=1)
190
+
191
+ # Preserve modification time from source file
192
+ copy_mtime(script, out_path)
193
+
194
+ console.print(f"The compiled script is located at: [cyan]{out_path}[/cyan]")
195
+
196
+ if show_usage:
197
+ print()
198
+ _print_usage(compiler, 1.0)