geonames_rails 0.1.6 → 0.2.0

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.
@@ -59,9 +59,13 @@ class CreateGeonamesTables < ActiveRecord::Migration
59
59
  t.string :country_iso_code_two_letters
60
60
  # [9] cc2 : alternate country codes, comma separated, ISO-3166 2-letter country code, 60 characters
61
61
  # [10] admin1 code : fipscode (subject to change to iso code), isocode for the us and ch, see file admin1Codes.txt for display names of this code; varchar(20)
62
+ t.string :admin_1_code
62
63
  # [11] admin2 code : code for the second administrative division, a county in the US, see file admin2Codes.txt; varchar(80)
64
+ t.string :admin_2_code
63
65
  # [12] admin3 code : code for third level administrative division, varchar(20)
66
+ t.string :admin_3_code
64
67
  # [13] admin4 code : code for fourth level administrative division, varchar(20)
68
+ t.string :admin_4_code
65
69
  # [14] population : integer
66
70
  t.integer :population
67
71
  # [15] elevation : in meters, integer
@@ -72,10 +76,23 @@ class CreateGeonamesTables < ActiveRecord::Migration
72
76
  end
73
77
 
74
78
  add_index :cities, :geonames_id, :unique => true
79
+
80
+ create_table :divisions do |t|
81
+ t.integer :country_id
82
+ t.string :code
83
+ t.string :full_code
84
+ t.string :name
85
+ t.string :ascii_name
86
+ t.integer :geonames_id
87
+ end
88
+
89
+ add_index :divisions, :full_code, :unique => true
90
+ add_index :divisions, :code
91
+ add_index :divisions, :geonames_id, :unique => true
75
92
  end
76
93
 
77
94
  def self.down
78
95
  # drop all the tables
79
- %w(countries cities).each { |t| drop_table t }
96
+ %w(countries cities divisions).each { |t| drop_table t }
80
97
  end
81
98
  end
@@ -1,3 +1,4 @@
1
1
  class Country < ActiveRecord::Base
2
2
  has_many :cities
3
+ has_many :divisions
3
4
  end
@@ -0,0 +1,3 @@
1
+ class Division < ActiveRecord::Base
2
+ belongs_to :country
3
+ end
@@ -1,6 +1,7 @@
1
1
  require 'geonames_rails/mappings/base'
2
2
  require 'geonames_rails/mappings/city'
3
3
  require 'geonames_rails/mappings/country'
4
+ require 'geonames_rails/mappings/division'
4
5
  require 'zip/zipfilesystem'
5
6
 
6
7
  module GeonamesRails
@@ -17,8 +18,8 @@ module GeonamesRails
17
18
  @puller.pull if @puller # pull geonames files down
18
19
 
19
20
  load_countries
20
-
21
21
  load_cities
22
+ load_divisions
22
23
 
23
24
  @puller.cleanup if @puller # cleanup the geonames files
24
25
  end
@@ -38,14 +39,26 @@ module GeonamesRails
38
39
  end
39
40
  end
40
41
  end
41
-
42
- def load_cities
43
- %w(cities1000 cities5000 cities15000).each do |city_file|
44
- load_cities_file(city_file)
42
+
43
+ def load_divisions
44
+ log_message "opening divisions file"
45
+ File.open(File.join(Rails.root, 'tmp', 'admin1CodesASCII.txt'), 'r') do |f|
46
+ f.each_line do |line|
47
+ # skip comments
48
+ next if line.match(/^#/) || line.match(/^iso/i)
49
+
50
+ division_mapping = Mappings::Division.new(line)
51
+ result = @writer.write_division(division_mapping)
52
+
53
+ #log_message result
54
+ end
45
55
  end
56
+
46
57
  end
47
58
 
48
- def load_cities_file(city_file)
59
+ def load_cities
60
+ city_file = "cities1000"
61
+
49
62
  log_message "Loading city file #{city_file}"
50
63
  cities = []
51
64
 
@@ -0,0 +1,15 @@
1
+ module GeonamesRails
2
+ module Mappings
3
+ class Division < Base
4
+ protected
5
+ def mappings
6
+ {
7
+ :full_code => 0,
8
+ :name => 1,
9
+ :ascii_name => 2,
10
+ :geonames_id => 3
11
+ }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,7 +4,7 @@ module GeonamesRails
4
4
  @temp_geonames_files = []
5
5
  target_dir = File.join(Rails.root, 'tmp')
6
6
 
7
- file_names = %w(cities1000.zip cities5000.zip cities15000.zip admin1CodesASCII.txt countryInfo.txt)
7
+ file_names = %w(cities1000.zip admin1CodesASCII.txt countryInfo.txt)
8
8
  file_names.each do |file_name|
9
9
  url = "http://download.geonames.org/export/dump/#{file_name}"
10
10
 
@@ -24,6 +24,23 @@ module GeonamesRails
24
24
  "#{created_or_updating} db record for #{iso_code}"
25
25
  end
26
26
 
27
+ def write_division(division_mapping)
28
+ iso_code = division_mapping[:full_code][0..1]
29
+ country = Country.find_by_iso_code_two_letter(iso_code)
30
+
31
+ division = Division.find_or_initialize_by_geonames_id(division_mapping[:geonames_id])
32
+ created_or_updating = division.new_record? ? 'Creating' : 'Updating'
33
+ division.country_id = country.id
34
+ division.code = division_mapping[:full_code][3..-1]
35
+
36
+ division.attributes = division_mapping.slice(:full_code,
37
+ :name,
38
+ :ascii_name,
39
+ :geonames_id)
40
+ division.save!
41
+
42
+ "#{created_or_updating} db record for #{division_mapping[:full_code]}"
43
+ end
27
44
 
28
45
 
29
46
  def write_cities(country_code, city_mappings)
@@ -42,7 +59,11 @@ module GeonamesRails
42
59
  :country_iso_code_two_letters,
43
60
  :population,
44
61
  :geonames_timezone_id,
45
- :geonames_id)
62
+ :geonames_id,
63
+ :admin_1_code,
64
+ :admin_2_code,
65
+ :admin_3_code,
66
+ :admin_4_code)
46
67
 
47
68
  city.save!
48
69
  end
@@ -7,6 +7,12 @@ module GeonamesRails
7
7
  "Dry run of country #{country_mapping[:name]} should have been OK"
8
8
  end
9
9
 
10
+ def write_division(division_mapping)
11
+ raise "must have a of division mapping" unless division_mapping
12
+
13
+ "Dry run of country #{division_mapping[:division_id]} should have been OK"
14
+ end
15
+
10
16
  def write_cities(country_code, city_mappings)
11
17
  raise "can't create cities without a country" unless country_code
12
18
  raise "must have a set of city mappings" unless city_mappings
@@ -2,19 +2,19 @@ require 'geonames_rails'
2
2
 
3
3
  namespace :geonames_rails do
4
4
  desc 'pull down the geonames data from the server'
5
- task :pull_data => :environment do
5
+ task :pull => :environment do
6
6
  GeonamesRails::Puller.new.pull
7
7
  end
8
8
 
9
9
  desc 'pull geonames data, load into db, then clean up after itself'
10
- task :pull_and_load_data => :environment do
10
+ task :run => :environment do
11
11
  puller = GeonamesRails::Puller.new
12
12
  writer = ENV['DRY_RUN'] ? GeonamesRails::Writers::DryRun.new : GeonamesRails::Writers::ActiveRecord.new
13
13
  GeonamesRails::Loader.new(puller, writer).load_data
14
14
  end
15
15
 
16
16
  desc 'load the data from files you already have laying about'
17
- task :load_data => :environment do
17
+ task :load => :environment do
18
18
  writer = ENV['DRY_RUN'] ? GeonamesRails::Writers::DryRun.new : GeonamesRails::Writers::ActiveRecord.new
19
19
  GeonamesRails::Loader.new(nil, writer).load_data
20
20
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 6
9
- version: 0.1.6
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Marius Andra
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-02-18 00:00:00 +01:00
19
+ date: 2012-04-16 00:00:00 +02:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -58,6 +58,7 @@ files:
58
58
  - lib/geonames_rails/writers/dry_run.rb
59
59
  - lib/geonames_rails/mappings/city.rb
60
60
  - lib/geonames_rails/mappings/base.rb
61
+ - lib/geonames_rails/mappings/division.rb
61
62
  - lib/geonames_rails/mappings/country.rb
62
63
  - lib/geonames_rails/puller.rb
63
64
  - lib/geonames_rails/loader.rb
@@ -65,6 +66,7 @@ files:
65
66
  - lib/generators/geonames_rails/migration_generator.rb
66
67
  - lib/generators/geonames_rails/migration_templates/geonames_tables.rb
67
68
  - lib/generators/geonames_rails/models_templates/models/city.rb
69
+ - lib/generators/geonames_rails/models_templates/models/division.rb
68
70
  - lib/generators/geonames_rails/models_templates/models/country.rb
69
71
  - lib/generators/geonames_rails/models_generator.rb
70
72
  - lib/tasks/geonames_rails.rake