Giter VIP home page Giter VIP logo

providah's Introduction

FOSSA Status

codecov

providah

providah is a small, simple utility. It is an opinionated approach to creating object factories in Python without adding the additional complexity of maintaining factories.

Concept

The library is utilized as a basic global (to package) Iversion of Control (IoC) Container (Dependency Injection Container). The idea as presented is to provide an approach where all class in a package will automatically be registered. You can also override a specific registered class when you have monkey patched the class. When a new class is added it can manually be added to the registry, and this is helpful for application level classes, local extensions to a library, and so on. In even other situations you may want to add a a class when you want to retain the default version of a class, but want to support an alternative version as well.

Design

Examples

Example 1 - Library Factory

Within an __init__ .py - often at the root of a library's source code. This is ideal when you want to register all classes in the library in a single factory.

from providah.factories.package_factory import PackageFactory
PackageFactory.fill_registry()

Example 2 - Patching

When You want to monkey patch the functionality of a class.

from X import Y
from providah.factories.package_factory import PackageFactory

def new_method(params):
    print('Hello there')

Y.print = new_method()
PackageFactory.register(key=str('Y'), library=str('X'), class_def=Y)

Example 3 - Ad Hoc Registration

When you want to add a class that will later be referenced by a label - in the case you are creating more than one class with the same key, but not using library identifiers.

class Writer:
    @classmethod
    def write(cls) -> None:
        raise NotImplementedError('Base class method - must be implemented.')

class A(Writer):
    @classmethod
    def write(cls) -> None:
        print("Hello World")

import sqlite3
class B(Writer):
    __db_conn: sqlite3.connect('B.db')

    @classmethod
    def write(cls):
        cls.__write_to_db('Hello World')
    
    @classmethod
    def __write_to_db(cls, data: str) -> None:
        with cls.db_conn.cursor() as cursor:
            cursor.execute(f"INSERT INTO logs VALUES ({data})")
            cursor.commit()

from providah.factories.package_factory import PackageFactory
PackageFactory.register(key=str('A'), class_def=A, label=str('print_writer'))
PackageFactory.register(key=str('B'), class_def=A, label=str('db_writer'))

Example 4 - Using IoC Factory

from providah.factories.package_factory import PackageFactory

# Must import library - when library classes added to factory as in Example 1 (above) the 
# runtime execution of this will happen when the library is imported.
import some_package
import another_package

# To make sure we get the right version - Exceptions occur otherwise.
some_obj = PackageFactory.create('bob', library='some_package')
another_obj = PackageFactory.create('bob', library='another_package')

providah's People

Contributors

snoodleboot avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.