thwart 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -20,5 +20,6 @@ tmtags
20
20
  coverage
21
21
  rdoc
22
22
  pkg
23
+ .bundle
23
24
 
24
25
  ## PROJECT::SPECIFIC
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source :gemcutter
2
+ gem "activesupport", "~> 3.0.rc1"
3
+ gem "i18n"
4
+ group :development do
5
+ gem 'rspec', '~> 2.0.0.beta.20'
6
+ end
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
-
3
+ require 'bundler'
4
4
  begin
5
5
  require 'jeweler'
6
6
  Jeweler::Tasks.new do |gem|
@@ -10,8 +10,7 @@ begin
10
10
  gem.email = "harry@skylightlabs.ca"
11
11
  gem.homepage = "http://github.com/hornairs/thwart"
12
12
  gem.authors = ["Harry Brundage"]
13
- gem.add_development_dependency "rspec", ">= 2.0.0.beta19"
14
- gem.add_dependency "activesupport", ">= 3.0.rc1"
13
+ gem.add_bundler_dependencies
15
14
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
15
  end
17
16
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.4
@@ -1,4 +1,5 @@
1
1
  require 'active_support'
2
+ require 'active_support/ruby/shim'
2
3
  require 'active_support/callbacks'
3
4
  require 'active_support/core_ext/module/attribute_accessors'
4
5
  require "active_support/core_ext/module/delegation"
@@ -30,23 +31,23 @@ module Thwart
30
31
  # autoload :Dsl, 'thwart/dsl'
31
32
 
32
33
  # The default can => able methods for CRUD
33
- CrudActions = {:create => :creatable, :show => :shoew, :update => :updatable, :destroy => :destroyable}
34
+ CrudActions = {:create => :creatable, :show => :showable, :update => :updatable, :destroy => :destroyable}
34
35
 
35
36
  Actions = ActionsStore.new
37
+ Actionables = ActionGroupBuilder.new(Actions)
36
38
  Roles = RoleRegistry.new
37
39
 
38
40
  class << self
39
- attr_reader :actionables_dsl, :role_dsl
40
- attr_accessor :default_query_response, :role_registry, :actor_must_play_role, :all_classes_are_resources
41
+ attr_reader :role_dsl
42
+ attr_accessor :default_query_response, :role_registry, :actor_must_play_role, :all_classes_are_resources, :log_query_path, :last_query_path
41
43
  delegate :create_action, :to => "Thwart::Actions"
42
- delegate :create_action_group, :to => :actionables_dsl
44
+ delegate :create_action_group, :to => "Thwart::Actionables"
43
45
  delegate :create_role, :to => :role_dsl
44
46
  delegate :query, :to => "Thwart::Roles"
45
47
 
46
48
  def configure(&block)
47
49
  # Create builder DSLs for this configuration block
48
- @actionables_dsl = ActionGroupBuilder.new(Actions)
49
- @role_dsl = RoleBuilder.new(@actionables_dsl)
50
+ @role_dsl = RoleBuilder.new(Actionables)
50
51
  Roles.monitor_builder(@role_dsl)
51
52
 
52
53
  # Configure
@@ -55,13 +56,15 @@ module Thwart
55
56
  dsl.evaluate(self, &block)
56
57
 
57
58
  # Unset and stop monitoring builder DSLs so they can be GC'd
58
- @actionables_dsl = nil
59
59
  @role_dsl = nil
60
60
  Roles.monitor_builder(nil)
61
61
  self
62
62
  end
63
63
  end
64
+ self.log_query_path = false
64
65
 
65
66
  class MissingAttributeError < StandardError; end
66
67
  class NoPermissionError < StandardError; end
67
- end
68
+ end
69
+
70
+ require 'thwart/rails' if defined?(Rails)
@@ -37,7 +37,6 @@ module Thwart
37
37
 
38
38
  return name.map{|n| resolve_action_group(n)}.flatten.uniq if name.respond_to?(:map)
39
39
  return self.actionables[name].flatten.uniq if self.actionables.include?(name)
40
- puts self.actionables
41
40
  raise Thwart::ActionOrGroupNotFoundError, "Action or group #{name} could not be found!"
42
41
  end
43
42
 
@@ -29,7 +29,8 @@ module Thwart
29
29
  #
30
30
  # @param [Symbol] able_method The name of the [action-able]_by? method.
31
31
  def can_from_able(able)
32
- self.actions.key(able.to_sym)
32
+ pair = self.actions.find {|k, v| v == able}
33
+ pair.first if pair
33
34
  end
34
35
 
35
36
  # Adds an action to actions and the correct methods to can and able modules.
@@ -2,12 +2,12 @@ module Thwart
2
2
  # Module in which the can_[action]? methods hang out
3
3
  module Cans
4
4
 
5
- def respond_to?(name)
6
- return true if Thwart::Actions.find_can(name) != false
5
+ def respond_to?(*args)
6
+ return true if Thwart::Actions.find_can(args.first) != false
7
7
  super
8
8
  end
9
9
 
10
- def method_missing(name, *args)
10
+ def method_missing(name, *args, &block)
11
11
  can = Thwart::Actions.find_can(name)
12
12
  return Thwart.query(self, args.first, can) if args.length == 1 && !!can
13
13
  super
@@ -16,12 +16,12 @@ module Thwart
16
16
 
17
17
  # Module in which the [action]able_by? methods hang out
18
18
  module Ables
19
- def respond_to?(name)
20
- return true if Thwart::Actions.find_able(name) != false
19
+ def respond_to?(*args)
20
+ return true if Thwart::Actions.find_able(args.first) != false
21
21
  super
22
22
  end
23
23
 
24
- def method_missing(name, *args)
24
+ def method_missing(name, *args, &block)
25
25
  able = Thwart::Actions.find_able(name)
26
26
  return Thwart.query(args.first, self, Thwart::Actions.can_from_able(able)) if args.length == 1 && !!able
27
27
  super
@@ -13,16 +13,15 @@ module Thwart
13
13
  def evaluate(a_target, &block)
14
14
  self.target = a_target
15
15
  self.method_map = target.public_methods.inject({}) do |acc, m|
16
- key = m.to_s.gsub("=", "").intern
16
+ key = m.to_s.gsub(/=$/, "").to_sym
17
17
  acc[key] = m if acc[key].nil? || m != key
18
18
  acc
19
19
  end.merge(self.extra_methods)
20
-
21
20
  self.instance_eval(&block)
22
21
  self.target
23
22
  end
24
23
 
25
- def respond_to?(name)
24
+ def respond_to?(name, other = false)
26
25
  if @all
27
26
  return target.respond_to?(name)
28
27
  else
@@ -1,12 +1,17 @@
1
1
  module Thwart
2
2
  module Enforcer
3
- def thwart_access(resource)
3
+ def thwart_access(resource, action = nil)
4
+ if action.blank?
5
+ raise ArgumentError, "thwart_access needs an action or the params hash to have an [:action] to enforce." if !self.respond_to?(:params) || !self.params.respond_to?(:[]) || self.params[:action].nil?
6
+ action = params[:action]
7
+ end
8
+ action = action.to_sym
4
9
  raise ArgumentError, "Thwart needs a current_user method to enforce permissions." unless self.respond_to?(:current_user)
5
- raise ArgumentError, "Thwart needs the params hash to have an [:action] to enforce." if params.nil? || params[:action].nil?
6
- raise ArgumentError, "Unknown action #{params[:action]} to enforce" unless Thwart::Actions.has_can?(params[:action])
10
+
11
+ raise ArgumentError, "Unknown action #{action} to enforce" unless Thwart::Actions.has_can?(action)
7
12
 
8
- unless Thwart.query(current_user, resource, params[:action])
9
- raise Thwart::NoPermissionError, "User #{current_user} doesn't have permission to #{params[:action]} #{resource}."
13
+ unless Thwart.query(current_user, resource, action)
14
+ raise Thwart::NoPermissionError, "User #{current_user} doesn't have permission to #{action} #{resource}."
10
15
  else
11
16
  true
12
17
  end
@@ -0,0 +1,5 @@
1
+ require 'thwart'
2
+ class ActiveRecord::Base
3
+ include Thwart::Resource
4
+ end
5
+ Thwart::Actions.add_crud!
@@ -6,11 +6,20 @@ module Thwart::Resource
6
6
  base.extend ClassMethods
7
7
  end
8
8
 
9
+ def thwart_name
10
+ self.class.thwart_name
11
+ end
12
+
9
13
  module ClassMethods
10
14
  attr_accessor :thwart_name
11
15
 
16
+ def thwart_name
17
+ return nil unless @thwarted
18
+ return @thwart_name unless @thwart_name.nil?
19
+ ActiveSupport::Inflector.singularize(self.table_name).to_sym if self.respond_to?(:table_name)
20
+ end
12
21
  def thwart_access(&block)
13
- self.thwart_name = ActiveSupport::Inflector.singularize(self.table_name) if self.respond_to?(:table_name)
22
+ @thwarted = true
14
23
 
15
24
  # Set up DSL using dsl helper
16
25
  if block_given?
@@ -21,10 +21,9 @@ module Thwart
21
21
  def query(actor, resource, action)
22
22
  @query_result_found = false
23
23
  resp = nil
24
-
25
24
  if self.responses.has_key?(action)
26
25
  # Find the resource scope response if it exists {:view => {:foo => bool}}
27
- resp = self.resource_response(self.responses[action], resource) if !found?
26
+ resp = self.resource_response(self.responses[action], self.find_resource_name(resource)) if !found?
28
27
  # Find the action scope response if it exists {:view => bool}
29
28
  resp = self.action_response(action) if !found?
30
29
  end
@@ -34,14 +33,14 @@ module Thwart
34
33
  # Call it if it is a proc
35
34
  resp = resp.call(actor, resource, action) if resp.respond_to?(:call)
36
35
 
37
- return resp
36
+ resp
38
37
  end
39
38
 
40
- def resource_response(resources, resource)
39
+ def resource_response(resources, name)
41
40
  # Return the resource scoped response if it exists
42
41
  if resources.respond_to?(:[]) && resources.respond_to?(:include?)
43
- if resources.include?(resource)
44
- return found!(resources[resource])
42
+ if resources.include?(name)
43
+ return found!(resources[name])
45
44
  elsif resources.include?(:_other)
46
45
  return found!(resources[:_other])
47
46
  end
@@ -58,6 +57,17 @@ module Thwart
58
57
  nil
59
58
  end
60
59
 
60
+ def find_resource_name(resource)
61
+ return resource if resource.is_a?(Symbol)
62
+ r ||= resource.thwart_name if resource.respond_to?(:thwart_name)
63
+ if resource.class != Class
64
+ r ||= resource.class.thwart_name if resource.class.respond_to?(:thwart_name)
65
+ r ||= resource.class.name.downcase if Thwart.all_classes_are_resources
66
+ end
67
+ r = r.to_sym if r.respond_to?(:to_sym)
68
+ r
69
+ end
70
+
61
71
  private
62
72
 
63
73
  def found!(response)
@@ -95,7 +95,7 @@ module Thwart
95
95
  @current_response = old
96
96
  end
97
97
 
98
- def respond_to?(name)
98
+ def respond_to?(name, other = false)
99
99
  return true if self.actionables.has_key?(name)
100
100
  super
101
101
  end
@@ -13,19 +13,36 @@ module Thwart
13
13
  @roles << role
14
14
  end
15
15
 
16
- def query(actor, resource, action)
16
+ def query(actor, resource, action)
17
17
  role = self.find_actor_role(actor)
18
- resource = self.find_resource_identifier(resource)
18
+ if Thwart.log_query_path
19
+ Thwart.last_query_path = []
20
+ Thwart.last_query_path.push({:actor => actor, :resource => resource, :action => action})
21
+ name = resource.thwart_name if resource.respond_to?(:thwart_name)
22
+ name ||= resource
23
+ Thwart.last_query_path.push({:actor_role => role.name, :resource_name => resource})
24
+ end
25
+
19
26
  if role.nil? || !self.has_role?(role)
20
27
  raise MissingRoleError, "Role #{role} could not be found in the registry!" if Thwart.actor_must_play_role
21
28
  else
22
29
  q = [role]
23
30
  while r = q.shift
24
31
  resp = r.query(actor, resource, action)
25
- if resp != nil
32
+
33
+ if Thwart.log_query_path
34
+ Thwart.last_query_path.push("Querying #{r.name}")
35
+ Thwart.last_query_path.push(r)
36
+ Thwart.last_query_path.push("Response: #{resp}")
37
+ end
38
+
39
+ if resp != nil
26
40
  return resp # positive/negative response from the role, a rule governs the role on this query
27
41
  else
28
- q = q | r.parents # add this roles parents to the query queue
42
+ q = q | r.parents.map do |a|
43
+ a = self.find_role(a) if a.is_a?(Symbol)
44
+ a
45
+ end # add this roles parents to the query queue
29
46
  end
30
47
  end
31
48
  end
@@ -39,19 +56,8 @@ module Thwart
39
56
 
40
57
  def find_actor_role(actor)
41
58
  r = actor.thwart_role if actor.respond_to?(:thwart_role)
42
- r ||= r.to_sym if r.respond_to?(:to_sym)
43
- if r.is_a?(Symbol)
44
- r = self.roles.find {|a| a.name == r}
45
- end
46
- r
47
- end
48
-
49
- def find_resource_identifier(resource)
50
- r ||= resource.thwart_name if resource.respond_to?(:thwart_name)
51
- if resource.class != Class
52
- r ||= resource.class.thwart_name if resource.class.respond_to?(:thwart_name)
53
- r ||= resource.class.name.downcase.to_sym if Thwart.all_classes_are_resources
54
- end
59
+ r = r.to_sym if r.respond_to?(:to_sym)
60
+ r = find_role(r) if r.is_a?(Symbol)
55
61
  r
56
62
  end
57
63
 
@@ -71,5 +77,9 @@ module Thwart
71
77
  end
72
78
  @role_creator = role_creator
73
79
  end
80
+
81
+ def find_role(name)
82
+ self.roles.find {|a| a.name == name}
83
+ end
74
84
  end
75
85
  end
@@ -50,13 +50,13 @@ describe Thwart::ActionsStore do
50
50
  it "should have C for create" do
51
51
  @actions.has_can?(:create).should == true
52
52
  end
53
- it "should have R for ...er... view" do
54
- @actions.has_can?(:view).should == true
53
+ it "should have R for .. er ... show" do
54
+ @actions.has_can?(:show).should == true
55
55
  end
56
56
  it "should have U for update" do
57
57
  @actions.has_can?(:update).should == true
58
58
  end
59
- it "should have D for delete" do
59
+ it "should have D for destroy" do
60
60
  @actions.has_can?(:destroy).should == true
61
61
  end
62
62
  end
@@ -45,7 +45,7 @@ describe Thwart::Dsl do
45
45
  describe "with method_missing defined on the target" do
46
46
  before do
47
47
  target_class = Class.new do
48
- def respond_to?(name)
48
+ def respond_to?(name, other = false)
49
49
  return true if [:test1, :test2].include?(name)
50
50
  super
51
51
  end
@@ -1,17 +1,45 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
-
3
+ def enforced_controller(&block)
4
+ class_with_module(Thwart::Enforcer, &block)
5
+ end
4
6
  describe Thwart::Enforcer do
7
+ before do
8
+ Thwart::Actions.stub(:has_can? => true)
9
+ @controller_klass = enforced_controller do
10
+ def current_user
11
+ :user
12
+ end
13
+ end
14
+ @r = double("resource")
15
+ end
16
+
5
17
  context "access enforcment" do
6
18
  it "should need the current user method defined on the controller" do
7
- lambda { instance_with_module(Thwart::Enforcer).thwart_access }.should raise_error(ArgumentError)
19
+ lambda { enforced_controller.new.thwart_access }.should raise_error(ArgumentError)
20
+ end
21
+ it "should need either the params hash or be passed action key" do
22
+ i = @controller_klass.new
23
+ lambda { i.thwart_access(@r) }.should raise_error(ArgumentError)
24
+ lambda { i.thwart_access(@r, :some_action) }.should_not raise_error(ArgumentError)
25
+
26
+ i2 = @controller_klass.new
27
+ i2.should_receive(:params).at_least(:once).and_return({:action => :an_action})
28
+ lambda { i2.thwart_access(@r) }.should_not raise_error(ArgumentError)
29
+ end
30
+
31
+ it "should thwart access by raising an error if the user doesn't have permission" do
32
+ Thwart.stub(:query => false)
33
+ lambda { @controller_klass.new.thwart_access(@r, :an_action) }.should raise_error(Thwart::NoPermissionError)
34
+ end
35
+ it "should return true if the user does have permission" do
36
+ Thwart.stub(:query => true)
37
+ lambda { @controller_klass.new.thwart_access(@r, :an_action) }.should_not raise_error(Thwart::NoPermissionError)
8
38
  end
9
- it "should need the params hash to have an action key" do
10
- class_with_module(Thwart::Enforcer)
11
- lambda { @controller.thwart_access }.should raise_error(ArgumentError)
39
+ it "should convert string actions" do
40
+ Thwart.stub(:query => true)
41
+ lambda { @controller_klass.new.thwart_access(@r, "an_action") }.should_not raise_error(Thwart::NoPermissionError)
12
42
  end
13
- it "should need the params[:actions] to be a recognized action"
14
- it "should thwart access by raising an error if the user doesn't have permission"
15
- it "should return true if the user does have permission"
43
+
16
44
  end
17
45
  end
@@ -11,7 +11,7 @@ describe Thwart::Resource do
11
11
  end
12
12
 
13
13
  it "should have set its own name" do
14
- @resource.class.thwart_name.should == "generic"
14
+ @resource.class.thwart_name.should == :generic
15
15
  end
16
16
  end
17
17
 
@@ -49,35 +49,15 @@ describe Thwart::RoleRegistry do
49
49
  actor = double("Actor", :thwart_role => :role1)
50
50
  @registry.find_actor_role(actor).should == @role
51
51
  end
52
+ it "should convert strings to roles" do
53
+ actor = double("Actor", :thwart_role => "role1")
54
+ @registry.find_actor_role(actor).should == @role
55
+ end
52
56
  it "should find nil for symbols pointing to non registered roles " do
53
57
  actor = double("Actor", :thwart_role => :role2)
54
58
  @registry.find_actor_role(actor).should == nil
55
59
  end
56
60
  end
57
- context "resource finding" do
58
- it "should find nil for nil" do
59
- @registry.find_resource_identifier(nil).should == nil
60
- end
61
- it "should find using the thwart_name attribute" do
62
- resource = double("Resource", :thwart_name => :balls)
63
- @registry.find_resource_identifier(resource).should == :balls
64
- end
65
- it "should find using the class thwart_name attribute" do
66
- klass = Class.new do
67
- def thwart_name
68
- :balls
69
- end
70
- end
71
- @registry.find_resource_identifier(klass.new).should == :balls
72
- end
73
- it "should find using the class name if the gem wide setting is set" do
74
- Thwart.all_classes_are_resources = true
75
- class Bollocks; end
76
- @registry.find_resource_identifier(Bollocks.new).should == :bollocks
77
- Thwart.all_classes_are_resources = false
78
- end
79
-
80
- end
81
61
  context "querying" do
82
62
  it "should return the default if the role can't be found and the gem wide setting is set" do
83
63
  Thwart.actor_must_play_role = false
@@ -110,6 +90,14 @@ describe Thwart::RoleRegistry do
110
90
  @registry.query(actor_with_role(@role1), nil, nil).should == false
111
91
  end
112
92
 
93
+ it "should log the query path if the gem wide setting is set" do
94
+ Thwart.stub(:log_query_path => true)
95
+ a = actor_with_role(@role1)
96
+ @registry.query(a, nil, nil)
97
+ Thwart.last_query_path.should == [
98
+ {:actor => a, :resource => nil, :action => nil}, {:actor_role => :role1, :resource_name => nil}, "Querying role1", @role1, "Response: false"]
99
+ end
100
+
113
101
  it "should query the parents in a breadth first order if the role query is unsuccessful" do
114
102
  @role3.should_receive(:parents)
115
103
  @registry.query(actor_with_role(@role3), nil, nil).should == true # this ensures role2 is checked before role1
@@ -24,7 +24,32 @@ describe Thwart::Role do
24
24
  @role.parents += [:a, :c]
25
25
  @role.parents.should == [:a, :b, :c]
26
26
  end
27
-
27
+ context "resource finding" do
28
+ before do
29
+ @role = instance_with_role_definition
30
+ end
31
+ it "should find nil for nil" do
32
+ @role.find_resource_name(nil).should == nil
33
+ end
34
+ it "should find using the thwart_name attribute" do
35
+ resource = double("Resource", :thwart_name => :balls)
36
+ @role.find_resource_name(resource).should == :balls
37
+ end
38
+ it "should find using the class thwart_name attribute" do
39
+ klass = Class.new do
40
+ def thwart_name
41
+ "balls"
42
+ end
43
+ end
44
+ @role.find_resource_name(klass.new).should == :balls
45
+ end
46
+ it "should find using the class name if the gem wide setting is set" do
47
+ Thwart.all_classes_are_resources = true
48
+ class Bollocks; end
49
+ @role.find_resource_name(Bollocks.new).should == :bollocks
50
+ Thwart.all_classes_are_resources = false
51
+ end
52
+ end
28
53
  context "with simple responses set" do
29
54
  before do
30
55
  @role = instance_with_role_definition do
@@ -1,3 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+
1
5
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
6
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
7
  require 'thwart'
@@ -32,14 +36,16 @@ def generic_model(name=nil, &block)
32
36
  klass
33
37
  end
34
38
 
35
- def class_with_module(mod)
36
- Class.new do
39
+ def class_with_module(mod, &block)
40
+ klass = Class.new do
37
41
  include mod
38
42
  end
43
+ klass.class_eval(&block) if block_given?
44
+ klass
39
45
  end
40
46
 
41
- def instance_with_module(mod)
42
- class_with_module(mod).new
47
+ def instance_with_module(mod, &block)
48
+ class_with_module(mod, &block).new
43
49
  end
44
50
 
45
51
  def instance_with_role_definition(&block)
@@ -45,10 +45,8 @@ describe Thwart do
45
45
  end
46
46
  end
47
47
  it "should create new action groups" do
48
- actionables = double("actionables")
49
- Thwart::ActionGroupBuilder.should_receive(:new).and_return(actionables)
50
- actionables.should_receive(:create_action_group).with(:manage)
51
- actionables.should_receive(:create_action_group).with(:inspect, [])
48
+ Thwart::Actionables.should_receive(:create_action_group).with(:manage)
49
+ Thwart::Actionables.should_receive(:create_action_group).with(:inspect, [])
52
50
  Thwart.configure do
53
51
  action_group :manage
54
52
  action_group :inspect, []
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{thwart}
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Harry Brundage"]
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".gitignore",
22
+ "Gemfile",
22
23
  "LICENSE",
23
24
  "README.rdoc",
24
25
  "Rakefile",
@@ -33,6 +34,7 @@ Gem::Specification.new do |s|
33
34
  "lib/thwart/canable.rb",
34
35
  "lib/thwart/dsl.rb",
35
36
  "lib/thwart/enforcer.rb",
37
+ "lib/thwart/rails.rb",
36
38
  "lib/thwart/resource.rb",
37
39
  "lib/thwart/role.rb",
38
40
  "lib/thwart/role_builder.rb",
@@ -70,8 +72,7 @@ Gem::Specification.new do |s|
70
72
  "spec/spec_helper.rb",
71
73
  "spec/thwart_spec.rb",
72
74
  "examples/a_complete_example.rb",
73
- "examples/example_helper.rb",
74
- "examples/testing.rb"
75
+ "examples/example_helper.rb"
75
76
  ]
76
77
 
77
78
  if s.respond_to? :specification_version then
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thwart
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Harry Brundage
@@ -78,6 +78,7 @@ extra_rdoc_files:
78
78
  files:
79
79
  - .document
80
80
  - .gitignore
81
+ - Gemfile
81
82
  - LICENSE
82
83
  - README.rdoc
83
84
  - Rakefile
@@ -92,6 +93,7 @@ files:
92
93
  - lib/thwart/canable.rb
93
94
  - lib/thwart/dsl.rb
94
95
  - lib/thwart/enforcer.rb
96
+ - lib/thwart/rails.rb
95
97
  - lib/thwart/resource.rb
96
98
  - lib/thwart/role.rb
97
99
  - lib/thwart/role_builder.rb
@@ -109,7 +111,6 @@ files:
109
111
  - spec/spec_helper.rb
110
112
  - spec/thwart_spec.rb
111
113
  - thwart.gemspec
112
- - examples/testing.rb
113
114
  has_rdoc: true
114
115
  homepage: http://github.com/hornairs/thwart
115
116
  licenses: []
@@ -159,4 +160,3 @@ test_files:
159
160
  - spec/thwart_spec.rb
160
161
  - examples/a_complete_example.rb
161
162
  - examples/example_helper.rb
162
- - examples/testing.rb
@@ -1,21 +0,0 @@
1
- #require File.expand_path(File.dirname(__FILE__) + '/example_helper')
2
-
3
-
4
- class User
5
- # include Thwart::Actor
6
- # thwart_access do
7
- # role_method :role
8
- # end
9
- attr_accessor :name, :role
10
- def initialize(n, r)
11
- self.name = n
12
- self.role = r
13
- end
14
- end
15
- user = User.new('Bob', :employee)
16
- map = user.public_methods.inject({}) do |acc, m|
17
- debugger if m.to_s.gsub(/=$/, "") == ""
18
- key = m.to_s.gsub(/=$/, "").to_sym
19
- acc[key] = m if acc[key].nil? || m != key
20
- acc
21
- end