opentsdb-consumer 0.5.0 → 0.6.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.
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