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.

@@ -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"
@@ -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
+ [![Python Version](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/)
12
+ [![Rust Engine](https://img.shields.io/badge/engine-Rust--PyO3-orange.svg)](https://www.rust-lang.org/)
13
+ [![License](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT)
14
+ [![Author](https://img.shields.io/badge/author-Ali%20Kamrani-purple.svg)](https://github.com/MRThugh)
15
+ [![Version](https://img.shields.io/badge/version-0.3.0-blue.svg)](https://github.com/MRThugh/Jamshid)
16
+ [![Persian](https://img.shields.io/badge/lang-PERSIAN-green)](README-fa.md)
17
+ [![English](https://img.shields.io/badge/lang-English-blue)](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>