opro 0.0.1.pre

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 (81) hide show
  1. data/CHANGELOG.md +3 -0
  2. data/Gemfile +39 -0
  3. data/Gemfile.lock +138 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +90 -0
  6. data/Rakefile +50 -0
  7. data/VERSION +1 -0
  8. data/app/controllers/oauth/auth_controller.rb +74 -0
  9. data/app/controllers/oauth/client_application_controller.rb +15 -0
  10. data/app/controllers/oauth/docs_controller.rb +36 -0
  11. data/app/controllers/opro_application_controller.rb +8 -0
  12. data/app/models/oauth/access_grant.rb +42 -0
  13. data/app/models/oauth/client_application.rb +30 -0
  14. data/app/views/oauth/auth/new.html.erb +8 -0
  15. data/app/views/oauth/client_application/create.html.erb +11 -0
  16. data/app/views/oauth/client_application/index.html.erb +18 -0
  17. data/app/views/oauth/client_application/new.html.erb +13 -0
  18. data/app/views/oauth/docs/index.html.erb +14 -0
  19. data/app/views/oauth/docs/markdown/curl.md.erb +6 -0
  20. data/app/views/oauth/docs/markdown/oauth.md.erb +1 -0
  21. data/app/views/oauth/docs/markdown/quick_start.md.erb +70 -0
  22. data/app/views/oauth/docs/show.html.erb +1 -0
  23. data/config/routes.rb +9 -0
  24. data/lib/generators/active_record/opro_generator.rb +28 -0
  25. data/lib/generators/active_record/templates/access_grants.rb +14 -0
  26. data/lib/generators/active_record/templates/client_applications.rb +11 -0
  27. data/lib/generators/opro/install_generator.rb +21 -0
  28. data/lib/generators/templates/opro.rb +4 -0
  29. data/lib/opro.rb +86 -0
  30. data/lib/opro/controllers/application_controller_helper.rb +38 -0
  31. data/lib/opro/engine.rb +8 -0
  32. data/opro.gemspec +148 -0
  33. data/test/dummy/Rakefile +7 -0
  34. data/test/dummy/app/controllers/application_controller.rb +3 -0
  35. data/test/dummy/app/controllers/pages_controller.rb +8 -0
  36. data/test/dummy/app/helpers/application_helper.rb +2 -0
  37. data/test/dummy/app/models/user.rb +10 -0
  38. data/test/dummy/app/views/layouts/application.html.erb +20 -0
  39. data/test/dummy/app/views/pages/index.html.erb +1 -0
  40. data/test/dummy/config.ru +4 -0
  41. data/test/dummy/config/application.rb +49 -0
  42. data/test/dummy/config/boot.rb +10 -0
  43. data/test/dummy/config/database.yml +22 -0
  44. data/test/dummy/config/environment.rb +5 -0
  45. data/test/dummy/config/environments/development.rb +26 -0
  46. data/test/dummy/config/environments/production.rb +49 -0
  47. data/test/dummy/config/environments/test.rb +35 -0
  48. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  49. data/test/dummy/config/initializers/devise.rb +223 -0
  50. data/test/dummy/config/initializers/inflections.rb +10 -0
  51. data/test/dummy/config/initializers/mime_types.rb +5 -0
  52. data/test/dummy/config/initializers/opro.rb +4 -0
  53. data/test/dummy/config/initializers/secret_token.rb +7 -0
  54. data/test/dummy/config/initializers/session_store.rb +8 -0
  55. data/test/dummy/config/locales/devise.en.yml +57 -0
  56. data/test/dummy/config/locales/en.yml +5 -0
  57. data/test/dummy/config/routes.rb +63 -0
  58. data/test/dummy/db/migrate/20120408163038_devise_create_users.rb +49 -0
  59. data/test/dummy/db/migrate/20120408165729_create_opro_access_grants.rb +14 -0
  60. data/test/dummy/db/migrate/20120408165730_create_opro_client_applications.rb +11 -0
  61. data/test/dummy/db/schema.rb +54 -0
  62. data/test/dummy/public/404.html +26 -0
  63. data/test/dummy/public/422.html +26 -0
  64. data/test/dummy/public/500.html +26 -0
  65. data/test/dummy/public/favicon.ico +0 -0
  66. data/test/dummy/public/javascripts/application.js +2 -0
  67. data/test/dummy/public/javascripts/controls.js +965 -0
  68. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  69. data/test/dummy/public/javascripts/effects.js +1123 -0
  70. data/test/dummy/public/javascripts/prototype.js +6001 -0
  71. data/test/dummy/public/javascripts/rails.js +202 -0
  72. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  73. data/test/dummy/script/rails +6 -0
  74. data/test/integration/auth_controller_test.rb +23 -0
  75. data/test/integration/client_application_controller_test.rb +24 -0
  76. data/test/integration/docs_controller_test.rb +8 -0
  77. data/test/integration/oauth_test.rb +17 -0
  78. data/test/opro_test.rb +24 -0
  79. data/test/support/integration_case.rb +5 -0
  80. data/test/test_helper.rb +99 -0
  81. metadata +251 -0
@@ -0,0 +1,202 @@
1
+ (function() {
2
+ Ajax.Responders.register({
3
+ onCreate: function(request) {
4
+ var token = $$('meta[name=csrf-token]')[0];
5
+ if (token) {
6
+ if (!request.options.requestHeaders) request.options.requestHeaders = {};
7
+ request.options.requestHeaders['X-CSRF-Token'] = token.readAttribute('content');
8
+ }
9
+ }
10
+ });
11
+
12
+ // Technique from Juriy Zaytsev
13
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
14
+ function isEventSupported(eventName) {
15
+ var el = document.createElement('div');
16
+ eventName = 'on' + eventName;
17
+ var isSupported = (eventName in el);
18
+ if (!isSupported) {
19
+ el.setAttribute(eventName, 'return;');
20
+ isSupported = typeof el[eventName] == 'function';
21
+ }
22
+ el = null;
23
+ return isSupported;
24
+ }
25
+
26
+ function isForm(element) {
27
+ return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM';
28
+ }
29
+
30
+ function isInput(element) {
31
+ if (Object.isElement(element)) {
32
+ var name = element.nodeName.toUpperCase();
33
+ return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA';
34
+ }
35
+ else return false;
36
+ }
37
+
38
+ var submitBubbles = isEventSupported('submit'),
39
+ changeBubbles = isEventSupported('change');
40
+
41
+ if (!submitBubbles || !changeBubbles) {
42
+ // augment the Event.Handler class to observe custom events when needed
43
+ Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap(
44
+ function(init, element, eventName, selector, callback) {
45
+ init(element, eventName, selector, callback);
46
+ // is the handler being attached to an element that doesn't support this event?
47
+ if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) ||
48
+ (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) {
49
+ // "submit" => "emulated:submit"
50
+ this.eventName = 'emulated:' + this.eventName;
51
+ }
52
+ }
53
+ );
54
+ }
55
+
56
+ if (!submitBubbles) {
57
+ // discover forms on the page by observing focus events which always bubble
58
+ document.on('focusin', 'form', function(focusEvent, form) {
59
+ // special handler for the real "submit" event (one-time operation)
60
+ if (!form.retrieve('emulated:submit')) {
61
+ form.on('submit', function(submitEvent) {
62
+ var emulated = form.fire('emulated:submit', submitEvent, true);
63
+ // if custom event received preventDefault, cancel the real one too
64
+ if (emulated.returnValue === false) submitEvent.preventDefault();
65
+ });
66
+ form.store('emulated:submit', true);
67
+ }
68
+ });
69
+ }
70
+
71
+ if (!changeBubbles) {
72
+ // discover form inputs on the page
73
+ document.on('focusin', 'input, select, textarea', function(focusEvent, input) {
74
+ // special handler for real "change" events
75
+ if (!input.retrieve('emulated:change')) {
76
+ input.on('change', function(changeEvent) {
77
+ input.fire('emulated:change', changeEvent, true);
78
+ });
79
+ input.store('emulated:change', true);
80
+ }
81
+ });
82
+ }
83
+
84
+ function handleRemote(element) {
85
+ var method, url, params;
86
+
87
+ var event = element.fire("ajax:before");
88
+ if (event.stopped) return false;
89
+
90
+ if (element.tagName.toLowerCase() === 'form') {
91
+ method = element.readAttribute('method') || 'post';
92
+ url = element.readAttribute('action');
93
+ // serialize the form with respect to the submit button that was pressed
94
+ params = element.serialize({ submit: element.retrieve('rails:submit-button') });
95
+ // clear the pressed submit button information
96
+ element.store('rails:submit-button', null);
97
+ } else {
98
+ method = element.readAttribute('data-method') || 'get';
99
+ url = element.readAttribute('href');
100
+ params = {};
101
+ }
102
+
103
+ new Ajax.Request(url, {
104
+ method: method,
105
+ parameters: params,
106
+ evalScripts: true,
107
+
108
+ onCreate: function(response) { element.fire("ajax:create", response); },
109
+ onComplete: function(response) { element.fire("ajax:complete", response); },
110
+ onSuccess: function(response) { element.fire("ajax:success", response); },
111
+ onFailure: function(response) { element.fire("ajax:failure", response); }
112
+ });
113
+
114
+ element.fire("ajax:after");
115
+ }
116
+
117
+ function insertHiddenField(form, name, value) {
118
+ form.insert(new Element('input', { type: 'hidden', name: name, value: value }));
119
+ }
120
+
121
+ function handleMethod(element) {
122
+ var method = element.readAttribute('data-method'),
123
+ url = element.readAttribute('href'),
124
+ csrf_param = $$('meta[name=csrf-param]')[0],
125
+ csrf_token = $$('meta[name=csrf-token]')[0];
126
+
127
+ var form = new Element('form', { method: "POST", action: url, style: "display: none;" });
128
+ $(element.parentNode).insert(form);
129
+
130
+ if (method !== 'post') {
131
+ insertHiddenField(form, '_method', method);
132
+ }
133
+
134
+ if (csrf_param) {
135
+ insertHiddenField(form, csrf_param.readAttribute('content'), csrf_token.readAttribute('content'));
136
+ }
137
+
138
+ form.submit();
139
+ }
140
+
141
+ function disableFormElements(form) {
142
+ form.select('input[type=submit][data-disable-with]').each(function(input) {
143
+ input.store('rails:original-value', input.getValue());
144
+ input.setValue(input.readAttribute('data-disable-with')).disable();
145
+ });
146
+ }
147
+
148
+ function enableFormElements(form) {
149
+ form.select('input[type=submit][data-disable-with]').each(function(input) {
150
+ input.setValue(input.retrieve('rails:original-value')).enable();
151
+ });
152
+ }
153
+
154
+ function allowAction(element) {
155
+ var message = element.readAttribute('data-confirm');
156
+ return !message || confirm(message);
157
+ }
158
+
159
+ document.on('click', 'a[data-confirm], a[data-remote], a[data-method]', function(event, link) {
160
+ if (!allowAction(link)) {
161
+ event.stop();
162
+ return false;
163
+ }
164
+
165
+ if (link.readAttribute('data-remote')) {
166
+ handleRemote(link);
167
+ event.stop();
168
+ } else if (link.readAttribute('data-method')) {
169
+ handleMethod(link);
170
+ event.stop();
171
+ }
172
+ });
173
+
174
+ document.on("click", "form input[type=submit], form button[type=submit], form button:not([type])", function(event, button) {
175
+ // register the pressed submit button
176
+ event.findElement('form').store('rails:submit-button', button.name || false);
177
+ });
178
+
179
+ document.on("submit", function(event) {
180
+ var form = event.findElement();
181
+
182
+ if (!allowAction(form)) {
183
+ event.stop();
184
+ return false;
185
+ }
186
+
187
+ if (form.readAttribute('data-remote')) {
188
+ handleRemote(form);
189
+ event.stop();
190
+ } else {
191
+ disableFormElements(form);
192
+ }
193
+ });
194
+
195
+ document.on('ajax:create', 'form', function(event, form) {
196
+ if (form == event.findElement()) disableFormElements(form);
197
+ });
198
+
199
+ document.on('ajax:complete', 'form', function(event, form) {
200
+ if (form == event.findElement()) enableFormElements(form);
201
+ });
202
+ })();
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,23 @@
1
+ require 'test_helper'
2
+
3
+ class AuthControllerTest < ActiveSupport::IntegrationCase
4
+
5
+ test 'auth entry point should not be accessable to logged OUT users' do
6
+ visit oauth_new_path
7
+ assert_equal '/users/sign_in', current_path
8
+ end
9
+
10
+ test 'auth entry point is accessable to logged IN users' do
11
+ app = create_client_app
12
+ user = create_user
13
+ redirect_uri = '/'
14
+
15
+ as_user(user).visit oauth_new_path(:client_id => app.client_id, :redirect_uri => redirect_uri)
16
+
17
+ assert_equal '/oauth/new', current_path
18
+
19
+ click_button 'oauthAuthorize'
20
+ assert_equal '/', current_path
21
+ assert Oauth::AccessGrant.where(:user_id => user.id, :application_id => app.id).present?
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class ClientApplicationControllerTest < ActiveSupport::IntegrationCase
4
+ test 'must be logged in' do
5
+ visit new_oauth_client_application_path
6
+ assert_equal '/users/sign_in', current_path
7
+ end
8
+
9
+ test 'create client application' do
10
+ user = create_user
11
+ as_user(user).visit new_oauth_client_application_path
12
+ assert_equal '/oauth_client_applications/new', current_path
13
+
14
+ fill_in 'oauth_client_application_name', :with => rand_name
15
+
16
+ click_button 'submitApp'
17
+ assert_equal '/oauth_client_applications', current_path
18
+
19
+ last_client = Oauth::ClientApplication.order(:created_at).last
20
+ assert has_content?(last_client.name)
21
+ assert has_content?(last_client.client_id)
22
+ assert has_content?(last_client.client_secret)
23
+ end
24
+ end
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class DocsControllerTest < ActiveSupport::IntegrationCase
4
+ test 'renders' do
5
+ visit oauth_docs_path
6
+ assert_equal '/oauth_docs', current_path
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ class OauthTest < ActiveSupport::IntegrationCase
4
+
5
+ test 'invalid auth_token should do nothing' do
6
+ visit '/'
7
+ assert has_content?('There be NO logged in users')
8
+ end
9
+
10
+ test 'valid auth token shows user as logged in' do
11
+ user = create_user
12
+ auth_grant = create_auth_grant_for_user(user)
13
+ access_token = auth_grant.access_token
14
+ visit "/?access_token=#{access_token}"
15
+ assert has_content?('User is logged in')
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class OproTest < ActiveSupport::TestCase
4
+ test "truth" do
5
+ assert_kind_of Module, Opro
6
+ end
7
+
8
+
9
+
10
+ end
11
+
12
+
13
+
14
+ class OproSetupTest < ActiveSupport::TestCase
15
+
16
+ test 'setting auth_strategy :devise' do
17
+ Opro.setup do |config|
18
+ config.auth_strategy :devise
19
+ end
20
+ assert Opro.login_method.present?
21
+ assert Opro.logout_method.present?
22
+ end
23
+
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::DSL
4
+ include Rails.application.routes.url_helpers
5
+ end
@@ -0,0 +1,99 @@
1
+ # Configure Rails Envinronment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+
5
+
6
+ ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
7
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
8
+ require "rails/test_help"
9
+
10
+
11
+
12
+
13
+ ActionMailer::Base.delivery_method = :test
14
+ ActionMailer::Base.perform_deliveries = true
15
+ ActionMailer::Base.default_url_options[:host] = "test.com"
16
+
17
+ Rails.backtrace_cleaner.remove_silencers!
18
+
19
+ # Configure capybara for integration testing
20
+ require "capybara/rails"
21
+ Capybara.default_driver = :rack_test
22
+ Capybara.default_selector = :css
23
+
24
+
25
+
26
+ # Run any available migration
27
+ ActiveRecord::Migration.verbose = false
28
+ ActiveRecord::Base.logger = Logger.new(nil)
29
+
30
+
31
+ ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
32
+
33
+ class ActiveSupport::TestCase
34
+ self.use_transactional_fixtures = true
35
+ self.use_instantiated_fixtures = false
36
+ end
37
+
38
+ # Load support files
39
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
40
+
41
+
42
+
43
+ include Devise::TestHelpers
44
+
45
+ # gives us the login_as(@user) method when request object is not present
46
+ include Warden::Test::Helpers
47
+ Warden.test_mode!
48
+
49
+ def rand_name
50
+ 'foo' + Time.now.to_f.to_s
51
+ end
52
+
53
+
54
+ def create_user(options = {})
55
+ User.create(:email => rand_name + '@bar.com', :password => 'password', :password_confirm => 'password')
56
+ end
57
+
58
+ def create_client_app(options= {})
59
+ user = options[:user] || create_user
60
+ name = options[:name] || rand_name
61
+ Oauth::ClientApplication.create_with_user_and_name(user, name)
62
+ end
63
+
64
+ def user_with_client_app
65
+ user = create_user
66
+ create_client_app(:user => user)
67
+ user
68
+ end
69
+
70
+ def create_auth_grant_for_user(user = nil, app = nil)
71
+ app ||= create_client_app
72
+ user ||= create_user
73
+ Oauth::AccessGrant.create(:user => user, :application => app)
74
+ end
75
+
76
+ # Will run the given code as the user passed in
77
+ def as_user(user=nil, &block)
78
+ current_user = user || create_user
79
+ if self.respond_to? :request
80
+ sign_in(current_user)
81
+ else
82
+ login_as(current_user, :scope => :user)
83
+ end
84
+ block.call if block.present?
85
+ return self
86
+ end
87
+
88
+
89
+ def as_visitor(user=nil, &block)
90
+ current_user = user || create_user
91
+ if self.respond_to? :request
92
+ sign_out(current_user)
93
+ else
94
+ logout(:user)
95
+ end
96
+ block.call if block.present?
97
+ return self
98
+ end
99
+
metadata ADDED
@@ -0,0 +1,251 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opro
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.pre
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - schneems
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-10 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: &70329431198240 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.7
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70329431198240
25
+ - !ruby/object:Gem::Dependency
26
+ name: rails
27
+ requirement: &70329431197140 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 3.0.7
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70329431197140
36
+ - !ruby/object:Gem::Dependency
37
+ name: bluecloth
38
+ requirement: &70329431196460 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70329431196460
47
+ - !ruby/object:Gem::Dependency
48
+ name: jeweler
49
+ requirement: &70329431195780 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.6.4
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70329431195780
58
+ - !ruby/object:Gem::Dependency
59
+ name: bundler
60
+ requirement: &70329431195160 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: 1.1.3
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70329431195160
69
+ - !ruby/object:Gem::Dependency
70
+ name: capybara
71
+ requirement: &70329431194500 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 0.4.0
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70329431194500
80
+ - !ruby/object:Gem::Dependency
81
+ name: sqlite3
82
+ requirement: &70329431193900 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70329431193900
91
+ - !ruby/object:Gem::Dependency
92
+ name: launchy
93
+ requirement: &70329431193160 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70329431193160
102
+ - !ruby/object:Gem::Dependency
103
+ name: devise
104
+ requirement: &70329431192520 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70329431192520
113
+ - !ruby/object:Gem::Dependency
114
+ name: rcov
115
+ requirement: &70329431191660 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *70329431191660
124
+ - !ruby/object:Gem::Dependency
125
+ name: simplecov
126
+ requirement: &70329431190860 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *70329431190860
135
+ description: ! ' Enable oauth clients (iphone, android, web sites, etc.) to access
136
+ and use your Rails application, what you do with it is up to you'
137
+ email: richard.schneeman@gmail.com
138
+ executables: []
139
+ extensions: []
140
+ extra_rdoc_files:
141
+ - README.md
142
+ files:
143
+ - CHANGELOG.md
144
+ - Gemfile
145
+ - Gemfile.lock
146
+ - MIT-LICENSE
147
+ - README.md
148
+ - Rakefile
149
+ - VERSION
150
+ - app/controllers/oauth/auth_controller.rb
151
+ - app/controllers/oauth/client_application_controller.rb
152
+ - app/controllers/oauth/docs_controller.rb
153
+ - app/controllers/opro_application_controller.rb
154
+ - app/models/oauth/access_grant.rb
155
+ - app/models/oauth/client_application.rb
156
+ - app/views/oauth/auth/new.html.erb
157
+ - app/views/oauth/client_application/create.html.erb
158
+ - app/views/oauth/client_application/index.html.erb
159
+ - app/views/oauth/client_application/new.html.erb
160
+ - app/views/oauth/docs/index.html.erb
161
+ - app/views/oauth/docs/markdown/curl.md.erb
162
+ - app/views/oauth/docs/markdown/oauth.md.erb
163
+ - app/views/oauth/docs/markdown/quick_start.md.erb
164
+ - app/views/oauth/docs/show.html.erb
165
+ - config/routes.rb
166
+ - lib/generators/active_record/opro_generator.rb
167
+ - lib/generators/active_record/templates/access_grants.rb
168
+ - lib/generators/active_record/templates/client_applications.rb
169
+ - lib/generators/opro/install_generator.rb
170
+ - lib/generators/templates/opro.rb
171
+ - lib/opro.rb
172
+ - lib/opro/controllers/application_controller_helper.rb
173
+ - lib/opro/engine.rb
174
+ - opro.gemspec
175
+ - test/dummy/Rakefile
176
+ - test/dummy/app/controllers/application_controller.rb
177
+ - test/dummy/app/controllers/pages_controller.rb
178
+ - test/dummy/app/helpers/application_helper.rb
179
+ - test/dummy/app/models/user.rb
180
+ - test/dummy/app/views/layouts/application.html.erb
181
+ - test/dummy/app/views/pages/index.html.erb
182
+ - test/dummy/config.ru
183
+ - test/dummy/config/application.rb
184
+ - test/dummy/config/boot.rb
185
+ - test/dummy/config/database.yml
186
+ - test/dummy/config/environment.rb
187
+ - test/dummy/config/environments/development.rb
188
+ - test/dummy/config/environments/production.rb
189
+ - test/dummy/config/environments/test.rb
190
+ - test/dummy/config/initializers/backtrace_silencers.rb
191
+ - test/dummy/config/initializers/devise.rb
192
+ - test/dummy/config/initializers/inflections.rb
193
+ - test/dummy/config/initializers/mime_types.rb
194
+ - test/dummy/config/initializers/opro.rb
195
+ - test/dummy/config/initializers/secret_token.rb
196
+ - test/dummy/config/initializers/session_store.rb
197
+ - test/dummy/config/locales/devise.en.yml
198
+ - test/dummy/config/locales/en.yml
199
+ - test/dummy/config/routes.rb
200
+ - test/dummy/db/migrate/20120408163038_devise_create_users.rb
201
+ - test/dummy/db/migrate/20120408165729_create_opro_access_grants.rb
202
+ - test/dummy/db/migrate/20120408165730_create_opro_client_applications.rb
203
+ - test/dummy/db/schema.rb
204
+ - test/dummy/public/404.html
205
+ - test/dummy/public/422.html
206
+ - test/dummy/public/500.html
207
+ - test/dummy/public/favicon.ico
208
+ - test/dummy/public/javascripts/application.js
209
+ - test/dummy/public/javascripts/controls.js
210
+ - test/dummy/public/javascripts/dragdrop.js
211
+ - test/dummy/public/javascripts/effects.js
212
+ - test/dummy/public/javascripts/prototype.js
213
+ - test/dummy/public/javascripts/rails.js
214
+ - test/dummy/public/stylesheets/.gitkeep
215
+ - test/dummy/script/rails
216
+ - test/integration/auth_controller_test.rb
217
+ - test/integration/client_application_controller_test.rb
218
+ - test/integration/docs_controller_test.rb
219
+ - test/integration/oauth_test.rb
220
+ - test/opro_test.rb
221
+ - test/support/integration_case.rb
222
+ - test/test_helper.rb
223
+ homepage: http://github.com/schneems/opro
224
+ licenses:
225
+ - MIT
226
+ post_install_message:
227
+ rdoc_options: []
228
+ require_paths:
229
+ - lib
230
+ required_ruby_version: !ruby/object:Gem::Requirement
231
+ none: false
232
+ requirements:
233
+ - - ! '>='
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ segments:
237
+ - 0
238
+ hash: 3465543543531569023
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ none: false
241
+ requirements:
242
+ - - ! '>'
243
+ - !ruby/object:Gem::Version
244
+ version: 1.3.1
245
+ requirements: []
246
+ rubyforge_project:
247
+ rubygems_version: 1.8.10
248
+ signing_key:
249
+ specification_version: 3
250
+ summary: Opro turns your Rails application into an OAuth Provider
251
+ test_files: []