ruby-gls 1.0.2 → 1.0.3

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: 9b7cde32a4268f0464679ee590c06a28e88347dd4679ec53f508ad9c04bc93eb
4
- data.tar.gz: 51d153dc3da485baed746ee194958311c454d8913752adc31680323458627e4d
3
+ metadata.gz: ec195d660c69f8c4dfc010c87d6c38127949c715f2bbfde62d29947472d368b1
4
+ data.tar.gz: 537ca2fc2af3c33bf7bf5012eae7a5db4111a4fceba7a0b28dc884c3ee9a6c42
5
5
  SHA512:
6
- metadata.gz: b44a115a0ba6af3b3a1324754026457be216645c04b997c1d8cb7bb3c66031137eb600777f80c4264d8ff750b7b86f31801b6280eafdb8021103e7d0dfbb1166
7
- data.tar.gz: 7598bc94db828061be69c75fdbc4b304d22ef0f9ffb5e20762d5df75d1fcd4e5897c248b737cd5469a4b97f97ddbfe537aadbe47709ba150ef093fc8bd97ffa7
6
+ metadata.gz: 9d7dd576e9a242a0a50f8647e61a2eb6960dde01f04d49847cbed92e1c9705fb5030651a43515722ce82fe2df08b5ccba90a52bfc081ef1bc13db5528dd944a9
7
+ data.tar.gz: 9135769d192ce68080d42454d13f462f6196e84209ee3805c338069e81dabbb74a56660de57e0e4e4fcb4ec1c413feabd062b4a2b9387e077845dcf916bd7afd
@@ -0,0 +1,65 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ require "base64"
4
+
5
+ class RubyGLS::Client
6
+
7
+ attr_reader :base_url, :basic_auth, :username, :password, :contact_id
8
+
9
+ def initialize(base_url, basic_auth, username, password, contact_id)
10
+ @base_url = base_url
11
+ @basic_auth = basic_auth
12
+ @username = username
13
+ @password = password
14
+ @contact_id = contact_id
15
+
16
+ raise ArgumentError('Either basic_auth or username and password not provided') unless basic_auth || (username && password)
17
+ end
18
+
19
+ def action(path, http_method: :post, payload: {})
20
+ begin
21
+ response = ::RestClient::Request.execute(
22
+ method: http_method,
23
+ url: full_url(path),
24
+ payload: payload.to_json,
25
+ headers: headers,
26
+ timeout: 5,
27
+ verify_ssl: ::OpenSSL::SSL::VERIFY_NONE
28
+ )
29
+ rescue => e
30
+ return struct_response.new(false, { error: e.message })
31
+ end
32
+
33
+ parse(response)
34
+ end
35
+
36
+ def get_basic_auth
37
+ return basic_auth if basic_auth
38
+
39
+ Base64.encode64("#{username}:#{password}")
40
+ end
41
+
42
+ def headers
43
+ {
44
+ 'User-Agent': "RubyGLS client v#{RubyGLS::VERSION})",
45
+ 'Content-Type': 'application/glsVersion1+json',
46
+ 'Accept': 'application/glsVersion1+json, application/json',
47
+ 'Authorization': "Basic #{get_basic_auth}"
48
+ }
49
+ end
50
+
51
+ def full_url(path)
52
+ "#{base_url}#{path}"
53
+ end
54
+
55
+ def parse(response)
56
+ success = (200..308).to_a.include?(response.code.to_i) ? true : false
57
+ hash_response = JSON.parse(response.body)
58
+
59
+ struct_response.new(success, hash_response)
60
+ end
61
+
62
+ def struct_response
63
+ Struct.new(:success?, :hash_response)
64
+ end
65
+ end
@@ -0,0 +1,69 @@
1
+ require 'ruby-gls/helper'
2
+
3
+ class RubyGLS::Connection
4
+ include RubyGLS::Helper
5
+
6
+ attr_reader :client
7
+
8
+ def initialize(base_url:, basic_auth: nil, username: nil, password: nil, contact_id: nil)
9
+ @client = RubyGLS::Client.new(base_url, basic_auth, username, password, contact_id)
10
+ end
11
+
12
+ #
13
+ # https://shipit.gls-group.eu/webservices/3_0_6/doxygen/WS-REST-API/rest_shipment_processing.html#REST_API_REST_F_114
14
+ #
15
+ def create_parcel(**opts)
16
+ payload = opts
17
+ payload[:Shipment][:Shipper][:ContactID] = client.contact_id
18
+
19
+ action(RubyGLS::URL::CREATE_PARCEL, payload: payload)
20
+ end
21
+
22
+ #
23
+ # https://shipit.gls-group.eu/webservices/3_0_6/doxygen/WS-REST-API/rest_shipment_processing.html#REST_API_REST_F_115
24
+ #
25
+ def validate_parcels(**opts)
26
+ payload = opts
27
+ payload[:Shipment][:Shipper][:ContactID] = client.contact_id
28
+
29
+ action(RubyGLS::URL::VALIDATE_PARCELS, payload: opts)
30
+ end
31
+
32
+ #
33
+ # https://shipit.gls-group.eu/webservices/3_0_6/doxygen/WS-REST-API/rest_shipment_processing.html#REST_API_REST_F_117
34
+ #
35
+ def get_allowed_services(**opts)
36
+ action(RubyGLS::URL::GET_ALLOWED_SERVICES, payload: opts)
37
+ end
38
+
39
+ #
40
+ # https://shipit.gls-group.eu/webservices/3_0_6/doxygen/WS-REST-API/rest_shipment_processing.html#REST_API_REST_F_116
41
+ #
42
+ def cancel_parcel(tracking_number)
43
+ path = replace_string(RubyGLS::URL::CANCEL_PARCEL, ':parcel_id', tracking_number)
44
+
45
+ action(RubyGLS::URL::CANCEL_PARCEL)
46
+ end
47
+
48
+ #
49
+ # https://shipit.gls-group.eu/webservices/3_0_6/doxygen/WS-REST-API/rest_shipment_processing.html#REST_API_REST_F_119
50
+ #
51
+ def update_parcel_weight(**opts)
52
+ action(RubyGLS::URL::UPDATE_PARCEL_WEIGHT, payload: opts)
53
+ end
54
+
55
+ #
56
+ # https://shipit.gls-group.eu/webservices/3_0_6/doxygen/WS-REST-API/rest_shipment_processing.html#REST_API_REST_F_118
57
+ #
58
+ def get_end_of_day_report(date)
59
+ path = replace_string(RubyGLS::URL::GET_END_OF_DAY_REPORT, ':date', date)
60
+
61
+ action(path)
62
+ end
63
+
64
+ private
65
+
66
+ def action(path, payload: {})
67
+ client.action(path, payload: payload)
68
+ end
69
+ end
@@ -0,0 +1,7 @@
1
+ class RubyGLS
2
+ module Helper
3
+ def replace_string(full, substring, to_replace)
4
+ full.sub!(substring, to_replace.to_s)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,62 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'nokogiri'
4
+
5
+ class RubyGLS
6
+ module Tracking
7
+ def find(tracking_number)
8
+ uri = URI(generate_url(tracking_number))
9
+ res = Net::HTTP.get_response(uri)
10
+
11
+ parsed = JSON.parse(res.body)
12
+
13
+ key = parsed.dig('content').keys.last
14
+ html = parsed.dig('content', key, 'html')
15
+
16
+ doc = Nokogiri::HTML(html)
17
+
18
+ status = doc.css('.trigger-status').text.strip
19
+ status_desc = doc.css('.text-primary.lead strong').text.strip
20
+ parcel_number = doc.css('.row.justify-content-left').text&.strip&.split(':')&.last&.strip
21
+
22
+ detailed = [].tap do |arr|
23
+ doc.css('.data_table tbody tr').each do |row|
24
+
25
+ date, time, parcel_status, loc = row.css('td').map(&:text).map(&:strip)
26
+
27
+ arr << {
28
+ date: date,
29
+ time: time,
30
+ parcel_status: parcel_status,
31
+ location: loc
32
+ }
33
+ end
34
+ end
35
+
36
+ if status == ""
37
+ status = 'Not found'
38
+ status_desc = "No tracking information found for #{tracking_number}"
39
+ end
40
+
41
+ {
42
+ tracking_number: tracking_number,
43
+ status: status,
44
+ status_description: status_desc,
45
+ parcel_number: parcel_number,
46
+ detailed_tracking: detailed
47
+ }
48
+ rescue => e
49
+ {
50
+ tracking_number: tracking_number,
51
+ status: 'Not found',
52
+ status_description: "#{e.message}"
53
+ }
54
+ end
55
+
56
+ private
57
+
58
+ def generate_url(tracking_number)
59
+ RubyGLS.config.base_url + "&match=#{tracking_number}"
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,8 @@
1
+ module RubyGLS::URL
2
+ CREATE_PARCEL = '/backend/rs/shipments'
3
+ CANCEL_PARCEL = '//backend/rs/shipments/cancel/:parcel_id'
4
+ GET_ALLOWED_SERVICES = '/backend/rs/shipments/allowedservices'
5
+ VALIDATE_PARCELS = '/backend/rs/shipments/validate'
6
+ GET_END_OF_DAY_REPORT = '/backend/rs/shipments/endofday?date=:date'
7
+ UPDATE_PARCEL_WEIGHT = '/backend/rs/shipments/updateparcelweight'
8
+ end
@@ -1,3 +1,3 @@
1
1
  class RubyGLS
2
- VERSION='1.0.2'
2
+ VERSION='1.0.3'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-gls
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adem Dinarevic
@@ -60,7 +60,12 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - lib/ruby-gls.rb
63
+ - lib/ruby-gls/client.rb
63
64
  - lib/ruby-gls/configuration.rb
65
+ - lib/ruby-gls/connection.rb
66
+ - lib/ruby-gls/helper.rb
67
+ - lib/ruby-gls/tracking.rb
68
+ - lib/ruby-gls/url.rb
64
69
  - lib/ruby-gls/version.rb
65
70
  homepage: https://github.com/ademdc/ruby-gls
66
71
  licenses: