Flowfile 0.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (171) hide show
  1. build_backends/__init__.py +0 -0
  2. build_backends/main.py +313 -0
  3. build_backends/main_prd.py +202 -0
  4. flowfile/__init__.py +71 -0
  5. flowfile/__main__.py +24 -0
  6. flowfile-0.2.2.dist-info/LICENSE +21 -0
  7. flowfile-0.2.2.dist-info/METADATA +225 -0
  8. flowfile-0.2.2.dist-info/RECORD +171 -0
  9. flowfile-0.2.2.dist-info/WHEEL +4 -0
  10. flowfile-0.2.2.dist-info/entry_points.txt +9 -0
  11. flowfile_core/__init__.py +13 -0
  12. flowfile_core/auth/__init__.py +0 -0
  13. flowfile_core/auth/jwt.py +140 -0
  14. flowfile_core/auth/models.py +40 -0
  15. flowfile_core/auth/secrets.py +178 -0
  16. flowfile_core/configs/__init__.py +35 -0
  17. flowfile_core/configs/flow_logger.py +433 -0
  18. flowfile_core/configs/node_store/__init__.py +0 -0
  19. flowfile_core/configs/node_store/nodes.py +98 -0
  20. flowfile_core/configs/settings.py +120 -0
  21. flowfile_core/database/__init__.py +0 -0
  22. flowfile_core/database/connection.py +51 -0
  23. flowfile_core/database/init_db.py +45 -0
  24. flowfile_core/database/models.py +41 -0
  25. flowfile_core/fileExplorer/__init__.py +0 -0
  26. flowfile_core/fileExplorer/funcs.py +259 -0
  27. flowfile_core/fileExplorer/utils.py +53 -0
  28. flowfile_core/flowfile/FlowfileFlow.py +1403 -0
  29. flowfile_core/flowfile/__init__.py +0 -0
  30. flowfile_core/flowfile/_extensions/__init__.py +0 -0
  31. flowfile_core/flowfile/_extensions/real_time_interface.py +51 -0
  32. flowfile_core/flowfile/analytics/__init__.py +0 -0
  33. flowfile_core/flowfile/analytics/analytics_processor.py +123 -0
  34. flowfile_core/flowfile/analytics/graphic_walker.py +60 -0
  35. flowfile_core/flowfile/analytics/schemas/__init__.py +0 -0
  36. flowfile_core/flowfile/analytics/utils.py +9 -0
  37. flowfile_core/flowfile/connection_manager/__init__.py +3 -0
  38. flowfile_core/flowfile/connection_manager/_connection_manager.py +48 -0
  39. flowfile_core/flowfile/connection_manager/models.py +10 -0
  40. flowfile_core/flowfile/database_connection_manager/__init__.py +0 -0
  41. flowfile_core/flowfile/database_connection_manager/db_connections.py +139 -0
  42. flowfile_core/flowfile/database_connection_manager/models.py +15 -0
  43. flowfile_core/flowfile/extensions.py +36 -0
  44. flowfile_core/flowfile/flow_data_engine/__init__.py +0 -0
  45. flowfile_core/flowfile/flow_data_engine/create/__init__.py +0 -0
  46. flowfile_core/flowfile/flow_data_engine/create/funcs.py +146 -0
  47. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +1521 -0
  48. flowfile_core/flowfile/flow_data_engine/flow_file_column/__init__.py +0 -0
  49. flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +144 -0
  50. flowfile_core/flowfile/flow_data_engine/flow_file_column/polars_type.py +24 -0
  51. flowfile_core/flowfile/flow_data_engine/flow_file_column/utils.py +36 -0
  52. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/__init__.py +0 -0
  53. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py +38 -0
  54. flowfile_core/flowfile/flow_data_engine/fuzzy_matching/settings_validator.py +90 -0
  55. flowfile_core/flowfile/flow_data_engine/join/__init__.py +1 -0
  56. flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py +54 -0
  57. flowfile_core/flowfile/flow_data_engine/pivot_table.py +20 -0
  58. flowfile_core/flowfile/flow_data_engine/polars_code_parser.py +249 -0
  59. flowfile_core/flowfile/flow_data_engine/read_excel_tables.py +143 -0
  60. flowfile_core/flowfile/flow_data_engine/sample_data.py +120 -0
  61. flowfile_core/flowfile/flow_data_engine/subprocess_operations/__init__.py +1 -0
  62. flowfile_core/flowfile/flow_data_engine/subprocess_operations/models.py +36 -0
  63. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +503 -0
  64. flowfile_core/flowfile/flow_data_engine/threaded_processes.py +27 -0
  65. flowfile_core/flowfile/flow_data_engine/types.py +0 -0
  66. flowfile_core/flowfile/flow_data_engine/utils.py +212 -0
  67. flowfile_core/flowfile/flow_node/__init__.py +0 -0
  68. flowfile_core/flowfile/flow_node/flow_node.py +771 -0
  69. flowfile_core/flowfile/flow_node/models.py +111 -0
  70. flowfile_core/flowfile/flow_node/schema_callback.py +70 -0
  71. flowfile_core/flowfile/handler.py +123 -0
  72. flowfile_core/flowfile/manage/__init__.py +0 -0
  73. flowfile_core/flowfile/manage/compatibility_enhancements.py +70 -0
  74. flowfile_core/flowfile/manage/manage_flowfile.py +0 -0
  75. flowfile_core/flowfile/manage/open_flowfile.py +136 -0
  76. flowfile_core/flowfile/setting_generator/__init__.py +2 -0
  77. flowfile_core/flowfile/setting_generator/setting_generator.py +41 -0
  78. flowfile_core/flowfile/setting_generator/settings.py +176 -0
  79. flowfile_core/flowfile/sources/__init__.py +0 -0
  80. flowfile_core/flowfile/sources/external_sources/__init__.py +3 -0
  81. flowfile_core/flowfile/sources/external_sources/airbyte_sources/__init__.py +0 -0
  82. flowfile_core/flowfile/sources/external_sources/airbyte_sources/airbyte.py +159 -0
  83. flowfile_core/flowfile/sources/external_sources/airbyte_sources/models.py +172 -0
  84. flowfile_core/flowfile/sources/external_sources/airbyte_sources/settings.py +173 -0
  85. flowfile_core/flowfile/sources/external_sources/base_class.py +39 -0
  86. flowfile_core/flowfile/sources/external_sources/custom_external_sources/__init__.py +2 -0
  87. flowfile_core/flowfile/sources/external_sources/custom_external_sources/exchange_rate.py +0 -0
  88. flowfile_core/flowfile/sources/external_sources/custom_external_sources/external_source.py +100 -0
  89. flowfile_core/flowfile/sources/external_sources/custom_external_sources/google_sheet.py +74 -0
  90. flowfile_core/flowfile/sources/external_sources/custom_external_sources/sample_users.py +29 -0
  91. flowfile_core/flowfile/sources/external_sources/factory.py +22 -0
  92. flowfile_core/flowfile/sources/external_sources/sql_source/__init__.py +0 -0
  93. flowfile_core/flowfile/sources/external_sources/sql_source/models.py +90 -0
  94. flowfile_core/flowfile/sources/external_sources/sql_source/sql_source.py +328 -0
  95. flowfile_core/flowfile/sources/external_sources/sql_source/utils.py +379 -0
  96. flowfile_core/flowfile/util/__init__.py +0 -0
  97. flowfile_core/flowfile/util/calculate_layout.py +137 -0
  98. flowfile_core/flowfile/util/execution_orderer.py +141 -0
  99. flowfile_core/flowfile/utils.py +106 -0
  100. flowfile_core/main.py +138 -0
  101. flowfile_core/routes/__init__.py +0 -0
  102. flowfile_core/routes/auth.py +34 -0
  103. flowfile_core/routes/logs.py +163 -0
  104. flowfile_core/routes/public.py +10 -0
  105. flowfile_core/routes/routes.py +601 -0
  106. flowfile_core/routes/secrets.py +85 -0
  107. flowfile_core/run_lock.py +11 -0
  108. flowfile_core/schemas/__init__.py +0 -0
  109. flowfile_core/schemas/analysis_schemas/__init__.py +0 -0
  110. flowfile_core/schemas/analysis_schemas/graphic_walker_schemas.py +118 -0
  111. flowfile_core/schemas/defaults.py +9 -0
  112. flowfile_core/schemas/external_sources/__init__.py +0 -0
  113. flowfile_core/schemas/external_sources/airbyte_schemas.py +20 -0
  114. flowfile_core/schemas/input_schema.py +477 -0
  115. flowfile_core/schemas/models.py +193 -0
  116. flowfile_core/schemas/output_model.py +115 -0
  117. flowfile_core/schemas/schemas.py +106 -0
  118. flowfile_core/schemas/transform_schema.py +569 -0
  119. flowfile_core/secrets/__init__.py +0 -0
  120. flowfile_core/secrets/secrets.py +64 -0
  121. flowfile_core/utils/__init__.py +0 -0
  122. flowfile_core/utils/arrow_reader.py +247 -0
  123. flowfile_core/utils/excel_file_manager.py +18 -0
  124. flowfile_core/utils/fileManager.py +45 -0
  125. flowfile_core/utils/fl_executor.py +38 -0
  126. flowfile_core/utils/utils.py +8 -0
  127. flowfile_frame/__init__.py +56 -0
  128. flowfile_frame/__main__.py +12 -0
  129. flowfile_frame/adapters.py +17 -0
  130. flowfile_frame/expr.py +1163 -0
  131. flowfile_frame/flow_frame.py +2093 -0
  132. flowfile_frame/group_frame.py +199 -0
  133. flowfile_frame/join.py +75 -0
  134. flowfile_frame/selectors.py +242 -0
  135. flowfile_frame/utils.py +184 -0
  136. flowfile_worker/__init__.py +55 -0
  137. flowfile_worker/configs.py +95 -0
  138. flowfile_worker/create/__init__.py +37 -0
  139. flowfile_worker/create/funcs.py +146 -0
  140. flowfile_worker/create/models.py +86 -0
  141. flowfile_worker/create/pl_types.py +35 -0
  142. flowfile_worker/create/read_excel_tables.py +110 -0
  143. flowfile_worker/create/utils.py +84 -0
  144. flowfile_worker/external_sources/__init__.py +0 -0
  145. flowfile_worker/external_sources/airbyte_sources/__init__.py +0 -0
  146. flowfile_worker/external_sources/airbyte_sources/cache_manager.py +161 -0
  147. flowfile_worker/external_sources/airbyte_sources/main.py +89 -0
  148. flowfile_worker/external_sources/airbyte_sources/models.py +133 -0
  149. flowfile_worker/external_sources/airbyte_sources/settings.py +0 -0
  150. flowfile_worker/external_sources/sql_source/__init__.py +0 -0
  151. flowfile_worker/external_sources/sql_source/main.py +56 -0
  152. flowfile_worker/external_sources/sql_source/models.py +72 -0
  153. flowfile_worker/flow_logger.py +58 -0
  154. flowfile_worker/funcs.py +327 -0
  155. flowfile_worker/main.py +108 -0
  156. flowfile_worker/models.py +95 -0
  157. flowfile_worker/polars_fuzzy_match/__init__.py +0 -0
  158. flowfile_worker/polars_fuzzy_match/matcher.py +435 -0
  159. flowfile_worker/polars_fuzzy_match/models.py +36 -0
  160. flowfile_worker/polars_fuzzy_match/pre_process.py +213 -0
  161. flowfile_worker/polars_fuzzy_match/process.py +86 -0
  162. flowfile_worker/polars_fuzzy_match/utils.py +50 -0
  163. flowfile_worker/process_manager.py +36 -0
  164. flowfile_worker/routes.py +440 -0
  165. flowfile_worker/secrets.py +148 -0
  166. flowfile_worker/spawner.py +187 -0
  167. flowfile_worker/utils.py +25 -0
  168. test_utils/__init__.py +3 -0
  169. test_utils/postgres/__init__.py +1 -0
  170. test_utils/postgres/commands.py +109 -0
  171. test_utils/postgres/fixtures.py +417 -0
@@ -0,0 +1,225 @@
1
+ Metadata-Version: 2.3
2
+ Name: Flowfile
3
+ Version: 0.2.2
4
+ Summary: Project combining flowfile core (backend) and flowfile_worker (compute offloader) and flowfile_frame (api)
5
+ Author: Edward van Eechoud
6
+ Author-email: evaneechoud@gmail.com
7
+ Requires-Python: >=3.10,<3.13
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Requires-Dist: XlsxWriter (>=3.2.0,<3.3.0)
13
+ Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
14
+ Requires-Dist: airbyte-cdk (==6.47.2)
15
+ Requires-Dist: bcrypt (>=4.3.0,<5.0.0)
16
+ Requires-Dist: connectorx (>=0.4.2,<0.5.0)
17
+ Requires-Dist: databases (>=0.9.0,<0.10.0)
18
+ Requires-Dist: faker (>=23.1.0,<23.2.0)
19
+ Requires-Dist: fastapi (>=0.115.2,<0.116.0)
20
+ Requires-Dist: fastexcel (>=0.12.0,<0.13.0)
21
+ Requires-Dist: google-api-python-client (>=2.149.0,<2.150.0)
22
+ Requires-Dist: gspread (>=6.1.3,<6.2.0)
23
+ Requires-Dist: loky (>=3.4.1,<3.5.0)
24
+ Requires-Dist: methodtools (>=0.4.7,<0.5.0)
25
+ Requires-Dist: openpyxl (>=3.1.2,<3.2.0)
26
+ Requires-Dist: passlib (>=1.7.4,<1.8.0)
27
+ Requires-Dist: pendulum (==2.1.2) ; python_version < "3.12"
28
+ Requires-Dist: polars (>1.8.2,<=1.25.2)
29
+ Requires-Dist: polars-distance (>=0.4.3,<0.5.0)
30
+ Requires-Dist: polars-ds (>=0.6.0)
31
+ Requires-Dist: polars-expr-transformer (>0.4.7.0)
32
+ Requires-Dist: polars-grouper (>=0.3.0,<0.4.0)
33
+ Requires-Dist: polars_simed (>=0.3.4,<0.4.0)
34
+ Requires-Dist: pyairbyte-flowfile (==0.20.2)
35
+ Requires-Dist: pyarrow (>=18.0.0,<19.0.0)
36
+ Requires-Dist: pydantic (>=2.9.2,<2.10.0)
37
+ Requires-Dist: pyinstaller (>=6.11.0,<7.0.0)
38
+ Requires-Dist: pytest (>=8.3.4,<9.0.0)
39
+ Requires-Dist: python-jose (>=3.4.0,<4.0.0)
40
+ Requires-Dist: python-multipart (>=0.0.12,<0.1.0)
41
+ Requires-Dist: uvicorn (>=0.32.0,<0.33.0)
42
+ Description-Content-Type: text/markdown
43
+
44
+ <h1 align="center">
45
+ <img src=".github/images/logo.png" alt="Flowfile Logo" width="100">
46
+ <br>
47
+ Flowfile
48
+ </h1>
49
+ <p align="center">
50
+ <b>Documentation</b>:
51
+ <a href="https://edwardvaneechoud.github.io/Flowfile/">Website</a>
52
+ -
53
+ <a href="flowfile_core/README.md">Core</a>
54
+ -
55
+ <a href="flowfile_worker/README.md">Worker</a>
56
+ -
57
+ <a href="flowfile_frontend/README.md">Frontend</a>
58
+ -
59
+ <a href="https://dev.to/edwardvaneechoud/building-flowfile-architecting-a-visual-etl-tool-with-polars-576c">Technical Architecture</a>
60
+ </p>
61
+ <p>
62
+ Flowfile is a visual ETL tool that combines drag-and-drop workflow building with the speed of Polars dataframes. Build data pipelines visually, transform data using powerful nodes, and analyze results - all without writing code.
63
+ </p>
64
+
65
+ <div align="center">
66
+ <img src=".github/images/group_by_screenshot.png" alt="Flowfile Interface" width="800"/>
67
+ </div>
68
+
69
+ ## ⚡ Technical Design
70
+
71
+ Flowfile operates as three interconnected services:
72
+
73
+ - **Designer** (Electron + Vue): Visual interface for building data flows
74
+ - **Core** (FastAPI): ETL engine using Polars for data transformations (`:63578`)
75
+ - **Worker** (FastAPI): Handles computation and caching of data operations (`:63579`)
76
+
77
+ Each flow is represented as a directed acyclic graph (DAG), where nodes represent data operations and edges represent data flow between operations.
78
+
79
+ For a deeper dive into the technical architecture, check out [this article](https://dev.to/edwardvaneechoud/building-flowfile-architecting-a-visual-etl-tool-with-polars-576c) on how Flowfile leverages Polars for efficient data processing.
80
+
81
+ ## 🔥 Example Use Cases
82
+
83
+ - **Data Cleaning & Transformation**
84
+ - Complex joins (fuzzy matching)
85
+ - Text to rows transformations
86
+ - Advanced filtering and grouping
87
+ - Custom formulas and expressions
88
+ - Filter data based on conditions
89
+
90
+ <div align="center">
91
+ <img src=".github/images/flowfile_demo_1.gif" alt="Flowfile Layout" width="800"/>
92
+ </div>
93
+
94
+ ---
95
+
96
+ - **Performance**
97
+ - Build to scale out of core
98
+ - Using polars for data processing
99
+
100
+ <div align="center">
101
+ <img src=".github/images/demo_flowfile_write.gif" alt="Flowfile Layout" width="800"/>
102
+ </div>
103
+
104
+ ---
105
+
106
+ ### **Data Integration**
107
+ - Standardize data formats
108
+ - Handle messy Excel files
109
+
110
+
111
+ <div align="center">
112
+ <img src=".github/images/read_excel_flowfile.gif" alt="Flowfile Layout" width="800"/>
113
+ </div>
114
+
115
+
116
+ ---
117
+
118
+ - **ETL Operations**
119
+ - Data quality checks
120
+
121
+
122
+ ## 🚀 Getting Started
123
+
124
+ ### Prerequisites
125
+ - Python 3.10+
126
+ - Node.js 16+
127
+ - Poetry (Python package manager)
128
+ - Docker & Docker Compose (option, for Docker setup)
129
+ - Make (optional, for build automation)
130
+
131
+ ### Installation Options
132
+
133
+ #### 1. Desktop Application
134
+ The desktop version offers the best experience with a native interface and integrated services. You can either:
135
+
136
+ **Option A: Download Pre-built Application**
137
+ - Download the latest release from [GitHub Releases](https://github.com/Edwardvaneechoud/Flowfile/releases)
138
+ - Run the installer for your platform (Windows, macOS, or Linux)
139
+ - Note: You may see security warnings since the installer isn't signed. On Windows, click "More info" then "Run anyway". On macOS, right-click the app, select "Open", then confirm. These warnings appear because the app isn't signed with a developer certificate.
140
+
141
+ **Option B: Build from Source:**
142
+ ```bash
143
+ git clone https://github.com/edwardvaneechoud/Flowfile.git
144
+ cd Flowfile
145
+
146
+ # Build packaged executable
147
+ make # Creates platform-specific executable
148
+
149
+ # Or manually:
150
+ poetry install
151
+ poetry run build_backends
152
+ cd flowfile_frontend
153
+ npm install
154
+ npm run build # All platforms
155
+ ```
156
+
157
+ #### 2. Docker Setup
158
+ Perfect for quick testing, development or deployment scenarios. Runs all services in containers with proper networking and volume management:
159
+ ```bash
160
+ # Clone and start all services
161
+ git clone https://github.com/edwardvaneechoud/Flowfile.git
162
+ cd Flowfile
163
+ docker compose up -d
164
+
165
+ # Access services:
166
+ Frontend: http://localhost:8080 # main service
167
+ Core API: http://localhost:63578/docs
168
+ Worker API: http://localhost:63579/docs
169
+ ```
170
+ Just place your files that you want to transform in the directory in shared_data and you're all set!
171
+
172
+ Docker Compose is also excellent for development, as it automatically sets up all required services and ensures proper communication between them. Code changes in the mounted volumes will be reflected in the running containers.
173
+
174
+ #### 3. Manual Setup (Development)
175
+ Ideal for development work when you need direct access to all services and hot-reloading:
176
+
177
+ ```bash
178
+ git clone https://github.com/edwardvaneechoud/Flowfile.git
179
+ cd Flowfile
180
+
181
+ # Install Python dependencies
182
+ poetry install
183
+
184
+ # Start backend services
185
+ poetry run flowfile_worker # Starts worker on :63579
186
+ poetry run flowfile_core # Starts core on :63578
187
+
188
+ # Start web frontend
189
+ cd flowfile_frontend
190
+ npm install
191
+ npm run dev:web # Starts web interface on :8080
192
+ ```
193
+
194
+ ## 📋 TODO
195
+
196
+ ### Core Features
197
+ - [ ] Add cloud storage support
198
+ - S3 integration
199
+ - Azure Data Lake Storage (ADLS)
200
+ - [x] Multi-flow execution support
201
+ - [ ] Polars code reverse engineering
202
+ - Generate Polars code from visual flows
203
+ - Import existing Polars scripts
204
+
205
+ ### Documentation
206
+ - [ ] Add comprehensive docstrings
207
+ - [x] Create detailed node documentation
208
+ - [x] Add architectural documentation
209
+ - [ ] Improve inline code comments
210
+ - [ ] Create user guides and tutorials
211
+
212
+ ### Infrastructure
213
+ - [ ] Implement proper testing
214
+ - [x] Add CI/CD pipeline
215
+ - [x] Improve error handling
216
+ - [x] Add monitoring and logging
217
+
218
+ ## 📝 License
219
+
220
+ [MIT License](LICENSE)
221
+
222
+ ## Acknowledgments
223
+
224
+ Built with Polars, Vue.js, FastAPI, Vueflow and Electron.
225
+
@@ -0,0 +1,171 @@
1
+ build_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ build_backends/main.py,sha256=hLmfqTeHLSTiwwZ5mUuoLQgtO40Igvl1_4NbnvzWSgI,9912
3
+ build_backends/main_prd.py,sha256=JR2tYCMWM5ThooQjv5pw6nwVKMQjgsiHgKMhYn9NXWI,6927
4
+ flowfile/__init__.py,sha256=jERp50eC0SrT-lsuMJpHaFoN6NIEzWYkqLvZF0vZ6ls,2299
5
+ flowfile/__main__.py,sha256=X8ItB1LEC1ZXw_tvegu7sagb2CwqUeWSwWybbO1HtUs,630
6
+ flowfile_core/__init__.py,sha256=dGxpVE9ol33CMRPJSPWlL7AZqXowBmlCx8unxCVWJXQ,254
7
+ flowfile_core/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ flowfile_core/auth/jwt.py,sha256=-j_eZd5z2ABP0KHo5PmmsuCyJUsvAFFlnANJiRCnNx4,4828
9
+ flowfile_core/auth/models.py,sha256=ilQqy7ief1mwAP9xiNWbftCR9yyccECMa0Qsnnwax_g,648
10
+ flowfile_core/auth/secrets.py,sha256=5TixLt9I64pR0OT4AoqgIzAmjCQNoGF4YPGuRhCWBH0,5840
11
+ flowfile_core/configs/__init__.py,sha256=RSoO4aiWY-FzOUKLPY-mbwHS_YcbbNw5tNdVzrwi_ek,977
12
+ flowfile_core/configs/flow_logger.py,sha256=Pk1yhaC58jjISMrgwhBFIue9Qj5XfYo8NfOefqsR-gA,15822
13
+ flowfile_core/configs/node_store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ flowfile_core/configs/node_store/nodes.py,sha256=6z5kk-TUw5b-iQRxZzw7Qey-P9mUKw0AL19Nu_zwUhY,6155
15
+ flowfile_core/configs/settings.py,sha256=UsqurpsVQ8BTz6k5hdipfFgWpMNw7k-9WgpG7XHAHeA,3818
16
+ flowfile_core/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ flowfile_core/database/connection.py,sha256=Ul1gYnYvwvlTSgxlJr5JexYCdgyZFduXioFjY_Lw2U0,1410
18
+ flowfile_core/database/init_db.py,sha256=vKQi340caayTqc1tR0CJcd621i4afVc0BLpJO-t4CFk,1236
19
+ flowfile_core/database/models.py,sha256=SUrOgefmGY4lrN9Cv67TEjEOQtyKoYEpkjIVCWs7k8U,1249
20
+ flowfile_core/fileExplorer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ flowfile_core/fileExplorer/funcs.py,sha256=9o1Wko-wPpKNapRSvwsC-FmofJ6VFmBU5v2aQLRU3sA,9048
22
+ flowfile_core/fileExplorer/utils.py,sha256=RrXj1NdkB2K3v5khvXpEp-_OnN68k9Ex_9s7CDa3L5w,1703
23
+ flowfile_core/flowfile/FlowfileFlow.py,sha256=V31YYKiiL81RZ5zPIM7DK-hxriEOdc1MvHLuqSBTwSI,70318
24
+ flowfile_core/flowfile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ flowfile_core/flowfile/_extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ flowfile_core/flowfile/_extensions/real_time_interface.py,sha256=F9wGAFmu4gmC-svfwasDEaVYZBinBqYUZmCrEsWos44,1906
27
+ flowfile_core/flowfile/analytics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ flowfile_core/flowfile/analytics/analytics_processor.py,sha256=mLEEWTaSSMF-0W7DyN9lDKfpnQ8_GRoUKclJ3iFZ97U,4833
29
+ flowfile_core/flowfile/analytics/graphic_walker.py,sha256=snYNQUTPZLhtz1egv_rSmo61uhJvd7OAuY_zeTYeE0c,2379
30
+ flowfile_core/flowfile/analytics/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ flowfile_core/flowfile/analytics/utils.py,sha256=x-FS1ZwQrHLzAfKm1THiQEKeCm_w0vO5dyWgyyIPjLY,487
32
+ flowfile_core/flowfile/connection_manager/__init__.py,sha256=wLAGuQBA0lgN1tZleYZ32eFeY4UODG46RrclWoEc7hM,134
33
+ flowfile_core/flowfile/connection_manager/_connection_manager.py,sha256=W9FWRAFUT1c2eHa2QhFpKNWA-Kps63o2vcGAH1zXSeo,2612
34
+ flowfile_core/flowfile/connection_manager/models.py,sha256=o_2FK7aNdjMHfiGX7hIUz5uslfLar8KIcI_760WprzM,227
35
+ flowfile_core/flowfile/database_connection_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ flowfile_core/flowfile/database_connection_manager/db_connections.py,sha256=omQjmvwhL97d4WAgIEVBHhldOG58QySE1tq7f-timKc,5210
37
+ flowfile_core/flowfile/database_connection_manager/models.py,sha256=lVJSifqznQ8fKGWBEBCy_8JeXmdKF4pnAE5P5oXRrLM,379
38
+ flowfile_core/flowfile/extensions.py,sha256=vVyM4sdUN5Eyez6IPt9poNWwvcJMJKwP4dLCq1ErQ5k,1795
39
+ flowfile_core/flowfile/flow_data_engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ flowfile_core/flowfile/flow_data_engine/create/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ flowfile_core/flowfile/flow_data_engine/create/funcs.py,sha256=AC87vQHgna-stFJZPLWF8ErxFioxdCJAhVaXZGVOsY0,7317
42
+ flowfile_core/flowfile/flow_data_engine/flow_data_engine.py,sha256=egGp75DKjNyfRa4YfFmebKsKlXXLIdUxiZ7epdz0yQ4,61672
43
+ flowfile_core/flowfile/flow_data_engine/flow_file_column/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py,sha256=e438RcbN9msjgsyoXyqsRXp7hiPO5xdw-F7cRfSOBCw,5533
45
+ flowfile_core/flowfile/flow_data_engine/flow_file_column/polars_type.py,sha256=xusyOLwSxevBk8-Uy9ZKISB_KOi0JeYfZ0wihcG-Qjk,530
46
+ flowfile_core/flowfile/flow_data_engine/flow_file_column/utils.py,sha256=3AI4ZR4OhNZPaCHq646rRbu-2yLJzj_4gEjGu_5mTzA,775
47
+ flowfile_core/flowfile/flow_data_engine/fuzzy_matching/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ flowfile_core/flowfile/flow_data_engine/fuzzy_matching/prepare_for_fuzzy_match.py,sha256=67MxjjmOfNaDYYFELo-L-h7HNHWWiAd62VX-vDD7Sqs,1873
49
+ flowfile_core/flowfile/flow_data_engine/fuzzy_matching/settings_validator.py,sha256=SjIw-dV8SQUClxyCCO-6i-HC3avPd3yzQgLFO0L04nI,4550
50
+ flowfile_core/flowfile/flow_data_engine/join/__init__.py,sha256=q4K5ZjGmFmGcuK545PKD1y_8WhyPjmEIyfeIkZ3WboM,75
51
+ flowfile_core/flowfile/flow_data_engine/join/verify_integrity.py,sha256=TfjYEIu2G9I-N6NuXVNsQWbj57_n4WbZO2kphZcHOmc,2245
52
+ flowfile_core/flowfile/flow_data_engine/pivot_table.py,sha256=seqJqbrhwK4gkO-EQ3MSQWseh5HR3D_slQtq6pjT_pw,366
53
+ flowfile_core/flowfile/flow_data_engine/polars_code_parser.py,sha256=u9TXAmQNJAyhv_s8y_oZT3zUu_FYfhXTholq_3oiVCQ,8580
54
+ flowfile_core/flowfile/flow_data_engine/read_excel_tables.py,sha256=q7TccqyToowJEOU4j2tY40HshXYkDACkYE95bNqoiw8,5937
55
+ flowfile_core/flowfile/flow_data_engine/sample_data.py,sha256=Y_9PuM5gBsb3bIrN-Cz70BNQlXuj88A_AmejYj01wys,4451
56
+ flowfile_core/flowfile/flow_data_engine/subprocess_operations/__init__.py,sha256=04ZpOvZ6gF42vQ02a0Lim9w5EP7-xu2l_S2WrSoll-g,97
57
+ flowfile_core/flowfile/flow_data_engine/subprocess_operations/models.py,sha256=0ZN8HfpTfXc5LxXjDc2CCl66xNpxf6n_6dwExIxWbjM,1079
58
+ flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py,sha256=jPo9roN3_IikoRMSlDFK6KTshUwpRT6pqkQfFOXADvU,19962
59
+ flowfile_core/flowfile/flow_data_engine/threaded_processes.py,sha256=15IPoqIoCfkPMb648o9hnOzNnZINhYQxJi5hNfQuRwE,1311
60
+ flowfile_core/flowfile/flow_data_engine/types.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
+ flowfile_core/flowfile/flow_data_engine/utils.py,sha256=JKOVKU-zatSk2oWXU8foR30MXooDJg4cODrw8c1uJqQ,7596
62
+ flowfile_core/flowfile/flow_node/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ flowfile_core/flowfile/flow_node/flow_node.py,sha256=sKFcSmxyBRUzCD_7ZJ9w1tEZ_odtS1WBI05frnpVl9o,35073
64
+ flowfile_core/flowfile/flow_node/models.py,sha256=jD2yUbrZYXy48nsUppuHUm8xqnrozhT37_oq9TBSYTw,4268
65
+ flowfile_core/flowfile/flow_node/schema_callback.py,sha256=R9tQh20zC3Z492ne8OtsSpp9_jmDIAfyoX4YqB1s_2M,2288
66
+ flowfile_core/flowfile/handler.py,sha256=wBeZmREY57ahuITLFTZ7FATIGXHK-3bQHyyM3eA-_s8,4105
67
+ flowfile_core/flowfile/manage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
+ flowfile_core/flowfile/manage/compatibility_enhancements.py,sha256=UCe0s7OECW2FEW-JdiBhP0CWqTGBKVngOIj35avRpX0,3989
69
+ flowfile_core/flowfile/manage/manage_flowfile.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ flowfile_core/flowfile/manage/open_flowfile.py,sha256=pIBrjtH1igu3Yd_UGeqdAdky_e7PPeXqvwOXrmfcEJs,6728
71
+ flowfile_core/flowfile/setting_generator/__init__.py,sha256=WvQpRzzrzQL-XSdayaoN2SfW0ngvF9l6fqldNh1ZD2k,98
72
+ flowfile_core/flowfile/setting_generator/setting_generator.py,sha256=Zy9eoncp0pwnJqYSshZTXiWc3UC5fwoY4zrOfjAb1z4,1254
73
+ flowfile_core/flowfile/setting_generator/settings.py,sha256=PQ3OQW48HZsqvbuNM1zj5bN2EA0ga-qQvMsRZ0dgf9c,9154
74
+ flowfile_core/flowfile/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ flowfile_core/flowfile/sources/external_sources/__init__.py,sha256=bb9QikXEhkP0rdH68qRUJaPGA2lGFIauIWNlOBL-9uE,288
76
+ flowfile_core/flowfile/sources/external_sources/airbyte_sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ flowfile_core/flowfile/sources/external_sources/airbyte_sources/airbyte.py,sha256=OBiy2G2AtPBlVhirZrRqTta013nAtQobpSKWEX0oCQU,5718
78
+ flowfile_core/flowfile/sources/external_sources/airbyte_sources/models.py,sha256=iM156vf0rjtIHMLFgCjBJozbnXYOi5ohtQ66zxbumQ8,5566
79
+ flowfile_core/flowfile/sources/external_sources/airbyte_sources/settings.py,sha256=3ZdWIGLCsbWmJb33wmmkQRIa7iEHpPrE7iuFag_TxBg,6288
80
+ flowfile_core/flowfile/sources/external_sources/base_class.py,sha256=mQhplw0O4heef2yAFuvKAyQaZJxd7lDyohgGv-4yxOI,981
81
+ flowfile_core/flowfile/sources/external_sources/custom_external_sources/__init__.py,sha256=wXezBmGnv8hJf3AwAMcEU9v237q5WDlpBK2XwnrK94I,194
82
+ flowfile_core/flowfile/sources/external_sources/custom_external_sources/exchange_rate.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ flowfile_core/flowfile/sources/external_sources/custom_external_sources/external_source.py,sha256=uNUuQiB1s6J59VYrIxi272-qfHjGjtY0D23nvhgg0Qk,3786
84
+ flowfile_core/flowfile/sources/external_sources/custom_external_sources/google_sheet.py,sha256=4Yw2IQr9GrHT0S_TduyAxinDLEwg8xBQMFILPBlCFU4,3051
85
+ flowfile_core/flowfile/sources/external_sources/custom_external_sources/sample_users.py,sha256=rG246hN0TVQCJTLzt_MQcohLloBqWz3dh8ZscizD18o,842
86
+ flowfile_core/flowfile/sources/external_sources/factory.py,sha256=8um2kFuICqrOAeA1scLPIVDabAsOHabN2PartvfCpPU,919
87
+ flowfile_core/flowfile/sources/external_sources/sql_source/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
+ flowfile_core/flowfile/sources/external_sources/sql_source/models.py,sha256=C6lhFKsF90ifoU9k421f2-K-FJwaLbKs9_yqYHWBzGE,4613
89
+ flowfile_core/flowfile/sources/external_sources/sql_source/sql_source.py,sha256=jMHLUW2vU110z5_Pru3E2CSvov5PM4Yve2nflotawcs,12978
90
+ flowfile_core/flowfile/sources/external_sources/sql_source/utils.py,sha256=Cj-uKhHT6s_S8vmO7mONf0zrKb987ZzxVLISaUdtAVw,11765
91
+ flowfile_core/flowfile/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
+ flowfile_core/flowfile/util/calculate_layout.py,sha256=iquA_-EGzX9mH1NasIZFNaYLfBcKqz5pHaTjHO1rYWE,5070
93
+ flowfile_core/flowfile/util/execution_orderer.py,sha256=IJ-upXUruZfFj8z4J-2oDLz2hDSOnRIdgd_YLlRKU-c,5828
94
+ flowfile_core/flowfile/utils.py,sha256=arSkifiXgbdWqrLcgQ6X3u-A9_6zDHocDuXEy6M3c18,3363
95
+ flowfile_core/main.py,sha256=O-MjHAOYE-qS0MFLh6CigpcSejYXR4uo0Xs4msIEt2w,3790
96
+ flowfile_core/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
+ flowfile_core/routes/auth.py,sha256=-2SWMCDDKYSnriiYH3hOadnsHdmVckcIV_vA2mZfBu0,1251
98
+ flowfile_core/routes/logs.py,sha256=LHGbCN10pjS8yAWHaG9eUHxMoGQlHjVWFSxtAnuQjrM,5868
99
+ flowfile_core/routes/public.py,sha256=bRmRyphaCLTTdPjPn_M6NWPUEQKHB5eeKlKoOs7jWzA,217
100
+ flowfile_core/routes/routes.py,sha256=RkgajFkwnBkpbRpUks7Dgt2QGJJia23bX39QrybB5Fw,23094
101
+ flowfile_core/routes/secrets.py,sha256=QIrloBSclw9JGcpB-c4VHlNBVy2t-sAAB9RXK9ibNlk,3061
102
+ flowfile_core/run_lock.py,sha256=1bINUPwZe7v9rHRePTk0CaExscqf2pvk4hWoYFZWQqE,296
103
+ flowfile_core/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
+ flowfile_core/schemas/analysis_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
+ flowfile_core/schemas/analysis_schemas/graphic_walker_schemas.py,sha256=1PQeiBFIhZg3cqDKD1AaeMbA9yMss9ajDv-elKOb2Lk,2885
106
+ flowfile_core/schemas/defaults.py,sha256=5FeYJIn1ZJ4Es8WQfSW3EkfoOnWsvifg9bvwZO7fklg,228
107
+ flowfile_core/schemas/external_sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
+ flowfile_core/schemas/external_sources/airbyte_schemas.py,sha256=xjMVevVronSvMJ1lQrBTv2ClkO2VSMSU8YCga_Mw6vk,594
109
+ flowfile_core/schemas/input_schema.py,sha256=xyeLiDuRnY2K65zOAlxpx-cm7Z4HK16yOKl_GpwMmkU,14112
110
+ flowfile_core/schemas/models.py,sha256=W22swh1TZ1aAZY8R-OL0AiTXvIEUKtN9B1ZFc0dxZQI,5253
111
+ flowfile_core/schemas/output_model.py,sha256=yenexlnHI9ecQhTDBPNChO2p25YNZ9btR5_cXd-ehLg,2665
112
+ flowfile_core/schemas/schemas.py,sha256=_CXS-YUMOwJTlWAX4mPnhqHD7ZiQy3DM7rHB2eSbHUY,2647
113
+ flowfile_core/schemas/transform_schema.py,sha256=7MooeHGWdSZnLsX7_WSXesML6Rpbi7rK6vUEwtVjBaY,21259
114
+ flowfile_core/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
+ flowfile_core/secrets/secrets.py,sha256=6G9hqo-GjTE7va6i6r3_ZmGo4Y26Aw_PY0W8L6pNo7E,2086
116
+ flowfile_core/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
+ flowfile_core/utils/arrow_reader.py,sha256=SbDDzOmtHcZ8rH88v1jN0EZthaDqBmvCrbruX07Qdks,9366
118
+ flowfile_core/utils/excel_file_manager.py,sha256=EIad2LenHu-3Yw1FcLmE0KgmLflnvNKt07FY6s6mPlE,452
119
+ flowfile_core/utils/fileManager.py,sha256=LnJhK_pwjb9MIApG2e4Hp3L5Z7Wny8YYHaL9SkW8WlE,1371
120
+ flowfile_core/utils/fl_executor.py,sha256=eNnNZHZ9451brzZD00_X8aoCHFl1hR1gVOIGxtE0Db4,1301
121
+ flowfile_core/utils/utils.py,sha256=NkEu21OF1l5weu01g-dAVdJ6BRHdpT2jBrWBSi-wp3c,270
122
+ flowfile_frame/__init__.py,sha256=5Jofwsln7SI6-NcwR3DvMzRhg0nN19z3Ro3ZDZ5fClw,1349
123
+ flowfile_frame/__main__.py,sha256=qN0H-bYXDLIDoJNAurXep27crvKNHiz90HOGWbvC0HM,413
124
+ flowfile_frame/adapters.py,sha256=C6JZZKANoKbHHmwMaF9AqAcZvITvQeb2Dklcpg5JAdY,530
125
+ flowfile_frame/expr.py,sha256=wzJLiHtAqBA4NUEyXW8UhNJJ2jiGDvWEX8RfWT5ICwQ,47370
126
+ flowfile_frame/flow_frame.py,sha256=X4p5Wr2DNoAZhkhCveVPGtFF2LG9FgDZHerLDrVqJdY,77553
127
+ flowfile_frame/group_frame.py,sha256=MMGE2_DC8n1J2UxBBm_TyacGiRT_1V2CcWUvsIyhbIQ,9115
128
+ flowfile_frame/join.py,sha256=pezHyNQMcaSPK9vhjaCaelMkgKdrvOQxwiROsa0fmN8,2480
129
+ flowfile_frame/selectors.py,sha256=Ny5IpDP481ClNr5gI7_SjXzeqF16LsPcVQxiyUf5tUw,9130
130
+ flowfile_frame/utils.py,sha256=fTcHWDyN7LVxRtVBoLwlfdEanhGhFZXEtslQUK2LDpQ,5923
131
+ flowfile_worker/__init__.py,sha256=ZDdn3JCP7LWTiTsmntVIVduB4p2bUkJcZUKVEj7V9TU,1375
132
+ flowfile_worker/configs.py,sha256=7fYtlj06vxDrMiRuMbwvSDOD1JRVMZqnPbcQFuikCJM,2714
133
+ flowfile_worker/create/__init__.py,sha256=vkWy5uODffivUdxt3nNVALj6xgQK3HPBetqR-QqZ-uo,1643
134
+ flowfile_worker/create/funcs.py,sha256=whKKqE-0Ru3Ep3kOWfUi5o8Ua9ENn8HcjOjzIC1wg1g,7159
135
+ flowfile_worker/create/models.py,sha256=Lj4ekqSilLnQ36aOWgURvlv2u60YWwKTN-OueLzUT2c,2981
136
+ flowfile_worker/create/pl_types.py,sha256=xVR_038jFwfv-jXFNZarUAXQ-L09CajR3p3lSetEmYk,774
137
+ flowfile_worker/create/read_excel_tables.py,sha256=tHL4Ga0H3GyWRATx_AFeOFPD0dGyKtxkr4meBELJQYA,4022
138
+ flowfile_worker/create/utils.py,sha256=yC0pjjM8x61FLTZFgl8KFe_a3gR-9DK7sg00uo-nIo4,2987
139
+ flowfile_worker/external_sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
+ flowfile_worker/external_sources/airbyte_sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
+ flowfile_worker/external_sources/airbyte_sources/cache_manager.py,sha256=-djWqUUCx_DwuyBOPYppmy2Fc6NXyY98vPCA0hjEat0,6567
142
+ flowfile_worker/external_sources/airbyte_sources/main.py,sha256=6ZOdUh2Obv_BrPuXaxE_HrM8ZjHegKP5SitjNy3RCLQ,3141
143
+ flowfile_worker/external_sources/airbyte_sources/models.py,sha256=H8lhW9L4q-E4tRPDsakqv5gpVWmSxfKfLQBoolzHNDM,3814
144
+ flowfile_worker/external_sources/airbyte_sources/settings.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
+ flowfile_worker/external_sources/sql_source/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
+ flowfile_worker/external_sources/sql_source/main.py,sha256=0fDb2Nheda6c_p_QG9vKI5dh9x83VGu1LdJxWGuxhxo,2138
147
+ flowfile_worker/external_sources/sql_source/models.py,sha256=bwyHbTLxF4F020z04Q_qGVOr0p3S_kwsM_18Rp68JIM,2541
148
+ flowfile_worker/flow_logger.py,sha256=KtSRLbp7jlsUwk-3gmwcgcSRXfKVZojaAcJWQE5N45I,2396
149
+ flowfile_worker/funcs.py,sha256=9uuJ5LQW-yhwI2dyQZ5to38PmSB2I9Y8gu_p3dW-yIY,15448
150
+ flowfile_worker/main.py,sha256=1e_vlY-yvGd_OykPh7wPlih-LneCPeJGjyWcB0s7aeA,2917
151
+ flowfile_worker/models.py,sha256=mOFl2kDxy_rteZpzgfJXHQ9u5nsBQbBThmRZZE99-7M,2840
152
+ flowfile_worker/polars_fuzzy_match/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
+ flowfile_worker/polars_fuzzy_match/matcher.py,sha256=Y6ovd2c4iEkY4LLMnaJMxloHRfa4eG8vW3l3ksRy_88,18343
154
+ flowfile_worker/polars_fuzzy_match/models.py,sha256=P8vvB4ck88RH8dogIokmvoN3U86BoQjgli3wQEUXP6I,1251
155
+ flowfile_worker/polars_fuzzy_match/pre_process.py,sha256=sKgis3LOnGCs-OZw5c-IOQKUl3EIMB9H3RDwk-J_IUw,8655
156
+ flowfile_worker/polars_fuzzy_match/process.py,sha256=IJzaVafDJqcXShuPIw9oaySSTT7PxRNeiT7uPNkyyug,4394
157
+ flowfile_worker/polars_fuzzy_match/utils.py,sha256=XRASPJorXxccQnjdX9XKJ4dakNMkSUDYoAqLO4Imo1Q,1519
158
+ flowfile_worker/process_manager.py,sha256=vb0ymLwsGDgW6MvSgGWDOGBZ2vgAGR3CanASP_hO5Eg,1169
159
+ flowfile_worker/routes.py,sha256=RMWWs4dyz9hewkrh0GYkUjO6HKIWSxoXKTcidEIPcLY,19525
160
+ flowfile_worker/secrets.py,sha256=dGN4f0IOG8ozndDoolEpIJROzIIWttq5TeVtrdMiQ5k,4339
161
+ flowfile_worker/spawner.py,sha256=YDdbFSxHrZPe1owV7ZReBb_8mBY6bXvA5A4o5OpO5rc,7949
162
+ flowfile_worker/utils.py,sha256=CQR__y0xdnrGHoZChuJg5PjTemphKvmUvSkkhaZx2Gw,708
163
+ test_utils/__init__.py,sha256=8WwOgIuKw6YtOc1GWR1DqIhQ8BhlLWqsMyQJSpxnzKk,66
164
+ test_utils/postgres/__init__.py,sha256=y3V_6a9N1Pvm5NIBaA8CFf3i4mvPVY-H1teHA-rg0VU,33
165
+ test_utils/postgres/commands.py,sha256=4oA8EHW3EqwGkG02HSqEGbXEBGM01sUW5FsyHm86W4k,4347
166
+ test_utils/postgres/fixtures.py,sha256=kR8UBjQr3pgbe-xM-V8x8VseTHCPv0EmDEzPHl5Qc8Y,13507
167
+ flowfile-0.2.2.dist-info/LICENSE,sha256=pCfLAA27jMHReYk_wGiirZxWRRXz_Bm7PVInRCa9P5g,1075
168
+ flowfile-0.2.2.dist-info/METADATA,sha256=4jZprT4VmdoP8ahxW6WAm0gpwN5ulfHXr21-I07Hzww,7409
169
+ flowfile-0.2.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
170
+ flowfile-0.2.2.dist-info/entry_points.txt,sha256=CiyNXUvc77hDbE9rDaAMQFdFCQs-XdBm5_o1WV9_gQA,335
171
+ flowfile-0.2.2.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.1.3
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,9 @@
1
+ [console_scripts]
2
+ build_backends=build_backends.main:main
3
+ build_backends_prd=build_backends.main_prd:main
4
+ flowfile_core=flowfile_core.main:run
5
+ flowfile_worker=flowfile_worker.main:run
6
+ flowframe=flowframe.__main__:main
7
+ start_postgres=test_utils.postgres.commands:start_postgres
8
+ stop_postgres=test_utils.postgres.commands:stop_postgres
9
+
@@ -0,0 +1,13 @@
1
+ import os
2
+ from flowfile_core.flowfile.handler import FlowfileHandler
3
+ from flowfile_core.database.init_db import init_db
4
+
5
+ os.environ["FLOWFILE_MODE"] = "electron"
6
+ init_db()
7
+
8
+
9
+ class ServerRun:
10
+ exit: bool = False
11
+
12
+
13
+ flow_file_handler = FlowfileHandler()
File without changes
@@ -0,0 +1,140 @@
1
+ # jwt.py
2
+
3
+ import os
4
+ import secrets
5
+ from datetime import datetime, timedelta
6
+ from typing import Optional
7
+
8
+ from fastapi import APIRouter, Depends, HTTPException, status, Query
9
+ from fastapi.security import OAuth2PasswordBearer
10
+ from jose import JWTError, jwt
11
+ from sqlalchemy.orm import Session
12
+ from flowfile_core.auth.secrets import get_password, set_password
13
+
14
+ from flowfile_core.auth.models import User, TokenData
15
+ from flowfile_core.database import models as db_models
16
+ from flowfile_core.database.connection import get_db
17
+
18
+ router = APIRouter()
19
+
20
+ # Constants for JWT
21
+ ALGORITHM = "HS256"
22
+ ACCESS_TOKEN_EXPIRE_MINUTES = 60
23
+
24
+ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="auth/token", auto_error=False)
25
+
26
+
27
+ def get_jwt_secret():
28
+ if os.environ.get("FLOWFILE_MODE") == "electron":
29
+ key = get_password("flowfile", "jwt_secret")
30
+ if not key:
31
+ key = secrets.token_hex(32)
32
+ set_password("flowfile", "jwt_secret", key)
33
+ return key
34
+ else:
35
+ key = os.environ.get("JWT_SECRET_KEY")
36
+ if not key:
37
+ raise Exception("JWT_SECRET_KEY environment variable must be set in Docker mode")
38
+ return key
39
+
40
+
41
+ async def get_current_user(token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)):
42
+ # Require token in all modes
43
+ credentials_exception = HTTPException(
44
+ status_code=status.HTTP_401_UNAUTHORIZED,
45
+ detail="Could not validate credentials",
46
+ headers={"WWW-Authenticate": "Bearer"},
47
+ )
48
+
49
+ if not token:
50
+ raise credentials_exception
51
+
52
+ try:
53
+ # Decode token in all modes (Electron and Docker)
54
+ payload = jwt.decode(token, get_jwt_secret(), algorithms=[ALGORITHM])
55
+ username: str = payload.get("sub")
56
+ if username is None:
57
+ raise credentials_exception
58
+ token_data = TokenData(username=username)
59
+ except JWTError:
60
+ raise credentials_exception
61
+
62
+ # In Electron mode, if token is valid, return default user
63
+ if os.environ.get("FLOWFILE_MODE") == "electron":
64
+ if token_data.username == "local_user":
65
+ electron_user = User(username="local_user", id=1, disabled=False)
66
+ return electron_user
67
+ else:
68
+ # Invalid username in token
69
+ raise credentials_exception
70
+ else:
71
+ # In Docker mode, get user from database
72
+ user = db.query(db_models.User).filter(db_models.User.username == token_data.username).first()
73
+ if user is None:
74
+ raise credentials_exception
75
+ if user.disabled:
76
+ raise HTTPException(status_code=400, detail="Inactive user")
77
+ return user
78
+
79
+
80
+ def get_current_active_user(current_user=Depends(get_current_user)):
81
+ if hasattr(current_user, 'disabled') and current_user.disabled:
82
+ raise HTTPException(status_code=400, detail="Inactive user")
83
+ return current_user
84
+
85
+
86
+ def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
87
+ to_encode = data.copy()
88
+
89
+ if expires_delta:
90
+ expire = datetime.utcnow() + expires_delta
91
+ else:
92
+ expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
93
+
94
+ to_encode.update({"exp": expire})
95
+ encoded_jwt = jwt.encode(to_encode, get_jwt_secret(), algorithm=ALGORITHM)
96
+ return encoded_jwt
97
+
98
+
99
+ async def get_current_user_from_query(
100
+ access_token: str = Query(..., description="JWT access token"),
101
+ db: Session = Depends(get_db)
102
+ ):
103
+ """
104
+ Authenticate user using only the query parameter token.
105
+ Specialized for log streaming where header-based auth isn't possible.
106
+ """
107
+ credentials_exception = HTTPException(
108
+ status_code=401,
109
+ detail="Could not validate credentials",
110
+ headers={"WWW-Authenticate": "Bearer"},
111
+ )
112
+
113
+ if not access_token:
114
+ raise credentials_exception
115
+
116
+ try:
117
+ # Decode token
118
+ payload = jwt.decode(access_token, get_jwt_secret(), algorithms=[ALGORITHM])
119
+ username: str = payload.get("sub")
120
+ if username is None:
121
+ raise credentials_exception
122
+ token_data = TokenData(username=username)
123
+ except JWTError:
124
+ raise credentials_exception
125
+
126
+ # Handle authentication based on deployment mode (same as your existing logic)
127
+ if os.environ.get("FLOWFILE_MODE") == "electron":
128
+ if token_data.username == "local_user":
129
+ electron_user = User(username="local_user", id=1, disabled=False)
130
+ return electron_user
131
+ else:
132
+ raise credentials_exception
133
+ else:
134
+ # In Docker mode, get user from database
135
+ user = db.query(db_models.User).filter(db_models.User.username == token_data.username).first()
136
+ if user is None:
137
+ raise credentials_exception
138
+ if user.disabled:
139
+ raise HTTPException(status_code=400, detail="Inactive user")
140
+ return user
@@ -0,0 +1,40 @@
1
+
2
+ from pydantic import BaseModel, SecretStr
3
+ from typing import Optional, List
4
+
5
+
6
+ class Token(BaseModel):
7
+ access_token: str
8
+ token_type: str
9
+
10
+
11
+ class TokenData(BaseModel):
12
+ username: Optional[str] = None
13
+
14
+
15
+ class User(BaseModel):
16
+ username: str
17
+ id: Optional[int] = None
18
+ email: Optional[str] = None
19
+ full_name: Optional[str] = None
20
+ disabled: Optional[bool] = False
21
+
22
+
23
+ class UserInDB(User):
24
+ hashed_password: str
25
+
26
+
27
+ class SecretInput(BaseModel):
28
+ name: str
29
+ value: SecretStr
30
+
31
+
32
+ class Secret(SecretInput):
33
+ user_id: str
34
+
35
+
36
+ class SecretInDB(BaseModel):
37
+ id: str
38
+ name: str
39
+ encrypted_value: str
40
+ user_id: str