clearance_http_auth 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +58 -0
  3. data/Rakefile +29 -0
  4. data/lib/clearance_http_auth/configuration.rb +18 -0
  5. data/lib/clearance_http_auth/current_user_override.rb +20 -0
  6. data/lib/clearance_http_auth/engine.rb +13 -0
  7. data/lib/clearance_http_auth/middleware.rb +39 -0
  8. data/lib/clearance_http_auth/version.rb +5 -0
  9. data/lib/clearance_http_auth.rb +21 -0
  10. data/test/clearance_http_auth_test.rb +17 -0
  11. data/test/dummy/Rakefile +7 -0
  12. data/test/dummy/app/controllers/application_controller.rb +5 -0
  13. data/test/dummy/app/controllers/entrances_controller.rb +29 -0
  14. data/test/dummy/app/helpers/application_helper.rb +2 -0
  15. data/test/dummy/app/helpers/entrance_helper.rb +2 -0
  16. data/test/dummy/app/models/user.rb +3 -0
  17. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  18. data/test/dummy/config/application.rb +47 -0
  19. data/test/dummy/config/boot.rb +10 -0
  20. data/test/dummy/config/database.yml +22 -0
  21. data/test/dummy/config/environment.rb +5 -0
  22. data/test/dummy/config/environments/development.rb +26 -0
  23. data/test/dummy/config/environments/production.rb +49 -0
  24. data/test/dummy/config/environments/test.rb +35 -0
  25. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  26. data/test/dummy/config/initializers/clearance.rb +3 -0
  27. data/test/dummy/config/initializers/inflections.rb +10 -0
  28. data/test/dummy/config/initializers/mime_types.rb +1 -0
  29. data/test/dummy/config/initializers/secret_token.rb +7 -0
  30. data/test/dummy/config/initializers/session_store.rb +8 -0
  31. data/test/dummy/config/locales/en.yml +5 -0
  32. data/test/dummy/config/routes.rb +4 -0
  33. data/test/dummy/config.ru +4 -0
  34. data/test/dummy/db/development.sqlite3 +0 -0
  35. data/test/dummy/db/migrate/20101221153914_clearance_create_users.rb +20 -0
  36. data/test/dummy/db/schema.rb +29 -0
  37. data/test/dummy/db/test.sqlite3 +0 -0
  38. data/test/dummy/log/development.log +1743 -0
  39. data/test/dummy/log/production.log +0 -0
  40. data/test/dummy/log/server.log +0 -0
  41. data/test/dummy/log/test.log +9431 -0
  42. data/test/dummy/public/404.html +26 -0
  43. data/test/dummy/public/422.html +26 -0
  44. data/test/dummy/public/500.html +26 -0
  45. data/test/dummy/public/favicon.ico +0 -0
  46. data/test/dummy/public/javascripts/application.js +2 -0
  47. data/test/dummy/public/javascripts/controls.js +965 -0
  48. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  49. data/test/dummy/public/javascripts/effects.js +1123 -0
  50. data/test/dummy/public/javascripts/prototype.js +6001 -0
  51. data/test/dummy/public/javascripts/rails.js +175 -0
  52. data/test/dummy/script/rails +6 -0
  53. data/test/dummy/test/factories/clearance.rb +13 -0
  54. data/test/dummy/tmp/capybara/capybara-20101221172010.html +42 -0
  55. data/test/dummy/tmp/pids/server.pid +1 -0
  56. data/test/integration/api_test.rb +63 -0
  57. data/test/integration/navigation_test.rb +39 -0
  58. data/test/support/integration_case.rb +5 -0
  59. data/test/test_helper.rb +29 -0
  60. metadata +215 -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,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,13 @@
1
+ Factory.sequence :email do |n|
2
+ "user#{n}@example.com"
3
+ end
4
+
5
+ Factory.define :user do |user|
6
+ user.email { Factory.next :email }
7
+ user.password { "password" }
8
+ user.password_confirmation { "password" }
9
+ end
10
+
11
+ Factory.define :email_confirmed_user, :parent => :user do |user|
12
+ user.email_confirmed { true }
13
+ end
@@ -0,0 +1,42 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+
6
+ <script src="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/javascripts/prototype.js?1292943023" type="text/javascript"></script>
7
+ <script src="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/javascripts/effects.js?1292943023" type="text/javascript"></script>
8
+ <script src="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/javascripts/dragdrop.js?1292943023" type="text/javascript"></script>
9
+ <script src="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/javascripts/controls.js?1292943023" type="text/javascript"></script>
10
+ <script src="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/javascripts/rails.js?1292943023" type="text/javascript"></script>
11
+ <script src="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/javascripts/application.js?1292943023" type="text/javascript"></script>
12
+
13
+ </head>
14
+ <body>
15
+
16
+ <h2>Sign in</h2>
17
+
18
+ <form accept-charset="UTF-8" action="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/session" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>
19
+ <div class="text_field">
20
+ <label for="session_email">Email</label>
21
+ <input id="session_email" name="session[email]" size="30" type="text" />
22
+ </div>
23
+ <div class="text_field">
24
+ <label for="session_password">Password</label>
25
+ <input id="session_password" name="session[password]" size="30" type="password" />
26
+ </div>
27
+ <div class="submit_field">
28
+ <input data-disable-with="Please wait..." id="session_submit" name="commit" type="submit" value="Sign in" />
29
+ </div>
30
+ </form>
31
+ <ul>
32
+ <li>
33
+ <a href="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/sign_up">Sign up</a>
34
+ </li>
35
+ <li>
36
+ <a href="/Users/karmi/Playground/Rails/PluginsDevelopment/clearance_http_auth/test/dummy/public/passwords/new">Forgot password?</a>
37
+ </li>
38
+ </ul>
39
+
40
+
41
+ </body>
42
+ </html>
@@ -0,0 +1 @@
1
+ 18440
@@ -0,0 +1,63 @@
1
+ require 'test_helper'
2
+ require 'dummy/test/factories/clearance'
3
+
4
+ class APITest < ActiveSupport::TestCase
5
+
6
+ include Rack::Test::Methods
7
+
8
+ def app
9
+ Dummy::Application
10
+ end
11
+
12
+ def setup
13
+ Factory.create(:email_confirmed_user,
14
+ :email => 'test@example.com',
15
+ :password => 'password',
16
+ :password_confirmation => 'password')
17
+ end
18
+
19
+ context "When navigating the API, it" do
20
+
21
+ should "deny access when no credentials are set" do
22
+ get '/entrances.json'
23
+ assert_equal 401, last_response.status
24
+ end
25
+
26
+ should "deny access when bad credentials are set" do
27
+ authorize 'test@example.com', 'BADSANTA'
28
+ get '/entrances.json'
29
+ assert_equal 401, last_response.status
30
+ end
31
+
32
+ should "grant access when proper credentials are set" do
33
+ authorize 'test@example.com', 'password'
34
+ get '/entrances.json'
35
+ assert_equal 200, last_response.status
36
+ assert_match /Welcome/, last_response.body
37
+ end
38
+
39
+ should "grant access when proper credentials are set for POSTing" do
40
+ authorize 'test@example.com', 'password'
41
+ post '/entrances.json'
42
+ assert_equal 201, last_response.status
43
+ assert_match /Created/, last_response.body
44
+ end
45
+
46
+ should "invoke HTTP authorization for formats added in configuration" do
47
+ authorize 'test@example.com', 'password'
48
+ get '/entrances.csv'
49
+ assert_equal 200, last_response.status
50
+ assert_match /Welcome/, last_response.body
51
+ end
52
+
53
+ should "not invoke HTTP authorization for incorrect format" do
54
+ authorize 'test@example.com', 'password'
55
+ get '/entrances.santa'
56
+ assert_equal 302, last_response.status
57
+ follow_redirect!
58
+ assert_match /Sign in/, last_response.body
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+ require 'dummy/test/factories/clearance'
3
+
4
+ class NavigationTest < ActiveSupport::IntegrationCase
5
+
6
+ setup do
7
+ Factory.create(:email_confirmed_user,
8
+ :email => 'test@example.com',
9
+ :password => 'password',
10
+ :password_confirmation => 'password')
11
+ end
12
+
13
+ context "When navigating the application, it" do
14
+
15
+ should "display login form" do
16
+ visit "/"
17
+ page.has_content?('Sign in')
18
+ end
19
+
20
+ should "grant access with proper credentials" do
21
+ visit "/"
22
+ fill_in 'Email', :with => 'test@example.com'
23
+ fill_in 'Password', :with => 'password'
24
+ click_link_or_button "Sign in"
25
+ assert page.has_content?('Welcome!'), "does not display content"
26
+ end
27
+
28
+ should "deny access with wrong credentials" do
29
+ visit "/"
30
+ fill_in 'Email', :with => 'test@example.com'
31
+ fill_in 'Password', :with => 'BADSANTA'
32
+ click_link_or_button "Sign in"
33
+ assert ! page.has_content?('Welcome!'), "displays protected content"
34
+ assert page.has_content?('Sign in'), "does not display login form"
35
+ end
36
+
37
+ end
38
+
39
+ 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,29 @@
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
+
7
+ Rails.backtrace_cleaner.remove_silencers!
8
+
9
+ # Configure capybara for integration testing
10
+ require "capybara/rails"
11
+ Capybara.default_driver = :rack_test
12
+ Capybara.default_selector = :css
13
+
14
+ # Load test infrastructure
15
+ require 'shoulda'
16
+ require 'turn'
17
+ require 'factory_girl'
18
+ require 'rack/test'
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
+
26
+ # Clear database when the test ends
27
+ def teardown
28
+ User.delete_all
29
+ end
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clearance_http_auth
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Karel Minarik
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-26 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 23
29
+ segments:
30
+ - 1
31
+ - 0
32
+ - 0
33
+ version: 1.0.0
34
+ requirement: *id001
35
+ name: bundler
36
+ type: :runtime
37
+ - !ruby/object:Gem::Dependency
38
+ prerelease: false
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">"
43
+ - !ruby/object:Gem::Version
44
+ hash: 25
45
+ segments:
46
+ - 0
47
+ - 9
48
+ version: "0.9"
49
+ requirement: *id002
50
+ name: clearance
51
+ type: :runtime
52
+ - !ruby/object:Gem::Dependency
53
+ prerelease: false
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">"
58
+ - !ruby/object:Gem::Version
59
+ hash: 11
60
+ segments:
61
+ - 1
62
+ - 2
63
+ version: "1.2"
64
+ requirement: *id003
65
+ name: rack
66
+ type: :runtime
67
+ - !ruby/object:Gem::Dependency
68
+ prerelease: false
69
+ version_requirements: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ requirement: *id004
79
+ name: thin
80
+ type: :development
81
+ - !ruby/object:Gem::Dependency
82
+ prerelease: false
83
+ version_requirements: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ requirement: *id005
93
+ name: turn
94
+ type: :development
95
+ - !ruby/object:Gem::Dependency
96
+ prerelease: false
97
+ version_requirements: &id006 !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ hash: 3
103
+ segments:
104
+ - 0
105
+ version: "0"
106
+ requirement: *id006
107
+ name: shoulda
108
+ type: :development
109
+ description: " Simple, instant HTTP Basic Authentication for applications\n using Clearance [https://github.com/thoughtbot/clearance].\n"
110
+ email: karmi@karmi.cz
111
+ executables: []
112
+
113
+ extensions: []
114
+
115
+ extra_rdoc_files:
116
+ - README.rdoc
117
+ - MIT-LICENSE
118
+ files:
119
+ - README.rdoc
120
+ - Rakefile
121
+ - MIT-LICENSE
122
+ - lib/clearance_http_auth/configuration.rb
123
+ - lib/clearance_http_auth/current_user_override.rb
124
+ - lib/clearance_http_auth/engine.rb
125
+ - lib/clearance_http_auth/middleware.rb
126
+ - lib/clearance_http_auth/version.rb
127
+ - lib/clearance_http_auth.rb
128
+ - test/clearance_http_auth_test.rb
129
+ - test/dummy/app/controllers/application_controller.rb
130
+ - test/dummy/app/controllers/entrances_controller.rb
131
+ - test/dummy/app/helpers/application_helper.rb
132
+ - test/dummy/app/helpers/entrance_helper.rb
133
+ - test/dummy/app/models/user.rb
134
+ - test/dummy/app/views/layouts/application.html.erb
135
+ - test/dummy/config/application.rb
136
+ - test/dummy/config/boot.rb
137
+ - test/dummy/config/database.yml
138
+ - test/dummy/config/environment.rb
139
+ - test/dummy/config/environments/development.rb
140
+ - test/dummy/config/environments/production.rb
141
+ - test/dummy/config/environments/test.rb
142
+ - test/dummy/config/initializers/backtrace_silencers.rb
143
+ - test/dummy/config/initializers/clearance.rb
144
+ - test/dummy/config/initializers/inflections.rb
145
+ - test/dummy/config/initializers/mime_types.rb
146
+ - test/dummy/config/initializers/secret_token.rb
147
+ - test/dummy/config/initializers/session_store.rb
148
+ - test/dummy/config/locales/en.yml
149
+ - test/dummy/config/routes.rb
150
+ - test/dummy/config.ru
151
+ - test/dummy/db/development.sqlite3
152
+ - test/dummy/db/migrate/20101221153914_clearance_create_users.rb
153
+ - test/dummy/db/schema.rb
154
+ - test/dummy/db/test.sqlite3
155
+ - test/dummy/log/development.log
156
+ - test/dummy/log/production.log
157
+ - test/dummy/log/server.log
158
+ - test/dummy/log/test.log
159
+ - test/dummy/public/404.html
160
+ - test/dummy/public/422.html
161
+ - test/dummy/public/500.html
162
+ - test/dummy/public/favicon.ico
163
+ - test/dummy/public/javascripts/application.js
164
+ - test/dummy/public/javascripts/controls.js
165
+ - test/dummy/public/javascripts/dragdrop.js
166
+ - test/dummy/public/javascripts/effects.js
167
+ - test/dummy/public/javascripts/prototype.js
168
+ - test/dummy/public/javascripts/rails.js
169
+ - test/dummy/Rakefile
170
+ - test/dummy/script/rails
171
+ - test/dummy/test/factories/clearance.rb
172
+ - test/dummy/tmp/capybara/capybara-20101221172010.html
173
+ - test/dummy/tmp/pids/server.pid
174
+ - test/integration/api_test.rb
175
+ - test/integration/navigation_test.rb
176
+ - test/support/integration_case.rb
177
+ - test/test_helper.rb
178
+ has_rdoc: true
179
+ homepage: http://github.com/karmi/clearance_http_auth
180
+ licenses: []
181
+
182
+ post_install_message:
183
+ rdoc_options:
184
+ - --charset=UTF-8
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ none: false
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ hash: 3
193
+ segments:
194
+ - 0
195
+ version: "0"
196
+ required_rubygems_version: !ruby/object:Gem::Requirement
197
+ none: false
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ hash: 23
202
+ segments:
203
+ - 1
204
+ - 3
205
+ - 6
206
+ version: 1.3.6
207
+ requirements: []
208
+
209
+ rubyforge_project:
210
+ rubygems_version: 1.3.7
211
+ signing_key:
212
+ specification_version: 3
213
+ summary: HTTP Basic Authentication for Clearance
214
+ test_files: []
215
+