distant 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 15b97b720febe3eda9c6c84b571b546f466f3aac
4
+ data.tar.gz: 6f64bff4470a4c4c21eeab79c12f8106a9b1407b
5
+ SHA512:
6
+ metadata.gz: 1e4847b3fd9615ed48963c20f1691c61c2bd5b603c8a9e173628705769a977d599d8e7865024d2ecfeee326627bb8afd94e09d9b8b8a44436e64da41bcd8d21c
7
+ data.tar.gz: 2ffabbfa4affb8d99054eaa0893a555ef80acbfa080c869ef5ce54884e251da3f8fd23fe76ee9d3c6a276bbb3942cd7114a70337a8a99553af7e919b29431727
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+
2
+ coverage/
3
+
4
+ *.gem
5
+ .env
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format doc
2
+ --color
data/Dockerfile ADDED
@@ -0,0 +1,13 @@
1
+
2
+ # BUILD: docker build --no-cache -t distant/base .
3
+ # RUN TESTS: docker run -t -v $(pwd):/opt/distant distant/base bundle exec rspec
4
+
5
+ FROM ruby:2.3.0-alpine
6
+ ADD ./ /opt/distant
7
+ WORKDIR /opt/distant
8
+ RUN set -x && \
9
+ adduser -D ci && \
10
+ chown -R ci:ci /opt/distant && \
11
+ apk add --update --upgrade git build-base
12
+ USER ci
13
+ RUN bundle install --verbose
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+
2
+ source 'https://rubygems.org'
3
+ ruby '2.3.0'
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,75 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ distant (0.1.0)
5
+ activesupport
6
+ httparty
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (4.2.3)
12
+ i18n (~> 0.7)
13
+ json (~> 1.7, >= 1.7.7)
14
+ minitest (~> 5.1)
15
+ thread_safe (~> 0.3, >= 0.3.4)
16
+ tzinfo (~> 1.1)
17
+ addressable (2.3.8)
18
+ byebug (5.0.0)
19
+ columnize (= 0.9.0)
20
+ columnize (0.9.0)
21
+ crack (0.4.2)
22
+ safe_yaml (~> 1.0.0)
23
+ diff-lcs (1.2.5)
24
+ docile (1.1.5)
25
+ httparty (0.13.7)
26
+ json (~> 1.8)
27
+ multi_xml (>= 0.5.2)
28
+ i18n (0.7.0)
29
+ json (1.8.3)
30
+ minitest (5.7.0)
31
+ multi_xml (0.5.5)
32
+ rake (10.4.2)
33
+ rspec (3.3.0)
34
+ rspec-core (~> 3.3.0)
35
+ rspec-expectations (~> 3.3.0)
36
+ rspec-mocks (~> 3.3.0)
37
+ rspec-core (3.3.2)
38
+ rspec-support (~> 3.3.0)
39
+ rspec-expectations (3.3.1)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.3.0)
42
+ rspec-mocks (3.3.2)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.3.0)
45
+ rspec-support (3.3.0)
46
+ safe_yaml (1.0.4)
47
+ shoulda-matchers (2.8.0)
48
+ activesupport (>= 3.0.0)
49
+ simplecov (0.10.0)
50
+ docile (~> 1.1.0)
51
+ json (~> 1.8)
52
+ simplecov-html (~> 0.10.0)
53
+ simplecov-html (0.10.0)
54
+ thread_safe (0.3.5)
55
+ tzinfo (1.2.2)
56
+ thread_safe (~> 0.1)
57
+ webmock (1.21.0)
58
+ addressable (>= 2.3.6)
59
+ crack (>= 0.3.2)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ bundler (~> 1.7)
66
+ byebug
67
+ distant!
68
+ rake (~> 10.0)
69
+ rspec
70
+ shoulda-matchers
71
+ simplecov
72
+ webmock
73
+
74
+ BUNDLED WITH
75
+ 1.11.2
data/README.md ADDED
@@ -0,0 +1,66 @@
1
+
2
+ # Distant Client
3
+
4
+ ## Installation
5
+
6
+ ### In your Gemfile
7
+
8
+ ```ruby
9
+ gem 'distant'
10
+ ```
11
+
12
+ ### Usage
13
+
14
+ ```ruby
15
+ Distant.configure do |config|
16
+ config.base_uri = 'https://www.example.com/api/v0'
17
+ config.set_authentication_headers_with do |body|
18
+ {'X-Foo-Api-Key' => ENV['FOO_API_KEY']}
19
+ end
20
+ end
21
+
22
+ class Organization < Distant::Base
23
+ get :all, '/organizations'
24
+ get :find, '/organizations/:id'
25
+ has_many :networks, '/organizations/:id/networks'
26
+ end
27
+
28
+ class Network < Distant::Base
29
+ belongs_to :organization
30
+ get :find, '/networks/:id'
31
+ has_many :clients, '/networks/:id/clients'
32
+ end
33
+
34
+ class Client < Distant::Base
35
+ belongs_to :network
36
+ get :find, '/clients/:id'
37
+ end
38
+
39
+ Organization.all.each do |org|
40
+ org.networks.each do |network|
41
+ network.clients.each do |client|
42
+ # DO THE THING
43
+ end
44
+ end
45
+ end
46
+ ```
47
+
48
+ See [examples](examples) directory for examples of usage.
49
+
50
+ ## RUNNING THE TESTS
51
+
52
+ ### Within Docker
53
+
54
+ ```bash
55
+ docker build --no-cache -t distant/base . && \
56
+ docker run -t -v $(pwd):/opt/distant distant/base bundle exec rspec
57
+ ```
58
+
59
+ ### On your host OS
60
+
61
+ NOTE: Requires Ruby 2.3.0+
62
+
63
+ ```bash
64
+ bundle
65
+ bundle exec rspec
66
+ ```
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ include Rake::DSL
2
+
3
+ task :environment do
4
+ require 'bundler/setup'
5
+ lib = File.expand_path('../lib', __FILE__)
6
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
7
+ require 'distant'
8
+ end
9
+
10
+ desc 'enter a REPL console within this project environment'
11
+ task :console => :environment do
12
+ require 'irb'
13
+ require 'irb/completion'
14
+ ARGV.clear
15
+ IRB.start
16
+ end
data/distant.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'distant'
3
+ spec.version = '0.1.0'
4
+ spec.authors = ['John Drago']
5
+ spec.email = 'jdrago.999@gmail.com'
6
+ spec.homepage = 'https://github.com/distant/distant'
7
+ spec.summary = 'Distant API Client'
8
+ spec.description = 'Distant API Client'
9
+ spec.required_rubygems_version = '>= 1.3.6'
10
+
11
+ spec.files = `git ls-files -z`.split("\x0")
12
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
13
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
14
+ spec.require_paths = ['lib']
15
+
16
+ spec.add_development_dependency 'bundler', '~> 1.7'
17
+ spec.add_development_dependency 'rake', '~> 10.0'
18
+ spec.add_development_dependency 'rspec'
19
+ spec.add_development_dependency 'shoulda-matchers'
20
+ spec.add_development_dependency 'byebug'
21
+ spec.add_development_dependency 'simplecov'
22
+ spec.add_development_dependency 'webmock'
23
+
24
+ spec.add_dependency 'activesupport'
25
+ spec.add_dependency 'httparty'
26
+ end
@@ -0,0 +1,112 @@
1
+
2
+ module Distant
3
+ class ApiError < StandardError; end
4
+ class Base
5
+
6
+ def initialize(attrs={})
7
+ attrs.each do |key, val|
8
+ send "#{key}=", val
9
+ end
10
+ end
11
+
12
+ def self.inherited(klass)
13
+ klass.extend(ClassMethods)
14
+ end
15
+
16
+ def connection
17
+ self.class.connection
18
+ end
19
+
20
+ module ClassMethods
21
+ def connection
22
+ @@connection ||= Distant::Connection.new( Distant.config )
23
+ end
24
+
25
+ def marshal(data)
26
+ self.new(data)
27
+ end
28
+
29
+ def get(name, route)
30
+ define_singleton_method(name) do |*args|
31
+ path = path_closure_generator(route).call(*args)
32
+ headers = Distant.config.default_headers('')
33
+ .merge(Distant.config.auth_headers(''))
34
+ response_data = preprocess_response connection.get(path, headers)
35
+ if response_data.is_a? Array
36
+ response_data.map{ |item| marshal(item) }
37
+ else
38
+ marshal(response_data)
39
+ end
40
+ end
41
+ end
42
+
43
+ def has_many(plural, route)
44
+ define_method(plural) do
45
+ path = self.class.path_closure_generator(route).call(id: self.id)
46
+ headers = Distant.config.default_headers('')
47
+ .merge(Distant.config.auth_headers(''))
48
+ response_data = self.class.preprocess_response connection.get(path, headers)
49
+ class_ref = Kernel.const_get self.class.to_s.deconstantize + '::' + plural.to_s.singularize.classify
50
+ response_data.map{ |item| class_ref.marshal(item) }
51
+ end
52
+ end
53
+
54
+ def belongs_to(singular, route)
55
+ define_method(singular) do
56
+ foreign_key_attr = singular.to_s + '_id'
57
+ foreign_key_value = self.send(foreign_key_attr)
58
+ path = self.class.path_closure_generator(route).call(id: foreign_key_value)
59
+ headers = Distant.config.default_headers('')
60
+ .merge(Distant.config.auth_headers(''))
61
+ response_data = self.class.preprocess_response connection.get(path, headers)
62
+ class_ref = Kernel.const_get self.class.to_s.deconstantize + '::' + singular.to_s.classify
63
+ class_ref.marshal(response_data)
64
+ end
65
+ end
66
+
67
+ def path_closure_generator(route)
68
+ # Look for /foo/:bar/:bux and return ['bar', 'bux']
69
+ captures = route.scan(%r{:([^/\{\}\:\-]+)}).flatten
70
+
71
+ # Look for /foo/:bar/:bux and return '/foo/%{bar}/%{bux}'
72
+ template = route.gsub(%r{:([^/\{\}\:\-]+)}, "%{#{$1}}")
73
+
74
+ # Convert '/foo/%{bar}/%{bux}' to /foo/123/456 with {bar: 123, bux: 456}
75
+ class_eval <<-EOF
76
+ Proc.new do |#{captures.map{|cap| "#{cap}:"}.join(', ')}|
77
+ template % {
78
+ #{captures.map{ |cap| cap + ": " + cap }.join(', ')}
79
+ }
80
+ end
81
+ EOF
82
+ end
83
+
84
+ def preprocess_response(response)
85
+ case response.code
86
+ when 200..299
87
+ parsed = JSON.parse(response.body, symbolize_names: true)
88
+ recursive_underscore(parsed)
89
+ else
90
+ raise Distant::ApiError.new response
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def recursive_underscore(thing)
97
+ if thing.is_a? Hash
98
+ out = {}
99
+ thing.each do |key, val|
100
+ out[key.to_s.underscore.to_sym] = recursive_underscore(val)
101
+ end
102
+ out
103
+ elsif thing.is_a? Array
104
+ thing.map{ |item| recursive_underscore(item) }
105
+ else
106
+ thing
107
+ end
108
+ end
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,30 @@
1
+
2
+ module Distant
3
+ class Config
4
+ attr_accessor :base_uri, :auth_header_generator, :default_header_generator
5
+
6
+ def initialize
7
+ # Default just returns an empty hash:
8
+ self.auth_header_generator = Proc.new{ {} }
9
+ self.default_header_generator = Proc.new{ {} }
10
+ end
11
+
12
+ def set_authentication_headers_with(&block)
13
+ raise ArgumentError.new 'block required' unless block_given?
14
+ self.auth_header_generator = block
15
+ end
16
+
17
+ def set_default_headers_with(&block)
18
+ raise ArgumentError.new 'block required' unless block_given?
19
+ self.default_header_generator = block
20
+ end
21
+
22
+ def default_headers(body=nil)
23
+ self.default_header_generator.call(body)
24
+ end
25
+
26
+ def auth_headers(body=nil)
27
+ auth_header_generator.call(body)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,13 @@
1
+
2
+ module Distant
3
+ class Connection
4
+ include HTTParty
5
+
6
+ attr_accessor :config
7
+ def initialize(config)
8
+ raise ArgumentError.new 'invalid config' unless config.is_a? Distant::Config
9
+ self.config = config
10
+ self.class.base_uri config.base_uri
11
+ end
12
+ end
13
+ end
data/lib/distant.rb ADDED
@@ -0,0 +1,22 @@
1
+
2
+ require 'active_support/core_ext/object'
3
+ require 'active_support/json'
4
+ require 'httparty'
5
+ require 'logger'
6
+ require 'ostruct'
7
+ require 'distant/config'
8
+ require 'distant/base'
9
+ require 'distant/connection'
10
+
11
+ module Distant
12
+
13
+ def self.configure(&block)
14
+ @@config = Distant::Config.new
15
+ block.call(@@config)
16
+ config
17
+ end
18
+
19
+ def self.config
20
+ @@config
21
+ end
22
+ end
@@ -0,0 +1,213 @@
1
+ require 'spec_helper'
2
+
3
+ describe Distant::Base do
4
+ before :all do
5
+ Distant.configure do |config|
6
+ config.base_uri = 'https://www.example.com/api/v0'
7
+ end
8
+ class Distant::BaseTest < Distant::Base
9
+ attr_accessor :id, :name
10
+
11
+ has_many :sub_tests, '/base/tests/:id/sub_tests'
12
+ end
13
+ class Distant::SubTest < Distant::Base
14
+ attr_accessor :id, :base_test_id
15
+ belongs_to :base_test, ''
16
+ end
17
+ end
18
+ describe '.path_closure_generator(route)' do
19
+ context 'when the route has' do
20
+ context 'no variables' do
21
+ before do
22
+ @route = '/foo/bar'
23
+ end
24
+ context 'the closure returned' do
25
+ before do
26
+ @closure = Distant::BaseTest.path_closure_generator(@route)
27
+ end
28
+ it 'accepts no arguments' do
29
+ expect{@closure.call()}.not_to raise_error
30
+ end
31
+ end
32
+ end
33
+ context 'one variable' do
34
+ before do
35
+ @route = '/foo/:id'
36
+ end
37
+ context 'the closure returned' do
38
+ before do
39
+ @closure = Distant::BaseTest.path_closure_generator(@route)
40
+ end
41
+ it 'accepts one corresponding argument' do
42
+ expect{@closure.call(id: 123)}.not_to raise_error
43
+ expect{@closure.call(blah: 123)}.to raise_error ArgumentError
44
+ end
45
+ end
46
+ end
47
+ context 'multiple variables' do
48
+ before do
49
+ @route = '/foo/:id/:bar_id'
50
+ end
51
+ context 'the closure returned' do
52
+ before do
53
+ @closure = Distant::BaseTest.path_closure_generator(@route)
54
+ end
55
+ it 'accepts all corresponding arguments' do
56
+ expect{@closure.call(id: 123, bar_id: 456)}.not_to raise_error
57
+ expect{@closure.call(id: 123)}.to raise_error ArgumentError
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ describe '#connection' do
65
+ before do
66
+ @obj = Distant::BaseTest.new
67
+ end
68
+ it 'calls the eponymous static method' do
69
+ expect(@obj.class).to receive(:connection)
70
+ @obj.connection
71
+ end
72
+ end
73
+
74
+ describe '.connection' do
75
+ context 'when called' do
76
+ context 'the first time' do
77
+ before do
78
+ expect(Distant::Connection).to receive(:new).exactly(1).times
79
+ end
80
+ it 'returns a new Distant::Connection' do
81
+ Distant::BaseTest.connection
82
+ end
83
+ end
84
+ context 'subsequent times' do
85
+ before do
86
+ expect(Distant::Connection).to receive(:new).exactly(1).times.and_call_original
87
+ end
88
+ it 'returns the same Distant::Connection' do
89
+ first_connection = Distant::BaseTest.connection
90
+ expect(first_connection).to eq Distant::BaseTest.connection
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ describe '.get(name, route)' do
97
+ before do
98
+ @route = '/base/tests'
99
+ @single_route = '/base/tests/:id'
100
+ Distant::BaseTest.get :all, @route
101
+ Distant::BaseTest.get :find, @single_route
102
+ end
103
+ it 'creates a static method named correctly' do
104
+ expect(Distant::BaseTest).to respond_to :all
105
+ end
106
+ context 'when the method created for a collection is called' do
107
+ before do
108
+ expect(Distant::BaseTest).to receive(:preprocess_response){ [{id: 123}] }
109
+ end
110
+ it 'makes a GET request with the correct route' do
111
+ expect_any_instance_of(Distant::Connection).to receive(:get).with(@route, {})
112
+ # Finally:
113
+ Distant::BaseTest.all
114
+ end
115
+ end
116
+ context 'when the method created for a single object is called' do
117
+ before do
118
+ expect(Distant::BaseTest).to receive(:preprocess_response){ {id: 123} }
119
+ end
120
+ it 'makes a GET request with the correct route' do
121
+ expect_any_instance_of(Distant::Connection).to receive(:get).with(@single_route.gsub(':id', '123'), {})
122
+ # Finally:
123
+ Distant::BaseTest.find(id: 123)
124
+ end
125
+ end
126
+ end
127
+
128
+ describe '.has_many(plural, route)' do
129
+ before do
130
+ @route = '/base/:id/tests'
131
+ Distant::BaseTest.has_many :sub_tests, @route
132
+ end
133
+ it 'creates an instance method named after the plural collection' do
134
+ expect(Distant::BaseTest.new).to respond_to :sub_tests
135
+ end
136
+ context 'when the plural instance method is called' do
137
+ before do
138
+ expect(Distant::BaseTest).to receive(:preprocess_response){ [{base_test_id: 123, id: 456}]}
139
+ end
140
+ it 'makes a GET request with the correct route' do
141
+ expect_any_instance_of(Distant::Connection).to receive(:get).with('/base/123/tests', {})
142
+ result = Distant::BaseTest.new(id: 123).sub_tests
143
+ expect(result.first).to be_a Distant::SubTest
144
+ end
145
+ end
146
+ end
147
+
148
+ describe '.belongs_to(singular, route)' do
149
+ before do
150
+ @route = '/base/:id'
151
+ Distant::SubTest.belongs_to :base_test, @route
152
+ end
153
+ it 'creates an instance method named after the plural collection' do
154
+ expect(Distant::SubTest.new).to respond_to :base_test
155
+ end
156
+ context 'when the instance method is called' do
157
+ before do
158
+ expect(Distant::SubTest).to receive(:preprocess_response){ {id: 123, name: 'foo'}}
159
+ end
160
+ it 'makes a GET request with the correct route' do
161
+ expect_any_instance_of(Distant::Connection).to receive(:get).with('/base/123', {})
162
+ result = Distant::SubTest.new(id: 456, base_test_id: 123).base_test
163
+ expect(result).to be_a Distant::BaseTest
164
+ end
165
+ end
166
+ end
167
+
168
+ describe '.preprocess_response(response)' do
169
+ context 'when the response' do
170
+ context 'fails' do
171
+ before do
172
+ @response = double('response')
173
+ expect(@response).to receive(:code){ 400 }
174
+ end
175
+ it 'raises an exception' do
176
+ expect{Distant::BaseTest.preprocess_response(@response)}.to raise_error Distant::ApiError
177
+ end
178
+ end
179
+ context 'succeeds' do
180
+ before do
181
+ @response = double('response')
182
+ expect(@response).to receive(:code){ 200 }
183
+ end
184
+ context 'and the response' do
185
+ context 'is valid JSON' do
186
+ before do
187
+ @response_data = [
188
+ {id: 123, name: 'Test'},
189
+ {fooId: 456, nickName: 'Testy McTesterson'}
190
+ ]
191
+ @expected_data = [
192
+ {id: 123, name: 'Test'},
193
+ {foo_id: 456, nick_name: 'Testy McTesterson'}
194
+ ]
195
+ expect(@response).to receive(:body){ @response_data.to_json }
196
+ end
197
+ it 'returns the parsed JSON response' do
198
+ expect(Distant::BaseTest.preprocess_response(@response)).to eq @expected_data
199
+ end
200
+ end
201
+ context 'is not valid JSON' do
202
+ before do
203
+ expect(@response).to receive(:body){ '<html>wat?</html>' }
204
+ end
205
+ it 'raises an exception' do
206
+ expect{Distant::BaseTest.preprocess_response(@response)}.to raise_error JSON::ParserError
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Distant::Config do
4
+ context 'accessors' do
5
+ let(:subject){ Distant::Config.new }
6
+ it { should respond_to :base_uri }
7
+ it { should respond_to :base_uri= }
8
+ it { should respond_to :set_authentication_headers_with }
9
+ it { should respond_to :set_default_headers_with }
10
+ end
11
+
12
+ describe '#set_authentication_headers_with(&block)' do
13
+ before do
14
+ @config = described_class.new
15
+ end
16
+ context 'when called' do
17
+ context 'with a block' do
18
+ before do
19
+ @secret = SecureRandom.uuid
20
+ @config.set_authentication_headers_with do |body|
21
+ {secret: @secret, body: body}
22
+ end
23
+ end
24
+ it 'will execute the block when #auth_headers(body) is called' do
25
+ body = SecureRandom.uuid
26
+ expect(@config.auth_headers(body)).to eq(secret: @secret, body: body)
27
+ end
28
+ end
29
+ context 'without a block' do
30
+ it 'raises an exception' do
31
+ expect{@config.set_authentication_headers_with()}.to raise_error ArgumentError
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ describe '#set_default_headers_with(&block)' do
38
+ before do
39
+ @config = described_class.new
40
+ end
41
+ context 'when called' do
42
+ context 'with a block' do
43
+ before do
44
+ @secret = SecureRandom.uuid
45
+ @config.set_default_headers_with do |body|
46
+ {secret: @secret, body: body}
47
+ end
48
+ end
49
+ it 'will execute the block when #auth_headers(body) is called' do
50
+ body = SecureRandom.uuid
51
+ expect(@config.default_headers(body)).to eq(secret: @secret, body: body)
52
+ end
53
+ end
54
+ context 'without a block' do
55
+ it 'raises an exception' do
56
+ expect{@config.set_default_headers_with()}.to raise_error ArgumentError
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Distant::Connection do
4
+ describe 'initialization' do
5
+ context 'when a Distant::Config object' do
6
+ context 'is provided' do
7
+ it 'returns a new Distant::Connection object' do
8
+ expect(described_class.new(Distant::Config.new)).to be_a described_class
9
+ end
10
+ end
11
+ context 'is not provided' do
12
+ it 'raises an exception' do
13
+ expect{described_class.new('a string')}.to raise_error ArgumentError
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Distant do
4
+ describe '.configure{|config| ... }' do
5
+ context 'the provided block' do
6
+ it 'is executed' do
7
+ @was_executed = false
8
+ Distant.configure do |config|
9
+ @was_executed = true
10
+ end
11
+ expect(@was_executed).to be_truthy
12
+ end
13
+ it 'is provided a config object as an argument' do
14
+ @config_obj = nil
15
+ Distant.configure do |config|
16
+ @config_obj = config
17
+ end
18
+ expect(@config_obj).to be_a Distant::Config
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter 'spec'
5
+ end
6
+ SimpleCov.minimum_coverage 100
7
+
8
+ require 'rspec'
9
+ require 'byebug'
10
+ require 'bundler/setup'
11
+ require 'webmock/rspec'
12
+ lib = File.expand_path('../../lib', __FILE__)
13
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
14
+
15
+ require 'distant'
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: distant
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - John Drago
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: shoulda-matchers
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activesupport
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: httparty
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Distant API Client
140
+ email: jdrago.999@gmail.com
141
+ executables: []
142
+ extensions: []
143
+ extra_rdoc_files: []
144
+ files:
145
+ - ".gitignore"
146
+ - ".rspec"
147
+ - Dockerfile
148
+ - Gemfile
149
+ - Gemfile.lock
150
+ - README.md
151
+ - Rakefile
152
+ - distant.gemspec
153
+ - lib/distant.rb
154
+ - lib/distant/base.rb
155
+ - lib/distant/config.rb
156
+ - lib/distant/connection.rb
157
+ - spec/client/base_spec.rb
158
+ - spec/client/config_spec.rb
159
+ - spec/client/connection_spec.rb
160
+ - spec/client/module_spec.rb
161
+ - spec/spec_helper.rb
162
+ homepage: https://github.com/distant/distant
163
+ licenses: []
164
+ metadata: {}
165
+ post_install_message:
166
+ rdoc_options: []
167
+ require_paths:
168
+ - lib
169
+ required_ruby_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: 1.3.6
179
+ requirements: []
180
+ rubyforge_project:
181
+ rubygems_version: 2.5.1
182
+ signing_key:
183
+ specification_version: 4
184
+ summary: Distant API Client
185
+ test_files:
186
+ - spec/client/base_spec.rb
187
+ - spec/client/config_spec.rb
188
+ - spec/client/connection_spec.rb
189
+ - spec/client/module_spec.rb
190
+ - spec/spec_helper.rb