uk-hs_code 0.1.3 → 0.2.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: 3da63080141113f6a0de5d28178905c9534f4a6994e0ef27b644e9ffc91acc9e
4
- data.tar.gz: 6c38e1ce4e3fe9a578b38346e3db3590d8ca86eafce9cc06d6533c1835a611a5
3
+ metadata.gz: 85e09b189b4a286a2766142d0b38f27be4bca6b5441ed8d6b3c274d1e3109036
4
+ data.tar.gz: 1e76d26889a40ebdd5ebd1b70f3634cce6fb92a6518e7d046d109020e84053ab
5
5
  SHA512:
6
- metadata.gz: bac45bb5c7d8f54c061da3c6278b75f2543e1d99865672860c14963ec2250ed49bb1ad27772c14405c4e7b8dab6c7a0fa2233ccd2f6f2297924d3379d6e65d85
7
- data.tar.gz: 1135dcf855bf24a2a6df4d2c56e40ae54c783bbe97b681182e9db9e89d176035af73c3e2758ef8871614409f5ba511a6fd3edf096d6828564051272ee9c1c4f9
6
+ metadata.gz: ea095185027cfd389a2cbe225db95313de464046f60a97d53d0df943a551667c873afd33d7059804041721cb5832639c2e7c974b82eefd6bf0ffe5e277556d86
7
+ data.tar.gz: a65cf16cfba32f7dcfb611acf1af51b0e721cd7e24326913a8279ed38c6971f708be76a09c1ebe622ec7c40fc64bb34d58520abe7f83504e8e50008e40e62427
data/.rubocop.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.6
2
+ TargetRubyVersion: 3.0
3
+ NewCops: enable
4
+ SuggestExtensions: false
3
5
 
4
6
  Style/StringLiterals:
5
7
  Enabled: true
@@ -12,9 +14,6 @@ Style/StringLiteralsInInterpolation:
12
14
  Style/Documentation:
13
15
  Enabled: false
14
16
 
15
- Layout/LineLength:
16
- Max: 120
17
-
18
17
  Layout/LineLength:
19
18
  Enabled: false
20
19
 
@@ -23,3 +22,21 @@ Metrics/AbcSize:
23
22
 
24
23
  Metrics/BlockLength:
25
24
  Enabled: false
25
+
26
+ Metrics/MethodLength:
27
+ Enabled: false
28
+
29
+ Metrics/CyclomaticComplexity:
30
+ Enabled: false
31
+
32
+ Metrics/PerceivedComplexity:
33
+ Enabled: false
34
+
35
+ Metrics/ParameterLists:
36
+ Enabled: false
37
+
38
+ Gemspec/DevelopmentDependencies:
39
+ Enabled: false
40
+
41
+ Gemspec/RequireMFA:
42
+ Enabled: false
data/Gemfile.lock CHANGED
@@ -1,14 +1,22 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- uk-hs_code (0.1.3)
4
+ uk-hs_code (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ addressable (2.9.0)
10
+ public_suffix (>= 2.0.2, < 8.0)
9
11
  ast (2.4.2)
12
+ base64 (0.3.0)
13
+ bigdecimal (4.1.3)
10
14
  coderay (1.1.3)
15
+ crack (1.0.1)
16
+ bigdecimal
17
+ rexml
11
18
  diff-lcs (1.5.0)
19
+ hashdiff (1.2.1)
12
20
  json (2.6.3)
13
21
  method_source (1.0.0)
14
22
  parallel (1.22.1)
@@ -17,6 +25,8 @@ GEM
17
25
  pry (0.14.2)
18
26
  coderay (~> 1.1)
19
27
  method_source (~> 1.0)
28
+ public_suffix (7.0.5)
29
+ racc (1.8.1)
20
30
  rainbow (3.1.1)
21
31
  rake (13.0.6)
22
32
  regexp_parser (2.7.0)
@@ -48,17 +58,24 @@ GEM
48
58
  parser (>= 3.1.1.0)
49
59
  ruby-progressbar (1.11.0)
50
60
  unicode-display_width (2.4.2)
61
+ webmock (3.34.0)
62
+ addressable (>= 2.8.0)
63
+ crack (>= 0.3.2)
64
+ hashdiff (>= 0.4.0, < 2.0.0)
51
65
 
52
66
  PLATFORMS
53
67
  arm64-darwin-23
54
68
  x86_64-linux
55
69
 
56
70
  DEPENDENCIES
71
+ base64
57
72
  pry
73
+ racc (~> 1.8)
58
74
  rake (~> 13.0)
59
75
  rspec (~> 3.0)
60
76
  rubocop
61
77
  uk-hs_code!
78
+ webmock (~> 3.0)
62
79
 
63
80
  BUNDLED WITH
64
81
  2.4.5
data/README.md CHANGED
@@ -18,28 +18,26 @@ And:
18
18
  ## Usage
19
19
 
20
20
  ```ruby
21
- # Get all HS codes matching 'table' reference
21
+ # Search HS codes matching free-text commodity description
22
+ commodities = Uk::HsCode.search('cotton t-shirt')
22
23
 
23
- > refs = Uk::HsCode.search('table')
24
+ commodities.first.code
25
+ # => "6109100010"
24
26
 
25
- > refs.inspect
27
+ commodities.first.title
28
+ # => "T-shirts"
26
29
 
27
- # => [#<Uk::HsCode::Record id="6133", type="search_reference", attributes=#<Uk::HsCode::Record title="table, billiard and bagatelle", referenced_id="9504", referenced_class="Heading", goods_nomenclature_item_id="9504000000", productline_suffix="80", goods_nomenclature_sid=54540>>,
28
- #<Uk::HsCode::Record id="11204", type="search_reference", attributes=#<Uk::HsCode::Record title="table cloths, knitted or crocheted", referenced_id="6302", referenced_class="Heading", goods_nomenclature_item_id="6302000000", productline_suffix="80", goods_nomenclature_sid=43645>>,
29
- #<Uk::HsCode::Record id="11205", type="search_reference", attributes=#<Uk::HsCode::Record title="tablecloths, knitted or crocheted", referenced_id="6302", referenced_class="Heading", goods_nomenclature_item_id="6302000000", productline_suffix="80", goods_nomenclature_sid=43645>>,
30
- #<Uk::HsCode::Record id="7289", type="search_reference", attributes=#<Uk::HsCode::Record title="tablecloths, of paper", referenced_id="4818300000-80", referenced_class="Commodity", goods_nomenclature_item_id="4818300000", productline_suffix="80", goods_nomenclature_sid=40686>>,
31
- #<Uk::HsCode::Record id="11206", type="search_reference", attributes=#<Uk::HsCode::Record title="table cloths, other than knitted or crocheted", referenced_id="6302510000-10", referenced_class="Subheading", goods_nomenclature_item_id="6302510000", productline_suffix="10", goods_nomenclature_sid=43679>>
30
+ commodities.first.declarable
31
+ # => true
32
32
 
33
- # Get only HS codes with their titles matching 'carpet' reference
33
+ # Get only HS codes with their titles
34
+ records = Uk::HsCode.search_hs_codes('carpet')
34
35
 
35
- > refs = Uk::HsCode.search_hs_codes('carpet')
36
-
37
- > refs.inspect
38
-
39
- # => [#<Uk::HsCode::Record code="8451808000", title="carpet cleaning machines liquid injection">,
40
- #<Uk::HsCode::Record code="4008000000", title="carpet underlay, rubber">,
41
- #<Uk::HsCode::Record code="5402000000", title="carpet yarn, of man-made filaments">]
36
+ records.first.code
37
+ # => "8451808000"
42
38
 
39
+ records.first.title
40
+ # => "carpet cleaning machines liquid injection"
43
41
  ```
44
42
 
45
43
  ## Development
@@ -3,7 +3,6 @@
3
3
  require "net/http"
4
4
  require "uri"
5
5
  require "json"
6
- # require "record"
7
6
 
8
7
  module Uk
9
8
  module HsCode
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+ require "uri"
5
+ require "json"
6
+
7
+ module Uk
8
+ module HsCode
9
+ class Client
10
+ BASE_URL = "https://www.trade-tariff.service.gov.uk/api/v2"
11
+
12
+ def initialize(base_url: BASE_URL)
13
+ @base_url = base_url
14
+ end
15
+
16
+ def get(path, params = {})
17
+ uri = build_uri(path, params)
18
+ request = Net::HTTP::Get.new(uri)
19
+ request["User-Agent"] = "UK HS Code gem/#{Uk::HsCode::VERSION}"
20
+ request["Accept"] = "application/json"
21
+
22
+ http = Net::HTTP.new(uri.host, uri.port)
23
+ http.use_ssl = true if uri.scheme == "https"
24
+
25
+ response = http.request(request)
26
+ handle_response(response)
27
+ end
28
+
29
+ private
30
+
31
+ def build_uri(path, params)
32
+ full_url = "#{@base_url}#{path}"
33
+ uri = URI.parse(full_url)
34
+ if params && !params.empty?
35
+ query_str = URI.encode_www_form(params)
36
+ uri.query = uri.query ? "#{uri.query}&#{query_str}" : query_str
37
+ end
38
+ uri
39
+ end
40
+
41
+ def handle_response(response)
42
+ raise Uk::HsCode::Error, "Request failed with status: #{response.code} - #{response.message}" unless response.is_a?(Net::HTTPSuccess)
43
+
44
+ JSON.parse(response.body)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Uk
4
+ module HsCode
5
+ module Parsers
6
+ class SearchResponseParser
7
+ def self.call(response_hash)
8
+ new(response_hash).call
9
+ end
10
+
11
+ def initialize(response_hash)
12
+ @response_hash = response_hash || {}
13
+ end
14
+
15
+ def call
16
+ data = @response_hash["data"] || @response_hash[:data]
17
+ return [] unless data
18
+
19
+ type = data["type"] || data[:type]
20
+ attributes = data["attributes"] || data[:attributes] || {}
21
+
22
+ case type
23
+ when "exact_search"
24
+ parse_exact_search(attributes)
25
+ when "fuzzy_search"
26
+ parse_fuzzy_search(attributes)
27
+ else
28
+ []
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def parse_exact_search(attributes)
35
+ entry = attributes["entry"] || attributes[:entry] || {}
36
+ code = entry["id"] || entry[:id]
37
+ return [] unless code
38
+
39
+ [
40
+ Record.new(
41
+ code: code,
42
+ title: "Exact match for #{code}",
43
+ declarable: true,
44
+ type: "exact"
45
+ )
46
+ ]
47
+ end
48
+
49
+ def parse_fuzzy_search(attributes)
50
+ records = []
51
+ seen_codes = {}
52
+
53
+ extract_commodities(attributes, records, seen_codes)
54
+ extract_references(attributes, records, seen_codes)
55
+
56
+ records
57
+ end
58
+
59
+ def extract_commodities(attributes, records, seen_codes)
60
+ gn_commodities = attributes.dig("goods_nomenclature_match", "commodities") || []
61
+ gn_commodities.each do |hit|
62
+ source = hit["_source"] || {}
63
+ code = source["goods_nomenclature_item_id"]
64
+ next if code.nil? || seen_codes[code]
65
+
66
+ seen_codes[code] = true
67
+ records << Record.new(
68
+ code: code,
69
+ title: source["description"],
70
+ description: source["description"],
71
+ score: hit["_score"],
72
+ declarable: source["declarable"],
73
+ type: "commodity"
74
+ )
75
+ end
76
+ end
77
+
78
+ def extract_references(attributes, records, seen_codes)
79
+ ref_commodities = attributes.dig("reference_match", "commodities") || []
80
+ ref_commodities.each do |hit|
81
+ source = hit["_source"] || {}
82
+ ref_data = source["reference"] || {}
83
+ code = ref_data["goods_nomenclature_item_id"]
84
+ next if code.nil? || seen_codes[code]
85
+
86
+ seen_codes[code] = true
87
+ records << Record.new(
88
+ code: code,
89
+ title: source["title"],
90
+ description: ref_data["description"] || source["title"],
91
+ score: hit["_score"],
92
+ declarable: ref_data["declarable"],
93
+ type: "reference"
94
+ )
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -2,6 +2,79 @@
2
2
 
3
3
  module Uk
4
4
  module HsCode
5
- class Record < OpenStruct; end
5
+ class Record
6
+ attr_reader :score, :declarable, :type
7
+
8
+ def initialize(code: nil, title: nil, description: nil, score: nil, declarable: nil, type: nil, **extra)
9
+ @extra = extra || {}
10
+ @code = code || @extra[:goods_nomenclature_item_id] || @extra["goods_nomenclature_item_id"]
11
+ @title = title || description || @extra[:negated_title] || @extra["negated_title"]
12
+ @description = description || title
13
+ @score = score
14
+ @declarable = declarable
15
+ @type = type
16
+ end
17
+
18
+ def code
19
+ @code || self["code"] || self["goods_nomenclature_item_id"]
20
+ end
21
+
22
+ def title
23
+ @title || self["title"] || self["description"]
24
+ end
25
+
26
+ def description
27
+ @description || self["description"] || self["title"]
28
+ end
29
+
30
+ def goods_nomenclature_item_id
31
+ code
32
+ end
33
+
34
+ def attributes
35
+ self["attributes"] || self
36
+ end
37
+
38
+ def [](key)
39
+ instance_variable_get("@#{key}") || @extra[key.to_s] || @extra[key.to_sym]
40
+ end
41
+
42
+ def []=(key, val)
43
+ instance_variable_set("@#{key}", val)
44
+ @extra[key.to_s] = val
45
+ @extra[key.to_sym] = val
46
+ end
47
+
48
+ def method_missing(method_name, *args, &block)
49
+ str_key = method_name.to_s
50
+ if str_key.end_with?("=")
51
+ self[str_key.chop] = args.first
52
+ elsif @extra.key?(str_key) || @extra.key?(method_name)
53
+ self[method_name]
54
+ else
55
+ super
56
+ end
57
+ end
58
+
59
+ def respond_to_missing?(method_name, include_private = false)
60
+ str_key = method_name.to_s.chomp("=")
61
+ @extra.key?(str_key) || @extra.key?(str_key.to_sym) || super
62
+ end
63
+
64
+ def to_h
65
+ {
66
+ code: code,
67
+ title: title,
68
+ description: description,
69
+ score: score,
70
+ declarable: declarable,
71
+ type: type
72
+ }
73
+ end
74
+
75
+ def ==(other)
76
+ other.is_a?(Record) && code == other.code && title == other.title
77
+ end
78
+ end
6
79
  end
7
80
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Uk
4
+ module HsCode
5
+ module Services
6
+ class SearchService
7
+ def self.call(...)
8
+ new(...).call
9
+ end
10
+
11
+ def initialize(params = {}, client: Client.new, **keyword_params)
12
+ merged_params = keyword_params.empty? ? params : keyword_params
13
+ @params = merged_params.is_a?(Hash) ? merged_params : { query: merged_params }
14
+ @client = client
15
+ end
16
+
17
+ def call
18
+ validate_prerequisites!
19
+ execute_workflow
20
+ end
21
+
22
+ private
23
+
24
+ def validate_prerequisites!
25
+ raise ArgumentError, "Missing required query" if query.empty?
26
+ end
27
+
28
+ def execute_workflow
29
+ raw_response = @client.get("/search", { q: query })
30
+ Parsers::SearchResponseParser.call(raw_response)
31
+ end
32
+
33
+ def query
34
+ (@params[:query] || @params["query"] || @params[:q] || @params["q"]).to_s.strip
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Uk
4
4
  module HsCode
5
- VERSION = "0.1.3"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
data/lib/uk/hs_code.rb CHANGED
@@ -1,29 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "hs_code/version"
4
- require_relative "hs_code/api_request"
5
4
  require_relative "hs_code/record"
5
+ require_relative "hs_code/client"
6
+ require_relative "hs_code/parsers/search_response_parser"
7
+ require_relative "hs_code/services/search_service"
8
+ require_relative "hs_code/api_request"
6
9
 
7
10
  module Uk
8
11
  module HsCode
9
- API_ENDPOINT = "https://www.trade-tariff.service.gov.uk/api"
12
+ API_ENDPOINT = "https://www.trade-tariff.service.gov.uk/api/v2"
10
13
 
11
14
  class Error < StandardError; end
12
15
 
13
16
  class << self
14
17
  def search(query)
15
- search_references(query)
18
+ Services::SearchService.call(query: query)
16
19
  end
17
20
 
18
21
  def search_hs_codes(query)
19
- result = search_references(query)
20
- result.map { |a| Record.new(code: a.attributes.goods_nomenclature_item_id, title: a.attributes.title) }
22
+ search(query)
21
23
  end
22
24
 
23
- private
24
-
25
25
  def search_references(query)
26
- ApiRequest.new("#{API_ENDPOINT}/v2/search_references.json", { query: { letter: query } }).get
26
+ ApiRequest.new("#{API_ENDPOINT}/search_references.json", { query: { letter: query } }).get
27
27
  end
28
28
  end
29
29
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/uk/hs_code/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "uk-hs_code"
7
+ spec.version = Uk::HsCode::VERSION
8
+ spec.authors = ["Mateusz Michalski"]
9
+ spec.email = ["enigmatt.priv@gmail.com"]
10
+
11
+ spec.summary = "Enables communication with Trade Tariff Public API V2."
12
+ spec.description = "Trade Tariff Public API V2 communicator."
13
+ spec.homepage = "https://github.com/enigmatt-pl/uk-hs_code.git"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = ">= 3.0.0"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = spec.homepage
19
+ spec.metadata["changelog_uri"] = spec.homepage
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(__dir__) do
24
+ `git ls-files -z`.split("\x0").reject do |f|
25
+ (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|circleci)|appveyor)})
26
+ end
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_development_dependency "base64"
33
+ spec.add_development_dependency "pry"
34
+ spec.add_development_dependency "racc", "~> 1.8"
35
+ spec.add_development_dependency "rake", "~> 13.0"
36
+ spec.add_development_dependency "rspec", "~> 3.0"
37
+ spec.add_development_dependency "rubocop"
38
+ spec.add_development_dependency "webmock", "~> 3.0"
39
+ end
metadata CHANGED
@@ -1,17 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uk-hs_code
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mateusz Michalski
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2025-05-23 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: pry
13
+ name: base64
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ">="
@@ -25,7 +24,7 @@ dependencies:
25
24
  - !ruby/object:Gem::Version
26
25
  version: '0'
27
26
  - !ruby/object:Gem::Dependency
28
- name: rubocop
27
+ name: pry
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - ">="
@@ -38,6 +37,20 @@ dependencies:
38
37
  - - ">="
39
38
  - !ruby/object:Gem::Version
40
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: racc
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.8'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.8'
41
54
  - !ruby/object:Gem::Dependency
42
55
  name: rake
43
56
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +79,34 @@ dependencies:
66
79
  - - "~>"
67
80
  - !ruby/object:Gem::Version
68
81
  version: '3.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rubocop
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: webmock
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '3.0'
69
110
  description: Trade Tariff Public API V2 communicator.
70
111
  email:
71
112
  - enigmatt.priv@gmail.com
@@ -83,9 +124,13 @@ files:
83
124
  - Rakefile
84
125
  - lib/uk/hs_code.rb
85
126
  - lib/uk/hs_code/api_request.rb
127
+ - lib/uk/hs_code/client.rb
128
+ - lib/uk/hs_code/parsers/search_response_parser.rb
86
129
  - lib/uk/hs_code/record.rb
130
+ - lib/uk/hs_code/services/search_service.rb
87
131
  - lib/uk/hs_code/version.rb
88
132
  - sig/uk/hs_code.rbs
133
+ - uk-hs_code.gemspec
89
134
  homepage: https://github.com/enigmatt-pl/uk-hs_code.git
90
135
  licenses:
91
136
  - MIT
@@ -93,7 +138,6 @@ metadata:
93
138
  homepage_uri: https://github.com/enigmatt-pl/uk-hs_code.git
94
139
  source_code_uri: https://github.com/enigmatt-pl/uk-hs_code.git
95
140
  changelog_uri: https://github.com/enigmatt-pl/uk-hs_code.git
96
- post_install_message:
97
141
  rdoc_options: []
98
142
  require_paths:
99
143
  - lib
@@ -101,15 +145,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
145
  requirements:
102
146
  - - ">="
103
147
  - !ruby/object:Gem::Version
104
- version: 2.6.0
148
+ version: 3.0.0
105
149
  required_rubygems_version: !ruby/object:Gem::Requirement
106
150
  requirements:
107
151
  - - ">="
108
152
  - !ruby/object:Gem::Version
109
153
  version: '0'
110
154
  requirements: []
111
- rubygems_version: 3.0.3.1
112
- signing_key:
155
+ rubygems_version: 3.6.7
113
156
  specification_version: 4
114
157
  summary: Enables communication with Trade Tariff Public API V2.
115
158
  test_files: []