geonames_rails 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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