cocoindex 0.1.37__tar.gz → 0.1.38__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. {cocoindex-0.1.37 → cocoindex-0.1.38}/Cargo.lock +1 -1
  2. {cocoindex-0.1.37 → cocoindex-0.1.38}/Cargo.toml +1 -1
  3. {cocoindex-0.1.37 → cocoindex-0.1.38}/PKG-INFO +2 -1
  4. {cocoindex-0.1.37 → cocoindex-0.1.38}/README.md +1 -0
  5. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/cli.mdx +2 -2
  6. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/initialization.mdx +12 -0
  7. cocoindex-0.1.38/examples/docs_to_knowledge_graph/.env +3 -0
  8. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/cli.py +4 -4
  9. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/flow.py +21 -13
  10. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/lib.py +1 -0
  11. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/setting.py +24 -1
  12. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/setup.py +8 -2
  13. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/db_tracking_setup.rs +4 -5
  14. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/storages/postgres.rs +7 -5
  15. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/prelude.rs +4 -4
  16. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/utils/db.rs +12 -0
  17. cocoindex-0.1.37/examples/text_embedding_qdrant/.env +0 -2
  18. {cocoindex-0.1.37 → cocoindex-0.1.38}/.cargo/config.toml +0 -0
  19. {cocoindex-0.1.37 → cocoindex-0.1.38}/.env.lib_debug +0 -0
  20. {cocoindex-0.1.37 → cocoindex-0.1.38}/.github/ISSUE_TEMPLATE//360/237/220/233-bug-report.md" +0 -0
  21. {cocoindex-0.1.37 → cocoindex-0.1.38}/.github/ISSUE_TEMPLATE//360/237/222/241-feature-request.md" +0 -0
  22. {cocoindex-0.1.37 → cocoindex-0.1.38}/.github/scripts/update_version.sh +0 -0
  23. {cocoindex-0.1.37 → cocoindex-0.1.38}/.github/workflows/CI.yml +0 -0
  24. {cocoindex-0.1.37 → cocoindex-0.1.38}/.github/workflows/_test.yml +0 -0
  25. {cocoindex-0.1.37 → cocoindex-0.1.38}/.github/workflows/docs.yml +0 -0
  26. {cocoindex-0.1.37 → cocoindex-0.1.38}/.github/workflows/release.yml +0 -0
  27. {cocoindex-0.1.37 → cocoindex-0.1.38}/.gitignore +0 -0
  28. {cocoindex-0.1.37 → cocoindex-0.1.38}/.vscode/settings.json +0 -0
  29. {cocoindex-0.1.37 → cocoindex-0.1.38}/CODE_OF_CONDUCT.md +0 -0
  30. {cocoindex-0.1.37 → cocoindex-0.1.38}/CONTRIBUTING.md +0 -0
  31. {cocoindex-0.1.37 → cocoindex-0.1.38}/LICENSE +0 -0
  32. {cocoindex-0.1.37 → cocoindex-0.1.38}/dev/neo4j.yaml +0 -0
  33. {cocoindex-0.1.37 → cocoindex-0.1.38}/dev/postgres.yaml +0 -0
  34. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/.gitignore +0 -0
  35. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/README.md +0 -0
  36. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/about/community.md +0 -0
  37. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/about/contributing.md +0 -0
  38. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/ai/llm.mdx +0 -0
  39. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/basics.md +0 -0
  40. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/custom_function.mdx +0 -0
  41. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/data_example.svg +0 -0
  42. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/data_types.mdx +0 -0
  43. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/flow_def.mdx +0 -0
  44. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/flow_example.svg +0 -0
  45. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/core/flow_methods.mdx +0 -0
  46. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/getting_started/installation.md +0 -0
  47. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/getting_started/markdown_files.zip +0 -0
  48. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/getting_started/overview.md +0 -0
  49. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/getting_started/quickstart.md +0 -0
  50. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/ops/functions.md +0 -0
  51. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/ops/sources.md +0 -0
  52. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docs/ops/storages.md +0 -0
  53. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/docusaurus.config.ts +0 -0
  54. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/package.json +0 -0
  55. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/sidebars.ts +0 -0
  56. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/src/components/HomepageFeatures/index.tsx +0 -0
  57. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/src/components/HomepageFeatures/styles.module.css +0 -0
  58. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/src/css/custom.css +0 -0
  59. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/src/theme/Root.js +0 -0
  60. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/static/.nojekyll +0 -0
  61. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/static/img/docusaurus.png +0 -0
  62. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/static/img/favicon.ico +0 -0
  63. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/static/img/icon.svg +0 -0
  64. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/static/robots.txt +0 -0
  65. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/tsconfig.json +0 -0
  66. {cocoindex-0.1.37 → cocoindex-0.1.38}/docs/yarn.lock +0 -0
  67. {cocoindex-0.1.37/examples/amazon_s3_text_embedding → cocoindex-0.1.38/examples/amazon_s3_embedding}/.env.example +0 -0
  68. {cocoindex-0.1.37/examples/amazon_s3_text_embedding → cocoindex-0.1.38/examples/amazon_s3_embedding}/.gitignore +0 -0
  69. {cocoindex-0.1.37/examples/amazon_s3_text_embedding → cocoindex-0.1.38/examples/amazon_s3_embedding}/README.md +0 -0
  70. {cocoindex-0.1.37/examples/amazon_s3_text_embedding → cocoindex-0.1.38/examples/amazon_s3_embedding}/main.py +0 -0
  71. {cocoindex-0.1.37/examples/amazon_s3_text_embedding → cocoindex-0.1.38/examples/amazon_s3_embedding}/pyproject.toml +0 -0
  72. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/code_embedding/.env +0 -0
  73. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/code_embedding/README.md +0 -0
  74. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/code_embedding/main.py +0 -0
  75. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/code_embedding/pyproject.toml +0 -0
  76. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/docs_to_knowledge_graph/README.md +0 -0
  77. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/docs_to_knowledge_graph/main.py +0 -0
  78. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/docs_to_knowledge_graph/pyproject.toml +0 -0
  79. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/.dockerignore +0 -0
  80. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/.env +0 -0
  81. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/README.md +0 -0
  82. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/compose.yaml +0 -0
  83. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/dockerfile +0 -0
  84. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/main.py +0 -0
  85. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/requirements.txt +0 -0
  86. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/sample_code/main.py +0 -0
  87. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/fastapi_server_docker/src/cocoindex_funs.py +0 -0
  88. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/gdrive_text_embedding/.env.example +0 -0
  89. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/gdrive_text_embedding/.gitignore +0 -0
  90. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/gdrive_text_embedding/README.md +0 -0
  91. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/gdrive_text_embedding/main.py +0 -0
  92. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/gdrive_text_embedding/pyproject.toml +0 -0
  93. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/.env +0 -0
  94. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/README.md +0 -0
  95. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/frontend/.gitignore +0 -0
  96. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/frontend/index.html +0 -0
  97. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/frontend/package-lock.json +0 -0
  98. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/frontend/package.json +0 -0
  99. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/frontend/src/App.jsx +0 -0
  100. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/frontend/src/main.jsx +0 -0
  101. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/frontend/src/style.css +0 -0
  102. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/frontend/vite.config.js +0 -0
  103. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/img/cat1.jpeg +0 -0
  104. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/img/dog1.jpeg +0 -0
  105. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/img/elephant1.jpg +0 -0
  106. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/img/giraffe.jpg +0 -0
  107. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/main.py +0 -0
  108. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/image_search_example/requirements.txt +0 -0
  109. {cocoindex-0.1.37/examples/docs_to_knowledge_graph → cocoindex-0.1.38/examples/manuals_llm_extraction}/.env +0 -0
  110. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/manuals_llm_extraction/README.md +0 -0
  111. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/manuals_llm_extraction/main.py +0 -0
  112. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/manuals_llm_extraction/manuals/array.pdf +0 -0
  113. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/manuals_llm_extraction/manuals/base64.pdf +0 -0
  114. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/manuals_llm_extraction/manuals/copy.pdf +0 -0
  115. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/manuals_llm_extraction/manuals/glob.pdf +0 -0
  116. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/manuals_llm_extraction/pyproject.toml +0 -0
  117. {cocoindex-0.1.37/examples/manuals_llm_extraction → cocoindex-0.1.38/examples/pdf_embedding}/.env +0 -0
  118. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/pdf_embedding/README.md +0 -0
  119. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/pdf_embedding/main.py +0 -0
  120. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/pdf_embedding/pdf_files/1706.03762v7.pdf +0 -0
  121. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/pdf_embedding/pdf_files/1810.04805v2.pdf +0 -0
  122. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/pdf_embedding/pdf_files/rfc8259.pdf +0 -0
  123. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/pdf_embedding/pyproject.toml +0 -0
  124. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/.env +0 -0
  125. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/README.md +0 -0
  126. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/img/cocoinsight.png +0 -0
  127. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/img/neo4j.png +0 -0
  128. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/main.py +0 -0
  129. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p1.json +0 -0
  130. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p2.json +0 -0
  131. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p3.json +0 -0
  132. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p4.json +0 -0
  133. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p5.json +0 -0
  134. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p6.json +0 -0
  135. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p7.json +0 -0
  136. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p8.json +0 -0
  137. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/products/p9.json +0 -0
  138. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/product_taxonomy_knowledge_graph/pyproject.toml +0 -0
  139. {cocoindex-0.1.37/examples/pdf_embedding → cocoindex-0.1.38/examples/text_embedding}/.env +0 -0
  140. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding/README.md +0 -0
  141. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding/Text_Embedding.ipynb +0 -0
  142. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding/main.py +0 -0
  143. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding/markdown_files/1706.03762v7.md +0 -0
  144. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding/markdown_files/1810.04805v2.md +0 -0
  145. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding/markdown_files/rfc8259.md +0 -0
  146. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding/pyproject.toml +0 -0
  147. {cocoindex-0.1.37/examples/text_embedding → cocoindex-0.1.38/examples/text_embedding_qdrant}/.env +0 -0
  148. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding_qdrant/README.md +0 -0
  149. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding_qdrant/main.py +0 -0
  150. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding_qdrant/markdown_files/rfc8259.md +0 -0
  151. {cocoindex-0.1.37 → cocoindex-0.1.38}/examples/text_embedding_qdrant/pyproject.toml +0 -0
  152. {cocoindex-0.1.37 → cocoindex-0.1.38}/pyproject.toml +0 -0
  153. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/__init__.py +0 -0
  154. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/auth_registry.py +0 -0
  155. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/convert.py +0 -0
  156. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/functions.py +0 -0
  157. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/index.py +0 -0
  158. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/llm.py +0 -0
  159. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/op.py +0 -0
  160. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/py.typed +0 -0
  161. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/query.py +0 -0
  162. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/runtime.py +0 -0
  163. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/sources.py +0 -0
  164. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/storages.py +0 -0
  165. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/tests/__init__.py +0 -0
  166. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/tests/test_convert.py +0 -0
  167. {cocoindex-0.1.37 → cocoindex-0.1.38}/python/cocoindex/typing.py +0 -0
  168. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/base/field_attrs.rs +0 -0
  169. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/base/json_schema.rs +0 -0
  170. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/base/mod.rs +0 -0
  171. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/base/schema.rs +0 -0
  172. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/base/spec.rs +0 -0
  173. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/base/value.rs +0 -0
  174. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/builder/analyzed_flow.rs +0 -0
  175. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/builder/analyzer.rs +0 -0
  176. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/builder/flow_builder.rs +0 -0
  177. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/builder/mod.rs +0 -0
  178. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/builder/plan.rs +0 -0
  179. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/db_tracking.rs +0 -0
  180. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/dumper.rs +0 -0
  181. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/evaluator.rs +0 -0
  182. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/indexing_status.rs +0 -0
  183. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/live_updater.rs +0 -0
  184. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/memoization.rs +0 -0
  185. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/mod.rs +0 -0
  186. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/query.rs +0 -0
  187. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/row_indexer.rs +0 -0
  188. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/source_indexer.rs +0 -0
  189. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/execution/stats.rs +0 -0
  190. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/lib.rs +0 -0
  191. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/lib_context.rs +0 -0
  192. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/llm/anthropic.rs +0 -0
  193. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/llm/gemini.rs +0 -0
  194. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/llm/mod.rs +0 -0
  195. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/llm/ollama.rs +0 -0
  196. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/llm/openai.rs +0 -0
  197. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/factory_bases.rs +0 -0
  198. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/functions/extract_by_llm.rs +0 -0
  199. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/functions/mod.rs +0 -0
  200. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/functions/parse_json.rs +0 -0
  201. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/functions/split_recursively.rs +0 -0
  202. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/interface.rs +0 -0
  203. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/mod.rs +0 -0
  204. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/py_factory.rs +0 -0
  205. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/registration.rs +0 -0
  206. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/registry.rs +0 -0
  207. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/sdk.rs +0 -0
  208. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/sources/amazon_s3.rs +0 -0
  209. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/sources/google_drive.rs +0 -0
  210. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/sources/local_file.rs +0 -0
  211. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/sources/mod.rs +0 -0
  212. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/storages/mod.rs +0 -0
  213. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/storages/neo4j.rs +0 -0
  214. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/storages/qdrant.rs +0 -0
  215. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/ops/storages/spec.rs +0 -0
  216. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/py/convert.rs +0 -0
  217. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/py/mod.rs +0 -0
  218. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/server.rs +0 -0
  219. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/service/error.rs +0 -0
  220. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/service/flows.rs +0 -0
  221. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/service/mod.rs +0 -0
  222. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/service/search.rs +0 -0
  223. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/settings.rs +0 -0
  224. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/setup/auth_registry.rs +0 -0
  225. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/setup/components.rs +0 -0
  226. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/setup/db_metadata.rs +0 -0
  227. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/setup/driver.rs +0 -0
  228. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/setup/mod.rs +0 -0
  229. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/setup/states.rs +0 -0
  230. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/utils/fingerprint.rs +0 -0
  231. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/utils/immutable.rs +0 -0
  232. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/utils/mod.rs +0 -0
  233. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/utils/retryable.rs +0 -0
  234. {cocoindex-0.1.37 → cocoindex-0.1.38}/src/utils/yaml_ser.rs +0 -0
@@ -993,7 +993,7 @@ dependencies = [
993
993
 
994
994
  [[package]]
995
995
  name = "cocoindex"
996
- version = "0.1.37"
996
+ version = "0.1.38"
997
997
  dependencies = [
998
998
  "anyhow",
999
999
  "async-openai",
@@ -2,7 +2,7 @@
2
2
  name = "cocoindex"
3
3
  # Version used for local development is always higher than others to take precedence.
4
4
  # Will be overridden for specific release versions.
5
- version = "0.1.37"
5
+ version = "0.1.38"
6
6
  edition = "2024"
7
7
 
8
8
  [profile.release]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cocoindex
3
- Version: 0.1.37
3
+ Version: 0.1.38
4
4
  Requires-Dist: sentence-transformers>=3.3.1
5
5
  Requires-Dist: click>=8.1.8
6
6
  Requires-Dist: rich>=14.0.0
@@ -148,6 +148,7 @@ It defines an index flow like this:
148
148
  | [Code Embedding](examples/code_embedding) | Index code embeddings for semantic search |
149
149
  | [PDF Embedding](examples/pdf_embedding) | Parse PDF and index text embeddings for semantic search |
150
150
  | [Manuals LLM Extraction](examples/manuals_llm_extraction) | Extract structured information from a manual using LLM |
151
+ | [Amazon S3 Embedding](examples/amazon_s3_embedding) | Index text documents from Amazon S3 |
151
152
  | [Google Drive Text Embedding](examples/gdrive_text_embedding) | Index text documents from Google Drive |
152
153
  | [Docs to Knowledge Graph](examples/docs_to_knowledge_graph) | Extract relationships from Markdown documents and build a knowledge graph |
153
154
  | [Embeddings to Qdrant](examples/text_embedding_qdrant) | Index documents in a Qdrant collection for semantic search |
@@ -132,6 +132,7 @@ It defines an index flow like this:
132
132
  | [Code Embedding](examples/code_embedding) | Index code embeddings for semantic search |
133
133
  | [PDF Embedding](examples/pdf_embedding) | Parse PDF and index text embeddings for semantic search |
134
134
  | [Manuals LLM Extraction](examples/manuals_llm_extraction) | Extract structured information from a manual using LLM |
135
+ | [Amazon S3 Embedding](examples/amazon_s3_embedding) | Index text documents from Amazon S3 |
135
136
  | [Google Drive Text Embedding](examples/gdrive_text_embedding) | Index text documents from Google Drive |
136
137
  | [Docs to Knowledge Graph](examples/docs_to_knowledge_graph) | Extract relationships from Markdown documents and build a knowledge graph |
137
138
  | [Embeddings to Qdrant](examples/text_embedding_qdrant) | Index documents in a Qdrant collection for semantic search |
@@ -41,7 +41,7 @@ You may also provide a `cocoindex_cmd` argument to the `main_fn` decorator to ch
41
41
 
42
42
  ### Explicitly CLI Invoke
43
43
 
44
- An alterntive way is to use `cocoindex.cli.cli` (with type [`click.Group`](https://click.palletsprojects.com/en/stable/api/#click.Group)).
44
+ An alternative way is to use `cocoindex.cli.cli` (with type [`click.Group`](https://click.palletsprojects.com/en/stable/api/#click.Group)).
45
45
  For example, you may invoke the CLI explicitly with additional arguments:
46
46
 
47
47
  <Tabs>
@@ -60,7 +60,7 @@ The following subcommands are available:
60
60
 
61
61
  | Subcommand | Description |
62
62
  | ---------- | ----------- |
63
- | `ls` | List all flows. |
63
+ | `ls` | List all flows present in the current process. Or list all persisted flows under the current app namespace if `--all` is specified. |
64
64
  | `show` | Show the spec for a specific flow. |
65
65
  | `setup` | Check and apply backend setup changes for flows, including the internal and target storage (to export). |
66
66
  | `drop` | Drop the backend setup for specified flows. |
@@ -83,8 +83,19 @@ if __name__ == "__main__":
83
83
 
84
84
  `cocoindex.Settings` is used to configure the CocoIndex library. It's a dataclass that contains the following fields:
85
85
 
86
+ * `app_namespace` (type: `str`, required): The namespace of the application.
86
87
  * `database` (type: `DatabaseConnectionSpec`, required): The connection to the Postgres database.
87
88
 
89
+ ### App Namespace
90
+
91
+ The `app_namespace` field helps organize flows across different environments (e.g., testing, production) or teams. When set, it prefixes flow names with the namespace.
92
+
93
+ For example, if the namespace is "Staging", for a flow with name specified as `Flow1` in code, the full name of the flow will be `Staging.Flow1`.
94
+
95
+ If not set, all flows are in a default unnamed namespace.
96
+
97
+ You can also control it by the `COCOINDEX_APP_NAMESPACE` environment variable.
98
+
88
99
  ### DatabaseConnectionSpec
89
100
 
90
101
  `DatabaseConnectionSpec` configures the connection to a database. Only Postgres is supported for now. It has the following fields:
@@ -116,6 +127,7 @@ Each setting field has a corresponding environment variable:
116
127
 
117
128
  | environment variable | corresponding field in `Settings` | required? |
118
129
  |---------------------|-------------------|----------|
130
+ | `COCOINDEX_APP_NAMESPACE` | `app_namespace` | No |
119
131
  | `COCOINDEX_DATABASE_URL` | `database.url` | Yes |
120
132
  | `COCOINDEX_DATABASE_USER` | `database.user` | No |
121
133
  | `COCOINDEX_DATABASE_PASSWORD` | `database.password` | No |
@@ -0,0 +1,3 @@
1
+ # Postgres database address for cocoindex
2
+ COCOINDEX_DATABASE_URL=postgres://cocoindex:cocoindex@localhost/cocoindex
3
+ COCOINDEX_APP_NAMESPACE=Dev0
@@ -16,7 +16,7 @@ def cli():
16
16
  @cli.command()
17
17
  @click.option(
18
18
  "-a", "--all", "show_all", is_flag=True, show_default=True, default=False,
19
- help="Also show all flows with persisted setup, even if not defined in the current process.")
19
+ help="Also show all flows with persisted setup under the current app namespace, even if not defined in the current process.")
20
20
  def ls(show_all: bool):
21
21
  """
22
22
  List all flows.
@@ -65,7 +65,7 @@ def show(flow_name: str | None, color: bool, verbose: bool):
65
65
 
66
66
  console.print()
67
67
  table = Table(
68
- title=f"Schema for Flow: {flow.name}",
68
+ title=f"Schema for Flow: {flow.full_name}",
69
69
  show_header=True,
70
70
  header_style="bold magenta"
71
71
  )
@@ -108,7 +108,7 @@ def drop(flow_name: tuple[str, ...], drop_all: bool):
108
108
  if drop_all:
109
109
  flow_names = flow_names_with_setup()
110
110
  elif len(flow_name) == 0:
111
- flow_names = [fl.name for fl in flow.flows()]
111
+ flow_names = flow.flow_names()
112
112
  else:
113
113
  flow_names = list(flow_name)
114
114
  setup_status = drop_setup(flow_names)
@@ -160,7 +160,7 @@ def evaluate(flow_name: str | None, output_dir: str | None, cache: bool = True):
160
160
  """
161
161
  fl = _flow_by_name(flow_name)
162
162
  if output_dir is None:
163
- output_dir = f"eval_{fl.name}_{datetime.datetime.now().strftime('%y%m%d_%H%M%S')}"
163
+ output_dir = f"eval_{setting.get_app_namespace(trailing_delimiter='_')}{flow_name}_{datetime.datetime.now().strftime('%y%m%d_%H%M%S')}"
164
164
  options = flow.EvaluateAndDumpOptions(output_dir=output_dir, use_cache=cache)
165
165
  fl.evaluate_and_dump(options)
166
166
 
@@ -19,6 +19,7 @@ from rich.tree import Tree
19
19
  from . import _engine
20
20
  from . import index
21
21
  from . import op
22
+ from . import setting
22
23
  from .convert import dump_engine_object
23
24
  from .typing import encode_enriched_type
24
25
  from .runtime import execution_context
@@ -310,7 +311,7 @@ class _FlowBuilderState:
310
311
 
311
312
  def __init__(self, /, name: str | None = None):
312
313
  flow_name = _flow_name_builder.build_name(name, prefix="_flow_")
313
- self.engine_flow_builder = _engine.FlowBuilder(flow_name)
314
+ self.engine_flow_builder = _engine.FlowBuilder(get_full_flow_name(flow_name))
314
315
  self.field_name_builder = _NameBuilder()
315
316
 
316
317
  def get_data_slice(self, v: Any) -> _engine.DataSlice:
@@ -481,7 +482,7 @@ class Flow:
481
482
  Render the flow spec as a styled rich Tree with hierarchical structure.
482
483
  """
483
484
  spec = self._get_spec(verbose=verbose)
484
- tree = Tree(f"Flow: {self.name}", style="cyan")
485
+ tree = Tree(f"Flow: {self.full_name}", style="cyan")
485
486
 
486
487
  def build_tree(label: str, lines: list):
487
488
  node = Tree(label, style="bold magenta" if lines else "cyan")
@@ -508,9 +509,9 @@ class Flow:
508
509
  return repr(self._lazy_engine_flow())
509
510
 
510
511
  @property
511
- def name(self) -> str:
512
+ def full_name(self) -> str:
512
513
  """
513
- Get the name of the flow.
514
+ Get the full name of the flow.
514
515
  """
515
516
  return self._lazy_engine_flow().name()
516
517
 
@@ -566,8 +567,16 @@ def _create_lazy_flow(name: str | None, fl_def: Callable[[FlowBuilder, DataScope
566
567
  _flows_lock = Lock()
567
568
  _flows: dict[str, Flow] = {}
568
569
 
570
+ def get_full_flow_name(name: str) -> str:
571
+ """
572
+ Get the full name of a flow.
573
+ """
574
+ return f"{setting.get_app_namespace(trailing_delimiter='.')}{name}"
575
+
569
576
  def add_flow_def(name: str, fl_def: Callable[[FlowBuilder, DataScope], None]) -> Flow:
570
577
  """Add a flow definition to the cocoindex library."""
578
+ if not all(c.isalnum() or c == '_' for c in name):
579
+ raise ValueError(f"Flow name '{name}' contains invalid characters. Only alphanumeric characters and underscores are allowed.")
571
580
  with _flows_lock:
572
581
  if name in _flows:
573
582
  raise KeyError(f"Flow with name {name} already exists")
@@ -587,12 +596,12 @@ def flow_names() -> list[str]:
587
596
  with _flows_lock:
588
597
  return list(_flows.keys())
589
598
 
590
- def flows() -> list[Flow]:
599
+ def flows() -> dict[str, Flow]:
591
600
  """
592
601
  Get all flows.
593
602
  """
594
603
  with _flows_lock:
595
- return list(_flows.values())
604
+ return dict(_flows)
596
605
 
597
606
  def flow_by_name(name: str) -> Flow:
598
607
  """
@@ -605,14 +614,13 @@ def ensure_all_flows_built() -> None:
605
614
  """
606
615
  Ensure all flows are built.
607
616
  """
608
- for fl in flows():
609
- fl.internal_flow()
617
+ execution_context.run(ensure_all_flows_built_async())
610
618
 
611
619
  async def ensure_all_flows_built_async() -> None:
612
620
  """
613
621
  Ensure all flows are built.
614
622
  """
615
- for fl in flows():
623
+ for fl in flows().values():
616
624
  await fl.internal_flow_async()
617
625
 
618
626
  def update_all_flows(options: FlowLiveUpdaterOptions) -> dict[str, _engine.IndexUpdateInfo]:
@@ -626,13 +634,13 @@ async def update_all_flows_async(options: FlowLiveUpdaterOptions) -> dict[str, _
626
634
  Update all flows.
627
635
  """
628
636
  await ensure_all_flows_built_async()
629
- async def _update_flow(fl: Flow) -> _engine.IndexUpdateInfo:
637
+ async def _update_flow(name: str, fl: Flow) -> tuple[str, _engine.IndexUpdateInfo]:
630
638
  async with FlowLiveUpdater(fl, options) as updater:
631
639
  await updater.wait_async()
632
- return updater.update_stats()
640
+ return (name, updater.update_stats())
633
641
  fls = flows()
634
- all_stats = await asyncio.gather(*(_update_flow(fl) for fl in fls))
635
- return {fl.name: stats for fl, stats in zip(fls, all_stats)}
642
+ all_stats = await asyncio.gather(*(_update_flow(name, fl) for (name, fl) in fls.items()))
643
+ return dict(all_stats)
636
644
 
637
645
  _transient_flow_name_builder = _NameBuilder()
638
646
  class TransientFlow:
@@ -15,6 +15,7 @@ from .convert import dump_engine_object
15
15
  def init(settings: setting.Settings):
16
16
  """Initialize the cocoindex library."""
17
17
  _engine.init(dump_engine_object(settings))
18
+ setting.set_app_namespace(settings.app_namespace)
18
19
 
19
20
 
20
21
  def start_server(settings: setting.ServerSettings):
@@ -6,6 +6,25 @@ import os
6
6
  from typing import Callable, Self, Any, overload
7
7
  from dataclasses import dataclass
8
8
 
9
+ _app_namespace: str = ''
10
+
11
+ def get_app_namespace(*, trailing_delimiter: str | None = None) -> str:
12
+ """Get the application namespace. Append the `trailing_delimiter` if not empty."""
13
+ if _app_namespace == '' or trailing_delimiter is None:
14
+ return _app_namespace
15
+ return f'{_app_namespace}{trailing_delimiter}'
16
+
17
+ def split_app_namespace(full_name: str, delimiter: str) -> tuple[str, str]:
18
+ """Split the full name into the application namespace and the rest."""
19
+ parts = full_name.split(delimiter, 1)
20
+ if len(parts) == 1:
21
+ return '', parts[0]
22
+ return (parts[0], parts[1])
23
+
24
+ def set_app_namespace(app_namespace: str):
25
+ """Set the application namespace."""
26
+ global _app_namespace # pylint: disable=global-statement
27
+ _app_namespace = app_namespace
9
28
 
10
29
  @dataclass
11
30
  class DatabaseConnectionSpec:
@@ -30,6 +49,7 @@ def _load_field(target: dict[str, Any], name: str, env_name: str, required: bool
30
49
  class Settings:
31
50
  """Settings for the cocoindex library."""
32
51
  database: DatabaseConnectionSpec
52
+ app_namespace: str
33
53
 
34
54
  @classmethod
35
55
  def from_env(cls) -> Self:
@@ -40,7 +60,10 @@ class Settings:
40
60
  _load_field(db_kwargs, "user", "COCOINDEX_DATABASE_USER")
41
61
  _load_field(db_kwargs, "password", "COCOINDEX_DATABASE_PASSWORD")
42
62
  database = DatabaseConnectionSpec(**db_kwargs)
43
- return cls(database=database)
63
+
64
+ app_namespace = os.getenv("COCOINDEX_APP_NAMESPACE", '')
65
+
66
+ return cls(database=database, app_namespace=app_namespace)
44
67
 
45
68
  @dataclass
46
69
  class ServerSettings:
@@ -1,4 +1,5 @@
1
1
  from . import flow
2
+ from . import setting
2
3
  from . import _engine
3
4
 
4
5
  def sync_setup() -> _engine.SetupStatus:
@@ -7,10 +8,15 @@ def sync_setup() -> _engine.SetupStatus:
7
8
 
8
9
  def drop_setup(flow_names: list[str]) -> _engine.SetupStatus:
9
10
  flow.ensure_all_flows_built()
10
- return _engine.drop_setup(flow_names)
11
+ return _engine.drop_setup([flow.get_full_flow_name(name) for name in flow_names])
11
12
 
12
13
  def flow_names_with_setup() -> list[str]:
13
- return _engine.flow_names_with_setup()
14
+ result = []
15
+ for name in _engine.flow_names_with_setup():
16
+ app_namespace, name = setting.split_app_namespace(name, '.')
17
+ if app_namespace == setting.get_app_namespace():
18
+ result.append(name)
19
+ return result
14
20
 
15
21
  def apply_setup_changes(setup_status: _engine.SetupStatus):
16
22
  _engine.apply_setup_changes(setup_status)
@@ -5,11 +5,10 @@ use serde::{Deserialize, Serialize};
5
5
  use sqlx::PgPool;
6
6
 
7
7
  pub fn default_tracking_table_name(flow_name: &str) -> String {
8
- let sanitized_name = flow_name
9
- .chars()
10
- .map(|c| if c.is_alphanumeric() { c } else { '_' })
11
- .collect::<String>();
12
- format!("{}__cocoindex_tracking", sanitized_name)
8
+ format!(
9
+ "{}__cocoindex_tracking",
10
+ utils::db::sanitize_identifier(flow_name)
11
+ )
13
12
  }
14
13
 
15
14
  pub const CURRENT_TRACKING_TABLE_VERSION: i32 = 1;
@@ -11,8 +11,8 @@ use futures::FutureExt;
11
11
  use indexmap::{IndexMap, IndexSet};
12
12
  use itertools::Itertools;
13
13
  use serde::Serialize;
14
- use sqlx::postgres::types::PgRange;
15
14
  use sqlx::postgres::PgRow;
15
+ use sqlx::postgres::types::PgRange;
16
16
  use sqlx::{PgPool, Row};
17
17
  use std::ops::Bound;
18
18
  use uuid::Uuid;
@@ -934,10 +934,12 @@ impl StorageFactoryBase for Factory {
934
934
  .map(|d| {
935
935
  let table_id = TableId {
936
936
  database: d.spec.database.clone(),
937
- table_name: d
938
- .spec
939
- .table_name
940
- .unwrap_or_else(|| format!("{}__{}", context.flow_instance_name, d.name)),
937
+ table_name: d.spec.table_name.unwrap_or_else(|| {
938
+ utils::db::sanitize_identifier(&format!(
939
+ "{}__{}",
940
+ context.flow_instance_name, d.name
941
+ ))
942
+ }),
941
943
  };
942
944
  let setup_state = SetupState::new(
943
945
  &table_id,
@@ -3,15 +3,15 @@
3
3
  pub(crate) use anyhow::{Context, Result};
4
4
  pub(crate) use async_trait::async_trait;
5
5
  pub(crate) use chrono::{DateTime, Utc};
6
+ pub(crate) use futures::{FutureExt, StreamExt};
6
7
  pub(crate) use futures::{
7
8
  future::{BoxFuture, Shared},
8
9
  prelude::*,
9
10
  stream::BoxStream,
10
11
  };
11
- pub(crate) use futures::{FutureExt, StreamExt};
12
12
  pub(crate) use indexmap::{IndexMap, IndexSet};
13
13
  pub(crate) use itertools::Itertools;
14
- pub(crate) use serde::{de::DeserializeOwned, Deserialize, Serialize};
14
+ pub(crate) use serde::{Deserialize, Serialize, de::DeserializeOwned};
15
15
  pub(crate) use std::any::Any;
16
16
  pub(crate) use std::borrow::Cow;
17
17
  pub(crate) use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
@@ -21,11 +21,11 @@ pub(crate) use std::sync::{Arc, LazyLock, Mutex, OnceLock, RwLock, Weak};
21
21
  pub(crate) use crate::base::{self, schema, spec, value};
22
22
  pub(crate) use crate::builder::{self, plan};
23
23
  pub(crate) use crate::execution;
24
- pub(crate) use crate::lib_context::{get_lib_context, get_runtime, FlowContext, LibContext};
24
+ pub(crate) use crate::lib_context::{FlowContext, LibContext, get_lib_context, get_runtime};
25
25
  pub(crate) use crate::ops::interface;
26
26
  pub(crate) use crate::service::error::ApiError;
27
27
  pub(crate) use crate::setup::AuthRegistry;
28
- pub(crate) use crate::utils::retryable;
28
+ pub(crate) use crate::utils::{self, retryable};
29
29
 
30
30
  pub(crate) use crate::{api_bail, api_error};
31
31
 
@@ -31,3 +31,15 @@ pub enum WriteAction {
31
31
  Insert,
32
32
  Update,
33
33
  }
34
+
35
+ pub fn sanitize_identifier(s: &str) -> String {
36
+ let mut result = String::new();
37
+ for c in s.chars() {
38
+ if c.is_alphanumeric() || c == '_' {
39
+ result.push(c);
40
+ } else {
41
+ result.push_str("__");
42
+ }
43
+ }
44
+ result
45
+ }
@@ -1,2 +0,0 @@
1
- # Postgres database address for cocoindex
2
- COCOINDEX_DATABASE_URL=postgres://cocoindex:cocoindex@localhost/cocoindex
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