hermes_api 0.2.1 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba713d90a001a203b2183daced46a46ba80df789de7d7750983576a676cecbc2
4
- data.tar.gz: 203653ed48a7a7bf6699313ece6c24b983d9ef490642f1b68c44f192cb371e2a
3
+ metadata.gz: 2b1313c32c78bfdd9fb7a8256298157ca5a13f8a92a5074edeb1671969cb5f43
4
+ data.tar.gz: 14a9dbfd88d46e2c0dce1e49baf0fd8d992332ac5051a60e24b7dc9af083c9a4
5
5
  SHA512:
6
- metadata.gz: 423c6ff94ecf47a18771b5757b4daa022a580d9747b9a6e898bc7d34e489e243dc9a9aaa463cafe0846a8c90cec991122c8324c1a0e10d5e94cf96b49506dd65
7
- data.tar.gz: 07d1efee834a66a3d5570a5729e003031512a15f8795c3c74f518fc0ac95fb1ad6abe8e44cf8b2a4cc84e2b61798e7cf3115644855fdfefc12e0a199f7f89840
6
+ metadata.gz: 8bab7f7db1681634318f832ce9e2aacd1d059025f2745dfddc6a115581dfaad5de7baa552ceb23116e31fa3dae7cbdc16f9200ddad8ad61b7a828156a3fd925b
7
+ data.tar.gz: 31f1ea2846b709e074a7a280b8ee7fa84820db2622370c2b011fe53d69d1bcd3ff536b921a8aaa20bfe2a6aad66d3098d1f81bea283866b74e9d5eb555e3cdff
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hermes_api (0.1.0)
4
+ hermes_api (0.2.1)
5
5
  activeresource (>= 4.1.0, < 6.0.0)
6
6
 
7
7
  GEM
@@ -32,6 +32,7 @@ GEM
32
32
  dotenv (2.7.6)
33
33
  ffi (1.15.3)
34
34
  formatador (0.3.0)
35
+ gem-release (2.2.2)
35
36
  guard (2.17.0)
36
37
  formatador (>= 0.2.4)
37
38
  listen (>= 2.7, < 4.0)
@@ -117,6 +118,7 @@ PLATFORMS
117
118
 
118
119
  DEPENDENCIES
119
120
  dotenv
121
+ gem-release
120
122
  guard-rspec
121
123
  hermes_api!
122
124
  pry
@@ -127,4 +129,4 @@ DEPENDENCIES
127
129
  standard
128
130
 
129
131
  BUNDLED WITH
130
- 2.2.15
132
+ 2.2.24
data/hermes_api.gemspec CHANGED
@@ -3,15 +3,15 @@
3
3
  require_relative "lib/hermes_api/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "hermes_api"
7
- spec.version = HermesAPI::VERSION
8
- spec.authors = ["Andy Chong"]
9
- spec.email = ["andygg1996personal@gmail.com"]
10
-
11
- spec.summary = "Unofficial Ruby object based Hermes UK API wrapper."
12
- spec.description = "Unofficial Ruby object based Hermes UK API wrapper."
13
- spec.homepage = "https://github.com/PostCo/hermes_api"
14
- spec.license = "MIT"
6
+ spec.name = "hermes_api"
7
+ spec.version = HermesAPI::VERSION
8
+ spec.authors = ["Andy Chong"]
9
+ spec.email = ["andygg1996personal@gmail.com"]
10
+
11
+ spec.summary = "Unofficial Ruby object based Hermes UK API wrapper."
12
+ spec.description = "Unofficial Ruby object based Hermes UK API wrapper."
13
+ spec.homepage = "https://github.com/PostCo/hermes_api"
14
+ spec.license = "MIT"
15
15
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
16
16
 
17
17
  spec.metadata["allowed_push_host"] = "https://rubygems.org/"
@@ -25,11 +25,11 @@ Gem::Specification.new do |spec|
25
25
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
26
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
27
27
  end
28
- spec.bindir = "exe"
29
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ["lib"]
31
31
 
32
- spec.add_dependency "activeresource", ">= 4.1.0", "< 6.0.0"
32
+ spec.add_dependency "activeresource", ">= 4.1.0", "< 6.0.0"
33
33
 
34
34
  spec.add_development_dependency "rspec", "~> 3.2"
35
35
  spec.add_development_dependency "dotenv"
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency "pry"
38
38
  spec.add_development_dependency "guard-rspec"
39
39
  spec.add_development_dependency "standard"
40
+ spec.add_development_dependency "gem-release"
40
41
 
41
42
  # Uncomment to register a new dependency of your gem
42
43
  # spec.add_dependency "example-gem", "~> 1.0"
data/lib/dev/config.rb CHANGED
@@ -2,9 +2,12 @@ require "dotenv/load"
2
2
 
3
3
  def set_config
4
4
  HermesAPI.configure do |config|
5
- config.user = ENV["HERMES_API_USER"]
5
+ config.user = ENV["HERMES_API_USER"]
6
6
  config.password = ENV["HERMES_API_PASSWORD"]
7
7
  config.env = :test
8
8
  config.proxy = ENV["HERMES_API_PROXY"]
9
+ config.auth_id = ENV["HERMES_API_AUTH_ID"]
10
+ config.auth_secret = ENV["HERMES_API_AUTH_SECRET"]
11
+ config.api_key = ENV["HERMES_API_KEY"]
9
12
  end
10
- end
13
+ end
@@ -8,6 +8,7 @@ loader.inflector.inflect(
8
8
  loader.push_dir("./lib")
9
9
  loader.collapse("./lib/hermes_api/resources")
10
10
  loader.ignore("#{__dir__}/config.rb")
11
+ loader.ignore("./lib/hermes_api/cache.rb")
11
12
  loader.enable_reloading
12
13
  # loader.log!
13
14
  loader.setup
data/lib/hermes_api.rb CHANGED
@@ -4,10 +4,16 @@ require_relative "hermes_api/version"
4
4
  require "active_resource"
5
5
 
6
6
  module HermesAPI
7
+ require "hermes_api/cache"
7
8
  require "hermes_api/configuration"
8
9
  require "hermes_api/creation_error"
9
10
  require "hermes_api/connection"
10
11
 
11
12
  require "hermes_api/resources/base"
12
13
  require "hermes_api/resources/return_label"
14
+
15
+ require "hermes_api/resources/o_auth"
16
+ require "hermes_api/resources/json_base"
17
+ require "hermes_api/resources/print_in_store_qr"
18
+
13
19
  end
@@ -0,0 +1,10 @@
1
+ module HermesAPI
2
+ mattr_accessor :cache
3
+
4
+ self.cache = if defined?(Rails) && Rails.respond_to?(:cache) &&
5
+ Rails.cache.is_a?(ActiveSupport::Cache::Store)
6
+ Rails.cache
7
+ else
8
+ ActiveSupport::Cache::MemoryStore.new
9
+ end
10
+ end
@@ -1,11 +1,19 @@
1
1
  module HermesAPI
2
2
  class Configuration
3
- attr_accessor :proxy, :env, :user, :password
3
+ attr_accessor :proxy, :env, :user, :password, :auth_id, :auth_secret, :api_key
4
4
  end
5
5
 
6
6
  PRODUCTION_SITE = "https://www.hermes-europe.co.uk"
7
7
  TESTING_SITE = "https://sit.hermes-europe.co.uk"
8
8
 
9
+ OAUTH_PRODUCTION_SITE = "https://hermes-client-integration-prod.eu.auth0.com"
10
+ OAUTH_TESTING_SITE = "https://hermes-client-integration-pre.eu.auth0.com"
11
+
12
+ JSON_PRODUCTION_SITE = "https://api.hermesworld.co.uk"
13
+ JSON_TESTING_SITE = "https://api.hermesworld.co.uk"
14
+ # temporarily disabled until it is fixed
15
+ # JSON_TESTING_SITE = "https://hermeslive-pre-prod.apigee.net"
16
+
9
17
  class << self
10
18
  def config
11
19
  @config ||= Configuration.new
@@ -16,6 +24,11 @@ module HermesAPI
16
24
  HermesAPI::Base.proxy = config.proxy
17
25
  HermesAPI::Base.user = config.user
18
26
  HermesAPI::Base.password = config.password
27
+
28
+ HermesAPI::JsonBase.site = config.env.to_s == "production" ? JSON_PRODUCTION_SITE : JSON_TESTING_SITE
29
+ HermesAPI::OAuth.site = config.env.to_s == "production" ? OAUTH_PRODUCTION_SITE : OAUTH_TESTING_SITE
30
+
31
+ HermesAPI::JsonBase.headers["apikey"] = config.api_key
19
32
  end
20
33
 
21
34
  def configure
@@ -0,0 +1,26 @@
1
+ module HermesAPI
2
+ class JsonBase < ActiveResource::Base
3
+ self.include_format_in_path = false
4
+ self.auth_type = :bearer
5
+
6
+ OAUTH_AUDIENCE = nil
7
+
8
+ def save
9
+ token = HermesAPI.cache.read("#{self.class.name}/oauth_token") || fetch_token
10
+ connection.bearer_token = token
11
+ super
12
+ end
13
+
14
+ private
15
+
16
+ def fetch_token
17
+ response = OAuth.create(audience: self.class::OAUTH_AUDIENCE)
18
+ HermesAPI.cache.write(
19
+ "#{self.class.name}/oauth_token",
20
+ response.access_token,
21
+ expires_in: response.expires_in - 15 # clear cache earlier
22
+ )
23
+ response.access_token
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ module HermesAPI
2
+ class OAuth < ActiveResource::Base
3
+ self.include_format_in_path = false
4
+ self.element_name=""
5
+ self.prefix="/oauth/token"
6
+
7
+ def initialize(attributes = {}, persisted = false)
8
+ attributes = {
9
+ grant_type: "client_credentials",
10
+ client_id: HermesAPI.config.auth_id,
11
+ client_secret: HermesAPI.config.auth_secret,
12
+ **attributes
13
+ }
14
+ super
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ module HermesAPI
2
+ class PrintInStoreQr < JsonBase
3
+ self.element_name = ""
4
+ self.prefix = "/client-print-in-store-api/v1/references"
5
+
6
+ OAUTH_AUDIENCE = "client-print-in-store-api"
7
+
8
+ def load(attributes, remove_root = false, persisted = false)
9
+ # remove the outer array before parsing the response body
10
+ attributes = attributes[0] if attributes.is_a?(Array) && attributes.length == 1
11
+ super
12
+ end
13
+ end
14
+ end
@@ -50,6 +50,8 @@ module HermesAPI
50
50
  rescue NameError
51
51
  end
52
52
 
53
+ alias_method :label, :labels
54
+
53
55
  def tracking_numbers
54
56
  entries = routingResponseEntries.routingResponseEntry
55
57
  if entries.is_a?(Array)
@@ -62,7 +64,65 @@ module HermesAPI
62
64
  rescue NameError
63
65
  end
64
66
 
65
- alias_method :label, :labels
66
67
  alias_method :tracking_number, :tracking_numbers
68
+
69
+ def request_print_in_store_qr_code(attrs = {
70
+ dimensions: {
71
+ depth: 15,
72
+ length: 20,
73
+ width: 15,
74
+ weight: 1
75
+ },
76
+ value: {
77
+ currency: "GBP",
78
+ amount: 10
79
+ }
80
+ })
81
+ return nil if attributes["routingResponseEntries"].blank?
82
+
83
+ entries = routingResponseEntries.routingResponseEntry
84
+ entry = entries.is_a?(Array) ? entries[0] : entries
85
+ carrier = entry.inboundCarriers.carrier1
86
+ barcode = carrier.barcode1
87
+ customer = collectionRoutingRequestEntries[0].customer
88
+ address = customer.address
89
+
90
+ self.print_in_store_qr_code = PrintInStoreQr.create(
91
+ customer: {
92
+ customerReference1: customer.customerReference1
93
+ },
94
+ deliveryAddress: {
95
+ name: "#{address.firstName} #{address.lastName}",
96
+ addressLine1: address.addressLine1,
97
+ countryCode: address.countryCode,
98
+ postcode: address.postCode
99
+ },
100
+ labelType: "RETURN",
101
+ barcode: {
102
+ barcode: barcode.barcodeNumber,
103
+ barcodeDisplay: barcode.barcodeDisplay
104
+ },
105
+ client: {
106
+ clientId: clientId,
107
+ clientName: clientName
108
+ },
109
+ routing: {
110
+ deliveryMethod: {
111
+ deliveryMethodId: carrier.deliveryMethodCode,
112
+ deliveryMethodDescription: carrier.deliveryMethodDesc
113
+ },
114
+ sortLevels: {
115
+ sortLevel1: carrier.sortLevel1.strip,
116
+ sortLevel2: carrier.sortLevel2
117
+ }
118
+ },
119
+ serviceOffers: [],
120
+ **attrs
121
+ )
122
+ end
123
+
124
+ def base64_print_in_store_qr_code
125
+ as_json.dig("print_in_store_qr_code", "qrCode", "base64EncodedBytes")
126
+ end
67
127
  end
68
128
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HermesAPI
4
- VERSION = "0.2.1"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hermes_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Chong
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-07 00:00:00.000000000 Z
11
+ date: 2021-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activeresource
@@ -114,6 +114,20 @@ dependencies:
114
114
  - - ">="
115
115
  - !ruby/object:Gem::Version
116
116
  version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: gem-release
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
117
131
  description: Unofficial Ruby object based Hermes UK API wrapper.
118
132
  email:
119
133
  - andygg1996personal@gmail.com
@@ -137,10 +151,14 @@ files:
137
151
  - lib/dev/config.rb
138
152
  - lib/dev/zeitwerk_loader.rb
139
153
  - lib/hermes_api.rb
154
+ - lib/hermes_api/cache.rb
140
155
  - lib/hermes_api/configuration.rb
141
156
  - lib/hermes_api/connection.rb
142
157
  - lib/hermes_api/creation_error.rb
143
158
  - lib/hermes_api/resources/base.rb
159
+ - lib/hermes_api/resources/json_base.rb
160
+ - lib/hermes_api/resources/o_auth.rb
161
+ - lib/hermes_api/resources/print_in_store_qr.rb
144
162
  - lib/hermes_api/resources/return_label.rb
145
163
  - lib/hermes_api/version.rb
146
164
  homepage: https://github.com/PostCo/hermes_api
@@ -166,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
184
  - !ruby/object:Gem::Version
167
185
  version: '0'
168
186
  requirements: []
169
- rubygems_version: 3.1.6
187
+ rubygems_version: 3.2.22
170
188
  signing_key:
171
189
  specification_version: 4
172
190
  summary: Unofficial Ruby object based Hermes UK API wrapper.