fractor 0.1.6 → 0.1.8
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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +227 -102
- data/README.adoc +113 -1940
- data/docs/.lycheeignore +16 -0
- data/docs/Gemfile +24 -0
- data/docs/README.md +157 -0
- data/docs/_config.yml +151 -0
- data/docs/_features/error-handling.adoc +1192 -0
- data/docs/_features/index.adoc +80 -0
- data/docs/_features/monitoring.adoc +589 -0
- data/docs/_features/signal-handling.adoc +202 -0
- data/docs/_features/workflows.adoc +1235 -0
- data/docs/_guides/continuous-mode.adoc +736 -0
- data/docs/_guides/cookbook.adoc +1133 -0
- data/docs/_guides/index.adoc +55 -0
- data/docs/_guides/pipeline-mode.adoc +730 -0
- data/docs/_guides/troubleshooting.adoc +358 -0
- data/docs/_pages/architecture.adoc +1390 -0
- data/docs/_pages/core-concepts.adoc +1392 -0
- data/docs/_pages/design-principles.adoc +862 -0
- data/docs/_pages/getting-started.adoc +290 -0
- data/docs/_pages/installation.adoc +143 -0
- data/docs/_reference/api.adoc +1080 -0
- data/docs/_reference/error-reporting.adoc +670 -0
- data/docs/_reference/examples.adoc +181 -0
- data/docs/_reference/index.adoc +96 -0
- data/docs/_reference/troubleshooting.adoc +862 -0
- data/docs/_tutorials/complex-workflows.adoc +1022 -0
- data/docs/_tutorials/data-processing-pipeline.adoc +740 -0
- data/docs/_tutorials/first-application.adoc +384 -0
- data/docs/_tutorials/index.adoc +48 -0
- data/docs/_tutorials/long-running-services.adoc +931 -0
- data/docs/assets/images/favicon-16.png +0 -0
- data/docs/assets/images/favicon-32.png +0 -0
- data/docs/assets/images/favicon-48.png +0 -0
- data/docs/assets/images/favicon.ico +0 -0
- data/docs/assets/images/favicon.png +0 -0
- data/docs/assets/images/favicon.svg +45 -0
- data/docs/assets/images/fractor-icon.svg +49 -0
- data/docs/assets/images/fractor-logo.svg +61 -0
- data/docs/index.adoc +131 -0
- data/docs/lychee.toml +39 -0
- data/examples/api_aggregator/README.adoc +627 -0
- data/examples/api_aggregator/api_aggregator.rb +376 -0
- data/examples/auto_detection/README.adoc +407 -29
- data/examples/continuous_chat_common/message_protocol.rb +1 -1
- data/examples/error_reporting.rb +207 -0
- data/examples/file_processor/README.adoc +170 -0
- data/examples/file_processor/file_processor.rb +615 -0
- data/examples/file_processor/sample_files/invalid.csv +1 -0
- data/examples/file_processor/sample_files/orders.xml +24 -0
- data/examples/file_processor/sample_files/products.json +23 -0
- data/examples/file_processor/sample_files/users.csv +6 -0
- data/examples/hierarchical_hasher/README.adoc +629 -41
- data/examples/image_processor/README.adoc +610 -0
- data/examples/image_processor/image_processor.rb +349 -0
- data/examples/image_processor/processed_images/sample_10_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_1_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_2_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_3_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_4_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_5_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_6_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_7_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_8_processed.jpg.json +12 -0
- data/examples/image_processor/processed_images/sample_9_processed.jpg.json +12 -0
- data/examples/image_processor/test_images/sample_1.png +1 -0
- data/examples/image_processor/test_images/sample_10.png +1 -0
- data/examples/image_processor/test_images/sample_2.png +1 -0
- data/examples/image_processor/test_images/sample_3.png +1 -0
- data/examples/image_processor/test_images/sample_4.png +1 -0
- data/examples/image_processor/test_images/sample_5.png +1 -0
- data/examples/image_processor/test_images/sample_6.png +1 -0
- data/examples/image_processor/test_images/sample_7.png +1 -0
- data/examples/image_processor/test_images/sample_8.png +1 -0
- data/examples/image_processor/test_images/sample_9.png +1 -0
- data/examples/log_analyzer/README.adoc +662 -0
- data/examples/log_analyzer/log_analyzer.rb +579 -0
- data/examples/log_analyzer/sample_logs/apache.log +20 -0
- data/examples/log_analyzer/sample_logs/json.log +15 -0
- data/examples/log_analyzer/sample_logs/nginx.log +15 -0
- data/examples/log_analyzer/sample_logs/rails.log +29 -0
- data/examples/multi_work_type/README.adoc +576 -26
- data/examples/performance_monitoring.rb +120 -0
- data/examples/pipeline_processing/README.adoc +740 -26
- data/examples/pipeline_processing/pipeline_processing.rb +2 -2
- data/examples/priority_work_example.rb +155 -0
- data/examples/producer_subscriber/README.adoc +889 -46
- data/examples/scatter_gather/README.adoc +829 -27
- data/examples/simple/README.adoc +347 -0
- data/examples/specialized_workers/README.adoc +622 -26
- data/examples/specialized_workers/specialized_workers.rb +44 -8
- data/examples/stream_processor/README.adoc +206 -0
- data/examples/stream_processor/stream_processor.rb +284 -0
- data/examples/web_scraper/README.adoc +625 -0
- data/examples/web_scraper/web_scraper.rb +285 -0
- data/examples/workflow/README.adoc +406 -0
- data/examples/workflow/circuit_breaker/README.adoc +360 -0
- data/examples/workflow/circuit_breaker/circuit_breaker_workflow.rb +225 -0
- data/examples/workflow/conditional/README.adoc +483 -0
- data/examples/workflow/conditional/conditional_workflow.rb +215 -0
- data/examples/workflow/dead_letter_queue/README.adoc +374 -0
- data/examples/workflow/dead_letter_queue/dead_letter_queue_workflow.rb +217 -0
- data/examples/workflow/fan_out/README.adoc +381 -0
- data/examples/workflow/fan_out/fan_out_workflow.rb +202 -0
- data/examples/workflow/retry/README.adoc +248 -0
- data/examples/workflow/retry/retry_workflow.rb +195 -0
- data/examples/workflow/simple_linear/README.adoc +267 -0
- data/examples/workflow/simple_linear/simple_linear_workflow.rb +175 -0
- data/examples/workflow/simplified/README.adoc +329 -0
- data/examples/workflow/simplified/simplified_workflow.rb +222 -0
- data/exe/fractor +10 -0
- data/lib/fractor/cli.rb +288 -0
- data/lib/fractor/configuration.rb +307 -0
- data/lib/fractor/continuous_server.rb +60 -65
- data/lib/fractor/error_formatter.rb +72 -0
- data/lib/fractor/error_report_generator.rb +152 -0
- data/lib/fractor/error_reporter.rb +244 -0
- data/lib/fractor/error_statistics.rb +147 -0
- data/lib/fractor/execution_tracer.rb +162 -0
- data/lib/fractor/logger.rb +230 -0
- data/lib/fractor/main_loop_handler.rb +406 -0
- data/lib/fractor/main_loop_handler3.rb +135 -0
- data/lib/fractor/main_loop_handler4.rb +299 -0
- data/lib/fractor/performance_metrics_collector.rb +181 -0
- data/lib/fractor/performance_monitor.rb +215 -0
- data/lib/fractor/performance_report_generator.rb +202 -0
- data/lib/fractor/priority_work.rb +93 -0
- data/lib/fractor/priority_work_queue.rb +189 -0
- data/lib/fractor/result_aggregator.rb +32 -0
- data/lib/fractor/shutdown_handler.rb +168 -0
- data/lib/fractor/signal_handler.rb +80 -0
- data/lib/fractor/supervisor.rb +382 -269
- data/lib/fractor/supervisor_logger.rb +88 -0
- data/lib/fractor/version.rb +1 -1
- data/lib/fractor/work.rb +12 -0
- data/lib/fractor/work_distribution_manager.rb +151 -0
- data/lib/fractor/work_queue.rb +20 -0
- data/lib/fractor/work_result.rb +181 -9
- data/lib/fractor/worker.rb +73 -0
- data/lib/fractor/workflow/builder.rb +210 -0
- data/lib/fractor/workflow/chain_builder.rb +169 -0
- data/lib/fractor/workflow/circuit_breaker.rb +183 -0
- data/lib/fractor/workflow/circuit_breaker_orchestrator.rb +208 -0
- data/lib/fractor/workflow/circuit_breaker_registry.rb +112 -0
- data/lib/fractor/workflow/dead_letter_queue.rb +334 -0
- data/lib/fractor/workflow/execution_hooks.rb +39 -0
- data/lib/fractor/workflow/execution_strategy.rb +225 -0
- data/lib/fractor/workflow/execution_trace.rb +134 -0
- data/lib/fractor/workflow/helpers.rb +191 -0
- data/lib/fractor/workflow/job.rb +290 -0
- data/lib/fractor/workflow/job_dependency_validator.rb +120 -0
- data/lib/fractor/workflow/logger.rb +110 -0
- data/lib/fractor/workflow/pre_execution_context.rb +193 -0
- data/lib/fractor/workflow/retry_config.rb +156 -0
- data/lib/fractor/workflow/retry_orchestrator.rb +184 -0
- data/lib/fractor/workflow/retry_strategy.rb +93 -0
- data/lib/fractor/workflow/structured_logger.rb +30 -0
- data/lib/fractor/workflow/type_compatibility_validator.rb +222 -0
- data/lib/fractor/workflow/visualizer.rb +211 -0
- data/lib/fractor/workflow/workflow_context.rb +132 -0
- data/lib/fractor/workflow/workflow_executor.rb +669 -0
- data/lib/fractor/workflow/workflow_result.rb +55 -0
- data/lib/fractor/workflow/workflow_validator.rb +295 -0
- data/lib/fractor/workflow.rb +333 -0
- data/lib/fractor/wrapped_ractor.rb +66 -101
- data/lib/fractor/wrapped_ractor3.rb +161 -0
- data/lib/fractor/wrapped_ractor4.rb +242 -0
- data/lib/fractor.rb +92 -4
- metadata +179 -6
- data/tests/sample.rb.bak +0 -309
- data/tests/sample_working.rb.bak +0 -209
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
= Batch File Processor Example
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
Production-ready batch file processor that handles CSV, JSON, and XML files with validation, transformation, retry logic, and dead letter queue (DLQ) support using Fractor.
|
|
6
|
+
|
|
7
|
+
== Purpose
|
|
8
|
+
|
|
9
|
+
This example demonstrates:
|
|
10
|
+
|
|
11
|
+
* Batch processing of multiple file formats (CSV, JSON, XML)
|
|
12
|
+
* Data validation and transformation
|
|
13
|
+
* Dead letter queue for failed files
|
|
14
|
+
* Retry logic for transient failures
|
|
15
|
+
* Progress tracking and reporting
|
|
16
|
+
* Checksum verification
|
|
17
|
+
|
|
18
|
+
== Features
|
|
19
|
+
|
|
20
|
+
=== Multi-Format Support
|
|
21
|
+
|
|
22
|
+
* **CSV**: Headers with data rows
|
|
23
|
+
* **JSON**: Arrays or objects
|
|
24
|
+
* **XML**: Records with elements
|
|
25
|
+
|
|
26
|
+
=== Dead Letter Queue (DLQ)
|
|
27
|
+
|
|
28
|
+
Files that fail validation or parsing are moved to a DLQ for later inspection and retry:
|
|
29
|
+
|
|
30
|
+
* Failed files preserved with error details
|
|
31
|
+
* Inspection of DLQ contents
|
|
32
|
+
* Individual file retry from DLQ
|
|
33
|
+
* Automatic removal on successful retry
|
|
34
|
+
|
|
35
|
+
=== Data Transformation
|
|
36
|
+
|
|
37
|
+
* Type conversion (strings to numbers, booleans)
|
|
38
|
+
* Key normalization (symbol keys)
|
|
39
|
+
* Automatic data enrichment
|
|
40
|
+
|
|
41
|
+
== Usage
|
|
42
|
+
|
|
43
|
+
=== Basic Processing
|
|
44
|
+
|
|
45
|
+
Process all CSV, JSON, and XML files:
|
|
46
|
+
|
|
47
|
+
[source,bash]
|
|
48
|
+
----
|
|
49
|
+
ruby file_processor.rb sample_files/*.{csv,json,xml}
|
|
50
|
+
----
|
|
51
|
+
|
|
52
|
+
=== Custom Workers
|
|
53
|
+
|
|
54
|
+
Process with 8 workers:
|
|
55
|
+
|
|
56
|
+
[source,bash]
|
|
57
|
+
----
|
|
58
|
+
ruby file_processor.rb -w 8 sample_files/*.csv
|
|
59
|
+
----
|
|
60
|
+
|
|
61
|
+
=== Disable Validation
|
|
62
|
+
|
|
63
|
+
Skip validation step:
|
|
64
|
+
|
|
65
|
+
[source,bash]
|
|
66
|
+
----
|
|
67
|
+
ruby file_processor.rb --no-validate sample_files/*.json
|
|
68
|
+
----
|
|
69
|
+
|
|
70
|
+
=== Inspect DLQ
|
|
71
|
+
|
|
72
|
+
View failed files in dead letter queue:
|
|
73
|
+
|
|
74
|
+
[source,bash]
|
|
75
|
+
----
|
|
76
|
+
ruby file_processor.rb --inspect-dlq
|
|
77
|
+
----
|
|
78
|
+
|
|
79
|
+
=== Retry DLQ File
|
|
80
|
+
|
|
81
|
+
Retry a specific file from DLQ:
|
|
82
|
+
|
|
83
|
+
[source,bash]
|
|
84
|
+
----
|
|
85
|
+
ruby file_processor.rb --retry-dlq invalid_dlq.json
|
|
86
|
+
----
|
|
87
|
+
|
|
88
|
+
=== Generate Report
|
|
89
|
+
|
|
90
|
+
Save processing report to file:
|
|
91
|
+
|
|
92
|
+
[source,bash]
|
|
93
|
+
----
|
|
94
|
+
ruby file_processor.rb -o report.txt sample_files/*.csv
|
|
95
|
+
----
|
|
96
|
+
|
|
97
|
+
== Architecture
|
|
98
|
+
|
|
99
|
+
The processor consists of:
|
|
100
|
+
|
|
101
|
+
* **FileWork**: Work item encapsulating file path and options
|
|
102
|
+
* **FileProcessorWorker**: Worker that parses, validates, and transforms files
|
|
103
|
+
* **BatchFileProcessor**: Orchestrates processing and manages DLQ
|
|
104
|
+
* **ProcessingReport**: Generates summary reports
|
|
105
|
+
|
|
106
|
+
== Examples
|
|
107
|
+
|
|
108
|
+
=== Example 1: Successful Processing
|
|
109
|
+
|
|
110
|
+
[source,bash]
|
|
111
|
+
----
|
|
112
|
+
$ ruby file_processor.rb sample_files/users.csv
|
|
113
|
+
|
|
114
|
+
Processing 1 files with 4 workers...
|
|
115
|
+
Validation: enabled
|
|
116
|
+
Transformation: enabled
|
|
117
|
+
|
|
118
|
+
[✓] users.csv: 5 records processed
|
|
119
|
+
|
|
120
|
+
=== Processing Complete ===
|
|
121
|
+
Successful: 1
|
|
122
|
+
Errors: 0
|
|
123
|
+
DLQ: 0
|
|
124
|
+
----
|
|
125
|
+
|
|
126
|
+
=== Example 2: Mixed Results with DLQ
|
|
127
|
+
|
|
128
|
+
[source,bash]
|
|
129
|
+
----
|
|
130
|
+
$ ruby file_processor.rb sample_files/*.csv
|
|
131
|
+
|
|
132
|
+
Processing 2 files with 4 workers...
|
|
133
|
+
|
|
134
|
+
[✓] users.csv: 5 records processed
|
|
135
|
+
[✗] invalid.csv: No records found
|
|
136
|
+
|
|
137
|
+
=== Processing Complete ===
|
|
138
|
+
Successful: 1
|
|
139
|
+
Errors: 1
|
|
140
|
+
DLQ: 1
|
|
141
|
+
----
|
|
142
|
+
|
|
143
|
+
=== Example 3: DLQ Inspection
|
|
144
|
+
|
|
145
|
+
[source,bash]
|
|
146
|
+
----
|
|
147
|
+
$ ruby file_processor.rb --inspect-dlq
|
|
148
|
+
|
|
149
|
+
=== Dead Letter Queue Inspection ===
|
|
150
|
+
|
|
151
|
+
File: invalid.csv
|
|
152
|
+
Error: No records found
|
|
153
|
+
Moved at: 2024-10-25T13:00:00+08:00
|
|
154
|
+
Checksum: abc123...
|
|
155
|
+
----
|
|
156
|
+
|
|
157
|
+
== Testing
|
|
158
|
+
|
|
159
|
+
Run the test suite:
|
|
160
|
+
|
|
161
|
+
[source,bash]
|
|
162
|
+
----
|
|
163
|
+
bundle exec rspec spec/examples/file_processor_spec.rb
|
|
164
|
+
----
|
|
165
|
+
|
|
166
|
+
== See Also
|
|
167
|
+
|
|
168
|
+
* link:../../README.adoc[Fractor Main Documentation]
|
|
169
|
+
* link:../log_analyzer/README.adoc[Log Analyzer Example]
|
|
170
|
+
* link:../api_aggregator/README.adoc[API Aggregator Example]
|