ttn_helpers 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 (59) hide show
  1. data/.gitignore +7 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +131 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +6 -0
  7. data/Rakefile +18 -0
  8. data/lib/TTN/helpers/action_view/links.rb +12 -0
  9. data/lib/TTN/helpers/active_record/has_dragonfly_image.rb +23 -0
  10. data/lib/TTN/helpers/core/hash.rb +21 -0
  11. data/lib/TTN/helpers/core/string.rb +14 -0
  12. data/lib/TTN/helpers/engine.rb +19 -0
  13. data/lib/TTN/helpers/version.rb +5 -0
  14. data/lib/ttn_helpers.rb +5 -0
  15. data/spec/dummy/Rakefile +7 -0
  16. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  17. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  18. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  19. data/spec/dummy/config/application.rb +45 -0
  20. data/spec/dummy/config/boot.rb +10 -0
  21. data/spec/dummy/config/database.yml +22 -0
  22. data/spec/dummy/config/environment.rb +5 -0
  23. data/spec/dummy/config/environments/development.rb +26 -0
  24. data/spec/dummy/config/environments/production.rb +49 -0
  25. data/spec/dummy/config/environments/test.rb +35 -0
  26. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  27. data/spec/dummy/config/initializers/dragonfly.rb +1 -0
  28. data/spec/dummy/config/initializers/inflections.rb +10 -0
  29. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  30. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  31. data/spec/dummy/config/initializers/session_store.rb +8 -0
  32. data/spec/dummy/config/locales/en.yml +5 -0
  33. data/spec/dummy/config/routes.rb +58 -0
  34. data/spec/dummy/config.ru +4 -0
  35. data/spec/dummy/db/test.sqlite3 +0 -0
  36. data/spec/dummy/log/development.log +0 -0
  37. data/spec/dummy/log/production.log +0 -0
  38. data/spec/dummy/log/server.log +0 -0
  39. data/spec/dummy/public/404.html +26 -0
  40. data/spec/dummy/public/422.html +26 -0
  41. data/spec/dummy/public/500.html +26 -0
  42. data/spec/dummy/public/favicon.ico +0 -0
  43. data/spec/dummy/public/javascripts/application.js +2 -0
  44. data/spec/dummy/public/javascripts/controls.js +965 -0
  45. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  46. data/spec/dummy/public/javascripts/effects.js +1123 -0
  47. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  48. data/spec/dummy/public/javascripts/rails.js +175 -0
  49. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  50. data/spec/dummy/script/rails +6 -0
  51. data/spec/integration/action_view_spec.rb +8 -0
  52. data/spec/integration/active_record_spec.rb +61 -0
  53. data/spec/integration/core_spec.rb +17 -0
  54. data/spec/integration/navigation_spec.rb +9 -0
  55. data/spec/spec_helper.rb +36 -0
  56. data/spec/support/engine.jpg +0 -0
  57. data/spec/ttn_helpers_spec.rb +7 -0
  58. data/ttn_helpers.gemspec +28 -0
  59. metadata +226 -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
+ })();
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,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActionView::Base do
4
+
5
+ it "has the link_to_with_current method" do
6
+ ActionView::Base.new.should respond_to(:link_to_with_current)
7
+ end
8
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'model with dragonfly image' do
4
+ before :all do
5
+
6
+ build_model :imageable do
7
+ string :image_uid
8
+
9
+ has_dragonfly_image
10
+ end
11
+
12
+ end
13
+
14
+ it "is valid" do
15
+ Imageable.new.should be_valid
16
+ end
17
+
18
+ it "accepts an image file" do
19
+ Imageable.create(:image => File.new('spec/support/engine.jpg')).should be_valid
20
+ end
21
+ end
22
+
23
+ describe 'model with dragonfly image validating presence' do
24
+ before :all do
25
+
26
+ build_model :imageable_required do
27
+ string :image_uid
28
+
29
+ has_dragonfly_image :validates_presence => true
30
+ end
31
+
32
+ end
33
+
34
+ it "is not valid without an image" do
35
+ ImageableRequired.new.should_not be_valid
36
+ end
37
+
38
+ it "is valid with an image" do
39
+ ImageableRequired.create(:image => File.new('spec/support/engine.jpg')).should be_valid
40
+ end
41
+ end
42
+
43
+ describe 'model with dragonfly image with custom column name' do
44
+ before :all do
45
+
46
+ build_model :imageable_custom_name do
47
+ string :photo_uid
48
+
49
+ has_dragonfly_image :name => :photo
50
+ end
51
+
52
+ end
53
+
54
+ it "is valid" do
55
+ ImageableCustomName.new.should be_valid
56
+ end
57
+
58
+ it "accepts an image under the custom name" do
59
+ ImageableCustomName.create(:photo => File.new('spec/support/engine.jpg')).should be_valid
60
+ end
61
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe String do
4
+
5
+ it "has the shorten method" do
6
+ 'STRING!'.should respond_to(:shorten)
7
+ end
8
+
9
+ end
10
+
11
+ describe Hash do
12
+
13
+ it "has the only method" do
14
+ {:a => 1, :b => 2}.only(:b).should == {:b => 2}
15
+ end
16
+
17
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Navigation" do
4
+ include Capybara
5
+
6
+ it "should be a valid app" do
7
+ ::Rails.application.should be_a(Dummy::Application)
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ # Configure Rails Envinronment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require "rails/test_help"
6
+ require "rspec/rails"
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
+ # Run any available migration
20
+ ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
21
+
22
+ # Load support files
23
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
24
+
25
+ Rspec.configure do |config|
26
+ # Remove this line if you don't want Rspec's should and should_not
27
+ # methods or matchers
28
+ require 'rspec/expectations'
29
+ config.include Rspec::Matchers
30
+
31
+ require 'acts_as_fu'
32
+ config.include ActsAsFu
33
+
34
+ # == Mock Framework
35
+ config.mock_with :rspec
36
+ end
Binary file
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe TTN::Helpers do
4
+ it "should be valid" do
5
+ TTN::Helpers.should be_a(Module)
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/TTN/helpers/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "ttn_helpers"
6
+ s.version = TTN::Helpers::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ['Jonathan Davies', 'ThroughTheNet']
9
+ s.email = ['info@throughthenet.com']
10
+ s.homepage = "https://github.com/ThroughTheNet/ttn_helpers"
11
+ s.summary = "ThroughTheNet rails helpers for internal use"
12
+ s.description = "ThroughTheNet rails helpers for internal use"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+
16
+ s.add_dependency 'rails', '~> 3'
17
+
18
+ s.add_development_dependency "bundler", ">= 1.0.0"
19
+ s.add_development_dependency 'rspec-rails', '~> 2'
20
+ s.add_development_dependency 'capybara'
21
+ s.add_development_dependency 'acts_as_fu'
22
+ s.add_development_dependency 'dragonfly'
23
+ s.add_development_dependency 'rack-cache'
24
+
25
+ s.files = `git ls-files`.split("\n")
26
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
27
+ s.require_path = 'lib'
28
+ end
metadata ADDED
@@ -0,0 +1,226 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ttn_helpers
3
+ version: !ruby/object:Gem::Version
4
+ hash: 9
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ version: "0.1"
10
+ platform: ruby
11
+ authors:
12
+ - Jonathan Davies
13
+ - ThroughTheNet
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-03 00:00:00 +00:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ hash: 5
28
+ segments:
29
+ - 3
30
+ version: "3"
31
+ name: rails
32
+ prerelease: false
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ hash: 23
42
+ segments:
43
+ - 1
44
+ - 0
45
+ - 0
46
+ version: 1.0.0
47
+ name: bundler
48
+ prerelease: false
49
+ type: :development
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ hash: 7
58
+ segments:
59
+ - 2
60
+ version: "2"
61
+ name: rspec-rails
62
+ prerelease: false
63
+ type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ name: capybara
76
+ prerelease: false
77
+ type: :development
78
+ version_requirements: *id004
79
+ - !ruby/object:Gem::Dependency
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ name: acts_as_fu
90
+ prerelease: false
91
+ type: :development
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ name: dragonfly
104
+ prerelease: false
105
+ type: :development
106
+ version_requirements: *id006
107
+ - !ruby/object:Gem::Dependency
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ name: rack-cache
118
+ prerelease: false
119
+ type: :development
120
+ version_requirements: *id007
121
+ description: ThroughTheNet rails helpers for internal use
122
+ email:
123
+ - info@throughthenet.com
124
+ executables: []
125
+
126
+ extensions: []
127
+
128
+ extra_rdoc_files: []
129
+
130
+ files:
131
+ - .gitignore
132
+ - .rspec
133
+ - Gemfile
134
+ - Gemfile.lock
135
+ - MIT-LICENSE
136
+ - README.md
137
+ - Rakefile
138
+ - lib/TTN/helpers/action_view/links.rb
139
+ - lib/TTN/helpers/active_record/has_dragonfly_image.rb
140
+ - lib/TTN/helpers/core/hash.rb
141
+ - lib/TTN/helpers/core/string.rb
142
+ - lib/TTN/helpers/engine.rb
143
+ - lib/TTN/helpers/version.rb
144
+ - lib/ttn_helpers.rb
145
+ - spec/dummy/Rakefile
146
+ - spec/dummy/app/controllers/application_controller.rb
147
+ - spec/dummy/app/helpers/application_helper.rb
148
+ - spec/dummy/app/views/layouts/application.html.erb
149
+ - spec/dummy/config.ru
150
+ - spec/dummy/config/application.rb
151
+ - spec/dummy/config/boot.rb
152
+ - spec/dummy/config/database.yml
153
+ - spec/dummy/config/environment.rb
154
+ - spec/dummy/config/environments/development.rb
155
+ - spec/dummy/config/environments/production.rb
156
+ - spec/dummy/config/environments/test.rb
157
+ - spec/dummy/config/initializers/backtrace_silencers.rb
158
+ - spec/dummy/config/initializers/dragonfly.rb
159
+ - spec/dummy/config/initializers/inflections.rb
160
+ - spec/dummy/config/initializers/mime_types.rb
161
+ - spec/dummy/config/initializers/secret_token.rb
162
+ - spec/dummy/config/initializers/session_store.rb
163
+ - spec/dummy/config/locales/en.yml
164
+ - spec/dummy/config/routes.rb
165
+ - spec/dummy/db/test.sqlite3
166
+ - spec/dummy/log/development.log
167
+ - spec/dummy/log/production.log
168
+ - spec/dummy/log/server.log
169
+ - spec/dummy/public/404.html
170
+ - spec/dummy/public/422.html
171
+ - spec/dummy/public/500.html
172
+ - spec/dummy/public/favicon.ico
173
+ - spec/dummy/public/javascripts/application.js
174
+ - spec/dummy/public/javascripts/controls.js
175
+ - spec/dummy/public/javascripts/dragdrop.js
176
+ - spec/dummy/public/javascripts/effects.js
177
+ - spec/dummy/public/javascripts/prototype.js
178
+ - spec/dummy/public/javascripts/rails.js
179
+ - spec/dummy/public/stylesheets/.gitkeep
180
+ - spec/dummy/script/rails
181
+ - spec/integration/action_view_spec.rb
182
+ - spec/integration/active_record_spec.rb
183
+ - spec/integration/core_spec.rb
184
+ - spec/integration/navigation_spec.rb
185
+ - spec/spec_helper.rb
186
+ - spec/support/engine.jpg
187
+ - spec/ttn_helpers_spec.rb
188
+ - ttn_helpers.gemspec
189
+ has_rdoc: true
190
+ homepage: https://github.com/ThroughTheNet/ttn_helpers
191
+ licenses: []
192
+
193
+ post_install_message:
194
+ rdoc_options: []
195
+
196
+ require_paths:
197
+ - lib
198
+ required_ruby_version: !ruby/object:Gem::Requirement
199
+ none: false
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ hash: 3
204
+ segments:
205
+ - 0
206
+ version: "0"
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ none: false
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ hash: 23
213
+ segments:
214
+ - 1
215
+ - 3
216
+ - 6
217
+ version: 1.3.6
218
+ requirements: []
219
+
220
+ rubyforge_project:
221
+ rubygems_version: 1.3.7
222
+ signing_key:
223
+ specification_version: 3
224
+ summary: ThroughTheNet rails helpers for internal use
225
+ test_files: []
226
+