# DataModel
DataModel is a simple library based on python +3.8 to use Dataclass-syntax for interacting with
Data, using the same syntax of Dataclass, users can write Python Objects
and work with Data in the same way (like ORM's), is a reimplementation of python Dataclasses supporting true inheritance (without decorators), true composition and other good features.
The key features are:
* **Easy to use**: No more using decorators, concerns abour re-ordering attributes or common problems with using dataclasses with inheritance.
* **Extensibility**: Can use other dataclasses, Data objects or primitives as data-types.
* **Fast**: DataModel is a replacement 100% full compatible with dataclasses, without any overhead.
## Requirements
Python 3.8+
## Installation
<div class="termy">
```console
$ pip install python-datamodel
---> 100%
Successfully installed datamodel
```
</div>
## Quickstart
```python
from datamodel import Field, BaseModel
from dataclasses import dataclass, fields, is_dataclass
# This pure Dataclass:
@dataclass
class Point:
x: int = Field(default=0, min=0, max=10)
y: int = Field(default=0, min=0, max=10)
point = Point(x=10, y=10)
print(point)
print(fields(point))
print('IS a Dataclass?: ', is_dataclass(point))
# Can be represented by BaseModel
class newPoint(BaseModel):
x: int = Field(default=0, min=0, max=10)
y: int = Field(default=0, min=0, max=10)
def get_coordinate(self):
return (self.x, self.y)
point = newPoint(x=10, y=10)
print(point)
print(fields(point))
print('IS a Dataclass?: ', is_dataclass(point))
print(point.get_coordinate())
```
## Supported types
DataModel support recursive transformation of fields, so you can easily work with nested dataclasses or complex types.
DataModel supports automatic conversion of:
- [datetime](https://docs.python.org/3/library/datetime.html#available-types)
objects. `datetime` objects are encoded to str exactly like orjson conversion, any str typed as datetime is decoded to datetime.
The same behavior is used to decoding time, date and timedelta objects.
- [UUID](https://docs.python.org/3/library/uuid.html#uuid.UUID) objects. They
are encoded as `str` (JSON string) and decoded back to uuid.UUID objects.
- [Decimal](https://docs.python.org/3/library/decimal.html) objects. They are
also encoded as `float` and decoded back to Decimal.
Also, "custom" encoders are supported.
```python
import uuid
from typing import (
List,
Optional,
Union
)
from dataclasses import dataclass, field
from datamodel import BaseModel, Field
@dataclass
class Point:
x: int = Field(default=0, min=0, max=10)
y: int = Field(default=0, min=0, max=10)
class coordinate(BaseModel, intSum):
latitude: float
longitude: float
def get_location(self) -> tuple:
return (self.latitude, self.longitude)
def auto_uid():
return uuid.uuid4()
def default_rect():
return [0,0,0,0]
def valid_zipcode(field, value):
return value > 1000
class Address(BaseModel):
id: uuid.UUID = field(default_factory=auto_uid)
street: str = Field(required=True)
zipcode: int = Field(required=False, default=1010, validator=valid_zipcode)
location: Optional[coordinate]
box: List[Optional[Point]]
rect: List[int] = Field(factory=default_rect)
addr = Address(street="Calle Mayor", location=(18.1, 22.1), zipcode=3021, box=[(2, 10), (4, 8)], rect=[1, 2, 3, 4])
print('IS a Dataclass?: ', is_dataclass(addr))
print(addr.location.get_location())
```
```console
# returns
Address(id=UUID('24b34dd5-8d35-4cfd-8916-7876b28cdae3'), street='Calle Mayor', zipcode=3021, location=coordinate(latitude=18.1, longitude=22.1), box=[Point(x=2, y=10), Point(x=4, y=8)], rect=[1, 2, 3, 4])
```
* Fast and convenience conversion from-to JSON (using orjson):
```python
import orjson
b = addr.json()
print(b)
```
```console
{"id":"24b34dd5-8d35-4cfd-8916-7876b28cdae3","street":"Calle Mayor","zipcode":3021,"location":{"latitude":18.1,"longitude":22.1}, "box":[{"x":2,"y":10},{"x":4,"y":8}],"rect":[1,2,3,4]}
```
```python
# and re-imported from json
new_addr = Address.from_json(b) # load directly from json string
# or using a dictionary decoded by orjson
data = orjson.loads(b)
new_addr = Address(**data)
```
## Inheritance
python-datamodel supports inheritance of classes.
```python
import uuid
from typing import Union, List
from dataclasses import dataclass, field
from datamodel import BaseModel, Column, Field
def auto_uid():
return uuid.uuid4()
class User(BaseModel):
id: uuid.UUID = field(default_factory=auto_uid)
name: str
first_name: str
last_name: str
@dataclass
class Address:
street: str
city: str
state: str
zipcode: str
country: Optional[str] = 'US'
def __str__(self) -> str:
"""Provides pretty response of address"""
lines = [self.street]
lines.append(f"{self.city}, {self.zipcode} {self.state}")
lines.append(f"{self.country}")
return "\n".join(lines)
class Employee(User):
"""
Base Employee.
"""
role: str
address: Address # composition of a dataclass inside of DataModel is possible.
# Supporting multiple inheritance and composition
# Wage Policies
class MonthlySalary(BaseModel):
salary: Union[float, int]
def calculate_payroll(self) -> Union[float, int]:
return self.salary
class HourlySalary(BaseModel):
salary: Union[float, int] = Field(default=0)
hours_worked: Union[float, int] = Field(default=0)
def calculate_payroll(self) -> Union[float, int]:
return (self.hours_worked * self.salary)
# employee types
class Secretary(Employee, MonthlySalary):
"""Secretary.
Person with montly salary policy and no commissions.
"""
role: str = 'Secretary'
class FactoryWorker(Employee, HourlySalary):
"""
FactoryWorker is an employee with hourly salary policy and no commissions.
"""
role: str = 'Factory Worker'
class PayrollSystem:
def calculate_payroll(self, employees: List[dataclass]) -> None:
print('=== Calculating Payroll === ')
for employee in employees:
print(f"Payroll for employee {employee.id} - {employee.name}")
print(f"- {employee.role} Amount: {employee.calculate_payroll()}")
if employee.address:
print('- Sent to:')
print(employee.address)
print("")
jane = Secretary(name='Jane Doe', first_name='Jane', last_name='Doe', salary=1500)
bob = FactoryWorker(name='Bob Doyle', first_name='Bob', last_name='Doyle', salary=15, hours_worked=40)
mitch = FactoryWorker(name='Mitch Brian', first_name='Mitch', last_name='Brian', salary=20, hours_worked=35)
payroll = PayrollSystem()
payroll.calculate_payroll([jane, bob, mitch])
```
A sample of output:
```
```console
=== Calculating Payroll ===
Payroll for employee 745a2623-d4d2-4da6-bf0a-1fa691bafd33 - Jane Doe
- Secretary Amount: 1500
- Sent to:
Rodeo Drive, Rd
Los Angeles, 31050 CA
US
```
## Contributing
First of all, thank you for being interested in contributing to this library.
I really appreciate you taking the time to work on this project.
- If you're just interested in getting into the code, a good place to start are
issues tagged as bugs.
- If introducing a new feature, especially one that modifies the public API,
consider submitting an issue for discussion before a PR. Please also take a look
at existing issues / PRs to see what you're proposing has already been covered
before / exists.
- I like to follow the commit conventions documented [here](https://www.conventionalcommits.org/en/v1.0.0/#summary)
## License
This project is licensed under the terms of the BSD v3. license.
Raw data
{
"_id": null,
"home_page": "https://github.com/phenobarbital/python-datamodel",
"name": "python-datamodel",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10.0",
"maintainer_email": null,
"keywords": "asyncio, dataclass, dataclasses, data models",
"author": "Jesus Lara",
"author_email": "jesuslarag@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/79/05/e25c961758cf2f14244b3f184ea871ca412d5a9649741019e54540e1d6cd/python_datamodel-0.10.4.tar.gz",
"platform": "any",
"description": "# DataModel\nDataModel is a simple library based on python +3.8 to use Dataclass-syntax for interacting with\nData, using the same syntax of Dataclass, users can write Python Objects\nand work with Data in the same way (like ORM's), is a reimplementation of python Dataclasses supporting true inheritance (without decorators), true composition and other good features.\n\nThe key features are:\n* **Easy to use**: No more using decorators, concerns abour re-ordering attributes or common problems with using dataclasses with inheritance.\n* **Extensibility**: Can use other dataclasses, Data objects or primitives as data-types.\n* **Fast**: DataModel is a replacement 100% full compatible with dataclasses, without any overhead.\n\n\n\n## Requirements\n\nPython 3.8+\n\n## Installation\n\n<div class=\"termy\">\n\n```console\n$ pip install python-datamodel\n---> 100%\nSuccessfully installed datamodel\n```\n\n\n</div>\n\n## Quickstart\n\n\n```python\n\nfrom datamodel import Field, BaseModel\nfrom dataclasses import dataclass, fields, is_dataclass\n\n\n# This pure Dataclass:\n@dataclass\nclass Point:\n x: int = Field(default=0, min=0, max=10)\n y: int = Field(default=0, min=0, max=10)\n\npoint = Point(x=10, y=10)\nprint(point)\nprint(fields(point))\nprint('IS a Dataclass?: ', is_dataclass(point))\n\n# Can be represented by BaseModel\nclass newPoint(BaseModel):\n x: int = Field(default=0, min=0, max=10)\n y: int = Field(default=0, min=0, max=10)\n\n def get_coordinate(self):\n return (self.x, self.y)\n\npoint = newPoint(x=10, y=10)\nprint(point)\nprint(fields(point))\nprint('IS a Dataclass?: ', is_dataclass(point))\nprint(point.get_coordinate())\n```\n## Supported types\n\nDataModel support recursive transformation of fields, so you can easily work with nested dataclasses or complex types.\n\nDataModel supports automatic conversion of:\n\n- [datetime](https://docs.python.org/3/library/datetime.html#available-types)\nobjects. `datetime` objects are encoded to str exactly like orjson conversion, any str typed as datetime is decoded to datetime.\nThe same behavior is used to decoding time, date and timedelta objects.\n\n- [UUID](https://docs.python.org/3/library/uuid.html#uuid.UUID) objects. They\nare encoded as `str` (JSON string) and decoded back to uuid.UUID objects.\n\n- [Decimal](https://docs.python.org/3/library/decimal.html) objects. They are\nalso encoded as `float` and decoded back to Decimal.\n\nAlso, \"custom\" encoders are supported.\n\n```python\n\nimport uuid\nfrom typing import (\n List,\n Optional,\n Union\n)\nfrom dataclasses import dataclass, field\nfrom datamodel import BaseModel, Field\n\n@dataclass\nclass Point:\n x: int = Field(default=0, min=0, max=10)\n y: int = Field(default=0, min=0, max=10)\n\nclass coordinate(BaseModel, intSum):\n latitude: float\n longitude: float\n\n def get_location(self) -> tuple:\n return (self.latitude, self.longitude)\n\ndef auto_uid():\n return uuid.uuid4()\n\ndef default_rect():\n return [0,0,0,0]\n\ndef valid_zipcode(field, value):\n return value > 1000\n\nclass Address(BaseModel):\n id: uuid.UUID = field(default_factory=auto_uid)\n street: str = Field(required=True)\n zipcode: int = Field(required=False, default=1010, validator=valid_zipcode)\n location: Optional[coordinate]\n box: List[Optional[Point]]\n rect: List[int] = Field(factory=default_rect)\n\n\naddr = Address(street=\"Calle Mayor\", location=(18.1, 22.1), zipcode=3021, box=[(2, 10), (4, 8)], rect=[1, 2, 3, 4])\nprint('IS a Dataclass?: ', is_dataclass(addr))\n\nprint(addr.location.get_location())\n```\n```console\n# returns\nAddress(id=UUID('24b34dd5-8d35-4cfd-8916-7876b28cdae3'), street='Calle Mayor', zipcode=3021, location=coordinate(latitude=18.1, longitude=22.1), box=[Point(x=2, y=10), Point(x=4, y=8)], rect=[1, 2, 3, 4])\n```\n\n* Fast and convenience conversion from-to JSON (using orjson):\n\n```python\nimport orjson\n\nb = addr.json()\nprint(b)\n```\n```console\n{\"id\":\"24b34dd5-8d35-4cfd-8916-7876b28cdae3\",\"street\":\"Calle Mayor\",\"zipcode\":3021,\"location\":{\"latitude\":18.1,\"longitude\":22.1}, \"box\":[{\"x\":2,\"y\":10},{\"x\":4,\"y\":8}],\"rect\":[1,2,3,4]}\n```\n\n```python\n# and re-imported from json\nnew_addr = Address.from_json(b) # load directly from json string\n# or using a dictionary decoded by orjson\ndata = orjson.loads(b)\nnew_addr = Address(**data)\n\n```\n\n## Inheritance\n\npython-datamodel supports inheritance of classes.\n\n```python\nimport uuid\nfrom typing import Union, List\nfrom dataclasses import dataclass, field\nfrom datamodel import BaseModel, Column, Field\n\n\ndef auto_uid():\n return uuid.uuid4()\n\nclass User(BaseModel):\n id: uuid.UUID = field(default_factory=auto_uid)\n name: str\n first_name: str\n last_name: str\n\n\n@dataclass\nclass Address:\n street: str\n city: str\n state: str\n zipcode: str\n country: Optional[str] = 'US'\n\n def __str__(self) -> str:\n \"\"\"Provides pretty response of address\"\"\"\n lines = [self.street]\n lines.append(f\"{self.city}, {self.zipcode} {self.state}\")\n lines.append(f\"{self.country}\")\n return \"\\n\".join(lines)\n\nclass Employee(User):\n \"\"\"\n Base Employee.\n \"\"\"\n role: str\n address: Address # composition of a dataclass inside of DataModel is possible.\n\n# Supporting multiple inheritance and composition\n# Wage Policies\nclass MonthlySalary(BaseModel):\n salary: Union[float, int]\n\n def calculate_payroll(self) -> Union[float, int]:\n return self.salary\n\nclass HourlySalary(BaseModel):\n salary: Union[float, int] = Field(default=0)\n hours_worked: Union[float, int] = Field(default=0)\n\n def calculate_payroll(self) -> Union[float, int]:\n return (self.hours_worked * self.salary)\n\n# employee types\nclass Secretary(Employee, MonthlySalary):\n \"\"\"Secretary.\n\n Person with montly salary policy and no commissions.\n \"\"\"\n role: str = 'Secretary'\n\nclass FactoryWorker(Employee, HourlySalary):\n \"\"\"\n FactoryWorker is an employee with hourly salary policy and no commissions.\n \"\"\"\n role: str = 'Factory Worker'\n\nclass PayrollSystem:\n def calculate_payroll(self, employees: List[dataclass]) -> None:\n print('=== Calculating Payroll === ')\n for employee in employees:\n print(f\"Payroll for employee {employee.id} - {employee.name}\")\n print(f\"- {employee.role} Amount: {employee.calculate_payroll()}\")\n if employee.address:\n print('- Sent to:')\n print(employee.address)\n print(\"\")\n\njane = Secretary(name='Jane Doe', first_name='Jane', last_name='Doe', salary=1500)\nbob = FactoryWorker(name='Bob Doyle', first_name='Bob', last_name='Doyle', salary=15, hours_worked=40)\nmitch = FactoryWorker(name='Mitch Brian', first_name='Mitch', last_name='Brian', salary=20, hours_worked=35)\n\npayroll = PayrollSystem()\npayroll.calculate_payroll([jane, bob, mitch])\n```\nA sample of output:\n```\n```console\n=== Calculating Payroll ===\nPayroll for employee 745a2623-d4d2-4da6-bf0a-1fa691bafd33 - Jane Doe\n- Secretary Amount: 1500\n- Sent to:\nRodeo Drive, Rd\nLos Angeles, 31050 CA\nUS\n```\n## Contributing\n\nFirst of all, thank you for being interested in contributing to this library.\nI really appreciate you taking the time to work on this project.\n\n- If you're just interested in getting into the code, a good place to start are\nissues tagged as bugs.\n- If introducing a new feature, especially one that modifies the public API,\nconsider submitting an issue for discussion before a PR. Please also take a look\nat existing issues / PRs to see what you're proposing has already been covered\nbefore / exists.\n- I like to follow the commit conventions documented [here](https://www.conventionalcommits.org/en/v1.0.0/#summary)\n\n## License\n\nThis project is licensed under the terms of the BSD v3. license.\n",
"bugtrack_url": null,
"license": "BSD",
"summary": "simple library based on python +3.8 to use Dataclass-syntaxfor interacting with Data",
"version": "0.10.4",
"project_urls": {
"Buy Me A Coffee!": "https://www.buymeacoffee.com/phenobarbital",
"Documentation": "https://datamodel.readthedocs.io/en/latest/",
"Funding": "https://paypal.me/phenobarbital",
"Homepage": "https://github.com/phenobarbital/python-datamodel",
"Say Thanks!": "https://saythanks.io/to/phenobarbital",
"Source": "https://github.com/phenobarbital/datamodel",
"Tracker": "https://github.com/phenobarbital/datamodel/issues"
},
"split_keywords": [
"asyncio",
" dataclass",
" dataclasses",
" data models"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "925610b8c1ea6159ff2f32cf5738f95c7283a68a5ed9d0390807009fd16b4d1d",
"md5": "ad1d054180cfd465ab4ff8a40a6681c8",
"sha256": "6e4eb598630c071d8dad9815ca30f57ba53b7f911ad36b8b4aec0acf2b8b4ca5"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "ad1d054180cfd465ab4ff8a40a6681c8",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10.0",
"size": 4537209,
"upload_time": "2025-02-20T02:15:26",
"upload_time_iso_8601": "2025-02-20T02:15:26.221794Z",
"url": "https://files.pythonhosted.org/packages/92/56/10b8c1ea6159ff2f32cf5738f95c7283a68a5ed9d0390807009fd16b4d1d/python_datamodel-0.10.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f07f7fdd118b03ab3c239484d0446e580572536c75b89448bfd53203ad79dee3",
"md5": "f1e86678cf80d761acc46b2dfa3f9563",
"sha256": "7fcc5efd23c19095bc009b0024d90d076dc09d016358a7cfd838cca0ef6b0753"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "f1e86678cf80d761acc46b2dfa3f9563",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10.0",
"size": 4505709,
"upload_time": "2025-02-20T02:15:29",
"upload_time_iso_8601": "2025-02-20T02:15:29.061374Z",
"url": "https://files.pythonhosted.org/packages/f0/7f/7fdd118b03ab3c239484d0446e580572536c75b89448bfd53203ad79dee3/python_datamodel-0.10.4-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bdfc04c0f5ad05eaf43783a0e1d39f7908cff3774f2775c5c41364aa8bb16892",
"md5": "62831ec1a8be0d67681a21b33d7295f7",
"sha256": "aaca5ab4559ea8870eff49994a8486b0b7a191f95c9938ccaf642cbda9f73c5b"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp310-cp310-win32.whl",
"has_sig": false,
"md5_digest": "62831ec1a8be0d67681a21b33d7295f7",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10.0",
"size": 1813291,
"upload_time": "2025-02-20T02:15:31",
"upload_time_iso_8601": "2025-02-20T02:15:31.326248Z",
"url": "https://files.pythonhosted.org/packages/bd/fc/04c0f5ad05eaf43783a0e1d39f7908cff3774f2775c5c41364aa8bb16892/python_datamodel-0.10.4-cp310-cp310-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "45cd307016845ca6b65ce3847566bcfde9fa1fafa1be189af5cfbc2d7c311475",
"md5": "ae5aebfe25224edaec24ad17300b9b23",
"sha256": "b6eedd702432647b220692f1e69b3db55f3fb252a425afbbf59a473cb470b0ba"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "ae5aebfe25224edaec24ad17300b9b23",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10.0",
"size": 1871569,
"upload_time": "2025-02-20T02:15:33",
"upload_time_iso_8601": "2025-02-20T02:15:33.514146Z",
"url": "https://files.pythonhosted.org/packages/45/cd/307016845ca6b65ce3847566bcfde9fa1fafa1be189af5cfbc2d7c311475/python_datamodel-0.10.4-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "25af1405ce5f674ee952a9f12f5cca22e4798d8e91f660be54d9e91aab86d9f6",
"md5": "e372c45a2746d47303e65cebd07d8f46",
"sha256": "2b457c4c95f22440bc5ff222a1bcac5ad8551fc8c4fc8237a7ad5a8678c3a5cb"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e372c45a2746d47303e65cebd07d8f46",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10.0",
"size": 4807734,
"upload_time": "2025-02-20T02:15:36",
"upload_time_iso_8601": "2025-02-20T02:15:36.493965Z",
"url": "https://files.pythonhosted.org/packages/25/af/1405ce5f674ee952a9f12f5cca22e4798d8e91f660be54d9e91aab86d9f6/python_datamodel-0.10.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "057ec478b14138d9c4c7859af6d05a72f2839d07b95888127f11c952f4c519e6",
"md5": "221b8e8f5ed7a078de0843645857b338",
"sha256": "4b3459ca0ed2d5010a13713d32795e787e3c64a8e5caa9ffc5ee3c9af9c2b77e"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "221b8e8f5ed7a078de0843645857b338",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10.0",
"size": 4804033,
"upload_time": "2025-02-20T02:15:39",
"upload_time_iso_8601": "2025-02-20T02:15:39.165410Z",
"url": "https://files.pythonhosted.org/packages/05/7e/c478b14138d9c4c7859af6d05a72f2839d07b95888127f11c952f4c519e6/python_datamodel-0.10.4-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "98efdbef24be25a6a3d0807cbac422891ef8af346d134e4602b52b4035c424c5",
"md5": "be4ecd711f321b4fc0f6b50fedef7dca",
"sha256": "11e33d82bb8e0c3ee086f28b9f599563d2d3485c41cb6d7ba010327dbb250751"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp311-cp311-win32.whl",
"has_sig": false,
"md5_digest": "be4ecd711f321b4fc0f6b50fedef7dca",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10.0",
"size": 1811293,
"upload_time": "2025-02-20T02:15:41",
"upload_time_iso_8601": "2025-02-20T02:15:41.602792Z",
"url": "https://files.pythonhosted.org/packages/98/ef/dbef24be25a6a3d0807cbac422891ef8af346d134e4602b52b4035c424c5/python_datamodel-0.10.4-cp311-cp311-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "684c98165f90faf5fa9afc1da511d70255d8fb34e4e517f02b0f6478dbbd7180",
"md5": "6dd5cefabcab5ed4d889d8f11b86328c",
"sha256": "650d682388b21bb19de755fa9a9db0dc979fea54268116e3265b8222ce25878f"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "6dd5cefabcab5ed4d889d8f11b86328c",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10.0",
"size": 1875227,
"upload_time": "2025-02-20T02:15:43",
"upload_time_iso_8601": "2025-02-20T02:15:43.111483Z",
"url": "https://files.pythonhosted.org/packages/68/4c/98165f90faf5fa9afc1da511d70255d8fb34e4e517f02b0f6478dbbd7180/python_datamodel-0.10.4-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8d9e9dd5365ac729fad935a3b666e3c7017a48fdb6db1aafb715a77bda33ba57",
"md5": "cfd4d7c22f4dd9d528122b54b3bc2a68",
"sha256": "f4d41c051ed891d2db971ce83b769e9fd7e59db797a40337823c299e2947107f"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "cfd4d7c22f4dd9d528122b54b3bc2a68",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10.0",
"size": 4857551,
"upload_time": "2025-02-20T02:15:44",
"upload_time_iso_8601": "2025-02-20T02:15:44.769068Z",
"url": "https://files.pythonhosted.org/packages/8d/9e/9dd5365ac729fad935a3b666e3c7017a48fdb6db1aafb715a77bda33ba57/python_datamodel-0.10.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4d43c9702deb5c219fd8cb88c357a93569176529eb9176f959a8d603524f42d5",
"md5": "2e59eb4038cea41987e84a410cb4695d",
"sha256": "22fdda6c70abd27640946a2d9d5d1d7475ee38779dd4bb6f610548b032601683"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "2e59eb4038cea41987e84a410cb4695d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10.0",
"size": 4826050,
"upload_time": "2025-02-20T02:15:46",
"upload_time_iso_8601": "2025-02-20T02:15:46.446012Z",
"url": "https://files.pythonhosted.org/packages/4d/43/c9702deb5c219fd8cb88c357a93569176529eb9176f959a8d603524f42d5/python_datamodel-0.10.4-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ce1690f92772c406b72de34b996cae832896f0263c25965be8ec314cd16e2456",
"md5": "e144463517b490009ba905a205e076dc",
"sha256": "9f153346c32a5f69ac1485a05fa6028cc8a99c8be3118ca4c98702156ef87ea1"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp312-cp312-win32.whl",
"has_sig": false,
"md5_digest": "e144463517b490009ba905a205e076dc",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10.0",
"size": 1803357,
"upload_time": "2025-02-20T02:15:48",
"upload_time_iso_8601": "2025-02-20T02:15:48.837305Z",
"url": "https://files.pythonhosted.org/packages/ce/16/90f92772c406b72de34b996cae832896f0263c25965be8ec314cd16e2456/python_datamodel-0.10.4-cp312-cp312-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c21766cad1706447a11586c1786c285ef8c93b5bbdefb51ba6167b7e7448d885",
"md5": "d6147891e6f7f5590e3f643934d439b7",
"sha256": "c50290ffdeff5d9a92d9ce0474df3ba81c1cd637285c712d492e792dec20c2fb"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "d6147891e6f7f5590e3f643934d439b7",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10.0",
"size": 1865189,
"upload_time": "2025-02-20T02:15:50",
"upload_time_iso_8601": "2025-02-20T02:15:50.997949Z",
"url": "https://files.pythonhosted.org/packages/c2/17/66cad1706447a11586c1786c285ef8c93b5bbdefb51ba6167b7e7448d885/python_datamodel-0.10.4-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "891cba3eab352594834f2c9bf8995e0b55d315a815646feca60bd330a41ab0f8",
"md5": "0d50e16fd5a8b97d929aced1f7cb9b3d",
"sha256": "e22d96ffea75555c996e02526d9616ed750226d0154514ccbcd5c52a05e6f359"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "0d50e16fd5a8b97d929aced1f7cb9b3d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10.0",
"size": 4764294,
"upload_time": "2025-02-20T02:15:52",
"upload_time_iso_8601": "2025-02-20T02:15:52.624925Z",
"url": "https://files.pythonhosted.org/packages/89/1c/ba3eab352594834f2c9bf8995e0b55d315a815646feca60bd330a41ab0f8/python_datamodel-0.10.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "06a81c7563454c30d75bf5d5765a96f28b481f5f3b684fd1087f2c80e38daff8",
"md5": "cf066b6771387419eef9e8a8fba6bb74",
"sha256": "c782eeeb568c932d367bb6734a7d1819c4d0efa76c2c3a49ec9cf0d3567508c1"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "cf066b6771387419eef9e8a8fba6bb74",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10.0",
"size": 4731824,
"upload_time": "2025-02-20T02:15:55",
"upload_time_iso_8601": "2025-02-20T02:15:55.127326Z",
"url": "https://files.pythonhosted.org/packages/06/a8/1c7563454c30d75bf5d5765a96f28b481f5f3b684fd1087f2c80e38daff8/python_datamodel-0.10.4-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3cbaa5737995fc9d239f48fe6b37348101152460ec02ae385b70f676341c33bc",
"md5": "9ad4ef4b9ab7f3e22e834d73f19679d1",
"sha256": "aaa7f90714111f6c29f5d6dcaef9b83c438eca15988044219bb0b83de5b1632e"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp313-cp313-win32.whl",
"has_sig": false,
"md5_digest": "9ad4ef4b9ab7f3e22e834d73f19679d1",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10.0",
"size": 1799681,
"upload_time": "2025-02-20T02:15:57",
"upload_time_iso_8601": "2025-02-20T02:15:57.424906Z",
"url": "https://files.pythonhosted.org/packages/3c/ba/a5737995fc9d239f48fe6b37348101152460ec02ae385b70f676341c33bc/python_datamodel-0.10.4-cp313-cp313-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d773a71a6a9d02634e744adff24608510c9d8f3acc6e8d962a85dec3f3a2a68d",
"md5": "0a08c283c7db344f991c029585e39414",
"sha256": "2e81895700e0bbb71cb80317207385adee875d907e272034e1f14a796682e13c"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "0a08c283c7db344f991c029585e39414",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10.0",
"size": 1858907,
"upload_time": "2025-02-20T02:15:58",
"upload_time_iso_8601": "2025-02-20T02:15:58.835614Z",
"url": "https://files.pythonhosted.org/packages/d7/73/a71a6a9d02634e744adff24608510c9d8f3acc6e8d962a85dec3f3a2a68d/python_datamodel-0.10.4-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7905e25c961758cf2f14244b3f184ea871ca412d5a9649741019e54540e1d6cd",
"md5": "a7fab97bfbfbb5fd02d395be394b769c",
"sha256": "1b21890004524ed6dc8ba829edf581509615ecbb51d2f52e59749b883cd91104"
},
"downloads": -1,
"filename": "python_datamodel-0.10.4.tar.gz",
"has_sig": false,
"md5_digest": "a7fab97bfbfbb5fd02d395be394b769c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10.0",
"size": 1196995,
"upload_time": "2025-02-20T02:16:00",
"upload_time_iso_8601": "2025-02-20T02:16:00.176440Z",
"url": "https://files.pythonhosted.org/packages/79/05/e25c961758cf2f14244b3f184ea871ca412d5a9649741019e54540e1d6cd/python_datamodel-0.10.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-20 02:16:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "phenobarbital",
"github_project": "python-datamodel",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "python-datamodel"
}