fleck 1.0.1 → 2.0.0

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 (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