pbw 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/app/models/pbw/area.rb +85 -2
- data/app/models/pbw/capability.rb +28 -0
- data/app/models/pbw/changeset.rb +22 -0
- data/app/models/pbw/constraint.rb +23 -0
- data/app/models/pbw/item.rb +36 -0
- data/app/models/pbw/item_container.rb +82 -2
- data/app/models/pbw/item_conversion.rb +66 -2
- data/app/models/pbw/process.rb +41 -2
- data/app/models/pbw/rule.rb +1 -2
- data/app/models/pbw/token.rb +134 -2
- data/app/models/pbw/trigger.rb +9 -0
- data/app/models/pbw/user.rb +1 -1
- data/config/initializers/devise.rb +0 -2
- data/config/routes.rb +10 -7
- data/lib/generators/pbw/area/USAGE +5 -3
- data/lib/generators/pbw/area/area_generator.rb +5 -0
- data/lib/generators/pbw/area/templates/model.coffee +2 -2
- data/lib/generators/pbw/install/USAGE +7 -0
- data/lib/generators/pbw/item/USAGE +5 -3
- data/lib/generators/pbw/item/item_generator.rb +9 -2
- data/lib/generators/pbw/item/templates/index.erb +6 -0
- data/lib/generators/pbw/item/templates/model.coffee +14 -0
- data/lib/generators/pbw/item/templates/router.coffee +31 -0
- data/lib/generators/pbw/item/templates/templates/edit.jst +21 -0
- data/lib/generators/pbw/item/templates/templates/index.jst +17 -0
- data/lib/generators/pbw/item/templates/templates/model.jst +8 -0
- data/lib/generators/pbw/item/templates/templates/new.jst +21 -0
- data/lib/generators/pbw/item/templates/templates/show.jst +14 -0
- data/lib/generators/pbw/item/templates/views/edit_view.coffee +24 -0
- data/lib/generators/pbw/item/templates/views/index_view.coffee +20 -0
- data/lib/generators/pbw/item/templates/views/model_view.coffee +19 -0
- data/lib/generators/pbw/item/templates/views/new_view.coffee +37 -0
- data/lib/generators/pbw/item/templates/views/show_view.coffee +8 -0
- data/lib/generators/pbw/rules/command/command_generator.rb +3 -0
- data/lib/generators/pbw/scaffold_generator.rb +2 -1
- data/lib/generators/pbw/token/USAGE +5 -3
- data/lib/generators/pbw/token/templates/index.erb +6 -0
- data/lib/generators/pbw/token/templates/model.coffee +14 -0
- data/lib/generators/pbw/token/templates/router.coffee +31 -0
- data/lib/generators/pbw/token/templates/templates/edit.jst +21 -0
- data/lib/generators/pbw/token/templates/templates/index.jst +17 -0
- data/lib/generators/pbw/token/templates/templates/model.jst +8 -0
- data/lib/generators/pbw/token/templates/templates/new.jst +21 -0
- data/lib/generators/pbw/token/templates/templates/show.jst +14 -0
- data/lib/generators/pbw/token/templates/views/edit_view.coffee +24 -0
- data/lib/generators/pbw/token/templates/views/index_view.coffee +20 -0
- data/lib/generators/pbw/token/templates/views/model_view.coffee +19 -0
- data/lib/generators/pbw/token/templates/views/new_view.coffee +37 -0
- data/lib/generators/pbw/token/templates/views/show_view.coffee +8 -0
- data/lib/generators/pbw/token/token_generator.rb +8 -1
- data/lib/pbw/version.rb +1 -1
- metadata +31 -5
- data/app/models/pbw/user_token.rb +0 -16
- data/lib/generators/pbw/command/command_generator.rb +0 -3
- /data/lib/generators/pbw/{command → rules/command}/USAGE +0 -0
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTU1NGI1MTU5Nzk3MjU0OGRkNWM0NGYyZWMwYzU0ZGM1NWFkYWYxNQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NjMzOTU2YTNmMDhkOGMzYjk1NjBmMzEyMGZmMzNmZmQ3ODkxYThlMQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
N2ZhZmExNTBkMTVlMTc4NDVlNjYzYjA3MDY4MzU2YmU0YTU3OGI0Y2ExMTcw
|
10
|
+
OGZkN2M4YjljOWZjMjFiNDM1OWI0MjZiNWY4ZTM0NTZmMGZlMDMyNTg3NGY5
|
11
|
+
NmNkNGNmZjM2ZDAyN2RhYThkNDMyYzNhYjYzZDM5M2E2YjAxZjg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MmE3NjI0YjUwOGUxNTMxYjI5MzM2NzQ0MTZjODhmZjA3MzRkYjkyMjZkOWVh
|
14
|
+
Y2VhYjUzZjU3Y2ZlZTYyN2QyMTk4MjMyMmUwYzU4MTQyZDk5ZDQyY2M3OGY3
|
15
|
+
MDI3MzJjMjhhNDQxMGY5ZjI5NTkwZTc3MTViMjU4ODRlNTQ4YWI=
|
data/app/models/pbw/area.rb
CHANGED
@@ -6,12 +6,95 @@ module Pbw
|
|
6
6
|
validates_presence_of :name
|
7
7
|
validates_uniqueness_of :name
|
8
8
|
|
9
|
-
|
9
|
+
has_many :tokens
|
10
10
|
has_many :item_containers
|
11
11
|
has_and_belongs_to_many :constraints
|
12
|
-
has_and_belongs_to_many :processes
|
13
12
|
has_and_belongs_to_many :triggers
|
14
13
|
|
15
14
|
attr_accessible :name
|
15
|
+
|
16
|
+
def before_token_enters(token)
|
17
|
+
# stub method
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
def after_token_enters(token)
|
22
|
+
# stub method
|
23
|
+
end
|
24
|
+
|
25
|
+
def before_token_leaves(token)
|
26
|
+
# stub method
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def after_token_leaves(token)
|
31
|
+
# stub method
|
32
|
+
end
|
33
|
+
|
34
|
+
def before_add_item(item, quantity)
|
35
|
+
# stub method
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def after_add_item(item, quantity)
|
40
|
+
# stub method
|
41
|
+
end
|
42
|
+
|
43
|
+
def before_remove_item(item, quantity)
|
44
|
+
# stub method
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
def after_remove_item(item, quantity)
|
49
|
+
# stub method
|
50
|
+
end
|
51
|
+
|
52
|
+
def count_item(item)
|
53
|
+
container = ItemContainer.find_for_area(self)
|
54
|
+
container ? container.quantity : 0
|
55
|
+
end
|
56
|
+
|
57
|
+
def add_item!(item, quantity)
|
58
|
+
return false unless quantity && quantity.responds_to?(:abs)
|
59
|
+
return remove_item!(item, quantity.abs) if quantity < 0
|
60
|
+
return false unless item && before_add_item(item,quantity)
|
61
|
+
ItemContainer.find_or_create_for_area(self, item, quantity)
|
62
|
+
end
|
63
|
+
|
64
|
+
def remove_item!(item, quantity)
|
65
|
+
return false unless quantity && quantity.responds_to?(:abs)
|
66
|
+
return add_item!(item, quantity.abs) if quantity < 0
|
67
|
+
return false unless item && before_remove_item(item,quantity)
|
68
|
+
ItemContainer.find_or_create_for_area(self, item, (0 - quantity))
|
69
|
+
end
|
70
|
+
|
71
|
+
def has_constraint?(constraint)
|
72
|
+
constraint = Constraint.find(constraint) if constraint.is_a?(String)
|
73
|
+
self.constraints.include?(constraint)
|
74
|
+
end
|
75
|
+
|
76
|
+
def add_constraint!(constraint)
|
77
|
+
return false unless constraint && constraint.before_add(self)
|
78
|
+
self.constraints << constraint
|
79
|
+
save
|
80
|
+
constraint.after_add(self)
|
81
|
+
self
|
82
|
+
end
|
83
|
+
|
84
|
+
def remove_constraint!(constraint)
|
85
|
+
return false unless constraint && constraint.before_remove(self)
|
86
|
+
self.constraints.delete_if{|c| c.name == constraint.name}
|
87
|
+
save
|
88
|
+
constraint.after_remove(self)
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def check_constraints_and_capabilities(&changeset)
|
93
|
+
self.constraints.any?{|c| !c.before_process(self, changeset)}
|
94
|
+
end
|
95
|
+
|
96
|
+
def check_triggers!
|
97
|
+
self.triggers.each{|t| t.check! }
|
98
|
+
end
|
16
99
|
end
|
17
100
|
end
|
@@ -1,5 +1,33 @@
|
|
1
1
|
module Pbw
|
2
2
|
class Capability < Rule
|
3
3
|
has_and_belongs_to_many :tokens
|
4
|
+
|
5
|
+
def before_process(token, &changeset)
|
6
|
+
# stub method
|
7
|
+
true
|
8
|
+
end
|
9
|
+
|
10
|
+
def before_add(token)
|
11
|
+
# stub method
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def after_add(token)
|
16
|
+
# stub method
|
17
|
+
end
|
18
|
+
|
19
|
+
def before_remove(token)
|
20
|
+
# stub method
|
21
|
+
true
|
22
|
+
end
|
23
|
+
|
24
|
+
def after_remove(token)
|
25
|
+
# stub method
|
26
|
+
end
|
27
|
+
|
28
|
+
def can_convert?(item)
|
29
|
+
# stub method
|
30
|
+
false
|
31
|
+
end
|
4
32
|
end
|
5
33
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Pbw
|
2
|
+
class Changeset
|
3
|
+
def initialize(changes=nil)
|
4
|
+
@changes = changes || {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def add_change(model,field,value)
|
8
|
+
fields = @changes[model] || {}
|
9
|
+
fields[field] = value
|
10
|
+
@changes[model] = value
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def models_changed
|
15
|
+
@changes.keys
|
16
|
+
end
|
17
|
+
|
18
|
+
def changes_for_model(model)
|
19
|
+
@changes[model]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -2,5 +2,28 @@ module Pbw
|
|
2
2
|
class Constraint < Rule
|
3
3
|
has_and_belongs_to_many :tokens
|
4
4
|
has_and_belongs_to_many :areas
|
5
|
+
|
6
|
+
def before_process(token_or_area, &changeset)
|
7
|
+
# stub method
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
def before_add(token_or_area)
|
12
|
+
# stub method
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def after_add(token_or_area)
|
17
|
+
# stub method
|
18
|
+
end
|
19
|
+
|
20
|
+
def before_remove(token_or_area)
|
21
|
+
# stub method
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def after_remove(token_or_area)
|
26
|
+
# stub method
|
27
|
+
end
|
5
28
|
end
|
6
29
|
end
|
data/app/models/pbw/item.rb
CHANGED
@@ -11,5 +11,41 @@ module Pbw
|
|
11
11
|
has_many :item_conversions
|
12
12
|
|
13
13
|
attr_accessible :name
|
14
|
+
|
15
|
+
def before_add(container, quantity)
|
16
|
+
# stub method
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
def after_add(container, quantity)
|
21
|
+
# stub method
|
22
|
+
end
|
23
|
+
|
24
|
+
def before_remove(container, quantity)
|
25
|
+
# stub method
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def after_remove(container, quantity)
|
30
|
+
# stub method
|
31
|
+
end
|
32
|
+
|
33
|
+
def before_transfer(from, to, quantity)
|
34
|
+
# stub method
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
def after_transfer(from, to, quantity)
|
39
|
+
# stub method
|
40
|
+
end
|
41
|
+
|
42
|
+
def before_conversion(to, quantity)
|
43
|
+
# stub method
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
47
|
+
def after_conversion(to, quantity)
|
48
|
+
# stub method
|
49
|
+
end
|
14
50
|
end
|
15
51
|
end
|
@@ -3,10 +3,90 @@ module Pbw
|
|
3
3
|
include ::Mongoid::Document
|
4
4
|
include ::Mongoid::Timestamps
|
5
5
|
belongs_to :item
|
6
|
-
field :quantity, :type => Float
|
6
|
+
field :quantity, :type => Float, :default => 0
|
7
|
+
validates_numericality_of :quantity, :greater_than_or_equal_to => 0
|
7
8
|
|
8
|
-
belongs_to :
|
9
|
+
belongs_to :token
|
9
10
|
belongs_to :area
|
10
11
|
belongs_to :user
|
12
|
+
|
13
|
+
attr_accessible :item, :token, :area, :user, :quantity
|
14
|
+
|
15
|
+
def self.find_or_create_for_token(token, item, quantity_to_add)
|
16
|
+
container = where(token: token, item: item).first
|
17
|
+
container = new(token: token, item: item) unless container
|
18
|
+
container.add_item(quantity_to_add) && container.save ? container : false
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.find_for_token(token, item)
|
22
|
+
where(token: token, item: item).first
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.find_or_create_for_area(area, item, quantity_to_add)
|
26
|
+
container = where(area: area, item: item).first
|
27
|
+
container = new(area: area, item: item) unless container
|
28
|
+
container.add_item(quantity_to_add) && container.save ? container : false
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.find_for_area(area, item)
|
32
|
+
where(area: area, item: item).first
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.find_or_create_for_user(user, item, quantity_to_add)
|
36
|
+
container = where(user: user, item: item).first
|
37
|
+
container = new(user: user, item: item) unless container
|
38
|
+
container.add_item(quantity_to_add) && container.save ? container : false
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.find_for_user(user, item)
|
42
|
+
where(user: user, item: item).first
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_item(quantity)
|
46
|
+
return remove_item!(quantity.abs) if quantity < 0
|
47
|
+
return false unless self.item.before_add(self,quantity)
|
48
|
+
self.quantity = self.quantity + quantity
|
49
|
+
self.item.after_add(self,quantity)
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def remove_item(quantity)
|
54
|
+
return add_item!(quantity.abs) if quantity < 0
|
55
|
+
return false unless self.item.before_remove(self,quantity)
|
56
|
+
self.quantity = self.quantity - quantity
|
57
|
+
self.item.after_remove(self,quantity)
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def transfer_item!(to, quantity)
|
62
|
+
return false unless to && quantity
|
63
|
+
return false unless self.item.before_transfer(belongs_to, to, quantity)
|
64
|
+
remove_item(quantity)
|
65
|
+
return false unless save
|
66
|
+
if to.class.ancestors.include?(Area)
|
67
|
+
container = find_or_create_for_area(to, self.item, quantity)
|
68
|
+
elsif to.class.ancestors.include?(Token)
|
69
|
+
container = find_or_create_for_token(to, self.item, quantity)
|
70
|
+
elsif to.class.ancestors.include?(User)
|
71
|
+
container = find_or_create_for_user(to, self.item, quantity)
|
72
|
+
else
|
73
|
+
return false
|
74
|
+
end
|
75
|
+
unless container
|
76
|
+
add_item(quantity) && save
|
77
|
+
false
|
78
|
+
else
|
79
|
+
self.item.after_transfer(belongs_to, to, quantity)
|
80
|
+
container
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def belongs_to
|
85
|
+
self.token || self.area || self.user
|
86
|
+
end
|
87
|
+
|
88
|
+
def empty?
|
89
|
+
self.quantity == 0
|
90
|
+
end
|
11
91
|
end
|
12
92
|
end
|
@@ -3,7 +3,71 @@ module Pbw
|
|
3
3
|
include ::Mongoid::Document
|
4
4
|
include ::Mongoid::Timestamps
|
5
5
|
belongs_to :item
|
6
|
-
field :
|
7
|
-
|
6
|
+
field :from, :type => Hash
|
7
|
+
|
8
|
+
def set_from_item(item, quantity)
|
9
|
+
return false unless item && quantity
|
10
|
+
self.from ||= {}
|
11
|
+
self.from[item._id] = quantity
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def from_items
|
16
|
+
return @items if defined?(@items) && !changed?
|
17
|
+
return {} unless self.from && !self.from.empty?
|
18
|
+
@items = {}
|
19
|
+
self.from.keys.each do |id|
|
20
|
+
begin
|
21
|
+
@items[Item.find(id)] = self.from[id]
|
22
|
+
rescue Exception => e
|
23
|
+
logger.error e
|
24
|
+
end
|
25
|
+
end
|
26
|
+
@items
|
27
|
+
end
|
28
|
+
|
29
|
+
def token_from_items_containers(token)
|
30
|
+
containers = {}
|
31
|
+
from_items.keys.each do |from_item|
|
32
|
+
containers[from_item] = ItemContainer.find_for_token(token,from_item)
|
33
|
+
end
|
34
|
+
containers
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.max_convert(token, item)
|
38
|
+
return 0 unless token && item && token.can_convert?(item)
|
39
|
+
conversion = where(item: item).first
|
40
|
+
return 0 unless conversion
|
41
|
+
containers = conversion.token_from_items_containers(token)
|
42
|
+
quantity = 0
|
43
|
+
containers.keys.each do |from_item|
|
44
|
+
unless containers[from_item]
|
45
|
+
quantity = 0
|
46
|
+
else
|
47
|
+
quantity = containers[from_item].quantity / conversion.from_items[from_item]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
quantity
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.convert!(token, item, quantity=1)
|
54
|
+
return false unless token && item && quantity && token.can_convert?(item)
|
55
|
+
conversion = where(item: item).first
|
56
|
+
return false unless conversion
|
57
|
+
containers = conversion.token_from_items_containers(token)
|
58
|
+
containers.keys.each do |from_item|
|
59
|
+
return false unless containers[from_item] && containers[from_item].quantity >= (conversion.from_items[from_item] * quantity)
|
60
|
+
end
|
61
|
+
containers.keys.each do |from_item|
|
62
|
+
containers[from_item].remove_item(conversion.from_items[from_item] * quantity)
|
63
|
+
containers[from_item].save
|
64
|
+
end
|
65
|
+
unless token.add_item!(item,quantity)
|
66
|
+
containers.keys.each do |from_item|
|
67
|
+
containers[from_item].add_item(conversion.from_items[from_item] * quantity)
|
68
|
+
containers[from_item].save
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
8
72
|
end
|
9
73
|
end
|
data/app/models/pbw/process.rb
CHANGED
@@ -1,10 +1,49 @@
|
|
1
1
|
module Pbw
|
2
2
|
class Process < Rule
|
3
|
-
has_and_belongs_to_many :tokens
|
4
|
-
has_and_belongs_to_many :areas
|
5
3
|
has_many :triggers
|
6
4
|
|
7
5
|
field :run_tick, :type => Boolean
|
8
6
|
field :run_update, :type => Boolean
|
7
|
+
|
8
|
+
def before_run(token_or_area)
|
9
|
+
# stub method
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def after_triggers(token_or_area)
|
14
|
+
# stub method
|
15
|
+
end
|
16
|
+
|
17
|
+
def changeset(token_or_area)
|
18
|
+
# stub method
|
19
|
+
raise "Not implemented"
|
20
|
+
end
|
21
|
+
|
22
|
+
def execute_changeset!(&changeset)
|
23
|
+
changeset.models_changed.each do |model|
|
24
|
+
changes = changeset.changes_for_model(model)
|
25
|
+
changes.keys.each do |field|
|
26
|
+
model.send("#{field}=".to_sym,changes[field])
|
27
|
+
end
|
28
|
+
return false unless model.save
|
29
|
+
end
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def run!(token_or_area)
|
34
|
+
return false unless before_run(token_or_area)
|
35
|
+
changes = changeset(token_or_area)
|
36
|
+
return false unless changes
|
37
|
+
raise "Invalid object returned from changeset method in #{self.class.name}" unless changes.is_a?(Changeset)
|
38
|
+
return false unless token_or_area.check_constraints_and_capabilities(changes)
|
39
|
+
execute_changeset!(changes)
|
40
|
+
token_or_area.check_triggers!
|
41
|
+
after_triggers(token_or_area)
|
42
|
+
end
|
43
|
+
|
44
|
+
def schedule!(token_or_area)
|
45
|
+
# TODO
|
46
|
+
raise "Not implemented"
|
47
|
+
end
|
9
48
|
end
|
10
49
|
end
|
data/app/models/pbw/rule.rb
CHANGED
data/app/models/pbw/token.rb
CHANGED
@@ -5,12 +5,144 @@ module Pbw
|
|
5
5
|
field :name, type: String
|
6
6
|
validates_presence_of :name
|
7
7
|
|
8
|
+
belongs_to :area
|
8
9
|
has_and_belongs_to_many :capabilities
|
9
10
|
has_and_belongs_to_many :constraints
|
10
|
-
has_and_belongs_to_many :processes
|
11
11
|
has_and_belongs_to_many :triggers
|
12
|
-
|
12
|
+
has_and_belongs_to_many :users
|
13
|
+
has_many :item_containers
|
13
14
|
|
14
15
|
attr_accessible :name
|
16
|
+
|
17
|
+
def before_ownership(user)
|
18
|
+
# stub method
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def after_ownership(user)
|
23
|
+
# stub method
|
24
|
+
end
|
25
|
+
|
26
|
+
def before_move(area)
|
27
|
+
# stub method
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
def after_move(area)
|
32
|
+
# stub method
|
33
|
+
end
|
34
|
+
|
35
|
+
def before_add_item(item, quantity)
|
36
|
+
# stub method
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
def after_add_item(item, quantity)
|
41
|
+
# stub method
|
42
|
+
end
|
43
|
+
|
44
|
+
def before_remove_item(item, quantity)
|
45
|
+
# stub method
|
46
|
+
true
|
47
|
+
end
|
48
|
+
|
49
|
+
def after_remove_item(item, quantity)
|
50
|
+
# stub method
|
51
|
+
end
|
52
|
+
|
53
|
+
def can_convert?(item)
|
54
|
+
self.capabilities.any?{|c| c.can_convert?(item)}
|
55
|
+
end
|
56
|
+
|
57
|
+
def count_item(item)
|
58
|
+
container = ItemContainer.find_for_token(self)
|
59
|
+
container ? container.quantity : 0
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_item!(item, quantity)
|
63
|
+
return false unless quantity && quantity.responds_to?(:abs)
|
64
|
+
return remove_item!(item, quantity.abs) if quantity < 0
|
65
|
+
return false unless item && before_add_item(item,quantity)
|
66
|
+
ItemContainer.find_or_create_for_token(self, item, quantity)
|
67
|
+
end
|
68
|
+
|
69
|
+
def remove_item!(item, quantity)
|
70
|
+
return false unless quantity && quantity.responds_to?(:abs)
|
71
|
+
return add_item!(item, quantity.abs) if quantity < 0
|
72
|
+
return false unless item && before_remove_item(item,quantity)
|
73
|
+
ItemContainer.find_or_create_for_token(self, item, (0 - quantity))
|
74
|
+
end
|
75
|
+
|
76
|
+
def set_ownership!(user)
|
77
|
+
return false unless user && before_ownership(user)
|
78
|
+
self.user = user
|
79
|
+
if save
|
80
|
+
after_ownership(user)
|
81
|
+
end
|
82
|
+
self.user
|
83
|
+
end
|
84
|
+
|
85
|
+
def move_to_area!(area)
|
86
|
+
return false unless area && before_move(area) && (self.area.nil? || self.area.before_token_leaves(self)) && area.before_token_enters(self)
|
87
|
+
old_area = self.area
|
88
|
+
self.area = area
|
89
|
+
if save
|
90
|
+
after_move(area)
|
91
|
+
old_area.after_token_leaves(self) if old_area
|
92
|
+
area.after_token_enters(self)
|
93
|
+
end
|
94
|
+
self.area
|
95
|
+
end
|
96
|
+
|
97
|
+
def has_constraint?(constraint)
|
98
|
+
constraint = Constraint.find(constraint) if constraint.is_a?(String)
|
99
|
+
self.constraints.include?(constraint)
|
100
|
+
end
|
101
|
+
|
102
|
+
def add_constraint!(constraint)
|
103
|
+
return false unless constraint && constraint.before_add(self)
|
104
|
+
self.constraints << constraint
|
105
|
+
save
|
106
|
+
constraint.after_add(self)
|
107
|
+
self
|
108
|
+
end
|
109
|
+
|
110
|
+
def remove_constraint!(constraint)
|
111
|
+
return false unless constraint && constraint.before_remove(self)
|
112
|
+
self.constraints.delete_if{|c| c.name == constraint.name}
|
113
|
+
save
|
114
|
+
constraint.after_remove(self)
|
115
|
+
self
|
116
|
+
end
|
117
|
+
|
118
|
+
def has_capability?(capability)
|
119
|
+
capability = Capability.find(capability) if capability.is_a?(String)
|
120
|
+
self.capabilities.include?(capability)
|
121
|
+
end
|
122
|
+
|
123
|
+
def add_capability!(capability)
|
124
|
+
return false unless capability && capability.before_add(self)
|
125
|
+
self.capabilities << capability
|
126
|
+
save
|
127
|
+
capability.after_add(self)
|
128
|
+
self
|
129
|
+
end
|
130
|
+
|
131
|
+
def remove_capability!(capability)
|
132
|
+
return false unless capability && capability.before_remove(self)
|
133
|
+
self.capabilities.delete_if{|c| c.name == capability.name}
|
134
|
+
save
|
135
|
+
capability.after_remove(self)
|
136
|
+
self
|
137
|
+
end
|
138
|
+
|
139
|
+
def check_constraints_and_capabilities(&changeset)
|
140
|
+
self.capabilities.any?{|c| !c.before_process(self, changeset)}
|
141
|
+
self.constraints.any?{|c| !c.before_process(self, changeset)}
|
142
|
+
end
|
143
|
+
|
144
|
+
def check_triggers!
|
145
|
+
self.triggers.each{|t| t.check! }
|
146
|
+
end
|
15
147
|
end
|
16
148
|
end
|
data/app/models/pbw/trigger.rb
CHANGED
@@ -3,5 +3,14 @@ module Pbw
|
|
3
3
|
has_and_belongs_to_many :tokens
|
4
4
|
has_and_belongs_to_many :areas
|
5
5
|
belongs_to :process
|
6
|
+
|
7
|
+
def trigger?(token_or_area)
|
8
|
+
# stub method
|
9
|
+
end
|
10
|
+
|
11
|
+
def check!(token_or_area)
|
12
|
+
return false unless self.process && trigger?(token_or_area)
|
13
|
+
self.process.schedule!(token_or_area)
|
14
|
+
end
|
6
15
|
end
|
7
16
|
end
|
data/app/models/pbw/user.rb
CHANGED
data/config/routes.rb
CHANGED
@@ -3,15 +3,18 @@ Pbw::Engine.routes.draw do
|
|
3
3
|
class_name: 'Pbw::User',
|
4
4
|
module: :devise
|
5
5
|
}
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
%W{areas capabilities constraints processes items tokens triggers}.each do |controller|
|
7
|
+
get "#{controller}/:_type" => "#{controller}\#index"
|
8
|
+
get "#{controller}/:_type/:id" => "#{controller}\#show"
|
9
|
+
post "#{controller}/:_type" => "#{controller}\#create"
|
10
|
+
get "#{controller}/:_type/new" => "#{controller}\#new"
|
11
|
+
get "#{controller}/:_type/:id/edit" => "#{controller}\#edit"
|
12
|
+
delete "#{controller}/:_type/:id" => "#{controller}\#delete"
|
13
|
+
put "#{controller}/:_type/:id" => "#{controller}\#update"
|
14
|
+
end
|
15
|
+
|
11
16
|
resources :item_containers
|
12
17
|
resources :item_conversions
|
13
18
|
resources :item_transfers
|
14
|
-
resources :tokens
|
15
|
-
resources :triggers
|
16
19
|
resources :user_tokens
|
17
20
|
end
|