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.13.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

advanced_automapper-0.1.13-py3-none-any.whl (7.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: advanced_automapper-0.1.13.tar.gz
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.12.6 Linux/6.8.0-1014-azure

File hashes

Hashes for advanced_automapper-0.1.13.tar.gz
Algorithm Hash digest
SHA256 7c912187abdcdd71759ad394e6c6241f8c8d7d6f0c103c011ba3efe59a8fd289
MD5 24c59d239b454cb8c86969553ce96f5e
BLAKE2b-256 8e5b41b7f28e3b825e52f96e627d6843330a3a1015b6ff725a29106fbff4b5fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for advanced_automapper-0.1.13-py3-none-any.whl
Algorithm Hash digest
SHA256 9231cbc20bd57c527a9f41cd16e564ad2460e86b50c7bc6b735fd1a83e883a71
MD5 a8056c203fc85ac2487c3c2b2979ac59
BLAKE2b-256 a848f92f81aef0981800673e89a007ae83f9c2f0d84686e3f96f09a89ff02304

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