Skip to main content

Python abstract data request library.

Project description

Description

Abstract data request library powered by the python syntax and reflective concerns.

License Development Status Latest release Supported Python versions Supported Python implementations Download format Build status Code test coverage Downloads Documentation Status Code Health

Installation

pip install b3j0f.requester

Features

This library aims to access to system data from a generic and python API.

Reflective concerns permit to not consider only data access with four create/read/update/delete operations but with a more one which is a service execution. Therefore, the main acronym of this library is CRUDE

In a minimal case, there are 6 concepts to know:

  • Driver: in charge of accessing data.

  • Expression and Function: refers to data models and system functions.

  • Transaction: refers to data access transaction.

  • Context: execution context such as a dict where keys are expressions, and values are system data.

Let a data models containing a table ‘user’ where fields are ‘name’ and ‘age’.

A filter about users of age at least 10 is:

Expression.user.age > 10

A selection of number of users is:

Function.count(Expression.user)

Now, imagine you have two systems, called respectivelly Administration and Club. You might want to get users who have the same name and are at least twenty years old, in both systems like that:

(Expression.Administration.user.name == Expression.Club.user.name) & (Expression.user.age >= 20)

Therefore, all python operators are overriden by the object Expression in order to let you requests in a pythonic way.

Examples

Refers to a data

from b3j0f.requester import Expression as E, Function as F

# ways to refers to the field 'user.id'.
E.user.id
E('user.id')
E('user').id

# ways to refers to the function 'count' on the data 'user'.
F.count(E.user)
F('count')(E.user)
F('count', params=[E.user])

# In a multi system use, a system is seen such as a data:
# access to users from a system administration.
E.Administration.user
E('Administration.user')
E('Administration').user

Create data from a system

from b3j0f.requester import Driver

class MyDriver(Driver):
   """implement your own driver..."""

driver = MyDriver()

# ways to create data from the request manager
driver.create(name='C.user', values={'name': 'john'})
driver.create(name=E.C.user, values={'name': 'john'})

# create several data at once with method chaining and transaction
with driver.open() as transaction:
   """transaction.create(...).update(...)"""

The with ensure the transaction is commited or rollbacked in case of any error.

trans = driver.open()

# it is also possible to create a hierarchy of transaction with trans.open()

trans.create('C.user', {'name': 'john'}).create(E.C.user, {'name': 'paul'}).process(Create('C.user', {'name': 'david'}), Create(E.C.user, {'name': 'thomas'})).commit()

# create transaction with autocommit and with an historical context
# autocommit and ctx can be changed at runtime
trans = driver.open(autocommit=True, ctx=Context())

Read data from a system

from b3j0f.requester import Read as R, Join as J

# get a read resource with specific offset
crud = driver.read(offset=5)

# add filters
crud &= (E.A.id == E.B.id) & (F.now > E.B.timestamp)
# same as
crud.where(query)
# and with a "or"
crud.orwhere(query); crud |= query

# method chaining and max 10 data, sorted by A.id and grouped by A.name
result = crud.sortby(E.A.id).groupby(E.A.name).join('FULL').select()[:10]

for data in result:  # display A and B
   print(data['A'], data['B'])

# or get the result via a callback
crud(async=True, callback=lambda result: None)

# read data with a Read object
read = R(limit=10, groupby=E.A.name, join=J.FULL, sort=E.A.name)
result = trans.process(read).ctx[read]  # get context request which contain all data from systems and a transaction with autocommit

# read data from the driver with default parameters
AandB = driver['A', 'B']

Update data from a system

from b3j0f.requester import Update as U

# udpate data from the driver
driver.update(name='user', values={'name': 'john'})
driver.update(name=E.user, values={'name': 'john'})
driver.update(name=E.user, values={'name': 'john'})
driver[E.user] = {'name': 'john'}
driver['user'] = {'name': 'john'}

# update data from the transaction
trans.update(name=E.user, values={'name': 'john'})
trans.update('user', {'name': 'john'})
trans['user'] = {'name': 'john'}
trans[E.user] = {'name': 'john'}
trans.process(U(name='user', values={'name': 'john'}))
trans.process(U(name=E.user, values={'name': 'john'}))

Delete data from a system

from b3j0f.requester import Delete as D

# delete a user from a driver
driver.delete(names=['user'], query=query)
driver.delete(names=[E.user], query=query)
del driver['user']
del driver[E.user]

# delete a user from a transaction
trans.delete(names=[D.user], query=query)
trans.delete(names=['user'], query=query)
del trans['user']
del trans[E.user]
trans.process(names=[D('user')], query=query)
trans.process(names=[D(E.user)], query=query)

Perspectives

  • wait feedbacks during 6 months before passing it to a stable version.

  • Cython implementation.

Donation

I'm grateful for gifts, but don't have a specific funding goal.

Project details


Download files

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

Source Distributions

b3j0f.requester-0.0.4.zip (85.3 kB view details)

Uploaded Source

b3j0f.requester-0.0.4.tar.gz (38.3 kB view details)

Uploaded Source

Built Distribution

b3j0f.requester-0.0.4-py2.py3-none-any.whl (79.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file b3j0f.requester-0.0.4.zip.

File metadata

File hashes

Hashes for b3j0f.requester-0.0.4.zip
Algorithm Hash digest
SHA256 a93ee9834b3aedbf34f6bb136948664c8f55f082144ae157182d666a2b4edb5b
MD5 e1fcf05803b82bc81e1ca7bd1044bf18
BLAKE2b-256 843b6f126d2f44f58094540759470de1f6695cf47f9fde2fc5e913f7ef62e71d

See more details on using hashes here.

File details

Details for the file b3j0f.requester-0.0.4.tar.gz.

File metadata

File hashes

Hashes for b3j0f.requester-0.0.4.tar.gz
Algorithm Hash digest
SHA256 fc7ca0124caad4b4b9eea183f3e4cc2da6805801dc2ec32c860688e313c7945d
MD5 381dd10ebec5fd74a041d4e68754795e
BLAKE2b-256 e761663f211f7dd4856f8d1743862b59351e7f5ad38cd4e03f0936954a3207e7

See more details on using hashes here.

File details

Details for the file b3j0f.requester-0.0.4-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for b3j0f.requester-0.0.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 8e47261882a17a0cbe8a91ccd349b912da5d1eecbf88f867f16418438578c9fd
MD5 b40b7d27c3a6beb50b5f0cdfe30c4c13
BLAKE2b-256 7a9872fb5a0d5e0de87b17a58e98614f710dc5addc83a3589b2130a3c9888d1a

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