python-newtype


Namepython-newtype JSON
Version 0.1.4 PyPI version JSON
download
home_pagehttps://github.com/jymchng/python-newtype-dev
SummaryA Python library for creating and managing new types with enhanced type safety and flexibility.
upload_time2025-01-11 17:07:57
maintainerNone
docs_urlNone
authorJim Chng
requires_python<4.0,>=3.8
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <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"
}
        
Elapsed time: 1.23762s