Metadata-Version: 2.4
Name: clean_ioc
Version: 1.20.1
Summary: An IOC Container for Python 3.10+
Project-URL: Homepage, https://peter-daly.github.io/clean_ioc/
Project-URL: Repository, https://github.com/peter-daly/clean_ioc
Project-URL: Documentation, https://peter-daly.github.io/clean_ioc/
Author: Peter Daly
License-Expression: MIT
License-File: LICENSE
Keywords: dependency,hints,injection,inversion of control,ioc,type,typing
Classifier: Development Status :: 5 - Production/Stable
Requires-Python: <4,>=3.10
Requires-Dist: the-utility-belt<0.4,>=0.3.0
Provides-Extra: fastapi
Requires-Dist: fastapi<0.102,>=0.101.0; extra == 'fastapi'
Description-Content-Type: text/markdown

# Clean IoC

A simple dependency injection library for python that requires nothing of your application code (except that you use typing).

Read the [docs](https://peter-daly.github.io/clean_ioc/) to find out more.

## Basic Registering and resolving

There are 4 basic modes of registering a new set of classes

### Implementation

```python

class UserRepository(abc.ABC):
    @abc.abstractmethod
    def add(self, user):
        pass

class InMemoryUserRepository(UserRepository):

    def __init__(self):
        self.users = []

    def add(self, user):
        # This is obviously terrible, but it's for demo purposes
        self.users.append(user)

class SqlAlchemyUserRepository(UserRepository):

    def __init__(self):
        # Do some db stuff here
        pass

    def add(self, user):
        # Do some db stuff here
        pass

container = Container()
container.register(UserRepository, InMemoryUserRepository)


repository = container.resolve(UserRepository) # This will return an InMemoryUserRepository

```

### Concrete Class

```python

class ClientDependency:
    def get_int(self):
        return 10

class Client:
    def __init__(self, dep: ClientDependency):
        self.dep = dep

    def get_number(self):
        return self.dep.get_int()


container = Container()
container.register(ClientDependency)
container.register(Client)

client = container.resolve(Client)

client.get_number() # returns 10

```

### Factory

```python

class ClientDependency:
    def get_int(self):
        return 10

class Client:
    def __init__(self, dep: ClientDependency):
        self.dep = dep

    def get_number(self):
        return self.dep.get_int()

def client_factory(dep: ClientDependency):
    return Client(dep=dep)


container = Container()
container.register(ClientDependency)
container.register(Client, factory=client_factory)

client = container.resolve(Client)

client.get_number() # returns 10

```

### Instance

```python

class ClientDependency:
    def __init__(self, num):
        self.num = num

    def get_int(self):
        return self.num

class Client:
    def __init__(self, dep: ClientDependency):
        self.dep = dep

    def get_number(self):
        return self.dep.get_int()

client_dependency = ClientDependency(num=10)

container = Container()
container.register(ClientDependency, instance=client_dependency)
container.register(Client)

client = container.resolve(Client)

client.get_number() # returns 10

```
