zinc 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.
- data/Gemfile +2 -0
- data/Gemfile.lock +30 -0
- data/README.rdoc +36 -0
- data/Rakefile +4 -0
- data/lib/zinc.rb +44 -0
- data/lib/zinc/errors/authentication_error.rb +4 -0
- data/lib/zinc/order.rb +40 -0
- data/spec/api_spec.rb +54 -0
- data/spec/credentials_spec.rb +12 -0
- data/spec/order_spec.rb +19 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/test_content.rb +83 -0
- data/spec/test_helper.rb +24 -0
- data/zinc.gemspec +17 -0
- metadata +113 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
zinc (0.0.1)
|
5
|
+
rest-client (~> 1.4)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
diff-lcs (1.1.3)
|
11
|
+
mime-types (1.21)
|
12
|
+
rake (10.0.3)
|
13
|
+
rest-client (1.6.7)
|
14
|
+
mime-types (>= 1.16)
|
15
|
+
rspec (2.10.0)
|
16
|
+
rspec-core (~> 2.10.0)
|
17
|
+
rspec-expectations (~> 2.10.0)
|
18
|
+
rspec-mocks (~> 2.10.0)
|
19
|
+
rspec-core (2.10.1)
|
20
|
+
rspec-expectations (2.10.0)
|
21
|
+
diff-lcs (~> 1.1.3)
|
22
|
+
rspec-mocks (2.10.1)
|
23
|
+
|
24
|
+
PLATFORMS
|
25
|
+
ruby
|
26
|
+
|
27
|
+
DEPENDENCIES
|
28
|
+
rake
|
29
|
+
rspec
|
30
|
+
zinc!
|
data/README.rdoc
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
= Zinc Ruby Bindings
|
2
|
+
|
3
|
+
== Introduction
|
4
|
+
Ruby bindings for the {Zinc}[https://zinc.io] API
|
5
|
+
|
6
|
+
Heavily inspired by the {Stripe Ruby Bindings}[https://github.com/stripe/stripe-ruby]
|
7
|
+
|
8
|
+
By Julian Simioni
|
9
|
+
|
10
|
+
== Usage
|
11
|
+
|
12
|
+
Zinc.api_key = "your-api-key" # set the API key first
|
13
|
+
|
14
|
+
new_order = Zinc::Order.create({:address => {
|
15
|
+
:name =>"Tim Beaver",
|
16
|
+
:address_line1 => "77 Massachusetts Avenue",
|
17
|
+
:zip_code => "02139",
|
18
|
+
:city": "Cambridge",
|
19
|
+
:state": "MA",
|
20
|
+
:country": "US"
|
21
|
+
},
|
22
|
+
:address_suggestion_choice => "suggested",
|
23
|
+
:products => [
|
24
|
+
{
|
25
|
+
:pid => "B003L1ZYYM",
|
26
|
+
:pid_type => "ASIN",
|
27
|
+
},
|
28
|
+
{
|
29
|
+
:pid => "0833030477",
|
30
|
+
:pid_type => "ASIN",
|
31
|
+
}
|
32
|
+
]})
|
33
|
+
|
34
|
+
|
35
|
+
# all parameters returned by the {Zinc API}[https://zinc.io/docs] can be used as accessors
|
36
|
+
puts new_order.ship_date_estimate # => 1336120454
|
data/Rakefile
ADDED
data/lib/zinc.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'rest_client'
|
3
|
+
|
4
|
+
require 'zinc/order'
|
5
|
+
|
6
|
+
require 'zinc/errors/authentication_error'
|
7
|
+
|
8
|
+
module Zinc
|
9
|
+
@@url_base = 'https://api.zinc.io/v1/'
|
10
|
+
@@api_key = nil
|
11
|
+
|
12
|
+
def self.api_key=(key)
|
13
|
+
@@api_key = key
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.api_key
|
17
|
+
@@api_key
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.url_base
|
21
|
+
@@url_base
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.request(method, url, params)
|
25
|
+
raise AuthenticationError unless api_key
|
26
|
+
|
27
|
+
if method == :post and params == {}
|
28
|
+
return
|
29
|
+
end
|
30
|
+
|
31
|
+
opts = {
|
32
|
+
:method => method,
|
33
|
+
:user => api_key,
|
34
|
+
:url => url,
|
35
|
+
:payload => params.to_json,
|
36
|
+
}
|
37
|
+
response = execute_request(opts)
|
38
|
+
return JSON.parse(response)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.execute_request(opts)
|
42
|
+
RestClient::Request.execute(opts)
|
43
|
+
end
|
44
|
+
end
|
data/lib/zinc/order.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module Zinc
|
2
|
+
class Order
|
3
|
+
def self.create(params = {})
|
4
|
+
o = Order.new
|
5
|
+
response = Zinc.request(:post, url, params)
|
6
|
+
if response
|
7
|
+
o.set_values(response)
|
8
|
+
end
|
9
|
+
o
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.get(id)
|
13
|
+
o = Order.new
|
14
|
+
response = Zinc.request(:get, url+'/'+id, {})
|
15
|
+
if response
|
16
|
+
o.set_values(response)
|
17
|
+
end
|
18
|
+
o
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.url
|
22
|
+
Zinc.url_base+'orders'
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_values(values)
|
26
|
+
@values = values
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(name, *args)
|
30
|
+
@values ||= {}
|
31
|
+
if name.to_s.end_with?('=')
|
32
|
+
@values[name.to_s] = args[0]
|
33
|
+
else
|
34
|
+
@values[name.to_s]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
end
|
40
|
+
end
|
data/spec/api_spec.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Zinc do
|
4
|
+
context "API Bindings" do
|
5
|
+
before(:each) do
|
6
|
+
@mock = mock
|
7
|
+
Zinc.api_key = 'foo'
|
8
|
+
Zinc.mock_rest_client = @mock
|
9
|
+
end
|
10
|
+
|
11
|
+
it "doesn't use the network when creating a new Order object" do
|
12
|
+
@mock.should_receive(:get).never
|
13
|
+
Zinc::Order.create
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns a response object when Zinc.request called" do
|
17
|
+
data = {'foo' => "bar"}
|
18
|
+
@mock.should_receive(:post).once.and_return(test_response(data))
|
19
|
+
response = Zinc.request(:post, Zinc::Order.url, data)
|
20
|
+
response.should == data
|
21
|
+
end
|
22
|
+
|
23
|
+
context "create object with params" do
|
24
|
+
before(:each) do
|
25
|
+
expects = {:user => Zinc.api_key, :method => :post, :url => Zinc::Order.url, :payload => test_order_create.to_json}
|
26
|
+
@mock.should_receive(:post).once.with(expects).and_return(test_response(test_order_response))
|
27
|
+
@order = Zinc::Order.create(test_order_create)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "sends a post request"do
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns an order object with accessible attributes" do
|
34
|
+
@order.merchant.should == test_order_response[:merchant]
|
35
|
+
@order.created_date.should == test_order_response[:created_date]
|
36
|
+
end
|
37
|
+
|
38
|
+
it "request sends API key as user" do
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "get existing object" do
|
43
|
+
it "returns an order object when get called with id" do
|
44
|
+
id = test_order_response[:id]
|
45
|
+
expects = {:url => Zinc::Order.url+'/'+id, :user => Zinc.api_key, :method => :get, :payload => {}.to_s}
|
46
|
+
@mock.should_receive(:get).once.with(expects).and_return(test_response(test_order_response))
|
47
|
+
@order = Zinc::Order.get(id)
|
48
|
+
|
49
|
+
@order.id.should == id
|
50
|
+
@order.merchant.should == test_order_response[:merchant]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Zinc
|
4
|
+
describe Zinc do
|
5
|
+
context "credentials" do
|
6
|
+
it "throws an error if request made without api credentials" do
|
7
|
+
Zinc.api_key = nil
|
8
|
+
expect { Zinc::Order.create }.to raise_error(Zinc::AuthenticationError)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/spec/order_spec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Zinc
|
4
|
+
describe Zinc do
|
5
|
+
before(:each) do
|
6
|
+
Zinc.api_key = 'foo'
|
7
|
+
end
|
8
|
+
|
9
|
+
context "Order object" do
|
10
|
+
it "returns an Order object when a create class method is called" do
|
11
|
+
Zinc::Order.create.class.should == Zinc::Order
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns full API url through self.url" do
|
15
|
+
Zinc::Order.url.should == 'https://api.zinc.io/v1/orders'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
def test_order_create
|
2
|
+
{
|
3
|
+
:mode =>"dev",
|
4
|
+
:max_total => 6000,
|
5
|
+
:address => {
|
6
|
+
:name => "Tim Beaver",
|
7
|
+
:address_line1 => "77 Massachusetts Avenue",
|
8
|
+
:address_line2 => nil,
|
9
|
+
:zip_code => "02139",
|
10
|
+
:city => "Cambridge",
|
11
|
+
:state => "MA",
|
12
|
+
:country => "US"
|
13
|
+
},
|
14
|
+
:address_suggestion_choice => "suggested",
|
15
|
+
:products => [
|
16
|
+
{
|
17
|
+
:pid => "B003L1ZYYM",
|
18
|
+
:pid_type => "ASIN",
|
19
|
+
:qty => 1
|
20
|
+
},
|
21
|
+
{
|
22
|
+
:pid => "0833030477",
|
23
|
+
:pid_type => "ASIN",
|
24
|
+
:qty => 1
|
25
|
+
}
|
26
|
+
],
|
27
|
+
:merchant => "amazon",
|
28
|
+
:gift_ship => true,
|
29
|
+
:gift_message => "Thanks for ordering from example.com!",
|
30
|
+
:shipping_method => "standard"
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_order_response
|
35
|
+
{
|
36
|
+
:_type => "order",
|
37
|
+
:id => "xyg2rfplly",
|
38
|
+
:mode => "live",
|
39
|
+
:order_total => 2040,
|
40
|
+
:fee => 40,
|
41
|
+
:max_total => 4000,
|
42
|
+
:address => {
|
43
|
+
:_type =>"address",
|
44
|
+
:name => "Tim Beaver",
|
45
|
+
:address_line1 => "77 Massachusetts Avenue",
|
46
|
+
:address_line2 => nil,
|
47
|
+
:zip_code => "02139",
|
48
|
+
:city => "Cambridge",
|
49
|
+
:state => "MA",
|
50
|
+
:country => "US"
|
51
|
+
},
|
52
|
+
:address_original => nil,
|
53
|
+
:address_suggested => nil,
|
54
|
+
:address_suggestion_choice => nil,
|
55
|
+
:products => [
|
56
|
+
{
|
57
|
+
:_type => "product",
|
58
|
+
:pid => "B003L1ZYYM",
|
59
|
+
:pid_type => "ASIN",
|
60
|
+
:qty => 1,
|
61
|
+
:price => 1500
|
62
|
+
}
|
63
|
+
],
|
64
|
+
:merchant => "amazon",
|
65
|
+
:gift_ship => false,
|
66
|
+
:gift_message => nil,
|
67
|
+
:shipping_method => "standard",
|
68
|
+
:shipping_cost => 500,
|
69
|
+
:status => {
|
70
|
+
:_type => "status",
|
71
|
+
:state => "active",
|
72
|
+
:code => "processed",
|
73
|
+
:message => "Your order has been processed with the merchant and is awaiting shipment."
|
74
|
+
},
|
75
|
+
:created_date => 1336100454,
|
76
|
+
:ship_date => nil,
|
77
|
+
:delivery_date => nil,
|
78
|
+
:ship_date_estimate => 1336120454,
|
79
|
+
:delivery_date_estimate => 1336705254,
|
80
|
+
:tracking_number => nil,
|
81
|
+
:tracking_type => nil
|
82
|
+
}
|
83
|
+
end
|
data/spec/test_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Zinc
|
2
|
+
@mock_rest_client = nil
|
3
|
+
|
4
|
+
def self.mock_rest_client=(mock_client)
|
5
|
+
@mock_rest_client = mock_client
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.execute_request(opts)
|
9
|
+
case opts[:method]
|
10
|
+
when :post then @mock_rest_client.post opts
|
11
|
+
when :get then @mock_rest_client.get opts
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TestResponse
|
17
|
+
attr_accessor :code, :body
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_response(body)
|
21
|
+
if body.class == Hash
|
22
|
+
body.to_json.to_s
|
23
|
+
end
|
24
|
+
end
|
data/zinc.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
spec = Gem::Specification.new do |s|
|
2
|
+
s.name = 'zinc'
|
3
|
+
s.version = '0.1.0'
|
4
|
+
s.summary = 'Ruby bindings for the Zinc(https://zinc.io) API'
|
5
|
+
s.description = s.summary
|
6
|
+
s.authors = ['Julian Simioni']
|
7
|
+
s.email = ['julian.simioni@gmail.com']
|
8
|
+
|
9
|
+
s.add_dependency('rest-client', '~> 1.4')
|
10
|
+
|
11
|
+
s.add_development_dependency('rspec')
|
12
|
+
s.add_development_dependency('rake')
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
16
|
+
s.require_paths = ['lib']
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zinc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Julian Simioni
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rest-client
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.4'
|
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: '1.4'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
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
|
+
description: Ruby bindings for the Zinc(https://zinc.io) API
|
63
|
+
email:
|
64
|
+
- julian.simioni@gmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- Gemfile
|
70
|
+
- Gemfile.lock
|
71
|
+
- README.rdoc
|
72
|
+
- Rakefile
|
73
|
+
- lib/zinc.rb
|
74
|
+
- lib/zinc/errors/authentication_error.rb
|
75
|
+
- lib/zinc/order.rb
|
76
|
+
- spec/api_spec.rb
|
77
|
+
- spec/credentials_spec.rb
|
78
|
+
- spec/order_spec.rb
|
79
|
+
- spec/spec_helper.rb
|
80
|
+
- spec/test_content.rb
|
81
|
+
- spec/test_helper.rb
|
82
|
+
- zinc.gemspec
|
83
|
+
homepage:
|
84
|
+
licenses: []
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 1.8.24
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: Ruby bindings for the Zinc(https://zinc.io) API
|
107
|
+
test_files:
|
108
|
+
- spec/api_spec.rb
|
109
|
+
- spec/credentials_spec.rb
|
110
|
+
- spec/order_spec.rb
|
111
|
+
- spec/spec_helper.rb
|
112
|
+
- spec/test_content.rb
|
113
|
+
- spec/test_helper.rb
|