fleck 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -10
  3. data/CHANGELOG.md +89 -74
  4. data/Gemfile +6 -4
  5. data/examples/actions.rb +59 -53
  6. data/examples/blocking_consumer.rb +42 -42
  7. data/examples/consumer_initialization.rb +44 -42
  8. data/examples/deprecation.rb +50 -57
  9. data/examples/example.rb +76 -74
  10. data/examples/expired.rb +72 -76
  11. data/examples/fanout.rb +62 -64
  12. data/fleck.gemspec +37 -36
  13. data/lib/fleck/client.rb +124 -124
  14. data/lib/fleck/configuration.rb +149 -144
  15. data/lib/fleck/consumer.rb +7 -287
  16. data/lib/fleck/core/consumer/action_param.rb +106 -0
  17. data/lib/fleck/core/consumer/actions.rb +76 -0
  18. data/lib/fleck/core/consumer/base.rb +111 -0
  19. data/lib/fleck/core/consumer/configuration.rb +69 -0
  20. data/lib/fleck/core/consumer/decorators.rb +77 -0
  21. data/lib/fleck/core/consumer/helpers_definers.rb +55 -0
  22. data/lib/fleck/core/consumer/logger.rb +88 -0
  23. data/lib/fleck/core/consumer/request.rb +89 -0
  24. data/lib/fleck/core/consumer/response.rb +77 -0
  25. data/lib/fleck/core/consumer/response_helpers.rb +81 -0
  26. data/lib/fleck/core/consumer/validation.rb +163 -0
  27. data/lib/fleck/core/consumer.rb +166 -0
  28. data/lib/fleck/core.rb +9 -0
  29. data/lib/fleck/loggable.rb +15 -10
  30. data/lib/fleck/{hash_with_indifferent_access.rb → utilities/hash_with_indifferent_access.rb} +80 -85
  31. data/lib/fleck/utilities/host_rating.rb +104 -0
  32. data/lib/fleck/version.rb +6 -3
  33. data/lib/fleck.rb +81 -72
  34. metadata +35 -24
  35. data/lib/fleck/consumer/request.rb +0 -52
  36. data/lib/fleck/consumer/response.rb +0 -80
  37. data/lib/fleck/host_rating.rb +0 -74
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fleck
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Groza Sergiu
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-02 00:00:00.000000000 Z
11
+ date: 2022-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: 2.2.33
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.17'
26
+ version: 2.2.33
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -53,61 +53,61 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.9'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rainbow
56
+ name: bunny
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '2.2'
61
+ version: '2.14'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '2.2'
68
+ version: '2.14'
69
69
  - !ruby/object:Gem::Dependency
70
- name: bunny
70
+ name: oj
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '2.14'
75
+ version: '3.10'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '2.14'
82
+ version: '3.10'
83
83
  - !ruby/object:Gem::Dependency
84
- name: thread_safe
84
+ name: rainbow
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.3'
89
+ version: '2.2'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.3'
96
+ version: '2.2'
97
97
  - !ruby/object:Gem::Dependency
98
- name: oj
98
+ name: thread_safe
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.10'
103
+ version: '0.3'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.10'
110
+ version: '0.3'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: ztimer
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -157,11 +157,22 @@ files:
157
157
  - lib/fleck/client/response.rb
158
158
  - lib/fleck/configuration.rb
159
159
  - lib/fleck/consumer.rb
160
- - lib/fleck/consumer/request.rb
161
- - lib/fleck/consumer/response.rb
162
- - lib/fleck/hash_with_indifferent_access.rb
163
- - lib/fleck/host_rating.rb
160
+ - lib/fleck/core.rb
161
+ - lib/fleck/core/consumer.rb
162
+ - lib/fleck/core/consumer/action_param.rb
163
+ - lib/fleck/core/consumer/actions.rb
164
+ - lib/fleck/core/consumer/base.rb
165
+ - lib/fleck/core/consumer/configuration.rb
166
+ - lib/fleck/core/consumer/decorators.rb
167
+ - lib/fleck/core/consumer/helpers_definers.rb
168
+ - lib/fleck/core/consumer/logger.rb
169
+ - lib/fleck/core/consumer/request.rb
170
+ - lib/fleck/core/consumer/response.rb
171
+ - lib/fleck/core/consumer/response_helpers.rb
172
+ - lib/fleck/core/consumer/validation.rb
164
173
  - lib/fleck/loggable.rb
174
+ - lib/fleck/utilities/hash_with_indifferent_access.rb
175
+ - lib/fleck/utilities/host_rating.rb
165
176
  - lib/fleck/version.rb
166
177
  homepage: https://github.com/serioja90/fleck
167
178
  licenses:
@@ -175,14 +186,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
175
186
  requirements:
176
187
  - - ">="
177
188
  - !ruby/object:Gem::Version
178
- version: '2.3'
189
+ version: '2.5'
179
190
  required_rubygems_version: !ruby/object:Gem::Requirement
180
191
  requirements:
181
192
  - - ">="
182
193
  - !ruby/object:Gem::Version
183
194
  version: '0'
184
195
  requirements: []
185
- rubygems_version: 3.0.3
196
+ rubygems_version: 3.0.8
186
197
  signing_key:
187
198
  specification_version: 4
188
199
  summary: A Ruby gem for syncronous and asyncronous communication via Message Queue
@@ -1,52 +0,0 @@
1
-
2
- module Fleck
3
- class Consumer::Request
4
- include Fleck::Loggable
5
-
6
- attr_reader :id, :metadata, :payload, :action, :data, :headers, :action, :version, :ip, :params, :status, :errors
7
-
8
- def initialize(metadata, payload, delivery_info)
9
- @id = metadata.correlation_id
10
- logger.progname += " #{@id}"
11
-
12
- @metadata = metadata
13
- @payload = payload
14
- @exchange = delivery_info.exchange.inspect
15
- @queue = delivery_info.routing_key.inspect
16
- @data = {}
17
- @headers = (@metadata.headers || {}).to_hash_with_indifferent_access
18
- @action = @metadata.type
19
- @version = nil
20
- @ip = nil
21
- @params = {}
22
- @status = 200
23
- @errors = []
24
-
25
- parse_request!
26
- end
27
-
28
- protected
29
-
30
- def parse_request!
31
- @data = Oj.load(@payload, mode: :compat).to_hash_with_indifferent_access.filtered!
32
- @headers.merge!(@data["headers"] || {}).filtered!
33
-
34
- logger.debug "Processing request (exchange: #{@exchange}, queue: #{@queue}, options: #{@headers}, message: #{@data})"
35
-
36
- @action ||= @headers["action"]
37
- @headers["action"] ||= @action
38
- @version = @headers["version"]
39
- @ip = @headers["ip"]
40
- @params = @data["params"] || {}
41
- rescue Oj::ParseError => e
42
- logger.error(e.inspect + "\n" + e.backtrace.join("\n"))
43
- @status = 400
44
- @errors << "Bad Request"
45
- @errors << e.inspect
46
- rescue => e
47
- logger.error(e.inspect + "\n" + e.backtrace.join("\n"))
48
- @status = 500
49
- @errors << "Internal Server Error"
50
- end
51
- end
52
- end
@@ -1,80 +0,0 @@
1
-
2
- module Fleck
3
- class Consumer::Response
4
- include Fleck::Loggable
5
-
6
- attr_accessor :id, :status, :errors, :headers, :body
7
-
8
- def initialize(request_id)
9
- @id = request_id
10
- logger.progname += " #{@id}"
11
-
12
- @status = 200
13
- @errors = []
14
- @headers = {}
15
- @body = nil
16
- @rejected = false
17
- @requeue = false
18
- @deprecated = false
19
- end
20
-
21
- def reject!(requeue: false)
22
- @rejected = true
23
- @requeue = requeue
24
- end
25
-
26
- def rejected?
27
- return @rejected
28
- end
29
-
30
- def requeue?
31
- return @requeue
32
- end
33
-
34
- def deprecated!
35
- @deprecated = true
36
- end
37
-
38
- def deprecated?
39
- @deprecated
40
- end
41
-
42
- def not_found(msg = nil)
43
- @status = 404
44
- @errors << 'Resource Not Found'
45
- @errors << msg if msg
46
- end
47
-
48
- def render_error(status, msg = [])
49
- @status = status.to_i
50
- if msg.is_a?(Array)
51
- @errors += msg
52
- else
53
- @errors << msg
54
- end
55
- end
56
-
57
- def to_json(filter: false)
58
- data = {
59
- "status" => @status,
60
- "errors" => @errors,
61
- "headers" => @headers,
62
- "body" => @body,
63
- "deprecated" => @deprecated
64
- }
65
- data.filter! if filter
66
-
67
- return Oj.dump(data, mode: :compat)
68
- rescue => e
69
- logger.error e.inspect + "\n" + e.backtrace.join("\n")
70
- return Oj.dump({
71
- "status" => 500,
72
- "errors" => ['Internal Server Error', 'Failed to dump the response to JSON']
73
- }, mode: :compat)
74
- end
75
-
76
- def to_s
77
- return "#<#{self.class} #{self.to_json(filter: true)}>"
78
- end
79
- end
80
- end
@@ -1,74 +0,0 @@
1
- require 'socket'
2
-
3
- module Fleck
4
- class HostRating
5
- include Fleck::Loggable
6
-
7
- CONN_TIMEOUT = 5
8
-
9
- attr_reader :host, :port, :avg, :history
10
-
11
- def initialize(host: 'localhost', port: 5672, refresh_rate: 30000, period: 300000)
12
- @host = host
13
- @port = port
14
- @refresh_rate = refresh_rate
15
- @period = period
16
-
17
- # metrics
18
- @reachable = false
19
- @avg = 0
20
- @updated_at = nil
21
- @history = []
22
-
23
- refresh!
24
- @timer = Ztimer.every(@refresh_rate){ refresh! }
25
- end
26
-
27
- def reachable?
28
- @reachable
29
- end
30
-
31
- def close
32
- @timer.cancel!
33
- end
34
-
35
- def <=>(other_host)
36
- return 1 if !self.reachable? && other_host.reachable? # the other host is reachable, so it comes first
37
- return 0 if !(self.reachable? || other_host.reachable?) # both host are unreachable, so they have the same priority
38
- return -1 if self.reachable? && !other_host.reachable? # the current host comes first, because it's reachable, while the other host is unreachable
39
-
40
- # when both hosts are reachable, use avg latency to order them
41
- return self.avg <=> other_host.avg
42
- end
43
-
44
- private
45
-
46
- def refresh!
47
- # Get host info and open a new socket
48
- addr = Socket.getaddrinfo(@host, nil)
49
- sock_addr = Socket.pack_sockaddr_in(@port, addr[0][3])
50
- socket = Socket.new(:AF_INET, :SOCK_STREAM, 0)
51
- socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
52
-
53
- started_at = Time.now.to_f
54
- begin
55
- socket.connect_nonblock(sock_addr)
56
- rescue IO::WaitWritable
57
- IO.select(nil, [socket], nil, CONN_TIMEOUT) or raise Timeout::Error
58
- end
59
- latency = (Time.now.to_f - started_at) * 1000 # ms
60
- socket.close
61
-
62
- @history << latency
63
- @history.shift if @history.size > @period / @refresh_rate
64
- @avg = @history.inject(:+).to_f / @history.size
65
- @reachable = true
66
- rescue SocketError, Timeout::Error => e
67
- socket.close if socket
68
- @reachable = false
69
- logger.error "Connection error: #{@host}:#{@port} (#{e.inspect})"
70
- ensure
71
- @updated_at = Time.now
72
- end
73
- end
74
- end