tiferet 1.0.0a19__py3-none-any.whl → 1.0.0b0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tiferet/__init__.py +3 -2
- tiferet/commands/__init__.py +6 -0
- tiferet/commands/app.py +102 -0
- tiferet/commands/core.py +124 -0
- tiferet/commands/dependencies.py +76 -0
- tiferet/commands/settings.py +101 -0
- tiferet/configs/__init__.py +3 -67
- tiferet/configs/error.py +48 -0
- tiferet/configs/settings.py +37 -0
- tiferet/contexts/__init__.py +0 -8
- tiferet/contexts/app.py +215 -182
- tiferet/contexts/cache.py +76 -0
- tiferet/contexts/container.py +92 -190
- tiferet/contexts/error.py +78 -80
- tiferet/contexts/feature.py +120 -83
- tiferet/contracts/__init__.py +4 -0
- tiferet/contracts/app.py +92 -0
- tiferet/contracts/cache.py +70 -0
- tiferet/contracts/container.py +147 -0
- tiferet/contracts/error.py +177 -0
- tiferet/contracts/feature.py +159 -0
- tiferet/contracts/settings.py +34 -0
- tiferet/data/__init__.py +3 -4
- tiferet/data/app.py +71 -208
- tiferet/data/container.py +52 -38
- tiferet/data/error.py +15 -24
- tiferet/data/feature.py +27 -8
- tiferet/{domain/core.py → data/settings.py} +36 -96
- tiferet/handlers/__init__.py +0 -0
- tiferet/handlers/container.py +116 -0
- tiferet/handlers/error.py +49 -0
- tiferet/handlers/feature.py +94 -0
- tiferet/models/__init__.py +4 -0
- tiferet/models/app.py +150 -0
- tiferet/models/container.py +135 -0
- tiferet/{domain → models}/error.py +86 -36
- tiferet/{domain → models}/feature.py +107 -47
- tiferet/models/settings.py +148 -0
- tiferet/proxies/__init__.py +0 -0
- tiferet/proxies/yaml/__init__.py +0 -0
- tiferet/{repos → proxies/yaml}/app.py +13 -41
- tiferet/{repos → proxies/yaml}/container.py +26 -56
- tiferet/{repos → proxies/yaml}/error.py +11 -70
- tiferet/proxies/yaml/feature.py +92 -0
- {tiferet-1.0.0a19.dist-info → tiferet-1.0.0b0.dist-info}/METADATA +12 -3
- tiferet-1.0.0b0.dist-info/RECORD +51 -0
- {tiferet-1.0.0a19.dist-info → tiferet-1.0.0b0.dist-info}/WHEEL +1 -1
- tiferet/commands/container.py +0 -54
- tiferet/commands/error.py +0 -21
- tiferet/commands/feature.py +0 -90
- tiferet/contexts/request.py +0 -110
- tiferet/domain/__init__.py +0 -5
- tiferet/domain/app.py +0 -131
- tiferet/domain/container.py +0 -141
- tiferet/repos/__init__.py +0 -7
- tiferet/repos/feature.py +0 -151
- tiferet-1.0.0a19.dist-info/RECORD +0 -35
- {tiferet-1.0.0a19.dist-info → tiferet-1.0.0b0.dist-info/licenses}/LICENSE +0 -0
- {tiferet-1.0.0a19.dist-info → tiferet-1.0.0b0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,148 @@
|
|
1
|
+
# *** imports
|
2
|
+
|
3
|
+
# ** infra
|
4
|
+
from schematics import Model, types as t
|
5
|
+
|
6
|
+
|
7
|
+
# *** classes
|
8
|
+
|
9
|
+
# ** class: string_type
|
10
|
+
class StringType(t.StringType):
|
11
|
+
'''
|
12
|
+
A string type.
|
13
|
+
'''
|
14
|
+
|
15
|
+
pass
|
16
|
+
|
17
|
+
|
18
|
+
# ** class: integer_type
|
19
|
+
class IntegerType(t.IntType):
|
20
|
+
'''
|
21
|
+
An integer type.
|
22
|
+
'''
|
23
|
+
|
24
|
+
pass
|
25
|
+
|
26
|
+
|
27
|
+
# ** class: float_type
|
28
|
+
class FloatType(t.FloatType):
|
29
|
+
'''
|
30
|
+
A float type.
|
31
|
+
'''
|
32
|
+
|
33
|
+
pass
|
34
|
+
|
35
|
+
|
36
|
+
# ** class: boolean_type
|
37
|
+
class BooleanType(t.BooleanType):
|
38
|
+
'''
|
39
|
+
A boolean type.
|
40
|
+
'''
|
41
|
+
|
42
|
+
pass
|
43
|
+
|
44
|
+
|
45
|
+
# ** class: list_type
|
46
|
+
class ListType(t.ListType):
|
47
|
+
'''
|
48
|
+
A list type.
|
49
|
+
'''
|
50
|
+
|
51
|
+
pass
|
52
|
+
|
53
|
+
|
54
|
+
# ** class: dict_type
|
55
|
+
class DictType(t.DictType):
|
56
|
+
'''
|
57
|
+
A dictionary type.
|
58
|
+
'''
|
59
|
+
|
60
|
+
pass
|
61
|
+
|
62
|
+
|
63
|
+
# ** class: model_type
|
64
|
+
class ModelType(t.ModelType):
|
65
|
+
'''
|
66
|
+
A model type.
|
67
|
+
'''
|
68
|
+
|
69
|
+
pass
|
70
|
+
|
71
|
+
|
72
|
+
# ** class: model_object
|
73
|
+
class ModelObject(Model):
|
74
|
+
'''
|
75
|
+
A domain model object.
|
76
|
+
'''
|
77
|
+
|
78
|
+
# ** attribute: name
|
79
|
+
name = StringType(
|
80
|
+
metadata=dict(
|
81
|
+
description='The name of the object.'
|
82
|
+
)
|
83
|
+
)
|
84
|
+
|
85
|
+
# ** attribute: description
|
86
|
+
description = StringType(
|
87
|
+
metadata=dict(
|
88
|
+
description='The description of the object.'
|
89
|
+
)
|
90
|
+
)
|
91
|
+
|
92
|
+
# * method: new
|
93
|
+
@staticmethod
|
94
|
+
def new(
|
95
|
+
model_type: type,
|
96
|
+
validate: bool = True,
|
97
|
+
strict: bool = True,
|
98
|
+
**kwargs
|
99
|
+
) -> 'ModelObject':
|
100
|
+
'''
|
101
|
+
Initializes a new model object.
|
102
|
+
|
103
|
+
:param model_type: The type of model object to create.
|
104
|
+
:type model_type: type
|
105
|
+
:param validate: True to validate the model object.
|
106
|
+
:type validate: bool
|
107
|
+
:param strict: True to enforce strict mode for the model object.
|
108
|
+
:type strict: bool
|
109
|
+
:param kwargs: Keyword arguments.
|
110
|
+
:type kwargs: dict
|
111
|
+
:return: A new model object.
|
112
|
+
:rclass: ModelObject
|
113
|
+
'''
|
114
|
+
|
115
|
+
# Create a new model object.
|
116
|
+
_object: ModelObject = model_type(dict(
|
117
|
+
**kwargs
|
118
|
+
), strict=strict)
|
119
|
+
|
120
|
+
# Validate if specified.
|
121
|
+
if validate:
|
122
|
+
_object.validate()
|
123
|
+
|
124
|
+
# Return the new model object.
|
125
|
+
return _object
|
126
|
+
|
127
|
+
|
128
|
+
# ** model: value_object
|
129
|
+
class ValueObject(ModelObject):
|
130
|
+
'''
|
131
|
+
A domain model value object.
|
132
|
+
'''
|
133
|
+
pass
|
134
|
+
|
135
|
+
|
136
|
+
# ** class: entity
|
137
|
+
class Entity(ModelObject):
|
138
|
+
'''
|
139
|
+
A domain model entity.
|
140
|
+
'''
|
141
|
+
|
142
|
+
# ** attribute: id
|
143
|
+
id = StringType(
|
144
|
+
required=True,
|
145
|
+
metadata=dict(
|
146
|
+
description='The entity unique identifier.'
|
147
|
+
)
|
148
|
+
)
|
File without changes
|
File without changes
|
@@ -1,45 +1,13 @@
|
|
1
1
|
# *** imports
|
2
2
|
|
3
3
|
# ** app
|
4
|
-
from
|
5
|
-
from
|
6
|
-
from
|
4
|
+
from ...data import DataObject
|
5
|
+
from ...data.app import AppInterfaceYamlData
|
6
|
+
from ...contracts.app import AppRepository, AppInterface
|
7
|
+
from ...clients import yaml_client
|
7
8
|
|
8
9
|
|
9
|
-
# ***
|
10
|
-
|
11
|
-
# ** interface: app_repository
|
12
|
-
class AppRepository(object):
|
13
|
-
'''
|
14
|
-
An app repository is a class that is used to get an app interface.
|
15
|
-
'''
|
16
|
-
|
17
|
-
# * method: list_interfaces
|
18
|
-
def list_interfaces(self) -> list[AppInterface]:
|
19
|
-
'''
|
20
|
-
List all app interfaces.
|
21
|
-
|
22
|
-
:return: The list of app interfaces.
|
23
|
-
:rtype: list[AppInterface]
|
24
|
-
'''
|
25
|
-
|
26
|
-
# Not implemented.
|
27
|
-
raise NotImplementedError()
|
28
|
-
|
29
|
-
# * method: get_interface
|
30
|
-
def get_interface(self, id: str) -> AppInterface:
|
31
|
-
'''
|
32
|
-
Get the app interface.
|
33
|
-
|
34
|
-
:param id: The app interface id.
|
35
|
-
:type id: str
|
36
|
-
:return: The app interface.
|
37
|
-
:rtype: AppInterface
|
38
|
-
'''
|
39
|
-
|
40
|
-
# Not implemented.
|
41
|
-
raise NotImplementedError()
|
42
|
-
|
10
|
+
# *** proxies
|
43
11
|
|
44
12
|
# ** proxy: app_yaml_proxy
|
45
13
|
class AppYamlProxy(AppRepository):
|
@@ -65,14 +33,15 @@ class AppYamlProxy(AppRepository):
|
|
65
33
|
List all app interfaces.
|
66
34
|
|
67
35
|
:return: The list of app interfaces.
|
68
|
-
:rtype:
|
36
|
+
:rtype: List[AppInterface]
|
69
37
|
'''
|
70
38
|
|
71
39
|
# Load the app interface data from the yaml configuration file and map it to the app interface object.
|
72
40
|
interfaces = yaml_client.load(
|
73
41
|
self.config_file,
|
74
42
|
create_data=lambda data: [
|
75
|
-
|
43
|
+
DataObject.from_data(
|
44
|
+
AppInterfaceYamlData,
|
76
45
|
id=interface_id,
|
77
46
|
**record
|
78
47
|
).map() for interface_id, record in data.items()],
|
@@ -95,8 +64,11 @@ class AppYamlProxy(AppRepository):
|
|
95
64
|
# Load the app interface data from the yaml configuration file.
|
96
65
|
_data: AppInterface = yaml_client.load(
|
97
66
|
self.config_file,
|
98
|
-
create_data=lambda data:
|
99
|
-
|
67
|
+
create_data=lambda data: DataObject.from_data(
|
68
|
+
AppInterfaceYamlData,
|
69
|
+
id=id,
|
70
|
+
**data
|
71
|
+
),
|
100
72
|
start_node=lambda data: data.get('interfaces').get(id))
|
101
73
|
|
102
74
|
# Return the app interface object.
|
@@ -4,56 +4,15 @@
|
|
4
4
|
from typing import List, Dict, Tuple
|
5
5
|
|
6
6
|
# ** app
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
7
|
+
from ...data.container import ContainerAttributeYamlData
|
8
|
+
from ...contracts.container import ContainerRepository, ContainerAttribute
|
9
|
+
from ...clients import yaml as yaml_client
|
10
10
|
|
11
11
|
|
12
|
-
# ***
|
12
|
+
# *** proxies
|
13
13
|
|
14
|
-
#
|
15
|
-
class ContainerRepository
|
16
|
-
'''
|
17
|
-
Container repository interface.
|
18
|
-
'''
|
19
|
-
|
20
|
-
# * field: role
|
21
|
-
read_role: str = None
|
22
|
-
|
23
|
-
# * field: write_role
|
24
|
-
write_role: str = None
|
25
|
-
|
26
|
-
# * method: get_attribute
|
27
|
-
def get_attribute(self, attribute_id: str, type: str) -> ContainerAttribute:
|
28
|
-
'''
|
29
|
-
Get the container attribute.
|
30
|
-
|
31
|
-
:param attribute_id: The attribute id.
|
32
|
-
:type attribute_id: str
|
33
|
-
:param type: The container attribute type.
|
34
|
-
:type type: str
|
35
|
-
:return: The container attribute.
|
36
|
-
:rtype: ContainerAttribute
|
37
|
-
'''
|
38
|
-
|
39
|
-
# Not implemented.
|
40
|
-
raise NotImplementedError()
|
41
|
-
|
42
|
-
# * method: list_all
|
43
|
-
def list_all(self) -> Tuple[List[ContainerAttribute], List[str]]:
|
44
|
-
'''
|
45
|
-
List all the container attributes and constants.
|
46
|
-
|
47
|
-
:return: The list of container attributes and constants.
|
48
|
-
:rtype: List[ContainerAttribute]
|
49
|
-
'''
|
50
|
-
|
51
|
-
# Not implemented.
|
52
|
-
raise NotImplementedError()
|
53
|
-
|
54
|
-
|
55
|
-
# ** proxy: yaml_proxy
|
56
|
-
class YamlProxy(ContainerRepository):
|
14
|
+
# ** proxy: container_yaml_proxy
|
15
|
+
class ContainerYamlProxy(ContainerRepository):
|
57
16
|
'''
|
58
17
|
Yaml proxy for container attributes.
|
59
18
|
'''
|
@@ -71,14 +30,12 @@ class YamlProxy(ContainerRepository):
|
|
71
30
|
self.config_file = container_config_file
|
72
31
|
|
73
32
|
# * method: get_attribute
|
74
|
-
def get_attribute(self, attribute_id: str
|
33
|
+
def get_attribute(self, attribute_id: str) -> ContainerAttribute:
|
75
34
|
'''
|
76
35
|
Get the attribute from the yaml file.
|
77
36
|
|
78
37
|
:param attribute_id: The attribute id.
|
79
38
|
:type attribute_id: str
|
80
|
-
:param type: The attribute type.
|
81
|
-
:type type: str
|
82
39
|
:return: The container attribute.
|
83
40
|
:rtype: ContainerAttribute
|
84
41
|
'''
|
@@ -92,7 +49,8 @@ class YamlProxy(ContainerRepository):
|
|
92
49
|
)
|
93
50
|
|
94
51
|
# If the data is None or the type does not match, return None.
|
95
|
-
|
52
|
+
# Remove the type logic later, as the type parameter will be removed in v2 (obsolete).
|
53
|
+
if data is None:
|
96
54
|
return None
|
97
55
|
|
98
56
|
# Return the attribute.
|
@@ -104,16 +62,28 @@ class YamlProxy(ContainerRepository):
|
|
104
62
|
List all the container attributes and constants.
|
105
63
|
|
106
64
|
:return: The list of container attributes and constants.
|
107
|
-
:rtype: List[ContainerAttribute]
|
65
|
+
:rtype: Tuple[List[ContainerAttribute], Dict[str, str]]
|
108
66
|
'''
|
109
67
|
|
68
|
+
# Define create data function to parse the YAML file.
|
69
|
+
def create_data(data):
|
70
|
+
|
71
|
+
# Create a list of ContainerAttributeYamlData objects from the YAML data.
|
72
|
+
attrs = [
|
73
|
+
ContainerAttributeYamlData.from_data(id=id, **attr_data)
|
74
|
+
for id, attr_data in data.get('attrs', {}).items()
|
75
|
+
] if data.get('attrs') else []
|
76
|
+
|
77
|
+
# Get the constants from the YAML data.
|
78
|
+
consts = data.get('const', {}) if data.get('const') else {}
|
79
|
+
|
80
|
+
# Return the parsed attributes and constants.
|
81
|
+
return attrs, consts
|
82
|
+
|
110
83
|
# Load the attribute data from the yaml configuration file.
|
111
84
|
attr_data, consts = yaml_client.load(
|
112
85
|
self.config_file,
|
113
|
-
create_data=
|
114
|
-
[ContainerAttributeYamlData.from_data(id=id, **attr_data) for id, attr_data in data.get('attrs', {}).items()],
|
115
|
-
data.get('const', {}),
|
116
|
-
),
|
86
|
+
create_data=create_data
|
117
87
|
)
|
118
88
|
|
119
89
|
# Return the list of container attributes.
|
@@ -4,73 +4,18 @@
|
|
4
4
|
from typing import List, Dict
|
5
5
|
|
6
6
|
# ** app
|
7
|
-
from
|
8
|
-
from
|
9
|
-
|
7
|
+
from ...data.error import ErrorData
|
8
|
+
from ...contracts.error import (
|
9
|
+
Error,
|
10
|
+
ErrorRepository
|
11
|
+
)
|
12
|
+
from ...clients import yaml as yaml_client
|
10
13
|
|
11
14
|
|
12
|
-
# ***
|
13
|
-
|
14
|
-
# ** interface: error_repository
|
15
|
-
class ErrorRepository(object):
|
16
|
-
|
17
|
-
# * method: exists
|
18
|
-
def exists(self, id: str, **kwargs) -> bool:
|
19
|
-
'''
|
20
|
-
Check if the error exists.
|
21
|
-
|
22
|
-
:param id: The error id.
|
23
|
-
:type id: str
|
24
|
-
:param kwargs: Additional keyword arguments.
|
25
|
-
:type kwargs: dict
|
26
|
-
:return: Whether the error exists.
|
27
|
-
:rtype: bool
|
28
|
-
'''
|
29
|
-
|
30
|
-
# Not implemented.
|
31
|
-
raise NotImplementedError()
|
32
|
-
|
33
|
-
# * method: get
|
34
|
-
def get(self, id: str) -> Error:
|
35
|
-
'''
|
36
|
-
Get the error.
|
37
|
-
|
38
|
-
:param id: The error id.
|
39
|
-
:type id: str
|
40
|
-
:return: The error.
|
41
|
-
:rtype: Error
|
42
|
-
'''
|
43
|
-
|
44
|
-
# Not implemented.
|
45
|
-
raise NotImplementedError()
|
46
|
-
|
47
|
-
# * method: list
|
48
|
-
def list(self) -> List[Error]:
|
49
|
-
'''
|
50
|
-
List all errors.
|
51
|
-
|
52
|
-
:return: The list of errors.
|
53
|
-
:rtype: List[Error]
|
54
|
-
'''
|
55
|
-
|
56
|
-
# Not implemented.
|
57
|
-
raise NotImplementedError()
|
58
|
-
|
59
|
-
# * method: save
|
60
|
-
def save(self, error: Error):
|
61
|
-
'''
|
62
|
-
Save the error.
|
63
|
-
|
64
|
-
:param error: The error.
|
65
|
-
:type error: Error
|
66
|
-
'''
|
67
|
-
|
68
|
-
# Not implemented.
|
69
|
-
raise NotImplementedError
|
70
|
-
|
15
|
+
# *** proxies
|
71
16
|
|
72
17
|
# ** proxy: yaml_proxy
|
73
|
-
class
|
18
|
+
class ErrorYamlProxy(ErrorRepository):
|
74
19
|
'''
|
75
20
|
The YAML proxy for the error repository
|
76
21
|
'''
|
@@ -104,11 +49,7 @@ class YamlProxy(ErrorRepository):
|
|
104
49
|
'''
|
105
50
|
|
106
51
|
# Load the error data from the yaml configuration file.
|
107
|
-
data
|
108
|
-
self.config_file,
|
109
|
-
create_data=lambda data: ErrorData.from_data(
|
110
|
-
id=id, **data),
|
111
|
-
start_node=lambda data: data.get('errors').get(id))
|
52
|
+
data = self.get(id)
|
112
53
|
|
113
54
|
# Return whether the error exists.
|
114
55
|
return data is not None
|
@@ -132,7 +73,7 @@ class YamlProxy(ErrorRepository):
|
|
132
73
|
start_node=lambda data: data.get('errors').get(id))
|
133
74
|
|
134
75
|
# Return the error object.
|
135
|
-
return _data.map()
|
76
|
+
return _data.map() if _data else None
|
136
77
|
|
137
78
|
# * method: list
|
138
79
|
def list(self) -> List[Error]:
|
@@ -169,5 +110,5 @@ class YamlProxy(ErrorRepository):
|
|
169
110
|
yaml_client.save(
|
170
111
|
yaml_file=self.config_file,
|
171
112
|
data=error_data.to_primitive(),
|
172
|
-
data_save_path=f'errors/{error.
|
113
|
+
data_save_path=f'errors/{error.id}',
|
173
114
|
)
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# *** imports
|
2
|
+
|
3
|
+
# ** core
|
4
|
+
from typing import List
|
5
|
+
|
6
|
+
# ** app
|
7
|
+
from ...clients import yaml_client
|
8
|
+
from ...contracts.feature import Feature, FeatureRepository
|
9
|
+
from ...data import DataObject
|
10
|
+
from ...data.feature import FeatureData as FeatureYamlData
|
11
|
+
|
12
|
+
|
13
|
+
# *** proxies
|
14
|
+
|
15
|
+
# ** proxies: feature_yaml_proxy
|
16
|
+
class FeatureYamlProxy(FeatureRepository):
|
17
|
+
'''
|
18
|
+
Yaml repository for features.
|
19
|
+
'''
|
20
|
+
|
21
|
+
# * method: init
|
22
|
+
def __init__(self, feature_config_file: str):
|
23
|
+
'''
|
24
|
+
Initialize the yaml repository.
|
25
|
+
|
26
|
+
:param feature_config_file: The feature configuration file.
|
27
|
+
:type feature_config_file: str
|
28
|
+
'''
|
29
|
+
|
30
|
+
# Set the base path.
|
31
|
+
self.config_file = feature_config_file
|
32
|
+
|
33
|
+
# * method: exists
|
34
|
+
def exists(self, id: str) -> bool:
|
35
|
+
'''
|
36
|
+
Verifies if the feature exists.
|
37
|
+
|
38
|
+
:param id: The feature id.
|
39
|
+
:type id: str
|
40
|
+
:return: Whether the feature exists.
|
41
|
+
:rtype: bool
|
42
|
+
'''
|
43
|
+
|
44
|
+
# Retrieve the feature by id.
|
45
|
+
feature = self.get(id)
|
46
|
+
|
47
|
+
# Return whether the feature exists.
|
48
|
+
return feature is not None
|
49
|
+
|
50
|
+
# * method: get
|
51
|
+
def get(self, id: str) -> Feature:
|
52
|
+
'''
|
53
|
+
Get the feature by id.
|
54
|
+
|
55
|
+
:param id: The feature id.
|
56
|
+
:type id: str
|
57
|
+
:return: The feature object.
|
58
|
+
'''
|
59
|
+
|
60
|
+
# Get the feature.
|
61
|
+
return next((feature for feature in self.list() if feature.id == id), None)
|
62
|
+
|
63
|
+
# * method: list
|
64
|
+
def list(self, group_id: str = None) -> List[Feature]:
|
65
|
+
'''
|
66
|
+
List the features.
|
67
|
+
|
68
|
+
:param group_id: The group id.
|
69
|
+
:type group_id: str
|
70
|
+
:return: The list of features.
|
71
|
+
:rtype: List[Feature]
|
72
|
+
'''
|
73
|
+
|
74
|
+
# Load all feature data from yaml.
|
75
|
+
features = yaml_client.load(
|
76
|
+
self.config_file,
|
77
|
+
create_data=lambda data: [DataObject.from_data(
|
78
|
+
FeatureYamlData,
|
79
|
+
id=id,
|
80
|
+
feature_key=id.split('.')[-1],
|
81
|
+
group_id=id.split('.')[0] if not group_id else group_id,
|
82
|
+
**feature_data
|
83
|
+
) for id, feature_data in data.items()],
|
84
|
+
start_node=lambda data: data.get('features')
|
85
|
+
)
|
86
|
+
|
87
|
+
# Filter features by group id.
|
88
|
+
if group_id:
|
89
|
+
features = [feature for feature in features if feature.group_id == group_id]
|
90
|
+
|
91
|
+
# Return the list of features.
|
92
|
+
return [feature.map() for feature in features]
|
@@ -1,10 +1,10 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: tiferet
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.0b0
|
4
4
|
Summary: A multi-purpose application framework embodying beauty in form.
|
5
5
|
Home-page: https://github.com/greatstrength/app
|
6
6
|
Download-URL: https://github.com/greatstrength/app
|
7
|
-
Author: Andrew Shatz
|
7
|
+
Author: Andrew Shatz, Great Strength Systems
|
8
8
|
Author-email: andrew@greatstrength.me
|
9
9
|
License: BSD 3
|
10
10
|
License-File: LICENSE
|
@@ -14,3 +14,12 @@ Requires-Dist: dependencies>=7.7.0
|
|
14
14
|
Provides-Extra: test
|
15
15
|
Requires-Dist: pytest>=8.3.3; extra == "test"
|
16
16
|
Requires-Dist: pytest_env>=1.1.5; extra == "test"
|
17
|
+
Dynamic: author
|
18
|
+
Dynamic: author-email
|
19
|
+
Dynamic: download-url
|
20
|
+
Dynamic: home-page
|
21
|
+
Dynamic: license
|
22
|
+
Dynamic: license-file
|
23
|
+
Dynamic: provides-extra
|
24
|
+
Dynamic: requires-dist
|
25
|
+
Dynamic: summary
|
@@ -0,0 +1,51 @@
|
|
1
|
+
tiferet/__init__.py,sha256=X1lGrz4BrrSfk7_pYJ159j8Q0zczJm9UEmpwY1XJ3Eg,116
|
2
|
+
tiferet/clients/__init__.py,sha256=hSa_PgXM2jw9iVRrJH_SQUlSVISK-T4tTfgRKnXKkzA,33
|
3
|
+
tiferet/clients/yaml.py,sha256=790LB7CpaMow_Ng8zB6jGmJnoqz8xjMYbfDLeMd4o3Q,2816
|
4
|
+
tiferet/commands/__init__.py,sha256=wpLgT9FHmBU7I7NJMuGyHvyiCm64QHVAoUbd38y36ZE,90
|
5
|
+
tiferet/commands/app.py,sha256=tOka9yhc6tBPT7X8ACuLlE-12CAzk0j59hstE84G6wU,3174
|
6
|
+
tiferet/commands/core.py,sha256=4MSty0qM9v8sKihoLGFoPHFOyprVQ-MlPHvPqEO3hY8,3367
|
7
|
+
tiferet/commands/dependencies.py,sha256=bYwQXcT8HLyPRAavdSkrWI4vImsJ2H4Lr7AG9q3zxUw,2035
|
8
|
+
tiferet/commands/settings.py,sha256=W_HdOF5QV33DczHQu5iXHOhPKwaE6DUG4KPd5m6fm_Y,2605
|
9
|
+
tiferet/configs/__init__.py,sha256=aSp8zTjuQK6gKyOAlsobhVcrzz7MNagPvc7K1b2DFu8,80
|
10
|
+
tiferet/configs/error.py,sha256=27ONO4jslmVPSQBh1rUAorAQ9GZMtwwEoCoyVxCtbGc,1457
|
11
|
+
tiferet/configs/settings.py,sha256=U4Do6BNCodMBT2_Qi49Zk-saRFzCkKGx-nCs9hJETe0,867
|
12
|
+
tiferet/contexts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
|
+
tiferet/contexts/app.py,sha256=EFjcz3VxBDdCSPTpSxNyyloIeOIFXoRaOv796oMDQOk,8970
|
14
|
+
tiferet/contexts/cache.py,sha256=RsklfFmZTnFxzxh7hiKD3nuEg50LX-JuWcie7P6xfTo,1758
|
15
|
+
tiferet/contexts/container.py,sha256=2oC91WlXJtAnuFJo1yyo78wO8fDZyfkwF6638L7UtIQ,3985
|
16
|
+
tiferet/contexts/error.py,sha256=Yr0rJgUTnDSxq5rSobVxUcoibehyYfKT5SrcXClBA48,3804
|
17
|
+
tiferet/contexts/feature.py,sha256=sPhubhBRY0vvOmTVOyHXZmztRYTWML7-DPWwPs2w0Po,5285
|
18
|
+
tiferet/contracts/__init__.py,sha256=a8e7mleeLr0s554mRd1K0O0q2clisR7wGpeex1-9hsI,47
|
19
|
+
tiferet/contracts/app.py,sha256=x1biqBRAKhYJtljG6M1MtbVxRk5nAHSGU8X1O16W_sE,1928
|
20
|
+
tiferet/contracts/cache.py,sha256=mr_sHGSe_k5GuE22f8NfX_2ppgHHCiZrnkCK07M53cc,1653
|
21
|
+
tiferet/contracts/container.py,sha256=jy8RULSoHifMGRkuWiu2QMR4JHJSryCLKeMzEWZ7Ov4,4544
|
22
|
+
tiferet/contracts/error.py,sha256=7cVX4b8dt-LIHoUNhquYvm2pTYRzybKbDIunKxd61fQ,4984
|
23
|
+
tiferet/contracts/feature.py,sha256=7zrvqegwzCbCQMWPAvUqu5AIYi74K-FkEt6Pvh9WiGo,3661
|
24
|
+
tiferet/contracts/settings.py,sha256=csHP9pny7_M8wtHyxQdCZ7iGNV5e1nWqHVAvbvW-8-o,469
|
25
|
+
tiferet/data/__init__.py,sha256=0DsMN6Q9Jd7hGGGlfpNiuCmmXWVQQ9LL4iw8lYPn_so,48
|
26
|
+
tiferet/data/app.py,sha256=uURJsi2anQe5l56jvkqNEznx6oIDNZIija-CSwLm4cQ,4354
|
27
|
+
tiferet/data/container.py,sha256=g8wqhU44SI1OgSbciSDe3s1Stnx3i-98snqk-XpYjYs,6663
|
28
|
+
tiferet/data/error.py,sha256=9GYkmHPDkttyOlfk-9t3lHIsoWFGVkpfDN1wMpdOfTM,2189
|
29
|
+
tiferet/data/feature.py,sha256=hFUkbe-j9jqaMbnZq0sfo6N64NOl042oDwfadFTfVSY,3501
|
30
|
+
tiferet/data/settings.py,sha256=mJh3EzGHATIX_geKyK6KRcCC6v2185V7swqwnym9mdQ,4277
|
31
|
+
tiferet/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
32
|
+
tiferet/handlers/container.py,sha256=986kEkrjssinCHOwR0_CWEnNnaX54YI0d4UNb8n4gBU,4148
|
33
|
+
tiferet/handlers/error.py,sha256=j0AYMzskNMfzLydFfAh54NGxnaKlKFVzf_J3KpUOa2s,1242
|
34
|
+
tiferet/handlers/feature.py,sha256=ar4j0OnUorZM5tR2thoLQUh2qjx9c0NuKjr1ZgPUzIY,2749
|
35
|
+
tiferet/models/__init__.py,sha256=a8e7mleeLr0s554mRd1K0O0q2clisR7wGpeex1-9hsI,47
|
36
|
+
tiferet/models/app.py,sha256=KCMTyvqoB7Gs05pauyBiD1nUPGYWoz_gzMJwjMGelFY,3822
|
37
|
+
tiferet/models/container.py,sha256=-hkGU1jK4ETKotDNdWAZOHaD6TdgQBg1MC5_TcisaqA,3552
|
38
|
+
tiferet/models/error.py,sha256=perVK1nfot8QVaowT3tUHlr-nh8Hy9E6rTE5p3Hhv28,5627
|
39
|
+
tiferet/models/feature.py,sha256=SDnK3WsisSh5cfaEcX0WXV1Y4N2WsaGfhkDl7NL9B6s,6423
|
40
|
+
tiferet/models/settings.py,sha256=nsdRY5IYv6TKxbBbxmpE6ujwmZxJPdF6VxlJkmt1P-k,2497
|
41
|
+
tiferet/proxies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
|
+
tiferet/proxies/yaml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
43
|
+
tiferet/proxies/yaml/app.py,sha256=qx0b2WtywfxtETN8OPfzrrzvYcuAY6uiyU9ctgpx8QI,2269
|
44
|
+
tiferet/proxies/yaml/container.py,sha256=raOeZ2CIAbNHTzPNqL2tgPvuad7-LcPL0a1NJ-nmUYY,2971
|
45
|
+
tiferet/proxies/yaml/error.py,sha256=fFAFxbtVZ9dguvYb08TzrIBir1H0NYoe5JHjGm5HuTU,2885
|
46
|
+
tiferet/proxies/yaml/feature.py,sha256=CKIsAqil27U0VjtVIHTiq3U9chNOZM6HAuUyH5VDF_o,2471
|
47
|
+
tiferet-1.0.0b0.dist-info/licenses/LICENSE,sha256=e8_GutFM0sxbRlgUaeVsGvJ5uE-KvruLApOzIoHy_zU,1513
|
48
|
+
tiferet-1.0.0b0.dist-info/METADATA,sha256=QQAYp7hzt9YXCYQZcYFosuH9PxLLF3BtGFXrZVHSloo,741
|
49
|
+
tiferet-1.0.0b0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
50
|
+
tiferet-1.0.0b0.dist-info/top_level.txt,sha256=g19Qw0j_VxPw-fgPF1TMPwbtHjnEhNQs0fa69wJZ6IM,8
|
51
|
+
tiferet-1.0.0b0.dist-info/RECORD,,
|