shipping-scale 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -6
- data/lib/.DS_Store +0 -0
- data/lib/shipping_scale.rb +7 -3
- data/lib/shipping_scale/.DS_Store +0 -0
- data/lib/shipping_scale/client.rb +2 -4
- data/lib/shipping_scale/configuration.rb +1 -1
- data/lib/shipping_scale/packaging/package.rb +63 -0
- data/lib/shipping_scale/packaging/packaging.rb +18 -0
- data/lib/shipping_scale/packaging/shipment.rb +11 -0
- data/lib/shipping_scale/request.rb +2 -1
- data/lib/shipping_scale/response.rb +22 -3
- data/lib/shipping_scale/version.rb +1 -1
- data/lib/string_module.rb +46 -0
- data/shipping-scale-0.1.0.gem +0 -0
- metadata +8 -4
- data/lib/shipping_scale/package.rb +0 -40
- data/lib/snakecase_string.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6895d8b360e1db8c6ff8de0dd9f4a61577368125
|
4
|
+
data.tar.gz: 68d68bcb2e4beefb59232f33bf14d6bcdbd44ed4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 009e37f216d3a1cad3ac8053954e7abce48de48430999f900ee784af235aa446d687ab82641a7d86ee212c3bcd13a06dc6cfa2393a7cfefd5d00453fdb0671f9
|
7
|
+
data.tar.gz: 79b2a3c2b6a10a0dbcbfde3ed57b1d2202a52e669e22793d20fcc5ddf20ac4d57833f9c942318fcfddda9e71f7d6b20b6f2f77cbbd078ee07eee68e1689de651
|
data/README.md
CHANGED
@@ -37,14 +37,12 @@ end
|
|
37
37
|
|
38
38
|
## Usage
|
39
39
|
|
40
|
-
If you have all of the necessary information for the package you want to ship, using the gem is as
|
40
|
+
If you have all of the necessary information for the package you want to ship, using the gem is as simple as creating an instance of `ShipingScale::Package` and using `#get_price!`. Other details are also returned with this method.
|
41
41
|
|
42
42
|
```ruby
|
43
43
|
package_options = {
|
44
|
-
|
45
|
-
|
46
|
-
width: 2,
|
47
|
-
height: 3,
|
44
|
+
pounds: 1,
|
45
|
+
ounces: 8, # or weight: 1.5
|
48
46
|
zip_origin: "66204",
|
49
47
|
zip_destination: "63501"
|
50
48
|
}
|
@@ -59,7 +57,7 @@ package.price # => 15
|
|
59
57
|
# for other details sent back from the request
|
60
58
|
package.details # => { zip_origination: "66204", zip_destination: "63501", pounds: "1", ... }
|
61
59
|
```
|
62
|
-
|
60
|
+
Currently, all rates retreived from the USPS API are for 2-day Priority Mail only.
|
63
61
|
|
64
62
|
## License
|
65
63
|
|
data/lib/.DS_Store
CHANGED
Binary file
|
data/lib/shipping_scale.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
require "shipping_scale/version"
|
2
2
|
require "builder"
|
3
3
|
require "nokogiri"
|
4
|
-
require "
|
4
|
+
require "string_module"
|
5
|
+
require "typhoeus"
|
6
|
+
|
5
7
|
|
6
8
|
module ShippingScale
|
7
9
|
|
8
10
|
autoload :Client, "shipping_scale/client"
|
9
11
|
autoload :Configuration, "shipping_scale/configuration"
|
12
|
+
autoload :Error, "shipping_scale/error"
|
13
|
+
autoload :Package, "shipping_scale/packaging/package"
|
14
|
+
autoload :Packaging, "shipping_scale/packaging/packaging"
|
10
15
|
autoload :Request, "shipping_scale/request"
|
11
16
|
autoload :Response, "shipping_scale/response"
|
12
|
-
autoload :
|
13
|
-
autoload :Package, "shipping_scale/package"
|
17
|
+
autoload :Shipment, "shipping_scale/packaging/shipment"
|
14
18
|
|
15
19
|
class << self
|
16
20
|
attr_writer :config
|
Binary file
|
@@ -1,15 +1,13 @@
|
|
1
|
-
require "typhoeus"
|
2
|
-
|
3
1
|
module ShippingScale
|
4
2
|
class Client
|
5
3
|
def request(request)
|
6
|
-
server =
|
4
|
+
server = "http://production.shippingapis.com/ShippingAPI.dll"
|
7
5
|
|
8
6
|
response = Typhoeus::Request.get(server, {
|
9
7
|
timeout: ShippingScale.config.timeout,
|
10
8
|
params: {
|
11
9
|
"API" => request.api,
|
12
|
-
"XML" => request.build
|
10
|
+
"XML" => request.build.body.clean_xml
|
13
11
|
}
|
14
12
|
})
|
15
13
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module ShippingScale
|
2
|
-
class Configuration < Struct.new(:user_id, :timeout, :testing, :
|
2
|
+
class Configuration < Struct.new(:user_id, :timeout, :testing, :zip_origination, :zip_destination)
|
3
3
|
def initialize
|
4
4
|
self.timeout = 5
|
5
5
|
self.testing = false
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module ShippingScale
|
2
|
+
class Package < Packaging
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def shipment(details)
|
6
|
+
packages = details.map { |package| new(package) }
|
7
|
+
ShippingScale::Shipment.new(packages)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader(
|
12
|
+
:weight,
|
13
|
+
:pounds,
|
14
|
+
:ounces,
|
15
|
+
:length,
|
16
|
+
:width,
|
17
|
+
:height,
|
18
|
+
:zip_origination,
|
19
|
+
:zip_destination,
|
20
|
+
)
|
21
|
+
|
22
|
+
def initialize(**options)
|
23
|
+
@weight = options[:weight]
|
24
|
+
@pounds = (options[:pounds]) ? options[:pounds] : get_pounds
|
25
|
+
@ounces = (options[:ounces]) ? options[:ounces] : get_ounces
|
26
|
+
@zip_origination = (options[:zip_origination]) ? options[:zip_origination] : ShippingScale.config.zip_origination
|
27
|
+
@zip_destination = (options[:zip_destination]) ? options[:zip_destination] : ShippingScale.config.zip_destination
|
28
|
+
|
29
|
+
@packages = [self]
|
30
|
+
end
|
31
|
+
|
32
|
+
def build_xml(package)
|
33
|
+
attrs.each do |k, v|
|
34
|
+
package.tag!(k.to_s.upper_camelcase, v)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
#TODO set methods to determin service, container, and size
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def get_pounds
|
42
|
+
@weight.floor.to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_ounces
|
46
|
+
frac = @weight - @weight.floor
|
47
|
+
((frac * 16) / 10).ceil.to_i
|
48
|
+
end
|
49
|
+
|
50
|
+
def attrs
|
51
|
+
{
|
52
|
+
service: "All",
|
53
|
+
zip_origination: @zip_origination,
|
54
|
+
zip_destination: @zip_destination,
|
55
|
+
pounds: @pounds,
|
56
|
+
ounces: @ounces,
|
57
|
+
container: "VARIABLE",
|
58
|
+
size: "Regular",
|
59
|
+
machinable: "true"
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ShippingScale
|
2
|
+
class Packaging
|
3
|
+
attr_accessor :response, :packages
|
4
|
+
|
5
|
+
def get_price!(options = {})
|
6
|
+
ShippingScale::Request.config(options)
|
7
|
+
@response = ShippingScale::Request.new(packages: packages).send!
|
8
|
+
end
|
9
|
+
|
10
|
+
def price
|
11
|
+
response.price
|
12
|
+
end
|
13
|
+
|
14
|
+
def details
|
15
|
+
response.details
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -17,17 +17,36 @@ module ShippingScale
|
|
17
17
|
attr_reader :xml
|
18
18
|
|
19
19
|
def details
|
20
|
-
details = {}
|
20
|
+
details = {postage: []}
|
21
21
|
|
22
22
|
xml.search("Package").children.each do |node|
|
23
|
-
|
23
|
+
if node.name == "Postage"
|
24
|
+
postage = {}
|
25
|
+
node.children.each do |child|
|
26
|
+
postage[child.name.to_s.snakecase.to_sym] = child.text
|
27
|
+
end
|
28
|
+
details[:postage].push(postage)
|
29
|
+
else
|
30
|
+
details[node.name.to_s.snakecase.to_sym] = node.text
|
31
|
+
end
|
24
32
|
end
|
25
33
|
|
26
34
|
return details
|
27
35
|
end
|
28
36
|
|
29
37
|
def price
|
30
|
-
xml.search("
|
38
|
+
xml.search("Postage[CLASSID='1']").search("Rate").inject(0) { |sum, t| sum + t.text.to_f }
|
39
|
+
end
|
40
|
+
|
41
|
+
def prices
|
42
|
+
prices = {}
|
43
|
+
xml.search("Package").each do |package|
|
44
|
+
key = package.attribute("ID").value.to_s
|
45
|
+
value = package.search("Postage[CLASSID='1']").search("Rate").text.to_f
|
46
|
+
prices[key] = value
|
47
|
+
end
|
48
|
+
|
49
|
+
prices
|
31
50
|
end
|
32
51
|
end
|
33
52
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class String
|
2
|
+
def snakecase
|
3
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
4
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
5
|
+
tr('-', '_').
|
6
|
+
gsub(/\s/, '_').
|
7
|
+
gsub(/__+/, '_').
|
8
|
+
downcase
|
9
|
+
end
|
10
|
+
|
11
|
+
def camelcase(*separators)
|
12
|
+
case separators.first
|
13
|
+
when Symbol, TrueClass, FalseClass, NilClass
|
14
|
+
first_letter = separators.shift
|
15
|
+
end
|
16
|
+
|
17
|
+
separators = ['_', '\s'] if separators.empty?
|
18
|
+
|
19
|
+
str = self.dup
|
20
|
+
|
21
|
+
separators.each do |s|
|
22
|
+
str = str.gsub(/(?:#{s}+)([a-z])/){ $1.upcase }
|
23
|
+
end
|
24
|
+
|
25
|
+
case first_letter
|
26
|
+
when :upper, true
|
27
|
+
str = str.gsub(/(\A|\s)([a-z])/){ $1 + $2.upcase }
|
28
|
+
when :lower, false
|
29
|
+
str = str.gsub(/(\A|\s)([A-Z])/){ $1 + $2.downcase }
|
30
|
+
end
|
31
|
+
|
32
|
+
str
|
33
|
+
end
|
34
|
+
|
35
|
+
def upper_camelcase(*separators)
|
36
|
+
camelcase(:upper, *separators)
|
37
|
+
end
|
38
|
+
|
39
|
+
def lower_camelcase(*separators)
|
40
|
+
camelcase(:lower, *separators)
|
41
|
+
end
|
42
|
+
|
43
|
+
def clean_xml
|
44
|
+
self.gsub(/<body\/>/, "")
|
45
|
+
end
|
46
|
+
end
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shipping-scale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Reinhardt
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: builder
|
@@ -138,14 +138,18 @@ files:
|
|
138
138
|
- bin/setup
|
139
139
|
- lib/.DS_Store
|
140
140
|
- lib/shipping_scale.rb
|
141
|
+
- lib/shipping_scale/.DS_Store
|
141
142
|
- lib/shipping_scale/client.rb
|
142
143
|
- lib/shipping_scale/configuration.rb
|
143
144
|
- lib/shipping_scale/error.rb
|
144
|
-
- lib/shipping_scale/package.rb
|
145
|
+
- lib/shipping_scale/packaging/package.rb
|
146
|
+
- lib/shipping_scale/packaging/packaging.rb
|
147
|
+
- lib/shipping_scale/packaging/shipment.rb
|
145
148
|
- lib/shipping_scale/request.rb
|
146
149
|
- lib/shipping_scale/response.rb
|
147
150
|
- lib/shipping_scale/version.rb
|
148
|
-
- lib/
|
151
|
+
- lib/string_module.rb
|
152
|
+
- shipping-scale-0.1.0.gem
|
149
153
|
- shipping-scale.gemspec
|
150
154
|
- tasks/rspec.rake
|
151
155
|
homepage: https://github.com/jereinhardt/shipping-scale
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module ShippingScale
|
2
|
-
class Package
|
3
|
-
def initialize(**options)
|
4
|
-
@weight = options[:weight]
|
5
|
-
@pounds = options[:pounds]
|
6
|
-
@ounces = options[:ounces]
|
7
|
-
@length = options[:length]
|
8
|
-
@width = options[:width]
|
9
|
-
@height = options[:height]
|
10
|
-
@zip_origin = (options[:zip_origin]) ? options[:zip_origin] : ShippingScale.config.zip_origin
|
11
|
-
@zip_destination = (options[:zip_destination]) ? options[:zip_destination] : ShippingScale.config.zip_destination
|
12
|
-
|
13
|
-
@attrs = options
|
14
|
-
end
|
15
|
-
|
16
|
-
attr_accessor :response
|
17
|
-
|
18
|
-
def build_xml(package)
|
19
|
-
package.tag!("Service", "All")
|
20
|
-
package.tag!("Container", "VARAIBLE")
|
21
|
-
package.tag!("Size", "REGULAR")
|
22
|
-
@attrs.each { |k, v| package.tag!(k.to_s, v) }
|
23
|
-
end
|
24
|
-
|
25
|
-
def get_price!(options = {})
|
26
|
-
ShippingScale::Request.config(options)
|
27
|
-
@response = ShippingScale::Request.new(packages: [self]).send!
|
28
|
-
end
|
29
|
-
|
30
|
-
def price
|
31
|
-
response.price
|
32
|
-
end
|
33
|
-
|
34
|
-
def details
|
35
|
-
response.details
|
36
|
-
end
|
37
|
-
|
38
|
-
#TODO set methods to determin service, container, and size
|
39
|
-
end
|
40
|
-
end
|