<div align="center">
# python-newtype
## Documentation
<a href="https://py-nt.asyncmove.com">
<img src="https://img.shields.io/badge/docs-passing-brightgreen.svg" width="100" alt="docs passing">
</a>
### Compatibility and Version
<img src="https://img.shields.io/badge/%3E=python-3.8-blue.svg" alt="Python compat">
<a href="https://pypi.python.org/pypi/python-newtype"><img src="https://img.shields.io/pypi/v/python-newtype.svg" alt="PyPi"></a>
### CI/CD
<a href="https://codecov.io/github/jymchng/python-newtype-dev?branch=main"><img src="https://codecov.io/github/jymchng/python-newtype-dev/coverage.svg?branch=main" alt="Coverage"></a>
### License and Issues
<a href="https://github.com/jymchng/python-newtype-dev/blob/main/LICENSE"><img src="https://img.shields.io/github/license/jymchng/python-newtype-dev" alt="License"></a>
<a href="https://github.com/jymchng/python-newtype-dev/issues"><img src="https://img.shields.io/github/issues/jymchng/python-newtype-dev" alt="Issues"></a>
<a href="https://github.com/jymchng/python-newtype-dev/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed/jymchng/python-newtype-dev" alt="Closed Issues"></a>
<a href="https://github.com/jymchng/python-newtype-dev/issues?q=is%3Aissue+is%3Aopen"><img src="https://img.shields.io/github/issues-raw/jymchng/python-newtype-dev" alt="Open Issues"></a>
### Development and Quality
<a href="https://github.com/jymchng/python-newtype-dev/network/members"><img src="https://img.shields.io/github/forks/jymchng/python-newtype-dev" alt="Forks"></a>
<a href="https://github.com/jymchng/python-newtype-dev/stargazers"><img src="https://img.shields.io/github/stars/jymchng/python-newtype-dev" alt="Stars"></a>
<a href="https://pypi.python.org/pypi/python-newtype"><img src="https://img.shields.io/pypi/dm/python-newtype" alt="Downloads"></a>
<a href="https://github.com/jymchng/python-newtype-dev/graphs/contributors"><img src="https://img.shields.io/github/contributors/jymchng/python-newtype-dev" alt="Contributors"></a>
<a href="https://github.com/jymchng/python-newtype-dev/commits/main"><img src="https://img.shields.io/github/commit-activity/m/jymchng/python-newtype-dev" alt="Commits"></a>
<a href="https://github.com/jymchng/python-newtype-dev/commits/main"><img src="https://img.shields.io/github/last-commit/jymchng/python-newtype-dev" alt="Last Commit"></a>
<a href="https://github.com/jymchng/python-newtype-dev"><img src="https://img.shields.io/github/languages/code-size/jymchng/python-newtype-dev" alt="Code Size"></a>
<a href="https://github.com/jymchng/python-newtype-dev"><img src="https://img.shields.io/github/repo-size/jymchng/python-newtype-dev" alt="Repo Size"></a>
<a href="https://github.com/jymchng/python-newtype-dev/watchers"><img src="https://img.shields.io/github/watchers/jymchng/python-newtype-dev" alt="Watchers"></a>
<a href="https://github.com/jymchng/python-newtype-dev"><img src="https://img.shields.io/github/commit-activity/y/jymchng/python-newtype-dev" alt="Activity"></a>
<a href="https://github.com/jymchng/python-newtype-dev/pulls"><img src="https://img.shields.io/github/issues-pr/jymchng/python-newtype-dev" alt="PRs"></a>
<a href="https://github.com/jymchng/python-newtype-dev/pulls?q=is%3Apr+is%3Aclosed"><img src="https://img.shields.io/github/issues-pr-closed/jymchng/python-newtype-dev" alt="Merged PRs"></a>
<a href="https://github.com/jymchng/python-newtype-dev/pulls?q=is%3Apr+is%3Aopen"><img src="https://img.shields.io/github/issues-pr/open/jymchng/python-newtype-dev" alt="Open PRs"></a>
</div>
A powerful Python library for extending existing types with additional functionality while preserving their original behavior, type information and subtype invariances.
## Features
- **Type Wrapping**: Seamlessly wrap existing Python types with new functionality and preservation of subtype invariances when using methods of supertype
- **Custom Initialization**: Control object initialization with special handling
- **Attribute Preservation**: Maintains both `__dict__` and `__slots__` attributes
- **Memory Efficient**: Uses weak references for caching
- **Debug Support**: Built-in debug printing capabilities for development
- **Async Support**: Full support for asynchronous methods and operations
## Quick Start
### Installation
```bash
pip install python-newtype
```
### Basic Usage
```python
import pytest
import re
from newtype import NewType, newtype_exclude
class EmailStr(NewType(str)):
# you can define `__slots__` to save space
__slots__ = (
'_local_part',
'_domain_part',
)
def __init__(self, value: str):
super().__init__()
if "@" not in value:
raise TypeError("`EmailStr` requires a '@' symbol within")
self._local_part, self._domain_part = value.split("@")
@newtype_exclude
def __str__(self):
return f"<Email - Local Part: {self.local_part}; Domain Part: {self.domain_part}>"
@property
def local_part(self):
"""Return the local part of the email address."""
return self._local_part
@property
def domain_part(self):
"""Return the domain part of the email address."""
return self._domain_part
@property
def full_email(self):
"""Return the full email address."""
return str(self)
@classmethod
def from_string(cls, email: str):
"""Create an EmailStr instance from a string."""
return cls(email)
@staticmethod
def is_valid_email(email: str) -> bool:
"""Check if the provided string is a valid email format."""
email_regex = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
return re.match(email_regex, email) is not None
def test_emailstr_replace():
"""`EmailStr` uses `str.replace(..)` as its own method, returning an instance of `EmailStr`
if the resultant `str` instance is a value `EmailStr`.
"""
peter_email = EmailStr("peter@gmail.com")
smith_email = EmailStr("smith@gmail.com")
with pytest.raises(Exception):
# this raises because `peter_email` is no longer an instance of `EmailStr`
peter_email = peter_email.replace("peter@gmail.com", "petergmail.com")
# this works because the entire email can be 'replaced'
james_email = smith_email.replace("smith@gmail.com", "james@gmail.com")
# comparison with `str` is built-in
assert james_email == "james@gmail.com"
# `james_email` is still an `EmailStr`
assert isinstance(james_email, EmailStr)
# this works because the local part can be 'replaced'
jane_email = james_email.replace("james", "jane")
# `jane_email` is still an `EmailStr`
assert isinstance(jane_email, EmailStr)
assert jane_email == "jane@gmail.com"
def test_emailstr_properties_methods():
"""Test the property, class method, and static method of EmailStr."""
# Test property
email = EmailStr("test@example.com")
# `property` is not coerced to `EmailStr`
assert email.full_email == "<Email - Local Part: test; Domain Part: example.com>"
assert isinstance(email.full_email, str)
# `property` is not coerced to `EmailStr`
assert not isinstance(email.full_email, EmailStr)
assert email.local_part == "test"
assert email.domain_part == "example.com"
# Test class method
email_from_string = EmailStr.from_string("classmethod@example.com")
# `property` is not coerced to `EmailStr`
assert (
email_from_string.full_email
== "<Email - Local Part: classmethod; Domain Part: example.com>"
)
assert email_from_string.local_part == "classmethod"
assert email_from_string.domain_part == "example.com"
# Test static method
assert EmailStr.is_valid_email("valid.email@example.com") is True
assert EmailStr.is_valid_email("invalid-email.com") is False
def test_email_str__slots__():
email = EmailStr("test@example.com")
with pytest.raises(AttributeError):
email.hi = "bye"
assert email.hi == "bye"
```
## Documentation
For detailed documentation, visit [py-nt.asyncmove.com](https://py-nt.asyncmove.com/).
### Key Topics:
- [Installation Guide](https://py-nt.asyncmove.com/getting-started/installation/)
- [Quick Start Guide](https://py-nt.asyncmove.com/getting-started/quickstart/)
- [User Guide](https://py-nt.asyncmove.com/user-guide/basic-usage/)
- [API Reference](https://py-nt.asyncmove.com/api/newtype/)
## Development
### Prerequisites
- Python 3.8 or higher
- C compiler (for building extensions)
- Development packages:
```bash
make install-dev-deps
```
### Building from Source
```bash
git clone https://github.com/jymchng/python-newtype-dev.git
cd python-newtype-dev
make build
```
### Install from Source
```bash
git clone https://github.com/jymchng/python-newtype-dev.git
cd python-newtype-dev
make install
```
### Running Tests
```bash
# Run all tests
make test
# Run with debug output
make test-debug
# Run specific test suite
make test-custom
```
## Contributing
We welcome contributions! Please see our [Contributing Guide](https://py-nt.asyncmove.com/development/contributing/) for details.
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Acknowledgments
Special thanks to all contributors who have helped shape this project.
Raw data
{
"_id": null,
"home_page": "https://github.com/jymchng/python-newtype-dev",
"name": "python-newtype",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.8",
"maintainer_email": null,
"keywords": null,
"author": "Jim Chng",
"author_email": "jimchng@outlook.com",
"download_url": "https://files.pythonhosted.org/packages/4b/00/71cc2dd95aa2c406305ede2f9a2b9865f2b395ac77498046aeb10dedeee8/python_newtype-0.1.4.tar.gz",
"platform": null,
"description": "<div align=\"center\">\n\n# python-newtype\n\n## Documentation\n<a href=\"https://py-nt.asyncmove.com\">\n <img src=\"https://img.shields.io/badge/docs-passing-brightgreen.svg\" width=\"100\" alt=\"docs passing\">\n</a>\n\n### Compatibility and Version\n<img src=\"https://img.shields.io/badge/%3E=python-3.8-blue.svg\" alt=\"Python compat\">\n<a href=\"https://pypi.python.org/pypi/python-newtype\"><img src=\"https://img.shields.io/pypi/v/python-newtype.svg\" alt=\"PyPi\"></a>\n\n### CI/CD\n<a href=\"https://codecov.io/github/jymchng/python-newtype-dev?branch=main\"><img src=\"https://codecov.io/github/jymchng/python-newtype-dev/coverage.svg?branch=main\" alt=\"Coverage\"></a>\n\n### License and Issues\n<a href=\"https://github.com/jymchng/python-newtype-dev/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/jymchng/python-newtype-dev\" alt=\"License\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/issues\"><img src=\"https://img.shields.io/github/issues/jymchng/python-newtype-dev\" alt=\"Issues\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/issues?q=is%3Aissue+is%3Aclosed\"><img src=\"https://img.shields.io/github/issues-closed/jymchng/python-newtype-dev\" alt=\"Closed Issues\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/issues?q=is%3Aissue+is%3Aopen\"><img src=\"https://img.shields.io/github/issues-raw/jymchng/python-newtype-dev\" alt=\"Open Issues\"></a>\n\n### Development and Quality\n<a href=\"https://github.com/jymchng/python-newtype-dev/network/members\"><img src=\"https://img.shields.io/github/forks/jymchng/python-newtype-dev\" alt=\"Forks\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/stargazers\"><img src=\"https://img.shields.io/github/stars/jymchng/python-newtype-dev\" alt=\"Stars\"></a>\n<a href=\"https://pypi.python.org/pypi/python-newtype\"><img src=\"https://img.shields.io/pypi/dm/python-newtype\" alt=\"Downloads\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/graphs/contributors\"><img src=\"https://img.shields.io/github/contributors/jymchng/python-newtype-dev\" alt=\"Contributors\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/commits/main\"><img src=\"https://img.shields.io/github/commit-activity/m/jymchng/python-newtype-dev\" alt=\"Commits\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/commits/main\"><img src=\"https://img.shields.io/github/last-commit/jymchng/python-newtype-dev\" alt=\"Last Commit\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev\"><img src=\"https://img.shields.io/github/languages/code-size/jymchng/python-newtype-dev\" alt=\"Code Size\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev\"><img src=\"https://img.shields.io/github/repo-size/jymchng/python-newtype-dev\" alt=\"Repo Size\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/watchers\"><img src=\"https://img.shields.io/github/watchers/jymchng/python-newtype-dev\" alt=\"Watchers\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev\"><img src=\"https://img.shields.io/github/commit-activity/y/jymchng/python-newtype-dev\" alt=\"Activity\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/pulls\"><img src=\"https://img.shields.io/github/issues-pr/jymchng/python-newtype-dev\" alt=\"PRs\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/pulls?q=is%3Apr+is%3Aclosed\"><img src=\"https://img.shields.io/github/issues-pr-closed/jymchng/python-newtype-dev\" alt=\"Merged PRs\"></a>\n<a href=\"https://github.com/jymchng/python-newtype-dev/pulls?q=is%3Apr+is%3Aopen\"><img src=\"https://img.shields.io/github/issues-pr/open/jymchng/python-newtype-dev\" alt=\"Open PRs\"></a>\n\n</div>\n\nA powerful Python library for extending existing types with additional functionality while preserving their original behavior, type information and subtype invariances.\n\n## Features\n\n- **Type Wrapping**: Seamlessly wrap existing Python types with new functionality and preservation of subtype invariances when using methods of supertype\n- **Custom Initialization**: Control object initialization with special handling\n- **Attribute Preservation**: Maintains both `__dict__` and `__slots__` attributes\n- **Memory Efficient**: Uses weak references for caching\n- **Debug Support**: Built-in debug printing capabilities for development\n- **Async Support**: Full support for asynchronous methods and operations\n\n## Quick Start\n\n### Installation\n\n```bash\npip install python-newtype\n```\n\n### Basic Usage\n\n```python\nimport pytest\nimport re\nfrom newtype import NewType, newtype_exclude\n\n\nclass EmailStr(NewType(str)):\n # you can define `__slots__` to save space\n __slots__ = (\n '_local_part',\n '_domain_part',\n )\n\n def __init__(self, value: str):\n super().__init__()\n if \"@\" not in value:\n raise TypeError(\"`EmailStr` requires a '@' symbol within\")\n self._local_part, self._domain_part = value.split(\"@\")\n\n @newtype_exclude\n def __str__(self):\n return f\"<Email - Local Part: {self.local_part}; Domain Part: {self.domain_part}>\"\n\n @property\n def local_part(self):\n \"\"\"Return the local part of the email address.\"\"\"\n return self._local_part\n\n @property\n def domain_part(self):\n \"\"\"Return the domain part of the email address.\"\"\"\n return self._domain_part\n\n @property\n def full_email(self):\n \"\"\"Return the full email address.\"\"\"\n return str(self)\n\n @classmethod\n def from_string(cls, email: str):\n \"\"\"Create an EmailStr instance from a string.\"\"\"\n return cls(email)\n\n @staticmethod\n def is_valid_email(email: str) -> bool:\n \"\"\"Check if the provided string is a valid email format.\"\"\"\n email_regex = r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"\n return re.match(email_regex, email) is not None\n\n\ndef test_emailstr_replace():\n \"\"\"`EmailStr` uses `str.replace(..)` as its own method, returning an instance of `EmailStr`\n if the resultant `str` instance is a value `EmailStr`.\n \"\"\"\n peter_email = EmailStr(\"peter@gmail.com\")\n smith_email = EmailStr(\"smith@gmail.com\")\n\n with pytest.raises(Exception):\n # this raises because `peter_email` is no longer an instance of `EmailStr`\n peter_email = peter_email.replace(\"peter@gmail.com\", \"petergmail.com\")\n\n # this works because the entire email can be 'replaced'\n james_email = smith_email.replace(\"smith@gmail.com\", \"james@gmail.com\")\n\n # comparison with `str` is built-in\n assert james_email == \"james@gmail.com\"\n\n # `james_email` is still an `EmailStr`\n assert isinstance(james_email, EmailStr)\n\n # this works because the local part can be 'replaced'\n jane_email = james_email.replace(\"james\", \"jane\")\n\n # `jane_email` is still an `EmailStr`\n assert isinstance(jane_email, EmailStr)\n assert jane_email == \"jane@gmail.com\"\n\n\ndef test_emailstr_properties_methods():\n \"\"\"Test the property, class method, and static method of EmailStr.\"\"\"\n # Test property\n email = EmailStr(\"test@example.com\")\n # `property` is not coerced to `EmailStr`\n assert email.full_email == \"<Email - Local Part: test; Domain Part: example.com>\"\n assert isinstance(email.full_email, str)\n # `property` is not coerced to `EmailStr`\n assert not isinstance(email.full_email, EmailStr)\n assert email.local_part == \"test\"\n assert email.domain_part == \"example.com\"\n\n # Test class method\n email_from_string = EmailStr.from_string(\"classmethod@example.com\")\n # `property` is not coerced to `EmailStr`\n assert (\n email_from_string.full_email\n == \"<Email - Local Part: classmethod; Domain Part: example.com>\"\n )\n assert email_from_string.local_part == \"classmethod\"\n assert email_from_string.domain_part == \"example.com\"\n\n # Test static method\n assert EmailStr.is_valid_email(\"valid.email@example.com\") is True\n assert EmailStr.is_valid_email(\"invalid-email.com\") is False\n\n\ndef test_email_str__slots__():\n email = EmailStr(\"test@example.com\")\n\n with pytest.raises(AttributeError):\n email.hi = \"bye\"\n assert email.hi == \"bye\"\n```\n\n## Documentation\n\nFor detailed documentation, visit [py-nt.asyncmove.com](https://py-nt.asyncmove.com/).\n\n### Key Topics:\n- [Installation Guide](https://py-nt.asyncmove.com/getting-started/installation/)\n- [Quick Start Guide](https://py-nt.asyncmove.com/getting-started/quickstart/)\n- [User Guide](https://py-nt.asyncmove.com/user-guide/basic-usage/)\n- [API Reference](https://py-nt.asyncmove.com/api/newtype/)\n\n## Development\n\n### Prerequisites\n\n- Python 3.8 or higher\n- C compiler (for building extensions)\n- Development packages:\n ```bash\n make install-dev-deps\n ```\n\n### Building from Source\n\n```bash\ngit clone https://github.com/jymchng/python-newtype-dev.git\ncd python-newtype-dev\nmake build\n```\n\n### Install from Source\n\n```bash\ngit clone https://github.com/jymchng/python-newtype-dev.git\ncd python-newtype-dev\nmake install\n```\n\n### Running Tests\n\n```bash\n# Run all tests\nmake test\n\n# Run with debug output\nmake test-debug\n\n# Run specific test suite\nmake test-custom\n```\n\n## Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](https://py-nt.asyncmove.com/development/contributing/) for details.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Acknowledgments\n\nSpecial thanks to all contributors who have helped shape this project.\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A Python library for creating and managing new types with enhanced type safety and flexibility.",
"version": "0.1.4",
"project_urls": {
"Documentation": "https://py-nt.asyncmove.com",
"Homepage": "https://github.com/jymchng/python-newtype-dev",
"Repository": "https://github.com/jymchng/python-newtype-dev"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "256d33c712a5cb283124e458cb6fef7aec8cb72374c9bc1ae721ddb8e2eb5d73",
"md5": "0c58ca58ca880625d7818102d251ab0c",
"sha256": "ed22dc271da25990ea7f4cfbad7b6f52fea30deb42bea103aa18e8b22b7b2bdd"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp310-cp310-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "0c58ca58ca880625d7818102d251ab0c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.8",
"size": 21622,
"upload_time": "2025-01-11T17:07:28",
"upload_time_iso_8601": "2025-01-11T17:07:28.711337Z",
"url": "https://files.pythonhosted.org/packages/25/6d/33c712a5cb283124e458cb6fef7aec8cb72374c9bc1ae721ddb8e2eb5d73/python_newtype-0.1.4-cp310-cp310-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5f114a50a6987fbdb2ce7a8c18d9c2aebc15f17c950229a76f391c3852de1190",
"md5": "fc2feba2b5187a1d4b6c4cb72949bb0d",
"sha256": "ad2cbb9a5600635dac364324a66c2f06b4196d5e6ec90198133626b966b5eda5"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp310-cp310-manylinux_2_35_x86_64.whl",
"has_sig": false,
"md5_digest": "fc2feba2b5187a1d4b6c4cb72949bb0d",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.8",
"size": 21626,
"upload_time": "2025-01-11T17:07:30",
"upload_time_iso_8601": "2025-01-11T17:07:30.849134Z",
"url": "https://files.pythonhosted.org/packages/5f/11/4a50a6987fbdb2ce7a8c18d9c2aebc15f17c950229a76f391c3852de1190/python_newtype-0.1.4-cp310-cp310-manylinux_2_35_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3948e47ecb91db10ecf2f77c4cc082f9081216547963c1da3366c5d55b04b816",
"md5": "7dbe56b673aac3de1a50858278228670",
"sha256": "91d4c27af29ff14722d9aeac1c7a685c2b48f3695112e9b592fd1832ea8e5147"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "7dbe56b673aac3de1a50858278228670",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.8",
"size": 21778,
"upload_time": "2025-01-11T17:07:31",
"upload_time_iso_8601": "2025-01-11T17:07:31.903782Z",
"url": "https://files.pythonhosted.org/packages/39/48/e47ecb91db10ecf2f77c4cc082f9081216547963c1da3366c5d55b04b816/python_newtype-0.1.4-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9e6f43d1668dc4df523e944937279a22d7f2dcf335aeffb8a8c72c71cee979a0",
"md5": "d157015ba15aeaa9f1407b9b9661b5a3",
"sha256": "22812fd5f22ccbbab96bf228c65250dec09f980340b924d34d8f480139387dd7"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp311-cp311-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "d157015ba15aeaa9f1407b9b9661b5a3",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.8",
"size": 21623,
"upload_time": "2025-01-11T17:07:34",
"upload_time_iso_8601": "2025-01-11T17:07:34.924551Z",
"url": "https://files.pythonhosted.org/packages/9e/6f/43d1668dc4df523e944937279a22d7f2dcf335aeffb8a8c72c71cee979a0/python_newtype-0.1.4-cp311-cp311-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "281f8a87f7397902186b71807a7de698484cc5ea39560acd614e21ae8b81e8df",
"md5": "f6b57dc634b6188d98c04b451e687cf9",
"sha256": "40f7dd806cbdeeb4da98d9c659bc1c635a86aba5be657cd1b7a22bf3b1ee1363"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp311-cp311-manylinux_2_35_x86_64.whl",
"has_sig": false,
"md5_digest": "f6b57dc634b6188d98c04b451e687cf9",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.8",
"size": 21627,
"upload_time": "2025-01-11T17:07:36",
"upload_time_iso_8601": "2025-01-11T17:07:36.506243Z",
"url": "https://files.pythonhosted.org/packages/28/1f/8a87f7397902186b71807a7de698484cc5ea39560acd614e21ae8b81e8df/python_newtype-0.1.4-cp311-cp311-manylinux_2_35_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "53f91c9c5c10bc1df70af352dc23a91c3178baf445ce2d4586ae612a1de20b16",
"md5": "7e25580149f3e91dcfbd78af9759087c",
"sha256": "3d13913e100399f3896508c7d605941a08e04423cb5df911b990fd42fb5fad3d"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "7e25580149f3e91dcfbd78af9759087c",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.8",
"size": 21778,
"upload_time": "2025-01-11T17:07:38",
"upload_time_iso_8601": "2025-01-11T17:07:38.875519Z",
"url": "https://files.pythonhosted.org/packages/53/f9/1c9c5c10bc1df70af352dc23a91c3178baf445ce2d4586ae612a1de20b16/python_newtype-0.1.4-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bee7321ab1b2a8bc5287628b4be508972cbbe25850db1f196136fe4cfebb7540",
"md5": "17d49040d764cd04b84b2cc22fc26f87",
"sha256": "355b010febae566856d2330c2b319b329ae199f330d37e2a295879e00d8e29cd"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp312-cp312-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "17d49040d764cd04b84b2cc22fc26f87",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.8",
"size": 21624,
"upload_time": "2025-01-11T17:07:44",
"upload_time_iso_8601": "2025-01-11T17:07:44.502360Z",
"url": "https://files.pythonhosted.org/packages/be/e7/321ab1b2a8bc5287628b4be508972cbbe25850db1f196136fe4cfebb7540/python_newtype-0.1.4-cp312-cp312-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bc4719fd07a98a3b4cc5ceea402b3f5f87c8381520bdfddcc3e81a244d1945ce",
"md5": "3b10e4ea061a50f5ada668da7561e464",
"sha256": "f9fc8e23e0774bd1618641a44c23c8b87dce04d46cd51d1dbe1604d72c861d07"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp312-cp312-manylinux_2_35_x86_64.whl",
"has_sig": false,
"md5_digest": "3b10e4ea061a50f5ada668da7561e464",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.8",
"size": 21627,
"upload_time": "2025-01-11T17:07:45",
"upload_time_iso_8601": "2025-01-11T17:07:45.782665Z",
"url": "https://files.pythonhosted.org/packages/bc/47/19fd07a98a3b4cc5ceea402b3f5f87c8381520bdfddcc3e81a244d1945ce/python_newtype-0.1.4-cp312-cp312-manylinux_2_35_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ad8974be53459210020d05795ec0bc12c72cade6143d2bb1cc5779c01d275773",
"md5": "bfb886d1fe9ccc43cdb1133d0076fb3d",
"sha256": "474941c51115ef0a09f94a214b586ec802ad174fa34098b48d0b2224c0ba924b"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "bfb886d1fe9ccc43cdb1133d0076fb3d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.8",
"size": 21778,
"upload_time": "2025-01-11T17:07:46",
"upload_time_iso_8601": "2025-01-11T17:07:46.844065Z",
"url": "https://files.pythonhosted.org/packages/ad/89/74be53459210020d05795ec0bc12c72cade6143d2bb1cc5779c01d275773/python_newtype-0.1.4-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0f208ebe2c8e4d414ce2f8e8bd42525527df8872c3b2015aa659d8db89d8c6c6",
"md5": "4ad2923badd480c82c3bebad3b4d83f9",
"sha256": "1c4338a70091b59e883fc4d80ac0083883eee023ea7725b9c4de42625d6a3937"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp38-cp38-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "4ad2923badd480c82c3bebad3b4d83f9",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": "<4.0,>=3.8",
"size": 21621,
"upload_time": "2025-01-11T17:07:47",
"upload_time_iso_8601": "2025-01-11T17:07:47.882507Z",
"url": "https://files.pythonhosted.org/packages/0f/20/8ebe2c8e4d414ce2f8e8bd42525527df8872c3b2015aa659d8db89d8c6c6/python_newtype-0.1.4-cp38-cp38-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cb63954983219600af0d63fcaf607f764e9ac60c5abd26b718b829dbad61c160",
"md5": "2326d81814114767d13b4b15e836d2b9",
"sha256": "8f56c1567aace576647afc6a558905a041b8edb1832a3b28d941fb5894fd9d99"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp38-cp38-manylinux_2_35_x86_64.whl",
"has_sig": false,
"md5_digest": "2326d81814114767d13b4b15e836d2b9",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": "<4.0,>=3.8",
"size": 21625,
"upload_time": "2025-01-11T17:07:48",
"upload_time_iso_8601": "2025-01-11T17:07:48.906271Z",
"url": "https://files.pythonhosted.org/packages/cb/63/954983219600af0d63fcaf607f764e9ac60c5abd26b718b829dbad61c160/python_newtype-0.1.4-cp38-cp38-manylinux_2_35_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7c626d2dd27d8781e7b145f31c047a3d704b6104b1070e5bb63500fa9fb4702a",
"md5": "6fd37a6503ea1af080c20d9b14c2e8c3",
"sha256": "95c1fe468e94414fddeca6f2c3a95dff1db66317c90fbf3628983c4a3e189e9d"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "6fd37a6503ea1af080c20d9b14c2e8c3",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": "<4.0,>=3.8",
"size": 21777,
"upload_time": "2025-01-11T17:07:50",
"upload_time_iso_8601": "2025-01-11T17:07:50.906371Z",
"url": "https://files.pythonhosted.org/packages/7c/62/6d2dd27d8781e7b145f31c047a3d704b6104b1070e5bb63500fa9fb4702a/python_newtype-0.1.4-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d641d852af6e67842dfe18456ab54bce8bb12ccae17da4f91a21cf453843f44d",
"md5": "d1c910927f774318bb0f92e143b91e6b",
"sha256": "b0b3fbc70728813fd00fb6a7e18589c83a30d4c4d85db936c504ba3f5e3c2e8f"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp39-cp39-macosx_14_0_arm64.whl",
"has_sig": false,
"md5_digest": "d1c910927f774318bb0f92e143b91e6b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.8",
"size": 21621,
"upload_time": "2025-01-11T17:07:52",
"upload_time_iso_8601": "2025-01-11T17:07:52.027957Z",
"url": "https://files.pythonhosted.org/packages/d6/41/d852af6e67842dfe18456ab54bce8bb12ccae17da4f91a21cf453843f44d/python_newtype-0.1.4-cp39-cp39-macosx_14_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3e645929bb45e9bda33bca96368f59c755393790e9419f28b9dce5daae20823c",
"md5": "18204cc073b18b65b6ebcb4ee92b1b33",
"sha256": "9931debeb71cbaa636331c27529be5321fda9bfab4eded880c4eff6ae2ae83b2"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp39-cp39-manylinux_2_35_x86_64.whl",
"has_sig": false,
"md5_digest": "18204cc073b18b65b6ebcb4ee92b1b33",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.8",
"size": 21625,
"upload_time": "2025-01-11T17:07:54",
"upload_time_iso_8601": "2025-01-11T17:07:54.634789Z",
"url": "https://files.pythonhosted.org/packages/3e/64/5929bb45e9bda33bca96368f59c755393790e9419f28b9dce5daae20823c/python_newtype-0.1.4-cp39-cp39-manylinux_2_35_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9b63b2f918dec38987d4196ee67c1aa9abfd89697991cb7ca693fd2e27c11c52",
"md5": "5e4c5497a3ba1d4e6fd203cd861c5e8d",
"sha256": "0e7d84ae93b91be47233072033e3def1ab7dc7820cf7af248e022e6ad1470990"
},
"downloads": -1,
"filename": "python_newtype-0.1.4-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "5e4c5497a3ba1d4e6fd203cd861c5e8d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.8",
"size": 21777,
"upload_time": "2025-01-11T17:07:55",
"upload_time_iso_8601": "2025-01-11T17:07:55.685062Z",
"url": "https://files.pythonhosted.org/packages/9b/63/b2f918dec38987d4196ee67c1aa9abfd89697991cb7ca693fd2e27c11c52/python_newtype-0.1.4-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4b0071cc2dd95aa2c406305ede2f9a2b9865f2b395ac77498046aeb10dedeee8",
"md5": "be5acd26e340626f94415276479a41b5",
"sha256": "9e5a72744303a43ade745c94a8ef3289794dffdd6fdcfbb6266189e39db6a2ef"
},
"downloads": -1,
"filename": "python_newtype-0.1.4.tar.gz",
"has_sig": false,
"md5_digest": "be5acd26e340626f94415276479a41b5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.8",
"size": 23888,
"upload_time": "2025-01-11T17:07:57",
"upload_time_iso_8601": "2025-01-11T17:07:57.794860Z",
"url": "https://files.pythonhosted.org/packages/4b/00/71cc2dd95aa2c406305ede2f9a2b9865f2b395ac77498046aeb10dedeee8/python_newtype-0.1.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-11 17:07:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jymchng",
"github_project": "python-newtype-dev",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "python-newtype"
}