twingly-amqp 3.3.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b73b12f7ad3443cc1515288abad101ab00b0f987
4
- data.tar.gz: b6394cd5f3b16025d196f4c67e579f59bf01867c
3
+ metadata.gz: 6219ee67359e165f827b9c944028390b4506a0e6
4
+ data.tar.gz: 83fedd73df0b32f0d9929001ca2bc431ab2149c3
5
5
  SHA512:
6
- metadata.gz: a3a921f4a6a8f95184d00a08a33e7947aff1b9996619417f5f689553c7137026833b2a47ee301b1fd65ebe270582f3522f2c0c5aa498931276e2fe882952543b
7
- data.tar.gz: 4221dee81f1da5e7237098506dbfeed96d5d5925908651c1becef5983ebada7d6e34d914df7234a579b4da19b0d672bb6d49b4ae629bc0979cb8790e95d8ad0b
6
+ metadata.gz: 2e923cc07303a09621892d0405093a247c4828c02060c585fa5a011b70321b14cd3adfa12560338d67c68d773cb214d2e2f876b9c0117fceb00a4d24979a76ef
7
+ data.tar.gz: ad3c376131f4309417d7d0292da8ca35347478469d390fc543ecbb72abcab06d78eddab1cc8a90d2daa6a0fa4dc1bbc16c3acca02faec34689fc991ad833c039
data/README.md CHANGED
@@ -21,14 +21,14 @@ Or install it yourself as:
21
21
 
22
22
  Environment variables:
23
23
 
24
- * `RABBITMQ_N_HOST`
25
- * `AMQP_USERNAME`
26
- * `AMQP_PASSWORD`
27
- * `AMQP_TLS` # Use TLS connection if set
24
+ * `RABBITMQ_N_HOST` - Defaults to `localhost`
25
+ * `AMQP_USERNAME` - Defaults to `guest`
26
+ * `AMQP_PASSWORD` - Defaults to `guest`
27
+ * `AMQP_TLS` - Use TLS connection if set
28
28
 
29
29
  ### Customize options
30
30
 
31
- If you don't have the RabbitMQ hosts, user or password in your ENV you can set them with `Twingly::AMQP::Connection.options=` before you create an instance of `Subscription` or `Ping`.
31
+ If you don't have the RabbitMQ hosts, user or password in your ENV you can set them with `Twingly::AMQP::Connection.options=` before you create an instance of `Subscription` or `Pinger`.
32
32
 
33
33
  *Options set in `Connection.options=` take precedence over the options defined in `ENV`.*
34
34
 
@@ -59,9 +59,9 @@ subscription = Twingly::AMQP::Subscription.new(
59
59
  subscription.on_exception { |exception| puts "Oh noes! #{exception.message}" }
60
60
  subscription.before_handle_message { |raw_message_payload| puts raw_message }
61
61
 
62
- subscription.subscribe do |message| # An instance of Twingly::AMQP::Message
62
+ subscription.each_message do |message| # An instance of Twingly::AMQP::Message
63
63
  begin
64
- response = client.post(payload.fetch(:url))
64
+ response = client.post(message.payload.fetch(:url))
65
65
 
66
66
  case response.code
67
67
  when 200 then message.ack # No error
@@ -78,29 +78,37 @@ end
78
78
  ### Ping urls
79
79
 
80
80
  ```ruby
81
- pinger = Twingly::AMQP::Ping.new(
82
- provider_name: "a-provider-name",
81
+ pinger = Twingly::AMQP::Pinger.new(
83
82
  queue_name: "provider-ping",
84
- priority: 1,
85
- source_ip: "?.?.?.?", # Optional, can be given to #ping
86
83
  url_cache: url_cache, # Optional, see below
87
84
  )
88
85
 
86
+ # Optional, options can also be given to #ping
87
+ pinger.default_ping_options do |options|
88
+ options.provider_name = "TestProvider"
89
+ options.source_ip = "?.?.?.?"
90
+ options.priority = 1
91
+ end
92
+
89
93
  urls = [
90
94
  "http://blog.twingly.com",
91
95
  ]
92
96
 
93
- pinger.ping(urls) do |pinged_url|
97
+ # Optional, is merged with the default options above
98
+ options = {
99
+ provider_name: "a-provider-name",
100
+ source_ip: "?.?.?.?",
101
+ priority: 1,
102
+ }
103
+
104
+ pinger.ping(urls, options) do |pinged_url|
94
105
  # Optional block that gets called for each pinged url
95
106
  end
96
-
97
- # Send a ping using another source ip
98
- pinger.ping(urls, source_ip: "1.2.3.4")
99
107
  ```
100
108
 
101
109
  #### Url cache
102
110
 
103
- `Twingly::AMQP::Ping.new` can optionally take an url cache which caches the urls and only pings in the urls that isn't already cached. The cache needs to respond to the two following methods:
111
+ `Twingly::AMQP::Pinger.new` can optionally take an url cache which caches the urls and only pings in the urls that isn't already cached. The cache needs to respond to the two following methods:
104
112
 
105
113
  ```ruby
106
114
  class UrlCache
data/lib/twingly/amqp.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  require "twingly/amqp/version"
2
-
3
- ENV["RUBY_ENV"] ||= "development"
4
-
5
2
  require "twingly/amqp/session"
6
3
  require "twingly/amqp/connection"
7
4
  require "twingly/amqp/subscription"
8
- require "twingly/amqp/ping"
5
+ require "twingly/amqp/ping_options"
6
+ require "twingly/amqp/pinger"
@@ -1,5 +1,4 @@
1
1
  require "twingly/amqp/session"
2
- require "bunny"
3
2
 
4
3
  module Twingly
5
4
  module AMQP
@@ -0,0 +1,39 @@
1
+ module Twingly
2
+ module AMQP
3
+ class PingOptions
4
+ attr_accessor :provider_name, :source_ip, :priority
5
+
6
+ def initialize(provider_name: nil, source_ip: nil, priority: nil)
7
+ self.provider_name = provider_name
8
+ self.source_ip = source_ip
9
+ self.priority = priority
10
+
11
+ yield self if block_given?
12
+ end
13
+
14
+ def to_h
15
+ {
16
+ automatic_ping: false,
17
+ provider_name: provider_name,
18
+ source_ip: source_ip,
19
+ priority: priority,
20
+ }
21
+ end
22
+
23
+ def validate
24
+ missing_keys = to_h.select { |_, value| value.to_s.empty? }.keys
25
+ if missing_keys.any?
26
+ fail ArgumentError, "Required options not set: #{missing_keys}"
27
+ end
28
+ end
29
+
30
+ def merge(other)
31
+ PingOptions.new do |options|
32
+ options.provider_name = other.provider_name || provider_name
33
+ options.source_ip = other.source_ip || source_ip
34
+ options.priority = other.priority || priority
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,22 +1,26 @@
1
1
  require "twingly/amqp/connection"
2
+ require "twingly/amqp/ping_options"
2
3
  require "json"
3
4
 
4
5
  module Twingly
5
6
  module AMQP
6
- class Ping
7
- def initialize(provider_name:, queue_name:, priority:, source_ip: nil, url_cache: NullCache, connection: nil)
8
- @url_cache = url_cache
9
-
10
- @provider_name = provider_name
11
- @queue_name = queue_name
12
- @source_ip = source_ip
13
- @priority = priority
7
+ class Pinger
8
+ def initialize(queue_name:, url_cache: NullCache, connection: nil)
9
+ @queue_name = queue_name
10
+ @url_cache = url_cache
14
11
 
15
12
  connection ||= Connection.instance
16
13
  @channel = connection.create_channel
14
+
15
+ @default_ping_options = PingOptions.new
17
16
  end
18
17
 
19
- def ping(urls, options = {})
18
+ def ping(urls, options_hash = {})
19
+ options = PingOptions.new(options_hash)
20
+ options = @default_ping_options.merge(options)
21
+
22
+ options.validate
23
+
20
24
  Array(urls).each do |url|
21
25
  unless cached?(url)
22
26
  publish(url, options)
@@ -27,6 +31,10 @@ module Twingly
27
31
  end
28
32
  end
29
33
 
34
+ def default_ping_options
35
+ yield @default_ping_options
36
+ end
37
+
30
38
  private
31
39
 
32
40
  def publish(url, options)
@@ -43,16 +51,10 @@ module Twingly
43
51
  end
44
52
 
45
53
  def message(url, options)
46
- source_ip = options.fetch(:source_ip) { @source_ip }
47
- raise ArgumentError, ":source_ip not specified" unless source_ip
54
+ ping_message = options.to_h
55
+ ping_message[:url] = url
48
56
 
49
- {
50
- automatic_ping: false,
51
- provider_name: @provider_name,
52
- priority: @priority,
53
- source_ip: source_ip,
54
- url: url,
55
- }
57
+ ping_message
56
58
  end
57
59
 
58
60
  def cached?(url)
@@ -1,8 +1,14 @@
1
+ require "bunny"
2
+
1
3
  module Twingly
2
4
  module AMQP
3
5
  class Session
4
6
  attr_reader :connection, :options
5
7
 
8
+ DEFAULT_USER = "guest"
9
+ DEFAULT_PASS = "guest"
10
+ DEFAULT_HOSTS = ["localhost"]
11
+
6
12
  def initialize(options = {})
7
13
  @options = options
8
14
  @connection = create_connection
@@ -11,11 +17,7 @@ module Twingly
11
17
  private
12
18
 
13
19
  def create_connection
14
- if ruby_env == "development"
15
- connection = Bunny.new
16
- else
17
- connection = Bunny.new(connection_options)
18
- end
20
+ connection = Bunny.new(connection_options)
19
21
  connection.start
20
22
  connection
21
23
  end
@@ -34,26 +36,26 @@ module Twingly
34
36
  }
35
37
  end
36
38
 
37
- def ruby_env
38
- ENV.fetch("RUBY_ENV")
39
- end
40
-
41
39
  def tls?
42
40
  ENV.has_key?("AMQP_TLS")
43
41
  end
44
42
 
45
43
  def user_from_env
46
- ENV.fetch("AMQP_USERNAME")
44
+ ENV.fetch("AMQP_USERNAME") { DEFAULT_USER }
47
45
  end
48
46
 
49
47
  def password_from_env
50
- ENV.fetch("AMQP_PASSWORD")
48
+ ENV.fetch("AMQP_PASSWORD") { DEFAULT_PASS }
51
49
  end
52
50
 
53
51
  def hosts_from_env
54
52
  # Matches env keys like `RABBITMQ_01_HOST`
55
53
  environment_keys_with_host = ENV.keys.select { |key| key =~ /^rabbitmq_\d+_host$/i }
56
- environment_keys_with_host.map { |key| ENV[key] }
54
+ hosts = environment_keys_with_host.map { |key| ENV[key] }
55
+
56
+ return DEFAULT_HOSTS if hosts.empty?
57
+
58
+ hosts
57
59
  end
58
60
  end
59
61
  end
@@ -24,7 +24,7 @@ module Twingly
24
24
  @on_exception_callback = Proc.new {}
25
25
  end
26
26
 
27
- def subscribe(&block)
27
+ def each_message(&block)
28
28
  setup_traps
29
29
 
30
30
  consumer = @queue.subscribe(subscribe_options) do |delivery_info, metadata, payload|
@@ -45,7 +45,6 @@ module Twingly
45
45
  sleep 0.5
46
46
  end
47
47
 
48
- puts "Shutting down" if development?
49
48
  consumer.cancel
50
49
  end
51
50
 
@@ -71,20 +70,11 @@ module Twingly
71
70
  channel = connection.create_channel(nil, @consumer_threads)
72
71
  channel.prefetch(@prefetch)
73
72
  channel.on_uncaught_exception do |exception, _|
74
- puts exception.message, exception.backtrace if development?
75
73
  @on_exception_callback.call(exception)
76
74
  end
77
75
  channel
78
76
  end
79
77
 
80
- def development?
81
- ruby_env == "development"
82
- end
83
-
84
- def ruby_env
85
- ENV.fetch("RUBY_ENV")
86
- end
87
-
88
78
  def queue_options
89
79
  {
90
80
  durable: true,
@@ -99,7 +89,7 @@ module Twingly
99
89
  end
100
90
 
101
91
  def consumer_tag
102
- tag_name = [Socket.gethostname, ruby_env].join('-')
92
+ tag_name = Socket.gethostname
103
93
  @channel.generate_consumer_tag(tag_name)
104
94
  end
105
95
 
@@ -1,5 +1,5 @@
1
1
  module Twingly
2
2
  module Amqp
3
- VERSION = "3.3.0"
3
+ VERSION = "4.0.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twingly-amqp
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Twingly AB
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-02 00:00:00.000000000 Z
11
+ date: 2015-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
@@ -63,7 +63,8 @@ files:
63
63
  - lib/twingly/amqp.rb
64
64
  - lib/twingly/amqp/connection.rb
65
65
  - lib/twingly/amqp/message.rb
66
- - lib/twingly/amqp/ping.rb
66
+ - lib/twingly/amqp/ping_options.rb
67
+ - lib/twingly/amqp/pinger.rb
67
68
  - lib/twingly/amqp/session.rb
68
69
  - lib/twingly/amqp/subscription.rb
69
70
  - lib/twingly/amqp/version.rb
@@ -86,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
87
  version: '0'
87
88
  requirements: []
88
89
  rubyforge_project:
89
- rubygems_version: 2.4.5
90
+ rubygems_version: 2.5.0
90
91
  signing_key:
91
92
  specification_version: 4
92
93
  summary: Ruby library for talking to RabbitMQ