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
@@ -1,135 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module AtlasEngine
5
- module AddressValidation
6
- module Validators
7
- module FullAddress
8
- class ComparisonHelper
9
- extend T::Sig
10
-
11
- sig { params(address: AbstractAddress, candidate: Candidate, datastore: DatastoreBase).void }
12
- def initialize(address:, candidate:, datastore:)
13
- @address = address
14
- @datastore = datastore
15
- @candidate = candidate
16
- end
17
-
18
- sig { returns(T.nilable(Token::Sequence::Comparison)) }
19
- def street_comparison
20
- return @street_comparison if defined?(@street_comparison)
21
-
22
- street_sequences = datastore.fetch_street_sequences
23
- candidate_sequences = T.must(candidate.component(:street)).sequences
24
-
25
- @street_comparison = street_sequences.map do |street_sequence|
26
- best_comparison(
27
- street_sequence,
28
- candidate_sequences,
29
- )
30
- end.min
31
- end
32
-
33
- sig { returns(T.nilable(Token::Sequence::Comparison)) }
34
- def city_comparison
35
- return @city_comparison if defined?(@city_comparison)
36
-
37
- @city_comparison = best_comparison(
38
- datastore.fetch_city_sequence,
39
- T.must(candidate.component(:city)).sequences,
40
- )
41
- end
42
-
43
- sig { returns(T.nilable(Token::Sequence::Comparison)) }
44
- def province_code_comparison
45
- return @province_code_comparison if defined?(@province_code_comparison)
46
-
47
- normalized_session_province_code = ValidationTranscriber::ProvinceCodeNormalizer.normalize(
48
- country_code: address.country_code,
49
- province_code: address.province_code,
50
- )
51
- normalized_candidate_province_code = ValidationTranscriber::ProvinceCodeNormalizer.normalize(
52
- country_code: T.must(candidate.component(:country_code)).value,
53
- province_code: T.must(candidate.component(:province_code)).value,
54
- )
55
-
56
- @province_code_comparison = best_comparison(
57
- Token::Sequence.from_string(normalized_session_province_code),
58
- [Token::Sequence.from_string(normalized_candidate_province_code)],
59
- )
60
- end
61
-
62
- sig { returns(T.nilable(Token::Sequence::Comparison)) }
63
- def zip_comparison
64
- return @zip_comparison if defined?(@zip_comparison)
65
-
66
- candidate.component(:zip)&.value = PostalCodeMatcher.new(
67
- T.must(address.country_code),
68
- T.must(address.zip),
69
- candidate.component(:zip)&.value,
70
- ).truncate
71
-
72
- normalized_zip = ValidationTranscriber::ZipNormalizer.normalize(
73
- country_code: address.country_code, zip: address.zip,
74
- )
75
- zip_sequence = Token::Sequence.from_string(normalized_zip)
76
- @zip_comparison = best_comparison(
77
- zip_sequence,
78
- T.must(candidate.component(:zip)).sequences,
79
- )
80
- end
81
-
82
- sig { returns(NumberComparison) }
83
- def building_comparison
84
- @building_comparison ||= NumberComparison.new(
85
- numbers: datastore.parsings.potential_building_numbers,
86
- candidate_ranges: building_ranges_from_candidate(candidate),
87
- )
88
- end
89
-
90
- private
91
-
92
- sig { returns(AbstractAddress) }
93
- attr_reader :address
94
-
95
- sig { returns(DatastoreBase) }
96
- attr_reader :datastore
97
-
98
- sig { returns(Candidate) }
99
- attr_reader :candidate
100
-
101
- sig do
102
- params(
103
- sequence: Token::Sequence,
104
- component_sequences: T::Array[Token::Sequence],
105
- ).returns(T.nilable(Token::Sequence::Comparison))
106
- end
107
- def best_comparison(
108
- sequence,
109
- component_sequences
110
- )
111
- component_sequences.map do |component_sequence|
112
- Token::Sequence::Comparator.new(
113
- left_sequence: sequence,
114
- right_sequence: component_sequence,
115
- ).compare
116
- end.min_by.with_index do |comparison, index|
117
- # ruby's `min` and `sort` methods are not stable
118
- # so we need to prefer the leftmost comparison when two comparisons are equivalent
119
- [comparison, index]
120
- end
121
- end
122
-
123
- sig { params(candidate: Candidate).returns(T::Array[AddressNumberRange]) }
124
- def building_ranges_from_candidate(candidate)
125
- building_and_unit_ranges = candidate.component(:building_and_unit_ranges)&.value
126
- return [] if building_and_unit_ranges.blank?
127
-
128
- building_ranges = JSON.parse(building_and_unit_ranges).keys
129
- building_ranges.map { |building_range| AddressNumberRange.new(range_string: building_range) }
130
- end
131
- end
132
- end
133
- end
134
- end
135
- end