rp_clustering-rgeo-activerecord 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjAzODU1ZmI0ZjZlMDdlODlmYjA0NTBiOGRmMjQyMDViZGNjZDAzMw==
5
+ data.tar.gz: !binary |-
6
+ ZTk2ZTk4NTc4YjU3M2MxZjc5ZDdlMjdhNzk1NjBhMGJjM2I4MTRjMg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YTQ0OGI2Y2I0NWEyMGVlN2FlZmQ0Mzc4ZDc0N2FhMjMwNGQwNjNjZDI5NzZl
10
+ ZjNhNWNmNjc5YjY4ODJjMmZkZmYwOTYwN2EzNTU5NTU3YjRlNmQ2NmUwYjkw
11
+ YTc3ZDc5NGVjNzAyMjM3MDEzNGRhNWM5ZGZjZDhiNDRmZTk5Mzc=
12
+ data.tar.gz: !binary |-
13
+ OTcxZjBjYTViYjU2ZTdjMjIwZjdkNGRjN2NiODFjOWM4ZjRiNjIzOWIyMTc5
14
+ YzE1ZWUwOTllZjUzNjcxYjg4YzA3MzU5ZDVkNWY0YjBlOGVhMmEzYzRiNWE3
15
+ NTJiYTVmZGMzNjVhMTkxNGZkY2U4NzljMzYyNzc3Nzc5MThiMTA=
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/database_local.yml
17
+ test/version_tmp
18
+ tmp
19
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rp_clustering-rgeo-activerecord.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Robert Pyke
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # RPClustering::RGeo::ActiveRecord
2
+
3
+ A RGeo PostGIS extension to provide Active Record (Model) clustering functionality.
4
+
5
+ The intention is that this Gem will eventually provide abstracted methods for
6
+ both "on the fly" clustering, as well as cached clustering (including associated generators).
7
+
8
+ If you find a problem with this Gem, please don't hesitate to raise an [issue](https://github.com/robertpyke/rp_clustering-rgeo-activerecord/issues).
9
+
10
+ ## Installation
11
+
12
+ Note: This gem provides extensions for [activerecord-postgis-adapter](https://github.com/dazuma/activerecord-postgis-adapter).
13
+ Please see [activerecord-postgis-adapter](https://github.com/dazuma/activerecord-postgis-adapter)
14
+ for its install instructions. Once you've got
15
+ it working, then simply add this gem to your Gemfile to enable these extensions.
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ gem 'rp_clustering-rgeo-activerecord'
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install rp_clustering-rgeo-activerecord
28
+
29
+
30
+ ## Usage
31
+
32
+ ### Added in Version 0.0.1
33
+
34
+ This version allows for hand-coded low-level clustering via the Arel interface.
35
+
36
+ e.g.
37
+
38
+ ```ruby
39
+
40
+ # Get the Arel handle for the model
41
+
42
+ arel_table = MyModel.arel_table
43
+
44
+ # Our cluster grid size.
45
+ # Smaller grid_size means more clusters.
46
+ # Larger grid_size means less clusters (cluster covers a larger area).
47
+ # See http://www.postgis.org/docs/ST_SnapToGrid.html for more info.
48
+
49
+ grid_size = 0.1
50
+
51
+ # Cluster against our model's :latlon attribute with a grid size of '0.1'.
52
+ # Return the centroid of each cluster as "cluster_centroid".
53
+
54
+ query = MyModel.select(
55
+ arel_table.st_astext(
56
+ arel_table.st_centroid(arel_table.st_collect(attr))
57
+ ).as("cluster_centroid")
58
+ ).group(arel_table[:latlon].st_snaptogrid(0.1))
59
+
60
+ # Iterate over our clusters
61
+ query.all.each do |cluster|
62
+
63
+ # print the cluster_centroid (a point) as WKT
64
+ puts cluster["cluster_centroid"]
65
+
66
+ # convert the WKT into a RGeo Geometry (a point)
67
+ geographic_factory.parse_wkt(cluster["cluster_centroid")
68
+
69
+ # ...
70
+ end
71
+
72
+ ```
73
+
74
+ ## Contributing
75
+
76
+ 1. Fork it
77
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
78
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
79
+ 4. Push to the branch (`git push origin my-new-feature`)
80
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "test"
7
+ t.test_files = FileList['test/test*.rb']
8
+ t.verbose = true
9
+ end
10
+
11
+ task :default => [:test]
12
+
@@ -0,0 +1,39 @@
1
+ require "rp_clustering-rgeo-activerecord/version"
2
+ require "rp_clustering-rgeo-activerecord/arel_attribute_spatial_expressions"
3
+ require "rp_clustering-rgeo-activerecord/arel_table_spatial_expressions"
4
+
5
+ module RPClustering
6
+
7
+ module RGeo
8
+
9
+ module ActiveRecord
10
+
11
+ # Spatial Expressions to be attached directly to Arel Attributes (DB columns)
12
+
13
+ module ArelAttributeSpatialExpressions
14
+ end
15
+
16
+ # Attach our Spatial Expression methods onto the Arel::Attribute class.
17
+ #
18
+ # i.e. As stated in the RGeo::ActiveRecord docs.. Allow chaining of spatial expressions from attributes
19
+
20
+ ::Arel::Attribute.class_eval do
21
+ include ::RPClustering::RGeo::ActiveRecord::ArelAttributeSpatialExpressions
22
+ end
23
+
24
+ # Spatial Expressions to be attached to Arel Table (DB tables)
25
+
26
+ module ArelTableSpatialExpressions
27
+ end
28
+
29
+ # Attach our Spatial Expression methods onto the Arel::Table class.
30
+
31
+ ::Arel::Table.class_eval do
32
+ include ::RPClustering::RGeo::ActiveRecord::ArelTableSpatialExpressions
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,66 @@
1
+ # Author: Robert Pyke
2
+
3
+ module RPClustering
4
+
5
+ module RGeo
6
+
7
+ module ActiveRecord
8
+
9
+ module ArelAttributeSpatialExpressions
10
+
11
+ # ST_SnapToGrid: http://www.postgis.org/docs/ST_SnapToGrid.html
12
+ #
13
+ # Implements postgis function variant:
14
+ #
15
+ # geometry ST_SnapToGrid(geometry geomA, float size);
16
+ #
17
+ # Returns a geometry collection
18
+
19
+ def st_snaptogrid(grid_size)
20
+ args = [self, grid_size.to_s]
21
+
22
+ # SpatialNamedFunction takes the following args:
23
+ # * name
24
+ # * expr
25
+ # * spatial_flags
26
+ # * aliaz (defaults to nil)
27
+ #
28
+ #
29
+ # Understanding the spatial_flags argument
30
+ # -----------------------------------------
31
+ #
32
+ # A flag is true if the corresponding argument is spatial, else the
33
+ # flag is false.
34
+ # The first element is the spatial-ness result, the other args
35
+ # relate to our expression args
36
+
37
+ ::RGeo::ActiveRecord::SpatialNamedFunction.new(
38
+ 'ST_SnapToGrid', args, [true, true, false]
39
+ )
40
+
41
+ end
42
+
43
+ # ST_Collect: http://www.postgis.org/docs/ST_Collect.html
44
+ #
45
+ # Implements postgis function variant:
46
+ #
47
+ # geometry ST_Collect(geometry[] g1_array);
48
+ #
49
+ # Returns a geometry collection
50
+
51
+ def st_collect()
52
+ args = [self]
53
+
54
+ ::RGeo::ActiveRecord::SpatialNamedFunction.new(
55
+ 'ST_Collect', args, [true, true]
56
+ )
57
+
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,82 @@
1
+ # Author: Robert Pyke
2
+
3
+ module RPClustering
4
+
5
+ module RGeo
6
+
7
+ module ActiveRecord
8
+
9
+ module ArelTableSpatialExpressions
10
+
11
+ # ST_SnapToGrid: http://www.postgis.org/docs/ST_SnapToGrid.html
12
+ #
13
+ # Implements postgis function variant:
14
+ #
15
+ # geometry ST_SnapToGrid(geometry geomA, float size);
16
+ #
17
+ # Returns a geometry collection
18
+
19
+ def st_snaptogrid(geom_a, grid_size)
20
+ args = [geom_a, grid_size.to_s]
21
+
22
+ ::RGeo::ActiveRecord::SpatialNamedFunction.new(
23
+ 'ST_SnapToGrid', args, [true, true, false]
24
+ )
25
+
26
+ end
27
+
28
+ # ST_Collect: http://www.postgis.org/docs/ST_Collect.html
29
+ #
30
+ # Implements postgis function variant:
31
+ #
32
+ # geometry ST_Collect(geometry[] g1_array);
33
+ #
34
+ # This variant is an aggregate, it operates on rows of data.
35
+ #
36
+ # Returns a geometry collection
37
+
38
+ def st_collect(g1_array)
39
+ args = [g1_array]
40
+
41
+ ::RGeo::ActiveRecord::SpatialNamedFunction.new(
42
+ 'ST_Collect', args, [true, true]
43
+ )
44
+
45
+ end
46
+
47
+ # ST_AsText: http://www.postgis.org/docs/ST_AsText.html
48
+ #
49
+ # Returns a string (WKT)
50
+
51
+ def st_astext(g)
52
+ args = [g]
53
+
54
+ ::RGeo::ActiveRecord::SpatialNamedFunction.new(
55
+ 'ST_AsText', args, [true, true]
56
+ )
57
+
58
+ end
59
+
60
+ # ST_Centroid: http://www.postgis.org/docs/ST_Centroid.html
61
+ #
62
+ # Implements postgis function variant:
63
+ #
64
+ # geometry ST_Centroid(geometry g1);
65
+ #
66
+ # Returns a geometry
67
+
68
+ def st_centroid(g)
69
+ args = [g]
70
+
71
+ ::RGeo::ActiveRecord::SpatialNamedFunction.new(
72
+ 'ST_Centroid', args, [true, true]
73
+ )
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+
82
+ end
@@ -0,0 +1,7 @@
1
+ module RPClustering
2
+ module RGeo
3
+ module ActiveRecord
4
+ VERSION = "0.0.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rp_clustering-rgeo-activerecord/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "rp_clustering-rgeo-activerecord"
8
+ gem.version = RPClustering::RGeo::ActiveRecord::VERSION
9
+ gem.authors = ["Robert Pyke"]
10
+ gem.email = ["robert.j.pyke@gmail.com"]
11
+ gem.summary = %q{RGeo PostGIS extension to provide clustering functionality}
12
+ gem.description = %q{A RGeo PostGIS extension to provide Active Record (Model) clustering functionality}
13
+ gem.homepage = "https://github.com/robertpyke/rp_clustering-rgeo-activerecord"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.license = 'MIT'
21
+
22
+ # Development Dependencies
23
+ gem.add_development_dependency('bundler', '>= 1.0.0')
24
+ gem.add_development_dependency('test-unit', '~> 2.5.4')
25
+ gem.add_development_dependency('rake')
26
+ gem.add_development_dependency('rdoc')
27
+ gem.add_development_dependency('pg')
28
+
29
+ # Deployed Gem Dependencies
30
+ gem.add_dependency('activerecord', '~> 3.0')
31
+ gem.add_dependency('arel', '~> 3.0.2')
32
+ gem.add_dependency('rgeo', '~> 0.3.20')
33
+ gem.add_dependency('rgeo-activerecord', '~> 0.4.6')
34
+ # This Gem is specific to postgis
35
+ gem.add_dependency('activerecord-postgis-adapter')
36
+ end
data/test/database.yml ADDED
@@ -0,0 +1,7 @@
1
+ adapter: postgis
2
+ host: 127.0.0.1
3
+ encoding: unicode
4
+ pool: 5
5
+ host: localhost
6
+ port: 5432
7
+ database: rp_clustering_test
data/test/test_unit.rb ADDED
@@ -0,0 +1,107 @@
1
+ require 'test/unit'
2
+ require 'rgeo/active_record/adapter_test_helper'
3
+ require 'rp_clustering-rgeo-activerecord'
4
+
5
+ module RPClustering
6
+ module RGeo
7
+ module ActiveRecord
8
+ module Tests
9
+ class MyUnitTest < Test::Unit::TestCase # :nodoc:
10
+
11
+ # Use the RGEO active record adapter test helper
12
+
13
+ DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database.yml'
14
+ OVERRIDE_DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database_local.yml'
15
+ include ::RGeo::ActiveRecord::AdapterTestHelper
16
+
17
+
18
+ define_test_methods do
19
+
20
+ def populate_ar_class(content_)
21
+ klass_ = create_ar_class
22
+ case content_
23
+ when :latlon_point
24
+ klass_.connection.create_table(:spatial_test) do |t_|
25
+ t_.column 'latlon', :point, :srid => 4326
26
+ end
27
+ end
28
+ klass_
29
+ end
30
+
31
+ # Confirm that everything is working as it should
32
+ def test_should_pass
33
+ assert(true)
34
+ end
35
+
36
+ def test_should_have_a_version
37
+ assert_not_nil(RPClustering::RGeo::ActiveRecord::VERSION)
38
+ end
39
+
40
+ # Test that the st_snaptogrid method exists on the Arel::Attribute
41
+ # and on the Arel::Table
42
+
43
+ def test_st_snaptogrid_method_should_exist
44
+ arel_klass = populate_ar_class(:latlon_point)
45
+ assert(
46
+ arel_klass.arel_table[:latlon_point].methods.include?(:st_snaptogrid),
47
+ "Active Record Arel::Attribute should now have a st_snaptogrid function. " +
48
+ "Found:\n#{arel_klass.arel_table[:latlon_point].methods.sort}"
49
+ )
50
+
51
+ assert(
52
+ arel_klass.arel_table.methods.include?(:st_snaptogrid),
53
+ "Active Record Arel::Table should now have a st_snaptogrid function. " +
54
+ "Found:\n#{arel_klass.arel_table.methods.sort}"
55
+ )
56
+ end
57
+
58
+ # Confirm that the st_snaptogrid function is producing the
59
+ # expected results
60
+
61
+ def test_st_snap_to_grid
62
+ arel_klass = populate_ar_class(:latlon_point)
63
+
64
+ points_generated = 0
65
+ (-5..5).each do |lng|
66
+ (-5..5).each do |lat|
67
+ obj = arel_klass.new
68
+ obj.latlon = @geographic_factory.point(lng, lat)
69
+ obj.save!
70
+ points_generated+=1
71
+ end
72
+ end
73
+
74
+ # Sanity check, confirm that we have all the points we created.
75
+ count_res = arel_klass.count()
76
+ assert_equal(
77
+ points_generated,
78
+ count_res,
79
+ "The number of points generated doesn't match the number in the DB"
80
+ )
81
+
82
+ attr = arel_klass.arel_table[:latlon]
83
+ t = arel_klass.arel_table
84
+
85
+ q1 = arel_klass.select(t.st_astext(t.st_centroid(t.st_collect(attr))).as("cluster_centroid"))
86
+ q1 = q1.group(attr.st_snaptogrid(180))
87
+
88
+ assert_equal(1, q1.all.count(), "With a sufficiently large grid size, we would expect the st_snaptogrid to produce only a single point")
89
+
90
+
91
+ value = q1.first["cluster_centroid"]
92
+ compare_point = @geographic_factory.point(0,0)
93
+ assert_equal(@geographic_factory.parse_wkt(value), compare_point, "cluster centroid should be a valid point in the center of the earth")
94
+
95
+ q2 = arel_klass.select(t.st_astext(t.st_centroid(t.st_collect(attr))).as("cluster_centroid"))
96
+ q2 = q2.group(attr.st_snaptogrid(1))
97
+
98
+ assert_equal(points_generated, q2.all.count(), "With a small grid size, we would expect the st_snaptogrid to produce every single point")
99
+
100
+ end
101
+
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
metadata ADDED
@@ -0,0 +1,199 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rp_clustering-rgeo-activerecord
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Robert Pyke
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-02-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: test-unit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 2.5.4
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 2.5.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rdoc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pg
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: arel
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 3.0.2
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 3.0.2
111
+ - !ruby/object:Gem::Dependency
112
+ name: rgeo
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.3.20
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 0.3.20
125
+ - !ruby/object:Gem::Dependency
126
+ name: rgeo-activerecord
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 0.4.6
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: 0.4.6
139
+ - !ruby/object:Gem::Dependency
140
+ name: activerecord-postgis-adapter
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: A RGeo PostGIS extension to provide Active Record (Model) clustering
154
+ functionality
155
+ email:
156
+ - robert.j.pyke@gmail.com
157
+ executables: []
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - .gitignore
162
+ - Gemfile
163
+ - LICENSE.txt
164
+ - README.md
165
+ - Rakefile
166
+ - lib/rp_clustering-rgeo-activerecord.rb
167
+ - lib/rp_clustering-rgeo-activerecord/arel_attribute_spatial_expressions.rb
168
+ - lib/rp_clustering-rgeo-activerecord/arel_table_spatial_expressions.rb
169
+ - lib/rp_clustering-rgeo-activerecord/version.rb
170
+ - rp_clustering-rgeo-activerecord.gemspec
171
+ - test/database.yml
172
+ - test/test_unit.rb
173
+ homepage: https://github.com/robertpyke/rp_clustering-rgeo-activerecord
174
+ licenses:
175
+ - MIT
176
+ metadata: {}
177
+ post_install_message:
178
+ rdoc_options: []
179
+ require_paths:
180
+ - lib
181
+ required_ruby_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ! '>='
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ requirements: []
192
+ rubyforge_project:
193
+ rubygems_version: 2.0.0
194
+ signing_key:
195
+ specification_version: 4
196
+ summary: RGeo PostGIS extension to provide clustering functionality
197
+ test_files:
198
+ - test/database.yml
199
+ - test/test_unit.rb