unstructured-ingest 0.0.0__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.

Potentially problematic release.


This version of unstructured-ingest might be problematic. Click here for more details.

Files changed (356) hide show
  1. unstructured_ingest/__init__.py +1 -0
  2. unstructured_ingest/__version__.py +1 -0
  3. unstructured_ingest/cli/__init__.py +14 -0
  4. unstructured_ingest/cli/base/__init__.py +0 -0
  5. unstructured_ingest/cli/base/cmd.py +19 -0
  6. unstructured_ingest/cli/base/dest.py +87 -0
  7. unstructured_ingest/cli/base/src.py +57 -0
  8. unstructured_ingest/cli/cli.py +32 -0
  9. unstructured_ingest/cli/cmd_factory.py +12 -0
  10. unstructured_ingest/cli/cmds/__init__.py +145 -0
  11. unstructured_ingest/cli/cmds/airtable.py +69 -0
  12. unstructured_ingest/cli/cmds/astra.py +99 -0
  13. unstructured_ingest/cli/cmds/azure_cognitive_search.py +65 -0
  14. unstructured_ingest/cli/cmds/biomed.py +52 -0
  15. unstructured_ingest/cli/cmds/chroma.py +104 -0
  16. unstructured_ingest/cli/cmds/clarifai.py +71 -0
  17. unstructured_ingest/cli/cmds/confluence.py +69 -0
  18. unstructured_ingest/cli/cmds/databricks_volumes.py +163 -0
  19. unstructured_ingest/cli/cmds/delta_table.py +94 -0
  20. unstructured_ingest/cli/cmds/discord.py +47 -0
  21. unstructured_ingest/cli/cmds/elasticsearch.py +133 -0
  22. unstructured_ingest/cli/cmds/fsspec/__init__.py +0 -0
  23. unstructured_ingest/cli/cmds/fsspec/azure.py +94 -0
  24. unstructured_ingest/cli/cmds/fsspec/box.py +48 -0
  25. unstructured_ingest/cli/cmds/fsspec/dropbox.py +51 -0
  26. unstructured_ingest/cli/cmds/fsspec/fsspec.py +15 -0
  27. unstructured_ingest/cli/cmds/fsspec/gcs.py +71 -0
  28. unstructured_ingest/cli/cmds/fsspec/s3.py +74 -0
  29. unstructured_ingest/cli/cmds/fsspec/sftp.py +58 -0
  30. unstructured_ingest/cli/cmds/github.py +54 -0
  31. unstructured_ingest/cli/cmds/gitlab.py +54 -0
  32. unstructured_ingest/cli/cmds/google_drive.py +49 -0
  33. unstructured_ingest/cli/cmds/hubspot.py +70 -0
  34. unstructured_ingest/cli/cmds/jira.py +71 -0
  35. unstructured_ingest/cli/cmds/kafka.py +102 -0
  36. unstructured_ingest/cli/cmds/local.py +43 -0
  37. unstructured_ingest/cli/cmds/mongodb.py +72 -0
  38. unstructured_ingest/cli/cmds/notion.py +48 -0
  39. unstructured_ingest/cli/cmds/onedrive.py +66 -0
  40. unstructured_ingest/cli/cmds/opensearch.py +117 -0
  41. unstructured_ingest/cli/cmds/outlook.py +67 -0
  42. unstructured_ingest/cli/cmds/pinecone.py +71 -0
  43. unstructured_ingest/cli/cmds/qdrant.py +124 -0
  44. unstructured_ingest/cli/cmds/reddit.py +67 -0
  45. unstructured_ingest/cli/cmds/salesforce.py +58 -0
  46. unstructured_ingest/cli/cmds/sharepoint.py +66 -0
  47. unstructured_ingest/cli/cmds/slack.py +56 -0
  48. unstructured_ingest/cli/cmds/sql.py +66 -0
  49. unstructured_ingest/cli/cmds/vectara.py +66 -0
  50. unstructured_ingest/cli/cmds/weaviate.py +98 -0
  51. unstructured_ingest/cli/cmds/wikipedia.py +40 -0
  52. unstructured_ingest/cli/common.py +7 -0
  53. unstructured_ingest/cli/interfaces.py +656 -0
  54. unstructured_ingest/cli/utils.py +205 -0
  55. unstructured_ingest/connector/__init__.py +0 -0
  56. unstructured_ingest/connector/airtable.py +309 -0
  57. unstructured_ingest/connector/astra.py +237 -0
  58. unstructured_ingest/connector/azure_cognitive_search.py +144 -0
  59. unstructured_ingest/connector/biomed.py +313 -0
  60. unstructured_ingest/connector/chroma.py +158 -0
  61. unstructured_ingest/connector/clarifai.py +122 -0
  62. unstructured_ingest/connector/confluence.py +285 -0
  63. unstructured_ingest/connector/databricks_volumes.py +137 -0
  64. unstructured_ingest/connector/delta_table.py +203 -0
  65. unstructured_ingest/connector/discord.py +180 -0
  66. unstructured_ingest/connector/elasticsearch.py +396 -0
  67. unstructured_ingest/connector/fsspec/__init__.py +0 -0
  68. unstructured_ingest/connector/fsspec/azure.py +78 -0
  69. unstructured_ingest/connector/fsspec/box.py +109 -0
  70. unstructured_ingest/connector/fsspec/dropbox.py +160 -0
  71. unstructured_ingest/connector/fsspec/fsspec.py +359 -0
  72. unstructured_ingest/connector/fsspec/gcs.py +82 -0
  73. unstructured_ingest/connector/fsspec/s3.py +62 -0
  74. unstructured_ingest/connector/fsspec/sftp.py +81 -0
  75. unstructured_ingest/connector/git.py +124 -0
  76. unstructured_ingest/connector/github.py +173 -0
  77. unstructured_ingest/connector/gitlab.py +142 -0
  78. unstructured_ingest/connector/google_drive.py +349 -0
  79. unstructured_ingest/connector/hubspot.py +278 -0
  80. unstructured_ingest/connector/jira.py +469 -0
  81. unstructured_ingest/connector/kafka.py +294 -0
  82. unstructured_ingest/connector/local.py +139 -0
  83. unstructured_ingest/connector/mongodb.py +285 -0
  84. unstructured_ingest/connector/notion/__init__.py +0 -0
  85. unstructured_ingest/connector/notion/client.py +233 -0
  86. unstructured_ingest/connector/notion/connector.py +468 -0
  87. unstructured_ingest/connector/notion/helpers.py +584 -0
  88. unstructured_ingest/connector/notion/interfaces.py +32 -0
  89. unstructured_ingest/connector/notion/types/__init__.py +0 -0
  90. unstructured_ingest/connector/notion/types/block.py +95 -0
  91. unstructured_ingest/connector/notion/types/blocks/__init__.py +63 -0
  92. unstructured_ingest/connector/notion/types/blocks/bookmark.py +40 -0
  93. unstructured_ingest/connector/notion/types/blocks/breadcrumb.py +21 -0
  94. unstructured_ingest/connector/notion/types/blocks/bulleted_list_item.py +31 -0
  95. unstructured_ingest/connector/notion/types/blocks/callout.py +94 -0
  96. unstructured_ingest/connector/notion/types/blocks/child_database.py +23 -0
  97. unstructured_ingest/connector/notion/types/blocks/child_page.py +23 -0
  98. unstructured_ingest/connector/notion/types/blocks/code.py +43 -0
  99. unstructured_ingest/connector/notion/types/blocks/column_list.py +35 -0
  100. unstructured_ingest/connector/notion/types/blocks/divider.py +22 -0
  101. unstructured_ingest/connector/notion/types/blocks/embed.py +36 -0
  102. unstructured_ingest/connector/notion/types/blocks/equation.py +23 -0
  103. unstructured_ingest/connector/notion/types/blocks/file.py +49 -0
  104. unstructured_ingest/connector/notion/types/blocks/heading.py +37 -0
  105. unstructured_ingest/connector/notion/types/blocks/image.py +21 -0
  106. unstructured_ingest/connector/notion/types/blocks/link_preview.py +24 -0
  107. unstructured_ingest/connector/notion/types/blocks/link_to_page.py +29 -0
  108. unstructured_ingest/connector/notion/types/blocks/numbered_list.py +29 -0
  109. unstructured_ingest/connector/notion/types/blocks/paragraph.py +31 -0
  110. unstructured_ingest/connector/notion/types/blocks/pdf.py +49 -0
  111. unstructured_ingest/connector/notion/types/blocks/quote.py +37 -0
  112. unstructured_ingest/connector/notion/types/blocks/synced_block.py +57 -0
  113. unstructured_ingest/connector/notion/types/blocks/table.py +63 -0
  114. unstructured_ingest/connector/notion/types/blocks/table_of_contents.py +23 -0
  115. unstructured_ingest/connector/notion/types/blocks/template.py +30 -0
  116. unstructured_ingest/connector/notion/types/blocks/todo.py +42 -0
  117. unstructured_ingest/connector/notion/types/blocks/toggle.py +37 -0
  118. unstructured_ingest/connector/notion/types/blocks/unsupported.py +20 -0
  119. unstructured_ingest/connector/notion/types/blocks/video.py +22 -0
  120. unstructured_ingest/connector/notion/types/database.py +72 -0
  121. unstructured_ingest/connector/notion/types/database_properties/__init__.py +106 -0
  122. unstructured_ingest/connector/notion/types/database_properties/checkbox.py +38 -0
  123. unstructured_ingest/connector/notion/types/database_properties/created_by.py +35 -0
  124. unstructured_ingest/connector/notion/types/database_properties/created_time.py +34 -0
  125. unstructured_ingest/connector/notion/types/database_properties/date.py +41 -0
  126. unstructured_ingest/connector/notion/types/database_properties/email.py +36 -0
  127. unstructured_ingest/connector/notion/types/database_properties/files.py +37 -0
  128. unstructured_ingest/connector/notion/types/database_properties/formula.py +49 -0
  129. unstructured_ingest/connector/notion/types/database_properties/last_edited_by.py +34 -0
  130. unstructured_ingest/connector/notion/types/database_properties/last_edited_time.py +34 -0
  131. unstructured_ingest/connector/notion/types/database_properties/multiselect.py +73 -0
  132. unstructured_ingest/connector/notion/types/database_properties/number.py +49 -0
  133. unstructured_ingest/connector/notion/types/database_properties/people.py +40 -0
  134. unstructured_ingest/connector/notion/types/database_properties/phone_number.py +36 -0
  135. unstructured_ingest/connector/notion/types/database_properties/relation.py +67 -0
  136. unstructured_ingest/connector/notion/types/database_properties/rich_text.py +43 -0
  137. unstructured_ingest/connector/notion/types/database_properties/rollup.py +56 -0
  138. unstructured_ingest/connector/notion/types/database_properties/select.py +68 -0
  139. unstructured_ingest/connector/notion/types/database_properties/status.py +80 -0
  140. unstructured_ingest/connector/notion/types/database_properties/title.py +37 -0
  141. unstructured_ingest/connector/notion/types/database_properties/unique_id.py +50 -0
  142. unstructured_ingest/connector/notion/types/database_properties/url.py +37 -0
  143. unstructured_ingest/connector/notion/types/database_properties/verification.py +78 -0
  144. unstructured_ingest/connector/notion/types/date.py +26 -0
  145. unstructured_ingest/connector/notion/types/file.py +51 -0
  146. unstructured_ingest/connector/notion/types/page.py +44 -0
  147. unstructured_ingest/connector/notion/types/parent.py +66 -0
  148. unstructured_ingest/connector/notion/types/rich_text.py +189 -0
  149. unstructured_ingest/connector/notion/types/user.py +76 -0
  150. unstructured_ingest/connector/onedrive.py +232 -0
  151. unstructured_ingest/connector/opensearch.py +218 -0
  152. unstructured_ingest/connector/outlook.py +285 -0
  153. unstructured_ingest/connector/pinecone.py +140 -0
  154. unstructured_ingest/connector/qdrant.py +144 -0
  155. unstructured_ingest/connector/reddit.py +166 -0
  156. unstructured_ingest/connector/registry.py +109 -0
  157. unstructured_ingest/connector/salesforce.py +301 -0
  158. unstructured_ingest/connector/sharepoint.py +573 -0
  159. unstructured_ingest/connector/slack.py +224 -0
  160. unstructured_ingest/connector/sql.py +199 -0
  161. unstructured_ingest/connector/vectara.py +248 -0
  162. unstructured_ingest/connector/weaviate.py +190 -0
  163. unstructured_ingest/connector/wikipedia.py +208 -0
  164. unstructured_ingest/enhanced_dataclass/__init__.py +4 -0
  165. unstructured_ingest/enhanced_dataclass/core.py +99 -0
  166. unstructured_ingest/enhanced_dataclass/dataclasses.py +54 -0
  167. unstructured_ingest/enhanced_dataclass/json_mixin.py +125 -0
  168. unstructured_ingest/error.py +49 -0
  169. unstructured_ingest/evaluate.py +338 -0
  170. unstructured_ingest/ingest_backoff/__init__.py +3 -0
  171. unstructured_ingest/ingest_backoff/_common.py +102 -0
  172. unstructured_ingest/ingest_backoff/_wrapper.py +122 -0
  173. unstructured_ingest/interfaces.py +838 -0
  174. unstructured_ingest/logger.py +130 -0
  175. unstructured_ingest/main.py +11 -0
  176. unstructured_ingest/pipeline/__init__.py +22 -0
  177. unstructured_ingest/pipeline/copy.py +19 -0
  178. unstructured_ingest/pipeline/doc_factory.py +12 -0
  179. unstructured_ingest/pipeline/interfaces.py +265 -0
  180. unstructured_ingest/pipeline/partition.py +60 -0
  181. unstructured_ingest/pipeline/permissions.py +12 -0
  182. unstructured_ingest/pipeline/pipeline.py +117 -0
  183. unstructured_ingest/pipeline/reformat/__init__.py +0 -0
  184. unstructured_ingest/pipeline/reformat/chunking.py +130 -0
  185. unstructured_ingest/pipeline/reformat/embedding.py +66 -0
  186. unstructured_ingest/pipeline/source.py +77 -0
  187. unstructured_ingest/pipeline/utils.py +6 -0
  188. unstructured_ingest/pipeline/write.py +18 -0
  189. unstructured_ingest/processor.py +93 -0
  190. unstructured_ingest/runner/__init__.py +104 -0
  191. unstructured_ingest/runner/airtable.py +35 -0
  192. unstructured_ingest/runner/astra.py +34 -0
  193. unstructured_ingest/runner/base_runner.py +89 -0
  194. unstructured_ingest/runner/biomed.py +45 -0
  195. unstructured_ingest/runner/confluence.py +35 -0
  196. unstructured_ingest/runner/delta_table.py +34 -0
  197. unstructured_ingest/runner/discord.py +35 -0
  198. unstructured_ingest/runner/elasticsearch.py +40 -0
  199. unstructured_ingest/runner/fsspec/__init__.py +0 -0
  200. unstructured_ingest/runner/fsspec/azure.py +30 -0
  201. unstructured_ingest/runner/fsspec/box.py +28 -0
  202. unstructured_ingest/runner/fsspec/dropbox.py +30 -0
  203. unstructured_ingest/runner/fsspec/fsspec.py +40 -0
  204. unstructured_ingest/runner/fsspec/gcs.py +28 -0
  205. unstructured_ingest/runner/fsspec/s3.py +28 -0
  206. unstructured_ingest/runner/fsspec/sftp.py +28 -0
  207. unstructured_ingest/runner/github.py +37 -0
  208. unstructured_ingest/runner/gitlab.py +37 -0
  209. unstructured_ingest/runner/google_drive.py +35 -0
  210. unstructured_ingest/runner/hubspot.py +35 -0
  211. unstructured_ingest/runner/jira.py +35 -0
  212. unstructured_ingest/runner/kafka.py +34 -0
  213. unstructured_ingest/runner/local.py +23 -0
  214. unstructured_ingest/runner/mongodb.py +34 -0
  215. unstructured_ingest/runner/notion.py +61 -0
  216. unstructured_ingest/runner/onedrive.py +35 -0
  217. unstructured_ingest/runner/opensearch.py +40 -0
  218. unstructured_ingest/runner/outlook.py +33 -0
  219. unstructured_ingest/runner/reddit.py +35 -0
  220. unstructured_ingest/runner/salesforce.py +33 -0
  221. unstructured_ingest/runner/sharepoint.py +35 -0
  222. unstructured_ingest/runner/slack.py +33 -0
  223. unstructured_ingest/runner/utils.py +47 -0
  224. unstructured_ingest/runner/wikipedia.py +35 -0
  225. unstructured_ingest/runner/writers/__init__.py +48 -0
  226. unstructured_ingest/runner/writers/astra.py +22 -0
  227. unstructured_ingest/runner/writers/azure_cognitive_search.py +24 -0
  228. unstructured_ingest/runner/writers/base_writer.py +26 -0
  229. unstructured_ingest/runner/writers/chroma.py +22 -0
  230. unstructured_ingest/runner/writers/clarifai.py +19 -0
  231. unstructured_ingest/runner/writers/databricks_volumes.py +25 -0
  232. unstructured_ingest/runner/writers/delta_table.py +24 -0
  233. unstructured_ingest/runner/writers/elasticsearch.py +24 -0
  234. unstructured_ingest/runner/writers/fsspec/__init__.py +0 -0
  235. unstructured_ingest/runner/writers/fsspec/azure.py +24 -0
  236. unstructured_ingest/runner/writers/fsspec/box.py +21 -0
  237. unstructured_ingest/runner/writers/fsspec/dropbox.py +21 -0
  238. unstructured_ingest/runner/writers/fsspec/gcs.py +19 -0
  239. unstructured_ingest/runner/writers/fsspec/s3.py +21 -0
  240. unstructured_ingest/runner/writers/kafka.py +21 -0
  241. unstructured_ingest/runner/writers/mongodb.py +21 -0
  242. unstructured_ingest/runner/writers/opensearch.py +26 -0
  243. unstructured_ingest/runner/writers/pinecone.py +21 -0
  244. unstructured_ingest/runner/writers/qdrant.py +19 -0
  245. unstructured_ingest/runner/writers/sql.py +22 -0
  246. unstructured_ingest/runner/writers/vectara.py +22 -0
  247. unstructured_ingest/runner/writers/weaviate.py +21 -0
  248. unstructured_ingest/utils/__init__.py +0 -0
  249. unstructured_ingest/utils/compression.py +117 -0
  250. unstructured_ingest/utils/data_prep.py +112 -0
  251. unstructured_ingest/utils/dep_check.py +66 -0
  252. unstructured_ingest/utils/string_and_date_utils.py +39 -0
  253. unstructured_ingest/utils/table.py +73 -0
  254. unstructured_ingest/v2/__init__.py +1 -0
  255. unstructured_ingest/v2/cli/__init__.py +0 -0
  256. unstructured_ingest/v2/cli/base/__init__.py +4 -0
  257. unstructured_ingest/v2/cli/base/cmd.py +215 -0
  258. unstructured_ingest/v2/cli/base/dest.py +76 -0
  259. unstructured_ingest/v2/cli/base/importer.py +34 -0
  260. unstructured_ingest/v2/cli/base/src.py +70 -0
  261. unstructured_ingest/v2/cli/cli.py +24 -0
  262. unstructured_ingest/v2/cli/cmds/__init__.py +87 -0
  263. unstructured_ingest/v2/cli/cmds/astra.py +85 -0
  264. unstructured_ingest/v2/cli/cmds/azure_cognitive_search.py +72 -0
  265. unstructured_ingest/v2/cli/cmds/chroma.py +108 -0
  266. unstructured_ingest/v2/cli/cmds/databricks_volumes.py +161 -0
  267. unstructured_ingest/v2/cli/cmds/elasticsearch.py +159 -0
  268. unstructured_ingest/v2/cli/cmds/fsspec/__init__.py +0 -0
  269. unstructured_ingest/v2/cli/cmds/fsspec/azure.py +84 -0
  270. unstructured_ingest/v2/cli/cmds/fsspec/box.py +58 -0
  271. unstructured_ingest/v2/cli/cmds/fsspec/dropbox.py +58 -0
  272. unstructured_ingest/v2/cli/cmds/fsspec/fsspec.py +77 -0
  273. unstructured_ingest/v2/cli/cmds/fsspec/gcs.py +81 -0
  274. unstructured_ingest/v2/cli/cmds/fsspec/s3.py +84 -0
  275. unstructured_ingest/v2/cli/cmds/fsspec/sftp.py +80 -0
  276. unstructured_ingest/v2/cli/cmds/google_drive.py +74 -0
  277. unstructured_ingest/v2/cli/cmds/local.py +60 -0
  278. unstructured_ingest/v2/cli/cmds/mongodb.py +62 -0
  279. unstructured_ingest/v2/cli/cmds/onedrive.py +91 -0
  280. unstructured_ingest/v2/cli/cmds/opensearch.py +93 -0
  281. unstructured_ingest/v2/cli/cmds/pinecone.py +62 -0
  282. unstructured_ingest/v2/cli/cmds/salesforce.py +79 -0
  283. unstructured_ingest/v2/cli/cmds/sharepoint.py +112 -0
  284. unstructured_ingest/v2/cli/cmds/singlestore.py +96 -0
  285. unstructured_ingest/v2/cli/cmds/sql.py +84 -0
  286. unstructured_ingest/v2/cli/cmds/weaviate.py +100 -0
  287. unstructured_ingest/v2/cli/configs/__init__.py +6 -0
  288. unstructured_ingest/v2/cli/configs/chunk.py +89 -0
  289. unstructured_ingest/v2/cli/configs/embed.py +74 -0
  290. unstructured_ingest/v2/cli/configs/partition.py +99 -0
  291. unstructured_ingest/v2/cli/configs/processor.py +88 -0
  292. unstructured_ingest/v2/cli/interfaces.py +27 -0
  293. unstructured_ingest/v2/cli/utils.py +240 -0
  294. unstructured_ingest/v2/example.py +37 -0
  295. unstructured_ingest/v2/interfaces/__init__.py +29 -0
  296. unstructured_ingest/v2/interfaces/connector.py +32 -0
  297. unstructured_ingest/v2/interfaces/downloader.py +79 -0
  298. unstructured_ingest/v2/interfaces/file_data.py +49 -0
  299. unstructured_ingest/v2/interfaces/indexer.py +28 -0
  300. unstructured_ingest/v2/interfaces/process.py +20 -0
  301. unstructured_ingest/v2/interfaces/processor.py +48 -0
  302. unstructured_ingest/v2/interfaces/upload_stager.py +48 -0
  303. unstructured_ingest/v2/interfaces/uploader.py +39 -0
  304. unstructured_ingest/v2/logger.py +126 -0
  305. unstructured_ingest/v2/main.py +11 -0
  306. unstructured_ingest/v2/pipeline/__init__.py +0 -0
  307. unstructured_ingest/v2/pipeline/interfaces.py +167 -0
  308. unstructured_ingest/v2/pipeline/pipeline.py +284 -0
  309. unstructured_ingest/v2/pipeline/steps/__init__.py +0 -0
  310. unstructured_ingest/v2/pipeline/steps/chunk.py +85 -0
  311. unstructured_ingest/v2/pipeline/steps/download.py +124 -0
  312. unstructured_ingest/v2/pipeline/steps/embed.py +84 -0
  313. unstructured_ingest/v2/pipeline/steps/index.py +61 -0
  314. unstructured_ingest/v2/pipeline/steps/partition.py +78 -0
  315. unstructured_ingest/v2/pipeline/steps/stage.py +64 -0
  316. unstructured_ingest/v2/pipeline/steps/uncompress.py +68 -0
  317. unstructured_ingest/v2/pipeline/steps/upload.py +73 -0
  318. unstructured_ingest/v2/pipeline/utils.py +15 -0
  319. unstructured_ingest/v2/processes/__init__.py +0 -0
  320. unstructured_ingest/v2/processes/chunker.py +97 -0
  321. unstructured_ingest/v2/processes/connector_registry.py +63 -0
  322. unstructured_ingest/v2/processes/connectors/__init__.py +77 -0
  323. unstructured_ingest/v2/processes/connectors/astra.py +152 -0
  324. unstructured_ingest/v2/processes/connectors/azure_cognitive_search.py +211 -0
  325. unstructured_ingest/v2/processes/connectors/chroma.py +204 -0
  326. unstructured_ingest/v2/processes/connectors/databricks_volumes.py +96 -0
  327. unstructured_ingest/v2/processes/connectors/elasticsearch.py +401 -0
  328. unstructured_ingest/v2/processes/connectors/fsspec/__init__.py +37 -0
  329. unstructured_ingest/v2/processes/connectors/fsspec/azure.py +144 -0
  330. unstructured_ingest/v2/processes/connectors/fsspec/box.py +131 -0
  331. unstructured_ingest/v2/processes/connectors/fsspec/dropbox.py +130 -0
  332. unstructured_ingest/v2/processes/connectors/fsspec/fsspec.py +342 -0
  333. unstructured_ingest/v2/processes/connectors/fsspec/gcs.py +141 -0
  334. unstructured_ingest/v2/processes/connectors/fsspec/s3.py +164 -0
  335. unstructured_ingest/v2/processes/connectors/fsspec/sftp.py +166 -0
  336. unstructured_ingest/v2/processes/connectors/fsspec/utils.py +17 -0
  337. unstructured_ingest/v2/processes/connectors/google_drive.py +335 -0
  338. unstructured_ingest/v2/processes/connectors/local.py +204 -0
  339. unstructured_ingest/v2/processes/connectors/mongodb.py +138 -0
  340. unstructured_ingest/v2/processes/connectors/onedrive.py +216 -0
  341. unstructured_ingest/v2/processes/connectors/opensearch.py +155 -0
  342. unstructured_ingest/v2/processes/connectors/pinecone.py +178 -0
  343. unstructured_ingest/v2/processes/connectors/salesforce.py +293 -0
  344. unstructured_ingest/v2/processes/connectors/sharepoint.py +412 -0
  345. unstructured_ingest/v2/processes/connectors/singlestore.py +160 -0
  346. unstructured_ingest/v2/processes/connectors/sql.py +269 -0
  347. unstructured_ingest/v2/processes/connectors/utils.py +19 -0
  348. unstructured_ingest/v2/processes/connectors/weaviate.py +235 -0
  349. unstructured_ingest/v2/processes/embedder.py +76 -0
  350. unstructured_ingest/v2/processes/partitioner.py +166 -0
  351. unstructured_ingest/v2/processes/uncompress.py +43 -0
  352. unstructured_ingest-0.0.0.dist-info/METADATA +319 -0
  353. unstructured_ingest-0.0.0.dist-info/RECORD +356 -0
  354. unstructured_ingest-0.0.0.dist-info/WHEEL +5 -0
  355. unstructured_ingest-0.0.0.dist-info/entry_points.txt +2 -0
  356. unstructured_ingest-0.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,584 @@
1
+ import enum
2
+ import logging
3
+ from dataclasses import dataclass, field
4
+ from typing import List, Optional, Tuple
5
+ from urllib.parse import urlparse
6
+ from uuid import UUID
7
+
8
+ import unstructured.ingest.connector.notion.types.blocks as notion_blocks
9
+ from htmlBuilder.attributes import Style, Type
10
+ from htmlBuilder.tags import (
11
+ Body,
12
+ Div,
13
+ Head,
14
+ Html,
15
+ HtmlTag,
16
+ Ol,
17
+ Table,
18
+ Td,
19
+ Th,
20
+ Title,
21
+ Tr,
22
+ Ul,
23
+ )
24
+ from notion_client.errors import APIResponseError
25
+
26
+ from unstructured_ingest.connector.notion.client import Client
27
+ from unstructured_ingest.connector.notion.interfaces import BlockBase
28
+ from unstructured_ingest.connector.notion.types.block import Block
29
+ from unstructured_ingest.connector.notion.types.database import Database
30
+
31
+
32
+ @dataclass
33
+ class TextExtractionResponse:
34
+ text: Optional[str] = None
35
+ child_pages: List[str] = field(default_factory=list)
36
+ child_databases: List[str] = field(default_factory=list)
37
+
38
+
39
+ @dataclass
40
+ class HtmlExtractionResponse:
41
+ html: Optional[HtmlTag] = None
42
+ child_pages: List[str] = field(default_factory=list)
43
+ child_databases: List[str] = field(default_factory=list)
44
+
45
+
46
+ def extract_page_html(
47
+ client: Client,
48
+ page_id: str,
49
+ logger: logging.Logger,
50
+ ) -> HtmlExtractionResponse:
51
+ page_id_uuid = UUID(page_id)
52
+ html_elements: List[Tuple[BlockBase, HtmlTag]] = []
53
+ parent_block: Block = client.blocks.retrieve(block_id=page_id) # type: ignore
54
+ head = None
55
+ if isinstance(parent_block.block, notion_blocks.ChildPage):
56
+ head = Head([], Title([], parent_block.block.title))
57
+ child_pages: List[str] = []
58
+ child_databases: List[str] = []
59
+ parents: List[Tuple[int, Block]] = [(0, parent_block)]
60
+ processed_block_ids = []
61
+ while len(parents) > 0:
62
+ level, parent = parents.pop(0)
63
+ parent_html = parent.get_html()
64
+ if parent_html:
65
+ html_elements.append((parent.block, parent_html))
66
+ logger.debug(f"processing block: {parent}")
67
+ if isinstance(parent.block, notion_blocks.ChildPage) and parent.id != str(page_id_uuid):
68
+ child_pages.append(parent.id)
69
+ continue
70
+ if isinstance(parent.block, notion_blocks.ChildDatabase):
71
+ child_databases.append(parent.id)
72
+ continue
73
+ if isinstance(parent.block, notion_blocks.Table):
74
+ table_response = build_table(client=client, table=parent)
75
+ html_elements.append((parent.block, table_response.table_html))
76
+ child_pages.extend(table_response.child_pages)
77
+ child_databases.extend(table_response.child_databases)
78
+ continue
79
+ if isinstance(parent.block, notion_blocks.ColumnList):
80
+ column_html = build_columned_list(client=client, column_parent=parent)
81
+ html_elements.append((parent.block, column_html))
82
+ continue
83
+ if isinstance(parent.block, notion_blocks.BulletedListItem):
84
+ bullet_list_resp = build_bulleted_list_children(
85
+ client=client,
86
+ bulleted_list_item_parent=parent,
87
+ )
88
+ if bullet_list_children := bullet_list_resp.child_list:
89
+ html_elements.append((parent.block, bullet_list_children))
90
+ continue
91
+ if isinstance(parent.block, notion_blocks.NumberedListItem):
92
+ numbered_list_resp = build_numbered_list_children(
93
+ client=client,
94
+ numbered_list_item_parent=parent,
95
+ )
96
+ if numbered_list_children := numbered_list_resp.child_list:
97
+ html_elements.append((parent.block, numbered_list_children))
98
+ continue
99
+ if parent.block.can_have_children() and parent.has_children:
100
+ children = []
101
+ for children_block in client.blocks.children.iterate_list( # type: ignore
102
+ block_id=parent.id,
103
+ ):
104
+ children.extend(children_block)
105
+ if children:
106
+ logger.debug(f"Adding {len(children)} children from parent: {parent}")
107
+ for child in children:
108
+ if child.id not in processed_block_ids:
109
+ parents.append((level + 1, child))
110
+ processed_block_ids.append(parent)
111
+
112
+ # Join list items
113
+ joined_html_elements = []
114
+ numbered_list_items = []
115
+ bullet_list_items = []
116
+ for block, html in html_elements:
117
+ if isinstance(block, notion_blocks.BulletedListItem):
118
+ bullet_list_items.append(html)
119
+ continue
120
+ if isinstance(block, notion_blocks.NumberedListItem):
121
+ numbered_list_items.append(html)
122
+ continue
123
+ if len(numbered_list_items) > 0:
124
+ joined_html_elements.append(Ol([], numbered_list_items))
125
+ numbered_list_items = []
126
+ if len(bullet_list_items) > 0:
127
+ joined_html_elements.append(Ul([], bullet_list_items))
128
+ bullet_list_items = []
129
+ joined_html_elements.append(html)
130
+
131
+ body = Body([], joined_html_elements)
132
+ all_elements = [body]
133
+ if head:
134
+ all_elements = [head] + all_elements
135
+ full_html = Html([], all_elements)
136
+ return HtmlExtractionResponse(
137
+ full_html,
138
+ child_pages=child_pages,
139
+ child_databases=child_databases,
140
+ )
141
+
142
+
143
+ def extract_database_html(
144
+ client: Client,
145
+ database_id: str,
146
+ logger: logging.Logger,
147
+ ) -> HtmlExtractionResponse:
148
+ logger.debug(f"processing database id: {database_id}")
149
+ database: Database = client.databases.retrieve(database_id=database_id) # type: ignore
150
+ property_keys = list(database.properties.keys())
151
+ property_keys = sorted(property_keys)
152
+ table_html_rows = []
153
+ child_pages: List[str] = []
154
+ child_databases: List[str] = []
155
+ # Create header row
156
+ table_html_rows.append(Tr([], [Th([], k) for k in property_keys]))
157
+
158
+ all_pages = []
159
+ for page_chunk in client.databases.iterate_query(database_id=database_id): # type: ignore
160
+ all_pages.extend(page_chunk)
161
+
162
+ logger.debug(f"Creating {len(all_pages)} rows")
163
+ for page in all_pages:
164
+ if is_database_url(client=client, url=page.url):
165
+ child_databases.append(page.id)
166
+ if is_page_url(client=client, url=page.url):
167
+ child_pages.append(page.id)
168
+ properties = page.properties
169
+ inner_html = [properties.get(k).get_html() for k in property_keys] # type: ignore
170
+ table_html_rows.append(
171
+ Tr(
172
+ [],
173
+ [Td([], cell) for cell in [html if html else Div([], []) for html in inner_html]],
174
+ ),
175
+ )
176
+
177
+ table_html = Table([], table_html_rows)
178
+
179
+ return HtmlExtractionResponse(
180
+ html=table_html,
181
+ child_pages=child_pages,
182
+ child_databases=child_databases,
183
+ )
184
+
185
+
186
+ @dataclass
187
+ class ChildExtractionResponse:
188
+ child_pages: List[str] = field(default_factory=list)
189
+ child_databases: List[str] = field(default_factory=list)
190
+
191
+
192
+ class QueueEntryType(enum.Enum):
193
+ DATABASE = "database"
194
+ PAGE = "page"
195
+
196
+
197
+ @dataclass
198
+ class QueueEntry:
199
+ type: QueueEntryType
200
+ id: UUID
201
+
202
+
203
+ def get_recursive_content_from_page(
204
+ client: Client,
205
+ page_id: str,
206
+ logger: logging.Logger,
207
+ ) -> ChildExtractionResponse:
208
+ return get_recursive_content(
209
+ client=client,
210
+ init_entry=QueueEntry(type=QueueEntryType.PAGE, id=UUID(page_id)),
211
+ logger=logger,
212
+ )
213
+
214
+
215
+ def get_recursive_content_from_database(
216
+ client: Client,
217
+ database_id: str,
218
+ logger: logging.Logger,
219
+ ) -> ChildExtractionResponse:
220
+ return get_recursive_content(
221
+ client=client,
222
+ init_entry=QueueEntry(type=QueueEntryType.DATABASE, id=UUID(database_id)),
223
+ logger=logger,
224
+ )
225
+
226
+
227
+ def get_recursive_content(
228
+ client: Client,
229
+ init_entry: QueueEntry,
230
+ logger: logging.Logger,
231
+ ) -> ChildExtractionResponse:
232
+ parents: List[QueueEntry] = [init_entry]
233
+ child_pages: List[str] = []
234
+ child_dbs: List[str] = []
235
+ processed: List[str] = []
236
+ while len(parents) > 0:
237
+ parent: QueueEntry = parents.pop()
238
+ processed.append(str(parent.id))
239
+ if parent.type == QueueEntryType.PAGE:
240
+ logger.debug(f"Getting child data from page: {parent.id}")
241
+ page_children = []
242
+ try:
243
+ for children_block in client.blocks.children.iterate_list( # type: ignore
244
+ block_id=str(parent.id),
245
+ ):
246
+ page_children.extend(children_block)
247
+ except APIResponseError as api_error:
248
+ logger.error(f"failed to get page with id {parent.id}: {api_error}")
249
+ if str(parent.id) in child_pages:
250
+ child_pages.remove(str(parent.id))
251
+ continue
252
+ if not page_children:
253
+ continue
254
+
255
+ # Extract child pages
256
+ child_pages_from_page = [
257
+ c for c in page_children if isinstance(c.block, notion_blocks.ChildPage)
258
+ ]
259
+ if child_pages_from_page:
260
+ child_page_blocks: List[notion_blocks.ChildPage] = [
261
+ p.block
262
+ for p in child_pages_from_page
263
+ if isinstance(p.block, notion_blocks.ChildPage)
264
+ ]
265
+ logger.debug(
266
+ "found child pages from parent page {}: {}".format(
267
+ parent.id,
268
+ ", ".join([block.title for block in child_page_blocks]),
269
+ ),
270
+ )
271
+ new_pages = [p.id for p in child_pages_from_page if p.id not in processed]
272
+ new_pages = list(set(new_pages))
273
+ child_pages.extend(new_pages)
274
+ parents.extend(
275
+ [QueueEntry(type=QueueEntryType.PAGE, id=UUID(i)) for i in new_pages],
276
+ )
277
+
278
+ # Extract child databases
279
+ child_dbs_from_page = [
280
+ c for c in page_children if isinstance(c.block, notion_blocks.ChildDatabase)
281
+ ]
282
+ if child_dbs_from_page:
283
+ child_db_blocks: List[notion_blocks.ChildDatabase] = [
284
+ c.block
285
+ for c in page_children
286
+ if isinstance(c.block, notion_blocks.ChildDatabase)
287
+ ]
288
+ logger.debug(
289
+ "found child database from parent page {}: {}".format(
290
+ parent.id,
291
+ ", ".join([block.title for block in child_db_blocks]),
292
+ ),
293
+ )
294
+ new_dbs = [db.id for db in child_dbs_from_page if db.id not in processed]
295
+ new_dbs = list(set(new_dbs))
296
+ child_dbs.extend(new_dbs)
297
+ parents.extend(
298
+ [QueueEntry(type=QueueEntryType.DATABASE, id=UUID(i)) for i in new_dbs],
299
+ )
300
+
301
+ linked_to_others: List[notion_blocks.LinkToPage] = [
302
+ c.block for c in page_children if isinstance(c.block, notion_blocks.LinkToPage)
303
+ ]
304
+ for link in linked_to_others:
305
+ if (page_id := link.page_id) and (
306
+ page_id not in processed and page_id not in child_pages
307
+ ):
308
+ child_pages.append(page_id)
309
+ parents.append(QueueEntry(type=QueueEntryType.PAGE, id=UUID(page_id)))
310
+ if (database_id := link.database_id) and (
311
+ database_id not in processed and database_id not in child_dbs
312
+ ):
313
+ child_dbs.append(database_id)
314
+ parents.append(
315
+ QueueEntry(type=QueueEntryType.DATABASE, id=UUID(database_id)),
316
+ )
317
+
318
+ elif parent.type == QueueEntryType.DATABASE:
319
+ logger.debug(f"Getting child data from database: {parent.id}")
320
+ database_pages = []
321
+ try:
322
+ for page_entries in client.databases.iterate_query( # type: ignore
323
+ database_id=str(parent.id),
324
+ ):
325
+ database_pages.extend(page_entries)
326
+ except APIResponseError as api_error:
327
+ logger.error(f"failed to get database with id {parent.id}: {api_error}")
328
+ if str(parent.id) in child_dbs:
329
+ child_dbs.remove(str(parent.id))
330
+ continue
331
+ if not database_pages:
332
+ continue
333
+
334
+ child_pages_from_db = [
335
+ p for p in database_pages if is_page_url(client=client, url=p.url)
336
+ ]
337
+ if child_pages_from_db:
338
+ logger.debug(
339
+ "found child pages from parent database {}: {}".format(
340
+ parent.id,
341
+ ", ".join([p.url for p in child_pages_from_db]),
342
+ ),
343
+ )
344
+ new_pages = [p.id for p in child_pages_from_db if p.id not in processed]
345
+ child_pages.extend(new_pages)
346
+ parents.extend(
347
+ [QueueEntry(type=QueueEntryType.PAGE, id=UUID(i)) for i in new_pages],
348
+ )
349
+
350
+ child_dbs_from_db = [
351
+ p for p in database_pages if is_database_url(client=client, url=p.url)
352
+ ]
353
+ if child_dbs_from_db:
354
+ logger.debug(
355
+ "found child database from parent database {}: {}".format(
356
+ parent.id,
357
+ ", ".join([db.url for db in child_dbs_from_db]),
358
+ ),
359
+ )
360
+ new_dbs = [db.id for db in child_dbs_from_db if db.id not in processed]
361
+ child_dbs.extend(new_dbs)
362
+ parents.extend(
363
+ [QueueEntry(type=QueueEntryType.DATABASE, id=UUID(i)) for i in new_dbs],
364
+ )
365
+
366
+ return ChildExtractionResponse(
367
+ child_pages=child_pages,
368
+ child_databases=child_dbs,
369
+ )
370
+
371
+
372
+ def is_valid_uuid(uuid_str: str) -> bool:
373
+ try:
374
+ UUID(uuid_str)
375
+ return True
376
+ except Exception:
377
+ return False
378
+
379
+
380
+ def get_uuid_from_url(path: str) -> Optional[str]:
381
+ strings = path.split("-")
382
+ if len(strings) > 0 and is_valid_uuid(strings[-1]):
383
+ return strings[-1]
384
+ return None
385
+
386
+
387
+ def is_page_url(client: Client, url: str):
388
+ parsed_url = urlparse(url)
389
+ path = parsed_url.path.split("/")[-1]
390
+ if parsed_url.netloc != "www.notion.so":
391
+ return False
392
+ page_uuid = get_uuid_from_url(path=path)
393
+ if not page_uuid:
394
+ return False
395
+ check_resp = client.pages.retrieve_status(page_id=page_uuid)
396
+ return check_resp == 200
397
+
398
+
399
+ def is_database_url(client: Client, url: str):
400
+ parsed_url = urlparse(url)
401
+ path = parsed_url.path.split("/")[-1]
402
+ if parsed_url.netloc != "www.notion.so":
403
+ return False
404
+ database_uuid = get_uuid_from_url(path=path)
405
+ if not database_uuid:
406
+ return False
407
+ check_resp = client.databases.retrieve_status(database_id=database_uuid)
408
+ return check_resp == 200
409
+
410
+
411
+ @dataclass
412
+ class BuildTableResponse:
413
+ table_html: HtmlTag
414
+ child_pages: List[str] = field(default_factory=list)
415
+ child_databases: List[str] = field(default_factory=list)
416
+
417
+
418
+ def build_table(client: Client, table: Block) -> BuildTableResponse:
419
+ if not isinstance(table.block, notion_blocks.Table):
420
+ raise ValueError(f"block type not table: {type(table.block)}")
421
+ rows: List[notion_blocks.TableRow] = []
422
+ child_pages: List[str] = []
423
+ child_databases: List[str] = []
424
+ for row_chunk in client.blocks.children.iterate_list( # type: ignore
425
+ block_id=table.id,
426
+ ):
427
+ rows.extend(
428
+ [row.block for row in row_chunk if isinstance(row.block, notion_blocks.TableRow)],
429
+ )
430
+
431
+ # Extract child databases and pages
432
+ for row in rows:
433
+ for c in row.cells:
434
+ for rt in c.rich_texts:
435
+ if mention := rt.mention:
436
+ if mention.type == "page" and (page := mention.page):
437
+ child_pages.append(page.id)
438
+ if mention.type == "database" and (database := mention.database):
439
+ child_databases.append(database.id)
440
+
441
+ header: Optional[notion_blocks.TableRow] = None
442
+ if table.block.has_column_header:
443
+ header = rows.pop(0)
444
+ table_html_rows = []
445
+ if header:
446
+ header.is_header = True
447
+ table_html_rows.append(header.get_html())
448
+ table_html_rows.extend([row.get_html() for row in rows])
449
+ html_table = Table([], table_html_rows)
450
+
451
+ return BuildTableResponse(
452
+ table_html=html_table,
453
+ child_pages=child_pages,
454
+ child_databases=child_databases,
455
+ )
456
+
457
+
458
+ def build_columned_list(client: Client, column_parent: Block) -> HtmlTag:
459
+ if not isinstance(column_parent.block, notion_blocks.ColumnList):
460
+ raise ValueError(f"block type not column list: {type(column_parent.block)}")
461
+ columns: List[Block] = []
462
+ for column_chunk in client.blocks.children.iterate_list( # type: ignore
463
+ block_id=column_parent.id,
464
+ ):
465
+ columns.extend(column_chunk)
466
+ num_columns = len(columns)
467
+ columns_content = []
468
+ for column in columns:
469
+ for column_content_chunk in client.blocks.children.iterate_list( # type: ignore
470
+ block_id=column.id,
471
+ ):
472
+ columns_content.append(
473
+ Div(
474
+ [Style(f"width:{100/num_columns}%; float: left")],
475
+ [content.block.get_html() for content in column_content_chunk],
476
+ ),
477
+ )
478
+
479
+ return Div([], columns_content)
480
+
481
+
482
+ @dataclass
483
+ class BulletedListResponse:
484
+ html: HtmlTag
485
+ child_list: Optional[HtmlTag] = None
486
+
487
+
488
+ bulleted_list_styles = ["circle", "square", "disc"]
489
+
490
+
491
+ def build_bulleted_list_children(
492
+ client: Client,
493
+ bulleted_list_item_parent: Block,
494
+ list_style_ind: int = 0,
495
+ ) -> BulletedListResponse:
496
+ if not isinstance(bulleted_list_item_parent.block, notion_blocks.BulletedListItem):
497
+ raise ValueError(
498
+ f"block type not bulleted list item: {type(bulleted_list_item_parent.block)}",
499
+ )
500
+ html = bulleted_list_item_parent.get_html()
501
+ if html:
502
+ html.attributes = [Style("margin-left: 10px")]
503
+ if not bulleted_list_item_parent.has_children:
504
+ return BulletedListResponse(
505
+ html=html,
506
+ )
507
+ children = []
508
+ for child_block in client.blocks.children.iterate_list( # type: ignore
509
+ block_id=bulleted_list_item_parent.id,
510
+ ):
511
+ children.extend(child_block)
512
+ if not children:
513
+ return BulletedListResponse(
514
+ html=bulleted_list_item_parent.get_html(),
515
+ )
516
+ child_html = []
517
+ for child in children:
518
+ child_resp = build_bulleted_list_children(
519
+ client=client,
520
+ bulleted_list_item_parent=child,
521
+ list_style_ind=(list_style_ind + 1) % len(bulleted_list_styles),
522
+ )
523
+ child_html.append(child_resp.html)
524
+ if child_children := child_resp.child_list:
525
+ child_html.append(child_children)
526
+
527
+ return BulletedListResponse(
528
+ html=html,
529
+ child_list=Ul(
530
+ [Style(f"list-style-type: {bulleted_list_styles[list_style_ind]}")],
531
+ child_html,
532
+ ),
533
+ )
534
+
535
+
536
+ @dataclass
537
+ class NumberedListResponse:
538
+ html: HtmlTag
539
+ child_list: Optional[HtmlTag] = None
540
+
541
+
542
+ numbered_list_types = ["a", "i", "1"]
543
+
544
+
545
+ def build_numbered_list_children(
546
+ client: Client,
547
+ numbered_list_item_parent: Block,
548
+ type_attr_ind=0,
549
+ ) -> NumberedListResponse:
550
+ if not isinstance(numbered_list_item_parent.block, notion_blocks.NumberedListItem):
551
+ raise ValueError(
552
+ f"block type not numbered list item: {type(numbered_list_item_parent.block)}",
553
+ )
554
+ html = numbered_list_item_parent.get_html()
555
+ if html:
556
+ html.attributes = [Style("margin-left: 10px")]
557
+ if not numbered_list_item_parent.has_children:
558
+ return NumberedListResponse(
559
+ html=html,
560
+ )
561
+ children = []
562
+ for child_block in client.blocks.children.iterate_list( # type: ignore
563
+ block_id=numbered_list_item_parent.id,
564
+ ):
565
+ children.extend(child_block)
566
+ if not children:
567
+ return NumberedListResponse(
568
+ html=numbered_list_item_parent.get_html(),
569
+ )
570
+ child_html = []
571
+ for child in children:
572
+ child_resp = build_numbered_list_children(
573
+ client=client,
574
+ numbered_list_item_parent=child,
575
+ type_attr_ind=(type_attr_ind + 1) % len(numbered_list_types),
576
+ )
577
+ child_html.append(child_resp.html)
578
+ if child_children := child_resp.child_list:
579
+ child_html.append(child_children)
580
+
581
+ return NumberedListResponse(
582
+ html=html,
583
+ child_list=Ol([Type(numbered_list_types[type_attr_ind])], child_html),
584
+ )
@@ -0,0 +1,32 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Optional
3
+
4
+ from htmlBuilder.tags import HtmlTag
5
+
6
+
7
+ class FromJSONMixin(ABC):
8
+ @classmethod
9
+ @abstractmethod
10
+ def from_dict(cls, data: dict):
11
+ pass
12
+
13
+
14
+ class GetHTMLMixin(ABC):
15
+ @abstractmethod
16
+ def get_html(self) -> Optional[HtmlTag]:
17
+ pass
18
+
19
+
20
+ class BlockBase(FromJSONMixin, GetHTMLMixin):
21
+ @staticmethod
22
+ @abstractmethod
23
+ def can_have_children() -> bool:
24
+ pass
25
+
26
+
27
+ class DBPropertyBase(FromJSONMixin):
28
+ pass
29
+
30
+
31
+ class DBCellBase(FromJSONMixin, GetHTMLMixin):
32
+ pass
File without changes