datablender 0.0.1__tar.gz
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.
- datablender-0.0.1/PKG-INFO +68 -0
- datablender-0.0.1/README.md +24 -0
- datablender-0.0.1/datablender/__init__.py +68 -0
- datablender-0.0.1/datablender/base/__init__.py +283 -0
- datablender-0.0.1/datablender/base/connection.py +370 -0
- datablender-0.0.1/datablender/base/data.py +1856 -0
- datablender-0.0.1/datablender/base/dataConfiguration.py +701 -0
- datablender-0.0.1/datablender/base/dataElement.py +584 -0
- datablender-0.0.1/datablender/base/dataLogging.py +702 -0
- datablender-0.0.1/datablender/base/dataSets.py +233 -0
- datablender-0.0.1/datablender/base/directory.py +225 -0
- datablender-0.0.1/datablender/base/file.py +496 -0
- datablender-0.0.1/datablender/base/queryBuilder.py +1498 -0
- datablender-0.0.1/datablender/base/request.py +182 -0
- datablender-0.0.1/datablender/base/text.py +79 -0
- datablender-0.0.1/datablender/base/web.py +602 -0
- datablender-0.0.1/datablender/data/__init__.py +124 -0
- datablender-0.0.1/datablender/data/asyncDataProcess.py +1047 -0
- datablender-0.0.1/datablender/data/asyncDataServer.py +538 -0
- datablender-0.0.1/datablender/data/asyncDataSourceCore.py +1971 -0
- datablender-0.0.1/datablender/data/dataDirectory.py +1540 -0
- datablender-0.0.1/datablender/data/dataFile.py +635 -0
- datablender-0.0.1/datablender/data/dataProcess.py +639 -0
- datablender-0.0.1/datablender/data/dataServer.py +488 -0
- datablender-0.0.1/datablender/data/dataSource.py +647 -0
- datablender-0.0.1/datablender/data/dataSourceCore.py +1318 -0
- datablender-0.0.1/datablender/data/dataVersion.py +1526 -0
- datablender-0.0.1/datablender/data/directoryElementController.py +172 -0
- datablender-0.0.1/datablender/data/filesTable.py +219 -0
- datablender-0.0.1/datablender/database/__init__.py +26 -0
- datablender-0.0.1/datablender/database/database.py +1151 -0
- datablender-0.0.1/datablender/database/elementSQL.py +1093 -0
- datablender-0.0.1/datablender/database/extension.py +265 -0
- datablender-0.0.1/datablender/database/function.py +324 -0
- datablender-0.0.1/datablender/database/partition.py +26 -0
- datablender-0.0.1/datablender/database/role.py +385 -0
- datablender-0.0.1/datablender/database/schema.py +1009 -0
- datablender-0.0.1/datablender/database/table.py +2274 -0
- datablender-0.0.1/datablender/database/view.py +848 -0
- datablender-0.0.1/datablender/tests/__init__.py +8 -0
- datablender-0.0.1/datablender/tests/test_base.py +1604 -0
- datablender-0.0.1/datablender/tests/test_data.py +3346 -0
- datablender-0.0.1/datablender/tests/test_database.py +799 -0
- datablender-0.0.1/datablender.egg-info/PKG-INFO +68 -0
- datablender-0.0.1/datablender.egg-info/SOURCES.txt +49 -0
- datablender-0.0.1/datablender.egg-info/dependency_links.txt +1 -0
- datablender-0.0.1/datablender.egg-info/not-zip-safe +1 -0
- datablender-0.0.1/datablender.egg-info/requires.txt +30 -0
- datablender-0.0.1/datablender.egg-info/top_level.txt +1 -0
- datablender-0.0.1/setup.cfg +4 -0
- datablender-0.0.1/setup.py +52 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: datablender
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Tools for data.
|
|
5
|
+
Home-page: https://github.com/MontrealMobilite/datablender.git
|
|
6
|
+
Author: Julien Douville
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: unidecode
|
|
9
|
+
Requires-Dist: aiohttp
|
|
10
|
+
Requires-Dist: asyncpg
|
|
11
|
+
Requires-Dist: sqlalchemy
|
|
12
|
+
Requires-Dist: psycopg2
|
|
13
|
+
Requires-Dist: datetime
|
|
14
|
+
Requires-Dist: numpy
|
|
15
|
+
Requires-Dist: pandas
|
|
16
|
+
Requires-Dist: dbf
|
|
17
|
+
Requires-Dist: openpyxl
|
|
18
|
+
Requires-Dist: pyexcel
|
|
19
|
+
Requires-Dist: xlrd
|
|
20
|
+
Requires-Dist: beautifulsoup4
|
|
21
|
+
Requires-Dist: selenium
|
|
22
|
+
Requires-Dist: webdriver_manager
|
|
23
|
+
Requires-Dist: postgis
|
|
24
|
+
Requires-Dist: python-socketio
|
|
25
|
+
Requires-Dist: dbfread
|
|
26
|
+
Requires-Dist: scipy
|
|
27
|
+
Requires-Dist: scikit-learn
|
|
28
|
+
Requires-Dist: pyproj
|
|
29
|
+
Requires-Dist: fiona
|
|
30
|
+
Requires-Dist: geopandas
|
|
31
|
+
Requires-Dist: dill
|
|
32
|
+
Requires-Dist: pysmb
|
|
33
|
+
Provides-Extra: dev
|
|
34
|
+
Requires-Dist: pytest; extra == "dev"
|
|
35
|
+
Requires-Dist: build; extra == "dev"
|
|
36
|
+
Requires-Dist: twine; extra == "dev"
|
|
37
|
+
Dynamic: author
|
|
38
|
+
Dynamic: description
|
|
39
|
+
Dynamic: description-content-type
|
|
40
|
+
Dynamic: home-page
|
|
41
|
+
Dynamic: provides-extra
|
|
42
|
+
Dynamic: requires-dist
|
|
43
|
+
Dynamic: summary
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# Data blender
|
|
48
|
+
Data utils is a python package for data utilities.
|
|
49
|
+
## Develop
|
|
50
|
+
### Install
|
|
51
|
+
* Install anaconda
|
|
52
|
+
```conda create --name dev```
|
|
53
|
+
```conda install pip```
|
|
54
|
+
```pip install --user -e .[dev]```
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
### Publish package
|
|
58
|
+
```python -m build```
|
|
59
|
+
```python -m twine upload dist/*```
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# Install the package locally
|
|
65
|
+
```pip install -r requirements.txt --user```
|
|
66
|
+
|
|
67
|
+
on the VM
|
|
68
|
+
"C:/Program Files/INRO/Emme/Emme 4/Emme-23.00.01.23/Python37/python.exe" -m pip install -r requirements.txt --user
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
# Data blender
|
|
4
|
+
Data utils is a python package for data utilities.
|
|
5
|
+
## Develop
|
|
6
|
+
### Install
|
|
7
|
+
* Install anaconda
|
|
8
|
+
```conda create --name dev```
|
|
9
|
+
```conda install pip```
|
|
10
|
+
```pip install --user -e .[dev]```
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Publish package
|
|
14
|
+
```python -m build```
|
|
15
|
+
```python -m twine upload dist/*```
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Install the package locally
|
|
21
|
+
```pip install -r requirements.txt --user```
|
|
22
|
+
|
|
23
|
+
on the VM
|
|
24
|
+
"C:/Program Files/INRO/Emme/Emme 4/Emme-23.00.01.23/Python37/python.exe" -m pip install -r requirements.txt --user
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from datablender.base import (
|
|
6
|
+
File,
|
|
7
|
+
Connection,
|
|
8
|
+
readFile,
|
|
9
|
+
getNextID,
|
|
10
|
+
normalize_user_name,
|
|
11
|
+
Directory,
|
|
12
|
+
DirectoryElement,
|
|
13
|
+
ZipFile_,
|
|
14
|
+
Text,
|
|
15
|
+
formatText,
|
|
16
|
+
Request,
|
|
17
|
+
Bot,
|
|
18
|
+
BotAction,
|
|
19
|
+
WebElement,
|
|
20
|
+
QueryBuilder,
|
|
21
|
+
DataConfiguration,
|
|
22
|
+
DataLogging,
|
|
23
|
+
DataEventsTable,
|
|
24
|
+
DataElement,
|
|
25
|
+
Data,
|
|
26
|
+
AsyncConnection,
|
|
27
|
+
AsyncDataConfiguration,
|
|
28
|
+
AsyncRequest,
|
|
29
|
+
DataSets
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
from datablender.database import (
|
|
33
|
+
DatabaseElement,
|
|
34
|
+
SchemaElement,
|
|
35
|
+
Database,
|
|
36
|
+
Extension,
|
|
37
|
+
Role,
|
|
38
|
+
Schema,
|
|
39
|
+
Table,
|
|
40
|
+
View,
|
|
41
|
+
Function,
|
|
42
|
+
AsyncView,
|
|
43
|
+
AsyncTable,
|
|
44
|
+
AsyncDatabase
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
from datablender.data import (
|
|
48
|
+
DataVersion,
|
|
49
|
+
DataVersionColumn,
|
|
50
|
+
DataVersionTable,
|
|
51
|
+
DataVersionValue,
|
|
52
|
+
DataSource,
|
|
53
|
+
DataFetcher,
|
|
54
|
+
RawDataFile,
|
|
55
|
+
DirectoryElementController,
|
|
56
|
+
DataProcess,
|
|
57
|
+
FilesTable,
|
|
58
|
+
DataFile,
|
|
59
|
+
DataDirectory,
|
|
60
|
+
DataDirectoryElement,
|
|
61
|
+
DataZipFile,
|
|
62
|
+
DataSourceCore,
|
|
63
|
+
DataServer,
|
|
64
|
+
importData,
|
|
65
|
+
AsyncDataServer,
|
|
66
|
+
AsyncDataSource,
|
|
67
|
+
AsyncDataProcess
|
|
68
|
+
)
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"""
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
from typing import Callable,Tuple
|
|
5
|
+
import types
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import numpy
|
|
10
|
+
import pandas
|
|
11
|
+
|
|
12
|
+
import importlib
|
|
13
|
+
import importlib.util
|
|
14
|
+
|
|
15
|
+
def getDirectoryElementName(
|
|
16
|
+
path:str=None,
|
|
17
|
+
directory_name:str=None,
|
|
18
|
+
element_name:str=None
|
|
19
|
+
) -> Tuple[str,str]:
|
|
20
|
+
"""Get directory name and data directory element name from path.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
path (str, optional): Path. Defaults to None.
|
|
24
|
+
directory_name (str, optional): Directory name. Defaults to None.
|
|
25
|
+
element_name (str, optional): Directory element name. Defaults to None.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
Tuple[str,str]: Directory name and directory element name.
|
|
29
|
+
"""
|
|
30
|
+
if path:
|
|
31
|
+
return os.path.dirname(
|
|
32
|
+
os.path.normpath(path)
|
|
33
|
+
),os.path.basename(
|
|
34
|
+
os.path.normpath(path)
|
|
35
|
+
)
|
|
36
|
+
elif directory_name and element_name:
|
|
37
|
+
return directory_name,element_name
|
|
38
|
+
|
|
39
|
+
from datablender.base.file import File,ZipFile_
|
|
40
|
+
from datablender.base.directory import Directory,DirectoryElement
|
|
41
|
+
from datablender.base.text import Text,formatText
|
|
42
|
+
from datablender.base.request import Request, AsyncRequest
|
|
43
|
+
|
|
44
|
+
def normalize_user_name(user_name:str):
|
|
45
|
+
return user_name.split(' ')[0]
|
|
46
|
+
|
|
47
|
+
def getNextID(elements:list,id_attribute_name:str='id') -> int:
|
|
48
|
+
"""Get next id in a list of dictionnary.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
elements (list): List of dictionnary.
|
|
52
|
+
id_attribute_name (str, optional): Id attribute name. Defaults to 'id'.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
int: Next id.
|
|
56
|
+
"""
|
|
57
|
+
ids = numpy.append(
|
|
58
|
+
numpy.array([element[id_attribute_name] for element in elements]),
|
|
59
|
+
numpy.nan
|
|
60
|
+
)
|
|
61
|
+
df = pandas.DataFrame({
|
|
62
|
+
'column':numpy.sort(ids),
|
|
63
|
+
'ids':numpy.arange(1,ids.size+1,1)
|
|
64
|
+
})
|
|
65
|
+
return df.loc[df['column']!=df['ids'],'ids'].min()
|
|
66
|
+
|
|
67
|
+
def readFile(
|
|
68
|
+
path:str=None,
|
|
69
|
+
directory_name:str=None,
|
|
70
|
+
file_name:str=None,
|
|
71
|
+
**kwargs
|
|
72
|
+
) -> pandas.DataFrame:
|
|
73
|
+
return File(
|
|
74
|
+
directory_name,
|
|
75
|
+
file_name,
|
|
76
|
+
path
|
|
77
|
+
).read(
|
|
78
|
+
**kwargs
|
|
79
|
+
).content
|
|
80
|
+
|
|
81
|
+
def getFunction(
|
|
82
|
+
function_name:str,
|
|
83
|
+
directory_name:str,
|
|
84
|
+
module:str='__init__',
|
|
85
|
+
code:str = None,
|
|
86
|
+
schema_name:str = None,
|
|
87
|
+
schema_type:str = None
|
|
88
|
+
) -> Callable:
|
|
89
|
+
|
|
90
|
+
if module is None:
|
|
91
|
+
module = '__init__'
|
|
92
|
+
|
|
93
|
+
if directory_name is None:
|
|
94
|
+
directory_name = os.path.join(
|
|
95
|
+
os.getenv(
|
|
96
|
+
'code_directory',
|
|
97
|
+
os.getcwd()
|
|
98
|
+
),
|
|
99
|
+
schema_type,
|
|
100
|
+
schema_name
|
|
101
|
+
)
|
|
102
|
+
os.makedirs(
|
|
103
|
+
directory_name,
|
|
104
|
+
exist_ok=True
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
if code is not None:
|
|
108
|
+
File(
|
|
109
|
+
directory_name,
|
|
110
|
+
os.path.join(directory_name,'{}.py'.format(module))
|
|
111
|
+
).write(code)
|
|
112
|
+
|
|
113
|
+
spec = importlib.util.spec_from_file_location(
|
|
114
|
+
module,
|
|
115
|
+
os.path.join(directory_name,'{}.py'.format(module))
|
|
116
|
+
)
|
|
117
|
+
module = importlib.util.module_from_spec(spec)
|
|
118
|
+
spec.loader.exec_module(module)
|
|
119
|
+
return getattr(module, function_name)
|
|
120
|
+
|
|
121
|
+
def getModule(
|
|
122
|
+
directory_name:str,
|
|
123
|
+
module:str='__init__',
|
|
124
|
+
package_name:str = None,
|
|
125
|
+
schema_name:str = None,
|
|
126
|
+
schema_type:str = None
|
|
127
|
+
) -> types.ModuleType:
|
|
128
|
+
|
|
129
|
+
original_path = os.getcwd()
|
|
130
|
+
|
|
131
|
+
if package_name:
|
|
132
|
+
module = package_name
|
|
133
|
+
else:
|
|
134
|
+
if module is None:
|
|
135
|
+
module = '__init__'
|
|
136
|
+
|
|
137
|
+
if directory_name is None:
|
|
138
|
+
directory_name = os.path.join(
|
|
139
|
+
os.getenv(
|
|
140
|
+
'CODE_DIRECTORY',
|
|
141
|
+
os.getcwd()
|
|
142
|
+
),
|
|
143
|
+
schema_type,
|
|
144
|
+
schema_name
|
|
145
|
+
)
|
|
146
|
+
os.makedirs(
|
|
147
|
+
directory_name,
|
|
148
|
+
exist_ok=True
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# os.chdir(directory_name)
|
|
152
|
+
sys.path.append(directory_name)
|
|
153
|
+
|
|
154
|
+
module = importlib.import_module(module)
|
|
155
|
+
|
|
156
|
+
# spec = importlib.util.spec_from_file_location(
|
|
157
|
+
# module,
|
|
158
|
+
# os.path.join(directory_name,'{}.py'.format(module))
|
|
159
|
+
# )
|
|
160
|
+
# module = importlib.util.module_from_spec(spec)
|
|
161
|
+
# spec.loader.exec_module(module)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
sys.path.append(original_path)
|
|
165
|
+
|
|
166
|
+
return module
|
|
167
|
+
|
|
168
|
+
def manageQuery(
|
|
169
|
+
name:str=None,
|
|
170
|
+
query:str=None,
|
|
171
|
+
file_name:str=None,
|
|
172
|
+
directory_name:str=None,
|
|
173
|
+
schema_name:str=None,
|
|
174
|
+
schema_type:str= None,
|
|
175
|
+
data_config_is_active:bool=None
|
|
176
|
+
) -> Tuple[str,str,str]:
|
|
177
|
+
|
|
178
|
+
if query is not None:
|
|
179
|
+
if data_config_is_active:
|
|
180
|
+
if file_name is None and directory_name is None and name is not None:
|
|
181
|
+
file_name = name+'.sql'
|
|
182
|
+
directory_name = os.path.join(
|
|
183
|
+
os.getenv(
|
|
184
|
+
'CODE_DIRECTORY',
|
|
185
|
+
os.getcwd()
|
|
186
|
+
),
|
|
187
|
+
schema_type,
|
|
188
|
+
schema_name,
|
|
189
|
+
'queries'
|
|
190
|
+
)
|
|
191
|
+
os.makedirs(
|
|
192
|
+
directory_name,
|
|
193
|
+
exist_ok=True
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
File(
|
|
197
|
+
directory_name,
|
|
198
|
+
file_name
|
|
199
|
+
).write(query)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
# if os.path.isfile(os.path.join(os.path.abspath(directory_name),file_name)):
|
|
203
|
+
# query = File(
|
|
204
|
+
# directory_name,
|
|
205
|
+
# file_name
|
|
206
|
+
# ).read().content
|
|
207
|
+
|
|
208
|
+
# if directory_name is None:
|
|
209
|
+
|
|
210
|
+
# directory_name = os.getenv(
|
|
211
|
+
# 'CODE_DIRECTORY',
|
|
212
|
+
# os.getcwd()
|
|
213
|
+
# )
|
|
214
|
+
|
|
215
|
+
# if schema_name:
|
|
216
|
+
# new_directory_name = os.path.join(
|
|
217
|
+
# directory_name,
|
|
218
|
+
# schema_type,
|
|
219
|
+
# schema_name,
|
|
220
|
+
# 'queries'
|
|
221
|
+
# )
|
|
222
|
+
# if os.path.isdir(new_directory_name):
|
|
223
|
+
# directory_name = new_directory_name
|
|
224
|
+
|
|
225
|
+
# elif not os.path.isdir(directory_name):
|
|
226
|
+
# new_directory_name = os.path.join(
|
|
227
|
+
# os.getenv('CODE_DIRECTORY',os.getcwd()),
|
|
228
|
+
# directory_name
|
|
229
|
+
# )
|
|
230
|
+
# if os.path.isdir(new_directory_name):
|
|
231
|
+
# directory_name = new_directory_name
|
|
232
|
+
|
|
233
|
+
# if file_name is None:
|
|
234
|
+
# pass
|
|
235
|
+
|
|
236
|
+
# query = File(
|
|
237
|
+
# directory_name,
|
|
238
|
+
# file_name+'.sql' if '.' not in file_name else file_name
|
|
239
|
+
# ).read().content
|
|
240
|
+
|
|
241
|
+
elif file_name is not None:
|
|
242
|
+
pass
|
|
243
|
+
|
|
244
|
+
elif name is not None:
|
|
245
|
+
if directory_name is None:
|
|
246
|
+
directory_name=os.getenv(
|
|
247
|
+
'CODE_DIRECTORY',
|
|
248
|
+
os.getcwd()
|
|
249
|
+
)
|
|
250
|
+
if schema_type:
|
|
251
|
+
directory_name = os.path.join(
|
|
252
|
+
directory_name,
|
|
253
|
+
schema_type
|
|
254
|
+
)
|
|
255
|
+
if schema_name:
|
|
256
|
+
directory_name = os.path.join(
|
|
257
|
+
directory_name,
|
|
258
|
+
schema_name
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
query = File(
|
|
262
|
+
os.path.join(
|
|
263
|
+
directory_name,
|
|
264
|
+
'queries'
|
|
265
|
+
),
|
|
266
|
+
name+'.sql'
|
|
267
|
+
).read(encoding = 'utf-8').content
|
|
268
|
+
|
|
269
|
+
return query,file_name,directory_name
|
|
270
|
+
|
|
271
|
+
from datablender.base.web import Bot,BotAction,WebElement
|
|
272
|
+
from datablender.base.connection import Connection, AsyncConnection
|
|
273
|
+
from datablender.base.queryBuilder import QueryBuilder
|
|
274
|
+
from datablender.base.dataLogging import (
|
|
275
|
+
DataEventsTable,
|
|
276
|
+
DataLogging,
|
|
277
|
+
AsyncDataEventsTable,
|
|
278
|
+
AsyncDataLogging
|
|
279
|
+
)
|
|
280
|
+
from datablender.base.dataConfiguration import DataConfiguration,AsyncDataConfiguration
|
|
281
|
+
from datablender.base.dataElement import DataElement, AsyncDataElement
|
|
282
|
+
from datablender.base.data import Data
|
|
283
|
+
from datablender.base.dataSets import DataSets
|