singlestoredb 1.15.5__tar.gz → 1.15.7__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.

Potentially problematic release.


This version of singlestoredb might be problematic. Click here for more details.

Files changed (191) hide show
  1. {singlestoredb-1.15.5/singlestoredb.egg-info → singlestoredb-1.15.7}/PKG-INFO +1 -1
  2. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/setup.cfg +1 -1
  3. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/__init__.py +1 -1
  4. singlestoredb-1.15.7/singlestoredb/ai/__init__.py +5 -0
  5. singlestoredb-1.15.7/singlestoredb/ai/chat.py +159 -0
  6. singlestoredb-1.15.7/singlestoredb/ai/embeddings.py +125 -0
  7. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/ext/asgi.py +15 -19
  8. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/inference_api.py +4 -0
  9. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_management.py +32 -24
  10. {singlestoredb-1.15.5 → singlestoredb-1.15.7/singlestoredb.egg-info}/PKG-INFO +1 -1
  11. singlestoredb-1.15.5/singlestoredb/ai/__init__.py +0 -2
  12. singlestoredb-1.15.5/singlestoredb/ai/chat.py +0 -40
  13. singlestoredb-1.15.5/singlestoredb/ai/embeddings.py +0 -27
  14. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/LICENSE +0 -0
  15. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/README.md +0 -0
  16. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/accel.c +0 -0
  17. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/setup.py +0 -0
  18. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/alchemy/__init__.py +0 -0
  19. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/__init__.py +0 -0
  20. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/_cloud_functions.py +0 -0
  21. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/_config.py +0 -0
  22. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/_connection_info.py +0 -0
  23. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/_dashboards.py +0 -0
  24. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/_process.py +0 -0
  25. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/_python_udfs.py +0 -0
  26. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/_stdout_supress.py +0 -0
  27. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/apps/_uvicorn_util.py +0 -0
  28. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/auth.py +0 -0
  29. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/config.py +0 -0
  30. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/connection.py +0 -0
  31. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/converters.py +0 -0
  32. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/__init__.py +0 -0
  33. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/attrdoc.py +0 -0
  34. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/common.py +0 -0
  35. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/epydoc.py +0 -0
  36. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/google.py +0 -0
  37. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/numpydoc.py +0 -0
  38. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/parser.py +0 -0
  39. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/py.typed +0 -0
  40. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/rest.py +0 -0
  41. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/__init__.py +0 -0
  42. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/_pydoctor.py +0 -0
  43. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/test_epydoc.py +0 -0
  44. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/test_google.py +0 -0
  45. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/test_numpydoc.py +0 -0
  46. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/test_parse_from_object.py +0 -0
  47. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/test_parser.py +0 -0
  48. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/test_rest.py +0 -0
  49. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/tests/test_util.py +0 -0
  50. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/docstring/util.py +0 -0
  51. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/exceptions.py +0 -0
  52. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/__init__.py +0 -0
  53. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/decorator.py +0 -0
  54. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/dtypes.py +0 -0
  55. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/ext/__init__.py +0 -0
  56. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/ext/arrow.py +0 -0
  57. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/ext/json.py +0 -0
  58. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/ext/mmap.py +0 -0
  59. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/ext/rowdat_1.py +0 -0
  60. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/ext/timer.py +0 -0
  61. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/ext/utils.py +0 -0
  62. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/signature.py +0 -0
  63. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/typing/__init__.py +0 -0
  64. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/typing/numpy.py +0 -0
  65. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/typing/pandas.py +0 -0
  66. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/typing/polars.py +0 -0
  67. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/typing/pyarrow.py +0 -0
  68. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/functions/utils.py +0 -0
  69. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/__init__.py +0 -0
  70. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/graphql.py +0 -0
  71. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handler.py +0 -0
  72. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handlers/__init__.py +0 -0
  73. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handlers/export.py +0 -0
  74. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handlers/files.py +0 -0
  75. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handlers/job.py +0 -0
  76. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handlers/models.py +0 -0
  77. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handlers/stage.py +0 -0
  78. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handlers/utils.py +0 -0
  79. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/handlers/workspace.py +0 -0
  80. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/registry.py +0 -0
  81. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/fusion/result.py +0 -0
  82. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/http/__init__.py +0 -0
  83. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/http/connection.py +0 -0
  84. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/magics/__init__.py +0 -0
  85. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/magics/run_personal.py +0 -0
  86. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/magics/run_shared.py +0 -0
  87. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/__init__.py +0 -0
  88. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/billing_usage.py +0 -0
  89. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/cluster.py +0 -0
  90. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/export.py +0 -0
  91. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/files.py +0 -0
  92. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/job.py +0 -0
  93. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/manager.py +0 -0
  94. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/organization.py +0 -0
  95. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/region.py +0 -0
  96. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/utils.py +0 -0
  97. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/management/workspace.py +0 -0
  98. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/__init__.py +0 -0
  99. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/_auth.py +0 -0
  100. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/charset.py +0 -0
  101. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/connection.py +0 -0
  102. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/CLIENT.py +0 -0
  103. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/COMMAND.py +0 -0
  104. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/CR.py +0 -0
  105. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/ER.py +0 -0
  106. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/EXTENDED_TYPE.py +0 -0
  107. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/FIELD_TYPE.py +0 -0
  108. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/FLAG.py +0 -0
  109. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/SERVER_STATUS.py +0 -0
  110. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/VECTOR_TYPE.py +0 -0
  111. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/constants/__init__.py +0 -0
  112. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/converters.py +0 -0
  113. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/cursors.py +0 -0
  114. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/err.py +0 -0
  115. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/optionfile.py +0 -0
  116. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/protocol.py +0 -0
  117. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/__init__.py +0 -0
  118. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/base.py +0 -0
  119. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/conftest.py +0 -0
  120. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_DictCursor.py +0 -0
  121. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_SSCursor.py +0 -0
  122. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_basic.py +0 -0
  123. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_connection.py +0 -0
  124. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_converters.py +0 -0
  125. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_cursor.py +0 -0
  126. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_err.py +0 -0
  127. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_issues.py +0 -0
  128. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_load_local.py +0 -0
  129. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_nextset.py +0 -0
  130. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/test_optionfile.py +0 -0
  131. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/thirdparty/__init__.py +0 -0
  132. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +0 -0
  133. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +0 -0
  134. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +0 -0
  135. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +0 -0
  136. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +0 -0
  137. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +0 -0
  138. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/mysql/times.py +0 -0
  139. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/notebook/__init__.py +0 -0
  140. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/notebook/_objects.py +0 -0
  141. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/notebook/_portal.py +0 -0
  142. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/py.typed +0 -0
  143. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/pytest.py +0 -0
  144. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/server/__init__.py +0 -0
  145. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/server/docker.py +0 -0
  146. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/server/free_tier.py +0 -0
  147. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/__init__.py +0 -0
  148. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/alltypes.sql +0 -0
  149. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/alltypes_no_nulls.sql +0 -0
  150. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/empty.sql +0 -0
  151. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/ext_funcs/__init__.py +0 -0
  152. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/local_infile.csv +0 -0
  153. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test.ipynb +0 -0
  154. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test.sql +0 -0
  155. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test2.ipynb +0 -0
  156. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test2.sql +0 -0
  157. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_basics.py +0 -0
  158. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_config.py +0 -0
  159. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_connection.py +0 -0
  160. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_dbapi.py +0 -0
  161. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_exceptions.py +0 -0
  162. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_ext_func.py +0 -0
  163. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_ext_func_data.py +0 -0
  164. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_fusion.py +0 -0
  165. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_http.py +0 -0
  166. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_plugin.py +0 -0
  167. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_results.py +0 -0
  168. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_types.py +0 -0
  169. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_udf.py +0 -0
  170. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_udf_returns.py +0 -0
  171. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_vectorstore.py +0 -0
  172. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/test_xdict.py +0 -0
  173. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/tests/utils.py +0 -0
  174. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/types.py +0 -0
  175. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/__init__.py +0 -0
  176. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/config.py +0 -0
  177. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/convert_rows.py +0 -0
  178. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/debug.py +0 -0
  179. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/dtypes.py +0 -0
  180. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/events.py +0 -0
  181. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/mogrify.py +0 -0
  182. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/results.py +0 -0
  183. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/utils/xdict.py +0 -0
  184. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb/vectorstore.py +0 -0
  185. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb.egg-info/SOURCES.txt +0 -0
  186. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb.egg-info/dependency_links.txt +0 -0
  187. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb.egg-info/entry_points.txt +0 -0
  188. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb.egg-info/requires.txt +0 -0
  189. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/singlestoredb.egg-info/top_level.txt +0 -0
  190. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/sqlx/__init__.py +0 -0
  191. {singlestoredb-1.15.5 → singlestoredb-1.15.7}/sqlx/magic.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.15.5
3
+ Version: 1.15.7
4
4
  Summary: Interface to the SingleStoreDB database and workspace management APIs
5
5
  Home-page: https://github.com/singlestore-labs/singlestoredb-python
6
6
  Author: SingleStore
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = singlestoredb
3
- version = 1.15.5
3
+ version = 1.15.7
4
4
  description = Interface to the SingleStoreDB database and workspace management APIs
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -13,7 +13,7 @@ Examples
13
13
 
14
14
  """
15
15
 
16
- __version__ = '1.15.5'
16
+ __version__ = '1.15.7'
17
17
 
18
18
  from typing import Any
19
19
 
@@ -0,0 +1,5 @@
1
+ from .chat import SingleStoreChat # noqa: F401
2
+ from .chat import SingleStoreChatFactory # noqa: F401
3
+ from .chat import SingleStoreChatOpenAI # noqa: F401
4
+ from .embeddings import SingleStoreEmbeddings # noqa: F401
5
+ from .embeddings import SingleStoreEmbeddingsFactory # noqa: F401
@@ -0,0 +1,159 @@
1
+ import os
2
+ from typing import Any
3
+ from typing import Callable
4
+ from typing import Optional
5
+ from typing import Union
6
+
7
+ import httpx
8
+
9
+ from singlestoredb import manage_workspaces
10
+
11
+ try:
12
+ from langchain_openai import ChatOpenAI
13
+ except ImportError:
14
+ raise ImportError(
15
+ 'Could not import langchain_openai python package. '
16
+ 'Please install it with `pip install langchain_openai`.',
17
+ )
18
+
19
+ try:
20
+ from langchain_aws import ChatBedrockConverse
21
+ except ImportError:
22
+ raise ImportError(
23
+ 'Could not import langchain-aws python package. '
24
+ 'Please install it with `pip install langchain-aws`.',
25
+ )
26
+
27
+ import boto3
28
+ from botocore import UNSIGNED
29
+ from botocore.config import Config
30
+
31
+
32
+ class SingleStoreChatOpenAI(ChatOpenAI):
33
+ def __init__(self, model_name: str, api_key: Optional[str] = None, **kwargs: Any):
34
+ inference_api_manger = (
35
+ manage_workspaces().organizations.current.inference_apis
36
+ )
37
+ info = inference_api_manger.get(model_name=model_name)
38
+ token = (
39
+ api_key
40
+ if api_key is not None
41
+ else os.environ.get('SINGLESTOREDB_USER_TOKEN')
42
+ )
43
+ super().__init__(
44
+ base_url=info.connection_url,
45
+ api_key=token,
46
+ model=model_name,
47
+ **kwargs,
48
+ )
49
+
50
+
51
+ class SingleStoreChat(ChatOpenAI):
52
+ def __init__(self, model_name: str, api_key: Optional[str] = None, **kwargs: Any):
53
+ inference_api_manger = (
54
+ manage_workspaces().organizations.current.inference_apis
55
+ )
56
+ info = inference_api_manger.get(model_name=model_name)
57
+ token = (
58
+ api_key
59
+ if api_key is not None
60
+ else os.environ.get('SINGLESTOREDB_USER_TOKEN')
61
+ )
62
+ super().__init__(
63
+ base_url=info.connection_url,
64
+ api_key=token,
65
+ model=model_name,
66
+ **kwargs,
67
+ )
68
+
69
+
70
+ def SingleStoreChatFactory(
71
+ model_name: str,
72
+ api_key: Optional[str] = None,
73
+ streaming: bool = True,
74
+ http_client: Optional[httpx.Client] = None,
75
+ obo_token_getter: Optional[Callable[[], Optional[str]]] = None,
76
+ **kwargs: Any,
77
+ ) -> Union[ChatOpenAI, ChatBedrockConverse]:
78
+ """Return a chat model instance (ChatOpenAI or ChatBedrockConverse).
79
+ """
80
+ inference_api_manager = (
81
+ manage_workspaces().organizations.current.inference_apis
82
+ )
83
+ info = inference_api_manager.get(model_name=model_name)
84
+ token_env = os.environ.get('SINGLESTOREDB_USER_TOKEN')
85
+ token = api_key if api_key is not None else token_env
86
+
87
+ if info.hosting_platform == 'Amazon':
88
+ # Instantiate Bedrock client
89
+ cfg_kwargs = {
90
+ 'signature_version': UNSIGNED,
91
+ 'retries': {'max_attempts': 1, 'mode': 'standard'},
92
+ }
93
+ if http_client is not None and http_client.timeout is not None:
94
+ cfg_kwargs['read_timeout'] = http_client.timeout
95
+ cfg_kwargs['connect_timeout'] = http_client.timeout
96
+
97
+ cfg = Config(**cfg_kwargs)
98
+ client = boto3.client(
99
+ 'bedrock-runtime',
100
+ endpoint_url=info.connection_url,
101
+ region_name='us-east-1',
102
+ aws_access_key_id='placeholder',
103
+ aws_secret_access_key='placeholder',
104
+ config=cfg,
105
+ )
106
+
107
+ def _inject_headers(request: Any, **_ignored: Any) -> None:
108
+ """Inject dynamic auth/OBO headers prior to Bedrock sending."""
109
+ if obo_token_getter is not None:
110
+ obo_val = obo_token_getter()
111
+ if obo_val:
112
+ request.headers['X-S2-OBO'] = obo_val
113
+ if token:
114
+ request.headers['Authorization'] = f'Bearer {token}'
115
+ request.headers.pop('X-Amz-Date', None)
116
+ request.headers.pop('X-Amz-Security-Token', None)
117
+
118
+ emitter = client._endpoint._event_emitter
119
+ emitter.register_first(
120
+ 'before-send.bedrock-runtime.Converse',
121
+ _inject_headers,
122
+ )
123
+ emitter.register_first(
124
+ 'before-send.bedrock-runtime.ConverseStream',
125
+ _inject_headers,
126
+ )
127
+ emitter.register_first(
128
+ 'before-send.bedrock-runtime.InvokeModel',
129
+ _inject_headers,
130
+ )
131
+ emitter.register_first(
132
+ 'before-send.bedrock-runtime.InvokeModelWithResponseStream',
133
+ _inject_headers,
134
+ )
135
+
136
+ return ChatBedrockConverse(
137
+ model_id=model_name,
138
+ endpoint_url=info.connection_url,
139
+ region_name='us-east-1',
140
+ aws_access_key_id='placeholder',
141
+ aws_secret_access_key='placeholder',
142
+ disable_streaming=not streaming,
143
+ client=client,
144
+ **kwargs,
145
+ )
146
+
147
+ # OpenAI / Azure OpenAI path
148
+ openai_kwargs = dict(
149
+ base_url=info.connection_url,
150
+ api_key=token,
151
+ model=model_name,
152
+ streaming=streaming,
153
+ )
154
+ if http_client is not None:
155
+ openai_kwargs['http_client'] = http_client
156
+ return ChatOpenAI(
157
+ **openai_kwargs,
158
+ **kwargs,
159
+ )
@@ -0,0 +1,125 @@
1
+ import os
2
+ from typing import Any
3
+ from typing import Callable
4
+ from typing import Optional
5
+ from typing import Union
6
+
7
+ import httpx
8
+
9
+ from singlestoredb import manage_workspaces
10
+
11
+ try:
12
+ from langchain_openai import OpenAIEmbeddings
13
+ except ImportError:
14
+ raise ImportError(
15
+ 'Could not import langchain_openai python package. '
16
+ 'Please install it with `pip install langchain_openai`.',
17
+ )
18
+
19
+ try:
20
+ from langchain_aws import BedrockEmbeddings
21
+ except ImportError:
22
+ raise ImportError(
23
+ 'Could not import langchain-aws python package. '
24
+ 'Please install it with `pip install langchain-aws`.',
25
+ )
26
+
27
+ import boto3
28
+ from botocore import UNSIGNED
29
+ from botocore.config import Config
30
+
31
+
32
+ class SingleStoreEmbeddings(OpenAIEmbeddings):
33
+
34
+ def __init__(self, model_name: str, **kwargs: Any):
35
+ inference_api_manger = (
36
+ manage_workspaces().organizations.current.inference_apis
37
+ )
38
+ info = inference_api_manger.get(model_name=model_name)
39
+ super().__init__(
40
+ base_url=info.connection_url,
41
+ api_key=os.environ.get('SINGLESTOREDB_USER_TOKEN'),
42
+ model=model_name,
43
+ **kwargs,
44
+ )
45
+
46
+
47
+ def SingleStoreEmbeddingsFactory(
48
+ model_name: str,
49
+ api_key: Optional[str] = None,
50
+ http_client: Optional[httpx.Client] = None,
51
+ obo_token_getter: Optional[Callable[[], Optional[str]]] = None,
52
+ **kwargs: Any,
53
+ ) -> Union[OpenAIEmbeddings, BedrockEmbeddings]:
54
+ """Return an embeddings model instance (OpenAIEmbeddings or BedrockEmbeddings).
55
+ """
56
+ inference_api_manager = (
57
+ manage_workspaces().organizations.current.inference_apis
58
+ )
59
+ info = inference_api_manager.get(model_name=model_name)
60
+ token_env = os.environ.get('SINGLESTOREDB_USER_TOKEN')
61
+ token = api_key if api_key is not None else token_env
62
+
63
+ if info.hosting_platform == 'Amazon':
64
+ # Instantiate Bedrock client
65
+ cfg_kwargs = {
66
+ 'signature_version': UNSIGNED,
67
+ 'retries': {'max_attempts': 1, 'mode': 'standard'},
68
+ }
69
+ if http_client is not None and http_client.timeout is not None:
70
+ cfg_kwargs['read_timeout'] = http_client.timeout
71
+ cfg_kwargs['connect_timeout'] = http_client.timeout
72
+
73
+ cfg = Config(**cfg_kwargs)
74
+ client = boto3.client(
75
+ 'bedrock-runtime',
76
+ endpoint_url=info.connection_url,
77
+ region_name='us-east-1',
78
+ aws_access_key_id='placeholder',
79
+ aws_secret_access_key='placeholder',
80
+ config=cfg,
81
+ )
82
+
83
+ def _inject_headers(request: Any, **_ignored: Any) -> None:
84
+ """Inject dynamic auth/OBO headers prior to Bedrock sending."""
85
+ if obo_token_getter is not None:
86
+ obo_val = obo_token_getter()
87
+ if obo_val:
88
+ request.headers['X-S2-OBO'] = obo_val
89
+ if token:
90
+ request.headers['Authorization'] = f'Bearer {token}'
91
+ request.headers.pop('X-Amz-Date', None)
92
+ request.headers.pop('X-Amz-Security-Token', None)
93
+
94
+ emitter = client._endpoint._event_emitter
95
+ emitter.register_first(
96
+ 'before-send.bedrock-runtime.InvokeModel',
97
+ _inject_headers,
98
+ )
99
+ emitter.register_first(
100
+ 'before-send.bedrock-runtime.InvokeModelWithResponseStream',
101
+ _inject_headers,
102
+ )
103
+
104
+ return BedrockEmbeddings(
105
+ model_id=model_name,
106
+ endpoint_url=info.connection_url,
107
+ region_name='us-east-1',
108
+ aws_access_key_id='placeholder',
109
+ aws_secret_access_key='placeholder',
110
+ client=client,
111
+ **kwargs,
112
+ )
113
+
114
+ # OpenAI / Azure OpenAI path
115
+ openai_kwargs = dict(
116
+ base_url=info.connection_url,
117
+ api_key=token,
118
+ model=model_name,
119
+ )
120
+ if http_client is not None:
121
+ openai_kwargs['http_client'] = http_client
122
+ return OpenAIEmbeddings(
123
+ **openai_kwargs,
124
+ **kwargs,
125
+ )
@@ -42,6 +42,7 @@ import tempfile
42
42
  import textwrap
43
43
  import threading
44
44
  import time
45
+ import traceback
45
46
  import typing
46
47
  import urllib
47
48
  import uuid
@@ -709,21 +710,21 @@ class Application(object):
709
710
  error_response_dict: Dict[str, Any] = dict(
710
711
  type='http.response.start',
711
712
  status=500,
712
- headers=[(b'content-type', b'application/json')],
713
+ headers=[(b'content-type', b'text/plain')],
713
714
  )
714
715
 
715
716
  # Timeout response start
716
717
  timeout_response_dict: Dict[str, Any] = dict(
717
718
  type='http.response.start',
718
719
  status=504,
719
- headers=[(b'content-type', b'application/json')],
720
+ headers=[(b'content-type', b'text/plain')],
720
721
  )
721
722
 
722
723
  # Cancel response start
723
724
  cancel_response_dict: Dict[str, Any] = dict(
724
725
  type='http.response.start',
725
726
  status=503,
726
- headers=[(b'content-type', b'application/json')],
727
+ headers=[(b'content-type', b'text/plain')],
727
728
  )
728
729
 
729
730
  # JSON response start
@@ -1247,12 +1248,10 @@ class Application(object):
1247
1248
  'timeout': func_info['timeout'],
1248
1249
  },
1249
1250
  )
1250
- body = json.dumps(
1251
- dict(
1252
- error='[TimeoutError] Function call timed out after ' +
1253
- str(func_info['timeout']) +
1254
- ' seconds',
1255
- ),
1251
+ body = (
1252
+ 'TimeoutError: Function call timed out after ' +
1253
+ str(func_info['timeout']) +
1254
+ ' seconds'
1256
1255
  ).encode('utf-8')
1257
1256
  await send(self.timeout_response_dict)
1258
1257
 
@@ -1265,11 +1264,7 @@ class Application(object):
1265
1264
  'function_name': func_name.decode('utf-8'),
1266
1265
  },
1267
1266
  )
1268
- body = json.dumps(
1269
- dict(
1270
- error='[CancelledError] Function call was cancelled',
1271
- ),
1272
- ).encode('utf-8')
1267
+ body = b'CancelledError: Function call was cancelled'
1273
1268
  await send(self.cancel_response_dict)
1274
1269
 
1275
1270
  except Exception as e:
@@ -1282,11 +1277,12 @@ class Application(object):
1282
1277
  'exception_type': type(e).__name__,
1283
1278
  },
1284
1279
  )
1285
- body = json.dumps(
1286
- dict(
1287
- error=f'[{type(e).__name__}] {str(e).strip()}',
1288
- ),
1289
- ).encode('utf-8')
1280
+ msg = traceback.format_exc().strip().split(' File ')[-1]
1281
+ if msg.startswith('"/tmp/ipykernel_'):
1282
+ msg = 'Line ' + msg.split(', line ')[-1]
1283
+ else:
1284
+ msg = 'File ' + msg
1285
+ body = msg.encode('utf-8')
1290
1286
  await send(self.error_response_dict)
1291
1287
 
1292
1288
  finally:
@@ -23,6 +23,7 @@ class InferenceAPIInfo(object):
23
23
  name: str
24
24
  connection_url: str
25
25
  project_id: str
26
+ hosting_platform: str
26
27
 
27
28
  def __init__(
28
29
  self,
@@ -31,12 +32,14 @@ class InferenceAPIInfo(object):
31
32
  name: str,
32
33
  connection_url: str,
33
34
  project_id: str,
35
+ hosting_platform: str,
34
36
  ):
35
37
  self.service_id = service_id
36
38
  self.connection_url = connection_url
37
39
  self.model_name = model_name
38
40
  self.name = name
39
41
  self.project_id = project_id
42
+ self.hosting_platform = hosting_platform
40
43
 
41
44
  @classmethod
42
45
  def from_dict(
@@ -62,6 +65,7 @@ class InferenceAPIInfo(object):
62
65
  model_name=obj['modelName'],
63
66
  name=obj['name'],
64
67
  connection_url=obj['connectionURL'],
68
+ hosting_platform=obj['hostingPlatform'],
65
69
  )
66
70
  return out
67
71
 
@@ -873,12 +873,20 @@ class TestStage(unittest.TestCase):
873
873
  def test_file_object(self):
874
874
  st = self.wg.stage
875
875
 
876
- st.mkdir('obj_test')
877
- st.mkdir('obj_test/nest_1')
876
+ obj_test_dir = f'obj_test_{id(self)}'
878
877
 
879
- f1 = st.upload_file(TEST_DIR / 'test.sql', 'obj_test.sql')
880
- f2 = st.upload_file(TEST_DIR / 'test.sql', 'obj_test/nest_1/obj_test.sql')
881
- d2 = st.info('obj_test/nest_1/')
878
+ st.mkdir(obj_test_dir)
879
+ st.mkdir(f'{obj_test_dir}/nest_1')
880
+
881
+ obj_test_sql = f'obj_test_{id(self)}.sql'
882
+ obj_test_2_sql = f'obj_test_2_{id(self)}.sql'
883
+
884
+ f1 = st.upload_file(TEST_DIR / 'test.sql', obj_test_sql)
885
+ f2 = st.upload_file(
886
+ TEST_DIR / 'test.sql',
887
+ f'{obj_test_dir}/nest_1/{obj_test_sql}',
888
+ )
889
+ d2 = st.info(f'{obj_test_dir}/nest_1/')
882
890
 
883
891
  # is_file / is_dir
884
892
  assert not f1.is_dir()
@@ -889,17 +897,17 @@ class TestStage(unittest.TestCase):
889
897
  assert not d2.is_file()
890
898
 
891
899
  # abspath / basename / dirname / exists
892
- assert f1.abspath() == 'obj_test.sql'
893
- assert f1.basename() == 'obj_test.sql'
900
+ assert f1.abspath() == obj_test_sql
901
+ assert f1.basename() == obj_test_sql
894
902
  assert f1.dirname() == '/'
895
903
  assert f1.exists()
896
- assert f2.abspath() == 'obj_test/nest_1/obj_test.sql'
897
- assert f2.basename() == 'obj_test.sql'
898
- assert f2.dirname() == 'obj_test/nest_1/'
904
+ assert f2.abspath() == f'{obj_test_dir}/nest_1/{obj_test_sql}'
905
+ assert f2.basename() == obj_test_sql
906
+ assert f2.dirname() == f'{obj_test_dir}/nest_1/'
899
907
  assert f2.exists()
900
- assert d2.abspath() == 'obj_test/nest_1/'
908
+ assert d2.abspath() == f'{obj_test_dir}/nest_1/'
901
909
  assert d2.basename() == 'nest_1'
902
- assert d2.dirname() == 'obj_test/'
910
+ assert d2.dirname() == f'{obj_test_dir}/'
903
911
  assert d2.exists()
904
912
 
905
913
  # download
@@ -910,9 +918,9 @@ class TestStage(unittest.TestCase):
910
918
  with self.assertRaises(IsADirectoryError):
911
919
  d2.remove()
912
920
 
913
- assert st.is_file('obj_test.sql')
921
+ assert st.is_file(obj_test_sql)
914
922
  f1.remove()
915
- assert not st.is_file('obj_test.sql')
923
+ assert not st.is_file(obj_test_sql)
916
924
 
917
925
  # removedirs
918
926
  with self.assertRaises(NotADirectoryError):
@@ -923,8 +931,8 @@ class TestStage(unittest.TestCase):
923
931
  assert not st.exists(d2.path)
924
932
 
925
933
  # rmdir
926
- f1 = st.upload_file(TEST_DIR / 'test.sql', 'obj_test.sql')
927
- d2 = st.mkdir('obj_test/nest_1')
934
+ f1 = st.upload_file(TEST_DIR / 'test.sql', obj_test_sql)
935
+ d2 = st.mkdir(f'{obj_test_dir}/nest_1')
928
936
 
929
937
  assert st.exists(f1.path)
930
938
  assert st.exists(d2.path)
@@ -937,20 +945,20 @@ class TestStage(unittest.TestCase):
937
945
 
938
946
  d2.rmdir()
939
947
 
940
- assert not st.exists('obj_test/nest_1/')
941
- assert not st.exists('obj_test')
948
+ assert not st.exists(f'{obj_test_dir}/nest_1/')
949
+ assert not st.exists(obj_test_dir)
942
950
 
943
951
  # mtime / ctime
944
952
  assert f1.getmtime() > 0
945
953
  assert f1.getctime() > 0
946
954
 
947
955
  # rename
948
- assert st.exists('obj_test.sql')
949
- assert not st.exists('obj_test_2.sql')
950
- f1.rename('obj_test_2.sql')
951
- assert not st.exists('obj_test.sql')
952
- assert st.exists('obj_test_2.sql')
953
- assert f1.abspath() == 'obj_test_2.sql'
956
+ assert st.exists(obj_test_sql)
957
+ assert not st.exists(obj_test_2_sql)
958
+ f1.rename(obj_test_2_sql)
959
+ assert not st.exists(obj_test_sql)
960
+ assert st.exists(obj_test_2_sql)
961
+ assert f1.abspath() == obj_test_2_sql
954
962
 
955
963
 
956
964
  @pytest.mark.management
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.15.5
3
+ Version: 1.15.7
4
4
  Summary: Interface to the SingleStoreDB database and workspace management APIs
5
5
  Home-page: https://github.com/singlestore-labs/singlestoredb-python
6
6
  Author: SingleStore
@@ -1,2 +0,0 @@
1
- from .chat import SingleStoreChatOpenAI # noqa: F401
2
- from .embeddings import SingleStoreEmbeddings # noqa: F401
@@ -1,40 +0,0 @@
1
- import os
2
- from typing import Any
3
-
4
- from singlestoredb.fusion.handlers.utils import get_workspace_manager
5
-
6
- try:
7
- from langchain_openai import ChatOpenAI
8
- except ImportError:
9
- raise ImportError(
10
- 'Could not import langchain_openai python package. '
11
- 'Please install it with `pip install langchain_openai`.',
12
- )
13
-
14
-
15
- class SingleStoreChatOpenAI(ChatOpenAI):
16
- def __init__(self, model_name: str, **kwargs: Any):
17
- inference_api_manger = (
18
- get_workspace_manager().organizations.current.inference_apis
19
- )
20
- info = inference_api_manger.get(model_name=model_name)
21
- super().__init__(
22
- base_url=info.connection_url,
23
- api_key=os.environ.get('SINGLESTOREDB_USER_TOKEN'),
24
- model=model_name,
25
- **kwargs,
26
- )
27
-
28
-
29
- class SingleStoreChat(ChatOpenAI):
30
- def __init__(self, model_name: str, **kwargs: Any):
31
- inference_api_manger = (
32
- get_workspace_manager().organizations.current.inference_apis
33
- )
34
- info = inference_api_manger.get(model_name=model_name)
35
- super().__init__(
36
- base_url=info.connection_url,
37
- api_key=os.environ.get('SINGLESTOREDB_USER_TOKEN'),
38
- model=model_name,
39
- **kwargs,
40
- )
@@ -1,27 +0,0 @@
1
- import os
2
- from typing import Any
3
-
4
- from singlestoredb.fusion.handlers.utils import get_workspace_manager
5
-
6
- try:
7
- from langchain_openai import OpenAIEmbeddings
8
- except ImportError:
9
- raise ImportError(
10
- 'Could not import langchain_openai python package. '
11
- 'Please install it with `pip install langchain_openai`.',
12
- )
13
-
14
-
15
- class SingleStoreEmbeddings(OpenAIEmbeddings):
16
-
17
- def __init__(self, model_name: str, **kwargs: Any):
18
- inference_api_manger = (
19
- get_workspace_manager().organizations.current.inference_apis
20
- )
21
- info = inference_api_manger.get(model_name=model_name)
22
- super().__init__(
23
- base_url=info.connection_url,
24
- api_key=os.environ.get('SINGLESTOREDB_USER_TOKEN'),
25
- model=model_name,
26
- **kwargs,
27
- )
File without changes
File without changes
File without changes
File without changes