achievable 0.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 (67) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +10 -0
  3. data/Gemfile.lock +149 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.markdown +53 -0
  6. data/Rakefile +29 -0
  7. data/achievable.gemspec +25 -0
  8. data/lib/achievable/achieve_manager.rb +28 -0
  9. data/lib/achievable/achiever.rb +35 -0
  10. data/lib/achievable/dsl.rb +23 -0
  11. data/lib/achievable/engine.rb +18 -0
  12. data/lib/achievable/version.rb +3 -0
  13. data/lib/achievable.rb +19 -0
  14. data/lib/generators/achievable_generator.rb +26 -0
  15. data/lib/generators/templates/achievement.rb +11 -0
  16. data/lib/generators/templates/achieving.rb +4 -0
  17. data/lib/generators/templates/migration.rb +29 -0
  18. data/test/achievable_test.rb +103 -0
  19. data/test/dummy/Rakefile +7 -0
  20. data/test/dummy/app/controllers/application_controller.rb +3 -0
  21. data/test/dummy/app/helpers/application_helper.rb +2 -0
  22. data/test/dummy/app/models/achievement.rb +11 -0
  23. data/test/dummy/app/models/achieving.rb +4 -0
  24. data/test/dummy/app/models/post.rb +3 -0
  25. data/test/dummy/app/models/user.rb +4 -0
  26. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  27. data/test/dummy/config/application.rb +48 -0
  28. data/test/dummy/config/boot.rb +10 -0
  29. data/test/dummy/config/database.yml +22 -0
  30. data/test/dummy/config/environment.rb +5 -0
  31. data/test/dummy/config/environments/development.rb +26 -0
  32. data/test/dummy/config/environments/production.rb +49 -0
  33. data/test/dummy/config/environments/test.rb +35 -0
  34. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  35. data/test/dummy/config/initializers/inflections.rb +10 -0
  36. data/test/dummy/config/initializers/mime_types.rb +5 -0
  37. data/test/dummy/config/initializers/secret_token.rb +7 -0
  38. data/test/dummy/config/initializers/session_store.rb +8 -0
  39. data/test/dummy/config/locales/en.yml +5 -0
  40. data/test/dummy/config/routes.rb +58 -0
  41. data/test/dummy/config.ru +4 -0
  42. data/test/dummy/db/migrate/20110411195814_create_achievements.rb +17 -0
  43. data/test/dummy/db/migrate/20110411200936_create_achievings.rb +15 -0
  44. data/test/dummy/db/migrate/20110411201748_create_users.rb +14 -0
  45. data/test/dummy/db/migrate/20110411233641_add_achiever_type_to_achievings.rb +9 -0
  46. data/test/dummy/db/migrate/20110412000011_create_posts.rb +14 -0
  47. data/test/dummy/db/migrate/20110412000430_add_user_id_to_posts.rb +9 -0
  48. data/test/dummy/db/schema.rb +49 -0
  49. data/test/dummy/public/404.html +26 -0
  50. data/test/dummy/public/422.html +26 -0
  51. data/test/dummy/public/500.html +26 -0
  52. data/test/dummy/public/favicon.ico +0 -0
  53. data/test/dummy/public/javascripts/application.js +2 -0
  54. data/test/dummy/public/javascripts/controls.js +965 -0
  55. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  56. data/test/dummy/public/javascripts/effects.js +1123 -0
  57. data/test/dummy/public/javascripts/prototype.js +6001 -0
  58. data/test/dummy/public/javascripts/rails.js +191 -0
  59. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  60. data/test/dummy/script/rails +6 -0
  61. data/test/dummy/spec/models/post_spec.rb +1 -0
  62. data/test/dummy/spec/spec_helper.rb +0 -0
  63. data/test/integration/navigation_test.rb +5 -0
  64. data/test/support/fixture.rb +24 -0
  65. data/test/support/integration_case.rb +5 -0
  66. data/test/test_helper.rb +23 -0
  67. metadata +203 -0
@@ -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 @@
1
+
File without changes
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class NavigationTest < ActiveSupport::IntegrationCase
4
+
5
+ end
@@ -0,0 +1,24 @@
1
+ class TestUser < ActiveRecord::Base
2
+ self.table_name = "users"
3
+ include Achievable::DSL
4
+ include Achievable::Achiever
5
+ end
6
+
7
+ class TestAchievement < ActiveRecord::Base
8
+ self.table_name = "achievements"
9
+ has_many :achievings, :class_name => "TestAchieving"
10
+
11
+ validates_presence_of :name, :category
12
+ validates_uniqueness_of :name
13
+
14
+ def achieve(achiever)
15
+ achievings.create!(:achiever => achiever, :achievement => self)
16
+ end
17
+
18
+ end
19
+
20
+ class TestAchieving < ActiveRecord::Base
21
+ self.table_name = "achievings"
22
+ belongs_to :achiever, :polymorphic => true
23
+ belongs_to :achievement, :class_name => "TestAchievement", :foreign_key => "achievement_id", :counter_cache => true
24
+ end
@@ -0,0 +1,5 @@
1
+ # Define a bare test case to use with Capybara
2
+ class ActiveSupport::IntegrationCase < ActiveSupport::TestCase
3
+ include Capybara
4
+ include Rails.application.routes.url_helpers
5
+ end
@@ -0,0 +1,23 @@
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 }
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: achievable
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Qi He
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-04-11 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: sourcify
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: resque
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :runtime
45
+ version_requirements: *id002
46
+ description: This provides achievement features for rails app.
47
+ email:
48
+ - qihe229@gmail.com
49
+ executables: []
50
+
51
+ extensions: []
52
+
53
+ extra_rdoc_files: []
54
+
55
+ files:
56
+ - .gitignore
57
+ - Gemfile
58
+ - Gemfile.lock
59
+ - MIT-LICENSE
60
+ - README.markdown
61
+ - Rakefile
62
+ - achievable.gemspec
63
+ - lib/achievable.rb
64
+ - lib/achievable/achieve_manager.rb
65
+ - lib/achievable/achiever.rb
66
+ - lib/achievable/dsl.rb
67
+ - lib/achievable/engine.rb
68
+ - lib/achievable/version.rb
69
+ - lib/generators/achievable_generator.rb
70
+ - lib/generators/templates/achievement.rb
71
+ - lib/generators/templates/achieving.rb
72
+ - lib/generators/templates/migration.rb
73
+ - test/achievable_test.rb
74
+ - test/dummy/Rakefile
75
+ - test/dummy/app/controllers/application_controller.rb
76
+ - test/dummy/app/helpers/application_helper.rb
77
+ - test/dummy/app/models/achievement.rb
78
+ - test/dummy/app/models/achieving.rb
79
+ - test/dummy/app/models/post.rb
80
+ - test/dummy/app/models/user.rb
81
+ - test/dummy/app/views/layouts/application.html.erb
82
+ - test/dummy/config.ru
83
+ - test/dummy/config/application.rb
84
+ - test/dummy/config/boot.rb
85
+ - test/dummy/config/database.yml
86
+ - test/dummy/config/environment.rb
87
+ - test/dummy/config/environments/development.rb
88
+ - test/dummy/config/environments/production.rb
89
+ - test/dummy/config/environments/test.rb
90
+ - test/dummy/config/initializers/backtrace_silencers.rb
91
+ - test/dummy/config/initializers/inflections.rb
92
+ - test/dummy/config/initializers/mime_types.rb
93
+ - test/dummy/config/initializers/secret_token.rb
94
+ - test/dummy/config/initializers/session_store.rb
95
+ - test/dummy/config/locales/en.yml
96
+ - test/dummy/config/routes.rb
97
+ - test/dummy/db/migrate/20110411195814_create_achievements.rb
98
+ - test/dummy/db/migrate/20110411200936_create_achievings.rb
99
+ - test/dummy/db/migrate/20110411201748_create_users.rb
100
+ - test/dummy/db/migrate/20110411233641_add_achiever_type_to_achievings.rb
101
+ - test/dummy/db/migrate/20110412000011_create_posts.rb
102
+ - test/dummy/db/migrate/20110412000430_add_user_id_to_posts.rb
103
+ - test/dummy/db/schema.rb
104
+ - test/dummy/public/404.html
105
+ - test/dummy/public/422.html
106
+ - test/dummy/public/500.html
107
+ - test/dummy/public/favicon.ico
108
+ - test/dummy/public/javascripts/application.js
109
+ - test/dummy/public/javascripts/controls.js
110
+ - test/dummy/public/javascripts/dragdrop.js
111
+ - test/dummy/public/javascripts/effects.js
112
+ - test/dummy/public/javascripts/prototype.js
113
+ - test/dummy/public/javascripts/rails.js
114
+ - test/dummy/public/stylesheets/.gitkeep
115
+ - test/dummy/script/rails
116
+ - test/dummy/spec/models/post_spec.rb
117
+ - test/dummy/spec/spec_helper.rb
118
+ - test/integration/navigation_test.rb
119
+ - test/support/fixture.rb
120
+ - test/support/integration_case.rb
121
+ - test/test_helper.rb
122
+ has_rdoc: true
123
+ homepage: http://rubygems.org/gems/achievable
124
+ licenses: []
125
+
126
+ post_install_message:
127
+ rdoc_options: []
128
+
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ segments:
137
+ - 0
138
+ version: "0"
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ segments:
145
+ - 0
146
+ version: "0"
147
+ requirements: []
148
+
149
+ rubyforge_project: achievable
150
+ rubygems_version: 1.3.7
151
+ signing_key:
152
+ specification_version: 3
153
+ summary: A simple achievment gem for rails.
154
+ test_files:
155
+ - test/achievable_test.rb
156
+ - test/dummy/Rakefile
157
+ - test/dummy/app/controllers/application_controller.rb
158
+ - test/dummy/app/helpers/application_helper.rb
159
+ - test/dummy/app/models/achievement.rb
160
+ - test/dummy/app/models/achieving.rb
161
+ - test/dummy/app/models/post.rb
162
+ - test/dummy/app/models/user.rb
163
+ - test/dummy/app/views/layouts/application.html.erb
164
+ - test/dummy/config.ru
165
+ - test/dummy/config/application.rb
166
+ - test/dummy/config/boot.rb
167
+ - test/dummy/config/database.yml
168
+ - test/dummy/config/environment.rb
169
+ - test/dummy/config/environments/development.rb
170
+ - test/dummy/config/environments/production.rb
171
+ - test/dummy/config/environments/test.rb
172
+ - test/dummy/config/initializers/backtrace_silencers.rb
173
+ - test/dummy/config/initializers/inflections.rb
174
+ - test/dummy/config/initializers/mime_types.rb
175
+ - test/dummy/config/initializers/secret_token.rb
176
+ - test/dummy/config/initializers/session_store.rb
177
+ - test/dummy/config/locales/en.yml
178
+ - test/dummy/config/routes.rb
179
+ - test/dummy/db/migrate/20110411195814_create_achievements.rb
180
+ - test/dummy/db/migrate/20110411200936_create_achievings.rb
181
+ - test/dummy/db/migrate/20110411201748_create_users.rb
182
+ - test/dummy/db/migrate/20110411233641_add_achiever_type_to_achievings.rb
183
+ - test/dummy/db/migrate/20110412000011_create_posts.rb
184
+ - test/dummy/db/migrate/20110412000430_add_user_id_to_posts.rb
185
+ - test/dummy/db/schema.rb
186
+ - test/dummy/public/404.html
187
+ - test/dummy/public/422.html
188
+ - test/dummy/public/500.html
189
+ - test/dummy/public/favicon.ico
190
+ - test/dummy/public/javascripts/application.js
191
+ - test/dummy/public/javascripts/controls.js
192
+ - test/dummy/public/javascripts/dragdrop.js
193
+ - test/dummy/public/javascripts/effects.js
194
+ - test/dummy/public/javascripts/prototype.js
195
+ - test/dummy/public/javascripts/rails.js
196
+ - test/dummy/public/stylesheets/.gitkeep
197
+ - test/dummy/script/rails
198
+ - test/dummy/spec/models/post_spec.rb
199
+ - test/dummy/spec/spec_helper.rb
200
+ - test/integration/navigation_test.rb
201
+ - test/support/fixture.rb
202
+ - test/support/integration_case.rb
203
+ - test/test_helper.rb