python-flask-dev 0.0.1__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.
- __init__.py +0 -0
- app.py +246 -0
- data/__init__.py +0 -0
- python_flask_dev/__init__.py +0 -0
- python_flask_dev/custom_exceptions.py +10 -0
- python_flask_dev/data_source.py +34 -0
- python_flask_dev/filtering_data.py +280 -0
- python_flask_dev/formatting_data.py +2 -0
- python_flask_dev/importing_modules.py +64 -0
- python_flask_dev/packaging/__init__.py +0 -0
- python_flask_dev/packaging/incremental_versioning.py +107 -0
- python_flask_dev/path_retrieval.py +11 -0
- python_flask_dev-0.0.1.dist-info/METADATA +201 -0
- python_flask_dev-0.0.1.dist-info/RECORD +16 -0
- python_flask_dev-0.0.1.dist-info/WHEEL +5 -0
- python_flask_dev-0.0.1.dist-info/top_level.txt +4 -0
__init__.py
ADDED
|
File without changes
|
app.py
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
from flask import Flask
|
|
2
|
+
from python_flask_dev.formatting_data import get_filtered_key_vals
|
|
3
|
+
# from data.users import get_users
|
|
4
|
+
app = Flask(__name__)
|
|
5
|
+
|
|
6
|
+
# sample_data = get_users()
|
|
7
|
+
sample_data = [
|
|
8
|
+
{
|
|
9
|
+
"id": 1,
|
|
10
|
+
"name": "Leanne Graham",
|
|
11
|
+
"username": "Bret",
|
|
12
|
+
"email": "Sincere@april.biz",
|
|
13
|
+
"address": {
|
|
14
|
+
"street": "Kulas Light",
|
|
15
|
+
"suite": "Apt. 556",
|
|
16
|
+
"city": "Gwenborough",
|
|
17
|
+
"zipcode": "92998-3874",
|
|
18
|
+
"geo": {
|
|
19
|
+
"lat": "-37.3159",
|
|
20
|
+
"lng": "81.1496"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"phone": "1-770-736-8031 x56442",
|
|
24
|
+
"website": "hildegard.org",
|
|
25
|
+
"company": {
|
|
26
|
+
"name": "Romaguera-Crona",
|
|
27
|
+
"catchPhrase": "Multi-layered client-server neural-net",
|
|
28
|
+
"bs": "harness real-time e-markets"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 2,
|
|
33
|
+
"name": "Ervin Howell",
|
|
34
|
+
"username": "Antonette",
|
|
35
|
+
"email": "Shanna@melissa.tv",
|
|
36
|
+
"address": {
|
|
37
|
+
"street": "Victor Plains",
|
|
38
|
+
"suite": "Suite 879",
|
|
39
|
+
"city": "Wisokyburgh",
|
|
40
|
+
"zipcode": "90566-7771",
|
|
41
|
+
"geo": {
|
|
42
|
+
"lat": "-43.9509",
|
|
43
|
+
"lng": "-34.4618"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"phone": "010-692-6593 x09125",
|
|
47
|
+
"website": "anastasia.net",
|
|
48
|
+
"company": {
|
|
49
|
+
"name": "Deckow-Crist",
|
|
50
|
+
"catchPhrase": "Proactive didactic contingency",
|
|
51
|
+
"bs": "synergize scalable supply-chains"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": 3,
|
|
56
|
+
"name": "Clementine Bauch",
|
|
57
|
+
"username": "Samantha",
|
|
58
|
+
"email": "Nathan@yesenia.net",
|
|
59
|
+
"address": {
|
|
60
|
+
"street": "Douglas Extension",
|
|
61
|
+
"suite": "Suite 847",
|
|
62
|
+
"city": "McKenziehaven",
|
|
63
|
+
"zipcode": "59590-4157",
|
|
64
|
+
"geo": {
|
|
65
|
+
"lat": "-68.6102",
|
|
66
|
+
"lng": "-47.0653"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"phone": "1-463-123-4447",
|
|
70
|
+
"website": "ramiro.info",
|
|
71
|
+
"company": {
|
|
72
|
+
"name": "Romaguera-Jacobson",
|
|
73
|
+
"catchPhrase": "Face to face bifurcated interface",
|
|
74
|
+
"bs": "e-enable strategic applications"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": 4,
|
|
79
|
+
"name": "Patricia Lebsack",
|
|
80
|
+
"username": "Karianne",
|
|
81
|
+
"email": "Julianne.OConner@kory.org",
|
|
82
|
+
"address": {
|
|
83
|
+
"street": "Hoeger Mall",
|
|
84
|
+
"suite": "Apt. 692",
|
|
85
|
+
"city": "South Elvis",
|
|
86
|
+
"zipcode": "53919-4257",
|
|
87
|
+
"geo": {
|
|
88
|
+
"lat": "29.4572",
|
|
89
|
+
"lng": "-164.2990"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"phone": "493-170-9623 x156",
|
|
93
|
+
"website": "kale.biz",
|
|
94
|
+
"company": {
|
|
95
|
+
"name": "Robel-Corkery",
|
|
96
|
+
"catchPhrase": "Multi-tiered zero tolerance productivity",
|
|
97
|
+
"bs": "transition cutting-edge web services"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": 5,
|
|
102
|
+
"name": "Chelsey Dietrich",
|
|
103
|
+
"username": "Kamren",
|
|
104
|
+
"email": "Lucio_Hettinger@annie.ca",
|
|
105
|
+
"address": {
|
|
106
|
+
"street": "Skiles Walks",
|
|
107
|
+
"suite": "Suite 351",
|
|
108
|
+
"city": "Roscoeview",
|
|
109
|
+
"zipcode": "33263",
|
|
110
|
+
"geo": {
|
|
111
|
+
"lat": "-31.8129",
|
|
112
|
+
"lng": "62.5342"
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"phone": "(254)954-1289",
|
|
116
|
+
"website": "demarco.info",
|
|
117
|
+
"company": {
|
|
118
|
+
"name": "Keebler LLC",
|
|
119
|
+
"catchPhrase": "User-centric fault-tolerant solution",
|
|
120
|
+
"bs": "revolutionize end-to-end systems"
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"id": 6,
|
|
125
|
+
"name": "Mrs. Dennis Schulist",
|
|
126
|
+
"username": "Leopoldo_Corkery",
|
|
127
|
+
"email": "Karley_Dach@jasper.info",
|
|
128
|
+
"address": {
|
|
129
|
+
"street": "Norberto Crossing",
|
|
130
|
+
"suite": "Apt. 950",
|
|
131
|
+
"city": "South Christy",
|
|
132
|
+
"zipcode": "23505-1337",
|
|
133
|
+
"geo": {
|
|
134
|
+
"lat": "-71.4197",
|
|
135
|
+
"lng": "71.7478"
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"phone": "1-477-935-8478 x6430",
|
|
139
|
+
"website": "ola.org",
|
|
140
|
+
"company": {
|
|
141
|
+
"name": "Considine-Lockman",
|
|
142
|
+
"catchPhrase": "Synchronised bottom-line interface",
|
|
143
|
+
"bs": "e-enable innovative applications"
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": 7,
|
|
148
|
+
"name": "Kurtis Weissnat",
|
|
149
|
+
"username": "Elwyn.Skiles",
|
|
150
|
+
"email": "Telly.Hoeger@billy.biz",
|
|
151
|
+
"address": {
|
|
152
|
+
"street": "Rex Trail",
|
|
153
|
+
"suite": "Suite 280",
|
|
154
|
+
"city": "Howemouth",
|
|
155
|
+
"zipcode": "58804-1099",
|
|
156
|
+
"geo": {
|
|
157
|
+
"lat": "24.8918",
|
|
158
|
+
"lng": "21.8984"
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"phone": "210.067.6132",
|
|
162
|
+
"website": "elvis.io",
|
|
163
|
+
"company": {
|
|
164
|
+
"name": "Johns Group",
|
|
165
|
+
"catchPhrase": "Configurable multimedia task-force",
|
|
166
|
+
"bs": "generate enterprise e-tailers"
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"id": 8,
|
|
171
|
+
"name": "Nicholas Runolfsdottir V",
|
|
172
|
+
"username": "Maxime_Nienow",
|
|
173
|
+
"email": "Sherwood@rosamond.me",
|
|
174
|
+
"address": {
|
|
175
|
+
"street": "Ellsworth Summit",
|
|
176
|
+
"suite": "Suite 729",
|
|
177
|
+
"city": "Aliyaview",
|
|
178
|
+
"zipcode": "45169",
|
|
179
|
+
"geo": {
|
|
180
|
+
"lat": "-14.3990",
|
|
181
|
+
"lng": "-120.7677"
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"phone": "586.493.6943 x140",
|
|
185
|
+
"website": "jacynthe.com",
|
|
186
|
+
"company": {
|
|
187
|
+
"name": "Abernathy Group",
|
|
188
|
+
"catchPhrase": "Implemented secondary concept",
|
|
189
|
+
"bs": "e-enable extensible e-tailers"
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"id": 9,
|
|
194
|
+
"name": "Glenna Reichert",
|
|
195
|
+
"username": "Delphine",
|
|
196
|
+
"email": "Chaim_McDermott@dana.io",
|
|
197
|
+
"address": {
|
|
198
|
+
"street": "Dayna Park",
|
|
199
|
+
"suite": "Suite 449",
|
|
200
|
+
"city": "Bartholomebury",
|
|
201
|
+
"zipcode": "76495-3109",
|
|
202
|
+
"geo": {
|
|
203
|
+
"lat": "24.6463",
|
|
204
|
+
"lng": "-168.8889"
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
"phone": "(775)976-6794 x41206",
|
|
208
|
+
"website": "conrad.com",
|
|
209
|
+
"company": {
|
|
210
|
+
"name": "Yost and Sons",
|
|
211
|
+
"catchPhrase": "Switchable contextually-based project",
|
|
212
|
+
"bs": "aggregate real-time technologies"
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"id": 10,
|
|
217
|
+
"name": "Clementina DuBuque",
|
|
218
|
+
"username": "Moriah.Stanton",
|
|
219
|
+
"email": "Rey.Padberg@karina.biz",
|
|
220
|
+
"address": {
|
|
221
|
+
"street": "Kattie Turnpike",
|
|
222
|
+
"suite": "Suite 198",
|
|
223
|
+
"city": "Lebsackbury",
|
|
224
|
+
"zipcode": "31428-2261",
|
|
225
|
+
"geo": {
|
|
226
|
+
"lat": "-38.2386",
|
|
227
|
+
"lng": "57.2232"
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"phone": "024-648-3804",
|
|
231
|
+
"website": "ambrose.net",
|
|
232
|
+
"company": {
|
|
233
|
+
"name": "Hoeger LLC",
|
|
234
|
+
"catchPhrase": "Centralized empowering task-force",
|
|
235
|
+
"bs": "target end-to-end models"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
|
|
240
|
+
@app.route('/')
|
|
241
|
+
def hello_world(): # put application's code here
|
|
242
|
+
return 'Hello World!'
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
if __name__ == '__main__':
|
|
246
|
+
app.run()
|
data/__init__.py
ADDED
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class CustomError(Exception):
|
|
2
|
+
"""Exception raised for custom error in the application."""
|
|
3
|
+
# ATT this function doesn't accept printf for the message arg; a printf string needs to be assigned to a var
|
|
4
|
+
def __init__(self, message, error_code):
|
|
5
|
+
self.message = message
|
|
6
|
+
self.error_code = error_code
|
|
7
|
+
super().__init__(message)
|
|
8
|
+
|
|
9
|
+
def __str__(self):
|
|
10
|
+
return f"{self.message} (Error Code: {self.error_code})"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# TODO: coffee finish this create data_source pkg to avoid import error
|
|
2
|
+
import argparse
|
|
3
|
+
import pandas as pd
|
|
4
|
+
import os
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
# from ..custom_exceptions import CustomError
|
|
7
|
+
|
|
8
|
+
# ENV VARS
|
|
9
|
+
PROJECT_ROOT = Path(os.getenv('VIRTUAL_ENV')).parent.absolute()
|
|
10
|
+
|
|
11
|
+
# ENV VARS SET FROM PARSER
|
|
12
|
+
parser = argparse.ArgumentParser()
|
|
13
|
+
parser.add_argument('-f', '--filename') # option that takes a value
|
|
14
|
+
args = parser.parse_args()
|
|
15
|
+
FILENAME = args.filename if args.filename else f"{PROJECT_ROOT}/data/users.json"
|
|
16
|
+
|
|
17
|
+
class DataSource:
|
|
18
|
+
def __init__(self, filename=FILENAME):
|
|
19
|
+
self.filename = filename
|
|
20
|
+
|
|
21
|
+
def get_accepted_filetypes(self):
|
|
22
|
+
return ['json', 'csv']
|
|
23
|
+
|
|
24
|
+
def convert_to_dict(self):
|
|
25
|
+
accepted_filetypes = ['json', 'csv']
|
|
26
|
+
filetype = Path(self.filename).suffix
|
|
27
|
+
|
|
28
|
+
if filetype == "json":
|
|
29
|
+
return pd.read_json(self.filename).to_dict()
|
|
30
|
+
elif filetype == "csv":
|
|
31
|
+
return pd.read_csv(self.filename).to_dict()
|
|
32
|
+
# else:
|
|
33
|
+
# err_msg = f"Accepted filetypes: {str(accepted_filetypes)}"
|
|
34
|
+
# raise CustomError(err_msg, 401)
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
from flask import Flask
|
|
2
|
+
import pandas as pd
|
|
3
|
+
import logging
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import importlib.util
|
|
6
|
+
import sys
|
|
7
|
+
import os
|
|
8
|
+
from importing_modules import get_imported_project_module
|
|
9
|
+
|
|
10
|
+
test_data = [
|
|
11
|
+
{
|
|
12
|
+
"id": 1,
|
|
13
|
+
"name": "Leanne Graham",
|
|
14
|
+
"username": "Bret",
|
|
15
|
+
"email": "Sincere@april.biz",
|
|
16
|
+
"address": {
|
|
17
|
+
"street": "Kulas Light",
|
|
18
|
+
"suite": "Apt. 556",
|
|
19
|
+
"city": "Gwenborough",
|
|
20
|
+
"zipcode": "92998-3874",
|
|
21
|
+
"geo": {
|
|
22
|
+
"lat": "-37.3159",
|
|
23
|
+
"lng": "81.1496"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"phone": "1-770-736-8031 x56442",
|
|
27
|
+
"website": "hildegard.org",
|
|
28
|
+
"company": {
|
|
29
|
+
"name": "Romaguera-Crona",
|
|
30
|
+
"catchPhrase": "Multi-layered client-server neural-net",
|
|
31
|
+
"bs": "harness real-time e-markets"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": 2,
|
|
36
|
+
"name": "Ervin Howell",
|
|
37
|
+
"username": "Antonette",
|
|
38
|
+
"email": "Shanna@melissa.tv",
|
|
39
|
+
"address": {
|
|
40
|
+
"street": "Victor Plains",
|
|
41
|
+
"suite": "Suite 879",
|
|
42
|
+
"city": "Wisokyburgh",
|
|
43
|
+
"zipcode": "90566-7771",
|
|
44
|
+
"geo": {
|
|
45
|
+
"lat": "-43.9509",
|
|
46
|
+
"lng": "-34.4618"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"phone": "010-692-6593 x09125",
|
|
50
|
+
"website": "anastasia.net",
|
|
51
|
+
"company": {
|
|
52
|
+
"name": "Deckow-Crist",
|
|
53
|
+
"catchPhrase": "Proactive didactic contingency",
|
|
54
|
+
"bs": "synergize scalable supply-chains"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": 3,
|
|
59
|
+
"name": "Clementine Bauch",
|
|
60
|
+
"username": "Samantha",
|
|
61
|
+
"email": "Nathan@yesenia.net",
|
|
62
|
+
"address": {
|
|
63
|
+
"street": "Douglas Extension",
|
|
64
|
+
"suite": "Suite 847",
|
|
65
|
+
"city": "McKenziehaven",
|
|
66
|
+
"zipcode": "59590-4157",
|
|
67
|
+
"geo": {
|
|
68
|
+
"lat": "-68.6102",
|
|
69
|
+
"lng": "-47.0653"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"phone": "1-463-123-4447",
|
|
73
|
+
"website": "ramiro.info",
|
|
74
|
+
"company": {
|
|
75
|
+
"name": "Romaguera-Jacobson",
|
|
76
|
+
"catchPhrase": "Face to face bifurcated interface",
|
|
77
|
+
"bs": "e-enable strategic applications"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": 4,
|
|
82
|
+
"name": "Patricia Lebsack",
|
|
83
|
+
"username": "Karianne",
|
|
84
|
+
"email": "Julianne.OConner@kory.org",
|
|
85
|
+
"address": {
|
|
86
|
+
"street": "Hoeger Mall",
|
|
87
|
+
"suite": "Apt. 692",
|
|
88
|
+
"city": "South Elvis",
|
|
89
|
+
"zipcode": "53919-4257",
|
|
90
|
+
"geo": {
|
|
91
|
+
"lat": "29.4572",
|
|
92
|
+
"lng": "-164.2990"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"phone": "493-170-9623 x156",
|
|
96
|
+
"website": "kale.biz",
|
|
97
|
+
"company": {
|
|
98
|
+
"name": "Robel-Corkery",
|
|
99
|
+
"catchPhrase": "Multi-tiered zero tolerance productivity",
|
|
100
|
+
"bs": "transition cutting-edge web services"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": 5,
|
|
105
|
+
"name": "Chelsey Dietrich",
|
|
106
|
+
"username": "Kamren",
|
|
107
|
+
"email": "Lucio_Hettinger@annie.ca",
|
|
108
|
+
"address": {
|
|
109
|
+
"street": "Skiles Walks",
|
|
110
|
+
"suite": "Suite 351",
|
|
111
|
+
"city": "Roscoeview",
|
|
112
|
+
"zipcode": "33263",
|
|
113
|
+
"geo": {
|
|
114
|
+
"lat": "-31.8129",
|
|
115
|
+
"lng": "62.5342"
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"phone": "(254)954-1289",
|
|
119
|
+
"website": "demarco.info",
|
|
120
|
+
"company": {
|
|
121
|
+
"name": "Keebler LLC",
|
|
122
|
+
"catchPhrase": "User-centric fault-tolerant solution",
|
|
123
|
+
"bs": "revolutionize end-to-end systems"
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": 6,
|
|
128
|
+
"name": "Mrs. Dennis Schulist",
|
|
129
|
+
"username": "Leopoldo_Corkery",
|
|
130
|
+
"email": "Karley_Dach@jasper.info",
|
|
131
|
+
"address": {
|
|
132
|
+
"street": "Norberto Crossing",
|
|
133
|
+
"suite": "Apt. 950",
|
|
134
|
+
"city": "South Christy",
|
|
135
|
+
"zipcode": "23505-1337",
|
|
136
|
+
"geo": {
|
|
137
|
+
"lat": "-71.4197",
|
|
138
|
+
"lng": "71.7478"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"phone": "1-477-935-8478 x6430",
|
|
142
|
+
"website": "ola.org",
|
|
143
|
+
"company": {
|
|
144
|
+
"name": "Considine-Lockman",
|
|
145
|
+
"catchPhrase": "Synchronised bottom-line interface",
|
|
146
|
+
"bs": "e-enable innovative applications"
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": 7,
|
|
151
|
+
"name": "Kurtis Weissnat",
|
|
152
|
+
"username": "Elwyn.Skiles",
|
|
153
|
+
"email": "Telly.Hoeger@billy.biz",
|
|
154
|
+
"address": {
|
|
155
|
+
"street": "Rex Trail",
|
|
156
|
+
"suite": "Suite 280",
|
|
157
|
+
"city": "Howemouth",
|
|
158
|
+
"zipcode": "58804-1099",
|
|
159
|
+
"geo": {
|
|
160
|
+
"lat": "24.8918",
|
|
161
|
+
"lng": "21.8984"
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"phone": "210.067.6132",
|
|
165
|
+
"website": "elvis.io",
|
|
166
|
+
"company": {
|
|
167
|
+
"name": "Johns Group",
|
|
168
|
+
"catchPhrase": "Configurable multimedia task-force",
|
|
169
|
+
"bs": "generate enterprise e-tailers"
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": 8,
|
|
174
|
+
"name": "Nicholas Runolfsdottir V",
|
|
175
|
+
"username": "Maxime_Nienow",
|
|
176
|
+
"email": "Sherwood@rosamond.me",
|
|
177
|
+
"address": {
|
|
178
|
+
"street": "Ellsworth Summit",
|
|
179
|
+
"suite": "Suite 729",
|
|
180
|
+
"city": "Aliyaview",
|
|
181
|
+
"zipcode": "45169",
|
|
182
|
+
"geo": {
|
|
183
|
+
"lat": "-14.3990",
|
|
184
|
+
"lng": "-120.7677"
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"phone": "586.493.6943 x140",
|
|
188
|
+
"website": "jacynthe.com",
|
|
189
|
+
"company": {
|
|
190
|
+
"name": "Abernathy Group",
|
|
191
|
+
"catchPhrase": "Implemented secondary concept",
|
|
192
|
+
"bs": "e-enable extensible e-tailers"
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"id": 9,
|
|
197
|
+
"name": "Glenna Reichert",
|
|
198
|
+
"username": "Delphine",
|
|
199
|
+
"email": "Chaim_McDermott@dana.io",
|
|
200
|
+
"address": {
|
|
201
|
+
"street": "Dayna Park",
|
|
202
|
+
"suite": "Suite 449",
|
|
203
|
+
"city": "Bartholomebury",
|
|
204
|
+
"zipcode": "76495-3109",
|
|
205
|
+
"geo": {
|
|
206
|
+
"lat": "24.6463",
|
|
207
|
+
"lng": "-168.8889"
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"phone": "(775)976-6794 x41206",
|
|
211
|
+
"website": "conrad.com",
|
|
212
|
+
"company": {
|
|
213
|
+
"name": "Yost and Sons",
|
|
214
|
+
"catchPhrase": "Switchable contextually-based project",
|
|
215
|
+
"bs": "aggregate real-time technologies"
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"id": 10,
|
|
220
|
+
"name": "Clementina DuBuque",
|
|
221
|
+
"username": "Moriah.Stanton",
|
|
222
|
+
"email": "Rey.Padberg@karina.biz",
|
|
223
|
+
"address": {
|
|
224
|
+
"street": "Kattie Turnpike",
|
|
225
|
+
"suite": "Suite 198",
|
|
226
|
+
"city": "Lebsackbury",
|
|
227
|
+
"zipcode": "31428-2261",
|
|
228
|
+
"geo": {
|
|
229
|
+
"lat": "-38.2386",
|
|
230
|
+
"lng": "57.2232"
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
"phone": "024-648-3804",
|
|
234
|
+
"website": "ambrose.net",
|
|
235
|
+
"company": {
|
|
236
|
+
"name": "Hoeger LLC",
|
|
237
|
+
"catchPhrase": "Centralized empowering task-force",
|
|
238
|
+
"bs": "target end-to-end models"
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
]
|
|
242
|
+
|
|
243
|
+
app = Flask(__name__)
|
|
244
|
+
logger = logging.getLogger(__name__)
|
|
245
|
+
|
|
246
|
+
# def get_imported_project_module(module_name, module_path):
|
|
247
|
+
# project_root = Path(os.getenv('VIRTUAL_ENV')).parent.absolute()
|
|
248
|
+
#
|
|
249
|
+
# # Create the module object from the spec
|
|
250
|
+
# module_spec = importlib.util.spec_from_file_location(module_name, Path(f"{project_root}/{module_path}"))
|
|
251
|
+
#
|
|
252
|
+
# # Load the module
|
|
253
|
+
# custom_module = importlib.util.module_from_spec(module_spec)
|
|
254
|
+
# sys.modules[module_name] = custom_module
|
|
255
|
+
# module_spec.loader.exec_module(custom_module)
|
|
256
|
+
# return custom_module
|
|
257
|
+
|
|
258
|
+
def get_filtered_key_vals(key, dictionary = None, filepath = None):
|
|
259
|
+
# data_source = get_imported_project_module("data_source", "./src/python_flask_dev/data_source.py")
|
|
260
|
+
data_source = get_imported_project_module(("data_source", ))
|
|
261
|
+
if dictionary:
|
|
262
|
+
dataframe = pd.DataFrame(dictionary)
|
|
263
|
+
elif filepath:
|
|
264
|
+
data = data_source.DataSource.convert_to_dict(filepath)
|
|
265
|
+
dataframe = pd.DataFrame(data)
|
|
266
|
+
# else:
|
|
267
|
+
# err_msg = "No data source provided. Please provide either a dictionary or a filepath to a JSON file."
|
|
268
|
+
# raise CustomError(err_msg, 400)
|
|
269
|
+
|
|
270
|
+
return list(dataframe.to_dict().get(key).values())
|
|
271
|
+
|
|
272
|
+
if __name__ == "__main__":
|
|
273
|
+
logging.basicConfig(level=logging.INFO)
|
|
274
|
+
# filtered_data = get_filtered_key_vals('id', dictionary=test_data)
|
|
275
|
+
# # filtered_data = get_filtered_key_vals('id')
|
|
276
|
+
# logger.info(f"filtered_data: {filtered_data}")
|
|
277
|
+
|
|
278
|
+
project_root = Path(os.getenv('VIRTUAL_ENV')).parent.absolute()
|
|
279
|
+
|
|
280
|
+
logger.info(f"Testing data source import: {project_root}")
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import importlib.util
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import site
|
|
6
|
+
import logging
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
logging.basicConfig(level=logging.INFO)
|
|
11
|
+
|
|
12
|
+
def get_imported_project_module(module_name, module_path = None, add_to_import_system = False):
|
|
13
|
+
logger.info(f"##### module_path: {module_path}")
|
|
14
|
+
# Create the module object from the spec
|
|
15
|
+
module_spec = importlib.util.spec_from_file_location(module_name, Path(module_path))
|
|
16
|
+
logger.info(f"##### module_spec: {module_spec}")
|
|
17
|
+
# Load the module
|
|
18
|
+
custom_module = importlib.util.module_from_spec(module_spec)
|
|
19
|
+
|
|
20
|
+
# Optionally add the module to sys.modules so it's treated as a normal import
|
|
21
|
+
if add_to_import_system:
|
|
22
|
+
sys.modules[module_name] = custom_module
|
|
23
|
+
|
|
24
|
+
module_spec.loader.exec_module(custom_module)
|
|
25
|
+
|
|
26
|
+
# The module is callable: `custom_module.some_function()`
|
|
27
|
+
return custom_module
|
|
28
|
+
|
|
29
|
+
# Note that, typically, this is not recommended for python projects; Modules located within the directory that is added to the search path can be imported.
|
|
30
|
+
def modify_venv_pythonpath(*, pth_filename = "imported-project-modules.pth", absolute_pkg_path = None, installed_pkg_name = None):
|
|
31
|
+
site_dir = site.getsitepackages()[0]
|
|
32
|
+
logger.info(f"########## site_dir: {site_dir}")
|
|
33
|
+
|
|
34
|
+
if absolute_pkg_path:
|
|
35
|
+
pkg_path = absolute_pkg_path
|
|
36
|
+
elif installed_pkg_name:
|
|
37
|
+
pkg_path = f"{site_dir}/{installed_pkg_name}"
|
|
38
|
+
else:
|
|
39
|
+
raise Exception("ERROR: absolute_pkg_path or installed_pkg_name is required")
|
|
40
|
+
|
|
41
|
+
# Create/write to a .pth file, listing the path of the package to import:
|
|
42
|
+
site_pkgs_pth_filepath = f"{site_dir}/{pth_filename}"
|
|
43
|
+
try:
|
|
44
|
+
with open(site_pkgs_pth_filepath, 'r') as file:
|
|
45
|
+
lines = [line.strip() for line in file]
|
|
46
|
+
except Exception as e:
|
|
47
|
+
logger.error(e)
|
|
48
|
+
lines = []
|
|
49
|
+
|
|
50
|
+
logger.info(f"########## pkg_path: {pkg_path}")
|
|
51
|
+
logger.info(f"########## lines: {lines}")
|
|
52
|
+
|
|
53
|
+
if pkg_path not in lines:
|
|
54
|
+
with open(site_pkgs_pth_filepath, 'a') as file:
|
|
55
|
+
if pkg_path not in lines:
|
|
56
|
+
logger.info(f"########## writing to site-pkgs .pth; pkg_path: {pkg_path}")
|
|
57
|
+
file.write(pkg_path + '\n')
|
|
58
|
+
|
|
59
|
+
# Add the package:
|
|
60
|
+
known_paths = set(sys.path)
|
|
61
|
+
logger.info(f"########## known_paths: {known_paths}")
|
|
62
|
+
site.addpackage(site_dir, site_pkgs_pth_filepath, known_paths)
|
|
63
|
+
if pkg_path in os.listdir(site_dir):
|
|
64
|
+
logger.info(f"########## `{pkg_path}` package added to the Python packages search system path")
|
|
File without changes
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import requests
|
|
3
|
+
import tomllib
|
|
4
|
+
import tomli_w
|
|
5
|
+
import argparse
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# ENV VARS
|
|
10
|
+
PYPI_BASE_URL = "https://pypi.org/simple/"
|
|
11
|
+
VERSIONING = "manual"
|
|
12
|
+
|
|
13
|
+
# ARGS
|
|
14
|
+
parser = argparse.ArgumentParser()
|
|
15
|
+
parser.add_argument('-v', '--versioning', default="manual", help='Options: "automatic", "dynamic", "manual"')
|
|
16
|
+
args = parser.parse_args()
|
|
17
|
+
|
|
18
|
+
# LOGGING
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
logging.basicConfig(level=logging.INFO)
|
|
21
|
+
|
|
22
|
+
def get_pypi_repository_data(toml_data):
|
|
23
|
+
# Retrieve latest version from PyPI API data
|
|
24
|
+
# TODO: [START] replace
|
|
25
|
+
# project_name = toml_data["project"]["name"]
|
|
26
|
+
project_name = "my_simple_test"
|
|
27
|
+
# TODO: [END] replace
|
|
28
|
+
pypi_project_url = f"{PYPI_BASE_URL}{project_name}"
|
|
29
|
+
resp = requests.get(pypi_project_url, headers={"Accept": "application/vnd.pypi.simple.v1+json"}).json()
|
|
30
|
+
logging.info(f"########################## pypi_project_url: {pypi_project_url}")
|
|
31
|
+
|
|
32
|
+
project_versions = resp["versions"]
|
|
33
|
+
project_versions.sort(reverse=True)
|
|
34
|
+
project_latest_version = project_versions[0]
|
|
35
|
+
|
|
36
|
+
return {"project_name": project_name, "pypi_project_url": pypi_project_url, "project_versions": project_versions, "project_latest_version": project_latest_version}
|
|
37
|
+
|
|
38
|
+
def update_pyproject_config(toml_data):
|
|
39
|
+
with open("pyproject.toml", "wb") as f:
|
|
40
|
+
tomli_w.dump(toml_data, f)
|
|
41
|
+
|
|
42
|
+
def set_version_manually(toml_data):
|
|
43
|
+
if "version" in toml_data["project"]["dynamic"]:
|
|
44
|
+
toml_data["project"]["dynamic"].remove("version")
|
|
45
|
+
update_pyproject_config(toml_data)
|
|
46
|
+
|
|
47
|
+
logging.info("Manual versioning selected. Please update the version number in pyproject.toml manually.")
|
|
48
|
+
|
|
49
|
+
def set_version_dynamically(toml_data):
|
|
50
|
+
if "version" in toml_data["project"]:
|
|
51
|
+
del toml_data["project"]["version"]
|
|
52
|
+
update_pyproject_config(toml_data)
|
|
53
|
+
|
|
54
|
+
if "version" not in toml_data["project"]["dynamic"]:
|
|
55
|
+
toml_data["project"]["dynamic"].append("version")
|
|
56
|
+
update_pyproject_config(toml_data)
|
|
57
|
+
|
|
58
|
+
logging.info("Dynamic versioning selected. Please set the version number in the 'version.txt' file.")
|
|
59
|
+
|
|
60
|
+
def set_version_automatically(toml_data):
|
|
61
|
+
project_name, pypi_project_url, project_versions, project_latest_version = get_pypi_repository_data(toml_data).values()
|
|
62
|
+
|
|
63
|
+
# Change the version number
|
|
64
|
+
project_versioning_list = project_latest_version.split(".")
|
|
65
|
+
project_versioning_list[2] = f"{int(project_versioning_list[2]) + 1}"
|
|
66
|
+
logger.info(f"############## project_versioning_list: {project_versioning_list}")
|
|
67
|
+
new_project_version = '.'.join(project_versioning_list)
|
|
68
|
+
logger.info(f"############## new_project_version: {new_project_version}")
|
|
69
|
+
|
|
70
|
+
# Write the new version number
|
|
71
|
+
toml_data["project"]["version"] = new_project_version
|
|
72
|
+
if "version" in toml_data["project"]["dynamic"]:
|
|
73
|
+
toml_data["project"]["dynamic"].remove("version")
|
|
74
|
+
update_pyproject_config(toml_data)
|
|
75
|
+
logging.info(f"Automatic versioning selected. Version number updated to {new_project_version} in pyproject.toml.")
|
|
76
|
+
|
|
77
|
+
def incremental_versioning(versioning):
|
|
78
|
+
# Read project data from pyproject.toml
|
|
79
|
+
with open("pyproject.toml", "rb") as f:
|
|
80
|
+
toml_data = tomllib.load(f)
|
|
81
|
+
logger.info(f"############ toml_data: {toml_data}")
|
|
82
|
+
|
|
83
|
+
if "version" not in toml_data["project"]:
|
|
84
|
+
toml_data["project"]["version"] = []
|
|
85
|
+
update_pyproject_config(toml_data)
|
|
86
|
+
|
|
87
|
+
if "dynamic" not in toml_data["project"]:
|
|
88
|
+
toml_data["project"]["dynamic"] = []
|
|
89
|
+
update_pyproject_config(toml_data)
|
|
90
|
+
|
|
91
|
+
logging.info(f"######## Project: {get_pypi_repository_data(toml_data)['project_name']}")
|
|
92
|
+
logging.info(f"######## Version: {get_pypi_repository_data(toml_data)['project_latest_version']}")
|
|
93
|
+
|
|
94
|
+
if versioning == "manual":
|
|
95
|
+
set_version_manually(toml_data)
|
|
96
|
+
elif versioning == "dynamic":
|
|
97
|
+
set_version_dynamically(toml_data)
|
|
98
|
+
elif versioning == "automatic":
|
|
99
|
+
set_version_automatically(toml_data)
|
|
100
|
+
else:
|
|
101
|
+
set_version_manually(toml_data)
|
|
102
|
+
logging.info("Defaulting to manual versioning. Options: 'automatic', 'dynamic', 'manual'")
|
|
103
|
+
|
|
104
|
+
if __name__ == "__main__":
|
|
105
|
+
# TODO: replace in python-flask-dev pkg; passed in as var
|
|
106
|
+
versioning = args.versioning
|
|
107
|
+
incremental_versioning(versioning)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
# Get project root
|
|
6
|
+
project_root = Path(os.getenv('VIRTUAL_ENV')).parent.absolute()
|
|
7
|
+
|
|
8
|
+
# Filter for subfolders
|
|
9
|
+
def filter_for_subfolders(folder, filter_str=""):
|
|
10
|
+
subfolders = [ f.path for f in os.scandir(folder) if f.is_dir() and f.name.endswith(filter_str) ]
|
|
11
|
+
return subfolders
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: python-flask-dev
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Package containing modules with 'helper' functions to support the development of Python Flask applications.
|
|
5
|
+
Author-email: Dani <daniasestan@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
9
|
+
Classifier: Framework :: Flask
|
|
10
|
+
Requires-Python: >=3.12.3
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
Requires-Dist: Flask==3.1.2
|
|
13
|
+
Requires-Dist: numpy==2.4.2
|
|
14
|
+
Requires-Dist: pandas==3.0.1
|
|
15
|
+
Requires-Dist: build==1.4.0
|
|
16
|
+
Requires-Dist: twine==6.2.0
|
|
17
|
+
|
|
18
|
+
## Python Flask Dev
|
|
19
|
+
|
|
20
|
+
## Table of contents
|
|
21
|
+
|
|
22
|
+
1. Project description
|
|
23
|
+
2. Project setup
|
|
24
|
+
3. Contributing guidelines
|
|
25
|
+
4. Project documentation
|
|
26
|
+
5. Links to support resources
|
|
27
|
+
6. Terms of use
|
|
28
|
+
|
|
29
|
+
## Project description
|
|
30
|
+
|
|
31
|
+
### What kind of software is this?
|
|
32
|
+
|
|
33
|
+
Package containing modules with 'helper' functions to support the development of Python Flask applications.
|
|
34
|
+
|
|
35
|
+
__________________
|
|
36
|
+
|
|
37
|
+
### Who can use this app?
|
|
38
|
+
|
|
39
|
+
Python Flask App Developer
|
|
40
|
+
|
|
41
|
+
__________________
|
|
42
|
+
|
|
43
|
+
### Project overview
|
|
44
|
+
|
|
45
|
+
Language(s): [Python](https://www.python.org/)
|
|
46
|
+
|
|
47
|
+
Framework(s): [Python Flask Framework](https://flask.palletsprojects.com/en/stable/)
|
|
48
|
+
|
|
49
|
+
Style guide(s):
|
|
50
|
+
[Python PEP 8](https://www.python.org/dev/peps/pep-0008)
|
|
51
|
+
|
|
52
|
+
## Project setup
|
|
53
|
+
|
|
54
|
+
### Pre-requisites
|
|
55
|
+
|
|
56
|
+
Before using {Project name}, install necessary pkgs:
|
|
57
|
+
|
|
58
|
+
* [PKG_NAME](https://www.python.org/downloads/)
|
|
59
|
+
* [...]
|
|
60
|
+
|
|
61
|
+
### Requirements
|
|
62
|
+
|
|
63
|
+
GitHub will automatically not push any tokens.
|
|
64
|
+
|
|
65
|
+
However, to commit any changes the .gitignore file must include any files that contain credentials.
|
|
66
|
+
|
|
67
|
+
If the Markdown Changelog Generator is used, it needs to include 'changelog_generator.toml' because it lists your GitHub repo's PAT (Personal Access Token).
|
|
68
|
+
|
|
69
|
+
#### Install Python Flask Dev
|
|
70
|
+
|
|
71
|
+
1. {Write the step here.}
|
|
72
|
+
|
|
73
|
+
{Explanatory text here}
|
|
74
|
+
|
|
75
|
+
{Optional: Include a code sample or screenshot that helps your users complete this step}
|
|
76
|
+
|
|
77
|
+
2. {Write the step here.}
|
|
78
|
+
|
|
79
|
+
a. {Substep 1}
|
|
80
|
+
|
|
81
|
+
b. {Substep 2}
|
|
82
|
+
|
|
83
|
+
#### Configure Python Flask Dev
|
|
84
|
+
|
|
85
|
+
1. {Write the step here.}
|
|
86
|
+
2. {Write the step here.}
|
|
87
|
+
|
|
88
|
+
#### Run Python Flask Dev
|
|
89
|
+
|
|
90
|
+
1. {Write the step here.}
|
|
91
|
+
2. {Write the step here.}
|
|
92
|
+
|
|
93
|
+
#### Troubleshoot Python Flask Dev
|
|
94
|
+
|
|
95
|
+
1. {Write the step here.}
|
|
96
|
+
2. {Write the step here.}
|
|
97
|
+
|
|
98
|
+
<table>
|
|
99
|
+
<tr>
|
|
100
|
+
<td>
|
|
101
|
+
Issue
|
|
102
|
+
</td>
|
|
103
|
+
<td>
|
|
104
|
+
Solution
|
|
105
|
+
</td>
|
|
106
|
+
</tr>
|
|
107
|
+
<tr>
|
|
108
|
+
<td>
|
|
109
|
+
{Describe the issue here}
|
|
110
|
+
</td>
|
|
111
|
+
<td>
|
|
112
|
+
{Write solution here}
|
|
113
|
+
</td>
|
|
114
|
+
</tr>
|
|
115
|
+
<tr>
|
|
116
|
+
<td>
|
|
117
|
+
{Describe the issue here}
|
|
118
|
+
</td>
|
|
119
|
+
<td>
|
|
120
|
+
{Write solution here}
|
|
121
|
+
</td>
|
|
122
|
+
</tr>
|
|
123
|
+
<tr>
|
|
124
|
+
<td>
|
|
125
|
+
{Describe the issue here}
|
|
126
|
+
</td>
|
|
127
|
+
<td>
|
|
128
|
+
{Write solution here}
|
|
129
|
+
</td>
|
|
130
|
+
</tr>
|
|
131
|
+
</table>
|
|
132
|
+
|
|
133
|
+
Other troubleshooting support:
|
|
134
|
+
|
|
135
|
+
* {Link to FAQs}
|
|
136
|
+
* {Link to runbooks}
|
|
137
|
+
* {Link to other relevant support information}
|
|
138
|
+
|
|
139
|
+
### Recommendations
|
|
140
|
+
|
|
141
|
+
* When working through a smaller project such as a program or a software application, a Changelog is recommended.
|
|
142
|
+
|
|
143
|
+
Changelog entries typically follow a basic format that includes information about the code that was added to enhance a project, removed for any purpose, and modified to resolve errors.
|
|
144
|
+
|
|
145
|
+
Changelog entries are entered in the CHANGELOG file once code is committed to the main branch:
|
|
146
|
+
|
|
147
|
+
### [VERSION #] - [TIMESTAMP]
|
|
148
|
+
|
|
149
|
+
#### [ADDED || REMOVED || FIXED]
|
|
150
|
+
|
|
151
|
+
\<DESCRIPTION\>
|
|
152
|
+
|
|
153
|
+
___
|
|
154
|
+
|
|
155
|
+
### Version Control Process
|
|
156
|
+
I. **Create a Feature Branch**
|
|
157
|
+
Any code updates for a version change -- [Major].[Minor].[Patch] -- should be on a separate branch, referred to as a 'feature' branch.
|
|
158
|
+
|
|
159
|
+
Once work on the branch is completed, a pull-request can be created to merge the branch into `dev`, a staging/pre-release branch, where those changes are tested.
|
|
160
|
+
|
|
161
|
+
Once the staging branch is tested, stable code can be merged into `main` a production/release branch.
|
|
162
|
+
|
|
163
|
+
________________
|
|
164
|
+
##### Maintaining repos
|
|
165
|
+
|
|
166
|
+
###### Branch Naming Conventions
|
|
167
|
+
|
|
168
|
+
`<VERSION-RELEASE-#>/<FEATURE_NAME>/<CONTRIBUTOR>`
|
|
169
|
+
|
|
170
|
+
- `<VERSION-RELEASE-#>`: Refer to [SemVer](https://semver.org/) for details
|
|
171
|
+
|
|
172
|
+
- `<FEATURE_NAME>`: Descriptive title for the feature
|
|
173
|
+
|
|
174
|
+
- `<CONTRIBUTOR>`: GitHub account name, e.g., https://github.com/<NAME>
|
|
175
|
+
|
|
176
|
+
IV. **Documenting changes**
|
|
177
|
+
|
|
178
|
+
Maintaining a CHANGELOG file is always recommended for a quick overview of how the project is progressing.
|
|
179
|
+
1. Checkout main locally.
|
|
180
|
+
2. From a terminal session, run the commands to use the GitHub ChangeLog Generator.
|
|
181
|
+
3. Commit the CHANGELOG file to the remote branch.
|
|
182
|
+
|
|
183
|
+
`changelog-generator-md`
|
|
184
|
+
|
|
185
|
+
## Project documentation
|
|
186
|
+
|
|
187
|
+
### Standard project docs are located in the `{PROJECT_ROOT}` folder.
|
|
188
|
+
|
|
189
|
+
- README
|
|
190
|
+
- LICENSE
|
|
191
|
+
- CHANGELOG
|
|
192
|
+
- Refer to the Project dependencies section of the README for more information on generating a CHANGELOG file
|
|
193
|
+
|
|
194
|
+
## Links
|
|
195
|
+
|
|
196
|
+
* [<LINK>](<URL>): <LINK_DESC>
|
|
197
|
+
* [...]
|
|
198
|
+
|
|
199
|
+
## Terms of use
|
|
200
|
+
|
|
201
|
+
Python Flask Dev is licensed under [MIT](https://commons.wikimedia.org/wiki/Template:X11)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
app.py,sha256=-C1PWJ1n-wBA-tiePmkPIupFodGgELwNHP0hujKCNVw,7113
|
|
3
|
+
data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
python_flask_dev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
python_flask_dev/custom_exceptions.py,sha256=VYcq3LAv-Xohe_EoP7YJsXQAIvDhiyHsyRAxj0VfR_c,443
|
|
6
|
+
python_flask_dev/data_source.py,sha256=QtBSlleKoGqAq751xNh2G2ZIQwEIzHpre5jDvGzJszA,1109
|
|
7
|
+
python_flask_dev/filtering_data.py,sha256=hB6M-anMztg1Nhi6ilxGBYMEpqUMKGmmGoS0vkeNx2o,8583
|
|
8
|
+
python_flask_dev/formatting_data.py,sha256=bGTNnvRaACn_E44-03CoQ9Fc_oK3_aISROaLLJZLdKg,209
|
|
9
|
+
python_flask_dev/importing_modules.py,sha256=rsRPM46WdeNGiVlp_xbpMucRWLLaE6fA37gFqo3Y9R0,2532
|
|
10
|
+
python_flask_dev/path_retrieval.py,sha256=8jmSCJ5SKKvtjI6lQtr9gQH6RIFDU9_ouiL2GsaXb00,319
|
|
11
|
+
python_flask_dev/packaging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
python_flask_dev/packaging/incremental_versioning.py,sha256=LasMc3G1YFFG5qJnjDOj6-5BM9fQrB1v9r6q7MeMYHI,4243
|
|
13
|
+
python_flask_dev-0.0.1.dist-info/METADATA,sha256=zqohdrLvKgsXeZNd5OTAmhyv9Wu4yGhGoRkkSZX3n70,4775
|
|
14
|
+
python_flask_dev-0.0.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
15
|
+
python_flask_dev-0.0.1.dist-info/top_level.txt,sha256=LhLe2esd0pDfth_R0Ai8vfZMgucbwmfJAEpJla6Vk8w,35
|
|
16
|
+
python_flask_dev-0.0.1.dist-info/RECORD,,
|