geogov 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/geogov.rb +2 -2
- data/lib/geogov/geo_stack.rb +53 -12
- data/lib/geogov/providers/mapit.rb +17 -2
- data/test/geogov_test.rb +48 -1
- metadata +6 -6
data/lib/geogov.rb
CHANGED
@@ -20,9 +20,9 @@ module Geogov
|
|
20
20
|
raise ArgumentError.new("#{instance.class} doesn't respond to #{method}")
|
21
21
|
end
|
22
22
|
|
23
|
-
caching_instance = SimpleCache.new(instance)
|
23
|
+
# caching_instance = SimpleCache.new(instance)
|
24
24
|
@@methods ||= {}
|
25
|
-
@@methods[method] =
|
25
|
+
@@methods[method] = instance
|
26
26
|
|
27
27
|
unless self.methods().include?(method)
|
28
28
|
dispatcher = <<-EOS
|
data/lib/geogov/geo_stack.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Geogov
|
2
2
|
class GeoStack
|
3
3
|
|
4
|
-
attr_accessor :ward, :council, :nation, :country, :
|
5
|
-
attr_reader :postcode
|
4
|
+
attr_accessor :ward, :council, :nation, :country, :region, :lat, :lon, :authorities, :fuzzy_point
|
5
|
+
attr_reader :postcode
|
6
6
|
|
7
7
|
def initialize(&block)
|
8
8
|
if block_given?
|
@@ -58,13 +58,10 @@ module Geogov
|
|
58
58
|
{
|
59
59
|
:fuzzy_point => self.fuzzy_point.to_hash,
|
60
60
|
:postcode => self.postcode,
|
61
|
-
:ward => self.ward,
|
62
61
|
:council => self.council,
|
63
|
-
:
|
64
|
-
:country => self.country,
|
65
|
-
:wmc => self.wmc,
|
62
|
+
:ward => self.ward,
|
66
63
|
:friendly_name => self.friendly_name
|
67
|
-
}
|
64
|
+
}#.select {|k,v| !(v.nil?) }
|
68
65
|
end
|
69
66
|
|
70
67
|
def update(hash)
|
@@ -79,6 +76,52 @@ module Geogov
|
|
79
76
|
empty.fuzzy_point = empty.calculate_fuzzy_point
|
80
77
|
end
|
81
78
|
end
|
79
|
+
|
80
|
+
def friendly_name
|
81
|
+
@friendly_name ||= build_locality
|
82
|
+
end
|
83
|
+
|
84
|
+
def has_authority?( type )
|
85
|
+
get_authority(type) ? true : false
|
86
|
+
end
|
87
|
+
|
88
|
+
def get_authority( type )
|
89
|
+
return false if self.authorities[type.upcase.to_sym] == true
|
90
|
+
self.authorities.nil? or self.authorities[type.upcase.to_sym].nil? ? false : self.authorities[type.upcase.to_sym]
|
91
|
+
end
|
92
|
+
|
93
|
+
def formatted_authority_name( type )
|
94
|
+
return false unless has_authority?(type)
|
95
|
+
name = get_authority(type)['name'].dup
|
96
|
+
|
97
|
+
name.sub!(/ *((District Council|Borough Council|Community|County Council|City Council|Council) ?)+/,'')
|
98
|
+
name.sub!(/ (North|East|South|West|Central)$/,'')
|
99
|
+
name.sub!(/Mid /,'')
|
100
|
+
|
101
|
+
name
|
102
|
+
end
|
103
|
+
|
104
|
+
def build_locality
|
105
|
+
return false unless self.authorities
|
106
|
+
|
107
|
+
case
|
108
|
+
when has_authority?('DIS') && has_authority?('CTY')
|
109
|
+
locality = ['DIS','CTY']
|
110
|
+
when has_authority?('LBO')
|
111
|
+
locality = ['LBO','London']
|
112
|
+
when has_authority?('UTA') && has_authority?('CPC') # for cornwall civil parishes
|
113
|
+
locality = ['CPC','UTA']
|
114
|
+
when has_authority?('UTA') && has_authority?('UTE')
|
115
|
+
locality = ['UTE','UTA']
|
116
|
+
when has_authority?('UTA') && has_authority?('UTW')
|
117
|
+
locality = ['UTW','UTA']
|
118
|
+
when has_authority?('MTW') && has_authority?('MTD')
|
119
|
+
locality = ['MTW','MTD']
|
120
|
+
else
|
121
|
+
return false
|
122
|
+
end
|
123
|
+
locality.map {|t| formatted_authority_name(t) || t }.uniq.join(', ')
|
124
|
+
end
|
82
125
|
|
83
126
|
def has_valid_lat_lon(hash)
|
84
127
|
return (hash['lon'] and hash['lat'] and hash['lon'] != "" and hash['lat'] != "")
|
@@ -90,16 +133,12 @@ module Geogov
|
|
90
133
|
fields = Geogov.areas_for_stack_from_postcode(postcode)
|
91
134
|
if fields
|
92
135
|
lat_lon = fields[:point]
|
93
|
-
if lat_lon
|
94
|
-
self.friendly_name = Geogov.nearest_place_name(lat_lon['lat'],lat_lon['lon'])
|
95
|
-
end
|
96
136
|
set_fields(fields.select {|k,v| k != :point})
|
97
137
|
end
|
98
138
|
end
|
99
139
|
end
|
100
140
|
|
101
141
|
def fetch_missing_fields_for_coords(lat, lon)
|
102
|
-
self.friendly_name = Geogov.nearest_place_name(lat, lon)
|
103
142
|
fields = Geogov.areas_for_stack_from_coords(lat, lon)
|
104
143
|
if ['England', 'Scotland', 'Northern Ireland', 'Wales'].include?(fields[:nation])
|
105
144
|
self.country = 'UK'
|
@@ -115,7 +154,9 @@ module Geogov
|
|
115
154
|
self.send(setter,value)
|
116
155
|
end
|
117
156
|
else
|
118
|
-
|
157
|
+
self.authorities ||= { }
|
158
|
+
self.authorities[geo] = value
|
159
|
+
# raise ArgumentError, "geo type '#{geo}' is not a valid geo type"
|
119
160
|
end
|
120
161
|
end
|
121
162
|
self
|
@@ -55,6 +55,8 @@ module Geogov
|
|
55
55
|
return 'council' # county
|
56
56
|
elsif ['DIS', 'LBO'].include?(area_type)
|
57
57
|
return 'council' # district
|
58
|
+
elsif area_type == 'EUR'
|
59
|
+
return 'region'
|
58
60
|
elsif area_type == 'WMC' # XXX Also maybe 'EUR', 'NIE', 'SPC', 'SPE', 'WAC', 'WAE', 'OLF', 'OLG', 'OMF', 'OMG')
|
59
61
|
return 'WMC'
|
60
62
|
end
|
@@ -63,8 +65,12 @@ module Geogov
|
|
63
65
|
def areas_for_stack_from_coords(lat, lon)
|
64
66
|
query = self.point("4326", [lon, lat])
|
65
67
|
results = {:point => {'lat' => lat, 'lon' => lon}}
|
68
|
+
councils = { }
|
69
|
+
|
66
70
|
query.each do |id, area_info|
|
71
|
+
type = area_info['type'].upcase.to_sym
|
67
72
|
level = translate_area_type_to_shortcut(area_info['type'])
|
73
|
+
|
68
74
|
if level
|
69
75
|
level = level.downcase.to_sym
|
70
76
|
results[level] = [] unless results[level]
|
@@ -73,15 +79,24 @@ module Geogov
|
|
73
79
|
results[level] << level_info
|
74
80
|
results[:nation] = area_info['country_name'] if results[:nation].nil?
|
75
81
|
end
|
82
|
+
|
83
|
+
councils[type] = { 'name' => area_info['name'], 'type' => area_info['type'], 'id' => area_info['id'] }
|
76
84
|
end
|
77
|
-
|
85
|
+
|
86
|
+
return councils.merge results
|
78
87
|
end
|
79
88
|
|
80
89
|
def areas_for_stack_from_postcode(postcode)
|
81
90
|
query = self.postcode(postcode)
|
82
91
|
results = {}
|
83
92
|
|
84
|
-
if query && query['
|
93
|
+
if query && query['areas']
|
94
|
+
|
95
|
+
query['areas'].each do |i, area|
|
96
|
+
type = area['type'].to_sym
|
97
|
+
results[type] = area
|
98
|
+
end
|
99
|
+
|
85
100
|
query['shortcuts'].each do |typ, i|
|
86
101
|
if i.is_a? Hash
|
87
102
|
ids = i.values()
|
data/test/geogov_test.rb
CHANGED
@@ -3,7 +3,6 @@ require 'test_helper'
|
|
3
3
|
class GovspeakTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
test "IP-located stack should have country" do
|
6
|
-
|
7
6
|
Geogov.configure do |g|
|
8
7
|
g.provider_for :centre_of_country, stub(:centre_of_country => {"lat"=>37, "lon"=>-96})
|
9
8
|
g.provider_for :remote_location, stub(:remote_location => {'country' => 'US'})
|
@@ -74,4 +73,52 @@ class GovspeakTest < Test::Unit::TestCase
|
|
74
73
|
assert_equal :country, stack.fuzzy_point.accuracy
|
75
74
|
end
|
76
75
|
|
76
|
+
test "stack with postcode returns correct locality" do
|
77
|
+
stack = Geogov::GeoStack.new
|
78
|
+
stack = stack.update( 'postcode' => "SW1A 1AA" )
|
79
|
+
|
80
|
+
assert_equal "Westminster, London", stack.friendly_name
|
81
|
+
end
|
82
|
+
|
83
|
+
test "stack with coordinates returns correct locality" do
|
84
|
+
stack = Geogov::GeoStack.new
|
85
|
+
stack = stack.update( 'lat' => "51.501009", "lon" => "-0.1415870" )
|
86
|
+
|
87
|
+
assert_equal "Westminster, London", stack.friendly_name
|
88
|
+
end
|
89
|
+
|
90
|
+
test "stack with postcode returns authorities" do
|
91
|
+
stack = Geogov::GeoStack.new
|
92
|
+
stack = stack.update( 'postcode' => "SW1A 1AA" )
|
93
|
+
|
94
|
+
assert stack.authorities.any?
|
95
|
+
end
|
96
|
+
|
97
|
+
test "stack with coordinates returns authorities" do
|
98
|
+
stack = Geogov::GeoStack.new
|
99
|
+
stack = stack.update( 'lat' => "51.501009", "lon" => "-0.1415870" )
|
100
|
+
|
101
|
+
assert stack.authorities.any?
|
102
|
+
end
|
103
|
+
|
104
|
+
test "stack with postcode returns correct locality, ward and council" do
|
105
|
+
stack = Geogov::GeoStack.new
|
106
|
+
stack = stack.update( 'postcode' => "SW1A 1AA" )
|
107
|
+
|
108
|
+
assert_equal "Westminster, London", stack.friendly_name
|
109
|
+
assert stack.ward and stack.ward.any?
|
110
|
+
assert stack.council and stack.council.any?
|
111
|
+
assert_equal "Westminster City Council", stack.council.first['name']
|
112
|
+
end
|
113
|
+
|
114
|
+
test "stack with coordinates returns correct locality, ward and council" do
|
115
|
+
stack = Geogov::GeoStack.new
|
116
|
+
stack = stack.update( 'lat' => "51.501009", "lon" => "-0.1415870" )
|
117
|
+
|
118
|
+
assert_equal "Westminster, London", stack.friendly_name
|
119
|
+
assert stack.ward and stack.ward.any?
|
120
|
+
assert stack.council and stack.council.any?
|
121
|
+
assert_equal "Westminster City Council", stack.council.first['name']
|
122
|
+
end
|
123
|
+
|
77
124
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geogov
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-01-
|
13
|
+
date: 2012-01-20 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
17
|
-
requirement: &
|
17
|
+
requirement: &70258242218540 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 0.9.0
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70258242218540
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: mocha
|
28
|
-
requirement: &
|
28
|
+
requirement: &70258242217200 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
version: 0.9.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70258242217200
|
37
37
|
description: Geolocation and utilities for UK Government single domain
|
38
38
|
email:
|
39
39
|
- ben@alphagov.co.uk
|