opentsdb-consumer 0.5.0 → 0.6.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: 334956afe7507b50e68bdb15ee3fb1259e308c9a
4
- data.tar.gz: 39e5074094710e559e0354f8eb6fd941b653f838
3
+ metadata.gz: 626245d54c787e59a863cd3e9f72be2f8dbbe26e
4
+ data.tar.gz: 2cd2406b17e766a69eafb285af78628f35e607f3
5
5
  SHA512:
6
- metadata.gz: 04482b0690cc6e8b86e09300c17f10f5a999cb20e56fd6cf326aca2c191e633e65f5e8a5b63313d1d802c771dcf98487869eb3dff07cf082f77cd76ce63697d4
7
- data.tar.gz: 16b717f60281eed71d6c8ec0e93b8661e63889576cb93564862d0fc87e1862df872fb8cef57f1da1a988502c7388d9f196bfc3b7e5dd6c411c5742f2b4233131
6
+ metadata.gz: 38b597f0545d30fee23dbbab0041876183a6633a5ad8d114db47e41dcaff356a1d44beb99f4bc804638971f4d6435098aea0c79f67c4a4b3f66074f6beef2885
7
+ data.tar.gz: 9633060a0de91f0228293ffe88d5534ca0169b981247d1fe8c723b413b9f80f950da8186d00e2dcce8d8d3597df8e8c4b3b927150ab33d1feb38a78d804dc988
data/.gitignore CHANGED
@@ -15,7 +15,7 @@ doc
15
15
  # jeweler generated
16
16
  pkg
17
17
 
18
- # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
18
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
19
19
  #
20
20
  # * Create a file at ~/.gitignore
21
21
  # * Include files you want ignored
@@ -47,3 +47,6 @@ pkg
47
47
 
48
48
  # For rubinius:
49
49
  #*.rbc
50
+
51
+ # Gemfile
52
+ Gemfile.lock
data/Gemfile CHANGED
@@ -1,14 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'excon', '~> 0.45.0'
4
-
5
- group :development do
6
- gem 'rspec', '~> 3.3.0'
7
- gem 'rdoc', '~> 3.12'
8
- gem 'bundler', '~> 1.0'
9
- gem 'jeweler', '~> 2.0.1'
10
-
11
- gem 'byebug'
12
- gem 'pry'
13
- gem 'coveralls', require: false
14
- end
3
+ gemspec
data/README.md CHANGED
@@ -18,9 +18,24 @@ gem 'opentsdb-consumer'
18
18
  ## Usage
19
19
 
20
20
  ```ruby
21
+ # First, you need a client.
21
22
  client = OpenTSDBConsumer::Client.new host: 'metrics.yourdomain.com', port: 4242
22
- metric = OpenTSDBConsumer::Metric.new name: 'my.metric', rate: true, aggregator: 'avg'
23
- OpenTSDBConsumer::Query.new([metric], client).run start: '24h-ago'
23
+
24
+ # Default options
25
+ data = client.fetch(%w(metric1 metric2))
26
+
27
+ # Custom options for all the metrics
28
+ data = client.fetch(
29
+ %w(metric1 metric2),
30
+ rate: true,
31
+ aggregator: 'avg',
32
+ tags: { environment: 'production' },
33
+ start: '24h-ago'
34
+ )
35
+
36
+ # Custom options for each metric
37
+ metric = OpenTSDBConsumer::Metric.new name: 'my.metric', rate: true, aggregator: 'avg', tags: { environment: 'production' }
38
+ data = OpenTSDBConsumer::Query.new([metric], client).run start: '24h-ago'
24
39
  ```
25
40
 
26
41
  The rate can be configured by providing an hash with the rate options.
@@ -30,7 +45,6 @@ metric = OpenTSDBConsumer::Metric.new name: 'my.metric',
30
45
  aggregator: 'sum'
31
46
  ```
32
47
 
33
-
34
48
  ## Contributing to opentsdb-consumer
35
49
 
36
50
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
@@ -49,6 +63,5 @@ bin/opentsdb-consumer server.domain.com my.metric
49
63
 
50
64
  ## Copyright
51
65
 
52
- Copyright (c) 2015 Nine Internet Solutions AG. See LICENSE.txt for
66
+ Copyright (c) 2016 Nine Internet Solutions AG. See LICENSE.txt for
53
67
  further details.
54
-
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.6.0
@@ -1,9 +1 @@
1
- module OpenTSDBConsumer
2
- end
3
-
4
- require 'opentsdb-consumer/errors'
5
- require 'opentsdb-consumer/client'
6
- require 'opentsdb-consumer/metric'
7
- require 'opentsdb-consumer/rate'
8
- require 'opentsdb-consumer/query'
9
- require 'opentsdb-consumer/result'
1
+ require 'opentsdb_consumer'
@@ -15,8 +15,34 @@ module OpenTSDBConsumer
15
15
  @connection = Excon.new url, options
16
16
  end
17
17
 
18
+ def fetch(metric_names, options = {})
19
+ options = {
20
+ start: '8h-ago',
21
+ aggregator: 'sum',
22
+ downsample: '5m-avg',
23
+ rate: false,
24
+ tags: {},
25
+ }.merge(options)
26
+
27
+ metrics = build_metrics(metric_names, options)
28
+
29
+ Query.new(metrics, self).run(start: options[:start])
30
+ end
31
+
18
32
  def url
19
33
  "http://#{host}:#{port}/api/query"
20
34
  end
35
+
36
+ private
37
+
38
+ def build_metrics(metric_names, options)
39
+ metric_names.map do |metric|
40
+ Metric.new(whitelisted_metric_options(options).merge(name: metric))
41
+ end
42
+ end
43
+
44
+ def whitelisted_metric_options(options)
45
+ options.select { |key, _| Metric::ATTRIBUTES_WHITELIST.include?(key) }
46
+ end
21
47
  end
22
48
  end
@@ -3,4 +3,5 @@ module OpenTSDBConsumer
3
3
 
4
4
  class InvalidMetric < QueryError; end
5
5
  class InvalidTag < QueryError; end
6
+ class EmptyTag < InvalidTag; end
6
7
  end
@@ -2,18 +2,20 @@ require 'opentsdb-consumer/rate'
2
2
 
3
3
  module OpenTSDBConsumer
4
4
  class Metric
5
+ ATTRIBUTES_WHITELIST = %i(aggregator rate downsample tags).freeze
6
+
5
7
  attr_reader :name, :aggregator, :rate, :downsample, :tags
6
8
 
7
9
  def initialize(name: nil, aggregator: 'sum', rate: false, downsample: '10m-avg', tags: {})
8
- @name = name
10
+ @name = name
9
11
  @aggregator = aggregator
10
- @rate = Rate.new(rate) if rate
12
+ @rate = Rate.new(rate) if rate
11
13
  @downsample = downsample
12
- @tags = tags
14
+ @tags = Tags.new(tags)
13
15
  end
14
16
 
15
17
  def to_s
16
- query = tags.any? ? "{#{tags_to_query}}" : ''
18
+ query = tags.any? ? "{#{tags}}" : ''
17
19
  query += ":#{rate}" if rate
18
20
  [aggregator, downsample, name].compact.join(':') + query
19
21
  end
@@ -23,16 +25,12 @@ module OpenTSDBConsumer
23
25
  aggregator: aggregator,
24
26
  downsample: downsample,
25
27
  metric: name,
26
- tags: tags,
28
+ tags: tags.to_h,
27
29
  }
28
- hash.merge! rate.to_h if rate
29
- hash
30
- end
31
30
 
32
- private
31
+ hash.merge! rate.to_h if rate
33
32
 
34
- def tags_to_query
35
- tags.map { |key, value| [key, value].join '=' }.join(',')
33
+ hash
36
34
  end
37
35
  end
38
36
  end
@@ -0,0 +1,23 @@
1
+ module OpenTSDBConsumer
2
+ class Tags < Hash
3
+ def initialize(tags = {})
4
+ merge!(tags)
5
+
6
+ check_tags!
7
+ end
8
+
9
+ def to_s
10
+ map do |key, value|
11
+ [key, value].join '='
12
+ end.join(',')
13
+ end
14
+
15
+ private
16
+
17
+ def check_tags!
18
+ each do |key, value|
19
+ raise EmptyTag if key && (value.nil? || value.to_s.empty?)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module OpenTSDBConsumer
2
+ end
3
+
4
+ require 'opentsdb-consumer/errors'
5
+ require 'opentsdb-consumer/client'
6
+ require 'opentsdb-consumer/metric'
7
+ require 'opentsdb-consumer/rate'
8
+ require 'opentsdb-consumer/tags'
9
+ require 'opentsdb-consumer/query'
10
+ require 'opentsdb-consumer/result'
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
9
9
  s.email = ['phil@nine.ch']
10
10
  s.homepage = 'http://github.com/ninech/'
11
11
  s.license = 'MIT'
12
- s.summary = "Client library to consume metrics from OpenTSDB"
13
- s.description = "Client library to consume metrics from OpenTSDB"
12
+ s.summary = 'Client library to consume metrics from OpenTSDB'
13
+ s.description = 'Client library to consume metrics from OpenTSDB'
14
14
 
15
15
  s.files = `git ls-files`.split("\n")
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -19,10 +19,12 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.add_runtime_dependency 'excon', '~> 0.45.0'
21
21
 
22
- s.add_development_dependency 'rspec', '~> 3.3', '>= 3.3.0'
22
+ s.add_development_dependency 'rspec', '~> 3.5', '>= 3.5.0'
23
+ s.add_development_dependency 'rake', '~> 10.0'
24
+ s.add_development_dependency 'rack', '~> 1' # Remove this dependency when using ruby 2.2.2+
25
+ s.add_development_dependency 'jeweler', '~> 2.0.1'
23
26
  s.add_development_dependency 'rdoc', '~> 3.12'
24
27
  s.add_development_dependency 'bundler', '~> 1.0'
25
- s.add_development_dependency 'byebug', '~> 0'
26
28
  s.add_development_dependency 'pry', '~> 0'
27
29
  s.add_development_dependency 'coveralls', '~> 0'
28
30
  end
@@ -1,12 +1,74 @@
1
1
  require 'spec_helper'
2
- require 'opentsdb-consumer/client'
3
2
 
4
3
  RSpec.describe OpenTSDBConsumer::Client do
5
- let(:client) { described_class.new host: 'metrics.local', port: '4243' }
4
+ let(:host) { 'myhost.com' }
5
+ let(:port) { 4243 }
6
+ let(:metric_names) { %w(metric1 metric2) }
7
+
8
+ subject { described_class.new(host: host, port: port) }
6
9
 
7
10
  describe '#url' do
11
+ subject { super().url }
12
+
8
13
  it 'assembles a correct url for opentsdb requests' do
9
- expect(client.url).to eq 'http://metrics.local:4243/api/query'
14
+ expect(subject).to eq 'http://myhost.com:4243/api/query'
15
+ end
16
+ end
17
+
18
+ describe '#fetch' do
19
+ subject do
20
+ super().fetch(metric_names, aggregator: 'cubic', start: 'now', unknown_key: 'not here')
21
+ end
22
+
23
+ before(:each) do
24
+ query_double = instance_double(OpenTSDBConsumer::Query)
25
+ allow(query_double).to receive(:run)
26
+ allow(OpenTSDBConsumer::Query).to receive(:new).and_return(query_double)
27
+ end
28
+
29
+ describe 'components' do
30
+ it 'uses OpenTSDB metric' do
31
+ expect(OpenTSDBConsumer::Metric).to receive(:new).with(
32
+ aggregator: 'cubic', downsample: '5m-avg', rate: false, tags: {}, name: 'metric1'
33
+ )
34
+
35
+ expect(OpenTSDBConsumer::Metric).to receive(:new).with(
36
+ aggregator: 'cubic', downsample: '5m-avg', rate: false, tags: {}, name: 'metric2'
37
+ )
38
+
39
+ subject
40
+ end
41
+
42
+ describe 'OpenTSDB query' do
43
+ it 'uses OpenTSDB query' do
44
+ fake_metric = double('fake_metric')
45
+
46
+ allow(OpenTSDBConsumer::Metric).to receive(:new).and_return(fake_metric)
47
+
48
+ expect(OpenTSDBConsumer::Query).to receive(:new).with([fake_metric, fake_metric], any_args)
49
+
50
+ subject
51
+ end
52
+
53
+ it 'makes a query to OpenTSDB backend' do
54
+ fake_query = double('fake_query')
55
+
56
+ allow(OpenTSDBConsumer::Query).to receive(:new).and_return(fake_query)
57
+
58
+ expect(fake_query).to receive(:run).with(start: 'now')
59
+
60
+ subject
61
+ end
62
+
63
+ it 'let exceptions bubble up' do
64
+ fake_query = double('fake_query')
65
+
66
+ allow(fake_query).to receive(:run).and_raise(OpenTSDBConsumer::InvalidMetric)
67
+ allow(OpenTSDBConsumer::Query).to receive(:new).and_return(fake_query)
68
+
69
+ expect { subject.datapoints }.to raise_error(OpenTSDBConsumer::InvalidMetric)
70
+ end
71
+ end
10
72
  end
11
73
  end
12
74
  end
@@ -1,6 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'opentsdb-consumer/metric'
3
- require 'opentsdb-consumer/rate'
4
2
 
5
3
  RSpec.describe OpenTSDBConsumer::Metric do
6
4
  let(:name) { 'my.metric' }
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'opentsdb-consumer/rate'
3
2
 
4
3
  RSpec.describe OpenTSDBConsumer::Rate do
5
4
  describe '#to_s' do
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'opentsdb-consumer/result'
3
2
 
4
3
  RSpec.describe OpenTSDBConsumer::Result do
5
4
  describe '.initialize' do
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe OpenTSDBConsumer::Tags do
4
+ let(:tags) { { key: 'value' } }
5
+
6
+ describe '#new' do
7
+ context 'with empty tag' do
8
+ it 'throws EmptyTag exception' do
9
+ expect do
10
+ described_class.new(key: '')
11
+ end.to raise_error OpenTSDBConsumer::EmptyTag
12
+ end
13
+ end
14
+ end
15
+
16
+ describe '#to_h' do
17
+ subject { described_class.new(tags).to_h }
18
+
19
+ it { is_expected.to eq ({ key: 'value' }) }
20
+ end
21
+
22
+ describe '#to_s' do
23
+ subject { described_class.new(tags).to_s }
24
+
25
+ it { is_expected.to eq 'key=value' }
26
+ end
27
+
28
+ describe '#any?' do
29
+ subject { described_class.new(tags).any? }
30
+
31
+ it { is_expected.to be true }
32
+ end
33
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentsdb-consumer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philippe Hassig
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-20 00:00:00.000000000 Z
11
+ date: 2016-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
@@ -30,62 +30,90 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.3'
33
+ version: '3.5'
34
34
  - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: 3.3.0
36
+ version: 3.5.0
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: '3.3'
43
+ version: '3.5'
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 3.3.0
46
+ version: 3.5.0
47
47
  - !ruby/object:Gem::Dependency
48
- name: rdoc
48
+ name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '3.12'
53
+ version: '10.0'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '3.12'
60
+ version: '10.0'
61
61
  - !ruby/object:Gem::Dependency
62
- name: bundler
62
+ name: rack
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.0'
67
+ version: '1'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '1.0'
74
+ version: '1'
75
75
  - !ruby/object:Gem::Dependency
76
- name: byebug
76
+ name: jeweler
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '0'
81
+ version: 2.0.1
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '0'
88
+ version: 2.0.1
89
+ - !ruby/object:Gem::Dependency
90
+ name: rdoc
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.12'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.12'
103
+ - !ruby/object:Gem::Dependency
104
+ name: bundler
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.0'
89
117
  - !ruby/object:Gem::Dependency
90
118
  name: pry
91
119
  requirement: !ruby/object:Gem::Requirement
@@ -127,7 +155,6 @@ files:
127
155
  - ".rspec"
128
156
  - ".travis.yml"
129
157
  - Gemfile
130
- - Gemfile.lock
131
158
  - LICENSE.txt
132
159
  - README.md
133
160
  - Rakefile
@@ -140,12 +167,15 @@ files:
140
167
  - lib/opentsdb-consumer/query.rb
141
168
  - lib/opentsdb-consumer/rate.rb
142
169
  - lib/opentsdb-consumer/result.rb
170
+ - lib/opentsdb-consumer/tags.rb
171
+ - lib/opentsdb_consumer.rb
143
172
  - opentsdb-consumer.gemspec
144
173
  - spec/opentsdb-consumer/client_spec.rb
145
174
  - spec/opentsdb-consumer/metric_spec.rb
146
175
  - spec/opentsdb-consumer/query_spec.rb
147
176
  - spec/opentsdb-consumer/rate_spec.rb
148
177
  - spec/opentsdb-consumer/result_spec.rb
178
+ - spec/opentsdb-consumer/tags_spec.rb
149
179
  - spec/spec_helper.rb
150
180
  homepage: http://github.com/ninech/
151
181
  licenses:
@@ -167,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
197
  version: '0'
168
198
  requirements: []
169
199
  rubyforge_project:
170
- rubygems_version: 2.4.5
200
+ rubygems_version: 2.5.1
171
201
  signing_key:
172
202
  specification_version: 4
173
203
  summary: Client library to consume metrics from OpenTSDB
@@ -177,4 +207,5 @@ test_files:
177
207
  - spec/opentsdb-consumer/query_spec.rb
178
208
  - spec/opentsdb-consumer/rate_spec.rb
179
209
  - spec/opentsdb-consumer/result_spec.rb
210
+ - spec/opentsdb-consumer/tags_spec.rb
180
211
  - spec/spec_helper.rb
@@ -1,118 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- addressable (2.3.8)
5
- builder (3.2.2)
6
- byebug (5.0.0)
7
- columnize (= 0.9.0)
8
- coderay (1.1.0)
9
- columnize (0.9.0)
10
- coveralls (0.8.2)
11
- json (~> 1.8)
12
- rest-client (>= 1.6.8, < 2)
13
- simplecov (~> 0.10.0)
14
- term-ansicolor (~> 1.3)
15
- thor (~> 0.19.1)
16
- descendants_tracker (0.0.4)
17
- thread_safe (~> 0.3, >= 0.3.1)
18
- diff-lcs (1.2.5)
19
- docile (1.1.5)
20
- domain_name (0.5.24)
21
- unf (>= 0.0.5, < 1.0.0)
22
- excon (0.45.4)
23
- faraday (0.9.1)
24
- multipart-post (>= 1.2, < 3)
25
- git (1.2.9.1)
26
- github_api (0.12.4)
27
- addressable (~> 2.3)
28
- descendants_tracker (~> 0.0.4)
29
- faraday (~> 0.8, < 0.10)
30
- hashie (>= 3.4)
31
- multi_json (>= 1.7.5, < 2.0)
32
- nokogiri (~> 1.6.6)
33
- oauth2
34
- hashie (3.4.2)
35
- highline (1.7.3)
36
- http-cookie (1.0.2)
37
- domain_name (~> 0.5)
38
- jeweler (2.0.1)
39
- builder
40
- bundler (>= 1.0)
41
- git (>= 1.2.5)
42
- github_api
43
- highline (>= 1.6.15)
44
- nokogiri (>= 1.5.10)
45
- rake
46
- rdoc
47
- json (1.8.3)
48
- jwt (1.5.1)
49
- method_source (0.8.2)
50
- mime-types (2.6.1)
51
- mini_portile (0.6.2)
52
- multi_json (1.11.2)
53
- multi_xml (0.5.5)
54
- multipart-post (2.0.0)
55
- netrc (0.10.3)
56
- nokogiri (1.6.6.2)
57
- mini_portile (~> 0.6.0)
58
- oauth2 (1.0.0)
59
- faraday (>= 0.8, < 0.10)
60
- jwt (~> 1.0)
61
- multi_json (~> 1.3)
62
- multi_xml (~> 0.5)
63
- rack (~> 1.2)
64
- pry (0.10.1)
65
- coderay (~> 1.1.0)
66
- method_source (~> 0.8.1)
67
- slop (~> 3.4)
68
- rack (1.6.4)
69
- rake (10.4.2)
70
- rdoc (3.12.2)
71
- json (~> 1.4)
72
- rest-client (1.8.0)
73
- http-cookie (>= 1.0.2, < 2.0)
74
- mime-types (>= 1.16, < 3.0)
75
- netrc (~> 0.7)
76
- rspec (3.3.0)
77
- rspec-core (~> 3.3.0)
78
- rspec-expectations (~> 3.3.0)
79
- rspec-mocks (~> 3.3.0)
80
- rspec-core (3.3.1)
81
- rspec-support (~> 3.3.0)
82
- rspec-expectations (3.3.0)
83
- diff-lcs (>= 1.2.0, < 2.0)
84
- rspec-support (~> 3.3.0)
85
- rspec-mocks (3.3.1)
86
- diff-lcs (>= 1.2.0, < 2.0)
87
- rspec-support (~> 3.3.0)
88
- rspec-support (3.3.0)
89
- simplecov (0.10.0)
90
- docile (~> 1.1.0)
91
- json (~> 1.8)
92
- simplecov-html (~> 0.10.0)
93
- simplecov-html (0.10.0)
94
- slop (3.6.0)
95
- term-ansicolor (1.3.2)
96
- tins (~> 1.0)
97
- thor (0.19.1)
98
- thread_safe (0.3.5)
99
- tins (1.6.0)
100
- unf (0.1.4)
101
- unf_ext
102
- unf_ext (0.0.7.1)
103
-
104
- PLATFORMS
105
- ruby
106
-
107
- DEPENDENCIES
108
- bundler (~> 1.0)
109
- byebug
110
- coveralls
111
- excon (~> 0.45.0)
112
- jeweler (~> 2.0.1)
113
- pry
114
- rdoc (~> 3.12)
115
- rspec (~> 3.3.0)
116
-
117
- BUNDLED WITH
118
- 1.10.6