liebre 0.1.21 → 0.2.1

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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -0
  3. data/Gemfile.lock +9 -7
  4. data/{LICENSE → LICENSE.txt} +1 -1
  5. data/README.md +492 -195
  6. data/Rakefile +2 -0
  7. data/lib/liebre.rb +27 -16
  8. data/lib/liebre/actor.rb +11 -0
  9. data/lib/liebre/actor/consumer.rb +80 -0
  10. data/lib/liebre/actor/consumer/callback.rb +34 -0
  11. data/lib/liebre/actor/consumer/core.rb +80 -0
  12. data/lib/liebre/actor/consumer/reporter.rb +84 -0
  13. data/lib/liebre/actor/consumer/resources.rb +47 -0
  14. data/lib/liebre/actor/consumer/resources/config.rb +65 -0
  15. data/lib/liebre/actor/context.rb +40 -0
  16. data/lib/liebre/actor/context/declare.rb +44 -0
  17. data/lib/liebre/actor/context/handler.rb +44 -0
  18. data/lib/liebre/actor/publisher.rb +58 -0
  19. data/lib/liebre/actor/publisher/core.rb +42 -0
  20. data/lib/liebre/actor/publisher/reporter.rb +55 -0
  21. data/lib/liebre/actor/publisher/resources.rb +33 -0
  22. data/lib/liebre/actor/rpc/client.rb +88 -0
  23. data/lib/liebre/actor/rpc/client/core.rb +75 -0
  24. data/lib/liebre/actor/rpc/client/pending.rb +65 -0
  25. data/lib/liebre/actor/rpc/client/reporter.rb +71 -0
  26. data/lib/liebre/actor/rpc/client/resources.rb +62 -0
  27. data/lib/liebre/actor/rpc/client/task.rb +33 -0
  28. data/lib/liebre/actor/rpc/server.rb +74 -0
  29. data/lib/liebre/actor/rpc/server/callback.rb +28 -0
  30. data/lib/liebre/actor/rpc/server/core.rb +75 -0
  31. data/lib/liebre/actor/rpc/server/reporter.rb +72 -0
  32. data/lib/liebre/actor/rpc/server/resources.rb +53 -0
  33. data/lib/liebre/adapter.rb +8 -0
  34. data/lib/liebre/adapter/bunny.rb +23 -0
  35. data/lib/liebre/adapter/bunny/chan.rb +38 -0
  36. data/lib/liebre/adapter/bunny/conn.rb +32 -0
  37. data/lib/liebre/adapter/bunny/exchange.rb +20 -0
  38. data/lib/liebre/adapter/bunny/queue.rb +59 -0
  39. data/lib/liebre/adapter/interface.rb +26 -0
  40. data/lib/liebre/adapter/interface/chan.rb +29 -0
  41. data/lib/liebre/adapter/interface/conn.rb +21 -0
  42. data/lib/liebre/adapter/interface/exchange.rb +13 -0
  43. data/lib/liebre/adapter/interface/queue.rb +37 -0
  44. data/lib/liebre/bridge.rb +72 -0
  45. data/lib/liebre/bridge/channel_builder.rb +36 -0
  46. data/lib/liebre/config.rb +8 -38
  47. data/lib/liebre/engine.rb +61 -0
  48. data/lib/liebre/engine/builder.rb +48 -0
  49. data/lib/liebre/engine/repository.rb +56 -0
  50. data/lib/liebre/engine/state.rb +49 -0
  51. data/lib/liebre/runner.rb +15 -47
  52. data/lib/liebre/version.rb +1 -1
  53. data/liebre.gemspec +9 -7
  54. data/spec/integration/publish_and_consume_spec.rb +71 -0
  55. data/spec/integration/rpc_communication_spec.rb +81 -0
  56. data/spec/integration/start_twice_spec.rb +63 -0
  57. data/spec/liebre/actor/consumer_spec.rb +169 -0
  58. data/spec/liebre/actor/context/declare_spec.rb +69 -0
  59. data/spec/liebre/actor/context/handler_spec.rb +65 -0
  60. data/spec/liebre/actor/publisher_spec.rb +58 -0
  61. data/spec/liebre/actor/rpc/client_spec.rb +126 -0
  62. data/spec/liebre/actor/rpc/server_spec.rb +141 -0
  63. data/spec/liebre/adapter/bunny_spec.rb +66 -0
  64. data/spec/liebre/bridge_spec.rb +54 -0
  65. data/spec/liebre/engine/builder_spec.rb +42 -0
  66. data/spec/liebre/engine_spec.rb +90 -0
  67. data/spec/liebre/version_spec.rb +10 -0
  68. data/spec/spec_helper.rb +2 -9
  69. metadata +97 -58
  70. data/lib/liebre/common.rb +0 -7
  71. data/lib/liebre/common/utils.rb +0 -37
  72. data/lib/liebre/connection_manager.rb +0 -85
  73. data/lib/liebre/publisher.rb +0 -113
  74. data/lib/liebre/runner/consumers.rb +0 -46
  75. data/lib/liebre/runner/starter.rb +0 -44
  76. data/lib/liebre/runner/starter/consumer.rb +0 -129
  77. data/lib/liebre/runner/starter/consumer/handler.rb +0 -35
  78. data/lib/liebre/runner/starter/resources.rb +0 -45
  79. data/lib/liebre/runner/starter/resources/queue_builder.rb +0 -63
  80. data/lib/liebre/runner/starter/rpc.rb +0 -59
  81. data/lib/liebre/tasks.rb +0 -12
  82. data/spec/config/liebre.yml +0 -48
  83. data/spec/config/rabbitmq.yml +0 -35
  84. data/spec/integration_spec.rb +0 -76
  85. data/spec/liebre/config_spec.rb +0 -63
  86. data/spec/liebre/connection_manager_spec.rb +0 -44
  87. data/spec/liebre/publisher_spec.rb +0 -92
  88. data/spec/liebre/runner/consumers_spec.rb +0 -59
  89. data/spec/liebre/runner/starter/consumer_spec.rb +0 -145
  90. data/spec/liebre/runner/starter/resources/queue_builder_spec.rb +0 -69
  91. data/spec/liebre/runner/starter/resources_spec.rb +0 -38
  92. data/spec/liebre/runner/starter/rpc_spec.rb +0 -100
  93. data/spec/liebre/runner/starter_spec.rb +0 -70
  94. data/spec/liebre/runner_spec.rb +0 -54
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -1,24 +1,35 @@
1
1
  require "liebre/version"
2
- require "bunny"
2
+
3
+ require "liebre/adapter"
4
+ require "liebre/config"
5
+
6
+ require "liebre/bridge"
7
+ require "liebre/actor"
8
+ require "liebre/engine"
9
+
10
+ require "liebre/runner"
3
11
 
4
12
  module Liebre
5
-
6
- autoload :Common, 'liebre/common'
7
- autoload :Config, 'liebre/config'
8
- autoload :ConnectionManager, 'liebre/connection_manager'
9
- autoload :Publisher, 'liebre/publisher'
10
- autoload :Runner, 'liebre/runner'
11
-
13
+
14
+ def self.start only: nil
15
+ runner = Runner.new(engine: Liebre.engine)
16
+ runner.run(only: only)
17
+ end
18
+
12
19
  def self.config
13
20
  @config ||= Config.new
14
21
  end
15
-
16
- def self.env
17
- Config.env
22
+
23
+ def self.engine
24
+ @engine ||= Engine.new(config)
18
25
  end
19
-
20
- def self.logger
21
- Config.logger
26
+
27
+ def self.repo
28
+ engine.repo
22
29
  end
23
-
24
- end
30
+
31
+ def self.configure
32
+ yield(config)
33
+ end
34
+
35
+ end
@@ -0,0 +1,11 @@
1
+ require "liebre/actor/context"
2
+
3
+ require "liebre/actor/publisher"
4
+ require "liebre/actor/consumer"
5
+ require "liebre/actor/rpc/client"
6
+ require "liebre/actor/rpc/server"
7
+
8
+ module Liebre
9
+ module Actor
10
+ end
11
+ end
@@ -0,0 +1,80 @@
1
+ require 'concurrent'
2
+
3
+ require 'liebre/actor/consumer/resources'
4
+ require 'liebre/actor/consumer/callback'
5
+ require 'liebre/actor/consumer/core'
6
+ require 'liebre/actor/consumer/reporter'
7
+
8
+ module Liebre
9
+ module Actor
10
+ class Consumer
11
+ include Concurrent::Async
12
+
13
+ OPTS = {:block => false, :manual_ack => true}
14
+
15
+ def initialize context
16
+ super()
17
+
18
+ @context = context
19
+ end
20
+
21
+ def start() async.__start__(); end
22
+ def stop() async.__stop__(); end
23
+
24
+ def consume(info, meta, payload) async.__consume__(info, meta, payload); end
25
+
26
+ def ack(info, opts = {}) async.__ack__(info, opts); end
27
+ def nack(info, opts = {}) async.__nack__(info, opts); end
28
+ def reject(info, opts = {}) async.__reject__(info, opts); end
29
+ def failed(info, error) async.__failed__(info, error); end
30
+
31
+ def clean() async.__clean__(); end
32
+
33
+ def __start__
34
+ reporter.on_start { core.start }
35
+ end
36
+ def __stop__
37
+ reporter.on_stop { core.stop }
38
+ end
39
+
40
+ def __consume__ info, meta, payload
41
+ reporter.on_consume { core.consume(info, meta, payload) }
42
+ end
43
+
44
+ def __ack__(info, opts)
45
+ reporter.on_ack { core.ack(info, opts) }
46
+ end
47
+ def __nack__(info, opts)
48
+ reporter.on_nack { core.nack(info, opts) }
49
+ end
50
+ def __reject__(info, opts)
51
+ reporter.on_reject { core.reject(info, opts) }
52
+ end
53
+
54
+ def __failed__(info, error)
55
+ reporter.on_failed(error) { core.failed(info, error) }
56
+ end
57
+
58
+ def __clean__
59
+ reporter.on_clean { core.clean() }
60
+ end
61
+
62
+ private
63
+
64
+ def core
65
+ @core ||= Core.new(self, resources, context, Callback)
66
+ end
67
+
68
+ def resources
69
+ Resources.new(context)
70
+ end
71
+
72
+ def reporter
73
+ @reporter ||= Reporter.new(context)
74
+ end
75
+
76
+ attr_reader :context
77
+
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,34 @@
1
+ module Liebre
2
+ module Actor
3
+ class Consumer
4
+ class Callback
5
+
6
+ def initialize consumer, info
7
+ @consumer = consumer
8
+ @info = info
9
+ end
10
+
11
+ def ack opts = {}
12
+ consumer.ack(info, opts)
13
+ end
14
+
15
+ def nack opts = {}
16
+ consumer.nack(info, opts)
17
+ end
18
+
19
+ def reject opts = {}
20
+ consumer.reject(info, opts)
21
+ end
22
+
23
+ def failed error
24
+ consumer.failed(info, error)
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :consumer, :info
30
+
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,80 @@
1
+ module Liebre
2
+ module Actor
3
+ class Consumer
4
+ class Core
5
+
6
+ OPTS = {:block => false, :manual_ack => true}
7
+
8
+ def initialize consumer, resources, context, callback_class
9
+ @consumer = consumer
10
+ @resources = resources
11
+ @context = context
12
+ @callback_class = callback_class
13
+ end
14
+
15
+ def start
16
+ queue.subscribe(OPTS) do |info, meta, payload|
17
+ consumer.consume(info, meta, payload)
18
+ end
19
+ dead_queue
20
+ end
21
+
22
+ def stop
23
+ chan.close
24
+ end
25
+
26
+ def consume info, meta, payload
27
+ callback = callback_class.new(consumer, info)
28
+
29
+ handler.call(payload, meta, callback) do |error|
30
+ callback.failed(error)
31
+ end
32
+ end
33
+
34
+ def ack(info, opts) queue.ack(info, opts); end
35
+ def nack(info, opts) queue.nack(info, opts); end
36
+ def reject(info, opts) queue.reject(info, opts); end
37
+
38
+ def failed info, error
39
+ queue.reject(info, {})
40
+ end
41
+
42
+ def clean
43
+ queue.delete
44
+ exchange.delete
45
+ dead_queue.delete
46
+ dead_exchange.delete
47
+ end
48
+
49
+ private
50
+
51
+ def queue
52
+ resources.queue
53
+ end
54
+
55
+ def exchange
56
+ resources.exchange
57
+ end
58
+
59
+ def dead_queue
60
+ resources.dead_queue
61
+ end
62
+
63
+ def dead_exchange
64
+ resources.dead_exchange
65
+ end
66
+
67
+ def chan
68
+ context.chan
69
+ end
70
+
71
+ def handler
72
+ context.handler
73
+ end
74
+
75
+ attr_reader :consumer, :resources, :context, :callback_class
76
+
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,84 @@
1
+ module Liebre
2
+ module Actor
3
+ class Consumer
4
+ class Reporter
5
+
6
+ def initialize context
7
+ @context = context
8
+ end
9
+
10
+ def on_start
11
+ yield
12
+ logger.info("Consumer started: #{name}")
13
+ rescue Exception => error
14
+ logger.error("Error starting consumer: #{name}\n#{error.message}\n#{error.backtrace}")
15
+ raise error
16
+ end
17
+
18
+ def on_stop
19
+ yield
20
+ logger.info("Consumer stopped: #{name}")
21
+ rescue Exception => error
22
+ logger.error("Error stopping consumer: #{name}\n#{error.message}\n#{error.backtrace}")
23
+ raise error
24
+ end
25
+
26
+ def on_consume
27
+ yield
28
+ rescue Exception => error
29
+ logger.error("Error consuming: #{name}\n#{error.message}\n#{error.backtrace}")
30
+ raise error
31
+ end
32
+
33
+ def on_ack
34
+ yield
35
+ rescue Exception => error
36
+ logger.error("Error acking: #{name}\n#{error.message}\n#{error.backtrace}")
37
+ raise error
38
+ end
39
+
40
+ def on_nack
41
+ yield
42
+ rescue Exception => error
43
+ logger.error("Error nacking: #{name}\n#{error.message}\n#{error.backtrace}")
44
+ raise error
45
+ end
46
+
47
+ def on_reject
48
+ yield
49
+ rescue Exception => error
50
+ logger.error("Error rejecting: #{name}\n#{error.message}\n#{error.backtrace}")
51
+ raise error
52
+ end
53
+
54
+ def on_failed error
55
+ logger.error("Error on Consumer when handling a message #{name}\n#{error.message}\n#{error.backtrace}")
56
+ yield
57
+ rescue Exception => error
58
+ logger.error("Error handling consumer handler failure: #{name}\n#{error.message}\n#{error.backtrace}")
59
+ raise error
60
+ end
61
+
62
+ def on_clean
63
+ yield
64
+ rescue Exception => error
65
+ logger.error("Error cleaning consumer: #{name}\n#{error.message}\n#{error.backtrace}")
66
+ raise error
67
+ end
68
+
69
+ private
70
+
71
+ def name
72
+ @name ||= context.name.inspect
73
+ end
74
+
75
+ def logger
76
+ @logger ||= context.logger
77
+ end
78
+
79
+ attr_reader :context
80
+
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,47 @@
1
+ require 'liebre/actor/consumer/resources/config'
2
+
3
+ module Liebre
4
+ module Actor
5
+ class Consumer
6
+ class Resources
7
+
8
+ def initialize context
9
+ @context = context
10
+ end
11
+
12
+ def queue
13
+ @queue ||= declare.queue(config.queue).tap do |queue|
14
+ declare.bind(queue, exchange, config.bind)
15
+ end
16
+ end
17
+
18
+ def exchange
19
+ @exchange ||= declare.exchange(config.exchange)
20
+ end
21
+
22
+ def dead_queue
23
+ @dead_queue ||= declare.queue(config.dead_queue).tap do |queue|
24
+ declare.bind(queue, dead_exchange)
25
+ end
26
+ end
27
+
28
+ def dead_exchange
29
+ @dead_exchange ||= declare.exchange(config.dead_exchange)
30
+ end
31
+
32
+ private
33
+
34
+ def declare
35
+ context.declare
36
+ end
37
+
38
+ def config
39
+ @config ||= Config.new(context.spec)
40
+ end
41
+
42
+ attr_reader :context
43
+
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,65 @@
1
+ module Liebre
2
+ module Actor
3
+ class Consumer
4
+ class Resources
5
+ class Config
6
+
7
+ def initialize spec
8
+ @spec = spec
9
+ end
10
+
11
+ def queue
12
+ raw_queue.merge(:opts => dead_letter_opts)
13
+ end
14
+
15
+ def exchange
16
+ raw_exchange
17
+ end
18
+
19
+ def bind
20
+ spec.fetch(:bind, {})
21
+ end
22
+
23
+ def dead_queue
24
+ {:name => error_name,
25
+ :opts => raw_queue.fetch(:opts, {})}
26
+ end
27
+
28
+ def dead_exchange
29
+ {:name => error_name,
30
+ :type => "fanout",
31
+ :opts => raw_exchange.fetch(:opts, {})}
32
+ end
33
+
34
+ private
35
+
36
+ def dead_letter_opts
37
+ raw_queue.fetch(:opts, {}).dup.tap do |opts|
38
+ opts[:arguments] = opts.
39
+ fetch(:arguments, {}).
40
+ merge("x-dead-letter-exchange" => error_name)
41
+ end
42
+ end
43
+
44
+ def error_name
45
+ @error_name ||= begin
46
+ raw_name = spec.fetch(:queue).fetch(:name)
47
+ "#{raw_name}-error"
48
+ end
49
+ end
50
+
51
+ def raw_exchange
52
+ spec.fetch(:exchange)
53
+ end
54
+
55
+ def raw_queue
56
+ spec.fetch(:queue)
57
+ end
58
+
59
+ attr_reader :spec
60
+
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end