Skip to main content

Object mapper based on type hints

Project description

advanced-automapper

Object automapper based on type hints.

Installation

Using pip:

pip install advanced-automapper

Using poetry

poetry add 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:

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:

from automapper import 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":

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.

from automapper import 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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

advanced_automapper-0.1.10.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

advanced_automapper-0.1.10-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

Details for the file advanced_automapper-0.1.10.tar.gz.

File metadata

  • Download URL: advanced_automapper-0.1.10.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.12.5 Linux/6.5.0-1025-azure

File hashes

Hashes for advanced_automapper-0.1.10.tar.gz
Algorithm Hash digest
SHA256 f372b1001342457ec4ca9759eaa61d89e95b5d4ff19d744fd45141060285af2a
MD5 834951b59c438572d6c5abcfef1ab270
BLAKE2b-256 c878c687863014f2108162c52813386410a0954e5abdb0bdc47c667e2c544881

See more details on using hashes here.

File details

Details for the file advanced_automapper-0.1.10-py3-none-any.whl.

File metadata

File hashes

Hashes for advanced_automapper-0.1.10-py3-none-any.whl
Algorithm Hash digest
SHA256 1a387725d918913e782b1973b0f7cded0adc230a1043b9aacdb01adff4903399
MD5 bcf3d5f3e4f78fd99338fa7a358d2e97
BLAKE2b-256 557b6c7cf932b8ba9c76951c62edc74e78dee43a7b66af359e0511a8e472dbec

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page