cognite-toolkit 0.7.30__py3-none-any.whl → 0.7.51__py3-none-any.whl

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 (281) hide show
  1. cognite_toolkit/_cdf.py +5 -6
  2. cognite_toolkit/_cdf_tk/apps/__init__.py +2 -0
  3. cognite_toolkit/_cdf_tk/apps/_core_app.py +7 -1
  4. cognite_toolkit/_cdf_tk/apps/_download_app.py +2 -2
  5. cognite_toolkit/_cdf_tk/apps/_dump_app.py +1 -1
  6. cognite_toolkit/_cdf_tk/apps/_import_app.py +41 -0
  7. cognite_toolkit/_cdf_tk/apps/_migrate_app.py +183 -8
  8. cognite_toolkit/_cdf_tk/builders/_function.py +81 -9
  9. cognite_toolkit/_cdf_tk/builders/_raw.py +1 -1
  10. cognite_toolkit/_cdf_tk/client/_resource_base.py +187 -0
  11. cognite_toolkit/_cdf_tk/client/_toolkit_client.py +44 -12
  12. cognite_toolkit/_cdf_tk/client/api/agents.py +107 -0
  13. cognite_toolkit/_cdf_tk/client/api/annotations.py +129 -0
  14. cognite_toolkit/_cdf_tk/client/api/assets.py +130 -0
  15. cognite_toolkit/_cdf_tk/client/api/containers.py +132 -0
  16. cognite_toolkit/_cdf_tk/client/api/data_models.py +137 -0
  17. cognite_toolkit/_cdf_tk/client/api/datasets.py +141 -0
  18. cognite_toolkit/_cdf_tk/client/api/events.py +129 -0
  19. cognite_toolkit/_cdf_tk/client/api/extraction_pipelines.py +148 -0
  20. cognite_toolkit/_cdf_tk/client/api/filemetadata.py +176 -0
  21. cognite_toolkit/_cdf_tk/client/api/function_schedules.py +115 -0
  22. cognite_toolkit/_cdf_tk/client/api/functions.py +113 -0
  23. cognite_toolkit/_cdf_tk/client/api/graphql_data_models.py +167 -0
  24. cognite_toolkit/_cdf_tk/client/api/groups.py +121 -0
  25. cognite_toolkit/_cdf_tk/client/api/hosted_extractor_destinations.py +131 -0
  26. cognite_toolkit/_cdf_tk/client/api/hosted_extractor_jobs.py +122 -0
  27. cognite_toolkit/_cdf_tk/client/api/hosted_extractor_mappings.py +129 -0
  28. cognite_toolkit/_cdf_tk/client/api/hosted_extractor_sources.py +136 -0
  29. cognite_toolkit/_cdf_tk/client/api/hosted_extractors.py +23 -0
  30. cognite_toolkit/_cdf_tk/client/api/infield.py +40 -35
  31. cognite_toolkit/_cdf_tk/client/api/instances.py +139 -0
  32. cognite_toolkit/_cdf_tk/client/api/labels.py +125 -0
  33. cognite_toolkit/_cdf_tk/client/api/{canvas.py → legacy/canvas.py} +16 -8
  34. cognite_toolkit/_cdf_tk/client/api/{charts.py → legacy/charts.py} +1 -1
  35. cognite_toolkit/_cdf_tk/client/api/{extended_data_modeling.py → legacy/extended_data_modeling.py} +1 -1
  36. cognite_toolkit/_cdf_tk/client/api/{extended_files.py → legacy/extended_files.py} +2 -2
  37. cognite_toolkit/_cdf_tk/client/api/{extended_functions.py → legacy/extended_functions.py} +9 -9
  38. cognite_toolkit/_cdf_tk/client/api/{extended_raw.py → legacy/extended_raw.py} +1 -1
  39. cognite_toolkit/_cdf_tk/client/api/{extended_timeseries.py → legacy/extended_timeseries.py} +5 -2
  40. cognite_toolkit/_cdf_tk/client/api/legacy/location_filters.py +112 -0
  41. cognite_toolkit/_cdf_tk/client/api/legacy/robotics/__init__.py +8 -0
  42. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/capabilities.py +1 -1
  43. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/data_postprocessing.py +1 -1
  44. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/frames.py +1 -1
  45. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/locations.py +1 -1
  46. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/maps.py +1 -1
  47. cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/robots.py +2 -2
  48. cognite_toolkit/_cdf_tk/client/api/legacy/search_config.py +53 -0
  49. cognite_toolkit/_cdf_tk/client/api/location_filters.py +140 -75
  50. cognite_toolkit/_cdf_tk/client/api/migration.py +2 -3
  51. cognite_toolkit/_cdf_tk/client/api/project.py +9 -8
  52. cognite_toolkit/_cdf_tk/client/api/raw.py +204 -0
  53. cognite_toolkit/_cdf_tk/client/api/relationships.py +133 -0
  54. cognite_toolkit/_cdf_tk/client/api/robotics.py +19 -0
  55. cognite_toolkit/_cdf_tk/client/api/robotics_capabilities.py +127 -0
  56. cognite_toolkit/_cdf_tk/client/api/robotics_data_postprocessing.py +138 -0
  57. cognite_toolkit/_cdf_tk/client/api/robotics_frames.py +122 -0
  58. cognite_toolkit/_cdf_tk/client/api/robotics_locations.py +127 -0
  59. cognite_toolkit/_cdf_tk/client/api/robotics_maps.py +122 -0
  60. cognite_toolkit/_cdf_tk/client/api/robotics_robots.py +122 -0
  61. cognite_toolkit/_cdf_tk/client/api/search.py +2 -2
  62. cognite_toolkit/_cdf_tk/client/api/search_config.py +83 -31
  63. cognite_toolkit/_cdf_tk/client/api/security_categories.py +94 -0
  64. cognite_toolkit/_cdf_tk/client/api/sequences.py +133 -0
  65. cognite_toolkit/_cdf_tk/client/api/simulator_models.py +154 -0
  66. cognite_toolkit/_cdf_tk/client/api/simulators.py +8 -0
  67. cognite_toolkit/_cdf_tk/client/api/spaces.py +117 -0
  68. cognite_toolkit/_cdf_tk/client/api/streams.py +68 -56
  69. cognite_toolkit/_cdf_tk/client/api/three_d.py +385 -34
  70. cognite_toolkit/_cdf_tk/client/api/timeseries.py +137 -0
  71. cognite_toolkit/_cdf_tk/client/api/token.py +1 -1
  72. cognite_toolkit/_cdf_tk/client/api/transformations.py +146 -0
  73. cognite_toolkit/_cdf_tk/client/api/views.py +139 -0
  74. cognite_toolkit/_cdf_tk/client/api/workflow_triggers.py +128 -0
  75. cognite_toolkit/_cdf_tk/client/api/workflow_versions.py +138 -0
  76. cognite_toolkit/_cdf_tk/client/api/workflows.py +119 -0
  77. cognite_toolkit/_cdf_tk/client/cdf_client/__init__.py +10 -0
  78. cognite_toolkit/_cdf_tk/client/cdf_client/api.py +358 -0
  79. cognite_toolkit/_cdf_tk/client/cdf_client/responses.py +38 -0
  80. cognite_toolkit/_cdf_tk/{utils → client}/http_client/__init__.py +30 -0
  81. cognite_toolkit/_cdf_tk/{utils → client}/http_client/_client.py +26 -16
  82. cognite_toolkit/_cdf_tk/{utils → client}/http_client/_data_classes.py +18 -2
  83. cognite_toolkit/_cdf_tk/client/http_client/_data_classes2.py +151 -0
  84. cognite_toolkit/_cdf_tk/client/http_client/_exception.py +13 -0
  85. cognite_toolkit/_cdf_tk/client/http_client/_item_classes.py +118 -0
  86. cognite_toolkit/_cdf_tk/{utils → client}/http_client/_tracker.py +5 -2
  87. cognite_toolkit/_cdf_tk/client/request_classes/base.py +19 -0
  88. cognite_toolkit/_cdf_tk/client/request_classes/filters.py +113 -0
  89. cognite_toolkit/_cdf_tk/client/request_classes/graphql.py +28 -0
  90. cognite_toolkit/_cdf_tk/client/resource_classes/__init__.py +0 -0
  91. cognite_toolkit/_cdf_tk/client/resource_classes/agent.py +130 -0
  92. cognite_toolkit/_cdf_tk/client/resource_classes/annotation.py +79 -0
  93. cognite_toolkit/_cdf_tk/client/resource_classes/apm_config.py +128 -0
  94. cognite_toolkit/_cdf_tk/client/resource_classes/asset.py +47 -0
  95. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/charts_data.py +1 -1
  96. cognite_toolkit/_cdf_tk/client/resource_classes/cognite_file.py +53 -0
  97. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/__init__.py +168 -0
  98. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_constraints.py +37 -0
  99. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_container.py +50 -0
  100. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_data_model.py +73 -0
  101. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_data_types.py +116 -0
  102. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_indexes.py +26 -0
  103. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_instance.py +154 -0
  104. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_references.py +86 -0
  105. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_space.py +26 -0
  106. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_view.py +143 -0
  107. cognite_toolkit/_cdf_tk/client/resource_classes/data_modeling/_view_property.py +152 -0
  108. cognite_toolkit/_cdf_tk/client/resource_classes/dataset.py +35 -0
  109. cognite_toolkit/_cdf_tk/client/resource_classes/event.py +40 -0
  110. cognite_toolkit/_cdf_tk/client/resource_classes/extraction_pipeline.py +59 -0
  111. cognite_toolkit/_cdf_tk/client/resource_classes/filemetadata.py +52 -0
  112. cognite_toolkit/_cdf_tk/client/resource_classes/function.py +53 -0
  113. cognite_toolkit/_cdf_tk/client/resource_classes/function_schedule.py +65 -0
  114. cognite_toolkit/_cdf_tk/client/resource_classes/graphql_data_model.py +40 -0
  115. cognite_toolkit/_cdf_tk/client/resource_classes/group/__init__.py +187 -0
  116. cognite_toolkit/_cdf_tk/client/resource_classes/group/_constants.py +2 -0
  117. cognite_toolkit/_cdf_tk/client/resource_classes/group/acls.py +653 -0
  118. cognite_toolkit/_cdf_tk/client/resource_classes/group/capability.py +56 -0
  119. cognite_toolkit/_cdf_tk/client/resource_classes/group/group.py +63 -0
  120. cognite_toolkit/_cdf_tk/client/resource_classes/group/scopes.py +166 -0
  121. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_destination.py +34 -0
  122. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_job.py +134 -0
  123. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_mapping.py +72 -0
  124. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/__init__.py +63 -0
  125. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_auth.py +63 -0
  126. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_base.py +26 -0
  127. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_certificate.py +20 -0
  128. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_eventhub.py +31 -0
  129. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_kafka.py +53 -0
  130. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_mqtt.py +36 -0
  131. cognite_toolkit/_cdf_tk/client/resource_classes/hosted_extractor_source/_rest.py +49 -0
  132. cognite_toolkit/_cdf_tk/client/resource_classes/identifiers.py +59 -0
  133. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/infield.py +1 -1
  134. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/instance_api.py +53 -14
  135. cognite_toolkit/_cdf_tk/client/resource_classes/label.py +27 -0
  136. cognite_toolkit/_cdf_tk/client/resource_classes/legacy/__init__.py +0 -0
  137. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/canvas.py +48 -15
  138. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/charts.py +1 -1
  139. cognite_toolkit/_cdf_tk/client/resource_classes/location_filter.py +84 -0
  140. cognite_toolkit/_cdf_tk/client/resource_classes/raw.py +44 -0
  141. cognite_toolkit/_cdf_tk/client/resource_classes/relationship.py +49 -0
  142. cognite_toolkit/_cdf_tk/client/resource_classes/resource_view_mapping.py +38 -0
  143. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/__init__.py +37 -0
  144. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_capability.py +53 -0
  145. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_common.py +34 -0
  146. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_data_post_processing.py +49 -0
  147. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_frame.py +46 -0
  148. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_location.py +36 -0
  149. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_map.py +65 -0
  150. cognite_toolkit/_cdf_tk/client/resource_classes/robotics/_robot.py +58 -0
  151. cognite_toolkit/_cdf_tk/client/resource_classes/search_config.py +54 -0
  152. cognite_toolkit/_cdf_tk/client/resource_classes/securitycategory.py +24 -0
  153. cognite_toolkit/_cdf_tk/client/resource_classes/sequence.py +45 -0
  154. cognite_toolkit/_cdf_tk/client/resource_classes/sequence_rows.py +56 -0
  155. cognite_toolkit/_cdf_tk/client/resource_classes/simulator_model.py +50 -0
  156. cognite_toolkit/_cdf_tk/client/resource_classes/streamlit_.py +71 -0
  157. cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/streams.py +9 -26
  158. cognite_toolkit/_cdf_tk/client/resource_classes/three_d.py +135 -0
  159. cognite_toolkit/_cdf_tk/client/resource_classes/timeseries.py +52 -0
  160. cognite_toolkit/_cdf_tk/client/resource_classes/transformation.py +140 -0
  161. cognite_toolkit/_cdf_tk/client/resource_classes/workflow.py +27 -0
  162. cognite_toolkit/_cdf_tk/client/resource_classes/workflow_trigger.py +63 -0
  163. cognite_toolkit/_cdf_tk/client/resource_classes/workflow_version.py +155 -0
  164. cognite_toolkit/_cdf_tk/client/testing.py +54 -17
  165. cognite_toolkit/_cdf_tk/commands/__init__.py +1 -0
  166. cognite_toolkit/_cdf_tk/commands/_migrate/command.py +103 -108
  167. cognite_toolkit/_cdf_tk/commands/_migrate/conversion.py +29 -16
  168. cognite_toolkit/_cdf_tk/commands/_migrate/creators.py +1 -1
  169. cognite_toolkit/_cdf_tk/commands/_migrate/data_classes.py +38 -6
  170. cognite_toolkit/_cdf_tk/commands/_migrate/data_mapper.py +262 -36
  171. cognite_toolkit/_cdf_tk/commands/_migrate/data_model.py +1 -0
  172. cognite_toolkit/_cdf_tk/commands/_migrate/default_mappings.py +1 -1
  173. cognite_toolkit/_cdf_tk/commands/_migrate/issues.py +39 -38
  174. cognite_toolkit/_cdf_tk/commands/_migrate/migration_io.py +227 -8
  175. cognite_toolkit/_cdf_tk/commands/_profile.py +1 -1
  176. cognite_toolkit/_cdf_tk/commands/_purge.py +14 -16
  177. cognite_toolkit/_cdf_tk/commands/_upload.py +1 -1
  178. cognite_toolkit/_cdf_tk/commands/build_cmd.py +12 -2
  179. cognite_toolkit/_cdf_tk/commands/build_v2/__init__.py +0 -0
  180. cognite_toolkit/_cdf_tk/commands/build_v2/_module_parser.py +138 -0
  181. cognite_toolkit/_cdf_tk/commands/build_v2/_modules_parser.py +163 -0
  182. cognite_toolkit/_cdf_tk/commands/build_v2/build_cmd.py +228 -0
  183. cognite_toolkit/_cdf_tk/commands/build_v2/build_parameters.py +71 -0
  184. cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_modules.py +27 -0
  185. cognite_toolkit/_cdf_tk/commands/build_v2/data_classes/_resource.py +22 -0
  186. cognite_toolkit/_cdf_tk/commands/dump_resource.py +4 -4
  187. cognite_toolkit/_cdf_tk/commands/pull.py +97 -2
  188. cognite_toolkit/_cdf_tk/commands/run.py +1 -1
  189. cognite_toolkit/_cdf_tk/cruds/__init__.py +16 -6
  190. cognite_toolkit/_cdf_tk/cruds/_data_cruds.py +9 -5
  191. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/__init__.py +2 -0
  192. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/auth.py +6 -2
  193. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/classic.py +70 -89
  194. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/configuration.py +1 -1
  195. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/datamodel.py +1 -1
  196. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/extraction_pipeline.py +1 -1
  197. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/fieldops.py +34 -25
  198. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/file.py +50 -59
  199. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/function.py +14 -2
  200. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/industrial_tool.py +1 -1
  201. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/location.py +4 -3
  202. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/migration.py +1 -1
  203. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/raw.py +6 -1
  204. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/relationship.py +5 -4
  205. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/robotics.py +1 -1
  206. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/simulators.py +122 -0
  207. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/streams.py +15 -31
  208. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/timeseries.py +42 -47
  209. cognite_toolkit/_cdf_tk/cruds/_resource_cruds/transformation.py +49 -14
  210. cognite_toolkit/_cdf_tk/data_classes/__init__.py +3 -0
  211. cognite_toolkit/_cdf_tk/data_classes/_issues.py +36 -0
  212. cognite_toolkit/_cdf_tk/data_classes/_module_directories.py +2 -1
  213. cognite_toolkit/_cdf_tk/data_classes/_module_toml.py +1 -0
  214. cognite_toolkit/_cdf_tk/data_classes/_tracking_info.py +4 -0
  215. cognite_toolkit/_cdf_tk/feature_flags.py +8 -0
  216. cognite_toolkit/_cdf_tk/resource_classes/__init__.py +2 -0
  217. cognite_toolkit/_cdf_tk/resource_classes/capabilities.py +6 -0
  218. cognite_toolkit/_cdf_tk/resource_classes/search_config.py +1 -1
  219. cognite_toolkit/_cdf_tk/resource_classes/simulator_model.py +17 -0
  220. cognite_toolkit/_cdf_tk/resource_classes/workflow_version.py +173 -5
  221. cognite_toolkit/_cdf_tk/storageio/_applications.py +53 -15
  222. cognite_toolkit/_cdf_tk/storageio/_asset_centric.py +117 -107
  223. cognite_toolkit/_cdf_tk/storageio/_base.py +3 -1
  224. cognite_toolkit/_cdf_tk/storageio/_datapoints.py +7 -7
  225. cognite_toolkit/_cdf_tk/storageio/_file_content.py +65 -56
  226. cognite_toolkit/_cdf_tk/storageio/_instances.py +1 -1
  227. cognite_toolkit/_cdf_tk/storageio/_raw.py +1 -1
  228. cognite_toolkit/_cdf_tk/storageio/logger.py +162 -0
  229. cognite_toolkit/_cdf_tk/storageio/selectors/__init__.py +10 -1
  230. cognite_toolkit/_cdf_tk/storageio/selectors/_three_d.py +34 -0
  231. cognite_toolkit/_cdf_tk/tk_warnings/__init__.py +2 -0
  232. cognite_toolkit/_cdf_tk/tk_warnings/fileread.py +20 -0
  233. cognite_toolkit/_cdf_tk/utils/__init__.py +11 -1
  234. cognite_toolkit/_cdf_tk/utils/cdf.py +1 -1
  235. cognite_toolkit/_cdf_tk/utils/interactive_select.py +53 -4
  236. cognite_toolkit/_cdf_tk/utils/modules.py +7 -0
  237. cognite_toolkit/_cdf_tk/utils/pip_validator.py +96 -0
  238. cognite_toolkit/_cdf_tk/utils/useful_types.py +4 -7
  239. cognite_toolkit/_cdf_tk/utils/useful_types2.py +14 -0
  240. cognite_toolkit/_cdf_tk/validation.py +4 -0
  241. cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml +1 -1
  242. cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml +1 -1
  243. cognite_toolkit/_resources/cdf.toml +1 -1
  244. cognite_toolkit/_version.py +1 -1
  245. {cognite_toolkit-0.7.30.dist-info → cognite_toolkit-0.7.51.dist-info}/METADATA +13 -3
  246. cognite_toolkit-0.7.51.dist-info/RECORD +445 -0
  247. {cognite_toolkit-0.7.30.dist-info → cognite_toolkit-0.7.51.dist-info}/WHEEL +2 -2
  248. cognite_toolkit/_cdf_tk/client/api/robotics/__init__.py +0 -3
  249. cognite_toolkit/_cdf_tk/client/data_classes/api_classes.py +0 -17
  250. cognite_toolkit/_cdf_tk/client/data_classes/base.py +0 -87
  251. cognite_toolkit/_cdf_tk/client/data_classes/three_d.py +0 -47
  252. cognite_toolkit/_cdf_tk/prototypes/import_app.py +0 -41
  253. cognite_toolkit/_cdf_tk/utils/http_client/_data_classes2.py +0 -187
  254. cognite_toolkit/_cdf_tk/utils/http_client/_exception.py +0 -4
  255. cognite_toolkit-0.7.30.dist-info/RECORD +0 -316
  256. /cognite_toolkit/_cdf_tk/client/{data_classes → api/legacy}/__init__.py +0 -0
  257. /cognite_toolkit/_cdf_tk/client/api/{dml.py → legacy/dml.py} +0 -0
  258. /cognite_toolkit/_cdf_tk/client/api/{fixed_transformations.py → legacy/fixed_transformations.py} +0 -0
  259. /cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/api.py +0 -0
  260. /cognite_toolkit/_cdf_tk/client/api/{robotics → legacy/robotics}/utlis.py +0 -0
  261. /cognite_toolkit/_cdf_tk/{prototypes/commands → client/request_classes}/__init__.py +0 -0
  262. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes}/capabilities.py +0 -0
  263. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/apm_config_v1.py +0 -0
  264. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/extendable_cognite_file.py +0 -0
  265. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/extended_filemetadata.py +0 -0
  266. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/extended_filemetdata.py +0 -0
  267. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/extended_timeseries.py +0 -0
  268. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/functions.py +0 -0
  269. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/graphql_data_models.py +0 -0
  270. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/instances.py +0 -0
  271. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/location_filters.py +0 -0
  272. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/migration.py +0 -0
  273. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/pending_instances_ids.py +0 -0
  274. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/project.py +0 -0
  275. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/raw.py +0 -0
  276. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/robotics.py +0 -0
  277. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/search_config.py +0 -0
  278. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/sequences.py +0 -0
  279. /cognite_toolkit/_cdf_tk/client/{data_classes → resource_classes/legacy}/streamlit_.py +0 -0
  280. /cognite_toolkit/_cdf_tk/{prototypes/commands/import_.py → commands/_import_cmd.py} +0 -0
  281. {cognite_toolkit-0.7.30.dist-info → cognite_toolkit-0.7.51.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,155 @@
1
+ from typing import Annotated, Any, Literal
2
+
3
+ from pydantic import Field, JsonValue, field_validator
4
+ from pydantic_core.core_schema import ValidationInfo
5
+
6
+ from cognite_toolkit._cdf_tk.client._resource_base import (
7
+ BaseModelObject,
8
+ RequestResource,
9
+ ResponseResource,
10
+ )
11
+
12
+ from .identifiers import Identifier, WorkflowVersionId
13
+
14
+
15
+ class TaskId(Identifier):
16
+ external_id: str
17
+
18
+ def __str__(self) -> str:
19
+ return f"externalId='{self.external_id}'"
20
+
21
+
22
+ class TaskParameterDefinition(BaseModelObject):
23
+ type: str
24
+
25
+
26
+ class CogniteFunctionRef(BaseModelObject):
27
+ external_id: str
28
+ data: JsonValue | str | None = None
29
+
30
+
31
+ class FunctionTaskParameters(TaskParameterDefinition):
32
+ type: Literal["function"] = Field("function", exclude=True)
33
+ function: CogniteFunctionRef
34
+ is_async_complete: bool | None = None
35
+
36
+
37
+ class TransformationRef(BaseModelObject):
38
+ external_id: str
39
+ concurrency_policy: Literal["fail", "waitForCurrent", "restartAfterCurrent"] | None = None
40
+ use_transformation_credentials: bool | None = None
41
+
42
+
43
+ class TransformationTaskParameters(TaskParameterDefinition):
44
+ type: Literal["transformation"] = Field("transformation", exclude=True)
45
+ transformation: TransformationRef
46
+
47
+
48
+ class CDFRequest(BaseModelObject):
49
+ resource_path: str
50
+ method: str
51
+ query_parameters: JsonValue | str | None = None
52
+ body: JsonValue | str | None = None
53
+ request_timeout_in_millis: float | str | None = None
54
+ cdf_version_header: str | None = None
55
+
56
+
57
+ class CDFTaskParameters(TaskParameterDefinition):
58
+ type: Literal["cdf"] = Field("cdf", exclude=True)
59
+ cdf_request: CDFRequest
60
+
61
+
62
+ class DynamicRef(BaseModelObject):
63
+ tasks: str
64
+
65
+
66
+ class DynamicTaskParameters(TaskParameterDefinition):
67
+ type: Literal["dynamic"] = Field("dynamic", exclude=True)
68
+ dynamic: DynamicRef
69
+
70
+
71
+ class SubworkflowRef(BaseModelObject):
72
+ tasks: "list[Task]"
73
+
74
+
75
+ class SubworkflowTaskParameters(TaskParameterDefinition):
76
+ type: Literal["subworkflow"] = Field("subworkflow", exclude=True)
77
+ subworkflow: WorkflowVersionId | SubworkflowRef
78
+
79
+
80
+ class SimulatorInputUnit(BaseModelObject):
81
+ name: str
82
+
83
+
84
+ class SimulatorInput(BaseModelObject):
85
+ reference_id: str
86
+ value: str | int | float | list[str] | list[int] | list[float]
87
+ unit: SimulatorInputUnit | None = None
88
+
89
+
90
+ class SimulationRef(BaseModelObject):
91
+ routine_external_id: str
92
+ run_time: int | None = None
93
+ inputs: list[SimulatorInput] | None = None
94
+
95
+
96
+ class SimulationTaskParameters(TaskParameterDefinition):
97
+ type: Literal["simulation"] = Field("simulation", exclude=True)
98
+ simulation: SimulationRef
99
+
100
+
101
+ Parameter = Annotated[
102
+ FunctionTaskParameters
103
+ | TransformationTaskParameters
104
+ | CDFTaskParameters
105
+ | DynamicTaskParameters
106
+ | SubworkflowTaskParameters
107
+ | SimulationTaskParameters,
108
+ Field(discriminator="type"),
109
+ ]
110
+
111
+
112
+ class Task(BaseModelObject):
113
+ external_id: str
114
+ type: str
115
+ name: str | None = None
116
+ description: str | None = None
117
+ retries: int | None = None
118
+ timeout: int | None = None
119
+ on_failure: Literal["abortWorkflow", "skipTask"] = "abortWorkflow"
120
+ depends_on: list[TaskId] | None = None
121
+ parameters: Parameter | None = None
122
+
123
+ @field_validator("parameters", mode="before")
124
+ @classmethod
125
+ def move_type_to_field(cls, value: Any, info: ValidationInfo) -> Any:
126
+ if not isinstance(value, dict) or "type" not in info.data:
127
+ return value
128
+ value = dict(value)
129
+ value["type"] = info.data["type"]
130
+ return value
131
+
132
+
133
+ class WorkflowDefinition(BaseModelObject):
134
+ description: str | None = None
135
+ tasks: list[Task]
136
+
137
+
138
+ class WorkflowVersion(BaseModelObject):
139
+ workflow_external_id: str
140
+ version: str
141
+ workflow_definition: WorkflowDefinition
142
+
143
+ def as_id(self) -> WorkflowVersionId:
144
+ return WorkflowVersionId(workflow_external_id=self.workflow_external_id, version=self.version)
145
+
146
+
147
+ class WorkflowVersionRequest(WorkflowVersion, RequestResource): ...
148
+
149
+
150
+ class WorkflowVersionResponse(WorkflowVersion, ResponseResource[WorkflowVersionRequest]):
151
+ created_time: int
152
+ last_updated_time: int
153
+
154
+ def as_request_resource(self) -> WorkflowVersionRequest:
155
+ return WorkflowVersionRequest.model_validate(self.dump(), extra="ignore")
@@ -7,22 +7,39 @@ from cognite.client._api.datapoints import DatapointsAPI
7
7
  from cognite.client._api.datapoints_subscriptions import DatapointsSubscriptionAPI
8
8
  from cognite.client._api.functions import FunctionCallsAPI, FunctionSchedulesAPI
9
9
  from cognite.client._api.raw import RawDatabasesAPI, RawRowsAPI, RawTablesAPI
10
+ from cognite.client._api.simulators import SimulatorModelsAPI, SimulatorsAPI
10
11
  from cognite.client._api.synthetic_time_series import SyntheticDatapointsAPI
11
12
  from cognite.client.testing import CogniteClientMock
12
13
  from rich.console import Console
13
14
 
14
15
  from cognite_toolkit._cdf_tk.client._toolkit_client import ToolkitClient
15
-
16
- from .api.canvas import CanvasAPI, IndustrialCanvasAPI
17
- from .api.charts import ChartsAPI
18
- from .api.dml import DMLAPI
19
- from .api.extended_data_modeling import ExtendedInstancesAPI
20
- from .api.extended_files import ExtendedFileMetadataAPI
21
- from .api.extended_functions import ExtendedFunctionsAPI
22
- from .api.extended_raw import ExtendedRawAPI
23
- from .api.extended_timeseries import ExtendedTimeSeriesAPI
16
+ from cognite_toolkit._cdf_tk.client.api.legacy.canvas import CanvasAPI, IndustrialCanvasAPI
17
+ from cognite_toolkit._cdf_tk.client.api.legacy.charts import ChartsAPI
18
+ from cognite_toolkit._cdf_tk.client.api.legacy.dml import DMLAPI
19
+ from cognite_toolkit._cdf_tk.client.api.legacy.extended_data_modeling import ExtendedInstancesAPI
20
+ from cognite_toolkit._cdf_tk.client.api.legacy.extended_files import ExtendedFileMetadataAPI
21
+ from cognite_toolkit._cdf_tk.client.api.legacy.extended_functions import ExtendedFunctionsAPI
22
+ from cognite_toolkit._cdf_tk.client.api.legacy.extended_raw import ExtendedRawAPI
23
+ from cognite_toolkit._cdf_tk.client.api.legacy.extended_timeseries import ExtendedTimeSeriesAPI
24
+ from cognite_toolkit._cdf_tk.client.api.legacy.location_filters import LocationFiltersAPI
25
+ from cognite_toolkit._cdf_tk.client.api.legacy.robotics import (
26
+ CapabilitiesAPI,
27
+ DataPostProcessingAPI,
28
+ FramesAPI,
29
+ MapsAPI,
30
+ RoboticsAPI,
31
+ )
32
+ from cognite_toolkit._cdf_tk.client.api.legacy.robotics import LocationsAPI as RoboticsLocationsAPI
33
+ from cognite_toolkit._cdf_tk.client.api.legacy.search_config import SearchConfigurationsAPI
34
+
35
+ from ._toolkit_client import ToolAPI
36
+ from .api.assets import AssetsAPI
37
+ from .api.datasets import DataSetsAPI
38
+ from .api.events import EventsAPI
39
+ from .api.extraction_pipelines import ExtractionPipelinesAPI
40
+ from .api.filemetadata import FileMetadataAPI
24
41
  from .api.infield import InfieldAPI, InFieldCDMConfigAPI, InfieldConfigAPI
25
- from .api.location_filters import LocationFiltersAPI
42
+ from .api.labels import LabelsAPI
26
43
  from .api.lookup import (
27
44
  AssetLookUpAPI,
28
45
  DataSetLookUpAPI,
@@ -44,17 +61,18 @@ from .api.migration import (
44
61
  ResourceViewMappingAPI,
45
62
  )
46
63
  from .api.project import ProjectAPI
47
- from .api.robotics import RoboticsAPI
48
- from .api.robotics.capabilities import CapabilitiesAPI
49
- from .api.robotics.data_postprocessing import DataPostProcessingAPI
50
- from .api.robotics.frames import FramesAPI
51
- from .api.robotics.locations import LocationsAPI as RoboticsLocationsAPI
52
- from .api.robotics.maps import MapsAPI
53
64
  from .api.search import SearchAPI
54
- from .api.search_config import SearchConfigurationsAPI
65
+ from .api.security_categories import SecurityCategoriesAPI
66
+ from .api.sequences import SequencesAPI
55
67
  from .api.streams import StreamsAPI
68
+ from .api.three_d import ThreeDAPI, ThreeDClassicModelsAPI
69
+ from .api.timeseries import TimeSeriesAPI
56
70
  from .api.token import TokenAPI
71
+ from .api.transformations import TransformationsAPI
57
72
  from .api.verify import VerifyAPI
73
+ from .api.workflow_triggers import WorkflowTriggersAPI
74
+ from .api.workflow_versions import WorkflowVersionsAPI
75
+ from .api.workflows import WorkflowsAPI
58
76
 
59
77
 
60
78
  class ToolkitClientMock(CogniteClientMock):
@@ -131,6 +149,25 @@ class ToolkitClientMock(CogniteClientMock):
131
149
  self.time_series.data.synthetic = MagicMock(spec_set=SyntheticDatapointsAPI)
132
150
  self.time_series.subscriptions = MagicMock(spec_set=DatapointsSubscriptionAPI)
133
151
 
152
+ self.tool = MagicMock(spec=ToolAPI)
153
+ self.tool.three_d = MagicMock(spec=ThreeDAPI)
154
+ self.tool.three_d.models_classic = MagicMock(spec_set=ThreeDClassicModelsAPI)
155
+ self.tool.assets = MagicMock(spec_set=AssetsAPI)
156
+ self.tool.timeseries = MagicMock(spec_set=TimeSeriesAPI)
157
+ self.tool.filemetadata = MagicMock(spec_set=FileMetadataAPI)
158
+ self.tool.events = MagicMock(spec_set=EventsAPI)
159
+ self.tool.simulators = MagicMock(spec=SimulatorsAPI)
160
+ self.tool.simulators.models = MagicMock(spec_set=SimulatorModelsAPI)
161
+ self.tool.datasets = MagicMock(spec_set=DataSetsAPI)
162
+ self.tool.extraction_pipelines = MagicMock(spec_set=ExtractionPipelinesAPI)
163
+ self.tool.labels = MagicMock(spec_set=LabelsAPI)
164
+ self.tool.security_categories = MagicMock(spec_set=SecurityCategoriesAPI)
165
+ self.tool.sequences = MagicMock(spec_set=SequencesAPI)
166
+ self.tool.transformations = MagicMock(spec_set=TransformationsAPI)
167
+ self.tool.workflows = MagicMock(spec=WorkflowsAPI)
168
+ self.tool.workflows.triggers = MagicMock(spec_set=WorkflowTriggersAPI)
169
+ self.tool.workflows.versions = MagicMock(spec_set=WorkflowVersionsAPI)
170
+
134
171
  self.streams = MagicMock(spec=StreamsAPI)
135
172
 
136
173
  # This is a helper API, not a real API.
@@ -24,6 +24,7 @@ __all__ = [
24
24
  "AboutCommand",
25
25
  "AuthCommand",
26
26
  "BuildCommand",
27
+ "BuildCommandV2",
27
28
  "CleanCommand",
28
29
  "CollectCommand",
29
30
  "DeployCommand",
@@ -1,12 +1,19 @@
1
- from collections.abc import Callable, Iterable, Sequence
2
- from enum import Enum
1
+ from collections.abc import Callable, Sequence
2
+ from dataclasses import dataclass
3
3
  from pathlib import Path
4
+ from typing import get_args
4
5
 
5
6
  from rich import print
6
7
  from rich.console import Console
7
8
  from rich.table import Table
8
9
 
9
10
  from cognite_toolkit._cdf_tk.client import ToolkitClient
11
+ from cognite_toolkit._cdf_tk.client.http_client import (
12
+ FailedRequestItems,
13
+ FailedResponseItems,
14
+ HTTPClient,
15
+ SuccessResponseItems,
16
+ )
10
17
  from cognite_toolkit._cdf_tk.commands._base import ToolkitCommand
11
18
  from cognite_toolkit._cdf_tk.commands._migrate.creators import MigrationCreator
12
19
  from cognite_toolkit._cdf_tk.commands._migrate.data_mapper import DataMapper
@@ -21,26 +28,30 @@ from cognite_toolkit._cdf_tk.exceptions import (
21
28
  )
22
29
  from cognite_toolkit._cdf_tk.protocols import T_ResourceRequest, T_ResourceResponse
23
30
  from cognite_toolkit._cdf_tk.storageio import T_Selector, UploadableStorageIO, UploadItem
31
+ from cognite_toolkit._cdf_tk.storageio.logger import FileDataLogger, OperationStatus
24
32
  from cognite_toolkit._cdf_tk.utils import humanize_collection, safe_write, sanitize_filename
25
33
  from cognite_toolkit._cdf_tk.utils.file import yaml_safe_dump
26
- from cognite_toolkit._cdf_tk.utils.fileio import Chunk, CSVWriter, NDJsonWriter, SchemaColumn, Uncompressed
27
- from cognite_toolkit._cdf_tk.utils.http_client import HTTPClient, HTTPMessage, ItemMessage, SuccessResponseItems
34
+ from cognite_toolkit._cdf_tk.utils.fileio import NDJsonWriter, Uncompressed
28
35
  from cognite_toolkit._cdf_tk.utils.producer_worker import ProducerWorkerExecutor
29
- from cognite_toolkit._cdf_tk.utils.progress_tracker import AVAILABLE_STATUS, ProgressTracker, Status
30
36
 
31
37
  from .data_model import INSTANCE_SOURCE_VIEW_ID, MODEL_ID, RESOURCE_VIEW_MAPPING_VIEW_ID
38
+ from .issues import WriteIssue
32
39
 
33
40
 
34
- class MigrationCommand(ToolkitCommand):
35
- class Steps(str, Enum):
36
- DOWNLOAD = "download"
37
- CONVERT = "convert"
38
- UPLOAD = "upload"
41
+ @dataclass
42
+ class OperationIssue:
43
+ message: str
44
+ count: int
45
+
39
46
 
40
- @classmethod
41
- def list(cls) -> list[str]:
42
- return [step.value for step in cls.__members__.values()]
47
+ @dataclass
48
+ class MigrationStatusResult:
49
+ status: OperationStatus
50
+ issues: list[OperationIssue]
51
+ count: int
43
52
 
53
+
54
+ class MigrationCommand(ToolkitCommand):
44
55
  def migrate(
45
56
  self,
46
57
  selected: T_Selector,
@@ -49,7 +60,7 @@ class MigrationCommand(ToolkitCommand):
49
60
  log_dir: Path,
50
61
  dry_run: bool = False,
51
62
  verbose: bool = False,
52
- ) -> ProgressTracker[str]:
63
+ ) -> list[MigrationStatusResult]:
53
64
  if log_dir.exists() and any(log_dir.iterdir()):
54
65
  raise ToolkitFileExistsError(
55
66
  f"Log directory {log_dir} already exists. Please remove it or choose another directory."
@@ -65,15 +76,18 @@ class MigrationCommand(ToolkitCommand):
65
76
  self.validate_available_capacity(data.client, total_items)
66
77
 
67
78
  console = Console()
68
- tracker = ProgressTracker[str](self.Steps.list())
69
79
  with (
70
80
  NDJsonWriter(log_dir, kind=f"{selected.kind}MigrationIssues", compression=Uncompressed) as log_file,
71
81
  HTTPClient(config=data.client.config) as write_client,
72
82
  ):
83
+ logger = FileDataLogger(log_file)
84
+ data.logger = logger
85
+ mapper.logger = logger
86
+
73
87
  executor = ProducerWorkerExecutor[Sequence[T_ResourceResponse], Sequence[UploadItem[T_ResourceRequest]]](
74
- download_iterable=self._download_iterable(selected, data, tracker),
75
- process=self._convert(mapper, data, tracker, log_file),
76
- write=self._upload(selected, write_client, data, tracker, log_file, dry_run),
88
+ download_iterable=(page.items for page in data.stream_data(selected)),
89
+ process=self._convert(mapper, data),
90
+ write=self._upload(selected, write_client, data, dry_run),
77
91
  iteration_count=iteration_count,
78
92
  max_queue_size=10,
79
93
  download_description=f"Downloading {selected.display_name}",
@@ -86,91 +100,71 @@ class MigrationCommand(ToolkitCommand):
86
100
  executor.run()
87
101
  total = executor.total_items
88
102
 
89
- self._print_table(tracker.aggregate(), console)
90
- self._print_csv(tracker, log_dir, f"{selected.kind}Items", console)
103
+ results = self._create_status_summary(logger)
104
+
105
+ self._print_rich_tables(results, console)
106
+ self._print_txt(results, log_dir, f"{selected.kind}Items", console)
91
107
  executor.raise_on_error()
92
108
  action = "Would migrate" if dry_run else "Migrating"
93
109
  console.print(f"{action} {total:,} {selected.display_name} to instances.")
94
- return tracker
95
110
 
96
- def _print_table(self, results: dict[tuple[str, Status], int], console: Console) -> None:
97
- for step in self.Steps:
98
- # We treat pending as failed for summary purposes
99
- results[(step.value, "failed")] = results.get((step.value, "failed"), 0) + results.get(
100
- (step.value, "pending"), 0
111
+ return results
112
+
113
+ # Todo: Move to the logger module
114
+ @classmethod
115
+ def _create_status_summary(cls, logger: FileDataLogger) -> list[MigrationStatusResult]:
116
+ results: list[MigrationStatusResult] = []
117
+ status_counts = logger.tracker.get_status_counts()
118
+ for status in get_args(OperationStatus):
119
+ issue_counts = logger.tracker.get_issue_counts(status)
120
+ issues = [OperationIssue(message=issue, count=count) for issue, count in issue_counts.items()]
121
+ result = MigrationStatusResult(
122
+ status=status,
123
+ issues=issues,
124
+ count=status_counts.get(status, 0),
101
125
  )
126
+ results.append(result)
127
+ return results
102
128
 
129
+ def _print_rich_tables(self, results: list[MigrationStatusResult], console: Console) -> None:
103
130
  table = Table(title="Migration Summary", show_lines=True)
104
- table.add_column("Status", style="cyan", no_wrap=True)
105
- for step in self.Steps:
106
- table.add_column(step.value.capitalize(), style="magenta")
107
- for status in AVAILABLE_STATUS:
108
- if status == "pending":
109
- # Skip pending as we treat it as failed
110
- continue
111
- row = [status]
112
- for step in self.Steps:
113
- row.append(str(results.get((step.value, status), 0)))
114
- table.add_row(*row)
115
-
131
+ table.add_column("Status", style="bold")
132
+ table.add_column("Count", justify="right", style="bold")
133
+ table.add_column("Issues", style="bold")
134
+ for result in results:
135
+ issues_str = "\n".join(f"{issue.message}: {issue.count}" for issue in result.issues) or ""
136
+ table.add_row(result.status, str(result.count), issues_str)
116
137
  console.print(table)
117
138
 
118
- def _print_csv(self, tracker: ProgressTracker[str], log_dir: Path, kind: str, console: Console) -> None:
119
- with CSVWriter(log_dir, kind=kind, compression=Uncompressed, columns=self._csv_columns()) as csv_file:
120
- batch: list[Chunk] = []
121
- steps = self.Steps.list()
122
- for item_id, progress in tracker.result().items():
123
- batch.append({"ID": str(item_id), **{step: progress[step] for step in steps}})
124
- if len(batch) >= 1000:
125
- csv_file.write_chunks(batch)
126
- batch = []
127
- if batch:
128
- csv_file.write_chunks(batch)
129
- console.print(f"Migration items written to {log_dir}")
130
-
131
- @classmethod
132
- def _csv_columns(cls) -> list[SchemaColumn]:
133
- return [
134
- SchemaColumn(name="ID", type="string"),
135
- *(SchemaColumn(name=step, type="string") for step in cls.Steps.list()),
136
- ]
137
-
138
- def _download_iterable(
139
- self,
140
- selected: T_Selector,
141
- data: UploadableStorageIO[T_Selector, T_ResourceResponse, T_ResourceRequest],
142
- tracker: ProgressTracker[str],
143
- ) -> Iterable[Sequence[T_ResourceResponse]]:
144
- for page in data.stream_data(selected):
145
- for item in page.items:
146
- tracker.set_progress(data.as_id(item), self.Steps.DOWNLOAD, "success")
147
- yield page.items
139
+ def _print_txt(self, results: list[MigrationStatusResult], log_dir: Path, kind: str, console: Console) -> None:
140
+ summary_file = log_dir / f"{kind}_migration_summary.txt"
141
+ with summary_file.open("w", encoding="utf-8") as f:
142
+ f.write("Migration Summary\n")
143
+ f.write("=================\n\n")
144
+ for result in results:
145
+ f.write(f"Status: {result.status}\n")
146
+ f.write(f"Count: {result.count}\n")
147
+ f.write("Issues:\n")
148
+ if result.issues:
149
+ for issue in result.issues:
150
+ f.write(f" - {issue.message}: {issue.count}\n")
151
+ else:
152
+ f.write(" None\n")
153
+ f.write("\n")
154
+ console.print(f"Summary written to {log_dir}")
148
155
 
156
+ @staticmethod
149
157
  def _convert(
150
- self,
151
158
  mapper: DataMapper[T_Selector, T_ResourceResponse, T_ResourceRequest],
152
159
  data: UploadableStorageIO[T_Selector, T_ResourceResponse, T_ResourceRequest],
153
- tracker: ProgressTracker[str],
154
- log_file: NDJsonWriter,
155
160
  ) -> Callable[[Sequence[T_ResourceResponse]], Sequence[UploadItem[T_ResourceRequest]]]:
156
161
  def track_mapping(source: Sequence[T_ResourceResponse]) -> list[UploadItem[T_ResourceRequest]]:
157
162
  mapped = mapper.map(source)
158
- issues: list[Chunk] = []
159
- targets: list[UploadItem[T_ResourceRequest]] = []
160
-
161
- for (target, issue), item in zip(mapped, source):
162
- id_ = data.as_id(item)
163
- result: Status = "failed" if target is None else "success"
164
- tracker.set_progress(id_, step=self.Steps.CONVERT, status=result)
165
-
166
- if issue.has_issues:
167
- # MyPy fails to understand that dict[str, JsonVal] is a Chunk
168
- issues.append(issue.dump()) # type: ignore[arg-type]
169
- if target is not None:
170
- targets.append(UploadItem(source_id=id_, item=target))
171
- if issues:
172
- log_file.write_chunks(issues)
173
- return targets
163
+ return [
164
+ UploadItem(source_id=data.as_id(item), item=target)
165
+ for target, item in zip(mapped, source)
166
+ if target is not None
167
+ ]
174
168
 
175
169
  return track_mapping
176
170
 
@@ -179,36 +173,37 @@ class MigrationCommand(ToolkitCommand):
179
173
  selected: T_Selector,
180
174
  write_client: HTTPClient,
181
175
  target: UploadableStorageIO[T_Selector, T_ResourceResponse, T_ResourceRequest],
182
- tracker: ProgressTracker[str],
183
- log_file: NDJsonWriter,
184
176
  dry_run: bool,
185
177
  ) -> Callable[[Sequence[UploadItem[T_ResourceRequest]]], None]:
186
178
  def upload_items(data_item: Sequence[UploadItem[T_ResourceRequest]]) -> None:
187
179
  if not data_item:
188
180
  return None
189
- responses: Sequence[HTTPMessage]
190
181
  if dry_run:
191
- responses = [
192
- SuccessResponseItems(
193
- status_code=200, body="", content=b"", ids=[item.source_id for item in data_item]
194
- )
195
- ]
196
- else:
197
- responses = target.upload_items(data_chunk=data_item, http_client=write_client, selector=selected)
198
-
199
- issues: list[Chunk] = []
182
+ target.logger.tracker.finalize_item([item.source_id for item in data_item], "pending")
183
+ return None
184
+
185
+ responses = target.upload_items(data_chunk=data_item, http_client=write_client, selector=selected)
186
+
187
+ # Todo: Move logging into the UploadableStorageIO class
188
+ issues: list[WriteIssue] = []
200
189
  for item in responses:
201
190
  if isinstance(item, SuccessResponseItems):
202
- for success_id in item.ids:
203
- tracker.set_progress(success_id, step=self.Steps.UPLOAD, status="success")
204
- elif isinstance(item, ItemMessage):
205
- for failed_id in item.ids:
206
- tracker.set_progress(failed_id, step=self.Steps.UPLOAD, status="failed")
207
-
208
- if not isinstance(item, SuccessResponseItems):
209
- issues.append(item.dump()) # type: ignore[arg-type]
191
+ target.logger.tracker.finalize_item(item.ids, "success")
192
+ continue
193
+ if isinstance(item, FailedResponseItems):
194
+ error = item.error
195
+ for id_ in item.ids:
196
+ issue = WriteIssue(id=str(id_), status_code=error.code, message=error.message)
197
+ issues.append(issue)
198
+ elif isinstance(item, FailedRequestItems):
199
+ for id_ in item.ids:
200
+ issue = WriteIssue(id=str(id_), status_code=0, message=item.error)
201
+ issues.append(issue)
202
+
203
+ if isinstance(item, FailedResponseItems | FailedRequestItems):
204
+ target.logger.tracker.finalize_item(item.ids, "failure")
210
205
  if issues:
211
- log_file.write_chunks(issues)
206
+ target.logger.log(issues)
212
207
  return None
213
208
 
214
209
  return upload_items