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.
Files changed (51) hide show
  1. datablender-0.0.1/PKG-INFO +68 -0
  2. datablender-0.0.1/README.md +24 -0
  3. datablender-0.0.1/datablender/__init__.py +68 -0
  4. datablender-0.0.1/datablender/base/__init__.py +283 -0
  5. datablender-0.0.1/datablender/base/connection.py +370 -0
  6. datablender-0.0.1/datablender/base/data.py +1856 -0
  7. datablender-0.0.1/datablender/base/dataConfiguration.py +701 -0
  8. datablender-0.0.1/datablender/base/dataElement.py +584 -0
  9. datablender-0.0.1/datablender/base/dataLogging.py +702 -0
  10. datablender-0.0.1/datablender/base/dataSets.py +233 -0
  11. datablender-0.0.1/datablender/base/directory.py +225 -0
  12. datablender-0.0.1/datablender/base/file.py +496 -0
  13. datablender-0.0.1/datablender/base/queryBuilder.py +1498 -0
  14. datablender-0.0.1/datablender/base/request.py +182 -0
  15. datablender-0.0.1/datablender/base/text.py +79 -0
  16. datablender-0.0.1/datablender/base/web.py +602 -0
  17. datablender-0.0.1/datablender/data/__init__.py +124 -0
  18. datablender-0.0.1/datablender/data/asyncDataProcess.py +1047 -0
  19. datablender-0.0.1/datablender/data/asyncDataServer.py +538 -0
  20. datablender-0.0.1/datablender/data/asyncDataSourceCore.py +1971 -0
  21. datablender-0.0.1/datablender/data/dataDirectory.py +1540 -0
  22. datablender-0.0.1/datablender/data/dataFile.py +635 -0
  23. datablender-0.0.1/datablender/data/dataProcess.py +639 -0
  24. datablender-0.0.1/datablender/data/dataServer.py +488 -0
  25. datablender-0.0.1/datablender/data/dataSource.py +647 -0
  26. datablender-0.0.1/datablender/data/dataSourceCore.py +1318 -0
  27. datablender-0.0.1/datablender/data/dataVersion.py +1526 -0
  28. datablender-0.0.1/datablender/data/directoryElementController.py +172 -0
  29. datablender-0.0.1/datablender/data/filesTable.py +219 -0
  30. datablender-0.0.1/datablender/database/__init__.py +26 -0
  31. datablender-0.0.1/datablender/database/database.py +1151 -0
  32. datablender-0.0.1/datablender/database/elementSQL.py +1093 -0
  33. datablender-0.0.1/datablender/database/extension.py +265 -0
  34. datablender-0.0.1/datablender/database/function.py +324 -0
  35. datablender-0.0.1/datablender/database/partition.py +26 -0
  36. datablender-0.0.1/datablender/database/role.py +385 -0
  37. datablender-0.0.1/datablender/database/schema.py +1009 -0
  38. datablender-0.0.1/datablender/database/table.py +2274 -0
  39. datablender-0.0.1/datablender/database/view.py +848 -0
  40. datablender-0.0.1/datablender/tests/__init__.py +8 -0
  41. datablender-0.0.1/datablender/tests/test_base.py +1604 -0
  42. datablender-0.0.1/datablender/tests/test_data.py +3346 -0
  43. datablender-0.0.1/datablender/tests/test_database.py +799 -0
  44. datablender-0.0.1/datablender.egg-info/PKG-INFO +68 -0
  45. datablender-0.0.1/datablender.egg-info/SOURCES.txt +49 -0
  46. datablender-0.0.1/datablender.egg-info/dependency_links.txt +1 -0
  47. datablender-0.0.1/datablender.egg-info/not-zip-safe +1 -0
  48. datablender-0.0.1/datablender.egg-info/requires.txt +30 -0
  49. datablender-0.0.1/datablender.egg-info/top_level.txt +1 -0
  50. datablender-0.0.1/setup.cfg +4 -0
  51. 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