Class: Fencepost::Gate

Inherits:
Object
  • Object
show all
Defined in:
lib/fencepost/gate.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model_list, params) ⇒ Gate

Returns a new instance of Gate.



4
5
6
7
8
9
# File 'lib/fencepost/gate.rb', line 4

def initialize(model_list, params)
  @allow_array = []
  @deny_array = []
  @model_list = model_list
  @model = model
end

Instance Attribute Details

#allow_arrayObject (readonly)

Returns the value of attribute allow_array.



3
4
5
# File 'lib/fencepost/gate.rb', line 3

def allow_array
  @allow_array
end

#deny_arrayObject (readonly)

Returns the value of attribute deny_array.



3
4
5
# File 'lib/fencepost/gate.rb', line 3

def deny_array
  @deny_array
end

#modelObject (readonly)

Returns the value of attribute model.



3
4
5
# File 'lib/fencepost/gate.rb', line 3

def model
  @model
end

#model_listObject (readonly)

Returns the value of attribute model_list.



3
4
5
# File 'lib/fencepost/gate.rb', line 3

def model_list
  @model_list
end

Instance Method Details

#allow(*elements) ⇒ Object



16
17
18
19
# File 'lib/fencepost/gate.rb', line 16

def allow(*elements)
  @allow_array += elements
  self
end

#allow_permissions(perms) ⇒ Object



26
27
28
29
30
31
# File 'lib/fencepost/gate.rb', line 26

def allow_permissions(perms)
  hash_values(allow_array).each do |hash_value|
    perms = nested_operations(perms, hash_value, :+)
  end
  perms + scalar_values(allow_array)
end

#build_permits(model, permits_array) ⇒ Object



71
72
73
74
75
76
77
78
79
80
# File 'lib/fencepost/gate.rb', line 71

def build_permits(model, permits_array)
  model_attributes(model).each {|k| permits_array << k }
  model_nested_attributes(model).each do |nao, value|
    node = get_node(:nested_collection_name, nao)
    node = get_node(:demodulized_name, nao) if node.keys.size == 0
    node = node.values[0]
    permits_array << {node[:nested_attributes_name] => build_permits(node[:model], [])}
  end
  permits_array
end

#deny(*elements) ⇒ Object



21
22
23
24
# File 'lib/fencepost/gate.rb', line 21

def deny(*elements)
  @deny_array += elements
  self
end

#deny_permissions(perms) ⇒ Object



33
34
35
36
37
38
# File 'lib/fencepost/gate.rb', line 33

def deny_permissions(perms)
  hash_values(deny_array).each do |hash_value|
    perms = nested_operations(perms, hash_value, :-)
  end
  perms - scalar_values(deny_array)
end

#get_node(key, value) ⇒ Object



90
91
92
# File 'lib/fencepost/gate.rb', line 90

def get_node(key, value)
  self.model_list.select {|k,v| v[key] == value}
end

#hash_values(arry) ⇒ Object



44
45
46
# File 'lib/fencepost/gate.rb', line 44

def hash_values(arry)
  arry.select{|x| x.is_a?(Hash)}
end

#model_attributes(model) ⇒ Object



82
83
84
# File 'lib/fencepost/gate.rb', line 82

def model_attributes(model)
  get_node(:model, model).values[0][:attributes]
end

#model_nested_attributes(model) ⇒ Object



86
87
88
# File 'lib/fencepost/gate.rb', line 86

def model_nested_attributes(model)
  get_node(:model, model).values[0][:nested_attributes_options]
end

#nested_operations(perms, hash, operator) ⇒ Object



48
49
50
51
52
53
54
# File 'lib/fencepost/gate.rb', line 48

def nested_operations(perms, hash, operator)
  perms.each do |perm|
    hash.each do |key, value|
      set_permission_value(perm, key, value, operator)
    end
  end
end

#open(params, key, model) ⇒ Object



11
12
13
14
# File 'lib/fencepost/gate.rb', line 11

def open(params, key, model)
  perms = deny_permissions(allow_permissions(build_permits(model, [])))
  ActionController::Parameters.new(params).require(key).permit(perms)
end

#recurse_permissions(perm, key, value, operator) ⇒ Object



63
64
65
66
67
68
69
# File 'lib/fencepost/gate.rb', line 63

def recurse_permissions(perm, key, value, operator)
  hash_values(perm[key]).each do |pk|
    hash_values(value).each do |hk|
      set_permission_value(pk, hk.keys[0], hk.values[0], operator)
    end
  end
end

#scalar_values(arry) ⇒ Object



40
41
42
# File 'lib/fencepost/gate.rb', line 40

def scalar_values(arry)
  arry.select{|x| x.is_a?(String) || x.is_a?(Symbol)}
end

#set_permission_value(perm, key, value, operator) ⇒ Object



56
57
58
59
60
61
# File 'lib/fencepost/gate.rb', line 56

def set_permission_value(perm, key, value, operator)
  if perm.is_a?(Hash) && perm.keys.index(key) && perm[key].is_a?(Array)
    perm[key] = perm[key].send(operator, value)
    recurse_permissions(perm, key, value, operator)
  end
end