route_dog 2.0.1

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 (57) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +62 -0
  3. data/Rakefile +36 -0
  4. data/VERSION +1 -0
  5. data/lib/route_dog/middleware/notifier.rb +39 -0
  6. data/lib/route_dog/middleware/route_dog.rb +51 -0
  7. data/lib/route_dog/middleware/watcher.rb +32 -0
  8. data/lib/route_dog.rb +3 -0
  9. data/route_dog.gemspec +130 -0
  10. data/test/integration/products_controller_test.rb +41 -0
  11. data/test/integration/sessions_controller.rb +18 -0
  12. data/test/integration/users_controller_test.rb +85 -0
  13. data/test/mock_app/.gitignore +4 -0
  14. data/test/mock_app/Gemfile +30 -0
  15. data/test/mock_app/Gemfile.lock +73 -0
  16. data/test/mock_app/Rakefile +7 -0
  17. data/test/mock_app/app/controllers/application_controller.rb +3 -0
  18. data/test/mock_app/app/controllers/products_controller.rb +21 -0
  19. data/test/mock_app/app/controllers/sessions_controller_test.rb +5 -0
  20. data/test/mock_app/app/controllers/users_controller.rb +29 -0
  21. data/test/mock_app/app/helpers/application_helper.rb +2 -0
  22. data/test/mock_app/app/views/layouts/application.html.erb +14 -0
  23. data/test/mock_app/app/views/users/index.html.erb +0 -0
  24. data/test/mock_app/config/application.rb +42 -0
  25. data/test/mock_app/config/boot.rb +13 -0
  26. data/test/mock_app/config/database.yml +22 -0
  27. data/test/mock_app/config/environment.rb +5 -0
  28. data/test/mock_app/config/environments/development.rb +26 -0
  29. data/test/mock_app/config/environments/production.rb +49 -0
  30. data/test/mock_app/config/environments/test.rb +35 -0
  31. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  32. data/test/mock_app/config/initializers/inflections.rb +10 -0
  33. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  34. data/test/mock_app/config/initializers/route_dog.rb +6 -0
  35. data/test/mock_app/config/initializers/secret_token.rb +7 -0
  36. data/test/mock_app/config/initializers/session_store.rb +8 -0
  37. data/test/mock_app/config/locales/en.yml +5 -0
  38. data/test/mock_app/config/routes.rb +67 -0
  39. data/test/mock_app/config.ru +4 -0
  40. data/test/mock_app/db/seeds.rb +7 -0
  41. data/test/mock_app/public/404.html +26 -0
  42. data/test/mock_app/public/422.html +26 -0
  43. data/test/mock_app/public/500.html +26 -0
  44. data/test/mock_app/public/favicon.ico +0 -0
  45. data/test/mock_app/public/images/rails.png +0 -0
  46. data/test/mock_app/public/index.html +239 -0
  47. data/test/mock_app/public/javascripts/application.js +2 -0
  48. data/test/mock_app/public/javascripts/controls.js +965 -0
  49. data/test/mock_app/public/javascripts/dragdrop.js +974 -0
  50. data/test/mock_app/public/javascripts/effects.js +1123 -0
  51. data/test/mock_app/public/javascripts/prototype.js +6001 -0
  52. data/test/mock_app/public/javascripts/rails.js +175 -0
  53. data/test/mock_app/public/robots.txt +5 -0
  54. data/test/mock_app/public/stylesheets/.gitkeep +0 -0
  55. data/test/support/assertions.rb +31 -0
  56. data/test/test_helper.rb +12 -0
  57. metadata +207 -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,31 @@
1
+ def assert_watched_routes_include(controller, action, method)
2
+ begin
3
+ routes = YAML.load_file(RouteDog::Middleware::RouteDog.config_file)
4
+ raise if !routes[controller.to_s][action.to_s].include?(method.to_s)
5
+ raise if routes[controller.to_s][action.to_s].reject {|e| e != method.to_s}.size != 1
6
+ rescue
7
+ assert false, "Expected Watched Routes To Include {:controller => :#{controller}, :action => :#{action}, :method => :#{method}} Only One Time."
8
+ end
9
+ end
10
+
11
+ def assert_watched_routes_not_include(controller, action, method = :get)
12
+ begin
13
+ routes = YAML.load_file(RouteDog::Middleware::RouteDog.config_file)
14
+ routes[controller.to_s][action.to_s].include?(method.to_s)
15
+ assert false
16
+ rescue Test::Unit::AssertionFailedError
17
+ assert false, "Expected Watched Routes To Not include {:controller => :#{controller}, :action => :#{action}, :method => :#{method}}."
18
+ rescue
19
+ assert true
20
+ end
21
+ end
22
+
23
+ def assert_notify_for(controller, action, method = :get)
24
+ html_notification = Nokogiri::HTML(response.body).search('div#route_dog_warning')
25
+ assert html_notification.any?, "Expected {:controller => :#{controller}, :action => :#{action}, :method => :#{method}} Notify That The Route Has Not Tests"
26
+ end
27
+
28
+ def assert_not_notify_for(controller, action, method = :get)
29
+ html_notification = Nokogiri::HTML(response.body).search('div#route_dog_warning')
30
+ assert !html_notification.any?, "Expected {:controller => :#{controller}, :action => :#{action}, :method => :#{method}} To Not Notify That The Route Has Not Tests"
31
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'ruby-debug'
3
+ require 'contest'
4
+ require 'nokogiri'
5
+
6
+ ENV['RAILS_ENV'] = 'test'
7
+ ENV['RAILS_ROOT'] = File.join(File.dirname(__FILE__), 'mock_app')
8
+ require File.expand_path(File.join(ENV['RAILS_ROOT'], 'config', 'environment.rb'))
9
+
10
+ require 'rails/test_help'
11
+
12
+ Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
metadata ADDED
@@ -0,0 +1,207 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: route_dog
3
+ version: !ruby/object:Gem::Version
4
+ hash: 13
5
+ prerelease: false
6
+ segments:
7
+ - 2
8
+ - 0
9
+ - 1
10
+ version: 2.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Alvaro Gil
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-23 00:00:00 -02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rack
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rails
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 19
44
+ segments:
45
+ - 2
46
+ - 3
47
+ - 8
48
+ version: 2.3.8
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: contest
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - "="
58
+ - !ruby/object:Gem::Version
59
+ hash: 31
60
+ segments:
61
+ - 0
62
+ - 1
63
+ - 2
64
+ version: 0.1.2
65
+ type: :development
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: nokogiri
69
+ prerelease: false
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - "="
74
+ - !ruby/object:Gem::Version
75
+ hash: 113
76
+ segments:
77
+ - 1
78
+ - 4
79
+ - 3
80
+ - 1
81
+ version: 1.4.3.1
82
+ type: :development
83
+ version_requirements: *id004
84
+ description: Watch and Notify your not tested routes of a RoR Application
85
+ email: zevarito@gmail.com
86
+ executables: []
87
+
88
+ extensions: []
89
+
90
+ extra_rdoc_files:
91
+ - README.md
92
+ files:
93
+ - .gitignore
94
+ - README.md
95
+ - Rakefile
96
+ - VERSION
97
+ - lib/route_dog.rb
98
+ - lib/route_dog/middleware/notifier.rb
99
+ - lib/route_dog/middleware/route_dog.rb
100
+ - lib/route_dog/middleware/watcher.rb
101
+ - route_dog.gemspec
102
+ - test/integration/products_controller_test.rb
103
+ - test/integration/sessions_controller.rb
104
+ - test/integration/users_controller_test.rb
105
+ - test/mock_app/.gitignore
106
+ - test/mock_app/Gemfile
107
+ - test/mock_app/Gemfile.lock
108
+ - test/mock_app/Rakefile
109
+ - test/mock_app/app/controllers/application_controller.rb
110
+ - test/mock_app/app/controllers/products_controller.rb
111
+ - test/mock_app/app/controllers/sessions_controller_test.rb
112
+ - test/mock_app/app/controllers/users_controller.rb
113
+ - test/mock_app/app/helpers/application_helper.rb
114
+ - test/mock_app/app/views/layouts/application.html.erb
115
+ - test/mock_app/app/views/users/index.html.erb
116
+ - test/mock_app/config.ru
117
+ - test/mock_app/config/application.rb
118
+ - test/mock_app/config/boot.rb
119
+ - test/mock_app/config/database.yml
120
+ - test/mock_app/config/environment.rb
121
+ - test/mock_app/config/environments/development.rb
122
+ - test/mock_app/config/environments/production.rb
123
+ - test/mock_app/config/environments/test.rb
124
+ - test/mock_app/config/initializers/backtrace_silencers.rb
125
+ - test/mock_app/config/initializers/inflections.rb
126
+ - test/mock_app/config/initializers/mime_types.rb
127
+ - test/mock_app/config/initializers/route_dog.rb
128
+ - test/mock_app/config/initializers/secret_token.rb
129
+ - test/mock_app/config/initializers/session_store.rb
130
+ - test/mock_app/config/locales/en.yml
131
+ - test/mock_app/config/routes.rb
132
+ - test/mock_app/db/seeds.rb
133
+ - test/mock_app/public/404.html
134
+ - test/mock_app/public/422.html
135
+ - test/mock_app/public/500.html
136
+ - test/mock_app/public/favicon.ico
137
+ - test/mock_app/public/images/rails.png
138
+ - test/mock_app/public/index.html
139
+ - test/mock_app/public/javascripts/application.js
140
+ - test/mock_app/public/javascripts/controls.js
141
+ - test/mock_app/public/javascripts/dragdrop.js
142
+ - test/mock_app/public/javascripts/effects.js
143
+ - test/mock_app/public/javascripts/prototype.js
144
+ - test/mock_app/public/javascripts/rails.js
145
+ - test/mock_app/public/robots.txt
146
+ - test/mock_app/public/stylesheets/.gitkeep
147
+ - test/support/assertions.rb
148
+ - test/test_helper.rb
149
+ has_rdoc: true
150
+ homepage: http://github.com/zevarito/route_dog
151
+ licenses: []
152
+
153
+ post_install_message:
154
+ rdoc_options:
155
+ - --charset=UTF-8
156
+ require_paths:
157
+ - lib
158
+ required_ruby_version: !ruby/object:Gem::Requirement
159
+ none: false
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ hash: 3
164
+ segments:
165
+ - 0
166
+ version: "0"
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ hash: 3
173
+ segments:
174
+ - 0
175
+ version: "0"
176
+ requirements: []
177
+
178
+ rubyforge_project:
179
+ rubygems_version: 1.3.7
180
+ signing_key:
181
+ specification_version: 3
182
+ summary: Watch and Notify your not tested routes of a RoR Application
183
+ test_files:
184
+ - test/integration/products_controller_test.rb
185
+ - test/integration/sessions_controller.rb
186
+ - test/integration/users_controller_test.rb
187
+ - test/mock_app/app/controllers/application_controller.rb
188
+ - test/mock_app/app/controllers/products_controller.rb
189
+ - test/mock_app/app/controllers/sessions_controller_test.rb
190
+ - test/mock_app/app/controllers/users_controller.rb
191
+ - test/mock_app/app/helpers/application_helper.rb
192
+ - test/mock_app/config/application.rb
193
+ - test/mock_app/config/boot.rb
194
+ - test/mock_app/config/environment.rb
195
+ - test/mock_app/config/environments/development.rb
196
+ - test/mock_app/config/environments/production.rb
197
+ - test/mock_app/config/environments/test.rb
198
+ - test/mock_app/config/initializers/backtrace_silencers.rb
199
+ - test/mock_app/config/initializers/inflections.rb
200
+ - test/mock_app/config/initializers/mime_types.rb
201
+ - test/mock_app/config/initializers/route_dog.rb
202
+ - test/mock_app/config/initializers/secret_token.rb
203
+ - test/mock_app/config/initializers/session_store.rb
204
+ - test/mock_app/config/routes.rb
205
+ - test/mock_app/db/seeds.rb
206
+ - test/support/assertions.rb
207
+ - test/test_helper.rb