Abstract Factory design pattern classes for scalable data in dynamic environments.
Project description
Abstract Factories
A collection of classes to support the Abstract Factory design pattern, providing a clear abstraction layer for scalable data in dynamic environments.
- Tested on Python 3.8 - 3.12
- Functional on Python 2.7
Wait - what? Python 2.7? What year is this?
I often work professionally on legacy systems that are too fragile or large to update. Providing there's no functional or notable impact supporting 2.7, I have no reason to ignore its existence yet.
Installation
pip install abstract-factories
Usage
Initialize AbstractTypeFactory or AbstractInstanceFactory with the abstract type.
Optionally, provide the attribute/method name to identify items by name (and optionally version).
from abstract_factories import AbstractTypeFactory, AbstractInstanceFactory
class AbstractVehicle(object):
def __init__(self, make=None):
self.make = make
def start(self):
raise NotImplementedError()
class Car(AbstractVehicle):
def start(self):
print('Vrooom...')
# Type Factory
type_factory = AbstractTypeFactory(AbstractVehicle)
type_factory.register_item(Car)
assert type_factory.get('Car') is Car
# Instance Factory
honda = Car('Honda')
instance_factory = AbstractInstanceFactory(AbstractVehicle, name_key='make')
instance_factory.register_item(honda)
assert instance_factory.get('Honda') is honda
Registration:
Register viable items directly.
type_factory.register_item(AbstractSubclass)
instance_factory.register_item(AbstractSubclass())
Find and register any viable items found in the module's locals.
type_factory/instance_factory.register_module(module)
Find and register any viable items found in any nested python file from a dynamic import. Some limitation using relative imports.
type_factory/instance_factory.register_path(r'c:/tools/tool_plugins')
type_factory/instance_factory.register_path(r'c:/tools/tool_plugins/plugin.py')
Practical Applications
Content Creation
Useful for managing production needs in Film, TV, and Games, allowing easy modifications and versioning of components.
Rigging
Easily support and modify rig component behaviours during production.
import sys
from abstract_factories import AbstractTypeFactory
class AbstractRigComponent:
Name = 'AbstractRigComponent'
Version = 0
def build(self, **kwargs):
raise NotImplementedError()
class IKChainComponent(AbstractRigComponent):
Name = 'IKChainComponent'
Version = 1
def build(self, **kwargs):
pass
# --------------------------------------------------------------------------
class RigComponentBuilder:
def __init__(self):
self.factory = AbstractTypeFactory(
abstract=AbstractRigComponent,
modules=[sys.modules[__name__]],
name_key='Name',
version_key='Version'
)
def build(self, component_data):
results = []
for data in component_data:
component = self.factory.get(
data.pop('type'),
version=data.pop('version', None),
)
instance = component()
instance.build(**data)
results.append(instance)
return results
builder = RigComponentBuilder()
builder.build([
{'type': 'IKChainComponent', 'name': 'arm'},
{'type': 'IKChainComponent', 'name': 'leg', 'version': 2},
])
Testing
.tests/
directory contains examples for;
- Adding, removing & comparing items directly.
- Adding, removing & comparing items found in modules and/or paths.
Further Information
Abstract factories is influenced by https://github.com/mikemalinowski/factories.
License
This project is licensed under the MIT License.
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
Built Distribution
File details
Details for the file abstract_factories-0.2.41.tar.gz
.
File metadata
- Download URL: abstract_factories-0.2.41.tar.gz
- Upload date:
- Size: 10.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 84a03025378f96c1cad7882c460a7e785b957c8dcf927d9020bf56255db294d1 |
|
MD5 | e6e2af009fdfa843ac3204892825c1aa |
|
BLAKE2b-256 | 83a4adfefc40f960c2d389b6fedcb5c2a07b457d4b70afeb50c3358774d28322 |
File details
Details for the file abstract_factories-0.2.41-py2.py3-none-any.whl
.
File metadata
- Download URL: abstract_factories-0.2.41-py2.py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5e15279710efc6ec09a344e1d6e70e88cf48406fceba3d7baea8ff5b1c32920 |
|
MD5 | e1d55db2af65ec6eade3a8cdac8b23a8 |
|
BLAKE2b-256 | 54c7eca35591ce58d8630f570b343a85a161bb21f21e24f77000e33854f5c7ef |