sparkly-auth 1.0.0
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.
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +50 -0
- data/VERSION +1 -0
- data/app/controllers/sparkly_accounts_controller.rb +59 -0
- data/app/controllers/sparkly_controller.rb +47 -0
- data/app/controllers/sparkly_sessions_controller.rb +52 -0
- data/app/models/password.rb +3 -0
- data/app/models/remembrance_token.rb +50 -0
- data/app/views/sparkly_accounts/edit.html.erb +24 -0
- data/app/views/sparkly_accounts/new.html.erb +24 -0
- data/app/views/sparkly_accounts/show.html.erb +0 -0
- data/app/views/sparkly_sessions/new.html.erb +22 -0
- data/dependencies.rb +1 -0
- data/generators/sparkly/USAGE +27 -0
- data/generators/sparkly/sparkly_generator.rb +76 -0
- data/generators/sparkly/templates/accounts_controller.rb +65 -0
- data/generators/sparkly/templates/accounts_helper.rb +2 -0
- data/generators/sparkly/templates/help_file.txt +56 -0
- data/generators/sparkly/templates/initializer.rb +30 -0
- data/generators/sparkly/templates/migrations/add_confirmed_to_sparkly_passwords.rb +9 -0
- data/generators/sparkly/templates/migrations/create_sparkly_passwords.rb +19 -0
- data/generators/sparkly/templates/migrations/create_sparkly_remembered_tokens.rb +15 -0
- data/generators/sparkly/templates/sessions_controller.rb +45 -0
- data/generators/sparkly/templates/sessions_helper.rb +2 -0
- data/generators/sparkly/templates/tasks/migrations.rb +1 -0
- data/generators/sparkly/templates/views/sparkly_accounts/edit.html.erb +24 -0
- data/generators/sparkly/templates/views/sparkly_accounts/new.html.erb +24 -0
- data/generators/sparkly/templates/views/sparkly_accounts/show.html.erb +0 -0
- data/generators/sparkly/templates/views/sparkly_sessions/new.html.erb +22 -0
- data/init.rb +44 -0
- data/lib/auth.rb +52 -0
- data/lib/auth/behavior/base.rb +64 -0
- data/lib/auth/behavior/core.rb +87 -0
- data/lib/auth/behavior/core/authenticated_model_methods.rb +52 -0
- data/lib/auth/behavior/core/controller_extensions.rb +52 -0
- data/lib/auth/behavior/core/controller_extensions/class_methods.rb +24 -0
- data/lib/auth/behavior/core/controller_extensions/current_user.rb +54 -0
- data/lib/auth/behavior/core/password_methods.rb +65 -0
- data/lib/auth/behavior/remember_me.rb +17 -0
- data/lib/auth/behavior/remember_me/configuration.rb +21 -0
- data/lib/auth/behavior/remember_me/controller_extensions.rb +66 -0
- data/lib/auth/behavior_lookup.rb +10 -0
- data/lib/auth/configuration.rb +328 -0
- data/lib/auth/encryptors/sha512.rb +20 -0
- data/lib/auth/generators/configuration_generator.rb +20 -0
- data/lib/auth/generators/controllers_generator.rb +34 -0
- data/lib/auth/generators/migration_generator.rb +32 -0
- data/lib/auth/generators/route_generator.rb +19 -0
- data/lib/auth/generators/views_generator.rb +26 -0
- data/lib/auth/model.rb +94 -0
- data/lib/auth/observer.rb +21 -0
- data/lib/auth/target_list.rb +5 -0
- data/lib/auth/tasks/migrations.rb +71 -0
- data/lib/auth/token.rb +10 -0
- data/lib/sparkly-auth.rb +1 -0
- data/rails/init.rb +17 -0
- data/rails/routes.rb +19 -0
- data/sparkly-auth.gemspec +143 -0
- data/spec/controllers/application_controller_spec.rb +13 -0
- data/spec/generators/sparkly_spec.rb +64 -0
- data/spec/lib/auth/behavior/core_spec.rb +184 -0
- data/spec/lib/auth/behavior/remember_me_spec.rb +127 -0
- data/spec/lib/auth/extensions/controller_spec.rb +32 -0
- data/spec/lib/auth/model_spec.rb +57 -0
- data/spec/lib/auth_spec.rb +32 -0
- data/spec/mocks/models/user.rb +3 -0
- data/spec/routes_spec.rb +24 -0
- data/spec/spec_helper.rb +61 -0
- data/spec/views_spec.rb +18 -0
- metadata +210 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
class Auth::Generators::RouteGenerator < Rails::Generator::NamedBase
|
2
|
+
attr_reader :model
|
3
|
+
|
4
|
+
def initialize(model, options = {})
|
5
|
+
@model = model
|
6
|
+
args = [ model.name ]
|
7
|
+
super(args, options)
|
8
|
+
end
|
9
|
+
|
10
|
+
def manifest
|
11
|
+
record do |m|
|
12
|
+
m.route_resources plural_name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def spec
|
17
|
+
@spec ||= Rails::Generator::Spec.new("route", File.join(Auth.path, "auth/generators"), nil)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Auth::Generators::ViewsGenerator < Rails::Generator::NamedBase
|
2
|
+
attr_reader :model
|
3
|
+
|
4
|
+
def initialize(model, options = {})
|
5
|
+
@model = model
|
6
|
+
args = [ model.name ]
|
7
|
+
super(args, options)
|
8
|
+
end
|
9
|
+
|
10
|
+
def manifest
|
11
|
+
record do |m|
|
12
|
+
m.directory resource_directory = File.join("app/views", model.accounts_controller.underscore)
|
13
|
+
m.directory sessions_directory = File.join("app/views", model.sessions_controller.underscore)
|
14
|
+
|
15
|
+
%w(edit new show).each do |f|
|
16
|
+
m.file "views/sparkly_accounts/#{f}.html.erb", File.join(resource_directory, "#{f}.html.erb")
|
17
|
+
end
|
18
|
+
|
19
|
+
m.file "views/sparkly_sessions/new.html.erb", File.join(sessions_directory, "new.html.erb")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def spec
|
24
|
+
@spec ||= Rails::Generator::Spec.new("views", File.join(Auth.path, "auth/generators"), nil)
|
25
|
+
end
|
26
|
+
end
|
data/lib/auth/model.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
class Auth::Model
|
2
|
+
module Authenticated
|
3
|
+
def self.included(base)
|
4
|
+
base.send(:cattr_accessor, :sparkly_config)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
def self.option(name, default = name)
|
10
|
+
define_method(name) do
|
11
|
+
self.options[name] ||= Auth.configuration.send(default)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
include Auth::BehaviorLookup
|
16
|
+
attr_reader :options
|
17
|
+
option :behaviors
|
18
|
+
option :password_update_frequency
|
19
|
+
option :accounts_controller, :default_accounts_controller_name
|
20
|
+
option :sessions_controller, :default_sessions_controller_name
|
21
|
+
delegate :name, :table_name, :to => :target
|
22
|
+
|
23
|
+
# Options include:
|
24
|
+
# :behaviors => an array of behaviors to override Auth.configuration.behaviors
|
25
|
+
# :password_update_frequency => a time (ie 30.days) to override Auth.configuration.password_update_frequency
|
26
|
+
# :skip_routes => true if you do not want to generate routes (useful if you need to map them yourself).
|
27
|
+
# :key => the key upon which to authenticate (the username, basically)
|
28
|
+
# :with => a regular expression used to validate the password
|
29
|
+
# :accounts_controller => the name of the controller to route to for creating accounts, deleting them, etc.
|
30
|
+
# :sessions_controller => the name of the controller to route to for logging in, logging out, etc.
|
31
|
+
#
|
32
|
+
def initialize(name_or_constant, options = {})
|
33
|
+
begin
|
34
|
+
@target = resolve(name_or_constant).name
|
35
|
+
rescue NameError
|
36
|
+
# we fail silently because the user might not have generated the model yet. That would mean they're trying
|
37
|
+
# to do it now.
|
38
|
+
@target = name_or_constant.to_s.camelize
|
39
|
+
end
|
40
|
+
|
41
|
+
@options = options.reverse_merge(default_options)
|
42
|
+
end
|
43
|
+
|
44
|
+
def target
|
45
|
+
returning @target.constantize do |klass|
|
46
|
+
unless klass.include?(Auth::Model::Authenticated)
|
47
|
+
klass.send(:include, Auth::Model::Authenticated)
|
48
|
+
klass.sparkly_config = self
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Returns true if the specified String, Symbol or constant resolves to the same constant affected by this Model.
|
54
|
+
def matches?(name_or_constant)
|
55
|
+
target == resolve(name_or_constant)
|
56
|
+
end
|
57
|
+
|
58
|
+
# The key upon which this model is to be authenticated. (The username.) Defaults to :email
|
59
|
+
def key
|
60
|
+
options[:key]
|
61
|
+
end
|
62
|
+
|
63
|
+
# Merges the specified hash of options with this Model's hash of options. Same as model.options.merge!(options)
|
64
|
+
def merge_options!(options)
|
65
|
+
self.options.merge! options
|
66
|
+
end
|
67
|
+
|
68
|
+
def apply_options!
|
69
|
+
apply_behaviors!
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
def apply_behaviors!
|
74
|
+
behaviors.each do |behavior|
|
75
|
+
behavior = lookup_behavior(behavior)
|
76
|
+
behavior.new.apply_to(self)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def resolve(name_or_constant)
|
81
|
+
case name_or_constant
|
82
|
+
when Symbol then name_or_constant.to_s.camelize.constantize
|
83
|
+
when String then name_or_constant.camelize.constantize
|
84
|
+
else name_or_constant
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def default_options
|
89
|
+
{
|
90
|
+
:key => :email,
|
91
|
+
:with => :password
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Auth::Observer < ActiveRecord::Observer
|
2
|
+
public :add_observer!
|
3
|
+
|
4
|
+
class << self
|
5
|
+
# Attaches the observer to the supplied model classes.
|
6
|
+
def observe(*models)
|
7
|
+
models.flatten!
|
8
|
+
models.collect! { |model| model.is_a?(Symbol) ? model.to_s.camelize.constantize : model }
|
9
|
+
observed_classes.concat models
|
10
|
+
observed_classes.uniq!
|
11
|
+
end
|
12
|
+
|
13
|
+
def observed_classes
|
14
|
+
@observed_classes ||= []
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def observed_classes
|
19
|
+
Set.new(self.class.observed_classes)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
namespace :auth do
|
2
|
+
namespace :migrate do
|
3
|
+
desc "Migrate from Authlogic to Sparkly Auth"
|
4
|
+
task :authlogic => :environment do
|
5
|
+
require 'console_app'
|
6
|
+
|
7
|
+
models = Auth.authenticated_models.collect { |config| config.target }
|
8
|
+
# So we need to undo the existing Auth config so that there's no validation being done on the authenticated
|
9
|
+
# models. So we first reset the config...
|
10
|
+
Auth.reset_configuration!
|
11
|
+
# Then remove all behaviors (including :core)...
|
12
|
+
Auth.configuration.behaviors = []
|
13
|
+
# Then reload the models...
|
14
|
+
reload!
|
15
|
+
# Then apply the new config.
|
16
|
+
Auth.kick!
|
17
|
+
|
18
|
+
# And finally, we use a TOTALLY different Password model. Since the core behavior hasn't been applied to this
|
19
|
+
# version of Password, it's unenforced -- meaning we can assign encrypted passwords to it without having to
|
20
|
+
# worry about them being re-encrypted.
|
21
|
+
class UnenforcedPasswordModel < ActiveRecord::Base
|
22
|
+
set_table_name Password.table_name
|
23
|
+
belongs_to :authenticatable, :polymorphic => true
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
for model in models
|
28
|
+
model.instance_eval do
|
29
|
+
has_many :passwords, :as => :authenticatable
|
30
|
+
end
|
31
|
+
|
32
|
+
model.all.each do |record|
|
33
|
+
unless record.attributes['crypted_password'].blank? # skip those users registered AFTER migration
|
34
|
+
record.passwords.destroy_all
|
35
|
+
|
36
|
+
password = UnenforcedPasswordModel.new(:authenticatable => record)
|
37
|
+
password.save(false)
|
38
|
+
password.update_attribute(:secret, record.attributes['crypted_password'])
|
39
|
+
password.update_attribute(:salt, record.attributes['password_salt'])
|
40
|
+
|
41
|
+
if password.secret != record.attributes['crypted_password']
|
42
|
+
raise "Passwords don't match"
|
43
|
+
end
|
44
|
+
|
45
|
+
if record.attributes.keys.include?('persistence_token')
|
46
|
+
password.update_attribute(:persistence_token, record.attributes['persistence_token'])
|
47
|
+
else
|
48
|
+
password.update_attribute(:persistence_token, Auth::Token.new.to_s)
|
49
|
+
end
|
50
|
+
|
51
|
+
if record.attributes.keys.include?('single_access_token')
|
52
|
+
password.update_attribute(:single_access_token, record.attributes['single_access_token'])
|
53
|
+
else
|
54
|
+
password.update_attribute(:single_access_token, Auth::Token.new.to_s)
|
55
|
+
end
|
56
|
+
|
57
|
+
if record.attributes.keys.include?('perishable_token')
|
58
|
+
password.update_attribute(:perishable_token, record.attributes['perishable_token'])
|
59
|
+
else
|
60
|
+
password.update_attribute(:perishable_token, Auth::Token.new.to_s)
|
61
|
+
end
|
62
|
+
|
63
|
+
password.save!
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
puts "Tables have been migrated."
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/auth/token.rb
ADDED
data/lib/sparkly-auth.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path("../auth.rb", __FILE__)
|
data/rails/init.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# This file sets up the various include paths and whatnot that would have been set up
|
2
|
+
# for us by Rails if this were a Rails plugin.
|
3
|
+
|
4
|
+
base_path = File.expand_path("../..", __FILE__)
|
5
|
+
|
6
|
+
Rails.configuration.controller_paths << File.join(base_path, "app/controllers")
|
7
|
+
Rails.configuration.load_paths << File.join(base_path, 'lib')
|
8
|
+
Rails.configuration.load_paths << File.join(base_path, 'app/models')
|
9
|
+
|
10
|
+
ActionController::Base.view_paths << File.join(base_path, 'app/views')
|
11
|
+
|
12
|
+
# Routes
|
13
|
+
ActionController::Routing::Routes.add_configuration_file(File.join(base_path, "rails/routes.rb"))
|
14
|
+
|
15
|
+
|
16
|
+
# Finally, we're ready to load the app as if it were a plugin.
|
17
|
+
require File.expand_path("../../init", __FILE__)
|
data/rails/routes.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
if Auth.generate_routes?
|
2
|
+
ActionController::Routing::Routes.draw do |map|
|
3
|
+
Auth.configuration.authenticated_models.each do |model|
|
4
|
+
catch :missing do
|
5
|
+
begin
|
6
|
+
model.name # if an error is going to occur due to missing model, it'll happen here.
|
7
|
+
rescue NameError
|
8
|
+
# we rescue silently because the user's already been warned.
|
9
|
+
throw :missing
|
10
|
+
end
|
11
|
+
|
12
|
+
map.resource model.name.underscore, :controller => model.accounts_controller,
|
13
|
+
:requirements => { :model => model.name } do |model_res|
|
14
|
+
model_res.resource :session, :controller => model.sessions_controller, :requirements => { :model => model.name }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{sparkly-auth}
|
8
|
+
s.version = "1.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Colin MacKenzie IV"]
|
12
|
+
s.date = %q{2010-08-09}
|
13
|
+
s.description = %q{As fate would have it, I found other authentication solutions unable to suit my needs. So I rolled my own.}
|
14
|
+
s.email = %q{sinisterchipmunk@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.rdoc"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"LICENSE",
|
20
|
+
"README.rdoc",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"app/controllers/sparkly_accounts_controller.rb",
|
24
|
+
"app/controllers/sparkly_controller.rb",
|
25
|
+
"app/controllers/sparkly_sessions_controller.rb",
|
26
|
+
"app/models/password.rb",
|
27
|
+
"app/models/remembrance_token.rb",
|
28
|
+
"app/views/sparkly_accounts/edit.html.erb",
|
29
|
+
"app/views/sparkly_accounts/new.html.erb",
|
30
|
+
"app/views/sparkly_accounts/show.html.erb",
|
31
|
+
"app/views/sparkly_sessions/new.html.erb",
|
32
|
+
"dependencies.rb",
|
33
|
+
"generators/sparkly/USAGE",
|
34
|
+
"generators/sparkly/sparkly_generator.rb",
|
35
|
+
"generators/sparkly/templates/accounts_controller.rb",
|
36
|
+
"generators/sparkly/templates/accounts_helper.rb",
|
37
|
+
"generators/sparkly/templates/help_file.txt",
|
38
|
+
"generators/sparkly/templates/initializer.rb",
|
39
|
+
"generators/sparkly/templates/migrations/add_confirmed_to_sparkly_passwords.rb",
|
40
|
+
"generators/sparkly/templates/migrations/create_sparkly_passwords.rb",
|
41
|
+
"generators/sparkly/templates/migrations/create_sparkly_remembered_tokens.rb",
|
42
|
+
"generators/sparkly/templates/sessions_controller.rb",
|
43
|
+
"generators/sparkly/templates/sessions_helper.rb",
|
44
|
+
"generators/sparkly/templates/tasks/migrations.rb",
|
45
|
+
"generators/sparkly/templates/views/sparkly_accounts/edit.html.erb",
|
46
|
+
"generators/sparkly/templates/views/sparkly_accounts/new.html.erb",
|
47
|
+
"generators/sparkly/templates/views/sparkly_accounts/show.html.erb",
|
48
|
+
"generators/sparkly/templates/views/sparkly_sessions/new.html.erb",
|
49
|
+
"init.rb",
|
50
|
+
"lib/auth.rb",
|
51
|
+
"lib/auth/behavior/base.rb",
|
52
|
+
"lib/auth/behavior/core.rb",
|
53
|
+
"lib/auth/behavior/core/authenticated_model_methods.rb",
|
54
|
+
"lib/auth/behavior/core/controller_extensions.rb",
|
55
|
+
"lib/auth/behavior/core/controller_extensions/class_methods.rb",
|
56
|
+
"lib/auth/behavior/core/controller_extensions/current_user.rb",
|
57
|
+
"lib/auth/behavior/core/password_methods.rb",
|
58
|
+
"lib/auth/behavior/remember_me.rb",
|
59
|
+
"lib/auth/behavior/remember_me/configuration.rb",
|
60
|
+
"lib/auth/behavior/remember_me/controller_extensions.rb",
|
61
|
+
"lib/auth/behavior_lookup.rb",
|
62
|
+
"lib/auth/configuration.rb",
|
63
|
+
"lib/auth/encryptors/sha512.rb",
|
64
|
+
"lib/auth/generators/configuration_generator.rb",
|
65
|
+
"lib/auth/generators/controllers_generator.rb",
|
66
|
+
"lib/auth/generators/migration_generator.rb",
|
67
|
+
"lib/auth/generators/route_generator.rb",
|
68
|
+
"lib/auth/generators/views_generator.rb",
|
69
|
+
"lib/auth/model.rb",
|
70
|
+
"lib/auth/observer.rb",
|
71
|
+
"lib/auth/target_list.rb",
|
72
|
+
"lib/auth/tasks/migrations.rb",
|
73
|
+
"lib/auth/token.rb",
|
74
|
+
"lib/sparkly-auth.rb",
|
75
|
+
"rails/init.rb",
|
76
|
+
"rails/routes.rb",
|
77
|
+
"sparkly-auth.gemspec",
|
78
|
+
"spec/controllers/application_controller_spec.rb",
|
79
|
+
"spec/generators/sparkly_spec.rb",
|
80
|
+
"spec/lib/auth/behavior/core_spec.rb",
|
81
|
+
"spec/lib/auth/behavior/remember_me_spec.rb",
|
82
|
+
"spec/lib/auth/extensions/controller_spec.rb",
|
83
|
+
"spec/lib/auth/model_spec.rb",
|
84
|
+
"spec/lib/auth_spec.rb",
|
85
|
+
"spec/mocks/models/user.rb",
|
86
|
+
"spec/routes_spec.rb",
|
87
|
+
"spec/spec_helper.rb",
|
88
|
+
"spec/views_spec.rb"
|
89
|
+
]
|
90
|
+
s.homepage = %q{http://www.thoughtsincomputation.com}
|
91
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
92
|
+
s.require_paths = ["lib"]
|
93
|
+
s.rubygems_version = %q{1.3.6}
|
94
|
+
s.summary = %q{User authentication with Sparkles!}
|
95
|
+
s.test_files = [
|
96
|
+
"spec/controllers",
|
97
|
+
"spec/controllers/application_controller_spec.rb",
|
98
|
+
"spec/generators",
|
99
|
+
"spec/generators/sparkly_spec.rb",
|
100
|
+
"spec/lib",
|
101
|
+
"spec/lib/auth",
|
102
|
+
"spec/lib/auth/behavior",
|
103
|
+
"spec/lib/auth/behavior/core_spec.rb",
|
104
|
+
"spec/lib/auth/behavior/remember_me_spec.rb",
|
105
|
+
"spec/lib/auth/extensions",
|
106
|
+
"spec/lib/auth/extensions/controller_spec.rb",
|
107
|
+
"spec/lib/auth/model_spec.rb",
|
108
|
+
"spec/lib/auth_spec.rb",
|
109
|
+
"spec/mocks",
|
110
|
+
"spec/mocks/models",
|
111
|
+
"spec/mocks/models/user.rb",
|
112
|
+
"spec/routes_spec.rb",
|
113
|
+
"spec/spec_helper.rb",
|
114
|
+
"spec/support",
|
115
|
+
"spec/views_spec.rb"
|
116
|
+
]
|
117
|
+
|
118
|
+
if s.respond_to? :specification_version then
|
119
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
120
|
+
s.specification_version = 3
|
121
|
+
|
122
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
123
|
+
s.add_runtime_dependency(%q<sc-core-ext>, [">= 1.2.0"])
|
124
|
+
s.add_development_dependency(%q<rspec-rails>, [">= 1.3.2"])
|
125
|
+
s.add_development_dependency(%q<webrat>, [">= 0.7.1"])
|
126
|
+
s.add_development_dependency(%q<genspec>, [">= 0.1.1"])
|
127
|
+
s.add_development_dependency(%q<email_spec>, [">= 0.6.2"])
|
128
|
+
else
|
129
|
+
s.add_dependency(%q<sc-core-ext>, [">= 1.2.0"])
|
130
|
+
s.add_dependency(%q<rspec-rails>, [">= 1.3.2"])
|
131
|
+
s.add_dependency(%q<webrat>, [">= 0.7.1"])
|
132
|
+
s.add_dependency(%q<genspec>, [">= 0.1.1"])
|
133
|
+
s.add_dependency(%q<email_spec>, [">= 0.6.2"])
|
134
|
+
end
|
135
|
+
else
|
136
|
+
s.add_dependency(%q<sc-core-ext>, [">= 1.2.0"])
|
137
|
+
s.add_dependency(%q<rspec-rails>, [">= 1.3.2"])
|
138
|
+
s.add_dependency(%q<webrat>, [">= 0.7.1"])
|
139
|
+
s.add_dependency(%q<genspec>, [">= 0.1.1"])
|
140
|
+
s.add_dependency(%q<email_spec>, [">= 0.6.2"])
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ApplicationController do
|
4
|
+
# sanity check to make sure I haven't added methods and forgot to tell Rails they're not actions
|
5
|
+
it "should have only 'not_found' action" do
|
6
|
+
ApplicationController.action_methods.to_a.should == ["not_found"]
|
7
|
+
end
|
8
|
+
|
9
|
+
# it "should respond_to current_user" do
|
10
|
+
# Auth.kick!
|
11
|
+
# ApplicationController.new.should respond_to(:current_user)
|
12
|
+
# end
|
13
|
+
end
|