address_composer 1.0.1 → 2.0.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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +1 -1
  3. data/.gitmodules +1 -0
  4. data/.rubocop.yml +4 -20
  5. data/Gemfile.lock +57 -32
  6. data/README.md +26 -0
  7. data/address-formatting/.github/workflows/ci.yml +25 -0
  8. data/address-formatting/README.md +19 -13
  9. data/address-formatting/bin/coverage.pl +8 -2
  10. data/address-formatting/bin/run_tests.t +36 -10
  11. data/address-formatting/conf/abbreviations/ca.yaml +18 -1
  12. data/address-formatting/conf/abbreviations/cs.yaml +0 -3
  13. data/address-formatting/conf/abbreviations/da.yaml +1 -1
  14. data/address-formatting/conf/abbreviations/en.yaml +7 -1
  15. data/address-formatting/conf/abbreviations/es.yaml +21 -3
  16. data/address-formatting/conf/abbreviations/et.yaml +0 -3
  17. data/address-formatting/conf/abbreviations/eu.yaml +0 -1
  18. data/address-formatting/conf/abbreviations/fi.yaml +0 -3
  19. data/address-formatting/conf/abbreviations/fr.yaml +1 -1
  20. data/address-formatting/conf/abbreviations/gl.yaml +14 -0
  21. data/address-formatting/conf/abbreviations/it.yaml +1 -1
  22. data/address-formatting/conf/abbreviations/nl.yaml +17 -0
  23. data/address-formatting/conf/abbreviations/no.yaml +0 -4
  24. data/address-formatting/conf/abbreviations/pl.yaml +2 -2
  25. data/address-formatting/conf/abbreviations/pt.yaml +18 -0
  26. data/address-formatting/conf/abbreviations/ro.yaml +8 -2
  27. data/address-formatting/conf/abbreviations/sl.yaml +24 -0
  28. data/address-formatting/conf/abbreviations/{se.yaml → sv.yaml} +1 -5
  29. data/address-formatting/conf/abbreviations/tr.yaml +0 -4
  30. data/address-formatting/conf/abbreviations/{vn.yaml → vi.yaml} +1 -3
  31. data/address-formatting/conf/components.yaml +15 -4
  32. data/address-formatting/conf/countries/worldwide.yaml +401 -272
  33. data/address-formatting/conf/country2lang.yaml +33 -32
  34. data/address-formatting/conf/country_codes.yaml +216 -214
  35. data/address-formatting/conf/county_codes.yaml +19 -9
  36. data/address-formatting/conf/state_codes.yaml +91 -49
  37. data/address-formatting/cpanfile +10 -0
  38. data/address-formatting/testcases/abbreviations/de.yaml +27 -0
  39. data/address-formatting/testcases/abbreviations/en.yaml +15 -0
  40. data/address-formatting/testcases/abbreviations/fr.yaml +12 -0
  41. data/address-formatting/testcases/countries/al.yaml +17 -3
  42. data/address-formatting/testcases/countries/au.yaml +29 -3
  43. data/address-formatting/testcases/countries/be.yaml +17 -2
  44. data/address-formatting/testcases/countries/bg.yaml +1 -1
  45. data/address-formatting/testcases/countries/br.yaml +36 -2
  46. data/address-formatting/testcases/countries/ca.yaml +60 -18
  47. data/address-formatting/testcases/countries/cl.yaml +3 -2
  48. data/address-formatting/testcases/countries/cn.yaml +21 -8
  49. data/address-formatting/testcases/countries/co.yaml +19 -0
  50. data/address-formatting/testcases/countries/cu.yaml +24 -10
  51. data/address-formatting/testcases/countries/de.yaml +70 -13
  52. data/address-formatting/testcases/countries/eg.yaml +6 -6
  53. data/address-formatting/testcases/countries/eh.yaml +2 -2
  54. data/address-formatting/testcases/countries/es.yaml +12 -0
  55. data/address-formatting/testcases/countries/fr.yaml +30 -13
  56. data/address-formatting/testcases/countries/gb.yaml +63 -4
  57. data/address-formatting/testcases/countries/hu.yaml +3 -4
  58. data/address-formatting/testcases/countries/ie.yaml +43 -1
  59. data/address-formatting/testcases/countries/in.yaml +14 -1
  60. data/address-formatting/testcases/countries/ir.yaml +19 -8
  61. data/address-formatting/testcases/countries/it.yaml +30 -2
  62. data/address-formatting/testcases/countries/kg.yaml +1 -1
  63. data/address-formatting/testcases/countries/kr.yaml +13 -5
  64. data/address-formatting/testcases/countries/ml.yaml +9 -9
  65. data/address-formatting/testcases/countries/mu.yaml +17 -1
  66. data/address-formatting/testcases/countries/nz.yaml +11 -0
  67. data/address-formatting/testcases/countries/pa.yaml +17 -0
  68. data/address-formatting/testcases/countries/ph.yaml +64 -3
  69. data/address-formatting/testcases/countries/pt.yaml +17 -0
  70. data/address-formatting/testcases/countries/py.yaml +1 -1
  71. data/address-formatting/testcases/countries/ru.yaml +3 -3
  72. data/address-formatting/testcases/countries/sg.yaml +16 -0
  73. data/address-formatting/testcases/countries/sj.yaml +1 -1
  74. data/address-formatting/testcases/countries/sk.yaml +20 -2
  75. data/address-formatting/testcases/countries/sn.yaml +16 -0
  76. data/address-formatting/testcases/countries/tc.yaml +12 -0
  77. data/address-formatting/testcases/countries/th.yaml +1 -1
  78. data/address-formatting/testcases/countries/tk.yaml +1 -1
  79. data/address-formatting/testcases/countries/tw.yaml +7 -7
  80. data/address-formatting/testcases/countries/tz.yaml +1 -7
  81. data/address-formatting/testcases/countries/us.yaml +3 -5
  82. data/address-formatting/testcases/countries/uy.yaml +1 -1
  83. data/address-formatting/testcases/countries/vn.yaml +2 -1
  84. data/address-formatting/testcases/countries/xc.yaml +14 -0
  85. data/address-formatting/testcases/countries/xk.yaml +20 -0
  86. data/address_composer.gemspec +11 -9
  87. data/lib/address_composer/version.rb +1 -1
  88. data/lib/address_composer.rb +92 -14
  89. metadata +83 -34
  90. data/.travis.yml +0 -7
  91. data/address-formatting/.travis.yml +0 -12
@@ -1,14 +1,30 @@
1
1
  require "address_composer/version"
2
2
  require "yaml"
3
3
  require "mustache"
4
+ require "uri"
4
5
 
5
6
  class AddressComposer
6
7
  GEM_ROOT = Gem::Specification.find_by_name("address_composer").gem_dir
7
- Templates = YAML.load_file(File.join(GEM_ROOT, "address-formatting", "conf", "countries", "worldwide.yaml"))
8
+ Templates = YAML.safe_load(IO.read(File.join(GEM_ROOT, "address-formatting", "conf", "countries", "worldwide.yaml")), aliases: true)
8
9
  ComponentsList = Psych.load_stream(File.read(File.join(GEM_ROOT,"address-formatting", "conf","components.yaml")))
9
10
  AllComponents = ComponentsList.map { |h| h["name"] } + ComponentsList.flat_map { |h| h["aliases"] }.compact
10
- StateCodes = YAML.load_file(File.join(GEM_ROOT, "address-formatting", "conf", "state_codes.yaml"))
11
- CountyCodes = YAML.load_file(File.join(GEM_ROOT, "address-formatting", "conf", "county_codes.yaml"))
11
+ StateCodes = YAML.safe_load(IO.read(File.join(GEM_ROOT, "address-formatting", "conf", "state_codes.yaml")), aliases: true)
12
+ CountyCodes = YAML.safe_load(IO.read(File.join(GEM_ROOT, "address-formatting", "conf", "county_codes.yaml")), aliases: true)
13
+ CountryToLanguage = begin
14
+ c2l = YAML.safe_load(IO.read(File.join(GEM_ROOT, "address-formatting", "conf", "country2lang.yaml")), aliases: true)
15
+ c2l.transform_values! do |v|
16
+ v.split(",")
17
+ end
18
+ c2l.freeze
19
+ end
20
+ Abbreviations = begin
21
+ abbr = {}
22
+ Dir.each_child(File.join(GEM_ROOT, "address-formatting", "conf", "abbreviations")) do |file|
23
+ country_code, = file.split(".", 2)
24
+ abbr[country_code] = YAML.safe_load(IO.read(File.join(GEM_ROOT, "address-formatting", "conf", "abbreviations", file)), aliases: true)
25
+ end
26
+ abbr.freeze
27
+ end
12
28
 
13
29
  class Template < Mustache
14
30
  def first
@@ -26,6 +42,7 @@ class AddressComposer
26
42
 
27
43
  def initialize(components)
28
44
  self.components = components.dup
45
+ @should_abbreviate = self.components.delete("should_abbreviate") || false
29
46
 
30
47
  normalize_components
31
48
  end
@@ -38,24 +55,32 @@ class AddressComposer
38
55
  result = components.values.join(" ")
39
56
  end
40
57
 
58
+ clean(result)
59
+ end
60
+
61
+ private
62
+
63
+ attr_reader :should_abbreviate
64
+
65
+ def clean(result)
41
66
  # Remove duplicated spaces
42
67
  result = result.squeeze(" ")
43
68
 
44
69
  # Remove duplicated returns and add one at the end
45
- result = result.split("\n").uniq.join("\n") + "\n"
70
+ result = "#{result.split("\n").uniq.join("\n")}\n"
71
+
72
+ result.gsub!(/,\s*,/, ",") # multiple commas to one
46
73
 
47
74
  # Remove spaces and commas before and after return
48
75
  result = result.gsub(/[,|\s]*\n[\s|,]*/, "\n")
49
76
 
50
77
  # Remove duplicated consecutive words
51
- result = result.gsub(/([[:alnum:]]+,)\s+\1/, '\1') # remove duplicates
78
+ result = result.gsub(/([[:alnum:]]+),\s+\1/, '\1') # remove duplicates
52
79
 
53
80
  # Remove trailing non-word characters
54
81
  result.sub(/^[,|\s|-]*/, "")
55
82
  end
56
83
 
57
- private
58
-
59
84
  def template
60
85
  @template ||= if (components.keys & %w[road postcode]).empty?
61
86
  formatting_rule["fallback_template"] || Templates["default"]["fallback_template"]
@@ -95,6 +120,24 @@ class AddressComposer
95
120
  apply_formatting_rules
96
121
  apply_aliases
97
122
  normalize_aliases
123
+ abbreviate if should_abbreviate
124
+ end
125
+
126
+ def abbreviate
127
+ langs = CountryToLanguage[components["country_code"]]
128
+ return unless langs
129
+
130
+ langs.each do |lang|
131
+ next unless Abbreviations[lang]
132
+
133
+ Abbreviations[lang].each_key do |abbrev_component|
134
+ next unless components[abbrev_component]
135
+
136
+ Abbreviations[lang][abbrev_component].each do |k, v|
137
+ components[abbrev_component].sub!(/(^|\s)#{k}\b/, "\\1#{v}")
138
+ end
139
+ end
140
+ end
98
141
  end
99
142
 
100
143
  def fix_countries
@@ -146,8 +189,25 @@ class AddressComposer
146
189
  end
147
190
  end
148
191
 
192
+ SMALL_DISTRICT_COUNTRIES = [
193
+ 'BR',
194
+ 'CR',
195
+ 'ES',
196
+ 'NI',
197
+ 'PY',
198
+ 'RO',
199
+ 'TG',
200
+ 'TM',
201
+ 'XK',
202
+ ].freeze
203
+
149
204
  def apply_aliases
205
+ sdc = SMALL_DISTRICT_COUNTRIES.include?(components['country_code'])
206
+ district = components['district']
207
+ components['state_district'] = district if district && !sdc
208
+
150
209
  components.keys.each do |key|
210
+ next if !sdc && key == 'district'
151
211
  component = ComponentsList.detect { |member| member["aliases"].to_a.include?(key) }
152
212
  components[component["name"]] ||= components[key] if component
153
213
  end
@@ -159,16 +219,34 @@ class AddressComposer
159
219
  end.join(" ")
160
220
  end
161
221
 
222
+ def get_county_code(county, country_code)
223
+ # TODO what if county is actually the countyCode?
224
+ upcase_county = county.upcase
225
+ pair = CountyCodes[country_code]&.find do |_, value|
226
+ if value.respond_to?(:upcase)
227
+ value.upcase == upcase_county
228
+ else
229
+ value.values.any? { |val| val.upcase == upcase_county }
230
+ end
231
+ end
232
+ pair&.first
233
+ end
234
+
162
235
  def normalize_aliases
163
- state_group = [components["state"], components["state_code"]].compact
164
- state_code, state = StateCodes[@use_country || components["country_code"].upcase]&.select { |k, v| ([k, v] & state_group).any? }.to_a.flatten
236
+ state_group = [components["state"]&.upcase, components["state_code"]&.upcase].compact
237
+ state_code, state = StateCodes[@use_country || components["country_code"].upcase]&.select do |k, v|
238
+ if v.is_a? Hash
239
+ ([k&.upcase, v.values.map(&:upcase)] & state_group).any?
240
+ else
241
+ ([k&.upcase, v&.upcase] & state_group).any?
242
+ end
243
+ end.to_a.flatten
165
244
  components["state_code"] = state_code unless state_code.nil?
166
245
  components["state"] = state unless state.nil?
167
246
 
168
- county_group = [components["county"], components["county_code"]].compact
169
- county_code, county = CountyCodes[components["country_code"].upcase]&.select { |k, v| ([k, v] & county_group).any? }.to_a.flatten
170
- components["county"] = county unless county.nil?
171
- components["county_code"] = county_code unless county_code.nil?
247
+ if components["county"] && !components["county_code"]
248
+ components["county_code"] = get_county_code(components["county"], components["country_code"])
249
+ end
172
250
 
173
251
  if components["postcode"]&.include?(";")
174
252
  components.delete("postcode")
@@ -187,7 +265,7 @@ class AddressComposer
187
265
  self.components = components.reject { |_, v| v.nil? || v.empty? }
188
266
 
189
267
  # Remove components with URL
190
- components.delete_if { |_, v| v.match?(URI::DEFAULT_PARSER.make_regexp) }
268
+ components.delete_if { |_, v| v.respond_to?(:match?) && v.match?(URI::DEFAULT_PARSER.make_regexp) }
191
269
  end
192
270
 
193
271
  def replace(replaces)
metadata CHANGED
@@ -1,99 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: address_composer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alejandro Arrufat
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-11 00:00:00.000000000 Z
11
+ date: 2025-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mustache
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.1'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '2.2'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '2.2'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: pry
42
+ name: rubocop
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0.14'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0.14'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: pry-byebug
56
+ name: ostruct
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '3.8'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '3.8'
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: reline
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: irb
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: fiddle
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: rake
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
- - - "~>"
115
+ - - ">="
74
116
  - !ruby/object:Gem::Version
75
- version: '13.0'
117
+ version: '0'
76
118
  type: :development
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
- - - "~>"
122
+ - - ">="
81
123
  - !ruby/object:Gem::Version
82
- version: '13.0'
124
+ version: '0'
83
125
  - !ruby/object:Gem::Dependency
84
126
  name: rspec
85
127
  requirement: !ruby/object:Gem::Requirement
86
128
  requirements:
87
- - - "~>"
129
+ - - ">="
88
130
  - !ruby/object:Gem::Version
89
- version: '3.10'
131
+ version: '0'
90
132
  type: :development
91
133
  prerelease: false
92
134
  version_requirements: !ruby/object:Gem::Requirement
93
135
  requirements:
94
- - - "~>"
136
+ - - ">="
95
137
  - !ruby/object:Gem::Version
96
- version: '3.10'
138
+ version: '0'
97
139
  description: Address Composer formats address components using worldwide regions formatting
98
140
  templates
99
141
  email:
@@ -107,13 +149,12 @@ files:
107
149
  - ".gitmodules"
108
150
  - ".rspec"
109
151
  - ".rubocop.yml"
110
- - ".travis.yml"
111
152
  - Gemfile
112
153
  - Gemfile.lock
113
154
  - LICENSE.txt
114
155
  - README.md
115
156
  - Rakefile
116
- - address-formatting/.travis.yml
157
+ - address-formatting/.github/workflows/ci.yml
117
158
  - address-formatting/LICENSE.txt
118
159
  - address-formatting/README.md
119
160
  - address-formatting/SECURITY.md
@@ -129,6 +170,7 @@ files:
129
170
  - address-formatting/conf/abbreviations/eu.yaml
130
171
  - address-formatting/conf/abbreviations/fi.yaml
131
172
  - address-formatting/conf/abbreviations/fr.yaml
173
+ - address-formatting/conf/abbreviations/gl.yaml
132
174
  - address-formatting/conf/abbreviations/hu.yaml
133
175
  - address-formatting/conf/abbreviations/it.yaml
134
176
  - address-formatting/conf/abbreviations/nl.yaml
@@ -137,18 +179,23 @@ files:
137
179
  - address-formatting/conf/abbreviations/pt.yaml
138
180
  - address-formatting/conf/abbreviations/ro.yaml
139
181
  - address-formatting/conf/abbreviations/ru.yaml
140
- - address-formatting/conf/abbreviations/se.yaml
141
182
  - address-formatting/conf/abbreviations/sk.yaml
183
+ - address-formatting/conf/abbreviations/sl.yaml
184
+ - address-formatting/conf/abbreviations/sv.yaml
142
185
  - address-formatting/conf/abbreviations/tr.yaml
143
186
  - address-formatting/conf/abbreviations/uk.yaml
144
- - address-formatting/conf/abbreviations/vn.yaml
187
+ - address-formatting/conf/abbreviations/vi.yaml
145
188
  - address-formatting/conf/components.yaml
146
189
  - address-formatting/conf/countries/worldwide.yaml
147
190
  - address-formatting/conf/country2lang.yaml
148
191
  - address-formatting/conf/country_codes.yaml
149
192
  - address-formatting/conf/county_codes.yaml
150
193
  - address-formatting/conf/state_codes.yaml
194
+ - address-formatting/cpanfile
151
195
  - address-formatting/opencage_logo_300_150.png
196
+ - address-formatting/testcases/abbreviations/de.yaml
197
+ - address-formatting/testcases/abbreviations/en.yaml
198
+ - address-formatting/testcases/abbreviations/fr.yaml
152
199
  - address-formatting/testcases/countries/ad.yaml
153
200
  - address-formatting/testcases/countries/ae.yaml
154
201
  - address-formatting/testcases/countries/af.yaml
@@ -393,6 +440,8 @@ files:
393
440
  - address-formatting/testcases/countries/vu.yaml
394
441
  - address-formatting/testcases/countries/wf.yaml
395
442
  - address-formatting/testcases/countries/ws.yaml
443
+ - address-formatting/testcases/countries/xc.yaml
444
+ - address-formatting/testcases/countries/xk.yaml
396
445
  - address-formatting/testcases/countries/ye.yaml
397
446
  - address-formatting/testcases/countries/yt.yaml
398
447
  - address-formatting/testcases/countries/za.yaml
@@ -421,14 +470,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
421
470
  requirements:
422
471
  - - ">="
423
472
  - !ruby/object:Gem::Version
424
- version: '2.4'
473
+ version: '2.6'
425
474
  required_rubygems_version: !ruby/object:Gem::Requirement
426
475
  requirements:
427
476
  - - ">="
428
477
  - !ruby/object:Gem::Version
429
478
  version: '0'
430
479
  requirements: []
431
- rubygems_version: 3.2.22
480
+ rubygems_version: 3.0.1
432
481
  signing_key:
433
482
  specification_version: 4
434
483
  summary: Universal international address composer in Ruby
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.6.5
7
- before_install: gem install bundler -v 1.17.2
@@ -1,12 +0,0 @@
1
- language: perl
2
- perl:
3
- - '5.30'
4
- env: PERL_CPANM_OPT="--notest --force --skip-satisfied"
5
- install:
6
- - cpanm File::Find::Rule~0.34
7
- - cpanm Geo::Address::Formatter
8
- script:
9
- - bin/run_tests.t
10
- notifications:
11
- slack:
12
- secure: M7U87fLJ7oXOPjFDBASOwhNZXqRoYsTYtPxVbAHlQfS1at38IfK7/6rWdf7yNUPCV0JqfRCsR7frWQNncR9BbjtYSoDFywY/IcdVMoOl3haZJqXbA/LfGgI9ZIBAx5nBUlZkBaaq/RhXoKlNbZ89p6zq3qyvsUIgmUSkNTGejRU=