restful_acl 2.1.3 → 3.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/.gitignore ADDED
@@ -0,0 +1 @@
1
+ pkg/*
data/README.textile CHANGED
@@ -1,14 +1,20 @@
1
+ h1. Major changes in 3.0 release!
2
+
3
+ * RESTful_ACL has been completely refactored for speed and usability.
4
+ * A full Cucumber test suite has been written (http://github.com/mdarby/restful_acl_app).
5
+ * The view helpers @creatable@, @deletable@, @updatable@, @readable@ have been replaced by @allowed?@ (see below for more details).
6
+
1
7
  h2. RESTful_ACL
2
8
 
3
- A Ruby on Rails plugin that provides fine grained access control through the MVC stack to RESTful resources in a Ruby on Rails 2.0+ application. Authorization is as simple as true or false.
9
+ RESTful_ACL is rails gem that provides a full stack, contextual access control to RESTful resources. Authorization is as simple as true or false.
4
10
 
5
11
  h3. What it does
6
12
 
7
- RESTful_ACL is a simple Access Control Layer for Ruby on Rails. It restricts access on a fine-grained level to any RESTful MVC stack. Every application is different and everyone likes to setup their User / Account / Role resources differently; this plugin will allow you to do your thing and keep that thing locked down.
13
+ RESTful_ACL is a context-based permission engine. It provides full stack access control that is resource context aware. (If a parent is closed, a child is not editable, etc.)
8
14
 
9
15
  h3. Requirements
10
16
 
11
- RESTful_ACL requires the super amazing "RESTful_Authentication":https://github.com/technoweenie/restful-authentication plugin.
17
+ RESTful_ACL requires the notion of a @current_user@. Most authenticaion plugins provide this (AuthLogic, RESTful_Authentication, etc.)
12
18
 
13
19
  h3. How to Install
14
20
 
@@ -18,11 +24,8 @@ Install the RESTful_ACL gem:
18
24
  Add the gem to your environment.rb file as thus:
19
25
  <pre>config.gem "restful_acl"</pre>
20
26
 
21
- RESTful_ACL requires two named routes: "error" and "denied". Add the following to your routes.rb file:
22
- <pre>
23
- map.error 'error', :controller => 'some_controller', :action => 'error_action'
24
- map.denied 'denied', :controller => 'some_controller', :action => 'denied_action'
25
- </pre>
27
+ RESTful_ACL requires a named route named "denied". Add the following to your routes.rb file:
28
+ <pre>map.denied 'denied', :controller => 'some_controller', :action => 'denied_action'</pre>
26
29
 
27
30
  h3. How to Use
28
31
 
@@ -71,16 +74,15 @@ RESTful_ACL 2.1+ supports singleton resources. Just pass @:singleton@ to the @lo
71
74
  end
72
75
  </pre>
73
76
 
74
- h4. View Helpers
77
+ h4. View Helper
75
78
 
76
- There are five view helpers also included in RESTful_ACL: @#indexable@, @#creatable@, @#readable@, @#updatable@, and @#deletable@. These enable you to do nifty things like:
77
- <pre>
78
- = link_to ‘Foo Index’, foos_path if indexable
79
- = link_to 'Edit Foo', edit_foo_path(@foo) if updatable(@foo)
80
- = link_to 'Create Foo', new_foo_path if creatable
81
- = link_to 'View Foo', foo_path(@foo) if readable(@foo)
82
- = link_to 'Delete Foo', foo_path(@foo) if deletable(@foo), :method => :destroy
83
- </pre>
79
+ RESTful_ACL provides you with a view helper named @allowed?@. Simply pass this method a block containing the URL you'd like to check permission on and it will do the rest.
80
+ If the @current_user@ is allowed to access the requested link's action, the link will appear; otherwise no link will show.
81
+ <pre>= allowed?{ link_to ‘Foo Index’, foos_path }
82
+ = allowed?{ link_to 'Edit Foo', edit_foo_path(@foo) }
83
+ = allowed?{ link_to 'Create Foo', new_foo_path }
84
+ = allowed?{ link_to 'View Foo', foo_path(@foo) }
85
+ = allowed?{ link_to 'Delete Foo', foo_path(@foo), :method => :delete }</pre>
84
86
 
85
87
  h3. Huh? Here's an example
86
88
 
@@ -127,7 +129,6 @@ I normally do something along these lines in RSpec:
127
129
  before do
128
130
  @project = mock_model(Project)
129
131
  @author = mock_model(User, :projects => [@project])
130
-
131
132
  @issue = Issue.factory_girl(:issue, :author => @author, :project => @project)
132
133
  end
133
134
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.1.3
1
+ 3.0.0
@@ -0,0 +1,75 @@
1
+ module RestfulAcl
2
+ class Base
3
+
4
+ attr_accessor :object, :parent, :user, :controller_name, :uri, :action, :object_id
5
+
6
+
7
+ def initialize(options = {})
8
+ @object_id = options[:object_id]
9
+ @user = options[:user]
10
+ @uri = options[:uri]
11
+ @action = options[:action]
12
+ @controller_name = options[:controller_name]
13
+
14
+ if @object_id.present?
15
+ load_actors_from_id
16
+ else
17
+ load_actors_from_uri
18
+ end
19
+ end
20
+
21
+ def load_actors_from_id
22
+ @object = object_class.find(@object_id)
23
+ @parent = @object.get_mom if object_class.has_parent?
24
+ end
25
+
26
+ def load_actors_from_uri
27
+ @parent = load_parent_from_uri if object_class.has_parent?
28
+ @object = (object_class.is_singleton?) ? load_singleton_object : nil
29
+ end
30
+
31
+ def load_singleton_object
32
+ @parent.send(object_class.to_s.tableize.singularize.to_sym)
33
+ end
34
+
35
+ def load_parent_from_uri
36
+ parent_klass = object_class.mom.to_s
37
+ bits = @uri.split('/')
38
+ parent_id = bits.at(bits.index(parent_klass.pluralize) + 1)
39
+
40
+ parent_klass.classify.constantize.find(parent_id)
41
+ end
42
+
43
+ def object_class
44
+ @object_class ||= @controller_name.classify.demodulize.constantize
45
+ end
46
+
47
+ def admin?
48
+ @user.respond_to?("is_admin?") && @user.is_admin?
49
+ end
50
+
51
+ def allowed?
52
+ return true if admin?
53
+
54
+ case @action
55
+ when "index" then object_class.is_indexable_by(@user, @parent)
56
+ when "new", "create" then object_class.is_creatable_by(@user, @parent)
57
+ when "show" then @object.is_readable_by(@user, @parent)
58
+ when "edit", "update" then @object.is_updatable_by(@user, @parent)
59
+ when "destroy" then @object.is_deletable_by(@user, @parent)
60
+ else check_non_restful_route
61
+ end
62
+ end
63
+
64
+ def check_non_restful_route
65
+ if @object.present?
66
+ @object.is_readable_by(@user, @parent)
67
+ elsif object_class.present?
68
+ object_class.is_indexable_by(@user, @parent)
69
+ else
70
+ false # If all else fails, deny access
71
+ end
72
+ end
73
+
74
+ end
75
+ end
@@ -1,114 +1,38 @@
1
- module RestfulAclController
1
+ module RestfulAcl
2
+ module Controller
2
3
 
3
- def self.included(base)
4
- base.extend(ClassMethods)
5
- base.send :include, ClassMethods
6
- end
7
-
8
- module ClassMethods
9
-
10
- attr_accessor :restful_object, :restful_parent, :restful_klass, :restful_user
11
-
12
- def has_permission?
13
- return true if administrator?
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ base.send :include, ClassMethods
7
+ end
14
8
 
15
- load_actors(params[:id])
9
+ module ClassMethods
16
10
 
17
- begin
18
- # Let's let the Model decide what is acceptable
19
- permission_denied unless case params[:action]
20
- when "index" then @restful_klass.is_indexable_by(@restful_user, @restful_parent)
21
- when "new", "create" then @restful_klass.is_creatable_by(@restful_user, @restful_parent)
22
- when "show" then @restful_object.is_readable_by(@restful_user, @restful_parent)
23
- when "edit", "update" then @restful_object.is_updatable_by(@restful_user, @restful_parent)
24
- when "destroy" then @restful_object.is_deletable_by(@restful_user, @restful_parent)
25
- else check_non_restful_route
26
- end
11
+ def has_permission?
12
+ options = {
13
+ :controller_name => self.controller_name,
14
+ :object_id => params[:id],
15
+ :uri => request.request_uri,
16
+ :user => current_user,
17
+ :action => params[:action]
18
+ }
27
19
 
28
- rescue NoMethodError => e
29
- # Misconfiguration: A RESTful_ACL specific method is missing.
30
- raise_error(e)
31
- rescue
32
- # Failsafe: If any funny business is going on, log and redirect
33
- routing_error
20
+ permission_denied unless RestfulAcl::Base.new(options).allowed?
34
21
  end
35
- end
36
-
37
- private
38
22
 
39
- def load_actors(id)
40
- @restful_user = current_user
41
23
 
42
- # Load the Model based on the controller name
43
- @restful_klass = self.controller_name.classify.demodulize.constantize
24
+ private
44
25
 
45
- if id.present?
46
- # Load the object and possible parent requested
47
- @restful_object = @restful_klass.find(params[:id])
48
- @restful_parent = @restful_object.get_mom if @restful_klass.has_parent?
49
- else
50
- # No object was requested, so we need to go to the URI to figure out the parent
51
- @restful_parent = get_morestful_frorestful_request_uri(@restful_klass) if @restful_klass.has_parent?
52
-
53
- if @restful_klass.is_singleton?
54
- @restful_object = @restful_parent.send(@restful_klass.to_s.tableize.singularize.to_sym)
55
- else
56
- # No object was requested (index, create actions)
57
- @restful_object = nil
58
- end
26
+ def permission_denied
27
+ logger.info("[RESTful_ACL] Permission denied to %s at %s for %s" % [blame, Time.now, request.request_uri])
28
+ redirect_to denied_url
59
29
  end
60
- end
61
30
 
62
- def check_non_restful_route
63
- if @restful_object
64
- @restful_object.is_readable_by(@restful_user, @restful_parent)
65
- elsif @restful_klass
66
- @restful_klass.is_indexable_by(@restful_user, @restful_parent)
67
- else
68
- false # If all else fails, deny access
31
+ def blame
32
+ (@current_user.present?) ? "User ##{@current_user.id}" : "GUEST"
69
33
  end
70
- end
71
-
72
- def get_method_frorestful_error(error)
73
- error.message.gsub('`', "'").split("'").at(1)
74
- end
75
-
76
- def raise_error(error)
77
- method = get_method_frorestful_error(error)
78
- message = (is_class_method?(method)) ? "#{@restful_klass}#self.#{method}" : "#{@restful_klass}##{method}"
79
- raise NoMethodError, "[RESTful_ACL] #{message}(user, parent = nil) seems to be missing?"
80
- end
81
34
 
82
- def is_class_method?(method)
83
- method =~ /[index|creat]able/
84
- end
85
-
86
- def get_morestful_frorestful_request_uri(child_klass)
87
- parent_klass = child_klass.mom.to_s
88
- bits = request.request_uri.split('/')
89
- parent_id = bits.at(bits.index(parent_klass.pluralize) + 1)
90
-
91
- parent_klass.classify.constantize.find(parent_id)
92
- end
93
-
94
- def administrator?
95
- @restful_user.respond_to?("is_admin?") && @restful_user.is_admin?
96
- end
97
-
98
- def blame
99
- @restful_user.respond_to?(:login) ? @restful_user.login : @restful_user.username
100
- end
101
-
102
- def permission_denied
103
- logger.info("[RESTful_ACL] Permission denied to %s at %s for %s" % [(logged_in? ? blame : 'guest'), Time.now, request.request_uri])
104
- redirect_to denied_url
105
- end
106
-
107
- def routing_error
108
- logger.info("[RESTful_ACL] Routing error by %s at %s for %s" % [(logged_in? ? blame : 'guest'), Time.now, request.request_uri])
109
- redirect_to error_url
110
- end
35
+ end
111
36
 
112
37
  end
113
-
114
38
  end
@@ -0,0 +1,6 @@
1
+ module RestfulAcl
2
+
3
+ class UnrecognizedURLError < StandardError
4
+ end
5
+
6
+ end
@@ -1,62 +1,12 @@
1
- module RestfulAclHelper
2
- def indexable
3
- return true if admin_enabled
4
- klass.is_indexable_by(current_user, parent_obj)
5
- end
6
-
7
- def creatable
8
- return true if admin_enabled
9
- klass.is_creatable_by(current_user, parent_obj)
10
- end
11
- alias_method :createable, :creatable
12
-
13
-
14
- def updatable(object)
15
- return true if admin_enabled
16
-
17
- parent = object.get_mom rescue nil
18
- object.is_updatable_by(current_user, parent)
19
- end
20
- alias_method :updateable, :updatable
1
+ module RestfulAcl
2
+ module Helper
21
3
 
4
+ def allowed?(&block)
5
+ options = UrlParser.new(current_user, &block).options_hash
6
+ access = RestfulAcl::Base.new(options)
22
7
 
23
- def deletable(object)
24
- return true if admin_enabled
25
-
26
- parent = object.get_mom rescue nil
27
- object.is_deletable_by(current_user, parent)
28
- end
29
- alias_method :deleteable, :deletable
30
-
31
-
32
- def readable(object)
33
- return true if admin_enabled
34
-
35
- parent = object.get_mom rescue nil
36
- object.is_readable_by(current_user, parent)
37
- end
38
-
39
-
40
- private
41
-
42
- def klass
43
- params[:controller].classify.demodulize.constantize
44
- end
45
-
46
- def parent_obj
47
- parent_klass.find(parent_id) rescue nil
48
- end
49
-
50
- def parent_klass
51
- klass.parent.to_s.classify.constantize
52
- end
53
-
54
- def parent_id
55
- params["#{klass.parent.to_s}_id"]
8
+ yield if access.allowed?
56
9
  end
57
10
 
58
- def admin_enabled
59
- current_user.respond_to?("is_admin?") && current_user.is_admin?
60
- end
61
-
62
- end
11
+ end
12
+ end
@@ -1,59 +1,61 @@
1
- module RestfulAclModel
1
+ module RestfulAcl
2
+ module Model
2
3
 
3
- def self.included(base)
4
- base.extend(ClassMethods)
5
- base.send :include, ClassMethods
6
- end
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ base.send :include, ClassMethods
7
+ end
7
8
 
8
- module ClassMethods
9
- attr_accessor :mom, :singleton
9
+ module ClassMethods
10
+ attr_accessor :mom, :singleton
10
11
 
11
- def logical_parent(model, *options)
12
- @mom = model
13
- @singleton = options.include?(:singleton)
12
+ def logical_parent(model, *options)
13
+ @mom = model
14
+ @singleton = options.include?(:singleton)
14
15
 
15
- include RestfulAclModel::InstanceMethods
16
- end
16
+ include InstanceMethods
17
+ end
17
18
 
18
- def has_parent?
19
- @mom.present?
20
- end
19
+ def has_parent?
20
+ @mom.present?
21
+ end
22
+
23
+ def is_singleton?
24
+ @singleton.present?
25
+ end
21
26
 
22
- def is_singleton?
23
- @singleton.present?
24
27
  end
25
28
 
26
- end
27
29
 
30
+ module InstanceMethods
28
31
 
29
- module InstanceMethods
32
+ def get_mom
33
+ parent_klass.find(parent_id) if has_parent?
34
+ end
30
35
 
31
- def get_mom
32
- parent_klass.find(parent_id) if has_parent?
33
- end
36
+ private
34
37
 
35
- private
38
+ def klass
39
+ self.class
40
+ end
36
41
 
37
- def klass
38
- self.class
39
- end
42
+ def mom
43
+ klass.mom
44
+ end
40
45
 
41
- def mom
42
- klass.mom
43
- end
46
+ def has_parent?
47
+ !mom.nil?
48
+ end
44
49
 
45
- def has_parent?
46
- !mom.nil?
47
- end
50
+ def parent_klass
51
+ mom.to_s.classify.constantize
52
+ end
48
53
 
49
- def parent_klass
50
- mom.to_s.classify.constantize
51
- end
54
+ def parent_id
55
+ self.instance_eval("#{mom}_id")
56
+ end
52
57
 
53
- def parent_id
54
- self.instance_eval("#{mom}_id")
55
- end
58
+ end
56
59
 
57
60
  end
58
-
59
- end
61
+ end
@@ -0,0 +1,8 @@
1
+ class String
2
+
3
+ def singular?
4
+ other = self.dup
5
+ other.pluralize != self
6
+ end
7
+
8
+ end
@@ -0,0 +1,102 @@
1
+ # This class takes a User and block of text containing a URL and deduces the requested action
2
+ # and any object that that action will be taken upon.
3
+ #
4
+ # Author:: Matt Darby (mailto:matt@matt-darby.com)
5
+ # Copyright:: Copyright(c) 2009 Matt Darby
6
+ # License:: MIT
7
+
8
+ class UrlParser
9
+
10
+ TypesOfURLs = [
11
+ {:name => "parent_with_specific_child", :controller_bit => 3, :object_id_bit => 4, :regex => /\/(\w+)\/(\d+)[\w|-]*\/(\w+)\/(\d+)[\w|-]*$/},
12
+ {:name => "parent_with_edit_child", :controller_bit => 3, :object_id_bit => 4, :regex => /\/(\w+)\/(\d+)[\w|-]*\/(\w+)\/(\d+)[\w|-]*\/edit$/},
13
+ {:name => "parent_with_child_index", :controller_bit => 3, :object_id_bit => nil, :regex => /\/(\w+)\/(\d+)[\w|-]*\/(\w+)$/},
14
+ {:name => "parent_with_new_child", :controller_bit => 3, :object_id_bit => nil, :regex => /\/(\w+)\/(\d+)[\w|-]*\/(\w+)\/new$/},
15
+ {:name => "edit_singleton_child", :controller_bit => 3, :object_id_bit => nil, :regex => /\/(\w+)\/(\d+)[\w|-]*\/(\w+)\/edit$/},
16
+ {:name => "new_singleton_child", :controller_bit => 3, :object_id_bit => nil, :regex => /\/(\w+)\/(\d+)[\w|-]*\/(\w+)\/new$/},
17
+ {:name => "edit_parent", :controller_bit => 1, :object_id_bit => 2, :regex => /\/(\w+)\/edit$/},
18
+ {:name => "new_parent", :controller_bit => 1, :object_id_bit => nil, :regex => /\/(\w+)\/new$/},
19
+ {:name => "specific_parent", :controller_bit => 1, :object_id_bit => 2, :regex => /\/(\w+)\/(\d+)[\w|-]*$/},
20
+ {:name => "parent_index", :controller_bit => 1, :object_id_bit => nil, :regex => /\/(\w+)$/}
21
+ ]
22
+
23
+ URL = /href="([\w|\/|-]+)"/
24
+ AJAXURL = /url:'([\w|\/|-]+)'/
25
+ NewURL = /\/new$/
26
+ EditURL = /\/edit$/
27
+ ObjectURL = /\/(\d+)[\w|-]*$/
28
+ DestroyURL = /.*m\.setAttribute\('value', 'delete'\).*/
29
+
30
+ attr_accessor :text, :user, :url
31
+
32
+ # Dynamically define methods based off of TypesOfURLs hash
33
+ TypesOfURLs.each do |type|
34
+ define_method(type[:name]) do |url, controller_bit, object_id_bit, regex|
35
+ data = regex.match(url)
36
+ controller_name = data[controller_bit]
37
+ object_id = (object_id_bit.present?) ? data[object_id_bit] : nil
38
+ action = requested_action(controller_name)
39
+
40
+ {
41
+ :controller_name => controller_name,
42
+ :object_id => object_id,
43
+ :action => action,
44
+ :uri => requested_url,
45
+ :user => @user
46
+ }
47
+ end
48
+ end
49
+
50
+
51
+ def initialize(user, &block)
52
+ @text = yield
53
+ @user = user
54
+ @url = requested_url
55
+ end
56
+
57
+ # Parse a URL and return a hash suitable for usage with RESTful_ACL
58
+ # * :controller_name => The requested action's controller's name,
59
+ # * :object_id => The requested ID of the object in question (nil when Index, New, Create actions),
60
+ # * :action => The requested RESTful action (index, show, etc.),
61
+ # * :uri => The requested URL,
62
+ # * :user => The current user (used for context in RESTful_ACL)
63
+ def options_hash
64
+ invoke_url_type_method(deduce_url_type)
65
+ end
66
+
67
+
68
+ private
69
+
70
+ # Call the dynamically created method with arguments from deduced hash
71
+ def invoke_url_type_method(type)
72
+ send(type[:name], @url, type[:controller_bit], type[:object_id_bit], type[:regex])
73
+ end
74
+
75
+ # Deduce the requested URL's "type" based on the TypesOfURLs hash
76
+ def deduce_url_type
77
+ TypesOfURLs.detect{|type| type[:regex].match(@url)}
78
+ end
79
+
80
+ # Find the requested URL out of the text block received
81
+ def requested_url
82
+ link = case @text
83
+ when URL then URL.match(@text)[1]
84
+ when AJAXURL then AJAXURL.match(@text)[1]
85
+ else raise RestfulAcl::UnrecognizedURLError, "'#{@text}' doesn't seem to contain a valid URL?"
86
+ end
87
+ end
88
+
89
+ # Deduce the requested action based on URL type
90
+ # (or text block as :destroy links are defined via javascript)
91
+ def requested_action(controller_name)
92
+ return "destroy" if @text =~ DestroyURL
93
+
94
+ case @url
95
+ when EditURL then "edit"
96
+ when NewURL then "new"
97
+ when ObjectURL || controller_name.singular? then "show"
98
+ else "index"
99
+ end
100
+ end
101
+
102
+ end
data/lib/restful_acl.rb CHANGED
@@ -1,3 +1,7 @@
1
+ require 'restful_acl/string'
2
+ require 'restful_acl/url_parser'
3
+ require 'restful_acl/base'
1
4
  require 'restful_acl/controller'
2
5
  require 'restful_acl/helper'
3
6
  require 'restful_acl/model'
7
+ require 'restful_acl/errors'
data/rails/init.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'restful_acl'
2
2
 
3
- ActionController::Base.send :include, RestfulAclController
4
- ActionView::Base.send :include, RestfulAclHelper
5
- ActiveRecord::Base.send :include, RestfulAclModel
3
+ ActionController::Base.send :include, RestfulAcl::Controller
4
+ ActionView::Base.send :include, RestfulAcl::Helper
5
+ ActiveRecord::Base.send :include, RestfulAcl::Model
6
6
 
7
7
  RAILS_DEFAULT_LOGGER.debug "** [RESTful_ACL] loaded"
data/restful_acl.gemspec CHANGED
@@ -5,28 +5,34 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{restful_acl}
8
- s.version = "2.1.3"
8
+ s.version = "3.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Matt Darby"]
12
- s.date = %q{2009-11-24}
12
+ s.date = %q{2009-11-28}
13
13
  s.description = %q{A Ruby on Rails plugin that provides fine grained access control to RESTful resources.}
14
14
  s.email = %q{matt@matt-darby.com}
15
15
  s.extra_rdoc_files = [
16
16
  "README.textile"
17
17
  ]
18
18
  s.files = [
19
- "MIT-LICENSE",
19
+ ".gitignore",
20
+ "MIT-LICENSE",
20
21
  "README.textile",
21
22
  "Rakefile",
22
23
  "VERSION",
23
24
  "init.rb",
24
25
  "lib/restful_acl.rb",
26
+ "lib/restful_acl/base.rb",
25
27
  "lib/restful_acl/controller.rb",
28
+ "lib/restful_acl/errors.rb",
26
29
  "lib/restful_acl/helper.rb",
27
30
  "lib/restful_acl/model.rb",
31
+ "lib/restful_acl/string.rb",
32
+ "lib/restful_acl/url_parser.rb",
28
33
  "rails/init.rb",
29
34
  "restful_acl.gemspec",
35
+ "spec/spec_helper.rb",
30
36
  "uninstall.rb"
31
37
  ]
32
38
  s.homepage = %q{http://github.com/mdarby/restful_acl}
@@ -34,6 +40,9 @@ Gem::Specification.new do |s|
34
40
  s.require_paths = ["lib"]
35
41
  s.rubygems_version = %q{1.3.5}
36
42
  s.summary = %q{A Ruby on Rails plugin that provides fine grained access control to RESTful resources.}
43
+ s.test_files = [
44
+ "spec/spec_helper.rb"
45
+ ]
37
46
 
38
47
  if s.respond_to? :specification_version then
39
48
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'restful_acl'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+ require 'rubygems'
7
+ require 'activesupport'
8
+
9
+ Spec::Runner.configure do |config|
10
+
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restful_acl
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.3
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Darby
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-24 00:00:00 -05:00
12
+ date: 2009-11-28 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -31,17 +31,23 @@ extensions: []
31
31
  extra_rdoc_files:
32
32
  - README.textile
33
33
  files:
34
+ - .gitignore
34
35
  - MIT-LICENSE
35
36
  - README.textile
36
37
  - Rakefile
37
38
  - VERSION
38
39
  - init.rb
39
40
  - lib/restful_acl.rb
41
+ - lib/restful_acl/base.rb
40
42
  - lib/restful_acl/controller.rb
43
+ - lib/restful_acl/errors.rb
41
44
  - lib/restful_acl/helper.rb
42
45
  - lib/restful_acl/model.rb
46
+ - lib/restful_acl/string.rb
47
+ - lib/restful_acl/url_parser.rb
43
48
  - rails/init.rb
44
49
  - restful_acl.gemspec
50
+ - spec/spec_helper.rb
45
51
  - uninstall.rb
46
52
  has_rdoc: true
47
53
  homepage: http://github.com/mdarby/restful_acl
@@ -71,5 +77,5 @@ rubygems_version: 1.3.5
71
77
  signing_key:
72
78
  specification_version: 3
73
79
  summary: A Ruby on Rails plugin that provides fine grained access control to RESTful resources.
74
- test_files: []
75
-
80
+ test_files:
81
+ - spec/spec_helper.rb