atlas_engine 0.2.0 → 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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -4
  3. data/app/countries/atlas_engine/cz/country_profile.yml +3 -0
  4. data/app/countries/atlas_engine/es/country_profile.yml +3 -0
  5. data/app/countries/atlas_engine/es/synonyms.yml +2 -0
  6. data/app/countries/atlas_engine/es/validation_transcriber/address_parser.rb +28 -0
  7. data/app/countries/atlas_engine/fo/address_importer/corrections/open_address/city_corrector.rb +27 -0
  8. data/app/countries/atlas_engine/fo/country_profile.yml +4 -0
  9. data/app/countries/atlas_engine/fr/country_profile.yml +2 -0
  10. data/app/countries/atlas_engine/it/address_validation/validators/full_address/exclusions/city.rb +31 -0
  11. data/app/countries/atlas_engine/it/country_profile.yml +4 -0
  12. data/app/countries/atlas_engine/kr/address_validation/validators/full_address/exclusions/city.rb +69 -0
  13. data/app/countries/atlas_engine/kr/country_profile.yml +7 -0
  14. data/app/countries/atlas_engine/kr/validation_transcriber/address_parser.rb +36 -0
  15. data/app/countries/atlas_engine/lu/address_importer/corrections/open_address/city_corrector.rb +45 -0
  16. data/app/countries/atlas_engine/lu/country_profile.yml +4 -1
  17. data/app/countries/atlas_engine/lu/validation_transcriber/address_parser.rb +23 -0
  18. data/app/countries/atlas_engine/pl/address_importer/corrections/open_address/city_corrector.rb +25 -0
  19. data/app/countries/atlas_engine/pl/address_importer/corrections/open_address/empty_street_corrector.rb +32 -0
  20. data/app/countries/atlas_engine/pl/address_validation/exclusions/placeholder_postal_code.rb +35 -0
  21. data/app/countries/atlas_engine/pl/address_validation/exclusions/rural_address.rb +42 -0
  22. data/app/countries/atlas_engine/pl/country_profile.yml +13 -0
  23. data/app/countries/atlas_engine/pl/synonyms.yml +13 -0
  24. data/app/countries/atlas_engine/pl/validation_transcriber/address_parser.rb +36 -1
  25. data/app/countries/atlas_engine/pt/address_validation/validators/full_address/exclusions/zip.rb +38 -0
  26. data/app/countries/atlas_engine/pt/country_profile.yml +4 -0
  27. data/app/countries/atlas_engine/pt/synonyms.yml +12 -0
  28. data/app/countries/atlas_engine/pt/validation_transcriber/address_parser.rb +75 -0
  29. data/app/countries/atlas_engine/si/address_importer/open_address/corrections/city_district_corrector.rb +25 -0
  30. data/app/countries/atlas_engine/si/address_importer/open_address/mapper.rb +19 -0
  31. data/app/countries/atlas_engine/si/address_validation/exclusions/unknown_city.rb +33 -0
  32. data/app/countries/atlas_engine/si/country_profile.yml +17 -0
  33. data/app/countries/atlas_engine/si/synonyms.yml +7 -0
  34. data/app/countries/atlas_engine/si/validation_transcriber/address_parser.rb +52 -0
  35. data/app/graphql/atlas_engine/schema.graphql +1 -1
  36. data/app/lib/atlas_engine/validation_transcriber/address_parser_base.rb +1 -1
  37. data/app/models/atlas_engine/address_validation/concern_record.rb +6 -1
  38. data/app/models/atlas_engine/address_validation/es/query_builder.rb +6 -1
  39. data/app/models/atlas_engine/address_validation/statsd_emitter.rb +6 -2
  40. data/app/models/atlas_engine/address_validation/token/sequence/comparator.rb +38 -4
  41. data/app/models/atlas_engine/address_validation/token/sequence/comparison.rb +4 -4
  42. data/app/models/atlas_engine/address_validation/token/sequence/comparison_policy.rb +33 -0
  43. data/app/models/atlas_engine/address_validation/validators/full_address/address_comparison.rb +41 -15
  44. data/app/models/atlas_engine/address_validation/validators/full_address/building_comparison.rb +33 -0
  45. data/app/models/atlas_engine/address_validation/validators/full_address/candidate_result.rb +3 -3
  46. data/app/models/atlas_engine/address_validation/validators/full_address/city_comparison.rb +25 -0
  47. data/app/models/atlas_engine/address_validation/validators/full_address/concern_builder.rb +15 -6
  48. data/app/models/atlas_engine/address_validation/validators/full_address/exclusions/exclusion_base.rb +8 -2
  49. data/app/models/atlas_engine/address_validation/validators/full_address/field_comparison_base.rb +77 -0
  50. data/app/models/atlas_engine/address_validation/validators/full_address/province_code_comparison.rb +34 -0
  51. data/app/models/atlas_engine/address_validation/validators/full_address/relevant_components.rb +34 -12
  52. data/app/models/atlas_engine/address_validation/validators/full_address/street_comparison.rb +30 -0
  53. data/app/models/atlas_engine/address_validation/validators/full_address/suggestion_builder.rb +1 -1
  54. data/app/models/atlas_engine/address_validation/validators/full_address/zip_comparison.rb +37 -0
  55. data/app/models/atlas_engine/address_validation/validators/predicates/street/building_number_in_address1_or_address2.rb +2 -2
  56. data/app/models/atlas_engine/country_profile_validation_subset.rb +35 -2
  57. data/db/data/country_profiles/default.yml +12 -0
  58. data/lib/atlas_engine/version.rb +1 -1
  59. data/lib/tasks/atlas_engine/graphql.rake +13 -0
  60. metadata +35 -6
  61. data/app/models/atlas_engine/address_validation/validators/full_address/comparison_helper.rb +0 -135
@@ -10,8 +10,6 @@ module AtlasEngine
10
10
 
11
11
  attr_reader :unmatched_component, :unmatched_field, :matched_components, :address, :suggestion_ids
12
12
 
13
- UNMATCHED_COMPONENTS_SUGGESTION_THRESHOLD = 2
14
-
15
13
  class << self
16
14
  extend T::Sig
17
15
 
@@ -22,16 +20,21 @@ module AtlasEngine
22
20
  ).returns(T::Boolean)
23
21
  end
24
22
  def should_suggest?(address, unmatched_component_keys)
25
- return false if too_many_unmatched_components?(unmatched_component_keys)
23
+ return false if too_many_unmatched_components?(address, unmatched_component_keys)
26
24
 
27
25
  return false if province_and_city_xor_zip?(unmatched_component_keys) && !valid_zip_for_province?(address)
28
26
 
29
27
  true
30
28
  end
31
29
 
32
- sig { params(unmatched_component_keys: T::Array[Symbol]).returns(T::Boolean) }
33
- def too_many_unmatched_components?(unmatched_component_keys)
34
- unmatched_component_keys.size > UNMATCHED_COMPONENTS_SUGGESTION_THRESHOLD
30
+ sig do
31
+ params(
32
+ address: AbstractAddress,
33
+ unmatched_component_keys: T::Array[Symbol],
34
+ ).returns(T::Boolean)
35
+ end
36
+ def too_many_unmatched_components?(address, unmatched_component_keys)
37
+ unmatched_component_keys.size > unmatched_components_suggestion_threshold(address)
35
38
  end
36
39
 
37
40
  sig { params(address: AbstractAddress).returns(T::Boolean) }
@@ -62,6 +65,12 @@ module AtlasEngine
62
65
 
63
66
  province.valid_zip?(address.zip)
64
67
  end
68
+
69
+ sig { params(address: AbstractAddress).returns(Integer) }
70
+ def unmatched_components_suggestion_threshold(address)
71
+ country_profile = CountryProfile.for(T.must(address.country_code))
72
+ country_profile.validation.unmatched_components_suggestion_threshold
73
+ end
65
74
  end
66
75
 
67
76
  sig do
@@ -12,8 +12,14 @@ module AtlasEngine
12
12
  extend T::Helpers
13
13
  abstract!
14
14
 
15
- sig { abstract.params(session: Session, candidate: Candidate).returns(T::Boolean) }
16
- def apply?(session, candidate); end
15
+ sig do
16
+ abstract.params(
17
+ session: Session,
18
+ candidate: Candidate,
19
+ address_comparison: AddressComparison,
20
+ ).returns(T::Boolean)
21
+ end
22
+ def apply?(session, candidate, address_comparison); end
17
23
  end
18
24
  end
19
25
  end
@@ -0,0 +1,77 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module AtlasEngine
5
+ module AddressValidation
6
+ module Validators
7
+ module FullAddress
8
+ class FieldComparisonBase
9
+ extend T::Sig
10
+ extend T::Helpers
11
+
12
+ abstract!
13
+
14
+ SUPPORTED_FIELDS = Set.new([:street, :city, :zip, :province_code, :building])
15
+
16
+ sig { params(address: AbstractAddress, candidate: Candidate, datastore: DatastoreBase).void }
17
+ def initialize(address:, candidate:, datastore:)
18
+ @address = address
19
+ @datastore = datastore
20
+ @candidate = candidate
21
+ end
22
+
23
+ sig { abstract.returns(T.any(T.nilable(Token::Sequence::Comparison), T.nilable(NumberComparison))) }
24
+ def sequence_comparison; end
25
+
26
+ sig { returns(T::Boolean) }
27
+ def match?
28
+ return false if sequence_comparison.nil?
29
+
30
+ T.must(sequence_comparison).match?
31
+ end
32
+
33
+ private
34
+
35
+ sig { returns(AbstractAddress) }
36
+ attr_reader :address
37
+
38
+ sig { returns(DatastoreBase) }
39
+ attr_reader :datastore
40
+
41
+ sig { returns(Candidate) }
42
+ attr_reader :candidate
43
+
44
+ sig do
45
+ params(
46
+ sequence: Token::Sequence,
47
+ component_sequences: T::Array[Token::Sequence],
48
+ comparison_policy: Token::Sequence::ComparisonPolicy,
49
+ ).returns(T.nilable(Token::Sequence::Comparison))
50
+ end
51
+ def best_comparison(
52
+ sequence,
53
+ component_sequences,
54
+ comparison_policy = Token::Sequence::ComparisonPolicy::DEFAULT_POLICY
55
+ )
56
+ component_sequences.map do |component_sequence|
57
+ Token::Sequence::Comparator.new(
58
+ left_sequence: sequence,
59
+ right_sequence: component_sequence,
60
+ comparison_policy:,
61
+ ).compare
62
+ end.min_by.with_index do |comparison, index|
63
+ # ruby's `min` and `sort` methods are not stable
64
+ # so we need to prefer the leftmost comparison when two comparisons are equivalent
65
+ [comparison, index]
66
+ end
67
+ end
68
+
69
+ sig { params(field: Symbol).returns(Token::Sequence::ComparisonPolicy) }
70
+ def field_policy(field)
71
+ datastore.country_profile.validation.comparison_policy(field)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,34 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module AtlasEngine
5
+ module AddressValidation
6
+ module Validators
7
+ module FullAddress
8
+ class ProvinceCodeComparison < FieldComparisonBase
9
+ extend T::Sig
10
+
11
+ sig { override.returns(T.nilable(Token::Sequence::Comparison)) }
12
+ def sequence_comparison
13
+ return @province_code_comparison if defined?(@province_code_comparison)
14
+
15
+ normalized_session_province_code = ValidationTranscriber::ProvinceCodeNormalizer.normalize(
16
+ country_code: address.country_code,
17
+ province_code: address.province_code,
18
+ )
19
+ normalized_candidate_province_code = ValidationTranscriber::ProvinceCodeNormalizer.normalize(
20
+ country_code: T.must(candidate.component(:country_code)).value,
21
+ province_code: T.must(candidate.component(:province_code)).value,
22
+ )
23
+
24
+ @province_code_comparison = best_comparison(
25
+ Token::Sequence.from_string(normalized_session_province_code),
26
+ [Token::Sequence.from_string(normalized_candidate_province_code)],
27
+ field_policy(:province_code),
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -8,7 +8,14 @@ module AtlasEngine
8
8
  class RelevantComponents
9
9
  extend T::Sig
10
10
 
11
- attr_reader :session, :candidate, :street_comparison
11
+ sig { returns(Session) }
12
+ attr_reader :session
13
+
14
+ sig { returns(Candidate) }
15
+ attr_reader :candidate
16
+
17
+ sig { returns(AddressComparison) }
18
+ attr_reader :address_comparison
12
19
 
13
20
  ALL_SUPPORTED_COMPONENTS = [
14
21
  :province_code,
@@ -21,18 +28,19 @@ module AtlasEngine
21
28
  params(
22
29
  session: Session,
23
30
  candidate: Candidate,
24
- street_comparison: T.nilable(AtlasEngine::AddressValidation::Token::Sequence::Comparison),
31
+ address_comparison: AddressComparison,
25
32
  ).void
26
33
  end
27
- def initialize(session, candidate, street_comparison)
34
+ def initialize(session, candidate, address_comparison)
28
35
  @session = session
29
36
  @candidate = candidate
30
- @street_comparison = street_comparison
37
+ @address_comparison = address_comparison
31
38
  end
32
39
 
33
40
  sig { returns(T::Array[Symbol]) }
34
41
  def components_to_validate
35
42
  supported_components = ALL_SUPPORTED_COMPONENTS.dup - unsupported_components_for_country
43
+ apply_exclusions(supported_components)
36
44
  supported_components.delete(:street) if exclude_street_validation?
37
45
  supported_components
38
46
  end
@@ -44,6 +52,18 @@ module AtlasEngine
44
52
 
45
53
  private
46
54
 
55
+ sig { params(supported_components: T::Array[Symbol]).void }
56
+ def apply_exclusions(supported_components)
57
+ supported_components.delete_if do |component|
58
+ exclusions(component).any? do |exclusion|
59
+ if exclusion.apply?(session, candidate, address_comparison)
60
+ emit_excluded_validation(component, "excluded")
61
+ true
62
+ end
63
+ end
64
+ end
65
+ end
66
+
47
67
  sig { returns(T::Boolean) }
48
68
  def exclude_street_validation?
49
69
  return @exclude_street_validation if defined?(@exclude_street_validation)
@@ -51,23 +71,25 @@ module AtlasEngine
51
71
  @exclude_street_validation = if session.matching_strategy !=
52
72
  AddressValidation::MatchingStrategies::EsStreet
53
73
  true
54
- elsif street_comparison.blank?
55
- emit_excluded_validation("street", "not_found")
56
- true
57
- elsif exclusions("street").any? { |exclusion| exclusion.apply?(session, candidate) }
58
- emit_excluded_validation("street", "excluded")
74
+ elsif address_comparison.street_comparison.sequence_comparison.blank?
75
+ emit_excluded_validation(:street, "not_found")
59
76
  true
60
77
  else
61
78
  false
62
79
  end
63
80
  end
64
81
 
65
- sig { params(component: String).returns(T::Array[T.class_of(Exclusions::ExclusionBase)]) }
82
+ sig { params(component: Symbol).returns(T::Array[T.class_of(Exclusions::ExclusionBase)]) }
66
83
  def exclusions(component)
67
- CountryProfile.for(session.country_code).validation.validation_exclusions(component: component)
84
+ country_profile.validation.validation_exclusions(component: component)
85
+ end
86
+
87
+ sig { returns(CountryProfile) }
88
+ def country_profile
89
+ @country_profile ||= CountryProfile.for(session.country_code)
68
90
  end
69
91
 
70
- sig { params(component: String, reason: String).void }
92
+ sig { params(component: Symbol, reason: String).void }
71
93
  def emit_excluded_validation(component, reason)
72
94
  tags = [
73
95
  "reason:#{reason}",
@@ -0,0 +1,30 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module AtlasEngine
5
+ module AddressValidation
6
+ module Validators
7
+ module FullAddress
8
+ class StreetComparison < FieldComparisonBase
9
+ extend T::Sig
10
+
11
+ sig { override.returns(T.nilable(Token::Sequence::Comparison)) }
12
+ def sequence_comparison
13
+ return @street_comparison if defined?(@street_comparison)
14
+
15
+ street_sequences = datastore.fetch_street_sequences
16
+ candidate_sequences = T.must(candidate.component(:street)).sequences
17
+
18
+ @street_comparison = street_sequences.map do |street_sequence|
19
+ best_comparison(
20
+ street_sequence,
21
+ candidate_sequences,
22
+ field_policy(:street),
23
+ )
24
+ end.min
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -126,7 +126,7 @@ module AtlasEngine
126
126
  ).returns(String)
127
127
  end
128
128
  def generic_field_suggestion(comparison, candidate, field)
129
- if comparison.token_match_count == 0 || comparison.aggregate_edit_distance > 2
129
+ if comparison.token_match_count == 0 || comparison.aggregate_distance > 2
130
130
  candidate.component(field)&.first_value
131
131
  else
132
132
  comparison.right_sequence.raw_value
@@ -0,0 +1,37 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module AtlasEngine
5
+ module AddressValidation
6
+ module Validators
7
+ module FullAddress
8
+ class ZipComparison < FieldComparisonBase
9
+ extend T::Sig
10
+
11
+ sig { override.returns(T.nilable(Token::Sequence::Comparison)) }
12
+ def sequence_comparison
13
+ return @zip_comparison if defined?(@zip_comparison)
14
+
15
+ candidate.component(:zip)&.value = PostalCodeMatcher.new(
16
+ T.must(address.country_code),
17
+ T.must(address.zip),
18
+ candidate.component(:zip)&.value,
19
+ ).truncate
20
+
21
+ normalized_zip = ValidationTranscriber::ZipNormalizer.normalize(
22
+ country_code: address.country_code, zip: address.zip,
23
+ )
24
+
25
+ zip_sequence = Token::Sequence.from_string(normalized_zip)
26
+
27
+ @zip_comparison = best_comparison(
28
+ zip_sequence,
29
+ T.must(candidate.component(:zip)).sequences,
30
+ field_policy(:zip),
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -12,7 +12,7 @@ module AtlasEngine
12
12
  return unless @cache.country.country?
13
13
  return unless @cache.country.building_number_required
14
14
  return unless @cache.country.building_number_may_be_in_address2
15
- return if contains_number?(T.must(@address.address1)) || contains_number?(T.must(@address.address2))
15
+ return if contains_number?(T.must(@address.address1)) || contains_number?(@address.address2)
16
16
 
17
17
  build_concern
18
18
  end
@@ -31,7 +31,7 @@ module AtlasEngine
31
31
  )
32
32
  end
33
33
 
34
- sig { params(text: String).returns(T::Boolean) }
34
+ sig { params(text: T.nilable(String)).returns(T::Boolean) }
35
35
  def contains_number?(text)
36
36
  /[0-9\u0660-\u0669\u06f0-\u06f9\u0966-\u096f\uff10-\uff19]/.match?(text)
37
37
  end
@@ -24,11 +24,11 @@ module AtlasEngine
24
24
  end
25
25
 
26
26
  sig do
27
- params(component: String)
27
+ params(component: Symbol)
28
28
  .returns(T::Array[T.class_of(AddressValidation::Validators::FullAddress::Exclusions::ExclusionBase)])
29
29
  end
30
30
  def validation_exclusions(component:)
31
- validation_exclusions = attributes.dig("exclusions", component) || []
31
+ validation_exclusions = attributes.dig("exclusions", component.to_s) || []
32
32
  validation_exclusions.map(&:constantize)
33
33
  end
34
34
 
@@ -49,5 +49,38 @@ module AtlasEngine
49
49
  def normalized_components
50
50
  attributes.dig("normalized_components") || []
51
51
  end
52
+
53
+ sig { params(field: Symbol).returns(AddressValidation::Token::Sequence::ComparisonPolicy) }
54
+ def comparison_policy(field)
55
+ field_policy = attributes.dig(
56
+ "comparison_policies",
57
+ field.to_s,
58
+ )&.deep_symbolize_keys&.deep_transform_values!(&:to_sym)
59
+
60
+ if field_policy.present?
61
+ AddressValidation::Token::Sequence::ComparisonPolicy.new(**field_policy)
62
+ else
63
+ AddressValidation::Token::Sequence::ComparisonPolicy::DEFAULT_POLICY
64
+ end
65
+ end
66
+
67
+ sig { returns(Integer) }
68
+ def unmatched_components_suggestion_threshold
69
+ attributes.dig("unmatched_components_suggestion_threshold") || 2
70
+ end
71
+
72
+ sig { params(field: Symbol).returns(T::Class[AddressValidation::Validators::FullAddress::FieldComparisonBase]) }
73
+ def address_comparison(field:)
74
+ unless field.in?(AddressValidation::Validators::FullAddress::FieldComparisonBase::SUPPORTED_FIELDS)
75
+ raise ArgumentError.new, "Field #{field} is not supported"
76
+ end
77
+
78
+ attributes.dig("address_comparison", field.to_s).constantize
79
+ end
80
+
81
+ sig { returns(Integer) }
82
+ def zip_prefix_length
83
+ attributes.dig("zip_prefix_length") || 0
84
+ end
52
85
  end
53
86
  end
@@ -17,5 +17,17 @@ validation:
17
17
  query_builder: AtlasEngine::AddressValidation::Es::DefaultQueryBuilder
18
18
  address_parser: AtlasEngine::ValidationTranscriber::AddressParserBase
19
19
  restrictions: []
20
+ comparison_policies:
21
+ street: {}
22
+ city: {}
23
+ zip: {}
24
+ province_code: {}
25
+ unmatched_components_suggestion_threshold: 2
26
+ address_comparison:
27
+ street: AtlasEngine::AddressValidation::Validators::FullAddress::StreetComparison
28
+ city: AtlasEngine::AddressValidation::Validators::FullAddress::CityComparison
29
+ zip: AtlasEngine::AddressValidation::Validators::FullAddress::ZipComparison
30
+ province_code: AtlasEngine::AddressValidation::Validators::FullAddress::ProvinceCodeComparison
31
+ building: AtlasEngine::AddressValidation::Validators::FullAddress::BuildingComparison
20
32
  decompounding_patterns:
21
33
  street: []
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module AtlasEngine
5
- VERSION = "0.2.0"
5
+ VERSION = "0.3.0"
6
6
  end
@@ -0,0 +1,13 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ T.bind(self, Rake::DSL)
5
+
6
+ namespace :atlas_engine do
7
+ namespace :graphql do
8
+ desc "Dump the GraphQL Schema"
9
+ task schema_dump: :environment do
10
+ AtlasEngine::Schema.dump
11
+ end
12
+ end
13
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atlas_engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-24 00:00:00.000000000 Z
11
+ date: 2024-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: annex_29
@@ -212,14 +212,14 @@ dependencies:
212
212
  requirements:
213
213
  - - ">="
214
214
  - !ruby/object:Gem::Version
215
- version: 0.6.4
215
+ version: 0.6.7
216
216
  type: :runtime
217
217
  prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
220
  - - ">="
221
221
  - !ruby/object:Gem::Version
222
- version: 0.6.4
222
+ version: 0.6.7
223
223
  description: The Atlas Engine is a rails engine that provides a GraphQL API for address
224
224
  validation.
225
225
  email: developers@shopify.com
@@ -278,6 +278,10 @@ files:
278
278
  - app/countries/atlas_engine/dk/country_profile.yml
279
279
  - app/countries/atlas_engine/dk/synonyms.yml
280
280
  - app/countries/atlas_engine/dk/validation_transcriber/address_parser.rb
281
+ - app/countries/atlas_engine/es/country_profile.yml
282
+ - app/countries/atlas_engine/es/synonyms.yml
283
+ - app/countries/atlas_engine/es/validation_transcriber/address_parser.rb
284
+ - app/countries/atlas_engine/fo/address_importer/corrections/open_address/city_corrector.rb
281
285
  - app/countries/atlas_engine/fo/country_profile.yml
282
286
  - app/countries/atlas_engine/fr/address_importer/corrections/open_address/city_corrector.rb
283
287
  - app/countries/atlas_engine/fr/country_profile.yml
@@ -293,11 +297,14 @@ files:
293
297
  - app/countries/atlas_engine/it/address_importer/corrections/open_address/city_corrector.rb
294
298
  - app/countries/atlas_engine/it/address_importer/corrections/open_address/province_corrector.rb
295
299
  - app/countries/atlas_engine/it/address_importer/open_address/mapper.rb
300
+ - app/countries/atlas_engine/it/address_validation/validators/full_address/exclusions/city.rb
296
301
  - app/countries/atlas_engine/it/country_profile.yml
297
302
  - app/countries/atlas_engine/jp/address_validation/es/data_mapper.rb
298
303
  - app/countries/atlas_engine/jp/country_profile.yml
299
304
  - app/countries/atlas_engine/kr/address_importer/open_address/mapper.rb
305
+ - app/countries/atlas_engine/kr/address_validation/validators/full_address/exclusions/city.rb
300
306
  - app/countries/atlas_engine/kr/country_profile.yml
307
+ - app/countries/atlas_engine/kr/validation_transcriber/address_parser.rb
301
308
  - app/countries/atlas_engine/li/address_importer/corrections/open_address/city_corrector.rb
302
309
  - app/countries/atlas_engine/li/country_profile.yml
303
310
  - app/countries/atlas_engine/li/index_configuration.yml
@@ -305,8 +312,10 @@ files:
305
312
  - app/countries/atlas_engine/lt/country_profile.yml
306
313
  - app/countries/atlas_engine/lt/synonyms.yml
307
314
  - app/countries/atlas_engine/lt/validation_transcriber/address_parser.rb
315
+ - app/countries/atlas_engine/lu/address_importer/corrections/open_address/city_corrector.rb
308
316
  - app/countries/atlas_engine/lu/address_importer/corrections/open_address/locale_corrector.rb
309
317
  - app/countries/atlas_engine/lu/country_profile.yml
318
+ - app/countries/atlas_engine/lu/validation_transcriber/address_parser.rb
310
319
  - app/countries/atlas_engine/nl/address_importer/corrections/open_address/city_corrector.rb
311
320
  - app/countries/atlas_engine/nl/country_profile.yml
312
321
  - app/countries/atlas_engine/nl/index_configuration.yml
@@ -314,14 +323,27 @@ files:
314
323
  - app/countries/atlas_engine/nl/validation_transcriber/address_parser.rb
315
324
  - app/countries/atlas_engine/no/country_profile.yml
316
325
  - app/countries/atlas_engine/nz/country_profile.yml
326
+ - app/countries/atlas_engine/pl/address_importer/corrections/open_address/city_corrector.rb
327
+ - app/countries/atlas_engine/pl/address_importer/corrections/open_address/empty_street_corrector.rb
328
+ - app/countries/atlas_engine/pl/address_validation/exclusions/placeholder_postal_code.rb
329
+ - app/countries/atlas_engine/pl/address_validation/exclusions/rural_address.rb
317
330
  - app/countries/atlas_engine/pl/country_profile.yml
331
+ - app/countries/atlas_engine/pl/synonyms.yml
318
332
  - app/countries/atlas_engine/pl/validation_transcriber/address_parser.rb
319
333
  - app/countries/atlas_engine/pt/address_importer/corrections/open_address/city_corrector.rb
320
334
  - app/countries/atlas_engine/pt/address_importer/open_address/mapper.rb
335
+ - app/countries/atlas_engine/pt/address_validation/validators/full_address/exclusions/zip.rb
321
336
  - app/countries/atlas_engine/pt/country_profile.yml
322
337
  - app/countries/atlas_engine/pt/synonyms.yml
338
+ - app/countries/atlas_engine/pt/validation_transcriber/address_parser.rb
323
339
  - app/countries/atlas_engine/sa/country_profile.yml
324
340
  - app/countries/atlas_engine/se/country_profile.yml
341
+ - app/countries/atlas_engine/si/address_importer/open_address/corrections/city_district_corrector.rb
342
+ - app/countries/atlas_engine/si/address_importer/open_address/mapper.rb
343
+ - app/countries/atlas_engine/si/address_validation/exclusions/unknown_city.rb
344
+ - app/countries/atlas_engine/si/country_profile.yml
345
+ - app/countries/atlas_engine/si/synonyms.yml
346
+ - app/countries/atlas_engine/si/validation_transcriber/address_parser.rb
325
347
  - app/countries/atlas_engine/tt/address_importer/open_address/mapper.rb
326
348
  - app/countries/atlas_engine/tt/country_profile.yml
327
349
  - app/countries/atlas_engine/us/country_profile.yml
@@ -437,28 +459,34 @@ files:
437
459
  - app/models/atlas_engine/address_validation/token/sequence.rb
438
460
  - app/models/atlas_engine/address_validation/token/sequence/comparator.rb
439
461
  - app/models/atlas_engine/address_validation/token/sequence/comparison.rb
462
+ - app/models/atlas_engine/address_validation/token/sequence/comparison_policy.rb
440
463
  - app/models/atlas_engine/address_validation/token/synonyms.rb
441
464
  - app/models/atlas_engine/address_validation/validator.rb
442
465
  - app/models/atlas_engine/address_validation/validators/full_address/address_comparison.rb
466
+ - app/models/atlas_engine/address_validation/validators/full_address/building_comparison.rb
443
467
  - app/models/atlas_engine/address_validation/validators/full_address/candidate_result.rb
444
468
  - app/models/atlas_engine/address_validation/validators/full_address/candidate_result_base.rb
445
- - app/models/atlas_engine/address_validation/validators/full_address/comparison_helper.rb
469
+ - app/models/atlas_engine/address_validation/validators/full_address/city_comparison.rb
446
470
  - app/models/atlas_engine/address_validation/validators/full_address/concern_builder.rb
447
471
  - app/models/atlas_engine/address_validation/validators/full_address/exclusions/exclusion_base.rb
472
+ - app/models/atlas_engine/address_validation/validators/full_address/field_comparison_base.rb
448
473
  - app/models/atlas_engine/address_validation/validators/full_address/invalid_zip_concern_builder.rb
449
474
  - app/models/atlas_engine/address_validation/validators/full_address/invalid_zip_for_country_concern.rb
450
475
  - app/models/atlas_engine/address_validation/validators/full_address/invalid_zip_for_province_concern.rb
451
476
  - app/models/atlas_engine/address_validation/validators/full_address/no_candidate_result.rb
452
477
  - app/models/atlas_engine/address_validation/validators/full_address/number_comparison.rb
453
478
  - app/models/atlas_engine/address_validation/validators/full_address/postal_code_matcher.rb
479
+ - app/models/atlas_engine/address_validation/validators/full_address/province_code_comparison.rb
454
480
  - app/models/atlas_engine/address_validation/validators/full_address/relevant_components.rb
455
481
  - app/models/atlas_engine/address_validation/validators/full_address/result_updater.rb
482
+ - app/models/atlas_engine/address_validation/validators/full_address/street_comparison.rb
456
483
  - app/models/atlas_engine/address_validation/validators/full_address/suggestion_builder.rb
457
484
  - app/models/atlas_engine/address_validation/validators/full_address/unknown_address_concern.rb
458
485
  - app/models/atlas_engine/address_validation/validators/full_address/unknown_province_concern.rb
459
486
  - app/models/atlas_engine/address_validation/validators/full_address/unknown_zip_for_address_concern.rb
460
487
  - app/models/atlas_engine/address_validation/validators/full_address/unmatched_field_concern.rb
461
488
  - app/models/atlas_engine/address_validation/validators/full_address/unsupported_script_result.rb
489
+ - app/models/atlas_engine/address_validation/validators/full_address/zip_comparison.rb
462
490
  - app/models/atlas_engine/address_validation/validators/predicates/cache.rb
463
491
  - app/models/atlas_engine/address_validation/validators/predicates/city/present.rb
464
492
  - app/models/atlas_engine/address_validation/validators/predicates/country/exists.rb
@@ -530,6 +558,7 @@ files:
530
558
  - lib/atlas_engine/engine.rb
531
559
  - lib/atlas_engine/version.rb
532
560
  - lib/tasks/atlas_engine/address_importer.rake
561
+ - lib/tasks/atlas_engine/graphql.rake
533
562
  homepage: https://github.com/Shopify/atlas_engine
534
563
  licenses:
535
564
  - MIT
@@ -553,7 +582,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
553
582
  - !ruby/object:Gem::Version
554
583
  version: '0'
555
584
  requirements: []
556
- rubygems_version: 3.5.4
585
+ rubygems_version: 3.5.6
557
586
  signing_key:
558
587
  specification_version: 4
559
588
  summary: Address Validation API