worlddb 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
25
+ br, Brazil, BRA, 8514215, 192380000, south america|pt-br
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
@@ -49,6 +49,9 @@ module WorldDB
49
49
  Runner.new.run(ARGV)
50
50
  end
51
51
 
52
+ def self.create
53
+ CreateDB.up
54
+ end
52
55
 
53
56
  # load built-in (that is, bundled within the gem) named seeds
54
57
  # - pass in an array of seed names e.g. [ 'countries', 'at/cities', 'de/cities' ] etc.
@@ -60,6 +63,74 @@ module WorldDB
60
63
  end
61
64
  end
62
65
 
66
+ def self.fixtures # all builtin fixtures; helper for covenience
67
+
68
+ ['africa/countries',
69
+ 'america/countries',
70
+ 'america/br/regions',
71
+ 'america/br/cities',
72
+ 'america/ca/regions',
73
+ 'america/ca/cities',
74
+ 'america/mx/cities',
75
+ 'america/us/regions',
76
+ 'america/us/cities',
77
+ 'america/ve/regions',
78
+ 'america/ve/cities',
79
+ 'asia/countries',
80
+ 'asia/jp/cities',
81
+ 'europe/countries',
82
+ 'europe/at/regions',
83
+ 'europe/at/cities',
84
+ 'europe/be/cities',
85
+ 'europe/by/cities',
86
+ 'europe/ch/cities',
87
+ 'europe/cy/cities',
88
+ 'europe/de/regions',
89
+ 'europe/de/cities',
90
+ 'europe/dk/cities',
91
+ 'europe/en/cities',
92
+ 'europe/es/cities',
93
+ 'europe/fr/cities',
94
+ 'europe/gr/cities',
95
+ 'europe/hr/cities',
96
+ 'europe/it/cities',
97
+ 'europe/nl/cities',
98
+ 'europe/pt/cities',
99
+ 'europe/ro/cities',
100
+ 'europe/ru/cities',
101
+ 'europe/sc/cities',
102
+ 'europe/tr/cities',
103
+ 'europe/ua/cities',
104
+ 'oceania/countries',
105
+ 'oceania/au/cities'
106
+ ]
107
+ end
108
+
109
+
110
+ def self.read( ary )
111
+ reader = Reader.new
112
+ ary.each do |name|
113
+ reader.load_builtin( name )
114
+ end
115
+ end
116
+
117
+ def self.read_all # load all builtins (using plain text reader); helper for convenience
118
+ reader = Reader.new
119
+
120
+ # too big for heroku free db plan (10,000 record limit)
121
+ # - sorry, can't load by default
122
+ fixture_excludes = [
123
+ 'america/br/cities',
124
+ 'america/ve/cities'
125
+ ]
126
+
127
+ ary = fixtures - fixture_excludes
128
+
129
+ ary.each do |name|
130
+ reader.load_builtin( name )
131
+ end # each name
132
+ end # method load_all
133
+
63
134
 
64
135
  class Deleter
65
136
  ## todo: move into its own file???
@@ -47,7 +47,17 @@ class Opts
47
47
  return false if @create.nil? # default create flag is false
48
48
  @create == true
49
49
  end
50
-
50
+
51
+
52
+ def setup=(boolean)
53
+ @setup = boolean
54
+ end
55
+
56
+ def setup?
57
+ return false if @setup.nil? # default create flag is false
58
+ @setup == true
59
+ end
60
+
51
61
 
52
62
  def delete=(boolean)
53
63
  @delete = boolean
@@ -22,6 +22,7 @@ class Runner
22
22
 
23
23
  ## NB: reserve -c for use with -c/--config
24
24
  cmd.on( '--create', 'Create DB schema' ) { opts.create = true }
25
+ cmd.on( '--setup', "Create DB schema 'n' load builtin world data" ) { opts.setup = true }
25
26
 
26
27
  ### todo: in future allow multiple search path??
27
28
  cmd.on( '-i', '--include PATH', "Data path (default is #{opts.data_path})" ) { |path| opts.data_path = path }
@@ -91,19 +92,18 @@ EOS
91
92
 
92
93
  ActiveRecord::Base.establish_connection( db_config )
93
94
 
94
- if opts.create?
95
- CreateDB.up
96
- end
97
-
98
- if opts.delete?
99
- WorldDB.delete!
100
- end
101
-
102
-
103
- if opts.countries? || opts.regions? || opts.cities?
104
- Reader.new( logger ).run( opts, args ) # load/read plain text country/region/city fixtures
95
+ if opts.setup?
96
+ WorldDB.create
97
+ WorldDB.read_all
105
98
  else
106
- Loader.new( logger ).run( opts, args ) # load ruby fixtures
99
+ WorldDB.create if opts.create?
100
+ WorldDB.delete! if opts.delete?
101
+
102
+ if opts.countries? || opts.regions? || opts.cities?
103
+ Reader.new( logger ).run( opts, args ) # load/read plain text country/region/city fixtures
104
+ else
105
+ Loader.new( logger ).run( opts, args ) # load ruby fixtures
106
+ end
107
107
  end
108
108
 
109
109
  dump_stats
@@ -10,8 +10,11 @@ class City < ActiveRecord::Base
10
10
 
11
11
  has_many :taggings, :as => :taggable
12
12
  has_many :tags, :through => :taggings
13
-
14
-
13
+
14
+ validates :key, :format => { :with => /^[a-z]{3,}$/, :message => 'expected three or more lowercase letters a-z' }
15
+ validates :code, :format => { :with => /^[A-Z_]{3}$/, :message => 'expected three uppercase letters A-Z (and _)' }, :allow_nil => true
16
+
17
+
15
18
  def self.create_from_ary!( cities, more_values={} )
16
19
  cities.each do |values|
17
20
 
@@ -38,6 +41,8 @@ class City < ActiveRecord::Base
38
41
  attr[ :country_id ] = value.id
39
42
  elsif value.is_a? Numeric
40
43
  value_numbers << value
44
+ elsif value =~ /^[A-Z_]{3}$/ ## assume its three letter code (e.g. NYC,VIE,etc.)
45
+ attr[ :code ] = value
41
46
  elsif value =~ /^region:/ ## region:
42
47
  value_region_key = value[7..-1] ## cut off region: prefix
43
48
  value_region = Region.find_by_key!( value_region_key )
@@ -11,6 +11,10 @@ class Country < ActiveRecord::Base
11
11
  has_many :taggings, :as => :taggable
12
12
  has_many :tags, :through => :taggings
13
13
 
14
+ validates :key, :format => { :with => /^[a-z]{2}$/, :message => 'expected two lowercase letters a-z' }
15
+ validates :code, :format => { :with => /^[A-Z_]{3}$/, :message => 'expected three uppercase letters A-Z (and _)' }
16
+
17
+
14
18
  def self.create_from_ary!( countries )
15
19
  countries.each do |values|
16
20
 
@@ -18,7 +22,7 @@ class Country < ActiveRecord::Base
18
22
  attr = {
19
23
  :key => values[0],
20
24
  :title => values[1],
21
- :tag => values[2]
25
+ :code => values[2]
22
26
  }
23
27
 
24
28
  value_numbers = []
@@ -9,6 +9,7 @@ class Region < ActiveRecord::Base
9
9
  has_many :taggings, :as => :taggable
10
10
  has_many :tags, :through => :taggings
11
11
 
12
+ validates :key, :format => { :with => /^[a-z]{2,}$/, :message => 'expected two or more lowercase letters a-z' }
12
13
 
13
14
  def self.create_from_ary!( regions, more_values={} )
14
15
  regions.each do |values|
@@ -45,14 +45,14 @@ class Reader
45
45
 
46
46
  def load_regions_with_include_path( country_key, name, include_path )
47
47
  country = Country.find_by_key!( country_key )
48
- puts "Country #{country.key} >#{country.title} (#{country.tag})<"
48
+ puts "Country #{country.key} >#{country.title} (#{country.code})<"
49
49
 
50
50
  load_fixtures_with_include_path_for( Region, name, include_path, country_id: country.id )
51
51
  end
52
52
 
53
53
  def load_cities_with_include_path( country_key, name, include_path )
54
54
  country = Country.find_by_key!( country_key )
55
- puts "Country #{country.key} >#{country.title} (#{country.tag})<"
55
+ puts "Country #{country.key} >#{country.title} (#{country.code})<"
56
56
 
57
57
  load_fixtures_with_include_path_for( City, name, include_path, country_id: country.id )
58
58
  end
@@ -60,20 +60,33 @@ class Reader
60
60
  ##################################
61
61
  # load from gem (built-in)
62
62
 
63
+ def load_builtin( name ) ## convenience helper (requires proper named files w/ convention)
64
+ if name =~ /\/countries/
65
+ load_countries_builtin( name )
66
+ elsif name =~ /\/([a-z]{2})\/cities/
67
+ load_cities_builtin( $1, name )
68
+ elsif name =~ /\/([a-z]{2})\/regions/
69
+ load_regions_builtin( $1, name )
70
+ else
71
+ puts "*** error: unknown world.db fixture type >#{name}<"
72
+ # todo/fix: exit w/ error
73
+ end
74
+ end
75
+
63
76
  def load_countries_builtin( name )
64
77
  load_fixtures_builtin_for( Country, name )
65
78
  end
66
79
 
67
80
  def load_regions_builtin( country_key, name )
68
81
  country = Country.find_by_key!( country_key )
69
- puts "Country #{country.key} >#{country.title} (#{country.tag})<"
82
+ puts "Country #{country.key} >#{country.title} (#{country.code})<"
70
83
 
71
84
  load_fixtures_builtin_for( Region, name, country_id: country.id )
72
85
  end
73
86
 
74
87
  def load_cities_builtin( country_key, name )
75
88
  country = Country.find_by_key!( country_key )
76
- puts "Country #{country.key} >#{country.title} (#{country.tag})<"
89
+ puts "Country #{country.key} >#{country.title} (#{country.code})<"
77
90
 
78
91
  load_fixtures_builtin_for( City, name, country_id: country.id )
79
92
  end
@@ -166,7 +179,7 @@ private
166
179
  value_region = Region.find_by_key!( value_region_key )
167
180
  attribs[ :region_id ] = value_region.id
168
181
  elsif value =~ /^[A-Z]{3}$/ ## assume three-letter code
169
- attribs[ :tag ] = value # todo: rename to code??
182
+ attribs[ :code ] = value
170
183
  elsif value =~ /^\d+$/ ## numeric
171
184
  value_numbers << value.to_i
172
185
  elsif (values.size==(index+3)) && value =~ /^[a-z0-9\| ]+$/ # tags must be last entry
@@ -11,9 +11,9 @@ def self.up
11
11
  ActiveRecord::Schema.define do
12
12
 
13
13
  create_table :countries do |t|
14
- t.string :title, :null => false
15
- t.string :key, :null => false
16
- t.string :tag, :null => false # short three letter tag (FIFA country code)
14
+ t.string :title, :null => false
15
+ t.string :key, :null => false
16
+ t.string :code, :null => false # short three letter code (FIFA country code e.g. ITA)
17
17
  t.string :synonyms # comma separated list of synonyms
18
18
  t.string :motor # optional auto motor (vehicle) licene plate
19
19
  t.integer :pop # optional population count
@@ -34,6 +34,7 @@ end
34
34
  create_table :cities do |t|
35
35
  t.string :title, :null => false
36
36
  t.string :key, :null => false
37
+ t.string :code # short three letter code (ITAT/airport code e.g. NYC or VIE)
37
38
  t.string :synonyms # comma separated list of synonyms
38
39
  t.references :country, :null => false
39
40
  t.references :region # optional for now
@@ -1,5 +1,5 @@
1
1
 
2
2
  module WorldDB
3
- VERSION = '0.3.0'
3
+ VERSION = '0.3.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: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 0
10
- version: 0.3.0
9
+ - 1
10
+ version: 0.3.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gerald Bauer
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-11-11 00:00:00 Z
18
+ date: 2012-11-16 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: activerecord