geo_tools 1.0.1 → 1.1.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.
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+ module GeoTools
3
+ module Validations
4
+
5
+ # ActiveRecord::Validations::ClassMethods::ALL_NUMERICALITY_CHECKS
6
+ ALL_NUMERICALITY_CHECKS = { :greater_than => '>', :greater_than_or_equal_to => '>=',
7
+ :equal_to => '==', :less_than => '<', :less_than_or_equal_to => '<=',
8
+ :odd => 'odd?', :even => 'even?' }.freeze
9
+
10
+ # Sames as validates_numericality_of but additionally supports :for option
11
+ # which lets you attach an error to a different attribute.
12
+ def validates_inclusion_of_for(*attr_names)
13
+ configuration = { :on => :save }
14
+ configuration.update(attr_names.extract_options!)
15
+
16
+ enum = configuration[:in] || configuration[:within]
17
+
18
+ raise(ArgumentError, "An object with the method include? is required must be supplied as the :in option of the configuration hash") unless enum.respond_to?(:include?)
19
+
20
+ validates_each(attr_names, configuration) do |record, attr_name, value|
21
+ unless enum.include?(value)
22
+ attr_for = configuration[:for] || attr_name
23
+ record.errors.add(attr_for, :inclusion, :default => configuration[:message], :value => value)
24
+ end
25
+ end
26
+ end
27
+
28
+ # Sames as validates_numericality_of but additionally supports :for option
29
+ # which lets you attach an error to a different attribute.
30
+ def validates_numericality_of_for(*attr_names)
31
+ configuration = { :on => :save, :only_integer => false, :allow_nil => false }
32
+ configuration.update(attr_names.extract_options!)
33
+
34
+ numericality_options = ALL_NUMERICALITY_CHECKS.keys & configuration.keys
35
+
36
+ (numericality_options - [ :odd, :even ]).each do |option|
37
+ raise ArgumentError, ":#{option} must be a number" unless configuration[option].is_a?(Numeric)
38
+ end
39
+
40
+ validates_each(attr_names,configuration) do |record, attr_name, value|
41
+ raw_value = record.send("#{attr_name}_before_type_cast") || value
42
+
43
+ next if configuration[:allow_nil] and raw_value.nil?
44
+
45
+ attr_for = configuration[:for] || attr_name
46
+
47
+ if configuration[:only_integer]
48
+ unless raw_value.to_s =~ /\A[+-]?\d+\Z/
49
+ record.errors.add(attr_for, :not_a_number, :value => raw_value, :default => configuration[:message])
50
+ next
51
+ end
52
+ raw_value = raw_value.to_i
53
+ else
54
+ begin
55
+ raw_value = Kernel.Float(raw_value)
56
+ rescue ArgumentError, TypeError
57
+ record.errors.add(attr_for, :not_a_number, :value => raw_value, :default => configuration[:message])
58
+ next
59
+ end
60
+ end
61
+
62
+ numericality_options.each do |option|
63
+ case option
64
+ when :odd, :even
65
+ unless raw_value.to_i.method( ALL_NUMERICALITY_CHECKS[option])[]
66
+ record.errors.add(attr_for, option, :value => raw_value, :default => configuration[:message])
67
+ end
68
+ else
69
+ record.errors.add(attr_for, option, :default => configuration[:message], :value => raw_value, :count => configuration[option]) unless raw_value.method( ALL_NUMERICALITY_CHECKS[option])[configuration[option]]
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+
78
+
79
+ ActiveRecord::Base.send :extend, GeoTools::Validations
@@ -0,0 +1,3 @@
1
+ module GeoTools
2
+ VERSION = '1.1.0'
3
+ end
@@ -1,4 +1,6 @@
1
+ # encoding: utf-8
1
2
  require 'test_helper'
3
+ require 'geo_tools'
2
4
 
3
5
  class Treasure < ActiveRecord::Base
4
6
  acts_as_location
@@ -6,9 +8,19 @@ end
6
8
 
7
9
  class GeoToolsTest < ActiveSupport::TestCase
8
10
 
9
- context 'A location model' do
11
+ context 'A new location' do
10
12
  setup { @treasure = Treasure.new }
11
13
 
14
+ should 'display a sensible #to_s' do
15
+ assert_equal "00°00.00′, 00°00.00′", @treasure.to_s
16
+ end
17
+ end
18
+
19
+
20
+ context 'A location model' do
21
+ setup { @treasure = Treasure.new }
22
+ teardown { Treasure.destroy_all }
23
+
12
24
  should 'convert northern hemisphere latitude fields to a positive float' do
13
25
  @treasure.update_attributes location
14
26
  assert_in_delta 42.95583, @treasure.latitude, 0.0001
@@ -33,19 +45,17 @@ class GeoToolsTest < ActiveSupport::TestCase
33
45
  @treasure.update_attributes location
34
46
  assert_equal "42°57.35′N, 153°22.27′E", @treasure.to_s
35
47
  end
36
-
37
- teardown { Treasure.destroy_all }
38
48
  end
39
49
 
40
50
  context 'Location#within' do
41
- # TODO: use Factory Girl.
42
-
43
51
  context 'NE quadrant' do
44
52
  setup do
45
- @a = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'N', :longitude_degrees => '153', :longitude_hemisphere => 'E', :latitude_minutes => '12', :longitude_minutes => '47'
46
- @b = Treasure.create :latitude_degrees => '43', :latitude_hemisphere => 'N', :longitude_degrees => '153', :longitude_hemisphere => 'E'
47
- @c = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'N', :longitude_degrees => '154', :longitude_hemisphere => 'E'
53
+ @a = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'N', :longitude_degrees => 153, :longitude_hemisphere => 'E', :latitude_minutes => 12, :longitude_minutes => 47
54
+ @b = Treasure.create :latitude_degrees => 43, :latitude_hemisphere => 'N', :longitude_degrees => 153, :longitude_hemisphere => 'E'
55
+ @c = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'N', :longitude_degrees => 154, :longitude_hemisphere => 'E'
48
56
  end
57
+ teardown { Treasure.destroy_all }
58
+
49
59
  should 'return locations to nearest minute' do
50
60
  assert_same_elements [], Treasure.within(1, 1, 42, 153)
51
61
  assert_same_elements [@a, @b, @c], Treasure.within(1, 1, 43, 154)
@@ -54,15 +64,16 @@ class GeoToolsTest < ActiveSupport::TestCase
54
64
  assert_same_elements [@b], Treasure.within(1, 1, 43, f(153, 46))
55
65
  assert_same_elements [@a, @b], Treasure.within(1, 1, 43, f(153, 47))
56
66
  end
57
- teardown { Treasure.destroy_all }
58
67
  end
59
68
 
60
69
  context 'NW quadrant' do
61
70
  setup do
62
- @a = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'N', :longitude_degrees => '153', :longitude_hemisphere => 'W', :latitude_minutes => '12', :longitude_minutes => '47'
63
- @b = Treasure.create :latitude_degrees => '43', :latitude_hemisphere => 'N', :longitude_degrees => '153', :longitude_hemisphere => 'W'
64
- @c = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'N', :longitude_degrees => '154', :longitude_hemisphere => 'W'
71
+ @a = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'N', :longitude_degrees => 153, :longitude_hemisphere => 'W', :latitude_minutes => 12, :longitude_minutes => 47
72
+ @b = Treasure.create :latitude_degrees => 43, :latitude_hemisphere => 'N', :longitude_degrees => 153, :longitude_hemisphere => 'W'
73
+ @c = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'N', :longitude_degrees => 154, :longitude_hemisphere => 'W'
65
74
  end
75
+ teardown { Treasure.destroy_all }
76
+
66
77
  should 'return locations to nearest minute' do
67
78
  assert_same_elements [], Treasure.within(1, -153, 42, -1)
68
79
  assert_same_elements [@a, @b, @c], Treasure.within(1, -154, 43, -1)
@@ -71,15 +82,16 @@ class GeoToolsTest < ActiveSupport::TestCase
71
82
  assert_same_elements [@b], Treasure.within(1, f(-153, 46), 43, -1)
72
83
  assert_same_elements [@a, @b], Treasure.within(1, f(-153, 47), 43, -1)
73
84
  end
74
- teardown { Treasure.destroy_all }
75
85
  end
76
86
 
77
87
  context 'SE quadrant' do
78
88
  setup do
79
- @a = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'S', :longitude_degrees => '153', :longitude_hemisphere => 'E', :latitude_minutes => '12', :longitude_minutes => '47'
80
- @b = Treasure.create :latitude_degrees => '43', :latitude_hemisphere => 'S', :longitude_degrees => '153', :longitude_hemisphere => 'E'
81
- @c = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'S', :longitude_degrees => '154', :longitude_hemisphere => 'E'
89
+ @a = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'S', :longitude_degrees => 153, :longitude_hemisphere => 'E', :latitude_minutes => 12, :longitude_minutes => 47
90
+ @b = Treasure.create :latitude_degrees => 43, :latitude_hemisphere => 'S', :longitude_degrees => 153, :longitude_hemisphere => 'E'
91
+ @c = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'S', :longitude_degrees => 154, :longitude_hemisphere => 'E'
82
92
  end
93
+ teardown { Treasure.destroy_all }
94
+
83
95
  should 'return locations to nearest minute' do
84
96
  assert_same_elements [], Treasure.within(-42, 1, -1, 153)
85
97
  assert_same_elements [@a, @b, @c], Treasure.within(-43, 1, -1, 154)
@@ -88,15 +100,16 @@ class GeoToolsTest < ActiveSupport::TestCase
88
100
  assert_same_elements [@b], Treasure.within(-43, 1, -1, f(153, 46))
89
101
  assert_same_elements [@a, @b], Treasure.within(-43, 1, -1, f(153, 47))
90
102
  end
91
- teardown { Treasure.destroy_all }
92
103
  end
93
104
 
94
105
  context 'SW quadrant' do
95
106
  setup do
96
- @a = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'S', :longitude_degrees => '153', :longitude_hemisphere => 'W', :latitude_minutes => '12', :longitude_minutes => '47'
97
- @b = Treasure.create :latitude_degrees => '43', :latitude_hemisphere => 'S', :longitude_degrees => '153', :longitude_hemisphere => 'W'
98
- @c = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'S', :longitude_degrees => '154', :longitude_hemisphere => 'W'
107
+ @a = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'S', :longitude_degrees => 153, :longitude_hemisphere => 'W', :latitude_minutes => 12, :longitude_minutes => 47
108
+ @b = Treasure.create :latitude_degrees => 43, :latitude_hemisphere => 'S', :longitude_degrees => 153, :longitude_hemisphere => 'W'
109
+ @c = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'S', :longitude_degrees => 154, :longitude_hemisphere => 'W'
99
110
  end
111
+ teardown { Treasure.destroy_all }
112
+
100
113
  should 'return locations to nearest minute' do
101
114
  assert_same_elements [], Treasure.within(-42, -153, -1, -1)
102
115
  assert_same_elements [@a, @b, @c], Treasure.within(-43, -154, -1, -1)
@@ -105,16 +118,17 @@ class GeoToolsTest < ActiveSupport::TestCase
105
118
  assert_same_elements [@b], Treasure.within(-43, f(-153, 46), -1, -1)
106
119
  assert_same_elements [@a, @b], Treasure.within(-43, f(-153, 47), -1, -1)
107
120
  end
108
- teardown { Treasure.destroy_all }
109
121
  end
110
122
 
111
123
  context 'straddling equator and prime meridian' do
112
124
  setup do
113
- @a = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'N', :longitude_degrees => '153', :longitude_hemisphere => 'E', :latitude_minutes => '12', :longitude_minutes => '47'
114
- @b = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'N', :longitude_degrees => '153', :longitude_hemisphere => 'W', :latitude_minutes => '12', :longitude_minutes => '47'
115
- @c = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'S', :longitude_degrees => '153', :longitude_hemisphere => 'E', :latitude_minutes => '12', :longitude_minutes => '47'
116
- @d = Treasure.create :latitude_degrees => '42', :latitude_hemisphere => 'S', :longitude_degrees => '153', :longitude_hemisphere => 'W', :latitude_minutes => '12', :longitude_minutes => '47'
125
+ @a = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'N', :longitude_degrees => 153, :longitude_hemisphere => 'E', :latitude_minutes => 12, :longitude_minutes => 47
126
+ @b = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'N', :longitude_degrees => 153, :longitude_hemisphere => 'W', :latitude_minutes => 12, :longitude_minutes => 47
127
+ @c = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'S', :longitude_degrees => 153, :longitude_hemisphere => 'E', :latitude_minutes => 12, :longitude_minutes => 47
128
+ @d = Treasure.create :latitude_degrees => 42, :latitude_hemisphere => 'S', :longitude_degrees => 153, :longitude_hemisphere => 'W', :latitude_minutes => 12, :longitude_minutes => 47
117
129
  end
130
+ teardown { Treasure.destroy_all }
131
+
118
132
  should 'return locations to nearest degree' do
119
133
  assert_same_elements [], Treasure.within(-42, -153, 42, 153)
120
134
  assert_same_elements [@a, @b, @c, @d], Treasure.within(-43, -154, 43, 154)
@@ -131,15 +145,11 @@ class GeoToolsTest < ActiveSupport::TestCase
131
145
  assert_same_elements [@b, @d], Treasure.within(-43, -154, 43, f(153, 46))
132
146
  assert_same_elements [@a, @b, @c, @d], Treasure.within(-43, -154, 43, f(153, 47))
133
147
  end
134
- teardown { Treasure.destroy_all }
135
148
  end
136
149
  end
137
150
 
138
-
139
151
  private
140
152
 
141
- # TODO: use FactoryGirl instead.
142
-
143
153
  def location(params = {})
144
154
  { :latitude_degrees => 42,
145
155
  :latitude_minutes => 57,
@@ -1,14 +1,11 @@
1
- require 'rubygems'
2
-
3
1
  require 'test/unit'
4
- require 'shoulda'
2
+ require 'shoulda-context'
5
3
 
6
4
  require 'active_record'
7
5
  require 'action_view'
8
6
  require 'active_support'
9
7
  require 'active_support/test_case'
10
8
 
11
- require 'lib/geo_tools'
12
9
 
13
10
  ActiveRecord::Base.establish_connection(
14
11
  :adapter => "sqlite3",
@@ -20,3 +17,19 @@ class ActiveSupport::TestCase
20
17
  # FIXME: why won't this work?
21
18
  #self.use_transactional_fixtures = true
22
19
  end
20
+
21
+ class Test::Unit::TestCase
22
+
23
+ # Asserts that two arrays contain the same elements, the same number of times. Essentially ==, but unordered.
24
+ def assert_same_elements(a1, a2, msg=nil)
25
+ [:select, :inject, :size].each do |m|
26
+ [a1, a2].each {|a| assert_respond_to(a, m, "Are you sure that #{a.inspect} is an array? It doesn't respond to #{m}.") }
27
+ end
28
+
29
+ assert a1h = a1.inject({}) { |h,e| h[e] = a1.select { |i| i == e }.size; h }
30
+ assert a2h = a2.inject({}) { |h,e| h[e] = a2.select { |i| i == e }.size; h }
31
+
32
+ assert_equal(a1h, a2h, msg)
33
+ end
34
+
35
+ end
metadata CHANGED
@@ -1,71 +1,96 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: geo_tools
3
- version: !ruby/object:Gem::Version
4
- version: 1.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ prerelease:
5
6
  platform: ruby
6
- authors:
7
+ authors:
7
8
  - Andy Stewart
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
-
12
- date: 2010-03-16 00:00:00 +00:00
13
- default_executable:
14
- dependencies: []
15
-
16
- description:
17
- email: boss@airbladesoftware.com
12
+ date: 2012-02-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: &2153836380 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.3'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2153836380
25
+ - !ruby/object:Gem::Dependency
26
+ name: sqlite3-ruby
27
+ requirement: &2153835940 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2153835940
36
+ - !ruby/object:Gem::Dependency
37
+ name: shoulda-context
38
+ requirement: &2153830760 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.0.0
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2153830760
47
+ description: Makes using latitudes and longitudes on forms easier.
48
+ email:
49
+ - boss@airbladesoftware.com
18
50
  executables: []
19
-
20
51
  extensions: []
21
-
22
- extra_rdoc_files:
23
- - README.md
24
- files:
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - .rbenv-version
56
+ - Gemfile
25
57
  - MIT-LICENSE
26
58
  - README.md
27
59
  - Rakefile
28
- - VERSION
29
- - init.rb
30
- - install.rb
31
- - lib/air_blade/geo_tools/form_helpers.rb
32
- - lib/air_blade/geo_tools/location.rb
33
- - lib/air_blade/geo_tools/validations.rb
60
+ - geo_tools.gemspec
34
61
  - lib/geo_tools.rb
35
- - tasks/geo_tools_tasks.rake
62
+ - lib/geo_tools/form_helpers.rb
63
+ - lib/geo_tools/location.rb
64
+ - lib/geo_tools/validations.rb
65
+ - lib/geo_tools/version.rb
36
66
  - test/geo_tools_test.rb
37
67
  - test/schema.rb
38
68
  - test/test_helper.rb
39
- - uninstall.rb
40
- has_rdoc: true
41
- homepage: http://github.com/airblade/geo_tools
69
+ homepage: https://github.com/airblade/geo_tools
42
70
  licenses: []
43
-
44
71
  post_install_message:
45
- rdoc_options:
46
- - --charset=UTF-8
47
- require_paths:
72
+ rdoc_options: []
73
+ require_paths:
48
74
  - lib
49
- required_ruby_version: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: "0"
54
- version:
55
- required_rubygems_version: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- version: "0"
60
- version:
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
61
87
  requirements: []
62
-
63
- rubyforge_project:
64
- rubygems_version: 1.3.5
88
+ rubyforge_project: geo_tools
89
+ rubygems_version: 1.8.11
65
90
  signing_key:
66
91
  specification_version: 3
67
- summary: View helpers, validations, and named scopes for locations.
68
- test_files:
92
+ summary: Makes using latitudes and longitudes on forms easier.
93
+ test_files:
69
94
  - test/geo_tools_test.rb
70
95
  - test/schema.rb
71
96
  - test/test_helper.rb
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.0.1
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require 'geo_tools'
data/install.rb DELETED
@@ -1 +0,0 @@
1
- # Install hook code here
@@ -1,166 +0,0 @@
1
- module AirBlade
2
- module GeoTools
3
-
4
- module FormHelpers
5
-
6
- # Options:
7
- # :latitude
8
- # :degrees
9
- # :symbol
10
- # :minutes
11
- # :symbol
12
- # :decimal_minutes
13
- # :symbol
14
- # :maxlength
15
- #
16
- # Assumes the latitude field is called 'latitude'.
17
- #
18
- # The 'method' argument is for consistency with other field helpers. We don't use it
19
- # when using the normal Rails form builder.
20
- #
21
- # 1/100th of a minute of latitude (or equitorial longitude) is approximately 20m.
22
- def latitude_field(method, options = {})
23
- opts = {
24
- :degrees => { :symbol => '&deg;' },
25
- :minutes => { :symbol => '.' },
26
- :decimal_minutes => { :symbol => '&prime;', :maxlength => 2 },
27
- }
28
- lat_options = options.delete :latitude
29
- opts.merge! lat_options if lat_options
30
-
31
- output = []
32
-
33
- # Degrees
34
- width = 2
35
- output << plain_text_field("latitude_degrees",
36
- options.merge(:maxlength => width,
37
- :value => "%0#{width}d" % @object.send("latitude_degrees")))
38
- output << opts[:degrees][:symbol]
39
-
40
- # Minutes
41
- width = 2
42
- output << plain_text_field("latitude_minutes",
43
- options.merge(:maxlength => width,
44
- :value => "%0#{width}d" % @object.send("latitude_minutes")))
45
- output << opts[:minutes][:symbol]
46
-
47
- # Decimal minutes
48
- width = opts[:decimal_minutes][:maxlength]
49
- output << plain_text_field("latitude_decimal_minutes",
50
- options.merge(:maxlength => width,
51
- :value => @object.send("latitude_decimal_minutes_as_string").ljust(width, '0')))
52
- output << opts[:decimal_minutes][:symbol]
53
-
54
- # Hemisphere.
55
- # Hmm, we pass the options in the html_options position.
56
- output << plain_select("latitude_hemisphere", %w( N S ), {}, options)
57
-
58
- output.join "\n"
59
- end
60
-
61
- def longitude_field(method, options = {})
62
- opts = {
63
- :degrees => { :symbol => '&deg;' },
64
- :minutes => { :symbol => '.' },
65
- :decimal_minutes => { :symbol => '&prime;', :maxlength => 2 },
66
- }
67
- long_options = options.delete :longitude
68
- opts.merge! long_options if long_options
69
-
70
- output = []
71
-
72
- # Degrees
73
- width = 3
74
- output << plain_text_field("longitude_degrees",
75
- options.merge(:maxlength => width,
76
- :value => "%0#{width}d" % @object.send("longitude_degrees")))
77
- output << opts[:degrees][:symbol]
78
-
79
- # Minutes
80
- width = 2
81
- output << plain_text_field("longitude_minutes",
82
- options.merge(:maxlength => width,
83
- :value => "%0#{width}d" % @object.send("longitude_minutes")))
84
- output << opts[:minutes][:symbol]
85
-
86
- # Decimal minutes
87
- width = opts[:decimal_minutes][:maxlength]
88
- output << plain_text_field("longitude_decimal_minutes",
89
- options.merge(:maxlength => width,
90
- :value => @object.send("longitude_decimal_minutes_as_string").ljust(width, '0')))
91
- output << opts[:decimal_minutes][:symbol]
92
-
93
- # Hemisphere.
94
- # Hmm, we pass the options in the html_options position.
95
- output << plain_select("longitude_hemisphere", %w( E W ), {}, options)
96
-
97
- output.join "\n"
98
- end
99
-
100
- # A layer of indirection to allow us always to use a plain field helpers,
101
- # regardless of the form builder being used.
102
-
103
- def plain_text_field(*a, &b)
104
- text_field(*a, &b)
105
- end
106
-
107
- def plain_select(*a, &b)
108
- select(*a, &b)
109
- end
110
- end
111
-
112
-
113
- module AirBuddFormHelpers
114
- include AirBlade::GeoTools::FormHelpers
115
- alias_method :plain_latitude_field, :latitude_field
116
- alias_method :plain_longitude_field, :longitude_field
117
-
118
- # Override latitude_field to wrap it with the custom form builder gubbins.
119
- # http://github.com/airblade/air_budd_form_builder/tree/master/lib/air_blade/air_budd/form_builder.rb
120
- def latitude_field(method, options = {}, html_options = {})
121
- @template.content_tag('p',
122
- label_element(method, options, html_options) +
123
- (
124
- plain_latitude_field method, options
125
- ) +
126
- hint_element(options),
127
- (errors_for?(method) ? {:class => 'error'} : {})
128
- )
129
- end
130
-
131
- # Override longitude_field to wrap it with the custom form builder gubbins.
132
- # http://github.com/airblade/air_budd_form_builder/tree/master/lib/air_blade/air_budd/form_builder.rb
133
- def longitude_field(method, options = {}, html_options = {})
134
- @template.content_tag('p',
135
- label_element(method, options, html_options) +
136
- (
137
- plain_longitude_field method, options
138
- ) +
139
- hint_element(options),
140
- (errors_for?(method) ? {:class => 'error'} : {})
141
- )
142
- end
143
-
144
- # Use the standard Rails helpers for text fields and selects.
145
- # These are overridden by the AirBudd form builder, so we define
146
- # them ourselves.
147
-
148
- def plain_text_field(method, options = {})
149
- # From ActionView::Helpers::FormBuilder
150
- @template.send('text_field', @object_name, method, objectify_options(options))
151
- end
152
- def plain_select(method, choices, options = {}, html_options = {})
153
- # From ActionView::Helpers::FormOptionsHelper::FormBuilder
154
- @template.select(@object_name, method, choices, objectify_options(options), @default_options.merge(html_options))
155
- end
156
- end
157
-
158
- end
159
- end
160
-
161
-
162
- # Integrate with standard Rails form builder.
163
- ActionView::Helpers::FormBuilder.send :include, AirBlade::GeoTools::FormHelpers
164
-
165
- # Integrate with custom AirBudd form builder.
166
- AirBlade::AirBudd::FormBuilder.send(:include, AirBlade::GeoTools::AirBuddFormHelpers) rescue nil