advanced-automapper


Nameadvanced-automapper JSON
Version 0.1.6 PyPI version JSON
download
home_pagehttps://impalah.github.io/advanced-automapper/
SummaryObject mapper based on type hints
upload_time2024-06-02 11:28:28
maintainerNone
docs_urlNone
authorimpalah
requires_python>=3.10
licenseMIT
keywords mapper typehints python
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # advanced-automapper

Object automapper based on type hints.


## Installation

Using pip:

```bash
pip install advanced-automapper
```

Using poetry

```bash
poetry advanced-automapper
```


## Get started

It is important to note that PyAutomapper requieres that both origin and destination classes have have type hints to define the type for every field.

Let's say you have a Pydantic model called Person, and you need to map it to a SqlAlchmey model to save it to a database:


```python

from enum import Enum
from typing import Dict, List, Optional

from pydantic import BaseModel

from sqlalchemy import Enum as SqlEnum
from sqlalchemy import ForeignKey, Integer, String
from sqlalchemy.orm import Mapped, declarative_base, mapped_column, relationship


class GenderPydantic(Enum):
    MALE = 1
    FEMALE = 2
    FURRY = 3
    OTHER = 4

class PersonPydantic(BaseModel):
    name: str
    age: int
    gender: GenderPydantic



Base = declarative_base()


class GenderAlchemy(Enum):
    MALE = 1
    FEMALE = 2
    FURRY = 3
    OTHER = 4

class PersonAlchemy(Base):
    __tablename__ = "persons"
    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    name: Mapped[str] = mapped_column(String(50), nullable=False)
    age: Mapped[int] = mapped_column(Integer)
    gender: Mapped[GenderAlchemy] = mapped_column(
        SqlEnum(GenderAlchemy), nullable=False
    )

    def __repr__(self):
        return f"<PersonAlchemy(name='{self.name}', age={self.age}, gender='{self.gender}')>"

# Create a person
person = PersonPydantic(name="John", age=25, gender=GenderPydantic.MALE)


```

To create a PersonAlchemy object:


```python
from automapper import Mapper

mapper = Mapper()
mapped_person = mapper.map(person, PersonAlchemy)

print(mapped_person)

```
## Add custom mapping

PyAutomapper allows to map fields with different names between them using custom mapping.

Imagine that, in the previous SqlAlchemy class the gender field is called "genero":

```python

from enum import Enum
from typing import Dict, List, Optional

from pydantic import BaseModel

from sqlalchemy import Enum as SqlEnum
from sqlalchemy import ForeignKey, Integer, String
from sqlalchemy.orm import Mapped, declarative_base, mapped_column, relationship


class GenderPydantic(Enum):
    MALE = 1
    FEMALE = 2
    FURRY = 3
    OTHER = 4

class PersonPydantic(BaseModel):
    name: str
    age: int
    gender: GenderPydantic



Base = declarative_base()


class GenderAlchemy(Enum):
    MALE = 1
    FEMALE = 2
    FURRY = 3
    OTHER = 4

class PersonAlchemy(Base):
    __tablename__ = "persons"
    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    name: Mapped[str] = mapped_column(String(50), nullable=False)
    age: Mapped[int] = mapped_column(Integer)
    # Let's rename this field
    genero: Mapped[GenderAlchemy] = mapped_column(
        SqlEnum(GenderAlchemy), nullable=False
    )

    def __repr__(self):
        return f"<PersonAlchemy(name='{self.name}', age={self.age}, gender='{self.gender}')>"

# Create a person
person = PersonPydantic(name="John", age=25, gender=GenderPydantic.MALE)

```

The solution is to add a cutom mapping in the Mapper relating the field "gender", in the source class, with "genero" in the target.

```python

from automapper import Mapper

mapper = Mapper()
mapper.add_custom_mapping(PersonPydantic, "gender", "genero")

mapped_person = mapper.map(person, PersonAlchemy)

print(mapped_person)

```

## More examples

The tests folder in the code repository contains examples of mapping between different python objects.



            

Raw data

            {
    "_id": null,
    "home_page": "https://impalah.github.io/advanced-automapper/",
    "name": "advanced-automapper",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "mapper, typehints, python",
    "author": "impalah",
    "author_email": "impalah@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/d1/37/390c24f783cd45ec60972272c4f88c22641f26371f546bc6712b285ee585/advanced_automapper-0.1.6.tar.gz",
    "platform": null,
    "description": "# advanced-automapper\n\nObject automapper based on type hints.\n\n\n## Installation\n\nUsing pip:\n\n```bash\npip install advanced-automapper\n```\n\nUsing poetry\n\n```bash\npoetry advanced-automapper\n```\n\n\n## Get started\n\nIt is important to note that PyAutomapper requieres that both origin and destination classes have have type hints to define the type for every field.\n\nLet's say you have a Pydantic model called Person, and you need to map it to a SqlAlchmey model to save it to a database:\n\n\n```python\n\nfrom enum import Enum\nfrom typing import Dict, List, Optional\n\nfrom pydantic import BaseModel\n\nfrom sqlalchemy import Enum as SqlEnum\nfrom sqlalchemy import ForeignKey, Integer, String\nfrom sqlalchemy.orm import Mapped, declarative_base, mapped_column, relationship\n\n\nclass GenderPydantic(Enum):\n    MALE = 1\n    FEMALE = 2\n    FURRY = 3\n    OTHER = 4\n\nclass PersonPydantic(BaseModel):\n    name: str\n    age: int\n    gender: GenderPydantic\n\n\n\nBase = declarative_base()\n\n\nclass GenderAlchemy(Enum):\n    MALE = 1\n    FEMALE = 2\n    FURRY = 3\n    OTHER = 4\n\nclass PersonAlchemy(Base):\n    __tablename__ = \"persons\"\n    id: Mapped[int] = mapped_column(Integer, primary_key=True)\n    name: Mapped[str] = mapped_column(String(50), nullable=False)\n    age: Mapped[int] = mapped_column(Integer)\n    gender: Mapped[GenderAlchemy] = mapped_column(\n        SqlEnum(GenderAlchemy), nullable=False\n    )\n\n    def __repr__(self):\n        return f\"<PersonAlchemy(name='{self.name}', age={self.age}, gender='{self.gender}')>\"\n\n# Create a person\nperson = PersonPydantic(name=\"John\", age=25, gender=GenderPydantic.MALE)\n\n\n```\n\nTo create a PersonAlchemy object:\n\n\n```python\nfrom automapper import Mapper\n\nmapper = Mapper()\nmapped_person = mapper.map(person, PersonAlchemy)\n\nprint(mapped_person)\n\n```\n## Add custom mapping\n\nPyAutomapper allows to map fields with different names between them using custom mapping.\n\nImagine that, in the previous SqlAlchemy class the gender field is called \"genero\":\n\n```python\n\nfrom enum import Enum\nfrom typing import Dict, List, Optional\n\nfrom pydantic import BaseModel\n\nfrom sqlalchemy import Enum as SqlEnum\nfrom sqlalchemy import ForeignKey, Integer, String\nfrom sqlalchemy.orm import Mapped, declarative_base, mapped_column, relationship\n\n\nclass GenderPydantic(Enum):\n    MALE = 1\n    FEMALE = 2\n    FURRY = 3\n    OTHER = 4\n\nclass PersonPydantic(BaseModel):\n    name: str\n    age: int\n    gender: GenderPydantic\n\n\n\nBase = declarative_base()\n\n\nclass GenderAlchemy(Enum):\n    MALE = 1\n    FEMALE = 2\n    FURRY = 3\n    OTHER = 4\n\nclass PersonAlchemy(Base):\n    __tablename__ = \"persons\"\n    id: Mapped[int] = mapped_column(Integer, primary_key=True)\n    name: Mapped[str] = mapped_column(String(50), nullable=False)\n    age: Mapped[int] = mapped_column(Integer)\n    # Let's rename this field\n    genero: Mapped[GenderAlchemy] = mapped_column(\n        SqlEnum(GenderAlchemy), nullable=False\n    )\n\n    def __repr__(self):\n        return f\"<PersonAlchemy(name='{self.name}', age={self.age}, gender='{self.gender}')>\"\n\n# Create a person\nperson = PersonPydantic(name=\"John\", age=25, gender=GenderPydantic.MALE)\n\n```\n\nThe solution is to add a cutom mapping in the Mapper relating the field \"gender\", in the source class, with \"genero\" in the target.\n\n```python\n\nfrom automapper import Mapper\n\nmapper = Mapper()\nmapper.add_custom_mapping(PersonPydantic, \"gender\", \"genero\")\n\nmapped_person = mapper.map(person, PersonAlchemy)\n\nprint(mapped_person)\n\n```\n\n## More examples\n\nThe tests folder in the code repository contains examples of mapping between different python objects.\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Object mapper based on type hints",
    "version": "0.1.6",
    "project_urls": {
        "Documentation": "https://impalah.github.io/advanced-automapper/",
        "Homepage": "https://impalah.github.io/advanced-automapper/",
        "Repository": "https://github.com/impalah/advanced-automapper",
        "Source": "https://github.com/impalah/advanced-automapper"
    },
    "split_keywords": [
        "mapper",
        " typehints",
        " python"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c4b6b20c7b90fd8a2a258e342c85c2d7433dcff4d8b34cd99eb149aae0142e8c",
                "md5": "07bd162b83a17da61dfb6c51412be730",
                "sha256": "5b61c2f5d98e9c9561ef46384f183b7d08ca51b5b55e496da920b348454260d5"
            },
            "downloads": -1,
            "filename": "advanced_automapper-0.1.6-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "07bd162b83a17da61dfb6c51412be730",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 7599,
            "upload_time": "2024-06-02T11:28:27",
            "upload_time_iso_8601": "2024-06-02T11:28:27.235197Z",
            "url": "https://files.pythonhosted.org/packages/c4/b6/b20c7b90fd8a2a258e342c85c2d7433dcff4d8b34cd99eb149aae0142e8c/advanced_automapper-0.1.6-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d137390c24f783cd45ec60972272c4f88c22641f26371f546bc6712b285ee585",
                "md5": "3cc5e78debee132bf01c38d972f9e3be",
                "sha256": "08868a803abd050e056488130b5ae4f74df5de18b3dacb102cda7f1ca8a85205"
            },
            "downloads": -1,
            "filename": "advanced_automapper-0.1.6.tar.gz",
            "has_sig": false,
            "md5_digest": "3cc5e78debee132bf01c38d972f9e3be",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 5536,
            "upload_time": "2024-06-02T11:28:28",
            "upload_time_iso_8601": "2024-06-02T11:28:28.503176Z",
            "url": "https://files.pythonhosted.org/packages/d1/37/390c24f783cd45ec60972272c4f88c22641f26371f546bc6712b285ee585/advanced_automapper-0.1.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-06-02 11:28:28",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "impalah",
    "github_project": "advanced-automapper",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "advanced-automapper"
}
        
Elapsed time: 0.93362s