Skip to main content

Python library for Traditional and Vedic Astrology (fork of flatangle/flatlib)

Project description

mayaastrolib

A modern, typed, unified Western + Vedic astrology engine for Python 3.10+.

mayaastrolib is a Python library for Traditional (Hellenistic/Western) and Vedic (Jyotisha) astrology, computed on the Swiss Ephemeris. It is a thoroughly modernised, heavily extended fork of flatangle/flatlib (MIT, unmaintained in practice since 2024).

Original copyright © João Ventura, MIT licensed. Fork modifications © Rangan C., 2026. See docs/FORK-RATIONALE.md for why this fork exists.

from mayaastrolib import const
from mayaastrolib.chart import Chart
from mayaastrolib.datetime import Datetime
from mayaastrolib.geopos import GeoPos

date = Datetime('2015/03/13', '17:00', '+00:00')
pos = GeoPos('38n32', '8w54')
chart = Chart(date, pos)

sun = chart.get(const.SUN)
print(sun)
# <Sun Pisces +22:47:25 +00:59:51>

What this fork adds over flatlib

flatlib is an excellent traditional-astrology core, but it stopped at Python-2-era packaging, had no type hints, ~34% test coverage, and no sidereal/Vedic support. mayaastrolib keeps the calculation core's correctness and rebuilds everything around it:

🪔 A complete Vedic (Jyotisha) subsystem — new, ~3,600 LOC, 12 modules

flatlib is tropical-only. mayaastrolib adds a full sidereal engine behind one switch (Chart(zodiac=const.ZODIAC_SIDEREAL, ayanamsa=const.AYANAMSA_LAHIRI)):

Module What it computes
vedic.ayanamsa Lahiri, Krishnamurti (KP), Raman, Fagan-Bradley
vedic.nakshatras 27 nakshatras, lords, padas, tarabala
vedic.divisional all 16 BPHS divisional charts (D1–D60 / Shodashavarga)
vedic.dasha Vimshottari Mahadasha / Antardasha / Pratyantardasha
vedic.ashtakavarga BAV/SAV (337-bindu system), prastara, trikona/ekadhipatya shodhana, kakshya
vedic.yogas Pancha Mahapurusha, Raja, Dhana, Vipareeta, Neecha-Bhanga, Gaja-Kesari, lesser yogas + strength scoring
vedic.sadesati Sade Sati phases + small-panoti (ashtama/kantaka shani)
vedic.upagrahas Sun-derived upagrahas + Gulika/Mandi
vedic.tajika (+_bala, _aspects) annual charts (Varshaphala), Mudda dasha, Sahams, Harsha/Panchavargiya Bala, Ithasala/Isharafa/Nakta
vedic.kp Krishnamurti Paddhati — 249-row sub-lord table, sub-sub-lord, horary, Ruling Planets

⚙️ Modern engineering — the whole codebase brought to current standards

  • Python 3.10+ baseline (3.12 target); all Python-2 compatibility code removed.
  • Type hints rolling out across the public API (geopos, datetime done; core classes in progress).
  • Modern packaging — single pyproject.toml (PEP 621); setup.py, requirements.txt, and README.rst deleted.
  • ruff format + lint (clean across 121 files) and mypy in CI.
  • CI — GitHub Actions matrix on Python 3.10 / 3.11 / 3.12.

🧪 Real correctness guarantees — coverage 34% → 94%

  • 553 tests (+87 subtests), all passing, 94% coverage (80% CI floor).
  • Golden tests anchor planet positions against Skyfield — an independent ephemeris — at ±2 arc-minutes for reference charts (Einstein, Kahlo, Amundsen), plus astronomical-invariant suites (houses sum to 360°, cusps ordered, etc.).

✨ API ergonomics & correctness fixes

  • Chart.houseOf(), Chart.objectsInHouse(), Object.house, House.objects (object↔house links).
  • Datetime.from_pydatetime() / .now() / .to_pydatetime().
  • Immutable Object.with_longitude(), Chart.profected(), zodiac-aware Chart.solarReturn().
  • GeoPos now validates latitude/longitude ranges instead of silently producing a wrong chart.
  • Thread-safe sidereal calculation (lock-guarded Swiss-Ephemeris global state).
  • Eclipse-keyword bug fixed for pyswisseph 2.x; fixed-star magnitude lookups cached (144× speedup).

See CHANGELOG.md for the full task-by-task history.


Development & provenance

Most of the fork's commits — the entire Vedic subsystem, the modernisation, and the test suite — were authored through Claude Code (Anthropic's agentic CLI), with minimal line-by-line human review of individual diffs.

That makes the test discipline the load-bearing part of this project, by design — correctness is verified, not taken on trust:

  • Structural tests pin every public function's contract (553 tests, 94% coverage).
  • Golden tests anchor the astronomical output against Skyfield — a completely independent ephemeris — at ±2 arc-minutes for known reference charts, so a wrong calculation fails CI rather than shipping silently.
  • The library is exercised in real applications (the mayaastro.com lunar site and its local demo), which surfaces integration issues that unit tests don't.

In other words: the code is AI-generated, but the behaviour is held to an independent, reproducible, real-world standard. Classical-technique simplifications (e.g. yoga strength using accidental dignity rather than full Shadbala) are documented honestly in CHANGELOG.md and docs/PROJECT-LOG.md rather than hidden.


Documentation

Start here:

The original flatlib API documentation is largely still applicable — substitute flatlib with mayaastrolib in import paths.

Installation

mayaastrolib requires Python 3.10 or later. Install from source:

git clone https://github.com/ranganc007/mayaastrolib.git
cd mayaastrolib
pip install -e .

The only runtime dependency is pyswisseph (Swiss Ephemeris). A PyPI release will follow once the public API stabilises.

Migrating from flatlib

mayaastrolib ships a compatibility shim: existing import flatlib and from flatlib.x import Y calls keep working but emit a DeprecationWarning. Update imports to mayaastrolib at your convenience; the shim is removed in version 1.0.

Development

git clone https://github.com/ranganc007/mayaastrolib.git
cd mayaastrolib
pip install -e ".[dev]"
pytest
ruff check . && ruff format --check . && mypy mayaastrolib/

Licensing

mayaastrolib is MIT-licensed (preserving flatlib's original copyright chain). It depends on pyswisseph (LGPL) and the Swiss Ephemeris data, which is GPL / commercial dual-licensed — if you ship mayaastrolib in a closed-source product you must comply with the Swiss Ephemeris GPL terms or hold a commercial Swiss Ephemeris licence. See LICENSING.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mayaastrolib-0.3.1.tar.gz (5.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mayaastrolib-0.3.1-py3-none-any.whl (5.8 MB view details)

Uploaded Python 3

File details

Details for the file mayaastrolib-0.3.1.tar.gz.

File metadata

  • Download URL: mayaastrolib-0.3.1.tar.gz
  • Upload date:
  • Size: 5.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for mayaastrolib-0.3.1.tar.gz
Algorithm Hash digest
SHA256 1356bc745e0c398a2e78fb4b351be5e5dbe49586fce9af6edfabee1a6623c8e6
MD5 3d8e64038c8d4486338ac2ac51f5c798
BLAKE2b-256 6f8c688eb0539b29577136eda9768b2c25fadf614ea73d7f58773d1b8d51993c

See more details on using hashes here.

File details

Details for the file mayaastrolib-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: mayaastrolib-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 5.8 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for mayaastrolib-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 129c1b0b4392b631bede77185dd9b7bd3211db157943a9b6c055282704d3736e
MD5 0697de56dfeab5d0b0c371f2d529a1a0
BLAKE2b-256 f859c5b7e71de169eea40dec603b5e35aa185d7f63076626b2d5ba50ad32481c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page