campfire_logic 1.1.10 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -4
- data/Gemfile.local +4 -3
- data/VERSION +1 -1
- data/app/controllers/directory_controller.rb +1 -4
- data/app/models/geocoder_google_result.rb +106 -0
- data/app/models/locale.rb +9 -27
- data/app/models/location.rb +26 -31
- data/app/views/shared/_map.html.erb +4 -4
- data/campfire_logic.gemspec +14 -12
- data/config/environments/test.rb +1 -0
- data/config/initializers/geocoder.rb +5 -0
- data/db/seeds.rb +0 -2
- data/features/step_definitions/directory_steps.rb +0 -1
- data/spec/controllers/directory_controller_spec.rb +1 -1
- data/spec/models/locale_spec.rb +0 -1
- data/spec/models/location_spec.rb +3 -13
- metadata +38 -25
- data/app/models/zip_code.rb +0 -48
- data/app/models/zip_code_import.rb +0 -19
- data/db/zip_codes.txt +0 -42742
data/Gemfile
CHANGED
@@ -2,13 +2,14 @@ source 'http://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'bson_ext'
|
4
4
|
gem 'fastercsv'
|
5
|
-
gem '
|
6
|
-
gem 'mongoid'
|
5
|
+
gem 'geocoder'
|
7
6
|
gem 'mongoid-tree'
|
8
7
|
gem 'rails', '~> 3.0.0'
|
8
|
+
gem 'redis'
|
9
9
|
gem 'scaffold_logic'
|
10
10
|
gem 'stateflow'
|
11
11
|
gem 'stringex'
|
12
|
+
gem 'SystemTimer'
|
12
13
|
|
13
14
|
group :development do
|
14
15
|
gem 'jeweler'
|
@@ -18,7 +19,6 @@ group :test do
|
|
18
19
|
gem 'be_valid_asset'
|
19
20
|
gem 'cucumber-rails'
|
20
21
|
gem 'database_cleaner'
|
21
|
-
gem 'launchy'
|
22
22
|
gem 'mocha'
|
23
23
|
gem 'rspec-rails'
|
24
|
-
end
|
24
|
+
end
|
data/Gemfile.local
CHANGED
@@ -2,12 +2,14 @@ source 'http://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'bson_ext'
|
4
4
|
gem 'fastercsv'
|
5
|
-
gem '
|
5
|
+
gem 'geocoder'
|
6
6
|
gem 'mongoid-tree'
|
7
|
-
gem 'rails', '3.0.
|
7
|
+
gem 'rails', '~> 3.0.0'
|
8
|
+
gem 'redis'
|
8
9
|
gem 'scaffold_logic', :path => '~/Documents/projects/scaffold_logic'
|
9
10
|
gem 'stateflow'
|
10
11
|
gem 'stringex'
|
12
|
+
gem 'SystemTimer'
|
11
13
|
|
12
14
|
group :development do
|
13
15
|
gem 'jeweler'
|
@@ -17,7 +19,6 @@ group :test do
|
|
17
19
|
gem 'be_valid_asset'
|
18
20
|
gem 'cucumber-rails'
|
19
21
|
gem 'database_cleaner'
|
20
|
-
gem 'launchy'
|
21
22
|
gem 'mocha'
|
22
23
|
gem 'rspec-rails'
|
23
24
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
@@ -51,10 +51,7 @@ class DirectoryController < ApplicationController
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def search_by_zip
|
54
|
-
|
55
|
-
_zip = ZipCode.first(:conditions => {:zip => params[:criteria]}) || ZipCode.create(:zip => params[:criteria])
|
56
|
-
|
57
|
-
@locations = Location.near(:lat_lng => _zip.lat_lng).limit(10)
|
54
|
+
@locations = Location.near(params[:criteria]).limit(10)
|
58
55
|
end
|
59
56
|
|
60
57
|
# Returns a hash specifying the abbreviation for a two-letter query or the name otherwise. Blank queries return null.
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'logger'
|
3
|
+
require 'net/http'
|
4
|
+
require 'rack'
|
5
|
+
|
6
|
+
class GeocoderGoogleResult
|
7
|
+
# Returns the complete formatted address with standardized abbreviations.
|
8
|
+
attr_reader :formatted_address
|
9
|
+
# Returns the formatted street address with standardized abbreviations.
|
10
|
+
attr_reader :formatted_street_address
|
11
|
+
# Self-explanatory
|
12
|
+
attr_reader :city, :country_long_name, :country_short_name, :county, :lat, :lng, :postal_code, :state_long_name, :state_short_name
|
13
|
+
|
14
|
+
# Instance Methods: Overrides ====================================================================
|
15
|
+
|
16
|
+
# Returns a GeocoderGoogleResult initialized with the specified Google geocoding results.
|
17
|
+
#
|
18
|
+
# ==== Attributes
|
19
|
+
#
|
20
|
+
# * +google_result+ - a hash of Google geocoding results
|
21
|
+
#
|
22
|
+
# ==== Examples
|
23
|
+
#
|
24
|
+
# white_house = GoogleMapsGeocoder.new '1600 Pennsylvania Washington'
|
25
|
+
# white_house.formatted_address
|
26
|
+
# => "1600 Pennsylvania Ave NW, Washington D.C., DC 20500, USA"
|
27
|
+
def initialize google_result
|
28
|
+
@json = google_result
|
29
|
+
@city, @country_short_name, @country_long_name, @county, @formatted_address, @formatted_street_address, @lat, @lng, @postal_code, @state_long_name, @state_short_name = parse_city, parse_country_short_name, parse_country_long_name, parse_county, parse_formatted_address, parse_formatted_street_address, parse_lat, parse_lng, parse_postal_code, parse_state_long_name, parse_state_short_name
|
30
|
+
end
|
31
|
+
|
32
|
+
# Instance Methods ===============================================================================
|
33
|
+
|
34
|
+
# Returns true if the address Google returns is an exact match.
|
35
|
+
#
|
36
|
+
# ==== Examples
|
37
|
+
#
|
38
|
+
# white_house = GoogleMapsGeocoder.new('1600 Pennsylvania Ave')
|
39
|
+
# white_house.exact_match?
|
40
|
+
# => true
|
41
|
+
def exact_match?
|
42
|
+
! self.partial_match?
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns true if the address Google returns isn't an exact match.
|
46
|
+
#
|
47
|
+
# ==== Examples
|
48
|
+
#
|
49
|
+
# white_house = GoogleMapsGeocoder.new('1600 Pennsylvania Washington')
|
50
|
+
# white_house.exact_match?
|
51
|
+
# => false
|
52
|
+
def partial_match?
|
53
|
+
@json['partial_match'] == true
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def parse_address_component_type(type, name='long_name')
|
59
|
+
_address_component = @json['address_components'].detect{ |ac| ac['types'] && ac['types'].include?(type) }
|
60
|
+
_address_component && _address_component[name]
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_city
|
64
|
+
parse_address_component_type('sublocality') || parse_address_component_type('locality')
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_country_long_name
|
68
|
+
parse_address_component_type('country')
|
69
|
+
end
|
70
|
+
|
71
|
+
def parse_country_short_name
|
72
|
+
parse_address_component_type('country', 'short_name')
|
73
|
+
end
|
74
|
+
|
75
|
+
def parse_county
|
76
|
+
parse_address_component_type('administrative_area_level_2')
|
77
|
+
end
|
78
|
+
|
79
|
+
def parse_formatted_address
|
80
|
+
@json['formatted_address']
|
81
|
+
end
|
82
|
+
|
83
|
+
def parse_formatted_street_address
|
84
|
+
"#{parse_address_component_type('street_number')} #{parse_address_component_type('route')}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def parse_lat
|
88
|
+
@json['geometry']['location']['lat']
|
89
|
+
end
|
90
|
+
|
91
|
+
def parse_lng
|
92
|
+
@json['geometry']['location']['lng']
|
93
|
+
end
|
94
|
+
|
95
|
+
def parse_postal_code
|
96
|
+
parse_address_component_type('postal_code')
|
97
|
+
end
|
98
|
+
|
99
|
+
def parse_state_long_name
|
100
|
+
parse_address_component_type('administrative_area_level_1')
|
101
|
+
end
|
102
|
+
|
103
|
+
def parse_state_short_name
|
104
|
+
parse_address_component_type('administrative_area_level_1', 'short_name')
|
105
|
+
end
|
106
|
+
end
|
data/app/models/locale.rb
CHANGED
@@ -3,23 +3,20 @@ class Locale
|
|
3
3
|
require 'stringex'
|
4
4
|
|
5
5
|
include LuckySneaks::StringExtensions
|
6
|
+
include Geocoder::Model::Mongoid
|
6
7
|
include Mongoid::Document
|
7
8
|
include Mongoid::Timestamps
|
8
9
|
include Mongoid::Tree
|
9
10
|
|
10
|
-
# Constants ======================================================================================
|
11
|
-
|
12
11
|
# Mongo Config ===================================================================================
|
12
|
+
belongs_to :location
|
13
13
|
field :name
|
14
14
|
field :abbreviation
|
15
15
|
field :slug
|
16
16
|
field :accuracy, :type => Integer
|
17
|
-
field :
|
17
|
+
field :coordinates, :type => Array
|
18
18
|
field :kind
|
19
|
-
index [[ :
|
20
|
-
|
21
|
-
# Relationships ==================================================================================
|
22
|
-
referenced_in :location
|
19
|
+
index [[ :coordinates, Mongo::GEO2D ]], :min => -200, :max => 200
|
23
20
|
|
24
21
|
# Scopes =========================================================================================
|
25
22
|
scope :canada, :where => {:name => 'Canada'}
|
@@ -34,6 +31,7 @@ class Locale
|
|
34
31
|
|
35
32
|
# Macros =========================================================================================
|
36
33
|
attr_accessor :skip_geocoding
|
34
|
+
geocoded_by :geocoding_address
|
37
35
|
|
38
36
|
# Class Methods: Initialization ==================================================================
|
39
37
|
|
@@ -54,7 +52,7 @@ class Locale
|
|
54
52
|
|
55
53
|
def post_process
|
56
54
|
self.set_slug
|
57
|
-
self.geocode
|
55
|
+
self.geocode unless self.skip_geocoding || self.geocoding_address.blank?
|
58
56
|
self.set_kind
|
59
57
|
self.save
|
60
58
|
end
|
@@ -62,8 +60,8 @@ class Locale
|
|
62
60
|
# Instance methods: Overrides ====================================================================
|
63
61
|
|
64
62
|
# Returns this locale's latitude/longitude, delegating to location as needed (to prevent duplicate/conflicting coordinates).
|
65
|
-
def
|
66
|
-
self.location ? self.location.
|
63
|
+
def coordinates
|
64
|
+
self.location ? self.location.coordinates : self[:coordinates]
|
67
65
|
end
|
68
66
|
|
69
67
|
def friendly_name
|
@@ -81,25 +79,9 @@ class Locale
|
|
81
79
|
|
82
80
|
# Instance methods: Geocoding ====================================================================
|
83
81
|
|
84
|
-
# Geocodes this location.
|
85
|
-
def geocode
|
86
|
-
return if self.skip_geocoding || self.geocoding_address.blank?
|
87
|
-
|
88
|
-
unless @geocoder
|
89
|
-
@geocoder = GoogleMapsGeocoder.new(self.geocoding_address)
|
90
|
-
self.lat_lng = [@geocoder.lat, @geocoder.lng]
|
91
|
-
end
|
92
|
-
|
93
|
-
@geocoder
|
94
|
-
rescue SocketError
|
95
|
-
Rails.logger.error "Can't geocode without a network connection!"
|
96
|
-
rescue RuntimeError
|
97
|
-
Rails.logger.error "Can't geocode, over query limit!"
|
98
|
-
end
|
99
|
-
|
100
82
|
# Returns true if this location has a latitude and longitude.
|
101
83
|
def geocoded?
|
102
|
-
self.
|
84
|
+
self.coordinates.is_a?(Array)
|
103
85
|
end
|
104
86
|
|
105
87
|
# Returns this locale's address for geocoding.
|
data/app/models/location.rb
CHANGED
@@ -2,6 +2,7 @@ Stateflow.persistence = :mongoid
|
|
2
2
|
|
3
3
|
class Location
|
4
4
|
include CampfireLogic::Base
|
5
|
+
include Geocoder::Model::Mongoid
|
5
6
|
include Mongoid::Document
|
6
7
|
include Mongoid::Timestamps
|
7
8
|
include Stateflow
|
@@ -26,18 +27,24 @@ class Location
|
|
26
27
|
field :meta_description
|
27
28
|
field :accuracy, :type => Integer
|
28
29
|
field :address_status
|
29
|
-
field :
|
30
|
+
field :coordinates, :type => Array
|
30
31
|
field :validated_address1
|
31
32
|
field :validated_city
|
32
33
|
field :validated_zip
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
# Callbacks ======================================================================================
|
34
|
+
has_and_belongs_to_many :services, :inverse_of => :locations
|
35
|
+
has_one :locale, :dependent => :destroy
|
36
|
+
index [[ :coordinates, Mongo::GEO2D ]], :min => -200, :max => 200
|
38
37
|
|
39
38
|
# Macros =========================================================================================
|
40
|
-
|
39
|
+
attr_accessor :geocoder_result
|
40
|
+
geocoded_by :geocoding_address do |location, results|
|
41
|
+
if geo = results.first
|
42
|
+
location.geocoder_result = GeocoderGoogleResult.new geo.data
|
43
|
+
location.country, location.country_long_name, location[:state], location.state_long_name = geo.country_code, geo.country, geo.state_code, geo.state
|
44
|
+
location.coordinates = [geo.longitude, geo.latitude]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
41
48
|
trimmed_fields :address1, :address2, :city, :email, :fax, :location_number, :name, :phone, :state, :zip
|
42
49
|
validates_presence_of :address1, :city, :state
|
43
50
|
|
@@ -60,7 +67,7 @@ class Location
|
|
60
67
|
|
61
68
|
# Validates this location's address by geocoding. Partial matches are flagged; exact matches are flagged as "validated".
|
62
69
|
event :validate_address do
|
63
|
-
transitions :from => any, :to => [:new, :partial_match, :validated], :decide => :
|
70
|
+
transitions :from => any, :to => [:new, :partial_match, :validated], :decide => :call_geocode
|
64
71
|
end
|
65
72
|
end
|
66
73
|
|
@@ -95,38 +102,26 @@ class Location
|
|
95
102
|
# Instance methods: Geocoding ====================================================================
|
96
103
|
|
97
104
|
# Geocodes this location.
|
98
|
-
def
|
105
|
+
def call_geocode
|
99
106
|
return :new if self.geocoding_address.blank?
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
self.country, self.country_long_name, self[:state], self.state_long_name = @geocoder.country_short_name, @geocoder.country_long_name, @geocoder.state_short_name, @geocoder.state_long_name
|
104
|
-
self.lat_lng = [@geocoder.lat, @geocoder.lng]
|
105
|
-
audit_address
|
106
|
-
end
|
107
|
-
|
108
|
-
@geocoder.partial_match? ? :partial_match : :validated
|
109
|
-
rescue SocketError
|
110
|
-
Rails.logger.error "Can't geocode without a network connection!"
|
111
|
-
:new
|
112
|
-
rescue RuntimeError
|
113
|
-
Rails.logger.error "Can't geocode!"
|
114
|
-
:new
|
107
|
+
geocode
|
108
|
+
audit_address
|
109
|
+
self.geocoder_result.try(:partial_match?) ? :partial_match : :validated
|
115
110
|
end
|
116
111
|
|
117
112
|
# Returns true if this location has a latitude and longitude.
|
118
113
|
def geocoded?
|
119
|
-
self.
|
114
|
+
self.coordinates.is_a?(Array)
|
120
115
|
end
|
121
116
|
|
122
117
|
# Returns true if the specified address field matches the geocoder's results.
|
123
118
|
def matches_geocoder?(attribute)
|
124
|
-
|
119
|
+
geocoder_result.blank? || self.send(attribute) == geocoder_result.send(GOOGLE_MAPS_GEOCODER_FIELDS_BY_LOCATION_FIELD[attribute])
|
125
120
|
end
|
126
121
|
|
127
122
|
# Returns the n nearest locations.
|
128
123
|
def nearby_locations(n = 5)
|
129
|
-
Location.near(:
|
124
|
+
Location.near(:coordinates => self.coordinates).limit(n + 1).select{ |l| l != self }
|
130
125
|
end
|
131
126
|
|
132
127
|
# Instance methods: Locales ======================================================================
|
@@ -157,18 +152,18 @@ class Location
|
|
157
152
|
|
158
153
|
# Compares this location's address with the geocoder's results.
|
159
154
|
def audit_address
|
160
|
-
if
|
155
|
+
if self.geocoder_result && self.geocoder_result.partial_match?
|
161
156
|
GOOGLE_MAPS_GEOCODER_FIELDS_BY_LOCATION_FIELD.keys.each do |field|
|
162
157
|
# set "validated_" field to geocoder's result
|
163
|
-
self.send("validated_#{field}=",
|
158
|
+
self.send("validated_#{field}=", geocoder_result.send(GOOGLE_MAPS_GEOCODER_FIELDS_BY_LOCATION_FIELD[field])) unless self.matches_geocoder?(field)
|
164
159
|
end
|
165
160
|
end
|
166
161
|
end
|
167
162
|
|
168
163
|
# Clears all addressing data set by the geocoder.
|
169
164
|
def clear_geocoding
|
170
|
-
|
171
|
-
self.country, self.country_long_name, self.
|
165
|
+
self.geocoder_result = nil
|
166
|
+
self.country, self.country_long_name, self.coordinates, self.state_long_name, self.validated_address1, self.validated_city, self.validated_zip = nil
|
172
167
|
clear_address
|
173
168
|
end
|
174
169
|
|
@@ -5,9 +5,9 @@
|
|
5
5
|
var directionsService = new google.maps.DirectionsService();
|
6
6
|
var locations = [
|
7
7
|
<%- if place && place.location? && place.geocoded? -%>
|
8
|
-
<%= raw "['#{h(escape_javascript place.location.name)}', #{place.
|
8
|
+
<%= raw "['#{h(escape_javascript place.location.name)}', #{place.coordinates[0]}, #{place.coordinates[1]}, '#{h(escape_javascript place.location.name)}<br />#{h(escape_javascript place.location.address1)}<br />#{h(escape_javascript place.location.city)}, #{h(escape_javascript place.location.state)} #{h(escape_javascript place.location.zip)}<br /><br />Directions: <a href=\"javascript:showDirectionsTo(0)\">To here<\/a> / <a href=\"javascript:showDirectionsFrom(0)\">From here<\/a>']" -%>
|
9
9
|
<%- else -%>
|
10
|
-
<%= raw locations.select{ |l| l.geocoded? }.inject([]) { |a, l| i = a.size; a << "['#{h(escape_javascript l.name)}', #{l.
|
10
|
+
<%= raw locations.select{ |l| l.geocoded? }.inject([]) { |a, l| i = a.size; a << "['#{h(escape_javascript l.name)}', #{l.coordinates[0]}, #{l.coordinates[1]}, '#{link_to h(escape_javascript l.name), l.locale.to_url}<br />#{h(escape_javascript l.address1)}<br />#{h(escape_javascript l.city)}, #{h(escape_javascript l.state)} #{h(escape_javascript l.zip)}<br /><br />Directions: <a href=\"javascript:showDirectionsTo(#{i})\">To here<\/a> / <a href=\"javascript:showDirectionsFrom(#{i})\">From here<\/a>']"; a } * ",\r" -%>
|
11
11
|
<%- end -%>
|
12
12
|
];
|
13
13
|
var map;
|
@@ -18,9 +18,9 @@
|
|
18
18
|
var myOptions = {
|
19
19
|
zoom: <%= place && place.zoom_level || 4 -%>,
|
20
20
|
<%- if place && place.geocoded? -%>
|
21
|
-
center: new google.maps.LatLng(<%= place.
|
21
|
+
center: new google.maps.LatLng(<%= place.coordinates[0] -%>, <%= place.coordinates[1] -%>),
|
22
22
|
<%- elsif place && place.parent && place.parent.geocoded? -%>
|
23
|
-
center: new google.maps.LatLng(<%= place.parent.
|
23
|
+
center: new google.maps.LatLng(<%= place.parent.coordinates[0] -%>, <%= place.parent.coordinates[1] -%>),
|
24
24
|
<%- else -%>
|
25
25
|
center: new google.maps.LatLng(37.09024, -95.712891),
|
26
26
|
<%- end -%>
|
data/campfire_logic.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "campfire_logic"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Roderick Monje"]
|
12
|
-
s.date = "2012-01-
|
12
|
+
s.date = "2012-01-29"
|
13
13
|
s.description = "Users can browse locations by country, city, and state and search locations by string or zip code. Administrators can manage locations and the services they offer."
|
14
14
|
s.email = "rod@seologic.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,12 +26,11 @@ Gem::Specification.new do |s|
|
|
26
26
|
"app/controllers/locations_controller.rb",
|
27
27
|
"app/controllers/services_controller.rb",
|
28
28
|
"app/helpers/application_helper.rb",
|
29
|
+
"app/models/geocoder_google_result.rb",
|
29
30
|
"app/models/locale.rb",
|
30
31
|
"app/models/location.rb",
|
31
32
|
"app/models/location_import.rb",
|
32
33
|
"app/models/service.rb",
|
33
|
-
"app/models/zip_code.rb",
|
34
|
-
"app/models/zip_code_import.rb",
|
35
34
|
"app/views/directory/_search_form.html.erb",
|
36
35
|
"app/views/directory/_show_children.html.erb",
|
37
36
|
"app/views/directory/_show_location.html.erb",
|
@@ -62,6 +61,7 @@ Gem::Specification.new do |s|
|
|
62
61
|
"config/environment.rb",
|
63
62
|
"config/environments/test.rb",
|
64
63
|
"config/initializers/campfire_logic.rb",
|
64
|
+
"config/initializers/geocoder.rb",
|
65
65
|
"config/initializers/metric_fu.rb",
|
66
66
|
"config/initializers/secret_token.rb",
|
67
67
|
"config/initializers/session_store.rb",
|
@@ -69,7 +69,6 @@ Gem::Specification.new do |s|
|
|
69
69
|
"config/mongoid.yml",
|
70
70
|
"config/routes.rb",
|
71
71
|
"db/seeds.rb",
|
72
|
-
"db/zip_codes.txt",
|
73
72
|
"features/admin_manages_locations.feature",
|
74
73
|
"features/customer_browses_directory.feature",
|
75
74
|
"features/customer_searches_directory.feature",
|
@@ -141,7 +140,7 @@ Gem::Specification.new do |s|
|
|
141
140
|
]
|
142
141
|
s.homepage = "http://github.com/ivanoblomov/campfire_logic"
|
143
142
|
s.require_paths = ["lib"]
|
144
|
-
s.rubygems_version = "1.8.
|
143
|
+
s.rubygems_version = "1.8.11"
|
145
144
|
s.summary = "Rails engine that adds a location directory to your web app"
|
146
145
|
|
147
146
|
if s.respond_to? :specification_version then
|
@@ -150,38 +149,41 @@ Gem::Specification.new do |s|
|
|
150
149
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
151
150
|
s.add_runtime_dependency(%q<bson_ext>, [">= 0"])
|
152
151
|
s.add_runtime_dependency(%q<fastercsv>, [">= 0"])
|
153
|
-
s.add_runtime_dependency(%q<
|
154
|
-
s.add_runtime_dependency(%q<mongoid>, [">= 0"])
|
152
|
+
s.add_runtime_dependency(%q<geocoder>, [">= 0"])
|
155
153
|
s.add_runtime_dependency(%q<mongoid-tree>, [">= 0"])
|
156
154
|
s.add_runtime_dependency(%q<rails>, ["~> 3.0.0"])
|
155
|
+
s.add_runtime_dependency(%q<redis>, [">= 0"])
|
157
156
|
s.add_runtime_dependency(%q<scaffold_logic>, [">= 0"])
|
158
157
|
s.add_runtime_dependency(%q<stateflow>, [">= 0"])
|
159
158
|
s.add_runtime_dependency(%q<stringex>, [">= 0"])
|
159
|
+
s.add_runtime_dependency(%q<SystemTimer>, [">= 0"])
|
160
160
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
161
161
|
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
162
162
|
else
|
163
163
|
s.add_dependency(%q<bson_ext>, [">= 0"])
|
164
164
|
s.add_dependency(%q<fastercsv>, [">= 0"])
|
165
|
-
s.add_dependency(%q<
|
166
|
-
s.add_dependency(%q<mongoid>, [">= 0"])
|
165
|
+
s.add_dependency(%q<geocoder>, [">= 0"])
|
167
166
|
s.add_dependency(%q<mongoid-tree>, [">= 0"])
|
168
167
|
s.add_dependency(%q<rails>, ["~> 3.0.0"])
|
168
|
+
s.add_dependency(%q<redis>, [">= 0"])
|
169
169
|
s.add_dependency(%q<scaffold_logic>, [">= 0"])
|
170
170
|
s.add_dependency(%q<stateflow>, [">= 0"])
|
171
171
|
s.add_dependency(%q<stringex>, [">= 0"])
|
172
|
+
s.add_dependency(%q<SystemTimer>, [">= 0"])
|
172
173
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
173
174
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
174
175
|
end
|
175
176
|
else
|
176
177
|
s.add_dependency(%q<bson_ext>, [">= 0"])
|
177
178
|
s.add_dependency(%q<fastercsv>, [">= 0"])
|
178
|
-
s.add_dependency(%q<
|
179
|
-
s.add_dependency(%q<mongoid>, [">= 0"])
|
179
|
+
s.add_dependency(%q<geocoder>, [">= 0"])
|
180
180
|
s.add_dependency(%q<mongoid-tree>, [">= 0"])
|
181
181
|
s.add_dependency(%q<rails>, ["~> 3.0.0"])
|
182
|
+
s.add_dependency(%q<redis>, [">= 0"])
|
182
183
|
s.add_dependency(%q<scaffold_logic>, [">= 0"])
|
183
184
|
s.add_dependency(%q<stateflow>, [">= 0"])
|
184
185
|
s.add_dependency(%q<stringex>, [">= 0"])
|
186
|
+
s.add_dependency(%q<SystemTimer>, [">= 0"])
|
185
187
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
186
188
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
187
189
|
end
|
data/config/environments/test.rb
CHANGED
data/db/seeds.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe DirectoryController do
|
4
4
|
it 'show action should render show template' do
|
5
|
-
Locale.stubs(:find).returns(Locale.new :
|
5
|
+
Locale.stubs(:find).returns(Locale.new :coordinates => [], :slug => 'foo')
|
6
6
|
Locale.stubs(:us).returns([Locale.find])
|
7
7
|
Locale.any_instance.stubs(:children).returns([])
|
8
8
|
get :show, :slug => 'foo'
|
data/spec/models/locale_spec.rb
CHANGED
@@ -4,7 +4,6 @@ describe Locale do
|
|
4
4
|
before :all do
|
5
5
|
Locale.delete_all
|
6
6
|
Locale.init_root
|
7
|
-
GoogleMapsGeocoder.stubs(:new).returns(stub('prospect park zoo', :city => 'Brooklyn', :country_long_name => 'United States', :country_short_name => 'US', :formatted_address => '450 Flatbush Avenue', :formatted_street_address => '450 Flatbush Avenue', :lat => 1, :lng => 1, :partial_match? => false, :postal_code => '11217', :state_long_name => 'New York', :state_short_name => 'NY'))
|
8
7
|
location = Location.new :address1 => '450 Flatbush Avenue', :city => 'Brooklyn', :name => 'Prospect Park Zoo', :state => 'NY'
|
9
8
|
location.validate_address!
|
10
9
|
location.localize
|
@@ -1,10 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Location do
|
4
|
-
it 'handles query-limit errors'
|
5
|
-
ActiveSupport::JSON.stubs(:decode)
|
6
|
-
location = Location.new(:city => 'new york').geocode.should == :new
|
7
|
-
end
|
4
|
+
it 'handles query-limit errors'
|
8
5
|
end
|
9
6
|
|
10
7
|
describe Location do
|
@@ -14,22 +11,18 @@ describe Location do
|
|
14
11
|
end
|
15
12
|
|
16
13
|
before(:each) do
|
17
|
-
GoogleMapsGeocoder.stubs(:new).returns(stub('white house', :city => 'Washington', :country_short_name => 'US', :country_long_name => 'United States', :formatted_address => '1600 Pennsylvania Ave NW', :formatted_street_address => '1600 Pennsylvania Ave NW', :lat => 1, :lng => 1, :partial_match? => true, :postal_code => '20500', :state_long_name => 'District of Columbia', :state_short_name => 'DC'))
|
18
14
|
@white_house = Location.new :address1 => '1600 Pennsylvania', :city => 'Washington', :name => 'White House'
|
19
15
|
@white_house.validate_address!
|
20
16
|
@white_house.localize
|
21
17
|
|
22
|
-
|
23
|
-
@tea_lounge = Location.new :address1 => ' 837 Union St ', :address2 => ' Suite 1 ', :city => ' Brooklyn ', :name => ' Tea Lounge ', :state => ' NY ', :zip => ' 11217 '
|
18
|
+
@tea_lounge = Location.new :address1 => ' 837 Union St ', :address2 => ' Suite 1 ', :city => ' Brooklyn ', :name => ' Tea Lounge ', :state => ' NY ', :zip => ' 11215 '
|
24
19
|
@tea_lounge.validate_address!
|
25
20
|
@tea_lounge.localize
|
26
21
|
|
27
|
-
GoogleMapsGeocoder.stubs(:new).returns(stub('two boots', :city => 'Brooklyn', :country_short_name => 'US', :country_long_name => 'United States', :formatted_address => '837 Union St', :formatted_street_address => '837 Union St', :lat => 1, :lng => 1, :partial_match? => false, :postal_code => '11217', :state_long_name => 'New York', :state_short_name => 'NY'))
|
28
22
|
@two_boots = Location.new(:address1 => '514 2nd Street', :city => 'Brooklyn', :name => 'Two Boots of Brooklyn', :state => 'NY')
|
29
23
|
@two_boots.validate_address!
|
30
24
|
@two_boots.localize
|
31
25
|
|
32
|
-
GoogleMapsGeocoder.stubs(:new).returns(stub('new park', :city => 'Howard Beach', :country_short_name => 'US', :country_long_name => 'United States', :formatted_address => '15671 Crossbay Boulevard', :formatted_street_address => '15671 Crossbay Boulevard', :lat => 1, :lng => 1, :partial_match? => false, :postal_code => '11217', :state_long_name => 'New York', :state_short_name => 'NY'))
|
33
26
|
@new_park = Location.new(:address1 => '15671 Crossbay Boulevard', :city => 'Howard Beach', :name => 'New Park Pizza', :state => 'NY')
|
34
27
|
@new_park.validate_address!
|
35
28
|
@new_park.localize
|
@@ -87,7 +80,6 @@ describe Location do
|
|
87
80
|
|
88
81
|
it 're-validates modified addresses with Google Maps' do
|
89
82
|
@white_house.address1 = ''
|
90
|
-
GoogleMapsGeocoder.stubs(:new).returns(stub('white house', :city => 'Washington', :country_short_name => 'US', :country_long_name => 'United States', :formatted_address => '1600 Pennsylvania Ave NW', :formatted_street_address => '1600 Pennsylvania Ave NW', :lat => 1, :lng => 1, :partial_match? => false, :postal_code => '20500', :state_long_name => 'District of Columbia', :state_short_name => 'DC'))
|
91
83
|
@white_house.validate_address!
|
92
84
|
@white_house.should be_validated
|
93
85
|
end
|
@@ -99,8 +91,7 @@ describe Location do
|
|
99
91
|
|
100
92
|
it 'clears geocoding if any address field is modified' do
|
101
93
|
@white_house.city = 'New York'
|
102
|
-
@white_house.
|
103
|
-
@white_house.lat_lng.should be_nil
|
94
|
+
@white_house.coordinates.should be_nil
|
104
95
|
@white_house.state_long_name.should be_nil
|
105
96
|
@white_house.validated_address1.should be_nil
|
106
97
|
@white_house.validated_city.should be_nil
|
@@ -148,7 +139,6 @@ describe Location do
|
|
148
139
|
@tea_lounge.address1 = '1600 Pennsylvania Ave NW'
|
149
140
|
@tea_lounge.city = 'Washington'
|
150
141
|
@tea_lounge.state = 'DC'
|
151
|
-
GoogleMapsGeocoder.stubs(:new).returns(stub('overridden tea lounge', :city => 'Washington', :country_short_name => 'US', :country_long_name => 'United States', :formatted_address => '1600 Pennsylvania Ave NW', :formatted_street_address => '1600 Pennsylvania Ave NW', :lat => 1, :lng => 1, :partial_match? => false, :postal_code => '20500', :state_long_name => 'District of Columbia', :state_short_name => 'DC'))
|
152
142
|
@tea_lounge.validate_address!
|
153
143
|
@tea_lounge.localize
|
154
144
|
@tea_lounge.city_locale.city?.should be_true
|