bushido 0.0.32 → 0.0.33

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 (53) hide show
  1. data/Gemfile +4 -4
  2. data/app/controllers/bushido/envs_controller.rb +14 -14
  3. data/lib/bushido/data.rb +3 -3
  4. data/lib/bushido/hooks.rb +7 -9
  5. data/lib/bushido/version.rb +1 -1
  6. data/test_app/.gitignore +4 -0
  7. data/test_app/.rspec +1 -0
  8. data/test_app/Gemfile +34 -0
  9. data/test_app/README +256 -0
  10. data/test_app/Rakefile +7 -0
  11. data/test_app/app/controllers/application_controller.rb +3 -0
  12. data/test_app/app/helpers/application_helper.rb +2 -0
  13. data/test_app/app/views/layouts/application.html.erb +14 -0
  14. data/test_app/config/application.rb +42 -0
  15. data/test_app/config/boot.rb +6 -0
  16. data/test_app/config/database.yml +22 -0
  17. data/test_app/config/environment.rb +5 -0
  18. data/test_app/config/environments/development.rb +26 -0
  19. data/test_app/config/environments/production.rb +49 -0
  20. data/test_app/config/environments/test.rb +35 -0
  21. data/test_app/config/initializers/backtrace_silencers.rb +7 -0
  22. data/test_app/config/initializers/inflections.rb +10 -0
  23. data/test_app/config/initializers/mime_types.rb +5 -0
  24. data/test_app/config/initializers/secret_token.rb +7 -0
  25. data/test_app/config/initializers/session_store.rb +8 -0
  26. data/test_app/config/locales/en.yml +5 -0
  27. data/test_app/config/routes.rb +59 -0
  28. data/test_app/config.ru +4 -0
  29. data/test_app/db/schema.rb +15 -0
  30. data/test_app/db/seeds.rb +7 -0
  31. data/test_app/doc/README_FOR_APP +2 -0
  32. data/test_app/lib/tasks/.gitkeep +0 -0
  33. data/test_app/public/404.html +26 -0
  34. data/test_app/public/422.html +26 -0
  35. data/test_app/public/500.html +26 -0
  36. data/test_app/public/favicon.ico +0 -0
  37. data/test_app/public/images/rails.png +0 -0
  38. data/test_app/public/index.html +239 -0
  39. data/test_app/public/javascripts/application.js +2 -0
  40. data/test_app/public/javascripts/controls.js +965 -0
  41. data/test_app/public/javascripts/dragdrop.js +974 -0
  42. data/test_app/public/javascripts/effects.js +1123 -0
  43. data/test_app/public/javascripts/prototype.js +6001 -0
  44. data/test_app/public/javascripts/rails.js +191 -0
  45. data/test_app/public/robots.txt +5 -0
  46. data/test_app/public/stylesheets/.gitkeep +0 -0
  47. data/test_app/script/rails +6 -0
  48. data/test_app/spec/controllers/envs_controller_spec.rb +25 -0
  49. data/test_app/spec/spec_helper.rb +51 -0
  50. data/test_app/test/performance/browsing_test.rb +9 -0
  51. data/test_app/test/test_helper.rb +13 -0
  52. data/test_app/vendor/plugins/.gitkeep +0 -0
  53. metadata +48 -1
@@ -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
+ })();
@@ -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,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bushido::EnvsController do
4
+ before(:each) do
5
+ ENV["BUSHIDO_APP_KEY"] = "abc123"
6
+ end
7
+
8
+ context "updating env vars" do
9
+ describe "PUT '/bushido/envs'" do
10
+ it "should return 405 when given the wrong key" do
11
+ preserve_envs("BUSHIDO_EXAMPLE", "BUSHIDO_APP_KEY", "BUSHIDO_ENV") do
12
+ post :update, {:key => "not-the-key", :id => "BUSHIDO_EXAMPLE", :value => "value"}
13
+ ENV["BUSHIDO_EXAMPLE"].should be_nil
14
+ end
15
+ end
16
+
17
+ it "should update the ENV var when given the right key" do
18
+ preserve_envs("BUSHIDO_EXAMPLE", "BUSHIDO_APP_KEY", "BUSHIDO_ENV") do
19
+ post :update, {:key => ENV["BUSHIDO_APP_KEY"].dup, :id => "BUSHIDO_EXAMPLE", :value => "value"}
20
+ ENV["BUSHIDO_EXAMPLE"].should == "value"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,51 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
3
+ require File.expand_path("../../config/environment", __FILE__)
4
+ require 'rspec/rails'
5
+
6
+ # Requires supporting ruby files with custom matchers and macros, etc,
7
+ # in spec/support/ and its subdirectories.
8
+ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+ # == Mock Framework
12
+ #
13
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
14
+ #
15
+ # config.mock_with :mocha
16
+ # config.mock_with :flexmock
17
+ # config.mock_with :rr
18
+ config.mock_with :rspec
19
+
20
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
21
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
22
+
23
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
24
+ # examples within a transaction, remove the following line or assign false
25
+ # instead of true.
26
+ config.use_transactional_fixtures = true
27
+ end
28
+
29
+ # Redefine #puts to show where they're originating from
30
+ puts "Redefining Object#puts in #{__FILE__}:#{__LINE__}"
31
+ Object.class_eval do
32
+ alias_method :orig_puts, :puts
33
+
34
+ def puts(object='')
35
+ orig_puts "#{caller.first.split('/').last}: #{object}"
36
+ end
37
+ end
38
+
39
+ def preserve_envs(*vars, &block)
40
+ cache = {}
41
+
42
+ vars.each do |key|
43
+ cache[key] = ENV[key]
44
+ end
45
+
46
+ yield
47
+
48
+ cache.keys.each do |key|
49
+ ENV[key] = cache[key]
50
+ end
51
+ end
@@ -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
File without changes
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: bushido
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.32
5
+ version: 0.0.33
6
6
  platform: ruby
7
7
  authors:
8
8
  - Sean Grove
@@ -106,6 +106,53 @@ files:
106
106
  - test/executable_test.rb
107
107
  - test/routes_test.rb
108
108
  - test/test_helper.rb
109
+ - test_app/.gitignore
110
+ - test_app/.rspec
111
+ - test_app/Gemfile
112
+ - test_app/README
113
+ - test_app/Rakefile
114
+ - test_app/app/controllers/application_controller.rb
115
+ - test_app/app/helpers/application_helper.rb
116
+ - test_app/app/views/layouts/application.html.erb
117
+ - test_app/config.ru
118
+ - test_app/config/application.rb
119
+ - test_app/config/boot.rb
120
+ - test_app/config/database.yml
121
+ - test_app/config/environment.rb
122
+ - test_app/config/environments/development.rb
123
+ - test_app/config/environments/production.rb
124
+ - test_app/config/environments/test.rb
125
+ - test_app/config/initializers/backtrace_silencers.rb
126
+ - test_app/config/initializers/inflections.rb
127
+ - test_app/config/initializers/mime_types.rb
128
+ - test_app/config/initializers/secret_token.rb
129
+ - test_app/config/initializers/session_store.rb
130
+ - test_app/config/locales/en.yml
131
+ - test_app/config/routes.rb
132
+ - test_app/db/schema.rb
133
+ - test_app/db/seeds.rb
134
+ - test_app/doc/README_FOR_APP
135
+ - test_app/lib/tasks/.gitkeep
136
+ - test_app/public/404.html
137
+ - test_app/public/422.html
138
+ - test_app/public/500.html
139
+ - test_app/public/favicon.ico
140
+ - test_app/public/images/rails.png
141
+ - test_app/public/index.html
142
+ - test_app/public/javascripts/application.js
143
+ - test_app/public/javascripts/controls.js
144
+ - test_app/public/javascripts/dragdrop.js
145
+ - test_app/public/javascripts/effects.js
146
+ - test_app/public/javascripts/prototype.js
147
+ - test_app/public/javascripts/rails.js
148
+ - test_app/public/robots.txt
149
+ - test_app/public/stylesheets/.gitkeep
150
+ - test_app/script/rails
151
+ - test_app/spec/controllers/envs_controller_spec.rb
152
+ - test_app/spec/spec_helper.rb
153
+ - test_app/test/performance/browsing_test.rb
154
+ - test_app/test/test_helper.rb
155
+ - test_app/vendor/plugins/.gitkeep
109
156
  has_rdoc: true
110
157
  homepage: https://github.com/sgrove/bushidogem
111
158
  licenses: []