aus_post_api 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +37 -0
- data/LICENSE.txt +21 -0
- data/README.md +147 -0
- data/Rakefile +32 -0
- data/aus_post_api.gemspec +14 -0
- data/lib/aus_post_api.rb +7 -0
- data/lib/aus_post_api/dce.rb +15 -0
- data/lib/aus_post_api/dce/endpoint.rb +80 -0
- data/lib/aus_post_api/dce/validate_australian_address.rb +12 -0
- data/lib/aus_post_api/endpoint.rb +66 -0
- data/lib/aus_post_api/endpoint/attributes.rb +54 -0
- data/lib/aus_post_api/pac.rb +83 -0
- data/lib/aus_post_api/pac/country.rb +9 -0
- data/lib/aus_post_api/pac/domestic_letter_size.rb +9 -0
- data/lib/aus_post_api/pac/domestic_letter_thickness.rb +9 -0
- data/lib/aus_post_api/pac/domestic_letter_weight.rb +9 -0
- data/lib/aus_post_api/pac/domestic_parcel_size.rb +9 -0
- data/lib/aus_post_api/pac/domestic_parcel_type.rb +9 -0
- data/lib/aus_post_api/pac/domestic_parcel_weight.rb +9 -0
- data/lib/aus_post_api/pac/domestic_postcode_search.rb +12 -0
- data/lib/aus_post_api/pac/endpoint.rb +76 -0
- data/lib/aus_post_api/pac/international_letter_weight.rb +9 -0
- data/lib/aus_post_api/pac/international_parcel_weight.rb +9 -0
- data/lib/aus_post_api/pac/postage_letter_domestic_calculate.rb +12 -0
- data/lib/aus_post_api/pac/postage_letter_domestic_service.rb +11 -0
- data/lib/aus_post_api/pac/postage_letter_international_calculate.rb +12 -0
- data/lib/aus_post_api/pac/postage_letter_international_service.rb +11 -0
- data/lib/aus_post_api/pac/postage_parcel_domestic_calculate.rb +13 -0
- data/lib/aus_post_api/pac/postage_parcel_domestic_service.rb +12 -0
- data/lib/aus_post_api/pac/postage_parcel_international_calculate.rb +12 -0
- data/lib/aus_post_api/pac/postage_parcel_international_service.rb +11 -0
- data/lib/aus_post_api/uri_handler.rb +35 -0
- data/spec/aus_post_api/dce/endpoint_spec.rb +86 -0
- data/spec/aus_post_api/dce/validate_australian_address_spec.rb +18 -0
- data/spec/aus_post_api/dce_spec.rb +33 -0
- data/spec/aus_post_api/endpoint/attributes_spec.rb +35 -0
- data/spec/aus_post_api/endpoint_spec.rb +43 -0
- data/spec/aus_post_api/pac/country_spec.rb +8 -0
- data/spec/aus_post_api/pac/domestic_letter_size_spec.rb +8 -0
- data/spec/aus_post_api/pac/domestic_letter_thickness_spec.rb +8 -0
- data/spec/aus_post_api/pac/domestic_letter_weight_spec.rb +8 -0
- data/spec/aus_post_api/pac/domestic_parcel_size_spec.rb +8 -0
- data/spec/aus_post_api/pac/domestic_parcel_type_spec.rb +8 -0
- data/spec/aus_post_api/pac/domestic_parcel_weight_spec.rb +8 -0
- data/spec/aus_post_api/pac/endpoint_spec.rb +109 -0
- data/spec/aus_post_api/pac/international_letter_weight_spec.rb +8 -0
- data/spec/aus_post_api/pac/international_parcel_weight_spec.rb +8 -0
- data/spec/aus_post_api/pac/postage_letter_domestic_calculate_spec.rb +19 -0
- data/spec/aus_post_api/pac/postage_letter_domestic_service_spec.rb +15 -0
- data/spec/aus_post_api/pac/postage_letter_international_calculate_spec.rb +20 -0
- data/spec/aus_post_api/pac/postage_letter_international_service_spec.rb +13 -0
- data/spec/aus_post_api/pac/postage_parcel_domestic_calculate_spec.rb +24 -0
- data/spec/aus_post_api/pac/postage_parcel_domestic_service_spec.rb +17 -0
- data/spec/aus_post_api/pac/postage_parcel_international_calculate_spec.rb +15 -0
- data/spec/aus_post_api/pac/postage_parcel_international_service_spec.rb +8 -0
- data/spec/aus_post_api/pac/postcode_search_spec.rb +17 -0
- data/spec/aus_post_api/pac_spec.rb +101 -0
- data/spec/aus_post_api/uri_handler_spec.rb +14 -0
- data/spec/shared_examples/shared_examples_for_endpoint_classes.rb +37 -0
- data/spec/spec_helper.rb +41 -0
- metadata +136 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
module AusPostAPI
|
2
|
+
class Endpoint
|
3
|
+
# The attributes module adds a class level DSL that allows required and
|
4
|
+
# optional attributes to be set using the same interface as `attr_accessor`
|
5
|
+
#
|
6
|
+
# eg.
|
7
|
+
# class Example
|
8
|
+
# include Attributes
|
9
|
+
#
|
10
|
+
# required_attributes :one, :two
|
11
|
+
# optional_attributes :three
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# Additionally it adds two instance methods: `required_attributes` &
|
15
|
+
# `optional_attributes` that return an array of attributes specified by the
|
16
|
+
# two methods.
|
17
|
+
module Attributes
|
18
|
+
def self.included(base)
|
19
|
+
base.extend(ClassMethods)
|
20
|
+
base.include(InstanceMethods)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module ClassMethods
|
25
|
+
def required_attributes(*args)
|
26
|
+
if args.empty?
|
27
|
+
@required_attributes || []
|
28
|
+
else
|
29
|
+
@required_attributes = args
|
30
|
+
self.send(:attr_accessor, *args)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def optional_attributes(*args)
|
35
|
+
if args.empty?
|
36
|
+
@optional_attributes || []
|
37
|
+
else
|
38
|
+
@optional_attributes = args
|
39
|
+
self.send(:attr_accessor, *args)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
module InstanceMethods
|
45
|
+
def required_attributes
|
46
|
+
self.class.required_attributes
|
47
|
+
end
|
48
|
+
|
49
|
+
def optional_attributes
|
50
|
+
self.class.optional_attributes
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module AusPostAPI
|
2
|
+
# The PAC class implements methods specified by the Australia Post Postage
|
3
|
+
# Assessment Calculator. A config hash must be supplied that specifies a valid
|
4
|
+
# PAC_AUTH_KEY, and request format. Setting the key TEST to true in the config
|
5
|
+
# hash will ignore any supplied auth_key and use the test endpoint.
|
6
|
+
class PAC
|
7
|
+
def initialize(config)
|
8
|
+
@config = config
|
9
|
+
end
|
10
|
+
|
11
|
+
def domestic_postcode_search(params = {})
|
12
|
+
AusPostAPI::PAC::DomesticPostcodeSearch.new(params, @config).execute
|
13
|
+
end
|
14
|
+
|
15
|
+
def country(params = {})
|
16
|
+
AusPostAPI::PAC::Country.new(params, @config).execute
|
17
|
+
end
|
18
|
+
|
19
|
+
def domestic_letter_thickness(params = {})
|
20
|
+
AusPostAPI::PAC::DomesticLetterThickness.new(params, @config).execute
|
21
|
+
end
|
22
|
+
|
23
|
+
def domestic_letter_weight(params = {})
|
24
|
+
AusPostAPI::PAC::DomesticLetterWeight.new(params, @config).execute
|
25
|
+
end
|
26
|
+
|
27
|
+
def domestic_letter_size(params = {})
|
28
|
+
AusPostAPI::PAC::DomesticLetterSize.new(params, @config).execute
|
29
|
+
end
|
30
|
+
|
31
|
+
def international_letter_weight(params = {})
|
32
|
+
AusPostAPI::PAC::InternationalLetterWeight.new(params, @config).execute
|
33
|
+
end
|
34
|
+
|
35
|
+
def international_parcel_weight(params = {})
|
36
|
+
AusPostAPI::PAC::InternationalParcelWeight.new(params, @config).execute
|
37
|
+
end
|
38
|
+
|
39
|
+
def domestic_parcel_weight(params = {})
|
40
|
+
AusPostAPI::PAC::DomesticParcelWeight.new(params, @config).execute
|
41
|
+
end
|
42
|
+
|
43
|
+
def domestic_parcel_type(params = {})
|
44
|
+
AusPostAPI::PAC::DomesticParcelType.new(params, @config).execute
|
45
|
+
end
|
46
|
+
|
47
|
+
def domestic_parcel_size(params = {})
|
48
|
+
AusPostAPI::PAC::DomesticParcelSize.new(params, @config).execute
|
49
|
+
end
|
50
|
+
|
51
|
+
def postage_letter_domestic_service(params = {})
|
52
|
+
AusPostAPI::PAC::PostageLetterDomesticService.new(params, @config).execute
|
53
|
+
end
|
54
|
+
|
55
|
+
def postage_parcel_domestic_service(params = {})
|
56
|
+
AusPostAPI::PAC::PostageParcelDomesticService.new(params, @config).execute
|
57
|
+
end
|
58
|
+
|
59
|
+
def postage_letter_international_service(params = {})
|
60
|
+
AusPostAPI::PAC::PostageLetterInternationalService.new(params, @config).execute
|
61
|
+
end
|
62
|
+
|
63
|
+
def postage_parcel_international_service(params = {})
|
64
|
+
AusPostAPI::PAC::PostageParcelInternationalService.new(params, @config).execute
|
65
|
+
end
|
66
|
+
|
67
|
+
def postage_parcel_domestic_calculate(params = {})
|
68
|
+
AusPostAPI::PAC::PostageParcelDomesticCalculate.new(params, @config).execute
|
69
|
+
end
|
70
|
+
|
71
|
+
def postage_parcel_international_calculate(params = {})
|
72
|
+
AusPostAPI::PAC::PostageParcelInternationalCalculate.new(params, @config).execute
|
73
|
+
end
|
74
|
+
|
75
|
+
def postage_letter_domestic_calculate(params = {})
|
76
|
+
AusPostAPI::PAC::PostageLetterDomesticCalculate.new(params, @config).execute
|
77
|
+
end
|
78
|
+
|
79
|
+
def postage_letter_international_calculate(params = {})
|
80
|
+
AusPostAPI::PAC::PostageLetterInternationalCalculate.new(params, @config).execute
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module AusPostAPI
|
2
|
+
class PAC
|
3
|
+
# Abstract class that defines a PAC::Endpoint. It implements the `uri` &
|
4
|
+
# `headers` methods and expects the `api_uri` method to be implemented.
|
5
|
+
class Endpoint < AusPostAPI::Endpoint
|
6
|
+
LIVE_URI = 'https://auspost.com.au/api'
|
7
|
+
TEST_URI = 'https://test.npe.auspost.com.au'
|
8
|
+
TEST_KEY = '28744ed5982391881611cca6cf5c240'
|
9
|
+
FORMATS = ['json', 'xml']
|
10
|
+
|
11
|
+
def uri
|
12
|
+
"#{base_uri}/#{api_uri}.#{format}?#{params}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def headers
|
16
|
+
{ "AUTH-KEY" => @config[:TEST] ? TEST_KEY : auth_key }
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def api_uri
|
22
|
+
raise ImplementationError.new('api_uri')
|
23
|
+
end
|
24
|
+
|
25
|
+
def base_uri
|
26
|
+
@config[:TEST] ? TEST_URI : LIVE_URI
|
27
|
+
end
|
28
|
+
|
29
|
+
def format
|
30
|
+
if @config[:FORMAT].nil?
|
31
|
+
raise NoFormatProvidedError
|
32
|
+
else
|
33
|
+
if !FORMATS.include?(@config[:FORMAT])
|
34
|
+
raise InvalidFormatError
|
35
|
+
else
|
36
|
+
@config[:FORMAT]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def params
|
42
|
+
[].tap { |result|
|
43
|
+
@attributes.keys.each { |a| result << "#{a}=#{self.send(a)}" }
|
44
|
+
}.join('&')
|
45
|
+
end
|
46
|
+
|
47
|
+
def auth_key
|
48
|
+
if @config[:PAC_AUTH_KEY].nil? && !@config[:TEST]
|
49
|
+
raise NoAuthKeyProvidedError
|
50
|
+
end
|
51
|
+
|
52
|
+
@config[:PAC_AUTH_KEY]
|
53
|
+
end
|
54
|
+
|
55
|
+
class NoAuthKeyProvidedError < StandardError
|
56
|
+
def initialize
|
57
|
+
super("The called endpoint requires the PAC_AUTH_KEY to be set")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class InvalidFormatError < StandardError
|
62
|
+
def initialize
|
63
|
+
super("Accepted formats are: #{AusPostAPI::PAC::Endpoint::FORMATS.join(', ')}")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class NoFormatProvidedError < InvalidFormatError; end
|
68
|
+
|
69
|
+
class ImplementationError < StandardError
|
70
|
+
def initialize(method)
|
71
|
+
super("No #{method} implemented")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module AusPostAPI
|
2
|
+
class PAC
|
3
|
+
class PostageLetterDomesticCalculate < AusPostAPI::PAC::Endpoint
|
4
|
+
required_attributes :service_code, :weight
|
5
|
+
optional_attributes :option_code, :suboption_code, :extra_cover
|
6
|
+
|
7
|
+
def api_uri
|
8
|
+
"postage/letter/domestic/calculate"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module AusPostAPI
|
2
|
+
class PAC
|
3
|
+
class PostageLetterInternationalCalculate < AusPostAPI::PAC::Endpoint
|
4
|
+
required_attributes :country_code, :service_code
|
5
|
+
optional_attributes :weight, :option_code, :suboption_code, :extra_cover
|
6
|
+
|
7
|
+
def api_uri
|
8
|
+
"postage/letter/international/calculate"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AusPostAPI
|
2
|
+
class PAC
|
3
|
+
class PostageParcelDomesticCalculate < AusPostAPI::PAC::Endpoint
|
4
|
+
required_attributes :from_postcode, :to_postcode, :length, :width,
|
5
|
+
:height, :weight, :service_code
|
6
|
+
optional_attributes :option_code, :suboption_code, :extra_cover
|
7
|
+
|
8
|
+
def api_uri
|
9
|
+
"postage/parcel/domestic/calculate"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module AusPostAPI
|
2
|
+
class PAC
|
3
|
+
class PostageParcelDomesticService < AusPostAPI::PAC::Endpoint
|
4
|
+
required_attributes :from_postcode, :to_postcode, :length, :width, :height,
|
5
|
+
:weight
|
6
|
+
|
7
|
+
def api_uri
|
8
|
+
"postage/parcel/domestic/service"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module AusPostAPI
|
2
|
+
class PAC
|
3
|
+
class PostageParcelInternationalCalculate < AusPostAPI::PAC::Endpoint
|
4
|
+
required_attributes :country_code, :weight, :service_code
|
5
|
+
optional_attributes :option_code, :suboption_code, :extra_cover
|
6
|
+
|
7
|
+
def api_uri
|
8
|
+
"postage/parcel/international/calculate"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
# The UriHandler class is wrapper around a http technology. It takes a uri and
|
4
|
+
# a hash of header key values pairs and makes a http request.
|
5
|
+
module AusPostAPI
|
6
|
+
class UriHandler
|
7
|
+
def self.call(uri, headers={})
|
8
|
+
self.new(uri, headers).call
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(uri, headers)
|
12
|
+
@headers = headers
|
13
|
+
@uri = URI.parse(uri)
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
http.request(request)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def http
|
23
|
+
@http ||= Net::HTTP.new(@uri.host, @uri.port).tap do |h|
|
24
|
+
h.use_ssl = true
|
25
|
+
h.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def request
|
30
|
+
@request ||= Net::HTTP::Get.new(@uri).tap do |r|
|
31
|
+
@headers.each { |key, val| r.add_field(key, val) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|