kojac 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YjYzYzc3ZjM3NmE1ODk3MDE0NDg0MTMwODA0MmUyOGM0OWRkNjY5YQ==
5
- data.tar.gz: !binary |-
6
- MGQzZDFmYzc4MjUzY2I1MTcwMWI3ODNlZTc1OTQ3YWMzNzk1ZmNlYQ==
2
+ SHA1:
3
+ metadata.gz: e697fc52a995658f75cf2064bfdb2fe1b1d4d280
4
+ data.tar.gz: 15edfaca5fd47b4d860ae74382d12ea761f84a4a
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MDEzMDliZTE1YzIwY2FmZTQwMGJlYWUzODA1YjUyNGYzYzA0N2U5M2U4YjAw
10
- MjA2MTM3ODhiNjQzZmIwOWZmOTU1NGIwNTQwZjFkYmFiOWViYjQ1Njc1M2Fj
11
- ODcxYWM4MGQzMzE5NTBkYWY4ZWRkZmJlNGQwNWNjMTkyZjA1YWM=
12
- data.tar.gz: !binary |-
13
- YzJlNTE1YTdhNmM3MmZkMTJjZjliZWRiY2Y5ZWMwODdlOGFkZDQ3OTRlMzY1
14
- NjU1ZGQ4ZDM5YWVjMjc3OTY2YzJhNzk1NTAwYWY1YWIyMGZiZjg3ZjcxMTRm
15
- MGRkM2ZhZTQ5ZWNlNWE1ZjlkNTM1MWY1MmIzMGIxNjVjMzhmMDA=
6
+ metadata.gz: 6e0fd6b7d3a30b9ddce381f2c8c4ea477bc7bceeb9df2d6e1f57f8974eda3f33e76c71fb9ce5292788ad28044b8359f10fd1bda2689e0253a89f81568e9c6bc4
7
+ data.tar.gz: b69cab1d039380b960f25ee761df2b1cdb389090e7e51053c84cbe9896ac45d5721e20a4504fb6079368c1f45503dde681a9c684c93a043d2c9923d3f017f117
@@ -1,16 +1,9 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/kojac_front_methods.rb')
2
2
 
3
- class KojacBaseController < ApplicationController
3
+ class KojacBaseController < ActionController::Base
4
4
 
5
5
  include KojacFrontMethods
6
6
  respond_to :json
7
- protect_from_forgery :only => []
8
-
9
- protected
10
-
11
- def kojac_current_user
12
- current_user
13
- end
14
7
 
15
8
  public
16
9
 
@@ -2,6 +2,14 @@ module KojacFrontMethods
2
2
 
3
3
  protected
4
4
 
5
+ def unauthorized!(aMessage=nil)
6
+ raise aMessage || "You are not authorized to perform this action"
7
+ end
8
+
9
+ def kojac_current_user
10
+ current_user
11
+ end
12
+
5
13
  def process_ops(aInput)
6
14
  result = {}
7
15
  if ops = aInput[:ops]
@@ -10,10 +10,6 @@ class KojacMetalController < ActionController::Metal
10
10
  @current_user ||= env['warden'].user #User.find_by(id: session[:user])
11
11
  end
12
12
 
13
- def kojac_current_user
14
- current_user
15
- end
16
-
17
13
  public
18
14
 
19
15
  def index
@@ -1,4 +1,7 @@
1
1
  class KojacBasePolicy
2
+
3
+ class_attribute :filters
4
+
2
5
  attr_reader :user, :record, :op
3
6
 
4
7
  def initialize(user, record, op=nil)
@@ -12,103 +15,140 @@ class KojacBasePolicy
12
15
  raise Pundit::NotAuthorizedError, aMessage||"You are not authorized to perform this action"
13
16
  end
14
17
 
15
- #def self.write_op_filter(aCurrentUser,aSafeFields,aSourceFields)
16
- # ring = aCurrentUser.ring
17
- # has_owner = !!self.column_names.include?('owner_id')
18
- # has_dealership = !!self.column_names.include?('dealership_id')
19
- # # default to user
20
- # if ring <= SALES_RING
21
- # aSafeFields['owner_id'] ||= aCurrentUser.owner_id if has_owner
22
- # aSafeFields['dealership_id'] ||= aCurrentUser.dealership_id if has_dealership
23
- # end
24
- # if ring > SYSADMIN_RING
25
- # unauthorized! if aSafeFields['owner_id'] != aCurrentUser.owner_id if has_owner
26
- # end
27
- # if ring > OWNER_ADMIN_RING
28
- # unauthorized! if aSafeFields['dealership_id'] != aCurrentUser.dealership_id if has_dealership
29
- # end
30
- #end
18
+ def self.ability_from_op(aOp)
19
+ return nil unless aOp
20
+ case aOp[:verb]
21
+ when 'CREATE'
22
+ when 'UPDATE'
23
+ :write
24
+ when 'READ'
25
+ :read
26
+ when 'ADD'
27
+ :add
28
+ when 'REMOVE'
29
+ :remove
30
+ when 'CREATE_ON'
31
+ :create_on
32
+ end
33
+ end
34
+
35
+ def self.allow_filter(aOptions=nil,&block)
36
+ aOptions = {all: true} if !aOptions
37
+ if rings = aOptions[:ring]
38
+ rings = [rings] unless rings.is_a? Array
39
+ aOptions[:ring] = rings.map {|r| Concentric.lookup_ring(r) }
40
+ end
41
+ if abilities = aOptions[:ability]
42
+ aOptions[:ability] = [abilities] unless abilities.is_a? Array
43
+ end
44
+ if block
45
+ self.filters ||= []
46
+ self.filters += [[aOptions,block]] # double brackets necessary to add an array into the array
47
+ end
48
+ end
31
49
 
32
50
  def query_ring
33
51
  user.ring
34
52
  end
35
53
 
54
+ def apply_filters(aResult, aAbility)
55
+ if self.class.filters
56
+ self.class.filters.each do |f|
57
+ options, handler = f
58
+ unless options[:all]
59
+ if rings = options[:ring]
60
+ next unless rings.include? query_ring
61
+ end
62
+ if abilities = options[:ability]
63
+ next unless abilities.include? aAbility
64
+ end
65
+ end
66
+ aResult = handler.call(self, aResult.clone, query_ring, aAbility)
67
+ end
68
+ aResult.uniq!
69
+ aResult.sort!
70
+ end
71
+ aResult
72
+ end
73
+
74
+ def inner_query_fields(aAbility)
75
+ cls = record.is_a?(Class) ? record : record.class
76
+ result = cls.permitted(query_ring,aAbility)
77
+ result = apply_filters(result, aAbility)
78
+ result
79
+ end
80
+
81
+ def inner_query_record(aAbility)
82
+ inner_query_fields(aAbility).length > 0
83
+ end
84
+
85
+ def permitted_attributes(aAbility=nil)
86
+ #raise "Ability from op no longer supported" if !aAbility && @op && @op[:verb]
87
+ aAbility ||= self.class.ability_from_op(@op)
88
+ raise "ability not given" unless aAbility
89
+ fields = inner_query_fields(aAbility)
90
+
91
+ #cls = record.is_a?(Class) ? record : record.class
92
+ #fields = cls.permitted(query_ring,aAbility)
93
+ #result = apply_filters(fields,aAbility)
94
+ fields
95
+ end
96
+
97
+ def permitted_fields(aAbility=nil)
98
+ result = permitted_attributes(aAbility)
99
+ cls = record.is_a?(Class) ? record : record.class
100
+ result.delete_if { |f| cls.reflections.has_key? f }
101
+ result
102
+ end
103
+
104
+ def permitted_associations(aAbility=nil)
105
+ result = permitted_attributes(aAbility)
106
+ cls = record.is_a?(Class) ? record : record.class
107
+ result.delete_if { |f| !cls.reflections.has_key? f }
108
+ result
109
+ end
110
+
36
111
  # kojac methods
112
+ def create?
113
+ inner_query_record(:create)
114
+ end
115
+
37
116
  def read?
38
- record.class.ring_can?(query_ring,:read)
117
+ inner_query_record(:read)
39
118
  end
40
119
 
41
120
  def write?
42
- record.class.ring_can?(query_ring,:write)
121
+ inner_query_record(:write)
122
+ end
123
+
124
+ def destroy?
125
+ inner_query_record(:destroy)
43
126
  end
44
127
 
45
128
  # rails methods
46
129
  def index?
47
- record.class.ring_can?(query_ring,:read)
130
+ inner_query_record(:read)
48
131
  end
49
132
 
50
133
  def show?
51
- record.class.ring_can?(query_ring,:read)
52
- end
53
-
54
- def create?
55
- record.class.ring_can?(query_ring,:create)
134
+ inner_query_record(:read)
56
135
  end
57
136
 
58
137
  def new?
59
- record.class.ring_can?(query_ring,:create)
138
+ inner_query_record(:create)
60
139
  end
61
140
 
62
141
  def update?
63
- record.class.ring_can?(query_ring,:write)
142
+ inner_query_record(:write)
64
143
  end
65
144
 
66
145
  def edit?
67
- record.class.ring_can?(query_ring,:write)
68
- end
69
-
70
- def destroy?
71
- record.class.ring_can?(query_ring,:destroy)
146
+ inner_query_record(:write)
72
147
  end
73
148
 
74
149
  def scope
75
150
  Pundit.policy_scope!(user, record.class)
76
151
  end
77
152
 
78
- def permitted_attributes(aAbility=nil)
79
- raise "ability not given" unless (@op && @op[:verb]) || aAbility
80
- if !aAbility && @op
81
- aAbility = case @op[:verb]
82
- when 'CREATE'
83
- when 'UPDATE'
84
- :write
85
- when 'READ'
86
- :read
87
- when 'ADD'
88
- :add
89
- when 'REMOVE'
90
- :remove
91
- when 'CREATE_ON'
92
- :create_on
93
- end
94
- end
95
- cls = record.is_a?(Class) ? record : record.class
96
- cls.permitted(query_ring,aAbility)
97
- end
98
-
99
- def permitted_fields(aAbility=nil)
100
- result = permitted_attributes(aAbility)
101
- cls = record.is_a?(Class) ? record : record.class
102
- result.delete_if { |f| cls.reflections.has_key? f }
103
- result
104
- end
105
-
106
- def permitted_associations(aAbility=nil)
107
- result = permitted_attributes(aAbility)
108
- cls = record.is_a?(Class) ? record : record.class
109
- result.delete_if { |f| !cls.reflections.has_key? f }
110
- result
111
- end
112
-
113
153
  end
114
154
 
@@ -126,6 +126,8 @@ module Concentric::Model
126
126
  end
127
127
 
128
128
  # Query
129
+ # aFields specifies fields you require to act on
130
+ # This is no longer used by KojacBasePolicy because it does not observe its filters that operate on fields. It may still provide a faster check when there are no filters applied
129
131
  def ring_can?(aRing,aAbility,aFields=nil)
130
132
  if aFields
131
133
  pf = permitted(aRing,aAbility)
@@ -305,9 +305,9 @@ module Kojac
305
305
  result_key = op[:result_key] || new_sub_item.kojac_key
306
306
  merge_model_into_results(new_sub_item)
307
307
  else # create operation on a resource eg. {verb: "CREATE", key: "order_items"} but may have embedded association values
308
+ raise "User does not have permission for #{op[:verb]} operation on #{model_class.to_s}" unless model_class.ring_can?(:create,ring)
308
309
  policy = Kojac.policy!(kojac_current_user,model_class)
309
310
  p_fields = policy.permitted_fields(:write)
310
- raise "User does not have permission for #{op[:verb]} operation on #{model_class.to_s}" unless model_class.ring_can?(:create,ring)
311
311
 
312
312
  p_fields = op[:value].permit( *p_fields )
313
313
  model_class.write_op_filter(current_user,p_fields,op[:value]) if model_class.respond_to? :write_op_filter
@@ -396,7 +396,9 @@ module Kojac
396
396
  result_key = op[:result_key] || op[:key]
397
397
  results[result_key] = []
398
398
  if scope
399
- items = scope.load_by_key(key,op)
399
+ items = scope
400
+ items = send(:after_scope,items,op) if respond_to? :after_scope
401
+ items = items.load_by_key(key,op)
400
402
  #items = scope.by_key(key,op)
401
403
  #items = items.all
402
404
  items.each do |item|
data/lib/kojac/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Kojac
2
- VERSION = "0.12.0"
2
+ VERSION = "0.13.0"
3
3
  end
@@ -1 +1 @@
1
- ruby-2.0.0-p247
1
+ ruby-2.1.5
data/spec/demo/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
4
- ruby '2.0.0'
4
+ #ruby '2.0.0'
5
5
  gem 'rails', '4.0.1'
6
6
 
7
7
  # Use sqlite3 as the database for Active Record
@@ -45,7 +45,7 @@ end
45
45
  # Use debugger
46
46
  # gem 'debugger', group: [:development, :test]
47
47
 
48
- gem 'buzztools', :github => 'buzzware/buzztools', :ref => 'a403e6fad32b225be82021a6765df53954c8a3d0'
48
+ gem 'buzztools', '~> 0.0.8' # :github => 'buzzware/buzztools', :ref => 'a403e6fad32b225be82021a6765df53954c8a3d0'
49
49
  #gem 'buzztools', :path => '/Users/gary/repos/buzztools'
50
50
 
51
51
  #gem 'kojac', :git => 'http://github.com/buzzware/KOJAC', :ref => '467817b22ebe5802323006746845a1d14764e00a'
@@ -1,17 +1,11 @@
1
- GIT
2
- remote: git://github.com/buzzware/buzztools.git
3
- revision: a403e6fad32b225be82021a6765df53954c8a3d0
4
- ref: a403e6fad32b225be82021a6765df53954c8a3d0
5
- specs:
6
- buzztools (0.0.3)
7
-
8
1
  PATH
9
2
  remote: /Users/gary/repos/KOJAC
10
3
  specs:
11
- kojac (0.10.0)
12
- buzztools
13
- pundit (~> 0.2.1)
14
- underscore_plus
4
+ kojac (0.12.0)
5
+ active_model_serializers (= 0.9.0.alpha1)
6
+ buzztools (~> 0.0.5)
7
+ pundit (~> 0.2.3)
8
+ underscore_plus (~> 0.9.1)
15
9
 
16
10
  GEM
17
11
  remote: https://rubygems.org/
@@ -45,6 +39,7 @@ GEM
45
39
  arel (4.0.1)
46
40
  atomic (1.1.14)
47
41
  builder (3.1.4)
42
+ buzztools (0.0.8)
48
43
  diff-lcs (1.2.5)
49
44
  erubis (2.7.0)
50
45
  execjs (2.0.2)
@@ -71,7 +66,7 @@ GEM
71
66
  minitest (4.7.5)
72
67
  multi_json (1.8.2)
73
68
  polyglot (0.3.3)
74
- pundit (0.2.1)
69
+ pundit (0.2.3)
75
70
  activesupport (>= 3.0.0)
76
71
  rack (1.5.2)
77
72
  rack-test (0.6.2)
@@ -139,7 +134,7 @@ PLATFORMS
139
134
 
140
135
  DEPENDENCIES
141
136
  active_model_serializers (= 0.9.0.alpha1)
142
- buzztools!
137
+ buzztools (~> 0.0.8)
143
138
  factory_girl_rails
144
139
  faker
145
140
  jbuilder (~> 1.2)
@@ -4,39 +4,67 @@ class UserPolicy < KojacBasePolicy
4
4
  user.id == record.id
5
5
  end
6
6
 
7
- def query_ring
8
- user.ring
9
- end
10
-
11
- def write?
12
- return user.ring <= ADMIN_RING if @record==User
13
- raise "Bad record given" unless record.is_a? User
14
- return ((user.ring <= SYSADMIN_RING) || is_self? || (
15
- (user.ring <= record.ring) && (
16
- (user.ring <= ADMIN_RING) && (!user.owner_id || (record.owner_id == user.owner_id))
17
- )
18
- ))
19
- end
20
-
21
- def permitted_attributes(aAbility=nil)
22
- case aAbility
23
- when :write
24
- return [] unless write?
25
- when :read
26
- return [] unless read?
27
- end
7
+ # def write?
8
+ # return query_ring <= ADMIN_RING if @record==User
9
+ # raise "Bad record given" unless record.is_a? User
10
+ # return ((query_ring <= SYSADMIN_RING) || is_self? || (
11
+ #
12
+ # ))
13
+ # end
28
14
 
29
- result = super(aAbility)
30
-
31
- if is_self? && user.ring <= USER_RING
32
- case aAbility
33
- when :write
34
- result = (result | (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS)).sort
35
- when :read
36
- result = (result | (User::PRIVATE_FIELDS)).sort
15
+ allow_filter do |aPolicy,aResult,aRing,aAbility|
16
+ if aRing <= SYSADMIN_RING # sysadmin can do all, so pass through
17
+ aResult
18
+ elsif (aPolicy.user.owner_id and aPolicy.record.owner_id != aPolicy.user.owner_id) # user has a ring that doesn't match record
19
+ aResult = []
20
+ elsif aRing > USER_RING # outside of user, can't do anything
21
+ aResult
22
+ else
23
+ if aPolicy.is_self? or (aRing < aPolicy.record.ring and aRing <= ADMIN_RING) # can admin if self or admin and lower rank
24
+ case aAbility
25
+ when :write
26
+ aResult += User::PUBLIC_FIELDS + User::PRIVATE_FIELDS
27
+ when :read
28
+ aResult += User::PRIVATE_FIELDS
29
+ end
37
30
  end
31
+ aResult
38
32
  end
39
- result
40
33
  end
41
34
 
35
+ # allow_filter ring: :guest_admin, ability: :write do |aPolicy,aResult,aRing,aAbility|
36
+ # aResult && aPolicy.is_self?
37
+ # end
38
+ #
39
+ # allow_filter ability: [:create, :write] do |aPolicy,aRing,aAbility,aFields,aResult|
40
+ # # logic here to set aResult
41
+ # aResult
42
+ # end
43
+ #
44
+ # # prevent guest_admin from creating or writing Users, even though outer rings can
45
+ # allow_filter ring: :guest_admin, ability: [:create, :write] do |aUser,aRecord,aAbility,aFields,aResult|
46
+ # false
47
+ # end
48
+
49
+ # def permitted_attributes(aAbility=nil)
50
+ # case aAbility
51
+ # when :write
52
+ # return [] unless write?
53
+ # when :read
54
+ # return [] unless read?
55
+ # end
56
+ #
57
+ # result = super(aAbility)
58
+ #
59
+ # if is_self? && query_ring <= USER_RING
60
+ # case aAbility
61
+ # when :write
62
+ # result = (result | (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS)).sort
63
+ # when :read
64
+ # result = (result | (User::PRIVATE_FIELDS)).sort
65
+ # end
66
+ # end
67
+ # result
68
+ # end
69
+
42
70
  end
@@ -17,7 +17,7 @@ describe KojacBaseController do
17
17
  draw_routes do
18
18
  get ":controller/:action"
19
19
  end
20
- result = do_op(read_op)
20
+ result,error = do_op(read_op)
21
21
  result.keys.sort.should == (User::PUBLIC_FIELDS).map(&:to_s).sort
22
22
  end
23
23
 
@@ -31,7 +31,7 @@ describe KojacBaseController do
31
31
  draw_routes do
32
32
  get ":controller/:action"
33
33
  end
34
- result = do_op(read_op)
34
+ result,error = do_op(read_op)
35
35
  result.keys.sort.should == (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS + User::ADMIN_FIELDS + User::READ_ONLY_FIELDS).map(&:to_s).sort
36
36
  end
37
37
 
@@ -49,7 +49,10 @@ describe KojacBaseController do
49
49
  draw_routes do
50
50
  get ":controller/:action"
51
51
  end
52
- expect { do_op(send_op) }.to raise_exception(Pundit::NotAuthorizedError)
52
+ result,error = do_op(send_op)
53
+
54
+ error['kind'].should == 'Exception'
55
+ error.g?('errors.0.message').should == "You are not authorized to perform this action"
53
56
  user2.reload
54
57
  user2.last_name.should == original_name
55
58
  end
@@ -63,7 +66,7 @@ describe KojacBaseController do
63
66
  draw_routes do
64
67
  get ":controller/:action"
65
68
  end
66
- result = do_op(send_op)
69
+ result,error = do_op(send_op)
67
70
  result.keys.sort.should == (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS).map(&:to_s).sort
68
71
  end
69
72
 
@@ -80,7 +83,7 @@ describe KojacBaseController do
80
83
  draw_routes do
81
84
  get ":controller/:action"
82
85
  end
83
- result = do_op(send_op)
86
+ result,error = do_op(send_op)
84
87
  result['last_name'].should == send_op.g?('value.last_name')
85
88
  result.keys.sort.should == (User::PUBLIC_FIELDS + User::PRIVATE_FIELDS).map(&:to_s).sort
86
89
  end
@@ -99,7 +102,7 @@ describe KojacBaseController do
99
102
  draw_routes do
100
103
  get ":controller/:action"
101
104
  end
102
- result = do_op(send_op)
105
+ result,error = do_op(send_op)
103
106
  result['last_name'].should == send_op.g?('value.last_name')
104
107
  user2.reload
105
108
  user2.last_name.should == send_op.g?('value.last_name')
@@ -120,7 +123,9 @@ describe KojacBaseController do
120
123
  draw_routes do
121
124
  get ":controller/:action"
122
125
  end
123
- expect { do_op(send_op) }.to raise_exception(Pundit::NotAuthorizedError)
126
+ result,error = do_op(send_op)
127
+ error['kind'].should == 'Exception'
128
+ error.g?('errors.0.message').should == "You are not authorized to perform this action"
124
129
  user2.reload
125
130
  user2.last_name.should == original_name
126
131
  end
@@ -60,4 +60,71 @@ describe "ConcentricTestModel" do
60
60
  ConcentricTestModel.permitted(:pleb,:sneeze).should == [:desk,:outside]
61
61
  end
62
62
 
63
+ it "allow_filter enables custom rules despite heirarchy" do
64
+ class TestUser < ActiveRecord::Base
65
+ self.table_name = 'users'
66
+
67
+ include Concentric::Model
68
+
69
+ ring :pleb, [:read,:write] => [:name,:address]
70
+ ring :pleb, write: :password
71
+ ring :boss, [:read,:write] => [:notes]
72
+ end
73
+
74
+ class TestUserPolicy < KojacBasePolicy
75
+ allow_filter ability: :write, ring: :boss do |aPolicy,aResult,aRing,aAbility| # boss can't write other people's passwords
76
+ aResult -= [:password] if aPolicy.user.id != aPolicy.record.id
77
+ aResult
78
+ end
79
+ allow_filter do |aPolicy,aResult,aRing,aAbility| # boss can't write other people's passwords
80
+ aResult = [] if aPolicy.user.id != aPolicy.record.id and aPolicy.user.ring >= aPolicy.record.ring and aPolicy.user.ring >= Concentric.lookup_ring(:master)
81
+ aResult
82
+ end
83
+ end
84
+
85
+ TestUser.permitted(:pleb,:read).should == [:address,:name]
86
+ TestUser.permitted(:boss,:read).should == [:address,:name,:notes]
87
+ TestUser.permitted(:pleb,:write).should == [:address,:name,:password]
88
+ TestUser.permitted(:boss,:write).should == [:address,:name,:notes,:password] # permitted is a concentric method!
89
+ anyone = TestUser.create!(
90
+ ring: Concentric.lookup_ring(:anyone),
91
+ first_name: Faker::Name.first_name,
92
+ last_name: Faker::Name.last_name,
93
+ email: Faker::Internet.email
94
+ )
95
+ pleb = TestUser.create!(
96
+ ring: Concentric.lookup_ring(:pleb),
97
+ first_name: Faker::Name.first_name,
98
+ last_name: Faker::Name.last_name,
99
+ email: Faker::Internet.email
100
+ )
101
+ pleb2 = TestUser.create!(
102
+ ring: Concentric.lookup_ring(:pleb),
103
+ first_name: Faker::Name.first_name,
104
+ last_name: Faker::Name.last_name,
105
+ email: Faker::Internet.email
106
+ )
107
+ boss = TestUser.create!(
108
+ ring: Concentric.lookup_ring(:boss),
109
+ first_name: Faker::Name.first_name,
110
+ last_name: Faker::Name.last_name,
111
+ email: Faker::Internet.email
112
+ )
113
+ master = TestUser.create!(
114
+ ring: Concentric.lookup_ring(:master),
115
+ first_name: Faker::Name.first_name,
116
+ last_name: Faker::Name.last_name,
117
+ email: Faker::Internet.email
118
+ )
119
+ TestUserPolicy.new(pleb,pleb).permitted_attributes(:write).should == [:address,:name,:password]
120
+ TestUserPolicy.new(pleb,pleb2).permitted_attributes(:write).should == []
121
+ TestUserPolicy.new(boss,pleb).permitted_attributes(:write).should == [:address,:name,:notes]
122
+ TestUserPolicy.new(boss,boss).permitted_attributes(:write).should == [:address,:name,:notes,:password]
123
+ TestUserPolicy.new(boss,master).permitted_attributes(:write).should == []
124
+ TestUserPolicy.new(master,boss).permitted_attributes(:write).should == [:address,:name,:notes,:password]
125
+ TestUserPolicy.new(master,pleb).permitted_attributes(:write).should == [:address,:name,:notes,:password]
126
+ TestUserPolicy.new(master,master).permitted_attributes(:write).should == [:address,:name,:notes,:password]
127
+ end
128
+
129
+
63
130
  end
@@ -18,12 +18,23 @@ def do_op(read_op)
18
18
  }
19
19
  request.accept = "application/json"
20
20
  post :receive, format: :json, kojac: content
21
-
21
+ result = nil
22
+ error = nil
22
23
  output = JSON.parse response.body
23
- output['ops'].should be_is_a Array
24
- output['ops'].length.should == 1
25
- op = output['ops'].first
26
- result = op['results'][op['result_key']]
24
+ if output['error']
25
+ response.status.should >= 400
26
+ output.g?('error.errors').should be_a Array
27
+ output.g?('error.kind').should be
28
+ output['error']['errors'].length.should >= 1
29
+ error = output['error']
30
+ else
31
+ response.status.should == 200
32
+ output['ops'].should be_a Array
33
+ output['ops'].length.should >= 1
34
+ op = output['ops'].first
35
+ result = op['results'][op['result_key']]
36
+ end
37
+ [result,error]
27
38
  end
28
39
 
29
40
  # from http://openhood.com/rails/rails%203/2010/07/20/add-routes-at-runtime-rails-3/
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kojac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary McGhee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-24 00:00:00.000000000 Z
11
+ date: 2015-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: buzztools
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.0.5
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.0.5
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: underscore_plus
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.9.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.9.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pundit
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 0.2.3
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.2.3
55
55
  - !ruby/object:Gem::Dependency
@@ -77,7 +77,7 @@ executables: []
77
77
  extensions: []
78
78
  extra_rdoc_files: []
79
79
  files:
80
- - .gitignore
80
+ - ".gitignore"
81
81
  - Gemfile
82
82
  - MIT-LICENSE
83
83
  - README.md
@@ -105,7 +105,6 @@ files:
105
105
  - spec/can_factory_spec.js
106
106
  - spec/can_model_spec.js
107
107
  - spec/demo/.gitignore
108
- - spec/demo/.ruby-gemset
109
108
  - spec/demo/.ruby-version
110
109
  - spec/demo/Gemfile
111
110
  - spec/demo/Gemfile.lock
@@ -226,17 +225,17 @@ require_paths:
226
225
  - lib
227
226
  required_ruby_version: !ruby/object:Gem::Requirement
228
227
  requirements:
229
- - - ! '>='
228
+ - - ">="
230
229
  - !ruby/object:Gem::Version
231
230
  version: '0'
232
231
  required_rubygems_version: !ruby/object:Gem::Requirement
233
232
  requirements:
234
- - - ! '>='
233
+ - - ">="
235
234
  - !ruby/object:Gem::Version
236
235
  version: '0'
237
236
  requirements: []
238
237
  rubyforge_project:
239
- rubygems_version: 2.2.2
238
+ rubygems_version: 2.4.5
240
239
  signing_key:
241
240
  specification_version: 4
242
241
  summary: KOJAC is an opinionated design and implementation for data management within
@@ -246,7 +245,6 @@ test_files:
246
245
  - spec/can_factory_spec.js
247
246
  - spec/can_model_spec.js
248
247
  - spec/demo/.gitignore
249
- - spec/demo/.ruby-gemset
250
248
  - spec/demo/.ruby-version
251
249
  - spec/demo/Gemfile
252
250
  - spec/demo/Gemfile.lock
@@ -355,4 +353,3 @@ test_files:
355
353
  - spec/spec.js
356
354
  - spec/support/jasmine.yml
357
355
  - spec/type_conversion_spec.js
358
- has_rdoc:
@@ -1 +0,0 @@
1
- ib2