Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
307 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
[[source]] | ||
url = "https://pypi.python.org/simple" | ||
verify_ssl = true | ||
|
||
[dev-packages] | ||
pytest = "*" |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# Giveme | ||
A python dependency injection framework | ||
|
||
# Quickstart | ||
|
||
```python | ||
from giveme import register, inject | ||
|
||
@register | ||
def something(): | ||
return 'I am a dependency' | ||
|
||
|
||
@inject | ||
def use_dependency(something): | ||
return something | ||
|
||
|
||
print(use_dependency()) | ||
# I am a dependency | ||
``` | ||
|
||
# Nested dependencies | ||
|
||
```python | ||
@register | ||
def something():n | ||
return 'I am a dependency' | ||
|
||
|
||
@register | ||
@inject | ||
def another_thing(something): | ||
return (something, 'So am I') | ||
|
||
|
||
@inject | ||
def use_dependency(another_thing): | ||
return another_thing | ||
|
||
|
||
print(use_dependency()) | ||
# ('I am a dependency', 'So am i') | ||
``` | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
import inspect | ||
|
||
from functools import wraps | ||
|
||
|
||
class Manager(object): | ||
|
||
def __init__(self): | ||
self._registered = {} | ||
|
||
def register(self, func): | ||
""" | ||
Register a dependency function | ||
""" | ||
self._registered[func.__name__] = func | ||
return func | ||
|
||
def remove(self, name): | ||
""" | ||
Remove a dependency by name | ||
""" | ||
del self._registered[name] | ||
|
||
def get(self, name): | ||
""" | ||
Get a dependency by name, None if not registered | ||
""" | ||
return self._registered.get(name) | ||
|
||
|
||
manager = Manager() | ||
|
||
|
||
def register(func): | ||
return manager.register(func) | ||
|
||
|
||
def inject(func): | ||
@wraps(func) | ||
def wrapper(*args, **kwargs): | ||
signature = inspect.signature(func) | ||
params = signature.parameters | ||
if not params: | ||
return func(*args, **kwargs) | ||
args = list(args) | ||
for i, param in enumerate(signature.parameters): | ||
service = manager.get(param) | ||
if not service: | ||
continue | ||
args.insert(i, service()) | ||
return func(*args, **kwargs) | ||
return wrapper |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
pytest==3.0.7 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
from venom import register, inject | ||
|
||
# Basic | ||
|
||
|
||
@register | ||
def something(): | ||
return 'I am a dependency' | ||
|
||
|
||
@inject | ||
def use_dependency(something): | ||
return something | ||
|
||
|
||
print(use_dependency()) | ||
# I am a dependency | ||
|
||
assert use_dependency() == something() | ||
|
||
|
||
# Nested | ||
|
||
@register | ||
def something(): | ||
return 'I am a dependency' | ||
|
||
|
||
@register | ||
@inject | ||
def another_thing(something): | ||
return (something, 'So am I') | ||
|
||
|
||
@inject | ||
def use_dependency(another_thing): | ||
return another_thing | ||
|
||
|
||
print(use_dependency()) | ||
# ('I am a dependency', 'So am i') | ||
|
||
assert use_dependency() == ('I am a dependency', 'So am I') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
from setuptools import setup | ||
|
||
setup( | ||
name='giveme', | ||
version='0.0.1', | ||
description='Tiny dependency injection framework', | ||
author='Steinthor Palsson', | ||
author_email='steini90@gmail.com', | ||
url='https://github.com/steinitzu/giveme', | ||
license='MIT', | ||
install_requires=[], | ||
packages=['giveme'] | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
import pytest | ||
from functools import wraps | ||
|
||
from giveme import register, inject | ||
|
||
|
||
def test_inject(): | ||
@register | ||
def something(): | ||
return 124 | ||
|
||
@inject | ||
def do_some(something): | ||
return something | ||
|
||
assert do_some() == 124 | ||
|
||
|
||
def test_with_other_params(): | ||
@register | ||
def something(): | ||
return 124 | ||
|
||
@inject | ||
def do_some(a, something, b): | ||
return a, something, b | ||
|
||
assert do_some(2, 4) == (2, 124, 4) | ||
|
||
|
||
def test_with_kwargs(): | ||
@register | ||
def something(): | ||
return 124 | ||
|
||
@inject | ||
def do_some(a, something, b, c=7): | ||
return a, something, b, c | ||
|
||
assert do_some(2, 4) == (2, 124, 4, 7) | ||
assert do_some(2, 4, c=12) == (2, 124, 4, 12) | ||
assert do_some(2, 4, 12) == (2, 124, 4, 12) | ||
|
||
|
||
def test_nested(): | ||
@register | ||
def something(): | ||
return 128 | ||
|
||
@register | ||
@inject | ||
def something_else(something): | ||
return something*2 | ||
|
||
@inject | ||
def do_some(something_else): | ||
return something_else | ||
|
||
assert do_some() == 128*2 | ||
|
||
|
||
def test_with_outside_decorator(): | ||
@register | ||
def something(): | ||
return 128 | ||
|
||
def decorator(func): | ||
@wraps(func) | ||
def wrapper(*args, **kwargs): | ||
kwargs['c'] = 'changed' | ||
return func(*args, **kwargs) | ||
return wrapper | ||
|
||
@inject | ||
@decorator | ||
def do_some(a, something, c='original'): | ||
return a, something, c | ||
|
||
@decorator | ||
@inject | ||
def do_some_flipped(a, something, c='original'): | ||
return a, something, c | ||
|
||
assert do_some(12) == (12, 128, 'changed') | ||
assert do_some_flipped(12) == (12, 128, 'changed') | ||
|
||
|
||
def test_instance_method(): | ||
@register | ||
def something(): | ||
return 128 | ||
|
||
class SomeClass(object): | ||
|
||
@inject | ||
def do_some(self, something): | ||
return something | ||
|
||
s = SomeClass() | ||
assert s.do_some() == 128 |