rubycas-client 2.2.1 → 2.3.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +13 -0
- data/Gemfile.lock +30 -0
- data/History.txt +21 -0
- data/README.rdoc +24 -20
- data/Rakefile +43 -54
- data/VERSION +1 -0
- data/examples/rails/README +16 -0
- data/examples/rails/app/controllers/advanced_example_controller.rb +31 -0
- data/examples/rails/app/controllers/application.rb +2 -0
- data/examples/rails/app/controllers/simple_example_controller.rb +16 -0
- data/examples/rails/app/views/advanced_example/index.html.erb +13 -0
- data/examples/rails/app/views/advanced_example/my_account.html.erb +11 -0
- data/examples/rails/app/views/simple_example/index.html.erb +6 -0
- data/examples/rails/config/boot.rb +109 -0
- data/examples/rails/config/environment.rb +39 -0
- data/examples/rails/config/environments/development.rb +17 -0
- data/examples/rails/config/environments/production.rb +22 -0
- data/examples/rails/config/environments/test.rb +22 -0
- data/examples/rails/config/initializers/inflections.rb +10 -0
- data/examples/rails/config/initializers/mime_types.rb +5 -0
- data/examples/rails/config/initializers/new_rails_defaults.rb +17 -0
- data/examples/rails/config/routes.rb +4 -0
- data/examples/rails/log/development.log +946 -0
- data/examples/rails/log/production.log +0 -0
- data/examples/rails/log/server.log +0 -0
- data/examples/rails/log/test.log +0 -0
- data/examples/rails/script/about +4 -0
- data/examples/rails/script/console +3 -0
- data/examples/rails/script/server +3 -0
- data/lib/casclient/client.rb +49 -36
- data/lib/casclient/frameworks/rails/cas_proxy_callback_controller.rb +5 -39
- data/lib/casclient/frameworks/rails/filter.rb +86 -113
- data/lib/casclient/responses.rb +29 -16
- data/lib/casclient/tickets/storage/active_record_ticket_store.rb +67 -0
- data/lib/casclient/tickets/storage.rb +167 -0
- data/lib/casclient/tickets.rb +3 -3
- data/lib/casclient.rb +3 -2
- data/lib/rubycas-client.rb +1 -5
- data/rails_generators/active_record_ticket_store/USAGE +9 -0
- data/rails_generators/active_record_ticket_store/active_record_ticket_store_generator.rb +29 -0
- data/rails_generators/active_record_ticket_store/templates/README +1 -0
- data/rails_generators/active_record_ticket_store/templates/migration.rb +24 -0
- data/rubycas-client.gemspec +103 -0
- data/test/teststrap.rb +10 -0
- data/test/units/casclient/frameworks/rails/filter_test.rb +184 -0
- metadata +148 -47
- data/Manifest.txt +0 -23
- data/examples/merb/README.textile +0 -12
- data/examples/merb/Rakefile +0 -35
- data/examples/merb/merb.thor +0 -2020
- data/examples/merb/merb_auth_cas.rb +0 -67
- data/examples/merb/spec/spec_helper.rb +0 -24
- data/init.rb +0 -6
- data/lib/casclient/frameworks/merb/filter.rb +0 -105
- data/lib/casclient/frameworks/merb/strategy.rb +0 -110
- data/lib/casclient/version.rb +0 -9
- data/setup.rb +0 -1585
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionpack (2.3.11)
|
5
|
+
activesupport (= 2.3.11)
|
6
|
+
rack (~> 1.1.0)
|
7
|
+
activesupport (2.3.11)
|
8
|
+
git (1.2.5)
|
9
|
+
jeweler (1.6.2)
|
10
|
+
bundler (~> 1.0)
|
11
|
+
git (>= 1.2.5)
|
12
|
+
rake
|
13
|
+
rack (1.1.2)
|
14
|
+
rake (0.9.2)
|
15
|
+
rcov (0.9.9)
|
16
|
+
riot (0.12.5)
|
17
|
+
rr
|
18
|
+
rr (1.0.4)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
actionpack
|
25
|
+
activesupport
|
26
|
+
bundler (~> 1.0.0)
|
27
|
+
jeweler (~> 1.6.2)
|
28
|
+
rcov
|
29
|
+
riot
|
30
|
+
rr
|
data/History.txt
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
= RubyCAS-Client Changelog
|
2
2
|
|
3
|
+
== Version 2.3.0 :: Prerelease
|
4
|
+
|
5
|
+
* New Functionality
|
6
|
+
* Add configuration option to expect complex extra attributes to be encoded
|
7
|
+
in json instead of yaml
|
8
|
+
* Split out storage mechanism for single sign out and proxy ticket storage so
|
9
|
+
that it is modular
|
10
|
+
|
11
|
+
* Changes to existing functionality
|
12
|
+
* Change gem building from hoe to jeweler
|
13
|
+
* expect extra attributes to be nested under a cas:attributes elemenet to
|
14
|
+
improve compatibility with other extra attribute implementations
|
15
|
+
* Unauthorized requests to URLs ending in .json now show an JSON formatted
|
16
|
+
response
|
17
|
+
|
18
|
+
* Bug Fixes
|
19
|
+
* Fixed bug introduced by upstream patch that broke proxy ticket validation
|
20
|
+
when using extra attributes
|
21
|
+
* Fixed bug where extra attributes key was set on the session with a null
|
22
|
+
value when faking with no extra attributes
|
23
|
+
|
3
24
|
== Version 2.2.1 :: 2010-06-24
|
4
25
|
|
5
26
|
* Removed a 3rd party patch to the logging mechanism that broke the client under
|
data/README.rdoc
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
= RubyCAS-Client
|
2
2
|
|
3
|
-
|
3
|
+
Authors:: Matt Zukowski <matt AT roughest DOT net> and Matt Campbell <matt AT soupmatt DOT com>; inspired by code by Ola Bini <ola.bini AT ki DOT se> and Matt Walker <mwalker AT tamu DOT edu>
|
4
4
|
Copyright:: Portions contributed by Matt Zukowski are copyright (c) 2009 Urbacon Ltd.
|
5
|
+
Portions contributed by Matt Campbell, Rich Yarger and Rahul Joshi are copyright (c) 2011 Vibes Media LLC.
|
5
6
|
Other portions are copyright of their respective authors.
|
6
7
|
License:: MIT License
|
7
|
-
Websites:: http://github.com/
|
8
|
-
http://
|
9
|
-
http://
|
10
|
-
|
8
|
+
Websites:: http://github.com/rubycas/rubycas-client
|
9
|
+
http://github.com/rubycas/rubycas-client/wiki
|
10
|
+
http://rubydoc.info/github/rubycas/rubycas-client/master/frames
|
11
11
|
|
12
12
|
|
13
13
|
=== RubyCAS-Client is a Ruby client library for Yale's Central Authentication Service (CAS) protocol.
|
@@ -36,13 +36,18 @@ API documentation (i.e. the RDocs) are available at http://rubycas-client.rubyfo
|
|
36
36
|
|
37
37
|
== Installation
|
38
38
|
|
39
|
+
<b>NOTE:</b> For compatibility with Rails 3 have a look at https://github.com/zuk/rubycas-client-rails
|
40
|
+
|
41
|
+
The current version of RubyCAS-Client should work with Rails 2.3.6 and up. For compatibility with
|
42
|
+
older Rails try using an older version of the client.
|
43
|
+
|
39
44
|
You can download the latest version of RubyCAS-Client from the project's rubyforge page at
|
40
45
|
http://rubyforge.org/projects/rubycas-client.
|
41
46
|
|
42
47
|
However, if you're using Rails, it's easier to install the CAS client as a plugin:
|
43
48
|
|
44
49
|
cd <your rails app>
|
45
|
-
./script/plugin install
|
50
|
+
./script/plugin install git://github.com/gunark/rubycas-client.git
|
46
51
|
|
47
52
|
Alternatively, the library is also installable as a RubyGem[http://rubygems.org]:
|
48
53
|
|
@@ -51,11 +56,8 @@ Alternatively, the library is also installable as a RubyGem[http://rubygems.org]
|
|
51
56
|
If your Rails application is under Subversion control, you can also install the plugin as an svn:external, ensuring that
|
52
57
|
you always have the latest bleeding-edge version of RubyCAS-Client:
|
53
58
|
|
54
|
-
./script/plugin install -x http://
|
59
|
+
./script/plugin install -x http://svn.github.com/gunark/rubycas-client.git
|
55
60
|
|
56
|
-
With Rails 2.1 or newer, it is also possible to install the plugin directly from the bleeding-edge git repository:
|
57
|
-
|
58
|
-
./script/plugin install git://github.com/gunark/rubycas-client.git
|
59
61
|
|
60
62
|
== Usage Examples
|
61
63
|
|
@@ -108,7 +110,7 @@ Here is a more complicated configuration showing most of the configuration optio
|
|
108
110
|
(this does not show proxy options, which are covered in the next section):
|
109
111
|
|
110
112
|
# enable detailed CAS logging
|
111
|
-
cas_logger = CASClient::Logger.new(
|
113
|
+
cas_logger = CASClient::Logger.new(::Rails.root+'/log/cas.log')
|
112
114
|
cas_logger.level = Logger::DEBUG
|
113
115
|
|
114
116
|
CASClient::Frameworks::Rails::Filter.configure(
|
@@ -149,7 +151,7 @@ notify the client application that the CAS session is closed. The client will au
|
|
149
151
|
requsts from the CAS server, but in order for this to work you must configure your Rails application as follows:
|
150
152
|
|
151
153
|
1. The Rails session store must be set to ActiveRecord: <tt>config.action_controller.session_store = :active_record_store</tt>
|
152
|
-
2. The server must be able to read and write to
|
154
|
+
2. The server must be able to read and write to Rails.root/tmp/sessions. If you are in a clustered environment,
|
153
155
|
the contents of this directory must be shared between all server instances.
|
154
156
|
3. Cross-site request forgery protection must be disabled. In your <tt>application.rb</tt>: <tt>self.allow_forgery_protection = false</tt>.
|
155
157
|
(Or rather you may want to disable forgery protection only for actions that are behind the CAS filter.)
|
@@ -230,12 +232,11 @@ all you need to do is this:
|
|
230
232
|
In your <tt>config/environment.rb</tt>:
|
231
233
|
|
232
234
|
# enable detailed CAS logging for easier troubleshooting
|
233
|
-
cas_logger = CASClient::Logger.new(
|
235
|
+
cas_logger = CASClient::Logger.new(::Rails.root+'/log/cas.log')
|
234
236
|
cas_logger.level = Logger::DEBUG
|
235
237
|
|
236
238
|
CASClient::Frameworks::Rails::Filter.configure(
|
237
239
|
:cas_base_url => "https://cas.example.foo/",
|
238
|
-
:proxy_retrieval_url => "https://cas-proxy-callback.example.foo/cas_proxy_callback/retrieve_pgt",
|
239
240
|
:proxy_callback_url => "https://cas-proxy-callback.example.foo/cas_proxy_callback/receive_pgt",
|
240
241
|
:logger => cas_logger
|
241
242
|
)
|
@@ -255,12 +256,9 @@ but your Rails server wouldn't respond to the CAS server's callback until the CA
|
|
255
256
|
|
256
257
|
The simplest workaround is this:
|
257
258
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
3. Make sure that the server is up and running, and configure your proxy_callback_url and proxy_retrieval_url to point
|
262
|
-
to the new server as described above (or rather, make Pound point to the new server, if that's how you're handling https).
|
263
|
-
|
259
|
+
Run rails using a server that handles multiple concurrent requests. In development, you can use Phusion Passenger Standalone,
|
260
|
+
POW (http://pow.cx/), unicorn and many others. In production, I imagine you already support multiple concurrent requests.
|
261
|
+
|
264
262
|
That's it. The proxy_callback_controller doesn't require any additional configuration. It doesn't access the database
|
265
263
|
or anything of that sort.
|
266
264
|
|
@@ -316,6 +314,12 @@ In your test or Cucumber step definition, simply fake out CAS.
|
|
316
314
|
This functionality was present in the original version of this plugin.
|
317
315
|
The value of the username is stored in session[:cas_user] (or the user specified field) and session[:casfilteruser] for backwards-compatibility.
|
318
316
|
|
317
|
+
If you need to fake out extra attributes, you can do so like this:
|
318
|
+
|
319
|
+
CASClient::Frameworks::Rails::Filter.fake("homer", {:role => "user", :email => "homer@test.foo"})
|
320
|
+
|
321
|
+
And the extra attributes will get put in the proper place in the session.
|
322
|
+
|
319
323
|
== License
|
320
324
|
|
321
325
|
RubyCAS-Client is licensed for use under the terms of the MIT License.
|
data/Rakefile
CHANGED
@@ -1,63 +1,52 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
2
12
|
require 'rake'
|
3
|
-
require 'rake/clean'
|
4
|
-
require 'rake/testtask'
|
5
|
-
require 'rake/packagetask'
|
6
|
-
require 'rake/gempackagetask'
|
7
|
-
require 'rake/rdoctask'
|
8
|
-
require 'rake/contrib/rubyforgepublisher'
|
9
|
-
require 'fileutils'
|
10
|
-
require 'hoe'
|
11
|
-
include FileUtils
|
12
|
-
require File.join(File.dirname(__FILE__), 'lib', 'casclient', 'version')
|
13
|
-
|
14
|
-
AUTHOR = ["Matt Zukowski", "Matt Walker"] # can also be an array of Authors
|
15
|
-
EMAIL = "matt at roughest dot net"
|
16
|
-
DESCRIPTION = "Client library for the Central Authentication Service (CAS) protocol."
|
17
|
-
GEM_NAME = "rubycas-client" # what ppl will type to install your gem
|
18
|
-
RUBYFORGE_PROJECT = "rubycas-client" # The unix name for your project
|
19
|
-
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
20
|
-
|
21
|
-
ENV['NODOT'] = '1'
|
22
13
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
gem.name = "rubycas-client"
|
17
|
+
gem.homepage = "http://github.com/rubycas/rubycas-client"
|
18
|
+
gem.license = "MIT"
|
19
|
+
gem.summary = "Client library for the Central Authentication Service (CAS) protocol."
|
20
|
+
gem.authors = ["Matt Zukowski", "Matt Walker", "Matt Campbell"]
|
21
|
+
gem.rdoc_options = ['--main', 'README.rdoc']
|
22
|
+
gem.files.exclude '.rvmrc', '.infinity_test'
|
23
|
+
# dependencies defined in Gemfile
|
24
|
+
end
|
25
|
+
Jeweler::RubygemsDotOrgTasks.new
|
33
26
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
27
|
+
require 'rake/testtask'
|
28
|
+
Rake::TestTask.new(:test) do |test|
|
29
|
+
test.libs << 'test'
|
30
|
+
test.pattern = 'test/**/*_test.rb'
|
31
|
+
test.verbose = true
|
38
32
|
end
|
39
33
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
p.summary = DESCRIPTION
|
47
|
-
p.url = HOMEPATH
|
48
|
-
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
49
|
-
p.test_globs = ["test/**/*_test.rb"]
|
50
|
-
p.clean_globs = CLEAN #An array of file patterns to delete on clean.
|
51
|
-
|
52
|
-
# == Optional
|
53
|
-
#p.changes - A description of the release's latest changes.
|
54
|
-
#p.extra_deps - An array of rubygem dependencies.
|
55
|
-
#p.spec_extras - A hash of extra values to set in the gemspec.
|
56
|
-
p.extra_deps = ['activesupport']
|
34
|
+
require 'rcov/rcovtask'
|
35
|
+
Rcov::RcovTask.new do |test|
|
36
|
+
test.libs << 'test'
|
37
|
+
test.pattern = 'test/**/test_*.rb'
|
38
|
+
test.verbose = true
|
39
|
+
test.rcov_opts << '--exclude "gems/*"'
|
57
40
|
end
|
58
41
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
42
|
+
task :default => :test
|
43
|
+
|
44
|
+
require 'rake/rdoctask'
|
45
|
+
Rake::RDocTask.new do |rdoc|
|
46
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
47
|
+
|
48
|
+
rdoc.rdoc_dir = 'rdoc'
|
49
|
+
rdoc.title = "rubycas-client #{version}"
|
50
|
+
rdoc.rdoc_files.include('README*')
|
51
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
63
52
|
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3.0.rc1
|
@@ -0,0 +1,16 @@
|
|
1
|
+
This is a skeleton Rails application hooked up for CAS authentication.
|
2
|
+
|
3
|
+
To try this out:
|
4
|
+
|
5
|
+
1. If you have an existing CAS server, modify the CAS client settings in
|
6
|
+
config/environment.rb to point to your server. If you do not yet
|
7
|
+
have a CAS server, install rubycas-server, and configure it to run on
|
8
|
+
http://localhost:7777 (or modify environment.rb to your likings).
|
9
|
+
|
10
|
+
2. Run `ruby script/server`
|
11
|
+
|
12
|
+
3. Point your web browser to http://localhost:3000
|
13
|
+
|
14
|
+
4. Have a look at the source code in app/controllers/simple_example_controller.rb
|
15
|
+
and app/controllers/advanced_example_controller.rb. The
|
16
|
+
corresponding views under app/views might also be worth looking at.
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# A more advanced example.
|
2
|
+
# For basic usage see the SimpleExampleController.
|
3
|
+
class AdvancedExampleController < ApplicationController
|
4
|
+
# This will allow the user to view the index page without authentication
|
5
|
+
# but will process CAS authentication data if the user already
|
6
|
+
# has an SSO session open.
|
7
|
+
before_filter CASClient::Frameworks::Rails::GatewayFilter, :only => :index
|
8
|
+
|
9
|
+
# This requires the user to be authenticated for viewing allother pages.
|
10
|
+
before_filter CASClient::Frameworks::Rails::Filter, :except => :index
|
11
|
+
|
12
|
+
def index
|
13
|
+
@username = session[:cas_user]
|
14
|
+
|
15
|
+
@login_url = CASClient::Frameworks::Rails::Filter.login_url(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
def my_account
|
19
|
+
@username = session[:cas_user]
|
20
|
+
|
21
|
+
# Additional user attributes are available if your
|
22
|
+
# CAS server is configured to provide them.
|
23
|
+
# See http://code.google.com/p/rubycas-server/wiki/HowToSendExtraUserAttributes
|
24
|
+
@extra_attributes = session[:cas_extra_attributes]
|
25
|
+
end
|
26
|
+
|
27
|
+
def logout
|
28
|
+
CASClient::Frameworks::Rails::Filter.logout(self)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This is the most basic, bare-bones example.
|
2
|
+
# For advanced usage see the AdvancedExampleController.
|
3
|
+
class SimpleExampleController < ApplicationController
|
4
|
+
# This will force CAS authentication before the user
|
5
|
+
# is allowed to access any action in this controller.
|
6
|
+
before_filter CASClient::Frameworks::Rails::Filter
|
7
|
+
|
8
|
+
def index
|
9
|
+
@username = session[:cas_user]
|
10
|
+
end
|
11
|
+
|
12
|
+
def logout
|
13
|
+
CASClient::Frameworks::Rails::Filter.logout(self)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<h1>AdvancedExample#index</h1>
|
2
|
+
|
3
|
+
<% if @username %>
|
4
|
+
<p>Hello, <%= @username %>! You are authenticated.</p>
|
5
|
+
<% else %>
|
6
|
+
<p>You are not yet authenticated. <%= link_to("Login", @login_url) %>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<p>» <%= link_to("Go To My Account", :action => 'my_account') %></p>
|
10
|
+
|
11
|
+
<% if @username %>
|
12
|
+
<p>[ <%= link_to("Logout", :action => 'logout') %> ]</p>
|
13
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<h1>AdvancedExample#my_account</h1>
|
2
|
+
<p><%= @username %>'s Account page</p>
|
3
|
+
|
4
|
+
<p>
|
5
|
+
<strong>Extra Attributes</strong>:<br />
|
6
|
+
<% unless @extra_attributes.blank? %>
|
7
|
+
<%= debug(@extra_attributes) %>
|
8
|
+
<% end %>
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<p>[ <%= link_to("Logout", :action => 'logout') %> ]</p>
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# Don't change this file!
|
2
|
+
# Configure your app in config/environment.rb and config/environments/*.rb
|
3
|
+
|
4
|
+
Rails.root = "#{File.dirname(__FILE__)}/.." unless defined?(Rails.root)
|
5
|
+
|
6
|
+
module Rails
|
7
|
+
class << self
|
8
|
+
def boot!
|
9
|
+
unless booted?
|
10
|
+
preinitialize
|
11
|
+
pick_boot.run
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def booted?
|
16
|
+
defined? Rails::Initializer
|
17
|
+
end
|
18
|
+
|
19
|
+
def pick_boot
|
20
|
+
(vendor_rails? ? VendorBoot : GemBoot).new
|
21
|
+
end
|
22
|
+
|
23
|
+
def vendor_rails?
|
24
|
+
File.exist?("#{Rails.root}/vendor/rails")
|
25
|
+
end
|
26
|
+
|
27
|
+
def preinitialize
|
28
|
+
load(preinitializer_path) if File.exist?(preinitializer_path)
|
29
|
+
end
|
30
|
+
|
31
|
+
def preinitializer_path
|
32
|
+
"#{Rails.root}/config/preinitializer.rb"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Boot
|
37
|
+
def run
|
38
|
+
load_initializer
|
39
|
+
Rails::Initializer.run(:set_load_path)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class VendorBoot < Boot
|
44
|
+
def load_initializer
|
45
|
+
require "#{Rails.root}/vendor/rails/railties/lib/initializer"
|
46
|
+
Rails::Initializer.run(:install_gem_spec_stubs)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class GemBoot < Boot
|
51
|
+
def load_initializer
|
52
|
+
self.class.load_rubygems
|
53
|
+
load_rails_gem
|
54
|
+
require 'initializer'
|
55
|
+
end
|
56
|
+
|
57
|
+
def load_rails_gem
|
58
|
+
if version = self.class.gem_version
|
59
|
+
gem 'rails', version
|
60
|
+
else
|
61
|
+
gem 'rails'
|
62
|
+
end
|
63
|
+
rescue Gem::LoadError => load_error
|
64
|
+
$stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
|
68
|
+
class << self
|
69
|
+
def rubygems_version
|
70
|
+
Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
|
71
|
+
end
|
72
|
+
|
73
|
+
def gem_version
|
74
|
+
if defined? RAILS_GEM_VERSION
|
75
|
+
RAILS_GEM_VERSION
|
76
|
+
elsif ENV.include?('RAILS_GEM_VERSION')
|
77
|
+
ENV['RAILS_GEM_VERSION']
|
78
|
+
else
|
79
|
+
parse_gem_version(read_environment_rb)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def load_rubygems
|
84
|
+
require 'rubygems'
|
85
|
+
min_version = '1.1.1'
|
86
|
+
unless rubygems_version >= min_version
|
87
|
+
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
|
88
|
+
exit 1
|
89
|
+
end
|
90
|
+
|
91
|
+
rescue LoadError
|
92
|
+
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
|
93
|
+
exit 1
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_gem_version(text)
|
97
|
+
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
def read_environment_rb
|
102
|
+
File.read("#{Rails.root}/config/environment.rb")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# All that for this:
|
109
|
+
Rails.boot!
|