mongo_geo 0.2.0 → 1.0.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.
- checksums.yaml +7 -0
- data/.rspec +2 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +57 -0
- data/README.markdown +24 -16
- data/Rakefile +5 -52
- data/lib/mongo_geo.rb +37 -33
- data/lib/mongo_geo/version.rb +3 -0
- data/mongo_geo.gemspec +23 -55
- data/spec/plugin_spec.rb +75 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/test_indexless_model.rb +6 -0
- data/spec/support/test_model.rb +6 -0
- metadata +121 -83
- data/VERSION +0 -1
- data/test/helper.rb +0 -25
- data/test/test_mongo_geo.rb +0 -63
- data/test/test_plucky_extensions.rb +0 -13
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d47172c29d2520070c1ad4c1a75128fc57e4c653
|
4
|
+
data.tar.gz: e6048d2d0a08e9d5c0f286600289a4dfcf3439b4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d9b0febf74b752c03f76512fedf13ad725ce65ed83fe492b6dca78e503e13106df15e0d682eb6b85706f202e9c835bac83bd600f884a7c49287969b59ecbe93d
|
7
|
+
data.tar.gz: 2e1ba6efef1d3120d209a8b04a04afbaf5c649c574e628623fb2bedb3ec166c37aa18be3ed88e685d201767a132230c9afd0f9e142852c373e2ba545bb544270
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
mongo_geo (1.0.0)
|
5
|
+
mongo_mapper
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (3.2.17)
|
11
|
+
activesupport (= 3.2.17)
|
12
|
+
builder (~> 3.0.0)
|
13
|
+
activesupport (3.2.17)
|
14
|
+
i18n (~> 0.6, >= 0.6.4)
|
15
|
+
multi_json (~> 1.0)
|
16
|
+
bson (1.10.0)
|
17
|
+
bson_ext (1.10.0)
|
18
|
+
bson (~> 1.10.0)
|
19
|
+
builder (3.0.4)
|
20
|
+
coderay (1.1.0)
|
21
|
+
diff-lcs (1.2.5)
|
22
|
+
i18n (0.6.9)
|
23
|
+
method_source (0.8.2)
|
24
|
+
mongo (1.10.0)
|
25
|
+
bson (~> 1.10.0)
|
26
|
+
mongo_mapper (0.12.0)
|
27
|
+
activemodel (~> 3.0)
|
28
|
+
activesupport (~> 3.0)
|
29
|
+
plucky (~> 0.5.2)
|
30
|
+
multi_json (1.9.2)
|
31
|
+
plucky (0.5.2)
|
32
|
+
mongo (~> 1.5)
|
33
|
+
pry (0.9.12.6)
|
34
|
+
coderay (~> 1.0)
|
35
|
+
method_source (~> 0.8)
|
36
|
+
slop (~> 3.4)
|
37
|
+
rake (10.2.2)
|
38
|
+
rspec (2.14.1)
|
39
|
+
rspec-core (~> 2.14.0)
|
40
|
+
rspec-expectations (~> 2.14.0)
|
41
|
+
rspec-mocks (~> 2.14.0)
|
42
|
+
rspec-core (2.14.8)
|
43
|
+
rspec-expectations (2.14.5)
|
44
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
45
|
+
rspec-mocks (2.14.6)
|
46
|
+
slop (3.5.0)
|
47
|
+
|
48
|
+
PLATFORMS
|
49
|
+
ruby
|
50
|
+
|
51
|
+
DEPENDENCIES
|
52
|
+
bson_ext
|
53
|
+
bundler (~> 1.5)
|
54
|
+
mongo_geo!
|
55
|
+
pry
|
56
|
+
rake
|
57
|
+
rspec
|
data/README.markdown
CHANGED
@@ -2,33 +2,41 @@
|
|
2
2
|
|
3
3
|
mongo_geo is a plugin for [MongoMapper](http://github.com/jnunemaker/mongomapper) that exposes the [GeoSpatial indexing features](http://www.mongodb.org/display/DOCS/Geospatial+Indexing) in MongoDb.
|
4
4
|
|
5
|
-
Currently, I'm only developing against Ruby 1.9.1 so other versions may be flakey.
|
6
|
-
|
7
5
|
## Usage
|
8
6
|
### On the model
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
```ruby
|
8
|
+
class TestAsset
|
9
|
+
include MongoMapper::Document
|
10
|
+
plugin GeoSpatial
|
11
|
+
|
12
|
+
# Pass create_index: true to ensure the Geo2D index is created
|
13
|
+
# On an embedded document, you can create the index with
|
14
|
+
# ensure_index 'embedded_doc.coords' => Mongo::GEO2D
|
15
|
+
geo_key :coords, Array, create_index: true
|
16
|
+
end
|
17
|
+
```
|
15
18
|
|
16
19
|
### [Plucky](http://github.com/jnunemaker/plucky) style queries:
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
```ruby
|
21
|
+
TestAsset.where(:coords.near => [50, 50]).limit(10).to_a
|
22
|
+
TestAsset.where(:coords.within => { '$center' => [[50, 50], 10] }).to_a # '$center' => [center, radius]
|
23
|
+
TestAsset.where(:coords.within => { '$box' => [ [45, 45], [55, 55] ] }).to_a # [lower_left, top_right]
|
24
|
+
```
|
20
25
|
|
21
26
|
N.B. bounds queries are syntactically ugly at the moment and are likely to change soon
|
22
27
|
|
23
28
|
### geoNear and convenience methods
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
29
|
+
```ruby
|
30
|
+
nearby = TestAsset.near([50, 50], num: 15, query: { ... })
|
31
|
+
nearby.average_distance # average distance of all results from the target point
|
32
|
+
nearby.first.distance # distance of this result from the target
|
33
|
+
TestAsset.first.distance_from([50, 50]) # distance from any point
|
34
|
+
TestAsset.first.neighborhood(:limit => 10) # closest objects to this one
|
35
|
+
```
|
28
36
|
Queries can be specified with the [ruby driver style finders](http://github.com/mongodb/mongo-ruby-driver/blob/master/examples/queries.rb)
|
29
37
|
|
30
38
|
## Note on Patches/Pull Requests
|
31
|
-
|
39
|
+
|
32
40
|
* Fork the project.
|
33
41
|
* Make your feature addition or bug fix.
|
34
42
|
* Add tests for it. This is important so I don't break it in a
|
data/Rakefile
CHANGED
@@ -1,53 +1,6 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
gem.name = "mongo_geo"
|
8
|
-
gem.summary = %Q{A MongoMapper plugin that adds geospatial functionality.}
|
9
|
-
gem.description = %Q{A MongoMapper plugin that adds geospatial functionality.}
|
10
|
-
gem.email = "mtparrish@gmail.com"
|
11
|
-
gem.homepage = "http://github.com/parrish/mongo_geo"
|
12
|
-
gem.authors = ["Michael Parrish"]
|
13
|
-
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
14
|
-
gem.add_dependency "mongo_mapper", ">= 0.8.2"
|
15
|
-
end
|
16
|
-
Jeweler::GemcutterTasks.new
|
17
|
-
rescue LoadError
|
18
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'rake/testtask'
|
22
|
-
Rake::TestTask.new(:test) do |test|
|
23
|
-
test.libs << 'lib' << 'test'
|
24
|
-
test.pattern = 'test/**/test_*.rb'
|
25
|
-
test.verbose = true
|
26
|
-
end
|
27
|
-
|
28
|
-
begin
|
29
|
-
require 'rcov/rcovtask'
|
30
|
-
Rcov::RcovTask.new do |test|
|
31
|
-
test.libs << 'test'
|
32
|
-
test.pattern = 'test/**/test_*.rb'
|
33
|
-
test.verbose = true
|
34
|
-
end
|
35
|
-
rescue LoadError
|
36
|
-
task :rcov do
|
37
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
task :test => :check_dependencies
|
42
|
-
|
43
|
-
task :default => :test
|
44
|
-
|
45
|
-
require 'rake/rdoctask'
|
46
|
-
Rake::RDocTask.new do |rdoc|
|
47
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
-
|
49
|
-
rdoc.rdoc_dir = 'rdoc'
|
50
|
-
rdoc.title = "mongo_geo #{version}"
|
51
|
-
rdoc.rdoc_files.include('README*')
|
52
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
-
end
|
4
|
+
RSpec::Core::RakeTask.new :spec
|
5
|
+
task default: :spec
|
6
|
+
task test: :spec
|
data/lib/mongo_geo.rb
CHANGED
@@ -6,7 +6,7 @@ module Plucky
|
|
6
6
|
def near
|
7
7
|
SymbolOperator.new(self, 'near')
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def within
|
11
11
|
SymbolOperator.new(self, 'within')
|
12
12
|
end
|
@@ -15,20 +15,26 @@ module Plucky
|
|
15
15
|
end
|
16
16
|
|
17
17
|
module GeoSpatial
|
18
|
+
extend ActiveSupport::Concern
|
19
|
+
|
18
20
|
module ClassMethods
|
19
|
-
def geo_key(name, klass)
|
21
|
+
def geo_key(name, klass, *args)
|
20
22
|
unless [Array, Hash].include?(klass)
|
21
|
-
raise
|
23
|
+
raise ArgumentError, "#{ klass } is not a valid type for a geo_key\nUse an Array or a Hash"
|
24
|
+
end
|
25
|
+
|
26
|
+
will_create_index = if args.last.is_a?(Hash) && args.last.has_key?(:create_index)
|
27
|
+
!!args.last.delete(:create_index)
|
22
28
|
end
|
23
29
|
|
24
30
|
if @geo_key_name.nil?
|
25
|
-
key name.to_sym, klass
|
26
|
-
ensure_index([[name, Mongo::GEO2D]])
|
31
|
+
key name.to_sym, klass, *args
|
32
|
+
ensure_index([[name, Mongo::GEO2D]]) if will_create_index
|
27
33
|
@geo_key_name = name
|
28
34
|
else
|
29
35
|
error = "MongoDB is currently limited to only one geospatial index per collection.\n"
|
30
|
-
error += "geo_key #{name} was NOT added to #{self.name}"
|
31
|
-
raise
|
36
|
+
error += "geo_key #{ name } was NOT added to #{ self.name }"
|
37
|
+
raise RuntimeError, error
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
@@ -43,47 +49,45 @@ module GeoSpatial
|
|
43
49
|
params.each_pair{ |key, value| args[key.to_sym] = value }
|
44
50
|
|
45
51
|
raw = database.command(args)
|
46
|
-
objects = raw[
|
52
|
+
objects = raw['results'].collect{ |r| self.load(r['obj']) }
|
47
53
|
objects.instance_variable_set(:@raw, raw)
|
48
54
|
|
49
55
|
objects.each.with_index do |obj, index|
|
50
|
-
obj.instance_variable_set(:@distance, raw[
|
56
|
+
obj.instance_variable_set(:@distance, raw['results'][index]['dis'])
|
51
57
|
def obj.distance
|
52
58
|
@distance
|
53
59
|
end
|
54
60
|
end
|
55
61
|
|
56
62
|
def objects.average_distance
|
57
|
-
@raw[
|
63
|
+
@raw['stats']['avgDistance']
|
58
64
|
end
|
59
65
|
|
60
66
|
objects
|
61
67
|
end
|
62
68
|
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
raise(ArgumentError) unless [Array, Hash].include?(pt.class)
|
69
|
-
|
70
|
-
loc = self.send(name)
|
71
|
-
loc = loc.values if loc.is_a?(Hash)
|
72
|
-
pt = pt.values if pt.is_a?(Hash)
|
73
|
-
|
74
|
-
dx = loc[0] - pt[0]
|
75
|
-
dy = loc[1] - pt[1]
|
76
|
-
Math.sqrt((dx ** 2) + (dy ** 2))
|
77
|
-
end
|
69
|
+
|
70
|
+
def distance_from(pt)
|
71
|
+
name = self.class.geo_key_name
|
72
|
+
return nil if name.nil?
|
73
|
+
raise(ArgumentError) unless [Array, Hash].include?(pt.class)
|
78
74
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
75
|
+
loc = self.send(name)
|
76
|
+
loc = loc.values if loc.is_a?(Hash)
|
77
|
+
pt = pt.values if pt.is_a?(Hash)
|
78
|
+
|
79
|
+
dx = loc[0] - pt[0]
|
80
|
+
dy = loc[1] - pt[1]
|
81
|
+
Math.sqrt((dx ** 2) + (dy ** 2))
|
82
|
+
end
|
83
|
+
|
84
|
+
def neighbors(opts = {})
|
85
|
+
opts = {:skip => 0, :limit => 10}.merge(opts)
|
86
|
+
location = self.class.geo_key_name.to_sym
|
87
|
+
|
88
|
+
self.class.name.constantize.where(
|
89
|
+
location.near => self.send(self.class.geo_key_name)
|
90
|
+
).skip(opts[:skip]).limit(opts[:limit] + 1).to_a.reject { |n| n.id == self.id }
|
87
91
|
end
|
88
92
|
end
|
89
93
|
|
data/mongo_geo.gemspec
CHANGED
@@ -1,59 +1,27 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mongo_geo/version'
|
5
5
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'mongo_geo'
|
8
|
+
spec.version = MongoGeo::VERSION
|
9
|
+
spec.authors = ['Michael Parrish']
|
10
|
+
spec.email = ['michael@zooniverse.org']
|
11
|
+
spec.summary = 'A MongoMapper plugin that adds geospatial functionality'
|
12
|
+
spec.description = 'A MongoMapper plugin that adds geospatial functionality'
|
13
|
+
spec.homepage = ''
|
14
|
+
spec.license = 'MIT'
|
9
15
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
s.email = %q{mtparrish@gmail.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.markdown"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
".gitignore",
|
22
|
-
"LICENSE",
|
23
|
-
"README.markdown",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"lib/mongo_geo.rb",
|
27
|
-
"mongo_geo.gemspec",
|
28
|
-
"test/helper.rb",
|
29
|
-
"test/test_mongo_geo.rb",
|
30
|
-
"test/test_plucky_extensions.rb"
|
31
|
-
]
|
32
|
-
s.homepage = %q{http://github.com/parrish/mongo_geo}
|
33
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
34
|
-
s.require_paths = ["lib"]
|
35
|
-
s.rubygems_version = %q{1.3.7}
|
36
|
-
s.summary = %q{A MongoMapper plugin that adds geospatial functionality.}
|
37
|
-
s.test_files = [
|
38
|
-
"test/helper.rb",
|
39
|
-
"test/test_mongo_geo.rb",
|
40
|
-
"test/test_plucky_extensions.rb"
|
41
|
-
]
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
42
20
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
s.add_runtime_dependency(%q<mongo_mapper>, [">= 0.8.2"])
|
50
|
-
else
|
51
|
-
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
52
|
-
s.add_dependency(%q<mongo_mapper>, [">= 0.8.2"])
|
53
|
-
end
|
54
|
-
else
|
55
|
-
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
56
|
-
s.add_dependency(%q<mongo_mapper>, [">= 0.8.2"])
|
57
|
-
end
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.5'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'pry'
|
25
|
+
spec.add_development_dependency 'bson_ext'
|
26
|
+
spec.add_runtime_dependency 'mongo_mapper'
|
58
27
|
end
|
59
|
-
|
data/spec/plugin_spec.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TestModel do
|
4
|
+
before(:all) do
|
5
|
+
TestModel.create name: 'test1', coords: [50, 50]
|
6
|
+
TestModel.create name: 'test2', coords: [60, 60]
|
7
|
+
TestModel.create name: 'test3', coords: [70, 70]
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:test1){ TestModel.where(name: 'test1').first }
|
11
|
+
let(:test2){ TestModel.where(name: 'test2').first }
|
12
|
+
let(:test3){ TestModel.where(name: 'test3').first }
|
13
|
+
|
14
|
+
it 'should add symbol operators to plucky' do
|
15
|
+
symbol_ops = Plucky::Extensions::Symbol.instance_methods
|
16
|
+
:near.should be_in symbol_ops
|
17
|
+
:within.should be_in symbol_ops
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should check for the 2d index' do
|
21
|
+
TestModel.geo_key_name.should == :coords
|
22
|
+
TestModel.collection.index_information['coords_2d'].should be_present
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should not create an index unless specified' do
|
26
|
+
TestIndexlessModel.collection.index_information.should be_empty
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should validate the geo_key type' do
|
30
|
+
expect{ TestModel.geo_key :foo, Float }.to raise_error{ ArgumentError }
|
31
|
+
expect{ TestModel.geo_key :bar, Array }.to raise_exception{ RuntimeError }
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should query using near' do
|
35
|
+
TestModel.where(:coords.near => [45, 45]).all.should == [test1, test2, test3]
|
36
|
+
TestModel.where(:coords.near => [90, 90]).all.should == [test3, test2, test1]
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should query using within' do
|
40
|
+
TestModel.where(:coords.within => { :$center => [ [45, 45], 10 ] }).all.should == [test1]
|
41
|
+
TestModel.where(:coords.within => { :$center => [ [75, 75], 10 ] }).all.should == [test3]
|
42
|
+
TestModel.where(:coords.within => { :$center => [ [100, 100], 10 ] }).all.should be_empty
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'querying using geoNear' do
|
46
|
+
let(:nearby){ TestModel.near([45, 45], num: 2) }
|
47
|
+
let(:closest){ nearby.first }
|
48
|
+
let(:furthest){ nearby.last }
|
49
|
+
|
50
|
+
it 'should find nearby points' do
|
51
|
+
nearby.should == [closest, furthest]
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should find the average distance of nearby points' do
|
55
|
+
nearby.average_distance.should be_within(0.1).of 14.1
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should find the distance of each nearby point' do
|
59
|
+
closest.distance.should be_within(0.1).of 7.0
|
60
|
+
furthest.distance.should be_within(0.1).of 21.2
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should calculate straight line distances' do
|
65
|
+
test1.distance_from(test2.coords).should be_within(0.1).of 14.1
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should find the closest neighboring points' do
|
69
|
+
test1.neighbors.should == [test2, test3]
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should find the closest neighboring point' do
|
73
|
+
test1.neighbors(limit: 1).should == [test2]
|
74
|
+
end
|
75
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'mongo_mapper'
|
2
|
+
require 'mongo_geo'
|
3
|
+
|
4
|
+
connection = Mongo::Connection.new '127.0.0.1', 27017
|
5
|
+
DB = connection.db 'mongo-geo'
|
6
|
+
MongoMapper.database = 'mongo-geo'
|
7
|
+
|
8
|
+
require_relative 'support/test_model'
|
9
|
+
require_relative 'support/test_indexless_model'
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
|
+
config.run_all_when_everything_filtered = true
|
14
|
+
config.filter_run :focus
|
15
|
+
config.order = 'random'
|
16
|
+
|
17
|
+
config.before(:suite) do
|
18
|
+
DB['test_models'].remove
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,109 +1,147 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_geo
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease: false
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 0.2.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Michael Parrish
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
date: 2014-04-04 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.5'
|
20
|
+
type: :development
|
23
21
|
prerelease: false
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
27
31
|
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
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: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
33
62
|
type: :development
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: mongo_mapper
|
37
63
|
prerelease: false
|
38
|
-
|
39
|
-
|
40
|
-
requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
41
66
|
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bson_ext
|
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: mongo_mapper
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
49
90
|
type: :runtime
|
50
|
-
|
51
|
-
|
52
|
-
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: A MongoMapper plugin that adds geospatial functionality
|
98
|
+
email:
|
99
|
+
- michael@zooniverse.org
|
53
100
|
executables: []
|
54
|
-
|
55
101
|
extensions: []
|
56
|
-
|
57
|
-
|
58
|
-
-
|
59
|
-
-
|
60
|
-
|
61
|
-
-
|
62
|
-
- .
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".document"
|
105
|
+
- ".gitignore"
|
106
|
+
- ".rspec"
|
107
|
+
- Gemfile
|
108
|
+
- Gemfile.lock
|
63
109
|
- LICENSE
|
64
110
|
- README.markdown
|
65
111
|
- Rakefile
|
66
|
-
- VERSION
|
67
112
|
- lib/mongo_geo.rb
|
113
|
+
- lib/mongo_geo/version.rb
|
68
114
|
- mongo_geo.gemspec
|
69
|
-
-
|
70
|
-
-
|
71
|
-
-
|
72
|
-
|
73
|
-
homepage:
|
74
|
-
licenses:
|
75
|
-
|
115
|
+
- spec/plugin_spec.rb
|
116
|
+
- spec/spec_helper.rb
|
117
|
+
- spec/support/test_indexless_model.rb
|
118
|
+
- spec/support/test_model.rb
|
119
|
+
homepage: ''
|
120
|
+
licenses:
|
121
|
+
- MIT
|
122
|
+
metadata: {}
|
76
123
|
post_install_message:
|
77
|
-
rdoc_options:
|
78
|
-
|
79
|
-
require_paths:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
80
126
|
- lib
|
81
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
-
|
83
|
-
requirements:
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
84
129
|
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
version: "0"
|
90
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
|
-
requirements:
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
93
134
|
- - ">="
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
|
96
|
-
segments:
|
97
|
-
- 0
|
98
|
-
version: "0"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
99
137
|
requirements: []
|
100
|
-
|
101
138
|
rubyforge_project:
|
102
|
-
rubygems_version:
|
139
|
+
rubygems_version: 2.2.2
|
103
140
|
signing_key:
|
104
|
-
specification_version:
|
105
|
-
summary: A MongoMapper plugin that adds geospatial functionality
|
106
|
-
test_files:
|
107
|
-
-
|
108
|
-
-
|
109
|
-
-
|
141
|
+
specification_version: 4
|
142
|
+
summary: A MongoMapper plugin that adds geospatial functionality
|
143
|
+
test_files:
|
144
|
+
- spec/plugin_spec.rb
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
- spec/support/test_indexless_model.rb
|
147
|
+
- spec/support/test_model.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.2.0
|
data/test/helper.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'test/unit'
|
3
|
-
require 'shoulda'
|
4
|
-
require 'mongo_mapper'
|
5
|
-
|
6
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
|
-
require 'mongo_geo'
|
9
|
-
|
10
|
-
connection = Mongo::Connection.new('127.0.0.1', 27017)
|
11
|
-
DB = connection.db('mongo-geo')
|
12
|
-
MongoMapper.database = "mongo-geo"
|
13
|
-
|
14
|
-
class TestAsset
|
15
|
-
include MongoMapper::Document
|
16
|
-
plugin GeoSpatial
|
17
|
-
|
18
|
-
geo_key :coords, Array
|
19
|
-
end
|
20
|
-
|
21
|
-
class Test::Unit::TestCase
|
22
|
-
def setup
|
23
|
-
DB['test_assets'].remove
|
24
|
-
end
|
25
|
-
end
|
data/test/test_mongo_geo.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestMongoGeo < Test::Unit::TestCase
|
4
|
-
context "Initializing a model" do
|
5
|
-
setup do
|
6
|
-
@asset1 = TestAsset.create(:coords => [50, 50])
|
7
|
-
@asset2 = TestAsset.create(:coords => [60, 60])
|
8
|
-
@asset3 = TestAsset.create(:coords => [70, 70])
|
9
|
-
end
|
10
|
-
|
11
|
-
should "create the 2d index" do
|
12
|
-
assert_equal(TestAsset.geo_key_name, :coords)
|
13
|
-
assert(TestAsset.collection.index_information['coords_2d'], "geo_key did not define the 2d index")
|
14
|
-
end
|
15
|
-
|
16
|
-
should "validate #geo_key type" do
|
17
|
-
assert_raise(ArgumentError) { TestAsset.geo_key(:blah, Float) }
|
18
|
-
assert_raise(RuntimeError) { TestAsset.geo_key(:no_more, Array) }
|
19
|
-
end
|
20
|
-
|
21
|
-
should "allow plucky queries using #near" do
|
22
|
-
nearby = TestAsset.where(:coords.near => [45, 45]).to_a
|
23
|
-
assert_equal(nearby.first, @asset1)
|
24
|
-
assert_equal(nearby.last, @asset3)
|
25
|
-
end
|
26
|
-
|
27
|
-
should "allow plucky queries using #within" do
|
28
|
-
nearby = TestAsset.where(:coords.within => { "$center" => [[45, 45], 10] }).to_a
|
29
|
-
assert_equal(nearby, [@asset1])
|
30
|
-
end
|
31
|
-
|
32
|
-
should "allow geoNear style queries with #near" do
|
33
|
-
nearby = TestAsset.near([45, 45], :num => 2)
|
34
|
-
assert_equal(2, nearby.count)
|
35
|
-
assert_equal(@asset1, nearby.first)
|
36
|
-
|
37
|
-
assert(nearby.methods.collect{ |m| m.to_sym }.include?(:average_distance), "#near did not define average_distance")
|
38
|
-
assert_equal(nearby.average_distance.class, Float)
|
39
|
-
|
40
|
-
assert(nearby.first.methods.collect{ |m| m.to_sym }.include?(:distance), "#near did not define distance on each record")
|
41
|
-
assert_equal(nearby.first.distance.class, Float)
|
42
|
-
end
|
43
|
-
|
44
|
-
should "perform a simple #distance_from calculation" do
|
45
|
-
assert(@asset1.methods.collect{ |m| m.to_sym }.include?(:distance_from), "GeoSpatial::InstanceMethods were not included")
|
46
|
-
assert_equal(Math.sqrt(2), @asset1.distance_from([51, 51]))
|
47
|
-
assert_raise(ArgumentError) { @asset1.distance_from(51) }
|
48
|
-
|
49
|
-
TestAsset.collection.drop_indexes
|
50
|
-
TestAsset.collection.remove
|
51
|
-
end
|
52
|
-
|
53
|
-
should "find close objects with #neighbors" do
|
54
|
-
neighbors = @asset1.neighbors
|
55
|
-
assert_equal([@asset2, @asset3], neighbors)
|
56
|
-
end
|
57
|
-
|
58
|
-
should "find closest object with #neighbors" do
|
59
|
-
neighbors = @asset1.neighbors(:limit => 1)
|
60
|
-
assert_equal([@asset2], neighbors)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestMongoGeo < Test::Unit::TestCase
|
4
|
-
context "Extending Plucky symbols" do
|
5
|
-
should "add #near" do
|
6
|
-
assert Plucky::Extensions::Symbol.instance_methods.collect{ |m| m.to_sym }.include?(:near), "near symbol operator not created"
|
7
|
-
end
|
8
|
-
|
9
|
-
should "add #within" do
|
10
|
-
assert Plucky::Extensions::Symbol.instance_methods.collect{ |m| m.to_sym }.include?(:within), "within symbol operator not created"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|