lce 0.0.1
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 +7 -0
- data/.gitignore +17 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.md +98 -0
- data/Rakefile +5 -0
- data/lce.gemspec +30 -0
- data/lib/lce.rb +72 -0
- data/lib/lce/client.rb +34 -0
- data/lib/lce/client/connection.rb +23 -0
- data/lib/lce/client/errors.rb +25 -0
- data/lib/lce/client/request.rb +80 -0
- data/lib/lce/offer.rb +25 -0
- data/lib/lce/order.rb +51 -0
- data/lib/lce/quote.rb +34 -0
- data/lib/lce/version.rb +4 -0
- data/lib/paginated_array.rb +25 -0
- data/spec/fixtures/access_denied +20 -0
- data/spec/fixtures/account_disabled +20 -0
- data/spec/fixtures/check +464 -0
- data/spec/fixtures/offers/available_delivery_locations/found +785 -0
- data/spec/fixtures/offers/find/found +66 -0
- data/spec/fixtures/offers/find/not_found +15 -0
- data/spec/fixtures/order_params +23 -0
- data/spec/fixtures/orders/all/page_1 +111 -0
- data/spec/fixtures/orders/find/found +106 -0
- data/spec/fixtures/orders/find/not_found +15 -0
- data/spec/fixtures/orders/labels/labels.pdf +0 -0
- data/spec/fixtures/orders/labels/response +0 -0
- data/spec/fixtures/orders/place/created +106 -0
- data/spec/fixtures/orders/place/empty_params +15 -0
- data/spec/fixtures/orders/place/missing_params +15 -0
- data/spec/fixtures/orders/tracking +30 -0
- data/spec/fixtures/quote_params +25 -0
- data/spec/fixtures/quotes/all/page_1 +11594 -0
- data/spec/fixtures/quotes/all/page_2 +1665 -0
- data/spec/fixtures/quotes/find/found +492 -0
- data/spec/fixtures/quotes/find/not_found +15 -0
- data/spec/fixtures/quotes/request/created +492 -0
- data/spec/fixtures/quotes/request/empty_quote +15 -0
- data/spec/fixtures/quotes/request/missing_params +15 -0
- data/spec/lce/client_spec.rb +41 -0
- data/spec/lce/offer_spec.rb +85 -0
- data/spec/lce/order_spec.rb +136 -0
- data/spec/lce/quote_spec.rb +111 -0
- data/spec/lce_spec.rb +109 -0
- data/spec/paginated_array_spec.rb +55 -0
- data/spec/spec_helper.rb +17 -0
- data/tasks/rspec.rake +3 -0
- metadata +239 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 42308cd92f775b295eda5cee11a402c71fa922bd
|
4
|
+
data.tar.gz: 43f4d00d85f70453cb424a175b30e112f8179483
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c590bcd48a506cbc23f7b59a74b44c72ff746fd5876a0baceebb6e75e402938699503ba47e1c68ea5bf4ece3f4385e67391fbcd58b0ac0a5cfae82dd8bff3d1c
|
7
|
+
data.tar.gz: fa8bdae09510c95a474c9b4d9552cbbd1c9d0dc68d1f3bba0dd00e8ced48d73d1d2c18b42a0e7887743995f5d076dc2439fd95cca27716421d7b7b954338c61b
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-lce
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.2
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Low Cost Express SAS
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# Lce
|
2
|
+
|
3
|
+
A Ruby library that provides an interface to the LCE web services.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
This library is packaged as a gem. So you can add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'lce'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install lce
|
18
|
+
|
19
|
+
## Configuration
|
20
|
+
|
21
|
+
You can configure this gem by using a configuration block :
|
22
|
+
|
23
|
+
Lce.configure do |config|
|
24
|
+
config.environment = :staging
|
25
|
+
config.login = 'login'
|
26
|
+
config.password = 'password'
|
27
|
+
end
|
28
|
+
|
29
|
+
If you are using the gem in a Rails application, you can store this configuation with oher initializers in :
|
30
|
+
|
31
|
+
RAILS_ROOT/config/initializers/lce.rb
|
32
|
+
|
33
|
+
Here are all available configuration options with their default values :
|
34
|
+
|
35
|
+
Lce.configure do |config|
|
36
|
+
# Switch to :production when you are ready to go live
|
37
|
+
config.environment = :staging
|
38
|
+
|
39
|
+
# No default for authentication attributes. You should have received that by email if not ask us at support@lce.io
|
40
|
+
config.login =
|
41
|
+
config.password =
|
42
|
+
|
43
|
+
# You can set it to Rails.logger if you are using a rails app.
|
44
|
+
config.logger = Logger.new(STDOUT)
|
45
|
+
|
46
|
+
# You can set your own application's name and version.
|
47
|
+
config.application = 'ruby-lce'
|
48
|
+
config.version = '0.0.1'
|
49
|
+
end
|
50
|
+
|
51
|
+
## Usage
|
52
|
+
|
53
|
+
Once configured, you can start making request to the lce webservices. The full documentation for all requests and attributes is available at https://www.lce.io/docs
|
54
|
+
|
55
|
+
### Requesting a quote
|
56
|
+
|
57
|
+
quote_params = {
|
58
|
+
shipper: {city: "Toulouse", postal_code: "31000", country:"FR"},
|
59
|
+
recipient: {city: "Nice", postal_code: "06000", country: "FR", is_a_company: false},
|
60
|
+
parcels: [
|
61
|
+
{length: 25,height: 25, width: 25, weight: 3}
|
62
|
+
]
|
63
|
+
}
|
64
|
+
quote = Lce::Quote.request(quote_params)
|
65
|
+
|
66
|
+
### Placing an order
|
67
|
+
|
68
|
+
order_params = {
|
69
|
+
shipper: {name: "Firstname Lastname", street: "999, street name", phone: "+33699999999", email: "support@lce.io"},
|
70
|
+
recipient: {name: "Firstname Lastname", street: "111, other street", phone: "+33600000", email: "support@lce.io"},
|
71
|
+
parcels: [{description: 'Gift'}]
|
72
|
+
}
|
73
|
+
|
74
|
+
# First, we select an offer we want to order (for this example, we are using the first one)
|
75
|
+
offer = quote.offers.first
|
76
|
+
order = offer.place_order(order_params)
|
77
|
+
|
78
|
+
### Retrieving the labels
|
79
|
+
|
80
|
+
# We can retrieve the labels
|
81
|
+
labels = order.labels
|
82
|
+
# and write them to our drive
|
83
|
+
File.open("order-#{order.id}.pdf", "wb") do |f|
|
84
|
+
f.write(labels)
|
85
|
+
end
|
86
|
+
|
87
|
+
### Getting the tracking informations
|
88
|
+
|
89
|
+
# And then, we can get the tracking events by parcels
|
90
|
+
order.tracking
|
91
|
+
|
92
|
+
## Contributing
|
93
|
+
|
94
|
+
1. Fork it ( http://github.com/lce/ruby-lce/fork )
|
95
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
96
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
97
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
98
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/lce.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'lce/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "lce"
|
8
|
+
spec.version = Lce::VERSION
|
9
|
+
spec.authors = ["Florent Piteau", "Thomas Belliard"]
|
10
|
+
spec.email = ["info@lce.io"]
|
11
|
+
spec.summary = %q{A Ruby library that provides an interface to the LCE web services.}
|
12
|
+
spec.homepage = "http://lce.io/"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
21
|
+
spec.add_development_dependency "rake"
|
22
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
23
|
+
spec.add_development_dependency 'webmock', '~> 1.18.0'
|
24
|
+
|
25
|
+
spec.add_dependency "faraday", "~> 0.9"
|
26
|
+
spec.add_dependency "faraday_middleware", "~> 0.9.1"
|
27
|
+
spec.add_dependency "faraday_middleware-parse_oj", "~> 0.3.0"
|
28
|
+
spec.add_dependency "hashie", "~> 3.2.0"
|
29
|
+
|
30
|
+
end
|
data/lib/lce.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require "lce/version"
|
2
|
+
require "lce/client"
|
3
|
+
require "lce/offer"
|
4
|
+
require "lce/quote"
|
5
|
+
require "lce/order"
|
6
|
+
require "logger"
|
7
|
+
require "awesome_print"
|
8
|
+
|
9
|
+
module Lce
|
10
|
+
class << self
|
11
|
+
attr_accessor :configuration, :client
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.client
|
15
|
+
@client ||= Client.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.configuration
|
19
|
+
@configuration ||= Configuration.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.configure
|
23
|
+
yield(configuration)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.reset
|
27
|
+
@configuration = Configuration.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.check
|
31
|
+
begin
|
32
|
+
client.get
|
33
|
+
rescue Lce::Client::Errors::LceError => e
|
34
|
+
if configuration.raise_lce_errors
|
35
|
+
raise e
|
36
|
+
else
|
37
|
+
configuration.logger.warn(e.to_s)
|
38
|
+
end
|
39
|
+
return false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
class Configuration
|
45
|
+
attr_accessor :login, :password, :environment, :api_version, :http_adapter, :raise_lce_errors, :logger, :application, :version
|
46
|
+
|
47
|
+
def initialize
|
48
|
+
@environment = :staging
|
49
|
+
@api_version = 1
|
50
|
+
@http_adapter = Faraday.default_adapter
|
51
|
+
@raise_lce_errors = true
|
52
|
+
@logger = Logger.new(STDOUT)
|
53
|
+
@logger.level = Logger::DEBUG
|
54
|
+
@application = 'ruby-lce'
|
55
|
+
@version = Lce::VERSION
|
56
|
+
end
|
57
|
+
|
58
|
+
def environment=(value)
|
59
|
+
raise 'Environment must be :staging or :production' unless [:staging, :production].include?(value)
|
60
|
+
@environment = value
|
61
|
+
end
|
62
|
+
|
63
|
+
def application=(app)
|
64
|
+
@application = "#{app} (ruby-lce)"
|
65
|
+
end
|
66
|
+
|
67
|
+
def version=(version)
|
68
|
+
@version = "#{version} (#{Lce::VERSION})"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
data/lib/lce/client.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'lce/client/connection'
|
2
|
+
require 'lce/client/errors'
|
3
|
+
require 'lce/client/request'
|
4
|
+
|
5
|
+
module Lce
|
6
|
+
class Client
|
7
|
+
|
8
|
+
HOSTS = {
|
9
|
+
development: "http://localhost:9000",
|
10
|
+
staging: "https://test.lce.io",
|
11
|
+
production: "https://api.lce.io"
|
12
|
+
}
|
13
|
+
|
14
|
+
include Connection
|
15
|
+
include Request
|
16
|
+
include Errors
|
17
|
+
|
18
|
+
attr_accessor :http_adapter
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@http_adapter = Lce.configuration.http_adapter
|
22
|
+
end
|
23
|
+
|
24
|
+
def host
|
25
|
+
HOSTS[Lce.configuration.environment]
|
26
|
+
end
|
27
|
+
|
28
|
+
def api_version
|
29
|
+
raise VersionError.new("Wrong API version",' wrong_api_version', "Version must be 1.") if Lce.configuration.api_version != 1
|
30
|
+
'v'+Lce.configuration.api_version.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
require 'faraday_middleware/parse_oj'
|
4
|
+
|
5
|
+
module Lce
|
6
|
+
class Client
|
7
|
+
module Connection
|
8
|
+
private
|
9
|
+
def connection
|
10
|
+
Faraday.new(:url => host) do |faraday|
|
11
|
+
faraday.basic_auth(Lce.configuration.login, Lce.configuration.password)
|
12
|
+
faraday.headers['Lce-Origin-Application'] = Lce.configuration.application
|
13
|
+
faraday.headers['Lce-Origin-Version'] = Lce.configuration.version
|
14
|
+
faraday.request :json
|
15
|
+
faraday.response :mashify
|
16
|
+
faraday.response :oj, :content_type => /\bjson$/
|
17
|
+
faraday.response :logger, Lce.configuration.logger
|
18
|
+
faraday.adapter http_adapter
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Lce
|
2
|
+
class Client
|
3
|
+
module Errors
|
4
|
+
class LceError < StandardError
|
5
|
+
attr_reader :type, :details
|
6
|
+
def initialize(msg, type, details)
|
7
|
+
super(msg)
|
8
|
+
@type = type
|
9
|
+
@details = details
|
10
|
+
end
|
11
|
+
def to_s
|
12
|
+
s = super
|
13
|
+
d = (@details.is_a? Array)? @details.join(' ') : @details
|
14
|
+
s+= "\n#{d}" if d && !d.empty?
|
15
|
+
s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
class VersionError < LceError; end
|
19
|
+
class ConnectionError < LceError; end
|
20
|
+
class AccessDenied < LceError; end
|
21
|
+
class AccountDisabled < LceError; end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Lce
|
2
|
+
class Client
|
3
|
+
module Request
|
4
|
+
def get(resource = nil, id = nil, action = nil, format = nil, params = nil)
|
5
|
+
p = path(resource, id, action, format)
|
6
|
+
request(:get, p, params, format)
|
7
|
+
end
|
8
|
+
|
9
|
+
def post(resource = nil, params = nil)
|
10
|
+
p = path(resource)
|
11
|
+
request(:post, p, params)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def path(resource = nil, id = nil, action = nil, format = nil)
|
18
|
+
path = []
|
19
|
+
path << api_version << resource.to_s if resource
|
20
|
+
path << id.to_s if id
|
21
|
+
path << action.to_s if action
|
22
|
+
path = '/'+path.join('/')
|
23
|
+
path += ".#{format}" if format
|
24
|
+
return path
|
25
|
+
end
|
26
|
+
|
27
|
+
def request(action, path, params, format = nil)
|
28
|
+
response = connection.send(action, path, params)
|
29
|
+
if success?(response)
|
30
|
+
return process_data(response.headers['content-type'], response.body)
|
31
|
+
else
|
32
|
+
error!(response)
|
33
|
+
return nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def process_data(type, body)
|
38
|
+
case type
|
39
|
+
when 'application/json'
|
40
|
+
process_json(body)
|
41
|
+
when 'application/pdf'
|
42
|
+
process_pdf(body)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def process_pdf(body)
|
47
|
+
body
|
48
|
+
end
|
49
|
+
|
50
|
+
def process_json(body)
|
51
|
+
if body.data.is_a? Array
|
52
|
+
a = PaginatedArray.new(body[:count], body[:page], body[:per_page])
|
53
|
+
body.data.each do |d|
|
54
|
+
a << d
|
55
|
+
end
|
56
|
+
return a
|
57
|
+
else
|
58
|
+
return body.data
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def success?(response)
|
63
|
+
response.status.between?(200, 299) && (response.headers['content-type'] != 'application/json' || response.body.status == "success")
|
64
|
+
end
|
65
|
+
|
66
|
+
def error!(response)
|
67
|
+
if response.body.error
|
68
|
+
case response.body.error.type
|
69
|
+
when 'access_denied'
|
70
|
+
raise Lce::Client::AccessDenied.new(response.body.error.message, response.body.error.type, response.body.error.details)
|
71
|
+
when 'account_disabled'
|
72
|
+
raise Lce::Client::AccountDisabled.new(response.body.error.message, response.body.error.type, response.body.error.details)
|
73
|
+
when 'internal', 'resource_not_found'
|
74
|
+
raise Lce::Client::LceError.new(response.body.error.message, response.body.error.type, response.body.error.details)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/lce/offer.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
module Lce
|
3
|
+
class Offer < Hashie::Mash
|
4
|
+
class << self
|
5
|
+
def find(id)
|
6
|
+
response = Lce.client.get('offers', id)
|
7
|
+
new(response)
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
def place_order(params)
|
13
|
+
params.merge!(offer_id: id)
|
14
|
+
Order.place(params)
|
15
|
+
end
|
16
|
+
|
17
|
+
def available_delivery_locations(params)
|
18
|
+
return [] unless product.preset_delivery_location == true
|
19
|
+
Lce.client.get('offers', id, 'available_delivery_locations', nil , {location: params }).map! do |l|
|
20
|
+
Hashie::Mash.new(l)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|