worlddb-models 2.3.0 → 2.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fe2b1dd265c24760835eeefbd445c3a8302eb554
4
- data.tar.gz: 35aeaaac8672937b8388825aa4c36cc11ce4651b
3
+ metadata.gz: e65089aa526d90b22ff73acc40835c46ef784c93
4
+ data.tar.gz: 07883ca048c28555a3d27d1ba9a25a9b1a5de377
5
5
  SHA512:
6
- metadata.gz: 60c27ed1d0fceebca6edef19c0a50a542dafdbd66b71bdf9ee0e84aa641de7569d856b9fae697ffb844428ee24b72c505e663dae1bd9b4bc8d8b54f66e9bef9c
7
- data.tar.gz: 6acf8fcfe52845533582c7dbd010f17feb834beb0110c278e2cc72607d7240be894bff150facf73749f9f5419685e8216d05db6732c351fb44df209af52aec8f
6
+ metadata.gz: f9c7c04d0c3d9b7d6240865abfbc523ba464ed30d90c8433afe11826ba9e7fe770ef18176b6785f922e9ca4c51c56d6a55e253813c149ef49c0ac24a62f9b523
7
+ data.tar.gz: 9e615c49999dc69f574b9f50c8c14d1f489e5dd279e99e772f6629fee56b50fa7dab2445ae2b351a1efb833454694544d4c7762746b1b82774913323c691fa37
data/Manifest.txt CHANGED
@@ -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_parser.rb
70
71
  test/test_parse_city.rb
71
72
  test/test_parse_country.rb
72
73
  test/test_parse_state.rb
@@ -32,11 +32,19 @@ class CityBase < ActiveRecord::Base
32
32
  def on_create
33
33
  place_rec = Place.create!( name: name, kind: place_kind )
34
34
  self.place_id = place_rec.id
35
+
36
+ ## create name recs -- todo: add default lang etc. - move to: after_create callback!!
37
+ Name.parse( name, alt_names,
38
+ place_id: place_rec.id,
39
+ place_kind: place_rec.kind )
35
40
  end
36
41
 
37
42
  def on_update
38
43
  ## fix/todo: check - if name or kind changed - only update if changed ?? why? why not??
39
44
  place.update_attributes!( name: name, kind: place_kind )
45
+
46
+ ## todo/fix:
47
+ ## update names too ??
40
48
  end
41
49
 
42
50
  validates :key, format: { with: /#{CITY_KEY_PATTERN}/, message: CITY_KEY_PATTERN_MESSAGE }
@@ -1,11 +1,98 @@
1
1
  # encoding: utf-8
2
2
 
3
+
4
+ ##
5
+ # todo: move to textutils!!!
6
+
7
+ class NameParser
8
+
9
+ include LogUtils::Logging
10
+
11
+ def parse( chunks )
12
+ ## todo/fix: (re)use nameparser - for now "simple" inline version
13
+ ## fix!!! - note: for now lang gets ignored
14
+ ## fix: add hanlde
15
+ ## Leuven[nl]|Louvain[fr] Löwen[de]
16
+ ## Antwerpen[nl]|Anvers[fr] [Antwerp]
17
+ ## Brussel[nl]•Bruxelles[fr] -> official bi-lingual name
18
+ ## etc.
19
+
20
+ ## values - split into names (name n lang pairs)
21
+ ## note: assumes (default) lang from more_attribs unless otherwise marked e.g. [] assume en etc.
22
+
23
+ ## split chunks into values
24
+ values = []
25
+ chunks.each do |chunk|
26
+ next if chunk.nil? || chunk.blank? ## skip nil or empty/blank chunks
27
+
28
+ parts = chunk.split( '|' ) # 1) split |
29
+
30
+ parts.each do |part|
31
+ s = StringScanner.new( part )
32
+ s.skip( /[ \t]+/) # skip whitespaces
33
+
34
+ while s.eos? == false
35
+ if s.check( /\[/ )
36
+ ## scan everything until the end of bracket (e.g.])
37
+ ## fix!!! - note: for now lang gets ignored
38
+ value = s.scan( /\[[^\]]+\]/)
39
+ value = value[1...-1] # strip enclosing [] e.g. [Bavaria] => Bavaria
40
+ else
41
+ ## scan everything until the begin of bracket (e.g.[)
42
+ value = s.scan( /[^\[]+/)
43
+ value = value.strip
44
+ end
45
+ values << value
46
+
47
+ s.skip( /[ \t]+/) # skip whitespaces
48
+ logger.debug( "[NameParser] eos?: #{s.eos?}, rest: >#{s.rest}<" )
49
+ end
50
+ end
51
+ end
52
+
53
+ logger.debug( "[NameParser] values=#{values.inspect}")
54
+
55
+ names = []
56
+ values.each do |value|
57
+ name = value
58
+ ## todo: split by bullet ? (official multilang name) e.g. Brussel • Bruxelles
59
+ ## todo: process variants w/ () e.g. Krems (a. d. Donau) etc. ??
60
+ names << name
61
+ end
62
+
63
+ logger.debug( "[NameParser] names=#{names.inspect}")
64
+
65
+ names
66
+ end # method parse
67
+ end # class NameParser
68
+
69
+
70
+
3
71
  module WorldDb
4
72
  module Model
5
73
 
6
74
  class Name < ActiveRecord::Base
7
75
 
8
76
 
77
+ def self.parse( *args )
78
+ ## remove (extract) attribs hash (if last arg is a hash n present)
79
+ more_attribs = args.last.is_a?(Hash) ? args.pop : {} ## extract_options!
80
+ chunks = args
81
+
82
+ names = NameParser.new.parse( chunks )
83
+ recs = []
84
+
85
+ names.each do |name|
86
+ attribs = more_attribs.merge( name: name ) ## overwrite (default) attribs (lang, etc.) plus add name
87
+ puts "[Name.parse] adding Name record:"
88
+ puts " #{attribs.inspect}"
89
+ rec = Name.create!( attribs )
90
+ recs << rec
91
+ end
92
+
93
+ recs # note: returns an array of name records
94
+ end # method parse
95
+
9
96
  end # class Name
10
97
 
11
98
 
@@ -13,10 +13,8 @@ class State < StateBase
13
13
  has_many :munis, class_name: 'Muni', foreign_key: 'state_id' # ADM3 / ADM4
14
14
  has_many :cities, class_name: 'City', foreign_key: 'state_id'
15
15
 
16
- def place_kind # use place_kind_of_code ??
17
- 'ADM1' # note: for now assumes always level 1
18
- end
19
-
16
+ def place_kind() 'STAT'; end
17
+
20
18
  def state_id # return top-level (e.g. adm1) state_id
21
19
  id
22
20
  end
@@ -31,9 +29,7 @@ class Part < StateBase ## optional ADM2 e.g. Regierungsbezirke in Bayern, etc
31
29
  has_many :counties, class_name: 'County', foreign_key: 'part_id'
32
30
  has_many :cities, class_name: 'City', foreign_key: 'part_id'
33
31
 
34
- def place_kind # use place_kind_of_code ??
35
- 'ADM2' # note: for now assumes always level 2
36
- end
32
+ def place_kind() 'PART'; end
37
33
 
38
34
  def country_id # return country_id via top-level (e.g. adm1) state; -- used for auto-creating cities
39
35
  state.country_id
@@ -50,9 +46,7 @@ class County < StateBase ## note: might be ADM2 or ADM3
50
46
  has_many :munis, class_name: 'Muni', foreign_key: 'county_id'
51
47
  has_many :cities, class_name: 'City', foreign_key: 'county_id'
52
48
 
53
- def place_kind # use place_kind_of_code ??
54
- "ADM#{level}" # note: might be ADM2 or ADM3
55
- end
49
+ def place_kind() 'COUN'; end
56
50
 
57
51
  def country_id # return country_id via top-level (e.g. adm1) state
58
52
  state.country_id
@@ -68,9 +62,7 @@ class Muni < StateBase ## note: might be ADM3 or ADM4
68
62
 
69
63
  has_many :cities, class_name: 'City', foreign_key: 'muni_id'
70
64
 
71
- def place_kind # use place_kind_of_code ??
72
- "ADM#{level}" # note: might be ADM3 or ADM4
73
- end
65
+ def place_kind() 'MUNI'; end
74
66
 
75
67
  def country_id # return country_id via top-level (e.g. adm1) state
76
68
  state.country_id
@@ -39,12 +39,20 @@ class StateBase < ActiveRecord::Base
39
39
 
40
40
  def on_create
41
41
  place_rec = Place.create!( name: name, kind: place_kind )
42
- self.place_id = place_rec.id
42
+ self.place_id = place_rec.id
43
+
44
+ ## create name recs -- todo: add default lang etc. - move to: after_create callback!!
45
+ Name.parse( name, alt_names,
46
+ place_id: place_rec.id,
47
+ place_kind: place_rec.kind )
43
48
  end
44
49
 
45
50
  def on_update
46
51
  ## fix/todo: check - if name or kind changed - only update if changed ?? why? why not??
47
52
  place.update_attributes!( name: name, kind: place_kind )
53
+
54
+ ## todo/fix:
55
+ ## update names too ??
48
56
  end
49
57
 
50
58
 
@@ -18,10 +18,10 @@ create_table :places do |t|
18
18
  # CNTY - country
19
19
  # TERR - terr
20
20
  # state:
21
- # ADM1 - e.g. state/province
22
- # ADM2 - e.g. county/bezirk/kreis
23
- # ADM3 - e.g. municipality/gemeinde
24
- # ADM4
21
+ # STAT -- was: ADM1 - e.g. state/province/etc.
22
+ # PART e.g. regierungsbezirk ADM2
23
+ # COUN -- was ADM2/ADM3 - e.g. county/bezirk/kreis/etc.
24
+ # MUNI - was ADM3/ADM4 - e.g. municipality/gemeinde/etc.
25
25
  # city:
26
26
  # MTRO - metro
27
27
  # CITY - city/town/village/hamlet //(de)ort/stadt/markt
@@ -50,7 +50,9 @@ end
50
50
  ### alternative names for places
51
51
  create_table :names do |t|
52
52
  t.string :name, null: false
53
- t.references :place, null: false
53
+ t.references :place, null: false
54
+ t.string :place_kind, null: false # add (cached) place_kind for easier search queries (w/o join)
55
+
54
56
  ### todo/fix: add lang_id to reference lang from lang table!!! (for now make it a duplicate; e.g. keep stirng lang for now)
55
57
  t.string :lang, null: false, default: 'en' # default to english for now (or use unknown/undeterminded/unspecified???)
56
58
 
@@ -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 = 0
8
+ PATCH = 1
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
11
11
  def self.version
@@ -36,7 +36,7 @@ class TestModelStatesAt < MiniTest::Test
36
36
  assert_equal 1, n.area
37
37
  assert_equal at.id, n.country_id
38
38
  assert_equal 1, n.level
39
- assert_equal 'ADM1', n.place_kind
39
+ assert_equal 'STAT', n.place_kind
40
40
 
41
41
  ### test place
42
42
  assert_equal 'Niederösterreich', n.place.name
@@ -64,7 +64,7 @@ class TestModelStatesAt < MiniTest::Test
64
64
  assert_equal 1, tu.area
65
65
  assert_equal n.id, tu.state_id
66
66
  assert_equal 2, tu.level
67
- assert_equal 'ADM2', tu.place_kind
67
+ assert_equal 'COUN', tu.place_kind
68
68
 
69
69
  ### test place
70
70
  assert_equal 'Tulln', tu.place.name
@@ -94,7 +94,7 @@ class TestModelStatesAt < MiniTest::Test
94
94
  assert_equal n.id, gr.state_id
95
95
  assert_equal tu.id, gr.county_id
96
96
  assert_equal 3, gr.level
97
- assert_equal 'ADM3', gr.place_kind
97
+ assert_equal 'MUNI', gr.place_kind
98
98
 
99
99
  ### test place
100
100
  assert_equal 'Grafenwörth', gr.place.name
@@ -36,7 +36,7 @@ class TestModelStatesDe < MiniTest::Test
36
36
  assert_equal 1, by.area
37
37
  assert_equal de.id, by.country_id
38
38
  assert_equal 1, by.level
39
- assert_equal 'ADM1', by.place_kind
39
+ assert_equal 'STAT', by.place_kind
40
40
 
41
41
  ### test place
42
42
  assert_equal 'Bayern', by.place.name
@@ -64,7 +64,7 @@ class TestModelStatesDe < MiniTest::Test
64
64
  assert_equal 1, ob.area
65
65
  assert_equal by.id, ob.state_id
66
66
  assert_equal 2, ob.level
67
- assert_equal 'ADM2', ob.place_kind
67
+ assert_equal 'PART', ob.place_kind
68
68
 
69
69
  ### test place
70
70
  assert_equal 'Oberbayern', ob.place.name
@@ -95,7 +95,7 @@ class TestModelStatesDe < MiniTest::Test
95
95
  assert_equal by.id, fs.state_id
96
96
  assert_equal ob.id, fs.part_id
97
97
  assert_equal 3, fs.level
98
- assert_equal 'ADM3', fs.place_kind
98
+ assert_equal 'COUN', fs.place_kind
99
99
 
100
100
  ### test place
101
101
  assert_equal 'Freising', fs.place.name
@@ -129,7 +129,7 @@ class TestModelStatesDe < MiniTest::Test
129
129
  assert_equal by.id, au.state_id
130
130
  assert_equal fs.id, au.county_id
131
131
  assert_equal 4, au.level
132
- assert_equal 'ADM4', au.place_kind
132
+ assert_equal 'MUNI', au.place_kind
133
133
 
134
134
  ### test place
135
135
  assert_equal 'Au i.d. Hallertau', au.place.name
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_name_parser.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+ class TestNameParser < MiniTest::Test
11
+
12
+ def test_bayern
13
+ names = NameParser.new.parse( [ 'Bayern [Bavaria]' ] )
14
+
15
+ assert_equal 2, names.size
16
+ assert_equal 'Bayern', names[0]
17
+ assert_equal 'Bavaria', names[1]
18
+ end
19
+
20
+ def test_brussel
21
+ names = NameParser.new.parse( [ 'Brussel•Bruxelles [Brussels]' ] )
22
+
23
+ ## fix: (auto-)split into three variants e.g.Brussel•Bruxelles, Brussel, Bruxelles
24
+ assert_equal 2, names.size
25
+ assert_equal 'Brussel•Bruxelles', names[0]
26
+ assert_equal 'Brussels', names[1]
27
+ end
28
+
29
+ def test_antwerp
30
+ names = NameParser.new.parse( [ 'Antwerpen|Anvers [Antwerp]' ] )
31
+
32
+ assert_equal 3, names.size
33
+ assert_equal 'Antwerpen', names[0]
34
+ assert_equal 'Anvers', names[1]
35
+ assert_equal 'Antwerp', names[2]
36
+ end
37
+
38
+ end # class TestNameParser
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.0
4
+ version: 2.3.1
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-08 00:00:00.000000000 Z
11
+ date: 2015-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: props
@@ -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_parser.rb
246
247
  - test/test_parse_city.rb
247
248
  - test/test_parse_country.rb
248
249
  - test/test_parse_state.rb
@@ -276,6 +277,7 @@ signing_key:
276
277
  specification_version: 4
277
278
  summary: worlddb - world.db schema 'n' models for easy (re)use
278
279
  test_files:
280
+ - test/test_name_parser.rb
279
281
  - test/test_models.rb
280
282
  - test/adm/test_read_tree.rb
281
283
  - test/adm/test_fixture_matcher_tree.rb