tse-dara 0.3.1a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. tse_dara-0.3.1a1/BUNDLE.json +20 -0
  2. tse_dara-0.3.1a1/CHANGELOG.md +43 -0
  3. tse_dara-0.3.1a1/INSTALL_WINDOWS.bat +10 -0
  4. tse_dara-0.3.1a1/LICENSE +21 -0
  5. tse_dara-0.3.1a1/MANIFEST.in +18 -0
  6. tse_dara-0.3.1a1/PATCH_NOTES_FA.md +26 -0
  7. tse_dara-0.3.1a1/PKG-INFO +130 -0
  8. tse_dara-0.3.1a1/README.md +97 -0
  9. tse_dara-0.3.1a1/README_FA.md +177 -0
  10. tse_dara-0.3.1a1/SECURITY.md +33 -0
  11. tse_dara-0.3.1a1/START_HERE_FA.html +278 -0
  12. tse_dara-0.3.1a1/THIRD_PARTY_NOTICES.md +44 -0
  13. tse_dara-0.3.1a1/docs/API_REFERENCE.md +921 -0
  14. tse_dara-0.3.1a1/docs/API_REFERENCE_FA.md +1025 -0
  15. tse_dara-0.3.1a1/docs/ARCHITECTURE_FA.md +69 -0
  16. tse_dara-0.3.1a1/docs/BASELINE_METADATA.json +4 -0
  17. tse_dara-0.3.1a1/docs/BLUEPRINT_DATA_COVERAGE.json +992 -0
  18. tse_dara-0.3.1a1/docs/BLUEPRINT_DATA_COVERAGE.md +97 -0
  19. tse_dara-0.3.1a1/docs/DATA_REVIEW_REPORT_FA.html +3874 -0
  20. tse_dara-0.3.1a1/docs/HISTORY_SCHEMA.md +73 -0
  21. tse_dara-0.3.1a1/docs/IMPLEMENTED_MODELS.json +777 -0
  22. tse_dara-0.3.1a1/docs/IMPLEMENTED_SCHEMAS.json +856 -0
  23. tse_dara-0.3.1a1/docs/INDEX.md +19 -0
  24. tse_dara-0.3.1a1/docs/MODELS_REFERENCE_FA.md +216 -0
  25. tse_dara-0.3.1a1/docs/PART2_API.md +93 -0
  26. tse_dara-0.3.1a1/docs/PART2_LIMITS.md +40 -0
  27. tse_dara-0.3.1a1/docs/PART2_SOURCES.json +27 -0
  28. tse_dara-0.3.1a1/docs/PART3_API.md +89 -0
  29. tse_dara-0.3.1a1/docs/PART3_SIGNATURES.json +134 -0
  30. tse_dara-0.3.1a1/docs/PART3_SOURCES.json +12 -0
  31. tse_dara-0.3.1a1/docs/PART3_STORAGE_SCHEMA.md +25 -0
  32. tse_dara-0.3.1a1/docs/ROADMAP_FA.md +47 -0
  33. tse_dara-0.3.1a1/docs/ROADMAP_REVIEW_FA.md +81 -0
  34. tse_dara-0.3.1a1/docs/SOURCES.md +45 -0
  35. tse_dara-0.3.1a1/docs/design_traceability.json +26 -0
  36. tse_dara-0.3.1a1/docs/design_v0_2/00_README_FA.md +47 -0
  37. tse_dara-0.3.1a1/docs/design_v0_2/00_TYPES_AND_CONVENTIONS_FA.md +1094 -0
  38. tse_dara-0.3.1a1/docs/design_v0_2/01_ARCHITECTURE_FA.md +295 -0
  39. tse_dara-0.3.1a1/docs/design_v0_2/02_REFERENCE_LIBRARIES_FA.md +3447 -0
  40. tse_dara-0.3.1a1/docs/design_v0_2/03_DATA_API_FA.md +2591 -0
  41. tse_dara-0.3.1a1/docs/design_v0_2/04_ANALYTICS_API_FA.md +614 -0
  42. tse_dara-0.3.1a1/docs/design_v0_2/05_ML_API_FA.md +450 -0
  43. tse_dara-0.3.1a1/docs/design_v0_2/06_STORAGE_AND_POINT_IN_TIME_FA.md +148 -0
  44. tse_dara-0.3.1a1/docs/design_v0_2/07_ROADMAP_FA.md +233 -0
  45. tse_dara-0.3.1a1/docs/design_v0_2/08_REQUIREMENTS_AND_MIGRATION_FA.md +89 -0
  46. tse_dara-0.3.1a1/docs/design_v0_2/09_COMPARISON_AND_EVIDENCE_FA.md +52 -0
  47. tse_dara-0.3.1a1/docs/design_v0_2/10_INTERNAL_INTERFACES_FA.md +291 -0
  48. tse_dara-0.3.1a1/docs/design_v0_2/11_EXCEPTIONS_FA.md +58 -0
  49. tse_dara-0.3.1a1/docs/design_v0_2/12_SOURCES_AND_LIMITS_FA.md +93 -0
  50. tse_dara-0.3.1a1/docs/design_v0_2/13_EXAMPLES_FA.md +70 -0
  51. tse_dara-0.3.1a1/docs/design_v0_2/COMPLETE_REFERENCE_FA.md +9628 -0
  52. tse_dara-0.3.1a1/docs/design_v0_2/EXTRACTION_AUDIT.json +81 -0
  53. tse_dara-0.3.1a1/docs/design_v0_2/PLANNING_ONLY.md +10 -0
  54. tse_dara-0.3.1a1/docs/design_v0_2/READABLE_REPORT.html +13770 -0
  55. tse_dara-0.3.1a1/docs/design_v0_2/USER_SUPPLIED_REPORT.html +13770 -0
  56. tse_dara-0.3.1a1/docs/design_v0_2/comparison_matrix.json +226 -0
  57. tse_dara-0.3.1a1/docs/design_v0_2/internal_contracts.json +466 -0
  58. tse_dara-0.3.1a1/docs/design_v0_2/legacy_task_map.json +623 -0
  59. tse_dara-0.3.1a1/docs/design_v0_2/manifest.json +165 -0
  60. tse_dara-0.3.1a1/docs/design_v0_2/models_and_schemas.json +1011 -0
  61. tse_dara-0.3.1a1/docs/design_v0_2/official_endpoint_registry.json +584 -0
  62. tse_dara-0.3.1a1/docs/design_v0_2/public_api_contracts.json +9866 -0
  63. tse_dara-0.3.1a1/docs/design_v0_2/qa_report.json +38 -0
  64. tse_dara-0.3.1a1/docs/design_v0_2/reference_source_catalog.json +2552 -0
  65. tse_dara-0.3.1a1/docs/design_v0_2/requirements_traceability.json +472 -0
  66. tse_dara-0.3.1a1/docs/design_v0_2/roadmap.json +517 -0
  67. tse_dara-0.3.1a1/docs/design_v0_2/sources.json +86 -0
  68. tse_dara-0.3.1a1/docs/history/PART3_PATCH_NOTES_FA.md +7 -0
  69. tse_dara-0.3.1a1/docs/history/PART3_README.md +58 -0
  70. tse_dara-0.3.1a1/docs/history/PART3_README_FA.md +14 -0
  71. tse_dara-0.3.1a1/docs/history/PART3_START_HERE_FA.html +14 -0
  72. tse_dara-0.3.1a1/docs/history/release_0_3_0a2/PATCH_NOTES_FA.md +15 -0
  73. tse_dara-0.3.1a1/docs/history/release_0_3_0a2/README.md +90 -0
  74. tse_dara-0.3.1a1/docs/history/release_0_3_0a2/README_FA.md +54 -0
  75. tse_dara-0.3.1a1/docs/history/release_0_3_0a2/START_HERE_FA.html +12 -0
  76. tse_dara-0.3.1a1/examples/01_offline_demo.ipynb +209 -0
  77. tse_dara-0.3.1a1/examples/02_live_quote.ipynb +142 -0
  78. tse_dara-0.3.1a1/examples/03_history_offline.ipynb +226 -0
  79. tse_dara-0.3.1a1/examples/04_history_live.ipynb +183 -0
  80. tse_dara-0.3.1a1/examples/05_history_async.ipynb +138 -0
  81. tse_dara-0.3.1a1/examples/06_files_offline.ipynb +137 -0
  82. tse_dara-0.3.1a1/examples/07_history_store_sync.ipynb +153 -0
  83. tse_dara-0.3.1a1/examples/08_part3_live.ipynb +131 -0
  84. tse_dara-0.3.1a1/examples/09_part3_async.ipynb +127 -0
  85. tse_dara-0.3.1a1/examples/10_data_usability_offline.ipynb +210 -0
  86. tse_dara-0.3.1a1/examples/11_pandas_validation.ipynb +155 -0
  87. tse_dara-0.3.1a1/examples/12_data_review_live.ipynb +138 -0
  88. tse_dara-0.3.1a1/examples/async_example.py +12 -0
  89. tse_dara-0.3.1a1/install.py +105 -0
  90. tse_dara-0.3.1a1/pyproject.toml +46 -0
  91. tse_dara-0.3.1a1/setup.cfg +4 -0
  92. tse_dara-0.3.1a1/src/tse_dara/__init__.py +13 -0
  93. tse_dara-0.3.1a1/src/tse_dara/_core/__init__.py +1 -0
  94. tse_dara-0.3.1a1/src/tse_dara/_core/exceptions.py +117 -0
  95. tse_dara-0.3.1a1/src/tse_dara/_core/models.py +184 -0
  96. tse_dara-0.3.1a1/src/tse_dara/analytics/__init__.py +2 -0
  97. tse_dara-0.3.1a1/src/tse_dara/data/__init__.py +197 -0
  98. tse_dara-0.3.1a1/src/tse_dara/data/api_catalog.json +2134 -0
  99. tse_dara-0.3.1a1/src/tse_dara/data/async_client.py +257 -0
  100. tse_dara-0.3.1a1/src/tse_dara/data/client.py +253 -0
  101. tse_dara-0.3.1a1/src/tse_dara/data/config.py +153 -0
  102. tse_dara-0.3.1a1/src/tse_dara/data/dates.py +120 -0
  103. tse_dara-0.3.1a1/src/tse_dara/data/engine.py +184 -0
  104. tse_dara-0.3.1a1/src/tse_dara/data/frames.py +90 -0
  105. tse_dara-0.3.1a1/src/tse_dara/data/history.py +254 -0
  106. tse_dara-0.3.1a1/src/tse_dara/data/history_models.py +17 -0
  107. tse_dara-0.3.1a1/src/tse_dara/data/io.py +293 -0
  108. tse_dara-0.3.1a1/src/tse_dara/data/pandas_tools.py +430 -0
  109. tse_dara-0.3.1a1/src/tse_dara/data/providers/__init__.py +1 -0
  110. tse_dara-0.3.1a1/src/tse_dara/data/providers/history.py +169 -0
  111. tse_dara-0.3.1a1/src/tse_dara/data/providers/public.py +338 -0
  112. tse_dara-0.3.1a1/src/tse_dara/data/reference.py +20 -0
  113. tse_dara-0.3.1a1/src/tse_dara/data/samples/__init__.py +52 -0
  114. tse_dara-0.3.1a1/src/tse_dara/data/samples/fixtures.json +44 -0
  115. tse_dara-0.3.1a1/src/tse_dara/data/samples/history_fixture.json +112 -0
  116. tse_dara-0.3.1a1/src/tse_dara/data/services.py +103 -0
  117. tse_dara-0.3.1a1/src/tse_dara/data/storage/__init__.py +1 -0
  118. tse_dara-0.3.1a1/src/tse_dara/data/storage/codec.py +292 -0
  119. tse_dara-0.3.1a1/src/tse_dara/data/storage/contracts.py +11 -0
  120. tse_dara-0.3.1a1/src/tse_dara/data/storage/history_store.py +329 -0
  121. tse_dara-0.3.1a1/src/tse_dara/data/storage/sqlite.py +362 -0
  122. tse_dara-0.3.1a1/src/tse_dara/data/sync.py +170 -0
  123. tse_dara-0.3.1a1/src/tse_dara/data/transport.py +261 -0
  124. tse_dara-0.3.1a1/src/tse_dara/exceptions.py +2 -0
  125. tse_dara-0.3.1a1/src/tse_dara/ml/__init__.py +2 -0
  126. tse_dara-0.3.1a1/src/tse_dara/py.typed +0 -0
  127. tse_dara-0.3.1a1/src/tse_dara.egg-info/PKG-INFO +130 -0
  128. tse_dara-0.3.1a1/src/tse_dara.egg-info/SOURCES.txt +149 -0
  129. tse_dara-0.3.1a1/src/tse_dara.egg-info/dependency_links.txt +1 -0
  130. tse_dara-0.3.1a1/src/tse_dara.egg-info/requires.txt +22 -0
  131. tse_dara-0.3.1a1/src/tse_dara.egg-info/top_level.txt +1 -0
  132. tse_dara-0.3.1a1/tests/conftest.py +19 -0
  133. tse_dara-0.3.1a1/tests/test_async.py +110 -0
  134. tse_dara-0.3.1a1/tests/test_contracts.py +200 -0
  135. tse_dara-0.3.1a1/tests/test_data_usability.py +323 -0
  136. tse_dara-0.3.1a1/tests/test_dates.py +39 -0
  137. tse_dara-0.3.1a1/tests/test_file_roundtrips.py +201 -0
  138. tse_dara-0.3.1a1/tests/test_history.py +367 -0
  139. tse_dara-0.3.1a1/tests/test_history_repository.py +257 -0
  140. tse_dara-0.3.1a1/tests/test_storage.py +234 -0
  141. tse_dara-0.3.1a1/tests/test_unified_bundle.py +115 -0
  142. tse_dara-0.3.1a1/tests/test_wire_and_parsing.py +194 -0
  143. tse_dara-0.3.1a1/tools/build.py +11 -0
  144. tse_dara-0.3.1a1/tools/check_data_usability.py +66 -0
  145. tse_dara-0.3.1a1/tools/check_history.py +103 -0
  146. tse_dara-0.3.1a1/tools/check_installation.py +41 -0
  147. tse_dara-0.3.1a1/tools/check_part3.py +76 -0
  148. tse_dara-0.3.1a1/tools/generate_api_reference.py +149 -0
  149. tse_dara-0.3.1a1/tools/generate_release_docs.py +202 -0
  150. tse_dara-0.3.1a1/tools/update_bundle.py +26 -0
  151. tse_dara-0.3.1a1/tools/verify_installation.py +50 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "bundle": "unified-data-usability-review",
3
+ "bundle_revision": 3,
4
+ "package_version": "0.3.1a1",
5
+ "wheel": "dist/tse_dara-0.3.1a1-py3-none-any.whl",
6
+ "wheel_sha256": "ed9225ce531b58bd2f9e360454f466e1d10d416e3aeea0356914e056f7253295",
7
+ "extras": [
8
+ "files",
9
+ "notebook"
10
+ ],
11
+ "minimum_python": [
12
+ 3,
13
+ 12
14
+ ],
15
+ "runtime_code_changed": true,
16
+ "runtime_files_matched": 31,
17
+ "source_archive": "TSE_Dara_Unified_v0.3.0a2_Windows_fix.zip",
18
+ "source_archive_sha256": "b6448adf0da23e7c3fdbeb44314a259d208736a744e094fca1f8048d4b888cd4",
19
+ "scope": "data only; no analytics or ML implementation added"
20
+ }
@@ -0,0 +1,43 @@
1
+ # 0.3.1a1 — Data interface/Pandas review
2
+
3
+ - Preserve the unified 0.3.0a2 runtime, cache schema and Windows fsync fix.
4
+ - Add single-row DataFrame getters, safe ordered Pandas batch inputs and explicit freshness helpers.
5
+ - Add local schema, validation, canonical normalization, column selection, metadata and synthetic-data tools.
6
+ - Add lazy module configuration, real signature documentation and per-blueprint-contract status mapping.
7
+ - Preserve strict identity, stale-data warnings and independent best-effort autosave.
8
+ - Stabilize timestamp units and archive string storage; improve input validation.
9
+ - Add offline usage notebooks and regression tests. Analytics/ML and unverified market endpoints are not added.
10
+
11
+ ## 0.3.0a2 - Windows file export hotfix
12
+
13
+ - Fix Windows `OSError: [Errno 9] Bad file descriptor` during CSV/Excel/Parquet export by opening temporary files with a writable handle before `os.fsync`.
14
+ - No SQLite data migration; previously persisted data is untouched.
15
+
16
+ # Changelog
17
+
18
+ ## Unified bundle revision 1 (runtime remains 0.3.0a1)
19
+
20
+ - Combined Parts 1-3 in one root folder and retained only the current wheel.
21
+ - Added a single environment-aware installer for files/notebook extras.
22
+ - Added wheel checksum verification and post-install import/API checks.
23
+ - Fixed stale 0.2.0a1 assertions in notebooks 03 and 04; cleared saved outputs.
24
+ - Included the full v0.2 architecture/comparison reference, labelled planning-only.
25
+ - Preserved runtime bytes and prior raw-cache/database behavior unchanged.
26
+ - Separated current verification from historical reports.
27
+
28
+ ## 0.3.0a1 - Data Part 3
29
+
30
+ - Added explicit save/load for self-describing CSV, Excel, Parquet and SQLite snapshots.
31
+ - Added safe typed DataFrame codec, checksums, literal spreadsheet text and overwrite protection.
32
+ - Added versioned per-day SQLite index using the existing bounded background writer.
33
+ - Preserved old raw-cache schema/path. Added explicit, resumable offline reindexing.
34
+ - Added stored-history reads, revision/status reports and locally observed as-of snapshots.
35
+ - Added explicit sync_history: initial full, subsequent tail with overlap, full fallback and periodic full audits.
36
+ - Sync and Async share normalizers, storage code and sync planning.
37
+ - Existing quote/history functions remain compatible; normal get_history does not wait for persistence.
38
+ - Excel and Parquet engines are optional and lazy. No computed adjustments, analytics, ML or PostgreSQL added.
39
+
40
+ ## Previous releases
41
+
42
+ Parts 1 and 2 source behavior is retained and exercised by the original 189 tests.
43
+ See the previous-part docs for their original release scope. Current limits are in PART3_API.md.
@@ -0,0 +1,10 @@
1
+ @echo off
2
+ setlocal
3
+ if not defined CONDA_PREFIX if not defined VIRTUAL_ENV (
4
+ echo Activate your project environment in Anaconda Prompt first.
5
+ echo Then run: python install.py
6
+ exit /b 2
7
+ )
8
+ python "%~dp0install.py" %*
9
+ set "RESULT=%ERRORLEVEL%"
10
+ endlocal & exit /b %RESULT%
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 tse-dara contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,18 @@
1
+ include LICENSE README.md README_FA.md CHANGELOG.md SECURITY.md
2
+ recursive-include docs *.md *.json
3
+ recursive-include tests *.py
4
+ recursive-include examples *.ipynb *.py
5
+ recursive-include tools *.py
6
+ recursive-include src *.json py.typed
7
+ exclude *.sqlite3
8
+
9
+ include THIRD_PARTY_NOTICES.md
10
+ recursive-include docs *.md *.json
11
+ recursive-include tools *.py
12
+
13
+ include START_HERE_FA.html PATCH_NOTES_FA.md
14
+
15
+ include INSTALL_WINDOWS.bat
16
+
17
+ recursive-include docs *.html
18
+ include install.py BUNDLE.json
@@ -0,0 +1,26 @@
1
+ # یادداشت نسخه 0.3.1a1
2
+
3
+ این نسخه ادامه بسته یکپارچه 0.3.0a2 و متمرکز بر بخش data است؛ نه اعلام تکمیل همه توابع نقشه راه.
4
+
5
+ ## تغییرات واقعی
6
+
7
+ - پذیرش Series، Index و آرایه یک‌بعدی در دریافت گروهی؛ حفظ ترتیب و تکرار و رد داده نامعتبر پیش از شبکه.
8
+ - get_quote_frame و get_instrument_frame برای DataFrame مستقیم.
9
+ - FetchPolicy.offline/fresh و پذیرش رشته‌های صریح auto/online/offline؛ اجازه stale همچنان مستقل و صریح است.
10
+ - configure/get_config بدون ساخت پایگاه یا شبکه؛ تغییر تنظیمات کلاینت فعال نیاز به close صریح دارد.
11
+ - schema_info، validate_data، normalize_data، validate، normalize، select_columns، frame_metadata و load_sample.
12
+ - Timestamp روزانه پانداس، تنها بدون ساعت و timezone؛ انواع timestamp خروجی ثابت ns/UTC.
13
+ - مرجع امضاهای اجرایی و قرارداد ستون‌ها؛ شرح مدل‌های واقعی و گزارش شکاف نقشه راه.
14
+ - حفظ اطلاعات backend رشته در codec آرشیو و اعتبارسنجی واضح‌تر پارامترهای فایل و تنظیمات.
15
+
16
+ ## سازگاری
17
+
18
+ کدهای قدیمی get_price/get_quote/get_history/save/load حفظ شده‌اند. اصلاح fsync ویندوز و مقدار صفر insCode در پاسخ قیمت باقی مانده‌اند. پایگاه داده حذف یا جابه‌جا نمی‌شود. پس از نصب، Kernel را Restart کنید.
19
+
20
+ ## دامنه
21
+
22
+ normalize با source='canonical' فقط نام‌های استاندارد فعلی را پشتیبانی می‌کند؛ نگاشت raw API جدید اختراع نشده است. ابزارهای validation ساختار را می‌سنجند، نه صحت اقتصادی یا نشت اطلاعات آینده را. get_instruments/دیده‌بان/شاخص/حقیقی‌حقوقی/تعدیل/رسمی هنوز مرحله بعدند. analytics و ml پیاده‌سازی نشده‌اند.
23
+
24
+ ## آزمون
25
+
26
+ نتیجه واقعی آزمون‌های این نسخه در reports/review_031/VERIFICATION.json قرار دارد. محیط آزمون Linux/Python 3.13.5/Pandas 2.2.3 است. Windows/Pandas 3 و اتصال زنده این تحویل جداگانه تأیید نشده‌اند. آزمون Parquet بدون pyarrow اجرا نمی‌شود.
@@ -0,0 +1,130 @@
1
+ Metadata-Version: 2.4
2
+ Name: tse-dara
3
+ Version: 0.3.1a1
4
+ Summary: Direct TSETMC data access: quotes, history, typed exports and resilient versioned local storage
5
+ Author: tse-dara contributors
6
+ License-Expression: MIT
7
+ Classifier: Development Status :: 3 - Alpha
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3 :: Only
10
+ Classifier: Topic :: Office/Business :: Financial
11
+ Requires-Python: >=3.12
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ License-File: THIRD_PARTY_NOTICES.md
15
+ Requires-Dist: httpx<0.29,>=0.27
16
+ Requires-Dist: pandas<4,>=2.2
17
+ Requires-Dist: platformdirs<5,>=4
18
+ Requires-Dist: tzdata>=2024.1
19
+ Provides-Extra: excel
20
+ Requires-Dist: openpyxl<4,>=3.1.5; extra == "excel"
21
+ Provides-Extra: parquet
22
+ Requires-Dist: pyarrow>=19; extra == "parquet"
23
+ Provides-Extra: files
24
+ Requires-Dist: openpyxl<4,>=3.1.5; extra == "files"
25
+ Requires-Dist: pyarrow>=19; extra == "files"
26
+ Provides-Extra: test
27
+ Requires-Dist: pytest<10,>=8; extra == "test"
28
+ Provides-Extra: notebook
29
+ Requires-Dist: ipykernel>=6; extra == "notebook"
30
+ Requires-Dist: nbformat>=5; extra == "notebook"
31
+ Requires-Dist: nbclient>=0.10; extra == "notebook"
32
+ Dynamic: license-file
33
+
34
+ # tse-dara
35
+
36
+ Release **0.3.1a1**, a unified alpha distribution of Parts 1–3 plus a data-interface and Pandas contract review. Direct public TSETMC requests; no runtime dependency on pytse-client or tsetmc.
37
+
38
+ ## Scope
39
+
40
+ Existing quotes, raw daily history, sync/async clients, versioned SQLite history and file archives are preserved. This release adds simple one-row DataFrame getters, ordered Pandas batch input, explicit freshness helpers, local schema/normalization/validation tools, synthetic samples and a reference generated from actual signatures.
41
+
42
+ It does **not** implement analytics, ML, market watch, indices, client-type endpoints, corporate-action adjustment, historical identity chains, official JWT access, or PostgreSQL. The architecture HTML is a plan, not a declaration of supported features. See docs/BLUEPRINT_DATA_COVERAGE.md.
43
+
44
+ ## Install from PyPI
45
+
46
+ Requires Python 3.12 or newer. This is an alpha release; install it explicitly:
47
+
48
+ ```console
49
+ python -m pip install tse-dara==0.3.1a1
50
+ ```
51
+
52
+ Optional Excel/Parquet exports and notebook support:
53
+
54
+ ```console
55
+ python -m pip install "tse-dara[files,notebook]==0.3.1a1"
56
+ ```
57
+
58
+ Import the installed package as `tse_dara`. Restart an existing notebook kernel after installation or upgrade.
59
+
60
+ ## Install from a local release bundle
61
+
62
+ ```console
63
+ python install.py
64
+ ```
65
+
66
+ The installer reads the single local wheel from BUNDLE.json and invokes pip with files/notebook extras. Missing dependencies need internet. Use `python install.py --core-only` explicitly when Excel/Parquet/notebooks are not required. Never delete your Conda environment or cache database to upgrade. Restart the notebook kernel afterwards.
67
+
68
+ The local bundle is not a self-contained offline wheelhouse.
69
+
70
+ ## Examples
71
+
72
+ ```python
73
+ from tse_dara import data
74
+
75
+ # Synthetic teaching data, no external HTTP or database
76
+ df = data.load_sample()
77
+ report = data.validate_data(df)
78
+ compact = data.select_columns(df)
79
+
80
+ # Real data: makes a network request or uses an eligible cache entry
81
+ quote_df = data.get_quote_frame("فولاد")
82
+ history = data.get_history("فولاد", start="1403-01-01",
83
+ end="1403-12-30", calendar="jalali")
84
+
85
+ # Documentation without a network request
86
+ reference = data.api_reference("get_history")
87
+ columns = data.schema_info("daily_bars")
88
+ ```
89
+
90
+ Offline quote use is explicit: `policy=data.FetchPolicy.offline(allow_stale=True)`. The shortcut `policy="offline"` does not permit stale data. Use `FetchPolicy.fresh()` for a network read with max_age=0; online mode alone may use fresh cache.
91
+
92
+ `get_quotes` and `get_history_many` accept a list/tuple, Series, Index or 1D NumPy array. Input order and duplicates are preserved. Null entries are rejected before fetching. Raw numeric strings are not inferred as instrument IDs; use `InstrumentRef.by_ins_code`.
93
+
94
+ ## Persistence
95
+
96
+ Best-effort autosave failures do not invalidate successfully fetched data. A queued receipt is not durable storage. Explicit `save`, `load`, `flush` and `sync_history(wait=True)` report failures. Existing 0.3.0a2 SQLite schemas and cache paths are retained; no destructive migration is introduced.
97
+
98
+ `save/load` use typed Dara archives. Preserve the JSON sidecar with CSV. They are not a generic parser for arbitrary external files. Use Pandas readers with explicit identifier dtypes, then normalize_data with an explicit column mapping for external data. Never treat a floating identifier as recoverable original text.
99
+
100
+ ## References and examples
101
+
102
+ - START_HERE_FA.html: Persian getting-started guide.
103
+ - docs/DATA_REVIEW_REPORT_FA.html: complete current review and actual API/model documentation.
104
+ - docs/API_REFERENCE_FA.md and API_REFERENCE.md: real signatures, defaults, outputs, main exceptions and dependencies.
105
+ - docs/MODELS_REFERENCE_FA.md: actual runtime dataclasses and enums.
106
+ - docs/ROADMAP_REVIEW_FA.md: next data-only stages.
107
+ - docs/design_v0_2/USER_SUPPLIED_REPORT.html: original uploaded architecture, unchanged.
108
+ - examples/10_data_usability_offline.ipynb and 11_pandas_validation.ipynb: new offline notebooks.
109
+ - examples/12_data_review_live.ipynb: optional real-network test, disabled by default.
110
+ - tools/check_data_usability.py: offline check; `--live` explicitly opts into external requests.
111
+
112
+ ## Verification
113
+
114
+ The PyPI preparation checks also run on Windows/Python 3.13.1/Pandas 3.0.6 with Excel and Parquet dependencies installed. See reports/pypi-tests.xml for the local test report and reports/review_031/VERIFICATION.json for historical Linux/Python 3.13.5/Pandas 2.2.3 checks and limitations. Python 3.14 is not verified by this local run. Parquet tests require pyarrow; skipped tests are not successes. The GitHub matrix is supplied configuration. Historical reports are preserved in separate directories.
115
+
116
+ Structural validation does not establish source accuracy, historical coverage, official publication time or absence of all forms of future-data leakage. No live-price number is bundled as a current quote.
117
+
118
+ ## Development
119
+
120
+ ```console
121
+ python -m pip install -e ".[test,notebook]"
122
+ python tools/generate_api_reference.py
123
+ python tools/build.py
124
+ python tools/update_bundle.py
125
+ python -m pytest -q
126
+ ```
127
+
128
+ Generating the optional HTML documentation requires mistune, a documentation-only dependency, not a runtime dependency. Retain exactly one current wheel under dist/.
129
+
130
+ License: MIT; third-party notices are in THIRD_PARTY_NOTICES.md. Data-access and redistribution rights are separate from the code license.
@@ -0,0 +1,97 @@
1
+ # tse-dara
2
+
3
+ Release **0.3.1a1**, a unified alpha distribution of Parts 1–3 plus a data-interface and Pandas contract review. Direct public TSETMC requests; no runtime dependency on pytse-client or tsetmc.
4
+
5
+ ## Scope
6
+
7
+ Existing quotes, raw daily history, sync/async clients, versioned SQLite history and file archives are preserved. This release adds simple one-row DataFrame getters, ordered Pandas batch input, explicit freshness helpers, local schema/normalization/validation tools, synthetic samples and a reference generated from actual signatures.
8
+
9
+ It does **not** implement analytics, ML, market watch, indices, client-type endpoints, corporate-action adjustment, historical identity chains, official JWT access, or PostgreSQL. The architecture HTML is a plan, not a declaration of supported features. See docs/BLUEPRINT_DATA_COVERAGE.md.
10
+
11
+ ## Install from PyPI
12
+
13
+ Requires Python 3.12 or newer. This is an alpha release; install it explicitly:
14
+
15
+ ```console
16
+ python -m pip install tse-dara==0.3.1a1
17
+ ```
18
+
19
+ Optional Excel/Parquet exports and notebook support:
20
+
21
+ ```console
22
+ python -m pip install "tse-dara[files,notebook]==0.3.1a1"
23
+ ```
24
+
25
+ Import the installed package as `tse_dara`. Restart an existing notebook kernel after installation or upgrade.
26
+
27
+ ## Install from a local release bundle
28
+
29
+ ```console
30
+ python install.py
31
+ ```
32
+
33
+ The installer reads the single local wheel from BUNDLE.json and invokes pip with files/notebook extras. Missing dependencies need internet. Use `python install.py --core-only` explicitly when Excel/Parquet/notebooks are not required. Never delete your Conda environment or cache database to upgrade. Restart the notebook kernel afterwards.
34
+
35
+ The local bundle is not a self-contained offline wheelhouse.
36
+
37
+ ## Examples
38
+
39
+ ```python
40
+ from tse_dara import data
41
+
42
+ # Synthetic teaching data, no external HTTP or database
43
+ df = data.load_sample()
44
+ report = data.validate_data(df)
45
+ compact = data.select_columns(df)
46
+
47
+ # Real data: makes a network request or uses an eligible cache entry
48
+ quote_df = data.get_quote_frame("فولاد")
49
+ history = data.get_history("فولاد", start="1403-01-01",
50
+ end="1403-12-30", calendar="jalali")
51
+
52
+ # Documentation without a network request
53
+ reference = data.api_reference("get_history")
54
+ columns = data.schema_info("daily_bars")
55
+ ```
56
+
57
+ Offline quote use is explicit: `policy=data.FetchPolicy.offline(allow_stale=True)`. The shortcut `policy="offline"` does not permit stale data. Use `FetchPolicy.fresh()` for a network read with max_age=0; online mode alone may use fresh cache.
58
+
59
+ `get_quotes` and `get_history_many` accept a list/tuple, Series, Index or 1D NumPy array. Input order and duplicates are preserved. Null entries are rejected before fetching. Raw numeric strings are not inferred as instrument IDs; use `InstrumentRef.by_ins_code`.
60
+
61
+ ## Persistence
62
+
63
+ Best-effort autosave failures do not invalidate successfully fetched data. A queued receipt is not durable storage. Explicit `save`, `load`, `flush` and `sync_history(wait=True)` report failures. Existing 0.3.0a2 SQLite schemas and cache paths are retained; no destructive migration is introduced.
64
+
65
+ `save/load` use typed Dara archives. Preserve the JSON sidecar with CSV. They are not a generic parser for arbitrary external files. Use Pandas readers with explicit identifier dtypes, then normalize_data with an explicit column mapping for external data. Never treat a floating identifier as recoverable original text.
66
+
67
+ ## References and examples
68
+
69
+ - START_HERE_FA.html: Persian getting-started guide.
70
+ - docs/DATA_REVIEW_REPORT_FA.html: complete current review and actual API/model documentation.
71
+ - docs/API_REFERENCE_FA.md and API_REFERENCE.md: real signatures, defaults, outputs, main exceptions and dependencies.
72
+ - docs/MODELS_REFERENCE_FA.md: actual runtime dataclasses and enums.
73
+ - docs/ROADMAP_REVIEW_FA.md: next data-only stages.
74
+ - docs/design_v0_2/USER_SUPPLIED_REPORT.html: original uploaded architecture, unchanged.
75
+ - examples/10_data_usability_offline.ipynb and 11_pandas_validation.ipynb: new offline notebooks.
76
+ - examples/12_data_review_live.ipynb: optional real-network test, disabled by default.
77
+ - tools/check_data_usability.py: offline check; `--live` explicitly opts into external requests.
78
+
79
+ ## Verification
80
+
81
+ The PyPI preparation checks also run on Windows/Python 3.13.1/Pandas 3.0.6 with Excel and Parquet dependencies installed. See reports/pypi-tests.xml for the local test report and reports/review_031/VERIFICATION.json for historical Linux/Python 3.13.5/Pandas 2.2.3 checks and limitations. Python 3.14 is not verified by this local run. Parquet tests require pyarrow; skipped tests are not successes. The GitHub matrix is supplied configuration. Historical reports are preserved in separate directories.
82
+
83
+ Structural validation does not establish source accuracy, historical coverage, official publication time or absence of all forms of future-data leakage. No live-price number is bundled as a current quote.
84
+
85
+ ## Development
86
+
87
+ ```console
88
+ python -m pip install -e ".[test,notebook]"
89
+ python tools/generate_api_reference.py
90
+ python tools/build.py
91
+ python tools/update_bundle.py
92
+ python -m pytest -q
93
+ ```
94
+
95
+ Generating the optional HTML documentation requires mistune, a documentation-only dependency, not a runtime dependency. Retain exactly one current wheel under dist/.
96
+
97
+ License: MIT; third-party notices are in THIRD_PARTY_NOTICES.md. Data-access and redistribution rights are separate from the code license.
@@ -0,0 +1,177 @@
1
+ # tse-dara — نسخه یکپارچه 0.3.1a1
2
+
3
+ ## دامنه این تحویل
4
+
5
+ این نسخه برای **تثبیت و ساده‌سازی بخش داده موجود** است، نه تکمیل همه سرویس‌های نقشه راه. هیچ الگوریتم تحلیل، اندیکاتور یا یادگیری ماشین اضافه نشده است. قابلیت‌های قیمت، تاریخچه خام، دریافت گروهی، ذخیره خودکار، بازیابی آفلاین، اصلاحات تاریخچه و خروجی فایل‌های قسمت‌های اول تا سوم حفظ شده‌اند. اصلاح Windows برای fsync نیز محفوظ است.
6
+
7
+ سند اصلی ارسالی در `docs/design_v0_2/USER_SUPPLIED_REPORT.html` بدون تغییر نگهداری شده است. `docs/ROADMAP_REVIEW_FA.md` طرح را با پیاده‌سازی واقعی مقایسه می‌کند. سند طراحی پیشین، به‌تنهایی مدرک پیاده‌سازی نیست.
8
+
9
+ ## نصب یک‌باره یا ارتقا
10
+
11
+ برای نصب نسخهٔ آزمایشی از PyPI با Python 3.12 یا جدیدتر:
12
+
13
+ ```console
14
+ python -m pip install tse-dara==0.3.1a1
15
+ ```
16
+
17
+ برای امکانات Excel، Parquet و Notebook:
18
+
19
+ ```console
20
+ python -m pip install "tse-dara[files,notebook]==0.3.1a1"
21
+ ```
22
+
23
+ نام کتابخانه هنگام import برابر `tse_dara` است. پس از نصب یا ارتقا، Kernel ژوپیتر را Restart کن.
24
+
25
+ ### نصب از بستهٔ محلی
26
+
27
+ پوشه `tse-dara` این ZIP را در محل دلخواه استخراج کن؛ برای جلوگیری از باقی‌ماندن فایل نصب قدیمی، از پوشه تمیزِ استخراج‌شده استفاده کن. محیط پایتون و پایگاه داده قبلی را حذف نکن.
28
+
29
+ ```bat
30
+ python install.py
31
+ ```
32
+
33
+ نصاب فقط Wheel همین بسته را نصب می‌کند. برای قابلیت‌های Excel و Parquet و Notebook، وابستگی‌های اختیاری را در همان مرحله درخواست می‌کند. نصب کاملاً آفلاین نیست؛ اگر وابستگی‌ای موجود نباشد، اینترنت لازم است. برای نصب فقط هسته: `python install.py --core-only`.
34
+
35
+ پس از نصب Kernel ژوپیتر را Restart کن و سپس بررسی کن:
36
+
37
+ ```python
38
+ import sys
39
+ import tse_dara
40
+ print(sys.executable)
41
+ print(tse_dara.__version__)
42
+ print(tse_dara.__file__)
43
+ ```
44
+
45
+ نسخه باید `0.3.1a1` باشد. تغییر نسخه به حذف یا مهاجرت پایگاه SQLite قبلی نیاز ندارد.
46
+
47
+ ## تغییرهای اصلی
48
+
49
+ * `get_quotes()` و `get_history_many()` علاوه بر list و tuple، ورودی `pandas.Series`، `pandas.Index` و آرایه یک‌بعدی NumPy می‌پذیرند. ترتیب و تکرار ورودی حفظ می‌شود. null، جدول دوبعدی، مجموعه بی‌ترتیب و شناسه عددیِ مبهم پیش از درخواست شبکه رد می‌شوند.
50
+ * `get_quote_frame()` و `get_instrument_frame()` مستقیماً DataFrame می‌دهند. `get_quote()` همچنان مدل Quote و `get_price()` همچنان Decimal می‌دهد؛ رفتار قدیمی عوض نشده است.
51
+ * `Client(numeric="exact")` میان‌بری برای تنظیم پروفایل عددی است. در حالت معمول جدول‌ها Float64/Int64 nullable دارند و شناسه‌ها رشته باقی می‌مانند.
52
+ * `FetchPolicy.offline(allow_stale=True)` استفاده صریح از کش قدیمی را ساده می‌کند. `policy="offline"` نیز اکنون پذیرفته می‌شود، اما اجازه استفاده از داده منقضی را خودکار صادر نمی‌کند.
53
+ * `FetchPolicy.fresh()` کش را برای درخواست تازه کنار می‌گذارد. این با `policy="online"` متفاوت است؛ حالت online ممکن است کش تازه را استفاده کند.
54
+ * تاریخ‌های `pd.Timestamp` فقط اگر نیمه‌شب و بدون منطقه زمانی باشند در ورودی تاریخ روزانه پذیرفته می‌شوند. تقویم این شیء همیشه میلادی است؛ رشته شمسی نیازمند `calendar="jalali"` است.
55
+ * زمان‌های ستون‌های مرکزی به `datetime64[ns, UTC]` یکدست شده‌اند. این تغییر، اختلاف پیش‌فرض دقت زمانی میان نسخه‌های Pandas را کم می‌کند؛ به معنی آزمون عملی همه نسخه‌ها نیست.
56
+ * حفظ نوع رشته هنگام ذخیره و بازیابی دقیق‌تر شده و ورودی غلط مسیر یا قالب، خطای عمومی قابل فهم کتابخانه می‌دهد.
57
+ * مرجع امضای واقعی توابع داخل بسته و از طریق `data.api_reference()` در دسترس است.
58
+
59
+ ## نمونه ساده و بدون تغییر به کد قدیمی
60
+
61
+ ```python
62
+ from tse_dara import data
63
+
64
+ price = data.get_price("فولاد")
65
+ quote_df = data.get_quote_frame("فولاد")
66
+ history = data.get_history("فولاد", include_jdate=True)
67
+ ```
68
+
69
+ برای نمایش خلوت‌تر بدون تغییر جدول اصلی:
70
+
71
+ ```python
72
+ display(data.select_columns(history, "compact"))
73
+ ```
74
+
75
+ نمای compact بعضی ستون‌های شناسنامه را حذف می‌کند و در متادیتا این موضوع را اعلام می‌کند. برای آرشیو کامل، جدول اصلی را ذخیره کن؛ نمای خلوت جای مدرک منشأ داده نیست.
76
+
77
+ ## تنظیمات ساده پیش از اولین دریافت
78
+
79
+ ```python
80
+ from tse_dara import data
81
+
82
+ data.configure(
83
+ data_dir=r"G:\My progect\Python\TSE\dara-data",
84
+ numeric="analysis",
85
+ storage=True,
86
+ )
87
+ ```
88
+
89
+ `configure` فایل یا شبکه ایجاد نمی‌کند. اگر قبلاً از توابع مستقیم data استفاده کرده‌ای، ابتدا `report = data.close()` را اجرا و تکمیل ذخیره را بررسی کن؛ سپس تنظیمات جدید را اعمال کن. مسیر جدید، اطلاعات مسیر قدیمی را خودکار جابه‌جا نمی‌کند. تغییر تنظیمات Client مستقل، کلاینت‌های دیگر را عوض نمی‌کند.
90
+
91
+ ## دریافت گروهی با Pandas
92
+
93
+ ```python
94
+ import pandas as pd
95
+ from tse_dara import data
96
+
97
+ symbols = pd.Series(["فولاد", "شستا", "فولاد"], dtype="string")
98
+ quotes = data.get_quotes(symbols, on_error="collect")
99
+ batch = data.get_history_many(symbols, on_error="collect")
100
+ display(quotes)
101
+ display(batch.requests)
102
+ display(batch.errors)
103
+ ```
104
+
105
+ ورودی تکراری، سطر/گزارش مستقل دارد. برای تاریخچه گروهی، `batch.data` جدول داده و `batch.errors` جدول خطاهاست. `on_error="collect"` اجازه انتخاب تصادفی نماد مبهم را نمی‌دهد.
106
+
107
+ ## آفلاین و داده قدیمی
108
+
109
+ ```python
110
+ from tse_dara.data import Client, FetchPolicy
111
+
112
+ with Client() as client:
113
+ quote = client.get_quote(
114
+ "فولاد",
115
+ policy=FetchPolicy.offline(allow_stale=True),
116
+ )
117
+ print(quote.last_price, quote.trade_date)
118
+ print(quote.meta.quality_flags)
119
+ ```
120
+
121
+ این دستور اینترنت ندارد، اما باید قبلاً پاسخ لازم در همین مسیر و همین فضای کش ذخیره شده باشد. `stale_cached_response` و StaleDataWarning خطای برنامه نیستند؛ می‌گویند داده قدیمی است. تاریخ منبع با زمان دریافت داده تفاوت دارد. قیمت آفلاین به قیمت لحظه‌ای تبدیل نمی‌شود.
122
+
123
+ ## کار با جدول و کنترل کیفیت
124
+
125
+ ```python
126
+ schema = data.schema_info("daily_bars")
127
+ issues = data.validate_data(history)
128
+ metadata = data.frame_metadata(history)
129
+
130
+ display(schema)
131
+ display(issues)
132
+ ```
133
+
134
+ گزارش خالی یعنی قواعد ساختاری اجراشده ایرادی پیدا نکرده‌اند، نه اینکه داده بورس از نظر اقتصادی یا تاریخی قطعاً کامل است. این ابزار آزمون نشت اطلاعات آینده یا تحلیل سرمایه‌گذاری نیست.
135
+
136
+ برای تبدیل جدول خارجی، نام‌ها را خودت صریح تعیین کن:
137
+
138
+ ```python
139
+ normalized = data.normalize_data(
140
+ external_df,
141
+ columns={"نماد": "symbol", "تاریخ": "date", "پایانی": "closing_price"},
142
+ calendar="jalali",
143
+ )
144
+ ```
145
+
146
+ ستون‌های ناشناخته و رکوردها حفظ می‌شوند. مقدار گمشده پر نمی‌شود؛ شناسه float به‌دروغ بازیابی نمی‌شود؛ سطر تکراری حذف و قیمت منفی بریده نمی‌شود. وجود نقص را با `validate_data()` بررسی کن. برای timestamp بدون timezone، پارامتر `timezone` لازم است.
147
+
148
+ ## ذخیره
149
+
150
+ ```python
151
+ data.save(history, "folad.csv", overwrite=True)
152
+ restored = data.load("folad.csv")
153
+ ```
154
+
155
+ CSV به فایل همراه `.csv.dara.json` نیاز دارد. Excel و Parquet و SQLite خروجی نیز شناسنامه دارند. `data.load()` خواننده آرشیو Dara است، نه مفسر خودکار فایل دلخواه؛ فایل خارجی را با Pandas بخوان و سپس با نگاشت صریح عادی‌سازی کن.
156
+
157
+ شکست ذخیره خودکار، نتیجه معتبر دریافت را متوقف نمی‌کند. اما save/load/flush عملیات صریح هستند و شکست را اعلام می‌کنند. صف حافظه، دوام روی دیسک نیست.
158
+
159
+ ## از کدام دفترچه شروع کنیم؟
160
+
161
+ `10_data_usability_offline.ipynb`: مثال کامل امکانات ساده‌شده با داده مصنوعی.
162
+
163
+ `11_pandas_validation.ipynb`: نمونه کنترل نوع، نگاشت ستون، خطاها و حفظ ورودی.
164
+
165
+ `12_data_review_live.ipynb`: آزمون اختیاری روی سرور واقعی؛ پیش‌فرض دریافت زنده خاموش است.
166
+
167
+ هر ۹ دفترچه قبلی حفظ شده‌اند. دفترچه‌های نمونه قیمت واقعی بازار نشان نمی‌دهند و کش نمونه از کش واقعی جداست.
168
+
169
+ ## هنوز آماده نیست
170
+
171
+ فهرست کامل و تاریخی تمام ابزارها، اتصال شناسه‌های قدیمی، دریافت بر اساس ISIN، تعدیل تأییدشده، API رسمی دارای حساب، دیده‌بان، شاخص‌ها، حقیقی‌حقوقی، مظنه، ریزمعاملات، صندوق‌ها و اطلاعیه‌ها هنوز به عنوان قابلیت‌های کامل در این نسخه عرضه نشده‌اند. مرحله بعد پیشنهادی، خانواده داده‌های بازار P08 پس از تثبیت آزمون‌های همین نسخه است.
172
+
173
+ توابع تحلیل و هوش مصنوعی بنا به درخواست فعلی اضافه نشده‌اند. پرونده اصلی طراحی آن‌ها به‌عنوان سابقه باقی مانده، اما وابستگی ML نصب نمی‌شود.
174
+
175
+ ## آزمون و حدود تأیید
176
+
177
+ آمار دقیق و محیط آزمون نهایی در `reports/review_031/VERIFICATION.json` ثبت می‌شود. آزمون‌های خودکار شبکه واقعی را مسدود می‌کنند. نبود خطا در نمونه‌های ساختگی، سلامت همیشگی API بورس را ثابت نمی‌کند. اگر آزمون Pandas 3، Windows یا Parquet اجرا نشده باشد، در گزارش صریحاً اجرا‌نشده درج می‌شود.
@@ -0,0 +1,33 @@
1
+ # Security and operational notes
2
+
3
+ No API credentials are needed or accepted in this release. No telemetry, trading,
4
+ account access, proxy rotation, TLS bypass, or package auto-update is performed.
5
+ Requests target a fixed HTTPS base URL; redirects are not followed. Response
6
+ bytes are capped; malformed JSON and duplicate keys are rejected. Only validated
7
+ responses enter the cache. Never send credentials or tokens in issue reports.
8
+
9
+ Do not treat a fresh retrieval timestamp as proof of fresh exchange data.
10
+ Unit normalization is deliberately narrow and unverified instruments carry
11
+ unknown units. The fixture suite is not an independent security audit.
12
+
13
+ No background network polling is started. The optional background writer only
14
+ persists data already obtained by an explicit user operation. Stop/close clients
15
+ when finished, and explicitly flush when durability is required.
16
+
17
+ The supplied license covers code, not permission to redistribute exchange data.
18
+ A public endpoint does not imply unlimited access or a service-level guarantee.
19
+
20
+ Daily-history cache versions are response observations, not certified publication history.
21
+ Do not use raw or retroactively adjusted daily data as point-in-time ML evidence.
22
+
23
+ Part 3 adds inert tagged serialization, not pickle or eval. Structural dtype
24
+ parsing uses an allowlist. Hashes detect accidental corruption, not malicious
25
+ rewriting of data and hashes together. XLSX formulas are not executed;
26
+ metadata is not encrypted. CSV+sidecar are two files, not an atomic pair.
27
+ Readers are eager and file-size limits are not a universal sandbox against
28
+ all compressed-format resource-exhaustion attacks. Only open trusted archives.
29
+
30
+ Normalized history stores observation versions. `committed_at` is the writer's
31
+ transaction timestamp, not a metrologically precise post-fsync timestamp.
32
+ Local as_of is based on recorded timestamps and does not certify an exchange
33
+ publication time or a sub-second, crash-consistent replay of database visibility.