iztro-py 0.1.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.
- iztro_py-0.1.0/LICENSE +21 -0
- iztro_py-0.1.0/MANIFEST.in +7 -0
- iztro_py-0.1.0/PKG-INFO +287 -0
- iztro_py-0.1.0/README.md +253 -0
- iztro_py-0.1.0/examples/basic_usage.py +222 -0
- iztro_py-0.1.0/examples/horoscope_usage.py +219 -0
- iztro_py-0.1.0/pyproject.toml +70 -0
- iztro_py-0.1.0/setup.cfg +4 -0
- iztro_py-0.1.0/src/iztro_py/__init__.py +29 -0
- iztro_py-0.1.0/src/iztro_py/astro/__init__.py +25 -0
- iztro_py-0.1.0/src/iztro_py/astro/astro.py +219 -0
- iztro_py-0.1.0/src/iztro_py/astro/functional_astrolabe.py +273 -0
- iztro_py-0.1.0/src/iztro_py/astro/functional_palace.py +216 -0
- iztro_py-0.1.0/src/iztro_py/astro/functional_star.py +160 -0
- iztro_py-0.1.0/src/iztro_py/astro/functional_surpalaces.py +167 -0
- iztro_py-0.1.0/src/iztro_py/astro/horoscope.py +514 -0
- iztro_py-0.1.0/src/iztro_py/astro/palace.py +237 -0
- iztro_py-0.1.0/src/iztro_py/data/__init__.py +133 -0
- iztro_py-0.1.0/src/iztro_py/data/brightness.py +183 -0
- iztro_py-0.1.0/src/iztro_py/data/constants.py +332 -0
- iztro_py-0.1.0/src/iztro_py/data/earthly_branches.py +271 -0
- iztro_py-0.1.0/src/iztro_py/data/heavenly_stems.py +189 -0
- iztro_py-0.1.0/src/iztro_py/data/types.py +358 -0
- iztro_py-0.1.0/src/iztro_py/i18n/__init__.py +14 -0
- iztro_py-0.1.0/src/iztro_py/star/__init__.py +6 -0
- iztro_py-0.1.0/src/iztro_py/star/location.py +349 -0
- iztro_py-0.1.0/src/iztro_py/star/major_star.py +72 -0
- iztro_py-0.1.0/src/iztro_py/star/minor_star.py +176 -0
- iztro_py-0.1.0/src/iztro_py/star/mutagen.py +116 -0
- iztro_py-0.1.0/src/iztro_py/utils/__init__.py +63 -0
- iztro_py-0.1.0/src/iztro_py/utils/calendar.py +485 -0
- iztro_py-0.1.0/src/iztro_py/utils/helpers.py +323 -0
- iztro_py-0.1.0/src/iztro_py.egg-info/PKG-INFO +287 -0
- iztro_py-0.1.0/src/iztro_py.egg-info/SOURCES.txt +35 -0
- iztro_py-0.1.0/src/iztro_py.egg-info/dependency_links.txt +1 -0
- iztro_py-0.1.0/src/iztro_py.egg-info/requires.txt +10 -0
- iztro_py-0.1.0/src/iztro_py.egg-info/top_level.txt +1 -0
iztro_py-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Li Xin
|
|
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.
|
iztro_py-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: iztro-py
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A pure Python implementation of iztro - A lightweight Zi Wei Dou Shu (Purple Star Astrology) library
|
|
5
|
+
Author: iztro-py Contributors
|
|
6
|
+
Project-URL: Homepage, https://github.com/spyfree/iztro-py
|
|
7
|
+
Project-URL: Documentation, https://github.com/spyfree/iztro-py#readme
|
|
8
|
+
Project-URL: Repository, https://github.com/spyfree/iztro-py
|
|
9
|
+
Project-URL: Issues, https://github.com/spyfree/iztro-py/issues
|
|
10
|
+
Keywords: astrology,ziwei,ziweidoushu,purple-star,chinese-astrology
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
21
|
+
Requires-Python: >=3.8
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: pydantic>=2.0.0
|
|
25
|
+
Requires-Dist: python-dateutil>=2.8.0
|
|
26
|
+
Requires-Dist: lunarcalendar>=0.0.9
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
31
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# iztro-py
|
|
36
|
+
|
|
37
|
+
[](https://www.python.org/downloads/)
|
|
38
|
+
[](https://opensource.org/licenses/MIT)
|
|
39
|
+
|
|
40
|
+
A **pure Python implementation** of [iztro](https://github.com/SylarLong/iztro) - A lightweight library for generating astrolabes for Zi Wei Dou Shu (紫微斗数, Purple Star Astrology), an ancient Chinese astrology.
|
|
41
|
+
|
|
42
|
+
## Features
|
|
43
|
+
|
|
44
|
+
- ✨ **Pure Python Implementation** - No JavaScript interpreter needed, unlike py-iztro
|
|
45
|
+
- 🚀 **High Performance** - Native Python implementation without cross-language overhead
|
|
46
|
+
- 🔧 **Type Safe** - Full type hints with Pydantic models
|
|
47
|
+
- 🌍 **Multi-language Support** - Simplified Chinese, Traditional Chinese, English, Japanese, Korean, Vietnamese
|
|
48
|
+
- 📊 **Complete Functionality** - All features from the original iztro library
|
|
49
|
+
- 🔗 **Fluent API** - Method chaining for intuitive queries
|
|
50
|
+
|
|
51
|
+
## Installation
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pip install iztro-py
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Quick Start
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
from iztro_py import astro
|
|
61
|
+
|
|
62
|
+
# Get astrolabe by solar date
|
|
63
|
+
astrolabe = astro.by_solar('2000-8-16', 2, '男', True, 'zh-CN')
|
|
64
|
+
|
|
65
|
+
# Get basic information
|
|
66
|
+
print(astrolabe.gender) # '男'
|
|
67
|
+
print(astrolabe.solar_date) # '2000-8-16'
|
|
68
|
+
print(astrolabe.lunar_date) # '2000年七月十八'
|
|
69
|
+
print(astrolabe.sign) # '狮子座'
|
|
70
|
+
print(astrolabe.zodiac) # '龙'
|
|
71
|
+
|
|
72
|
+
# Get palace by name or index
|
|
73
|
+
soul_palace = astrolabe.palace('命宫')
|
|
74
|
+
print(soul_palace.name) # '命宫'
|
|
75
|
+
print(soul_palace.heavenly_stem) # '庚'
|
|
76
|
+
print(soul_palace.earthly_branch) # '午'
|
|
77
|
+
print(soul_palace.major_stars) # List of major stars
|
|
78
|
+
|
|
79
|
+
# Check if palace contains specific stars
|
|
80
|
+
if soul_palace.has(['紫微']):
|
|
81
|
+
print('命宫有紫微星')
|
|
82
|
+
|
|
83
|
+
# Get star object
|
|
84
|
+
ziwei = astrolabe.star('紫微')
|
|
85
|
+
print(ziwei.brightness) # '旺'
|
|
86
|
+
print(ziwei.mutagen) # '禄' or None
|
|
87
|
+
|
|
88
|
+
# Get surrounded palaces (三方四正)
|
|
89
|
+
surrounded = astrolabe.surrounded_palaces('命宫')
|
|
90
|
+
if surrounded.have_mutagen('忌'):
|
|
91
|
+
print('三方四正有化忌')
|
|
92
|
+
|
|
93
|
+
# Chain method calls
|
|
94
|
+
if astrolabe.star('紫微').surrounded_palaces().have_mutagen('忌'):
|
|
95
|
+
print('紫微星三方四正有化忌')
|
|
96
|
+
|
|
97
|
+
# Get horoscope (运限) for a specific date
|
|
98
|
+
horoscope = astrolabe.horoscope('2024-1-1', 6)
|
|
99
|
+
print(horoscope.decadal.name) # '24-33岁' (大限)
|
|
100
|
+
print(horoscope.nominal_age) # 25 (虚岁)
|
|
101
|
+
print(horoscope.yearly.name) # '甲辰年' (流年)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## API Documentation
|
|
105
|
+
|
|
106
|
+
### Core Functions
|
|
107
|
+
|
|
108
|
+
#### `astro.by_solar(solar_date, time_index, gender, fix_leap=True, language='zh-CN')`
|
|
109
|
+
|
|
110
|
+
Get astrolabe by solar calendar date.
|
|
111
|
+
|
|
112
|
+
**Parameters:**
|
|
113
|
+
- `solar_date` (str): Solar date in format 'YYYY-M-D'
|
|
114
|
+
- `time_index` (int): Time index 0-12 (0=early子时, 1=丑时, ..., 12=late子时)
|
|
115
|
+
- `gender` (str): '男' or '女'
|
|
116
|
+
- `fix_leap` (bool): Whether to fix leap month
|
|
117
|
+
- `language` (str): Output language ('zh-CN', 'zh-TW', 'en-US', 'ja-JP', 'ko-KR', 'vi-VN')
|
|
118
|
+
|
|
119
|
+
**Returns:** `FunctionalAstrolabe` object
|
|
120
|
+
|
|
121
|
+
#### `astro.by_lunar(lunar_date, time_index, gender, is_leap_month=False, fix_leap=True, language='zh-CN')`
|
|
122
|
+
|
|
123
|
+
Get astrolabe by lunar calendar date.
|
|
124
|
+
|
|
125
|
+
**Parameters:**
|
|
126
|
+
- `lunar_date` (str): Lunar date in format 'YYYY-M-D'
|
|
127
|
+
- `time_index` (int): Time index 0-12
|
|
128
|
+
- `gender` (str): '男' or '女'
|
|
129
|
+
- `is_leap_month` (bool): Whether it's a leap month
|
|
130
|
+
- `fix_leap` (bool): Whether to fix leap month
|
|
131
|
+
- `language` (str): Output language
|
|
132
|
+
|
|
133
|
+
**Returns:** `FunctionalAstrolabe` object
|
|
134
|
+
|
|
135
|
+
### FunctionalAstrolabe Methods
|
|
136
|
+
|
|
137
|
+
- `palace(name_or_index)` - Get palace by name or index
|
|
138
|
+
- `star(star_name)` - Get star object
|
|
139
|
+
- `surrounded_palaces(name_or_index)` - Get surrounded palaces (三方四正)
|
|
140
|
+
- `horoscope(solar_date, time_index)` - Get horoscope data for specified date
|
|
141
|
+
- `get_soul_palace()` - Get soul palace (命宫)
|
|
142
|
+
- `get_body_palace()` - Get body palace (身宫)
|
|
143
|
+
|
|
144
|
+
### FunctionalPalace Methods
|
|
145
|
+
|
|
146
|
+
- `has(stars)` - Check if palace contains all specified stars
|
|
147
|
+
- `has_one_of(stars)` - Check if palace contains any of specified stars
|
|
148
|
+
- `not_have(stars)` - Check if palace doesn't contain any specified stars
|
|
149
|
+
- `has_mutagen(mutagen)` - Check if palace has specified mutagen (四化)
|
|
150
|
+
- `is_empty()` - Check if palace is empty
|
|
151
|
+
|
|
152
|
+
### FunctionalStar Methods
|
|
153
|
+
|
|
154
|
+
- `palace()` - Get palace containing this star
|
|
155
|
+
- `surrounded_palaces()` - Get surrounded palaces of this star
|
|
156
|
+
- `opposite_palace()` - Get opposite palace
|
|
157
|
+
- `with_brightness(brightness)` - Check star brightness
|
|
158
|
+
- `with_mutagen(mutagen)` - Check star mutagen
|
|
159
|
+
- `is_bright()` - Check if star is bright (庙/旺)
|
|
160
|
+
- `is_weak()` - Check if star is weak (陷)
|
|
161
|
+
|
|
162
|
+
### Horoscope System (运势系统)
|
|
163
|
+
|
|
164
|
+
The horoscope system provides fortune analysis for different time periods:
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
# Get horoscope for a specific date
|
|
168
|
+
horoscope = chart.horoscope('2024-1-1', 6)
|
|
169
|
+
|
|
170
|
+
# Decadal horoscope (大限) - 10 years per cycle
|
|
171
|
+
print(horoscope.decadal.name) # e.g., '24-33岁'
|
|
172
|
+
print(horoscope.decadal.palace_names) # Palace where decadal is located
|
|
173
|
+
print(horoscope.decadal.mutagen) # Four transformations
|
|
174
|
+
|
|
175
|
+
# Age limit (小限) - 1 year per cycle
|
|
176
|
+
print(horoscope.age.name) # e.g., '25岁'
|
|
177
|
+
print(horoscope.nominal_age) # 25 (virtual age)
|
|
178
|
+
|
|
179
|
+
# Yearly horoscope (流年)
|
|
180
|
+
print(horoscope.yearly.name) # e.g., '甲辰年'
|
|
181
|
+
print(horoscope.yearly.palace_names) # Palace location in birth chart
|
|
182
|
+
|
|
183
|
+
# Monthly horoscope (流月)
|
|
184
|
+
print(horoscope.monthly.name) # e.g., '丙子月'
|
|
185
|
+
|
|
186
|
+
# Daily horoscope (流日)
|
|
187
|
+
print(horoscope.daily.name) # e.g., '癸酉日'
|
|
188
|
+
|
|
189
|
+
# Hourly horoscope (流时)
|
|
190
|
+
print(horoscope.hourly.name) # e.g., '戊午时'
|
|
191
|
+
|
|
192
|
+
# Get palace for any horoscope level
|
|
193
|
+
yearly_palace = chart.palace(horoscope.yearly.index)
|
|
194
|
+
if yearly_palace:
|
|
195
|
+
print(yearly_palace.major_stars)
|
|
196
|
+
|
|
197
|
+
# Analyze three-sided palaces for yearly horoscope
|
|
198
|
+
surpalaces = chart.surrounded_palaces(horoscope.yearly.index)
|
|
199
|
+
if surpalaces.have_mutagen('禄'):
|
|
200
|
+
print('Yearly palace has luck transformation')
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Horoscope Levels:**
|
|
204
|
+
- **大限 (Decadal)**: 10-year cycle based on five elements class (水二局/木三局/金四局/土五局/火六局)
|
|
205
|
+
- **小限 (Age Limit)**: Annual cycle, starts from soul palace
|
|
206
|
+
- **流年 (Yearly)**: Based on yearly heavenly stem and earthly branch
|
|
207
|
+
- **流月 (Monthly)**: Based on monthly stem and branch
|
|
208
|
+
- **流日 (Daily)**: Based on daily stem and branch
|
|
209
|
+
- **流时 (Hourly)**: Based on hourly stem and branch
|
|
210
|
+
|
|
211
|
+
See [examples/horoscope_usage.py](examples/horoscope_usage.py) for detailed usage examples.
|
|
212
|
+
|
|
213
|
+
## Architecture
|
|
214
|
+
|
|
215
|
+
This is a **pure Python reimplementation** of the original JavaScript iztro library:
|
|
216
|
+
|
|
217
|
+
- **No JavaScript interpreter** - Unlike py-iztro which wraps JS code
|
|
218
|
+
- **Native Python** - All algorithms implemented in Python
|
|
219
|
+
- **Better performance** - No cross-language overhead
|
|
220
|
+
- **Easier to maintain** - Pure Python codebase
|
|
221
|
+
|
|
222
|
+
## Comparison
|
|
223
|
+
|
|
224
|
+
| Feature | iztro (JS) | py-iztro | iztro-py (this) |
|
|
225
|
+
|---------|-----------|----------|-----------------|
|
|
226
|
+
| Language | JavaScript | Python wrapper | Pure Python |
|
|
227
|
+
| Dependencies | Node.js | JS interpreter | Python only |
|
|
228
|
+
| Performance | Fast | Slow (overhead) | Fast |
|
|
229
|
+
| Type Safety | TypeScript | Pydantic | Pydantic |
|
|
230
|
+
| Maintenance | Active | Depends on JS | Independent |
|
|
231
|
+
|
|
232
|
+
## Development
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
# Clone repository
|
|
236
|
+
git clone https://github.com/spyfree/iztro-py.git
|
|
237
|
+
cd iztro-py
|
|
238
|
+
|
|
239
|
+
# Install dependencies
|
|
240
|
+
pip install -e ".[dev]"
|
|
241
|
+
|
|
242
|
+
# Run tests
|
|
243
|
+
pytest
|
|
244
|
+
|
|
245
|
+
# Run with coverage
|
|
246
|
+
pytest --cov=src/iztro_py --cov-report=html
|
|
247
|
+
|
|
248
|
+
# Format code
|
|
249
|
+
black src tests
|
|
250
|
+
|
|
251
|
+
# Type check
|
|
252
|
+
mypy src
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## License
|
|
256
|
+
|
|
257
|
+
MIT License - see [LICENSE](LICENSE) file
|
|
258
|
+
|
|
259
|
+
## Credits
|
|
260
|
+
|
|
261
|
+
This project is inspired by and compatible with [iztro](https://github.com/SylarLong/iztro) by SylarLong.
|
|
262
|
+
|
|
263
|
+
## Contributing
|
|
264
|
+
|
|
265
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
266
|
+
|
|
267
|
+
## Roadmap
|
|
268
|
+
|
|
269
|
+
- [x] Project structure setup
|
|
270
|
+
- [x] Core data types and constants
|
|
271
|
+
- [x] Lunar/Solar calendar conversion
|
|
272
|
+
- [x] Heavenly Stems and Earthly Branches calculations
|
|
273
|
+
- [x] Palace positioning algorithms
|
|
274
|
+
- [x] Star positioning algorithms (紫微、天府、14主星)
|
|
275
|
+
- [x] Minor stars algorithms (14辅星)
|
|
276
|
+
- [x] Mutagen system (四化)
|
|
277
|
+
- [x] Brightness calculations
|
|
278
|
+
- [x] FunctionalAstrolabe class
|
|
279
|
+
- [x] FunctionalPalace class
|
|
280
|
+
- [x] FunctionalStar class
|
|
281
|
+
- [x] Surrounded palaces (三方四正)
|
|
282
|
+
- [x] Horoscope system (大限、流年、流月、流日、流时)
|
|
283
|
+
- [x] Unit tests (14/14 core tests + 4/4 horoscope tests passing)
|
|
284
|
+
- [x] Usage examples
|
|
285
|
+
- [ ] Internationalization (i18n) - currently zh-CN only
|
|
286
|
+
- [ ] Documentation website
|
|
287
|
+
- [ ] PyPI package release
|
iztro_py-0.1.0/README.md
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# iztro-py
|
|
2
|
+
|
|
3
|
+
[](https://www.python.org/downloads/)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
A **pure Python implementation** of [iztro](https://github.com/SylarLong/iztro) - A lightweight library for generating astrolabes for Zi Wei Dou Shu (紫微斗数, Purple Star Astrology), an ancient Chinese astrology.
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- ✨ **Pure Python Implementation** - No JavaScript interpreter needed, unlike py-iztro
|
|
11
|
+
- 🚀 **High Performance** - Native Python implementation without cross-language overhead
|
|
12
|
+
- 🔧 **Type Safe** - Full type hints with Pydantic models
|
|
13
|
+
- 🌍 **Multi-language Support** - Simplified Chinese, Traditional Chinese, English, Japanese, Korean, Vietnamese
|
|
14
|
+
- 📊 **Complete Functionality** - All features from the original iztro library
|
|
15
|
+
- 🔗 **Fluent API** - Method chaining for intuitive queries
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install iztro-py
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from iztro_py import astro
|
|
27
|
+
|
|
28
|
+
# Get astrolabe by solar date
|
|
29
|
+
astrolabe = astro.by_solar('2000-8-16', 2, '男', True, 'zh-CN')
|
|
30
|
+
|
|
31
|
+
# Get basic information
|
|
32
|
+
print(astrolabe.gender) # '男'
|
|
33
|
+
print(astrolabe.solar_date) # '2000-8-16'
|
|
34
|
+
print(astrolabe.lunar_date) # '2000年七月十八'
|
|
35
|
+
print(astrolabe.sign) # '狮子座'
|
|
36
|
+
print(astrolabe.zodiac) # '龙'
|
|
37
|
+
|
|
38
|
+
# Get palace by name or index
|
|
39
|
+
soul_palace = astrolabe.palace('命宫')
|
|
40
|
+
print(soul_palace.name) # '命宫'
|
|
41
|
+
print(soul_palace.heavenly_stem) # '庚'
|
|
42
|
+
print(soul_palace.earthly_branch) # '午'
|
|
43
|
+
print(soul_palace.major_stars) # List of major stars
|
|
44
|
+
|
|
45
|
+
# Check if palace contains specific stars
|
|
46
|
+
if soul_palace.has(['紫微']):
|
|
47
|
+
print('命宫有紫微星')
|
|
48
|
+
|
|
49
|
+
# Get star object
|
|
50
|
+
ziwei = astrolabe.star('紫微')
|
|
51
|
+
print(ziwei.brightness) # '旺'
|
|
52
|
+
print(ziwei.mutagen) # '禄' or None
|
|
53
|
+
|
|
54
|
+
# Get surrounded palaces (三方四正)
|
|
55
|
+
surrounded = astrolabe.surrounded_palaces('命宫')
|
|
56
|
+
if surrounded.have_mutagen('忌'):
|
|
57
|
+
print('三方四正有化忌')
|
|
58
|
+
|
|
59
|
+
# Chain method calls
|
|
60
|
+
if astrolabe.star('紫微').surrounded_palaces().have_mutagen('忌'):
|
|
61
|
+
print('紫微星三方四正有化忌')
|
|
62
|
+
|
|
63
|
+
# Get horoscope (运限) for a specific date
|
|
64
|
+
horoscope = astrolabe.horoscope('2024-1-1', 6)
|
|
65
|
+
print(horoscope.decadal.name) # '24-33岁' (大限)
|
|
66
|
+
print(horoscope.nominal_age) # 25 (虚岁)
|
|
67
|
+
print(horoscope.yearly.name) # '甲辰年' (流年)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## API Documentation
|
|
71
|
+
|
|
72
|
+
### Core Functions
|
|
73
|
+
|
|
74
|
+
#### `astro.by_solar(solar_date, time_index, gender, fix_leap=True, language='zh-CN')`
|
|
75
|
+
|
|
76
|
+
Get astrolabe by solar calendar date.
|
|
77
|
+
|
|
78
|
+
**Parameters:**
|
|
79
|
+
- `solar_date` (str): Solar date in format 'YYYY-M-D'
|
|
80
|
+
- `time_index` (int): Time index 0-12 (0=early子时, 1=丑时, ..., 12=late子时)
|
|
81
|
+
- `gender` (str): '男' or '女'
|
|
82
|
+
- `fix_leap` (bool): Whether to fix leap month
|
|
83
|
+
- `language` (str): Output language ('zh-CN', 'zh-TW', 'en-US', 'ja-JP', 'ko-KR', 'vi-VN')
|
|
84
|
+
|
|
85
|
+
**Returns:** `FunctionalAstrolabe` object
|
|
86
|
+
|
|
87
|
+
#### `astro.by_lunar(lunar_date, time_index, gender, is_leap_month=False, fix_leap=True, language='zh-CN')`
|
|
88
|
+
|
|
89
|
+
Get astrolabe by lunar calendar date.
|
|
90
|
+
|
|
91
|
+
**Parameters:**
|
|
92
|
+
- `lunar_date` (str): Lunar date in format 'YYYY-M-D'
|
|
93
|
+
- `time_index` (int): Time index 0-12
|
|
94
|
+
- `gender` (str): '男' or '女'
|
|
95
|
+
- `is_leap_month` (bool): Whether it's a leap month
|
|
96
|
+
- `fix_leap` (bool): Whether to fix leap month
|
|
97
|
+
- `language` (str): Output language
|
|
98
|
+
|
|
99
|
+
**Returns:** `FunctionalAstrolabe` object
|
|
100
|
+
|
|
101
|
+
### FunctionalAstrolabe Methods
|
|
102
|
+
|
|
103
|
+
- `palace(name_or_index)` - Get palace by name or index
|
|
104
|
+
- `star(star_name)` - Get star object
|
|
105
|
+
- `surrounded_palaces(name_or_index)` - Get surrounded palaces (三方四正)
|
|
106
|
+
- `horoscope(solar_date, time_index)` - Get horoscope data for specified date
|
|
107
|
+
- `get_soul_palace()` - Get soul palace (命宫)
|
|
108
|
+
- `get_body_palace()` - Get body palace (身宫)
|
|
109
|
+
|
|
110
|
+
### FunctionalPalace Methods
|
|
111
|
+
|
|
112
|
+
- `has(stars)` - Check if palace contains all specified stars
|
|
113
|
+
- `has_one_of(stars)` - Check if palace contains any of specified stars
|
|
114
|
+
- `not_have(stars)` - Check if palace doesn't contain any specified stars
|
|
115
|
+
- `has_mutagen(mutagen)` - Check if palace has specified mutagen (四化)
|
|
116
|
+
- `is_empty()` - Check if palace is empty
|
|
117
|
+
|
|
118
|
+
### FunctionalStar Methods
|
|
119
|
+
|
|
120
|
+
- `palace()` - Get palace containing this star
|
|
121
|
+
- `surrounded_palaces()` - Get surrounded palaces of this star
|
|
122
|
+
- `opposite_palace()` - Get opposite palace
|
|
123
|
+
- `with_brightness(brightness)` - Check star brightness
|
|
124
|
+
- `with_mutagen(mutagen)` - Check star mutagen
|
|
125
|
+
- `is_bright()` - Check if star is bright (庙/旺)
|
|
126
|
+
- `is_weak()` - Check if star is weak (陷)
|
|
127
|
+
|
|
128
|
+
### Horoscope System (运势系统)
|
|
129
|
+
|
|
130
|
+
The horoscope system provides fortune analysis for different time periods:
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
# Get horoscope for a specific date
|
|
134
|
+
horoscope = chart.horoscope('2024-1-1', 6)
|
|
135
|
+
|
|
136
|
+
# Decadal horoscope (大限) - 10 years per cycle
|
|
137
|
+
print(horoscope.decadal.name) # e.g., '24-33岁'
|
|
138
|
+
print(horoscope.decadal.palace_names) # Palace where decadal is located
|
|
139
|
+
print(horoscope.decadal.mutagen) # Four transformations
|
|
140
|
+
|
|
141
|
+
# Age limit (小限) - 1 year per cycle
|
|
142
|
+
print(horoscope.age.name) # e.g., '25岁'
|
|
143
|
+
print(horoscope.nominal_age) # 25 (virtual age)
|
|
144
|
+
|
|
145
|
+
# Yearly horoscope (流年)
|
|
146
|
+
print(horoscope.yearly.name) # e.g., '甲辰年'
|
|
147
|
+
print(horoscope.yearly.palace_names) # Palace location in birth chart
|
|
148
|
+
|
|
149
|
+
# Monthly horoscope (流月)
|
|
150
|
+
print(horoscope.monthly.name) # e.g., '丙子月'
|
|
151
|
+
|
|
152
|
+
# Daily horoscope (流日)
|
|
153
|
+
print(horoscope.daily.name) # e.g., '癸酉日'
|
|
154
|
+
|
|
155
|
+
# Hourly horoscope (流时)
|
|
156
|
+
print(horoscope.hourly.name) # e.g., '戊午时'
|
|
157
|
+
|
|
158
|
+
# Get palace for any horoscope level
|
|
159
|
+
yearly_palace = chart.palace(horoscope.yearly.index)
|
|
160
|
+
if yearly_palace:
|
|
161
|
+
print(yearly_palace.major_stars)
|
|
162
|
+
|
|
163
|
+
# Analyze three-sided palaces for yearly horoscope
|
|
164
|
+
surpalaces = chart.surrounded_palaces(horoscope.yearly.index)
|
|
165
|
+
if surpalaces.have_mutagen('禄'):
|
|
166
|
+
print('Yearly palace has luck transformation')
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Horoscope Levels:**
|
|
170
|
+
- **大限 (Decadal)**: 10-year cycle based on five elements class (水二局/木三局/金四局/土五局/火六局)
|
|
171
|
+
- **小限 (Age Limit)**: Annual cycle, starts from soul palace
|
|
172
|
+
- **流年 (Yearly)**: Based on yearly heavenly stem and earthly branch
|
|
173
|
+
- **流月 (Monthly)**: Based on monthly stem and branch
|
|
174
|
+
- **流日 (Daily)**: Based on daily stem and branch
|
|
175
|
+
- **流时 (Hourly)**: Based on hourly stem and branch
|
|
176
|
+
|
|
177
|
+
See [examples/horoscope_usage.py](examples/horoscope_usage.py) for detailed usage examples.
|
|
178
|
+
|
|
179
|
+
## Architecture
|
|
180
|
+
|
|
181
|
+
This is a **pure Python reimplementation** of the original JavaScript iztro library:
|
|
182
|
+
|
|
183
|
+
- **No JavaScript interpreter** - Unlike py-iztro which wraps JS code
|
|
184
|
+
- **Native Python** - All algorithms implemented in Python
|
|
185
|
+
- **Better performance** - No cross-language overhead
|
|
186
|
+
- **Easier to maintain** - Pure Python codebase
|
|
187
|
+
|
|
188
|
+
## Comparison
|
|
189
|
+
|
|
190
|
+
| Feature | iztro (JS) | py-iztro | iztro-py (this) |
|
|
191
|
+
|---------|-----------|----------|-----------------|
|
|
192
|
+
| Language | JavaScript | Python wrapper | Pure Python |
|
|
193
|
+
| Dependencies | Node.js | JS interpreter | Python only |
|
|
194
|
+
| Performance | Fast | Slow (overhead) | Fast |
|
|
195
|
+
| Type Safety | TypeScript | Pydantic | Pydantic |
|
|
196
|
+
| Maintenance | Active | Depends on JS | Independent |
|
|
197
|
+
|
|
198
|
+
## Development
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
# Clone repository
|
|
202
|
+
git clone https://github.com/spyfree/iztro-py.git
|
|
203
|
+
cd iztro-py
|
|
204
|
+
|
|
205
|
+
# Install dependencies
|
|
206
|
+
pip install -e ".[dev]"
|
|
207
|
+
|
|
208
|
+
# Run tests
|
|
209
|
+
pytest
|
|
210
|
+
|
|
211
|
+
# Run with coverage
|
|
212
|
+
pytest --cov=src/iztro_py --cov-report=html
|
|
213
|
+
|
|
214
|
+
# Format code
|
|
215
|
+
black src tests
|
|
216
|
+
|
|
217
|
+
# Type check
|
|
218
|
+
mypy src
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## License
|
|
222
|
+
|
|
223
|
+
MIT License - see [LICENSE](LICENSE) file
|
|
224
|
+
|
|
225
|
+
## Credits
|
|
226
|
+
|
|
227
|
+
This project is inspired by and compatible with [iztro](https://github.com/SylarLong/iztro) by SylarLong.
|
|
228
|
+
|
|
229
|
+
## Contributing
|
|
230
|
+
|
|
231
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
232
|
+
|
|
233
|
+
## Roadmap
|
|
234
|
+
|
|
235
|
+
- [x] Project structure setup
|
|
236
|
+
- [x] Core data types and constants
|
|
237
|
+
- [x] Lunar/Solar calendar conversion
|
|
238
|
+
- [x] Heavenly Stems and Earthly Branches calculations
|
|
239
|
+
- [x] Palace positioning algorithms
|
|
240
|
+
- [x] Star positioning algorithms (紫微、天府、14主星)
|
|
241
|
+
- [x] Minor stars algorithms (14辅星)
|
|
242
|
+
- [x] Mutagen system (四化)
|
|
243
|
+
- [x] Brightness calculations
|
|
244
|
+
- [x] FunctionalAstrolabe class
|
|
245
|
+
- [x] FunctionalPalace class
|
|
246
|
+
- [x] FunctionalStar class
|
|
247
|
+
- [x] Surrounded palaces (三方四正)
|
|
248
|
+
- [x] Horoscope system (大限、流年、流月、流日、流时)
|
|
249
|
+
- [x] Unit tests (14/14 core tests + 4/4 horoscope tests passing)
|
|
250
|
+
- [x] Usage examples
|
|
251
|
+
- [ ] Internationalization (i18n) - currently zh-CN only
|
|
252
|
+
- [ ] Documentation website
|
|
253
|
+
- [ ] PyPI package release
|