pbw 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +8 -8
  2. data/app/controllers/pbw/base_models_controller.rb +22 -10
  3. data/app/controllers/pbw/commands_controller.rb +11 -0
  4. data/app/controllers/pbw/items_controller.rb +1 -1
  5. data/app/models/pbw/ability.rb +35 -11
  6. data/app/models/pbw/area.rb +25 -0
  7. data/app/models/pbw/attached_process.rb +41 -0
  8. data/app/models/pbw/capability.rb +20 -0
  9. data/app/models/pbw/command.rb +105 -0
  10. data/app/models/pbw/constraint.rb +20 -0
  11. data/app/models/pbw/item.rb +16 -0
  12. data/app/models/pbw/item_container.rb +16 -0
  13. data/app/models/pbw/item_conversion.rb +16 -0
  14. data/app/models/pbw/item_transfer.rb +16 -0
  15. data/app/models/pbw/process.rb +17 -8
  16. data/app/models/pbw/rule.rb +16 -0
  17. data/app/models/pbw/token.rb +26 -1
  18. data/app/models/pbw/trigger.rb +20 -0
  19. data/app/models/pbw/user.rb +50 -14
  20. data/config/initializers/devise.rb +0 -8
  21. data/config/routes.rb +1 -1
  22. data/lib/generators/pbw/area/area_generator.rb +4 -0
  23. data/lib/generators/pbw/item/item_generator.rb +4 -0
  24. data/lib/generators/pbw/rules/capability/capability_generator.rb +4 -0
  25. data/lib/generators/pbw/rules/command/USAGE +3 -3
  26. data/lib/generators/pbw/rules/command/command_generator.rb +11 -11
  27. data/lib/generators/pbw/rules/command/templates/model.coffee +1 -0
  28. data/lib/generators/pbw/rules/constraint/constraint_generator.rb +4 -0
  29. data/lib/generators/pbw/rules/process/process_generator.rb +4 -0
  30. data/lib/generators/pbw/rules/trigger/trigger_generator.rb +4 -0
  31. data/lib/generators/pbw/scaffold_generator.rb +3 -3
  32. data/lib/generators/pbw/token/token_generator.rb +4 -0
  33. data/lib/pbw/tick.rb +8 -0
  34. data/lib/pbw/update.rb +8 -0
  35. data/lib/pbw/version.rb +1 -1
  36. data/lib/tasks/pbw_tasks.rake +11 -4
  37. metadata +36 -14
  38. data/app/controllers/pbw/roles_controller.rb +0 -46
  39. data/app/models/pbw/permission.rb +0 -13
  40. data/app/models/pbw/role.rb +0 -26
  41. data/lib/generators/pbw/rules/command/templates/command.rb +0 -18
  42. data/lib/generators/pbw/rules/command/templates/index.erb +0 -6
  43. data/lib/generators/pbw/rules/command/templates/templates/edit.jst +0 -17
  44. data/lib/generators/pbw/rules/command/templates/templates/index.jst +0 -16
  45. data/lib/generators/pbw/rules/command/templates/templates/show.jst +0 -9
  46. data/lib/generators/pbw/rules/command/templates/views/edit_view.coffee +0 -24
  47. data/lib/generators/pbw/rules/command/templates/views/index_view.coffee +0 -20
  48. data/lib/generators/pbw/rules/command/templates/views/show_view.coffee +0 -8
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZWExNjYwMWQ4NWQxYzk1YzU4YmQxNjE5MjIyZjdkNTc0NDZlNWI2OQ==
4
+ ZDE5MzY0MTBlZjgxMjU3OGMxMGMwZTAzMzk4ZThlZmQ4ZGE3YjVhZg==
5
5
  data.tar.gz: !binary |-
6
- MDI2MjBiZWUyY2ZiMGQxODFiMDA0YWI1YjRkMTg5M2ViNTlmYjk0Mw==
6
+ NWFlMzkxMjY1MDFjYzZiNjljYjU1MWZiN2JiZjhlYTgzZTcxNzk4YQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MWE0MjUyYWE2ODRlZjI1NjA2OTA3MTE0MzIyZDNmZGM2ODA2MzBhMDRiOTZi
10
- ODY4ZjBkOGUzNzZiODg2NDlkM2UzOWFhNTQ4YTAyYjFlZDE4N2NhZWU4OTY4
11
- YmYwNTEwMmU4ZGFjZWY1NDQxZGY2NGM1NmYyMzM4OGYwZWQwZTY=
9
+ ZWNkMzU1NWIyMDEyYTg1YTY0OTQ1YTIzZWI3ZDAxNmVlYmM5ZTNiNTdjNjQy
10
+ MDA3MWQ0Y2JlYzIyMTQzODRkZWJiNmI4ZmFmODAyYjI2MzNlNjRiMWExYzRm
11
+ ZDJlMmJiNWM4MDczN2IxN2IzYmU4ZDI5YTg2ZDI2YmUxNDg3OWI=
12
12
  data.tar.gz: !binary |-
13
- MWVlYmExMTU2OWNhMDhmZmE3Njg0Mjk0YTcxZmQ1ODY1YWQyMzRmZWFjZGMz
14
- NzQ1YzNlOTQ5YWM1NGVhOTM0MmIzNTRhMDNiMzQ3YzA0OWU0YWFlZjVhMGE1
15
- ZmJiODY4MTdkMWQyOGQwNjk1ZDM4N2JkZDYwZmJjNTUxYzQ0MDE=
13
+ NzI0YjMyZjI5ZWEzZGZjYWQ4NWQ3MThlMzQzM2VmMjI0NTU4ZGZlZjM2ZTUw
14
+ NDM5Zjk4MDkzYTMwZDk2Zjg1MWY2Yzc0ZjNjYTAwNTdiM2EwODFkMzIwNmY0
15
+ Y2Y0OTNhMDJjMjI2ODU3MzMyNDBmODkwY2NiOWEzMzdmNzQ5NGU=
@@ -9,6 +9,19 @@ module Pbw
9
9
  before_filter :model_for_read, :only => [:show]
10
10
  before_filter :model_for_update, :only => [:edit, :update, :destroy]
11
11
  before_filter :index_models, :only => [:index]
12
+ before_filter :model_for_create, :only => [:new, :create]
13
+
14
+ def set_model_class
15
+ # stub method
16
+ end
17
+
18
+ def update_model_before_create(model)
19
+ # stub method
20
+ end
21
+
22
+ def update_model_before_update(model)
23
+ # stub method
24
+ end
12
25
 
13
26
  def index
14
27
  session[:referrer] = request.url
@@ -30,17 +43,12 @@ module Pbw
30
43
  end
31
44
 
32
45
  def new
33
- authorize! :manage, Admin
34
- @model = real_model_class.new
35
46
  respond_with(@model) do |format|
36
47
  format.json { render json: @model }
37
48
  end
38
49
  end
39
50
 
40
51
  def create
41
- authorize! :manage, real_model_class
42
- @model = real_model_class.new(params[model_param])
43
- @model.image = @image if @image
44
52
  if @model.save
45
53
  respond_with(@model) do |format|
46
54
  format.json { render json: @model }
@@ -54,10 +62,6 @@ module Pbw
54
62
 
55
63
  def update
56
64
  if @model.update_attributes(params[model_param])
57
- if @image
58
- @model.image = @image
59
- @model.save
60
- end
61
65
  respond_with(@model) do |format|
62
66
  format.json { render json: @model }
63
67
  end
@@ -100,17 +104,25 @@ module Pbw
100
104
  end
101
105
 
102
106
  def index_models
103
- authorize! :read, model_class
107
+ authorize! :manage, model_class
104
108
  @models = model_class.desc(:created_at)
105
109
  end
106
110
 
111
+ def model_for_create
112
+ authorize! :create, real_model_class
113
+ @model = real_model_class.new(params[model_param])
114
+ update_model_before_create(@model)
115
+ end
116
+
107
117
  def model_for_read
108
118
  @model = model_class.find(model_id)
119
+ authorize! :read, @model
109
120
  end
110
121
 
111
122
  def model_for_update
112
123
  @model = model_class.find(model_id)
113
124
  authorize! :update, @model
125
+ update_model_before_update(@model)
114
126
  end
115
127
  end
116
128
 
@@ -0,0 +1,11 @@
1
+ module Pbw
2
+ class CommandsController < BaseModelsController
3
+ def set_model_class
4
+ self.model_class = Command
5
+ end
6
+
7
+ def update_model_before_create(model)
8
+ model.user = current_user
9
+ end
10
+ end
11
+ end
@@ -1,7 +1,7 @@
1
1
  module Pbw
2
2
  class ItemsController < BaseModelsController
3
3
  def set_model_class
4
- self.model_class = Resource
4
+ self.model_class = Item
5
5
  end
6
6
  end
7
7
  end
@@ -1,13 +1,37 @@
1
+ require 'cancan'
2
+
1
3
  class Ability
2
- include ::CanCan::Ability
3
-
4
- def initialize(user)
5
- user.role.permissions.each do |permission|
6
- if permission.subject_class == "all"
7
- can permission.action.to_sym, permission.subject_class.to_sym
8
- else
9
- can permission.action.to_sym, permission.subject_class.constantize
10
- end
4
+ include CanCan::Ability
5
+
6
+ MANAGED_CLASSES = [Area, Capability, Command, Constraint, Item, ItemContainer, ItemConversion, ItemTransfer, Process, Rule, Token, Trigger, User]
7
+
8
+ def initialize(user)
9
+ user ||= User.new
10
+ if user.superadmin?
11
+ can :manage, :all
12
+ else
13
+ can do |action, subject_class, subject|
14
+ case action.to_s
15
+ when "index", "show", "search"
16
+ check_method = :viewable_by?
17
+ when "create", "new"
18
+ check_method = :creatable_by?
19
+ when "edit", "update"
20
+ check_method = :editable_by?
21
+ when "delete", "destroy"
22
+ check_method = :deletable_by?
23
+ else
24
+ check_method = :viewable_by?
25
+ end
26
+ check_class = subject_class.respond_to?(check_method) ? subject_class : parent_of_subject_class(subject_class)
27
+ check_class.send(check_method, user, subject)
28
+ end
29
+ end
11
30
  end
12
- end
13
- end
31
+
32
+ def parent_of_subject_class(subject_class)
33
+ MANAGED_CLASSES.each do |klass|
34
+ return klass if subject_class.ancestors.include?(klass)
35
+ end
36
+ end
37
+ end
@@ -10,9 +10,26 @@ module Pbw
10
10
  has_many :item_containers
11
11
  has_and_belongs_to_many :constraints
12
12
  has_and_belongs_to_many :triggers
13
+ has_and_belongs_to_many :attached_processes
13
14
 
14
15
  attr_accessible :name
15
16
 
17
+ def self.viewable_by?(user, subject)
18
+ true
19
+ end
20
+
21
+ def self.creatable_by?(user, subject)
22
+ user.admin?
23
+ end
24
+
25
+ def self.editable_by?(user, subject)
26
+ user.admin?
27
+ end
28
+
29
+ def self.deletable_by?(user, subject)
30
+ user.admin?
31
+ end
32
+
16
33
  def before_token_enters(token)
17
34
  # stub method
18
35
  true
@@ -49,6 +66,14 @@ module Pbw
49
66
  # stub method
50
67
  end
51
68
 
69
+ def attach_tick_process(process, ticks_to_wait=0)
70
+ AttachedProcess.create(area: self, process: process, tickable: true, ticks_waiting: ticks_to_wait)
71
+ end
72
+
73
+ def attach_update_process(process, updates_to_wait=0)
74
+ AttachedProcess.create(area: self, process: process, updatable: true, updates_waiting: updates_to_wait)
75
+ end
76
+
52
77
  def count_item(item)
53
78
  container = ItemContainer.find_for_area(self)
54
79
  container ? container.quantity : 0
@@ -0,0 +1,41 @@
1
+ module Pbw
2
+ class AttachedProcess < Rule
3
+ belongs_to :token
4
+ belongs_to :area
5
+ belongs_to :process
6
+
7
+ field :tickable, :type => Boolean, :default => false
8
+ field :updatable, :type => Boolean, :default => false
9
+ field :ticks_waiting, :type => Integer, :default => 0
10
+ field :updates_waiting, :type => Integer, :default => 0
11
+
12
+ scope :tickable, where(tickable: true)
13
+ scope :updatable, where(updatable: true)
14
+
15
+ def tick!
16
+ return unless self.tickable && self.process && (self.token || self.area)
17
+ unless self.ticks_waiting > 0
18
+ self.process.run!(token_or_area)
19
+ destroy
20
+ else
21
+ self.ticks_waiting = self.ticks_waiting - 1
22
+ save!
23
+ end
24
+ end
25
+
26
+ def update!
27
+ return unless self.updatable && self.process && (self.token || self.area)
28
+ unless self.updates_waiting > 0
29
+ self.process.run!(token_or_area)
30
+ destroy
31
+ else
32
+ self.updates_waiting = self.updates_waiting - 1
33
+ save!
34
+ end
35
+ end
36
+
37
+ def token_or_area
38
+ self.token || self.area
39
+ end
40
+ end
41
+ end
@@ -2,6 +2,26 @@ module Pbw
2
2
  class Capability < Rule
3
3
  has_and_belongs_to_many :tokens
4
4
 
5
+ def self.viewable_by?(user, subject)
6
+ return true if user.admin?
7
+ subject.tokens.each do |token|
8
+ return true token.user && token.user == user
9
+ end
10
+ false
11
+ end
12
+
13
+ def self.creatable_by?(user, subject)
14
+ user.admin?
15
+ end
16
+
17
+ def self.editable_by?(user, subject)
18
+ user.admin?
19
+ end
20
+
21
+ def self.deletable_by?(user, subject)
22
+ user.admin?
23
+ end
24
+
5
25
  def before_process(token, &changeset)
6
26
  # stub method
7
27
  true
@@ -0,0 +1,105 @@
1
+ module Pbw
2
+ class Command < Rule
3
+ belongs_to :token
4
+ belongs_to :user
5
+
6
+ before_validation :validate_token_and_user
7
+
8
+ field :tickable, :type => Boolean, :default => false
9
+ field :updatable, :type => Boolean, :default => false
10
+ field :ticks_waiting, :type => Integer, :default => 0
11
+ field :updates_waiting, :type => Integer, :default => 0
12
+
13
+ before_save :set_tickable_and_updatable
14
+
15
+ scope :tickable, where(tickable: true)
16
+ scope :updatable, where(updatable: true)
17
+
18
+ def self.viewable_by?(user, subject)
19
+ user.admin? || subject.user == user
20
+ end
21
+
22
+ def self.creatable_by?(user, subject)
23
+ user.admin? || subject.user.nil? || (subject.user == user && subject.token.user && subject.token.user == user)
24
+ end
25
+
26
+ def self.editable_by?(user, subject)
27
+ user.admin? || (subject.user == user && subject.token.user && subject.token.user == user)
28
+ end
29
+
30
+ def self.deletable_by?(user, subject)
31
+ user.admin? || (subject.user == user && subject.token.user && subject.token.user == user)
32
+ end
33
+
34
+ def valid_for_token?(token)
35
+ # stub method
36
+ false
37
+ end
38
+
39
+ def valid_for_user?(user)
40
+ # stub method
41
+ false
42
+ end
43
+
44
+ def runs_on_ticks?
45
+ # stub method
46
+ false
47
+ end
48
+
49
+ def runs_on_updates?
50
+ # stub method
51
+ false
52
+ end
53
+
54
+ def processes
55
+ # stub method
56
+ []
57
+ end
58
+
59
+ def set_tickable_and_updatable
60
+ self.tickable = runs_on_ticks?
61
+ self.updatable = runs_on_updates?
62
+ end
63
+
64
+ def run_processes!
65
+ procs = processes
66
+ return if procs.nil?
67
+ if procs.responds_to?(:each)
68
+ procs.each do |process|
69
+ process.run!(self.token)
70
+ end
71
+ elsif procs.ancestors.include?(Process)
72
+ process.run!(self.token)
73
+ else
74
+ raise "Invalid return method from #{self.class.name}.processes"
75
+ end
76
+ end
77
+
78
+ def validate_token_and_user
79
+ errors.add(:token, 'Invalid token') unless valid_for_token?(self.token)
80
+ errors.add(:user, 'Invalid user') unless valid_for_user?(self.user)
81
+ end
82
+
83
+ def tick!
84
+ return unless self.tickable
85
+ unless self.ticks_waiting > 0
86
+ run_processes!
87
+ destroy
88
+ else
89
+ self.ticks_waiting = self.ticks_waiting - 1
90
+ save!
91
+ end
92
+ end
93
+
94
+ def update!
95
+ return unless self.updatable
96
+ unless self.updates_waiting > 0
97
+ run_processes!
98
+ destroy
99
+ else
100
+ self.updates_waiting = self.updates_waiting - 1
101
+ save!
102
+ end
103
+ end
104
+ end
105
+ end
@@ -3,6 +3,26 @@ module Pbw
3
3
  has_and_belongs_to_many :tokens
4
4
  has_and_belongs_to_many :areas
5
5
 
6
+ def self.viewable_by?(user, subject)
7
+ return true if user.admin?
8
+ subject.tokens.each do |token|
9
+ return true token.user && token.user == user
10
+ end
11
+ false
12
+ end
13
+
14
+ def self.creatable_by?(user, subject)
15
+ user.admin?
16
+ end
17
+
18
+ def self.editable_by?(user, subject)
19
+ user.admin?
20
+ end
21
+
22
+ def self.deletable_by?(user, subject)
23
+ user.admin?
24
+ end
25
+
6
26
  def before_process(token_or_area, &changeset)
7
27
  # stub method
8
28
  true
@@ -12,6 +12,22 @@ module Pbw
12
12
 
13
13
  attr_accessible :name
14
14
 
15
+ def self.viewable_by?(user, subject)
16
+ true
17
+ end
18
+
19
+ def self.creatable_by?(user, subject)
20
+ user.admin?
21
+ end
22
+
23
+ def self.editable_by?(user, subject)
24
+ user.admin?
25
+ end
26
+
27
+ def self.deletable_by?(user, subject)
28
+ user.admin?
29
+ end
30
+
15
31
  def before_add(container, quantity)
16
32
  # stub method
17
33
  true
@@ -12,6 +12,22 @@ module Pbw
12
12
 
13
13
  attr_accessible :item, :token, :area, :user, :quantity
14
14
 
15
+ def self.viewable_by?(user, subject)
16
+ user.admin? || subject.user == user || (subject.token && subject.token.user == user)
17
+ end
18
+
19
+ def self.creatable_by?(user, subject)
20
+ true
21
+ end
22
+
23
+ def self.editable_by?(user, subject)
24
+ user.admin? || subject.user == user || (subject.token && subject.token.user == user)
25
+ end
26
+
27
+ def self.deletable_by?(user, subject)
28
+ user.admin?
29
+ end
30
+
15
31
  def self.find_or_create_for_token(token, item, quantity_to_add)
16
32
  container = where(token: token, item: item).first
17
33
  container = new(token: token, item: item) unless container
@@ -5,6 +5,22 @@ module Pbw
5
5
  belongs_to :item
6
6
  field :from, :type => Hash
7
7
 
8
+ def self.viewable_by?(user, subject)
9
+ true
10
+ end
11
+
12
+ def self.creatable_by?(user, subject)
13
+ user.admin?
14
+ end
15
+
16
+ def self.editable_by?(user, subject)
17
+ user.admin?
18
+ end
19
+
20
+ def self.deletable_by?(user, subject)
21
+ user.admin?
22
+ end
23
+
8
24
  def set_from_item(item, quantity)
9
25
  return false unless item && quantity
10
26
  self.from ||= {}
@@ -5,5 +5,21 @@ module Pbw
5
5
  belongs_to :item
6
6
  field :from_class, :type => String
7
7
  field :to_class, :type => String
8
+
9
+ def self.viewable_by?(user, subject)
10
+ true
11
+ end
12
+
13
+ def self.creatable_by?(user, subject)
14
+ user.admin?
15
+ end
16
+
17
+ def self.editable_by?(user, subject)
18
+ user.admin?
19
+ end
20
+
21
+ def self.deletable_by?(user, subject)
22
+ user.admin?
23
+ end
8
24
  end
9
25
  end
@@ -1,9 +1,23 @@
1
1
  module Pbw
2
2
  class Process < Rule
3
3
  has_many :triggers
4
+ has_and_belongs_to_many :attached_processes
4
5
 
5
- field :run_tick, :type => Boolean
6
- field :run_update, :type => Boolean
6
+ def self.viewable_by?(user, subject)
7
+ user.admin?
8
+ end
9
+
10
+ def self.creatable_by?(user, subject)
11
+ true
12
+ end
13
+
14
+ def self.editable_by?(user, subject)
15
+ user.admin?
16
+ end
17
+
18
+ def self.deletable_by?(user, subject)
19
+ user.admin?
20
+ end
7
21
 
8
22
  def before_run(token_or_area)
9
23
  # stub method
@@ -16,7 +30,7 @@ module Pbw
16
30
 
17
31
  def changeset(token_or_area)
18
32
  # stub method
19
- raise "Not implemented"
33
+ Pbw::Changeset.new
20
34
  end
21
35
 
22
36
  def execute_changeset!(&changeset)
@@ -40,10 +54,5 @@ module Pbw
40
54
  token_or_area.check_triggers!
41
55
  after_triggers(token_or_area)
42
56
  end
43
-
44
- def schedule!(token_or_area)
45
- # TODO
46
- raise "Not implemented"
47
- end
48
57
  end
49
58
  end
@@ -6,5 +6,21 @@ module Pbw
6
6
  validates :name, presence: true, uniqueness: true
7
7
 
8
8
  attr_accessible :name
9
+
10
+ def self.viewable_by?(user, subject)
11
+ true
12
+ end
13
+
14
+ def self.creatable_by?(user, subject)
15
+ user.admin?
16
+ end
17
+
18
+ def self.editable_by?(user, subject)
19
+ user.admin?
20
+ end
21
+
22
+ def self.deletable_by?(user, subject)
23
+ user.admin?
24
+ end
9
25
  end
10
26
  end
@@ -6,14 +6,31 @@ module Pbw
6
6
  validates_presence_of :name
7
7
 
8
8
  belongs_to :area
9
+ belongs_to :user
9
10
  has_and_belongs_to_many :capabilities
10
11
  has_and_belongs_to_many :constraints
11
12
  has_and_belongs_to_many :triggers
12
- has_and_belongs_to_many :users
13
+ has_and_belongs_to_many :attached_processes
13
14
  has_many :item_containers
14
15
 
15
16
  attr_accessible :name
16
17
 
18
+ def self.viewable_by?(user, subject)
19
+ user.admin? || subject.user == user
20
+ end
21
+
22
+ def self.creatable_by?(user, subject)
23
+ true
24
+ end
25
+
26
+ def self.editable_by?(user, subject)
27
+ user.admin? || subject.user == user
28
+ end
29
+
30
+ def self.deletable_by?(user, subject)
31
+ user.admin? || subject.user == user
32
+ end
33
+
17
34
  def before_ownership(user)
18
35
  # stub method
19
36
  true
@@ -50,6 +67,14 @@ module Pbw
50
67
  # stub method
51
68
  end
52
69
 
70
+ def attach_tick_process(process, ticks_to_wait=0)
71
+ AttachedProcess.create(token: self, process: process, tickable: true, ticks_waiting: ticks_to_wait)
72
+ end
73
+
74
+ def attach_update_process(process, updates_to_wait=0)
75
+ AttachedProcess.create(token: self, process: process, updatable: true, updates_waiting: updates_to_wait)
76
+ end
77
+
53
78
  def can_convert?(item)
54
79
  self.capabilities.any?{|c| c.can_convert?(item)}
55
80
  end
@@ -4,6 +4,26 @@ module Pbw
4
4
  has_and_belongs_to_many :areas
5
5
  belongs_to :process
6
6
 
7
+ def self.viewable_by?(user, subject)
8
+ return true if user.admin?
9
+ subject.tokens.each do |token|
10
+ return true token.user && token.user == user
11
+ end
12
+ false
13
+ end
14
+
15
+ def self.creatable_by?(user, subject)
16
+ user.admin?
17
+ end
18
+
19
+ def self.editable_by?(user, subject)
20
+ user.admin?
21
+ end
22
+
23
+ def self.deletable_by?(user, subject)
24
+ user.admin?
25
+ end
26
+
7
27
  def trigger?(token_or_area)
8
28
  # stub method
9
29
  end