queues-rabbit 0.1.0.beta

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.
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Queues
4
+ module Rabbit
5
+ class Queue
6
+ class << self
7
+ attr_accessor :arguments, :auto_delete, :durable, :name, :no_ack, :prefetch, :schema
8
+
9
+ def bind(exchange, binding_key, arguments: {})
10
+ exchange = exchange < Queues::Rabbit::Exchange ? exchange.name : exchange
11
+ queue_instance.bind(exchange, binding_key, arguments: arguments)
12
+ true
13
+ rescue Exception => e
14
+ logger.error_with_report "Unable to bind '#{name}' to '#{exchange}' with key '#{binding_key}' and arguments: '#{arguments}': #{e.message}."
15
+ false
16
+ end
17
+
18
+ def delete
19
+ queue_instance.delete
20
+ true
21
+ rescue Exception => e
22
+ logger.error_with_report "Unable to delete #{name}: #{e.message}."
23
+ false
24
+ end
25
+
26
+ def logger
27
+ @@logger ||= Queues::Rabbit::Logger.new(name, Queues::Rabbit.log_level)
28
+ end
29
+
30
+ def queue(name, arguments: {}, auto_ack: true, auto_delete: false, durable: true, prefetch: 1)
31
+ self.arguments = arguments
32
+ self.auto_delete = auto_delete
33
+ self.durable = durable
34
+ self.name = name
35
+ self.no_ack = auto_ack
36
+ self.prefetch = prefetch
37
+ self
38
+ end
39
+
40
+ def queue_instance
41
+ @@queue_instance ||= schema.client_instance.queue(name, arguments: arguments, auto_delete: auto_delete, durable: durable)
42
+ end
43
+
44
+ #
45
+ # <Description>
46
+ #
47
+ # @param [String] body The message body, can be a string or either a byte array
48
+ # @param [Hash] properties Request properties
49
+ # @option properties [String] :app_id Used to identify the app that generated the message
50
+ # @option properties [String] :content_encoding Content encoding of the body
51
+ # @option properties [String] :content_type Content type of the body
52
+ # @option properties [Integer] :correlation_id The correlation id, mostly used used for RPC communication
53
+ # @option properties [Integer] :delivery_mode 2 for persistent messages, all other values are for transient messages
54
+ # @option properties [Integer, String] :expiration Number of seconds the message will stay in the queue
55
+ # @option properties [Hash<String, Object>] :headers Custom headers
56
+ # @option properties [Boolean] :mandatory The message will be returned if the message can't be routed to a queue
57
+ # @option properties [String] :message_id Can be used to uniquely identify the message, e.g. for deduplication
58
+ # @option properties [Boolean] :persistent Same as delivery_mode: 2
59
+ # @option properties [Integer] :priority The message priority (between 0 and 255)
60
+ # @option properties [String] :reply_to Queue to reply RPC responses to
61
+ # @option properties [Date] :timestamp Often used for the time the message was originally generated
62
+ # @option properties [String] :type Can indicate what kind of message this is
63
+ # @option properties [String] :user_id Used to identify the user that published the message
64
+ #
65
+ # @return [Boolean] true if published, false otherwise
66
+ #
67
+ def publish(body, **properties)
68
+ queue_instance.publish(body, **properties)
69
+ true
70
+ rescue Exception => e
71
+ logger.error_with_report "Unable to publish to #{name}: #{e.message}."
72
+ false
73
+ end
74
+
75
+ def purge
76
+ queue_instance.purge
77
+ true
78
+ rescue Exception => e
79
+ logger.error_with_report "Unable to purge #{name}: #{e.message}."
80
+ false
81
+ end
82
+
83
+ def subscribe
84
+ logger.info { "Subscribing to queue #{name}" }
85
+ consumer = new
86
+ queue_instance.subscribe(no_ack: no_ack, prefetch: prefetch) do |message|
87
+ consumer.consume(Queues::Rabbit::Message.new(message))
88
+ rescue Exception => e
89
+ logger.error { e.message }
90
+ logger.stdout e.message, :error
91
+ end
92
+
93
+ loop do
94
+ logger.stdout "Connection to #{name} alive."
95
+ sleep 10
96
+ end
97
+ rescue Exception => e
98
+ logger.error_with_report "Unable to connect to #{name}: #{e.message}."
99
+ false
100
+ end
101
+
102
+ def unbind(exchange, binding_key, arguments: {})
103
+ exchange = exchange < Queues::Rabbit::Exchange ? exchange.name : exchange
104
+ queue_instance.unbind(exhange, binding_key, arguments: arguments)
105
+ true
106
+ rescue Exception => e
107
+ logger.error_with_report "Unable to unbind '#{name}' to '#{exchange}' with key '#{binding_key}' and arguments: '#{arguments}': #{e.message}."
108
+ false
109
+ end
110
+ end
111
+
112
+ def consume(_message)
113
+ raise NoMethodError.new("Method #{__method__} must be defined to subscribe a queue!")
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Queues
4
+ module Rabbit
5
+ class Schema
6
+ include ActiveModel::Model
7
+ class << self
8
+ attr_accessor :client, :exchanges, :queues
9
+
10
+ def client_instance
11
+ @@client_instance ||= client.start
12
+ end
13
+
14
+ def exchange(klass)
15
+ self.exchanges ||= []
16
+ self.exchanges << klass
17
+ klass.schema = self
18
+ end
19
+
20
+ def queue(klass)
21
+ self.queues ||= []
22
+ self.queues << klass
23
+ klass.schema = self
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Queues
4
+ module Rabbit
5
+ VERSION = '0.1.0.beta'
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_model'
4
+ require 'active_support'
5
+ require 'amqp-client'
6
+ require 'logger'
7
+
8
+ require_relative 'rabbit/client'
9
+ require_relative 'rabbit/exchange'
10
+ require_relative 'rabbit/logger'
11
+ require_relative 'rabbit/message'
12
+ require_relative 'rabbit/queue'
13
+ require_relative 'rabbit/schema'
14
+ require_relative 'rabbit/version'
15
+
16
+ module Queues
17
+ module Rabbit
18
+ class Error < StandardError; end
19
+
20
+ class << self
21
+ attr_accessor :client, :logger, :log_level, :schema
22
+
23
+ def configure(schema_klass, host, log_level: ::Logger::INFO)
24
+ self.log_level = log_level
25
+ self.schema = schema_klass
26
+ schema.client = Queues::Rabbit::Client.new(host)
27
+ self
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,6 @@
1
+ module Queues
2
+ module Rabbit
3
+ VERSION: String
4
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: queues-rabbit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.beta
5
+ platform: ruby
6
+ authors:
7
+ - Lapo
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-03-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: amqp-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: queues
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.0.beta
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.0.beta
41
+ description: ''
42
+ email:
43
+ - lapoelisacci@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".rspec"
49
+ - ".rubocop.yml"
50
+ - CHANGELOG.md
51
+ - Gemfile
52
+ - Gemfile.lock
53
+ - LICENSE.txt
54
+ - README.md
55
+ - Rakefile
56
+ - lib/generators/queues_rabbit_generator.rb
57
+ - lib/generators/templates/exchange.rb
58
+ - lib/generators/templates/queue.rb
59
+ - lib/generators/templates/schema.rb
60
+ - lib/queues/rabbit.rb
61
+ - lib/queues/rabbit/client.rb
62
+ - lib/queues/rabbit/exchange.rb
63
+ - lib/queues/rabbit/logger.rb
64
+ - lib/queues/rabbit/message.rb
65
+ - lib/queues/rabbit/queue.rb
66
+ - lib/queues/rabbit/schema.rb
67
+ - lib/queues/rabbit/version.rb
68
+ - sig/queues/rabbit.rbs
69
+ homepage: https://github.com/LapoElisacci/queues.git
70
+ licenses:
71
+ - MIT
72
+ metadata:
73
+ homepage_uri: https://github.com/LapoElisacci/queues.git
74
+ source_code_uri: https://github.com/LapoElisacci/queues-rabbit.git
75
+ changelog_uri: https://github.com/LapoElisacci/queues-rabbit/blob/main/CHANGELOG.md
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 2.6.0
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.3.1
90
+ requirements: []
91
+ rubygems_version: 3.2.22
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: RabbitMQ Driver for Rails Queues
95
+ test_files: []