Skip to content

Commit

Permalink
Code dump
Browse files Browse the repository at this point in the history
  • Loading branch information
steinitzu committed May 20, 2017
1 parent 3579e30 commit c4f014a
Show file tree
Hide file tree
Showing 8 changed files with 307 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Pipfile
@@ -0,0 +1,6 @@
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[dev-packages]
pytest = "*"
45 changes: 45 additions & 0 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

47 changes: 47 additions & 0 deletions README.md
@@ -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')
```



52 changes: 52 additions & 0 deletions giveme/__init__.py
@@ -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
1 change: 1 addition & 0 deletions requirements-dev.txt
@@ -0,0 +1 @@
pytest==3.0.7
43 changes: 43 additions & 0 deletions sample.py
@@ -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')
13 changes: 13 additions & 0 deletions setup.py
@@ -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']
)
100 changes: 100 additions & 0 deletions tests.py
@@ -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

0 comments on commit c4f014a

Please sign in to comment.