shipping_easy 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 05f04872e2e47ff54f0ae7e2b0784421d81aee43
4
- data.tar.gz: c6978b8998f1e1cf99ee9394dab5627d4564ccff
3
+ metadata.gz: b51569e520e425f916ee5b73f0fcd9086ec23aa1
4
+ data.tar.gz: 5c9bf4c89f508e002327c37b3670fd3ac3fdd0b8
5
5
  SHA512:
6
- metadata.gz: 71f47f2cbe3696252d9fbc11fe3e954cb99d059bf7b08ac37214e455b7868c59f5c20178b1b7bd6061956d8cb5e753d784a0e848ad75fb48521e357462633796
7
- data.tar.gz: 986bf7dd0aceb8028709c448a06e71751b55fe5a690ff4f81a81d60df56749d480241ccf32fdb90911189b738cdc4506b63329bb29652ad70cdacb9c7df1c909
6
+ metadata.gz: 0d2f8ce7d601b671c76186ab78eebe8fc2ccc886abf7af13c2adcc3a5071f10a134ea4511db8749ba97854d196dc59547d31918da9ac389711ff2832744c20fe
7
+ data.tar.gz: e7c656651793f6fc67c5883e44b09e1d33397383ce5be7e87b7edc39fb65b129662846942363efc9311128b1b8651574ea6e1824c5667966d1433ef9078e28fe
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Rakefile CHANGED
@@ -1 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec)
4
+ task :default => :spec
@@ -1,10 +1,47 @@
1
- require 'rack'
1
+
2
+ require "faraday"
3
+ require "rack"
4
+ require "json"
5
+ require "shipping_easy/authenticator"
6
+ require "shipping_easy/configuration"
7
+ require "shipping_easy/signature"
8
+ require "shipping_easy/http"
9
+ require "shipping_easy/http/faraday_adapter"
10
+ require "shipping_easy/http/request"
11
+ require "shipping_easy/http/response_handler"
12
+ require "shipping_easy/resources"
13
+ require "shipping_easy/resources/base"
14
+ require "shipping_easy/resources/order"
15
+ require "shipping_easy/resources/cancellation"
2
16
  require "shipping_easy/version"
3
17
 
4
18
  module ShippingEasy
5
19
 
6
- class Error < StandardError; end
20
+ class << self
21
+
22
+ attr_accessor :configuration
23
+
24
+ def configure
25
+ configuration = ShippingEasy::Configuration.new
26
+ yield(configuration)
27
+ self.configuration = configuration
28
+ end
29
+
30
+ def api_secret
31
+ configuration.api_secret
32
+ end
7
33
 
34
+ def api_key
35
+ configuration.api_key
36
+ end
37
+
38
+ def base_url
39
+ configuration.base_url
40
+ end
41
+ end
42
+
43
+ class Error < StandardError; end
44
+ class ResourceNotFoundError < Error; end
8
45
  class RequestExpiredError < Error
9
46
  def initialize(msg = "The request has expired.")
10
47
  super(msg)
@@ -0,0 +1,29 @@
1
+ # Configuration class that stores configuration options for the ShippingEasy API.
2
+ #
3
+ # ShippingEasy requires an API key and secret combination to authenticate against its API. At the very least these must be
4
+ # supplied in the configuration.
5
+ #
6
+ # Configuration options are typically set via the ShippingEasy.config method.
7
+ # @see ShippingEasy.configure
8
+ # @example
9
+ # ShippingEasy.configure do |config|
10
+ # config.api_key = "12345"
11
+ # config.api_secret = "XXXXXXXXXXXXXXXXXXXXXXXX"
12
+ # end
13
+ #
14
+ module ShippingEasy
15
+ class Configuration
16
+
17
+ attr_accessor :api_key,
18
+ :api_secret,
19
+ :api_version,
20
+ :base_url,
21
+ :http_adapter
22
+
23
+ # Creates a configuration object, setting the default attributes.
24
+ def initialize
25
+ @http_adapter = ShippingEasy::Http::FaradayAdapter
26
+ @base_url = "https://app.shippingeasy.com"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,2 @@
1
+ module ShippingEasy::Http
2
+ end
@@ -0,0 +1,30 @@
1
+ class ShippingEasy::Http::FaradayAdapter
2
+
3
+ extend Forwardable
4
+
5
+ def_delegators :request, :body, :params, :base_url, :http_method, :uri
6
+
7
+ attr_reader :request
8
+
9
+ def initialize(request)
10
+ @request = request
11
+ end
12
+
13
+ def connect!
14
+ send(http_method)
15
+ end
16
+
17
+ def post
18
+ connection.post do |req|
19
+ req.url uri, params
20
+ req.body = request.body
21
+ end
22
+ end
23
+
24
+ def connection
25
+ @connection ||= Faraday.new(url: base_url) do |faraday|
26
+ faraday.adapter Faraday.default_adapter
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,51 @@
1
+ class ShippingEasy::Http::Request
2
+
3
+ attr_accessor :http_method, :body, :params, :relative_path
4
+
5
+ def initialize(options = {})
6
+ @http_method = options.fetch(:http_method, :get)
7
+ @params = options.fetch(:params, {})
8
+ @body = options.fetch(:payload, {}).to_json
9
+ @relative_path = options.delete(:relative_path)
10
+ end
11
+
12
+ def self.connect!(options = {})
13
+ new(options).connect!
14
+ end
15
+
16
+ def connect!
17
+ sign_request!
18
+ adapter.connect!
19
+ end
20
+
21
+ def sign_request!
22
+ params[:api_key] = api_key
23
+ params[:api_timestamp] = Time.now.to_i
24
+ params[:api_signature] = signature.to_s
25
+ end
26
+
27
+ def uri
28
+ "/api#{relative_path}"
29
+ end
30
+
31
+ def signature
32
+ ShippingEasy::Signature.new(api_secret: api_secret, method: http_method, path: uri, params: params, body: body)
33
+ end
34
+
35
+ def adapter
36
+ ShippingEasy.configuration.http_adapter.new(self)
37
+ end
38
+
39
+ def api_secret
40
+ ShippingEasy.api_secret
41
+ end
42
+
43
+ def api_key
44
+ ShippingEasy.api_key
45
+ end
46
+
47
+ def base_url
48
+ ShippingEasy.base_url
49
+ end
50
+
51
+ end
@@ -0,0 +1,27 @@
1
+ class ShippingEasy::Http::ResponseHandler
2
+
3
+ extend Forwardable
4
+
5
+ def_delegators :response, :status, :body
6
+
7
+ attr_reader :response
8
+
9
+ def initialize(response)
10
+ @response = response
11
+ end
12
+
13
+ def self.run(response)
14
+ new(response).run
15
+ end
16
+
17
+ def run
18
+ case status
19
+ when 401 then raise ShippingEasy::AccessDeniedError, response.body
20
+ when 404 then raise ShippingEasy::ResourceNotFoundError, response.body
21
+ when 200, 201 then JSON.parse(response.body)
22
+ else
23
+ raise ShippingEasy::Error, response.body
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,2 @@
1
+ module ShippingEasy::Resources
2
+ end
@@ -0,0 +1,16 @@
1
+ class ShippingEasy::Resources::Base
2
+
3
+ def self.command(name, command_options, &block)
4
+ define_singleton_method name do |options = {}|
5
+ options[:relative_path] = command_options.fetch(:relative_path, block.call(options))
6
+ options[:http_method] = command_options.fetch(:http_method, :get)
7
+ execute_request!(options)
8
+ end
9
+ end
10
+
11
+ def self.execute_request!(options = {})
12
+ response = ShippingEasy::Http::Request.connect!(options)
13
+ ShippingEasy::Http::ResponseHandler.run(response)
14
+ end
15
+
16
+ end
@@ -0,0 +1,7 @@
1
+ class ShippingEasy::Resources::Cancellation < ShippingEasy::Resources::Base
2
+
3
+ command :create, http_method: :post do |args|
4
+ "/stores/#{args.delete(:store_api_key)}/orders/#{args.delete(:ext_order_identifier)}/cancellations"
5
+ end
6
+
7
+ end
@@ -0,0 +1,7 @@
1
+ class ShippingEasy::Resources::Order < ShippingEasy::Resources::Base
2
+
3
+ command :create, http_method: :post do |args|
4
+ "/stores/#{args.delete(:store_api_key)}/orders"
5
+ end
6
+
7
+ end
@@ -64,7 +64,8 @@ module ShippingEasy
64
64
  # Returns true if the supplied string or signature object matches the current object.
65
65
  def ==(other_signature)
66
66
  expected_signature, supplied_signature = self.to_s, other_signature.to_s
67
- return false if expected_signature.blank? || supplied_signature.blank? || expected_signature.bytesize != supplied_signature.bytesize
67
+ return false if expected_signature.nil? || supplied_signature.nil? || expected_signature.empty? || supplied_signature.empty?
68
+ return false if expected_signature.bytesize != supplied_signature.bytesize
68
69
  l = expected_signature.unpack "C#{expected_signature.bytesize}"
69
70
  res = 0
70
71
  supplied_signature.each_byte { |byte| res |= byte ^ l.shift }
@@ -1,3 +1,3 @@
1
1
  module ShippingEasy
2
- VERSION = "0.0.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -18,6 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_dependency('faraday', '>= 0.8.7')
22
+ spec.add_dependency('rack', ">= 1.4.5")
23
+ spec.add_dependency('json', "~> 1.8.0")
21
24
  spec.add_development_dependency "bundler", "~> 1.3"
22
- spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
23
26
  end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe ShippingEasy::Authenticator, api: true do
4
+ let(:api_secret) { "ABC12345" }
5
+ let(:method) { :post }
6
+ let(:path) { "/api/orders" }
7
+ let(:api_signature) { signature.to_s }
8
+ let(:api_timestamp) { (Time.now - (60 * 5)).to_i }
9
+ let(:params) { { test_param: "ABCDE", api_key: "123", api_timestamp: api_timestamp } }
10
+ let(:params_with_signature) { params[:api_signature] = api_signature; params }
11
+ let(:request_body) { { orders: { name: "Flip flops", cost: "10.00", shipping_cost: "2.00" } }.to_json.to_s }
12
+ let(:method) { :post }
13
+ let(:signature) { ShippingEasy::Signature.new(api_secret: api_secret, method: method, path: path, params: params, body: request_body) }
14
+ subject { ShippingEasy::Authenticator.new(api_secret: api_secret, method: method, path: path, params: params_with_signature, body: request_body) }
15
+
16
+ describe "#initialize" do
17
+ specify { subject.api_secret.should == api_secret }
18
+ specify { subject.method.should == :post }
19
+ specify { subject.path.should == path }
20
+ specify { subject.body.should == request_body }
21
+ specify { subject.params.should == params_with_signature }
22
+ specify { subject.params[:api_signature].should be_nil }
23
+ specify { subject.expected_signature.should be_a(ShippingEasy::Signature) }
24
+ end
25
+
26
+ describe "#request_expires_at" do
27
+ specify { subject.request_expires_at.to_s.should == (Time.now - ShippingEasy::Authenticator::EXPIRATION_INTERVAL).to_s }
28
+ end
29
+
30
+ describe "#request_expired?" do
31
+ specify { subject.request_expired?.should be_false }
32
+
33
+ context "when expired" do
34
+ let(:api_timestamp) { (Time.now - (ShippingEasy::Authenticator::EXPIRATION_INTERVAL * 2)).to_i }
35
+ specify { subject.request_expired?.should be_true }
36
+ end
37
+ end
38
+
39
+ describe "#signatures_match?" do
40
+ specify { subject.signatures_match?.should be_true }
41
+
42
+ context "when they don't match" do
43
+ let(:api_signature) { "XXX" }
44
+ specify { subject.signatures_match?.should be_false }
45
+ end
46
+ end
47
+
48
+ describe "#parsed_timestamp" do
49
+ specify { subject.parsed_timestamp.should be_a(Time) }
50
+ context "when date string is invalid" do
51
+ let(:api_timestamp) { "xxxx" }
52
+ specify { expect{ subject.parsed_timestamp }.to raise_error(ShippingEasy::TimestampFormatError) }
53
+ end
54
+ end
55
+
56
+ describe "#authenticate" do
57
+ context "when everything is ok" do
58
+ before do
59
+ subject.stub(:request_expired?).and_return(false)
60
+ subject.stub(:signatures_match?).and_return(true)
61
+ end
62
+ specify { subject.authenticate.should be_true }
63
+ end
64
+
65
+ context "when request has expired" do
66
+ before { subject.stub(:request_expired?).and_return(true) }
67
+ specify { expect{ subject.authenticate }.to raise_error(ShippingEasy::RequestExpiredError)}
68
+ end
69
+
70
+ context "when signatures do not match" do
71
+ before { subject.stub(:signatures_match?).and_return(false) }
72
+ specify { expect{ subject.authenticate }.to raise_error(ShippingEasy::AccessDeniedError) }
73
+ end
74
+ end
75
+
76
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe ShippingEasy::Configuration do
4
+ subject { ShippingEasy::Configuration.new }
5
+
6
+ specify { subject.should respond_to(:api_key) }
7
+ specify { subject.should respond_to(:api_secret) }
8
+ specify { subject.should respond_to(:base_url) }
9
+
10
+ describe "http_adapter" do
11
+ it "gets set to a default" do
12
+ subject.http_adapter.should == ShippingEasy::Http::FaradayAdapter
13
+ end
14
+
15
+ it "can be overidden" do
16
+ subject.http_adapter = String
17
+ subject.http_adapter.should == String
18
+ end
19
+ end
20
+
21
+ describe "base_url" do
22
+ it "gets set to a default" do
23
+ subject.base_url.should == "https://app.shippingeasy.com"
24
+ end
25
+
26
+ it "can be overidden" do
27
+ subject.base_url = String
28
+ subject.base_url.should == String
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe ShippingEasy::Http::FaradayAdapter do
4
+
5
+ let(:http_method) { "post" }
6
+ let(:params) { { "page" => 1 } }
7
+ let(:base_url) { "https://www.test.com" }
8
+ let(:uri) { "/api/orders" }
9
+ let(:body) { { order_number: "1234" }.to_json }
10
+
11
+ let(:request) do
12
+ double("request",
13
+ http_method: http_method,
14
+ params: params,
15
+ base_url: base_url,
16
+ uri: uri,
17
+ body: body)
18
+ end
19
+
20
+ subject { ShippingEasy::Http::FaradayAdapter.new(request) }
21
+
22
+ [:http_method, :params, :base_url, :uri, :body].each do |m|
23
+ it "delegates #{m} to request" do
24
+ subject.send(m).should == request.send(m)
25
+ end
26
+ end
27
+
28
+ describe "#connect!" do
29
+ it "calls the correct http method as specified by the request" do
30
+ subject.stub(:post)
31
+ subject.should_receive(:post).once
32
+ subject.connect!
33
+ end
34
+ end
35
+
36
+ describe "#connection" do
37
+ it "instantiates a faraday connection" do
38
+ subject.connection.should be_a(Faraday::Connection)
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,81 @@
1
+ require "spec_helper"
2
+
3
+ describe ShippingEasy::Http::Request do
4
+
5
+ let(:http_method) { "post" }
6
+ let(:params) { { :page => 1 } }
7
+ let(:base_url) { "https://www.test.com" }
8
+ let(:relative_path) { "/orders" }
9
+ let(:body) { { order_number: "1234" } }
10
+ let(:api_key) { "12345678ASGHSGHJ" }
11
+ let(:api_secret) { "12345678ASGHSGHJ123213321312" }
12
+ let(:signature) { ShippingEasy::Signature.new(api_secret: api_secret, method: http_method, path: "/api#{relative_path}", params: params.dup, body: body.to_json) }
13
+
14
+ before do
15
+ ShippingEasy.configure do |config|
16
+ config.api_key = api_key
17
+ config.api_secret = api_secret
18
+ end
19
+ end
20
+
21
+ subject { ShippingEasy::Http::Request.new(http_method: http_method, params: params, relative_path: relative_path, payload: body) }
22
+
23
+ [:http_method, :params, :relative_path].each do |m|
24
+ it "parses and sets the option named #{m}" do
25
+ subject.send(m).should == send(m)
26
+ end
27
+ end
28
+
29
+ describe "#api_secret" do
30
+ it "delegates the api_secret to the config" do
31
+ subject.api_secret.should == ShippingEasy.api_secret
32
+ end
33
+ end
34
+
35
+ describe "#api_key" do
36
+ it "delegates the api_key to the config" do
37
+ subject.api_key.should == ShippingEasy.api_key
38
+ end
39
+ end
40
+
41
+ describe "#adpater" do
42
+ it "instantiates a new adapter" do
43
+ subject.adapter.should be_a(ShippingEasy::Http::FaradayAdapter)
44
+ end
45
+ end
46
+
47
+ describe "#signature" do
48
+ it "returns a calculated sigature object" do
49
+ subject.signature.to_s.should == signature.to_s
50
+ end
51
+ end
52
+
53
+ describe "#sign_request!" do
54
+ before { subject.sign_request! }
55
+
56
+ it "adds the api signature parameter to the params hash" do
57
+ subject.params[:api_signature].should_not be_nil
58
+ end
59
+
60
+ it "adds the api timestamp parameter to the params hash" do
61
+ subject.params[:api_timestamp].should_not be_nil
62
+ end
63
+ end
64
+
65
+ describe "#connect" do
66
+ before do
67
+ subject.stub(:sign_request!)
68
+ subject.stub_chain(:adapter, :connect!).and_return("connected!")
69
+ end
70
+
71
+ it "signs the request" do
72
+ subject.should_receive(:sign_request!).once
73
+ subject.connect!
74
+ end
75
+
76
+ it "connects via the adapter" do
77
+ subject.connect!.should == "connected!"
78
+ end
79
+ end
80
+
81
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe ShippingEasy::Http::ResponseHandler do
4
+
5
+ let(:status) { 200 }
6
+ let(:body) { { "order_number" => "12345" }}
7
+ let(:response) do
8
+ double("response",
9
+ status: status,
10
+ body: body.to_json)
11
+ end
12
+
13
+ subject { ShippingEasy::Http::ResponseHandler.new(response) }
14
+
15
+ describe "#run" do
16
+ context "when success" do
17
+ specify { subject.run.should == body }
18
+ end
19
+ context "when authentication fails" do
20
+ let(:status) { 401 }
21
+ specify { expect { subject.run }.to raise_error(ShippingEasy::AccessDeniedError) }
22
+ end
23
+ context "when resource cannot be found" do
24
+ let(:status) { 404 }
25
+ specify { expect { subject.run }.to raise_error(ShippingEasy::ResourceNotFoundError) }
26
+ end
27
+ context "when unexpected error occurs" do
28
+ let(:status) { 500 }
29
+ specify { expect { subject.run }.to raise_error(ShippingEasy::Error) }
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ShippingEasy::Resources::Base do
4
+
5
+ class GenericResource < ShippingEasy::Resources::Base; end
6
+
7
+ describe ".command" do
8
+ before { GenericResource.command(:create, method: :post) }
9
+
10
+ it "defines a method on the class" do
11
+ GenericResource.should respond_to(:create)
12
+ end
13
+
14
+ it "extracts options to send to a request" do
15
+
16
+ end
17
+
18
+ context "when a block is provided" do
19
+ it "uses it as the value for the path" do
20
+ GenericResource.command(:create, method: :post) do |args|
21
+ "/this/is/the/path"
22
+ end
23
+ GenericResource.should_receive(:execute_request!).with({:relative_path=>"/this/is/the/path", :http_method=>:get})
24
+ GenericResource.create
25
+ end
26
+
27
+ context "and an argument is passed in" do
28
+ it "interpolates it" do
29
+ GenericResource.command(:create, method: :post) do |args|
30
+ "/this/is/the/#{args.delete(:name)}"
31
+ end
32
+ GenericResource.should_receive(:execute_request!).with({:relative_path=>"/this/is/the/ABC123", :http_method=>:get})
33
+ GenericResource.create(name: "ABC123")
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe ShippingEasy::Signature do
4
+ let(:api_secret) { "ABC12345" }
5
+ let(:method) { :post }
6
+ let(:path) { "/api/orders" }
7
+ let(:params) { { test_param: "ABCDE", api_key: "123", api_signature: "XXX" } }
8
+ let(:request_body) { { orders: { name: "Flip flops", cost: "10.00", shipping_cost: "2.00" } }.to_json.to_s }
9
+ let(:method) { :post }
10
+
11
+ subject { ShippingEasy::Signature.new(api_secret: api_secret, method: method, path: path, params: params, body: request_body) }
12
+
13
+ describe "#initialize" do
14
+ specify { subject.api_secret.should == api_secret }
15
+ specify { subject.method.should == "POST" }
16
+ specify { subject.path.should == path }
17
+ specify { subject.body.should == request_body }
18
+ specify { subject.params.should == params }
19
+ specify { subject.params[:api_signature].should be_nil }
20
+ end
21
+
22
+ describe "#plaintext" do
23
+ specify { subject.plaintext.should == "POST&/api/orders&api_key=123&test_param=ABCDE&{\"orders\":{\"name\":\"Flip flops\",\"cost\":\"10.00\",\"shipping_cost\":\"2.00\"}}"}
24
+ end
25
+
26
+ describe "#encrypted" do
27
+ specify { subject.encrypted.should == OpenSSL::HMAC::hexdigest("sha256", api_secret, subject.plaintext)}
28
+ end
29
+
30
+ describe "#to_s" do
31
+ specify { subject.to_s.should == subject.encrypted}
32
+ end
33
+
34
+ describe "#==" do
35
+ let(:duplicate_signature) { ShippingEasy::Signature.new(api_secret: api_secret, method: method, path: path, params: params, body: request_body) }
36
+ specify { (subject == OpenSSL::HMAC::hexdigest("sha256", api_secret, subject.plaintext)).should be_true }
37
+ specify { (subject == OpenSSL::HMAC::hexdigest("sha256", "BADSECRET", subject.plaintext)).should be_false }
38
+ specify { (subject == duplicate_signature).should be_true }
39
+ end
40
+ end
@@ -0,0 +1,20 @@
1
+ require 'bundler/setup'
2
+ require 'shipping_easy'
3
+
4
+ # This file was generated by the `rspec --init` command. Conventionally, all
5
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
6
+ # Require this file using `require "spec_helper"` to ensure that it is only
7
+ # loaded once.
8
+ #
9
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
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
metadata CHANGED
@@ -1,41 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shipping_easy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ShippingEasy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-27 00:00:00.000000000 Z
11
+ date: 2014-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.8.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.4.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.8.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.8.0
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: bundler
15
57
  requirement: !ruby/object:Gem::Requirement
16
58
  requirements:
17
- - - ~>
59
+ - - "~>"
18
60
  - !ruby/object:Gem::Version
19
61
  version: '1.3'
20
62
  type: :development
21
63
  prerelease: false
22
64
  version_requirements: !ruby/object:Gem::Requirement
23
65
  requirements:
24
- - - ~>
66
+ - - "~>"
25
67
  - !ruby/object:Gem::Version
26
68
  version: '1.3'
27
69
  - !ruby/object:Gem::Dependency
28
- name: rake
70
+ name: rspec
29
71
  requirement: !ruby/object:Gem::Requirement
30
72
  requirements:
31
- - - '>='
73
+ - - ">="
32
74
  - !ruby/object:Gem::Version
33
75
  version: '0'
34
76
  type: :development
35
77
  prerelease: false
36
78
  version_requirements: !ruby/object:Gem::Requirement
37
79
  requirements:
38
- - - '>='
80
+ - - ">="
39
81
  - !ruby/object:Gem::Version
40
82
  version: '0'
41
83
  description: The official ShippingEasy API client for Ruby.
@@ -45,19 +87,34 @@ executables: []
45
87
  extensions: []
46
88
  extra_rdoc_files: []
47
89
  files:
48
- - .gitignore
90
+ - ".gitignore"
91
+ - ".rspec"
49
92
  - Gemfile
50
93
  - LICENSE.txt
51
94
  - README.md
52
95
  - Rakefile
53
96
  - lib/shipping_easy.rb
54
97
  - lib/shipping_easy/authenticator.rb
55
- - lib/shipping_easy/resources/cancellations.rb
98
+ - lib/shipping_easy/configuration.rb
99
+ - lib/shipping_easy/http.rb
100
+ - lib/shipping_easy/http/faraday_adapter.rb
101
+ - lib/shipping_easy/http/request.rb
102
+ - lib/shipping_easy/http/response_handler.rb
103
+ - lib/shipping_easy/resources.rb
104
+ - lib/shipping_easy/resources/base.rb
105
+ - lib/shipping_easy/resources/cancellation.rb
56
106
  - lib/shipping_easy/resources/order.rb
57
- - lib/shipping_easy/resources/store.rb
58
107
  - lib/shipping_easy/signature.rb
59
108
  - lib/shipping_easy/version.rb
60
109
  - shipping_easy.gemspec
110
+ - spec/authenticator_spec.rb
111
+ - spec/configuration_spec.rb
112
+ - spec/http/faraday_adapter_spec.rb
113
+ - spec/http/request_spec.rb
114
+ - spec/http/response_handler_spec.rb
115
+ - spec/resources/base_spec.rb
116
+ - spec/signature_spec.rb
117
+ - spec/spec_helper.rb
61
118
  homepage: https://github.com/ShippingEasy/shipping_easy-ruby
62
119
  licenses:
63
120
  - MIT
@@ -68,18 +125,26 @@ require_paths:
68
125
  - lib
69
126
  required_ruby_version: !ruby/object:Gem::Requirement
70
127
  requirements:
71
- - - '>='
128
+ - - ">="
72
129
  - !ruby/object:Gem::Version
73
130
  version: '0'
74
131
  required_rubygems_version: !ruby/object:Gem::Requirement
75
132
  requirements:
76
- - - '>='
133
+ - - ">="
77
134
  - !ruby/object:Gem::Version
78
135
  version: '0'
79
136
  requirements: []
80
137
  rubyforge_project:
81
- rubygems_version: 2.0.0
138
+ rubygems_version: 2.2.0
82
139
  signing_key:
83
140
  specification_version: 4
84
141
  summary: The official ShippingEasy API client for Ruby.
85
- test_files: []
142
+ test_files:
143
+ - spec/authenticator_spec.rb
144
+ - spec/configuration_spec.rb
145
+ - spec/http/faraday_adapter_spec.rb
146
+ - spec/http/request_spec.rb
147
+ - spec/http/response_handler_spec.rb
148
+ - spec/resources/base_spec.rb
149
+ - spec/signature_spec.rb
150
+ - spec/spec_helper.rb
File without changes