address_composer 0.1.1.pre → 0.1.2.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/README.md +1 -1
- data/address-formatting/.travis.yml +10 -0
- data/address-formatting/LICENSE.txt +21 -0
- data/address-formatting/README.md +153 -0
- data/address-formatting/bin/coverage.pl +120 -0
- data/address-formatting/bin/run_tests.t +62 -0
- data/address-formatting/conf/abbreviations/ca.yaml +4 -0
- data/address-formatting/conf/abbreviations/cs.yaml +7 -0
- data/address-formatting/conf/abbreviations/de.yaml +7 -0
- data/address-formatting/conf/abbreviations/dk.yaml +17 -0
- data/address-formatting/conf/abbreviations/en.yaml +31 -0
- data/address-formatting/conf/abbreviations/es.yaml +25 -0
- data/address-formatting/conf/abbreviations/et.yaml +9 -0
- data/address-formatting/conf/abbreviations/eu.yaml +5 -0
- data/address-formatting/conf/abbreviations/fi.yaml +19 -0
- data/address-formatting/conf/abbreviations/fr.yaml +10 -0
- data/address-formatting/conf/abbreviations/hu.yaml +4 -0
- data/address-formatting/conf/abbreviations/it.yaml +32 -0
- data/address-formatting/conf/abbreviations/nl.yaml +13 -0
- data/address-formatting/conf/abbreviations/pt.yaml +31 -0
- data/address-formatting/conf/abbreviations/ro.yaml +5 -0
- data/address-formatting/conf/abbreviations/se.yaml +16 -0
- data/address-formatting/conf/abbreviations/sk.yaml +22 -0
- data/address-formatting/conf/abbreviations/tr.yaml +12 -0
- data/address-formatting/conf/abbreviations/uk.yaml +11 -0
- data/address-formatting/conf/components.yaml +71 -0
- data/address-formatting/conf/countries/worldwide.yaml +1986 -0
- data/address-formatting/conf/country2lang.yaml +258 -0
- data/address-formatting/conf/country_codes.yaml +252 -0
- data/address-formatting/conf/county_codes.yaml +410 -0
- data/address-formatting/conf/state_codes.yaml +1498 -0
- data/address-formatting/opencage_logo_300_150.png +0 -0
- data/address-formatting/testcases/countries/ad.yaml +20 -0
- data/address-formatting/testcases/countries/ae.yaml +82 -0
- data/address-formatting/testcases/countries/af.yaml +19 -0
- data/address-formatting/testcases/countries/ag.yaml +18 -0
- data/address-formatting/testcases/countries/ai.yaml +19 -0
- data/address-formatting/testcases/countries/al.yaml +20 -0
- data/address-formatting/testcases/countries/am.yaml +18 -0
- data/address-formatting/testcases/countries/ao.yaml +22 -0
- data/address-formatting/testcases/countries/aq.yaml +18 -0
- data/address-formatting/testcases/countries/ar.yaml +23 -0
- data/address-formatting/testcases/countries/as.yaml +21 -0
- data/address-formatting/testcases/countries/at.yaml +17 -0
- data/address-formatting/testcases/countries/au.yaml +81 -0
- data/address-formatting/testcases/countries/aw.yaml +19 -0
- data/address-formatting/testcases/countries/ax.yaml +20 -0
- data/address-formatting/testcases/countries/az.yaml +21 -0
- data/address-formatting/testcases/countries/ba.yaml +23 -0
- data/address-formatting/testcases/countries/bb.yaml +20 -0
- data/address-formatting/testcases/countries/bd.yaml +23 -0
- data/address-formatting/testcases/countries/be.yaml +20 -0
- data/address-formatting/testcases/countries/bf.yaml +22 -0
- data/address-formatting/testcases/countries/bg.yaml +20 -0
- data/address-formatting/testcases/countries/bh.yaml +63 -0
- data/address-formatting/testcases/countries/bi.yaml +21 -0
- data/address-formatting/testcases/countries/bj.yaml +18 -0
- data/address-formatting/testcases/countries/bl.yaml +21 -0
- data/address-formatting/testcases/countries/bm.yaml +19 -0
- data/address-formatting/testcases/countries/bn.yaml +20 -0
- data/address-formatting/testcases/countries/bo.yaml +19 -0
- data/address-formatting/testcases/countries/bq.yaml +20 -0
- data/address-formatting/testcases/countries/br.yaml +62 -0
- data/address-formatting/testcases/countries/bs.yaml +19 -0
- data/address-formatting/testcases/countries/bt.yaml +19 -0
- data/address-formatting/testcases/countries/bv.yaml +11 -0
- data/address-formatting/testcases/countries/bw.yaml +17 -0
- data/address-formatting/testcases/countries/by.yaml +24 -0
- data/address-formatting/testcases/countries/bz.yaml +20 -0
- data/address-formatting/testcases/countries/ca.yaml +72 -0
- data/address-formatting/testcases/countries/cc.yaml +17 -0
- data/address-formatting/testcases/countries/cd.yaml +21 -0
- data/address-formatting/testcases/countries/cf.yaml +18 -0
- data/address-formatting/testcases/countries/cg.yaml +21 -0
- data/address-formatting/testcases/countries/ch.yaml +21 -0
- data/address-formatting/testcases/countries/ci.yaml +21 -0
- data/address-formatting/testcases/countries/ck.yaml +17 -0
- data/address-formatting/testcases/countries/cl.yaml +21 -0
- data/address-formatting/testcases/countries/cm.yaml +22 -0
- data/address-formatting/testcases/countries/cn.yaml +24 -0
- data/address-formatting/testcases/countries/co.yaml +18 -0
- data/address-formatting/testcases/countries/cr.yaml +21 -0
- data/address-formatting/testcases/countries/cu.yaml +22 -0
- data/address-formatting/testcases/countries/cv.yaml +22 -0
- data/address-formatting/testcases/countries/cw.yaml +21 -0
- data/address-formatting/testcases/countries/cx.yaml +19 -0
- data/address-formatting/testcases/countries/cy.yaml +21 -0
- data/address-formatting/testcases/countries/cz.yaml +20 -0
- data/address-formatting/testcases/countries/de.yaml +253 -0
- data/address-formatting/testcases/countries/dj.yaml +20 -0
- data/address-formatting/testcases/countries/dk.yaml +17 -0
- data/address-formatting/testcases/countries/dm.yaml +21 -0
- data/address-formatting/testcases/countries/do.yaml +24 -0
- data/address-formatting/testcases/countries/dz.yaml +20 -0
- data/address-formatting/testcases/countries/ec.yaml +23 -0
- data/address-formatting/testcases/countries/ee.yaml +19 -0
- data/address-formatting/testcases/countries/eg.yaml +88 -0
- data/address-formatting/testcases/countries/eh.yaml +22 -0
- data/address-formatting/testcases/countries/er.yaml +20 -0
- data/address-formatting/testcases/countries/es.yaml +44 -0
- data/address-formatting/testcases/countries/et.yaml +20 -0
- data/address-formatting/testcases/countries/fi.yaml +20 -0
- data/address-formatting/testcases/countries/fj.yaml +19 -0
- data/address-formatting/testcases/countries/fk.yaml +29 -0
- data/address-formatting/testcases/countries/fm.yaml +20 -0
- data/address-formatting/testcases/countries/fo.yaml +20 -0
- data/address-formatting/testcases/countries/fr.yaml +201 -0
- data/address-formatting/testcases/countries/ga.yaml +23 -0
- data/address-formatting/testcases/countries/gb.yaml +147 -0
- data/address-formatting/testcases/countries/gd.yaml +18 -0
- data/address-formatting/testcases/countries/ge.yaml +16 -0
- data/address-formatting/testcases/countries/gf.yaml +17 -0
- data/address-formatting/testcases/countries/gg.yaml +19 -0
- data/address-formatting/testcases/countries/gh.yaml +22 -0
- data/address-formatting/testcases/countries/gi.yaml +17 -0
- data/address-formatting/testcases/countries/gl.yaml +19 -0
- data/address-formatting/testcases/countries/gm.yaml +18 -0
- data/address-formatting/testcases/countries/gn.yaml +20 -0
- data/address-formatting/testcases/countries/gp.yaml +22 -0
- data/address-formatting/testcases/countries/gq.yaml +21 -0
- data/address-formatting/testcases/countries/gr.yaml +20 -0
- data/address-formatting/testcases/countries/gs.yaml +17 -0
- data/address-formatting/testcases/countries/gt.yaml +23 -0
- data/address-formatting/testcases/countries/gu.yaml +19 -0
- data/address-formatting/testcases/countries/gw.yaml +22 -0
- data/address-formatting/testcases/countries/gy.yaml +20 -0
- data/address-formatting/testcases/countries/hk.yaml +20 -0
- data/address-formatting/testcases/countries/hm.yaml +15 -0
- data/address-formatting/testcases/countries/hn.yaml +23 -0
- data/address-formatting/testcases/countries/hr.yaml +19 -0
- data/address-formatting/testcases/countries/ht.yaml +22 -0
- data/address-formatting/testcases/countries/hu.yaml +24 -0
- data/address-formatting/testcases/countries/id.yaml +19 -0
- data/address-formatting/testcases/countries/ie.yaml +67 -0
- data/address-formatting/testcases/countries/il.yaml +21 -0
- data/address-formatting/testcases/countries/im.yaml +19 -0
- data/address-formatting/testcases/countries/in.yaml +32 -0
- data/address-formatting/testcases/countries/io.yaml +16 -0
- data/address-formatting/testcases/countries/iq.yaml +94 -0
- data/address-formatting/testcases/countries/ir.yaml +19 -0
- data/address-formatting/testcases/countries/is.yaml +19 -0
- data/address-formatting/testcases/countries/it.yaml +48 -0
- data/address-formatting/testcases/countries/je.yaml +15 -0
- data/address-formatting/testcases/countries/jm.yaml +21 -0
- data/address-formatting/testcases/countries/jo.yaml +78 -0
- data/address-formatting/testcases/countries/jp.yaml +22 -0
- data/address-formatting/testcases/countries/ke.yaml +18 -0
- data/address-formatting/testcases/countries/kg.yaml +21 -0
- data/address-formatting/testcases/countries/kh.yaml +21 -0
- data/address-formatting/testcases/countries/ki.yaml +17 -0
- data/address-formatting/testcases/countries/km.yaml +18 -0
- data/address-formatting/testcases/countries/kn.yaml +18 -0
- data/address-formatting/testcases/countries/kp.yaml +21 -0
- data/address-formatting/testcases/countries/kr.yaml +21 -0
- data/address-formatting/testcases/countries/kw.yaml +69 -0
- data/address-formatting/testcases/countries/ky.yaml +21 -0
- data/address-formatting/testcases/countries/kz.yaml +19 -0
- data/address-formatting/testcases/countries/la.yaml +19 -0
- data/address-formatting/testcases/countries/lb.yaml +80 -0
- data/address-formatting/testcases/countries/lc.yaml +17 -0
- data/address-formatting/testcases/countries/li.yaml +18 -0
- data/address-formatting/testcases/countries/lk.yaml +23 -0
- data/address-formatting/testcases/countries/lr.yaml +22 -0
- data/address-formatting/testcases/countries/ls.yaml +19 -0
- data/address-formatting/testcases/countries/lt.yaml +17 -0
- data/address-formatting/testcases/countries/lu.yaml +22 -0
- data/address-formatting/testcases/countries/lv.yaml +17 -0
- data/address-formatting/testcases/countries/ly.yaml +77 -0
- data/address-formatting/testcases/countries/ma.yaml +18 -0
- data/address-formatting/testcases/countries/mc.yaml +20 -0
- data/address-formatting/testcases/countries/md.yaml +17 -0
- data/address-formatting/testcases/countries/me.yaml +19 -0
- data/address-formatting/testcases/countries/mf.yaml +20 -0
- data/address-formatting/testcases/countries/mg.yaml +21 -0
- data/address-formatting/testcases/countries/mh.yaml +19 -0
- data/address-formatting/testcases/countries/mk.yaml +21 -0
- data/address-formatting/testcases/countries/ml.yaml +22 -0
- data/address-formatting/testcases/countries/mm.yaml +20 -0
- data/address-formatting/testcases/countries/mn.yaml +20 -0
- data/address-formatting/testcases/countries/mo.yaml +23 -0
- data/address-formatting/testcases/countries/mp.yaml +20 -0
- data/address-formatting/testcases/countries/mq.yaml +21 -0
- data/address-formatting/testcases/countries/mr.yaml +58 -0
- data/address-formatting/testcases/countries/ms.yaml +19 -0
- data/address-formatting/testcases/countries/mt.yaml +16 -0
- data/address-formatting/testcases/countries/mu.yaml +21 -0
- data/address-formatting/testcases/countries/mv.yaml +20 -0
- data/address-formatting/testcases/countries/mw.yaml +20 -0
- data/address-formatting/testcases/countries/mx.yaml +22 -0
- data/address-formatting/testcases/countries/my.yaml +23 -0
- data/address-formatting/testcases/countries/mz.yaml +19 -0
- data/address-formatting/testcases/countries/na.yaml +20 -0
- data/address-formatting/testcases/countries/nc.yaml +22 -0
- data/address-formatting/testcases/countries/ne.yaml +24 -0
- data/address-formatting/testcases/countries/nf.yaml +16 -0
- data/address-formatting/testcases/countries/ng.yaml +21 -0
- data/address-formatting/testcases/countries/ni.yaml +28 -0
- data/address-formatting/testcases/countries/nl.yaml +79 -0
- data/address-formatting/testcases/countries/no.yaml +18 -0
- data/address-formatting/testcases/countries/np.yaml +25 -0
- data/address-formatting/testcases/countries/nr.yaml +17 -0
- data/address-formatting/testcases/countries/nu.yaml +17 -0
- data/address-formatting/testcases/countries/nz.yaml +18 -0
- data/address-formatting/testcases/countries/om.yaml +70 -0
- data/address-formatting/testcases/countries/pa.yaml +35 -0
- data/address-formatting/testcases/countries/pe.yaml +16 -0
- data/address-formatting/testcases/countries/pf.yaml +20 -0
- data/address-formatting/testcases/countries/pg.yaml +20 -0
- data/address-formatting/testcases/countries/ph.yaml +21 -0
- data/address-formatting/testcases/countries/pk.yaml +22 -0
- data/address-formatting/testcases/countries/pl.yaml +51 -0
- data/address-formatting/testcases/countries/pm.yaml +20 -0
- data/address-formatting/testcases/countries/pn.yaml +18 -0
- data/address-formatting/testcases/countries/pr.yaml +17 -0
- data/address-formatting/testcases/countries/ps.yaml +112 -0
- data/address-formatting/testcases/countries/pt.yaml +16 -0
- data/address-formatting/testcases/countries/pw.yaml +17 -0
- data/address-formatting/testcases/countries/py.yaml +20 -0
- data/address-formatting/testcases/countries/qa.yaml +46 -0
- data/address-formatting/testcases/countries/re.yaml +19 -0
- data/address-formatting/testcases/countries/ro.yaml +21 -0
- data/address-formatting/testcases/countries/rs.yaml +19 -0
- data/address-formatting/testcases/countries/ru.yaml +22 -0
- data/address-formatting/testcases/countries/rw.yaml +22 -0
- data/address-formatting/testcases/countries/sa.yaml +16 -0
- data/address-formatting/testcases/countries/sb.yaml +18 -0
- data/address-formatting/testcases/countries/sc.yaml +20 -0
- data/address-formatting/testcases/countries/sd.yaml +22 -0
- data/address-formatting/testcases/countries/se.yaml +38 -0
- data/address-formatting/testcases/countries/sg.yaml +26 -0
- data/address-formatting/testcases/countries/sh.yaml +34 -0
- data/address-formatting/testcases/countries/si.yaml +20 -0
- data/address-formatting/testcases/countries/sj.yaml +13 -0
- data/address-formatting/testcases/countries/sk.yaml +20 -0
- data/address-formatting/testcases/countries/sl.yaml +23 -0
- data/address-formatting/testcases/countries/sm.yaml +19 -0
- data/address-formatting/testcases/countries/sn.yaml +20 -0
- data/address-formatting/testcases/countries/so.yaml +23 -0
- data/address-formatting/testcases/countries/sr.yaml +20 -0
- data/address-formatting/testcases/countries/ss.yaml +19 -0
- data/address-formatting/testcases/countries/st.yaml +20 -0
- data/address-formatting/testcases/countries/sv.yaml +42 -0
- data/address-formatting/testcases/countries/sx.yaml +21 -0
- data/address-formatting/testcases/countries/sy.yaml +84 -0
- data/address-formatting/testcases/countries/sz.yaml +21 -0
- data/address-formatting/testcases/countries/tc.yaml +21 -0
- data/address-formatting/testcases/countries/td.yaml +19 -0
- data/address-formatting/testcases/countries/tf.yaml +18 -0
- data/address-formatting/testcases/countries/tg.yaml +20 -0
- data/address-formatting/testcases/countries/th.yaml +26 -0
- data/address-formatting/testcases/countries/tj.yaml +19 -0
- data/address-formatting/testcases/countries/tk.yaml +13 -0
- data/address-formatting/testcases/countries/tl.yaml +20 -0
- data/address-formatting/testcases/countries/tm.yaml +21 -0
- data/address-formatting/testcases/countries/tn.yaml +50 -0
- data/address-formatting/testcases/countries/to.yaml +20 -0
- data/address-formatting/testcases/countries/tr.yaml +18 -0
- data/address-formatting/testcases/countries/tt.yaml +18 -0
- data/address-formatting/testcases/countries/tv.yaml +17 -0
- data/address-formatting/testcases/countries/tw.yaml +22 -0
- data/address-formatting/testcases/countries/tz.yaml +65 -0
- data/address-formatting/testcases/countries/ua.yaml +19 -0
- data/address-formatting/testcases/countries/ug.yaml +23 -0
- data/address-formatting/testcases/countries/um.yaml +14 -0
- data/address-formatting/testcases/countries/us.yaml +185 -0
- data/address-formatting/testcases/countries/uy.yaml +21 -0
- data/address-formatting/testcases/countries/uz.yaml +19 -0
- data/address-formatting/testcases/countries/va.yaml +31 -0
- data/address-formatting/testcases/countries/vc.yaml +18 -0
- data/address-formatting/testcases/countries/ve.yaml +20 -0
- data/address-formatting/testcases/countries/vg.yaml +21 -0
- data/address-formatting/testcases/countries/vi.yaml +20 -0
- data/address-formatting/testcases/countries/vn.yaml +18 -0
- data/address-formatting/testcases/countries/vu.yaml +18 -0
- data/address-formatting/testcases/countries/wf.yaml +18 -0
- data/address-formatting/testcases/countries/ws.yaml +18 -0
- data/address-formatting/testcases/countries/ye.yaml +60 -0
- data/address-formatting/testcases/countries/yt.yaml +20 -0
- data/address-formatting/testcases/countries/za.yaml +22 -0
- data/address-formatting/testcases/countries/zm.yaml +20 -0
- data/address-formatting/testcases/countries/zw.yaml +20 -0
- data/address-formatting/testcases/other/null.yaml +9 -0
- data/address_composer.gemspec +2 -2
- data/lib/address_composer/version.rb +1 -1
- metadata +285 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ff29a1fb1a5be6de0536d15665c65b35446cc59
|
4
|
+
data.tar.gz: 5aff1357c3033f2c68c05978317f23bbc72d9947
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ada0e4482655f7d0d0c8f9bb0d7755b10abd8e41e7b6c973e5c4ad3fc982a57268ad70f6520e11f1d4e9f22135cfd745ddc692f0e4167a437fdc2b79258dd41
|
7
|
+
data.tar.gz: 1d8f70916066338be173a8ffb3f6ab435280601303706880984a8100ddc14f8205903c1506ac0c4dfa405840e84189a783a553fe5a02572e0a0af56da7af39c4
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
address_composer (0.1.
|
4
|
+
address_composer (0.1.1.pre)
|
5
5
|
mustache (~> 1.1)
|
6
6
|
|
7
7
|
GEM
|
@@ -18,7 +18,7 @@ GEM
|
|
18
18
|
pry-byebug (3.9.0)
|
19
19
|
byebug (~> 11.0)
|
20
20
|
pry (~> 0.13.0)
|
21
|
-
rake (
|
21
|
+
rake (13.0.1)
|
22
22
|
rspec (3.9.0)
|
23
23
|
rspec-core (~> 3.9.0)
|
24
24
|
rspec-expectations (~> 3.9.0)
|
@@ -41,7 +41,7 @@ DEPENDENCIES
|
|
41
41
|
bundler (~> 1.17)
|
42
42
|
pry (~> 0.13)
|
43
43
|
pry-byebug (~> 3.9)
|
44
|
-
rake (~>
|
44
|
+
rake (~> 13.0)
|
45
45
|
rspec (~> 3.0)
|
46
46
|
|
47
47
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -54,7 +54,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
54
54
|
|
55
55
|
## Contributing
|
56
56
|
|
57
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/mirubiri
|
57
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/mirubiri/address_composer
|
58
58
|
|
59
59
|
|
60
60
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2020 Opencage GmbH - https://opencagedata.com
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# address formatting
|
2
|
+
|
3
|
+
### Overview
|
4
|
+
|
5
|
+
This project contains templates and test cases for address formats used in territories around the world. The templates can then be processed in any programming language ([see below for list of processors](#processing-logic)).
|
6
|
+
|
7
|
+
### Build Status
|
8
|
+
|
9
|
+
[![Build Status](https://travis-ci.org/OpenCageData/address-formatting.svg?branch=master)](https://travis-ci.org/OpenCageData/address-formatting)
|
10
|
+
|
11
|
+
### An example:
|
12
|
+
|
13
|
+
Given a set of address parts like
|
14
|
+
|
15
|
+
house_number: 17
|
16
|
+
road: Rue du Médecin-Colonel Calbairac
|
17
|
+
neighbourhood: Lafourguette
|
18
|
+
suburb: Toulouse Ouest
|
19
|
+
postcode: 31000
|
20
|
+
city: Toulouse
|
21
|
+
county: Toulouse
|
22
|
+
state: Midi-Pyrénées
|
23
|
+
country: France
|
24
|
+
country_code: FR
|
25
|
+
|
26
|
+
we want to write logic to compile an address in the format consumers expect
|
27
|
+
|
28
|
+
17 Rue du Médecin-Colonel Calbairac
|
29
|
+
31000 Toulouse
|
30
|
+
France
|
31
|
+
|
32
|
+
### Why would you want to do this?
|
33
|
+
|
34
|
+
The intended use case is database or geocoding systems (forward, reverse, autocomplete) where we know both the country of the address and the language of the user/reader. The address is displayed to a consumer (for example in an app) and not used to print on an envelope for actual postal delivery. We use it to format output from the [OpenCage Geocoder](https://opencagedata.com).
|
35
|
+
|
36
|
+
### Which addresses are we talking about?
|
37
|
+
|
38
|
+
We have to deal with
|
39
|
+
|
40
|
+
* incomplete data
|
41
|
+
* anything with a name (peaks, bridges, bus stops)
|
42
|
+
|
43
|
+
Unlike [physical post (office) mail](http://www.bitboost.com/ref/international-address-formats.html) we don't have to deal with
|
44
|
+
|
45
|
+
* apartment/flat number, floor numbers
|
46
|
+
* PO boxes
|
47
|
+
* translating the language of the (destination) address. Whatever language is input is output.
|
48
|
+
|
49
|
+
### Processing logic
|
50
|
+
|
51
|
+
Our goal with this repository is a series of (programming) language independent templates. Those templates can then be processed by whatever software you like.
|
52
|
+
|
53
|
+
There are open-source implementations in
|
54
|
+
|
55
|
+
* [Javascript](https://github.com/fragaria/address-formatter)
|
56
|
+
* [Perl](https://metacpan.org/release/Geo-Address-Formatter)
|
57
|
+
* [PHP](https://github.com/predicthq/address-formatter-php)
|
58
|
+
* [Rust](https://github.com/CanalTP/address-formatter-rs)
|
59
|
+
|
60
|
+
We would love more language implementations. The more people who use the templates, the more likely bugs will be reported.
|
61
|
+
If you write a processor, please submit a pull request adding it to the list. Thanks.
|
62
|
+
|
63
|
+
### International coverage
|
64
|
+
|
65
|
+
As of `Sun 17 Feb 2019` coverage is:
|
66
|
+
|
67
|
+
We are aware of 248 territories
|
68
|
+
We have tests for 248 (100%) territories
|
69
|
+
We have rules for 248 (100%) territories
|
70
|
+
0 (0%) territories have neither rules nor tests
|
71
|
+
|
72
|
+
This output is generated by `bin/coverage.pl`
|
73
|
+
|
74
|
+
We need more language specific abbreviations. Please see `conf/abbreviations`. Pull requests wil lbe glaldy received.
|
75
|
+
|
76
|
+
A detailed breakdown of test and configuration coverage can be found by running `bin/coverage.pl -d`. A list of all known territories is in `conf/country_codes.yaml`
|
77
|
+
|
78
|
+
_Please note: the list is simple all officially assigned [ISO 3166-1 alpha-2 codes](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements), and is not a political statement on whether or not these territories are or are not or should or should not be political states._
|
79
|
+
|
80
|
+
### File format
|
81
|
+
|
82
|
+
The files are in [YAML](http://yaml.org/) format. The templates are written in [Mustache](http://mustache.github.io/). Both formats are human readable, strict, solve escaping and support comments. YAML allows references (called "ankers") to avoid copy&paste, Mustache allows sub-templates (called "partials").
|
83
|
+
|
84
|
+
### How to add your country/territory
|
85
|
+
|
86
|
+
1. edit the .yaml testcase for the country/territory in `testcases/countries`. The file names correspond to the appropriate ISO 3166-1 alpha-2 code - see `conf/country_codes.yaml`
|
87
|
+
* a good way to get sample data is:
|
88
|
+
* find an addressed location (house, business, etc) in your
|
89
|
+
target territory in OpenStreetMap
|
90
|
+
* get the coordinates (lat, long) of the location
|
91
|
+
* put the coordinates into the [OpenCage Geocoder demo
|
92
|
+
page](https://opencagedata.com/demo)
|
93
|
+
* look at the resulting JSON in the *Raw Response* tab
|
94
|
+
|
95
|
+
2. edit `conf/countries/worldwide.yaml`
|
96
|
+
* Possibly your country/territory uses an existing generic format as
|
97
|
+
defined at the top of the file. If so, great, just map you
|
98
|
+
country_code to the generic template. You may still want to add
|
99
|
+
clean up code (see the entry for `DE` as an example).
|
100
|
+
* If not you need to define a new generic rule set
|
101
|
+
* possibly you will need to define new state/region mappings in `conf/state_codes.yaml`
|
102
|
+
|
103
|
+
3. to test you will now need to process the .yaml test via a processer
|
104
|
+
(see above) and ensure the input leads to the desired output.
|
105
|
+
|
106
|
+
If in doubt, please get in touch by submitting an issue.
|
107
|
+
|
108
|
+
### Formatting rules
|
109
|
+
|
110
|
+
Currently we support the following formatting rules:
|
111
|
+
|
112
|
+
* `replace:` regex that operates on the input values, useful for removing bureaucratic cruft like "London Borough of ". Note if you define the regex starting with format _X=_, for example _city=_ it should operate only on values with that key
|
113
|
+
* `postformat_replace:` regex that operates on the final output
|
114
|
+
* `add_component:` with a value of the form `component=XXXX`
|
115
|
+
* `change_country:` change the country value of the input, useful for dependent territories. Can include a substitution like `$state` so that that component value is then inserted into the new country value. See `testcases/countries/sh.yaml` for an example.
|
116
|
+
* `use_country:` use the formating configuration of another country, useful for dependent territories to avoid duplicating configuration
|
117
|
+
|
118
|
+
### The future
|
119
|
+
|
120
|
+
More tests! For every rule about addresses there are exceptions and edge cases to consider. More test cases are always needed.
|
121
|
+
|
122
|
+
Planned features:
|
123
|
+
|
124
|
+
* basic error checking, for example ignore things which obviously can not be postcodes
|
125
|
+
* define rules for postcode format specifically
|
126
|
+
|
127
|
+
We welcome your pull requests. Together we can address the world!
|
128
|
+
|
129
|
+
### License
|
130
|
+
|
131
|
+
This project is licensed under the MIT License - see the [LICENSE.txt](LICENSE.txt) file for details
|
132
|
+
|
133
|
+
### Further reading on the challenge of address
|
134
|
+
|
135
|
+
Here's [our blog post anouncing this project](https://blog.opencagedata.com/post/99059889253/good-looking-addresses-solving-the-berlin-berlin) and the motivations behind it.
|
136
|
+
|
137
|
+
You may enjoy Michael Tandy's [Falsehoods Programmers Believe about Addresses](http://www.mjt.me.uk/posts/falsehoods-programmers-believe-about-addresses/).
|
138
|
+
|
139
|
+
If it's actual address data you're after, check out [OpenStreetMap](https://www.openstreetmap.org) and [OpenAddresses](http://openaddresses.io/).
|
140
|
+
|
141
|
+
If you want to turn longitude, latitude into well formatted addresses or placenames, well that's what a geocoder does. Check out ours: [OpenCage Geocoder](https://opencagedata.com).
|
142
|
+
|
143
|
+
If all this convinces you that address are evil, please check out [what3words](http://what3words.com) which allows you to dispense with them entirely.
|
144
|
+
|
145
|
+
### Who is OpenCage GmbH?
|
146
|
+
|
147
|
+
<a href="https://opencagedata.com"><img src="opencage_logo_300_150.png"></a>
|
148
|
+
|
149
|
+
We run the [OpenCage Geocoder](https://opencagedata.com). Learn more [about us](https://opencagedata.com/about).
|
150
|
+
|
151
|
+
We also run [Geomob](https://thegeomob.com), a series of regular meetups for location based service creators, where we do our best to highlight geoinnovation. If you like geo stuff, you will probably enjoy [the Geomob podcast](https://thegeomob.com/podcast/).
|
152
|
+
|
153
|
+
|
@@ -0,0 +1,120 @@
|
|
1
|
+
#!/usr/bin/env perl
|
2
|
+
#
|
3
|
+
# scan the tests and templates and tell us which territories
|
4
|
+
# don't yet have rules and tests
|
5
|
+
#
|
6
|
+
use strict;
|
7
|
+
use warnings;
|
8
|
+
use utf8;
|
9
|
+
use feature "unicode_strings";
|
10
|
+
|
11
|
+
use Data::Dumper;
|
12
|
+
use Getopt::Long;
|
13
|
+
use File::Basename qw(dirname);
|
14
|
+
|
15
|
+
my $help = 0;
|
16
|
+
my $details = 0;
|
17
|
+
GetOptions (
|
18
|
+
'details' => \$details,
|
19
|
+
'help' => \$help,
|
20
|
+
) or die "invalid options";
|
21
|
+
|
22
|
+
if ($help) {
|
23
|
+
usage();
|
24
|
+
exit(0);
|
25
|
+
}
|
26
|
+
|
27
|
+
# get the list of countries
|
28
|
+
my %countries;
|
29
|
+
my $country_file = dirname(__FILE__) . "/../conf/country_codes.yaml";
|
30
|
+
open my $FH, "<:encoding(UTF-8)", $country_file or die "unable to open $country_file $!";
|
31
|
+
while (my $line = <$FH>){
|
32
|
+
chomp($line);
|
33
|
+
if ($line =~ m/^(\w\w): \# (.*)$/){
|
34
|
+
$countries{$1} = $2;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
close $FH;
|
38
|
+
my $total_countries = scalar(keys %countries);
|
39
|
+
print "We are aware of " . $total_countries . " territories \n";
|
40
|
+
|
41
|
+
|
42
|
+
# which countries have tests?
|
43
|
+
my $test_dir = dirname(__FILE__) . '/../testcases/countries';
|
44
|
+
opendir(my $dh, $test_dir) || die "Error: Couldn't opendir($test_dir): $!\n";
|
45
|
+
my @files = grep { -f "$test_dir/$_" } readdir($dh);
|
46
|
+
closedir($dh);
|
47
|
+
|
48
|
+
my %test_countries;
|
49
|
+
foreach my $f (sort @files){
|
50
|
+
$f =~ s/\.yaml//;
|
51
|
+
$f = uc($f);
|
52
|
+
$test_countries{$f} = 1;
|
53
|
+
}
|
54
|
+
my $test_countries = scalar(keys %test_countries);
|
55
|
+
my $test_perc = int(100 * $test_countries / $total_countries );
|
56
|
+
print "We have tests for " . $test_countries . ' ('
|
57
|
+
. $test_perc . '%) territories' . "\n";
|
58
|
+
if ($details){
|
59
|
+
print "We need tests for:\n";
|
60
|
+
foreach my $cc (sort keys %countries){
|
61
|
+
next if (defined($test_countries{$cc}));
|
62
|
+
print "\t" . $cc . "\t". $countries{$cc}. "\n";
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
# which countries have rules?
|
67
|
+
my $rules_file = dirname(__FILE__) . '/../conf/countries/worldwide.yaml';
|
68
|
+
open my $RFH, "<:encoding(UTF-8)", $rules_file or die "unable to open $rules_file $!";
|
69
|
+
my %rules;
|
70
|
+
while (my $line = <$RFH>){
|
71
|
+
chomp($line);
|
72
|
+
if ($line =~ m/^"?(\w\w)"?:\s*$/){
|
73
|
+
$rules{$1} = 1;
|
74
|
+
}
|
75
|
+
}
|
76
|
+
close $RFH;
|
77
|
+
my $rules_countries = scalar(keys %rules);
|
78
|
+
my $rules_perc = int(100 * $rules_countries / $total_countries );
|
79
|
+
print "We have rules for " . $rules_countries . ' ('
|
80
|
+
. $rules_perc . '%) territories' . "\n";
|
81
|
+
|
82
|
+
if ($details){
|
83
|
+
print "We need rules for:\n";
|
84
|
+
foreach my $cc (sort keys %countries){
|
85
|
+
next if (defined($rules{$cc}));
|
86
|
+
print "\t" . $cc . "\t". $countries{$cc}. "\n";
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
# find territories without rules or tests
|
91
|
+
my %neither;
|
92
|
+
foreach my $cc (sort keys %countries){
|
93
|
+
next if (defined($rules{$cc}));
|
94
|
+
next if (defined($test_countries{$cc}));
|
95
|
+
$neither{$cc} = 1;
|
96
|
+
}
|
97
|
+
my $neither_countries = scalar(keys %neither);
|
98
|
+
my $neither_perc = int(100 * $neither_countries / $total_countries );
|
99
|
+
print $neither_countries . ' (' . $neither_perc . '%) territories have neither rules nor tests' . "\n";
|
100
|
+
if ($details){
|
101
|
+
print "Territories with no test and no rules:\n";
|
102
|
+
foreach my $cc (sort keys %neither){
|
103
|
+
print "\t" . $cc . "\t". $countries{$cc}. "\n";
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
|
108
|
+
sub usage {
|
109
|
+
print "\tHow many territories have formatting rules and tests?\n";
|
110
|
+
print "\tBy default prints just a high level summary\n";
|
111
|
+
print "\tusage:\n";
|
112
|
+
print "\t\t no required parameters\n";
|
113
|
+
print "\n";
|
114
|
+
print "\t\t optional parameters:\n";
|
115
|
+
print "\t\t --detail\t print full list of countries missing rules and tests\n";
|
116
|
+
print "\t\t --help\t print this message \n";
|
117
|
+
print "\n";
|
118
|
+
}
|
119
|
+
|
120
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env perl
|
2
|
+
|
3
|
+
# copy of
|
4
|
+
# https://github.com/OpenCageData/perl-Geo-Address-Formatter/blob/master/t/unit/countries.t
|
5
|
+
# and runs in travis-CI (see .travis.yml)
|
6
|
+
|
7
|
+
use strict;
|
8
|
+
use lib 'perl/lib/perl5';
|
9
|
+
use File::Basename qw(basename dirname);
|
10
|
+
use File::Find::Rule;
|
11
|
+
use File::Spec;
|
12
|
+
use Test::Exception;
|
13
|
+
use Test::More;
|
14
|
+
use YAML::XS qw(LoadFile);
|
15
|
+
|
16
|
+
use utf8;
|
17
|
+
# nicer output for diag and failures, see
|
18
|
+
# http://perldoc.perl.org/Test/More.html#CAVEATS-and-NOTES
|
19
|
+
my $builder = Test::More->builder;
|
20
|
+
binmode $builder->output, ":utf8";
|
21
|
+
binmode $builder->failure_output, ":utf8";
|
22
|
+
binmode $builder->todo_output, ":utf8";
|
23
|
+
|
24
|
+
|
25
|
+
my $path = dirname(__FILE__) . '/../testcases';
|
26
|
+
|
27
|
+
my @files = File::Find::Rule->file()->name( '*.yaml' )->in( $path );
|
28
|
+
|
29
|
+
ok(scalar(@files), 'found at least one file');
|
30
|
+
|
31
|
+
my $CLASS = 'Geo::Address::Formatter';
|
32
|
+
use_ok($CLASS);
|
33
|
+
|
34
|
+
my $conf_path = dirname(__FILE__) . '/../conf';
|
35
|
+
my $GAF = $CLASS->new( conf_path => $conf_path );
|
36
|
+
|
37
|
+
sub _one_testcase {
|
38
|
+
my $country = shift;
|
39
|
+
my $rh_testcase = shift;
|
40
|
+
is(
|
41
|
+
$GAF->format_address($rh_testcase->{components}),
|
42
|
+
$rh_testcase->{expected},
|
43
|
+
$country . ' - ' . $rh_testcase->{description}
|
44
|
+
);
|
45
|
+
}
|
46
|
+
|
47
|
+
foreach my $filename (@files){
|
48
|
+
my $country = basename($filename);
|
49
|
+
$country =~ s/\.\w+$//; # us.yaml => us
|
50
|
+
|
51
|
+
my @a_testcases = ();
|
52
|
+
lives_ok {
|
53
|
+
@a_testcases = LoadFile($filename);
|
54
|
+
} "parsing file $filename";
|
55
|
+
|
56
|
+
foreach my $rh_testcase (@a_testcases){
|
57
|
+
_one_testcase($country, $rh_testcase);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
|
62
|
+
done_testing();
|