shipping-scale 0.1.0 → 0.1.2
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 +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
|