speaking_url 0.0.1 → 0.0.2

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 (43) hide show
  1. data/.gitignore +1 -0
  2. data/README.rdoc +1 -2
  3. data/Rakefile +26 -0
  4. data/lib/speaking_url/version.rb +1 -1
  5. data/lib/speaking_url.rb +2 -4
  6. data/speaking_url.gemspec +1 -2
  7. data/test/dummy/Rakefile +7 -0
  8. data/test/dummy/app/controllers/application_controller.rb +3 -0
  9. data/test/dummy/app/controllers/articles_controller.rb +7 -0
  10. data/test/dummy/app/helpers/application_helper.rb +2 -0
  11. data/test/dummy/app/models/article.rb +32 -0
  12. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  13. data/test/dummy/config/application.rb +46 -0
  14. data/test/dummy/config/boot.rb +10 -0
  15. data/test/dummy/config/database.yml +22 -0
  16. data/test/dummy/config/environment.rb +5 -0
  17. data/test/dummy/config/environments/development.rb +26 -0
  18. data/test/dummy/config/environments/production.rb +49 -0
  19. data/test/dummy/config/environments/test.rb +35 -0
  20. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  21. data/test/dummy/config/initializers/inflections.rb +10 -0
  22. data/test/dummy/config/initializers/mime_types.rb +5 -0
  23. data/test/dummy/config/initializers/secret_token.rb +7 -0
  24. data/test/dummy/config/initializers/session_store.rb +8 -0
  25. data/test/dummy/config/locales/en.yml +5 -0
  26. data/test/dummy/config/mongoid.yml +0 -0
  27. data/test/dummy/config/routes.rb +9 -0
  28. data/test/dummy/config.ru +4 -0
  29. data/test/dummy/public/404.html +26 -0
  30. data/test/dummy/public/422.html +26 -0
  31. data/test/dummy/public/500.html +26 -0
  32. data/test/dummy/public/favicon.ico +0 -0
  33. data/test/dummy/public/javascripts/application.js +2 -0
  34. data/test/dummy/public/javascripts/controls.js +965 -0
  35. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  36. data/test/dummy/public/javascripts/effects.js +1123 -0
  37. data/test/dummy/public/javascripts/prototype.js +6001 -0
  38. data/test/dummy/public/javascripts/rails.js +191 -0
  39. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  40. data/test/dummy/script/rails +6 -0
  41. data/test/routing_test.rb +42 -0
  42. data/test/test_helper.rb +25 -0
  43. metadata +82 -25
@@ -0,0 +1,191 @@
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
+
176
+ Ajax.Responders.register({
177
+ onCreate: function(request) {
178
+ var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
179
+
180
+ if (csrf_meta_tag) {
181
+ var header = 'X-CSRF-Token',
182
+ token = csrf_meta_tag.readAttribute('content');
183
+
184
+ if (!request.options.requestHeaders) {
185
+ request.options.requestHeaders = {};
186
+ }
187
+ request.options.requestHeaders[header] = token;
188
+ }
189
+ }
190
+ });
191
+ })();
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,42 @@
1
+ require 'test_helper'
2
+
3
+ class NavigationTest < ActionController::IntegrationTest
4
+
5
+ def setup
6
+ Article.delete_all
7
+ end
8
+
9
+ test "nonexistent url" do
10
+ a = Article.new
11
+ a.add_mapping("/articles/1")
12
+ assert_raise ActionController::RoutingError do
13
+ get "/foo/bar"
14
+ end
15
+ end
16
+
17
+ test "current url" do
18
+ a = Article.new
19
+ a.add_mapping("/articles/1")
20
+ get "/articles/1"
21
+ assert_response :success
22
+ end
23
+
24
+ test "old url" do
25
+ a = Article.new
26
+ a.add_mapping("/articles/1")
27
+ a.add_mapping("/new/url")
28
+ get "/articles/1"
29
+ assert_redirected_to "/new/url"
30
+ end
31
+
32
+ test "301 response for old url" do
33
+ a = Article.new
34
+ a.add_mapping("/articles/1")
35
+ a.add_mapping("/new/url")
36
+ get "/articles/1"
37
+ assert_response 301
38
+ end
39
+
40
+ end
41
+
42
+
@@ -0,0 +1,25 @@
1
+ # Configure Rails Envinronment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ $:.unshift File.dirname(__FILE__)
5
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
6
+ require "rails/test_help"
7
+
8
+ ActionMailer::Base.delivery_method = :test
9
+ ActionMailer::Base.perform_deliveries = true
10
+ ActionMailer::Base.default_url_options[:host] = "test.com"
11
+
12
+ Rails.backtrace_cleaner.remove_silencers!
13
+
14
+ # Configure capybara for integration testing
15
+ #require "capybara/rails"
16
+ #Capybara.default_driver = :rack_test
17
+ #Capybara.default_selector = :css
18
+
19
+ #
20
+ # Run any available migration
21
+ #ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
22
+
23
+ # Load support files
24
+ #Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
25
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: speaking_url
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease: false
4
+ hash: 27
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kai Rubarth
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-06 00:00:00 +02:00
18
+ date: 2011-06-23 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: mongoid
22
+ name: rails
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
@@ -33,7 +33,7 @@ dependencies:
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- name: shoulda
36
+ name: mongoid
37
37
  prerelease: false
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
@@ -44,22 +44,8 @@ dependencies:
44
44
  segments:
45
45
  - 0
46
46
  version: "0"
47
- type: :development
47
+ type: :runtime
48
48
  version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: mocha
51
- prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
61
- type: :development
62
- version_requirements: *id003
63
49
  description: Provides the possibility to have arbitrary URL for resources.
64
50
  email:
65
51
  - kai@doxter.de
@@ -79,6 +65,42 @@ files:
79
65
  - lib/speaking_url/routing_extensions.rb
80
66
  - lib/speaking_url/version.rb
81
67
  - speaking_url.gemspec
68
+ - test/dummy/Rakefile
69
+ - test/dummy/app/controllers/application_controller.rb
70
+ - test/dummy/app/controllers/articles_controller.rb
71
+ - test/dummy/app/helpers/application_helper.rb
72
+ - test/dummy/app/models/article.rb
73
+ - test/dummy/app/views/layouts/application.html.erb
74
+ - test/dummy/config.ru
75
+ - test/dummy/config/application.rb
76
+ - test/dummy/config/boot.rb
77
+ - test/dummy/config/database.yml
78
+ - test/dummy/config/environment.rb
79
+ - test/dummy/config/environments/development.rb
80
+ - test/dummy/config/environments/production.rb
81
+ - test/dummy/config/environments/test.rb
82
+ - test/dummy/config/initializers/backtrace_silencers.rb
83
+ - test/dummy/config/initializers/inflections.rb
84
+ - test/dummy/config/initializers/mime_types.rb
85
+ - test/dummy/config/initializers/secret_token.rb
86
+ - test/dummy/config/initializers/session_store.rb
87
+ - test/dummy/config/locales/en.yml
88
+ - test/dummy/config/mongoid.yml
89
+ - test/dummy/config/routes.rb
90
+ - test/dummy/public/404.html
91
+ - test/dummy/public/422.html
92
+ - test/dummy/public/500.html
93
+ - test/dummy/public/favicon.ico
94
+ - test/dummy/public/javascripts/application.js
95
+ - test/dummy/public/javascripts/controls.js
96
+ - test/dummy/public/javascripts/dragdrop.js
97
+ - test/dummy/public/javascripts/effects.js
98
+ - test/dummy/public/javascripts/prototype.js
99
+ - test/dummy/public/javascripts/rails.js
100
+ - test/dummy/public/stylesheets/.gitkeep
101
+ - test/dummy/script/rails
102
+ - test/routing_test.rb
103
+ - test/test_helper.rb
82
104
  has_rdoc: true
83
105
  homepage: ""
84
106
  licenses: []
@@ -109,9 +131,44 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
131
  requirements: []
110
132
 
111
133
  rubyforge_project: speaking_url
112
- rubygems_version: 1.3.7
134
+ rubygems_version: 1.5.2
113
135
  signing_key:
114
136
  specification_version: 3
115
137
  summary: allows arbitrary url for resources and facilitates seo-friendly changing of urls.
116
- test_files: []
117
-
138
+ test_files:
139
+ - test/dummy/Rakefile
140
+ - test/dummy/app/controllers/application_controller.rb
141
+ - test/dummy/app/controllers/articles_controller.rb
142
+ - test/dummy/app/helpers/application_helper.rb
143
+ - test/dummy/app/models/article.rb
144
+ - test/dummy/app/views/layouts/application.html.erb
145
+ - test/dummy/config.ru
146
+ - test/dummy/config/application.rb
147
+ - test/dummy/config/boot.rb
148
+ - test/dummy/config/database.yml
149
+ - test/dummy/config/environment.rb
150
+ - test/dummy/config/environments/development.rb
151
+ - test/dummy/config/environments/production.rb
152
+ - test/dummy/config/environments/test.rb
153
+ - test/dummy/config/initializers/backtrace_silencers.rb
154
+ - test/dummy/config/initializers/inflections.rb
155
+ - test/dummy/config/initializers/mime_types.rb
156
+ - test/dummy/config/initializers/secret_token.rb
157
+ - test/dummy/config/initializers/session_store.rb
158
+ - test/dummy/config/locales/en.yml
159
+ - test/dummy/config/mongoid.yml
160
+ - test/dummy/config/routes.rb
161
+ - test/dummy/public/404.html
162
+ - test/dummy/public/422.html
163
+ - test/dummy/public/500.html
164
+ - test/dummy/public/favicon.ico
165
+ - test/dummy/public/javascripts/application.js
166
+ - test/dummy/public/javascripts/controls.js
167
+ - test/dummy/public/javascripts/dragdrop.js
168
+ - test/dummy/public/javascripts/effects.js
169
+ - test/dummy/public/javascripts/prototype.js
170
+ - test/dummy/public/javascripts/rails.js
171
+ - test/dummy/public/stylesheets/.gitkeep
172
+ - test/dummy/script/rails
173
+ - test/routing_test.rb
174
+ - test/test_helper.rb