deepfos 1.1.63__tar.gz → 1.1.65__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 (191) hide show
  1. {deepfos-1.1.63 → deepfos-1.1.65}/CHANGELOG.md +15 -0
  2. {deepfos-1.1.63 → deepfos-1.1.65}/PKG-INFO +1 -1
  3. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/_version.py +3 -3
  4. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/deepconnector.py +3 -3
  5. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/deepconnector.py +1 -0
  6. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/deepconnector.py +34 -1
  7. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/deepmodel.py +70 -42
  8. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/workflow.py +6 -4
  9. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/sysutils.py +6 -7
  10. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/PKG-INFO +1 -1
  11. {deepfos-1.1.63 → deepfos-1.1.65}/.gitattributes +0 -0
  12. {deepfos-1.1.63 → deepfos-1.1.65}/.gitee/ISSUE_GUIDELINES.md +0 -0
  13. {deepfos-1.1.63 → deepfos-1.1.65}/.gitee/ISSUE_TEMPLATE.md +0 -0
  14. {deepfos-1.1.63 → deepfos-1.1.65}/.gitignore +0 -0
  15. {deepfos-1.1.63 → deepfos-1.1.65}/MANIFEST.in +0 -0
  16. {deepfos-1.1.63 → deepfos-1.1.65}/README.md +0 -0
  17. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/__init__.py +0 -0
  18. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/algo/__init__.py +0 -0
  19. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/algo/graph.py +0 -0
  20. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/__init__.py +0 -0
  21. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/business_model.py +0 -0
  22. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/dimension.py +0 -0
  23. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/models/__init__.py +0 -0
  24. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/models/business_model.py +0 -0
  25. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_1/models/dimension.py +0 -0
  26. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_2/__init__.py +0 -0
  27. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_2/dimension.py +0 -0
  28. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_2/models/__init__.py +0 -0
  29. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/V1_2/models/dimension.py +0 -0
  30. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/__init__.py +0 -0
  31. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/account.py +0 -0
  32. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/accounting_engines.py +0 -0
  33. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/app.py +0 -0
  34. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/approval_process.py +0 -0
  35. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/base.py +0 -0
  36. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/business_model.py +0 -0
  37. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/consolidation.py +0 -0
  38. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/consolidation_process.py +0 -0
  39. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/datatable.py +0 -0
  40. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/deep_pipeline.py +0 -0
  41. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/deepfos_task.py +0 -0
  42. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/deepmodel.py +0 -0
  43. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/dimension.py +0 -0
  44. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/financial_model.py +0 -0
  45. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/journal_model.py +0 -0
  46. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/journal_template.py +0 -0
  47. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/memory_financial_model.py +0 -0
  48. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/__init__.py +0 -0
  49. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/account.py +0 -0
  50. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/accounting_engines.py +0 -0
  51. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/app.py +0 -0
  52. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/approval_process.py +0 -0
  53. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/base.py +0 -0
  54. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/business_model.py +0 -0
  55. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/consolidation.py +0 -0
  56. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/consolidation_process.py +0 -0
  57. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/datatable_mysql.py +0 -0
  58. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/deep_pipeline.py +0 -0
  59. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/deepfos_task.py +0 -0
  60. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/deepmodel.py +0 -0
  61. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/dimension.py +0 -0
  62. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/financial_model.py +0 -0
  63. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/journal_model.py +0 -0
  64. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/journal_template.py +0 -0
  65. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/memory_financial_model.py +0 -0
  66. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/platform.py +0 -0
  67. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/python.py +0 -0
  68. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/reconciliation_engine.py +0 -0
  69. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/reconciliation_report.py +0 -0
  70. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/role_strategy.py +0 -0
  71. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/smartlist.py +0 -0
  72. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/space.py +0 -0
  73. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/system.py +0 -0
  74. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/variable.py +0 -0
  75. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/models/workflow.py +0 -0
  76. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/platform.py +0 -0
  77. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/python.py +0 -0
  78. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/reconciliation_engine.py +0 -0
  79. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/reconciliation_report.py +0 -0
  80. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/role_strategy.py +0 -0
  81. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/smartlist.py +0 -0
  82. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/space.py +0 -0
  83. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/system.py +0 -0
  84. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/variable.py +0 -0
  85. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/api/workflow.py +0 -0
  86. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/__init__.py +0 -0
  87. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/jstream.c +0 -0
  88. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/jstream.pyx +0 -0
  89. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/pandas.c +0 -0
  90. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/pandas.pyx +0 -0
  91. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/py_jstream.py +0 -0
  92. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/boost/py_pandas.py +0 -0
  93. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/cache.py +0 -0
  94. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/config.py +0 -0
  95. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/__init__.py +0 -0
  96. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/__init__.py +0 -0
  97. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/_base.py +0 -0
  98. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/constants.py +0 -0
  99. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/cube.py +0 -0
  100. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/formula.py +0 -0
  101. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/syscube.py +0 -0
  102. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/typing.py +0 -0
  103. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/cube/utils.py +0 -0
  104. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/__init__.py +0 -0
  105. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/_base.py +0 -0
  106. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/dimcreator.py +0 -0
  107. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/dimension.py +0 -0
  108. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/dimexpr.py +0 -0
  109. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/dimmember.py +0 -0
  110. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/eledimension.py +0 -0
  111. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/filters.py +0 -0
  112. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/dimension/sysdimension.py +0 -0
  113. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/__init__.py +0 -0
  114. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/_cache.py +0 -0
  115. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/_operator.py +0 -0
  116. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/nodemixin.py +0 -0
  117. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/sqlcondition.py +0 -0
  118. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/core/logictable/tablemodel.py +0 -0
  119. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/__init__.py +0 -0
  120. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/cipher.py +0 -0
  121. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/clickhouse.py +0 -0
  122. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/connector.py +0 -0
  123. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/daclickhouse.py +0 -0
  124. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/dameng.py +0 -0
  125. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/damysql.py +0 -0
  126. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/dbkits.py +0 -0
  127. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/deepengine.py +0 -0
  128. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/deepmodel.py +0 -0
  129. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/deepmodel_kingbase.py +0 -0
  130. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/edb.py +0 -0
  131. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/gauss.py +0 -0
  132. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/kingbase.py +0 -0
  133. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/mysql.py +0 -0
  134. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/oracle.py +0 -0
  135. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/postgresql.py +0 -0
  136. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/sqlserver.py +0 -0
  137. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/db/utils.py +0 -0
  138. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/__init__.py +0 -0
  139. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/accounting.py +0 -0
  140. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/apvlprocess.py +0 -0
  141. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/base.py +0 -0
  142. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/bizmodel.py +0 -0
  143. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/datatable.py +0 -0
  144. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/deep_pipeline.py +0 -0
  145. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/dimension.py +0 -0
  146. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/fact_table.py +0 -0
  147. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/finmodel.py +0 -0
  148. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/journal.py +0 -0
  149. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/journal_template.py +0 -0
  150. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/pyscript.py +0 -0
  151. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/reconciliation.py +0 -0
  152. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/rolestrategy.py +0 -0
  153. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/smartlist.py +0 -0
  154. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/element/variable.py +0 -0
  155. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/exceptions/__init__.py +0 -0
  156. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/exceptions/hook.py +0 -0
  157. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lazy.py +0 -0
  158. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/__init__.py +0 -0
  159. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/_javaobj.py +0 -0
  160. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/asynchronous.py +0 -0
  161. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/concurrency.py +0 -0
  162. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/constant.py +0 -0
  163. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/decorator.py +0 -0
  164. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/deepchart.py +0 -0
  165. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/deepux.py +0 -0
  166. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/discovery.py +0 -0
  167. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/edb_lexer.py +0 -0
  168. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/eureka.py +0 -0
  169. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/filterparser.py +0 -0
  170. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/httpcli.py +0 -0
  171. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/jsonstreamer.py +0 -0
  172. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/msg.py +0 -0
  173. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/nacos.py +0 -0
  174. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/patch.py +0 -0
  175. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/redis.py +0 -0
  176. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/serutils.py +0 -0
  177. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/stopwatch.py +0 -0
  178. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/subtask.py +0 -0
  179. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/lib/utils.py +0 -0
  180. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/local.py +0 -0
  181. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/options.py +0 -0
  182. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos/translation.py +0 -0
  183. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/SOURCES.txt +0 -0
  184. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/dependency_links.txt +0 -0
  185. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/not-zip-safe +0 -0
  186. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/requires.txt +0 -0
  187. {deepfos-1.1.63 → deepfos-1.1.65}/deepfos.egg-info/top_level.txt +0 -0
  188. {deepfos-1.1.63 → deepfos-1.1.65}/requirements.txt +0 -0
  189. {deepfos-1.1.63 → deepfos-1.1.65}/setup.cfg +0 -0
  190. {deepfos-1.1.63 → deepfos-1.1.65}/setup.py +0 -0
  191. {deepfos-1.1.63 → deepfos-1.1.65}/versioneer.py +0 -0
@@ -1,3 +1,18 @@
1
+ ## [1.1.65] - 2025-07-09
2
+
3
+ ### 更新
4
+
5
+ * 修正deepmodel元素试图set client引发的问题
6
+
7
+
8
+ ## [1.1.64] - 2025-07-08
9
+
10
+ ### 更新
11
+
12
+ * 更新连接器元素获取连接信息的接口和密码处理逻辑
13
+ * TaskUtil的api实例化延迟至TaskUtil实例化过程中
14
+
15
+
1
16
  ## [1.1.63] - 2025-07-01
2
17
 
3
18
  ### 更新
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.63
3
+ Version: 1.1.65
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
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-07-01T03:16:02+0000",
11
+ "date": "2025-07-09T10:58:56+0000",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "ee27ae20cda4c8955b87eabb5b3b1c73e528e8e3",
15
- "version": "1.1.63"
14
+ "full-revisionid": "7891ba3eb0b577f318140d5ea3b613c82bda9e68",
15
+ "version": "1.1.65"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -3,7 +3,7 @@ from typing import Union, Awaitable
3
3
  from deepfos.element.base import T_ElementInfoWithServer
4
4
  from deepfos.lib.decorator import cached_property
5
5
 
6
- from .base import ChildAPI, get, RootAPI
6
+ from .base import ChildAPI, RootAPI, post
7
7
  from .models.deepconnector import *
8
8
 
9
9
 
@@ -14,10 +14,10 @@ class DataSourceAPI(ChildAPI):
14
14
  """连接信息相关接口"""
15
15
  endpoint = '/apis/v3/ds/spaces/{space}/apps/{app}'
16
16
 
17
- @get('connection-info', data_wrapped=False)
17
+ @post('connection-info/query', data_wrapped=False)
18
18
  def connection_info(self, element_info: T_ElementInfoWithServer) -> Union[ConnectionInfoVo, Awaitable[ConnectionInfoVo]]:
19
19
  return {
20
- 'param': {
20
+ 'body': {
21
21
  'elementName': element_info.elementName,
22
22
  'folderId': element_info.folderId
23
23
  }
@@ -26,3 +26,4 @@ class ConnectionInfoVo(BaseModel):
26
26
  serviceTypeName: Optional[str] = None
27
27
  serviceVersion: Optional[str] = None
28
28
  username: str
29
+ encryptType: Optional[str] = None
@@ -1,7 +1,10 @@
1
1
  import base64
2
+ import binascii
3
+ import os
2
4
 
3
5
  from deepfos.api.deepconnector import DeepConnectorAPI
4
6
  from deepfos.api.models import BaseModel
7
+ from deepfos.db.cipher import AES
5
8
  from deepfos.element.base import ElementBase, SyncMeta
6
9
  from deepfos.lib.asynchronous import future_property
7
10
  from deepfos.lib.decorator import cached_property
@@ -9,6 +12,20 @@ from deepfos.lib.decorator import cached_property
9
12
  __all__ = ['AsyncDeepConnector', 'DeepConnector', 'ConnectionInfo']
10
13
 
11
14
 
15
+ def decrypt(secret, cipher_text, encoding='utf8'):
16
+ pwd_padded = AES(secret).decrypt(
17
+ base64.b16decode(cipher_text)
18
+ )
19
+ if pwd_padded[-1] in range(1, 17):
20
+ pad_length = pwd_padded[-1]
21
+ pad_char = chr(pwd_padded[-1])
22
+ guess_pad = pad_char * pwd_padded[-1]
23
+
24
+ if pwd_padded.decode(encoding).endswith(guess_pad):
25
+ return pwd_padded.decode(encoding)[:-pad_length:]
26
+ return pwd_padded.decode(encoding)
27
+
28
+
12
29
  class ConnectionInfo(BaseModel):
13
30
  host: str
14
31
  port: int
@@ -45,12 +62,28 @@ class AsyncDeepConnector(ElementBase[DeepConnectorAPI]):
45
62
  info = await api.datasource.connection_info(
46
63
  element_info=ele_info,
47
64
  )
65
+ if info.encryptType == 'AES':
66
+ try:
67
+ password = decrypt(
68
+ os.environ.get('EXPORT_DEEPFOS_AES_KEY', '!ABCD-EFGH-IJKL@').encode(),
69
+ info.password,
70
+ encoding='utf-8'
71
+ )
72
+ except ValueError:
73
+ raise ValueError(
74
+ '连接器连接信息解密失败,请检查公共环境变量:EXPORT_DEEPFOS_AES_KEY'
75
+ ) from None
76
+ else:
77
+ try:
78
+ password = base64.decodebytes(info.password.encode()).decode()
79
+ except binascii.Error:
80
+ password = info.password
48
81
  return ConnectionInfo(
49
82
  host=info.connectionHost,
50
83
  port=info.connectionPort,
51
84
  db=info.dbName,
52
85
  user=info.username,
53
- password=base64.decodebytes(info.password.encode()).decode(),
86
+ password=password,
54
87
  dbtype=info.serviceName,
55
88
  )
56
89
 
@@ -1,4 +1,5 @@
1
1
  import re
2
+ import threading
2
3
 
3
4
  import numpy as np
4
5
  from asyncpg.connection import connect as pg_conn
@@ -803,39 +804,53 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
803
804
  logger.debug('当前DeepModel为非直连模式')
804
805
  self.alias = AliasGenerator()
805
806
  self.pg_dsn = pg_dsn
806
- self._globals = {}
807
+ self._globals = None
807
808
  self.before_chunk = before_chunk
808
809
  self.after_chunk = after_chunk
810
+ self._clients = threading.local()
809
811
 
810
812
  @future_property
811
- async def client(self):
812
- if self.direct_access:
813
- api = await self.wait_for('async_api')
814
- ver = await api.extra.version()
815
- if to_version_tuple(ver, 4) >= (3, 0, 18, 8, 0):
816
- db_info = await api.sharding.database()
817
- space = OPTION.api.header['space']
818
- if db_info.space != space:
819
- raise ValueError(
820
- f'Space id in sharding database info invalid. '
821
- f'Expected space id: {space}, actual: {db_info.space}'
822
- )
823
- dbname = db_info.edgedbName
824
- else:
825
- dbname = None
826
- client = create_async_client(
827
- default_module=self.appmodule,
828
- dbname=dbname
813
+ async def _internal_dbname(self):
814
+ if not self.direct_access:
815
+ # N.B: only retrieved when direct access is enabled
816
+ return
817
+ api = await self.wait_for('async_api')
818
+ ver = await api.extra.version()
819
+ if to_version_tuple(ver, 4) < (3, 0, 18, 8, 0):
820
+ return
821
+ db_info = await api.sharding.database()
822
+ space = OPTION.api.header['space']
823
+ if db_info.space != space:
824
+ raise ValueError(
825
+ f'Space id in sharding database info invalid. '
826
+ f'Expected space id: {space}, actual: {db_info.space}'
829
827
  )
830
- if user_id := OPTION.api.header.get('user'):
831
- default_globals = {
832
- f'{self.spacemodule}::current_user_id':
833
- user_id
834
- }
835
- client = client.with_globals(**default_globals)
836
- self._globals = client._options.state._globals
828
+ return db_info.edgedbName
829
+
830
+ @property
831
+ def client(self):
832
+ if not self.direct_access:
833
+ self._globals = {}
834
+ return
835
+
836
+ if (client := getattr(self._clients, 'value', None)) is not None:
837
837
  return client
838
838
 
839
+ client = create_async_client(
840
+ default_module=self.appmodule,
841
+ dbname=self._internal_dbname
842
+ )
843
+ if user_id := OPTION.api.header.get('user'):
844
+ default_globals = {
845
+ f'{self.spacemodule}::current_user_id':
846
+ user_id
847
+ }
848
+ client = client.with_globals(**default_globals)
849
+ if self._globals is None:
850
+ self._globals = client._options.state._globals
851
+ self._clients.value = client
852
+ return client
853
+
839
854
  @future_property
840
855
  async def element_info(self):
841
856
  """元素信息"""
@@ -931,7 +946,9 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
931
946
  logger.opt(lazy=True).debug(f"Query: [{ql}],\n"
932
947
  f"kwargs: [{kwargs}],\n"
933
948
  f"globals: [{self._globals}].")
934
- _, result = await self.client.query(ql, **kwargs)
949
+ client = self.client
950
+ client._options.state._globals = self._globals
951
+ _, result = await client.query(ql, **kwargs)
935
952
  return result
936
953
 
937
954
  result = await self._http_query(ql, **kwargs)
@@ -972,7 +989,9 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
972
989
  logger.opt(lazy=True).debug(f"Query: [{ql}],\n"
973
990
  f"kwargs: [{kwargs}],\n"
974
991
  f"globals: [{self._globals}].")
975
- frame_desc, result = await self.client.query(ql, **kwargs)
992
+ client = self.client
993
+ client._options.state._globals = self._globals
994
+ frame_desc, result = await client.query(ql, **kwargs)
976
995
  return serutils.serialize(
977
996
  result, ctx=serutils.Context(frame_desc=frame_desc)
978
997
  )
@@ -1019,7 +1038,9 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
1019
1038
 
1020
1039
  """
1021
1040
  if self.direct_access:
1022
- frame_desc, data = await self.client.query(ql, **kwargs)
1041
+ client = self.client
1042
+ client._options.state._globals = self._globals
1043
+ frame_desc, data = await client.query(ql, **kwargs)
1023
1044
  # set of unnamed tuple
1024
1045
  if isinstance(frame_desc, list):
1025
1046
  return pd.DataFrame(
@@ -1061,8 +1082,7 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
1061
1082
  query_df.__doc__ = query_df.__doc__ + DOC_ARGS_KWARGS
1062
1083
 
1063
1084
  def _ensure_client(self):
1064
- if self.direct_access:
1065
- self.client # noqa
1085
+ self.client # noqa
1066
1086
 
1067
1087
  @txn_support
1068
1088
  async def execute(
@@ -1139,7 +1159,9 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
1139
1159
  return affected
1140
1160
 
1141
1161
  result = []
1142
- async for tx in self.client.transaction():
1162
+ client = self.client
1163
+ client._options.state._globals = self._globals
1164
+ async for tx in client.transaction():
1143
1165
  async with tx:
1144
1166
  for ql in qls_with_args:
1145
1167
  logger.opt(lazy=True).debug(
@@ -1815,14 +1837,17 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
1815
1837
  finally:
1816
1838
  raise NotImplemented('非直连模式不支持设置state信息')
1817
1839
  else:
1818
- bak_cli = self.client
1819
- bak_globals = self.client._options.state._globals
1840
+ if self._globals is None:
1841
+ bak_globals = self.client._options.state._globals
1842
+ else:
1843
+ bak_globals = self._globals
1820
1844
  try:
1821
- self.client = self.client.with_globals(**globals_)
1822
- self._globals = self.client._options.state._globals
1845
+ client = self.client
1846
+ client._options.state._globals = bak_globals
1847
+ client = client.with_globals(**globals_)
1848
+ self._globals = client._options.state._globals
1823
1849
  yield
1824
1850
  finally:
1825
- self.client = bak_cli
1826
1851
  self._globals = bak_globals
1827
1852
 
1828
1853
  @contextmanager
@@ -1833,14 +1858,17 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
1833
1858
  finally:
1834
1859
  raise NotImplemented('非直连模式不支持设置state信息')
1835
1860
  else:
1836
- bak_cli = self.client
1837
- bak_globals = self.client._options.state._globals
1861
+ if self._globals is None:
1862
+ bak_globals = self.client._options.state._globals
1863
+ else:
1864
+ bak_globals = self._globals
1838
1865
  try:
1839
- self.client = self.client.without_globals(*global_names)
1840
- self._globals = self.client._options.state._globals
1866
+ client = self.client
1867
+ client._options.state._globals = bak_globals
1868
+ client = client.without_globals(*global_names)
1869
+ self._globals = client._options.state._globals
1841
1870
  yield
1842
1871
  finally:
1843
- self.client = bak_cli
1844
1872
  self._globals = bak_globals
1845
1873
 
1846
1874
 
@@ -311,9 +311,14 @@ class AsyncWorkFlow(ElementBase[WorkFlowAPI]):
311
311
  内容一般来自文件管理的/files/upload或/files/upload/content响应值
312
312
 
313
313
 
314
+ Returns:
315
+ True: 成功
316
+ False: 失败
317
+
314
318
  .. admonition:: 示例
315
319
 
316
320
  .. code-block:: python
321
+
317
322
  from deepfos.api.platform import PlatformAPI
318
323
  from deepfos.element.workflow import WorkFlow
319
324
 
@@ -321,6 +326,7 @@ class AsyncWorkFlow(ElementBase[WorkFlowAPI]):
321
326
  upload_resp = PlatformAPI().file.upload(
322
327
  file_type='DL', file_name='t.txt', file='some text'
323
328
  )
329
+
324
330
  # 以动作approve,参数{"a": 1, "b": "42"}完成任务实例,
325
331
  # 并提供附件信息为上传的't.txt'文件,备注为"Completed by SDK"
326
332
  test_task = WorkFlow('test_task')
@@ -332,10 +338,6 @@ class AsyncWorkFlow(ElementBase[WorkFlowAPI]):
332
338
  attachments=[upload_resp]
333
339
  )
334
340
 
335
- Returns:
336
- True: 成功
337
- False: 失败
338
-
339
341
  """
340
342
  action_id = None
341
343
  if outcome is not None:
@@ -479,14 +479,14 @@ class TaskUtil:
479
479
  py_info: 任务实例对应的python元素信息,如未提供,仍可在 `run_job_contents` 中提供
480
480
 
481
481
  """
482
- api = TaskAPI(sync=True)
483
- _chunksize = 200
484
482
 
485
483
  def __init__(self, task_code, py_info: PyInfo = None):
486
484
  self.task_code = task_code
485
+ self.api = TaskAPI(sync=True)
487
486
  if self.meta is None:
488
487
  raise ValueError(f"No config for task_code: [{self.task_code}].")
489
488
  self.py_info = py_info
489
+ self._chunksize = 200
490
490
 
491
491
  @cached_property
492
492
  def meta(self):
@@ -579,18 +579,17 @@ class TaskUtil:
579
579
  if not_found_col:
580
580
  raise ValueError(f'Required columns:{sorted(not_found_col)} since they are compositeKeys.')
581
581
 
582
- @classmethod
583
- def _create_task_instance(cls, call_api, job_contents, payload):
584
- if job_contents.shape[0] <= cls._chunksize:
582
+ def _create_task_instance(self, call_api, job_contents, payload):
583
+ if job_contents.shape[0] <= self._chunksize:
585
584
  payload.jobContent = job_contents.to_dict(orient='records')
586
585
  payload.lastBatch = True
587
586
  call_api(payload)
588
587
  else:
589
- payload.jobContent = job_contents.iloc[0:cls._chunksize:].to_dict(orient='records')
588
+ payload.jobContent = job_contents.iloc[0:self._chunksize:].to_dict(orient='records')
590
589
  payload.batchId = call_api(payload).batchId
591
590
  payloads = []
592
591
 
593
- for batch_contents in split_dataframe(job_contents.iloc[cls._chunksize::], cls._chunksize):
592
+ for batch_contents in split_dataframe(job_contents.iloc[self._chunksize::], self._chunksize):
594
593
  payload.jobContent = batch_contents.to_dict(orient='records')
595
594
  payloads.append(payload)
596
595
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.63
3
+ Version: 1.1.65
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
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
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