Skip to main content

Radically simple ORM for Pyrus's tasks

Project description

pyrus-orm

Radically simple, django/peewee-like, easy and incomplete ORM for Pyrus.

With pyrus-orm, you can read, create and modify tasks.

Works with pyrus-api under the hood.

This is an early development version

Features:

  • Define models with:
    • simple fields (text, number, dates, ...)
    • catalog fields, single item
    • catalog fields, multiple items
    • "title" fields (pyrus-orm ignores the nested structure of 'title' fields, all its contents are treated as usual root-level fields)
    • multiple choice fields (without nested fields at this moment)
  • Operations with models:
    • Create and save
    • Read from registry by ID
    • Modify and save changes
  • Filtering:
    • by include_archived and steps fields
    • by value of simple or catalog fields
    • less than, greater than
    • value in a list
    • ranges

Installation

pip install pyrus-orm

Examples

Define model and initialize

class Book(PyrusModel):
    title = TextField(1)  # 1 is a field ID in pyrus's form
    time = TimeField(2)
    date = DateField(3)
    number = NumericField(4)
    round_number = IntegerField(5)
    author = CatalogField(6, catalog=<catalog id>)

    class Meta:
        form_id = <form_id>


pyrus_api = PyrusAPI(...)
session = PyrusORMSession(pyrus_api)

set_session_global(session)

Create item

book = Book(
    title='Don Quixote',
    date='1605-01-01',
    author=Book.author.find({'Name': 'Alonso Fernández de Avellaneda'})
)

book.save()

book.id
>>> <task_id>

Read and modify item

book = Book.objects.get(id=...)

# simple field
book.title
>>> 'Don Quixote'
book.title = 'Don Quixote, Part Two'
book.save('title changed')

# catalog field
book.author
>>> CatalogItem(item_id=..., values={'Name': 'Alonso Fernández de Avellaneda'})  # values comes from the catalog definition

book.author.find_and_set({'Name': 'Miguel de Cervantes'})  # may raise ValueError if no value found
book.save('changed an author to the real one')

Catalog Enum fields

Enums can be mapped to catalog items by ID or by custom property name.

Enums mapped to specific catalog items ID

No catalog lookups are preformed on reading or writing of such fields.

class Genre(Enum):
    fiction = 100001
    nonfiction = 100002


class Book(PyrusModel):
    genre = CatalogEnumField(<field_id>, catalog_id=<catalog_id>, enum=Genre, id_field='item_id')

book = Book.objects.get(id=...)

book.genre
>>> Genre.fiction

book.genre = Genre.nonfiction
book.save()

book.genre
>>> Genre.nonfiction

Enums mapped to catalog item properties

(imagine book has a property 'media' with field 'Name')

class Media(Enum):
    paper = 'paper'
    papirus = 'papirus'
    pdf = 'pdf'

class Book(PyrusModel):
    media = CatalogEnumField(<field_id>, catalog_id=<catalog_id>, enum=Genre, id_field='Name')

Filtering

Only basic filtering is supported:

Book.objects.get_filtered(
    title='Don Quixote',
)
>>> [Book(...), ...]


Book.objects.get_filtered(
    genre=Book.genre.find({'Name': 'Fiction'})
)
>>> [Book(...), ...]

Book.objects.get_filtered(
    ...
    include_archived=True,
    steps=[1, 2],
)
>>> [Book(...), ...]

Catalog fields, all the API

# Read values

# Non-empty value
book.author
>>> CatalogItem(item_id=..., values={<your custom values here>})

assert bool(book.author) == True

# Empty value
book.author
>>> CatalogEmptyValue()

assert bool(book.author) == False


# Get all possible values (works for empty fields as well)
book.author.catalog()
>>> [CatalogItem(...), CatalogItem(...), ...]


# Find a value in a catalog
new_author = book.author.catalog().find({'Name': 'Miguel de Cervantes'})
new_author
>>> CatalogItem(item_id=..., values={'Name': 'Miguel de Cervantes'})  # or None

book.author = new_author
book.save()


# Find and set shortcut
book.author.catalog().find_and_set({'Name': 'William Shakespeare'})

book.author.find_and_set({'Name': 'NonExistent'})
>>> ValueError raised


# Set value to a specific item_id
book.author = CatalogItem(item_id=123456)

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

pyrus_orm-0.0.7.tar.gz (13.2 kB view details)

Uploaded Source

Built Distribution

pyrus_orm-0.0.7-py3-none-any.whl (13.5 kB view details)

Uploaded Python 3

File details

Details for the file pyrus_orm-0.0.7.tar.gz.

File metadata

  • Download URL: pyrus_orm-0.0.7.tar.gz
  • Upload date:
  • Size: 13.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.2 CPython/3.11.1 Darwin/22.3.0

File hashes

Hashes for pyrus_orm-0.0.7.tar.gz
Algorithm Hash digest
SHA256 4dbe2f59fc32552b471b5b645e6ee591f9ef10b486c693b469196a7b7bbb8104
MD5 165bc46cb0ed65d8719c483984bfaca5
BLAKE2b-256 a44101cec9733bf6fc46c76dfe166fb9903af21d4fee5b50d803cff4e9f261f2

See more details on using hashes here.

File details

Details for the file pyrus_orm-0.0.7-py3-none-any.whl.

File metadata

  • Download URL: pyrus_orm-0.0.7-py3-none-any.whl
  • Upload date:
  • Size: 13.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.2 CPython/3.11.1 Darwin/22.3.0

File hashes

Hashes for pyrus_orm-0.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 d531417b41bde5c08bb9a7474ad2716c78069431da5d0198b2147707361c0999
MD5 729b8430480bc270841d926b0b927036
BLAKE2b-256 79e2633ff9d6ae89baf77816f214eeab946a8a54661e7553c307cff1c71d43b6

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