Exemple #1
11
def test_assisted_building_is_supported():
    class Fetcher:
        def fetch(self, user_id):
            assert user_id == 333
            return {'name': 'John'}

    class Processor:
        @noninjectable('provider_id')
        @inject
        @noninjectable('user_id')
        def __init__(self, fetcher: Fetcher, user_id: int, provider_id: str):
            assert provider_id == 'not injected'
            data = fetcher.fetch(user_id)
            self.name = data['name']

    def configure(binder):
        binder.bind(int, to=897)
        binder.bind(str, to='injected')

    injector = Injector(configure)
    processor_builder = injector.get(AssistedBuilder[Processor])

    with pytest.raises(CallError):
        processor_builder.build()

    processor = processor_builder.build(user_id=333, provider_id='not injected')
    assert processor.name == 'John'
Exemple #2
2
def test_avoid_circular_dependency_with_method_injection():
    class Interface(object):
        pass

    class A(object):
        @inject(i=Interface)
        def __init__(self, i):
            self.i = i

    # Even though A needs B (via Interface) and B.method() needs A, they are
    # resolved at different times, avoiding circular dependencies.
    class B(object):
        @inject(a=A)
        def method(self, a):
            self.a = a

    def configure(binder):
        binder.bind(Interface, to=B)
        binder.bind(A)
        binder.bind(B)

    injector = Injector(configure)
    a = injector.get(A)
    assert (isinstance(a.i, B))
    b = injector.get(B)
    b.method()
    assert (isinstance(b.a, A))
Exemple #3
0
def test_things_dont_break_in_presence_of_args_or_kwargs():
    class A:
        @inject
        def __init__(self, s: str, *args: int, **kwargs: str):
            assert not args
            assert not kwargs

    injector = Injector()

    # The following line used to fail with something like this:
    # Traceback (most recent call last):
    #   File "/ve/injector/injector_test_py3.py", line 192,
    #     in test_things_dont_break_in_presence_of_args_or_kwargs
    #     injector.get(A)
    #   File "/ve/injector/injector.py", line 707, in get
    #     result = scope_instance.get(key, binding.provider).get(self)
    #   File "/ve/injector/injector.py", line 142, in get
    #     return injector.create_object(self._cls)
    #   File "/ve/injector/injector.py", line 744, in create_object
    #     init(instance, **additional_kwargs)
    #   File "/ve/injector/injector.py", line 1082, in inject
    #     kwargs=kwargs
    #   File "/ve/injector/injector.py", line 851, in call_with_injection
    #     **dependencies)
    #   File "/ve/injector/injector_test_py3.py", line 189, in __init__
    #     assert not kwargs
    #   AssertionError: assert not {'args': 0, 'kwargs': ''}
    injector.get(A)
Exemple #4
0
	def __init__(self, options):
		packageName=options.package

		assert packageName, "需要使用 -p 來指定要載入的編碼法(輸入法或描繪法)模組名稱"

		package = __import__(packageName, fromlist=["coding"])

		output_format=options.output_format
		quiet=options.quiet


		writer = self.computeWriter(package.codingType, quiet, output_format)

		def configure(binder):
			binder.bind(CodingConfig, to=CodingConfig(package))
			binder.bind(Package, to=package)
			binder.bind(Writer, to=writer)

		injector = Injector([configure, PackageModule()])
		structureManager = injector.get(StructureManager)

		injector = Injector([configure, PackageModule(), ManagerModule(structureManager)])
		mainManager=injector.get(MainManager)
		mainManager.compute()
		mainManager.write()
class TestBuilder(object):
    """
    """

    def setup_method(self, method):
        self.injector = Injector([SandboxModuleTest()])
        self.dispatcher = self.injector.get(Dispatcher)
        self.builder = self.injector.get(Builder)
        self._composer = self.injector.get(Composer)

        self._build = Mock()
        self.builder.build = self._build
        self.builder._composer = self._composer

    def test_build_not_sandbox_image(self):
        images = ['external1', 'sandbox/internal1']
        calls = ['internal1:master']

        options = {
            '<flavour>': 'with_external_component',
            '--force': True
        }

        self.dispatcher.build_all(options)
        for call in calls:
            self._build.assert_any_call(call)

        assert mock.call('external1') not in self._build.mock_calls
Exemple #6
0
def test_implicit_injection_fails_when_annotations_are_missing():
    class A(object):
        def __init__(self, n):
            self.n = n

    injector = Injector()
    with pytest.raises(CallError):
        injector.get(A)
Exemple #7
0
def test_call_to_method_with_legitimate_call_error_raises_type_error():
    class A(object):
        def __init__(self):
            max()

    injector = Injector()
    with pytest.raises(TypeError):
        injector.get(A)
Exemple #8
0
    def test_mutating_dict_while_iterating_it_bug(self):
        bindings = dict(('_' + str(i), str) for i in range(1000))

        @inject(**bindings)
        class X(object):
            pass

        injector = Injector()
        injector.get(X)
Exemple #9
0
def test_inject_with_missing_dependency():
    A, _ = prepare_basic_injection()

    def configure(binder):
        binder.bind(A)

    injector = Injector(configure, auto_bind=False)
    with pytest.raises(UnsatisfiedRequirement):
        injector.get(A)
Exemple #10
0
    def test_get_default_injected_instances(self):
        A, B = self.prepare()

        def configure(binder):
            binder.bind(A)
            binder.bind(B)

        injector = Injector(configure)
        assert injector.get(Injector) is injector
        assert injector.get(Binder) is injector.binder
Exemple #11
0
def test_injecting_into_method_of_object_that_is_falseish_works():
    # regression test

    class X(dict):
        @inject(s=str)
        def __init__(self, s):
            pass

    injector = Injector()
    injector.get(X)
Exemple #12
0
def test_get_default_injected_instances():
    A, B = prepare_basic_injection()

    def configure(binder):
        binder.bind(A)
        binder.bind(B)

    injector = Injector(configure)
    assert (injector.get(Injector) is injector)
    assert (injector.get(Binder) is injector.binder)
Exemple #13
0
def test_injection_fails_when_injector_cant_install_itself_into_an_object_with_slots():
    try:
        class ClassName(object):
            __slots__ = ()

        injector = Injector()
        injector.get(ClassName)
    except Exception as e:
        check_exception_contains_stuff(e, ('ClassName', '__slots__'))
    else:
        assert False, 'Should have raised an exception and it didn\'t'
Exemple #14
0
    def test_transitive_injection_with_missing_dependency(self):
        A, B, _ = self.prepare()

        def configure(binder):
            binder.bind(A)
            binder.bind(B)

        injector = Injector(configure, auto_bind=False)
        with pytest.raises(UnsatisfiedRequirement):
            injector.get(A)
        with pytest.raises(UnsatisfiedRequirement):
            injector.get(B)
Exemple #15
0
def test_using_an_assisted_builder_with_a_provider_raises_an_injector_error():
    class A:
        pass

    class MyModule(Module):
        @provider
        def provide_a(self, builder: AssistedBuilder[A]) -> A:
            return builder.build()

    injector = Injector(MyModule)

    with pytest.raises(Error):
        injector.get(A)
Exemple #16
0
def test_bind_using_key():
    Name = Key('name')
    Age = Key('age')

    class MyModule(Module):
        @provides(Name)
        def provides_name(self):
            return 'Bob'

        def configure(self, binder):
            binder.bind(Age, to=25)

    injector = Injector(MyModule())
    assert (injector.get(Age) == 25)
    assert (injector.get(Name) == 'Bob')
Exemple #17
0
def test_bind_using_key():
    Name = Key("name")
    Age = Key("age")

    class MyModule(Module):
        @provides(Name)
        def provides_name(self):
            return "Bob"

        def configure(self, binder):
            binder.bind(Age, to=25)

    injector = Injector(MyModule())
    assert injector.get(Age) == 25
    assert injector.get(Name) == "Bob"
Exemple #18
0
def test_injecting_undecorated_class_with_missing_dependencies_raises_the_right_error():
    class ClassA(object):
        def __init__(self, parameter):
            pass

    class ClassB(object):
        @inject(a=ClassA)
        def __init__(self, a):
            pass

    injector = Injector()
    try:
        injector.get(ClassB)
    except CallError as ce:
        check_exception_contains_stuff(ce, ('ClassA.__init__', 'ClassB'))
Exemple #19
0
def test_call_to_method_containing_noninjectable_and_unsatisfied_dependencies_raises_the_right_error():
    class A(object):
        @inject(something=str)
        def fun(self, something, something_different):
            pass

    injector = Injector()
    a = injector.get(A)
    try:
        a.fun()
    except CallError as ce:
        assert (ce.args[0] == a)

        # We cannot really check for function identity here... Error is raised after calling
        # original function but from outside we have access to function already decorated
        function = A.fun

        # Python 3 compatibility
        try:
            function = function.__func__
        except AttributeError:
            pass
        assert (ce.args[1].__name__ == function.__name__)

        assert (ce.args[2] == ())
        assert (ce.args[3] == {'something': str()})
Exemple #20
0
def test_auto_bind():

    class A(object):
        pass

    injector = Injector()
    assert (isinstance(injector.get(A), A))
Exemple #21
0
def test_threadlocal():
    @threadlocal
    class A(object):
        def __init__(self):
            pass

    def configure(binder):
        binder.bind(A)

    injector = Injector(configure)
    a1 = injector.get(A)
    a2 = injector.get(A)

    assert (a1 is a2)

    a3 = [None]
    ready = threading.Event()

    def inject_a3():
        a3[0] = injector.get(A)
        ready.set()

    threading.Thread(target=inject_a3).start()
    ready.wait(1.0)

    assert (a2 is not a3[0] and a3[0] is not None)
Exemple #22
0
def test_dependency_cycle_can_be_worked_broken_by_assisted_building():
    class Interface:
        pass

    class A:
        @inject
        def __init__(self, i: Interface):
            self.i = i

    class B:
        @inject
        def __init__(self, a_builder: AssistedBuilder[A]):
            self.a = a_builder.build(i=self)

    def configure(binder):
        binder.bind(Interface, to=B)
        binder.bind(A)

    injector = Injector(configure)

    # Previously it'd detect a circular dependency here:
    # 1. Constructing A requires Interface (bound to B)
    # 2. Constructing B requires assisted build of A
    # 3. Constructing A triggers circular dependency check
    assert isinstance(injector.get(A), A)
Exemple #23
0
def test_bind_interface_of_list_of_types():
    def configure(binder):
        binder.multibind([int], to=[1, 2, 3])
        binder.multibind([int], to=[4, 5, 6])

    injector = Injector(configure)
    assert injector.get([int]) == [1, 2, 3, 4, 5, 6]
	def parse(self,response):
		if self.crawling=="Streaming":
			sys.path.insert(0,"/media/shrinivaasanka/0fc4d8a2-1c74-42b8-8099-9ef78d8c8ea2/home/kashrinivaasan/KrishnaiResearch_OpenSource/GitHub/asfer-github-code/python-src/backend")
			import Abstract_DBBackend
			import MySQL_DBBackend
			import MySQL_Configuration
			import MongoDB_DBBackend
			import MongoDB_Configuration
			from pymongo.collection import Collection
			mysqldbobj=MySQL_DBBackend.MySQL_DBBackend()
			mysqlconfigobj=MySQL_Configuration.MySQL_Configuration()
			injector=Injector([mysqldbobj,mysqlconfigobj])
			handler=injector.get(Abstract_DBBackend.Abstract_DBBackend)
			#handler.execute_query("CREATE TABLE asfer_webspider(Description varchar(100))")
			select = Selector(response)
			links_list = select.xpath('//h3/a/@href').extract()
			links_list2 = [re.search('q=(.*)&sa',n).group(1) for n in links_list]
			desc_list=select.xpath('//h3/a/text()').extract()
			items=[]
			for desc in desc_list:
				item=WebSpiderItem()
				item['desc'] = desc
				items.append(item)
				self.output.write(desc)
				self.output.write("\n")
				handler.execute_query("INSERT INTO asfer_webspider(Description) VALUES(\""+desc+"\")","MySQL")
			handler.execute_query("SELECT * FROM asfer_webspider","MySQL")
			return items
		if self.crawling=="HTML":
			bsoup=BeautifulSoup(response.body)
			for script in bsoup(["script","style"]):
				script.extract()
			self.output.write(bsoup.get_text().encode("utf-8"))
Exemple #25
0
def db(request):
    self = request.instance

    injector = Injector([DatabaseModule, TestingModule()])
    engine = injector.get(DatabaseEngine)
    session = injector.get(DatabaseSession)

    self.session = session

    @request.addfinalizer
    def finalize_session():
        session.remove()
        Model.metadata.drop_all(bind=engine)
        engine.dispose()

    return session
Exemple #26
0
def main():
    app = Flask(__name__)
    app.config.update(
        DB_CONNECTION_STRING=':memory:',
        CACHE_TYPE='simple',
        SQLALCHEMY_DATABASE_URI='sqlite://',
    )
    app.debug = True

    injector = Injector([AppModule(app)])
    configure_views(app=app, cached=injector.get(Cache).cached)

    FlaskInjector(app=app, injector=injector)

    client = app.test_client()

    response = client.get('/')
    print('%s\n%s%s' % (response.status, response.headers, response.data))
    response = client.post('/', data={'key': 'foo', 'value': 'bar'})
    print('%s\n%s%s' % (response.status, response.headers, response.data))
    response = client.get('/')
    print('%s\n%s%s' % (response.status, response.headers, response.data))
    response = client.get('/hello')
    print('%s\n%s%s' % (response.status, response.headers, response.data))
    response = client.delete('/hello')
    print('%s\n%s%s' % (response.status, response.headers, response.data))
    response = client.get('/')
    print('%s\n%s%s' % (response.status, response.headers, response.data))
    response = client.get('/hello')
    print('%s\n%s%s' % (response.status, response.headers, response.data))
    response = client.delete('/hello')
    print('%s\n%s%s' % (response.status, response.headers, response.data))
Exemple #27
0
def test_annotation_based_injection_works_in_provider_methods():
    class MyModule(Module):
        def configure(self, binder):
            binder.bind(int, to=42)

        @provider
        def provide_str(self, i: int) -> str:
            return str(i)

        @singleton
        @provider
        def provide_object(self) -> object:
            return object()

    injector = Injector(MyModule)
    assert injector.get(str) == '42'
    assert injector.get(object) is injector.get(object)
Exemple #28
0
def test_providerof_is_safe_to_use_with_multiple_injectors():
    def configure1(binder):
        binder.bind(int, to=1)

    def configure2(binder):
        binder.bind(int, to=2)

    injector1 = Injector(configure1)
    injector2 = Injector(configure2)

    provider_of = ProviderOf[int]

    provider1 = injector1.get(provider_of)
    provider2 = injector2.get(provider_of)

    assert provider1.get() == 1
    assert provider2.get() == 2
Exemple #29
0
def test_newtype_integration_works():
    UserID = NewType('UserID', int)

    def configure(binder):
        binder.bind(UserID, to=123)

    injector = Injector([configure])
    assert injector.get(UserID) == 123
Exemple #30
0
def test_assisted_builder_works_when_injected():
    class X(object):
        @inject(builder=AssistedBuilder(NeedsAssistance))
        def __init__(self, builder):
            self.obj = builder.build(b=234)

    injector = Injector()
    x = injector.get(X)
    assert ((x.obj.a, x.obj.b) == (str(), 234))
Exemple #31
0
        return BussinessLogic(api=api)

    @singleton
    @provider
    def provide_api(self) -> Api:
        return Api()


class TestApi(Api):
    def fetch_remote_data(self):
        print('demo api called')
        return 24


class TestAppModule(Module):
    @singleton
    @provider
    def provide_app(self) -> Api:
        return TestApi()


if __name__ == '__main__':
    real_injector = Injector(AppModule())
    test_injector = Injector([AppModule(), TestAppModule()])

    real_logic = real_injector.get(BussinessLogic)
    real_logic.do_stuff()

    test_logic = test_injector.get(BussinessLogic)
    test_logic.do_stuff()
Exemple #32
0
 def setUp(self):
     injector = Injector([DefaultModule])
     self.asset_service = injector.get(AssetService)
     self.service = injector.get(EstimatesService)
Exemple #33
0
def test_assisted_builder_works_when_got_directly_from_injector():
    injector = Injector()
    builder = injector.get(AssistedBuilder[NeedsAssistance])
    obj = builder.build(b=123)
    assert (obj.a, obj.b) == (str(), 123)
    def setUpClass(cls):
        inj = Injector([
            DefaultCollaborativeTrainerModule,
            LoggingModule,
            PerceptronModule,
            StakeableImModule,
        ])
        cls.balances = inj.get(Balances)
        cls.decai = inj.get(CollaborativeTrainer)
        cls.time_method = inj.get(TimeMock)

        cls.good_address = 'sender'
        initial_balance = 1E6
        cls.balances.initialize(cls.good_address, initial_balance)
        msg = Msg(cls.good_address, cls.balances[cls.good_address])

        X = np.array([
            # Initialization Data
            [0, 0, 0],
            [1, 1, 1],

            # Data to Add
            [0, 0, 1],
            [0, 1, 0],
            [0, 1, 1],
            [1, 0, 0],
            [1, 0, 1],
            [1, 1, 0],
        ])
        y = np.array([_ground_truth(x) for x in X])
        cls.decai.model.init_model(np.array([X[0, :], X[1, :]]),
                                   np.array([y[0], y[1]]))
        score = cls.decai.model.evaluate(X, y)
        assert score != 1, "Model shouldn't fit the data yet."

        # Add all data.
        first_added_time = None
        for i in range(X.shape[0]):
            x = X[i]
            cls.time_method.set_time(cls.time_method() + 1)
            if first_added_time is None:
                first_added_time = cls.time_method()
            cls.decai.add_data(msg, x, y[i])

        for _ in range(1000):
            score = cls.decai.model.evaluate(X, y)
            if score >= 1:
                break
            i = random.randint(0, X.shape[0] - 1)
            x = X[i]
            cls.time_method.set_time(cls.time_method() + 1)
            cls.decai.add_data(msg, x, y[i])
        assert score == 1, "Model didn't fit the data."

        bal = cls.balances[msg.sender]
        assert bal < initial_balance, "Adding data should have a cost."

        # Make sure sender has some good data refunded so that they can report data later.
        cls.time_method.set_time(cls.time_method() +
                                 cls.decai.im.refund_time_s + 1)
        cls.decai.refund(msg, X[0], y[0], first_added_time)
        assert cls.balances[msg.sender] > bal, "Refunding should return value."
async def test_version_upgrades(time: Time, injector: Injector,
                                config: Config) -> None:
    # Simluate upgrading from an un-tracked version
    assert not os.path.exists(config.get(Setting.DATA_CACHE_FILE_PATH))
    cache = injector.get(DataCache)
    upgrade_time = time.now()
    assert cache.previousVersion == Version.default()
    assert cache.currentVersion == Version.parse(VERSION)
    assert cache.checkFlag(UpgradeFlags.DONT_IGNORE_LEGACY_SNAPSHOTS)

    assert os.path.exists(config.get(Setting.DATA_CACHE_FILE_PATH))
    with open(config.get(Setting.DATA_CACHE_FILE_PATH)) as f:
        data = json.load(f)
        assert data["upgrades"] == [{
            "prev_version": str(Version.default()),
            "new_version": VERSION,
            "date": upgrade_time.isoformat()
        }]

    # Reload the data cache, verify there is no upgrade.
    time.advance(days=1)
    cache = DataCache(config, time)
    assert cache.previousVersion == Version.parse(VERSION)
    assert cache.currentVersion == Version.parse(VERSION)
    assert not cache.checkFlag(UpgradeFlags.DONT_IGNORE_LEGACY_SNAPSHOTS)
    assert os.path.exists(config.get(Setting.DATA_CACHE_FILE_PATH))

    with open(config.get(Setting.DATA_CACHE_FILE_PATH)) as f:
        data = json.load(f)
        assert data["upgrades"] == [{
            "prev_version": str(Version.default()),
            "new_version": VERSION,
            "date": upgrade_time.isoformat()
        }]

    # simulate upgrading to a new version, verify an upgrade gets identified.
    upgrade_version = Version.parse("200")

    class UpgradeCache(DataCache):
        def __init__(self):
            super().__init__(config, time)

        @property
        def currentVersion(self):
            return upgrade_version

    cache = UpgradeCache()
    assert cache.previousVersion == Version.parse(VERSION)
    assert cache.currentVersion == upgrade_version
    assert os.path.exists(config.get(Setting.DATA_CACHE_FILE_PATH))

    with open(config.get(Setting.DATA_CACHE_FILE_PATH)) as f:
        data = json.load(f)
        assert data["upgrades"] == [{
            "prev_version": str(Version.default()),
            "new_version": VERSION,
            "date": upgrade_time.isoformat()
        }, {
            "prev_version": VERSION,
            "new_version": str(upgrade_version),
            "date": time.now().isoformat()
        }]

    next_upgrade_time = time.now()
    time.advance(days=1)
    # Verify version upgrade time queries work as expected
    assert cache.getUpgradeTime(Version.parse(VERSION)) == upgrade_time
    assert cache.getUpgradeTime(Version.default()) == upgrade_time
    assert cache.getUpgradeTime(upgrade_version) == next_upgrade_time

    # degenerate case, should never happen but a sensible value needs to be returned
    assert cache.getUpgradeTime(Version.parse("201")) == time.now()
def test_custom_scope() -> None:
    @dataclass
    class Project:
        name: str
        special: bool

    class ProjectScope(Scope):
        def __init__(self, *args, **kwargs):
            super(ProjectScope, self).__init__(*args, **kwargs)
            self.context = None

        @contextmanager
        def __call__(self, project: Project):
            if self.context is not None:
                raise Exception('context is not None')
            self.context = {}
            binder = self.injector.get(Binder)
            binder.bind(Project, to=project, scope=ProjectScope)
            yield
            self.context = None

        def get(self, key, provider):
            if self.context is None:
                raise UnsatisfiedRequirement(None, key)

            try:
                return self.context[key]
            except KeyError:
                provider = InstanceProvider(provider.get(self.injector))
                self.context[key] = provider
                return provider

    class Handler(ABC):
        pass

    class OrdinaryHandler(Handler):
        def __init__(self, project: Project):
            self.project = project

    class SpecialHandler(Handler):
        def __init__(self, project: Project):
            self.project = project

    class SomeSingletonService:
        pass

    project_scope = ScopeDecorator(ProjectScope)

    class ProjectScopedHandlerModule(Module):
        @project_scope
        @provider
        def handler(self, project: Project) -> Handler:
            if project.special:
                return SpecialHandler(project)
            else:
                return OrdinaryHandler(project)

        @singleton
        @provider
        def some_singleton_service(self,
                                   handler: Handler) -> SomeSingletonService:
            return SomeSingletonService()

    injector = Injector([ProjectScopedHandlerModule()], auto_bind=False)

    scope = injector.get(ProjectScope)

    with scope(Project(name='proj1', special=False)):
        handler = injector.get(Handler)
    assert isinstance(handler, OrdinaryHandler)
    assert handler.project.name == 'proj1'

    with scope(Project(name='proj2', special=True)):
        handler = injector.get(Handler)
    assert isinstance(handler, SpecialHandler)
    assert handler.project.name == 'proj2'

    with scope(Project(name='proj3', special=True)):

        @inject
        def f(handler: Handler) -> str:
            return handler.project.name

        assert injector.call_with_injection(f) == 'proj3'

    with pytest.raises(UnsatisfiedRequirement):
        injector.get(SomeSingletonService)

    with scope(Project(name='proj4', special=True)):
        some_singleton_service = injector.get(SomeSingletonService)
    assert injector.get(SomeSingletonService) == some_singleton_service  # !!!
def test_dummy() -> None:
    injector = Injector(
        [AppModule(greeting_prefix='Hi, ', greeting_suffix='!!!')])
    message_generator: MessageGenerator = injector.get(MessageGenerator)
    assert message_generator.make_message(
        'Andrey') == 'Hi, Andrey!!! How are you?'
 def provide_valid_tasks(self, injector: Injector) -> TasksValid:
     return [  # type: ignore
         injector.get(self._get_valid_class(t)) for t in self.config.task.valid  # type: ignore
     ]
 def provide_train_tasks(self, injector: Injector) -> TasksTrain:
     return [
         WeightedTask(injector.get(self._get_train_class(t)), w)  # type: ignore
         for t, w in zip(self.config.task.train, self.config.task.weights)
     ]
Exemple #40
0
async def test_bootstarp_requirements():
    # This just verifies we're able to satisfy starter's injector requirements.
    injector = Injector([BaseModule(Config()), MainModule()])
    injector.get(Starter)
Exemple #41
0
def test_auto_bind():
    class A:
        pass

    injector = Injector()
    assert isinstance(injector.get(A), A)
Exemple #42
0
 def __init__(self, ctx: Injector):
     self.store = ctx.get(ContactStore)