deepfos 1.1.36__tar.gz → 1.1.38__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 (187) hide show
  1. {deepfos-1.1.36 → deepfos-1.1.38}/CHANGELOG.md +28 -0
  2. {deepfos-1.1.36 → deepfos-1.1.38}/PKG-INFO +17 -1
  3. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/_version.py +3 -3
  4. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/deepmodel.py +57 -0
  5. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/deepmodel.py +51 -1
  6. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/edb.py +4 -3
  7. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/deepmodel.py +42 -18
  8. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/dimension.py +1 -1
  9. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/decorator.py +20 -8
  10. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/utils.py +3 -2
  11. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos.egg-info/PKG-INFO +17 -1
  12. {deepfos-1.1.36 → deepfos-1.1.38}/.gitattributes +0 -0
  13. {deepfos-1.1.36 → deepfos-1.1.38}/.gitee/ISSUE_GUIDELINES.md +0 -0
  14. {deepfos-1.1.36 → deepfos-1.1.38}/.gitee/ISSUE_TEMPLATE.md +0 -0
  15. {deepfos-1.1.36 → deepfos-1.1.38}/.gitignore +0 -0
  16. {deepfos-1.1.36 → deepfos-1.1.38}/MANIFEST.in +0 -0
  17. {deepfos-1.1.36 → deepfos-1.1.38}/README.md +0 -0
  18. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/__init__.py +0 -0
  19. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/algo/__init__.py +0 -0
  20. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/algo/graph.py +0 -0
  21. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_1/__init__.py +0 -0
  22. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_1/business_model.py +0 -0
  23. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_1/dimension.py +0 -0
  24. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_1/models/__init__.py +0 -0
  25. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_1/models/business_model.py +0 -0
  26. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_1/models/dimension.py +0 -0
  27. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_2/__init__.py +0 -0
  28. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_2/dimension.py +0 -0
  29. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_2/models/__init__.py +0 -0
  30. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/V1_2/models/dimension.py +0 -0
  31. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/__init__.py +0 -0
  32. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/account.py +0 -0
  33. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/accounting_engines.py +0 -0
  34. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/app.py +0 -0
  35. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/approval_process.py +0 -0
  36. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/base.py +0 -0
  37. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/business_model.py +0 -0
  38. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/consolidation.py +0 -0
  39. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/consolidation_process.py +0 -0
  40. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/datatable.py +0 -0
  41. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/deepconnector.py +0 -0
  42. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/deepfos_task.py +0 -0
  43. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/dimension.py +0 -0
  44. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/financial_model.py +0 -0
  45. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/journal_model.py +0 -0
  46. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/journal_template.py +0 -0
  47. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/memory_financial_model.py +0 -0
  48. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/__init__.py +0 -0
  49. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/account.py +0 -0
  50. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/accounting_engines.py +0 -0
  51. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/app.py +0 -0
  52. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/approval_process.py +0 -0
  53. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/base.py +0 -0
  54. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/business_model.py +0 -0
  55. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/consolidation.py +0 -0
  56. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/consolidation_process.py +0 -0
  57. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/datatable_mysql.py +0 -0
  58. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/deepconnector.py +0 -0
  59. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/deepfos_task.py +0 -0
  60. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/dimension.py +0 -0
  61. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/financial_model.py +0 -0
  62. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/journal_model.py +0 -0
  63. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/journal_template.py +0 -0
  64. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/memory_financial_model.py +0 -0
  65. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/platform.py +0 -0
  66. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/python.py +0 -0
  67. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/reconciliation_engine.py +0 -0
  68. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/reconciliation_report.py +0 -0
  69. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/role_strategy.py +0 -0
  70. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/smartlist.py +0 -0
  71. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/space.py +0 -0
  72. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/system.py +0 -0
  73. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/variable.py +0 -0
  74. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/models/workflow.py +0 -0
  75. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/platform.py +0 -0
  76. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/python.py +0 -0
  77. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/reconciliation_engine.py +0 -0
  78. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/reconciliation_report.py +0 -0
  79. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/role_strategy.py +0 -0
  80. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/smartlist.py +0 -0
  81. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/space.py +0 -0
  82. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/system.py +0 -0
  83. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/variable.py +0 -0
  84. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/api/workflow.py +0 -0
  85. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/boost/__init__.py +0 -0
  86. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/boost/jstream.c +0 -0
  87. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/boost/jstream.pyx +0 -0
  88. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/boost/pandas.c +0 -0
  89. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/boost/pandas.pyx +0 -0
  90. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/boost/py_jstream.py +0 -0
  91. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/boost/py_pandas.py +0 -0
  92. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/cache.py +0 -0
  93. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/config.py +0 -0
  94. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/__init__.py +0 -0
  95. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/cube/__init__.py +0 -0
  96. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/cube/_base.py +0 -0
  97. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/cube/constants.py +0 -0
  98. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/cube/cube.py +0 -0
  99. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/cube/formula.py +0 -0
  100. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/cube/syscube.py +0 -0
  101. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/cube/typing.py +0 -0
  102. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/cube/utils.py +0 -0
  103. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/__init__.py +0 -0
  104. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/_base.py +0 -0
  105. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/dimcreator.py +0 -0
  106. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/dimension.py +0 -0
  107. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/dimexpr.py +0 -0
  108. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/dimmember.py +0 -0
  109. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/eledimension.py +0 -0
  110. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/filters.py +0 -0
  111. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/dimension/sysdimension.py +0 -0
  112. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/logictable/__init__.py +0 -0
  113. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/logictable/_cache.py +0 -0
  114. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/logictable/_operator.py +0 -0
  115. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/logictable/nodemixin.py +0 -0
  116. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/logictable/sqlcondition.py +0 -0
  117. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/core/logictable/tablemodel.py +0 -0
  118. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/__init__.py +0 -0
  119. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/cipher.py +0 -0
  120. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/clickhouse.py +0 -0
  121. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/connector.py +0 -0
  122. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/daclickhouse.py +0 -0
  123. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/dameng.py +0 -0
  124. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/damysql.py +0 -0
  125. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/dbkits.py +0 -0
  126. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/deepengine.py +0 -0
  127. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/deepmodel.py +0 -0
  128. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/deepmodel_kingbase.py +0 -0
  129. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/gauss.py +0 -0
  130. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/kingbase.py +0 -0
  131. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/mysql.py +0 -0
  132. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/oracle.py +0 -0
  133. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/postgresql.py +0 -0
  134. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/sqlserver.py +0 -0
  135. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/db/utils.py +0 -0
  136. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/__init__.py +0 -0
  137. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/accounting.py +0 -0
  138. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/apvlprocess.py +0 -0
  139. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/base.py +0 -0
  140. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/bizmodel.py +1 -1
  141. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/datatable.py +1 -1
  142. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/deepconnector.py +0 -0
  143. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/fact_table.py +0 -0
  144. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/finmodel.py +1 -1
  145. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/journal.py +1 -1
  146. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/journal_template.py +0 -0
  147. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/pyscript.py +2 -2
  148. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/reconciliation.py +0 -0
  149. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/rolestrategy.py +0 -0
  150. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/smartlist.py +0 -0
  151. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/variable.py +1 -1
  152. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/element/workflow.py +0 -0
  153. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/exceptions/__init__.py +0 -0
  154. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/exceptions/hook.py +0 -0
  155. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lazy.py +0 -0
  156. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/__init__.py +0 -0
  157. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/_javaobj.py +0 -0
  158. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/asynchronous.py +0 -0
  159. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/concurrency.py +0 -0
  160. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/constant.py +0 -0
  161. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/deepchart.py +0 -0
  162. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/deepux.py +0 -0
  163. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/discovery.py +0 -0
  164. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/eureka.py +0 -0
  165. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/filterparser.py +0 -0
  166. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/httpcli.py +0 -0
  167. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/jsonstreamer.py +0 -0
  168. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/msg.py +0 -0
  169. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/nacos.py +0 -0
  170. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/patch.py +0 -0
  171. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/redis.py +0 -0
  172. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/serutils.py +0 -0
  173. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/stopwatch.py +0 -0
  174. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/subtask.py +0 -0
  175. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/lib/sysutils.py +0 -0
  176. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/local.py +0 -0
  177. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/options.py +0 -0
  178. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos/translation.py +0 -0
  179. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos.egg-info/SOURCES.txt +0 -0
  180. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos.egg-info/dependency_links.txt +0 -0
  181. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos.egg-info/not-zip-safe +0 -0
  182. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos.egg-info/requires.txt +0 -0
  183. {deepfos-1.1.36 → deepfos-1.1.38}/deepfos.egg-info/top_level.txt +0 -0
  184. {deepfos-1.1.36 → deepfos-1.1.38}/requirements.txt +0 -0
  185. {deepfos-1.1.36 → deepfos-1.1.38}/setup.cfg +0 -0
  186. {deepfos-1.1.36 → deepfos-1.1.38}/setup.py +0 -0
  187. {deepfos-1.1.36 → deepfos-1.1.38}/versioneer.py +0 -0
@@ -1,3 +1,31 @@
1
+ ## [1.1.38] - 2024-06-21
2
+
3
+ ### 新增
4
+
5
+ * DeepModel增加获取查询语句接口
6
+
7
+ ### 变更
8
+
9
+ * 无
10
+
11
+ ### 文档
12
+
13
+ * 无
14
+
15
+ ## [1.1.37] - 2024-06-14
16
+
17
+ ### 新增
18
+
19
+ * DeepModel兼容外部库的直连
20
+
21
+ ### 变更
22
+
23
+ * 无
24
+
25
+ ### 文档
26
+
27
+ * 无
28
+
1
29
  ## [1.1.36] - 2024-06-05
2
30
 
3
31
  ### 新增
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.36
3
+ Version: 1.1.38
4
4
  Summary: Collecions of useful and handy tools for deepfos platform
5
5
  Home-page: http://py.deepfos.com
6
6
  Author: deepfos-python-team
@@ -12,3 +12,19 @@ Classifier: Programming Language :: Python :: 3.8
12
12
  Classifier: Programming Language :: Python :: 3.9
13
13
  Classifier: Programming Language :: Python :: 3.10
14
14
  Requires-Python: >=3.8.3
15
+ Requires-Dist: pandas==1.2.0
16
+ Requires-Dist: requests==2.25.1
17
+ Requires-Dist: pymysql==0.9.3
18
+ Requires-Dist: aiohttp==3.8.4
19
+ Requires-Dist: pydantic==1.8.2
20
+ Requires-Dist: cachetools==4.2.2
21
+ Requires-Dist: loguru==0.5.3
22
+ Requires-Dist: PyPika==0.48.8
23
+ Requires-Dist: aiomysql==0.0.22
24
+ Requires-Dist: clickhouse-driver==0.2.2
25
+ Requires-Dist: aioredis==2.0.1
26
+ Requires-Dist: redis==4.5.3
27
+ Requires-Dist: deepfos-ipc~=1.2.3
28
+ Requires-Dist: typing-extensions==4.5.0
29
+ Requires-Dist: edgedb~=1.4.0
30
+ Requires-Dist: asyncpg~=0.29.0
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-06-13T03:28:47+0000",
11
+ "date": "2024-07-02T02:20:30+0000",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "c5a5bf3e7fd0a5d6c8596d27d66fa32752792983",
15
- "version": "1.1.36"
14
+ "full-revisionid": "13c09c30d5637a7c35615e4e528623fe5dbdfcc2",
15
+ "version": "1.1.38"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -77,6 +77,15 @@ class SeqAPI(ChildAPI):
77
77
  """
78
78
  return {'param': {'id': id, 'filterValue': filter_value}}
79
79
 
80
+
81
+ class ShardingAPI(ChildAPI):
82
+ endpoint = '/sharding'
83
+
84
+ @get('database')
85
+ def database(self, ) -> Union[SimpleSpaceConnectionConfig, Awaitable[SimpleSpaceConnectionConfig]]:
86
+ return {}
87
+
88
+
80
89
  class DeepQLAPI(ChildAPI):
81
90
  endpoint = '/public/deepql/actions'
82
91
 
@@ -89,6 +98,42 @@ class DeepQLAPI(ChildAPI):
89
98
  return {'body': {'module': module, 'query': query, 'variables': variables}}
90
99
 
91
100
 
101
+ class PresentationAPI(ChildAPI):
102
+ endpoint = '/presentation-layer'
103
+
104
+ @get('ql-selector/ql-record-info')
105
+ def ql_record_info(self, qlType: str, recordCode: str) -> Union[QlRecordVO, Awaitable[QlRecordVO]]:
106
+ """获取单条记录
107
+
108
+ Args:
109
+ qlType: 查询类型 'deepql'|'analysisql'
110
+ recordCode: 查询编码
111
+
112
+ """
113
+ return {'param': {'qlType': qlType, 'recordCode': recordCode}}
114
+
115
+ @get('ql-selector/ql-records')
116
+ def ql_records(self, qlType: str = None, qlRecordType: str = None) -> Union[List[QlRecordVO], Awaitable[List[QlRecordVO]]]:
117
+ """获取所有的ql记录
118
+
119
+ Args:
120
+ qlType: 查询类型 'deepql'|'analysisql'
121
+ qlRecordType: 记录类型:个人PERSONAL /公共:PUBLIC
122
+
123
+ Returns:
124
+
125
+ """
126
+ return {'param': {'qlType': qlType, 'qlRecordType': qlRecordType}}
127
+
128
+
129
+ class ExtraAPI(ChildAPI):
130
+ endpoint = '/'
131
+
132
+ @get('git-version')
133
+ def version(self, ) -> Union[str, Awaitable[str]]:
134
+ return {}
135
+
136
+
92
137
  class DeepModelAPI(DynamicRootAPI, builtin=True):
93
138
  module_type = 'DM'
94
139
  default_version = (1, 0)
@@ -112,3 +157,15 @@ class DeepModelAPI(DynamicRootAPI, builtin=True):
112
157
  @cached_property
113
158
  def seq(self) -> SeqAPI:
114
159
  return SeqAPI(self)
160
+
161
+ @cached_property
162
+ def sharding(self) -> ShardingAPI:
163
+ return ShardingAPI(self)
164
+
165
+ @cached_property
166
+ def presentation(self) -> PresentationAPI:
167
+ return PresentationAPI(self)
168
+
169
+ @cached_property
170
+ def extra(self) -> ExtraAPI:
171
+ return ExtraAPI(self)
@@ -19,7 +19,10 @@ __all__ = [
19
19
  "RuleErrorMsg",
20
20
  "RuleParam",
21
21
  "SequenceInstance",
22
- "_IndexParam"
22
+ "_IndexParam",
23
+ "SimpleSpaceConnectionConfig",
24
+ "QlGlobalVariableVO",
25
+ "QlRecordVO"
23
26
  ]
24
27
 
25
28
 
@@ -254,5 +257,52 @@ class SequenceInstance(BaseModel):
254
257
  sequenceName: Optional[str]
255
258
 
256
259
 
260
+ class SimpleSpaceConnectionConfig(BaseModel):
261
+ space: str
262
+ dbType: Optional[str]
263
+ dbName: Optional[str]
264
+ schema_: Optional[str] = Field(alias='schema')
265
+ edgedbName: str
266
+ edgedbSchema: Optional[str]
267
+ createTime: Optional[str]
268
+ updateTime: Optional[str]
269
+
270
+
271
+ class QlGlobalVariableVO(BaseModel):
272
+ #: 编码
273
+ code: Optional[str]
274
+ #: 类型
275
+ type: Optional[str]
276
+ #: 值
277
+ value: Optional[str]
278
+
279
+
280
+ class QlRecordVO(BaseModel):
281
+ #: 应用标识
282
+ app: Optional[str]
283
+ #: 空间标识
284
+ space: Optional[str]
285
+ #: 用户id
286
+ userId: Optional[str]
287
+ #: 创建时间
288
+ createTime: Optional[str]
289
+ #: 应用标识
290
+ globalVariables: Optional[List[QlGlobalVariableVO]]
291
+ #: 主键标识
292
+ qlRecordId: Optional[str]
293
+ #: QL类型:deepql|graphql|analysisql
294
+ qlType: Optional[str]
295
+ #: ql编码
296
+ recordCode: Optional[str]
297
+ #: 记录内容
298
+ recordContent: Optional[str]
299
+ #: 记录名称
300
+ recordName: Optional[str]
301
+ #: 记录类型:个人PERSONAL /公共:PUBLIC
302
+ recordType: Optional[str]
303
+ #: 变量
304
+ variables: Any
305
+
306
+
257
307
  ObjectParam.update_forward_refs()
258
308
  ObjectLinkParam.update_forward_refs()
@@ -170,9 +170,10 @@ deprecated_space = [
170
170
  ]
171
171
 
172
172
 
173
- def create_async_client(default_module=None):
174
- space = OPTION.api.header['space']
175
- dbname = None if space in deprecated_space else f"deepmodel_space{space}"
173
+ def create_async_client(default_module=None, dbname=None):
174
+ if dbname is None:
175
+ space = OPTION.api.header['space']
176
+ dbname = None if space in deprecated_space else f"deepmodel_space{space}"
176
177
  cli = _AsyncIOClient(
177
178
  connection_class=_AsyncEdgeDBConnection,
178
179
  max_concurrency=None,
@@ -23,6 +23,7 @@ from deepfos.api.models.deepmodel import (
23
23
  ObjectBasicDTO, ObjectParam,
24
24
  QueryResultObjectInfo, QueryResult
25
25
  )
26
+ from deepfos.cache import SpaceSeperatedLRUCache
26
27
  from deepfos.db.edb import create_async_client
27
28
  from deepfos.element.base import ElementBase, SyncMeta
28
29
  from deepfos.exceptions import (
@@ -32,8 +33,8 @@ from deepfos.exceptions import (
32
33
  )
33
34
  from deepfos.lib import serutils
34
35
  from deepfos.lib.asynchronous import future_property, evloop
35
- from deepfos.lib.decorator import flagmethod, cached_property
36
- from deepfos.lib.utils import AliasGenerator
36
+ from deepfos.lib.decorator import flagmethod, cached_property, lru_cache
37
+ from deepfos.lib.utils import AliasGenerator, to_version_tuple
37
38
 
38
39
  __all__ = ['AsyncDeepModel', 'DeepModel', 'to_fields', 'QueryWithArgs']
39
40
 
@@ -737,6 +738,19 @@ class _TxnConfig:
737
738
  self.txn_support = False
738
739
 
739
740
 
741
+ @lru_cache(maxsize=128, cache_factory=SpaceSeperatedLRUCache)
742
+ async def get_element_info():
743
+ from deepfos.api.space import SpaceAPI
744
+ from deepfos.api.models.app import ElementRelationInfo
745
+ from deepfos.exceptions import ElementTypeMissingError
746
+ modules = await SpaceAPI(sync=False).module.get_usable_module()
747
+ target_module = ['MAINVIEW', 'DM']
748
+ for mdl in modules:
749
+ if mdl.moduleType in target_module and mdl.status == 1:
750
+ return ElementRelationInfo.construct_from(mdl)
751
+ raise ElementTypeMissingError('DeepModel组件在空间内不可用')
752
+
753
+
740
754
  # -----------------------------------------------------------------------------
741
755
  # core
742
756
  class AsyncDeepModel(ElementBase[DeepModelAPI]):
@@ -753,32 +767,42 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
753
767
  self.appmodule = f"app{OPTION.api.header['app']}"
754
768
  self.spacemodule = f"space{OPTION.api.header['space']}"
755
769
  self.direct_access = direct_access
756
- if direct_access:
757
- self.client = create_async_client(default_module=self.appmodule)
770
+ self.alias = AliasGenerator()
771
+ self.pg_dsn = pg_dsn
772
+
773
+ @future_property
774
+ async def client(self):
775
+ if self.direct_access:
776
+ api = await self.wait_for('async_api')
777
+ ver = await api.extra.version()
778
+ if to_version_tuple(ver, -1) >= (3, 0, 18, 8, 0):
779
+ db_info = await api.sharding.database()
780
+ space = OPTION.api.header['space']
781
+ if db_info.space != space:
782
+ raise ValueError(
783
+ f'Space id in sharding database info invalid. '
784
+ f'Expected space id: {space}, actual: {db_info.space}'
785
+ )
786
+ dbname = db_info.edgedbName
787
+ else:
788
+ dbname = None
789
+ client = create_async_client(
790
+ default_module=self.appmodule,
791
+ dbname=dbname
792
+ )
758
793
  if user_id := OPTION.api.header.get('user'):
759
- self.client = self.client.with_globals(
794
+ client = client.with_globals(
760
795
  **{
761
796
  f'{self.spacemodule}::current_user_id':
762
797
  user_id
763
798
  }
764
799
  )
765
- else:
766
- self.client = None
767
- self.alias = AliasGenerator()
768
- self.pg_dsn = pg_dsn
800
+ return client
769
801
 
770
802
  @future_property
771
803
  async def element_info(self):
772
804
  """元素信息"""
773
- from deepfos.api.space import SpaceAPI
774
- from deepfos.api.models.app import ElementRelationInfo
775
- from deepfos.exceptions import ElementTypeMissingError
776
- modules = await SpaceAPI(sync=False).module.get_usable_module()
777
- target_module = ['MAINVIEW', 'DM']
778
- for mdl in modules:
779
- if mdl.moduleType in target_module and mdl.status == 1:
780
- return ElementRelationInfo.construct_from(mdl)
781
- raise ElementTypeMissingError('DeepModel组件在空间内不可用')
805
+ return await get_element_info()
782
806
 
783
807
  @future_property
784
808
  async def async_api(self):
@@ -166,12 +166,12 @@ class AsyncDimension(ElementBase[DimensionAPI]):
166
166
  strict: bool = False,
167
167
  server_name: str = None,
168
168
  ):
169
- super().__init__(element_name, folder_id, path, server_name)
170
169
  self._add_memo = CIMultiDict()
171
170
  self._del_memo = CIMultiDict()
172
171
  self._upd_memo = CIMultiDict()
173
172
  self.__member_memo = None if strict else CIMultiDict()
174
173
  self._strict = strict
174
+ super().__init__(element_name, folder_id, path, server_name)
175
175
 
176
176
  @cached_property
177
177
  def _datatable_class(self) -> T_AsyncDatatableClass:
@@ -282,16 +282,28 @@ def lru_cache(maxsize=128, cache_factory=LRUCache):
282
282
  cache = Manager.create_cache(cache_factory, maxsize=maxsize)
283
283
 
284
284
  def deco_fun(func):
285
- @functools.wraps(func)
286
- def wrapper(*args, **kwargs):
287
- key = hashkey(*args, **kwargs)
285
+ if inspect.iscoroutinefunction(func):
286
+ @functools.wraps(func)
287
+ async def wrapper(*args, **kwargs):
288
+ key = hashkey(*args, **kwargs)
289
+
290
+ if key in cache:
291
+ return cache[key]
292
+
293
+ result = await func(*args, **kwargs)
294
+ cache[key] = result
295
+ return result
296
+ else:
297
+ @functools.wraps(func)
298
+ def wrapper(*args, **kwargs):
299
+ key = hashkey(*args, **kwargs)
288
300
 
289
- if key in cache:
290
- return cache[key]
301
+ if key in cache:
302
+ return cache[key]
291
303
 
292
- result = func(*args, **kwargs)
293
- cache[key] = result
294
- return result
304
+ result = func(*args, **kwargs)
305
+ cache[key] = result
306
+ return result
295
307
 
296
308
  return wrapper
297
309
 
@@ -903,18 +903,19 @@ def find_str(
903
903
  return candidate
904
904
 
905
905
 
906
- def to_version_tuple(ver: Union[float, str]):
906
+ def to_version_tuple(ver: Union[float, str], max_split: int = 1):
907
907
  """返回版本元组
908
908
 
909
909
  Args:
910
910
  ver: 表示版本的字符串或数字,例如'1.0','1_0',1.0
911
+ max_split: 以'.'和'_'分割的最大次数,如为-1,则无限制
911
912
 
912
913
  Returns:
913
914
  形如(1, 0)的版本元组
914
915
  """
915
916
  if isinstance(ver, float):
916
917
  ver = str(ver)
917
- version_parts = ver.replace('.', '_').split('_', 1)
918
+ version_parts = ver.replace('.', '_').split('_', max_split)
918
919
  version_list = [int(part) for part in version_parts]
919
920
  return tuple(version_list)
920
921
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.36
3
+ Version: 1.1.38
4
4
  Summary: Collecions of useful and handy tools for deepfos platform
5
5
  Home-page: http://py.deepfos.com
6
6
  Author: deepfos-python-team
@@ -12,3 +12,19 @@ Classifier: Programming Language :: Python :: 3.8
12
12
  Classifier: Programming Language :: Python :: 3.9
13
13
  Classifier: Programming Language :: Python :: 3.10
14
14
  Requires-Python: >=3.8.3
15
+ Requires-Dist: pandas==1.2.0
16
+ Requires-Dist: requests==2.25.1
17
+ Requires-Dist: pymysql==0.9.3
18
+ Requires-Dist: aiohttp==3.8.4
19
+ Requires-Dist: pydantic==1.8.2
20
+ Requires-Dist: cachetools==4.2.2
21
+ Requires-Dist: loguru==0.5.3
22
+ Requires-Dist: PyPika==0.48.8
23
+ Requires-Dist: aiomysql==0.0.22
24
+ Requires-Dist: clickhouse-driver==0.2.2
25
+ Requires-Dist: aioredis==2.0.1
26
+ Requires-Dist: redis==4.5.3
27
+ Requires-Dist: deepfos-ipc~=1.2.3
28
+ Requires-Dist: typing-extensions==4.5.0
29
+ Requires-Dist: edgedb~=1.4.0
30
+ Requires-Dist: asyncpg~=0.29.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -171,10 +171,10 @@ class AsyncBusinessModel(ElementBase[BusinessModelAPI]):
171
171
  path: str = None,
172
172
  server_name: str = None,
173
173
  ):
174
- super().__init__(element_name, folder_id, path, server_name)
175
174
  self.__tables: Dict[str, TableNode] = {}
176
175
  self.__logic_tables = LogicTable()
177
176
  self.__dflt_ptn_id = UNSET
177
+ super().__init__(element_name, folder_id, path, server_name)
178
178
 
179
179
  @cached_property
180
180
  def default_partition_id(self) -> Optional[str]:
@@ -593,8 +593,8 @@ class AsyncDataTableMySQL(ElementBase):
593
593
  table_name: str = None,
594
594
  server_name: str = None,
595
595
  ):
596
- super().__init__(element_name, folder_id, path, server_name)
597
596
  self.__tbl_name = table_name
597
+ super().__init__(element_name, folder_id, path, server_name)
598
598
 
599
599
  def _safe_get_txn_conf(self) -> _TxnConfig:
600
600
  try:
@@ -174,10 +174,10 @@ class AsyncFinancialCube(ElementBase[FinancialModelAPI]):
174
174
  entry_object='python',
175
175
  server_name: Optional[str] = None,
176
176
  ):
177
- super().__init__(element_name, folder_id, path, server_name)
178
177
  full_name = OPTION.general.task_info.get('script_name', 'python')
179
178
  self.entry_object = entry_object.format(script_name=full_name.split('.')[-1],
180
179
  full_name=full_name)
180
+ super().__init__(element_name, folder_id, path, server_name)
181
181
 
182
182
  @future_property(on_demand=True)
183
183
  async def meta(self) -> CubeModel:
@@ -66,8 +66,8 @@ class AsyncJournalModel(ElementBase[JournalModelAPI]):
66
66
  path: str = None,
67
67
  server_name: str = None,
68
68
  ):
69
- super().__init__(element_name, folder_id, path, server_name)
70
69
  self.__tbl_name = None
70
+ super().__init__(element_name, folder_id, path, server_name)
71
71
 
72
72
  @future_property
73
73
  async def config(self) -> JournalModelConfig:
@@ -275,11 +275,11 @@ class PythonScript(ElementBase[PythonAPI]):
275
275
  task_name: str = None,
276
276
  should_log: bool = False
277
277
  ):
278
+ self.should_log = should_log
279
+ self.task_name = task_name
278
280
  super().__init__(
279
281
  element_name=element_name, folder_id=folder_id, path=path
280
282
  )
281
- self.should_log = should_log
282
- self.task_name = task_name
283
283
 
284
284
  @future_property
285
285
  async def env(self) -> Tuple[str, str, Dict]:
@@ -182,11 +182,11 @@ class AsyncVariable(ElementBase[VariableAPI]):
182
182
  path: str = None,
183
183
  server_name: str = None,
184
184
  ):
185
- super().__init__(element_name=element_name, folder_id=folder_id, path=path, server_name=server_name)
186
185
  self.__group = Group()
187
186
  self.__description = None
188
187
  self.__gv_memo = None
189
188
  self.__uv_memo = None
189
+ super().__init__(element_name=element_name, folder_id=folder_id, path=path, server_name=server_name)
190
190
 
191
191
  @property
192
192
  def _group(self) -> Group:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes