worlddb-models 2.3.3 → 2.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7fd3e4a124d077f78bb176f7a6bc5b57ae15e5a9
4
- data.tar.gz: 4cc9e212e7fb37bb21d557a262698411daacb754
3
+ metadata.gz: 03a22edaff5cdbe119a10429130a8465dcc5a59c
4
+ data.tar.gz: c3c71f45eebfbbd56c1a9675838803674050252e
5
5
  SHA512:
6
- metadata.gz: 563ffc1f779a443c5126c41c8ab6385a653a74634cacbbc7d6a397f17d83be00c73b40356c1d2c7878122f8ad96138d71a5dbef934b4fa3123958add12319534
7
- data.tar.gz: 1bf7aa7c891b4d404a60a08d3e24abecaeb042a71758f1463c5704104bd85ca1c2d0f06e0e1131d24de083f4d98e8736894f8fd60116f114238e2cbb3d03db04
6
+ metadata.gz: 0a5b509f87918c6032a1185b5c0d7f349c2abf013e5c6125f1556d455108349dec022b76f05ae92667c822e7bf71409a74c3f120f935a19fa15bf58eef9727c6
7
+ data.tar.gz: 180eb5093b77c214acdccb0aa9d1ee4c5f699f75cfc0c5d6b4f51c576ec697a14a052135744bc16a44d447b7f3be3009b1abc7abc2bca9e3fd9528e421ec6864
data/Manifest.txt CHANGED
@@ -43,7 +43,7 @@ test/adm/test_read_adm.rb
43
43
  test/adm/test_read_tree.rb
44
44
  test/data/at-austria/1--b-burgenland/counties.txt
45
45
  test/data/at-austria/2--n-niederoesterreich/counties.txt
46
- test/data/at-austria/3--w-wien/counties.txt
46
+ test/data/at-austria/3--w-wien/districts.txt
47
47
  test/data/at-austria/orte.txt
48
48
  test/data/at-austria/setups/adm.txt
49
49
  test/data/at-austria/setups/tree.txt
@@ -67,6 +67,7 @@ test/test_model_state.rb
67
67
  test/test_model_states_at.rb
68
68
  test/test_model_states_de.rb
69
69
  test/test_models.rb
70
+ test/test_name_finders.rb
70
71
  test/test_name_parser.rb
71
72
  test/test_parse_city.rb
72
73
  test/test_parse_country.rb
@@ -74,4 +75,3 @@ test/test_parse_state.rb
74
75
  test/test_report_country.rb
75
76
  test/test_state_tree_reader_at.rb
76
77
  test/test_state_tree_reader_de.rb
77
- test/test_state_tree_reader_name_finder.rb
@@ -195,4 +195,4 @@ end # module WorldDb
195
195
 
196
196
 
197
197
  # say hello
198
- puts WorldDb.banner if $DEBUG || (defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG)
198
+ puts WorldDb.banner if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
@@ -9,6 +9,81 @@ class Name < ActiveRecord::Base
9
9
  belongs_to :place, class_name: 'Place', foreign_key: 'place_id'
10
10
 
11
11
 
12
+ def place_object # returns "typed" place object e.g. state, part, county, muni, city, etc.
13
+
14
+ case place_kind
15
+ when 'STAT' ## state
16
+ place.state
17
+ when 'PART' ## part
18
+ place.part
19
+ when 'COUN' ## county
20
+ place.county
21
+ when 'MUNI' ## muni
22
+ place.muni
23
+ when 'CITY' ## city
24
+ place.city
25
+ else
26
+ puts "*** error [Name#place_object] - unknown place_kind #{place_kind}"
27
+ fail "[Name#place_object] - unknown place_kind #{place_kind}"
28
+ end # end case
29
+ end
30
+
31
+ #########
32
+ # finders
33
+ #
34
+ # -- search scoped by country
35
+
36
+ def self.find_states( name, country_id ) # note: requires country_id (for search scope)
37
+ Name.joins(
38
+ :place => :state
39
+ ).where(
40
+ :name => name,
41
+ :place_kind => 'STAT',
42
+ :'states.country_id' => country_id )
43
+ end
44
+
45
+ def self.find_cities( name, country_id ) # note: requires country_id (for search scope) -- add version w/ state_id scope - why?? why not??
46
+ Name.joins(
47
+ :place => :city
48
+ ).where(
49
+ :name => name,
50
+ :place_kind => 'CITY',
51
+ :'cities.country_id' => country_id )
52
+ end
53
+
54
+ ## -- search scoped by state
55
+
56
+ def self.find_parts( name, state_id ) # note requires state_id (for search scope)
57
+ Name.joins(
58
+ :place => :part
59
+ ).where(
60
+ :name => name,
61
+ :place_kind => 'PART',
62
+ :'parts.state_id' => state_id )
63
+ end
64
+
65
+ def self.find_counties( name, state_id ) # note requires state_id (for search scope)
66
+ Name.joins(
67
+ :place => :county
68
+ ).where(
69
+ :name => name,
70
+ :place_kind => 'COUN',
71
+ :'counties.state_id' => state_id )
72
+ end
73
+
74
+ def self.find_munis( name, state_id ) # note requires state_id (for search scope)
75
+ Name.joins(
76
+ :place => :muni
77
+ ).where(
78
+ :name => name,
79
+ :place_kind => 'MUNI',
80
+ :'munis.state_id' => state_id )
81
+ end
82
+
83
+
84
+ ########
85
+ # create
86
+
12
87
  def self.parse( *args )
13
88
  ## remove (extract) attribs hash (if last arg is a hash n present)
14
89
  more_attribs = args.last.is_a?(Hash) ? args.pop : {} ## extract_options!
@@ -8,8 +8,10 @@ class Place < ActiveRecord::Base
8
8
  ## todo: depending on type
9
9
  ## has_one continent, country, state, city etc.
10
10
  has_one :state, class_name: 'State', foreign_key: 'place_id'
11
+ has_one :part, class_name: 'Part', foreign_key: 'place_id'
11
12
  has_one :county, class_name: 'County', foreign_key: 'place_id'
12
13
  has_one :muni, class_name: 'Muni', foreign_key: 'place_id'
14
+ has_one :city, class_name: 'City', foreign_key: 'place_id'
13
15
  ## add more types..
14
16
 
15
17
  end # class Place
@@ -36,68 +36,38 @@ class StateTreeReader < ReaderBaseWithMoreAttribs
36
36
  puts " #{names.join( ' › ' )}:"
37
37
  puts " key: >#{node.key}<, level: >#{node.level}<, value: >#{node.value}<"
38
38
 
39
- ## use name for lookup - use where() to find - might match more than 1 record!!
40
- ## todo/fix: check for multiple or no matches!!!
41
- ## todo/fix: check how to add state.id scope (and country.id scope) etc.
42
- ## add state.id to name - why? why not?
43
- ## move finders to name model for reuse (and testing) - why? why not ??
44
39
  if node.level == state_level # 1
45
- ## was: rec = State.where( "name like '#{node.value}%'" ).first
46
- names = Name.joins(
47
- :place => :state
48
- ).find_by(
49
- :name => node.value,
50
- :place_kind => 'STAT',
51
- :'states.country_id' => country.id )
52
- rec = if names.nil?
53
- nil
54
- else
55
- names.place.state # get first record; fix: use where instead of find_by etc.
56
- end
40
+ recs = Name.find_states( node.value, country.id )
57
41
  elsif node.level == part_level # 2
58
42
  state = stack[0]
59
- rec = Part.where( "name like '#{node.value}%' AND state_id = #{state.id}" ).first
43
+ recs = Name.find_parts( node.value, state.id )
60
44
  elsif node.level == county_level # 2 or 3
61
45
  state = stack[0]
62
- ## was: rec = County.where( "name like '#{node.value}%' AND state_id = #{state.id}" ).first
63
- names = Name.joins(
64
- :place => :county
65
- ).find_by(
66
- :name => node.value,
67
- :place_kind => 'COUN',
68
- :'counties.state_id' => state.id )
69
- rec = if names.nil?
70
- nil
71
- else
72
- names.place.county # get first record
73
- end
46
+ recs = Name.find_counties( node.value, state.id )
74
47
  elsif node.level == muni_level # 3 or 4
75
48
  state = stack[0]
76
- ## was: rec = Muni.where( "name like '#{node.value}%' AND state_id = #{state.id}" ).first
77
- names = Name.joins(
78
- :place => :muni
79
- ).find_by(
80
- :name => node.value,
81
- :place_kind => 'MUNI',
82
- :'munis.state_id' => state.id )
83
- rec = if names.nil?
84
- nil
85
- else
86
- names.place.muni # get first record
87
- end
49
+ recs = Name.find_munis( node.value, state.id )
88
50
  elsif node.level == city_level # 4 or 5
89
51
  ## note: city requires country scope for lookup
90
52
  ## todo/fix: how to deal with cities with the same name
91
53
  ## in the same country (and same state and same county etc.) ??? - add some examples here
92
- rec = City.where( "name like '#{node.value}%' AND country_id = #{country.id}" ).first
54
+ recs = Name.find_cities( node.value, country.id )
93
55
  else
94
56
  puts "*** (fatal) error: unknown level for tree node: #{node.inspect}"
95
- ## todo/fix: exit here
57
+ fail "[StateTreeReader] unknown level for tree node: #{node.inspect}"
96
58
  end
97
59
 
98
60
 
99
- if rec.present?
100
- puts "ok - record match found: #{rec.inspect}"
61
+ if recs.size > 0
62
+ if recs.size == 1
63
+ puts "ok - record match found: #{recs.inspect}"
64
+ rec = recs[0].place_object # e.g. state,part,county,muni,city,etc.
65
+ else
66
+ puts "** ok - #{recs.size} record(s) match found: #{recs.inspect}"
67
+ ## fix/todo: note - uses always first entry for now;
68
+ ## make lookup/matching more intelligent/usable!!
69
+ rec = recs[0].place_object # e.g. state,part,county,muni,city,etc.
70
+ end
101
71
  else
102
72
  ## note: for now only auto-adds munis n cities
103
73
  if node.level == muni_level # 3 or 4
@@ -129,7 +99,7 @@ class StateTreeReader < ReaderBaseWithMoreAttribs
129
99
  country_id: country.id )
130
100
  else
131
101
  puts "*** (fatal) error: record not found for tree node: #{node.inspect}"
132
- ## todo/fix: exit here
102
+ fail "[StateTreeReader] record not found for tree node: #{node.inspect}"
133
103
  end
134
104
  end
135
105
 
@@ -137,7 +107,9 @@ class StateTreeReader < ReaderBaseWithMoreAttribs
137
107
 
138
108
  if level_diff > 0
139
109
  logger.debug "[StateTreeReader] up +#{level_diff}"
140
- ## FIX!!! todo/check/verify/assert: always must be +1
110
+ if level_diff > 1
111
+ fail "[StateTreeReader] level diff MUST be +1 is +#{level_diff}"
112
+ end
141
113
  elsif level_diff < 0
142
114
  logger.debug "[StateTreeReader] down #{level_diff}"
143
115
  level_diff.abs.times { stack.pop }
@@ -5,7 +5,7 @@ module WorldDb
5
5
  # sync version w/ sport.db n friends - why? why not?
6
6
  MAJOR = 2 ## todo: namespace inside version or something - why? why not??
7
7
  MINOR = 3
8
- PATCH = 3
8
+ PATCH = 4
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
11
11
  def self.version
@@ -1,7 +1,9 @@
1
1
 
2
2
  at-austria!/states
3
+
3
4
  at-austria!/1--b-burgenland/counties
4
5
  at-austria!/2--n-niederoesterreich/counties
5
- at-austria!/3--w-wien/counties
6
+
7
+ at-austria!/3--w-wien/districs
6
8
 
7
9
 
@@ -2,8 +2,11 @@
2
2
  # note: same as admin plus tree (orte.txt)
3
3
 
4
4
  at-austria!/states
5
+
5
6
  at-austria!/1--b-burgenland/counties
6
7
  at-austria!/2--n-niederoesterreich/counties
7
- at-austria!/3--w-wien/counties
8
8
 
9
9
  at-austria!/orte
10
+
11
+ at-austria!/3--w-wien/districts
12
+
@@ -2,12 +2,12 @@
2
2
 
3
3
  ###
4
4
  # to run use
5
- # ruby -I ./lib -I ./test test/test_state_tree_reader_name_finder.rb
5
+ # ruby -I ./lib -I ./test test/test_name_finders.rb
6
6
 
7
7
 
8
8
  require 'helper'
9
9
 
10
- class TestStateTreeReaderNameFinder < MiniTest::Test
10
+ class TestNameFinders < MiniTest::Test
11
11
 
12
12
  def setup
13
13
  # delete all countries, states, cities in in-memory only db
@@ -24,14 +24,25 @@ class TestStateTreeReaderNameFinder < MiniTest::Test
24
24
  reader = WorldDb::Reader.new( "#{WorldDb.root}/test/data/at-austria" )
25
25
  reader.load_setup( 'setups/adm' )
26
26
 
27
+ recs = Name.find_states( 'Wien', at.id )
28
+ pp recs
29
+
30
+ recs = Name.find_cities( 'Krems', at.id )
31
+ pp recs
32
+
33
+
34
+ ####
35
+ # -- finders scoped by state
36
+
27
37
  n = State.find_by!( key: 'n' )
28
38
 
39
+ recs = Name.find_parts( 'Waldviertel', n.id )
40
+ pp recs
29
41
 
30
42
  ## find counties w/ state_id using names
31
- names = Name.joins( :place => :county ).where(
32
- :name => 'Horn',
33
- :place_kind => 'COUN',
34
- :'counties.state_id' => n.id )
43
+ recs = Name.find_counties( 'Horn', n.id )
44
+ pp recs
45
+
35
46
  ## results in:
36
47
  ## SELECT "names".* FROM "names"
37
48
  ## INNER JOIN "places" ON "places"."id" = "names"."place_id"
@@ -41,14 +52,11 @@ class TestStateTreeReaderNameFinder < MiniTest::Test
41
52
  ## AND "counties"."state_id" = 2
42
53
  ## [["name", "Horn"], ["place_kind", "COUN"]]
43
54
 
44
- pp names
45
55
 
46
56
 
47
- ## find munies w/ state_id using names
48
- names = Name.joins( :place => :muni ).where(
49
- :name => 'Horn',
50
- :place_kind => 'MUNI',
51
- :'munis.state_id' => n.id )
57
+ ## find munis w/ state_id using names
58
+ recs = Name.find_munis( 'Horn', n.id )
59
+ pp recs
52
60
 
53
61
  ## results in:
54
62
  ## SELECT "names".* FROM "names"
@@ -59,9 +67,7 @@ class TestStateTreeReaderNameFinder < MiniTest::Test
59
67
  ## AND "munis"."state_id" = 2
60
68
  ## [["name", "Horn"], ["place_kind", "MUNI"]]
61
69
 
62
- pp names
63
-
64
70
  end
65
71
 
66
- end # class TestStateTreeReaderNameFinder
72
+ end # class TestNameFinders
67
73
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: worlddb-models
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.3
4
+ version: 2.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-15 00:00:00.000000000 Z
11
+ date: 2015-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: props
@@ -219,7 +219,7 @@ files:
219
219
  - test/adm/test_read_tree.rb
220
220
  - test/data/at-austria/1--b-burgenland/counties.txt
221
221
  - test/data/at-austria/2--n-niederoesterreich/counties.txt
222
- - test/data/at-austria/3--w-wien/counties.txt
222
+ - test/data/at-austria/3--w-wien/districts.txt
223
223
  - test/data/at-austria/orte.txt
224
224
  - test/data/at-austria/setups/adm.txt
225
225
  - test/data/at-austria/setups/tree.txt
@@ -243,6 +243,7 @@ files:
243
243
  - test/test_model_states_at.rb
244
244
  - test/test_model_states_de.rb
245
245
  - test/test_models.rb
246
+ - test/test_name_finders.rb
246
247
  - test/test_name_parser.rb
247
248
  - test/test_parse_city.rb
248
249
  - test/test_parse_country.rb
@@ -250,7 +251,6 @@ files:
250
251
  - test/test_report_country.rb
251
252
  - test/test_state_tree_reader_at.rb
252
253
  - test/test_state_tree_reader_de.rb
253
- - test/test_state_tree_reader_name_finder.rb
254
254
  homepage: https://github.com/worlddb/world.db.models
255
255
  licenses:
256
256
  - Public Domain
@@ -289,8 +289,8 @@ test_files:
289
289
  - test/test_model_state.rb
290
290
  - test/test_model_city.rb
291
291
  - test/test_fixture_matchers.rb
292
- - test/test_state_tree_reader_name_finder.rb
293
292
  - test/test_model_country.rb
293
+ - test/test_name_finders.rb
294
294
  - test/test_parse_city.rb
295
295
  - test/test_report_country.rb
296
296
  - test/test_model_compat.rb