drifter-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in drifter-rails.gemspec
4
+ gemspec
data/README ADDED
@@ -0,0 +1,72 @@
1
+ == drifter-rails
2
+
3
+ drifter-rails is a simple gem that provides distance calculations and queries
4
+ for ActiveRecord. It currently supports postgresql and mysql on rails 3.
5
+
6
+ === Installation
7
+
8
+ # in Gemfile
9
+ config.gem 'drifter-rails'
10
+
11
+ # optionally, in config/intiailizers/drifter.rb, one of these:
12
+ Drifter.default_units = :miles
13
+ Drifter.default_units = :km
14
+
15
+ # in your model
16
+ class Place < ActiveRecord::Base
17
+ acts_as_drifter
18
+ end
19
+
20
+ === Usage
21
+
22
+ To return a calculated 'distance' value along with your queries:
23
+
24
+ >> origin = [52.123, -2.5432]
25
+ >> results = Place.near(origin)
26
+ >> results.first.distance
27
+ => 12.33228393
28
+
29
+ origin can be a two item [lat,lng] array, any acts_as_drifter object or any object that
30
+ responds to lat() and lng().
31
+
32
+ To return objects within a specific distance of a point of origin:
33
+
34
+ >> origin = [52.123, -2.5432]
35
+ >> Place.near(origin, :within => 10)
36
+ >> Place.near(origin, :within => 10, :units => :km)
37
+ => "#<ActiveRecord::Relation:0xafb1e18>"
38
+
39
+ The near() method returns an ActiveRecord::Relation that you can use the same as any
40
+ other scope, including ordering by distance:
41
+
42
+ >> Place.near(origin, :within => 10).includes(:visitors).order("distance ASC")
43
+ => "#<ActiveRecord::Relation:0xafb1e18>"
44
+
45
+ Each acts_as_drifter object also gets a distance_to() method that can calculate the
46
+ distance to another location:
47
+
48
+ >> place = Place.first
49
+ >> place.distance_to(other_place)
50
+ >> place.distance_to( [10.321, -5.432] )
51
+ >> place.distance_to( [10.321, -5.432], :units => :km )
52
+
53
+ The location() and location=() methods provide a shortcut for setting lat() and lng():
54
+
55
+ >> place = Place.new
56
+ >> place.location = [2.222, 3.333]
57
+
58
+ >> place.lat
59
+ => 2.222
60
+ >> place.lng
61
+ => 3.333
62
+
63
+ Finally, you can use custom names for the lat and lng columns:
64
+
65
+ class Place < ActiveRecord::Base
66
+ acts_as_drifter :lat_column => :latitude, :lng_column => :longitude
67
+ end
68
+
69
+
70
+ === License
71
+
72
+ MIT License. Copyright 2011 Ahmed Adam (http://github.com/ahmedrb)
data/README.rdoc ADDED
@@ -0,0 +1,72 @@
1
+ == drifter-rails
2
+
3
+ drifter-rails is a simple gem that provides distance calculations and queries
4
+ for ActiveRecord. It currently supports postgresql and mysql on rails 3.
5
+
6
+ === Installation
7
+
8
+ # in Gemfile
9
+ config.gem 'drifter-rails'
10
+
11
+ # optionally, in config/intiailizers/drifter.rb, one of these:
12
+ Drifter.default_units = :miles
13
+ Drifter.default_units = :km
14
+
15
+ # in your model
16
+ class Place < ActiveRecord::Base
17
+ acts_as_drifter
18
+ end
19
+
20
+ === Usage
21
+
22
+ To return a calculated 'distance' value along with your queries:
23
+
24
+ >> origin = [52.123, -2.5432]
25
+ >> results = Place.near(origin)
26
+ >> results.first.distance
27
+ => 12.33228393
28
+
29
+ origin can be a two item [lat,lng] array, any acts_as_drifter object or any object that
30
+ responds to lat() and lng().
31
+
32
+ To return objects within a specific distance of a point of origin:
33
+
34
+ >> origin = [52.123, -2.5432]
35
+ >> Place.near(origin, :within => 10)
36
+ >> Place.near(origin, :within => 10, :units => :km)
37
+ => "#<ActiveRecord::Relation:0xafb1e18>"
38
+
39
+ The near() method returns an ActiveRecord::Relation that you can use the same as any
40
+ other scope, including ordering by distance:
41
+
42
+ >> Place.near(origin, :within => 10).includes(:visitors).order("distance ASC")
43
+ => "#<ActiveRecord::Relation:0xafb1e18>"
44
+
45
+ Each acts_as_drifter object also gets a distance_to() method that can calculate the
46
+ distance to another location:
47
+
48
+ >> place = Place.first
49
+ >> place.distance_to(other_place)
50
+ >> place.distance_to( [10.321, -5.432] )
51
+ >> place.distance_to( [10.321, -5.432], :units => :km )
52
+
53
+ The location() and location=() methods provide a shortcut for setting lat() and lng():
54
+
55
+ >> place = Place.new
56
+ >> place.location = [2.222, 3.333]
57
+
58
+ >> place.lat
59
+ => 2.222
60
+ >> place.lng
61
+ => 3.333
62
+
63
+ Finally, you can use custom names for the lat and lng columns:
64
+
65
+ class Place < ActiveRecord::Base
66
+ acts_as_drifter :lat_column => :latitude, :lng_column => :longitude
67
+ end
68
+
69
+
70
+ === License
71
+
72
+ MIT License. Copyright 2011 Ahmed Adam (http://github.com/ahmedrb)
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ require 'rake/testtask'
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+
6
+ def run_tests(name)
7
+ task_name = "test_#{name}"
8
+ Rake::TestTask.new(task_name) do |t|
9
+ t.test_files = FileList['test/*_test.rb']
10
+ t.verbose = true
11
+ end
12
+ Rake::Task[task_name].invoke
13
+ end
14
+
15
+
16
+ namespace :test do
17
+
18
+ desc "Run tests using the mysql adapater"
19
+ task :mysql do
20
+ puts "\nRunning test using mysql\n\n"
21
+ ENV['DB'] = 'mysql'
22
+ run_tests :mysql
23
+ end
24
+
25
+ desc "Run tests using the postgresql adapater"
26
+ task :postgresql do
27
+ puts "\nRunning test using postgresql\n\n"
28
+ ENV['DB'] = 'postgresql'
29
+ run_tests :postgresql
30
+ end
31
+
32
+ desc "Run tests using each db adapter in succession"
33
+ task :all do
34
+ Rake::Task["test:mysql"].invoke
35
+ Rake::Task["test:postgresql"].invoke
36
+ end
37
+
38
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "drifter-rails/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "drifter-rails"
7
+ s.version = Drifter::Rails::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Ahmed Adam"]
10
+ s.homepage = "http://github.com/ahmedrb/drifter-rails"
11
+ s.summary = %q{Distance queries for ActiveRecord 3}
12
+
13
+ s.rubyforge_project = "drifter-rails"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_dependency 'drifter', '0.1.0'
21
+ s.add_dependency 'activerecord', '~> 3.0.0'
22
+
23
+ s.add_development_dependency 'mysql'
24
+ s.add_development_dependency 'pg'
25
+ s.add_development_dependency 'ruby-debug'
26
+ s.add_development_dependency 'yaml'
27
+ end
@@ -0,0 +1,27 @@
1
+ require 'active_record'
2
+ require 'drifter'
3
+ require 'drifter-rails/class_methods'
4
+ require 'drifter-rails/instance_methods'
5
+
6
+ module Drifter
7
+ module Rails
8
+
9
+ # supported_options:
10
+ # :lat_column - the name of the column holding latitude values (default is lat)
11
+ # :lng_column - the name of the column holding longitude values (default is lng)
12
+ def acts_as_drifter(options={})
13
+ # determine the names of the lat and lng columns
14
+ lat_col = options[:lat_column] || :lat
15
+ lng_col = options[:lng_column] || :lng
16
+
17
+ eval("def self.lat_column_name; :#{lat_col}; end")
18
+ eval("def self.lng_column_name; :#{lng_col}; end")
19
+
20
+ extend Drifter::Rails::ClassMethods
21
+ include Drifter::Rails::InstanceMethods
22
+ end
23
+
24
+
25
+ end
26
+ end
27
+ ActiveRecord::Base.send :extend, Drifter::Rails
@@ -0,0 +1,49 @@
1
+ module Drifter
2
+ module Rails
3
+ module ClassMethods
4
+
5
+ # used by InstanceMethods to determine if lat/lng accessors need to be defined
6
+ def has_method?(name)
7
+ return true if column_names.include?(name.to_s)
8
+ return true if instance_methods.include?(name.to_s)
9
+ return false
10
+ end
11
+
12
+
13
+ # nodoc
14
+ def near(origin, options={})
15
+ options[:origin] = origin
16
+ options[:lat_column] = lat_column_name
17
+ options[:lng_column] = lng_column_name
18
+
19
+ adapter = self.connection.class.to_s.split('::').last
20
+ method_name = case adapter
21
+ when 'PostgreSQLAdapter' then :to_postgresql
22
+ when 'MysqlAdapter' then :to_mysql
23
+ else raise ArgumentError, "#{adapter} is not supported by drifter-rails"
24
+ end
25
+
26
+ distance_sql = Drifter::Distance::Haversine.send(method_name, options)
27
+ sql = "#{table_name}.*, (#{distance_sql}) AS distance"
28
+
29
+ scope = select(sql)
30
+ scope = add_conditions_for_within(scope, options, distance_sql)
31
+ return scope
32
+ end
33
+
34
+
35
+ private
36
+
37
+
38
+ # TODO: 'distance' column not visible to the where clause (postgres and mysql)
39
+ # so the calculation has to be repeated in the where clause. Can that be fixed?
40
+ def add_conditions_for_within(scope, options, distance_sql)
41
+ max_distance = options[:within].to_i
42
+ return scope unless max_distance > 0
43
+ return scope.where("(#{distance_sql}) < #{max_distance}")
44
+ end
45
+
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,47 @@
1
+ module Drifter
2
+ module Rails
3
+ module InstanceMethods
4
+
5
+ # nodoc
6
+ def self.included(base)
7
+ base.send :include, Drifter::Location::Locatable
8
+ base.send :include, LatAccessors unless base.has_method?(:lat)
9
+ base.send :include, LngAccessors unless base.has_method?(:lng)
10
+ end
11
+
12
+
13
+ # nodoc
14
+ module LatAccessors
15
+
16
+ # nodoc
17
+ def lat
18
+ self.send self.class.lat_column_name
19
+ end
20
+
21
+ # nodoc
22
+ def lat=(value)
23
+ writer = "#{self.class.lat_column_name}="
24
+ self.send writer, value
25
+ end
26
+ end
27
+
28
+
29
+ # nodoc
30
+ module LngAccessors
31
+
32
+ # nodoc
33
+ def lng
34
+ self.send self.class.lng_column_name
35
+ end
36
+
37
+ # nodoc
38
+ def lng=(value)
39
+ writer = "#{self.class.lng_column_name}="
40
+ self.send writer, value
41
+ end
42
+ end
43
+
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,5 @@
1
+ module Drifter
2
+ module Rails
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ class ActsAsDrifterTest < Test::Unit::TestCase
3
+
4
+
5
+ def test_lat_column_id_method
6
+ Place.send :acts_as_drifter
7
+ assert_equal :lat, Place.lat_column_name
8
+ end
9
+
10
+ def test_lat_lng_accessors_with_default_column_names
11
+ Place.send :acts_as_drifter
12
+ i = Place.new :lat => 1, :lng => 2
13
+ assert_equal 1, i.lat
14
+ assert_equal 2, i.lng
15
+
16
+ i.lat= 10
17
+ i.lng= 20
18
+ assert_equal 10, i.lat
19
+ assert_equal 20, i.lng
20
+ end
21
+
22
+ def test_lat_lng_accessors_with_custom_column_names
23
+ Store.send :acts_as_drifter, :lat_column => :latitude, :lng_column => :longitude
24
+ i = Store.new :latitude => 1, :longitude => 2
25
+ assert_equal 1, i.lat
26
+ assert_equal 2, i.lng
27
+
28
+ i.lat= 10
29
+ i.lng= 20
30
+ assert_equal 10, i.latitude
31
+ assert_equal 20, i.longitude
32
+ end
33
+
34
+ end
data/test/database.yml ADDED
@@ -0,0 +1,12 @@
1
+ :postgresql:
2
+ :adapter: postgresql
3
+ :name: drifter_rails_test
4
+ :username: developer
5
+ :password: password
6
+
7
+ :mysql:
8
+ :adapter: mysql
9
+ :name: drifter_rails_test
10
+ :username: developer
11
+ :password: password
12
+
data/test/near_test.rb ADDED
@@ -0,0 +1,75 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ # TODO: better fixtures
4
+ class NearTest < Test::Unit::TestCase
5
+
6
+ # request places in ascending/descending order and checks that the order is correct
7
+ # TODO: this is tied very closely to the fixtures, too brittle
8
+ def check_order(order, klass)
9
+ order_by = "distance ASC"
10
+ origin = [53.57, -2.4333] # nr bolton
11
+ expected = ["Bolton", "Manchester", "Chester", "Nottingham", "London"]
12
+
13
+ if order == :desc
14
+ order_by = "distance DESC"
15
+ expected.reverse!
16
+ end
17
+
18
+ results = klass.near(origin).order(order_by)
19
+ names = results.collect { |p| p.name }
20
+ assert_equal expected, names
21
+
22
+ # check the distances too
23
+ distances = results.collect { |p| p.distance.to_f }
24
+ expected = distances.sort
25
+ expected = distances.sort.reverse if order == :desc
26
+ assert_equal expected, distances
27
+ end
28
+
29
+
30
+ # check the 'distance' column isn't dropped
31
+ def test_distance_attribute_with_includes_option
32
+ Place.send :acts_as_drifter
33
+ origin = [53.5, -2.4]
34
+ place = Place.near(origin).first
35
+
36
+ assert_not_nil place.distance
37
+ assert place.distance.to_f > 1
38
+
39
+ other = Place.near(origin).includes(:visitors).first
40
+ assert_equal place.distance, other.distance
41
+ end
42
+
43
+
44
+ def test_order_by_distance_using_default_column_names
45
+ Place.send :acts_as_drifter
46
+ check_order :asc, Place
47
+ check_order :desc, Place
48
+ end
49
+
50
+
51
+ def test_order_by_distance_using_custom_column_names
52
+ Store.send :acts_as_drifter, :lat_column => :latitude, :lng_column => :longitude
53
+ check_order :asc, Store
54
+ check_order :desc, Store
55
+ end
56
+
57
+
58
+ def test_near_plus_within_using_default_column_names
59
+ Place.send :acts_as_drifter
60
+ origin = [53.57, -2.4333] # nr bolton
61
+ results = Place.near(origin, :within => 50)
62
+ assert results.count == 3
63
+ results.each { |r| assert r.distance.to_f <= 50 }
64
+ end
65
+
66
+
67
+ def test_near_plus_within_using_custom_column_names
68
+ Store.send :acts_as_drifter, :lat_column => :latitude, :lng_column => :longitude
69
+ origin = [53.57, -2.4333] # nr bolton
70
+ results = Store.near(origin, :within => 50)
71
+ assert results.count == 3
72
+ results.each { |r| assert r.distance.to_f <= 50 }
73
+ end
74
+
75
+ end
@@ -0,0 +1,120 @@
1
+ # these library's will be loaded when the drifter-rails gem is loaded
2
+ require 'rubygems'
3
+ require 'active_record'
4
+ require 'drifter'
5
+ require 'pg'
6
+ require 'yaml'
7
+
8
+ # these are for testing only
9
+ require 'ruby-debug'
10
+ require 'test/unit'
11
+
12
+
13
+ # AR::Base classes used for the tests, this one has lat, lng columns
14
+ class Place < ActiveRecord::Base
15
+ has_many :visitors
16
+ end
17
+
18
+ # same as Place but with latitude and longitude columns
19
+ class Store < ActiveRecord::Base
20
+ has_many :visitors
21
+ end
22
+
23
+ class Visitor < ActiveRecord::Base
24
+ belongs_to :place
25
+ belongs_to :visitor
26
+ end
27
+
28
+
29
+ # this migration is used to prepare the database for tests
30
+ class PrepareDB < ActiveRecord::Migration
31
+
32
+ def self.up
33
+
34
+ drop_table :places if ActiveRecord::Base.connection.tables.include?("places")
35
+ drop_table :stores if ActiveRecord::Base.connection.tables.include?("stores")
36
+ drop_table :visitors if ActiveRecord::Base.connection.tables.include?("visitors")
37
+
38
+ create_table :places do |t|
39
+ t.string :name
40
+ t.decimal :lat, :precision => 16, :scale => 12
41
+ t.decimal :lng, :precision => 16, :scale => 12
42
+ end
43
+ create_table :stores do |t|
44
+ t.string :name
45
+ t.decimal :latitude, :precision => 16, :scale => 12
46
+ t.decimal :longitude, :precision => 16, :scale => 12
47
+ end
48
+ create_table :visitors do |t|
49
+ t.integer :place_id
50
+ t.integer :store_id
51
+ t.string :name
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+
58
+ # connects the given class to the given database. Connections params should be defined in database.yml
59
+ def connect_to(db)
60
+ data = YAML.load_file(File.dirname(__FILE__) + '/database.yml')
61
+ db = data[db]
62
+ ActiveRecord::Base.remove_connection if ActiveRecord::Base.connected?
63
+ ActiveRecord::Base.establish_connection(
64
+ :adapter => db[:adapter],
65
+ :database => db[:name],
66
+ :username => db[:username],
67
+ :password => db[:password]
68
+ )
69
+ end
70
+
71
+ def places_attributes(lat=:lat, lng =:lng)
72
+ attrs = [
73
+ { :name => "Bolton", lat => 53.57845, lng => -2.426664 },
74
+ { :name => "Chester", lat => 53.18813, lng => -2.894369 },
75
+ { :name => "Manchester", lat => 53.417439, lng => -2.23156 },
76
+ { :name => "Nottingham", lat => 52.951199, lng => -1.13087 },
77
+ { :name => "London", lat => 51.5001524, lng => -0.1262362 }
78
+ ]
79
+ end
80
+
81
+ def add_places(attrs=false)
82
+ Place.delete_all
83
+ Place.create! places_attributes
84
+ end
85
+
86
+ def add_stores
87
+ attrs = places_attributes(:latitude, :longitude)
88
+ Store.delete_all
89
+ Store.create! attrs
90
+ end
91
+
92
+ def add_visitors
93
+ places = Place.all
94
+ stores = Store.all
95
+ %W(john mike jane emma paul).each do |name|
96
+ place_id = places[rand(places.size)].id
97
+ store_id = stores[rand(stores.size)].id
98
+ Visitor.create! :name => name, :place_id => place_id, :store_id => store_id
99
+ end
100
+ end
101
+
102
+ # the first time this file is loaded it connects to a db and runs the migration
103
+ # specify the db using the DB environment variable ['mysql', 'postgresql']
104
+ unless ActiveRecord::Base.connected?
105
+ db = ENV['DB'] || :postgresql
106
+ connect_to db.to_s.intern
107
+ PrepareDB.verbose = false
108
+ puts "Running migrations..."
109
+ PrepareDB.migrate :up
110
+ add_places
111
+ add_stores
112
+ add_visitors
113
+ end
114
+
115
+ # this will be set when loaded as a gem. Only needed for tests
116
+ $LOAD_PATH << File.expand_path('../../lib/', __FILE__)
117
+
118
+ # acts_as_drifter queries column names so this has to come after the connection
119
+ # is established
120
+ require 'drifter-rails'
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: drifter-rails
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Ahmed Adam
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-01-22 00:00:00 +00:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: drifter
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: 27
30
+ segments:
31
+ - 0
32
+ - 1
33
+ - 0
34
+ version: 0.1.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: activerecord
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 7
46
+ segments:
47
+ - 3
48
+ - 0
49
+ - 0
50
+ version: 3.0.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: mysql
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ type: :development
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: pg
69
+ prerelease: false
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ type: :development
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: ruby-debug
83
+ prerelease: false
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ type: :development
94
+ version_requirements: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ name: yaml
97
+ prerelease: false
98
+ requirement: &id006 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
106
+ version: "0"
107
+ type: :development
108
+ version_requirements: *id006
109
+ description:
110
+ email:
111
+ executables: []
112
+
113
+ extensions: []
114
+
115
+ extra_rdoc_files: []
116
+
117
+ files:
118
+ - .gitignore
119
+ - Gemfile
120
+ - README
121
+ - README.rdoc
122
+ - Rakefile
123
+ - drifter-rails.gemspec
124
+ - lib/drifter-rails.rb
125
+ - lib/drifter-rails/class_methods.rb
126
+ - lib/drifter-rails/instance_methods.rb
127
+ - lib/drifter-rails/version.rb
128
+ - test/acts_as_drifter_test.rb
129
+ - test/database.yml
130
+ - test/near_test.rb
131
+ - test/test_helper.rb
132
+ has_rdoc: true
133
+ homepage: http://github.com/ahmedrb/drifter-rails
134
+ licenses: []
135
+
136
+ post_install_message:
137
+ rdoc_options: []
138
+
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ hash: 3
147
+ segments:
148
+ - 0
149
+ version: "0"
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ none: false
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ hash: 3
156
+ segments:
157
+ - 0
158
+ version: "0"
159
+ requirements: []
160
+
161
+ rubyforge_project: drifter-rails
162
+ rubygems_version: 1.3.7
163
+ signing_key:
164
+ specification_version: 3
165
+ summary: Distance queries for ActiveRecord 3
166
+ test_files: []
167
+