worlddb 2.0.7 → 2.0.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: af58d58c38775a19ef1a319c7a2964dfb38f690d
4
- data.tar.gz: 5370d2cd74dab599b22b62413fffdb57372d259d
3
+ metadata.gz: e7c9137d81e29c751381a6a489626e295cea4619
4
+ data.tar.gz: c8fb56e5b4f5bcf7e8364c67c4f795a01d464053
5
5
  SHA512:
6
- metadata.gz: f59a8cf313525cb89e6d7ebfac67e6bc2329b26cc17d3ee0ecaf5e026298ab43a50c6cfb6163e88b23fabdc34a656e0c77720e90a917a1daa127b2f3183cb325
7
- data.tar.gz: f030026f39270272136a0b68556c093c4a5264e670c088235cbfad7ac88e6fae5e5c687161654acf0c5411af3c4e19c7dc82c8bb6c1810402cf1aec0fc50f81e
6
+ metadata.gz: e338f8332bad32c4e567f4fe7c754e9f90a0ee0fa3d790b9ad59ca856dfcb28d6e2a0bcad0c74ed8ab10245b498b4d4d70dfb17ce971288a717b8573e417b065
7
+ data.tar.gz: 86ad1f3b50b857a9540320b339a1ef4ee4bcebd2c2d9aa9ff3b71384e638c748003cfba65cf9f7e042dc23c8c8cacd71b9aecab7d9e70320ab92159bfb23d881
@@ -14,6 +14,7 @@ lib/worlddb/models/city_comp.rb
14
14
  lib/worlddb/models/continent.rb
15
15
  lib/worlddb/models/continent_comp.rb
16
16
  lib/worlddb/models/country.rb
17
+ lib/worlddb/models/country_code.rb
17
18
  lib/worlddb/models/country_comp.rb
18
19
  lib/worlddb/models/forward.rb
19
20
  lib/worlddb/models/lang.rb
@@ -41,6 +41,7 @@ require 'worlddb/models/continent'
41
41
  require 'worlddb/models/continent_comp'
42
42
  require 'worlddb/models/country'
43
43
  require 'worlddb/models/country_comp'
44
+ require 'worlddb/models/country_code'
44
45
  require 'worlddb/models/region'
45
46
  require 'worlddb/models/region_comp'
46
47
  require 'worlddb/models/city'
@@ -14,6 +14,7 @@ module WorldDb
14
14
  ## Tagging.delete_all # - use TagDb.delete!
15
15
  ## Tag.delete_all
16
16
 
17
+ CountryCode.delete_all
17
18
  Name.delete_all
18
19
  Place.delete_all
19
20
  City.delete_all
@@ -81,17 +81,23 @@ class Country < ActiveRecord::Base
81
81
  'SUPR'
82
82
  elsif is_dependency?
83
83
  'TERR'
84
+ elsif is_misc? ## misc(ellaneous) country or dependent territory
85
+ # todo: use different marker?
86
+ # territory w/ shared or disputes claims e.g Antartica/Western Sahara/Paracel Islands pg Spratly Islands/etc.
87
+ 'MISC'
84
88
  else
85
89
  'CNTY'
86
90
  end
87
91
  end
88
92
 
93
+
89
94
  ###
90
95
  # NB: use is_ for flags to avoid conflict w/ assocs
91
96
 
92
97
  def is_supra?() s? == true; end
93
98
  def is_country?() c? == true; end
94
99
  def is_dependency?() d? == true; end
100
+ def is_misc?() m? == true; end
95
101
 
96
102
 
97
103
  def all_names( opts={} )
@@ -114,6 +120,50 @@ class Country < ActiveRecord::Base
114
120
  end
115
121
 
116
122
 
123
+ def self.search_by_name( q ) ## todo/check: just use search (rename)? why? why not?
124
+
125
+ ## fix: add/configure logger for ActiveRecord!!!
126
+ ## logger = LogKernel::Logger.root
127
+
128
+ name = q.strip
129
+
130
+ ## 1) first try 1:1 (exact) match
131
+ cty = Country.find_by_name( name ) # NOTE: assume AR escapes quotes in name ??
132
+ if cty.nil?
133
+ ## 2) retry: a) remove all (..) enclosed
134
+ ## b) remove all extra spaces (e.g. Cocos (Keeling) Islands => Cocos__Islands => Cocos_Islands)
135
+ name = name.gsub( /\([^)]+\)/, '' ).strip
136
+ name = name.gsub( /[ \t]{2,}/, ' ' )
137
+ cty = Country.find_by_name( name )
138
+
139
+ ### NOTE: escape ' for sql like clause
140
+ ## for now use '' for escapes, that is, double quotes
141
+ ## check - working for postgresql n sqlite??
142
+ name_esc = name.gsub( /'/, "''" )
143
+
144
+ ## 3) retry: use SQL like match
145
+ ## % is used to match *zero* or more occurrences of any characters
146
+ ## todo: check if it matches zero too
147
+ if cty.nil?
148
+ cty = Country.where( "name LIKE '%#{name_esc}%'" ).first
149
+ end
150
+
151
+ ## 4) retry: use SQL like match for alternative names match
152
+ if cty.nil?
153
+ cty = Country.where( "alt_names LIKE '%#{name_esc}%'" ).first
154
+ end
155
+
156
+ ## 5) retry: use SQL like match for historic names match (e.g. Burma for Myanmar etc.)
157
+ ## todo/check: make it optional (pass in opts hash to configure) - why? why not???
158
+ if cty.nil?
159
+ cty = Country.where( "hist_names LIKE '%#{name_esc}%'" ).first
160
+ end
161
+ end
162
+
163
+ cty # return cty (country); nil if not found
164
+ end
165
+
166
+
117
167
  def self.create_or_update_from_values( values, more_attribs={} )
118
168
 
119
169
  ## key & title
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ module WorldDb
4
+ module Model
5
+
6
+ class CountryCode < ActiveRecord::Base
7
+
8
+ self.table_name = 'country_codes'
9
+
10
+ belongs_to :country, class_name: 'Country', foreign_key: 'country_id'
11
+
12
+
13
+ scope :by_name, ->{ order( 'name asc' ) } # order by name (a-z)
14
+
15
+
16
+ def self.update!
17
+ ## update (auto-create) country codes from existing countries in db
18
+
19
+ ## fix: add/configure logger for ActiveRecord!!!
20
+ logger = LogKernel::Logger.root
21
+
22
+ logger.debug( "delete all (old) country codes" )
23
+ CountryCode.delete_all
24
+
25
+ Country.order(:id).each do |cty|
26
+ logger.debug( "add country #{cty.key} #{cty.name}" )
27
+ CountryCode.create!( country_id: cty.id, kind: 'NET', name: cty.net ) unless cty.net.nil?
28
+ CountryCode.create!( country_id: cty.id, kind: 'NUM', name: cty.num ) unless cty.num.nil?
29
+ CountryCode.create!( country_id: cty.id, kind: 'A2', name: cty.alpha2 ) unless cty.alpha2.nil?
30
+ CountryCode.create!( country_id: cty.id, kind: 'A3', name: cty.alpha3 ) unless cty.alpha3.nil?
31
+ CountryCode.create!( country_id: cty.id, kind: 'FIFA', name: cty.fifa ) unless cty.fifa.nil?
32
+ CountryCode.create!( country_id: cty.id, kind: 'IOC', name: cty.ioc ) unless cty.ioc.nil?
33
+ CountryCode.create!( country_id: cty.id, kind: 'FIPS', name: cty.fips ) unless cty.fips.nil?
34
+ CountryCode.create!( country_id: cty.id, kind: 'M', name: cty.motor ) unless cty.motor.nil?
35
+ end
36
+ end
37
+
38
+ end # class CountryCode
39
+
40
+ end # module Model
41
+ end # module WorldDb
@@ -25,6 +25,8 @@ class City < ActiveRecord::Base ; end
25
25
  class Lang < ActiveRecord::Base ; end
26
26
  class Usage < ActiveRecord::Base ; end
27
27
 
28
+ class CountryCode < ActiveRecord::Base ; end
29
+
28
30
  end
29
31
 
30
32
  # note: convenience alias for Model
@@ -39,15 +41,17 @@ module TagDb
39
41
  # add alias? why? why not? # is there a better way?
40
42
  # - just include WorldDb::Models - why? why not?
41
43
 
42
- Name = WorldDb::Model::Name
43
- Place = WorldDb::Model::Place
44
- Continent = WorldDb::Model::Continent
45
- Country = WorldDb::Model::Country
46
- Region = WorldDb::Model::Region
47
- City = WorldDb::Model::City
44
+ Name = WorldDb::Model::Name
45
+ Place = WorldDb::Model::Place
46
+ Continent = WorldDb::Model::Continent
47
+ Country = WorldDb::Model::Country
48
+ Region = WorldDb::Model::Region
49
+ City = WorldDb::Model::City
50
+
51
+ Lang = WorldDb::Model::Lang
52
+ Usage = WorldDb::Model::Usage
48
53
 
49
- Lang = WorldDb::Model::Lang
50
- Usage = WorldDb::Model::Usage
54
+ CountryCode = WorldDb::Model::CountryCode
51
55
 
52
56
  end
53
57
  end
@@ -170,7 +170,7 @@ class ReaderBase
170
170
 
171
171
  values = line.split(',')
172
172
 
173
- logger.debug '[>' + values.join( '<|>' ) + '<]'
173
+ ## logger.debug '[>' + values.join( '<|>' ) + '<]'
174
174
 
175
175
  if name =~ /iso/
176
176
  # special case for iso
@@ -182,7 +182,7 @@ class ReaderBase
182
182
  end
183
183
 
184
184
  ## try to find country
185
- cty = find_country( country_name )
185
+ cty = Country.search_by_name( country_name )
186
186
 
187
187
  if cty.nil?
188
188
  logger.warn "no country match found for >#{country_name}<; skipping line; in [#{name}]"
@@ -217,45 +217,8 @@ class ReaderBase
217
217
 
218
218
  ####
219
219
  # helper methods
220
- ##
221
- ## todo: move to country model !!!!!!
222
- ## find a good name Country.find not really possible
223
- ## superfind ?? use search!!! search_by_name() Country.search() or lookup?
224
- ##
225
220
  ## todo: also add City.search_by_name etc. !!!
226
221
 
227
- def find_country( country_name )
228
-
229
- name = country_name.strip
230
-
231
- ## 1) first try 1:1 (exact) match
232
- cty = Country.find_by_name( name ) # NOTE: assume AR escapes quotes in name ??
233
- if cty.nil?
234
- ## 2) retry: remove all () enclosed
235
- name = name.gsub( /\([^)]+\)/, '' ).strip
236
- cty = Country.find_by_name( name )
237
-
238
- ### NOTE: escape ' for sql like clause
239
- ## for now use '' for escapes, that is, double quotes
240
- ## check - working for postgresql n sqlite??
241
- name_esc = name.gsub( /'/, "''" )
242
-
243
- ## 3) retry: use SQL like match
244
- ## % is used to match *zero* or more occurrences of any characters
245
- ## todo: check if it matches zero too
246
- if cty.nil?
247
- cty = Country.where( "name LIKE '%#{name_esc}%'" ).first
248
- end
249
-
250
- ## 4) retry: use SQL like match for alternative names match
251
- if cty.nil?
252
- cty = Country.where( "alt_names LIKE '%#{name_esc}%'" ).first
253
- end
254
- end
255
- cty # return cty (country); nil if not found
256
- end # method find_country
257
-
258
-
259
222
 
260
223
  end # class ReaderBase
261
224
  end # module WorldDb
@@ -75,6 +75,15 @@ end
75
75
  add_index :continents, :key, unique: true
76
76
 
77
77
 
78
+ create_table :country_codes do |t|
79
+ t.string :name, null: false
80
+ t.string :kind, null: false # e.g. ALPHA2,NUM,FIFA,IOC,FIPS,NET,etc.
81
+ t.references :country, null: false
82
+ end
83
+
84
+ add_index :country_codes, [:name, :kind], unique: true
85
+
86
+
78
87
  create_table :countries do |t|
79
88
  t.string :name, null: false
80
89
  t.string :slug, null: false # auto-generate default
@@ -82,6 +91,7 @@ create_table :countries do |t|
82
91
  t.references :place, null: false
83
92
  t.string :code, null: false # short three letter code (FIFA country code e.g. ITA)
84
93
  t.string :alt_names # comma separated list of alternate names (synonyms)
94
+ t.string :hist_names # comma separated list of historic names (no longer in use)
85
95
  t.integer :pop, null: false # population count
86
96
  t.integer :area, null: false # area in square km (sq. km)
87
97
  t.references :continent
@@ -92,6 +102,10 @@ create_table :countries do |t|
92
102
  t.boolean :c, null: false, default: false # country flag (is this needed?)
93
103
  t.boolean :d, null: false, default: false # dependency flag
94
104
 
105
+ t.boolean :m, null: false, default: false # misc(ellaneous) flag
106
+ # misc use for territories w/ shared or disputed claims
107
+ # e.g. Antartica/Western Sahara/Paracel Islands/Spratly Islands/etc.
108
+
95
109
  # extras - country codes
96
110
  t.string :motor # optional motor (vehicle) licene plate code (bumper sticker)
97
111
  t.string :alpha2 # optional iso two letter country code
@@ -8,17 +8,21 @@ module WorldDb
8
8
  def tables
9
9
  puts "Stats:"
10
10
  puts " #{'%5d' % Continent.count} continents"
11
- puts " #{'%5d' % Country.count} countries (#{Country.where(s: true).count} supras, #{Country.where(d:true).count} deps)"
11
+ puts " #{'%5d' % Country.count} countries (#{Country.where(s: true).count} supras, #{Country.where(d:true).count} deps), #{Country.where(m:true).count} miscs)"
12
12
  puts " #{'%5d' % Region.count} regions"
13
13
  puts " #{'%5d' % City.where(m: true).where(c: false).count} metros"
14
14
  puts " #{'%5d' % City.where(c: true).count} cities (#{City.where(c: true).where(m: true).count} metros)"
15
15
  puts " #{'%5d' % City.where(d: true).count} districts"
16
- # puts " #{'%5d' % Tag.count} tags"
17
- # puts " #{'%5d' % Tagging.count} taggings"
18
16
  puts " #{'%5d' % Place.count} places"
19
17
  puts " #{'%5d' % Name.count} names"
18
+
20
19
  puts " #{'%5d' % Lang.count} langs"
21
20
  puts " #{'%5d' % Usage.count} usages"
21
+
22
+ puts " #{'%5d' % CountryCode.count} (country) codes"
23
+
24
+ # puts " #{'%5d' % Tag.count} tags"
25
+ # puts " #{'%5d' % Tagging.count} taggings"
22
26
  end
23
27
 
24
28
  end # class Stats
@@ -4,7 +4,7 @@ module WorldDb
4
4
  # sync version w/ sport.db n friends - why? why not?
5
5
  MAJOR = 2 ## todo: namespace inside version or something - why? why not??
6
6
  MINOR = 0
7
- PATCH = 7
7
+ PATCH = 8
8
8
  VERSION = [MAJOR,MINOR,PATCH].join('.')
9
9
 
10
10
  def self.version
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: worlddb
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7
4
+ version: 2.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-17 00:00:00.000000000 Z
11
+ date: 2014-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: props
@@ -163,6 +163,7 @@ files:
163
163
  - lib/worlddb/models/continent.rb
164
164
  - lib/worlddb/models/continent_comp.rb
165
165
  - lib/worlddb/models/country.rb
166
+ - lib/worlddb/models/country_code.rb
166
167
  - lib/worlddb/models/country_comp.rb
167
168
  - lib/worlddb/models/forward.rb
168
169
  - lib/worlddb/models/lang.rb