fractor 0.1.4 → 0.1.7

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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop-https---raw-githubusercontent-com-riboseinc-oss-guides-main-ci-rubocop-yml +552 -0
  3. data/.rubocop.yml +14 -8
  4. data/.rubocop_todo.yml +284 -43
  5. data/README.adoc +111 -950
  6. data/docs/.lycheeignore +16 -0
  7. data/docs/Gemfile +24 -0
  8. data/docs/README.md +157 -0
  9. data/docs/_config.yml +151 -0
  10. data/docs/_features/error-handling.adoc +1192 -0
  11. data/docs/_features/index.adoc +80 -0
  12. data/docs/_features/monitoring.adoc +589 -0
  13. data/docs/_features/signal-handling.adoc +202 -0
  14. data/docs/_features/workflows.adoc +1235 -0
  15. data/docs/_guides/continuous-mode.adoc +736 -0
  16. data/docs/_guides/cookbook.adoc +1133 -0
  17. data/docs/_guides/index.adoc +55 -0
  18. data/docs/_guides/pipeline-mode.adoc +730 -0
  19. data/docs/_guides/troubleshooting.adoc +358 -0
  20. data/docs/_pages/architecture.adoc +1390 -0
  21. data/docs/_pages/core-concepts.adoc +1392 -0
  22. data/docs/_pages/design-principles.adoc +862 -0
  23. data/docs/_pages/getting-started.adoc +290 -0
  24. data/docs/_pages/installation.adoc +143 -0
  25. data/docs/_reference/api.adoc +1080 -0
  26. data/docs/_reference/error-reporting.adoc +670 -0
  27. data/docs/_reference/examples.adoc +181 -0
  28. data/docs/_reference/index.adoc +96 -0
  29. data/docs/_reference/troubleshooting.adoc +862 -0
  30. data/docs/_tutorials/complex-workflows.adoc +1022 -0
  31. data/docs/_tutorials/data-processing-pipeline.adoc +740 -0
  32. data/docs/_tutorials/first-application.adoc +384 -0
  33. data/docs/_tutorials/index.adoc +48 -0
  34. data/docs/_tutorials/long-running-services.adoc +931 -0
  35. data/docs/assets/images/favicon-16.png +0 -0
  36. data/docs/assets/images/favicon-32.png +0 -0
  37. data/docs/assets/images/favicon-48.png +0 -0
  38. data/docs/assets/images/favicon.ico +0 -0
  39. data/docs/assets/images/favicon.png +0 -0
  40. data/docs/assets/images/favicon.svg +45 -0
  41. data/docs/assets/images/fractor-icon.svg +49 -0
  42. data/docs/assets/images/fractor-logo.svg +61 -0
  43. data/docs/index.adoc +131 -0
  44. data/docs/lychee.toml +39 -0
  45. data/examples/api_aggregator/README.adoc +627 -0
  46. data/examples/api_aggregator/api_aggregator.rb +376 -0
  47. data/examples/auto_detection/README.adoc +407 -29
  48. data/examples/auto_detection/auto_detection.rb +9 -9
  49. data/examples/continuous_chat_common/message_protocol.rb +53 -0
  50. data/examples/continuous_chat_fractor/README.adoc +217 -0
  51. data/examples/continuous_chat_fractor/chat_client.rb +303 -0
  52. data/examples/continuous_chat_fractor/chat_common.rb +83 -0
  53. data/examples/continuous_chat_fractor/chat_server.rb +167 -0
  54. data/examples/continuous_chat_fractor/simulate.rb +345 -0
  55. data/examples/continuous_chat_server/README.adoc +135 -0
  56. data/examples/continuous_chat_server/chat_client.rb +303 -0
  57. data/examples/continuous_chat_server/chat_server.rb +359 -0
  58. data/examples/continuous_chat_server/simulate.rb +343 -0
  59. data/examples/error_reporting.rb +207 -0
  60. data/examples/file_processor/README.adoc +170 -0
  61. data/examples/file_processor/file_processor.rb +615 -0
  62. data/examples/file_processor/sample_files/invalid.csv +1 -0
  63. data/examples/file_processor/sample_files/orders.xml +24 -0
  64. data/examples/file_processor/sample_files/products.json +23 -0
  65. data/examples/file_processor/sample_files/users.csv +6 -0
  66. data/examples/hierarchical_hasher/README.adoc +629 -41
  67. data/examples/hierarchical_hasher/hierarchical_hasher.rb +12 -8
  68. data/examples/image_processor/README.adoc +610 -0
  69. data/examples/image_processor/image_processor.rb +349 -0
  70. data/examples/image_processor/processed_images/sample_10_processed.jpg.json +12 -0
  71. data/examples/image_processor/processed_images/sample_1_processed.jpg.json +12 -0
  72. data/examples/image_processor/processed_images/sample_2_processed.jpg.json +12 -0
  73. data/examples/image_processor/processed_images/sample_3_processed.jpg.json +12 -0
  74. data/examples/image_processor/processed_images/sample_4_processed.jpg.json +12 -0
  75. data/examples/image_processor/processed_images/sample_5_processed.jpg.json +12 -0
  76. data/examples/image_processor/processed_images/sample_6_processed.jpg.json +12 -0
  77. data/examples/image_processor/processed_images/sample_7_processed.jpg.json +12 -0
  78. data/examples/image_processor/processed_images/sample_8_processed.jpg.json +12 -0
  79. data/examples/image_processor/processed_images/sample_9_processed.jpg.json +12 -0
  80. data/examples/image_processor/test_images/sample_1.png +1 -0
  81. data/examples/image_processor/test_images/sample_10.png +1 -0
  82. data/examples/image_processor/test_images/sample_2.png +1 -0
  83. data/examples/image_processor/test_images/sample_3.png +1 -0
  84. data/examples/image_processor/test_images/sample_4.png +1 -0
  85. data/examples/image_processor/test_images/sample_5.png +1 -0
  86. data/examples/image_processor/test_images/sample_6.png +1 -0
  87. data/examples/image_processor/test_images/sample_7.png +1 -0
  88. data/examples/image_processor/test_images/sample_8.png +1 -0
  89. data/examples/image_processor/test_images/sample_9.png +1 -0
  90. data/examples/log_analyzer/README.adoc +662 -0
  91. data/examples/log_analyzer/log_analyzer.rb +579 -0
  92. data/examples/log_analyzer/sample_logs/apache.log +20 -0
  93. data/examples/log_analyzer/sample_logs/json.log +15 -0
  94. data/examples/log_analyzer/sample_logs/nginx.log +15 -0
  95. data/examples/log_analyzer/sample_logs/rails.log +29 -0
  96. data/examples/multi_work_type/README.adoc +576 -26
  97. data/examples/multi_work_type/multi_work_type.rb +30 -29
  98. data/examples/performance_monitoring.rb +120 -0
  99. data/examples/pipeline_processing/README.adoc +740 -26
  100. data/examples/pipeline_processing/pipeline_processing.rb +16 -16
  101. data/examples/priority_work_example.rb +155 -0
  102. data/examples/producer_subscriber/README.adoc +889 -46
  103. data/examples/producer_subscriber/producer_subscriber.rb +20 -16
  104. data/examples/scatter_gather/README.adoc +829 -27
  105. data/examples/scatter_gather/scatter_gather.rb +29 -28
  106. data/examples/simple/README.adoc +347 -0
  107. data/examples/simple/sample.rb +5 -5
  108. data/examples/specialized_workers/README.adoc +622 -26
  109. data/examples/specialized_workers/specialized_workers.rb +88 -45
  110. data/examples/stream_processor/README.adoc +206 -0
  111. data/examples/stream_processor/stream_processor.rb +284 -0
  112. data/examples/web_scraper/README.adoc +625 -0
  113. data/examples/web_scraper/web_scraper.rb +285 -0
  114. data/examples/workflow/README.adoc +406 -0
  115. data/examples/workflow/circuit_breaker/README.adoc +360 -0
  116. data/examples/workflow/circuit_breaker/circuit_breaker_workflow.rb +225 -0
  117. data/examples/workflow/conditional/README.adoc +483 -0
  118. data/examples/workflow/conditional/conditional_workflow.rb +215 -0
  119. data/examples/workflow/dead_letter_queue/README.adoc +374 -0
  120. data/examples/workflow/dead_letter_queue/dead_letter_queue_workflow.rb +217 -0
  121. data/examples/workflow/fan_out/README.adoc +381 -0
  122. data/examples/workflow/fan_out/fan_out_workflow.rb +202 -0
  123. data/examples/workflow/retry/README.adoc +248 -0
  124. data/examples/workflow/retry/retry_workflow.rb +195 -0
  125. data/examples/workflow/simple_linear/README.adoc +267 -0
  126. data/examples/workflow/simple_linear/simple_linear_workflow.rb +175 -0
  127. data/examples/workflow/simplified/README.adoc +329 -0
  128. data/examples/workflow/simplified/simplified_workflow.rb +222 -0
  129. data/exe/fractor +10 -0
  130. data/lib/fractor/cli.rb +288 -0
  131. data/lib/fractor/configuration.rb +307 -0
  132. data/lib/fractor/continuous_server.rb +183 -0
  133. data/lib/fractor/error_formatter.rb +72 -0
  134. data/lib/fractor/error_report_generator.rb +152 -0
  135. data/lib/fractor/error_reporter.rb +244 -0
  136. data/lib/fractor/error_statistics.rb +147 -0
  137. data/lib/fractor/execution_tracer.rb +162 -0
  138. data/lib/fractor/logger.rb +230 -0
  139. data/lib/fractor/main_loop_handler.rb +406 -0
  140. data/lib/fractor/main_loop_handler3.rb +135 -0
  141. data/lib/fractor/main_loop_handler4.rb +299 -0
  142. data/lib/fractor/performance_metrics_collector.rb +181 -0
  143. data/lib/fractor/performance_monitor.rb +215 -0
  144. data/lib/fractor/performance_report_generator.rb +202 -0
  145. data/lib/fractor/priority_work.rb +93 -0
  146. data/lib/fractor/priority_work_queue.rb +189 -0
  147. data/lib/fractor/result_aggregator.rb +33 -1
  148. data/lib/fractor/shutdown_handler.rb +168 -0
  149. data/lib/fractor/signal_handler.rb +80 -0
  150. data/lib/fractor/supervisor.rb +430 -144
  151. data/lib/fractor/supervisor_logger.rb +88 -0
  152. data/lib/fractor/version.rb +1 -1
  153. data/lib/fractor/work.rb +12 -0
  154. data/lib/fractor/work_distribution_manager.rb +151 -0
  155. data/lib/fractor/work_queue.rb +88 -0
  156. data/lib/fractor/work_result.rb +181 -9
  157. data/lib/fractor/worker.rb +75 -1
  158. data/lib/fractor/workflow/builder.rb +210 -0
  159. data/lib/fractor/workflow/chain_builder.rb +169 -0
  160. data/lib/fractor/workflow/circuit_breaker.rb +183 -0
  161. data/lib/fractor/workflow/circuit_breaker_orchestrator.rb +208 -0
  162. data/lib/fractor/workflow/circuit_breaker_registry.rb +112 -0
  163. data/lib/fractor/workflow/dead_letter_queue.rb +334 -0
  164. data/lib/fractor/workflow/execution_hooks.rb +39 -0
  165. data/lib/fractor/workflow/execution_strategy.rb +225 -0
  166. data/lib/fractor/workflow/execution_trace.rb +134 -0
  167. data/lib/fractor/workflow/helpers.rb +191 -0
  168. data/lib/fractor/workflow/job.rb +290 -0
  169. data/lib/fractor/workflow/job_dependency_validator.rb +120 -0
  170. data/lib/fractor/workflow/logger.rb +110 -0
  171. data/lib/fractor/workflow/pre_execution_context.rb +193 -0
  172. data/lib/fractor/workflow/retry_config.rb +156 -0
  173. data/lib/fractor/workflow/retry_orchestrator.rb +184 -0
  174. data/lib/fractor/workflow/retry_strategy.rb +93 -0
  175. data/lib/fractor/workflow/structured_logger.rb +30 -0
  176. data/lib/fractor/workflow/type_compatibility_validator.rb +222 -0
  177. data/lib/fractor/workflow/visualizer.rb +211 -0
  178. data/lib/fractor/workflow/workflow_context.rb +132 -0
  179. data/lib/fractor/workflow/workflow_executor.rb +669 -0
  180. data/lib/fractor/workflow/workflow_result.rb +55 -0
  181. data/lib/fractor/workflow/workflow_validator.rb +295 -0
  182. data/lib/fractor/workflow.rb +333 -0
  183. data/lib/fractor/wrapped_ractor.rb +66 -91
  184. data/lib/fractor/wrapped_ractor3.rb +161 -0
  185. data/lib/fractor/wrapped_ractor4.rb +242 -0
  186. data/lib/fractor.rb +93 -3
  187. metadata +192 -6
  188. data/tests/sample.rb.bak +0 -309
  189. data/tests/sample_working.rb.bak +0 -209
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,45 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48">
2
+ <!-- Simplified icon for favicon -->
3
+ <rect width="48" height="48" fill="white"/>
4
+
5
+ <!-- Define gradients -->
6
+ <defs>
7
+ <linearGradient id="g1" x1="0%" y1="0%" x2="100%" y2="0%">
8
+ <stop offset="0%" style="stop-color:#CC342D;stop-opacity:1" />
9
+ <stop offset="100%" style="stop-color:#E74C3C;stop-opacity:1" />
10
+ </linearGradient>
11
+ <linearGradient id="g2" x1="0%" y1="0%" x2="100%" y2="0%">
12
+ <stop offset="0%" style="stop-color:#E67E22;stop-opacity:1" />
13
+ <stop offset="100%" style="stop-color:#F39C12;stop-opacity:1" />
14
+ </linearGradient>
15
+ <linearGradient id="g3" x1="0%" y1="0%" x2="100%" y2="0%">
16
+ <stop offset="0%" style="stop-color:#C0392B;stop-opacity:1" />
17
+ <stop offset="100%" style="stop-color:#E74C3C;stop-opacity:1" />
18
+ </linearGradient>
19
+ </defs>
20
+
21
+ <!-- Simplified parallel paths -->
22
+ <path d="M 8 12 L 16 12 L 18 14 L 28 14 L 30 12 L 40 12"
23
+ stroke="url(#g1)" stroke-width="2.5" fill="none" stroke-linecap="round"/>
24
+ <circle cx="8" cy="12" r="2" fill="#CC342D"/>
25
+ <circle cx="40" cy="12" r="2" fill="#E74C3C"/>
26
+
27
+ <path d="M 8 24 L 15 24 L 17 22 L 29 22 L 31 24 L 40 24"
28
+ stroke="url(#g2)" stroke-width="2.5" fill="none" stroke-linecap="round"/>
29
+ <circle cx="8" cy="24" r="2" fill="#E67E22"/>
30
+ <circle cx="40" cy="24" r="2" fill="#F39C12"/>
31
+
32
+ <path d="M 8 36 L 16 36 L 18 34 L 28 34 L 30 36 L 40 36"
33
+ stroke="url(#g3)" stroke-width="2.5" fill="none" stroke-linecap="round"/>
34
+ <circle cx="8" cy="36" r="2" fill="#C0392B"/>
35
+ <circle cx="40" cy="36" r="2" fill="#E74C3C"/>
36
+
37
+ <!-- Connection points -->
38
+ <line x1="24" y1="14" x2="24" y2="22" stroke="#CC342D" stroke-width="1.5" opacity="0.5"/>
39
+ <line x1="24" y1="24" x2="24" y2="34" stroke="#E67E22" stroke-width="1.5" opacity="0.5"/>
40
+
41
+ <!-- Arrows -->
42
+ <polygon points="38,11 40,12 38,13" fill="#E74C3C"/>
43
+ <polygon points="38,23 40,24 38,25" fill="#F39C12"/>
44
+ <polygon points="38,35 40,36 38,37" fill="#E74C3C"/>
45
+ </svg>
@@ -0,0 +1,49 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" width="80" height="80">
2
+ <!-- Define gradients -->
3
+ <defs>
4
+ <linearGradient id="gradient1" x1="0%" y1="0%" x2="100%" y2="0%">
5
+ <stop offset="0%" style="stop-color:#CC342D;stop-opacity:1" />
6
+ <stop offset="100%" style="stop-color:#E74C3C;stop-opacity:1" />
7
+ </linearGradient>
8
+ <linearGradient id="gradient2" x1="0%" y1="0%" x2="100%" y2="0%">
9
+ <stop offset="0%" style="stop-color:#E67E22;stop-opacity:1" />
10
+ <stop offset="100%" style="stop-color:#F39C12;stop-opacity:1" />
11
+ </linearGradient>
12
+ <linearGradient id="gradient3" x1="0%" y1="0%" x2="100%" y2="0%">
13
+ <stop offset="0%" style="stop-color:#C0392B;stop-opacity:1" />
14
+ <stop offset="100%" style="stop-color:#E74C3C;stop-opacity:1" />
15
+ </linearGradient>
16
+ </defs>
17
+
18
+ <!-- Icon - Parallel flow paths representing Ractors -->
19
+ <g id="icon">
20
+ <!-- Top path -->
21
+ <path d="M 10 15 L 30 15 L 35 20 L 50 20 L 55 15 L 70 15"
22
+ stroke="url(#gradient1)" stroke-width="3" fill="none" stroke-linecap="round"/>
23
+ <circle cx="10" cy="15" r="3" fill="#CC342D"/>
24
+ <circle cx="70" cy="15" r="3" fill="#E74C3C"/>
25
+
26
+ <!-- Middle path -->
27
+ <path d="M 10 40 L 25 40 L 30 35 L 45 35 L 50 40 L 70 40"
28
+ stroke="url(#gradient2)" stroke-width="3" fill="none" stroke-linecap="round"/>
29
+ <circle cx="10" cy="40" r="3" fill="#E67E22"/>
30
+ <circle cx="70" cy="40" r="3" fill="#F39C12"/>
31
+
32
+ <!-- Bottom path -->
33
+ <path d="M 10 65 L 30 65 L 35 60 L 50 60 L 55 65 L 70 65"
34
+ stroke="url(#gradient3)" stroke-width="3" fill="none" stroke-linecap="round"/>
35
+ <circle cx="10" cy="65" r="3" fill="#C0392B"/>
36
+ <circle cx="70" cy="65" r="3" fill="#E74C3C"/>
37
+
38
+ <!-- Connection points (representing Ractor communication) -->
39
+ <line x1="40" y1="20" x2="40" y2="35" stroke="#CC342D" stroke-width="1.5" opacity="0.6"/>
40
+ <line x1="40" y1="40" x2="40" y2="60" stroke="#E67E22" stroke-width="1.5" opacity="0.6"/>
41
+ <circle cx="40" cy="27.5" r="2" fill="#CC342D" opacity="0.7"/>
42
+ <circle cx="40" cy="50" r="2" fill="#E67E22" opacity="0.7"/>
43
+
44
+ <!-- Arrow indicators -->
45
+ <polygon points="67,13 70,15 67,17" fill="#E74C3C"/>
46
+ <polygon points="67,38 70,40 67,42" fill="#F39C12"/>
47
+ <polygon points="67,63 70,65 67,67" fill="#E74C3C"/>
48
+ </g>
49
+ </svg>
@@ -0,0 +1,61 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 80" width="300" height="80">
2
+ <!-- Background (optional, can be removed for transparency) -->
3
+
4
+ <!-- Define gradients -->
5
+ <defs>
6
+ <linearGradient id="gradient1" x1="0%" y1="0%" x2="100%" y2="0%">
7
+ <stop offset="0%" style="stop-color:#CC342D;stop-opacity:1" />
8
+ <stop offset="100%" style="stop-color:#E74C3C;stop-opacity:1" />
9
+ </linearGradient>
10
+ <linearGradient id="gradient2" x1="0%" y1="0%" x2="100%" y2="0%">
11
+ <stop offset="0%" style="stop-color:#E67E22;stop-opacity:1" />
12
+ <stop offset="100%" style="stop-color:#F39C12;stop-opacity:1" />
13
+ </linearGradient>
14
+ <linearGradient id="gradient3" x1="0%" y1="0%" x2="100%" y2="0%">
15
+ <stop offset="0%" style="stop-color:#C0392B;stop-opacity:1" />
16
+ <stop offset="100%" style="stop-color:#E74C3C;stop-opacity:1" />
17
+ </linearGradient>
18
+ </defs>
19
+
20
+ <!-- Icon part (left side) - Parallel flow paths representing Ractors -->
21
+ <g id="icon">
22
+ <!-- Top path -->
23
+ <path d="M 10 15 L 30 15 L 35 20 L 50 20 L 55 15 L 70 15"
24
+ stroke="url(#gradient1)" stroke-width="3" fill="none" stroke-linecap="round"/>
25
+ <circle cx="10" cy="15" r="3" fill="#CC342D"/>
26
+ <circle cx="70" cy="15" r="3" fill="#E74C3C"/>
27
+
28
+ <!-- Middle path -->
29
+ <path d="M 10 40 L 25 40 L 30 35 L 45 35 L 50 40 L 70 40"
30
+ stroke="url(#gradient2)" stroke-width="3" fill="none" stroke-linecap="round"/>
31
+ <circle cx="10" cy="40" r="3" fill="#E67E22"/>
32
+ <circle cx="70" cy="40" r="3" fill="#F39C12"/>
33
+
34
+ <!-- Bottom path -->
35
+ <path d="M 10 65 L 30 65 L 35 60 L 50 60 L 55 65 L 70 65"
36
+ stroke="url(#gradient3)" stroke-width="3" fill="none" stroke-linecap="round"/>
37
+ <circle cx="10" cy="65" r="3" fill="#C0392B"/>
38
+ <circle cx="70" cy="65" r="3" fill="#E74C3C"/>
39
+
40
+ <!-- Connection points (representing Ractor communication) -->
41
+ <line x1="40" y1="20" x2="40" y2="35" stroke="#CC342D" stroke-width="1.5" opacity="0.6"/>
42
+ <line x1="40" y1="40" x2="40" y2="60" stroke="#E67E22" stroke-width="1.5" opacity="0.6"/>
43
+ <circle cx="40" cy="27.5" r="2" fill="#CC342D" opacity="0.7"/>
44
+ <circle cx="40" cy="50" r="2" fill="#E67E22" opacity="0.7"/>
45
+
46
+ <!-- Arrow indicators -->
47
+ <polygon points="67,13 70,15 67,17" fill="#E74C3C"/>
48
+ <polygon points="67,38 70,40 67,42" fill="#F39C12"/>
49
+ <polygon points="67,63 70,65 67,67" fill="#E74C3C"/>
50
+ </g>
51
+
52
+ <!-- Text part (right side) -->
53
+ <g id="text">
54
+ <text x="85" y="48" font-family="Arial, Helvetica, sans-serif" font-size="32" font-weight="bold" fill="#2C3E50">
55
+ Fractor
56
+ </text>
57
+ <text x="85" y="63" font-family="Arial, Helvetica, sans-serif" font-size="9" fill="#7F8C8D" letter-spacing="1">
58
+ PARALLEL WORKFLOW ENGINE
59
+ </text>
60
+ </g>
61
+ </svg>
data/docs/index.adoc ADDED
@@ -0,0 +1,131 @@
1
+ ---
2
+ layout: home
3
+ title: Home
4
+ nav_order: 1
5
+ description: "Fractor - Parallel processing framework for Ruby using Ractors"
6
+ permalink: /
7
+ ---
8
+
9
+ ++++
10
+ <div style="text-align: center; margin: 2em 0;">
11
+ <img src="/fractor/assets/images/fractor-logo.svg" alt="Fractor Logo" style="max-width: 400px; width: 100%;">
12
+ </div>
13
+ ++++
14
+
15
+ == Fractor Documentation
16
+
17
+ Fractor is a powerful parallel processing framework for Ruby that leverages Ractors to provide true concurrent execution without the Global Interpreter Lock (GIL) limitations.
18
+
19
+ ---
20
+
21
+ == What's New
22
+
23
+ === Recent Updates
24
+
25
+ * ✨ **Enhanced Workflow System**: Added support for circuit breakers, retry strategies, and dead letter queues
26
+ * 📊 **Performance Monitoring**: New performance monitoring capabilities with Prometheus and JSON export support
27
+ * 🔄 **Improved Error Handling**: Rich error categorization with automatic retry logic for transient failures
28
+ * 📚 **Comprehensive Documentation**: Complete tutorials, guides, and reference documentation with 18+ real-world examples
29
+ * 🛠️ **Production Ready**: Battle-tested patterns for continuous mode, signal handling, and graceful shutdown
30
+ * 🎯 **Workflow Visualizer**: Built-in tools for visualizing complex workflow graphs and execution traces
31
+
32
+ ---
33
+
34
+ == Quick Start
35
+
36
+ Get started with Fractor in minutes:
37
+
38
+ [source,ruby]
39
+ ----
40
+ require 'fractor'
41
+
42
+ class MyWork < Fractor::Work
43
+ def initialize(value)
44
+ super({ value: value })
45
+ end
46
+ end
47
+
48
+ class MyWorker < Fractor::Worker
49
+ def process(work)
50
+ result = work.input[:value] * 2
51
+ Fractor::WorkResult.new(result: result, work: work)
52
+ end
53
+ end
54
+
55
+ supervisor = Fractor::Supervisor.new(
56
+ worker_pools: [{ worker_class: MyWorker }]
57
+ )
58
+
59
+ supervisor.add_work_items([MyWork.new(1), MyWork.new(2), MyWork.new(3)])
60
+ supervisor.run
61
+
62
+ puts supervisor.results.results.map(&:result)
63
+ # => [2, 4, 6]
64
+ ----
65
+
66
+ ---
67
+
68
+ == Learning Path
69
+
70
+ === 🎯 Beginner - Get Started
71
+
72
+ New to Fractor? Start here to learn the fundamentals.
73
+
74
+ * link:tutorials/installation/[Installation] - Set up Fractor in your environment
75
+ * link:tutorials/first-application/[Your First Application] - Build your first parallel processor
76
+ * link:tutorials/getting-started/[Getting Started Guide] - Understand modes and basic patterns
77
+
78
+ === 📚 Intermediate - Core Concepts
79
+
80
+ Ready to build real applications? Dive into core features.
81
+
82
+ * link:core-concepts/[Core Concepts] - Components, data flow, and concurrency model
83
+ * link:architecture/[Architecture Guide] - System design and implementation details
84
+ * link:design-principles/[Design Principles] - Philosophy and design decisions
85
+ * link:guides/pipeline-mode/[Pipeline Mode] - Batch processing patterns
86
+ * link:guides/continuous-mode/[Continuous Mode] - Long-running server applications
87
+ * link:features/workflows/[Workflows] - Complex processing graphs
88
+ * link:features/error-handling/[Error Handling] - Robust error management
89
+ * link:features/signal-handling/[Signal Handling] - Graceful shutdown patterns
90
+
91
+ === 🚀 Advanced - Deep Dive
92
+
93
+ Master advanced patterns and optimization techniques.
94
+
95
+ * link:reference/api/[API Reference] - Complete API documentation
96
+ * link:reference/patterns/[Design Patterns] - Real-world examples and patterns
97
+ * link:reference/performance/[Performance Tuning] - Optimization strategies
98
+ * link:reference/best-practices/[Best Practices] - Production deployment guide
99
+
100
+ ---
101
+
102
+ == Key Features
103
+
104
+ * *True Parallelism*: Leverages Ruby 3.0+ Ractors for concurrent execution without GIL
105
+ * *Two Modes*: Pipeline mode for batch jobs, Continuous mode for servers
106
+ * *Worker Pools*: Multiple specialized worker types with automatic scaling
107
+ * *Rich Error Handling*: Categorized errors with retry logic and context
108
+ * *Workflow Engine*: Build complex processing graphs with retry, circuit breakers, and more
109
+ * *Signal Handling*: Graceful shutdown with SIGINT, SIGTERM support
110
+ * *Production Ready*: Performance monitoring, error reporting, and dead letter queues
111
+
112
+ ---
113
+
114
+ == System Requirements
115
+
116
+ * Ruby 3.0 or later (Ractor support required)
117
+ * Multi-core CPU (for true parallel execution)
118
+
119
+ ---
120
+
121
+ == Community
122
+
123
+ * https://github.com/metanorma/fractor[GitHub Repository]
124
+ * https://github.com/metanorma/fractor/issues[Issue Tracker]
125
+ * https://github.com/metanorma/fractor/discussions[Discussions]
126
+
127
+ ---
128
+
129
+ == License
130
+
131
+ Fractor is distributed under the link:../LICENSE[MIT License].
data/docs/lychee.toml ADDED
@@ -0,0 +1,39 @@
1
+ # Lychee link checker configuration
2
+
3
+ # Cache results to avoid re-checking
4
+ cache = true
5
+
6
+ # Maximum number of concurrent requests
7
+ max_concurrency = 10
8
+
9
+ # Accept 200-299 status codes
10
+ accept = [200, 201, 202, 203, 204, 205, 206, 207, 208, 226]
11
+
12
+ # Timeout for requests (seconds)
13
+ timeout = 30
14
+
15
+ # Retry failed links
16
+ max_retries = 3
17
+
18
+ # User agent string
19
+ user_agent = "Mozilla/5.0 (compatible; Lychee/0.x; +https://github.com/lycheeverse/lychee)"
20
+
21
+ # Exclude path patterns (file/directory paths to skip)
22
+ exclude_path = [
23
+ "vendor",
24
+ "node_modules",
25
+ ".jekyll-cache",
26
+ "_site"
27
+ ]
28
+
29
+ # Check external links
30
+ include_external = true
31
+
32
+ # Follow redirects
33
+ max_redirects = 10
34
+
35
+ # Check fragments (anchors)
36
+ check_fragments = true
37
+
38
+ # Base URL for checking local links
39
+ base_url = "https://metanorma.github.io/fractor"