worlddb 0.6.0 → 0.6.1

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.
@@ -21,7 +21,7 @@ pe, Prince Edward Island, 5686, eastern canada|atlantic canada|maritimes
21
21
  nl, Newfoundland and Labrador, 370511, eastern canada|atlantic canada
22
22
 
23
23
  on, Ontario, 908608, eastern canada|central canada
24
- qc, Québec 1356547, eastern canada|central canada
24
+ qc, Québec, 1356547, eastern canada|central canada
25
25
 
26
26
  nt, Northwest Territories, 1143793, northern canada|territories
27
27
  yt, Yukon, 474713, northern canada|territories
@@ -22,7 +22,7 @@ sv, El Salvador, SLV
22
22
 
23
23
  ar, Argentina, ARG, 2780400, 40518425, south america|es
24
24
  bo, Bolivia, BOL, 1098581, 10907778, south america|es
25
- br, Brazil, BRA, 8514215, 192380000, south america|pt-br
25
+ br, Brazil, BRA, 8514215, 192380000, south america|pt
26
26
  cl, Chile, CHI, 755696, 16763470, south america|es
27
27
  co, Colombia, COL, 1138748, 46413791, south america|es
28
28
  ec, Ecuador, ECU, 258238, 15007343, south america|es
@@ -70,7 +70,7 @@ ad, Andorra, AND, 468, 85_082
70
70
  al, Albania, ALB, 28_748, 3_002_859
71
71
  by, Belarus, BLR, 207_600, 9_643_566
72
72
  ch, Switzerland, SUI, 41_285, 7_866_500, schengen|uefa|un # NB: ISO (CHE) <> FIFA (SUI)
73
- hr, Croatia, CRO, 56_594, 4_290_612 # NB: ISO (HRV) <> FIFA (CRO); local name: Hrvatska
73
+ hr, Croatia, CRO, 56_594, 4_290_612 # NB: ISO (HRV) <> FIFA (CRO); local name: Hrvatska
74
74
  rs, Serbia, SRB, 88_361, 7_276_604
75
75
  ru, Russia, RUS, 17_098_242, 142_517_670, asia|g8|g20
76
76
  tr, Turkey, TUR, 783_562, 79_749_461, asia
@@ -1,7 +1,7 @@
1
1
  # top 10 cities
2
2
 
3
3
  paris, Paris, region:if, 2_234_105, m:10_755_000
4
- marseille, Marseille region:ac, 850_602, m: 1_582_000
4
+ marseille, Marseille, region:ac, 850_602, m: 1_582_000
5
5
  lyon, Lyon, region:ra, 479_803, m: 1_542_000
6
6
  toulouse, Toulouse, region:mp, 440_204, m: 880_000
7
7
  nice, Nice, region:ac, 340_735, m: 962_000
@@ -10,6 +10,7 @@ class Region < ActiveRecord::Base
10
10
  has_many :tags, :through => :taggings
11
11
 
12
12
  validates :key, :format => { :with => /^[a-z]{2,}$/, :message => 'expected two or more lowercase letters a-z' }
13
+ validates :code, :format => { :with => /^[A-Z_]{2,3}$/, :message => 'expected two or three uppercase letters A-Z (and _)' }, :allow_nil => true
13
14
 
14
15
  def self.create_from_ary!( regions, more_values={} )
15
16
  regions.each do |values|
@@ -140,6 +140,11 @@ private
140
140
  reader.each_line do |attribs, values|
141
141
 
142
142
  value_numbers = []
143
+
144
+ ### todo: remove attribs[:tags] from attribs? lets us pass in "default" tags - why? why not?
145
+ ##
146
+
147
+ value_tags = []
143
148
 
144
149
  if clazz == City
145
150
  attribs[ :c ] = true # assume city type by default (use metro,district to change in fixture)
@@ -151,7 +156,8 @@ private
151
156
  values.each_with_index do |value,index|
152
157
  if value =~ /^region:/ ## region:
153
158
  value_region_key = value[7..-1] ## cut off region: prefix
154
- value_region = Region.find_by_key!( value_region_key )
159
+ ## NB: requires country_id to make unique!
160
+ value_region = Region.find_by_key_and_country_id!( value_region_key, attribs[:country_id] )
155
161
  attribs[ :region_id ] = value_region.id
156
162
  elsif value =~ /^metro$/ ## metro(politan area)
157
163
  attribs[ :c ] = false # turn off default c|city flag; make it m|metro only
@@ -184,15 +190,35 @@ private
184
190
  value_popm = value_popm_str.gsub(/[ _]/, '').to_i
185
191
  attribs[ :popm ] = value_popm
186
192
  attribs[ :m ] = true # auto-mark city as m|metro too
187
- elsif value =~ /^[A-Z]{3}$/ ## assume three-letter code
193
+ elsif value =~ /^[A-Z]{2,3}$/ ## assume two or three-letter code
188
194
  attribs[ :code ] = value
189
195
  elsif value =~ /(^[0-9]{1,2}$)|(^[0-9][0-9 _]+[0-9]$)/ ## numeric (nb: can use any _ or spaces inside digits e.g. 1_000_000 or 1 000 000)
190
196
  value_numbers << value.gsub(/[ _]/, '').to_i
191
- elsif (values.size==(index+3)) && value =~ /^[a-z0-9\|_ ]+$/ # tags must be last entry
192
- puts " skipping tags: #{value}"
197
+ elsif (values.size==(index+1)) && value =~ /^[a-z0-9\|_ ]+$/ # tags must be last entry
198
+
199
+ puts " processing tags: >>#{value}<<..."
200
+
201
+ tag_keys = value.split('|')
202
+
203
+ ## unify; replace _w/ space; remove leading n trailing whitespace
204
+ tag_keys = tag_keys.map do |key|
205
+ key = key.gsub( '_', ' ' )
206
+ key = key.strip
207
+ key
208
+ end
209
+
210
+ tag_keys.each do |key|
211
+ tag = Tag.find_by_key( key )
212
+ if tag.nil? # create tag if it doesn't exit
213
+ puts " creating tag >#{key}<"
214
+ tag = Tag.create!( key: key )
215
+ end
216
+ value_tags << tag
217
+ end
218
+
193
219
  else
194
220
  # issue warning: unknown type for value
195
- puts "*** warning: unknown type for value >#{value}<"
221
+ puts "!!!! >>>> warning: unknown type for value >#{value}<"
196
222
  end
197
223
  end
198
224
 
@@ -206,7 +232,15 @@ private
206
232
  end
207
233
  end
208
234
 
209
- rec = clazz.find_by_key( attribs[ :key ] )
235
+ rec = nil
236
+
237
+ if clazz == Region ## requires country_id
238
+ ## todo: assert that country_id is present/valid, that is, NOT null
239
+ rec = clazz.find_by_key_and_country_id( attribs[ :key ], attribs[ :country_id] )
240
+ else
241
+ rec = clazz.find_by_key( attribs[ :key ] )
242
+ end
243
+
210
244
  if rec.present?
211
245
  ## nb: [17..-1] cut off WorldDB::Models:: in name
212
246
  puts "*** update #{clazz.name[17..-1].downcase} #{rec.id}-#{rec.key}:"
@@ -218,6 +252,14 @@ private
218
252
  puts attribs.to_json
219
253
 
220
254
  rec.update_attributes!( attribs )
255
+
256
+ ## add tags
257
+
258
+ value_tags.each do |tag|
259
+ rec.tags << tag
260
+ end
261
+
262
+ ### fix/todo: check tag_ids and only update diff (add/remove ids)
221
263
 
222
264
  end # each_line
223
265
 
@@ -27,10 +27,14 @@ create_table :countries do |t|
27
27
  t.string :motor # optional auto motor (vehicle) licene plate
28
28
  end
29
29
 
30
+ add_index :countries, :key, :unique => true
31
+ add_index :countries, :code, :unique => true
32
+
33
+
30
34
  create_table :regions do |t|
31
35
  t.string :title, :null => false
32
36
  t.string :key, :null => false
33
- t.string :code # short three letter code
37
+ t.string :code # short two or three letter code e.g. NY, OAX, etc.
34
38
  t.string :synonyms # comma separated list of synonyms
35
39
  t.references :country, :null => false
36
40
  t.integer :pop # optional population count
@@ -38,6 +42,9 @@ create_table :regions do |t|
38
42
  t.timestamps
39
43
  end
40
44
 
45
+ add_index :regions, [:key, :country_id], :unique => true
46
+
47
+
41
48
  create_table :cities do |t|
42
49
  t.string :title, :null => false
43
50
  t.string :key, :null => false
@@ -66,6 +73,8 @@ create_table :tags do |t|
66
73
  t.timestamps
67
74
  end
68
75
 
76
+ add_index :tags, :key, :unique => true
77
+
69
78
  create_table :taggings do |t|
70
79
  t.references :tag, :null => false
71
80
  t.references :taggable, :polymorphic => true
@@ -1,5 +1,5 @@
1
1
 
2
2
  module WorldDB
3
- VERSION = '0.6.0'
3
+ VERSION = '0.6.1'
4
4
  end
5
5
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: worlddb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 5
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 0
10
- version: 0.6.0
9
+ - 1
10
+ version: 0.6.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gerald Bauer