pohualli


Namepohualli JSON
Version 0.3.0 PyPI version JSON
download
home_pageNone
SummaryPython port (in progress) of the Turbo Pascal Pohualli calendrical utility
upload_time2025-09-05 21:54:27
maintainerNone
docs_urlNone
authorPort Maintainers
requires_python>=3.10
licenseGNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2025 muscariello Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. <... Full GPLv3 text omitted for brevity in this file snippet. Include the complete license text in your repository for compliance or retrieve from https://www.gnu.org/licenses/gpl-3.0.txt ...> END OF TERMS AND CONDITIONS For the full license text, see https://www.gnu.org/licenses/gpl-3.0.txt
keywords maya aztec calendar mesoamerican astronomy long-count tzolkin haab
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Pohualli (Python Port)

[![CI](https://github.com/muscariello/pohualli-python/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/muscariello/pohualli-python/actions/workflows/ci.yml) [![Coverage](https://codecov.io/gh/muscariello/pohualli-python/branch/main/graph/badge.svg)](https://codecov.io/gh/muscariello/pohualli-python) [![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue)](https://muscariello.github.io/pohualli-python/) [![PyPI](https://img.shields.io/pypi/v/pohualli.svg)](https://pypi.org/project/pohualli/) [![Changelog](https://img.shields.io/badge/changelog-latest-orange)](CHANGELOG.md)

Python reimplementation of the original Turbo Pascal Pohualli calendrical utility.

## Highlights

- Maya & Aztec core calculations (Tzolk'in, Haab, Long Count, Year Bearer)
- 819‑day cycle, planetary synodic helpers, zodiac & moon heuristics
- Correlation ("New Era") presets + on-the-fly overrides
- Auto-derivation of correction offsets from partial constraints
- Unified composite API & high-coverage test suite (≥90% per file)
- FastAPI web UI + CLI + JSON output

## Install

### Option 1: PyPI (CLI & library)
```
pip install pohualli
```
Include web extras (FastAPI UI) if you want the local server:
```
pip install "pohualli[web]"
```
PyPI: https://pypi.org/project/pohualli/

### Option 2: Desktop Bundle (macOS / Windows)
Download the pre-built bundle artifacts (App on macOS, MSI or app dir on Windows) from the Desktop Bundles workflow or a Release.

macOS first run (unsigned / ad‑hoc bundle):
1. Move `Pohualli.app` to `/Applications` (optional but typical).
2. Control‑click the app → Open → Open (this whitelists it in Gatekeeper).
3. Browser opens automatically; if not, visit the printed `http://127.0.0.1:<port>`.

Windows:
1. Run the MSI or `Pohualli.exe` inside the unpacked directory.
2. If SmartScreen warns, choose “More info” → “Run anyway”.
3. Browser tab should appear automatically.

Updates: replace the old bundle with the new one (no persistent user data yet).

Latest release downloads: https://github.com/muscariello/pohualli-python/releases

### Option 3: From Source (development)
```
git clone https://github.com/muscariello/pohualli-python.git
cd pohualli-python
pip install -e .[dev,web]
```
Then run CLI (`pohualli ...`) or web app (`uvicorn pohualli.webapp:app --reload`).

## Structure
```
.
├── CHANGELOG.md                     # Project changelog / release notes
├── LICENSE                          # GPL-3.0-only license text
├── README.md                        # Overview & usage (this file)
├── docker-compose.yml               # Convenience orchestration for web app
├── Dockerfile                       # Multi-arch container build definition
├── mkdocs.yml                       # MkDocs Material documentation config
├── pyproject.toml                   # Packaging & dependency metadata
├── docs/                            # Documentation markdown sources (MkDocs)
│   ├── index.md                     # Landing page
│   ├── dev.md                       # Development & contributing notes
│   ├── license.md                   # License blurb for docs site
│   ├── concepts/                    # Conceptual explanations
│   │   ├── calendars.md             # Calendar systems overview
│   │   └── configuration.md         # Correlations & correction parameters
│   └── usage/                       # How-to guides
│       ├── quickstart.md            # Quick installation & first run
│       ├── cli.md                   # CLI usage details
│       ├── desktop.md               # Desktop bundles (Briefcase) guide
│       └── python-api.md            # Python API examples
├── pohualli/
│   ├── __init__.py                  # Public API exports (compute_composite, etc.)
│   ├── __main__.py                  # Module entry point (python -m pohualli / bundle)
│   ├── autocorr.py                  # Derive correction offsets from constraints
│   ├── aztec.py                     # Aztec (Tonalpohualli) name tables & helpers
│   ├── calendar_dates.py            # Gregorian/Julian conversions & weekday calc
│   ├── cli.py                       # Command line interface entry point
│   ├── composite.py                 # High-level composite computation orchestrator
│   ├── correlations.py              # Correlation (New Era) preset definitions
│   ├── cycle819.py                  # 819‑day cycle station & direction colors
│   ├── desktop_app.py               # Desktop launcher for packaged app (Briefcase)
│   ├── maya.py                      # Core Maya calendar math (Tzolk'in / Haab / LC)
│   ├── moon.py                      # Moon phase / anomaly heuristics
│   ├── planets.py                   # Planetary synodic value helpers
│   ├── templates/
│   │   └── index.html               # Web UI Jinja2 template
│   ├── types.py                     # Dataclasses & global correction state types
│   ├── webapp.py                    # FastAPI application (async range jobs, endpoints)
│   ├── yearbear.py                  # Year Bearer packing/unpacking utilities
│   └── zodiac.py                    # Star & earth zodiac angle computations
└── tests/                           # Pytest suite (broad branch coverage)
  ├── test_async_range_job.py          # Async range job creation & polling
  ├── test_async_cancel_partial.py     # Cancellation partial-results semantics
  ├── test_autocorr*.py                # Auto-correction derivation & edge cases
  ├── test_cli_direct.py               # Direct main() invocation basic paths
  ├── test_cli_early_filters_paths.py  # Early filter continue branches (range)
  ├── test_cli_more.py                 # JSON output & new-era/year bearer refs
  ├── test_cli_no_subproc.py           # CLI coverage without subprocess fork
  ├── test_cli_range_matrix.py         # Combinatorial filter matrix (range)
  ├── test_cli_search_range*.py        # Range search modes (table/json-lines)
  ├── test_cli_textual_branches.py     # Textual from-jdn output branches
  ├── test_composite.py                # Composite object field consistency
  ├── test_cycle_planets.py            # 819-cycle & planetary helpers
  ├── test_desktop_app.py              # Desktop launcher behavior
  ├── test_extra_cycles_yearbear_moon.py # Mixed composite cycle branches
  ├── test_maya*.py                    # Maya calendar arithmetic & validation
  ├── test_moon_zodiac.py              # Moon + zodiac computations
  ├── test_web.py                      # Basic web endpoint checks
  ├── test_web_extra.py                # Additional /api/convert / derive cases
  ├── test_web_range_job_extra.py      # Range job edge cases & listing
  ├── test_webapp_internal.py          # Internal helpers (_early_filters etc.)
  ├── test_webapp_filters_matrix.py    # Each filter type in async jobs
  ├── test_webapp_more.py              # Not-found, cancel-after-complete, culture
  ├── test_webapp_additional.py        # Reversed ranges, invalid specs, limits
  ├── test_yearbear_cli.py             # Year bearer & CLI integration
  └── test_zodiac_extra.py             # Additional zodiac heuristic coverage
```

## Python Usage
```python
from pohualli import compute_composite
result = compute_composite(2451545)
print(result.tzolkin_name, result.long_count, result.star_zodiac_name)
```

## CLI Examples
```
# Basic human-readable conversion
pohualli from-jdn 2451545

# Year Bearer reference override
pohualli from-jdn 2451545 --year-bearer-ref 0 0

# JSON output (pretty with jq)
pohualli from-jdn 2451545 --json | jq .long_count

# Override New Era just for this invocation
pohualli from-jdn 2451545 --new-era 584283 --json

# Apply a named correlation preset globally
pohualli apply-correlation gmt-584283

# List available correlations
pohualli list-correlations

# Derive corrections from partial constraint (tzolkin only)
pohualli derive-autocorr 2451545 --tzolkin "4 Ahau"

# Derive with multiple constraints (tzolkin + haab + g)
pohualli derive-autocorr 2451545 --tzolkin "4 Ahau" --haab "3 Pop" --g 5

# Persist and restore configuration
pohualli save-config config.json
pohualli load-config config.json

# Full JSON composite into a file
pohualli from-jdn 2451545 --json > composite.json

# Range search (scan inclusive JDN interval with filters)
# Find first 5 dates in a span whose Tzolkin name is Imix and Haab month is Cumhu
pohualli search-range 584283 584500 --tzolkin-name Imix --haab-month Cumhu --limit 5

# Long Count pattern matching (use * as wildcard for a component)
pohualli search-range 500000 600000 --long-count '9.*.*.*.*.*' --limit 3

# Output JSON lines (machine processing)
pohualli search-range 584283 584400 --tzolkin-value 4 --json-lines --limit 2

# Select custom output fields
pohualli search-range 584283 584400 --fields jdn,tzolkin_name,haab_month_name --limit 3

# Switch to Aztec year-bearer derivation (subtracts 364 days in interval logic)
pohualli from-jdn 2451545 --culture aztec --year-bearer-ref 0 0

# Range search in Aztec mode
pohualli search-range 584283 584400 --culture aztec --tzolkin-value 4 --limit 2
```

## Web App
```
uvicorn pohualli.webapp:app --reload
```
Open http://127.0.0.1:8000

## Docker
```
docker build -t pohualli .
docker run --rm -p 8000:8000 pohualli
```
Or use the published image:
```
docker run --rm -p 8000:8000 ghcr.io/muscariello/pohualli-python:latest
```

## Testing
```
pytest -q
```

## License
GPL-3.0-only

### Maya vs Aztec Year Bearer Note
The computation of the Year Bearer differs: in Aztec (tonalpohualli) mode the interval between the target Haab position and the reference is reduced by 364 days before deriving the bearer, shifting the resulting Tzolkin pair relative to Maya convention. Use `--culture aztec` (CLI) or the Culture dropdown in the web UI to toggle. Default is Maya.

## Reference
Sołtysiak, A. & Lebeuf, A. (2011). Pohualli 1.01. A computer simulation of Mesoamerican calendar systems. 8(49), 165–168. [ResearchGate](https://www.researchgate.net/publication/270956742_2011_Pohualli_101_A_computer_simulation_of_Mesoamerican_calendar_systems)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pohualli",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "maya, aztec, calendar, mesoamerican, astronomy, long-count, tzolkin, haab",
    "author": "Port Maintainers",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/cd/8b/afb65f1745b603d60a6637386c3f1c8128b8f53c2611343f4d1cc0fc8197/pohualli-0.3.0.tar.gz",
    "platform": null,
    "description": "# Pohualli (Python Port)\n\n[![CI](https://github.com/muscariello/pohualli-python/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/muscariello/pohualli-python/actions/workflows/ci.yml) [![Coverage](https://codecov.io/gh/muscariello/pohualli-python/branch/main/graph/badge.svg)](https://codecov.io/gh/muscariello/pohualli-python) [![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue)](https://muscariello.github.io/pohualli-python/) [![PyPI](https://img.shields.io/pypi/v/pohualli.svg)](https://pypi.org/project/pohualli/) [![Changelog](https://img.shields.io/badge/changelog-latest-orange)](CHANGELOG.md)\n\nPython reimplementation of the original Turbo Pascal Pohualli calendrical utility.\n\n## Highlights\n\n- Maya & Aztec core calculations (Tzolk'in, Haab, Long Count, Year Bearer)\n- 819\u2011day cycle, planetary synodic helpers, zodiac & moon heuristics\n- Correlation (\"New Era\") presets + on-the-fly overrides\n- Auto-derivation of correction offsets from partial constraints\n- Unified composite API & high-coverage test suite (\u226590% per file)\n- FastAPI web UI + CLI + JSON output\n\n## Install\n\n### Option 1: PyPI (CLI & library)\n```\npip install pohualli\n```\nInclude web extras (FastAPI UI) if you want the local server:\n```\npip install \"pohualli[web]\"\n```\nPyPI: https://pypi.org/project/pohualli/\n\n### Option 2: Desktop Bundle (macOS / Windows)\nDownload the pre-built bundle artifacts (App on macOS, MSI or app dir on Windows) from the Desktop Bundles workflow or a Release.\n\nmacOS first run (unsigned / ad\u2011hoc bundle):\n1. Move `Pohualli.app` to `/Applications` (optional but typical).\n2. Control\u2011click the app \u2192 Open \u2192 Open (this whitelists it in Gatekeeper).\n3. Browser opens automatically; if not, visit the printed `http://127.0.0.1:<port>`.\n\nWindows:\n1. Run the MSI or `Pohualli.exe` inside the unpacked directory.\n2. If SmartScreen warns, choose \u201cMore info\u201d \u2192 \u201cRun anyway\u201d.\n3. Browser tab should appear automatically.\n\nUpdates: replace the old bundle with the new one (no persistent user data yet).\n\nLatest release downloads: https://github.com/muscariello/pohualli-python/releases\n\n### Option 3: From Source (development)\n```\ngit clone https://github.com/muscariello/pohualli-python.git\ncd pohualli-python\npip install -e .[dev,web]\n```\nThen run CLI (`pohualli ...`) or web app (`uvicorn pohualli.webapp:app --reload`).\n\n## Structure\n```\n.\n\u251c\u2500\u2500 CHANGELOG.md                     # Project changelog / release notes\n\u251c\u2500\u2500 LICENSE                          # GPL-3.0-only license text\n\u251c\u2500\u2500 README.md                        # Overview & usage (this file)\n\u251c\u2500\u2500 docker-compose.yml               # Convenience orchestration for web app\n\u251c\u2500\u2500 Dockerfile                       # Multi-arch container build definition\n\u251c\u2500\u2500 mkdocs.yml                       # MkDocs Material documentation config\n\u251c\u2500\u2500 pyproject.toml                   # Packaging & dependency metadata\n\u251c\u2500\u2500 docs/                            # Documentation markdown sources (MkDocs)\n\u2502   \u251c\u2500\u2500 index.md                     # Landing page\n\u2502   \u251c\u2500\u2500 dev.md                       # Development & contributing notes\n\u2502   \u251c\u2500\u2500 license.md                   # License blurb for docs site\n\u2502   \u251c\u2500\u2500 concepts/                    # Conceptual explanations\n\u2502   \u2502   \u251c\u2500\u2500 calendars.md             # Calendar systems overview\n\u2502   \u2502   \u2514\u2500\u2500 configuration.md         # Correlations & correction parameters\n\u2502   \u2514\u2500\u2500 usage/                       # How-to guides\n\u2502       \u251c\u2500\u2500 quickstart.md            # Quick installation & first run\n\u2502       \u251c\u2500\u2500 cli.md                   # CLI usage details\n\u2502       \u251c\u2500\u2500 desktop.md               # Desktop bundles (Briefcase) guide\n\u2502       \u2514\u2500\u2500 python-api.md            # Python API examples\n\u251c\u2500\u2500 pohualli/\n\u2502   \u251c\u2500\u2500 __init__.py                  # Public API exports (compute_composite, etc.)\n\u2502   \u251c\u2500\u2500 __main__.py                  # Module entry point (python -m pohualli / bundle)\n\u2502   \u251c\u2500\u2500 autocorr.py                  # Derive correction offsets from constraints\n\u2502   \u251c\u2500\u2500 aztec.py                     # Aztec (Tonalpohualli) name tables & helpers\n\u2502   \u251c\u2500\u2500 calendar_dates.py            # Gregorian/Julian conversions & weekday calc\n\u2502   \u251c\u2500\u2500 cli.py                       # Command line interface entry point\n\u2502   \u251c\u2500\u2500 composite.py                 # High-level composite computation orchestrator\n\u2502   \u251c\u2500\u2500 correlations.py              # Correlation (New Era) preset definitions\n\u2502   \u251c\u2500\u2500 cycle819.py                  # 819\u2011day cycle station & direction colors\n\u2502   \u251c\u2500\u2500 desktop_app.py               # Desktop launcher for packaged app (Briefcase)\n\u2502   \u251c\u2500\u2500 maya.py                      # Core Maya calendar math (Tzolk'in / Haab / LC)\n\u2502   \u251c\u2500\u2500 moon.py                      # Moon phase / anomaly heuristics\n\u2502   \u251c\u2500\u2500 planets.py                   # Planetary synodic value helpers\n\u2502   \u251c\u2500\u2500 templates/\n\u2502   \u2502   \u2514\u2500\u2500 index.html               # Web UI Jinja2 template\n\u2502   \u251c\u2500\u2500 types.py                     # Dataclasses & global correction state types\n\u2502   \u251c\u2500\u2500 webapp.py                    # FastAPI application (async range jobs, endpoints)\n\u2502   \u251c\u2500\u2500 yearbear.py                  # Year Bearer packing/unpacking utilities\n\u2502   \u2514\u2500\u2500 zodiac.py                    # Star & earth zodiac angle computations\n\u2514\u2500\u2500 tests/                           # Pytest suite (broad branch coverage)\n  \u251c\u2500\u2500 test_async_range_job.py          # Async range job creation & polling\n  \u251c\u2500\u2500 test_async_cancel_partial.py     # Cancellation partial-results semantics\n  \u251c\u2500\u2500 test_autocorr*.py                # Auto-correction derivation & edge cases\n  \u251c\u2500\u2500 test_cli_direct.py               # Direct main() invocation basic paths\n  \u251c\u2500\u2500 test_cli_early_filters_paths.py  # Early filter continue branches (range)\n  \u251c\u2500\u2500 test_cli_more.py                 # JSON output & new-era/year bearer refs\n  \u251c\u2500\u2500 test_cli_no_subproc.py           # CLI coverage without subprocess fork\n  \u251c\u2500\u2500 test_cli_range_matrix.py         # Combinatorial filter matrix (range)\n  \u251c\u2500\u2500 test_cli_search_range*.py        # Range search modes (table/json-lines)\n  \u251c\u2500\u2500 test_cli_textual_branches.py     # Textual from-jdn output branches\n  \u251c\u2500\u2500 test_composite.py                # Composite object field consistency\n  \u251c\u2500\u2500 test_cycle_planets.py            # 819-cycle & planetary helpers\n  \u251c\u2500\u2500 test_desktop_app.py              # Desktop launcher behavior\n  \u251c\u2500\u2500 test_extra_cycles_yearbear_moon.py # Mixed composite cycle branches\n  \u251c\u2500\u2500 test_maya*.py                    # Maya calendar arithmetic & validation\n  \u251c\u2500\u2500 test_moon_zodiac.py              # Moon + zodiac computations\n  \u251c\u2500\u2500 test_web.py                      # Basic web endpoint checks\n  \u251c\u2500\u2500 test_web_extra.py                # Additional /api/convert / derive cases\n  \u251c\u2500\u2500 test_web_range_job_extra.py      # Range job edge cases & listing\n  \u251c\u2500\u2500 test_webapp_internal.py          # Internal helpers (_early_filters etc.)\n  \u251c\u2500\u2500 test_webapp_filters_matrix.py    # Each filter type in async jobs\n  \u251c\u2500\u2500 test_webapp_more.py              # Not-found, cancel-after-complete, culture\n  \u251c\u2500\u2500 test_webapp_additional.py        # Reversed ranges, invalid specs, limits\n  \u251c\u2500\u2500 test_yearbear_cli.py             # Year bearer & CLI integration\n  \u2514\u2500\u2500 test_zodiac_extra.py             # Additional zodiac heuristic coverage\n```\n\n## Python Usage\n```python\nfrom pohualli import compute_composite\nresult = compute_composite(2451545)\nprint(result.tzolkin_name, result.long_count, result.star_zodiac_name)\n```\n\n## CLI Examples\n```\n# Basic human-readable conversion\npohualli from-jdn 2451545\n\n# Year Bearer reference override\npohualli from-jdn 2451545 --year-bearer-ref 0 0\n\n# JSON output (pretty with jq)\npohualli from-jdn 2451545 --json | jq .long_count\n\n# Override New Era just for this invocation\npohualli from-jdn 2451545 --new-era 584283 --json\n\n# Apply a named correlation preset globally\npohualli apply-correlation gmt-584283\n\n# List available correlations\npohualli list-correlations\n\n# Derive corrections from partial constraint (tzolkin only)\npohualli derive-autocorr 2451545 --tzolkin \"4 Ahau\"\n\n# Derive with multiple constraints (tzolkin + haab + g)\npohualli derive-autocorr 2451545 --tzolkin \"4 Ahau\" --haab \"3 Pop\" --g 5\n\n# Persist and restore configuration\npohualli save-config config.json\npohualli load-config config.json\n\n# Full JSON composite into a file\npohualli from-jdn 2451545 --json > composite.json\n\n# Range search (scan inclusive JDN interval with filters)\n# Find first 5 dates in a span whose Tzolkin name is Imix and Haab month is Cumhu\npohualli search-range 584283 584500 --tzolkin-name Imix --haab-month Cumhu --limit 5\n\n# Long Count pattern matching (use * as wildcard for a component)\npohualli search-range 500000 600000 --long-count '9.*.*.*.*.*' --limit 3\n\n# Output JSON lines (machine processing)\npohualli search-range 584283 584400 --tzolkin-value 4 --json-lines --limit 2\n\n# Select custom output fields\npohualli search-range 584283 584400 --fields jdn,tzolkin_name,haab_month_name --limit 3\n\n# Switch to Aztec year-bearer derivation (subtracts 364 days in interval logic)\npohualli from-jdn 2451545 --culture aztec --year-bearer-ref 0 0\n\n# Range search in Aztec mode\npohualli search-range 584283 584400 --culture aztec --tzolkin-value 4 --limit 2\n```\n\n## Web App\n```\nuvicorn pohualli.webapp:app --reload\n```\nOpen http://127.0.0.1:8000\n\n## Docker\n```\ndocker build -t pohualli .\ndocker run --rm -p 8000:8000 pohualli\n```\nOr use the published image:\n```\ndocker run --rm -p 8000:8000 ghcr.io/muscariello/pohualli-python:latest\n```\n\n## Testing\n```\npytest -q\n```\n\n## License\nGPL-3.0-only\n\n### Maya vs Aztec Year Bearer Note\nThe computation of the Year Bearer differs: in Aztec (tonalpohualli) mode the interval between the target Haab position and the reference is reduced by 364 days before deriving the bearer, shifting the resulting Tzolkin pair relative to Maya convention. Use `--culture aztec` (CLI) or the Culture dropdown in the web UI to toggle. Default is Maya.\n\n## Reference\nSo\u0142tysiak, A. & Lebeuf, A. (2011). Pohualli 1.01. A computer simulation of Mesoamerican calendar systems. 8(49), 165\u2013168. [ResearchGate](https://www.researchgate.net/publication/270956742_2011_Pohualli_101_A_computer_simulation_of_Mesoamerican_calendar_systems)\n",
    "bugtrack_url": null,
    "license": "GNU GENERAL PUBLIC LICENSE\n        Version 3, 29 June 2007\n        \n        Copyright (C) 2025  muscariello\n        \n        Everyone is permitted to copy and distribute verbatim copies\n        of this license document, but changing it is not allowed.\n        \n        Preamble\n        \n        The GNU General Public License is a free, copyleft license for\n        software and other kinds of works.\n        \n        The licenses for most software and other practical works are designed\n        to take away your freedom to share and change the works. By contrast,\n        the GNU General Public License is intended to guarantee your freedom to\n        share and change all versions of a program--to make sure it remains free\n        software for all its users. We, the Free Software Foundation, use the\n        GNU General Public License for most of our software; it applies also to\n        any other work released this way by its authors. You can apply it to\n        your programs, too.\n        \n        When we speak of free software, we are referring to freedom, not\n        price. Our General Public Licenses are designed to make sure that you\n        have the freedom to distribute copies of free software (and charge for\n        them if you wish), that you receive source code or can get it if you\n        want it, that you can change the software or use pieces of it in new\n        free programs, and that you know you can do these things.\n        \n        To protect your rights, we need to prevent others from denying you\n        these rights or asking you to surrender the rights. Therefore, you have\n        certain responsibilities if you distribute copies of the software, or if\n        you modify it: responsibilities to respect the freedom of others.\n        \n        For example, if you distribute copies of such a program, whether\n        gratis or for a fee, you must pass on to the recipients the same\n        freedoms that you received. You must make sure that they, too, receive\n        or can get the source code. And you must show them these terms so they\n        know their rights.\n        \n        Developers that use the GNU GPL protect your rights with two steps:\n        (1) assert copyright on the software, and (2) offer you this License\n        giving you legal permission to copy, distribute and/or modify it.\n        \n        For the developers' and authors' protection, the GPL clearly explains\n        that there is no warranty for this free software. For both users' and\n        authors' sake, the GPL requires that modified versions be marked as\n        changed, so that their problems will not be attributed erroneously to\n        authors of previous versions.\n        \n        Some devices are designed to deny users access to install or run\n        modified versions of the software inside them, although the manufacturer\n        can do so. This is fundamentally incompatible with the aim of\n        protecting users' freedom to change the software. The systematic\n        pattern of such abuse occurs in the area of products for individuals to\n        use, which is precisely where it is most unacceptable. Therefore, we\n        have designed this version of the GPL to prohibit the practice for\n        those products. If such problems arise substantially in other domains,\n        we stand ready to extend this provision to those domains in future\n        versions of the GPL, as needed to protect the freedom of users.\n        \n        Finally, every program is threatened constantly by software patents.\n        States should not allow patents to restrict development and use of\n        software on general-purpose computers, but in those that do, we wish to\n        avoid the special danger that patents applied to a free program could\n        make it effectively proprietary. To prevent this, the GPL assures that\n        patents cannot be used to render the program non-free.\n        \n        The precise terms and conditions for copying, distribution and\n        modification follow.\n        \n        <... Full GPLv3 text omitted for brevity in this file snippet. Include the complete license text in your repository for compliance or retrieve from https://www.gnu.org/licenses/gpl-3.0.txt ...>\n        \n        END OF TERMS AND CONDITIONS\n        \n        For the full license text, see https://www.gnu.org/licenses/gpl-3.0.txt\n        \n        ",
    "summary": "Python port (in progress) of the Turbo Pascal Pohualli calendrical utility",
    "version": "0.3.0",
    "project_urls": {
        "Documentation": "https://muscariello.github.io/pohualli-python/",
        "Homepage": "https://github.com/muscariello/pohualli-python",
        "Issues": "https://github.com/muscariello/pohualli-python/issues",
        "Source": "https://github.com/muscariello/pohualli-python"
    },
    "split_keywords": [
        "maya",
        " aztec",
        " calendar",
        " mesoamerican",
        " astronomy",
        " long-count",
        " tzolkin",
        " haab"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "56fbdb931d71f2db8f65ae179722c10c188472a0be609271c09ae830d5885db1",
                "md5": "dd722c347a3f28dbb22a9e81cf208326",
                "sha256": "687c181ac4a45315d9c718e06ad828ce518285b2f9ef1ba64c0de0a00ef939df"
            },
            "downloads": -1,
            "filename": "pohualli-0.3.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "dd722c347a3f28dbb22a9e81cf208326",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 47862,
            "upload_time": "2025-09-05T21:54:26",
            "upload_time_iso_8601": "2025-09-05T21:54:26.397914Z",
            "url": "https://files.pythonhosted.org/packages/56/fb/db931d71f2db8f65ae179722c10c188472a0be609271c09ae830d5885db1/pohualli-0.3.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cd8bafb65f1745b603d60a6637386c3f1c8128b8f53c2611343f4d1cc0fc8197",
                "md5": "f590c66a194b5fac41702c7b4d6fbe39",
                "sha256": "d68f6d005b5712a7a71b160fa2f2e5169213b484bf095eae6baeb519e8609aaf"
            },
            "downloads": -1,
            "filename": "pohualli-0.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "f590c66a194b5fac41702c7b4d6fbe39",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 64755,
            "upload_time": "2025-09-05T21:54:27",
            "upload_time_iso_8601": "2025-09-05T21:54:27.586995Z",
            "url": "https://files.pythonhosted.org/packages/cd/8b/afb65f1745b603d60a6637386c3f1c8128b8f53c2611343f4d1cc0fc8197/pohualli-0.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-05 21:54:27",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "muscariello",
    "github_project": "pohualli-python",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pohualli"
}
        
Elapsed time: 0.65674s