routemaster-client 3.1.0 → 3.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cd1e1f24e8d625dbdd9824f986e1c3fe57107575
4
- data.tar.gz: ea838ffeb71a05fca351a41b00075bad143ec31f
3
+ metadata.gz: 5f38e0d37b7b2438fdc823e0df9d08ae2a45df05
4
+ data.tar.gz: 9ebb5aacf9ac9cf1e806f29b8908fb1f2b1c13a9
5
5
  SHA512:
6
- metadata.gz: 8f08a91701b5d8984fe51fe40f0c9c659647f0648a9ef432422e471b821c5c4fd7092efe4db5a8cf5e2d030438ab4f67c92e89669d6a509ae47531d02254c6b6
7
- data.tar.gz: bbc44b01fed6ecb14932da518d67bbff9c9b38823bc8a98cf77de6f124d9868c496eea1f4f7d26924e320544e793cebf61609846910eaf52a024467cdeb09ae7
6
+ metadata.gz: 6d9ae9d682feb8add9c4946e9fd2a8e1a2f803a6d6cd7802d255498df54f02ad763dd9f90f9a65ae6cbbaccc5f48efb2116ad05f9ba76348bdd7c036b36da74c
7
+ data.tar.gz: d02d9fd0b1cff7ccba425bc67efb38cd14e0a41cadea41c8d2ed28e3df0ffcd09b5e876148942f4a2fc8f4351859aad28c7e4868ae33937eb859214b94df34bb
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.4.1
@@ -1,9 +1,9 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
  rvm:
4
- - 2.2.5
5
- - 2.3.1
6
- - 2.4.0
4
+ - 2.2.7
5
+ - 2.3.4
6
+ - 2.4.1
7
7
  - ruby-head
8
8
  script:
9
9
  - bundle exec rspec
@@ -1,5 +1,22 @@
1
- # v3.1.0 (2017-03-28)
1
+ ## 3.1.1 (2017-08-15)
2
2
 
3
- Features:
3
+ Features:
4
+
5
+ - Adds the `rtm` command-line API wrapper (#24)
6
+ - Adds the `#monitor_subscriptions` API (#17)
7
+
8
+ Changes:
9
+
10
+ - The `Routemaster::Topic` value object class is not namespaced as
11
+ `Routemaster::Client::Topic` (#17)
12
+
13
+ Bug fixes:
14
+
15
+ - Always send a timestamp when sending asynchronously (#20)
16
+ - Sidekiq 5 compatibility (#22)
17
+
18
+ ## 3.1.0 (2017-03-28)
19
+
20
+ Features:
4
21
 
5
22
  - Adds support for event payloads (#16)
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- routemaster-client (3.1.0)
4
+ routemaster-client (3.1.1)
5
5
  faraday (>= 0.9.0)
6
+ hashie
6
7
  oj (~> 2.17)
7
8
  typhoeus (~> 1.1)
8
9
  wisper (~> 1.6.1)
@@ -10,7 +11,7 @@ PATH
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
13
- addressable (2.5.0)
14
+ addressable (2.5.1)
14
15
  public_suffix (~> 2.0, >= 2.0.2)
15
16
  byebug (9.0.6)
16
17
  codeclimate-test-reporter (1.0.8)
@@ -24,7 +25,7 @@ GEM
24
25
  docile (1.1.5)
25
26
  ethon (0.10.1)
26
27
  ffi (>= 1.3.0)
27
- faraday (0.11.0)
28
+ faraday (0.12.2)
28
29
  multipart-post (>= 1.2, < 3)
29
30
  ffi (1.9.18)
30
31
  formatador (0.2.5)
@@ -42,20 +43,21 @@ GEM
42
43
  guard (~> 2.1)
43
44
  guard-compat (~> 1.1)
44
45
  rspec (>= 2.99.0, < 4.0)
45
- hashdiff (0.3.2)
46
- json (2.0.3)
46
+ hashdiff (0.3.4)
47
+ hashie (3.5.6)
48
+ json (2.1.0)
47
49
  listen (3.1.5)
48
50
  rb-fsevent (~> 0.9, >= 0.9.4)
49
51
  rb-inotify (~> 0.9, >= 0.9.7)
50
52
  ruby_dep (~> 1.2)
51
- lumberjack (1.0.11)
53
+ lumberjack (1.0.12)
52
54
  method_source (0.8.2)
53
55
  multipart-post (2.0.0)
54
56
  nenv (0.3.0)
55
57
  notiffany (0.1.1)
56
58
  nenv (~> 0.1)
57
59
  shellany (~> 0.0)
58
- oj (2.18.3)
60
+ oj (2.18.5)
59
61
  pry (0.10.4)
60
62
  coderay (~> 1.1.0)
61
63
  method_source (~> 0.8.1)
@@ -65,47 +67,47 @@ GEM
65
67
  pry (~> 0.10)
66
68
  psych (2.2.4)
67
69
  public_suffix (2.0.5)
68
- rack (2.0.1)
69
- rack-protection (1.5.3)
70
+ rack (2.0.3)
71
+ rack-protection (2.0.0)
70
72
  rack
71
- rack-test (0.6.3)
72
- rack (>= 1.0)
73
+ rack-test (0.7.0)
74
+ rack (>= 1.0, < 3)
73
75
  rake (12.0.0)
74
- rb-fsevent (0.9.8)
75
- rb-inotify (0.9.8)
76
- ffi (>= 0.5.0)
76
+ rb-fsevent (0.10.2)
77
+ rb-inotify (0.9.10)
78
+ ffi (>= 0.5.0, < 2)
77
79
  redis (3.3.3)
78
- rspec (3.5.0)
79
- rspec-core (~> 3.5.0)
80
- rspec-expectations (~> 3.5.0)
81
- rspec-mocks (~> 3.5.0)
82
- rspec-core (3.5.4)
83
- rspec-support (~> 3.5.0)
84
- rspec-expectations (3.5.0)
80
+ rspec (3.6.0)
81
+ rspec-core (~> 3.6.0)
82
+ rspec-expectations (~> 3.6.0)
83
+ rspec-mocks (~> 3.6.0)
84
+ rspec-core (3.6.0)
85
+ rspec-support (~> 3.6.0)
86
+ rspec-expectations (3.6.0)
85
87
  diff-lcs (>= 1.2.0, < 2.0)
86
- rspec-support (~> 3.5.0)
87
- rspec-mocks (3.5.0)
88
+ rspec-support (~> 3.6.0)
89
+ rspec-mocks (3.6.0)
88
90
  diff-lcs (>= 1.2.0, < 2.0)
89
- rspec-support (~> 3.5.0)
90
- rspec-support (3.5.0)
91
+ rspec-support (~> 3.6.0)
92
+ rspec-support (3.6.0)
91
93
  ruby_dep (1.5.0)
92
94
  safe_yaml (1.0.4)
93
95
  shellany (0.0.1)
94
- sidekiq (4.2.10)
96
+ sidekiq (5.0.4)
95
97
  concurrent-ruby (~> 1.0)
96
98
  connection_pool (~> 2.2, >= 2.2.0)
97
99
  rack-protection (>= 1.5.0)
98
- redis (~> 3.2, >= 3.2.1)
100
+ redis (~> 3.3, >= 3.3.3)
99
101
  simplecov (0.13.0)
100
102
  docile (~> 1.1.0)
101
103
  json (>= 1.8, < 3)
102
104
  simplecov-html (~> 0.10.0)
103
- simplecov-html (0.10.0)
105
+ simplecov-html (0.10.1)
104
106
  slop (3.6.0)
105
107
  thor (0.19.4)
106
108
  typhoeus (1.1.2)
107
109
  ethon (>= 0.9.0)
108
- webmock (2.3.2)
110
+ webmock (3.0.1)
109
111
  addressable (>= 2.3.6)
110
112
  crack (>= 0.3.2)
111
113
  hashdiff
@@ -128,4 +130,4 @@ DEPENDENCIES
128
130
  webmock
129
131
 
130
132
  BUNDLED WITH
131
- 1.14.5
133
+ 1.15.3
data/README.md CHANGED
@@ -1,25 +1,20 @@
1
1
  ## routemaster-client [![Version](https://badge.fury.io/rb/routemaster-client.svg)](https://rubygems.org/gems/routemaster-client) [![Build](https://travis-ci.org/deliveroo/routemaster-client.svg?branch=master)](https://travis-ci.org/deliveroo/routemaster-client) [![Code Climate](https://codeclimate.com/github/deliveroo/routemaster-client/badges/gpa.svg)](https://codeclimate.com/github/deliveroo/routemaster-client) [![Test Coverage](https://codeclimate.com/github/deliveroo/routemaster-client/badges/coverage.svg)](https://codeclimate.com/github/deliveroo/routemaster-client/coverage) [![Docs](http://img.shields.io/badge/API%20docs-rubydoc.info-blue.svg)](http://rubydoc.info/github/deliveroo/routemaster-client/frames/file/README.md)
2
2
 
3
- A Ruby API for the [Routemaster](https://github.com/deliveroo/routemaster) event
4
- bus.
3
+ A Ruby API and CLI for the
4
+ [Routemaster](https://github.com/deliveroo/routemaster) event bus.
5
5
 
6
+ [Installation](#installation) | [Library usage](#library-usage) | [CLI usage](#cli-usage)
6
7
 
7
8
 
8
9
  ## Installation
9
10
 
10
- Add this line to your application's Gemfile:
11
-
12
- gem 'routemaster-client'
13
-
14
- And then execute:
11
+ gem install routemaster-client
15
12
 
16
- $ bundle
13
+ ## Library usage
17
14
 
18
- Or install it yourself as:
19
-
20
- $ gem install routemaster-client
15
+ Add this line to your application's Gemfile:
21
16
 
22
- ## Usage
17
+ gem 'routemaster-client'
23
18
 
24
19
  **Configure** your client:
25
20
 
@@ -128,6 +123,102 @@ Routemaster::Client.monitor_subscriptions
128
123
  # } ... ]
129
124
  ```
130
125
 
126
+ ## CLI usage
127
+
128
+ This gem includes the `rtm` binary, which can be used to interact with a
129
+ Routemaster bus.
130
+
131
+ ### Commands
132
+
133
+ ```
134
+ rtm token add [options] SERVICE TOKEN
135
+ ```
136
+
137
+ Adds `TOKEN` to the list of API tokens permitted to use the bus API. `SERVICE`
138
+ is a human-readable name for this token.
139
+
140
+ ```
141
+ rtm token del [options] TOKEN
142
+ ```
143
+
144
+ Removes `TOKEN` from permitted tokens if it exists.
145
+
146
+ ```
147
+ rtm token list [options]
148
+ ```
149
+
150
+ Lists currently permitted API tokens.
151
+
152
+ ```
153
+ rtm sub add [options] URL TOPICS... [--latency MS] [--batch-size COUNT]
154
+ ```
155
+
156
+ Adds (or updates) a subscription. Note that the `TOKEN` passed in `option` must be
157
+ that of the subscriber, not a root token.
158
+
159
+ - `URL` must be HTTPS and include an authentication username (used by the bus
160
+ when delivering events).
161
+ - `TOPICS` is a list of topic names.
162
+ - `MS`, if specified, is the target delivery latency for this subscriber (ie.
163
+ how long to buffer events).
164
+ - `COUNT`, if specified, is the maximum number of events in a delivered batch.
165
+
166
+ ```
167
+ rtm sub del [options] [TOPICS]
168
+ ```
169
+
170
+ Updates or removes a subscription. Note that the `TOKEN` passed in `option` must
171
+ be that of the subscriber, not a root token. If no `TOPICS` are specified, the
172
+ subscription is entirely removed.
173
+
174
+ ```
175
+ rtm sub list [options]
176
+ ```
177
+
178
+ List existing subscriptions.
179
+
180
+ ```
181
+ rtm pub [options] EVENT TOPIC URL
182
+ ```
183
+
184
+ Publishes an event to the bus. Note that the `TOKEN` passed in `option` must
185
+ be that of the subscriber, not a root token. `EVENT` must be one of `created`,
186
+ `updated`, `deleted`, or `noop`. `TOPIC` must be a valid topic name. `URL` must
187
+ be a valid HTTPS URL.
188
+
189
+
190
+ ### Global options
191
+
192
+ ```
193
+ -b|--bus DOMAIN|@NAME
194
+ ```
195
+
196
+ The domain names of the bus to interact with, or a reference (`NAME`) to global
197
+ configuration.
198
+
199
+ Note that `DOMAIN` is _not_ a URL.
200
+
201
+ ```
202
+ -t|--token TOKEN
203
+ ```
204
+
205
+ An API token to use when querying the bus.
206
+
207
+
208
+ `rtm` will load a configuration file in Yaml format (`.rtmrc` or `~/.rtmrc`).
209
+ Example:
210
+
211
+ ```
212
+ # .rtmrc
213
+ production:
214
+ bus: prod.bus.example.com
215
+ token: 2bf959d1-04fb-4912-8450-ab646888d476
216
+ ```
217
+
218
+ With this configuration, `rtm token list -b @production` will list API tokens
219
+ for the bus at the domain specified in the config.
220
+
221
+
131
222
  ## Contributing
132
223
 
133
224
  1. Fork it ( http://github.com/deliveroo/routemaster-client/fork )
data/exe/rtm ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'routemaster/cli/top_level'
5
+
6
+ begin
7
+ Routemaster::CLI::Toplevel.new.run(ARGV)
8
+ rescue Routemaster::CLI::Exit => e
9
+ exit e.message.to_i
10
+ end
11
+
@@ -16,8 +16,13 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^spec/})
17
17
  spec.require_paths = %w(.)
18
18
 
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+
19
22
  spec.add_runtime_dependency 'typhoeus', '~> 1.1'
20
23
  spec.add_runtime_dependency 'faraday', '>= 0.9.0'
21
24
  spec.add_runtime_dependency 'wisper', '~> 1.6.1'
22
25
  spec.add_runtime_dependency 'oj', '~> 2.17'
26
+
27
+ spec.add_runtime_dependency 'hashie'
23
28
  end
@@ -0,0 +1,134 @@
1
+ require 'routemaster/cli/helper'
2
+ require 'optparse'
3
+ require 'hashie'
4
+
5
+ module Routemaster
6
+ module CLI
7
+ class Base
8
+ def self.inherited(by)
9
+ by.extend(ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ def prefix(ary = nil)
14
+ @prefix ||= ary
15
+ end
16
+
17
+ def syntax(string = nil)
18
+ string ? (@syntax = string) : ['rtm', *@prefix, @syntax, '[options]'].compact.join(' ')
19
+ end
20
+
21
+ def descr(string = nil)
22
+ string ? (@descr = string) : @descr
23
+ end
24
+
25
+ def defaults(hash = nil)
26
+ hash ? (@defaults = hash) : (@defaults || {})
27
+ end
28
+
29
+ def options(&block)
30
+ block_given? ? (@options = block) : @options
31
+ end
32
+
33
+ def action(&block)
34
+ block_given? ? (@action = block) : @action || lambda { |*| }
35
+ end
36
+ end
37
+
38
+ def initialize(stderr:, stdout:)
39
+ @stderr = stderr
40
+ @stdout = stdout
41
+ end
42
+
43
+ def run(argv)
44
+ @argv = argv
45
+ _parser.parse!(@argv)
46
+ instance_eval(&self.class.action)
47
+ rescue Exit
48
+ raise
49
+ rescue StandardError => e
50
+ log "#{e.class.name}: #{e.message}"
51
+ if config.verbose
52
+ e.backtrace.each { |l| log "\t#{l}" }
53
+ end
54
+ raise Exit, 2
55
+ end
56
+
57
+ protected
58
+
59
+ def argv
60
+ @argv || []
61
+ end
62
+
63
+ def config
64
+ @config ||= Hashie::Mash.new(_default_options).merge(self.class.defaults)
65
+ end
66
+
67
+ def helper
68
+ Helper.new(config)
69
+ end
70
+
71
+ def log(message)
72
+ @stderr.puts(message)
73
+ end
74
+
75
+ def puts(message)
76
+ @stdout.puts(message)
77
+ end
78
+
79
+ def usage!
80
+ log "Usage:"
81
+ log _parser
82
+ raise Exit, 1
83
+ end
84
+
85
+ def bad_argc!
86
+ log "Wrong number of arguments."
87
+ usage!
88
+ end
89
+
90
+ private
91
+
92
+ def _default_options
93
+ { verbose: false }
94
+ end
95
+
96
+ def _parser
97
+ @parser ||= OptionParser.new do |p|
98
+ p.banner = self.class.syntax
99
+ p.separator self.class.descr
100
+
101
+ if self.class.options
102
+ p.separator 'Options:'
103
+ self.class.options.call(p)
104
+ end
105
+
106
+ p.separator 'Common options:'
107
+
108
+ p.on('-b', '--bus DOMAIN|@NAME', %{
109
+ The domain name of the bus to interact with, or a reference (`NAME`)
110
+ to global configuration.
111
+ }) do |v|
112
+ config.bus = v
113
+ end
114
+
115
+ p.on('-t', '--token TOKEN', %{
116
+ An API token to use when querying the bus.
117
+ }) do |v|
118
+ config.token = v
119
+ end
120
+
121
+ p.on('-v', '--verbose', %{
122
+ Increase logging verbosity
123
+ }) do
124
+ config.verbose = true
125
+ end
126
+ end
127
+ end
128
+
129
+ def _description
130
+ self.class.descr.split(/\n/).map(&:strip).reject(&:empty?).join("\n")
131
+ end
132
+ end
133
+ end
134
+ end