activerecord-postgres-earthdistance 0.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.
Files changed (65) hide show
  1. data/.document +5 -0
  2. data/Gemfile +11 -0
  3. data/Gemfile.lock +84 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +17 -0
  6. data/Rakefile +55 -0
  7. data/VERSION +1 -0
  8. data/activerecord-postgres-earthdistance.gemspec +124 -0
  9. data/lib/activerecord-postgres-earthdistance.rb +48 -0
  10. data/lib/activerecord-postgres-earthdistance/activerecord.rb +17 -0
  11. data/lib/templates/cube.sql +326 -0
  12. data/lib/templates/earthdistance.sql +93 -0
  13. data/lib/templates/setup_earthdistance.rb +434 -0
  14. data/test/app/.gitignore +4 -0
  15. data/test/app/Gemfile +5 -0
  16. data/test/app/Gemfile.lock +83 -0
  17. data/test/app/README +256 -0
  18. data/test/app/Rakefile +7 -0
  19. data/test/app/app/controllers/application_controller.rb +3 -0
  20. data/test/app/app/helpers/application_helper.rb +2 -0
  21. data/test/app/app/models/place.rb +3 -0
  22. data/test/app/app/views/layouts/application.html.erb +14 -0
  23. data/test/app/config.ru +4 -0
  24. data/test/app/config/application.rb +42 -0
  25. data/test/app/config/boot.rb +13 -0
  26. data/test/app/config/database.yml +25 -0
  27. data/test/app/config/environment.rb +5 -0
  28. data/test/app/config/environments/development.rb +26 -0
  29. data/test/app/config/environments/production.rb +49 -0
  30. data/test/app/config/environments/test.rb +35 -0
  31. data/test/app/config/initializers/backtrace_silencers.rb +7 -0
  32. data/test/app/config/initializers/inflections.rb +10 -0
  33. data/test/app/config/initializers/mime_types.rb +5 -0
  34. data/test/app/config/initializers/secret_token.rb +7 -0
  35. data/test/app/config/initializers/session_store.rb +8 -0
  36. data/test/app/config/initializers/use_sql_schema.rb +3 -0
  37. data/test/app/config/locales/en.yml +5 -0
  38. data/test/app/config/routes.rb +58 -0
  39. data/test/app/db/development_structure.sql +807 -0
  40. data/test/app/db/migrate/20110225205046_setup_earthdistance.rb +434 -0
  41. data/test/app/db/migrate/20110225205131_create_places.rb +15 -0
  42. data/test/app/db/schema.rb +24 -0
  43. data/test/app/db/seeds.rb +7 -0
  44. data/test/app/doc/README_FOR_APP +2 -0
  45. data/test/app/lib/tasks/.gitkeep +0 -0
  46. data/test/app/public/404.html +26 -0
  47. data/test/app/public/422.html +26 -0
  48. data/test/app/public/500.html +26 -0
  49. data/test/app/public/favicon.ico +0 -0
  50. data/test/app/public/images/rails.png +0 -0
  51. data/test/app/public/index.html +239 -0
  52. data/test/app/public/javascripts/application.js +2 -0
  53. data/test/app/public/javascripts/controls.js +965 -0
  54. data/test/app/public/javascripts/dragdrop.js +974 -0
  55. data/test/app/public/javascripts/effects.js +1123 -0
  56. data/test/app/public/javascripts/prototype.js +6001 -0
  57. data/test/app/public/javascripts/rails.js +175 -0
  58. data/test/app/public/robots.txt +5 -0
  59. data/test/app/public/stylesheets/.gitkeep +0 -0
  60. data/test/app/script/rails +6 -0
  61. data/test/app/test/performance/browsing_test.rb +9 -0
  62. data/test/app/test/test_helper.rb +13 -0
  63. data/test/app/test/unit/place_test.rb +27 -0
  64. data/test/app/vendor/plugins/.gitkeep +0 -0
  65. metadata +205 -0
@@ -0,0 +1,175 @@
1
+ (function() {
2
+ // Technique from Juriy Zaytsev
3
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
4
+ function isEventSupported(eventName) {
5
+ var el = document.createElement('div');
6
+ eventName = 'on' + eventName;
7
+ var isSupported = (eventName in el);
8
+ if (!isSupported) {
9
+ el.setAttribute(eventName, 'return;');
10
+ isSupported = typeof el[eventName] == 'function';
11
+ }
12
+ el = null;
13
+ return isSupported;
14
+ }
15
+
16
+ function isForm(element) {
17
+ return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM'
18
+ }
19
+
20
+ function isInput(element) {
21
+ if (Object.isElement(element)) {
22
+ var name = element.nodeName.toUpperCase()
23
+ return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA'
24
+ }
25
+ else return false
26
+ }
27
+
28
+ var submitBubbles = isEventSupported('submit'),
29
+ changeBubbles = isEventSupported('change')
30
+
31
+ if (!submitBubbles || !changeBubbles) {
32
+ // augment the Event.Handler class to observe custom events when needed
33
+ Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap(
34
+ function(init, element, eventName, selector, callback) {
35
+ init(element, eventName, selector, callback)
36
+ // is the handler being attached to an element that doesn't support this event?
37
+ if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) ||
38
+ (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) {
39
+ // "submit" => "emulated:submit"
40
+ this.eventName = 'emulated:' + this.eventName
41
+ }
42
+ }
43
+ )
44
+ }
45
+
46
+ if (!submitBubbles) {
47
+ // discover forms on the page by observing focus events which always bubble
48
+ document.on('focusin', 'form', function(focusEvent, form) {
49
+ // special handler for the real "submit" event (one-time operation)
50
+ if (!form.retrieve('emulated:submit')) {
51
+ form.on('submit', function(submitEvent) {
52
+ var emulated = form.fire('emulated:submit', submitEvent, true)
53
+ // if custom event received preventDefault, cancel the real one too
54
+ if (emulated.returnValue === false) submitEvent.preventDefault()
55
+ })
56
+ form.store('emulated:submit', true)
57
+ }
58
+ })
59
+ }
60
+
61
+ if (!changeBubbles) {
62
+ // discover form inputs on the page
63
+ document.on('focusin', 'input, select, texarea', function(focusEvent, input) {
64
+ // special handler for real "change" events
65
+ if (!input.retrieve('emulated:change')) {
66
+ input.on('change', function(changeEvent) {
67
+ input.fire('emulated:change', changeEvent, true)
68
+ })
69
+ input.store('emulated:change', true)
70
+ }
71
+ })
72
+ }
73
+
74
+ function handleRemote(element) {
75
+ var method, url, params;
76
+
77
+ var event = element.fire("ajax:before");
78
+ if (event.stopped) return false;
79
+
80
+ if (element.tagName.toLowerCase() === 'form') {
81
+ method = element.readAttribute('method') || 'post';
82
+ url = element.readAttribute('action');
83
+ params = element.serialize();
84
+ } else {
85
+ method = element.readAttribute('data-method') || 'get';
86
+ url = element.readAttribute('href');
87
+ params = {};
88
+ }
89
+
90
+ new Ajax.Request(url, {
91
+ method: method,
92
+ parameters: params,
93
+ evalScripts: true,
94
+
95
+ onComplete: function(request) { element.fire("ajax:complete", request); },
96
+ onSuccess: function(request) { element.fire("ajax:success", request); },
97
+ onFailure: function(request) { element.fire("ajax:failure", request); }
98
+ });
99
+
100
+ element.fire("ajax:after");
101
+ }
102
+
103
+ function handleMethod(element) {
104
+ var method = element.readAttribute('data-method'),
105
+ url = element.readAttribute('href'),
106
+ csrf_param = $$('meta[name=csrf-param]')[0],
107
+ csrf_token = $$('meta[name=csrf-token]')[0];
108
+
109
+ var form = new Element('form', { method: "POST", action: url, style: "display: none;" });
110
+ element.parentNode.insert(form);
111
+
112
+ if (method !== 'post') {
113
+ var field = new Element('input', { type: 'hidden', name: '_method', value: method });
114
+ form.insert(field);
115
+ }
116
+
117
+ if (csrf_param) {
118
+ var param = csrf_param.readAttribute('content'),
119
+ token = csrf_token.readAttribute('content'),
120
+ field = new Element('input', { type: 'hidden', name: param, value: token });
121
+ form.insert(field);
122
+ }
123
+
124
+ form.submit();
125
+ }
126
+
127
+
128
+ document.on("click", "*[data-confirm]", function(event, element) {
129
+ var message = element.readAttribute('data-confirm');
130
+ if (!confirm(message)) event.stop();
131
+ });
132
+
133
+ document.on("click", "a[data-remote]", function(event, element) {
134
+ if (event.stopped) return;
135
+ handleRemote(element);
136
+ event.stop();
137
+ });
138
+
139
+ document.on("click", "a[data-method]", function(event, element) {
140
+ if (event.stopped) return;
141
+ handleMethod(element);
142
+ event.stop();
143
+ });
144
+
145
+ document.on("submit", function(event) {
146
+ var element = event.findElement(),
147
+ message = element.readAttribute('data-confirm');
148
+ if (message && !confirm(message)) {
149
+ event.stop();
150
+ return false;
151
+ }
152
+
153
+ var inputs = element.select("input[type=submit][data-disable-with]");
154
+ inputs.each(function(input) {
155
+ input.disabled = true;
156
+ input.writeAttribute('data-original-value', input.value);
157
+ input.value = input.readAttribute('data-disable-with');
158
+ });
159
+
160
+ var element = event.findElement("form[data-remote]");
161
+ if (element) {
162
+ handleRemote(element);
163
+ event.stop();
164
+ }
165
+ });
166
+
167
+ document.on("ajax:after", "form", function(event, element) {
168
+ var inputs = element.select("input[type=submit][disabled=true][data-disable-with]");
169
+ inputs.each(function(input) {
170
+ input.value = input.readAttribute('data-original-value');
171
+ input.removeAttribute('data-original-value');
172
+ input.disabled = false;
173
+ });
174
+ });
175
+ })();
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-Agent: *
5
+ # Disallow: /
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ # Profiling results for each test method are written to tmp/performance.
5
+ class BrowsingTest < ActionDispatch::PerformanceTest
6
+ def test_homepage
7
+ get '/'
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
7
+ #
8
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
9
+ # -- they do not yet inherit this setting
10
+ fixtures :all
11
+
12
+ # Add more helper methods to be used by all tests here...
13
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ class PlaceTest < ActiveSupport::TestCase
4
+ def setup
5
+ @test_place = Place.create!(:lat => -30.0277041, :lng => -51.2287346)
6
+ end
7
+
8
+ test "can find place within radius" do
9
+ assert_equal [@test_place], Place.within_radius(0, -30.0277041, -51.2287346).all
10
+ assert_equal [@test_place], Place.within_radius(400000, -27.5969039, -48.5494544).all
11
+ assert_equal [@test_place], Place.within_radius(4000000, -27.5969039, -48.5494544).all
12
+ end
13
+ test "won't find the place if radius is 0" do
14
+ assert_equal [], Place.within_radius(0, -27.5969039, -48.5494544).all
15
+ end
16
+ test "won't find places outside the radius" do
17
+ assert_equal [], Place.within_radius(1000, -27.5969039, -48.5494544).all
18
+ end
19
+ test "can handle more than one place" do
20
+ another_place = Place.create! :lat => -27.5969039, :lng => -48.5494544
21
+ assert_equal [@test_place], Place.within_radius(0, -30.0277041, -51.2287346).all
22
+ assert_equal [another_place], Place.within_radius(0, -27.5969039, -48.5494544).all
23
+ assert_equal [another_place], Place.within_radius(1000, -27.5969039, -48.5494544).all
24
+ assert_equal Set.new([@test_place, another_place]), Set.new(Place.within_radius(400000, -27.5969039, -48.5494544).all)
25
+ assert_equal Set.new([@test_place, another_place]), Set.new(Place.within_radius(4000000,-27.5969039, -48.5494544).all)
26
+ end
27
+ end
File without changes
metadata ADDED
@@ -0,0 +1,205 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activerecord-postgres-earthdistance
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Juan Maiz
9
+ - Diogo Biazus
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-06-23 00:00:00.000000000 -03:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rails
18
+ requirement: &11148630 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: 3.0.0
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *11148630
27
+ - !ruby/object:Gem::Dependency
28
+ name: pg
29
+ requirement: &11148380 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0.11'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: *11148380
38
+ - !ruby/object:Gem::Dependency
39
+ name: shoulda
40
+ requirement: &11148110 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *11148110
49
+ - !ruby/object:Gem::Dependency
50
+ name: bundler
51
+ requirement: &11147860 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: 1.0.0
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *11147860
60
+ - !ruby/object:Gem::Dependency
61
+ name: jeweler
62
+ requirement: &11147600 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: 1.6.2
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *11147600
71
+ - !ruby/object:Gem::Dependency
72
+ name: rcov
73
+ requirement: &11147340 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: *11147340
82
+ - !ruby/object:Gem::Dependency
83
+ name: pg
84
+ requirement: &11147090 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: *11147090
93
+ - !ruby/object:Gem::Dependency
94
+ name: rails
95
+ requirement: &11146840 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ type: :runtime
102
+ prerelease: false
103
+ version_requirements: *11146840
104
+ description: I'll write it tomorrow
105
+ email: diogob@gmail.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files:
109
+ - LICENSE
110
+ - README.rdoc
111
+ files:
112
+ - .document
113
+ - Gemfile
114
+ - Gemfile.lock
115
+ - LICENSE
116
+ - README.rdoc
117
+ - Rakefile
118
+ - VERSION
119
+ - activerecord-postgres-earthdistance.gemspec
120
+ - lib/activerecord-postgres-earthdistance.rb
121
+ - lib/activerecord-postgres-earthdistance/activerecord.rb
122
+ - lib/templates/cube.sql
123
+ - lib/templates/earthdistance.sql
124
+ - lib/templates/setup_earthdistance.rb
125
+ - test/app/.gitignore
126
+ - test/app/Gemfile
127
+ - test/app/Gemfile.lock
128
+ - test/app/README
129
+ - test/app/Rakefile
130
+ - test/app/app/controllers/application_controller.rb
131
+ - test/app/app/helpers/application_helper.rb
132
+ - test/app/app/models/place.rb
133
+ - test/app/app/views/layouts/application.html.erb
134
+ - test/app/config.ru
135
+ - test/app/config/application.rb
136
+ - test/app/config/boot.rb
137
+ - test/app/config/database.yml
138
+ - test/app/config/environment.rb
139
+ - test/app/config/environments/development.rb
140
+ - test/app/config/environments/production.rb
141
+ - test/app/config/environments/test.rb
142
+ - test/app/config/initializers/backtrace_silencers.rb
143
+ - test/app/config/initializers/inflections.rb
144
+ - test/app/config/initializers/mime_types.rb
145
+ - test/app/config/initializers/secret_token.rb
146
+ - test/app/config/initializers/session_store.rb
147
+ - test/app/config/initializers/use_sql_schema.rb
148
+ - test/app/config/locales/en.yml
149
+ - test/app/config/routes.rb
150
+ - test/app/db/development_structure.sql
151
+ - test/app/db/migrate/20110225205046_setup_earthdistance.rb
152
+ - test/app/db/migrate/20110225205131_create_places.rb
153
+ - test/app/db/schema.rb
154
+ - test/app/db/seeds.rb
155
+ - test/app/doc/README_FOR_APP
156
+ - test/app/lib/tasks/.gitkeep
157
+ - test/app/public/404.html
158
+ - test/app/public/422.html
159
+ - test/app/public/500.html
160
+ - test/app/public/favicon.ico
161
+ - test/app/public/images/rails.png
162
+ - test/app/public/index.html
163
+ - test/app/public/javascripts/application.js
164
+ - test/app/public/javascripts/controls.js
165
+ - test/app/public/javascripts/dragdrop.js
166
+ - test/app/public/javascripts/effects.js
167
+ - test/app/public/javascripts/prototype.js
168
+ - test/app/public/javascripts/rails.js
169
+ - test/app/public/robots.txt
170
+ - test/app/public/stylesheets/.gitkeep
171
+ - test/app/script/rails
172
+ - test/app/test/performance/browsing_test.rb
173
+ - test/app/test/test_helper.rb
174
+ - test/app/test/unit/place_test.rb
175
+ - test/app/vendor/plugins/.gitkeep
176
+ has_rdoc: true
177
+ homepage: http://github.com/softa/activerecord-postgres-earthdistance
178
+ licenses:
179
+ - MIT
180
+ post_install_message:
181
+ rdoc_options: []
182
+ require_paths:
183
+ - lib
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ segments:
191
+ - 0
192
+ hash: -433114031
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 1.6.2
202
+ signing_key:
203
+ specification_version: 3
204
+ summary: Now you can filter records within a radius
205
+ test_files: []