Flowfile 0.4.1__py3-none-any.whl → 0.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. flowfile/__init__.py +3 -1
  2. flowfile/api.py +1 -2
  3. flowfile/web/static/assets/{CloudConnectionManager-d3248f8d.js → CloudConnectionManager-0dfba9f2.js} +2 -2
  4. flowfile/web/static/assets/{CloudStorageReader-d65bf041.js → CloudStorageReader-d5b1b6c9.js} +6 -6
  5. flowfile/web/static/assets/{CloudStorageWriter-e83be3ed.js → CloudStorageWriter-00d87aad.js} +6 -6
  6. flowfile/web/static/assets/{ColumnSelector-cce661cf.js → ColumnSelector-4685e75d.js} +1 -1
  7. flowfile/web/static/assets/{ContextMenu-cf18d2cc.js → ContextMenu-23e909da.js} +1 -1
  8. flowfile/web/static/assets/{ContextMenu-160afb08.js → ContextMenu-70ae0c79.js} +1 -1
  9. flowfile/web/static/assets/{ContextMenu-11a4652a.js → ContextMenu-f149cf7c.js} +1 -1
  10. flowfile/web/static/assets/{CrossJoin-d395d38c.js → CrossJoin-702a3edd.js} +7 -7
  11. flowfile/web/static/assets/{CustomNode-b812dc0b.js → CustomNode-b1519993.js} +11 -11
  12. flowfile/web/static/assets/{DatabaseConnectionSettings-7000bf2c.js → DatabaseConnectionSettings-6f3e4ea5.js} +2 -2
  13. flowfile/web/static/assets/{DatabaseManager-9662ec5b.js → DatabaseManager-cf5ef661.js} +2 -2
  14. flowfile/web/static/assets/{DatabaseReader-4f035d0c.js → DatabaseReader-d38c7295.js} +9 -9
  15. flowfile/web/static/assets/{DatabaseWriter-f65dcd54.js → DatabaseWriter-b04ef46a.js} +8 -8
  16. flowfile/web/static/assets/{ExploreData-94c43dfc.js → ExploreData-5fa10ed8.js} +5 -5
  17. flowfile/web/static/assets/{ExternalSource-ac04b3cc.js → ExternalSource-d39af878.js} +5 -5
  18. flowfile/web/static/assets/{Filter-812dcbca.js → Filter-9b6d08db.js} +7 -7
  19. flowfile/web/static/assets/{Formula-71472193.js → Formula-6b04fb1d.js} +7 -7
  20. flowfile/web/static/assets/{FuzzyMatch-b317f631.js → FuzzyMatch-999521f4.js} +8 -8
  21. flowfile/web/static/assets/{GraphSolver-754a234f.js → GraphSolver-17dd2198.js} +6 -6
  22. flowfile/web/static/assets/{GroupBy-6c6f9802.js → GroupBy-6b039e18.js} +5 -5
  23. flowfile/web/static/assets/{Join-a1b800be.js → Join-24d0f113.js} +8 -8
  24. flowfile/web/static/assets/{ManualInput-a9640276.js → ManualInput-34639209.js} +4 -4
  25. flowfile/web/static/assets/{MultiSelect-97213888.js → MultiSelect-0e8724a3.js} +2 -2
  26. flowfile/web/static/assets/{MultiSelect.vue_vue_type_script_setup_true_lang-6ffe088a.js → MultiSelect.vue_vue_type_script_setup_true_lang-b0e538c2.js} +1 -1
  27. flowfile/web/static/assets/{NumericInput-e638088a.js → NumericInput-3d63a470.js} +2 -2
  28. flowfile/web/static/assets/{NumericInput.vue_vue_type_script_setup_true_lang-90eb2cba.js → NumericInput.vue_vue_type_script_setup_true_lang-e0edeccc.js} +1 -1
  29. flowfile/web/static/assets/{Output-ddc9079f.css → Output-283fe388.css} +5 -5
  30. flowfile/web/static/assets/{Output-76750610.js → Output-edea9802.js} +57 -38
  31. flowfile/web/static/assets/{Pivot-7814803f.js → Pivot-61d19301.js} +7 -7
  32. flowfile/web/static/assets/{PivotValidation-f92137d2.js → PivotValidation-de9f43fe.js} +1 -1
  33. flowfile/web/static/assets/{PivotValidation-76dd431a.js → PivotValidation-f97fec5b.js} +1 -1
  34. flowfile/web/static/assets/{PolarsCode-889c3008.js → PolarsCode-bc3c9984.js} +5 -5
  35. flowfile/web/static/assets/{Read-637b72a7.js → Read-64a3f259.js} +80 -105
  36. flowfile/web/static/assets/{Read-6b17491f.css → Read-e808b239.css} +10 -10
  37. flowfile/web/static/assets/{RecordCount-2b050c41.js → RecordCount-3d5039be.js} +4 -4
  38. flowfile/web/static/assets/{RecordId-81df7784.js → RecordId-597510e0.js} +6 -6
  39. flowfile/web/static/assets/{SQLQueryComponent-88dcfe53.js → SQLQueryComponent-df51adbe.js} +1 -1
  40. flowfile/web/static/assets/{Sample-258ad2a9.js → Sample-4be0a507.js} +4 -4
  41. flowfile/web/static/assets/{SecretManager-2a2cb7e2.js → SecretManager-4839be57.js} +2 -2
  42. flowfile/web/static/assets/{Select-850215fd.js → Select-9b72f201.js} +7 -7
  43. flowfile/web/static/assets/{SettingsSection-29b4fa6b.js → SettingsSection-7ded385d.js} +1 -1
  44. flowfile/web/static/assets/{SettingsSection-0e8d9123.js → SettingsSection-e1e9c953.js} +1 -1
  45. flowfile/web/static/assets/{SettingsSection-55bae608.js → SettingsSection-f0f75a42.js} +1 -1
  46. flowfile/web/static/assets/{SingleSelect-bebd408b.js → SingleSelect-6c777aac.js} +2 -2
  47. flowfile/web/static/assets/{SingleSelect.vue_vue_type_script_setup_true_lang-6093741c.js → SingleSelect.vue_vue_type_script_setup_true_lang-33e3ff9b.js} +1 -1
  48. flowfile/web/static/assets/{SliderInput-6a05ab61.js → SliderInput-7cb93e62.js} +1 -1
  49. flowfile/web/static/assets/{Sort-10ab48ed.js → Sort-6cbde21a.js} +5 -5
  50. flowfile/web/static/assets/{TextInput-df9d6259.js → TextInput-d9a40c11.js} +2 -2
  51. flowfile/web/static/assets/{TextInput.vue_vue_type_script_setup_true_lang-000e1178.js → TextInput.vue_vue_type_script_setup_true_lang-5896c375.js} +1 -1
  52. flowfile/web/static/assets/{TextToRows-6c2d93d8.js → TextToRows-c4fcbf4d.js} +7 -7
  53. flowfile/web/static/assets/{ToggleSwitch-0ff7ac52.js → ToggleSwitch-4ef91d19.js} +2 -2
  54. flowfile/web/static/assets/{ToggleSwitch.vue_vue_type_script_setup_true_lang-c6dc3029.js → ToggleSwitch.vue_vue_type_script_setup_true_lang-38478c20.js} +1 -1
  55. flowfile/web/static/assets/{UnavailableFields-1bab97cb.js → UnavailableFields-a03f512c.js} +2 -2
  56. flowfile/web/static/assets/{Union-b563478a.js → Union-bfe9b996.js} +4 -4
  57. flowfile/web/static/assets/{Unique-f90db5db.js → Unique-5d023a27.js} +8 -20
  58. flowfile/web/static/assets/{Unpivot-bcb0025f.js → Unpivot-91cc5354.js} +6 -6
  59. flowfile/web/static/assets/{UnpivotValidation-c4e73b04.js → UnpivotValidation-7ee2de44.js} +1 -1
  60. flowfile/web/static/assets/{VueGraphicWalker-bb8535e2.js → VueGraphicWalker-e51b9924.js} +1 -1
  61. flowfile/web/static/assets/{api-2d6adc4f.js → api-c1bad5ca.js} +1 -1
  62. flowfile/web/static/assets/{api-4c8e3822.js → api-cf1221f0.js} +1 -1
  63. flowfile/web/static/assets/{designer-e3c150ec.css → designer-8da3ba3a.css} +90 -67
  64. flowfile/web/static/assets/{designer-f3656d8c.js → designer-9633482a.js} +119 -51
  65. flowfile/web/static/assets/{documentation-52b241e7.js → documentation-ca400224.js} +1 -1
  66. flowfile/web/static/assets/{dropDown-1bca8a74.js → dropDown-614b998d.js} +1 -1
  67. flowfile/web/static/assets/{fullEditor-2985687e.js → fullEditor-f7971590.js} +2 -2
  68. flowfile/web/static/assets/{genericNodeSettings-0476ba4e.js → genericNodeSettings-4fe5f36b.js} +3 -3
  69. flowfile/web/static/assets/{index-246f201c.js → index-5429bbf8.js} +6 -8
  70. flowfile/web/static/assets/nodeInput-5d0d6b79.js +41 -0
  71. flowfile/web/static/assets/{outputCsv-d686eeaf.js → outputCsv-076b85ab.js} +1 -1
  72. flowfile/web/static/assets/{outputExcel-8809ea2f.js → outputExcel-0fd17dbe.js} +1 -1
  73. flowfile/web/static/assets/{outputParquet-53ba645a.js → outputParquet-b61e0847.js} +1 -1
  74. flowfile/web/static/assets/{readCsv-053bf97b.js → readCsv-a8bb8b61.js} +21 -20
  75. flowfile/web/static/assets/{readCsv-bca3ed53.css → readCsv-c767cb37.css} +13 -13
  76. flowfile/web/static/assets/{readExcel-ad531eab.js → readExcel-67b4aee0.js} +10 -12
  77. flowfile/web/static/assets/{readExcel-e1b381ea.css → readExcel-806d2826.css} +12 -12
  78. flowfile/web/static/assets/{readParquet-cee068e2.css → readParquet-48c81530.css} +3 -3
  79. flowfile/web/static/assets/{readParquet-58e899a1.js → readParquet-92ce1dbc.js} +4 -7
  80. flowfile/web/static/assets/{secretApi-538058f3.js → secretApi-68435402.js} +1 -1
  81. flowfile/web/static/assets/{selectDynamic-b38de2ba.js → selectDynamic-92e25ee3.js} +3 -3
  82. flowfile/web/static/assets/{vue-codemirror.esm-db9b8936.js → vue-codemirror.esm-41b0e0d7.js} +7 -4
  83. flowfile/web/static/assets/{vue-content-loader.es-b5f3ac30.js → vue-content-loader.es-2c8e608f.js} +1 -1
  84. flowfile/web/static/index.html +1 -1
  85. {flowfile-0.4.1.dist-info → flowfile-0.5.1.dist-info}/METADATA +3 -2
  86. {flowfile-0.4.1.dist-info → flowfile-0.5.1.dist-info}/RECORD +138 -126
  87. {flowfile-0.4.1.dist-info → flowfile-0.5.1.dist-info}/WHEEL +1 -1
  88. {flowfile-0.4.1.dist-info → flowfile-0.5.1.dist-info}/entry_points.txt +1 -0
  89. flowfile_core/__init__.py +3 -0
  90. flowfile_core/flowfile/analytics/analytics_processor.py +1 -0
  91. flowfile_core/flowfile/code_generator/code_generator.py +62 -64
  92. flowfile_core/flowfile/flow_data_engine/create/funcs.py +73 -56
  93. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +77 -86
  94. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +23 -23
  95. flowfile_core/flowfile/flow_data_engine/join/utils.py +1 -1
  96. flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +9 -4
  97. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +184 -78
  98. flowfile_core/flowfile/flow_data_engine/utils.py +2 -0
  99. flowfile_core/flowfile/flow_graph.py +129 -26
  100. flowfile_core/flowfile/flow_node/flow_node.py +3 -0
  101. flowfile_core/flowfile/flow_node/models.py +2 -1
  102. flowfile_core/flowfile/handler.py +5 -5
  103. flowfile_core/flowfile/manage/compatibility_enhancements.py +404 -41
  104. flowfile_core/flowfile/manage/io_flowfile.py +394 -0
  105. flowfile_core/flowfile/node_designer/__init__.py +1 -1
  106. flowfile_core/flowfile/node_designer/_type_registry.py +2 -2
  107. flowfile_core/flowfile/node_designer/custom_node.py +1 -1
  108. flowfile_core/flowfile/node_designer/ui_components.py +1 -1
  109. flowfile_core/flowfile/schema_callbacks.py +8 -5
  110. flowfile_core/flowfile/setting_generator/settings.py +15 -9
  111. flowfile_core/routes/routes.py +8 -10
  112. flowfile_core/schemas/cloud_storage_schemas.py +0 -2
  113. flowfile_core/schemas/input_schema.py +222 -65
  114. flowfile_core/schemas/output_model.py +1 -1
  115. flowfile_core/schemas/schemas.py +145 -32
  116. flowfile_core/schemas/transform_schema.py +1083 -413
  117. flowfile_core/schemas/yaml_types.py +103 -0
  118. flowfile_core/{flowfile/node_designer/data_types.py → types.py} +11 -1
  119. flowfile_frame/__init__.py +3 -1
  120. flowfile_frame/flow_frame.py +15 -18
  121. flowfile_frame/flow_frame_methods.py +12 -9
  122. flowfile_worker/__init__.py +3 -0
  123. flowfile_worker/create/__init__.py +3 -21
  124. flowfile_worker/create/funcs.py +68 -56
  125. flowfile_worker/create/models.py +130 -62
  126. flowfile_worker/routes.py +5 -8
  127. tools/migrate/README.md +56 -0
  128. tools/migrate/__init__.py +12 -0
  129. tools/migrate/__main__.py +131 -0
  130. tools/migrate/legacy_schemas.py +621 -0
  131. tools/migrate/migrate.py +598 -0
  132. tools/migrate/tests/__init__.py +0 -0
  133. tools/migrate/tests/conftest.py +23 -0
  134. tools/migrate/tests/test_migrate.py +627 -0
  135. tools/migrate/tests/test_migration_e2e.py +1010 -0
  136. tools/migrate/tests/test_node_migrations.py +813 -0
  137. flowfile_core/flowfile/manage/open_flowfile.py +0 -143
  138. {flowfile-0.4.1.dist-info → flowfile-0.5.1.dist-info}/licenses/LICENSE +0 -0
  139. /flowfile_core/flowfile/manage/manage_flowfile.py → /tools/__init__.py +0 -0
@@ -15843,32 +15843,32 @@ const routes = [
15843
15843
  {
15844
15844
  path: "designer",
15845
15845
  name: "designer",
15846
- component: () => __vitePreload(() => import("./designer-f3656d8c.js").then((n) => n.d), true ? ["assets/designer-f3656d8c.js","assets/vue-codemirror.esm-db9b8936.js","assets/vue-codemirror-bccfde04.css","assets/designer-e3c150ec.css"] : void 0)
15846
+ component: () => __vitePreload(() => import("./designer-9633482a.js").then((n) => n.d), true ? ["assets/designer-9633482a.js","assets/vue-codemirror.esm-41b0e0d7.js","assets/vue-codemirror-bccfde04.css","assets/designer-8da3ba3a.css"] : void 0)
15847
15847
  },
15848
15848
  {
15849
15849
  name: "nodeData",
15850
15850
  path: "nodeData",
15851
- component: () => __vitePreload(() => import("./fullEditor-2985687e.js"), true ? ["assets/fullEditor-2985687e.js","assets/vue-codemirror.esm-db9b8936.js","assets/vue-codemirror-bccfde04.css","assets/fullEditor-178376bb.css"] : void 0)
15851
+ component: () => __vitePreload(() => import("./fullEditor-f7971590.js"), true ? ["assets/fullEditor-f7971590.js","assets/vue-codemirror.esm-41b0e0d7.js","assets/vue-codemirror-bccfde04.css","assets/fullEditor-178376bb.css"] : void 0)
15852
15852
  },
15853
15853
  {
15854
15854
  name: "documentation",
15855
15855
  path: "documentation",
15856
- component: () => __vitePreload(() => import("./documentation-52b241e7.js"), true ? ["assets/documentation-52b241e7.js","assets/documentation-12216a74.css"] : void 0)
15856
+ component: () => __vitePreload(() => import("./documentation-ca400224.js"), true ? ["assets/documentation-ca400224.js","assets/documentation-12216a74.css"] : void 0)
15857
15857
  },
15858
15858
  {
15859
15859
  name: "databaseManager",
15860
15860
  path: "databaseManager",
15861
- component: () => __vitePreload(() => import("./DatabaseManager-9662ec5b.js"), true ? ["assets/DatabaseManager-9662ec5b.js","assets/api-4c8e3822.js","assets/DatabaseManager-30fa27e5.css"] : void 0)
15861
+ component: () => __vitePreload(() => import("./DatabaseManager-cf5ef661.js"), true ? ["assets/DatabaseManager-cf5ef661.js","assets/api-cf1221f0.js","assets/DatabaseManager-30fa27e5.css"] : void 0)
15862
15862
  },
15863
15863
  {
15864
15864
  name: "cloudConnectionManager",
15865
15865
  path: "cloudConnectionManager",
15866
- component: () => __vitePreload(() => import("./CloudConnectionManager-d3248f8d.js"), true ? ["assets/CloudConnectionManager-d3248f8d.js","assets/api-2d6adc4f.js","assets/CloudConnectionManager-2dfdce2f.css"] : void 0)
15866
+ component: () => __vitePreload(() => import("./CloudConnectionManager-0dfba9f2.js"), true ? ["assets/CloudConnectionManager-0dfba9f2.js","assets/api-c1bad5ca.js","assets/CloudConnectionManager-2dfdce2f.css"] : void 0)
15867
15867
  },
15868
15868
  {
15869
15869
  name: "secretManager",
15870
15870
  path: "secretManager",
15871
- component: () => __vitePreload(() => import("./SecretManager-2a2cb7e2.js"), true ? ["assets/SecretManager-2a2cb7e2.js","assets/secretApi-538058f3.js"] : void 0)
15871
+ component: () => __vitePreload(() => import("./SecretManager-4839be57.js"), true ? ["assets/SecretManager-4839be57.js","assets/secretApi-68435402.js"] : void 0)
15872
15872
  }
15873
15873
  ]
15874
15874
  },
@@ -59876,8 +59876,6 @@ export {
59876
59876
  ElPopover as as,
59877
59877
  ElOption$1 as at,
59878
59878
  ElSelect as au,
59879
- ElCheckbox as av,
59880
- ElSlider as aw,
59881
59879
  resolveComponent as b,
59882
59880
  openBlock as c,
59883
59881
  defineComponent as d,
@@ -0,0 +1,41 @@
1
+ import { r as ref } from "./index-5429bbf8.js";
2
+ function isInputCsvTable(settings) {
3
+ return settings.file_type === "csv";
4
+ }
5
+ function isInputExcelTable(settings) {
6
+ return settings.file_type === "excel";
7
+ }
8
+ function isInputParquetTable(settings) {
9
+ return settings.file_type === "parquet";
10
+ }
11
+ const createSelectInputFromName = (columnName, keep = true) => {
12
+ return {
13
+ old_name: columnName,
14
+ new_name: columnName,
15
+ keep,
16
+ is_altered: false,
17
+ data_type_change: false,
18
+ is_available: true,
19
+ position: 0,
20
+ original_position: 0
21
+ };
22
+ };
23
+ function isOutputCsvTable(settings) {
24
+ return settings.file_type === "csv";
25
+ }
26
+ function isOutputParquetTable(settings) {
27
+ return settings.file_type === "parquet";
28
+ }
29
+ function isOutputExcelTable(settings) {
30
+ return settings.file_type === "excel";
31
+ }
32
+ ref(null);
33
+ export {
34
+ isOutputExcelTable as a,
35
+ isOutputParquetTable as b,
36
+ isInputExcelTable as c,
37
+ isInputCsvTable as d,
38
+ isInputParquetTable as e,
39
+ createSelectInputFromName as f,
40
+ isOutputCsvTable as i
41
+ };
@@ -1,4 +1,4 @@
1
- import { d as defineComponent, r as ref, m as watch, c as openBlock, e as createElementBlock, p as createBaseVNode, f as createVNode, w as withCtx, F as Fragment, q as renderList, h as createBlock, u as unref, at as ElOption, au as ElSelect, _ as _export_sfc } from "./index-246f201c.js";
1
+ import { d as defineComponent, r as ref, m as watch, c as openBlock, e as createElementBlock, p as createBaseVNode, f as createVNode, w as withCtx, F as Fragment, q as renderList, h as createBlock, u as unref, at as ElOption, au as ElSelect, _ as _export_sfc } from "./index-5429bbf8.js";
2
2
  const _hoisted_1 = { class: "csv-table-settings" };
3
3
  const _hoisted_2 = { class: "input-group" };
4
4
  const _hoisted_3 = { class: "input-group" };
@@ -1,4 +1,4 @@
1
- import { d as defineComponent, r as ref, m as watch, b as resolveComponent, c as openBlock, e as createElementBlock, p as createBaseVNode, f as createVNode, i as createCommentVNode, _ as _export_sfc } from "./index-246f201c.js";
1
+ import { d as defineComponent, r as ref, m as watch, b as resolveComponent, c as openBlock, e as createElementBlock, p as createBaseVNode, f as createVNode, i as createCommentVNode, _ as _export_sfc } from "./index-5429bbf8.js";
2
2
  const _hoisted_1 = { class: "excel-table-settings" };
3
3
  const _hoisted_2 = { class: "mandatory-section" };
4
4
  const _hoisted_3 = {
@@ -1,4 +1,4 @@
1
- import { d as defineComponent, r as ref, m as watch, c as openBlock, e as createElementBlock, _ as _export_sfc } from "./index-246f201c.js";
1
+ import { d as defineComponent, r as ref, m as watch, c as openBlock, e as createElementBlock, _ as _export_sfc } from "./index-5429bbf8.js";
2
2
  const _hoisted_1 = { class: "parquet-table-settings" };
3
3
  const _sfc_main = /* @__PURE__ */ defineComponent({
4
4
  __name: "outputParquet",
@@ -1,4 +1,4 @@
1
- import { d as defineComponent, r as ref, m as watch, c as openBlock, e as createElementBlock, p as createBaseVNode, f as createVNode, u as unref, av as ElCheckbox, w as withCtx, F as Fragment, q as renderList, h as createBlock, at as ElOption, au as ElSelect, aw as ElSlider, _ as _export_sfc } from "./index-246f201c.js";
1
+ import { d as defineComponent, r as ref, m as watch, b as resolveComponent, c as openBlock, e as createElementBlock, p as createBaseVNode, f as createVNode, w as withCtx, F as Fragment, q as renderList, h as createBlock, _ as _export_sfc } from "./index-5429bbf8.js";
2
2
  const _hoisted_1 = { class: "csv-table-settings" };
3
3
  const _hoisted_2 = { class: "row" };
4
4
  const _hoisted_3 = { class: "row" };
@@ -11,16 +11,13 @@ const _hoisted_9 = { class: "row" };
11
11
  const _sfc_main = /* @__PURE__ */ defineComponent({
12
12
  __name: "readCsv",
13
13
  props: {
14
- modelValue: {
15
- type: Object,
16
- required: true
17
- }
14
+ modelValue: {}
18
15
  },
19
16
  emits: ["update:modelValue"],
20
17
  setup(__props, { emit: __emit }) {
21
18
  const props = __props;
22
19
  const emit = __emit;
23
- const localCsvTable = ref(props.modelValue);
20
+ const localCsvTable = ref({ ...props.modelValue });
24
21
  const updateParent = () => {
25
22
  emit("update:modelValue", localCsvTable.value);
26
23
  };
@@ -38,10 +35,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
38
35
  { deep: true }
39
36
  );
40
37
  return (_ctx, _cache) => {
38
+ const _component_el_checkbox = resolveComponent("el-checkbox");
39
+ const _component_el_option = resolveComponent("el-option");
40
+ const _component_el_select = resolveComponent("el-select");
41
+ const _component_el_slider = resolveComponent("el-slider");
41
42
  return openBlock(), createElementBlock("div", _hoisted_1, [
42
43
  createBaseVNode("div", _hoisted_2, [
43
44
  _cache[8] || (_cache[8] = createBaseVNode("label", { for: "has-headers" }, "Has Headers:", -1)),
44
- createVNode(unref(ElCheckbox), {
45
+ createVNode(_component_el_checkbox, {
45
46
  modelValue: localCsvTable.value.has_headers,
46
47
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => localCsvTable.value.has_headers = $event),
47
48
  size: "large",
@@ -50,7 +51,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
50
51
  ]),
51
52
  createBaseVNode("div", _hoisted_3, [
52
53
  _cache[9] || (_cache[9] = createBaseVNode("label", { for: "delimiter" }, "Delimiter:", -1)),
53
- createVNode(unref(ElSelect), {
54
+ createVNode(_component_el_select, {
54
55
  modelValue: localCsvTable.value.delimiter,
55
56
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => localCsvTable.value.delimiter = $event),
56
57
  placeholder: "Select delimiter",
@@ -60,7 +61,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
60
61
  }, {
61
62
  default: withCtx(() => [
62
63
  (openBlock(true), createElementBlock(Fragment, null, renderList(csv_settings.delimiter_options, (option) => {
63
- return openBlock(), createBlock(unref(ElOption), {
64
+ return openBlock(), createBlock(_component_el_option, {
64
65
  key: option,
65
66
  label: option,
66
67
  value: option
@@ -72,7 +73,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
72
73
  ]),
73
74
  createBaseVNode("div", _hoisted_4, [
74
75
  _cache[10] || (_cache[10] = createBaseVNode("label", { for: "encoding" }, "Encoding:", -1)),
75
- createVNode(unref(ElSelect), {
76
+ createVNode(_component_el_select, {
76
77
  modelValue: localCsvTable.value.encoding,
77
78
  "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => localCsvTable.value.encoding = $event),
78
79
  placeholder: "Select encoding",
@@ -82,7 +83,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
82
83
  }, {
83
84
  default: withCtx(() => [
84
85
  (openBlock(true), createElementBlock(Fragment, null, renderList(csv_settings.encoding_options, (option) => {
85
- return openBlock(), createBlock(unref(ElOption), {
86
+ return openBlock(), createBlock(_component_el_option, {
86
87
  key: option,
87
88
  label: option,
88
89
  value: option
@@ -94,7 +95,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
94
95
  ]),
95
96
  createBaseVNode("div", _hoisted_5, [
96
97
  _cache[11] || (_cache[11] = createBaseVNode("label", { for: "quote-char" }, "Quote Character:", -1)),
97
- createVNode(unref(ElSelect), {
98
+ createVNode(_component_el_select, {
98
99
  modelValue: localCsvTable.value.quote_char,
99
100
  "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => localCsvTable.value.quote_char = $event),
100
101
  placeholder: "Select quote character",
@@ -104,7 +105,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
104
105
  }, {
105
106
  default: withCtx(() => [
106
107
  (openBlock(true), createElementBlock(Fragment, null, renderList(csv_settings.quote_char, (option) => {
107
- return openBlock(), createBlock(unref(ElOption), {
108
+ return openBlock(), createBlock(_component_el_option, {
108
109
  key: option,
109
110
  label: option,
110
111
  value: option
@@ -116,7 +117,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
116
117
  ]),
117
118
  createBaseVNode("div", _hoisted_6, [
118
119
  _cache[12] || (_cache[12] = createBaseVNode("label", { for: "row-delimiter" }, "New Line Delimiter:", -1)),
119
- createVNode(unref(ElSelect), {
120
+ createVNode(_component_el_select, {
120
121
  modelValue: localCsvTable.value.row_delimiter,
121
122
  "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => localCsvTable.value.row_delimiter = $event),
122
123
  placeholder: "Select new line delimiter",
@@ -126,7 +127,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
126
127
  }, {
127
128
  default: withCtx(() => [
128
129
  (openBlock(true), createElementBlock(Fragment, null, renderList(csv_settings.row_delimiter, (option) => {
129
- return openBlock(), createBlock(unref(ElOption), {
130
+ return openBlock(), createBlock(_component_el_option, {
130
131
  key: option,
131
132
  label: option,
132
133
  value: option
@@ -138,7 +139,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
138
139
  ]),
139
140
  createBaseVNode("div", _hoisted_7, [
140
141
  _cache[13] || (_cache[13] = createBaseVNode("label", { for: "infer-schema-length" }, "Schema Infer Length:", -1)),
141
- createVNode(unref(ElSlider), {
142
+ createVNode(_component_el_slider, {
142
143
  modelValue: localCsvTable.value.infer_schema_length,
143
144
  "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => localCsvTable.value.infer_schema_length = $event),
144
145
  step: 1e3,
@@ -151,7 +152,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
151
152
  ]),
152
153
  createBaseVNode("div", _hoisted_8, [
153
154
  _cache[14] || (_cache[14] = createBaseVNode("label", { for: "truncate-long-lines" }, "Truncate Long Lines:", -1)),
154
- createVNode(unref(ElCheckbox), {
155
+ createVNode(_component_el_checkbox, {
155
156
  modelValue: localCsvTable.value.truncate_ragged_lines,
156
157
  "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => localCsvTable.value.truncate_ragged_lines = $event),
157
158
  size: "large",
@@ -160,7 +161,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
160
161
  ]),
161
162
  createBaseVNode("div", _hoisted_9, [
162
163
  _cache[15] || (_cache[15] = createBaseVNode("label", { for: "ignore-errors" }, "Ignore Errors:", -1)),
163
- createVNode(unref(ElCheckbox), {
164
+ createVNode(_component_el_checkbox, {
164
165
  modelValue: localCsvTable.value.ignore_errors,
165
166
  "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => localCsvTable.value.ignore_errors = $event),
166
167
  size: "large",
@@ -171,8 +172,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
171
172
  };
172
173
  }
173
174
  });
174
- const readCsv_vue_vue_type_style_index_0_scoped_d0b76f7b_lang = "";
175
- const CsvTableConfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d0b76f7b"]]);
175
+ const readCsv_vue_vue_type_style_index_0_scoped_86748428_lang = "";
176
+ const CsvTableConfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-86748428"]]);
176
177
  export {
177
178
  CsvTableConfig as default
178
179
  };
@@ -1,8 +1,8 @@
1
1
 
2
- [data-v-d0b76f7b] {
2
+ [data-v-86748428] {
3
3
  box-sizing: border-box;
4
4
  }
5
- .csv-table-settings[data-v-d0b76f7b] {
5
+ .csv-table-settings[data-v-86748428] {
6
6
  background: #fff;
7
7
  border-radius: 6px;
8
8
  padding: 16px;
@@ -11,7 +11,7 @@
11
11
  max-width: 600px;
12
12
  overflow-x: hidden; /* Prevent horizontal scroll */
13
13
  }
14
- .row[data-v-d0b76f7b] {
14
+ .row[data-v-86748428] {
15
15
  display: flex;
16
16
  align-items: center;
17
17
  justify-content: space-between;
@@ -19,34 +19,34 @@
19
19
  gap: 20px;
20
20
  max-width: 100%; /* Prevent overflow */
21
21
  }
22
- label[data-v-d0b76f7b] {
22
+ label[data-v-86748428] {
23
23
  font-weight: 500;
24
24
  color: #333;
25
25
  font-size: 14px;
26
26
  flex: 1;
27
27
  max-width: 100%;
28
28
  }
29
- .el-select[data-v-d0b76f7b],
30
- .el-slider[data-v-d0b76f7b],
31
- .el-checkbox[data-v-d0b76f7b] {
29
+ .el-select[data-v-86748428],
30
+ .el-slider[data-v-86748428],
31
+ .el-checkbox[data-v-86748428] {
32
32
  flex: 2;
33
33
  max-width: 100%; /* Prevent overflow */
34
34
  }
35
- .el-slider[data-v-d0b76f7b] {
35
+ .el-slider[data-v-86748428] {
36
36
  padding-top: 10px;
37
37
  }
38
- .el-checkbox[data-v-d0b76f7b] {
38
+ .el-checkbox[data-v-86748428] {
39
39
  display: flex;
40
40
  align-items: center;
41
41
  }
42
42
  @media (max-width: 600px) {
43
- .row[data-v-d0b76f7b] {
43
+ .row[data-v-86748428] {
44
44
  flex-direction: column;
45
45
  align-items: flex-start;
46
46
  }
47
- .el-select[data-v-d0b76f7b],
48
- .el-slider[data-v-d0b76f7b],
49
- .el-checkbox[data-v-d0b76f7b] {
47
+ .el-select[data-v-86748428],
48
+ .el-slider[data-v-86748428],
49
+ .el-checkbox[data-v-86748428] {
50
50
  width: 100%;
51
51
  }
52
52
  }
@@ -1,6 +1,6 @@
1
- import { a as axios, d as defineComponent, r as ref, l as computed, n as onMounted, m as watch, b as resolveComponent, c as openBlock, e as createElementBlock, p as createBaseVNode, f as createVNode, w as withCtx, i as createCommentVNode, t as toDisplayString, a8 as withDirectives, a9 as vModelText, h as createBlock, u as unref, _ as _export_sfc } from "./index-246f201c.js";
2
- import { C as ColumnSelector } from "./dropDown-1bca8a74.js";
3
- import { C as CodeLoader } from "./vue-content-loader.es-b5f3ac30.js";
1
+ import { a as axios, d as defineComponent, r as ref, l as computed, n as onMounted, m as watch, b as resolveComponent, c as openBlock, e as createElementBlock, p as createBaseVNode, f as createVNode, w as withCtx, i as createCommentVNode, t as toDisplayString, a8 as withDirectives, a9 as vModelText, h as createBlock, u as unref, _ as _export_sfc } from "./index-5429bbf8.js";
2
+ import { C as ColumnSelector } from "./dropDown-614b998d.js";
3
+ import { C as CodeLoader } from "./vue-content-loader.es-2c8e608f.js";
4
4
  const getXlsxSheetNamesForPath = async (path) => {
5
5
  const response = await axios.get(`/api/get_xlsx_sheet_names?path=${path}`);
6
6
  return response.data;
@@ -32,10 +32,8 @@ const _hoisted_15 = { class: "input-wrapper" };
32
32
  const _sfc_main = /* @__PURE__ */ defineComponent({
33
33
  __name: "readExcel",
34
34
  props: {
35
- modelValue: {
36
- type: Object,
37
- required: true
38
- }
35
+ modelValue: {},
36
+ path: {}
39
37
  },
40
38
  emits: ["update:modelValue"],
41
39
  setup(__props, { emit: __emit }) {
@@ -47,20 +45,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
47
45
  const sheetNames = ref([]);
48
46
  const sheetNamesLoaded = ref(false);
49
47
  const getSheetNames = async () => {
50
- sheetNames.value = await getXlsxSheetNamesForPath(localExcelTable.value.path);
48
+ sheetNames.value = await getXlsxSheetNamesForPath(props.path);
51
49
  sheetNamesLoaded.value = true;
52
50
  };
53
51
  const toggleOptionalSettings = () => {
54
52
  showOptionalSettings.value = !showOptionalSettings.value;
55
53
  };
56
54
  const showWarning = computed(() => {
57
- if (!sheetNamesLoaded.value) {
55
+ if (!sheetNamesLoaded.value || !localExcelTable.value.sheet_name) {
58
56
  return false;
59
57
  }
60
58
  return !sheetNames.value.includes(localExcelTable.value.sheet_name);
61
59
  });
62
60
  onMounted(() => {
63
- if (localExcelTable.value.path) {
61
+ if (props.path) {
64
62
  getSheetNames();
65
63
  }
66
64
  isLoaded.value = true;
@@ -196,8 +194,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
196
194
  };
197
195
  }
198
196
  });
199
- const readExcel_vue_vue_type_style_index_0_scoped_e7395814_lang = "";
200
- const ExcelTableConfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-e7395814"]]);
197
+ const readExcel_vue_vue_type_style_index_0_scoped_13a180bf_lang = "";
198
+ const ExcelTableConfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-13a180bf"]]);
201
199
  export {
202
200
  ExcelTableConfig as default
203
201
  };
@@ -1,64 +1,64 @@
1
1
 
2
- .selectors[data-v-e7395814] {
2
+ .selectors[data-v-13a180bf] {
3
3
  display: flex;
4
4
  flex-direction: column;
5
5
  gap: 12px;
6
6
  }
7
- .input-wrapper[data-v-e7395814] {
7
+ .input-wrapper[data-v-13a180bf] {
8
8
  display: flex;
9
9
  flex-direction: column;
10
10
  gap: 4px;
11
11
  flex: 1;
12
12
  }
13
- label[data-v-e7395814] {
13
+ label[data-v-13a180bf] {
14
14
  font-weight: 500;
15
15
  color: #333;
16
16
  font-size: 14px;
17
17
  }
18
- input[data-v-e7395814] {
18
+ input[data-v-13a180bf] {
19
19
  padding: 6px;
20
20
  border: 1px solid #ccc;
21
21
  border-radius: 4px;
22
22
  font-size: 14px;
23
23
  width: 99%;
24
24
  }
25
- .row[data-v-e7395814] {
25
+ .row[data-v-13a180bf] {
26
26
  display: flex;
27
27
  align-items: center;
28
28
  justify-content: space-between;
29
29
  gap: 16px;
30
30
  }
31
- .compact-input[data-v-e7395814] {
31
+ .compact-input[data-v-13a180bf] {
32
32
  width: 96%;
33
33
  padding: 6px;
34
34
  font-size: 14px;
35
35
  border: 1px solid #ccc;
36
36
  border-radius: 4px;
37
37
  }
38
- .button-container[data-v-e7395814] {
38
+ .button-container[data-v-13a180bf] {
39
39
  display: flex;
40
40
  justify-content: center;
41
41
  margin: 16px 0;
42
42
  }
43
- .optional-section[data-v-e7395814] {
43
+ .optional-section[data-v-13a180bf] {
44
44
  margin-top: 20px;
45
45
  }
46
- .section-divider[data-v-e7395814] {
46
+ .section-divider[data-v-13a180bf] {
47
47
  margin: 16px 0;
48
48
  border: none;
49
49
  border-top: 1px solid #ddd;
50
50
  }
51
- .table-sizes[data-v-e7395814] {
51
+ .table-sizes[data-v-13a180bf] {
52
52
  font-weight: bold;
53
53
  margin-bottom: 10px;
54
54
  }
55
- .warning-sign[data-v-e7395814] {
55
+ .warning-sign[data-v-13a180bf] {
56
56
  color: #e74c3c;
57
57
  font-size: 16px;
58
58
  margin-left: 8px;
59
59
  }
60
60
  @media (max-width: 600px) {
61
- .row[data-v-e7395814] {
61
+ .row[data-v-13a180bf] {
62
62
  flex-direction: column;
63
63
  }
64
64
  }
@@ -1,5 +1,5 @@
1
1
 
2
- .parquet-table-settings[data-v-0faf0508] {
2
+ .parquet-table-settings[data-v-6f7c2759] {
3
3
  background: #f9fafb;
4
4
  border-radius: 8px;
5
5
  padding: 20px;
@@ -8,12 +8,12 @@
8
8
  margin: 20px auto;
9
9
  text-align: center; /* Center the text */
10
10
  }
11
- .message h2[data-v-0faf0508] {
11
+ .message h2[data-v-6f7c2759] {
12
12
  font-size: 24px;
13
13
  color: #3498db;
14
14
  margin-bottom: 10px;
15
15
  }
16
- .message p[data-v-0faf0508] {
16
+ .message p[data-v-6f7c2759] {
17
17
  font-size: 16px;
18
18
  color: #333;
19
19
  }
@@ -1,12 +1,9 @@
1
- import { d as defineComponent, c as openBlock, e as createElementBlock, p as createBaseVNode, _ as _export_sfc } from "./index-246f201c.js";
1
+ import { d as defineComponent, c as openBlock, e as createElementBlock, p as createBaseVNode, _ as _export_sfc } from "./index-5429bbf8.js";
2
2
  const _hoisted_1 = { class: "parquet-table-settings" };
3
3
  const _sfc_main = /* @__PURE__ */ defineComponent({
4
4
  __name: "readParquet",
5
5
  props: {
6
- modelValue: {
7
- type: Object,
8
- required: true
9
- }
6
+ modelValue: {}
10
7
  },
11
8
  setup(__props) {
12
9
  return (_ctx, _cache) => {
@@ -19,8 +16,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
19
16
  };
20
17
  }
21
18
  });
22
- const readParquet_vue_vue_type_style_index_0_scoped_0faf0508_lang = "";
23
- const ParquetTableConfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0faf0508"]]);
19
+ const readParquet_vue_vue_type_style_index_0_scoped_6f7c2759_lang = "";
20
+ const ParquetTableConfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-6f7c2759"]]);
24
21
  export {
25
22
  ParquetTableConfig as default
26
23
  };
@@ -1,4 +1,4 @@
1
- import { a as axios } from "./index-246f201c.js";
1
+ import { a as axios } from "./index-5429bbf8.js";
2
2
  const API_BASE_URL = "/secrets/secrets";
3
3
  const fetchSecretsApi = async () => {
4
4
  try {
@@ -1,6 +1,6 @@
1
- import { d as defineComponent, r as ref, a3 as watchEffect, l as computed, n as onMounted, o as onUnmounted, b as resolveComponent, c as openBlock, e as createElementBlock, f as createVNode, p as createBaseVNode, i as createCommentVNode, t as toDisplayString, T as normalizeStyle, g as createTextVNode, F as Fragment, q as renderList, s as normalizeClass, v as withModifiers, w as withCtx, u as unref, h as createBlock, _ as _export_sfc } from "./index-246f201c.js";
2
- import { u as useNodeStore } from "./vue-codemirror.esm-db9b8936.js";
3
- import { u as unavailableField } from "./UnavailableFields-1bab97cb.js";
1
+ import { d as defineComponent, r as ref, a3 as watchEffect, l as computed, n as onMounted, o as onUnmounted, b as resolveComponent, c as openBlock, e as createElementBlock, f as createVNode, p as createBaseVNode, i as createCommentVNode, t as toDisplayString, T as normalizeStyle, g as createTextVNode, F as Fragment, q as renderList, s as normalizeClass, v as withModifiers, w as withCtx, u as unref, h as createBlock, _ as _export_sfc } from "./index-5429bbf8.js";
2
+ import { u as useNodeStore } from "./vue-codemirror.esm-41b0e0d7.js";
3
+ import { u as unavailableField } from "./UnavailableFields-a03f512c.js";
4
4
  const _hoisted_1 = { key: 0 };
5
5
  const _hoisted_2 = {
6
6
  key: 1,
@@ -1,4 +1,4 @@
1
- import { r as ref, j as defineStore, X as shallowRef, a as axios, d as defineComponent, ai as useCssVars, n as onMounted, c as openBlock, e as createElementBlock, p as createBaseVNode, L as renderSlot, h as createBlock, t as toDisplayString, i as createCommentVNode, T as normalizeStyle, s as normalizeClass, aa as Teleport, R as nextTick, _ as _export_sfc, B as inject, l as computed, m as watch, U as onBeforeUnmount, Y as h$1, aj as toRaw } from "./index-246f201c.js";
1
+ import { r as ref, j as defineStore, X as shallowRef, a as axios, d as defineComponent, ai as useCssVars, n as onMounted, c as openBlock, e as createElementBlock, p as createBaseVNode, L as renderSlot, h as createBlock, t as toDisplayString, i as createCommentVNode, T as normalizeStyle, s as normalizeClass, aa as Teleport, R as nextTick, _ as _export_sfc, B as inject, l as computed, m as watch, U as onBeforeUnmount, Y as h$1, aj as toRaw } from "./index-5429bbf8.js";
2
2
  const FLOW_ID_STORAGE_KEY = "last_flow_id";
3
3
  ref(null);
4
4
  const getDownstreamNodeIds = async (flow_id, node_id) => {
@@ -167,6 +167,9 @@ const useNodeStore = defineStore("node", {
167
167
  cacheNodeDescriptionDict(flowId, nodeId, description) {
168
168
  this.initializeDescriptionCache(flowId);
169
169
  this.nodeDescriptions[flowId][nodeId] = description;
170
+ if (this.nodeData && this.nodeData.node_id === nodeId && this.nodeData.setting_input) {
171
+ this.nodeData.setting_input.description = description;
172
+ }
170
173
  },
171
174
  clearNodeDescriptionCache(flowId, nodeId) {
172
175
  if (this.nodeDescriptions[flowId] && this.nodeDescriptions[flowId][nodeId]) {
@@ -222,10 +225,10 @@ const useNodeStore = defineStore("node", {
222
225
  "Content-Type": "application/json"
223
226
  }
224
227
  });
225
- if (response.data.status === "success") {
226
- console.log(response.data.message);
228
+ if (response.data === true) {
229
+ console.log("Description updated successfully");
227
230
  } else {
228
- console.warn("Unexpected success response structure:", response.data);
231
+ console.warn("Unexpected response:", response.data);
229
232
  }
230
233
  } catch (error) {
231
234
  if (error.response) {
@@ -1,4 +1,4 @@
1
- import { d as defineComponent, f as createVNode, l as computed } from "./index-246f201c.js";
1
+ import { d as defineComponent, f as createVNode, l as computed } from "./index-5429bbf8.js";
2
2
  var uid = function() {
3
3
  return Math.random().toString(36).substring(2);
4
4
  };
@@ -12,7 +12,7 @@
12
12
 
13
13
  <!-- Material Icons -->
14
14
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
15
- <script type="module" crossorigin src="/assets/index-246f201c.js"></script>
15
+ <script type="module" crossorigin src="/assets/index-5429bbf8.js"></script>
16
16
  <link rel="stylesheet" href="/assets/index-50508d4d.css">
17
17
  </head>
18
18
  <body>
@@ -1,15 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Flowfile
3
- Version: 0.4.1
3
+ Version: 0.5.1
4
4
  Summary: Project combining flowfile core (backend) and flowfile_worker (compute offloader) and flowfile_frame (api)
5
5
  License-File: LICENSE
6
6
  Author: Edward van Eechoud
7
7
  Author-email: evaneechoud@gmail.com
8
- Requires-Python: >=3.10,<3.13
8
+ Requires-Python: >=3.10,<3.14
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
13
14
  Requires-Dist: XlsxWriter (>=3.2.0,<3.3.0)
14
15
  Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
15
16
  Requires-Dist: bcrypt (>=4.3.0,<5.0.0)