# IPMapper - Offline IP-to-Country Lookup
<p align="center">
<strong>Fast, offline IP geolocation using Regional Internet Registry (RIR) data</strong><br>
<em>No API calls • No rate limits • No signup required • Download once, use forever</em>
</p>
<div align="center">
[](https://opensource.org/licenses/MIT)
[](https://www.python.org/downloads/)
</div>
## Motivation
IPMapper addresses the need for **reliable, offline IP geolocation** without dependencies on external APIs or services. Built entirely on public Regional Internet Registry (RIR) data, it provides:
- **Payment processing**: Determine customer currency from IP for automatic payment localization
- **Feature restrictions**: Implement geo-blocking or feature availability based on country codes
- **Compliance**: Meet data residency requirements by identifying user locations
- **Analytics**: Understand user geographic distribution without third-party services
- **Offline environments**: Work in air-gapped systems or areas with limited internet connectivity
## Core Features
### Data Sources
- **100% Public Data**: Uses only official RIR delegated files from APNIC, ARIN, RIPE NCC, LACNIC, and AFRINIC
- **No External Dependencies**: Operates completely offline after initial data download
- **Always Free**: No API keys, accounts, or subscription fees required
### Geographic Information
- **Country Codes**: ISO 3166-1 alpha-2 country codes (US, DE, JP, etc.)
- **Country Names**: Full country names ("United States of America")
- **Currency Codes**: ISO 4217 currency codes (USD, EUR, JPY, etc.)
- **Dual Stack**: Full IPv4 and IPv6 support
### Technical Implementation
- **Radix Tree Lookup**: O(prefix length) complexity for sub-microsecond lookups
- **Prefix Aggregation**: 30-70% reduction in dataset size while maintaining accuracy
- **Memory Efficient**: Optimized data structures for minimal RAM usage
- **Auto-loading**: Data loads automatically on first use
## Technical Architecture
### Radix Tree Implementation
IPMapper uses a **radix tree** (compressed trie) for IP prefix lookups, providing optimal search complexity:
```
Time Complexity: O(k) where k = IP address bit length (32 for IPv4, 128 for IPv6)
Space Complexity: O(n×k) where n = number of unique prefixes
```
**Why Radix Trees?**
- **Longest Prefix Matching**: Automatically finds the most specific route for any IP
- **Memory Efficient**: Shared prefixes are stored only once
- **Cache Friendly**: Tree traversal exhibits good spatial locality
- **Predictable Performance**: Lookup time depends only on address length, not dataset size
### Prefix Aggregation
The library implements **CIDR prefix aggregation** to optimize storage and lookup performance:
**Aggregation Process:**
1. **Grouping**: Group prefixes by country code and IP version
2. **Sorting**: Sort prefixes by network address for efficient processing
3. **Merging**: Use `ipaddress.collapse_addresses()` to merge adjacent prefixes
4. **Validation**: Ensure aggregation preserves country code boundaries
**Benefits:**
- **Reduced Memory**: 30-70% fewer prefixes to store
- **Faster Loading**: Less data to process during initialization
- **Maintained Accuracy**: No loss of geographic precision
- **Better Cache Utilization**: Fewer tree nodes improve cache hit rates
## Installation
```bash
# Install from PyPI
pip install ipmapper
# Or install from source
git clone https://github.com/anxkhn/ipmapper
cd ipmapper
pip install -e .
```
## Quick Start
### First Run - Download Data
```bash
# Download and process RIR data (run once or when updating)
ipmapper update
```
### Command Line Usage
```bash
# Basic lookup
ipmapper lookup 8.8.8.8
ipmapper lookup 2001:4860:4860::8888
# Multiple IPs with additional data
ipmapper lookup 8.8.8.8 1.1.1.1 --country-name --currency
# Quick shortcuts
ipmapper country 8.8.8.8 # Just country name
ipmapper country_code 8.8.8.8 # Just country code
ipmapper currency 8.8.8.8 # Just currency
# Output formats
ipmapper lookup 8.8.8.8 --format json
ipmapper lookup 8.8.8.8 --format csv
# Check status
ipmapper status
```
### Python Library Usage
```python
import ipmapper
# Simple lookups (auto-loads data on first use)
result = ipmapper.lookup('8.8.8.8')
print(result)
# {'ip': '8.8.8.8', 'country_code': 'US', 'country_name': 'United States of America', 'currency': 'USD'}
# Direct attribute access
country_name = ipmapper.get_country_name('8.8.8.8') # 'United States of America'
country_code = ipmapper.get_country_code('8.8.8.8') # 'US'
currency = ipmapper.get_country_currency('8.8.8.8') # 'USD'
# Selectively use IPv4 or IPv6 tree with IP version hints
result = ipmapper.lookup('192.168.1.1', ip_version='ipv4') # Skip IPv6 tree
result = ipmapper.lookup('2001:db8::1', ip_version='ipv6') # Skip IPv4 tree
# Advanced usage with custom data directory
lookup_engine = ipmapper.IPLookup(data_dir='/custom/path')
result = lookup_engine.lookup_full('8.8.8.8')
```
## Data Sources & Processing
### Regional Internet Registries
| RIR | Region | Data Source |
| ------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| **APNIC** | Asia-Pacific | [delegated-apnic-extended-latest](https://ftp.apnic.net/stats/apnic/delegated-apnic-extended-latest) |
| **ARIN** | North America | [delegated-arin-extended-latest](https://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest) |
| **RIPE NCC** | Europe/Middle East/Central Asia | [delegated-ripencc-extended-latest](https://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest) |
| **LACNIC** | Latin America/Caribbean | [delegated-lacnic-extended-latest](https://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest) |
| **AFRINIC** | Africa | [delegated-afrinic-extended-latest](https://ftp.afrinic.net/stats/afrinic/delegated-afrinic-extended-latest) |
### Processing Pipeline
1. **Download**: Fetch latest delegated files from all 5 RIRs
2. **Parse**: Extract IPv4/IPv6 allocations with country codes
- Filter for `allocated` and `assigned` status only
- Convert IPv4 address counts to CIDR blocks
- Parse IPv6 prefix lengths directly
3. **Deduplicate**: Resolve overlapping entries
- Prefer most recent allocation date
- Use lexicographic registry ordering for ties
4. **Aggregate**: Optimize prefix lists using CIDR aggregation
5. **Generate**: Create optimized CSV files and metadata
## CLI Reference
### Core Commands
**`ipmapper update`** - Download and process RIR data
```bash
ipmapper update [OPTIONS]
Options:
--force Force re-download even if data exists
--data-dir Custom data directory (default: ~/.ipmapper)
```
**`ipmapper lookup`** - Look up IP addresses
```bash
ipmapper lookup [OPTIONS] IP1 [IP2 ...]
Options:
--format [table|json|csv] Output format (default: table)
--country-name Include country names
--currency Include currency codes
--data-dir Custom data directory
```
**`ipmapper status`** - Show local data status
```bash
ipmapper status [OPTIONS]
Options:
--data-dir Custom data directory
```
### Quick Commands
```bash
ipmapper country IP # Get country name
ipmapper country_code IP # Get country code
ipmapper currency IP # Get currency code
```
## Output Files
After running `ipmapper update`, these files are generated:
- **`prefixes_ipv4_agg.csv`** - Aggregated IPv4 prefixes (format: `cidr,country_code`)
- **`prefixes_ipv6_agg.csv`** - Aggregated IPv6 prefixes (format: `cidr,country_code`)
- **`metadata.json`** - Source URLs, timestamps, checksums, and statistics
_Note: Only aggregated files are generated for optimal performance. Raw files are cleaned up automatically._
## Use Cases
### Payment Processing
```python
import ipmapper
def determine_currency(client_ip):
"""Automatically set payment currency based on client location"""
currency = ipmapper.get_country_currency(client_ip)
return currency or 'USD' # Default to USD
# Usage
client_ip = request.remote_addr
payment_currency = determine_currency(client_ip)
```
### Feature Restrictions
```python
import ipmapper
RESTRICTED_COUNTRIES = {'CN', 'IR', 'KP'} # Example restrictions
def check_feature_availability(client_ip, feature_name):
"""Check if feature is available in client's country"""
country_code = ipmapper.get_country_code(client_ip)
if country_code in RESTRICTED_COUNTRIES:
return False
return True
```
### Analytics & Compliance
```python
import ipmapper
from collections import Counter
def analyze_user_geography(ip_list):
"""Analyze geographic distribution of users"""
countries = []
for ip in ip_list:
country = ipmapper.get_country_name(ip)
if country:
countries.append(country)
return Counter(countries)
```
## Development
```bash
# Clone repository
git clone https://github.com/anxkhn/ipmapper
cd ipmapper
# Install in development mode
pip install -e .
# Run from source
python -m ipmapper update
python -m ipmapper lookup 8.8.8.8
```
## Why Always Free
This project will always remain free and open source because:
<table>
<tr>
<td><strong>Public Data Foundation</strong></td>
<td>Built entirely on publicly available RIR allocation data</td>
</tr>
<tr>
<td><strong>Educational Mission</strong></td>
<td>Helps people understand internet infrastructure and IP allocation</td>
</tr>
<tr>
<td><strong>Community Driven</strong></td>
<td>Created for developers, by developers, with no commercial agenda</td>
</tr>
<tr>
<td><strong>Transparency First</strong></td>
<td>All code, data sources, and methodologies are completely open</td>
</tr>
<tr>
<td><strong>Self-Contained</strong></td>
<td>No ongoing infrastructure costs or API maintenance requirements</td>
</tr>
</table>
## License
**MIT License** - see [LICENSE](LICENSE) file for details.
### Data License
The IP allocation data is derived from public RIR delegated files, available under their respective terms of use. This library inherits those terms for the data while the code remains MIT licensed.
## Related Projects
- **[GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data)** - MaxMind's free geolocation database
- **[ip2location-lite](https://github.com/ip2location/ip2location-python)** - Commercial IP geolocation with city-level data
- **[python-geoip](https://github.com/pierrrrrrre/python-geoip)** - Another Python IP geolocation library
## Support
- **Issues**: [GitHub Issues](https://github.com/anxkhn/ipmapper/issues)
- **Discussions**: [GitHub Discussions](https://github.com/anxkhn/ipmapper/discussions)
- **Email**: Create an issue for fastest response
---
<div align="center">
<strong>Built with ❤️ for the open internet community</strong>
</div>
Raw data
{
"_id": null,
"home_page": "https://github.com/anxkhn/ipmapper",
"name": "ipmapper",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": "ip, geolocation, country, currency, rir, offline, radix-tree",
"author": "Anas Khan",
"author_email": "Anas Khan <anxkhn28@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/31/10/1bbd6c97e61095f0ea02d063a1a223c7cb6f6be6abbd186760206bf7c3ae/ipmapper-1.0.0.tar.gz",
"platform": null,
"description": "# IPMapper - Offline IP-to-Country Lookup\n\n<p align=\"center\">\n <strong>Fast, offline IP geolocation using Regional Internet Registry (RIR) data</strong><br>\n <em>No API calls \u2022 No rate limits \u2022 No signup required \u2022 Download once, use forever</em>\n</p>\n\n<div align=\"center\">\n\n[](https://opensource.org/licenses/MIT)\n[](https://www.python.org/downloads/)\n\n</div>\n\n## Motivation\n\nIPMapper addresses the need for **reliable, offline IP geolocation** without dependencies on external APIs or services. Built entirely on public Regional Internet Registry (RIR) data, it provides:\n\n- **Payment processing**: Determine customer currency from IP for automatic payment localization\n- **Feature restrictions**: Implement geo-blocking or feature availability based on country codes\n- **Compliance**: Meet data residency requirements by identifying user locations\n- **Analytics**: Understand user geographic distribution without third-party services\n- **Offline environments**: Work in air-gapped systems or areas with limited internet connectivity\n\n## Core Features\n\n### Data Sources\n\n- **100% Public Data**: Uses only official RIR delegated files from APNIC, ARIN, RIPE NCC, LACNIC, and AFRINIC\n- **No External Dependencies**: Operates completely offline after initial data download\n- **Always Free**: No API keys, accounts, or subscription fees required\n\n### Geographic Information\n\n- **Country Codes**: ISO 3166-1 alpha-2 country codes (US, DE, JP, etc.)\n- **Country Names**: Full country names (\"United States of America\")\n- **Currency Codes**: ISO 4217 currency codes (USD, EUR, JPY, etc.)\n- **Dual Stack**: Full IPv4 and IPv6 support\n\n### Technical Implementation\n\n- **Radix Tree Lookup**: O(prefix length) complexity for sub-microsecond lookups\n- **Prefix Aggregation**: 30-70% reduction in dataset size while maintaining accuracy\n- **Memory Efficient**: Optimized data structures for minimal RAM usage\n- **Auto-loading**: Data loads automatically on first use\n\n## Technical Architecture\n\n### Radix Tree Implementation\n\nIPMapper uses a **radix tree** (compressed trie) for IP prefix lookups, providing optimal search complexity:\n\n```\nTime Complexity: O(k) where k = IP address bit length (32 for IPv4, 128 for IPv6)\nSpace Complexity: O(n\u00d7k) where n = number of unique prefixes\n```\n\n**Why Radix Trees?**\n\n- **Longest Prefix Matching**: Automatically finds the most specific route for any IP\n- **Memory Efficient**: Shared prefixes are stored only once\n- **Cache Friendly**: Tree traversal exhibits good spatial locality\n- **Predictable Performance**: Lookup time depends only on address length, not dataset size\n\n### Prefix Aggregation\n\nThe library implements **CIDR prefix aggregation** to optimize storage and lookup performance:\n\n**Aggregation Process:**\n\n1. **Grouping**: Group prefixes by country code and IP version\n2. **Sorting**: Sort prefixes by network address for efficient processing\n3. **Merging**: Use `ipaddress.collapse_addresses()` to merge adjacent prefixes\n4. **Validation**: Ensure aggregation preserves country code boundaries\n\n**Benefits:**\n\n- **Reduced Memory**: 30-70% fewer prefixes to store\n- **Faster Loading**: Less data to process during initialization\n- **Maintained Accuracy**: No loss of geographic precision\n- **Better Cache Utilization**: Fewer tree nodes improve cache hit rates\n\n## Installation\n\n```bash\n# Install from PyPI\npip install ipmapper\n\n# Or install from source\ngit clone https://github.com/anxkhn/ipmapper\ncd ipmapper\npip install -e .\n```\n\n## Quick Start\n\n### First Run - Download Data\n\n```bash\n# Download and process RIR data (run once or when updating)\nipmapper update\n```\n\n### Command Line Usage\n\n```bash\n# Basic lookup\nipmapper lookup 8.8.8.8\nipmapper lookup 2001:4860:4860::8888\n\n# Multiple IPs with additional data\nipmapper lookup 8.8.8.8 1.1.1.1 --country-name --currency\n\n# Quick shortcuts\nipmapper country 8.8.8.8 # Just country name\nipmapper country_code 8.8.8.8 # Just country code\nipmapper currency 8.8.8.8 # Just currency\n\n# Output formats\nipmapper lookup 8.8.8.8 --format json\nipmapper lookup 8.8.8.8 --format csv\n\n# Check status\nipmapper status\n```\n\n### Python Library Usage\n\n```python\nimport ipmapper\n\n# Simple lookups (auto-loads data on first use)\nresult = ipmapper.lookup('8.8.8.8')\nprint(result)\n# {'ip': '8.8.8.8', 'country_code': 'US', 'country_name': 'United States of America', 'currency': 'USD'}\n\n# Direct attribute access\ncountry_name = ipmapper.get_country_name('8.8.8.8') # 'United States of America'\ncountry_code = ipmapper.get_country_code('8.8.8.8') # 'US'\ncurrency = ipmapper.get_country_currency('8.8.8.8') # 'USD'\n\n# Selectively use IPv4 or IPv6 tree with IP version hints\nresult = ipmapper.lookup('192.168.1.1', ip_version='ipv4') # Skip IPv6 tree\nresult = ipmapper.lookup('2001:db8::1', ip_version='ipv6') # Skip IPv4 tree\n\n# Advanced usage with custom data directory\nlookup_engine = ipmapper.IPLookup(data_dir='/custom/path')\nresult = lookup_engine.lookup_full('8.8.8.8')\n\n```\n\n## Data Sources & Processing\n\n### Regional Internet Registries\n\n| RIR | Region | Data Source |\n| ------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------- |\n| **APNIC** | Asia-Pacific | [delegated-apnic-extended-latest](https://ftp.apnic.net/stats/apnic/delegated-apnic-extended-latest) |\n| **ARIN** | North America | [delegated-arin-extended-latest](https://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest) |\n| **RIPE NCC** | Europe/Middle East/Central Asia | [delegated-ripencc-extended-latest](https://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest) |\n| **LACNIC** | Latin America/Caribbean | [delegated-lacnic-extended-latest](https://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest) |\n| **AFRINIC** | Africa | [delegated-afrinic-extended-latest](https://ftp.afrinic.net/stats/afrinic/delegated-afrinic-extended-latest) |\n\n### Processing Pipeline\n\n1. **Download**: Fetch latest delegated files from all 5 RIRs\n2. **Parse**: Extract IPv4/IPv6 allocations with country codes\n - Filter for `allocated` and `assigned` status only\n - Convert IPv4 address counts to CIDR blocks\n - Parse IPv6 prefix lengths directly\n3. **Deduplicate**: Resolve overlapping entries\n - Prefer most recent allocation date\n - Use lexicographic registry ordering for ties\n4. **Aggregate**: Optimize prefix lists using CIDR aggregation\n5. **Generate**: Create optimized CSV files and metadata\n\n## CLI Reference\n\n### Core Commands\n\n**`ipmapper update`** - Download and process RIR data\n\n```bash\nipmapper update [OPTIONS]\n\nOptions:\n --force Force re-download even if data exists\n --data-dir Custom data directory (default: ~/.ipmapper)\n```\n\n**`ipmapper lookup`** - Look up IP addresses\n\n```bash\nipmapper lookup [OPTIONS] IP1 [IP2 ...]\n\nOptions:\n --format [table|json|csv] Output format (default: table)\n --country-name Include country names\n --currency Include currency codes\n --data-dir Custom data directory\n```\n\n**`ipmapper status`** - Show local data status\n\n```bash\nipmapper status [OPTIONS]\n\nOptions:\n --data-dir Custom data directory\n```\n\n### Quick Commands\n\n```bash\nipmapper country IP # Get country name\nipmapper country_code IP # Get country code\nipmapper currency IP # Get currency code\n```\n\n## Output Files\n\nAfter running `ipmapper update`, these files are generated:\n\n- **`prefixes_ipv4_agg.csv`** - Aggregated IPv4 prefixes (format: `cidr,country_code`)\n- **`prefixes_ipv6_agg.csv`** - Aggregated IPv6 prefixes (format: `cidr,country_code`)\n- **`metadata.json`** - Source URLs, timestamps, checksums, and statistics\n\n_Note: Only aggregated files are generated for optimal performance. Raw files are cleaned up automatically._\n\n## Use Cases\n\n### Payment Processing\n\n```python\nimport ipmapper\n\ndef determine_currency(client_ip):\n \"\"\"Automatically set payment currency based on client location\"\"\"\n currency = ipmapper.get_country_currency(client_ip)\n return currency or 'USD' # Default to USD\n\n# Usage\nclient_ip = request.remote_addr\npayment_currency = determine_currency(client_ip)\n```\n\n### Feature Restrictions\n\n```python\nimport ipmapper\n\nRESTRICTED_COUNTRIES = {'CN', 'IR', 'KP'} # Example restrictions\n\ndef check_feature_availability(client_ip, feature_name):\n \"\"\"Check if feature is available in client's country\"\"\"\n country_code = ipmapper.get_country_code(client_ip)\n\n if country_code in RESTRICTED_COUNTRIES:\n return False\n return True\n```\n\n### Analytics & Compliance\n\n```python\nimport ipmapper\nfrom collections import Counter\n\ndef analyze_user_geography(ip_list):\n \"\"\"Analyze geographic distribution of users\"\"\"\n countries = []\n for ip in ip_list:\n country = ipmapper.get_country_name(ip)\n if country:\n countries.append(country)\n\n return Counter(countries)\n```\n\n## Development\n\n```bash\n# Clone repository\ngit clone https://github.com/anxkhn/ipmapper\ncd ipmapper\n\n# Install in development mode\npip install -e .\n\n# Run from source\npython -m ipmapper update\npython -m ipmapper lookup 8.8.8.8\n```\n\n## Why Always Free\n\nThis project will always remain free and open source because:\n\n<table>\n<tr>\n<td><strong>Public Data Foundation</strong></td>\n<td>Built entirely on publicly available RIR allocation data</td>\n</tr>\n<tr>\n<td><strong>Educational Mission</strong></td>\n<td>Helps people understand internet infrastructure and IP allocation</td>\n</tr>\n<tr>\n<td><strong>Community Driven</strong></td>\n<td>Created for developers, by developers, with no commercial agenda</td>\n</tr>\n<tr>\n<td><strong>Transparency First</strong></td>\n<td>All code, data sources, and methodologies are completely open</td>\n</tr>\n<tr>\n<td><strong>Self-Contained</strong></td>\n<td>No ongoing infrastructure costs or API maintenance requirements</td>\n</tr>\n</table>\n\n## License\n\n**MIT License** - see [LICENSE](LICENSE) file for details.\n\n### Data License\n\nThe IP allocation data is derived from public RIR delegated files, available under their respective terms of use. This library inherits those terms for the data while the code remains MIT licensed.\n\n## Related Projects\n\n- **[GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data)** - MaxMind's free geolocation database\n- **[ip2location-lite](https://github.com/ip2location/ip2location-python)** - Commercial IP geolocation with city-level data\n- **[python-geoip](https://github.com/pierrrrrrre/python-geoip)** - Another Python IP geolocation library\n\n## Support\n\n- **Issues**: [GitHub Issues](https://github.com/anxkhn/ipmapper/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/anxkhn/ipmapper/discussions)\n- **Email**: Create an issue for fastest response\n\n---\n\n<div align=\"center\">\n<strong>Built with \u2764\ufe0f for the open internet community</strong>\n</div>\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Fast offline IP-to-country lookup using RIR data with country names and currency support",
"version": "1.0.0",
"project_urls": {
"Homepage": "https://github.com/anxkhn/ipmapper",
"Issues": "https://github.com/anxkhn/ipmapper/issues",
"Repository": "https://github.com/anxkhn/ipmapper"
},
"split_keywords": [
"ip",
" geolocation",
" country",
" currency",
" rir",
" offline",
" radix-tree"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "2c3d6f78ac269a03a500e0e277add696dc3bd8b7070a9e02ea28f4872bb2e24d",
"md5": "d4ef2f97546d4e489a1a72e1fd780ba6",
"sha256": "36a4f046a53a00306bd50a6d4c7d45b3faf5e8f09a78bfafcf8f5d02a0a7d090"
},
"downloads": -1,
"filename": "ipmapper-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "d4ef2f97546d4e489a1a72e1fd780ba6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 22615,
"upload_time": "2025-08-19T17:42:24",
"upload_time_iso_8601": "2025-08-19T17:42:24.012275Z",
"url": "https://files.pythonhosted.org/packages/2c/3d/6f78ac269a03a500e0e277add696dc3bd8b7070a9e02ea28f4872bb2e24d/ipmapper-1.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "31101bbd6c97e61095f0ea02d063a1a223c7cb6f6be6abbd186760206bf7c3ae",
"md5": "200e388aa61e1418aa35281364208d8b",
"sha256": "87b956756ae42a0560b7f87f18e9e6ab50e9c71ab6a71316d9fe9529727306cd"
},
"downloads": -1,
"filename": "ipmapper-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "200e388aa61e1418aa35281364208d8b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 24878,
"upload_time": "2025-08-19T17:42:25",
"upload_time_iso_8601": "2025-08-19T17:42:25.772404Z",
"url": "https://files.pythonhosted.org/packages/31/10/1bbd6c97e61095f0ea02d063a1a223c7cb6f6be6abbd186760206bf7c3ae/ipmapper-1.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-19 17:42:25",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "anxkhn",
"github_project": "ipmapper",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "ipmapper"
}