geos-extensions 0.1.1 → 0.1.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{geos-extensions}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{J Smith}]
12
- s.date = %q{2011-07-06}
12
+ s.date = %q{2011-07-11}
13
13
  s.description = %q{Extensions for the GEOS library.}
14
14
  s.email = %q{code@zoocasa.com}
15
15
  s.extra_rdoc_files = [
@@ -36,6 +36,7 @@ Gem::Specification.new do |s|
36
36
  "lib/geos/rails/engine.rb",
37
37
  "lib/geos_extensions.rb",
38
38
  "lib/tasks/test.rake",
39
+ "test/adapter_test.rb",
39
40
  "test/fixtures/foos.yml",
40
41
  "test/geometry_columns_test.rb",
41
42
  "test/geospatial_scopes_test.rb",
@@ -11,6 +11,17 @@ module ActiveRecord
11
11
  end
12
12
  end
13
13
 
14
+ class PostgreSQLColumn < Column
15
+ def simplified_type_with_geometry_type(field_type)
16
+ if field_type == 'geometry'
17
+ :geometry
18
+ else
19
+ simplified_type_without_geometry_type(field_type)
20
+ end
21
+ end
22
+ alias_method_chain :simplified_type, :geometry_type
23
+ end
24
+
14
25
  class PostgreSQLAdapter < AbstractAdapter
15
26
  # Returns the geometry columns for the table.
16
27
  def geometry_columns(table_name, name = nil)
@@ -1,6 +1,9 @@
1
1
 
2
- module Geos::GoogleMaps::Api3
3
- module Geometry
2
+ module Geos::GoogleMaps
3
+ module Api3
4
+ end
5
+
6
+ module Api3Constants
4
7
  UNESCAPED_MARKER_OPTIONS = %w{
5
8
  icon
6
9
  map
@@ -9,6 +12,20 @@ module Geos::GoogleMaps::Api3
9
12
  shape
10
13
  }.freeze
11
14
 
15
+ UNESCAPED_POLY_OPTIONS = %w{
16
+ clickable
17
+ fillOpacity
18
+ geodesic
19
+ map
20
+ path
21
+ paths
22
+ strokeOpacity
23
+ strokeWeight
24
+ zIndex
25
+ }.freeze
26
+ end
27
+
28
+ module Api3::Geometry
12
29
  # Returns a new LatLngBounds object with the proper LatLngs in place
13
30
  # for determining the geometry bounds.
14
31
  def to_g_lat_lng_bounds_api3(options = {})
@@ -42,25 +59,13 @@ module Geos::GoogleMaps::Api3
42
59
 
43
60
  opts = Geos::Helper.camelize_keys(marker_options)
44
61
  opts[:position] = self.centroid.to_g_lat_lng(options[:lat_lng_options])
45
- json = Geos::Helper.escape_json(opts, UNESCAPED_MARKER_OPTIONS - options[:escape])
62
+ json = Geos::Helper.escape_json(opts, Geos::GoogleMaps::Api3Constants::UNESCAPED_MARKER_OPTIONS - options[:escape])
46
63
 
47
64
  "new google.maps.Marker(#{json})"
48
65
  end
49
66
  end
50
67
 
51
- module CoordinateSequence
52
- UNESCAPED_POLY_OPTIONS = %w{
53
- clickable
54
- fillOpacity
55
- geodesic
56
- map
57
- path
58
- paths
59
- strokeOpacity
60
- strokeWeight
61
- zIndex
62
- }.freeze
63
-
68
+ module Api3::CoordinateSequence
64
69
  # Returns a Ruby Array of LatLngs.
65
70
  def to_g_lat_lng_api3(options = {})
66
71
  self.to_a.collect do |p|
@@ -89,7 +94,7 @@ module Geos::GoogleMaps::Api3
89
94
 
90
95
  opts = Geos::Helper.camelize_keys(polyline_options)
91
96
  opts[:path] = "[#{self.to_g_lat_lng_api3(options[:lat_lng_options]).join(', ')}]"
92
- json = Geos::Helper.escape_json(opts, UNESCAPED_POLY_OPTIONS - options[:escape])
97
+ json = Geos::Helper.escape_json(opts, Geos::GoogleMaps::Api3Constants::UNESCAPED_POLY_OPTIONS - options[:escape])
93
98
 
94
99
  "new google.maps.Polyline(#{json})"
95
100
  end
@@ -115,13 +120,13 @@ module Geos::GoogleMaps::Api3
115
120
 
116
121
  opts = Geos::Helper.camelize_keys(polygon_options)
117
122
  opts[:paths] = "[#{self.to_g_lat_lng_api3(options[:lat_lng_options]).join(', ')}]"
118
- json = Geos::Helper.escape_json(opts, UNESCAPED_POLY_OPTIONS - options[:escape])
123
+ json = Geos::Helper.escape_json(opts, Geos::GoogleMaps::Api3Constants::UNESCAPED_POLY_OPTIONS - options[:escape])
119
124
 
120
125
  "new google.maps.Polygon(#{json})"
121
126
  end
122
127
  end
123
128
 
124
- module Point
129
+ module Api3::Point
125
130
  # Returns a new LatLng.
126
131
  def to_g_lat_lng_api3(options = {})
127
132
  no_wrap = if options[:no_wrap]
@@ -137,7 +142,7 @@ module Geos::GoogleMaps::Api3
137
142
  end
138
143
  end
139
144
 
140
- module Polygon
145
+ module Api3::Polygon
141
146
  # Returns a Polyline of the exterior ring of the Polygon. This does
142
147
  # not take into consideration any interior rings the Polygon may
143
148
  # have.
@@ -153,7 +158,7 @@ module Geos::GoogleMaps::Api3
153
158
  end
154
159
  end
155
160
 
156
- module GeometryCollection
161
+ module Api3::GeometryCollection
157
162
  # Returns a Ruby Array of Polylines for each geometry in the
158
163
  # collection.
159
164
  def to_g_polyline_api3(polyline_options = {}, options = {})
@@ -161,14 +166,39 @@ module Geos::GoogleMaps::Api3
161
166
  p.to_g_polyline_api3(polyline_options, options)
162
167
  end
163
168
  end
169
+ alias :to_g_polylines_api3 :to_g_polyline_api3
164
170
 
165
171
  # Returns a Ruby Array of Polygons for each geometry in the
166
- # collection.
172
+ # collection. If the :single option is set, a single Polygon object will
173
+ # be returned with all of the geometries set in the Polygon's "path"
174
+ # attribute. You can also use to_g_polygon_single for the same effect.
167
175
  def to_g_polygon_api3(polygon_options = {}, options = {})
168
- self.collect do |p|
169
- p.to_g_polygon_api3(polygon_options, options)
176
+ if options[:single]
177
+ self.to_g_polygon_single_api3(polygon_options, options)
178
+ else
179
+ self.collect do |p|
180
+ p.to_g_polygon_api3(polygon_options, options)
181
+ end
170
182
  end
171
183
  end
184
+
185
+ # Behaves the same as to_g_polygon_api3 with the :single option set, where
186
+ # a single Google Maps Polygon will be returned with all of the Polygons
187
+ # set in the Polygon's "path" attribute.
188
+ def to_g_polygon_single_api3(polygon_options = {}, options = {})
189
+ options = {
190
+ :escape => [],
191
+ :lat_lng_options => {}
192
+ }.merge(options)
193
+
194
+ opts = Geos::Helper.camelize_keys(polygon_options)
195
+ opts[:paths] = %{[#{self.collect { |p|
196
+ "[#{p.exterior_ring.coord_seq.to_g_lat_lng_api3(options[:lat_lng_options]).join(', ')}]"
197
+ }.join(', ')}]}
198
+ json = Geos::Helper.escape_json(opts, Geos::GoogleMaps::Api3Constants::UNESCAPED_POLY_OPTIONS - options[:escape])
199
+
200
+ "new google.maps.Polygon(#{json})"
201
+ end
172
202
  end
173
203
  end
174
204
 
@@ -0,0 +1,23 @@
1
+
2
+ $: << File.dirname(__FILE__)
3
+ require 'test_helper'
4
+
5
+ if ENV['TEST_ACTIVERECORD']
6
+ class AdapterTests < ActiveRecord::TestCase
7
+ include TestHelper
8
+ include ActiveRecord::TestFixtures
9
+
10
+ def test_simplified_type
11
+ geometry_columns = Foo.columns.select do |c|
12
+ c.type == :geometry
13
+ end
14
+
15
+ other_columns = Foo.columns.select do |c|
16
+ c.type != :geometry
17
+ end
18
+
19
+ assert_equal(2, geometry_columns.length)
20
+ assert_equal(2, other_columns.length)
21
+ end
22
+ end
23
+ end
@@ -53,7 +53,7 @@ class GoogleMapsApi3Tests < Test::Unit::TestCase
53
53
  )
54
54
 
55
55
  assert_equal(
56
- "new google.maps.Polygon({\"strokeColor\": \"#b00b1e\", \"paths\": [new google.maps.LatLng(0.0, 0.0), new google.maps.LatLng(1.0, 1.0), new google.maps.LatLng(2.5, 2.5), new google.maps.LatLng(5.0, 5.0), new google.maps.LatLng(0.0, 0.0)], \"fillColor\": \"#b00b1e\", \"strokeWeight\": 5, \"map\": map, \"strokeOpacity\": 0.5})",
56
+ "new google.maps.Polygon({\"strokeColor\": \"#b00b1e\", \"strokeWeight\": 5, \"strokeOpacity\": 0.5, \"fillColor\": \"#b00b1e\", \"map\": map, \"paths\": [new google.maps.LatLng(0.0, 0.0), new google.maps.LatLng(1.0, 1.0), new google.maps.LatLng(2.5, 2.5), new google.maps.LatLng(5.0, 5.0), new google.maps.LatLng(0.0, 0.0)]})",
57
57
  @polygon.to_g_polygon(
58
58
  :stroke_color => '#b00b1e',
59
59
  :stroke_weight => 5,
@@ -64,6 +64,60 @@ class GoogleMapsApi3Tests < Test::Unit::TestCase
64
64
  )
65
65
  end
66
66
 
67
+ def test_to_g_polygon_with_multi_polygon
68
+ multi_polygon = Geos.read(
69
+ 'MULTIPOLYGON(
70
+ ((0 0, 0 5, 5 5, 5 0, 0 0)),
71
+ ((10 10, 10 15, 15 15, 15 10, 10 10)),
72
+ ((20 20, 20 25, 25 25, 25 20, 20 20))
73
+ )'
74
+ )
75
+ options = {
76
+ :stroke_color => '#b00b1e',
77
+ :stroke_weight => 5,
78
+ :stroke_opacity => 0.5,
79
+ :fill_color => '#b00b1e',
80
+ :map => 'map'
81
+ }
82
+
83
+ assert_equal(
84
+ ["new google.maps.Polygon({\"strokeColor\": \"#b00b1e\", \"strokeWeight\": 5, \"strokeOpacity\": 0.5, \"fillColor\": \"#b00b1e\", \"map\": map, \"paths\": [new google.maps.LatLng(0.0, 0.0), new google.maps.LatLng(5.0, 0.0), new google.maps.LatLng(5.0, 5.0), new google.maps.LatLng(0.0, 5.0), new google.maps.LatLng(0.0, 0.0)]})",
85
+ "new google.maps.Polygon({\"strokeColor\": \"#b00b1e\", \"strokeWeight\": 5, \"strokeOpacity\": 0.5, \"fillColor\": \"#b00b1e\", \"map\": map, \"paths\": [new google.maps.LatLng(10.0, 10.0), new google.maps.LatLng(15.0, 10.0), new google.maps.LatLng(15.0, 15.0), new google.maps.LatLng(10.0, 15.0), new google.maps.LatLng(10.0, 10.0)]})",
86
+ "new google.maps.Polygon({\"strokeColor\": \"#b00b1e\", \"strokeWeight\": 5, \"strokeOpacity\": 0.5, \"fillColor\": \"#b00b1e\", \"map\": map, \"paths\": [new google.maps.LatLng(20.0, 20.0), new google.maps.LatLng(25.0, 20.0), new google.maps.LatLng(25.0, 25.0), new google.maps.LatLng(20.0, 25.0), new google.maps.LatLng(20.0, 20.0)]})"],
87
+ multi_polygon.to_g_polygon(
88
+ :stroke_color => '#b00b1e',
89
+ :stroke_weight => 5,
90
+ :stroke_opacity => 0.5,
91
+ :fill_color => '#b00b1e',
92
+ :map => 'map'
93
+ )
94
+ )
95
+
96
+ assert_equal(
97
+ "new google.maps.Polygon({\"strokeColor\": \"#b00b1e\", \"strokeWeight\": 5, \"strokeOpacity\": 0.5, \"fillColor\": \"#b00b1e\", \"map\": map, \"paths\": [[new google.maps.LatLng(0.0, 0.0), new google.maps.LatLng(5.0, 0.0), new google.maps.LatLng(5.0, 5.0), new google.maps.LatLng(0.0, 5.0), new google.maps.LatLng(0.0, 0.0)], [new google.maps.LatLng(10.0, 10.0), new google.maps.LatLng(15.0, 10.0), new google.maps.LatLng(15.0, 15.0), new google.maps.LatLng(10.0, 15.0), new google.maps.LatLng(10.0, 10.0)], [new google.maps.LatLng(20.0, 20.0), new google.maps.LatLng(25.0, 20.0), new google.maps.LatLng(25.0, 25.0), new google.maps.LatLng(20.0, 25.0), new google.maps.LatLng(20.0, 20.0)]]})",
98
+ multi_polygon.to_g_polygon({
99
+ :stroke_color => '#b00b1e',
100
+ :stroke_weight => 5,
101
+ :stroke_opacity => 0.5,
102
+ :fill_color => '#b00b1e',
103
+ :map => 'map'
104
+ }, {
105
+ :single => true
106
+ })
107
+ )
108
+
109
+ assert_equal(
110
+ "new google.maps.Polygon({\"strokeColor\": \"#b00b1e\", \"strokeWeight\": 5, \"strokeOpacity\": 0.5, \"fillColor\": \"#b00b1e\", \"map\": map, \"paths\": [[new google.maps.LatLng(0.0, 0.0), new google.maps.LatLng(5.0, 0.0), new google.maps.LatLng(5.0, 5.0), new google.maps.LatLng(0.0, 5.0), new google.maps.LatLng(0.0, 0.0)], [new google.maps.LatLng(10.0, 10.0), new google.maps.LatLng(15.0, 10.0), new google.maps.LatLng(15.0, 15.0), new google.maps.LatLng(10.0, 15.0), new google.maps.LatLng(10.0, 10.0)], [new google.maps.LatLng(20.0, 20.0), new google.maps.LatLng(25.0, 20.0), new google.maps.LatLng(25.0, 25.0), new google.maps.LatLng(20.0, 25.0), new google.maps.LatLng(20.0, 20.0)]]})",
111
+ multi_polygon.to_g_polygon_single(
112
+ :stroke_color => '#b00b1e',
113
+ :stroke_weight => 5,
114
+ :stroke_opacity => 0.5,
115
+ :fill_color => '#b00b1e',
116
+ :map => 'map'
117
+ )
118
+ )
119
+ end
120
+
67
121
  def test_to_g_polyline
68
122
  assert_equal(
69
123
  "new google.maps.Polyline({\"path\": [new google.maps.LatLng(0.0, 0.0), new google.maps.LatLng(1.0, 1.0), new google.maps.LatLng(2.5, 2.5), new google.maps.LatLng(5.0, 5.0), new google.maps.LatLng(0.0, 0.0)]})",
@@ -71,7 +125,7 @@ class GoogleMapsApi3Tests < Test::Unit::TestCase
71
125
  )
72
126
 
73
127
  assert_equal(
74
- "new google.maps.Polyline({\"path\": [new google.maps.LatLng(0.0, 0.0), new google.maps.LatLng(1.0, 1.0), new google.maps.LatLng(2.5, 2.5), new google.maps.LatLng(5.0, 5.0), new google.maps.LatLng(0.0, 0.0)], \"strokeColor\": \"#b00b1e\", \"strokeWeight\": 5, \"map\": map, \"strokeOpacity\": 0.5})",
128
+ "new google.maps.Polyline({\"strokeColor\": \"#b00b1e\", \"strokeWeight\": 5, \"strokeOpacity\": 0.5, \"map\": map, \"path\": [new google.maps.LatLng(0.0, 0.0), new google.maps.LatLng(1.0, 1.0), new google.maps.LatLng(2.5, 2.5), new google.maps.LatLng(5.0, 5.0), new google.maps.LatLng(0.0, 0.0)]})",
75
129
  @polygon.to_g_polyline(
76
130
  :stroke_color => '#b00b1e',
77
131
  :stroke_weight => 5,
metadata CHANGED
@@ -1,32 +1,23 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: geos-extensions
3
- version: !ruby/object:Gem::Version
4
- hash: 25
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - J Smith
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-07-06 00:00:00 Z
12
+ date: 2011-07-11 00:00:00.000000000Z
19
13
  dependencies: []
20
-
21
14
  description: Extensions for the GEOS library.
22
15
  email: code@zoocasa.com
23
16
  executables: []
24
-
25
17
  extensions: []
26
-
27
- extra_rdoc_files:
18
+ extra_rdoc_files:
28
19
  - README.rdoc
29
- files:
20
+ files:
30
21
  - MIT-LICENSE
31
22
  - README.rdoc
32
23
  - Rakefile
@@ -47,6 +38,7 @@ files:
47
38
  - lib/geos/rails/engine.rb
48
39
  - lib/geos_extensions.rb
49
40
  - lib/tasks/test.rake
41
+ - test/adapter_test.rb
50
42
  - test/fixtures/foos.yml
51
43
  - test/geometry_columns_test.rb
52
44
  - test/geospatial_scopes_test.rb
@@ -57,36 +49,26 @@ files:
57
49
  - test/writer_test.rb
58
50
  homepage: http://github.com/zoocasa/geos-extensions
59
51
  licenses: []
60
-
61
52
  post_install_message:
62
53
  rdoc_options: []
63
-
64
- require_paths:
54
+ require_paths:
65
55
  - lib
66
- required_ruby_version: !ruby/object:Gem::Requirement
56
+ required_ruby_version: !ruby/object:Gem::Requirement
67
57
  none: false
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
- version: "0"
75
- required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
63
  none: false
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- hash: 3
81
- segments:
82
- - 0
83
- version: "0"
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
84
68
  requirements: []
85
-
86
69
  rubyforge_project:
87
70
  rubygems_version: 1.8.5
88
71
  signing_key:
89
72
  specification_version: 3
90
73
  summary: Extensions for the GEOS library.
91
74
  test_files: []
92
-