legionio 0.3.2 → 0.3.3

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 (90) hide show
  1. checksums.yaml +4 -4
  2. metadata +4 -94
  3. data/.circleci/config.yml +0 -119
  4. data/.gitignore +0 -14
  5. data/.rspec +0 -2
  6. data/.rubocop.yml +0 -89
  7. data/CHANGELOG.md +0 -16
  8. data/Gemfile +0 -3
  9. data/LICENSE.txt +0 -21
  10. data/README.md +0 -49
  11. data/Rakefile +0 -38
  12. data/bin/console +0 -16
  13. data/bin/legion +0 -49
  14. data/bin/setup +0 -8
  15. data/bin/test +0 -32
  16. data/bitbucket-pipelines.yml +0 -55
  17. data/docs/Makefile +0 -20
  18. data/docs/_build/doctrees/environment.pickle +0 -0
  19. data/docs/_build/doctrees/index.doctree +0 -0
  20. data/docs/_build/doctrees/overview.doctree +0 -0
  21. data/docs/_build/html/.buildinfo +0 -4
  22. data/docs/_build/html/_sources/index.rst.txt +0 -28
  23. data/docs/_build/html/_sources/overview.rst.txt +0 -0
  24. data/docs/_build/html/_static/alabaster.css +0 -701
  25. data/docs/_build/html/_static/basic.css +0 -855
  26. data/docs/_build/html/_static/custom.css +0 -1
  27. data/docs/_build/html/_static/doctools.js +0 -315
  28. data/docs/_build/html/_static/documentation_options.js +0 -12
  29. data/docs/_build/html/_static/file.png +0 -0
  30. data/docs/_build/html/_static/jquery-3.5.1.js +0 -10872
  31. data/docs/_build/html/_static/jquery.js +0 -2
  32. data/docs/_build/html/_static/language_data.js +0 -297
  33. data/docs/_build/html/_static/minus.png +0 -0
  34. data/docs/_build/html/_static/plus.png +0 -0
  35. data/docs/_build/html/_static/pygments.css +0 -82
  36. data/docs/_build/html/_static/searchtools.js +0 -514
  37. data/docs/_build/html/_static/underscore-1.3.1.js +0 -999
  38. data/docs/_build/html/_static/underscore.js +0 -31
  39. data/docs/_build/html/genindex.html +0 -101
  40. data/docs/_build/html/index.html +0 -117
  41. data/docs/_build/html/objects.inv +0 -6
  42. data/docs/_build/html/overview.html +0 -98
  43. data/docs/_build/html/search.html +0 -110
  44. data/docs/_build/html/searchindex.js +0 -1
  45. data/docs/conf.py +0 -54
  46. data/docs/index.rst +0 -28
  47. data/docs/make.bat +0 -35
  48. data/exe/legion +0 -52
  49. data/legion.gemspec +0 -59
  50. data/lib/legion.rb +0 -21
  51. data/lib/legion/exceptions/handled_task.rb +0 -6
  52. data/lib/legion/exceptions/invalidjson.rb +0 -5
  53. data/lib/legion/exceptions/missingargument.rb +0 -6
  54. data/lib/legion/exceptions/wrongtype.rb +0 -10
  55. data/lib/legion/exceptions/wrongtypes/array.rb +0 -8
  56. data/lib/legion/exceptions/wrongtypes/hash.rb +0 -8
  57. data/lib/legion/exceptions/wrongtypes/integer.rb +0 -8
  58. data/lib/legion/exceptions/wrongtypes/string.rb +0 -8
  59. data/lib/legion/extensions.rb +0 -185
  60. data/lib/legion/extensions/actors/base.rb +0 -49
  61. data/lib/legion/extensions/actors/every.rb +0 -48
  62. data/lib/legion/extensions/actors/loop.rb +0 -32
  63. data/lib/legion/extensions/actors/nothing.rb +0 -15
  64. data/lib/legion/extensions/actors/once.rb +0 -40
  65. data/lib/legion/extensions/actors/poll.rb +0 -88
  66. data/lib/legion/extensions/actors/subscription.rb +0 -138
  67. data/lib/legion/extensions/builders/actors.rb +0 -61
  68. data/lib/legion/extensions/builders/base.rb +0 -36
  69. data/lib/legion/extensions/builders/helpers.rb +0 -24
  70. data/lib/legion/extensions/builders/runners.rb +0 -58
  71. data/lib/legion/extensions/core.rb +0 -126
  72. data/lib/legion/extensions/data.rb +0 -58
  73. data/lib/legion/extensions/data/migrator.rb +0 -28
  74. data/lib/legion/extensions/data/model.rb +0 -8
  75. data/lib/legion/extensions/helpers/base.rb +0 -82
  76. data/lib/legion/extensions/helpers/cache.rb +0 -23
  77. data/lib/legion/extensions/helpers/core.rb +0 -41
  78. data/lib/legion/extensions/helpers/data.rb +0 -23
  79. data/lib/legion/extensions/helpers/lex.rb +0 -48
  80. data/lib/legion/extensions/helpers/logger.rb +0 -47
  81. data/lib/legion/extensions/helpers/task.rb +0 -60
  82. data/lib/legion/extensions/helpers/transport.rb +0 -44
  83. data/lib/legion/extensions/transport.rb +0 -159
  84. data/lib/legion/process.rb +0 -124
  85. data/lib/legion/runner.rb +0 -55
  86. data/lib/legion/runner/log.rb +0 -10
  87. data/lib/legion/runner/status.rb +0 -69
  88. data/lib/legion/service.rb +0 -99
  89. data/lib/legion/supervision.rb +0 -15
  90. data/lib/legion/version.rb +0 -3
@@ -1,49 +0,0 @@
1
- require 'hashdiff'
2
-
3
- module Legion
4
- module Extensions
5
- module Actors
6
- module Base
7
- include Legion::Extensions::Helpers::Lex
8
-
9
- def runner
10
- Legion::Runner.run(runner_class: runner_class, function: function, check_subtask: check_subtask?, generate_task: generate_task?)
11
- rescue StandardError => e
12
- Legion::Logging.error e.message
13
- Legion::Logging.error e.backtrace
14
- end
15
-
16
- def manual
17
- runner_class.send(runner_function, **args)
18
- rescue StandardError => e
19
- Legion::Logging.error e.message
20
- Legion::Logging.error e.backtrace
21
- end
22
-
23
- def function
24
- nil
25
- end
26
-
27
- def use_runner?
28
- true
29
- end
30
-
31
- def args
32
- {}
33
- end
34
-
35
- def check_subtask?
36
- true
37
- end
38
-
39
- def generate_task?
40
- false
41
- end
42
-
43
- def enabled?
44
- true
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,48 +0,0 @@
1
- require_relative 'base'
2
-
3
- module Legion
4
- module Extensions
5
- module Actors
6
- class Every
7
- include Legion::Extensions::Actors::Base
8
-
9
- def initialize(**_opts)
10
- @timer = Concurrent::TimerTask.new(execution_interval: time, timeout_interval: timeout, run_now: run_now?) do
11
- use_runner? ? runner : manual
12
- end
13
-
14
- @timer.execute
15
- rescue StandardError => e
16
- Legion::Logging.error e.message
17
- Legion::Logging.error e.backtrace
18
- end
19
-
20
- def time
21
- 1
22
- end
23
-
24
- def timeout
25
- 5
26
- end
27
-
28
- def run_now?
29
- false
30
- end
31
-
32
- def action(**_opts)
33
- Legion::Logging.warn 'An extension is using the default block from Legion::Extensions::Runners::Every'
34
- end
35
-
36
- def cancel
37
- Legion::Logging.debug 'Cancelling Legion Timer'
38
- return true unless @timer.respond_to?(:shutdown)
39
-
40
- @timer.shutdown
41
- rescue StandardError => e
42
- Legion::Logging.error e.message
43
- Legion::Logging.error e.backtrace
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,32 +0,0 @@
1
- require_relative 'base'
2
-
3
- module Legion
4
- module Extensions
5
- module Actors
6
- class Loop
7
- include Concurrent::Async
8
- include Legion::Extensions::Actors::Base
9
-
10
- def initialize
11
- @loop = true
12
- async.run
13
- rescue StandardError => e
14
- Legion::Logging.error e
15
- Legion::Logging.error e.backtrace
16
- end
17
-
18
- def run
19
- action while @loop
20
- end
21
-
22
- def action(**_opts)
23
- Legion::Logging.warn 'An extension is using the default action for a loop'
24
- end
25
-
26
- def cancel
27
- @loop = false
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,15 +0,0 @@
1
- require_relative 'base'
2
-
3
- module Legion
4
- module Extensions
5
- module Actors
6
- class Nothing
7
- include Legion::Extensions::Actors::Base
8
-
9
- def initialize; end
10
-
11
- def cancel; end
12
- end
13
- end
14
- end
15
- end
@@ -1,40 +0,0 @@
1
- require_relative 'base'
2
-
3
- module Legion
4
- module Extensions
5
- module Actors
6
- class Once
7
- include Legion::Extensions::Actors::Base
8
-
9
- def initialize
10
- return if disabled?
11
-
12
- if respond_to? :functions
13
- functions.each do
14
- function
15
- @task = Concurrent::ScheduledTask.execute(delay) do
16
- use_runner ? runner : manual
17
- end
18
- end
19
- else
20
- @task = Concurrent::ScheduledTask.execute(delay) do
21
- use_runner ? runner : manual
22
- end
23
- end
24
- rescue StandardError => e
25
- Legion::Logging.error e
26
- end
27
-
28
- def delay
29
- 1.0
30
- end
31
-
32
- def cancel
33
- return if disabled?
34
-
35
- @task.cancel unless @task.cancelled?
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,88 +0,0 @@
1
- require_relative 'base'
2
- require 'hashdiff'
3
- require 'time'
4
-
5
- module Legion
6
- module Extensions
7
- module Actors
8
- class Poll
9
- include Legion::Extensions::Actors::Base
10
-
11
- def initialize # rubocop:disable Metrics/AbcSize
12
- log.debug "Starting timer for #{self.class} with #{{ execution_interval: time, timeout_interval: timeout, run_now: run_now?, check_subtask: check_subtask? }}"
13
- @timer = Concurrent::TimerTask.new(execution_interval: time, timeout_interval: timeout, run_now: run_now?) do
14
- t1 = Time.now
15
- log.debug "Running #{self.class}"
16
- old_result = Legion::Cache.get(cache_name)
17
- log.debug "Cached value for #{self.class}: #{old_result}"
18
- results = Legion::JSON.load(Legion::JSON.dump(manual))
19
- Legion::Cache.set(cache_name, results, time * 2)
20
-
21
- unless old_result.nil?
22
- results[:diff] = Hashdiff.diff(results, old_result, numeric_tolerance: 0.0, array_path: false) do |_path, obj1, obj2|
23
- if int_percentage_normalize.positive? && obj1.is_a?(Integer) && obj2.is_a?(Integer)
24
- obj1.between?(obj2 * (1 - int_percentage_normalize), obj2 * (1 + int_percentage_normalize))
25
- end
26
- end
27
- results[:changed] = results[:diff].count.positive?
28
-
29
- Legion::Logging.info results[:diff] if results[:changed]
30
- Legion::Transport::Messages::CheckSubtask.new(runner_class: runner_class.to_s,
31
- function: runner_function,
32
- result: results,
33
- type: 'poll_result',
34
- polling: true).publish
35
- end
36
-
37
- sleep_time = 1 - (Time.now - t1)
38
- sleep(sleep_time) if sleep_time.positive?
39
- log.debug("#{self.class} result: #{results}")
40
- results
41
- rescue StandardError => e
42
- Legion::Logging.fatal e.message
43
- Legion::Logging.fatal e.backtrace
44
- end
45
- @timer.execute
46
- rescue StandardError => e
47
- Legion::Logging.error e.message
48
- Legion::Logging.error e.backtrace
49
- end
50
-
51
- def cache_name
52
- "#{lex_name}_#{runner_name}"
53
- end
54
-
55
- def int_percentage_normalize
56
- 0.00
57
- end
58
-
59
- def time
60
- 9
61
- end
62
-
63
- def run_now?
64
- true
65
- end
66
-
67
- def check_subtask?
68
- true
69
- end
70
-
71
- def timeout
72
- 5
73
- end
74
-
75
- def action(_payload = {})
76
- Legion::Logging.warn 'An extension is using the default block from Legion::Extensions::Runners::Every'
77
- end
78
-
79
- def cancel
80
- Legion::Logging.debug 'Cancelling Legion Poller'
81
- @timer.shutdown
82
- rescue StandardError => e
83
- Legion::Logging.error e.message
84
- end
85
- end
86
- end
87
- end
88
- end
@@ -1,138 +0,0 @@
1
- require_relative 'base'
2
- require 'date'
3
-
4
- module Legion
5
- module Extensions
6
- module Actors
7
- class Subscription
8
- include Concurrent::Async
9
- include Legion::Extensions::Actors::Base
10
- include Legion::Extensions::Helpers::Transport
11
-
12
- def initialize(**_options)
13
- super()
14
- @queue = queue.new
15
- rescue StandardError => e
16
- log.fatal e.message
17
- log.fatal e.backtrace
18
- end
19
-
20
- def create_queue
21
- queues.const_set(actor_const, Class.new(Legion::Transport::Queue))
22
- exchange_object = default_exchange.new
23
- queue_object = Kernel.const_get(queue_string).new
24
-
25
- queue_object.bind(exchange_object, routing_key: actor_name)
26
- queue_object.bind(exchange_object, routing_key: "#{lex_name}.#{actor_name}.#")
27
- end
28
-
29
- def queue
30
- create_queue unless queues.const_defined?(actor_const)
31
- Kernel.const_get queue_string
32
- end
33
-
34
- def queue_string
35
- @queue_string ||= "#{queues}::#{actor_const}"
36
- end
37
-
38
- def cancel
39
- return true unless @queue.channel.active
40
-
41
- log.debug "Closing subscription to #{@queue.name}"
42
- @consumer.cancel
43
- @queue.channel.close
44
- true
45
- end
46
-
47
- def block
48
- false
49
- end
50
-
51
- def consumers
52
- 1
53
- end
54
-
55
- def manual_ack
56
- true
57
- end
58
-
59
- def delay_start
60
- 0
61
- end
62
-
63
- def include_metadata_in_message?
64
- true
65
- end
66
-
67
- def process_message(message, metadata, delivery_info)
68
- payload = if metadata.content_encoding && metadata.content_encoding == 'encrypted/cs'
69
- Legion::Crypt.decrypt(message, metadata.headers['iv'])
70
- elsif metadata.content_encoding && metadata.content_encoding == 'encrypted/pk'
71
- Legion::Crypt.decrypt_from_keypair(metadata.headers[:public_key], message)
72
- else
73
- message
74
- end
75
-
76
- message = if metadata.content_type == 'application/json'
77
- Legion::JSON.load(payload)
78
- else
79
- { value: payload }
80
- end
81
- if include_metadata_in_message?
82
- message = message.merge(metadata.headers.transform_keys(&:to_sym)) unless metadata.headers.nil?
83
- message[:routing_key] = if Legion::Transport::TYPE == 'march_hare'
84
- metadata.routing_key
85
- else
86
- delivery_info[:routing_key]
87
- end
88
- end
89
-
90
- message[:timestamp] = (message[:timestamp_in_ms] / 1000).round if message.key?(:timestamp_in_ms) && !message.key?(:timestamp)
91
- message[:datetime] = Time.at(message[:timestamp].to_i).to_datetime.to_s if message.key?(:timestamp)
92
- message
93
- end
94
-
95
- def find_function(message = {})
96
- return runner_function if actor_class.instance_methods(false).include?(:runner_function)
97
- return function if actor_class.instance_methods(false).include?(:function)
98
- return action if actor_class.instance_methods(false).include?(:action)
99
- return message[:function] if message.key? :function
100
-
101
- function
102
- end
103
-
104
- def subscribe
105
- sleep(delay_start)
106
- consumer_tag = "#{Legion::Settings[:client][:name]}_#{lex_name}_#{runner_name}_#{Thread.current.object_id}"
107
- on_cancellation = block { cancel }
108
-
109
- @consumer = @queue.subscribe(manual_ack: manual_ack, block: false, consumer_tag: consumer_tag, on_cancellation: on_cancellation) do |*rmq_message|
110
- payload = rmq_message.pop
111
- metadata = rmq_message.last
112
- delivery_info = rmq_message.first
113
-
114
- message = process_message(payload, metadata, delivery_info)
115
- if use_runner?
116
- Legion::Runner.run(**message,
117
- runner_class: runner_class,
118
- function: find_function(message),
119
- check_subtask: check_subtask?,
120
- generate_task: generate_task?)
121
- else
122
- runner_class.send(find_function(message), **message)
123
- end
124
- @queue.acknowledge(delivery_info.delivery_tag) if manual_ack
125
-
126
- cancel if Legion::Settings[:client][:shutting_down]
127
- rescue StandardError => e
128
- Legion::Logging.error e.message
129
- Legion::Logging.error e.backtrace
130
- Legion::Logging.error message
131
- Legion::Logging.error function
132
- @queue.reject(delivery_info.delivery_tag) if manual_ack
133
- end
134
- end
135
- end
136
- end
137
- end
138
- end
@@ -1,61 +0,0 @@
1
- require_relative 'base'
2
-
3
- module Legion
4
- module Extensions
5
- module Builder
6
- module Actors
7
- include Legion::Extensions::Builder::Base
8
-
9
- attr_reader :actors
10
-
11
- def build_actors
12
- @actors = {}
13
- require_files(actor_files)
14
- build_actor_list
15
- build_meta_actor_list
16
- end
17
-
18
- def build_actor_list
19
- actor_files.each do |file|
20
- actor_name = file.split('/').last.sub('.rb', '')
21
- actor_class = "#{lex_class}::Actor::#{actor_name.split('_').collect(&:capitalize).join}"
22
- @actors[actor_name.to_sym] = {
23
- extension: lex_class.to_s.downcase,
24
- extension_name: extension_name,
25
- actor_name: actor_name,
26
- actor_class: Kernel.const_get(actor_class),
27
- type: 'literal'
28
- }
29
- end
30
- end
31
-
32
- def build_meta_actor_list
33
- @runners.each do |runner, attr|
34
- next if @actors[runner.to_sym].is_a? Hash
35
-
36
- actor_class = "#{attr[:extension_class]}::Actor::#{runner.to_s.split('_').collect(&:capitalize).join}"
37
- build_meta_actor(runner, attr) unless Kernel.const_defined? actor_class
38
- @actors[runner.to_sym] = {
39
- extension: attr[:extension],
40
- extension_name: attr[:extension_name],
41
- actor_name: attr[:runner_name],
42
- actor_class: Kernel.const_get(actor_class),
43
- type: 'meta'
44
- }
45
- end
46
- end
47
-
48
- def build_meta_actor(runner, attr)
49
- define_constant_two('Actor', root: lex_class)
50
-
51
- Kernel.const_get("#{attr[:extension_class]}::Actor")
52
- .const_set(runner.to_s.split('_').collect(&:capitalize).join, Class.new(Legion::Extensions::Actors::Subscription))
53
- end
54
-
55
- def actor_files
56
- @actor_files ||= find_files('actors')
57
- end
58
- end
59
- end
60
- end
61
- end