gmaps4rails 1.5.3 → 1.5.4

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.
data/.travis.yml CHANGED
@@ -3,8 +3,7 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
- gemfile:
7
- - Gemfile
6
+
8
7
  before_script: 'cd spec/dummy/; rake db:migrate RAILS_ENV=test; cd ../..'
9
8
  script: 'rspec spec'
10
9
  after_script: 'bundle exec guard-jasmine -u http://localhost:8888/'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gmaps4rails (1.5.3)
4
+ gmaps4rails (1.5.4)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.rdoc CHANGED
@@ -66,6 +66,14 @@ Create a migration and add the following fields to your table (here users):
66
66
  add_column :users, :longitude, :float #you can change the name, see wiki
67
67
  add_column :users, :gmaps, :boolean #not mandatory, see wiki
68
68
 
69
+ == Basic configuration: Non-relational DB
70
+
71
+ Mongoid example:
72
+
73
+ acts_as_gmappable :position => :location
74
+
75
+ field :location, :type => Array
76
+
69
77
  == How to?
70
78
  === QuickStart!
71
79
  In your controller:
data/gmaps4rails.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
 
18
18
  s.add_development_dependency "rails", "~> 3.2.1"
19
19
  s.add_development_dependency "sqlite3"
20
+ s.add_development_dependency "mongoid", "~> 3" if RUBY_VERSION == "1.9.3"
20
21
  s.add_development_dependency 'jquery-rails'
21
22
  s.add_development_dependency "rspec-rails"
22
23
  s.add_development_dependency 'database_cleaner'
@@ -1,26 +1,18 @@
1
1
  module Gmaps4rails
2
2
  module ActsAsGmappable
3
-
4
- def self.included base
5
- base.send :include, InstanceMethods
6
- base.send :extend, ClassMethods
3
+ extend ActiveSupport::Concern
4
+
5
+ # This is a validation method which triggers the geocoding and save its results
6
+ def process_geocoding
7
+ Gmaps4rails::ModelHandler.new(self, gmaps4rails_options).retrieve_coordinates
7
8
  end
8
9
 
9
- module InstanceMethods
10
-
11
- # This is a validation method which triggers the geocoding and save its results
12
- def process_geocoding
13
- Gmaps4rails::ModelHandler.new(self, gmaps4rails_options).retrieve_coordinates
14
- end
15
-
16
- # creates json for one instance
17
- def to_gmaps4rails(&block)
18
- json = "["
19
- object_json = Gmaps4rails.create_json(self, &block)
20
- json << object_json.to_s unless object_json.nil?
21
- json << "]"
22
- end
23
-
10
+ # creates json for one instance
11
+ def to_gmaps4rails(&block)
12
+ json = "["
13
+ object_json = Gmaps4rails.create_json(self, &block)
14
+ json << object_json.to_s unless object_json.nil?
15
+ json << "]"
24
16
  end
25
17
 
26
18
  module ClassMethods
@@ -38,6 +30,10 @@ module Gmaps4rails
38
30
 
39
31
  :lat_column => args[:lat] || "latitude",
40
32
  :lng_column => args[:lng] || "longitude",
33
+
34
+ # purposefully no default.
35
+ # Leaving out the :position arg means we are using the default lat/lng to store coordinates
36
+ :position => args[:position],
41
37
 
42
38
  :msg => args[:msg] || "Address invalid",
43
39
  :validation => args[:validation].nil? ? true : args[:validation],
@@ -20,6 +20,7 @@ module Gmaps4rails
20
20
  autoload :Geocoder, 'gmaps4rails/api_wrappers/geocoder'
21
21
  autoload :Direction, 'gmaps4rails/api_wrappers/direction'
22
22
  autoload :Places, 'gmaps4rails/api_wrappers/places'
23
+ autoload :ObjectAccessor, 'gmaps4rails/object_accessor'
23
24
 
24
25
  mattr_accessor :http_proxy
25
26
 
@@ -25,9 +25,12 @@ module Gmaps4rails
25
25
  # end
26
26
  #
27
27
  class JsonBuilder
28
+
29
+ delegate :position, :lat_column, :lng_column, :to => :@options
28
30
 
29
31
  def initialize(object)
30
32
  @object, @json_hash, @custom_json = object, Hash.new, nil
33
+ @options = OpenStruct.new @object.gmaps4rails_options
31
34
  end
32
35
 
33
36
  def process(&block)
@@ -72,10 +75,12 @@ module Gmaps4rails
72
75
  :description => :gmaps4rails_infowindow,
73
76
  :title => :gmaps4rails_title,
74
77
  :sidebar => :gmaps4rails_sidebar,
75
- :marker_picture => :gmaps4rails_marker_picture,
76
- :lat => @object.gmaps4rails_options[:lat_column],
77
- :lng => @object.gmaps4rails_options[:lng_column]
78
- }
78
+ :marker_picture => :gmaps4rails_marker_picture
79
+ }.merge(coordinates_attributes)
80
+ end
81
+
82
+ def coordinates_attributes
83
+ position_from_array? ? {:position => position } : {:lat => lat_column, :lng => lng_column}
79
84
  end
80
85
 
81
86
  def handle_model_methods
@@ -83,6 +88,8 @@ module Gmaps4rails
83
88
  if @object.respond_to? method_name
84
89
  if json_name == :marker_picture
85
90
  @json_hash.merge!(@object.send(method_name)) unless @json_hash.has_key? "picture"
91
+ elsif json_name == :position
92
+ @json_hash.merge!(:lat => lat, :lng => lng)
86
93
  else
87
94
  @json_hash[json_name] = @object.send(method_name) unless @json_hash.has_key? json_name
88
95
  end
@@ -108,7 +115,7 @@ module Gmaps4rails
108
115
  end
109
116
 
110
117
  def compliant?
111
- !(@object.send(@object.gmaps4rails_options[:lat_column]).blank? && @object.send(@object.gmaps4rails_options[:lng_column]).blank?)
118
+ !(lat.blank? && lng.blank?)
112
119
  end
113
120
 
114
121
  def handle_block(&block)
@@ -116,6 +123,18 @@ module Gmaps4rails
116
123
  @custom_json = block_result unless block_result == true
117
124
  end
118
125
 
126
+ def position_from_array?
127
+ position #if gmaps4rails_options[:position] is filled, means user is indicating an array
128
+ end
129
+
130
+ def lat
131
+ position_from_array? ? @object.send("#{position}")[0] : @object.send("#{lat_column}")
132
+ end
133
+
134
+ def lng
135
+ position_from_array? ? @object.send("#{position}")[1] : @object.send("#{lng_column}")
136
+ end
137
+
119
138
  end
120
139
 
121
140
  end
@@ -4,9 +4,9 @@ module Gmaps4rails
4
4
 
5
5
  attr_accessor :options, :object
6
6
 
7
- delegate :process_geocoding, :check_process, :checker, :lat_column, :lng_column, :msg, :validation,
7
+ delegate :process_geocoding, :check_process, :checker, :lat_column, :lng_column, :position, :msg, :validation,
8
8
  :language, :protocol, :address, :callback, :normalized_address,
9
- :to => :@options
9
+ :to => :options
10
10
 
11
11
  def initialize(object, gmaps4rails_options)
12
12
  @options = ::OpenStruct.new(gmaps4rails_options)
@@ -16,19 +16,41 @@ module Gmaps4rails
16
16
  # saves coordinates according to the various options
17
17
  def retrieve_coordinates
18
18
  return if prevent_geocoding?
19
- checked_coordinates do
20
- object.send("#{lng_column}=", coordinates.first[:lng])
21
- object.send("#{lat_column}=", coordinates.first[:lat])
19
+ checked_coordinates do
20
+ position? ? set_position : set_lat_lng
22
21
  # save normalized address if required
23
22
  object.send("#{normalized_address}=", coordinates.first[:matched_address]) if normalized_address
24
23
  # Call the callback method to let the user do what he wants with the data
25
- object.send(callback, coordinates.first[:full_data]) if callback
24
+ object.send callback, coordinates.first[:full_data] if callback
26
25
  # update checker if required
27
26
  object.send("#{checker}=", true) if check_geocoding?
28
27
  end
29
28
  end
30
29
 
31
30
  private
31
+
32
+ # sets array for non relationnal db
33
+ def set_position
34
+ object.send("#{position}=", [lat, lng])
35
+ end
36
+
37
+ #sets regular columns
38
+ def set_lat_lng
39
+ object.send("#{lng_column}=", lng)
40
+ object.send("#{lat_column}=", lat)
41
+ end
42
+
43
+ def lat
44
+ coordinates.first[:lat]
45
+ end
46
+
47
+ def lng
48
+ coordinates.first[:lng]
49
+ end
50
+
51
+ def position?
52
+ position
53
+ end
32
54
 
33
55
  def checked_coordinates(&block)
34
56
  yield if coordinates
@@ -1,3 +1,3 @@
1
1
  module Gmaps4rails
2
- VERSION = "1.5.3"
2
+ VERSION = "1.5.4"
3
3
  end
@@ -0,0 +1,16 @@
1
+ if RUBY_VERSION == "1.9.3"
2
+
3
+ require 'mongoid'
4
+
5
+ class Place
6
+ include Mongoid::Document
7
+ include Gmaps4rails::ActsAsGmappable
8
+
9
+ acts_as_gmappable :address => :address, :position => :pos
10
+
11
+ field :pos, :type => Array
12
+ field :address, :type => String
13
+ field :gmaps, :type => Boolean
14
+ end
15
+
16
+ end
@@ -0,0 +1,16 @@
1
+ FactoryGirl.define do
2
+ factory :place do
3
+
4
+ trait :paris do
5
+ address "Paris, France"
6
+ end
7
+
8
+ trait :invalid do
9
+ address "home"
10
+ end
11
+
12
+ address "Toulon, France"
13
+
14
+ factory :place_paris, :traits => [:paris]
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ if RUBY_VERSION == "1.9.3"
2
+
3
+ require 'spec_helper'
4
+
5
+ include Geocoding
6
+
7
+ set_gmaps4rails_options!
8
+
9
+ # Mongoid 3.x only
10
+ require 'mongoid'
11
+ require 'moped'
12
+
13
+ Mongoid.configure do |config|
14
+ config.connect_to('mongoid_geo_test')
15
+ end
16
+
17
+ describe Gmaps4rails::ActsAsGmappable do
18
+
19
+ let(:place) { Factory(:place) }
20
+ let(:invalid_place) { Factory.build(:invalid_place) }
21
+
22
+ before(:each) do
23
+ Geocoding.stub_geocoding
24
+ end
25
+
26
+ context "standard configuration, valid place" do
27
+ it "should save longitude and latitude to the customized position array" do
28
+ set_gmaps4rails_options!(:position => 'location')
29
+ place.pos.should_not be_nil
30
+ place.should have_same_position_as TOULON
31
+ end
32
+ end
33
+ end
34
+
35
+ end
@@ -1,4 +1,5 @@
1
1
  require 'rspec/expectations'
2
+ require 'ostruct'
2
3
 
3
4
  def has_same_content_as?(actual, expected)
4
5
  case actual
@@ -27,9 +28,38 @@ def has_same_content_as?(actual, expected)
27
28
  end
28
29
  end
29
30
 
31
+ class PositionMatcher
32
+ attr_reader :object, :position_hash
33
+ delegate :position, :lat_column, :lng_column, :to => :@options
34
+
35
+ def initialize object, position_hash
36
+ @object, @position_hash = object, position_hash
37
+ @options = ::OpenStruct.new object.gmaps4rails_options
38
+ end
39
+
40
+ def same_pos?
41
+ position_hash[:latitude] == lat && position_hash[:longitude] == lng
42
+ end
43
+
44
+ protected
45
+
46
+ def lat
47
+ position ? object.send("#{position}")[0] : object.send("#{lat_column}")
48
+ end
49
+
50
+ def lng
51
+ position ? object.send("#{position}")[1] : object.send("#{lng_column}")
52
+ end
53
+
54
+ end
55
+
56
+ def position_matcher object, position_hash
57
+ PositionMatcher.new object, position_hash
58
+ end
59
+
30
60
  RSpec::Matchers.define :have_same_position_as do |position_hash|
31
61
  match do |object|
32
- object.send(object.gmaps4rails_options[:lat_column]) == position_hash[:latitude] && object.send(object.gmaps4rails_options[:lng_column]) == position_hash[:longitude]
62
+ position_matcher(object, position_hash).same_pos?
33
63
  end
34
64
  end
35
65
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gmaps4rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.5.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-08-04 00:00:00.000000000 Z
13
+ date: 2012-08-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -297,6 +297,7 @@ files:
297
297
  - spec/dummy/app/helpers/application_helper.rb
298
298
  - spec/dummy/app/mailers/.gitkeep
299
299
  - spec/dummy/app/models/.gitkeep
300
+ - spec/dummy/app/models/place.rb
300
301
  - spec/dummy/app/models/user.rb
301
302
  - spec/dummy/app/views/layouts/application.html.erb
302
303
  - spec/dummy/app/views/users/_form.html.erb
@@ -332,6 +333,7 @@ files:
332
333
  - spec/dummy/public/javascripts/Song.js
333
334
  - spec/dummy/public/logo.png
334
335
  - spec/dummy/script/rails
336
+ - spec/factories/place_factory.rb
335
337
  - spec/factories/user_factory.rb
336
338
  - spec/fixtures/google_direction_valid.json
337
339
  - spec/fixtures/google_geocoding_toulon_france.json
@@ -355,6 +357,7 @@ files:
355
357
  - spec/lib/js_builder_spec.rb
356
358
  - spec/lib/json_builder_spec.rb
357
359
  - spec/lib/places_spec.rb
360
+ - spec/models/place_spec.rb
358
361
  - spec/models/user_spec.rb
359
362
  - spec/spec_helper.rb
360
363
  - spec/support/geocoding.rb
@@ -373,7 +376,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
373
376
  version: '0'
374
377
  segments:
375
378
  - 0
376
- hash: 1278605755338962365
379
+ hash: -3497814623676724947
377
380
  required_rubygems_version: !ruby/object:Gem::Requirement
378
381
  none: false
379
382
  requirements:
@@ -382,7 +385,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
382
385
  version: '0'
383
386
  segments:
384
387
  - 0
385
- hash: 1278605755338962365
388
+ hash: -3497814623676724947
386
389
  requirements: []
387
390
  rubyforge_project:
388
391
  rubygems_version: 1.8.24
@@ -402,6 +405,7 @@ test_files:
402
405
  - spec/dummy/app/helpers/application_helper.rb
403
406
  - spec/dummy/app/mailers/.gitkeep
404
407
  - spec/dummy/app/models/.gitkeep
408
+ - spec/dummy/app/models/place.rb
405
409
  - spec/dummy/app/models/user.rb
406
410
  - spec/dummy/app/views/layouts/application.html.erb
407
411
  - spec/dummy/app/views/users/_form.html.erb
@@ -437,6 +441,7 @@ test_files:
437
441
  - spec/dummy/public/javascripts/Song.js
438
442
  - spec/dummy/public/logo.png
439
443
  - spec/dummy/script/rails
444
+ - spec/factories/place_factory.rb
440
445
  - spec/factories/user_factory.rb
441
446
  - spec/fixtures/google_direction_valid.json
442
447
  - spec/fixtures/google_geocoding_toulon_france.json
@@ -460,6 +465,7 @@ test_files:
460
465
  - spec/lib/js_builder_spec.rb
461
466
  - spec/lib/json_builder_spec.rb
462
467
  - spec/lib/places_spec.rb
468
+ - spec/models/place_spec.rb
463
469
  - spec/models/user_spec.rb
464
470
  - spec/spec_helper.rb
465
471
  - spec/support/geocoding.rb