liebre 0.1.21 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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,40 @@
1
+ require "liebre/actor/context/declare"
2
+ require "liebre/actor/context/handler"
3
+
4
+ module Liebre
5
+ module Actor
6
+ class Context
7
+
8
+ attr_reader :chan, :name, :opts
9
+
10
+ def initialize chan, name, opts, config
11
+ @chan = chan
12
+ @name = name
13
+ @opts = opts
14
+
15
+ @config = config
16
+ end
17
+
18
+ def spec
19
+ opts.fetch(:resources, {})
20
+ end
21
+
22
+ def declare
23
+ @declare ||= Declare.new(chan)
24
+ end
25
+
26
+ def handler
27
+ @handler ||= Handler.new(opts)
28
+ end
29
+
30
+ def logger
31
+ config.logger
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :config
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,44 @@
1
+ module Liebre
2
+ module Actor
3
+ class Context
4
+ class Declare
5
+
6
+ def initialize chan
7
+ @chan = chan
8
+ end
9
+
10
+ def default_exchange
11
+ chan.default_exchange
12
+ end
13
+
14
+ def exchange config
15
+ name = config.fetch(:name)
16
+ type = config.fetch(:type)
17
+ opts = config.fetch(:opts, {})
18
+
19
+ chan.exchange(name, type, opts)
20
+ end
21
+
22
+ def queue config
23
+ name = config.fetch(:name)
24
+ opts = config.fetch(:opts, {})
25
+
26
+ chan.queue(name, opts)
27
+ end
28
+
29
+ def bind queue, exchange, config = {}
30
+ all_opts = [config].flatten
31
+
32
+ all_opts.each do |opts|
33
+ queue.bind(exchange, opts)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ attr_reader :chan
40
+
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,44 @@
1
+ require 'concurrent'
2
+
3
+ module Liebre
4
+ module Actor
5
+ class Context
6
+ class Handler
7
+
8
+ DEFAULT_POOL_SIZE = 5
9
+
10
+ def initialize opts
11
+ @opts = opts
12
+ end
13
+
14
+ def call *args, &block
15
+ pool.post { handle(args, block) }
16
+ end
17
+
18
+ private
19
+
20
+ def handle args, block
21
+ handler = handler_class.new(*args)
22
+ handler.call
23
+ rescue => error
24
+ block.call(error)
25
+ end
26
+
27
+ def pool
28
+ @pool ||= begin
29
+ size = opts.fetch(:pool_size, DEFAULT_POOL_SIZE)
30
+
31
+ Concurrent::FixedThreadPool.new(size)
32
+ end
33
+ end
34
+
35
+ def handler_class
36
+ @handler_class ||= opts.fetch(:handler)
37
+ end
38
+
39
+ attr_reader :opts
40
+
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,58 @@
1
+ require 'concurrent'
2
+
3
+ require 'liebre/actor/publisher/resources'
4
+ require 'liebre/actor/publisher/core'
5
+ require 'liebre/actor/publisher/reporter'
6
+
7
+ module Liebre
8
+ module Actor
9
+ class Publisher
10
+ include Concurrent::Async
11
+
12
+ def initialize context
13
+ super()
14
+
15
+ @context = context
16
+ end
17
+
18
+ def start() async.__start__(); end
19
+ def stop() async.__stop__(); end
20
+
21
+ def publish(payload, opts = {}) async.__publish__(payload, opts); end
22
+
23
+ def clean() async.__clean__(); end
24
+
25
+ def __start__
26
+ reporter.on_start { core.start }
27
+ end
28
+ def __stop__
29
+ reporter.on_stop { core.stop }
30
+ end
31
+
32
+ def __publish__ payload, opts
33
+ reporter.on_publish { core.publish(payload, opts) }
34
+ end
35
+
36
+ def __clean__
37
+ reporter.on_clean { core.clean() }
38
+ end
39
+
40
+ private
41
+
42
+ def core
43
+ @core ||= Core.new(resources, context)
44
+ end
45
+
46
+ def resources
47
+ Resources.new(context)
48
+ end
49
+
50
+ def reporter
51
+ @reporter ||= Reporter.new(context)
52
+ end
53
+
54
+ attr_reader :context
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,42 @@
1
+ module Liebre
2
+ module Actor
3
+ class Publisher
4
+ class Core
5
+
6
+ def initialize resources, context
7
+ @resources = resources
8
+ @context = context
9
+ end
10
+
11
+ def start
12
+ exchange
13
+ end
14
+
15
+ def stop
16
+ chan.close
17
+ end
18
+
19
+ def publish payload, opts
20
+ exchange.publish(payload, opts)
21
+ end
22
+
23
+ def clean
24
+ exchange.delete
25
+ end
26
+
27
+ private
28
+
29
+ def exchange
30
+ resources.exchange
31
+ end
32
+
33
+ def chan
34
+ context.chan
35
+ end
36
+
37
+ attr_reader :resources, :context
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,55 @@
1
+ module Liebre
2
+ module Actor
3
+ class Publisher
4
+ class Reporter
5
+
6
+ def initialize context
7
+ @context = context
8
+ end
9
+
10
+ def on_start
11
+ yield
12
+ logger.info("Publisher started: #{name}")
13
+ rescue Exception => error
14
+ logger.error("Error starting publisher: #{name}\n#{error.message}\n#{error.backtrace}")
15
+ raise error
16
+ end
17
+
18
+ def on_publish
19
+ yield
20
+ rescue Exception => error
21
+ logger.error("Error publising: #{name}\n#{error.message}\n#{error.backtrace}")
22
+ raise error
23
+ end
24
+
25
+ def on_stop
26
+ yield
27
+ logger.info("Publisher stopped: #{name}")
28
+ rescue Exception => error
29
+ logger.error("Error stopping publisher: #{name}\n#{error.message}\n#{error.backtrace}")
30
+ raise error
31
+ end
32
+
33
+ def on_clean
34
+ yield
35
+ rescue Exception => error
36
+ logger.error("Error cleaning publisher: #{name}\n#{error.message}\n#{error.backtrace}")
37
+ raise error
38
+ end
39
+
40
+ private
41
+
42
+ def name
43
+ @name ||= context.name.inspect
44
+ end
45
+
46
+ def logger
47
+ @logger ||= context.logger
48
+ end
49
+
50
+ attr_reader :context
51
+
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,33 @@
1
+ module Liebre
2
+ module Actor
3
+ class Publisher
4
+ class Resources
5
+
6
+ def initialize context
7
+ @context = context
8
+ end
9
+
10
+ def exchange
11
+ @exchange ||= declare.exchange(exchange_config)
12
+ end
13
+
14
+ private
15
+
16
+ def exchange_config
17
+ spec.fetch(:exchange)
18
+ end
19
+
20
+ def spec
21
+ context.spec
22
+ end
23
+
24
+ def declare
25
+ context.declare
26
+ end
27
+
28
+ attr_reader :context
29
+
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,88 @@
1
+ require 'concurrent'
2
+
3
+ require 'liebre/actor/rpc/client/resources'
4
+ require 'liebre/actor/rpc/client/pending'
5
+ require 'liebre/actor/rpc/client/task'
6
+ require 'liebre/actor/rpc/client/core'
7
+ require 'liebre/actor/rpc/client/reporter'
8
+
9
+ module Liebre
10
+ module Actor
11
+ module RPC
12
+ class Client
13
+ include Concurrent::Async
14
+
15
+ TIMEOUT = 5
16
+
17
+ def initialize context
18
+ super()
19
+
20
+ @context = context
21
+ end
22
+
23
+ def start() async.__start__(); end
24
+ def stop() async.__stop__(); end
25
+
26
+ def request payload, opts = {}, timeout = TIMEOUT
27
+ call_ivar = await.__request__(payload, opts, timeout)
28
+ response_ivar = call_ivar.value
29
+
30
+ response_ivar.value(timeout)
31
+ end
32
+ def reply(meta, response) async.__reply__(meta, response); end
33
+
34
+ def expire() async.__expire__(); end
35
+
36
+ def clean() async.__clean__(); end
37
+
38
+ def __start__()
39
+ reporter.on_start { core.start }
40
+ end
41
+ def __stop__()
42
+ reporter.on_stop { core.stop }
43
+ end
44
+
45
+ def __request__(payload, opts, timeout)
46
+ reporter.on_request { core.request(payload, opts, timeout) }
47
+ end
48
+
49
+ def __reply__(meta, response)
50
+ reporter.on_reply { core.reply(meta, response) }
51
+ end
52
+
53
+ def __expire__()
54
+ reporter.on_expire { core.expire() }
55
+ end
56
+
57
+ def __clean__()
58
+ reporter.on_clean { core.clean() }
59
+ end
60
+
61
+ private
62
+
63
+ def core
64
+ @core ||= Core.new(self, resources, context, pending, task)
65
+ end
66
+
67
+ def resources
68
+ Resources.new(context)
69
+ end
70
+
71
+ def pending
72
+ Pending.new
73
+ end
74
+
75
+ def task
76
+ Task.new
77
+ end
78
+
79
+ def reporter
80
+ @reporter ||= Reporter.new(context)
81
+ end
82
+
83
+ attr_reader :context
84
+
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,75 @@
1
+ module Liebre
2
+ module Actor
3
+ module RPC
4
+ class Client
5
+ class Core
6
+
7
+ OPTS = {:block => false, :manual_ack => false}
8
+ EXPIRE_INTERVAL = 60
9
+
10
+ def initialize client, resources, context, pending, task
11
+ @client = client
12
+ @resources = resources
13
+ @context = context
14
+ @pending = pending
15
+ @task = task
16
+ end
17
+
18
+ def start
19
+ response_queue.subscribe(OPTS) do |_info, meta, payload|
20
+ client.reply(meta, payload)
21
+ end
22
+ request_exchange
23
+
24
+ task.every(EXPIRE_INTERVAL) { client.expire }
25
+ end
26
+
27
+ def stop
28
+ task.cancel_all
29
+ chan.close
30
+ end
31
+
32
+ def request payload, opts, timeout
33
+ r = pending.add(timeout) do |correlation_id|
34
+ opts = opts.merge :reply_to => response_queue.name,
35
+ :correlation_id => correlation_id
36
+
37
+ request_exchange.publish(payload, opts)
38
+ context.logger.info("request pending - correlation_id: #{correlation_id}")
39
+ end
40
+ end
41
+
42
+ def reply meta, response
43
+ pending.finish(meta.correlation_id, response)
44
+ end
45
+
46
+ def expire
47
+ pending.expire()
48
+ end
49
+
50
+ def clean
51
+ request_exchange.delete
52
+ response_queue.delete
53
+ end
54
+
55
+ private
56
+
57
+ def response_queue
58
+ resources.response_queue
59
+ end
60
+
61
+ def request_exchange
62
+ resources.request_exchange
63
+ end
64
+
65
+ def chan
66
+ context.chan
67
+ end
68
+
69
+ attr_reader :client, :resources, :context, :pending, :task
70
+
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end