ar-eurostat-nuts 0.1.0.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/eurostat/nuts/configuration/configuration_missing_error.rb +11 -0
- data/lib/eurostat/nuts/configuration/parse_entries_data.rb +41 -0
- data/lib/eurostat/nuts/controls/entry/level_one.rb +30 -0
- data/lib/eurostat/nuts/controls/entry/level_three.rb +30 -0
- data/lib/eurostat/nuts/controls/entry/level_two.rb +30 -0
- data/lib/eurostat/nuts/controls/nuts_entries.rb +97 -0
- data/lib/eurostat/nuts/controls.rb +5 -0
- data/lib/eurostat/nuts/dataset/dataset.rb +15 -0
- data/lib/eurostat/nuts/dataset/nuts2021_nuts2024.yml +298 -0
- data/lib/eurostat/nuts/entry/entry.rb +16 -0
- data/lib/eurostat/nuts/entry/level_one.rb +14 -0
- data/lib/eurostat/nuts/entry/level_three.rb +24 -0
- data/lib/eurostat/nuts/entry/level_two.rb +19 -0
- data/lib/eurostat/nuts/locales/en.yml +2 -0
- data/lib/eurostat/nuts/nuts.rb +38 -0
- data/lib/eurostat/nuts/registry/build.rb +49 -0
- data/lib/eurostat/nuts/registry/normalize_label.rb +28 -0
- data/lib/eurostat/nuts/registry/registry.rb +21 -0
- data/lib/eurostat/nuts.rb +17 -0
- metadata +89 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: cd64747380b69197431e9dfe43a8fd2525e70f5bae94710db04843b0168268dd
|
|
4
|
+
data.tar.gz: 49943914177ab8a369de691efb2e0960fe4e65fcf3b926b2ee168456c7cc7cc6
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 4a4e471460fa3527ecc339b767e201f971fb4b28a7a30577f48d0fb4e77a93e7f8dacd78e006ac01471629401e9db7b621733f58b0cb6428c870522545764ea2
|
|
7
|
+
data.tar.gz: b1e296b26fca1cb0e5bf6e368a2c1b9335bc0d87178dfc532f48bd79a6efc5dd036e7e6957a36e620f9c102be392ecd587b725b737ef054524121a0793428e93
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
module Configuration
|
|
4
|
+
class ParseEntriesData
|
|
5
|
+
def self.call(data)
|
|
6
|
+
new.call(data)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(data)
|
|
10
|
+
nuts_data = flatten_countries_data(data)
|
|
11
|
+
|
|
12
|
+
normalized_nuts_data = nuts_data.flat_map(&method(:normalize_nuts_data))
|
|
13
|
+
entries = normalized_nuts_data.map(&method(:build_entry))
|
|
14
|
+
entries
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def flatten_countries_data(data)
|
|
20
|
+
data.flat_map { |_country_code, country_nuts_data| country_nuts_data }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def normalize_nuts_data(country_nuts_data)
|
|
24
|
+
country_nuts_data.map do |nuts_code, details|
|
|
25
|
+
level, label = details.values_at('level', 'label')
|
|
26
|
+
|
|
27
|
+
{
|
|
28
|
+
code: nuts_code,
|
|
29
|
+
level: level,
|
|
30
|
+
labels: Array(label)
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def build_entry(nuts_data)
|
|
36
|
+
NUTS::Entry.build(**nuts_data)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
module Controls
|
|
4
|
+
module Entry
|
|
5
|
+
module LevelOne
|
|
6
|
+
def self.example(**params)
|
|
7
|
+
attrs = attributes.merge(params)
|
|
8
|
+
NUTS::Entry::LevelOne.new(**attrs)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.attributes
|
|
12
|
+
{ code:, labels: }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.code
|
|
16
|
+
"ES2"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.label
|
|
20
|
+
"Noreste"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.labels
|
|
24
|
+
[label]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
module Controls
|
|
4
|
+
module Entry
|
|
5
|
+
module LevelThree
|
|
6
|
+
def self.example(**params)
|
|
7
|
+
attrs = attributes.merge(params)
|
|
8
|
+
NUTS::Entry::LevelThree.new(**attrs)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.attributes
|
|
12
|
+
{ code:, labels: }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.code
|
|
16
|
+
"ES211"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.label
|
|
20
|
+
"Álava"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.labels
|
|
24
|
+
[label, "Araba"]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
module Controls
|
|
4
|
+
module Entry
|
|
5
|
+
module LevelTwo
|
|
6
|
+
def self.example(**params)
|
|
7
|
+
attrs = attributes.merge(params)
|
|
8
|
+
NUTS::Entry::LevelTwo.new(**attrs)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.attributes
|
|
12
|
+
{ code:, labels: }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.code
|
|
16
|
+
"ES21"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.label
|
|
20
|
+
"País Vasco"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.labels
|
|
24
|
+
[label]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
module Controls
|
|
4
|
+
module NUTSEntries
|
|
5
|
+
def self.example
|
|
6
|
+
[
|
|
7
|
+
*Spain.nuts_entries,
|
|
8
|
+
*Poland.nuts_entries
|
|
9
|
+
]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module RawData
|
|
13
|
+
def self.example
|
|
14
|
+
{
|
|
15
|
+
Spain.country_code => Spain.raw_nuts_entries_data,
|
|
16
|
+
Poland.country_code => Poland.raw_nuts_entries_data,
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
module Spain
|
|
22
|
+
def self.country_code
|
|
23
|
+
"ES"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.nuts_entries
|
|
27
|
+
[
|
|
28
|
+
NUTS::Entry::LevelOne .new(code: "ES1", labels: ["Noroeste"]),
|
|
29
|
+
NUTS::Entry::LevelTwo .new(code: "ES11", labels: ["Galicia"]),
|
|
30
|
+
NUTS::Entry::LevelThree.new(code: "ES111", labels: ["A Coruña"]),
|
|
31
|
+
NUTS::Entry::LevelThree.new(code: "ES112", labels: ["Lugo"]),
|
|
32
|
+
NUTS::Entry::LevelOne .new(code: "ES2", labels: ["Noreste"]),
|
|
33
|
+
NUTS::Entry::LevelTwo .new(code: "ES21", labels: ["País Vasco"]),
|
|
34
|
+
NUTS::Entry::LevelThree.new(code: "ES211", labels: ["Álava", "Araba"]),
|
|
35
|
+
NUTS::Entry::LevelThree.new(code: "ES212", labels: ["Gipuzkoa"]),
|
|
36
|
+
NUTS::Entry::LevelOne .new(code: "ES3" , labels: ["Comunidad de Madrid"]),
|
|
37
|
+
NUTS::Entry::LevelTwo .new(code: "ES30" , labels: ["Comunidad de Madrid"]),
|
|
38
|
+
NUTS::Entry::LevelThree.new(code: "ES300", labels: ["Madrid"])
|
|
39
|
+
]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def self.raw_nuts_entries_data
|
|
43
|
+
{
|
|
44
|
+
"ES1" => { "level" => 1, "label" => "Noroeste" },
|
|
45
|
+
"ES11" => { "level" => 2, "label" => "Galicia" },
|
|
46
|
+
"ES111" => { "level" => 3, "label" => "A Coruña" },
|
|
47
|
+
"ES112" => { "level" => 3, "label" => "Lugo" },
|
|
48
|
+
"ES2" => { "level" => 1, "label" => "Noreste" },
|
|
49
|
+
"ES21" => { "level" => 2, "label" => "País Vasco" },
|
|
50
|
+
"ES211" => { "level" => 3, "label" => ["Álava", "Araba"] },
|
|
51
|
+
"ES212" => { "level" => 3, "label" => "Gipuzkoa" },
|
|
52
|
+
"ES3" => { "level" => 1, "label" => "Comunidad de Madrid" },
|
|
53
|
+
"ES30" => { "level" => 2, "label" => "Comunidad de Madrid" },
|
|
54
|
+
"ES300" => { "level" => 3, "label" => "Madrid" }
|
|
55
|
+
}
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
module Poland
|
|
60
|
+
def self.country_code
|
|
61
|
+
"PL"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.nuts_entries
|
|
65
|
+
[
|
|
66
|
+
NUTS::Entry::LevelOne .new(code: "PL5", labels: ["Makroregion południowo-zachodni"]),
|
|
67
|
+
NUTS::Entry::LevelTwo .new(code: "PL51", labels: ["Dolnośląskie"]),
|
|
68
|
+
NUTS::Entry::LevelThree.new(code: "PL514", labels: ["Miasto Wrocław"]),
|
|
69
|
+
NUTS::Entry::LevelThree.new(code: "PL515", labels: ["Jeleniogórski"]),
|
|
70
|
+
NUTS::Entry::LevelThree.new(code: "PL516", labels: ["Legnicko-głogowski"]),
|
|
71
|
+
NUTS::Entry::LevelOne .new(code: "PL9", labels: ["Makroregion województwo mazowieckie"]),
|
|
72
|
+
NUTS::Entry::LevelTwo .new(code: "PL91", labels: ["Warszawski stołeczny"]),
|
|
73
|
+
NUTS::Entry::LevelThree.new(code: "PL911", labels: ["Miasto Warszawa"]),
|
|
74
|
+
NUTS::Entry::LevelTwo .new(code: "PL92", labels: ["Mazowiecki regionalny"]),
|
|
75
|
+
NUTS::Entry::LevelThree.new(code: "PL926", labels: ["Żyrardowski"])
|
|
76
|
+
]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def self.raw_nuts_entries_data
|
|
80
|
+
{
|
|
81
|
+
"PL5" => { "level" => 1, "label" => "Makroregion południowo-zachodni" },
|
|
82
|
+
"PL51" => { "level" => 2, "label" => "Dolnośląskie" },
|
|
83
|
+
"PL514" => { "level" => 3, "label" => "Miasto Wrocław" },
|
|
84
|
+
"PL515" => { "level" => 3, "label" => "Jeleniogórski" },
|
|
85
|
+
"PL516" => { "level" => 3, "label" => "Legnicko-głogowski" },
|
|
86
|
+
"PL9" => { "level" => 1, "label" => "Makroregion województwo mazowieckie" },
|
|
87
|
+
"PL91" => { "level" => 2, "label" => "Warszawski stołeczny" },
|
|
88
|
+
"PL911" => { "level" => 3, "label" => "Miasto Warszawa" },
|
|
89
|
+
"PL92" => { "level" => 2, "label" => "Mazowiecki regionalny" },
|
|
90
|
+
"PL926" => { "level" => 3, "label" => "Żyrardowski" }
|
|
91
|
+
}
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
---
|
|
2
|
+
ES:
|
|
3
|
+
ES1:
|
|
4
|
+
level: 1
|
|
5
|
+
label: Noroeste
|
|
6
|
+
ES11:
|
|
7
|
+
level: 2
|
|
8
|
+
label: Galicia
|
|
9
|
+
ES111:
|
|
10
|
+
level: 3
|
|
11
|
+
label:
|
|
12
|
+
- A Coruña
|
|
13
|
+
- Coruña
|
|
14
|
+
- Corunna
|
|
15
|
+
ES112:
|
|
16
|
+
level: 3
|
|
17
|
+
label: Lugo
|
|
18
|
+
ES113:
|
|
19
|
+
level: 3
|
|
20
|
+
label:
|
|
21
|
+
- Ourense
|
|
22
|
+
- Orense
|
|
23
|
+
ES114:
|
|
24
|
+
level: 3
|
|
25
|
+
label: Pontevedra
|
|
26
|
+
ES12:
|
|
27
|
+
level: 2
|
|
28
|
+
label: Principado de Asturias
|
|
29
|
+
ES120:
|
|
30
|
+
level: 3
|
|
31
|
+
label: Asturias
|
|
32
|
+
ES13:
|
|
33
|
+
level: 2
|
|
34
|
+
label: Cantabria
|
|
35
|
+
ES130:
|
|
36
|
+
level: 3
|
|
37
|
+
label: Cantabria
|
|
38
|
+
ES2:
|
|
39
|
+
level: 1
|
|
40
|
+
label: Noreste
|
|
41
|
+
ES21:
|
|
42
|
+
level: 2
|
|
43
|
+
label: País Vasco
|
|
44
|
+
ES211:
|
|
45
|
+
level: 3
|
|
46
|
+
label:
|
|
47
|
+
- Araba
|
|
48
|
+
- Álava
|
|
49
|
+
ES212:
|
|
50
|
+
level: 3
|
|
51
|
+
label:
|
|
52
|
+
- Gipuzkoa
|
|
53
|
+
- Guipúzcoa
|
|
54
|
+
ES213:
|
|
55
|
+
level: 3
|
|
56
|
+
label:
|
|
57
|
+
- Bizkaia
|
|
58
|
+
- Vizcaya
|
|
59
|
+
- Biscay
|
|
60
|
+
ES22:
|
|
61
|
+
level: 2
|
|
62
|
+
label: Comunidad Foral de Navarra
|
|
63
|
+
ES220:
|
|
64
|
+
level: 3
|
|
65
|
+
label:
|
|
66
|
+
- Navarra
|
|
67
|
+
- Navarre
|
|
68
|
+
ES23:
|
|
69
|
+
level: 2
|
|
70
|
+
label: La Rioja
|
|
71
|
+
ES230:
|
|
72
|
+
level: 3
|
|
73
|
+
label: La Rioja
|
|
74
|
+
ES24:
|
|
75
|
+
level: 2
|
|
76
|
+
label: Aragón
|
|
77
|
+
ES241:
|
|
78
|
+
level: 3
|
|
79
|
+
label: Huesca
|
|
80
|
+
ES242:
|
|
81
|
+
level: 3
|
|
82
|
+
label: Teruel
|
|
83
|
+
ES243:
|
|
84
|
+
level: 3
|
|
85
|
+
label:
|
|
86
|
+
- Zaragoza
|
|
87
|
+
- Saragossa
|
|
88
|
+
ES3:
|
|
89
|
+
level: 1
|
|
90
|
+
label: Comunidad de Madrid
|
|
91
|
+
ES30:
|
|
92
|
+
level: 2
|
|
93
|
+
label: Comunidad de Madrid
|
|
94
|
+
ES300:
|
|
95
|
+
level: 3
|
|
96
|
+
label: Madrid
|
|
97
|
+
ES4:
|
|
98
|
+
level: 1
|
|
99
|
+
label: Centro (ES)
|
|
100
|
+
ES41:
|
|
101
|
+
level: 2
|
|
102
|
+
label: Castilla y León
|
|
103
|
+
ES411:
|
|
104
|
+
level: 3
|
|
105
|
+
label: Ávila
|
|
106
|
+
ES412:
|
|
107
|
+
level: 3
|
|
108
|
+
label: Burgos
|
|
109
|
+
ES413:
|
|
110
|
+
level: 3
|
|
111
|
+
label: León
|
|
112
|
+
ES414:
|
|
113
|
+
level: 3
|
|
114
|
+
label: Palencia
|
|
115
|
+
ES415:
|
|
116
|
+
level: 3
|
|
117
|
+
label: Salamanca
|
|
118
|
+
ES416:
|
|
119
|
+
level: 3
|
|
120
|
+
label: Segovia
|
|
121
|
+
ES417:
|
|
122
|
+
level: 3
|
|
123
|
+
label: Soria
|
|
124
|
+
ES418:
|
|
125
|
+
level: 3
|
|
126
|
+
label: Valladolid
|
|
127
|
+
ES419:
|
|
128
|
+
level: 3
|
|
129
|
+
label: Zamora
|
|
130
|
+
ES42:
|
|
131
|
+
level: 2
|
|
132
|
+
label:
|
|
133
|
+
- Castilla-La Mancha
|
|
134
|
+
- Castille-La Mancha
|
|
135
|
+
ES421:
|
|
136
|
+
level: 3
|
|
137
|
+
label: Albacete
|
|
138
|
+
ES422:
|
|
139
|
+
level: 3
|
|
140
|
+
label: Ciudad Real
|
|
141
|
+
ES423:
|
|
142
|
+
level: 3
|
|
143
|
+
label: Cuenca
|
|
144
|
+
ES424:
|
|
145
|
+
level: 3
|
|
146
|
+
label: Guadalajara
|
|
147
|
+
ES425:
|
|
148
|
+
level: 3
|
|
149
|
+
label: Toledo
|
|
150
|
+
ES43:
|
|
151
|
+
level: 2
|
|
152
|
+
label: Extremadura
|
|
153
|
+
ES431:
|
|
154
|
+
level: 3
|
|
155
|
+
label: Badajoz
|
|
156
|
+
ES432:
|
|
157
|
+
level: 3
|
|
158
|
+
label: Cáceres
|
|
159
|
+
ES5:
|
|
160
|
+
level: 1
|
|
161
|
+
label: Este
|
|
162
|
+
ES51:
|
|
163
|
+
level: 2
|
|
164
|
+
label:
|
|
165
|
+
- Cataluña
|
|
166
|
+
- Catalonia
|
|
167
|
+
ES511:
|
|
168
|
+
level: 3
|
|
169
|
+
label: Barcelona
|
|
170
|
+
ES512:
|
|
171
|
+
level: 3
|
|
172
|
+
label:
|
|
173
|
+
- Girona
|
|
174
|
+
- Gerona
|
|
175
|
+
ES513:
|
|
176
|
+
level: 3
|
|
177
|
+
label:
|
|
178
|
+
- Lleida
|
|
179
|
+
- Lérida
|
|
180
|
+
ES514:
|
|
181
|
+
level: 3
|
|
182
|
+
label: Tarragona
|
|
183
|
+
ES52:
|
|
184
|
+
level: 2
|
|
185
|
+
label: 'Comunitat Valenciana '
|
|
186
|
+
ES521:
|
|
187
|
+
level: 3
|
|
188
|
+
label:
|
|
189
|
+
- Alicante
|
|
190
|
+
- Alacant
|
|
191
|
+
ES522:
|
|
192
|
+
level: 3
|
|
193
|
+
label:
|
|
194
|
+
- Castellón
|
|
195
|
+
- Castelló
|
|
196
|
+
ES523:
|
|
197
|
+
level: 3
|
|
198
|
+
label:
|
|
199
|
+
- Valencia
|
|
200
|
+
- València
|
|
201
|
+
ES53:
|
|
202
|
+
level: 2
|
|
203
|
+
label: Illes Balears
|
|
204
|
+
ES531:
|
|
205
|
+
level: 3
|
|
206
|
+
label: Eivissa y Formentera
|
|
207
|
+
ES532:
|
|
208
|
+
level: 3
|
|
209
|
+
label: Mallorca
|
|
210
|
+
ES533:
|
|
211
|
+
level: 3
|
|
212
|
+
label: Menorca
|
|
213
|
+
ES6:
|
|
214
|
+
level: 1
|
|
215
|
+
label: Sur
|
|
216
|
+
ES61:
|
|
217
|
+
level: 2
|
|
218
|
+
label: Andalucía
|
|
219
|
+
ES611:
|
|
220
|
+
level: 3
|
|
221
|
+
label: Almería
|
|
222
|
+
ES612:
|
|
223
|
+
level: 3
|
|
224
|
+
label: Cádiz
|
|
225
|
+
ES613:
|
|
226
|
+
level: 3
|
|
227
|
+
label: Córdoba
|
|
228
|
+
ES614:
|
|
229
|
+
level: 3
|
|
230
|
+
label: Granada
|
|
231
|
+
ES615:
|
|
232
|
+
level: 3
|
|
233
|
+
label: Huelva
|
|
234
|
+
ES616:
|
|
235
|
+
level: 3
|
|
236
|
+
label: Jaén
|
|
237
|
+
ES617:
|
|
238
|
+
level: 3
|
|
239
|
+
label: Málaga
|
|
240
|
+
ES618:
|
|
241
|
+
level: 3
|
|
242
|
+
label:
|
|
243
|
+
- Sevilla
|
|
244
|
+
- Seville
|
|
245
|
+
ES62:
|
|
246
|
+
level: 2
|
|
247
|
+
label: Región de Murcia
|
|
248
|
+
ES620:
|
|
249
|
+
level: 3
|
|
250
|
+
label: Murcia
|
|
251
|
+
ES63:
|
|
252
|
+
level: 2
|
|
253
|
+
label: Ciudad de Ceuta
|
|
254
|
+
ES630:
|
|
255
|
+
level: 3
|
|
256
|
+
label: Ceuta
|
|
257
|
+
ES64:
|
|
258
|
+
level: 2
|
|
259
|
+
label: Ciudad de Melilla
|
|
260
|
+
ES640:
|
|
261
|
+
level: 3
|
|
262
|
+
label: Melilla
|
|
263
|
+
ES7:
|
|
264
|
+
level: 1
|
|
265
|
+
label: Canarias
|
|
266
|
+
ES70:
|
|
267
|
+
level: 2
|
|
268
|
+
label: Canarias
|
|
269
|
+
ES703:
|
|
270
|
+
level: 3
|
|
271
|
+
label: El Hierro
|
|
272
|
+
ES704:
|
|
273
|
+
level: 3
|
|
274
|
+
label: Fuerteventura
|
|
275
|
+
ES705:
|
|
276
|
+
level: 3
|
|
277
|
+
label: Gran Canaria
|
|
278
|
+
ES706:
|
|
279
|
+
level: 3
|
|
280
|
+
label: La Gomera
|
|
281
|
+
ES707:
|
|
282
|
+
level: 3
|
|
283
|
+
label: La Palma
|
|
284
|
+
ES708:
|
|
285
|
+
level: 3
|
|
286
|
+
label: Lanzarote
|
|
287
|
+
ES709:
|
|
288
|
+
level: 3
|
|
289
|
+
label: Tenerife
|
|
290
|
+
ESZ:
|
|
291
|
+
level: 1
|
|
292
|
+
label: Extra-Regio NUTS 1
|
|
293
|
+
ESZZ:
|
|
294
|
+
level: 2
|
|
295
|
+
label: Extra-Regio NUTS 2
|
|
296
|
+
ESZZZ:
|
|
297
|
+
level: 3
|
|
298
|
+
label: Extra-Regio NUTS 3
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
module Entry
|
|
4
|
+
def self.build(code:, labels:, level:)
|
|
5
|
+
entry_cls =
|
|
6
|
+
case level
|
|
7
|
+
when 1 then LevelOne
|
|
8
|
+
when 2 then LevelTwo
|
|
9
|
+
when 3 then LevelThree
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
entry_cls.new(code, labels)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
module Entry
|
|
4
|
+
class LevelThree < Data.define(:code, :labels)
|
|
5
|
+
def level = 3
|
|
6
|
+
def label = labels.first
|
|
7
|
+
|
|
8
|
+
def level_one_projection
|
|
9
|
+
level_one_code = code[...-2]
|
|
10
|
+
NUTS.registry.get(level_one_code)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def level_two_projection
|
|
14
|
+
level_two_code = code[...-1]
|
|
15
|
+
NUTS.registry.get(level_two_code)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def level_three_projection
|
|
19
|
+
self
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
module Entry
|
|
4
|
+
class LevelTwo < Data.define(:code, :labels)
|
|
5
|
+
def level = 2
|
|
6
|
+
def label = labels.first
|
|
7
|
+
|
|
8
|
+
def level_one_projection
|
|
9
|
+
level_one_code = code[...-1]
|
|
10
|
+
NUTS.registry.get(level_one_code)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def level_two_projection
|
|
14
|
+
self
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
def self.configure(nuts_data)
|
|
4
|
+
nuts_entries = Configuration::ParseEntriesData.(nuts_data)
|
|
5
|
+
@registry = Registry.build(nuts_entries)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.registry
|
|
9
|
+
raise Configuration::ConfigurationMissingError unless instance_variable_defined?(:@registry)
|
|
10
|
+
|
|
11
|
+
@registry
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.get_label(code)
|
|
15
|
+
registry.get(code)&.label
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.find_code(label)
|
|
19
|
+
registry.find(label)&.code
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.find_code_for_level(label, level)
|
|
23
|
+
entry = registry.find(label)
|
|
24
|
+
|
|
25
|
+
projection_method =
|
|
26
|
+
case level
|
|
27
|
+
when 1 then :level_one_projection
|
|
28
|
+
when 2 then :level_two_projection
|
|
29
|
+
when 3 then :level_three_projection
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
return nil unless projection_method && entry.respond_to?(projection_method)
|
|
33
|
+
|
|
34
|
+
projected_entry = entry.public_send(projection_method)
|
|
35
|
+
projected_entry&.code
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Eurostat
|
|
4
|
+
module NUTS
|
|
5
|
+
class Registry
|
|
6
|
+
module Build
|
|
7
|
+
SKIP_FOR_LABELS = [
|
|
8
|
+
"Extra-Regio NUTS 1",
|
|
9
|
+
"Extra-Regio NUTS 2",
|
|
10
|
+
"Extra-Regio NUTS 3"
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
def build(nuts_entries)
|
|
14
|
+
code_registry = index_by_code(nuts_entries)
|
|
15
|
+
label_registry = index_by_labels(nuts_entries)
|
|
16
|
+
|
|
17
|
+
Registry.new(code_registry, label_registry)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def index_by_code(nuts_entries)
|
|
23
|
+
nuts_entries.to_h { |nuts_entry| [nuts_entry.code, nuts_entry] }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def index_by_labels(nuts_entries)
|
|
27
|
+
nuts_entries
|
|
28
|
+
.map { |entry| [entry.labels, entry] }
|
|
29
|
+
.flat_map { |labels, entry| labels.product([entry]) }
|
|
30
|
+
.to_h { |label, entry| [normalize(label), entry] }
|
|
31
|
+
.tap { |entry_by_label| remove_extra_regio_entries(entry_by_label) }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def normalize(label)
|
|
35
|
+
NormalizeLabel.(label)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Entries with labels 'Extra-Regio NUTS 1', 'Extra-Regio NUTS 2', 'Extra-Regio NUTS 3'
|
|
39
|
+
# exist in each country. This ambiguity makes it not deterministic to fetch entry by
|
|
40
|
+
# one of this labels.
|
|
41
|
+
def remove_extra_regio_entries(entry_by_label)
|
|
42
|
+
SKIP_FOR_LABELS
|
|
43
|
+
.map { |avoid_label| normalize(avoid_label) }
|
|
44
|
+
.each { |normalized_avoid_label| entry_by_label.delete(normalized_avoid_label) }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
class Registry
|
|
4
|
+
module NormalizeLabel
|
|
5
|
+
def self.call(label)
|
|
6
|
+
label
|
|
7
|
+
.then(&method(:to_ascii))
|
|
8
|
+
.then(&method(:alphanumeric_only))
|
|
9
|
+
.then(&method(:snake_case))
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.to_ascii(str)
|
|
13
|
+
I18n.transliterate(str)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.alphanumeric_only(str)
|
|
17
|
+
alphanumeric = str.gsub(/[_\W]/, ' ')
|
|
18
|
+
alphanumeric.strip
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.snake_case(str)
|
|
22
|
+
underlined = str.gsub(/\s+/, '_')
|
|
23
|
+
underlined.downcase
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Eurostat
|
|
2
|
+
module NUTS
|
|
3
|
+
class Registry
|
|
4
|
+
extend Build
|
|
5
|
+
|
|
6
|
+
def initialize(code_registry, label_registry)
|
|
7
|
+
@code_registry = code_registry
|
|
8
|
+
@label_registry = label_registry
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def get(code)
|
|
12
|
+
@code_registry[code]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def find(label)
|
|
16
|
+
normalized_label = NormalizeLabel.(label)
|
|
17
|
+
@label_registry[normalized_label]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
require 'i18n' # I18n.transliterate
|
|
3
|
+
I18n.load_path << File.expand_path("nuts/locales/en.yml", __dir__)
|
|
4
|
+
|
|
5
|
+
require 'eurostat/nuts/nuts'
|
|
6
|
+
require 'eurostat/nuts/configuration/configuration_missing_error'
|
|
7
|
+
require 'eurostat/nuts/configuration/parse_entries_data'
|
|
8
|
+
require 'eurostat/nuts/dataset/dataset'
|
|
9
|
+
|
|
10
|
+
require 'eurostat/nuts/entry/entry'
|
|
11
|
+
require 'eurostat/nuts/entry/level_one'
|
|
12
|
+
require 'eurostat/nuts/entry/level_two'
|
|
13
|
+
require 'eurostat/nuts/entry/level_three'
|
|
14
|
+
|
|
15
|
+
require 'eurostat/nuts/registry/build'
|
|
16
|
+
require 'eurostat/nuts/registry/registry'
|
|
17
|
+
require 'eurostat/nuts/registry/normalize_label'
|
metadata
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: ar-eurostat-nuts
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0.alpha
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Alexander Repnikov
|
|
8
|
+
- Eloy Rojas Bartolomé
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: i18n
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.14'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.14'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: minitest
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '5.25'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '5.25'
|
|
41
|
+
description: Provides an interface to fetch NUTS numbers (Nomenclature of territorial
|
|
42
|
+
units for statistics)
|
|
43
|
+
email: aleksander.repnikov@gmail.com
|
|
44
|
+
executables: []
|
|
45
|
+
extensions: []
|
|
46
|
+
extra_rdoc_files: []
|
|
47
|
+
files:
|
|
48
|
+
- lib/eurostat/nuts.rb
|
|
49
|
+
- lib/eurostat/nuts/configuration/configuration_missing_error.rb
|
|
50
|
+
- lib/eurostat/nuts/configuration/parse_entries_data.rb
|
|
51
|
+
- lib/eurostat/nuts/controls.rb
|
|
52
|
+
- lib/eurostat/nuts/controls/entry/level_one.rb
|
|
53
|
+
- lib/eurostat/nuts/controls/entry/level_three.rb
|
|
54
|
+
- lib/eurostat/nuts/controls/entry/level_two.rb
|
|
55
|
+
- lib/eurostat/nuts/controls/nuts_entries.rb
|
|
56
|
+
- lib/eurostat/nuts/dataset/dataset.rb
|
|
57
|
+
- lib/eurostat/nuts/dataset/nuts2021_nuts2024.yml
|
|
58
|
+
- lib/eurostat/nuts/entry/entry.rb
|
|
59
|
+
- lib/eurostat/nuts/entry/level_one.rb
|
|
60
|
+
- lib/eurostat/nuts/entry/level_three.rb
|
|
61
|
+
- lib/eurostat/nuts/entry/level_two.rb
|
|
62
|
+
- lib/eurostat/nuts/locales/en.yml
|
|
63
|
+
- lib/eurostat/nuts/nuts.rb
|
|
64
|
+
- lib/eurostat/nuts/registry/build.rb
|
|
65
|
+
- lib/eurostat/nuts/registry/normalize_label.rb
|
|
66
|
+
- lib/eurostat/nuts/registry/registry.rb
|
|
67
|
+
homepage: https://github.com/arepnikov/eurostat-nuts
|
|
68
|
+
licenses:
|
|
69
|
+
- MIT
|
|
70
|
+
metadata: {}
|
|
71
|
+
rdoc_options: []
|
|
72
|
+
require_paths:
|
|
73
|
+
- lib
|
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
75
|
+
requirements:
|
|
76
|
+
- - ">="
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: 2.7.0
|
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
|
+
requirements:
|
|
81
|
+
- - ">="
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
version: '0'
|
|
84
|
+
requirements: []
|
|
85
|
+
rubygems_version: 3.6.7
|
|
86
|
+
specification_version: 4
|
|
87
|
+
summary: Provides an interface to fetch NUTS numbers (Nomenclature of territorial
|
|
88
|
+
units for statistics)
|
|
89
|
+
test_files: []
|