deepfos 1.1.78__tar.gz → 1.1.80__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 (192) hide show
  1. {deepfos-1.1.78 → deepfos-1.1.80}/CHANGELOG.md +15 -0
  2. {deepfos-1.1.78 → deepfos-1.1.80}/PKG-INFO +1 -1
  3. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/_version.py +3 -3
  4. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/deepconnector.py +1 -0
  5. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/deepfos_task.py +1 -0
  6. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/financial_model.py +4 -0
  7. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/finmodel.py +19 -3
  8. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/edb_lexer.py +2 -0
  9. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/k8s.py +7 -1
  10. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/nacos.py +113 -22
  11. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/options.py +2 -0
  12. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/PKG-INFO +1 -1
  13. {deepfos-1.1.78 → deepfos-1.1.80}/.gitattributes +0 -0
  14. {deepfos-1.1.78 → deepfos-1.1.80}/.gitee/ISSUE_GUIDELINES.md +0 -0
  15. {deepfos-1.1.78 → deepfos-1.1.80}/.gitee/ISSUE_TEMPLATE.md +0 -0
  16. {deepfos-1.1.78 → deepfos-1.1.80}/.gitignore +0 -0
  17. {deepfos-1.1.78 → deepfos-1.1.80}/MANIFEST.in +0 -0
  18. {deepfos-1.1.78 → deepfos-1.1.80}/README.md +0 -0
  19. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/__init__.py +0 -0
  20. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/algo/__init__.py +0 -0
  21. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/algo/graph.py +0 -0
  22. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/__init__.py +0 -0
  23. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/business_model.py +0 -0
  24. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/dimension.py +0 -0
  25. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/models/__init__.py +0 -0
  26. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/models/business_model.py +0 -0
  27. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_1/models/dimension.py +0 -0
  28. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_2/__init__.py +0 -0
  29. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_2/dimension.py +0 -0
  30. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_2/models/__init__.py +0 -0
  31. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/V1_2/models/dimension.py +0 -0
  32. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/__init__.py +0 -0
  33. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/account.py +0 -0
  34. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/accounting_engines.py +0 -0
  35. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/app.py +0 -0
  36. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/approval_process.py +0 -0
  37. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/base.py +0 -0
  38. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/business_model.py +0 -0
  39. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/consolidation.py +0 -0
  40. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/consolidation_process.py +0 -0
  41. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/datatable.py +0 -0
  42. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/deep_pipeline.py +0 -0
  43. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/deepmodel.py +0 -0
  44. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/dimension.py +0 -0
  45. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/financial_model.py +0 -0
  46. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/journal_model.py +0 -0
  47. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/journal_template.py +0 -0
  48. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/memory_financial_model.py +0 -0
  49. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/__init__.py +0 -0
  50. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/account.py +0 -0
  51. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/accounting_engines.py +0 -0
  52. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/app.py +0 -0
  53. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/approval_process.py +0 -0
  54. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/base.py +0 -0
  55. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/business_model.py +0 -0
  56. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/consolidation.py +0 -0
  57. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/consolidation_process.py +0 -0
  58. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/datatable_mysql.py +0 -0
  59. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/deep_pipeline.py +0 -0
  60. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/deepconnector.py +0 -0
  61. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/deepfos_task.py +0 -0
  62. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/deepmodel.py +0 -0
  63. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/dimension.py +0 -0
  64. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/journal_model.py +0 -0
  65. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/journal_template.py +0 -0
  66. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/memory_financial_model.py +0 -0
  67. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/platform.py +0 -0
  68. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/python.py +0 -0
  69. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/reconciliation_engine.py +0 -0
  70. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/reconciliation_report.py +0 -0
  71. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/role_strategy.py +0 -0
  72. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/smartlist.py +0 -0
  73. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/space.py +0 -0
  74. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/system.py +0 -0
  75. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/variable.py +0 -0
  76. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/models/workflow.py +0 -0
  77. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/platform.py +0 -0
  78. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/python.py +0 -0
  79. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/reconciliation_engine.py +0 -0
  80. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/reconciliation_report.py +0 -0
  81. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/role_strategy.py +0 -0
  82. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/smartlist.py +0 -0
  83. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/space.py +0 -0
  84. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/system.py +0 -0
  85. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/variable.py +0 -0
  86. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/api/workflow.py +0 -0
  87. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/__init__.py +0 -0
  88. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/jstream.c +0 -0
  89. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/jstream.pyx +0 -0
  90. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/pandas.c +0 -0
  91. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/pandas.pyx +0 -0
  92. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/py_jstream.py +0 -0
  93. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/boost/py_pandas.py +0 -0
  94. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/cache.py +0 -0
  95. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/config.py +0 -0
  96. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/__init__.py +0 -0
  97. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/__init__.py +0 -0
  98. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/_base.py +0 -0
  99. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/constants.py +0 -0
  100. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/cube.py +0 -0
  101. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/formula.py +0 -0
  102. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/syscube.py +0 -0
  103. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/typing.py +0 -0
  104. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/cube/utils.py +0 -0
  105. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/__init__.py +0 -0
  106. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/_base.py +0 -0
  107. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/dimcreator.py +0 -0
  108. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/dimension.py +0 -0
  109. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/dimexpr.py +0 -0
  110. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/dimmember.py +0 -0
  111. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/eledimension.py +0 -0
  112. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/filters.py +0 -0
  113. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/dimension/sysdimension.py +0 -0
  114. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/__init__.py +0 -0
  115. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/_cache.py +0 -0
  116. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/_operator.py +0 -0
  117. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/nodemixin.py +0 -0
  118. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/sqlcondition.py +0 -0
  119. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/core/logictable/tablemodel.py +0 -0
  120. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/__init__.py +0 -0
  121. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/cipher.py +0 -0
  122. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/clickhouse.py +0 -0
  123. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/connector.py +0 -0
  124. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/daclickhouse.py +0 -0
  125. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/dameng.py +0 -0
  126. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/damysql.py +0 -0
  127. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/dbkits.py +0 -0
  128. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/deepengine.py +0 -0
  129. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/deepmodel.py +0 -0
  130. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/deepmodel_kingbase.py +0 -0
  131. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/edb.py +0 -0
  132. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/gauss.py +0 -0
  133. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/kingbase.py +0 -0
  134. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/mysql.py +0 -0
  135. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/oracle.py +0 -0
  136. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/postgresql.py +0 -0
  137. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/sqlserver.py +0 -0
  138. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/db/utils.py +0 -0
  139. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/__init__.py +0 -0
  140. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/accounting.py +0 -0
  141. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/apvlprocess.py +0 -0
  142. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/base.py +0 -0
  143. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/bizmodel.py +0 -0
  144. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/datatable.py +0 -0
  145. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/deep_pipeline.py +0 -0
  146. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/deepconnector.py +0 -0
  147. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/deepmodel.py +0 -0
  148. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/dimension.py +0 -0
  149. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/fact_table.py +0 -0
  150. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/journal.py +0 -0
  151. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/journal_template.py +0 -0
  152. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/pyscript.py +0 -0
  153. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/reconciliation.py +0 -0
  154. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/rolestrategy.py +0 -0
  155. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/smartlist.py +0 -0
  156. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/variable.py +0 -0
  157. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/element/workflow.py +0 -0
  158. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/exceptions/__init__.py +0 -0
  159. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/exceptions/hook.py +0 -0
  160. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lazy.py +0 -0
  161. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/__init__.py +0 -0
  162. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/_javaobj.py +0 -0
  163. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/asynchronous.py +0 -0
  164. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/concurrency.py +0 -0
  165. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/constant.py +0 -0
  166. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/decorator.py +0 -0
  167. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/deepchart.py +0 -0
  168. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/deepux.py +0 -0
  169. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/discovery.py +0 -0
  170. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/eureka.py +0 -0
  171. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/filterparser.py +0 -0
  172. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/httpcli.py +0 -0
  173. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/jsonstreamer.py +0 -0
  174. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/msg.py +0 -0
  175. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/patch.py +0 -0
  176. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/redis.py +0 -0
  177. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/serutils.py +0 -0
  178. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/stopwatch.py +0 -0
  179. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/subtask.py +0 -0
  180. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/sysutils.py +0 -0
  181. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/lib/utils.py +0 -0
  182. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/local.py +0 -0
  183. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos/translation.py +0 -0
  184. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/SOURCES.txt +0 -0
  185. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/dependency_links.txt +0 -0
  186. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/not-zip-safe +0 -0
  187. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/requires.txt +0 -0
  188. {deepfos-1.1.78 → deepfos-1.1.80}/deepfos.egg-info/top_level.txt +0 -0
  189. {deepfos-1.1.78 → deepfos-1.1.80}/requirements.txt +0 -0
  190. {deepfos-1.1.78 → deepfos-1.1.80}/setup.cfg +0 -0
  191. {deepfos-1.1.78 → deepfos-1.1.80}/setup.py +0 -0
  192. {deepfos-1.1.78 → deepfos-1.1.80}/versioneer.py +0 -0
@@ -1,3 +1,18 @@
1
+ ## [1.1.80] - 2026-01-14
2
+
3
+ ### 更新
4
+
5
+ * 修复DeepConnectorAPI/TaskAPI在take_over=True情况下不可用的bug
6
+
7
+ ## [1.1.79] - 2026-01-12
8
+
9
+ ### 更新
10
+
11
+ * k8s客户端不校验证书有效性
12
+ * FinancialCube添加两个参数dataAuditSwitch和cmtSwitch
13
+ * DeepQL允许使用`__bk__` 作为查询字段
14
+ * nacos支持账号密码验证
15
+
1
16
  ## [1.1.78] - 2025-12-11
2
17
 
3
18
  ### 更新
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.78
3
+ Version: 1.1.80
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-12-22T07:20:38+0000",
11
+ "date": "2026-01-14T10:28:13+0000",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "1a939ca4b6be850040e0d9076eaf235608eebb23",
15
- "version": "1.1.78"
14
+ "full-revisionid": "1019f357203aa3e5a0453b8ef6ff017aea04d148",
15
+ "version": "1.1.80"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -27,6 +27,7 @@ class DataSourceAPI(ChildAPI):
27
27
  class DeepConnectorAPI(RootAPI):
28
28
  """连接器组件接口"""
29
29
  prefix = lambda: 'http://deep-connector-server'
30
+ server_name = 'deep-connector-server'
30
31
  url_need_format = True
31
32
  module_type = 'CONN'
32
33
 
@@ -74,6 +74,7 @@ class Job(ChildAPI):
74
74
  class TaskAPI(RootAPI):
75
75
  """任务管理接口"""
76
76
  prefix = lambda: OPTION.server.deepfos_task
77
+ server_name = 'deep-task-server'
77
78
 
78
79
  @cached_property
79
80
  def task_instance(self) -> TaskInstance:
@@ -122,6 +122,10 @@ class CopyCalculateDTO(BaseModel):
122
122
  fixMembers: Optional[str] = None
123
123
  #: formula表达式
124
124
  formula: Optional[str] = None
125
+ #: 是否记录数据审计
126
+ dataAuditSwitch: Optional[bool] = None
127
+ #: 是否拷贝批注
128
+ cmtSwitch: Optional[bool] = None
125
129
 
126
130
 
127
131
  class CubeDataLogForm(BaseModel):
@@ -1393,13 +1393,21 @@ class AsyncFinancialCube(ElementBase[FinancialModelAPI]):
1393
1393
  processMap=process_map,
1394
1394
  status=status))
1395
1395
 
1396
- async def copy_calculate(self, formula: str, fix_members: str):
1396
+ async def copy_calculate(
1397
+ self,
1398
+ formula: str,
1399
+ fix_members: str,
1400
+ data_audit_switch: Optional[bool] = None,
1401
+ cmt_switch: Optional[bool] = None,
1402
+ ):
1397
1403
  """
1398
1404
  cube copy计算接口
1399
1405
 
1400
1406
  Args:
1401
1407
  formula: 维度成员来源和目的的表达式
1402
1408
  fix_members: 维度成员的筛选表达式
1409
+ data_audit_switch: 是否记录数据审计
1410
+ cmt_switch: 是否拷贝批注
1403
1411
 
1404
1412
  Returns:
1405
1413
  更新结果
@@ -1422,7 +1430,9 @@ class AsyncFinancialCube(ElementBase[FinancialModelAPI]):
1422
1430
  cubePath=self._path,
1423
1431
  formula=formula,
1424
1432
  fixMembers=fix_members,
1425
- entryObject="python"
1433
+ entryObject="python",
1434
+ dataAuditSwitch=data_audit_switch,
1435
+ cmtSwitch=cmt_switch,
1426
1436
  )
1427
1437
  )
1428
1438
 
@@ -1861,7 +1871,13 @@ class FinancialCube(AsyncFinancialCube, metaclass=SyncMeta):
1861
1871
  ):
1862
1872
  ...
1863
1873
 
1864
- def copy_calculate(self, formula: str, fix_members: str):
1874
+ def copy_calculate(
1875
+ self,
1876
+ formula: str,
1877
+ fix_members: str,
1878
+ data_audit_switch: Optional[bool] = None,
1879
+ cmt_switch: Optional[bool] = None,
1880
+ ):
1865
1881
  ...
1866
1882
 
1867
1883
  def mdx_execution(
@@ -652,6 +652,8 @@ class EdgeQLLexer(Lexer):
652
652
  Rule(token='BADIDENT',
653
653
  next_state=STATE_KEEP,
654
654
  regexp=r'''
655
+ (?!__bk__\b)
656
+ (?!`__bk__`)
655
657
  __[^\W\d]\w*__
656
658
  |
657
659
  `__([^`]|``)*__`(?!`)
@@ -16,7 +16,7 @@ from deepfos.lib.discovery import ServiceDiscovery
16
16
  from deepfos import OPTION
17
17
 
18
18
 
19
- class K8s(ServiceDiscovery):
19
+ class K8sCli(ServiceDiscovery):
20
20
  def __init__(self):
21
21
  super().__init__()
22
22
  self._instance_lock: Dict[str, asyncio.Lock] = defaultdict(asyncio.Lock)
@@ -34,6 +34,9 @@ class K8s(ServiceDiscovery):
34
34
 
35
35
  @cached_property
36
36
  def _api(self):
37
+ c = client.Configuration.get_default_copy()
38
+ c.verify_ssl = False
39
+ client.Configuration.set_default(c)
37
40
  return client.CoreV1Api()
38
41
 
39
42
  async def on_interval(self):
@@ -99,3 +102,6 @@ class K8s(ServiceDiscovery):
99
102
  logger.debug(f"{server_name} has no active endpoint, clear invalid...")
100
103
  for item in list(cache):
101
104
  cache.delete(item)
105
+
106
+
107
+ K8s = K8sCli()
@@ -2,15 +2,16 @@ import asyncio
2
2
  import functools
3
3
  import json
4
4
  from collections import defaultdict
5
- from typing import TypedDict, Any, Tuple, Type, Dict
5
+ from typing import TypedDict, Any, Tuple, Type, Dict, Optional
6
6
 
7
7
  from loguru import logger
8
+ from aiohttp import ClientError
8
9
 
9
10
  from deepfos import OPTION
10
11
  from deepfos.exceptions import APIResponseError
11
- from deepfos.lib.discovery import ServiceDiscovery
12
+ from deepfos.lib.discovery import ServiceDiscovery, RankedCache
12
13
  from deepfos.lib.httpcli import AioHttpCli
13
- from deepfos.lib.utils import concat_url
14
+ from deepfos.lib.utils import concat_url, retry
14
15
 
15
16
  __all__ = ['Nacos']
16
17
 
@@ -78,20 +79,46 @@ class Route: # pragma: no cover
78
79
  is_get = method == 'GET'
79
80
 
80
81
  @functools.wraps(func)
81
- async def call(*args, **kwargs):
82
- ins = args[0]
83
- url = concat_url(ins.base_url, endpoint)
84
- body = func(ins, *args[1::], **kwargs)
85
- logger.opt(lazy=True).debug(
86
- f"Sending request: {method} {url} "
87
- f"body: {repr(body)}"
88
- )
82
+ async def call(ins: "NacosAPI", *args, **kwargs):
83
+ body = func(ins, *args, **kwargs)
89
84
  req_args = {
90
85
  'headers': ins.header,
91
86
  'params' if is_get else 'data': body
92
87
  }
93
- response = await request(url, **req_args)
94
- text = await response.text()
88
+ url_cache = ins.base_urls
89
+ for i, base_url in zip(reversed(range(len(url_cache))), url_cache.sort()):
90
+ is_last_url = i == 0
91
+ try:
92
+ url = concat_url(base_url, endpoint)
93
+ logger.opt(lazy=True).debug(
94
+ f"Sending request: {method} {url} "
95
+ f"body: {repr(body)}"
96
+ )
97
+ response = await request(url, **req_args)
98
+ if (
99
+ response.status == 403
100
+ and func.__qualname__ != 'NacosAPI.login'
101
+ ):
102
+ # retry if token expired
103
+ if await ins.maybe_login(schedule_renewal=False):
104
+ body.update(func(ins, *args, **kwargs))
105
+ response = await request(url, **req_args)
106
+
107
+ if not (200 <= response.status < 300):
108
+ raise APIResponseError(
109
+ f"Call API: {endpoint} failed with http status: {response.status}"
110
+ )
111
+ url_cache.reward(base_url)
112
+ break
113
+ except ClientError as e:
114
+ url_cache.punish(base_url)
115
+ if is_last_url:
116
+ logger.warning(f"Request of all urls failed.")
117
+ raise
118
+ else:
119
+ logger.warning(f"Request failed with {e}, try next url...")
120
+
121
+ text = await response.text() # noqa
95
122
  if response_checker is not None:
96
123
  ok, result = response_checker.validate(text, endpoint)
97
124
  if not ok:
@@ -109,28 +136,89 @@ class Route: # pragma: no cover
109
136
  return execute
110
137
 
111
138
 
139
+ def auth(func):
140
+ @functools.wraps(func)
141
+ def wrapper(self, *args, **kwargs):
142
+ resp = func(self, *args, **kwargs)
143
+ if token := getattr(self, '_token', None):
144
+ resp['accessToken'] = token
145
+ return resp
146
+
147
+ return wrapper
148
+
149
+
112
150
  get = Route(method='get')
151
+ post = Route(method='post')
113
152
 
114
153
 
115
154
  class NacosAPI:
116
155
  def __init__(self): # noqa
117
156
  nacos_server: str = OPTION.nacos.server.lower()
118
- if nacos_server.rstrip('/').endswith('nacos'):
119
- base_url = nacos_server
120
- else:
121
- base_url = concat_url(nacos_server, 'nacos')
122
-
123
- self.base_url = concat_url(base_url, 'v1')
157
+ self._base_urls = self._resolve_base_urls(nacos_server)
124
158
  self.header = {"Content-Type": "application/x-www-form-urlencoded"}
159
+ self._token = None
160
+ self._user = OPTION.nacos.user
161
+ self._password = OPTION.nacos.password
162
+
163
+ @staticmethod
164
+ def _resolve_base_urls(url: str) -> RankedCache:
165
+ urls = RankedCache()
166
+ for nacos_server in url.split(','):
167
+ if nacos_server.rstrip('/').endswith('nacos'):
168
+ base_url = nacos_server
169
+ else:
170
+ base_url = concat_url(nacos_server, 'nacos')
171
+ urls.add(concat_url(base_url, 'v1'))
172
+ return urls
173
+
174
+ @property
175
+ def base_urls(self) -> RankedCache:
176
+ return self._base_urls
177
+
178
+ async def maybe_login(
179
+ self,
180
+ schedule_renewal: bool = True,
181
+ delay: Optional[float] = None,
182
+ ) -> bool:
183
+ if self._user is not None and self._password is not None:
184
+ if delay:
185
+ await asyncio.sleep(delay)
186
+
187
+ resp = await retry(self.login, wait=1)(self._user, self._password)
188
+ self._token = resp['accessToken']
189
+
190
+ ttl = resp['tokenTtl']
191
+ if schedule_renewal:
192
+ _ = asyncio.create_task(self.maybe_login(
193
+ schedule_renewal=True,
194
+ delay=min((ttl * 2 / 3), ttl - 5)
195
+ ))
196
+ return True
197
+ return False
198
+
199
+ @post('auth/login', JsonResponse)
200
+ def login(self, user: str, password: str):
201
+ return {
202
+ "username": user,
203
+ "password": password
204
+ }
125
205
 
126
206
  @get('ns/service/list', JsonResponse)
127
- def list_service(self): # pragma: no cover
207
+ @auth
208
+ def list_service(
209
+ self,
210
+ group: str = 'DEFAULT_GROUP',
211
+ namespace: str = 'public',
212
+ ):
128
213
  return {
129
214
  'pageNo': 1,
130
215
  'pageSize': 1000000,
216
+ 'namespaceId': namespace,
217
+ 'groupName': group,
131
218
  }
132
219
 
133
220
  @get('ns/instance/list', JsonResponse)
221
+ @auth
134
222
  def list_instance(
135
223
  self,
136
224
  service_name: str,
@@ -163,7 +251,7 @@ class NacosCli(ServiceDiscovery):
163
251
  self._instance_lock.clear()
164
252
 
165
253
  async def on_startup(self):
166
- pass
254
+ await self._api.maybe_login()
167
255
 
168
256
  async def on_interval(self):
169
257
  await self._update_cache()
@@ -186,7 +274,10 @@ class NacosCli(ServiceDiscovery):
186
274
  await self.update_instance_for_service(server_name)
187
275
 
188
276
  async def update_services(self):
189
- new_services = frozenset((await self._api.list_service())['doms'])
277
+ new_services = frozenset((await self._api.list_service(
278
+ group=self._group,
279
+ namespace=self._ns,
280
+ ))['doms'])
190
281
  cur_services = frozenset(self.server_cache.keys())
191
282
 
192
283
  if added := new_services - cur_services:
@@ -510,6 +510,8 @@ class _Nacos(_Category):
510
510
  cluster = _Option('DEFAULT', val_type=str)
511
511
  namespace = _Option('public', val_type=str)
512
512
  group = _Option('DEFAULT_GROUP', val_type=str)
513
+ user = _Option(None, val_type=str)
514
+ password = _Option(None, val_type=str)
513
515
 
514
516
  def __get__(self, instance, owner) -> '_Nacos':
515
517
  """defined to help ide"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.78
3
+ Version: 1.1.80
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