jamshid 0.3.0__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.
Potentially problematic release.
This version of jamshid might be problematic. Click here for more details.
- jamshid-0.3.0/Cargo.lock +180 -0
- jamshid-0.3.0/Cargo.toml +14 -0
- jamshid-0.3.0/PKG-INFO +16 -0
- jamshid-0.3.0/README-fa.md +377 -0
- jamshid-0.3.0/README.md +378 -0
- jamshid-0.3.0/dist/jamshid-0.3.0.tar.gz +0 -0
- jamshid-0.3.0/jamshid/__init__.py +21 -0
- jamshid-0.3.0/jamshid/_core.pyi +5 -0
- jamshid-0.3.0/jamshid/cli.py +135 -0
- jamshid-0.3.0/jamshid/core.py +773 -0
- jamshid-0.3.0/jamshid/exceptions.py +11 -0
- jamshid-0.3.0/jamshid/pandas_ext.py +145 -0
- jamshid-0.3.0/jamshid/py.typed +0 -0
- jamshid-0.3.0/pyproject.toml +35 -0
- jamshid-0.3.0/setup.py +13 -0
- jamshid-0.3.0/src/lib.rs +171 -0
jamshid-0.3.0/Cargo.lock
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# This file is automatically @generated by Cargo.
|
|
2
|
+
# It is not intended for manual editing.
|
|
3
|
+
version = 4
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "autocfg"
|
|
7
|
+
version = "1.5.1"
|
|
8
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
+
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
|
10
|
+
|
|
11
|
+
[[package]]
|
|
12
|
+
name = "cfg-if"
|
|
13
|
+
version = "1.0.4"
|
|
14
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
15
|
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
16
|
+
|
|
17
|
+
[[package]]
|
|
18
|
+
name = "heck"
|
|
19
|
+
version = "0.5.0"
|
|
20
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
21
|
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
22
|
+
|
|
23
|
+
[[package]]
|
|
24
|
+
name = "indoc"
|
|
25
|
+
version = "2.0.7"
|
|
26
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
27
|
+
checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
|
|
28
|
+
dependencies = [
|
|
29
|
+
"rustversion",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[[package]]
|
|
33
|
+
name = "jamshid"
|
|
34
|
+
version = "0.3.0"
|
|
35
|
+
dependencies = [
|
|
36
|
+
"pyo3",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[[package]]
|
|
40
|
+
name = "libc"
|
|
41
|
+
version = "0.2.186"
|
|
42
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
43
|
+
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
|
|
44
|
+
|
|
45
|
+
[[package]]
|
|
46
|
+
name = "memoffset"
|
|
47
|
+
version = "0.9.1"
|
|
48
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
49
|
+
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
|
50
|
+
dependencies = [
|
|
51
|
+
"autocfg",
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
[[package]]
|
|
55
|
+
name = "once_cell"
|
|
56
|
+
version = "1.21.4"
|
|
57
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
58
|
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
|
59
|
+
|
|
60
|
+
[[package]]
|
|
61
|
+
name = "portable-atomic"
|
|
62
|
+
version = "1.14.0"
|
|
63
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
64
|
+
checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3"
|
|
65
|
+
|
|
66
|
+
[[package]]
|
|
67
|
+
name = "proc-macro2"
|
|
68
|
+
version = "1.0.107"
|
|
69
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
70
|
+
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
|
|
71
|
+
dependencies = [
|
|
72
|
+
"unicode-ident",
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
[[package]]
|
|
76
|
+
name = "pyo3"
|
|
77
|
+
version = "0.22.6"
|
|
78
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
79
|
+
checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884"
|
|
80
|
+
dependencies = [
|
|
81
|
+
"cfg-if",
|
|
82
|
+
"indoc",
|
|
83
|
+
"libc",
|
|
84
|
+
"memoffset",
|
|
85
|
+
"once_cell",
|
|
86
|
+
"portable-atomic",
|
|
87
|
+
"pyo3-build-config",
|
|
88
|
+
"pyo3-ffi",
|
|
89
|
+
"pyo3-macros",
|
|
90
|
+
"unindent",
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
[[package]]
|
|
94
|
+
name = "pyo3-build-config"
|
|
95
|
+
version = "0.22.6"
|
|
96
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
97
|
+
checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38"
|
|
98
|
+
dependencies = [
|
|
99
|
+
"once_cell",
|
|
100
|
+
"target-lexicon",
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
[[package]]
|
|
104
|
+
name = "pyo3-ffi"
|
|
105
|
+
version = "0.22.6"
|
|
106
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
107
|
+
checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636"
|
|
108
|
+
dependencies = [
|
|
109
|
+
"libc",
|
|
110
|
+
"pyo3-build-config",
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
[[package]]
|
|
114
|
+
name = "pyo3-macros"
|
|
115
|
+
version = "0.22.6"
|
|
116
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
117
|
+
checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453"
|
|
118
|
+
dependencies = [
|
|
119
|
+
"proc-macro2",
|
|
120
|
+
"pyo3-macros-backend",
|
|
121
|
+
"quote",
|
|
122
|
+
"syn",
|
|
123
|
+
]
|
|
124
|
+
|
|
125
|
+
[[package]]
|
|
126
|
+
name = "pyo3-macros-backend"
|
|
127
|
+
version = "0.22.6"
|
|
128
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
129
|
+
checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe"
|
|
130
|
+
dependencies = [
|
|
131
|
+
"heck",
|
|
132
|
+
"proc-macro2",
|
|
133
|
+
"pyo3-build-config",
|
|
134
|
+
"quote",
|
|
135
|
+
"syn",
|
|
136
|
+
]
|
|
137
|
+
|
|
138
|
+
[[package]]
|
|
139
|
+
name = "quote"
|
|
140
|
+
version = "1.0.47"
|
|
141
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
142
|
+
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
|
|
143
|
+
dependencies = [
|
|
144
|
+
"proc-macro2",
|
|
145
|
+
]
|
|
146
|
+
|
|
147
|
+
[[package]]
|
|
148
|
+
name = "rustversion"
|
|
149
|
+
version = "1.0.23"
|
|
150
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
151
|
+
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
|
152
|
+
|
|
153
|
+
[[package]]
|
|
154
|
+
name = "syn"
|
|
155
|
+
version = "2.0.119"
|
|
156
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
157
|
+
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
|
158
|
+
dependencies = [
|
|
159
|
+
"proc-macro2",
|
|
160
|
+
"quote",
|
|
161
|
+
"unicode-ident",
|
|
162
|
+
]
|
|
163
|
+
|
|
164
|
+
[[package]]
|
|
165
|
+
name = "target-lexicon"
|
|
166
|
+
version = "0.12.16"
|
|
167
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
168
|
+
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
|
|
169
|
+
|
|
170
|
+
[[package]]
|
|
171
|
+
name = "unicode-ident"
|
|
172
|
+
version = "1.0.24"
|
|
173
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
174
|
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
175
|
+
|
|
176
|
+
[[package]]
|
|
177
|
+
name = "unindent"
|
|
178
|
+
version = "0.2.4"
|
|
179
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
180
|
+
checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
jamshid-0.3.0/Cargo.toml
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "jamshid"
|
|
3
|
+
version = "0.3.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
authors = ["Ali Kamrani <kamrani.exe@gmail.com>"]
|
|
6
|
+
repository = "https://github.com/MRThugh/Jamshid"
|
|
7
|
+
readme = "README.md"
|
|
8
|
+
|
|
9
|
+
[lib]
|
|
10
|
+
name = "_core"
|
|
11
|
+
crate-type = ["cdylib"]
|
|
12
|
+
|
|
13
|
+
[dependencies]
|
|
14
|
+
pyo3 = { version = "0.22", features = ["extension-module"] }
|
jamshid-0.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: jamshid
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Classifier: Programming Language :: Python :: 3
|
|
5
|
+
Classifier: Programming Language :: Rust
|
|
6
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
7
|
+
Classifier: Operating System :: OS Independent
|
|
8
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
9
|
+
Requires-Dist: matplotlib>=3.0 ; extra == 'matplotlib'
|
|
10
|
+
Requires-Dist: pandas>=1.0 ; extra == 'pandas'
|
|
11
|
+
Provides-Extra: matplotlib
|
|
12
|
+
Provides-Extra: pandas
|
|
13
|
+
Summary: A highly accurate and modern Persian (Jalali) calendar library written in Rust and Python.
|
|
14
|
+
Author-email: Ali Kamrani <kamrani.exe@gmail.com>
|
|
15
|
+
Requires-Python: >=3.9
|
|
16
|
+
Project-URL: Homepage, https://github.com/MRThugh/Jamshid
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🌟 Jamshid (جمشید) 🌟
|
|
4
|
+
<p align="center">
|
|
5
|
+
<img
|
|
6
|
+
src="https://raw.githubusercontent.com/MRThugh/MRThugh/main/badge.svg"
|
|
7
|
+
width="50%"
|
|
8
|
+
/>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
[](https://www.python.org/)
|
|
12
|
+
[](https://www.rust-lang.org/)
|
|
13
|
+
[](https://opensource.org/licenses/MIT)
|
|
14
|
+
[](https://github.com/MRThugh)
|
|
15
|
+
[](https://github.com/MRThugh/Jamshid)
|
|
16
|
+
[](README-fa.md)
|
|
17
|
+
[](README.md)
|
|
18
|
+
|
|
19
|
+
**کاملترین، دقیقترین و سریعترین زیرساخت تقویم جلالی برای پایتون. قدرت گرفته از هسته فوقسریع کامپایلشده Rust، مجهز به پشتیبانی نیتیو از Pandas، موتور تقویم تعطیلات چندمنطقهای و ابزارهای پیشرفته متنی و بومیسازی فارسی.**
|
|
20
|
+
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 📖 معرفی پروژه
|
|
26
|
+
|
|
27
|
+
کتابخانه **جمشید** (که با دستور `import jamshid` در پروژهها فراخوانی میشود) یک زیرساخت کامل و در سطح لول تولید (Production-grade) برای مدیریت، پردازش و تبدیل تاریخهای جلالی و میلادی در پایتون است.
|
|
28
|
+
|
|
29
|
+
توسعهدهندگان فارسیزبان سالهاست که با مشکل سرعت پایین تبدیلهای تقویمی در پایتون، عدم هماهنگی با اکوسیستمهای تحلیل داده (مثل Pandas)، تغییرات پیچیده و تاریخی ساعت رسمی (DST) و پردازشهای متنی دستوپنجه نرم میکنند. جمشید با ترکیب سرعت بینظیر و امنیت حافظه **زبان راست (Rust از طریق PyO3)** با رابطهای استاندارد کلاس `datetime` پایتون، عملکردی در مقیاس میکروثانیه ارائه میدهد؛ در حالی که همچنان سازگاری ۱۰۰٪ با کدهای قدیمی شما دارد.
|
|
30
|
+
|
|
31
|
+
فرقی نمیکند در حال توسعه یک ابزار نجومی پیچیده هستید، یک هجفاند مالی با حجم تراکنش بالا روی **Pandas** دارید یا صرفاً میخواهید یک وبسایت ساده را فارسیسازی کنید؛ جمشید تمام ابزارها، محاسبات نجومی دقیق و دیتابیس مناسبتهای خاورمیانه را یکجا در اختیارتان میگذارد.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 🚀 ستونهای معماری جمشید در نسخه 0.3.0
|
|
36
|
+
|
|
37
|
+
### ۱. هسته محاسباتی فوقسریع راست (`jamshid._core`)
|
|
38
|
+
* **عملیات فشرده روی راست**: تمام محاسبات سنگین ریاضی شامل تبدیل تاریخها (جلالی ↔ میلادی)، تعیین روزهای هفته و بررسی سالهای کبیسه مستقیماً درون باینریهای کامپایلشده راست پردازش میشوند.
|
|
39
|
+
* **دقت فوقالعاده نجومی**: استفاده از چرخه دقیق ۲۸۲۰ ساله بورکوفسکی (Borkowski) و پیادهسازی الگوریتمهای ژان میوس (Jean Meeus) برای محاسبه لحظه اعتدال بهاری (Spring Equinox)، پایداری ریاضی تقویم را از سال **۳۰۰۰-** تا **۳۰۰۰** خورشیدی تضمین میکند.
|
|
40
|
+
|
|
41
|
+
### ۲. موتور فرهنگی چندمنطقهای (`jamshid.core`)
|
|
42
|
+
* **پشتیبانی از ۳ کشور**: تقویم تعطیلات رسمی پیشفرض برای کشورهای **ایران**، **افغانستان** و **تاجیکستان** تنها با تغییر یک فلگ ساده.
|
|
43
|
+
* **دستهبندی هوشمند رویدادها**: تفکیک رویدادها به دستههای `official` (رسمی)، `cultural` (فرهنگی)، `historical` (تاریخی) و `religious` (مذهبی) با بهرهگیری از هر دو تقویم خورشیدی و قمری (به همراه سیستم فرمول جدولی برای سالهای بسیار دور).
|
|
44
|
+
|
|
45
|
+
### ۳. جعبهابزار دیتا ساینس (`jamshid.pandas_ext`)
|
|
46
|
+
* **JalaliIndex**: یک ایندکس اختصاصی برای پنداس که از کلاس پایه `Index` ارثبری میکند و به شما اجازه میدهد فیلترهای بازه زمانی، ویژگیهای سال/ماه/روز و مرتبسازیها را کاملاً بومی انجام دهید.
|
|
47
|
+
* **آفستهای فرکانسی جلالی**: مجهز به انطباقهای فرکانسی بومی مانند `JalaliMonthEnd` (معادل JME) و `JalaliYearEnd` (معادل JYE) جهت سادهسازی گزارشات مالی و حسابداری سالانه و ماهانه بر اساس سال خورشیدی.
|
|
48
|
+
|
|
49
|
+
### ۴. ابزارهای متنی و زبان فارسی
|
|
50
|
+
* **مبدل ارقام دوطرفه**: پردازش و تبدیل سریع ارقام بین سه زبان فارسی، انگلیسی و عربی.
|
|
51
|
+
* **عدد به حروف غیربازگشتی**: تبدیل اعداد بزرگ تا سقف کوادریلیون به حروف فارسی با الگوریتمی بهینهسازی شده و بدون سربار حافظه (مخصوص سیستمهای صدور فاکتور و پرداخت).
|
|
52
|
+
* **نرمالساز متون فارسی**: اصلاح فاصلههای اضافی، یکپارچهسازی نیمفاصلهها (ZWNJs) و یکدست کردن نویسههای عربی (ی/ک).
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## ⚙️ روش نصب
|
|
57
|
+
|
|
58
|
+
### ۱. نصب استاندارد و پایه
|
|
59
|
+
```bash
|
|
60
|
+
pip install jamshid
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### ۲. نصب به همراه ابزارهای علمی (پنداس و ترسیم نمودار)
|
|
64
|
+
```bash
|
|
65
|
+
pip install jamshid[pandas,matplotlib]
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### ۳. کامپایل لوکال از سورس کد (مخصوص توسعهدهندگان)
|
|
69
|
+
برای بهینهسازیهای اختصاصی پردازنده خود یا مشارکت در توسعه پروژه، میتوانید کتابخانه را به کمک `maturin` کامپایل کنید:
|
|
70
|
+
```bash
|
|
71
|
+
git clone https://github.com/MRThugh/Jamshid.git
|
|
72
|
+
cd Jamshid
|
|
73
|
+
pip install maturin setuptools-rust
|
|
74
|
+
maturin develop --extras pandas,matplotlib
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
*نیازمند پایتون نسخه +3.9 و کامپایلر راست (M.S.R.V 1.65+) می باشد.*
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 🛠️ مدیریت خطاهای هوشمند
|
|
82
|
+
|
|
83
|
+
جمشید مجهز به سیستم اعتبارسنجی ورودی سختگیرانه و دوزبانه (Farsi/English) است تا از ورود مقادیر اشتباه به پایگاهداده پروژه شما در فاز توسعه جلوگیری کند.
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
import jamshid
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
# سال ۱۴۰۴ کبیسه نیست؛ بنابراین اسفند ۲۹ روزه است
|
|
90
|
+
invalid_date = jamshid.JalaliDate(1404, 12, 30)
|
|
91
|
+
except jamshid.JalaliRangeError as e:
|
|
92
|
+
print(f"خطای اعتبارسنجی: {e}")
|
|
93
|
+
# خروجی: خطای اعتبارسنجی: روز 30 برای ماه 12 در سال 1404 (غیرکبیسه) نامعتبر است.
|
|
94
|
+
# [Day 30 is invalid for month 12 in year 1404 (غیرکبیسه). Max allowed days: 29].
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 🚀 مثالهای کاربردی سریع
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
from jamshid import JalaliDate, JalaliDateTime, TehranTz
|
|
103
|
+
import datetime
|
|
104
|
+
|
|
105
|
+
# ۱. ساخت شی تاریخ خورشیدی و سازگاری با استانداردها
|
|
106
|
+
d = JalaliDate(1405, 4, 14) # ۱۴۰۵/۰۴/۱۴
|
|
107
|
+
dt = JalaliDateTime.now(TehranTz())
|
|
108
|
+
|
|
109
|
+
# ۲. تبدیل بدون دردسر به تاریخ میلادی
|
|
110
|
+
g_date = d.to_gregorian() # خروجی شی استاندارد: datetime.date(2026, 7, 5)
|
|
111
|
+
jd = JalaliDate.from_date(g_date)
|
|
112
|
+
|
|
113
|
+
# ۳. محاسبات ساده ریاضی و فواصل زمانی
|
|
114
|
+
tomorrow = d + datetime.timedelta(days=1)
|
|
115
|
+
days_between = JalaliDate(1405, 4, 20) - d # خروجی شی timedelta(days=6)
|
|
116
|
+
|
|
117
|
+
# ۴. بیان متنی و عامیانه فواصل زمانی (Humanize)
|
|
118
|
+
birth_date = JalaliDate(1375, 6, 15)
|
|
119
|
+
print(birth_date.humanize()) # خروجی متناسب با سال جاری: ۲۹ سال پیش
|
|
120
|
+
|
|
121
|
+
# ۵. فرمتبندی و پارس متن با اعداد فارسی خودکار
|
|
122
|
+
print(d.strftime("امروز %A، %d %B سال %Y", locale='fa'))
|
|
123
|
+
# خروجی: امروز یکشنبه، ۱۴ تیر سال ۱۴۰۵
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 📖 مستندات عمیق API تقویم
|
|
129
|
+
|
|
130
|
+
### ۱. دو کلاس `JalaliDate` و `JalaliDateTime`
|
|
131
|
+
این کلاسها فرزند مستقیم `datetime.date` و `datetime.datetime` در پایتون هستند و تمامی متدهای پایتون روی آنها فعال است.
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
from jamshid import JalaliDate, JalaliDateTime
|
|
135
|
+
|
|
136
|
+
# متد استاتیک برای اعتبارسنجی سریع بدون ساخت شی
|
|
137
|
+
is_ok = JalaliDate.is_valid(1404, 12, 30) # False
|
|
138
|
+
|
|
139
|
+
# پشتیبانی از تراز و متون راستبهچپ (RTL) در خروجی کنسول یا صفحات وب
|
|
140
|
+
d = JalaliDate(1405, 4, 14)
|
|
141
|
+
print(repr(d.strftime_rtl("%Y/%m/%d"))) # همراه با نویسه کنترلی \u200f جهت رندر صحیح متون ترکیبی فارسی/انگلیسی
|
|
142
|
+
|
|
143
|
+
# استخراج وضعیت نجومی و درصد روشنایی ماه
|
|
144
|
+
phase_name, illumination = d.get_moon_phase()
|
|
145
|
+
print(f"Moon Phase: {phase_name} | Illumination: {illumination:.2f}%")
|
|
146
|
+
# خروجی: Moon Phase: هلال کاهنده (Waning Crescent) | Illumination: 78.43%
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### ۲. مرزهای تغییر ساعت رسمی تهران (`TehranTz`)
|
|
150
|
+
ساعت رسمی ایران (DST) از ابتدای سال ۱۴۰۲ خورشیدی به طور کامل لغو شد. کلاس `TehranTz` برخلاف سایر لایبرریهای سنتی پایتون، سوابق لغو DST را دارد. این کلاس تا قبل از سال ۱۴۰۲ مرزها را طبق ساعت قدیم (۱ فروردین تا ۳۰ شهریور) تغییر میدهد و از ۱۴۰۲ به بعدDST را متوقف میکند.
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
from jamshid import JalaliDateTime, TehranTz
|
|
154
|
+
|
|
155
|
+
tz = TehranTz()
|
|
156
|
+
# قبل از سال ۱۴۰۲ (ساعت تابستانی اعمال میشود)
|
|
157
|
+
dt_1400 = JalaliDateTime(1400, 2, 15, 12, 0, tzinfo=tz)
|
|
158
|
+
print(dt_1400.tzname()) # IRDT (+04:30)
|
|
159
|
+
|
|
160
|
+
# بعد از سال ۱۴۰۲ (DST لغو شده است)
|
|
161
|
+
dt_1405 = JalaliDateTime(1405, 2, 15, 12, 0, tzinfo=tz)
|
|
162
|
+
print(dt_1405.tzname()) # IRST (+03:30)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### ۳. محاسبه پیشرفته سن خورشیدی نجومی (`SolarAge`)
|
|
166
|
+
سن دقیق شما را بر اساس گردش کامل زمین به دور خورشید محاسبه کرده و خروجی را با جزئیات کامل ارائه میدهد.
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
from jamshid import JalaliDate
|
|
170
|
+
|
|
171
|
+
birth = JalaliDate(1375, 6, 15)
|
|
172
|
+
ref_date = JalaliDate(1405, 4, 14)
|
|
173
|
+
|
|
174
|
+
age = birth.age_to(ref_date)
|
|
175
|
+
print(age.years, "سال و", age.months, "ماه و", age.days, "روز")
|
|
176
|
+
# خروجی: 29 سال و 9 ماه و 29 روز
|
|
177
|
+
|
|
178
|
+
print(f"سن اعشاری خورشیدی: {age.fraction:.4f}")
|
|
179
|
+
# خروجی: سن اعشاری خورشیدی: 29.8282
|
|
180
|
+
|
|
181
|
+
print(age.to_persian())
|
|
182
|
+
# خروجی: ۲۹ سال و ۹ ماه و ۲۹ روز
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### ۴. کانتینر بازههای زمانی پیوسته (`JalaliPeriod`)
|
|
186
|
+
```python
|
|
187
|
+
from jamshid import JalaliDate, JalaliPeriod
|
|
188
|
+
|
|
189
|
+
start = JalaliDate(1405, 1, 1)
|
|
190
|
+
end = JalaliDate(1405, 1, 31)
|
|
191
|
+
period = JalaliPeriod(start, end)
|
|
192
|
+
|
|
193
|
+
print(JalaliDate(1405, 1, 15) in period) # True
|
|
194
|
+
print(period.days) # 30
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### ۵. ابزارهای زبانی و پردازش متون فارسی
|
|
198
|
+
```python
|
|
199
|
+
import jamshid.core as j_utils
|
|
200
|
+
|
|
201
|
+
# مبدلهای سریع ارقام متن
|
|
202
|
+
print(j_utils.to_persian_digits("Calling 09123456789")) # Calling ۰۹۱۲۳۴۵۶۷۸۹
|
|
203
|
+
print(j_utils.to_english_digits("تلفن: ۰۹۱۲۳۴۵۶۷۸۹")) # تلفن: 09123456789
|
|
204
|
+
|
|
205
|
+
# تبدیل غیربازگشتی عدد به کلمات (ایدهآل برای فاکتورهای مالی)
|
|
206
|
+
print(j_utils.num_to_words(1405623910))
|
|
207
|
+
# خروجی: یک میلیارد و چهارصد و پنج میلیون و ششصد و بیست و سه هزار و نهصد و ده
|
|
208
|
+
|
|
209
|
+
# نرمالسازی متون مخدوش و بهبود نیمفاصلهها
|
|
210
|
+
dirty_text = "كتاب ها ميباشد"
|
|
211
|
+
print(j_utils.normalize_persian(dirty_text)) # کتابها میباشد
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 📈 تحلیل داده و فریمورک Pandas
|
|
217
|
+
|
|
218
|
+
جمشید ساختارهای بومی منحصربهفردی جهت همگامسازی و تحلیل دادههای زمانی جلالی در بستر **Pandas** فراهم کرده است.
|
|
219
|
+
|
|
220
|
+
```python
|
|
221
|
+
import pandas as pd
|
|
222
|
+
import jamshid
|
|
223
|
+
from jamshid.pandas_ext import JalaliIndex, jalali_date_range, JalaliMonthEnd, JalaliYearEnd
|
|
224
|
+
|
|
225
|
+
# ۱. تولید ایندکس جلالی منظم به همراه فرکانسهای پنداس
|
|
226
|
+
idx = jalali_date_range(start="1405/01/01", end="1405/03/31", freq="D")
|
|
227
|
+
print(idx)
|
|
228
|
+
# خروجی: JalaliIndex([1405/01/01, 1405/01/02, ..., 1405/03/31], dtype='object')
|
|
229
|
+
|
|
230
|
+
# استخراج سریع ویژگیها از کل ستون ایندکس
|
|
231
|
+
print(idx.year) # pd.Index([1405, 1405, ...])
|
|
232
|
+
print(idx.month) # pd.Index([1, 1, 1, ...])
|
|
233
|
+
|
|
234
|
+
# ۲. ادغام در دیتافریمها به کمک اکسسور بومی .jalali
|
|
235
|
+
df = pd.DataFrame({
|
|
236
|
+
"g_date": pd.date_range("2026-03-21", "2026-06-21", freq="D")
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
# تبدیل مستقیم ستون گریگوری به آبجکتهای JalaliDate
|
|
240
|
+
df["j_date"] = df["g_date"].jalali.to_jalali()
|
|
241
|
+
|
|
242
|
+
# مپ کردن ویژگیهای تعطیلی یا مناسبتها روی ستون به صورت وکتورایز شده
|
|
243
|
+
df["is_holiday"] = df["j_date"].jalali.is_holiday
|
|
244
|
+
df["daily_events"] = df["j_date"].jalali.events
|
|
245
|
+
|
|
246
|
+
# ۳. ریسمپل و خلاصهسازی دادههای مالی با آفست انتهای ماه جلالی (JME)
|
|
247
|
+
df_financial = pd.DataFrame({"revenue": [1000, 1500, 2000]}, index=idx[:3])
|
|
248
|
+
# ریسمپل فرکانسی بر اساس ماههای جلالی
|
|
249
|
+
monthly_resampled = df_financial.resample(JalaliMonthEnd()).sum()
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## 🖼️ ترسیم بصری تقویم ماهانه (`plot_calendar`)
|
|
255
|
+
برای استفاده در نوتبوکهای ژوپیتر، گزارشات سازمانی یا رابطهای کاربری، میتوانید تقویم ماهانه زیبایی را در قالب تصویر با وضوح بالا ذخیره یا ترسیم کنید:
|
|
256
|
+
|
|
257
|
+
```python
|
|
258
|
+
from jamshid import JalaliDate
|
|
259
|
+
|
|
260
|
+
# ساخت تاریخ نمونه از ماه هدف
|
|
261
|
+
d = JalaliDate(1405, 4, 14)
|
|
262
|
+
# ترسیم گرید تقویم با هایلایت کردن روز نمونه
|
|
263
|
+
fig = d.plot_calendar()
|
|
264
|
+
fig.savefig("calendar_tir_1405.png")
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## 💻 راهنمای ابزار خط فرمان (CLI Reference)
|
|
270
|
+
|
|
271
|
+
جمشید دارای یک رابط ترمینالی تعاملی با پشتیبانی از کدهای رنگی ANSI و فرمتهای مختلف خروجی است.
|
|
272
|
+
|
|
273
|
+
### ۱. بررسی سریع وضعیت امروز
|
|
274
|
+
```bash
|
|
275
|
+
jamshid today
|
|
276
|
+
```
|
|
277
|
+
*خروجی: نمایش تاریخ جلالی امروز، معادل میلادی، نام روز هفته، ساعت، وضعیت تعطیلی و مناسبت فعال خورشیدی یا مذهبی.*
|
|
278
|
+
|
|
279
|
+
### ۲. محاسبه مابهالتفاوت دو تاریخ به زبان فارسی روان
|
|
280
|
+
```bash
|
|
281
|
+
jamshid diff 1405/01/01 1406/05/12 --human
|
|
282
|
+
```
|
|
283
|
+
*خروجی: `Difference: ۱ سال و ۵ ماه و ۱۱ روز بعد`*
|
|
284
|
+
|
|
285
|
+
### ۳. چاپ گرید کامل تقویم با مشخص کردن رنگی روزهای تعطیل
|
|
286
|
+
```bash
|
|
287
|
+
jamshid calendar 1405 --highlight-holidays
|
|
288
|
+
```
|
|
289
|
+
*خروجی: نمایش گرید ماههای سال ۱۴۰۵ به صورت منظم به همراه رنگآمیزی قرمز روزهای جمعه و تعطیلات.*
|
|
290
|
+
|
|
291
|
+
### ۴. دریافت مناسبتها و خروجی استاندارد به CSV یا iCal
|
|
292
|
+
```bash
|
|
293
|
+
# خروجی تقویم تعطیلات به فرمت iCal جهت استفاده در Google Calendar یا Outlook
|
|
294
|
+
jamshid holidays 1405 --filter official --export ical > holidays_1405.ics
|
|
295
|
+
|
|
296
|
+
# خروجی گرفتن رویدادها به فرمت ساختاریافته JSON
|
|
297
|
+
jamshid holidays 1405 --filter cultural --export json
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 📊 جدول مقایسه ویژگیها با لایبرریهای همکار
|
|
303
|
+
|
|
304
|
+
| ویژگیها | **Jamshid (v0.3.0)** | `jdatetime` | `persiantools` | `khayyam` |
|
|
305
|
+
| :--- | :---: | :---: | :---: | :---: |
|
|
306
|
+
| **زبان هسته پردازشی** | **Rust (کامپایلشده PyO3)** | پایتون ساده | پایتون ساده | پایتون ساده |
|
|
307
|
+
| **بازدهی و سرعت محاسبات** | **فوقالعاده سریع (میکروثانیهای)** | پایه و معمولی | پایه و معمولی | متوسط |
|
|
308
|
+
| **پشتیبانی از Pandas** | **کامل (JalaliIndex + آفستها)** | ❌ ندارد | ❌ ندارد | ❌ ندارد |
|
|
309
|
+
| **دقت محاسبات تاریخی** | **فرمول ۲۸۲۰ ساله بورکوفسکی** | چرخه ریاضی ۳۳ ساله | چرخه پایه ۳۳ ساله | ریاضیات ساده |
|
|
310
|
+
| **بازه سالهای تحت پوشش** | **۳۰۰۰- تا ۳۰۰۰ خورشیدی** | ۱ تا ۹۹۹۹ | ۱ تا ۹۹۹۹ | ۱ تا ۹۹۹۹ |
|
|
311
|
+
| **سوابق تاریخی DST تهران** | **فعال (لغو خودکار از ۱۴۰۲)**| آفست ثابت ساده | ❌ ندارد | آفست ثابت |
|
|
312
|
+
| **تعطیلات چندمنطقهای** | **ایران، افغانستان، تاجیکستان**| ❌ ندارد | ❌ ندارد | ❌ ندارد |
|
|
313
|
+
| **نمودار و خروجی تصویری** | **بومی با Matplotlib** | ❌ ندارد | ❌ ندارد | ❌ ندارد |
|
|
314
|
+
| **ابزارهای بومی زبان فارسی**| **حروف فارسی، ارقام، نرمالساز** | ❌ ندارد | متوسط | ❌ ندارد |
|
|
315
|
+
| **خط فرمان ترمینال (CLI)**| **بسیار قوی با ساختار JSON/iCal** | ❌ ندارد | ❌ ندارد | ❌ ندارد |
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## 🧪 بنچمارکهای فنی و مقایسه سرعت
|
|
320
|
+
به دلیل پردازش مستقیم لایه زیرین ریاضی بر روی زبان بومی راست، عملیات پردازش دستهای و تبدیلهای تقویمی جمشید به شدت کارآمدتر از رویکردهای قدیمی پایتون عمل میکند:
|
|
321
|
+
|
|
322
|
+
```python
|
|
323
|
+
# اجرای بنچمارک ساده برای تبدیل ۱۰۰,۰۰۰ نمونه تاریخ
|
|
324
|
+
import time
|
|
325
|
+
import jdatetime
|
|
326
|
+
import jamshid
|
|
327
|
+
|
|
328
|
+
# زمان اجرای jdatetime
|
|
329
|
+
t0 = time.time()
|
|
330
|
+
for _ in range(100000):
|
|
331
|
+
_ = jdatetime.date.fromgregorian(day=5, month=7, year=2026)
|
|
332
|
+
print(f"jdatetime: {time.time() - t0:.4f} seconds")
|
|
333
|
+
|
|
334
|
+
# زمان اجرای Jamshid با هسته کامپایلشده راست
|
|
335
|
+
t0 = time.time()
|
|
336
|
+
for _ in range(100000):
|
|
337
|
+
_ = jamshid.JalaliDate.from_gregorian(2026, 7, 5)
|
|
338
|
+
print(f"Jamshid: {time.time() - t0:.4f} seconds")
|
|
339
|
+
```
|
|
340
|
+
*در سختافزار مدرن، لایبرری جمشید بین **۴ تا ۸ برابر سریعتر** از کدهای پایتون ساده در تبدیلات دستهای عمل میکند که آن را به گزینهای ایدهآل برای دیتابیسهای حجیم تبدیل میسازد.*
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## 🤝 مشارکت در پروژه
|
|
345
|
+
|
|
346
|
+
از مشارکتهای شما در جهت ارتقای پروژه جمشید استقبال میکنیم!
|
|
347
|
+
1. پروژه را فورک کنید.
|
|
348
|
+
2. یک شاخه توسعه بسازید (`git checkout -b feature/AmazingFeature`).
|
|
349
|
+
3. تغییرات خود را کامیت کنید (`git commit -m 'Add some AmazingFeature'`).
|
|
350
|
+
4. شاخه خود را پوش کنید (`git push origin feature/AmazingFeature`).
|
|
351
|
+
5. یک Pull Request ایجاد نمایید.
|
|
352
|
+
|
|
353
|
+
لطفاً پیش از باز کردن PR، از پاس شدن یونیتتستها اطمینان حاصل کنید:
|
|
354
|
+
```bash
|
|
355
|
+
python -m unittest discover -s tests
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## 👨💻 نویسنده و راههای ارتباطی
|
|
361
|
+
|
|
362
|
+
**علی کامرانی**
|
|
363
|
+
|
|
364
|
+
* **گیتهاب**: [@MRThugh](https://github.com/MRThugh)
|
|
365
|
+
* **ایمیل**: [kamrani.exe@gmail.com](mailto:kamrani.exe@gmail.com)
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## 📄 لایسنس
|
|
370
|
+
|
|
371
|
+
این پکیج تحت لایسنس بینالمللی **MIT** توزیع میشود. استفاده، ویرایش و توسعه آن در تمام پروژههای تجاری و متنباز بلامانع است.
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
<div align="center">
|
|
376
|
+
<b>Jamshid</b> — تعریفی نوین از محاسبات گاهشماری خورشیدی. 🚀
|
|
377
|
+
</div>
|