tango-client 1.0.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.
@@ -0,0 +1,3 @@
1
+ module Tango
2
+ VERSION = "1.0.0"
3
+ end
File without changes
@@ -0,0 +1,20 @@
1
+ if ENV['COVERAGE']
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter 'spec'
5
+ end
6
+ end
7
+
8
+ Dir[File.expand_path('../support/**/*.rb', __FILE__)].each { |f| require f}
9
+
10
+ RSpec.configure do |config|
11
+ config.treat_symbols_as_metadata_keys_with_true_values = true
12
+ config.run_all_when_everything_filtered = true
13
+ config.filter_run :focus
14
+
15
+ # Run specs in random order to surface order dependencies. If you find an
16
+ # order dependency and want to debug it, you can fix the order by providing
17
+ # the seed, which is printed after each run.
18
+ # --seed 1234
19
+ config.order = 'random'
20
+ end
@@ -0,0 +1,42 @@
1
+ require 'faraday'
2
+
3
+ module FaradayStub
4
+ def stub_request(connection)
5
+ unless connection.options[:stubs]
6
+ # Inject Faraday::Adapter::Test and rebuild the app
7
+ connection.instance_variable_set(:@app, nil)
8
+ index = connection.builder.handlers.size - 1
9
+ stubs = Faraday::Adapter::Test::Stubs.new
10
+ connection.builder.swap index, Faraday::Adapter::Test, stubs
11
+ connection.options[:stubs] = stubs
12
+ end
13
+
14
+ yield connection.options[:stubs] if block_given?
15
+ end
16
+
17
+ alias_method :stub_connection, :stub_request
18
+
19
+ def stub_get(connection, path, &block)
20
+ stub_request(connection) do |stubs|
21
+ stubs.get(path, &block)
22
+ end
23
+ end
24
+
25
+ def stub_post(connection, path, body = nil, &block)
26
+ stub_request(connection) do |stubs|
27
+ stubs.post(path, body, &block)
28
+ end
29
+ end
30
+
31
+ def stub_put(connection, path, body = nil, &block)
32
+ stub_request(connection) do |stubs|
33
+ stubs.put(path, body, &block)
34
+ end
35
+ end
36
+
37
+ def stub_delete(connection, path, &block)
38
+ stub_request(connection) do |stubs|
39
+ stubs.delete(path, &block)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ require 'faraday'
2
+ require 'multi_json'
3
+ require 'tango/client'
4
+
5
+ require File.expand_path('../../spec_helper', __FILE__)
6
+
7
+ describe Tango::Client do
8
+
9
+ include FaradayStub
10
+
11
+ let(:account_credentials) {
12
+ {
13
+ :username => 'ian',
14
+ :password => 'secret'
15
+ }
16
+ }
17
+
18
+ let(:client) { Tango::Client.new account_credentials }
19
+
20
+ let(:url_prefix) { '/' + client.options[:version] }
21
+
22
+ subject { client }
23
+ before { stub_request(client.connection) }
24
+
25
+ describe '#get_available_balance' do
26
+ let(:response) {
27
+ {
28
+ :responseType => 'SUCCESS',
29
+ :response => { :availableBalance => 873431432 }
30
+ }
31
+ }
32
+
33
+ before do
34
+ stub_post(client.connection, url_prefix + '/GetAvailableBalance') do |env|
35
+ [ 200, {:request_body => env[:body]}, MultiJson.dump(response) ]
36
+ end
37
+ end
38
+
39
+ subject { client.get_available_balance }
40
+ it { should == 873431432 }
41
+ end
42
+ end
@@ -0,0 +1,32 @@
1
+ require 'tango/error'
2
+
3
+ describe Tango::Error do
4
+ describe '.from_status_code' do
5
+ context 'when status code is 404' do
6
+ subject { Tango::Error.from_status_code(404) }
7
+ its(:message) { should == 'Error: 404' }
8
+ end
9
+ end
10
+ end
11
+
12
+ describe Tango::Error::ServerError do
13
+ describe '.from_response' do
14
+ context 'when responseType is Unknown' do
15
+ subject {
16
+ Tango::Error::ServerError.from_response(:responseType => 'Unknown',
17
+ :response => 'test')
18
+ }
19
+
20
+ it { should be_a_kind_of(Tango::Error::ServerError) }
21
+ its(:response) { should == 'test' }
22
+ end
23
+ context 'when responseType is INV_CREDENTIAL' do
24
+ subject {
25
+ Tango::Error::ServerError.from_response(:responseType => 'INV_CREDENTIAL',
26
+ :response => 'test')
27
+ }
28
+
29
+ it { should be_a_kind_of(Tango::Error::InvCredential) }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ require 'tango/request/json_encoded'
2
+ require 'faraday'
3
+
4
+ describe Tango::Request::JsonEncoded do
5
+ let(:conn) {
6
+ Faraday::Connection.new do |conn|
7
+ conn.use Tango::Request::JsonEncoded
8
+
9
+ conn.use Faraday::Adapter::Test do |stub|
10
+ stub.post '/echo' do |env|
11
+ # echo back request body
12
+ [ 200, {:request_body => env[:body]}, env[:body] ]
13
+ end
14
+ end
15
+ end
16
+ }
17
+
18
+ context 'POST {"string":"hello"} with no content type' do
19
+ let(:env) { conn.post('/echo', :string => "hello").env }
20
+
21
+ it 'dumps params to JSON' do
22
+ env[:response_headers]['Request-Body'].should == %q({"string":"hello"})
23
+ end
24
+
25
+ it 'sets content type to application/json' do
26
+ env[:request_headers]['Content-Type'].should == 'application/json'
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ require 'tango/response/parse_json'
2
+ require 'faraday'
3
+
4
+ describe Tango::Response::ParseJson do
5
+ let(:conn) {
6
+ Faraday::Connection.new do |conn|
7
+ conn.use Tango::Response::ParseJson
8
+
9
+ conn.use Faraday::Adapter::Test do |stub|
10
+ stub.post '/echo' do |env|
11
+ # echo back request body
12
+ [ 200, {}, env[:body] ]
13
+ end
14
+ end
15
+ end
16
+ }
17
+
18
+ context 'POST {"string":"hello"} with no content type' do
19
+ let(:env) { conn.post('/echo', %q[{"string":"hello"}]).env }
20
+
21
+ it 'raises ServerError' do
22
+ expect { env }.to raise_error(Tango::Error::ServerError)
23
+ end
24
+ end
25
+ context 'POST {"responseType":"SUCCESS","response":"OK"}' do
26
+ let(:env) { conn.post('/echo', %q[{"responseType":"SUCCESS","response":"OK"}]).env }
27
+
28
+ it 'raise ServerError' do
29
+ expect { env }.to raise_error(Tango::Error::ServerError)
30
+ end
31
+ end
32
+ context 'POST {"responseType":"SUCCESS","response":{"status":"OK"}}' do
33
+ let(:env) { conn.post('/echo', %q[{"responseType":"SUCCESS","response":{"status":"OK"}}]).env }
34
+
35
+ it 'returns {:status => "OK"}' do
36
+ env[:body].should == { :status => "OK" }
37
+ end
38
+ end
39
+ context 'POST {"responseType":"INV_INPUT"}' do
40
+ it 'raises InvInput' do
41
+ expect {
42
+ conn.post('/echo', %q[{"responseType":"INV_INPUT"}])
43
+ }.to raise_error ::Tango::Error::InvInput
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,41 @@
1
+ require 'tango/response/raise_error'
2
+ require 'faraday'
3
+
4
+ describe Tango::Response::RaiseError do
5
+ context 'error class raises if status code >= 500' do
6
+ class Error < StandardError
7
+ def self.from_status_code(status_code)
8
+ new(status_code.to_s)
9
+ end
10
+ def self.raise_on?(status_code)
11
+ status_code >= 500
12
+ end
13
+ end
14
+
15
+ let(:conn) {
16
+ Faraday::Connection.new do |conn|
17
+ conn.use Tango::Response::RaiseError, Error
18
+
19
+ conn.use Faraday::Adapter::Test do |stub|
20
+ stub.get '/499' do |env|
21
+ [ 400, {}, '' ]
22
+ end
23
+ stub.get '/500' do |env|
24
+ [ 500, {}, '' ]
25
+ end
26
+ end
27
+ end
28
+ }
29
+
30
+ it 'raises error if status code is 500' do
31
+ expect {
32
+ conn.get('/500')
33
+ }.to raise_exception(Error)
34
+ end
35
+ it 'does not raise error if status code is 499' do
36
+ expect {
37
+ conn.get('/499')
38
+ }.not_to raise_exception(Error)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,28 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'tango/version'
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = "tango-client"
7
+ gem.version = Tango::VERSION
8
+ gem.authors = ["Ian Yang"]
9
+ gem.email = ["ian@intridea.com"]
10
+ gem.description = %q{HTTP client to ease using Tango API}
11
+ gem.summary = %q{HTTP client to ease using Tango API}
12
+ gem.homepage = ""
13
+
14
+ gem.files = `git ls-files`.split($/)
15
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.require_paths = ["lib"]
18
+
19
+ gem.add_dependency 'faraday', '~> 0.8'
20
+ gem.add_dependency 'multi_json', '~> 1.3'
21
+
22
+ gem.add_development_dependency 'pry'
23
+ gem.add_development_dependency 'rake'
24
+ gem.add_development_dependency 'rspec'
25
+ gem.add_development_dependency 'yard'
26
+ gem.add_development_dependency 'redcarpet'
27
+ gem.add_development_dependency 'simplecov'
28
+ end
metadata ADDED
@@ -0,0 +1,212 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tango-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ian Yang
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: faraday
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '0.8'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.8'
30
+ - !ruby/object:Gem::Dependency
31
+ name: multi_json
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: yard
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: redcarpet
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ description: HTTP client to ease using Tango API
143
+ email:
144
+ - ian@intridea.com
145
+ executables: []
146
+ extensions: []
147
+ extra_rdoc_files: []
148
+ files:
149
+ - .gitignore
150
+ - .rspec
151
+ - .yardopts
152
+ - Gemfile
153
+ - README.md
154
+ - Rakefile
155
+ - lib/tango.rb
156
+ - lib/tango/client.rb
157
+ - lib/tango/default.rb
158
+ - lib/tango/error.rb
159
+ - lib/tango/request/json_encoded.rb
160
+ - lib/tango/response/parse_json.rb
161
+ - lib/tango/response/raise_error.rb
162
+ - lib/tango/ssl/cacert.pem
163
+ - lib/tango/version.rb
164
+ - spec/lib/tango/response/raise_error_spec.rb
165
+ - spec/spec_helper.rb
166
+ - spec/support/faraday_stub.rb
167
+ - spec/tango/client_spec.rb
168
+ - spec/tango/error_spec.rb
169
+ - spec/tango/request/json_encoded_spec.rb
170
+ - spec/tango/response/parse_json_spec.rb
171
+ - spec/tango/response/raise_error_spec.rb
172
+ - tango-client.gemspec
173
+ homepage: ''
174
+ licenses: []
175
+ post_install_message:
176
+ rdoc_options: []
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ none: false
181
+ requirements:
182
+ - - ! '>='
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ segments:
186
+ - 0
187
+ hash: 4124602399217005182
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ! '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ segments:
195
+ - 0
196
+ hash: 4124602399217005182
197
+ requirements: []
198
+ rubyforge_project:
199
+ rubygems_version: 1.8.23
200
+ signing_key:
201
+ specification_version: 3
202
+ summary: HTTP client to ease using Tango API
203
+ test_files:
204
+ - spec/lib/tango/response/raise_error_spec.rb
205
+ - spec/spec_helper.rb
206
+ - spec/support/faraday_stub.rb
207
+ - spec/tango/client_spec.rb
208
+ - spec/tango/error_spec.rb
209
+ - spec/tango/request/json_encoded_spec.rb
210
+ - spec/tango/response/parse_json_spec.rb
211
+ - spec/tango/response/raise_error_spec.rb
212
+ has_rdoc: