smart_message 0.0.10 → 0.0.12

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/deploy-github-pages.yml +38 -0
  3. data/.gitignore +5 -0
  4. data/CHANGELOG.md +30 -0
  5. data/Gemfile.lock +35 -4
  6. data/README.md +169 -71
  7. data/Rakefile +29 -4
  8. data/docs/assets/images/ddq_architecture.svg +130 -0
  9. data/docs/assets/images/dlq_architecture.svg +115 -0
  10. data/docs/assets/images/enhanced-dual-publishing.svg +136 -0
  11. data/docs/assets/images/enhanced-fluent-api.svg +149 -0
  12. data/docs/assets/images/enhanced-microservices-routing.svg +115 -0
  13. data/docs/assets/images/enhanced-pattern-matching.svg +107 -0
  14. data/docs/assets/images/fluent-api-demo.svg +59 -0
  15. data/docs/assets/images/performance-comparison.svg +161 -0
  16. data/docs/assets/images/redis-basic-architecture.svg +53 -0
  17. data/docs/assets/images/redis-enhanced-architecture.svg +88 -0
  18. data/docs/assets/images/redis-queue-architecture.svg +101 -0
  19. data/docs/assets/images/smart_message.jpg +0 -0
  20. data/docs/assets/images/smart_message_walking.jpg +0 -0
  21. data/docs/assets/images/smartmessage_architecture_overview.svg +173 -0
  22. data/docs/assets/images/transport-comparison-matrix.svg +171 -0
  23. data/docs/assets/javascripts/mathjax.js +17 -0
  24. data/docs/assets/stylesheets/extra.css +51 -0
  25. data/docs/{addressing.md → core-concepts/addressing.md} +5 -7
  26. data/docs/{architecture.md → core-concepts/architecture.md} +78 -138
  27. data/docs/{dispatcher.md → core-concepts/dispatcher.md} +21 -21
  28. data/docs/{message_filtering.md → core-concepts/message-filtering.md} +2 -3
  29. data/docs/{message_processing.md → core-concepts/message-processing.md} +17 -17
  30. data/docs/{troubleshooting.md → development/troubleshooting.md} +7 -7
  31. data/docs/{examples.md → getting-started/examples.md} +115 -89
  32. data/docs/{getting-started.md → getting-started/quick-start.md} +47 -18
  33. data/docs/guides/redis-queue-getting-started.md +697 -0
  34. data/docs/guides/redis-queue-patterns.md +889 -0
  35. data/docs/guides/redis-queue-production.md +1091 -0
  36. data/docs/index.md +64 -0
  37. data/docs/{dead_letter_queue.md → reference/dead-letter-queue.md} +2 -3
  38. data/docs/{logging.md → reference/logging.md} +1 -1
  39. data/docs/{message_deduplication.md → reference/message-deduplication.md} +1 -0
  40. data/docs/{proc_handlers_summary.md → reference/proc-handlers.md} +7 -6
  41. data/docs/{serializers.md → reference/serializers.md} +3 -5
  42. data/docs/{transports.md → reference/transports.md} +133 -11
  43. data/docs/transports/memory-transport.md +374 -0
  44. data/docs/transports/redis-enhanced-transport.md +524 -0
  45. data/docs/transports/redis-queue-transport.md +1304 -0
  46. data/docs/transports/redis-transport-comparison.md +496 -0
  47. data/docs/transports/redis-transport.md +509 -0
  48. data/examples/README.md +98 -5
  49. data/examples/city_scenario/911_emergency_call_flow.svg +99 -0
  50. data/examples/city_scenario/README.md +515 -0
  51. data/examples/city_scenario/ai_visitor_intelligence_flow.svg +108 -0
  52. data/examples/city_scenario/citizen.rb +195 -0
  53. data/examples/city_scenario/city_diagram.svg +125 -0
  54. data/examples/city_scenario/common/health_monitor.rb +80 -0
  55. data/examples/city_scenario/common/logger.rb +30 -0
  56. data/examples/city_scenario/emergency_dispatch_center.rb +270 -0
  57. data/examples/city_scenario/fire_department.rb +446 -0
  58. data/examples/city_scenario/fire_emergency_flow.svg +95 -0
  59. data/examples/city_scenario/health_department.rb +100 -0
  60. data/examples/city_scenario/health_monitoring_system.svg +130 -0
  61. data/examples/city_scenario/house.rb +244 -0
  62. data/examples/city_scenario/local_bank.rb +217 -0
  63. data/examples/city_scenario/messages/emergency_911_message.rb +81 -0
  64. data/examples/city_scenario/messages/emergency_resolved_message.rb +43 -0
  65. data/examples/city_scenario/messages/fire_dispatch_message.rb +43 -0
  66. data/examples/city_scenario/messages/fire_emergency_message.rb +45 -0
  67. data/examples/city_scenario/messages/health_check_message.rb +22 -0
  68. data/examples/city_scenario/messages/health_status_message.rb +35 -0
  69. data/examples/city_scenario/messages/police_dispatch_message.rb +46 -0
  70. data/examples/city_scenario/messages/silent_alarm_message.rb +38 -0
  71. data/examples/city_scenario/police_department.rb +316 -0
  72. data/examples/city_scenario/redis_monitor.rb +129 -0
  73. data/examples/city_scenario/redis_stats.rb +743 -0
  74. data/examples/city_scenario/room_for_improvement.md +240 -0
  75. data/examples/city_scenario/security_emergency_flow.svg +95 -0
  76. data/examples/city_scenario/service_internal_architecture.svg +154 -0
  77. data/examples/city_scenario/smart_message_ai_agent.rb +364 -0
  78. data/examples/city_scenario/start_demo.sh +236 -0
  79. data/examples/city_scenario/stop_demo.sh +106 -0
  80. data/examples/city_scenario/visitor.rb +631 -0
  81. data/examples/{10_message_deduplication.rb → memory/01_message_deduplication_demo.rb} +1 -1
  82. data/examples/{09_dead_letter_queue_demo.rb → memory/02_dead_letter_queue_demo.rb} +13 -40
  83. data/examples/{01_point_to_point_orders.rb → memory/03_point_to_point_orders.rb} +1 -1
  84. data/examples/{02_publish_subscribe_events.rb → memory/04_publish_subscribe_events.rb} +2 -2
  85. data/examples/{03_many_to_many_chat.rb → memory/05_many_to_many_chat.rb} +4 -4
  86. data/examples/{show_me.rb → memory/06_pretty_print_demo.rb} +1 -1
  87. data/examples/{05_proc_handlers.rb → memory/07_proc_handlers_demo.rb} +2 -2
  88. data/examples/{06_custom_logger_example.rb → memory/08_custom_logger_demo.rb} +17 -14
  89. data/examples/{07_error_handling_scenarios.rb → memory/09_error_handling_demo.rb} +4 -4
  90. data/examples/{08_entity_addressing_basic.rb → memory/10_entity_addressing_basic.rb} +8 -8
  91. data/examples/{08_entity_addressing_with_filtering.rb → memory/11_entity_addressing_with_filtering.rb} +6 -6
  92. data/examples/{09_regex_filtering_microservices.rb → memory/12_regex_filtering_microservices.rb} +2 -2
  93. data/examples/{10_header_block_configuration.rb → memory/13_header_block_configuration.rb} +6 -6
  94. data/examples/{11_global_configuration_example.rb → memory/14_global_configuration_demo.rb} +19 -8
  95. data/examples/{show_logger.rb → memory/15_logger_demo.rb} +1 -1
  96. data/examples/memory/README.md +163 -0
  97. data/examples/memory/memory_transport_architecture.svg +90 -0
  98. data/examples/memory/point_to_point_pattern.svg +94 -0
  99. data/examples/memory/publish_subscribe_pattern.svg +125 -0
  100. data/examples/{04_redis_smart_home_iot.rb → redis/01_smart_home_iot_demo.rb} +5 -5
  101. data/examples/redis/README.md +230 -0
  102. data/examples/redis/alert_system_flow.svg +127 -0
  103. data/examples/redis/dashboard_status_flow.svg +107 -0
  104. data/examples/redis/device_command_flow.svg +113 -0
  105. data/examples/redis/redis_transport_architecture.svg +115 -0
  106. data/examples/{smart_home_iot_dataflow.md → redis/smart_home_iot_dataflow.md} +4 -116
  107. data/examples/redis/smart_home_system_architecture.svg +133 -0
  108. data/examples/redis_enhanced/README.md +319 -0
  109. data/examples/redis_enhanced/enhanced_01_basic_patterns.rb +233 -0
  110. data/examples/redis_enhanced/enhanced_02_fluent_api.rb +331 -0
  111. data/examples/redis_enhanced/enhanced_03_dual_publishing.rb +281 -0
  112. data/examples/redis_enhanced/enhanced_04_advanced_routing.rb +419 -0
  113. data/examples/redis_queue/01_basic_messaging.rb +221 -0
  114. data/examples/redis_queue/01_comprehensive_examples.rb +508 -0
  115. data/examples/redis_queue/02_pattern_routing.rb +405 -0
  116. data/examples/redis_queue/03_fluent_api.rb +422 -0
  117. data/examples/redis_queue/04_load_balancing.rb +486 -0
  118. data/examples/redis_queue/05_microservices.rb +735 -0
  119. data/examples/redis_queue/06_emergency_alerts.rb +777 -0
  120. data/examples/redis_queue/07_queue_management.rb +587 -0
  121. data/examples/redis_queue/README.md +366 -0
  122. data/examples/redis_queue/enhanced_01_basic_patterns.rb +233 -0
  123. data/examples/redis_queue/enhanced_02_fluent_api.rb +331 -0
  124. data/examples/redis_queue/enhanced_03_dual_publishing.rb +281 -0
  125. data/examples/redis_queue/enhanced_04_advanced_routing.rb +419 -0
  126. data/examples/redis_queue/redis_queue_architecture.svg +148 -0
  127. data/ideas/README.md +41 -0
  128. data/ideas/agents.md +1001 -0
  129. data/ideas/database_transport.md +980 -0
  130. data/ideas/improvement.md +359 -0
  131. data/ideas/meshage.md +1788 -0
  132. data/ideas/message_discovery.md +178 -0
  133. data/ideas/message_schema.md +1381 -0
  134. data/lib/smart_message/.idea/.gitignore +8 -0
  135. data/lib/smart_message/.idea/markdown.xml +6 -0
  136. data/lib/smart_message/.idea/misc.xml +4 -0
  137. data/lib/smart_message/.idea/modules.xml +8 -0
  138. data/lib/smart_message/.idea/smart_message.iml +16 -0
  139. data/lib/smart_message/.idea/vcs.xml +6 -0
  140. data/lib/smart_message/addressing.rb +15 -0
  141. data/lib/smart_message/base.rb +0 -2
  142. data/lib/smart_message/configuration.rb +1 -1
  143. data/lib/smart_message/logger.rb +15 -4
  144. data/lib/smart_message/plugins.rb +5 -2
  145. data/lib/smart_message/serializer.rb +14 -0
  146. data/lib/smart_message/transport/redis_enhanced_transport.rb +399 -0
  147. data/lib/smart_message/transport/redis_queue_transport.rb +555 -0
  148. data/lib/smart_message/transport/registry.rb +1 -0
  149. data/lib/smart_message/transport.rb +34 -1
  150. data/lib/smart_message/version.rb +1 -1
  151. data/lib/smart_message.rb +5 -52
  152. data/mkdocs.yml +184 -0
  153. data/p2p_plan.md +326 -0
  154. data/p2p_roadmap.md +287 -0
  155. data/smart_message.gemspec +2 -0
  156. data/smart_message.svg +51 -0
  157. metadata +170 -44
  158. data/docs/README.md +0 -57
  159. data/examples/dead_letters.jsonl +0 -12
  160. data/examples/temp.txt +0 -94
  161. data/examples/tmux_chat/README.md +0 -283
  162. data/examples/tmux_chat/bot_agent.rb +0 -278
  163. data/examples/tmux_chat/human_agent.rb +0 -199
  164. data/examples/tmux_chat/room_monitor.rb +0 -160
  165. data/examples/tmux_chat/shared_chat_system.rb +0 -328
  166. data/examples/tmux_chat/start_chat_demo.sh +0 -190
  167. data/examples/tmux_chat/stop_chat_demo.sh +0 -22
  168. /data/docs/{properties.md → core-concepts/properties.md} +0 -0
  169. /data/docs/{ideas_to_think_about.md → development/ideas.md} +0 -0
@@ -11,7 +11,7 @@
11
11
  # - Administrative functions
12
12
  # - Monitoring and statistics
13
13
 
14
- require_relative '../lib/smart_message'
14
+ require_relative '../../lib/smart_message'
15
15
  require 'json'
16
16
  require 'fileutils'
17
17
 
@@ -45,7 +45,7 @@ class PaymentMessage < SmartMessage::Base
45
45
 
46
46
  config do
47
47
  transport SmartMessage::Transport.create(:memory)
48
- serializer SmartMessage::Serializer::JSON.new
48
+ serializer SmartMessage::Serializer::Json.new
49
49
  end
50
50
 
51
51
  def self.process(wrapper)
@@ -68,7 +68,7 @@ class OrderMessage < SmartMessage::Base
68
68
 
69
69
  config do
70
70
  transport SmartMessage::Transport.create(:memory)
71
- serializer SmartMessage::Serializer::JSON.new
71
+ serializer SmartMessage::Serializer::Json.new
72
72
  end
73
73
 
74
74
  def self.process(wrapper)
@@ -90,7 +90,7 @@ class NotificationMessage < SmartMessage::Base
90
90
 
91
91
  config do
92
92
  transport SmartMessage::Transport.create(:memory)
93
- serializer SmartMessage::Serializer::JSON.new
93
+ serializer SmartMessage::Serializer::Json.new
94
94
  end
95
95
 
96
96
  def self.process(wrapper)
@@ -193,12 +193,8 @@ rescue => e
193
193
  puts "❌ Validation failed: #{e.message}"
194
194
 
195
195
  # Manually add to DLQ
196
- wrapper = SmartMessage::Wrapper::Base.new(
197
- header: payment._sm_header,
198
- payload: payment.encode
199
- )
200
196
  dlq.enqueue(
201
- wrapper,
197
+ payment,
202
198
  error: e.message,
203
199
  transport: "ValidationLayer",
204
200
  retry_count: 0
@@ -236,12 +232,8 @@ rescue => e
236
232
  puts "❌ Publish failed: #{e.message}"
237
233
 
238
234
  # Circuit breaker would normally handle this, but we'll add manually for demo
239
- wrapper = SmartMessage::Wrapper::Base.new(
240
- header: payment._sm_header,
241
- payload: payment.encode
242
- )
243
235
  dlq.enqueue(
244
- wrapper,
236
+ payment,
245
237
  error: e.message,
246
238
  transport: failing_transport.class.name,
247
239
  retry_count: 1
@@ -263,12 +255,8 @@ order = OrderMessage.new(
263
255
  total: 99.99
264
256
  )
265
257
 
266
- wrapper = SmartMessage::Wrapper::Base.new(
267
- header: order._sm_header,
268
- payload: order.encode
269
- )
270
258
  dlq.enqueue(
271
- wrapper,
259
+ order,
272
260
  error: "Gateway timeout after 30 seconds",
273
261
  transport: "Redis",
274
262
  retry_count: 3
@@ -282,12 +270,8 @@ notification = NotificationMessage.new(
282
270
  channel: "sms"
283
271
  )
284
272
 
285
- wrapper = SmartMessage::Wrapper::Base.new(
286
- header: notification._sm_header,
287
- payload: notification.encode
288
- )
289
273
  dlq.enqueue(
290
- wrapper,
274
+ notification,
291
275
  error: "Rate limit exceeded: 429 Too Many Requests",
292
276
  transport: "SMSGateway",
293
277
  retry_count: 1
@@ -301,12 +285,8 @@ payment3 = PaymentMessage.new(
301
285
  customer_id: "CUST-789"
302
286
  )
303
287
 
304
- wrapper = SmartMessage::Wrapper::Base.new(
305
- header: payment3._sm_header,
306
- payload: payment3.encode
307
- )
308
288
  dlq.enqueue(
309
- wrapper,
289
+ payment3,
310
290
  error: "Invalid merchant credentials",
311
291
  transport: "StripeGateway",
312
292
  retry_count: 0
@@ -461,17 +441,10 @@ temp_messages = []
461
441
  puts " #{i + 1}. #{msg[:header][:message_class]} - #{msg[:timestamp]}"
462
442
  end
463
443
 
464
- # Put them back for other demos
465
- temp_messages.each do |msg|
466
- header = SmartMessage::Header.new(msg[:header])
467
- wrapper = SmartMessage::Wrapper::Base.new(
468
- header: header,
469
- payload: msg[:payload]
470
- )
471
- dlq.enqueue(wrapper,
472
- error: msg[:error],
473
- retry_count: msg[:retry_count])
474
- end
444
+ # Note: For demo purposes, we dequeued messages to show FIFO order.
445
+ # In a real application, you would typically replay them instead of manually re-enqueuing.
446
+ puts "\n📝 Messages were dequeued to demonstrate FIFO order."
447
+ puts " In production, use dlq.replay_batch() to properly restore and replay messages."
475
448
 
476
449
  # ==============================================================================
477
450
 
@@ -6,7 +6,7 @@
6
6
  # This example demonstrates point-to-point messaging between an OrderService
7
7
  # and a PaymentService. Each order gets processed by exactly one payment processor.
8
8
 
9
- require_relative '../lib/smart_message'
9
+ require_relative '../../lib/smart_message'
10
10
 
11
11
  puts "=== SmartMessage Example: Point-to-Point Order Processing ==="
12
12
  puts
@@ -6,7 +6,7 @@
6
6
  # This example demonstrates publish-subscribe messaging where one event publisher
7
7
  # sends notifications to multiple subscribers (email service, SMS service, audit logger).
8
8
 
9
- require_relative '../lib/smart_message'
9
+ require_relative '../../lib/smart_message'
10
10
 
11
11
  puts "=== SmartMessage Example: Publish-Subscribe Event Notifications ==="
12
12
  puts
@@ -32,7 +32,7 @@ class UserEventMessage < SmartMessage::Base
32
32
 
33
33
  config do
34
34
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
35
- serializer SmartMessage::Serializer::JSON.new
35
+ serializer SmartMessage::Serializer::Json.new
36
36
  end
37
37
 
38
38
  # Default processor - just logs the event
@@ -7,7 +7,7 @@
7
7
  # can send messages to multiple chat rooms, and other agents receive and respond
8
8
  # to messages based on their interests and capabilities.
9
9
 
10
- require_relative '../lib/smart_message'
10
+ require_relative '../../lib/smart_message'
11
11
 
12
12
  puts "=== SmartMessage Example: Many-to-Many Distributed Chat ==="
13
13
  puts
@@ -37,7 +37,7 @@ class ChatMessage < SmartMessage::Base
37
37
 
38
38
  config do
39
39
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
40
- serializer SmartMessage::Serializer::JSON.new
40
+ serializer SmartMessage::Serializer::Json.new
41
41
  end
42
42
 
43
43
  def self.process(wrapper)
@@ -66,7 +66,7 @@ class BotCommandMessage < SmartMessage::Base
66
66
 
67
67
  config do
68
68
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
69
- serializer SmartMessage::Serializer::JSON.new
69
+ serializer SmartMessage::Serializer::Json.new
70
70
  end
71
71
 
72
72
  def self.process(wrapper)
@@ -95,7 +95,7 @@ class SystemNotificationMessage < SmartMessage::Base
95
95
 
96
96
  config do
97
97
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
98
- serializer SmartMessage::Serializer::JSON.new
98
+ serializer SmartMessage::Serializer::Json.new
99
99
  end
100
100
 
101
101
  def self.process(wrapper)
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # show_me.rb - Demonstrates the pretty_print method on SmartMessage instances
3
3
 
4
- require_relative '../lib/smart_message'
4
+ require_relative '../../lib/smart_message'
5
5
 
6
6
  # Define a sample order message
7
7
  class OrderMessage < SmartMessage::Base
@@ -7,7 +7,7 @@
7
7
  # in SmartMessage, showing different ways to subscribe to messages beyond
8
8
  # the traditional self.process method.
9
9
 
10
- require_relative '../lib/smart_message'
10
+ require_relative '../../lib/smart_message'
11
11
 
12
12
  puts "=== SmartMessage Proc and Block Handler Example ==="
13
13
  puts
@@ -29,7 +29,7 @@ class NotificationMessage < SmartMessage::Base
29
29
 
30
30
  config do
31
31
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
32
- serializer SmartMessage::Serializer::JSON.new
32
+ serializer SmartMessage::Serializer::Json.new
33
33
  end
34
34
 
35
35
  # Default handler
@@ -44,7 +44,7 @@
44
44
  # 2. Configure it at the class level: logger SmartMessage::Logger::RailsLogger.new
45
45
  # 3. All messages will be logged to your Rails application logs
46
46
 
47
- require_relative '../lib/smart_message'
47
+ require_relative '../../lib/smart_message'
48
48
  require 'logger'
49
49
  require 'json'
50
50
  require 'fileutils'
@@ -293,7 +293,7 @@ class OrderProcessingMessage < SmartMessage::Base
293
293
 
294
294
  config do
295
295
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
296
- serializer SmartMessage::Serializer::JSON.new
296
+ serializer SmartMessage::Serializer::Json.new
297
297
 
298
298
  # Configure multi-logger to demonstrate different logging approaches
299
299
  logger SmartMessage::Logger::MultiLogger.new(
@@ -364,7 +364,7 @@ class NotificationMessage < SmartMessage::Base
364
364
 
365
365
  config do
366
366
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
367
- serializer SmartMessage::Serializer::JSON.new
367
+ serializer SmartMessage::Serializer::Json.new
368
368
 
369
369
  # Use only file logger for notifications
370
370
  logger SmartMessage::Logger::FileLogger.new('logs/notifications.log', level: Logger::WARN)
@@ -401,7 +401,7 @@ class StandardLoggerMessage < SmartMessage::Base
401
401
 
402
402
  config do
403
403
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
404
- serializer SmartMessage::Serializer::JSON.new
404
+ serializer SmartMessage::Serializer::Json.new
405
405
 
406
406
  # Example 1: Using Ruby's standard Logger directly
407
407
  # Create a standard Ruby logger that logs to STDOUT
@@ -439,7 +439,7 @@ class DefaultLoggerMessage < SmartMessage::Base
439
439
 
440
440
  config do
441
441
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
442
- serializer SmartMessage::Serializer::JSON.new
442
+ serializer SmartMessage::Serializer::Json.new
443
443
 
444
444
  # Use the built-in default logger - simplest option!
445
445
  logger SmartMessage::Logger::Default.new
@@ -466,16 +466,19 @@ class PriorityOrderService
466
466
  end
467
467
 
468
468
  def process_priority_order(order_data)
469
- # Create message with instance-level logger override
470
- message = OrderProcessingMessage.new(**order_data, from: 'PriorityOrderService')
469
+ # Use class-level logger override for this specific processing
470
+ original_logger = OrderProcessingMessage.logger
471
+ OrderProcessingMessage.logger(@priority_logger)
471
472
 
472
- # Override the logger at instance level
473
- message.logger(@priority_logger)
474
-
475
- puts "⚡ Processing priority order with dedicated logger"
476
- message.publish
477
-
478
- message
473
+ begin
474
+ message = OrderProcessingMessage.new(**order_data, from: 'PriorityOrderService')
475
+ puts "⚡ Processing priority order with dedicated logger"
476
+ message.publish
477
+ message
478
+ ensure
479
+ # Restore original logger
480
+ OrderProcessingMessage.logger(original_logger)
481
+ end
479
482
  end
480
483
  end
481
484
 
@@ -11,7 +11,7 @@
11
11
  # These scenarios help developers understand SmartMessage's robust error handling
12
12
  # and how to build resilient message-based systems.
13
13
 
14
- require_relative '../lib/smart_message'
14
+ require_relative '../../lib/smart_message'
15
15
 
16
16
  puts "=== SmartMessage Example: Error Handling Scenarios ==="
17
17
  puts
@@ -50,7 +50,7 @@ class UserRegistrationMessage < SmartMessage::Base
50
50
 
51
51
  config do
52
52
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
53
- serializer SmartMessage::Serializer::JSON.new
53
+ serializer SmartMessage::Serializer::Json.new
54
54
  end
55
55
 
56
56
  def self.process(wrapper)
@@ -99,7 +99,7 @@ class UserRegistrationMessageV2 < SmartMessage::Base
99
99
 
100
100
  config do
101
101
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
102
- serializer SmartMessage::Serializer::JSON.new
102
+ serializer SmartMessage::Serializer::Json.new
103
103
  end
104
104
 
105
105
  def self.process(wrapper)
@@ -121,7 +121,7 @@ class MultiRequiredMessage < SmartMessage::Base
121
121
 
122
122
  config do
123
123
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
124
- serializer SmartMessage::Serializer::JSON.new
124
+ serializer SmartMessage::Serializer::Json.new
125
125
  end
126
126
  end
127
127
 
@@ -8,14 +8,14 @@
8
8
  # - Instance-level addressing overrides
9
9
  # - Gateway patterns
10
10
 
11
- require_relative '../lib/smart_message'
11
+ require_relative '../../lib/smart_message'
12
12
 
13
13
  puts "🎯 SmartMessage Entity Addressing Demo"
14
14
  puts "=" * 50
15
15
 
16
16
  # Configure transport for demo
17
17
  transport = SmartMessage::Transport.create(:stdout, loopback: true)
18
- serializer = SmartMessage::Serializer::JSON.new
18
+ serializer = SmartMessage::Serializer::Json.new
19
19
 
20
20
  # =============================================================================
21
21
  # Example 1: Point-to-Point Messaging
@@ -40,7 +40,7 @@ class OrderMessage < SmartMessage::Base
40
40
 
41
41
  config do
42
42
  transport SmartMessage::Transport.create(:stdout, loopback: true)
43
- serializer SmartMessage::Serializer::JSON.new
43
+ serializer SmartMessage::Serializer::Json.new
44
44
  end
45
45
 
46
46
  def self.process(wrapper)
@@ -93,7 +93,7 @@ class SystemAnnouncementMessage < SmartMessage::Base
93
93
 
94
94
  config do
95
95
  transport SmartMessage::Transport.create(:stdout, loopback: true)
96
- serializer SmartMessage::Serializer::JSON.new
96
+ serializer SmartMessage::Serializer::Json.new
97
97
  end
98
98
 
99
99
  def self.process(wrapper)
@@ -145,7 +145,7 @@ class UserLookupRequest < SmartMessage::Base
145
145
 
146
146
  config do
147
147
  transport SmartMessage::Transport.create(:stdout, loopback: true)
148
- serializer SmartMessage::Serializer::JSON.new
148
+ serializer SmartMessage::Serializer::Json.new
149
149
  end
150
150
 
151
151
  def self.process(wrapper)
@@ -179,7 +179,7 @@ class UserLookupResponse < SmartMessage::Base
179
179
 
180
180
  config do
181
181
  transport SmartMessage::Transport.create(:stdout, loopback: true)
182
- serializer SmartMessage::Serializer::JSON.new
182
+ serializer SmartMessage::Serializer::Json.new
183
183
  end
184
184
 
185
185
  def self.process(wrapper)
@@ -251,7 +251,7 @@ class PaymentMessage < SmartMessage::Base
251
251
 
252
252
  config do
253
253
  transport SmartMessage::Transport.create(:stdout, loopback: true)
254
- serializer SmartMessage::Serializer::JSON.new
254
+ serializer SmartMessage::Serializer::Json.new
255
255
  end
256
256
 
257
257
  def self.process(wrapper)
@@ -326,7 +326,7 @@ class ExternalAPIMessage < SmartMessage::Base
326
326
 
327
327
  config do
328
328
  transport SmartMessage::Transport.create(:stdout, loopback: true)
329
- serializer SmartMessage::Serializer::JSON.new
329
+ serializer SmartMessage::Serializer::Json.new
330
330
  end
331
331
 
332
332
  def self.process(wrapper)
@@ -9,14 +9,14 @@
9
9
  # - Instance-level addressing overrides
10
10
  # - Gateway patterns
11
11
 
12
- require_relative '../lib/smart_message'
12
+ require_relative '../../lib/smart_message'
13
13
 
14
14
  puts "🎯 SmartMessage Entity Addressing & Filtering Demo"
15
15
  puts "=" * 50
16
16
 
17
17
  # Configure transport for demo
18
18
  transport = SmartMessage::Transport.create(:stdout, loopback: true)
19
- serializer = SmartMessage::Serializer::JSON.new
19
+ serializer = SmartMessage::Serializer::Json.new
20
20
 
21
21
  # =============================================================================
22
22
  # Example 1: Entity-Aware Message Filtering
@@ -37,7 +37,7 @@ class ServiceMessage < SmartMessage::Base
37
37
 
38
38
  config do
39
39
  transport SmartMessage::Transport.create(:stdout, loopback: true)
40
- serializer SmartMessage::Serializer::JSON.new
40
+ serializer SmartMessage::Serializer::Json.new
41
41
  end
42
42
 
43
43
  # Different handlers for different subscription filters
@@ -154,7 +154,7 @@ class AlertMessage < SmartMessage::Base
154
154
 
155
155
  config do
156
156
  transport SmartMessage::Transport.create(:stdout, loopback: true)
157
- serializer SmartMessage::Serializer::JSON.new
157
+ serializer SmartMessage::Serializer::Json.new
158
158
  end
159
159
 
160
160
  def self.process_critical_or_broadcast(wrapper)
@@ -262,7 +262,7 @@ class OrderMessage < SmartMessage::Base
262
262
 
263
263
  config do
264
264
  transport SmartMessage::Transport.create(:stdout, loopback: true)
265
- serializer SmartMessage::Serializer::JSON.new
265
+ serializer SmartMessage::Serializer::Json.new
266
266
  end
267
267
 
268
268
  def self.process_high_priority(wrapper)
@@ -357,7 +357,7 @@ class ServiceRequest < SmartMessage::Base
357
357
 
358
358
  config do
359
359
  transport SmartMessage::Transport.create(:stdout, loopback: true)
360
- serializer SmartMessage::Serializer::JSON.new
360
+ serializer SmartMessage::Serializer::Json.new
361
361
  end
362
362
 
363
363
  def self.process_api_requests(wrapper)
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # examples/09_regex_filtering_microservices.rb
3
3
 
4
- require_relative '../lib/smart_message'
4
+ require_relative '../../lib/smart_message'
5
5
 
6
6
  # Example: Advanced Regex Filtering for Microservices Architecture
7
7
  #
@@ -31,7 +31,7 @@ class MicroserviceMessage < SmartMessage::Base
31
31
  # Configure with STDOUT transport for demo visibility
32
32
  config do
33
33
  transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
34
- serializer SmartMessage::Serializer::JSON.new
34
+ serializer SmartMessage::Serializer::Json.new
35
35
  end
36
36
  end
37
37
 
@@ -7,7 +7,7 @@
7
7
  # - Method 3: Instance-level overrides
8
8
  # - Shortcut accessor methods for addressing
9
9
 
10
- require_relative '../lib/smart_message'
10
+ require_relative '../../lib/smart_message'
11
11
 
12
12
  puts "🎯 SmartMessage Header Block Configuration Demo"
13
13
  puts "=" * 50
@@ -32,7 +32,7 @@ class DirectMethodMessage < SmartMessage::Base
32
32
 
33
33
  config do
34
34
  transport SmartMessage::Transport.create(:stdout)
35
- serializer SmartMessage::Serializer::JSON.new
35
+ serializer SmartMessage::Serializer::Json.new
36
36
  end
37
37
  end
38
38
 
@@ -63,7 +63,7 @@ class HeaderBlockMessage < SmartMessage::Base
63
63
 
64
64
  config do
65
65
  transport SmartMessage::Transport.create(:stdout)
66
- serializer SmartMessage::Serializer::JSON.new
66
+ serializer SmartMessage::Serializer::Json.new
67
67
  end
68
68
  end
69
69
 
@@ -96,7 +96,7 @@ class MixedConfigMessage < SmartMessage::Base
96
96
 
97
97
  config do
98
98
  transport SmartMessage::Transport.create(:stdout)
99
- serializer SmartMessage::Serializer::JSON.new
99
+ serializer SmartMessage::Serializer::Json.new
100
100
  end
101
101
  end
102
102
 
@@ -127,7 +127,7 @@ class FlexibleMessage < SmartMessage::Base
127
127
 
128
128
  config do
129
129
  transport SmartMessage::Transport.create(:stdout)
130
- serializer SmartMessage::Serializer::JSON.new
130
+ serializer SmartMessage::Serializer::Json.new
131
131
  end
132
132
  end
133
133
 
@@ -234,7 +234,7 @@ class CheckableMessage < SmartMessage::Base
234
234
 
235
235
  config do
236
236
  transport SmartMessage::Transport.create(:stdout)
237
- serializer SmartMessage::Serializer::JSON.new
237
+ serializer SmartMessage::Serializer::Json.new
238
238
  end
239
239
  end
240
240
 
@@ -7,7 +7,7 @@
7
7
  # system to set default logger, transport, and serializer for all message
8
8
  # classes in your application.
9
9
 
10
- require_relative '../lib/smart_message'
10
+ require_relative '../../lib/smart_message'
11
11
 
12
12
  puts "=== SmartMessage Global Configuration Example ==="
13
13
  puts
@@ -59,7 +59,12 @@ class NotificationMessage < SmartMessage::Base
59
59
  property :message
60
60
  property :priority, default: 'normal'
61
61
 
62
- # No config block needed - automatically uses global configuration!
62
+ # Explicitly use global configuration for demonstration
63
+ config do
64
+ transport SmartMessage::Transport.default
65
+ serializer SmartMessage::Serializer.default
66
+ logger SmartMessage::Logger.default
67
+ end
63
68
 
64
69
  def self.process(wrapper)
65
70
  message_header, message_payload = wrapper.split
@@ -80,7 +85,12 @@ class OrderStatusMessage < SmartMessage::Base
80
85
  property :status
81
86
  property :customer_id
82
87
 
83
- # Also uses global configuration automatically
88
+ # Explicitly use global configuration for demonstration
89
+ config do
90
+ transport SmartMessage::Transport.default
91
+ serializer SmartMessage::Serializer.default
92
+ logger SmartMessage::Logger.default
93
+ end
84
94
 
85
95
  def self.process(wrapper)
86
96
  message_header, message_payload = wrapper.split
@@ -98,14 +108,15 @@ class OrderStatusMessage < SmartMessage::Base
98
108
  end
99
109
  end
100
110
 
101
- # Subscribe to messages to see them in action
102
- NotificationMessage.subscribe
103
- OrderStatusMessage.subscribe
104
-
105
111
  puts " Message classes configured automatically!"
106
112
  puts
107
113
 
108
- # Example 4: Creating and publishing messages
114
+ # Subscribe to messages to see them in action (after configuration is complete)
115
+ # Message classes now explicitly use global configuration via config blocks
116
+ NotificationMessage.subscribe
117
+ OrderStatusMessage.subscribe
118
+
119
+ # Example 5: Creating and publishing messages
109
120
  puts "4. Publishing Messages (using global configuration):"
110
121
 
111
122
  notification = NotificationMessage.new(
@@ -4,7 +4,7 @@
4
4
  # Demonstrates the various features of the SmartMessage default logger
5
5
  # and shows how applications can use the logger directly.
6
6
 
7
- require_relative '../lib/smart_message'
7
+ require_relative '../../lib/smart_message'
8
8
 
9
9
  puts "=" * 80
10
10
  puts "SmartMessage Logger Feature Demonstration"