radiant-users-extension 0.0.1

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/.gitignore ADDED
@@ -0,0 +1 @@
1
+ pkg
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Radiant Users Extension
2
+
3
+ Hook standard Radiant users to provide front end user creation and login.
4
+
5
+ A good example comes from [radiant-shop-extension](http://github.com/dirkkelly/radiant-shop-extension) in the use of customers
6
+
7
+ ## Create a Model
8
+
9
+ class ShopCustomer < User
10
+ include Users::Models::User::Scoped
11
+ end
12
+
13
+ When a customer is created the access attributes present status will prevent them from accessing the administration system.
14
+
15
+ ## Define Their Welcome Page
16
+
17
+ Radiant::Config['users.shop_customer.redirect'] = '/cart'
18
+
19
+ ## API Access
20
+
21
+ Login Candy provided us with authentication hooks allowing for API login, there is currently no login mechanism. Contributions are welcome
22
+
23
+ # Installation
24
+
25
+ Gemfile
26
+
27
+ gem 'radiant-users-extension', :require => nil
28
+
29
+ config/environment.rb
30
+
31
+ config.gem 'radiant-users-extension', :lib => false
data/Rakefile ADDED
@@ -0,0 +1,136 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gem|
4
+ gem.name = "radiant-users-extension"
5
+ gem.summary = %Q{Users Extension for Radiant CMS}
6
+ gem.description = %Q{Users creates support for non-admin users with API access}
7
+ gem.email = "dk@squaretalent.com"
8
+ gem.homepage = "http://github.com/dirkkelly/radiant-users-extension"
9
+ gem.authors = ["Christopher Rankin", "Dirk Kelly"]
10
+ end
11
+ Jeweler::GemcutterTasks.new
12
+ rescue LoadError
13
+ puts "Jeweler (or a dependency) not available. This is only required if you plan to package users as a gem."
14
+ end
15
+
16
+ # In rails 1.2, plugins aren't available in the path until they're loaded.
17
+ # Check to see if the rspec plugin is installed first and require
18
+ # it if it is. If not, use the gem version.
19
+
20
+ # Determine where the RSpec plugin is by loading the boot
21
+ unless defined? RADIANT_ROOT
22
+ ENV["RAILS_ENV"] = "test"
23
+ case
24
+ when ENV["RADIANT_ENV_FILE"]
25
+ require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
26
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
27
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
28
+ else
29
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
30
+ end
31
+ end
32
+
33
+ require 'rake'
34
+ require 'rake/rdoctask'
35
+ require 'rake/testtask'
36
+
37
+ rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
38
+ $LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
39
+ require 'spec/rake/spectask'
40
+ require 'cucumber'
41
+ require 'cucumber/rake/task'
42
+
43
+ # Cleanup the RADIANT_ROOT constant so specs will load the environment
44
+ Object.send(:remove_const, :RADIANT_ROOT)
45
+
46
+ extension_root = File.expand_path(File.dirname(__FILE__))
47
+
48
+ task :default => :spec
49
+ task :stats => "spec:statsetup"
50
+
51
+ desc "Run all specs in spec directory"
52
+ Spec::Rake::SpecTask.new(:spec) do |t|
53
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
54
+ t.spec_files = FileList['spec/**/*_spec.rb']
55
+ end
56
+
57
+ task :features => 'spec:integration'
58
+
59
+ namespace :spec do
60
+ desc "Run all specs in spec directory with RCov"
61
+ Spec::Rake::SpecTask.new(:rcov) do |t|
62
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
63
+ t.spec_files = FileList['spec/**/*_spec.rb']
64
+ t.rcov = true
65
+ t.rcov_opts = ['--exclude', 'spec', '--rails']
66
+ end
67
+
68
+ desc "Print Specdoc for all specs"
69
+ Spec::Rake::SpecTask.new(:doc) do |t|
70
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
71
+ t.spec_files = FileList['spec/**/*_spec.rb']
72
+ end
73
+
74
+ [:models, :controllers, :views, :helpers].each do |sub|
75
+ desc "Run the specs under spec/#{sub}"
76
+ Spec::Rake::SpecTask.new(sub) do |t|
77
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
78
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
79
+ end
80
+ end
81
+
82
+ desc "Run the Cucumber features"
83
+ Cucumber::Rake::Task.new(:integration) do |t|
84
+ t.fork = true
85
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'pretty')]
86
+ # t.feature_pattern = "#{extension_root}/features/**/*.feature"
87
+ t.profile = "default"
88
+ end
89
+
90
+ # Setup specs for stats
91
+ task :statsetup do
92
+ require 'code_statistics'
93
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models)
94
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views)
95
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
96
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
97
+ ::CodeStatistics::TEST_TYPES << "Model specs"
98
+ ::CodeStatistics::TEST_TYPES << "View specs"
99
+ ::CodeStatistics::TEST_TYPES << "Controller specs"
100
+ ::CodeStatistics::TEST_TYPES << "Helper specs"
101
+ ::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
102
+ end
103
+
104
+ namespace :db do
105
+ namespace :fixtures do
106
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
107
+ task :load => :environment do
108
+ require 'active_record/fixtures'
109
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
110
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
111
+ Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ desc 'Generate documentation for the users extension.'
119
+ Rake::RDocTask.new(:rdoc) do |rdoc|
120
+ rdoc.rdoc_dir = 'rdoc'
121
+ rdoc.title = 'UsersExtension'
122
+ rdoc.options << '--line-numbers' << '--inline-source'
123
+ rdoc.rdoc_files.include('README')
124
+ rdoc.rdoc_files.include('lib/**/*.rb')
125
+ end
126
+
127
+ # For extensions that are in transition
128
+ desc 'Test the users extension.'
129
+ Rake::TestTask.new(:test) do |t|
130
+ t.libs << 'lib'
131
+ t.pattern = 'test/**/*_test.rb'
132
+ t.verbose = true
133
+ end
134
+
135
+ # Load any custom rakefiles for extension
136
+ Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/config/routes.rb ADDED
@@ -0,0 +1,8 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+
3
+ map.with_options(:controller => 'admin/welcome') do |welcome|
4
+ welcome.login 'login', :action => 'login'
5
+ welcome.logout 'logout', :action => 'logout'
6
+ end
7
+
8
+ end
data/cucumber.yml ADDED
@@ -0,0 +1 @@
1
+ default: --format progress features --tags ~@proposed,~@in_progress
@@ -0,0 +1,14 @@
1
+ class AddApiKeyToUsers < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :users, :api_key, :string, :limit => 40, :default => ''
4
+
5
+ User.all.each do |u|
6
+ u.generate_api_key
7
+ u.save
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ remove_column :users, :api_key
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ class AddAccessToUser < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :users, :access, :string, :default => ''
4
+ end
5
+
6
+ def self.down
7
+ remove_column :users, :access
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # Sets up the Rails environment for Cucumber
2
+ ENV["RAILS_ENV"] = "test"
3
+ # Extension root
4
+ extension_env = File.expand_path(File.dirname(__FILE__) + '/../../../../../config/environment')
5
+ require extension_env+'.rb'
6
+
7
+ Dir.glob(File.join(RADIANT_ROOT, "features", "**", "*.rb")).each {|step| require step}
8
+
9
+ Cucumber::Rails::World.class_eval do
10
+ include Dataset
11
+ datasets_directory "#{RADIANT_ROOT}/spec/datasets"
12
+ Dataset::Resolver.default = Dataset::DirectoryResolver.new("#{RADIANT_ROOT}/spec/datasets", File.dirname(__FILE__) + '/../../spec/datasets', File.dirname(__FILE__) + '/../datasets')
13
+ self.datasets_database_dump_path = "#{Rails.root}/tmp/dataset"
14
+
15
+ # dataset :login_candy
16
+ end
@@ -0,0 +1,14 @@
1
+ def path_to(page_name)
2
+ case page_name
3
+
4
+ when /the homepage/i
5
+ root_path
6
+
7
+ when /login/i
8
+ login_path
9
+ # Add more page name => path mappings here
10
+
11
+ else
12
+ raise "Can't find mapping from \"#{page_name}\" to a path."
13
+ end
14
+ end
@@ -0,0 +1,54 @@
1
+ namespace :radiant do
2
+ namespace :extensions do
3
+ namespace :users do
4
+
5
+ desc "Runs the migration of the Users extension"
6
+ task :migrate => [ :environment, 'radiant:extensions:forms:migrate' ] do
7
+ require 'radiant/extension_migrator'
8
+ if ENV["VERSION"]
9
+ UsersExtension.migrator.migrate(ENV["VERSION"].to_i)
10
+ else
11
+ UsersExtension.migrator.migrate
12
+ end
13
+ Rake::Task['db:schema:dump'].invoke
14
+ end
15
+
16
+ desc "Copies public assets of the Users to the instance public/ directory."
17
+ task :update => :environment do
18
+ is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
19
+ puts "Copying assets from UsersExtension"
20
+ Dir[UsersExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
21
+ path = file.sub(UsersExtension.root, '')
22
+ directory = File.dirname(path)
23
+ mkdir_p RAILS_ROOT + directory, :verbose => false
24
+ cp file, RAILS_ROOT + path, :verbose => false
25
+ end
26
+ unless UsersExtension.root.starts_with? RAILS_ROOT # don't need to copy vendored tasks
27
+ puts "Copying rake tasks from UsersExtension"
28
+ local_tasks_path = File.join(RAILS_ROOT, %w(lib tasks))
29
+ mkdir_p local_tasks_path, :verbose => false
30
+ Dir[File.join UsersExtension.root, %w(lib tasks *.rake)].each do |file|
31
+ cp file, local_tasks_path, :verbose => false
32
+ end
33
+ end
34
+ end
35
+
36
+ desc "Syncs all available translations for this ext to the English ext master"
37
+ task :sync => :environment do
38
+ # The main translation root, basically where English is kept
39
+ language_root = UsersExtension.root + "/config/locales"
40
+ words = TranslationSupport.get_translation_keys(language_root)
41
+
42
+ Dir["#{language_root}/*.yml"].each do |filename|
43
+ next if filename.match('_available_tags')
44
+ basename = File.basename(filename, '.yml')
45
+ puts "Syncing #{basename}"
46
+ (comments, other) = TranslationSupport.read_file(filename, basename)
47
+ words.each { |k,v| other[k] ||= words[k] } # Initializing hash variable as empty if it does not exist
48
+ other.delete_if { |k,v| !words[k] } # Remove if not defined in en.yml
49
+ TranslationSupport.write_file(filename, basename, comments, other)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,40 @@
1
+ module Users
2
+ module Lib
3
+ module LoginSystem
4
+
5
+ def self.included(base)
6
+ base.class_eval do
7
+ protected
8
+ alias_method :authorize_radiant, :authorize
9
+ alias_method :current_user_radiant, :current_user
10
+
11
+ def authorize
12
+ if user_has_backend_access?
13
+ authorize_radiant
14
+ else
15
+ path = Radiant::Config["scoped.#{current_user.access}.welcome"]
16
+ path = "/#{path}".gsub('//','/')
17
+
18
+ respond_to do |format|
19
+ format.any(:html, :xml, :json) { redirect_to(path) }
20
+ end
21
+ end
22
+ end
23
+
24
+ def user_has_backend_access?
25
+ current_user.access.blank?
26
+ end
27
+
28
+ def current_user
29
+ @current_user ||= (current_user_radiant || login_from_api_key)
30
+ end
31
+
32
+ def login_from_api_key
33
+ self.current_user = User.find_by_api_key(params[:api_key]) if params[:api_key].present?
34
+ end
35
+ end
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ module Users
2
+ module Models
3
+ module User
4
+ module Scoped
5
+
6
+ def self.included(base)
7
+ base.class_eval do
8
+ default_scope :conditions => { :access => self.name.underscore }
9
+ end
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ module Users
2
+ module Models
3
+ module User
4
+
5
+ def self.included(base)
6
+ base.class_eval do
7
+ attr_protected :access
8
+ after_initialize :generate_api_key
9
+
10
+ def generate_api_key
11
+ begin
12
+ self.api_key = self.sha1(Time.now + Radiant::Config['session_timeout'].to_i)
13
+ rescue
14
+ logger.error "attempt to create api key failed - please migrate radiant-scoped-extension"
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,63 @@
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{radiant-users-extension}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Christopher Rankin", "Dirk Kelly"]
12
+ s.date = %q{2010-11-10}
13
+ s.description = %q{Users creates support for non-admin users with API access}
14
+ s.email = %q{dk@squaretalent.com}
15
+ s.extra_rdoc_files = [
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ ".gitignore",
20
+ "README.md",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "config/routes.rb",
24
+ "cucumber.yml",
25
+ "db/migrate/20100311014641_add_api_key_to_users.rb",
26
+ "db/migrate/20100311021835_add_access_to_user.rb",
27
+ "features/support/env.rb",
28
+ "features/support/paths.rb",
29
+ "lib/tasks/users_extension_tasks.rake",
30
+ "lib/users/lib/login_system.rb",
31
+ "lib/users/models/user.rb",
32
+ "lib/users/models/user/scoped.rb",
33
+ "radiant-users-extension.gemspec",
34
+ "spec/datasets/scoped_users_dataset.rb",
35
+ "spec/models/user_spec.rb",
36
+ "spec/models/visitor_spec.rb",
37
+ "spec/spec.opts",
38
+ "spec/spec_helper.rb",
39
+ "users_extension.rb"
40
+ ]
41
+ s.homepage = %q{http://github.com/dirkkelly/radiant-users-extension}
42
+ s.rdoc_options = ["--charset=UTF-8"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = %q{1.3.7}
45
+ s.summary = %q{Users Extension for Radiant CMS}
46
+ s.test_files = [
47
+ "spec/datasets/scoped_users_dataset.rb",
48
+ "spec/models/user_spec.rb",
49
+ "spec/models/visitor_spec.rb",
50
+ "spec/spec_helper.rb"
51
+ ]
52
+
53
+ if s.respond_to? :specification_version then
54
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
55
+ s.specification_version = 3
56
+
57
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
58
+ else
59
+ end
60
+ else
61
+ end
62
+ end
63
+
@@ -0,0 +1,20 @@
1
+ class ScopedUsersDataset < Dataset::Base
2
+
3
+ def load
4
+ create_model :user, :admin,
5
+ :name => 'Admin',
6
+ :email => 'admin@example.com',
7
+ :login => 'admin',
8
+ :password => 'radiant',
9
+ :password_confirmation => 'radiant'
10
+
11
+ create_model :user, :visitor,
12
+ :name => 'Visitor',
13
+ :email => 'visitor@example.com',
14
+ :login => 'visitor',
15
+ :access => 'some_visitor',
16
+ :password => 'radiant',
17
+ :password_confirmation => 'radiant'
18
+ end
19
+
20
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe User do
4
+
5
+ dataset :users
6
+
7
+ describe '#access attribute' do
8
+ it 'should be protected' do
9
+ @user = User.new({
10
+ :access => 'everything'
11
+ })
12
+
13
+ @user.access.should === ''
14
+ end
15
+ end
16
+
17
+ describe '#generate_api_key' do
18
+ it 'should generate an api key on initialize' do
19
+ @user = User.new
20
+ @user.api_key.should_not be_nil
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec/spec_helper'
2
+
3
+ class SomeVisitor < User
4
+ include Users::Models::User::Scoped
5
+ end
6
+
7
+ describe SomeVisitor do
8
+
9
+ dataset :scoped_users
10
+
11
+ describe 'scope' do
12
+ it 'should return only users with scoped access' do
13
+ SomeVisitor.count.should === User.all({:conditions => { :access => 'some_visitor' } }).count
14
+ end
15
+ end
16
+
17
+ describe 'before_save set_access filter' do
18
+ before :each do
19
+ mock.instance_of(SomeVisitor).save { true }
20
+ end
21
+
22
+ context 'a new object with no access set' do
23
+ it 'should set access to visitor' do
24
+ @visitor = SomeVisitor.new
25
+ @visitor.access.should === 'some_visitor'
26
+ @visitor.save
27
+ @visitor.access.should === 'some_visitor'
28
+ end
29
+ end
30
+
31
+ context 'an existing object with access set' do
32
+ @visitor = SomeVisitor.new
33
+ @visitor.access = 'not visitor'
34
+ @visitor.access.should === 'not visitor'
35
+ @visitor.save
36
+ @visitor.access.should === 'not visitor'
37
+ end
38
+ end
39
+
40
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
6
+ --reverse
@@ -0,0 +1,18 @@
1
+ unless defined? RADIANT_ROOT
2
+ ENV["RAILS_ENV"] = "test"
3
+ case
4
+ when ENV["RADIANT_ENV_FILE"]
5
+ require ENV["RADIANT_ENV_FILE"]
6
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
7
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
8
+ else
9
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
10
+ end
11
+ end
12
+ require "#{RADIANT_ROOT}/spec/spec_helper"
13
+
14
+ Dataset::Resolver.default << (File.dirname(__FILE__) + "/datasets")
15
+
16
+ Spec::Runner.configure do |config|
17
+ config.mock_with :rr
18
+ end
@@ -0,0 +1,13 @@
1
+ class UsersExtension < Radiant::Extension
2
+ version "0.0.1"
3
+ description "Users allows you to create non-admin users with API access"
4
+ url "http://github.com/dirkkelly/radiant-users-extension"
5
+
6
+ def activate
7
+ # Models
8
+ User.send :include, Users::Models::User
9
+
10
+ # Controllers
11
+ ApplicationController.send :include, Users::Lib::LoginSystem
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: radiant-users-extension
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
+ - Christopher Rankin
14
+ - Dirk Kelly
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2010-11-10 00:00:00 +08:00
20
+ default_executable:
21
+ dependencies: []
22
+
23
+ description: Users creates support for non-admin users with API access
24
+ email: dk@squaretalent.com
25
+ executables: []
26
+
27
+ extensions: []
28
+
29
+ extra_rdoc_files:
30
+ - README.md
31
+ files:
32
+ - .gitignore
33
+ - README.md
34
+ - Rakefile
35
+ - VERSION
36
+ - config/routes.rb
37
+ - cucumber.yml
38
+ - db/migrate/20100311014641_add_api_key_to_users.rb
39
+ - db/migrate/20100311021835_add_access_to_user.rb
40
+ - features/support/env.rb
41
+ - features/support/paths.rb
42
+ - lib/tasks/users_extension_tasks.rake
43
+ - lib/users/lib/login_system.rb
44
+ - lib/users/models/user.rb
45
+ - lib/users/models/user/scoped.rb
46
+ - radiant-users-extension.gemspec
47
+ - spec/datasets/scoped_users_dataset.rb
48
+ - spec/models/user_spec.rb
49
+ - spec/models/visitor_spec.rb
50
+ - spec/spec.opts
51
+ - spec/spec_helper.rb
52
+ - users_extension.rb
53
+ has_rdoc: true
54
+ homepage: http://github.com/dirkkelly/radiant-users-extension
55
+ licenses: []
56
+
57
+ post_install_message:
58
+ rdoc_options:
59
+ - --charset=UTF-8
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ hash: 3
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ hash: 3
77
+ segments:
78
+ - 0
79
+ version: "0"
80
+ requirements: []
81
+
82
+ rubyforge_project:
83
+ rubygems_version: 1.3.7
84
+ signing_key:
85
+ specification_version: 3
86
+ summary: Users Extension for Radiant CMS
87
+ test_files:
88
+ - spec/datasets/scoped_users_dataset.rb
89
+ - spec/models/user_spec.rb
90
+ - spec/models/visitor_spec.rb
91
+ - spec/spec_helper.rb