zinc 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
@@ -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!
@@ -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
@@ -0,0 +1,4 @@
1
+ require 'rspec/core/rake_task'
2
+ RSpec::Core::RakeTask.new('spec')
3
+
4
+ task :default => :spec
@@ -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
@@ -0,0 +1,4 @@
1
+ module Zinc
2
+ class AuthenticationError < StandardError
3
+ end
4
+ end
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,10 @@
1
+ require 'rspec'
2
+ require 'zinc'
3
+
4
+ require 'test_content'
5
+ require 'test_helper'
6
+
7
+ RSpec.configure do |config|
8
+ config.color_enabled = true
9
+ config.formatter = 'documentation'
10
+ end
@@ -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
@@ -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
@@ -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