This repository has been archived by the owner on Feb 21, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
README.rst.in
128 lines (61 loc) · 2.84 KB
/
README.rst.in
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
=========================================
``jeni`` injects annotated dependencies
=========================================
**jeni** lets developers build applications and not e.g. web applications.
Overview
========
1. Configure each dependency in the project (requirements.txt, config, ...).
2. Write code with natural call signatures taking those dependencies as input.
3. Implement a **Provider** for each dependency, register with an **Injector**.
jeni runs on Python 2.7, Python 3.3 through 3.5, and pypy.
Motivation
==========
Write code as its meant to be written, without pegging function call signatures
to some monolithic object that only applies to a specific runtime. This is
about more than just testing. This is about composition.
jeni's design principle is to have all annotated callables usable in a context
that knows nothing about jeni. Any callable is as relevant to a fresh Python
REPL as it is to an injector.
Annotations
===========
Annotations are implemented as decorators for Python2. In Python 3, either
decorators or function annotations can be used for injection.
Core API
========
.. exec:: from jeni import Annotator, annotate
.. eval:: insert_doc(Annotator.__call__, name='annotate')
.. exec:: from jeni import Provider
.. eval:: insert_doc(Provider)
.. exec:: opt = {'ns': 'Provider', 'u': '-'}
.. eval:: insert_args_doc(Provider.get, **opt)
.. eval:: insert_args_doc(Provider.close, **opt)
.. exec:: from jeni import Injector
.. eval:: insert_doc(Injector)
.. exec:: opt = {'ns': 'Injector', 'u': '-'}
.. eval:: insert_args_doc(Injector.__init__, **opt)
.. eval:: insert_args_doc(Injector.sub, **opt)
.. eval:: insert_args_doc(Injector.provider, **opt)
.. eval:: insert_args_doc(Injector.factory, **opt)
.. eval:: insert_args_doc(Injector.value, **opt)
.. eval:: insert_args_doc(Injector.apply, **opt)
.. eval:: insert_args_doc(Injector.partial, **opt)
.. eval:: insert_args_doc(Injector.eager_partial, **opt)
.. eval:: insert_args_doc(Injector.apply_regardless, **opt)
.. eval:: insert_args_doc(Injector.partial_regardless, **opt)
.. eval:: insert_args_doc(Injector.eager_partial_regardless, **opt)
.. eval:: insert_args_doc(Injector.get, **opt)
.. eval:: insert_args_doc(Injector.close, **opt)
.. eval:: insert_args_doc(Injector.enter, **opt)
.. eval:: insert_args_doc(Injector.exit, **opt)
Additional API
==============
.. eval:: insert_doc(Annotator.wraps, name='annotate.wraps')
.. eval:: insert_doc(Annotator.maybe, name='annotate.maybe')
.. eval:: insert_doc(Annotator.partial, name='annotate.partial')
.. eval:: insert_doc(Annotator.eager_partial, name='annotate.eager_partial')
.. exec:: from jeni import InjectorProxy
.. eval:: insert_doc(InjectorProxy)
License
=======
Copyright 2013-2015 Ron DuPlain <[email protected]> (see AUTHORS file).
Released under the BSD License (see LICENSE file).