macho


Namemacho JSON
Version 0.0.1 PyPI version JSON
download
home_pageNone
SummaryMacho is a fast, memory-efficient in-memory cache with support for sharding, TTL, and pluggable eviction strategies like LRU, FIFO and Random.
upload_time2025-08-26 18:16:52
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT License Copyright 2025 HysingerDev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords caching cache distributed cache memory efficiency in-memory eviction strategies lru fifo time-to-live sharding bloom filter streamlit metrics interning lightweight lightweight classes high-performance probabilistic data structures
VCS
bugtrack_url
requirements altair attrs bitarray blinker cachetools certifi charset-normalizer click gitdb GitPython idna iniconfig Jinja2 jsonschema jsonschema-specifications MarkupSafe mmh3 narwhals numpy packaging pandas pillow platformdirs plotly pluggy protobuf pyarrow pydeck Pygments pytest python-dateutil pytz referencing requests rpds-py six smmap streamlit tenacity toml tornado typing_extensions tzdata urllib3
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 📦 Macho - Memory Adept Caching Operations

[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
[![Python Version](https://img.shields.io/badge/python-3.8%2B-blue.svg)](https://www.python.org/downloads/)
[![PyPI - 0.1.0](https://img.shields.io/badge/PyPI-coming--soon-yellow)](https://pypi.org/)

---

## 🤔 What is Macho?

Macho is a lightweight, high-performance in-memory caching library designed with customizability at its core. Unlike heavyweight distributed caching systems (Redis & Memcached), Macho is entirely self-contained, running directly in your local Python environment without any external dependencies.
Macho enables Python developers to define and fine-tune how their cache behaves, offering powerful and flexible control over evictions, storage and general data life-cycle - all within a compact and memory-efficient infrastructure.

## 🧠 Core Philosophy

Configuration first, Complexity never!
Macho was intentionally constructed for Python developers that desire full control over their caching operations without the overhead of an external server or complex deployment.

## ❓ Why use Macho Caching?

Macho currently aims to fill the gaps between built-in Python caching solutions and full-scale caching servers by offering:
* ✅ **In-memory speed** without any external server requirements.
* 🔧 **Full user configuration** over cache behavior and functionality.
* 🧩 **Modular design** for extensibility and experimentation
* 🐍 **Pure Python implementation**, great for prototyping or lightweight production services.

## 🛠️ Key Features

* ⚡ **Bloom Filter Support**: Probabilistically reduce costly cache lookups and improve performance.
* 🔀 **Sharding**: Partition your cache into independent shards for better concurrency.
* 🔃 **Custom Eviction Strategies**: Currently supports **LRU**, **FIFO** and **Random** (More coming soon).
* ⏳ **Time-to-live (TTL)**: Configure per-cache expiration with automatic clean-up.
* 📊 **Metrics & Data**: Collect cache usage metrics and data for optimization and analysis.

---

## </> Installation
Utilise your preferred package management system to add Macho:

```python
# Pip 
pip install macho
# Conda
conda install macho
# Poetry
poetry add macho
```

## ✅ Initialise caching
Macho utilises a primary Cache-class as the main point of operations and caching.

```python
# ---------- Imports ----------

from macho import Cache         # Main cache-class

# ---------- Create Class ----------

macho_cache = Cache(
    max_cache_size=100,         # Maximum items/entries stores across shards (Default: 100)
    ttl=600.0,                  # Time-to-live for each item/entry (Default: 600.0)
    shard_count=1,              # Number of caching shards shared by the system (Default: 1)
    strategy="lru",             # Eviction policy for deleting data entries (Default: 'lru')
    bloom=True                  # Activate the probabilistic Bloom filter (Default: False)
    probability=0.5             # False positive rate for Bloom Filter (Default: 0.5)
)

# Add items/entries to the Cache
for index in range(5):
    macho_cache.add(f"{index}_key", f"{index}_value")   # Requires key: Any, value: Any

# Get items/entries from the Cache
macho_cache.get(key="1_key")    # Returns 1_value
macho_cache.get(key="2_key")    # Returns 2_value
macho_cache.get(key="6_key")    # Returns None (Key doesn't represent a stored value)

# Clear all items/entries from the current Cache
macho_cache.clear()             # Deletes ALL currently stored items/entries
```

## ❌ Eviction Policies
Currently Macho supports 3 primary eviction policies to handle item/entry deletion behind the scene:
* **LRU (Last Recently Used)** - Evicts/deletes entries that haven't been accessed recently. This is generally useful when recent data is more likely to be re-used.
* **FIFO (First in, First out)** - Evicts/deletes entries in the original order they were added. Treats the cache as a queue, removing the oldest entries first.
* **Random** - Evicts/deletes entries at random. Preferable in scenarios where uniform eviction is acceptable or desired.

```python
from macho import Cache

# LRU policy
LRU_cache = Cache(
    strategy="lru"
)
# FIFO policy
LRU_cache = Cache(
    strategy="fifo"
)
# Random policy
LRU_cache = Cache(
    strategy="random"
)
# Raises ValueError
Error_cache = Cache(
    strategy="something"
)
```

## ♦ Balance cache with Sharding
Sharding separates the original cache into lesser, independent segments distributing entries across them evenly. This feature dramatically improves cache scalability and retention, enabling faster access and better memory usage across large workloads. Enable this feature by specifying the number of distributed shards:

```python
from macho import Cache

# Instantiate the Cache-object
sharded_cache = Cache(
    max_cache_size=100,         # Each shard holds 20 independent entries.
    shard_count=5               # Parameter value MUST be 1 or above. Other will raise error
)
```

**WARNING: Over-sharding (Too many shards vs. actual entries) can severely impact performance and memory efficiency. It's important to balance shard count with the  workload and available resources.** 

## 💯 Bloom Filter Support
Use a probabilistic, memory-efficient data structure behind-the-scenes to quickly determine whether a desired item/entry is *100%* not in the current cache. Utilising this feature helps avoid unnecessary lookups, significantly improving cache hit rates and reducing overall latency. 
Additionally, users can specify the desired rate of False Positives that the Bloom Filter provides by using the 'probability'-parameter exposed in the main 'Cache'-class.

```python
from macho import Cache

# Instantiate the Cache-object
bloom_cache = Cache(
    max_cache_size=50,
    ttl=200.0,
    strategy="lru",
    bloom=True,                 # Enables the use of Bloom Filter for quick lookups
    probability=0.5             # Determines the probability of a False Positive
)

bloom_cache.add("random_key", "Charizard")
bloom_cache.get("not_present")  # Quicker lookup than ordinary cache lookup
```

**NOTE: Bloom Filters generally improve cache performance by trading a small amount of accuracy for speed. They provide quick key membership checks but may return a false positive, this makes them ideal for read-heavy workloads**

## 💡 Cache Metrics & Data Properties
To determine the most efficient optimization strategy, Macho's Cache-class provides several key metrics and data properties:

```python
from macho import Cache

# Instantiate the Cache-object
data_cache = Cache(
    max_cache_size=10,
    ttl=5.0,
    shard_count=2,
    strategy="fifo",
    bloom=False
)

data_cache.current_size         # Returns the current number of stored items across shards.
data_cache.total_requests       # Returns the number of total get() and add() calls made.
data_cache.latencies            # Returns a dictionary representing method-call latency.
data_cache.metric_lifespan      # Returns a dictionary representing individual entry lifespans
data_cache.metrics              # Returns a dictionary filled with general cache information.
```

## 🖥️ Streamlit UI 
To better help individual developers identify potential bottlenecks and/or configuration issues, Macho offers a pre-built data visualisation tool built with Streamlit, designed to provide deeper insight into cache behaviour. These specific performance metrics (e.g., hit ratio, eviction count, memory usage) help fine-tune, optimise and debug your caching system.
Simply pass a 'Cache'-class object into the 'launch_dashboard' function provided by Macho to run the dashboard from a Python subprocess:

```python
from macho import Cache, launch_dashboard

# Instantiate the Cache-object
dashboard_cache = Cache(
    max_cache_size=10,
    ttl=5.0,
    shard_count=2,
    strategy="fifo",
    bloom=False
)

launch_dashboard(dashboard_cache)       # This function launches the Streamlit dashboard 
```

## 🔮 The Future of Macho
Here is a current roadmap for future versions:
* 🔁 Additional probabilistic data structures (e.g., **XOR-filter**, **Cuckoo-filter**).
* 📈 New eviction policies (**LFU**, **MFU**)
* 🧰 CLI tooling for cache inspection and management.
* 📊 Advanced metrics and performance analysis.
* 🖥️ Improved Streamlit-based UI dashboard for data visualisation. 

## 📚 Reading Material
To learn more about the core mechanisms that power Macho, here are some essential resources:
- [Bloom Filter](https://brilliant.org/wiki/bloom-filter/)
- [Sharding](https://en.wikipedia.org/wiki/Shard_(database_architecture))
- [Eviction Policy](https://www.geeksforgeeks.org/system-design/cache-eviction-policies-system-design/)

## 🤝 Contribution
Macho is open to contributions from the Python community! If you'd like to report a bug, request features, or possibly contribute code, please feel free to open an issue or submit a pull request!

## 📄 Licensing
The project is licensed under the MIT License.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "macho",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "caching, cache, distributed cache, memory efficiency, in-memory, eviction strategies, lru, fifo, time-to-live, sharding, bloom filter, streamlit, metrics, interning, lightweight, lightweight classes, high-performance, probabilistic data structures",
    "author": null,
    "author_email": "HysingerDev <HysingerDev@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/e3/5d/2fe33f14e1bb44adad0a0330b3d4a9fa2cb8c8d9f488fae5571db16715b4/macho-0.0.1.tar.gz",
    "platform": null,
    "description": "# \ud83d\udce6 Macho - Memory Adept Caching Operations\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![Python Version](https://img.shields.io/badge/python-3.8%2B-blue.svg)](https://www.python.org/downloads/)\n[![PyPI - 0.1.0](https://img.shields.io/badge/PyPI-coming--soon-yellow)](https://pypi.org/)\n\n---\n\n## \ud83e\udd14 What is Macho?\n\nMacho is a lightweight, high-performance in-memory caching library designed with customizability at its core. Unlike heavyweight distributed caching systems (Redis & Memcached), Macho is entirely self-contained, running directly in your local Python environment without any external dependencies.\nMacho enables Python developers to define and fine-tune how their cache behaves, offering powerful and flexible control over evictions, storage and general data life-cycle - all within a compact and memory-efficient infrastructure.\n\n## \ud83e\udde0 Core Philosophy\n\nConfiguration first, Complexity never!\nMacho was intentionally constructed for Python developers that desire full control over their caching operations without the overhead of an external server or complex deployment.\n\n## \u2753 Why use Macho Caching?\n\nMacho currently aims to fill the gaps between built-in Python caching solutions and full-scale caching servers by offering:\n* \u2705 **In-memory speed** without any external server requirements.\n* \ud83d\udd27 **Full user configuration** over cache behavior and functionality.\n* \ud83e\udde9 **Modular design** for extensibility and experimentation\n* \ud83d\udc0d **Pure Python implementation**, great for prototyping or lightweight production services.\n\n## \ud83d\udee0\ufe0f Key Features\n\n* \u26a1 **Bloom Filter Support**: Probabilistically reduce costly cache lookups and improve performance.\n* \ud83d\udd00 **Sharding**: Partition your cache into independent shards for better concurrency.\n* \ud83d\udd03 **Custom Eviction Strategies**: Currently supports **LRU**, **FIFO** and **Random** (More coming soon).\n* \u23f3 **Time-to-live (TTL)**: Configure per-cache expiration with automatic clean-up.\n* \ud83d\udcca **Metrics & Data**: Collect cache usage metrics and data for optimization and analysis.\n\n---\n\n## </> Installation\nUtilise your preferred package management system to add Macho:\n\n```python\n# Pip \npip install macho\n# Conda\nconda install macho\n# Poetry\npoetry add macho\n```\n\n## \u2705 Initialise caching\nMacho utilises a primary Cache-class as the main point of operations and caching.\n\n```python\n# ---------- Imports ----------\n\nfrom macho import Cache         # Main cache-class\n\n# ---------- Create Class ----------\n\nmacho_cache = Cache(\n    max_cache_size=100,         # Maximum items/entries stores across shards (Default: 100)\n    ttl=600.0,                  # Time-to-live for each item/entry (Default: 600.0)\n    shard_count=1,              # Number of caching shards shared by the system (Default: 1)\n    strategy=\"lru\",             # Eviction policy for deleting data entries (Default: 'lru')\n    bloom=True                  # Activate the probabilistic Bloom filter (Default: False)\n    probability=0.5             # False positive rate for Bloom Filter (Default: 0.5)\n)\n\n# Add items/entries to the Cache\nfor index in range(5):\n    macho_cache.add(f\"{index}_key\", f\"{index}_value\")   # Requires key: Any, value: Any\n\n# Get items/entries from the Cache\nmacho_cache.get(key=\"1_key\")    # Returns 1_value\nmacho_cache.get(key=\"2_key\")    # Returns 2_value\nmacho_cache.get(key=\"6_key\")    # Returns None (Key doesn't represent a stored value)\n\n# Clear all items/entries from the current Cache\nmacho_cache.clear()             # Deletes ALL currently stored items/entries\n```\n\n## \u274c Eviction Policies\nCurrently Macho supports 3 primary eviction policies to handle item/entry deletion behind the scene:\n* **LRU (Last Recently Used)** - Evicts/deletes entries that haven't been accessed recently. This is generally useful when recent data is more likely to be re-used.\n* **FIFO (First in, First out)** - Evicts/deletes entries in the original order they were added. Treats the cache as a queue, removing the oldest entries first.\n* **Random** - Evicts/deletes entries at random. Preferable in scenarios where uniform eviction is acceptable or desired.\n\n```python\nfrom macho import Cache\n\n# LRU policy\nLRU_cache = Cache(\n    strategy=\"lru\"\n)\n# FIFO policy\nLRU_cache = Cache(\n    strategy=\"fifo\"\n)\n# Random policy\nLRU_cache = Cache(\n    strategy=\"random\"\n)\n# Raises ValueError\nError_cache = Cache(\n    strategy=\"something\"\n)\n```\n\n## \u2666 Balance cache with Sharding\nSharding separates the original cache into lesser, independent segments distributing entries across them evenly. This feature dramatically improves cache scalability and retention, enabling faster access and better memory usage across large workloads. Enable this feature by specifying the number of distributed shards:\n\n```python\nfrom macho import Cache\n\n# Instantiate the Cache-object\nsharded_cache = Cache(\n    max_cache_size=100,         # Each shard holds 20 independent entries.\n    shard_count=5               # Parameter value MUST be 1 or above. Other will raise error\n)\n```\n\n**WARNING: Over-sharding (Too many shards vs. actual entries) can severely impact performance and memory efficiency. It's important to balance shard count with the  workload and available resources.** \n\n## \ud83d\udcaf Bloom Filter Support\nUse a probabilistic, memory-efficient data structure behind-the-scenes to quickly determine whether a desired item/entry is *100%* not in the current cache. Utilising this feature helps avoid unnecessary lookups, significantly improving cache hit rates and reducing overall latency. \nAdditionally, users can specify the desired rate of False Positives that the Bloom Filter provides by using the 'probability'-parameter exposed in the main 'Cache'-class.\n\n```python\nfrom macho import Cache\n\n# Instantiate the Cache-object\nbloom_cache = Cache(\n    max_cache_size=50,\n    ttl=200.0,\n    strategy=\"lru\",\n    bloom=True,                 # Enables the use of Bloom Filter for quick lookups\n    probability=0.5             # Determines the probability of a False Positive\n)\n\nbloom_cache.add(\"random_key\", \"Charizard\")\nbloom_cache.get(\"not_present\")  # Quicker lookup than ordinary cache lookup\n```\n\n**NOTE: Bloom Filters generally improve cache performance by trading a small amount of accuracy for speed. They provide quick key membership checks but may return a false positive, this makes them ideal for read-heavy workloads**\n\n## \ud83d\udca1 Cache Metrics & Data Properties\nTo determine the most efficient optimization strategy, Macho's Cache-class provides several key metrics and data properties:\n\n```python\nfrom macho import Cache\n\n# Instantiate the Cache-object\ndata_cache = Cache(\n    max_cache_size=10,\n    ttl=5.0,\n    shard_count=2,\n    strategy=\"fifo\",\n    bloom=False\n)\n\ndata_cache.current_size         # Returns the current number of stored items across shards.\ndata_cache.total_requests       # Returns the number of total get() and add() calls made.\ndata_cache.latencies            # Returns a dictionary representing method-call latency.\ndata_cache.metric_lifespan      # Returns a dictionary representing individual entry lifespans\ndata_cache.metrics              # Returns a dictionary filled with general cache information.\n```\n\n## \ud83d\udda5\ufe0f Streamlit UI \nTo better help individual developers identify potential bottlenecks and/or configuration issues, Macho offers a pre-built data visualisation tool built with Streamlit, designed to provide deeper insight into cache behaviour. These specific performance metrics (e.g., hit ratio, eviction count, memory usage) help fine-tune, optimise and debug your caching system.\nSimply pass a 'Cache'-class object into the 'launch_dashboard' function provided by Macho to run the dashboard from a Python subprocess:\n\n```python\nfrom macho import Cache, launch_dashboard\n\n# Instantiate the Cache-object\ndashboard_cache = Cache(\n    max_cache_size=10,\n    ttl=5.0,\n    shard_count=2,\n    strategy=\"fifo\",\n    bloom=False\n)\n\nlaunch_dashboard(dashboard_cache)       # This function launches the Streamlit dashboard \n```\n\n## \ud83d\udd2e The Future of Macho\nHere is a current roadmap for future versions:\n* \ud83d\udd01 Additional probabilistic data structures (e.g., **XOR-filter**, **Cuckoo-filter**).\n* \ud83d\udcc8 New eviction policies (**LFU**, **MFU**)\n* \ud83e\uddf0 CLI tooling for cache inspection and management.\n* \ud83d\udcca Advanced metrics and performance analysis.\n* \ud83d\udda5\ufe0f Improved Streamlit-based UI dashboard for data visualisation. \n\n## \ud83d\udcda Reading Material\nTo learn more about the core mechanisms that power Macho, here are some essential resources:\n- [Bloom Filter](https://brilliant.org/wiki/bloom-filter/)\n- [Sharding](https://en.wikipedia.org/wiki/Shard_(database_architecture))\n- [Eviction Policy](https://www.geeksforgeeks.org/system-design/cache-eviction-policies-system-design/)\n\n## \ud83e\udd1d Contribution\nMacho is open to contributions from the Python community! If you'd like to report a bug, request features, or possibly contribute code, please feel free to open an issue or submit a pull request!\n\n## \ud83d\udcc4 Licensing\nThe project is licensed under the MIT License.\n",
    "bugtrack_url": null,
    "license": "MIT License\n        \n        Copyright 2025 HysingerDev\n        \n        Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \u201cSoftware\u201d), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n        \n        The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n        \n        THE SOFTWARE IS PROVIDED \u201cAS IS\u201d, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
    "summary": "Macho is a fast, memory-efficient in-memory cache with support for sharding, TTL, and pluggable eviction strategies like LRU, FIFO and Random.",
    "version": "0.0.1",
    "project_urls": {
        "Documentation": "https://github.com/MassivelyOverthinking/Macho",
        "Homepage": "https://github.com/MassivelyOverthinking/Macho",
        "Issues": "https://github.com/MassivelyOverthinking/Macho",
        "Source": "https://github.com/MassivelyOverthinking/Macho"
    },
    "split_keywords": [
        "caching",
        " cache",
        " distributed cache",
        " memory efficiency",
        " in-memory",
        " eviction strategies",
        " lru",
        " fifo",
        " time-to-live",
        " sharding",
        " bloom filter",
        " streamlit",
        " metrics",
        " interning",
        " lightweight",
        " lightweight classes",
        " high-performance",
        " probabilistic data structures"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f0c0df0ec1c0e0cf3737c50c300a3ec2a48e2c7e39665d20ea0b1b04eea7ffb5",
                "md5": "b2a0a4f71edf5d39c22068cd42432e4a",
                "sha256": "e448bc9062cb301f8cb4e2e0bb63682ce427983782ae44558271a02c3dfedb4d"
            },
            "downloads": -1,
            "filename": "macho-0.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b2a0a4f71edf5d39c22068cd42432e4a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 24419,
            "upload_time": "2025-08-26T18:16:50",
            "upload_time_iso_8601": "2025-08-26T18:16:50.455882Z",
            "url": "https://files.pythonhosted.org/packages/f0/c0/df0ec1c0e0cf3737c50c300a3ec2a48e2c7e39665d20ea0b1b04eea7ffb5/macho-0.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e35d2fe33f14e1bb44adad0a0330b3d4a9fa2cb8c8d9f488fae5571db16715b4",
                "md5": "a710b4b2ea7dabae25a4de42ab2efffc",
                "sha256": "fee9051cd799dc7cc443ec5e14540efb3a1164ef7e40fa4075a28b21f873ff94"
            },
            "downloads": -1,
            "filename": "macho-0.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "a710b4b2ea7dabae25a4de42ab2efffc",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 25665,
            "upload_time": "2025-08-26T18:16:52",
            "upload_time_iso_8601": "2025-08-26T18:16:52.051040Z",
            "url": "https://files.pythonhosted.org/packages/e3/5d/2fe33f14e1bb44adad0a0330b3d4a9fa2cb8c8d9f488fae5571db16715b4/macho-0.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-26 18:16:52",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "MassivelyOverthinking",
    "github_project": "Macho",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "altair",
            "specs": [
                [
                    "==",
                    "5.5.0"
                ]
            ]
        },
        {
            "name": "attrs",
            "specs": [
                [
                    "==",
                    "25.3.0"
                ]
            ]
        },
        {
            "name": "bitarray",
            "specs": [
                [
                    "==",
                    "3.5.0"
                ]
            ]
        },
        {
            "name": "blinker",
            "specs": [
                [
                    "==",
                    "1.9.0"
                ]
            ]
        },
        {
            "name": "cachetools",
            "specs": [
                [
                    "==",
                    "6.1.0"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2025.8.3"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "3.4.3"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    "==",
                    "8.2.1"
                ]
            ]
        },
        {
            "name": "gitdb",
            "specs": [
                [
                    "==",
                    "4.0.12"
                ]
            ]
        },
        {
            "name": "GitPython",
            "specs": [
                [
                    "==",
                    "3.1.45"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.10"
                ]
            ]
        },
        {
            "name": "iniconfig",
            "specs": [
                [
                    "==",
                    "2.1.0"
                ]
            ]
        },
        {
            "name": "Jinja2",
            "specs": [
                [
                    "==",
                    "3.1.6"
                ]
            ]
        },
        {
            "name": "jsonschema",
            "specs": [
                [
                    "==",
                    "4.25.0"
                ]
            ]
        },
        {
            "name": "jsonschema-specifications",
            "specs": [
                [
                    "==",
                    "2025.4.1"
                ]
            ]
        },
        {
            "name": "MarkupSafe",
            "specs": [
                [
                    "==",
                    "3.0.2"
                ]
            ]
        },
        {
            "name": "mmh3",
            "specs": [
                [
                    "==",
                    "5.1.0"
                ]
            ]
        },
        {
            "name": "narwhals",
            "specs": [
                [
                    "==",
                    "2.1.1"
                ]
            ]
        },
        {
            "name": "numpy",
            "specs": [
                [
                    "==",
                    "2.3.2"
                ]
            ]
        },
        {
            "name": "packaging",
            "specs": [
                [
                    "==",
                    "25.0"
                ]
            ]
        },
        {
            "name": "pandas",
            "specs": [
                [
                    "==",
                    "2.3.1"
                ]
            ]
        },
        {
            "name": "pillow",
            "specs": [
                [
                    "==",
                    "11.3.0"
                ]
            ]
        },
        {
            "name": "platformdirs",
            "specs": [
                [
                    "==",
                    "4.3.8"
                ]
            ]
        },
        {
            "name": "plotly",
            "specs": [
                [
                    "==",
                    "6.3.0"
                ]
            ]
        },
        {
            "name": "pluggy",
            "specs": [
                [
                    "==",
                    "1.6.0"
                ]
            ]
        },
        {
            "name": "protobuf",
            "specs": [
                [
                    "==",
                    "6.31.1"
                ]
            ]
        },
        {
            "name": "pyarrow",
            "specs": [
                [
                    "==",
                    "21.0.0"
                ]
            ]
        },
        {
            "name": "pydeck",
            "specs": [
                [
                    "==",
                    "0.9.1"
                ]
            ]
        },
        {
            "name": "Pygments",
            "specs": [
                [
                    "==",
                    "2.19.2"
                ]
            ]
        },
        {
            "name": "pytest",
            "specs": [
                [
                    "==",
                    "8.4.1"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    "==",
                    "2.9.0.post0"
                ]
            ]
        },
        {
            "name": "pytz",
            "specs": [
                [
                    "==",
                    "2025.2"
                ]
            ]
        },
        {
            "name": "referencing",
            "specs": [
                [
                    "==",
                    "0.36.2"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.32.4"
                ]
            ]
        },
        {
            "name": "rpds-py",
            "specs": [
                [
                    "==",
                    "0.27.0"
                ]
            ]
        },
        {
            "name": "six",
            "specs": [
                [
                    "==",
                    "1.17.0"
                ]
            ]
        },
        {
            "name": "smmap",
            "specs": [
                [
                    "==",
                    "5.0.2"
                ]
            ]
        },
        {
            "name": "streamlit",
            "specs": [
                [
                    "==",
                    "1.48.1"
                ]
            ]
        },
        {
            "name": "tenacity",
            "specs": [
                [
                    "==",
                    "9.1.2"
                ]
            ]
        },
        {
            "name": "toml",
            "specs": [
                [
                    "==",
                    "0.10.2"
                ]
            ]
        },
        {
            "name": "tornado",
            "specs": [
                [
                    "==",
                    "6.5.2"
                ]
            ]
        },
        {
            "name": "typing_extensions",
            "specs": [
                [
                    "==",
                    "4.14.1"
                ]
            ]
        },
        {
            "name": "tzdata",
            "specs": [
                [
                    "==",
                    "2025.2"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "2.5.0"
                ]
            ]
        }
    ],
    "lcname": "macho"
}
        
Elapsed time: 0.98647s