state_machinable 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a949fec988deeff65e3fefe04c285c9d4c7c57c1
4
- data.tar.gz: e8289ec726bcbae2a8e2c9c0c5a56dab7032351a
3
+ metadata.gz: 478c68fcd3ae95aefb882ef5d4a1aa36721e92ed
4
+ data.tar.gz: 8e125f87148afe885013797496b7763fa362357f
5
5
  SHA512:
6
- metadata.gz: 474171b17f3ec8e8310e5b196c8a122cb44bffcd37276acaddec5842f2bcb5757e9cdbf5010f24bdbbdfed0aee403eeef566fc0c1f113a13aff48ab90bf8c4a7
7
- data.tar.gz: 17b8018778787ff47d3b9b1f2eebd5fb261e90af00cc955f1bb1aea00f562d134a18416634509d20856d62ba244266b20bf9b1cd792189d8a6d2918ac011fb86
6
+ metadata.gz: 19132527321ed15b2a05e1d07186a592984e27e5da851a224566fff9a7d94473354476c706dde814ad779dfe81a97c1f97547231b0601fae2c9e6577d5fec7d7
7
+ data.tar.gz: e53ceb952d1feb6ac3dc88c46d95e94104fa8ee9897a539dd82042cd85775c47ffc816cc2786115dc62383ec6a6f655043f4cd8cc2d9f40b80fdad5a10f99fd2
@@ -0,0 +1,61 @@
1
+ module StateMachinable
2
+ module Base
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ def state_class(state)
7
+ "#{self}::#{state.classify}".constantize
8
+ rescue NameError
9
+ nil
10
+ end
11
+ end
12
+
13
+ included do
14
+ include Statesman::Machine
15
+
16
+ state :initial, :initial => true
17
+
18
+ before_transition do |obj, _transition|
19
+ state_class = obj.state_machine.class.state_class(obj.state_machine.current_state)
20
+ if state_class.present? && state_class.respond_to?(:exit)
21
+ state_class.exit(obj)
22
+ end
23
+ end
24
+
25
+ after_transition do |obj, transition|
26
+ obj.update_column(:current_state, transition.to_state)
27
+
28
+ state_class = obj.state_machine.class.state_class(transition.to_state)
29
+ if state_class.present? && state_class.respond_to?(:enter)
30
+ state_class.enter(obj)
31
+ end
32
+ end
33
+
34
+ def method_missing(name, *args, &block)
35
+ begin
36
+ events = "#{self.class}::EVENTS".constantize
37
+ rescue NameError
38
+ events = []
39
+ end
40
+
41
+ events.concat([:ev_before_save, :ev_after_save]).uniq
42
+ clean_name = name.to_s.chomp('!').to_sym
43
+
44
+ if events.include?(clean_name)
45
+ state_class = self.class.state_class(self.current_state)
46
+ if state_class.present? && state_class.respond_to?(clean_name)
47
+ state_class.send(clean_name, self.object, *args)
48
+ else
49
+ if name.to_s.last == '!'
50
+ raise StateMachinable::EventNotHandledException.new(:event => clean_name, :state => self.current_state)
51
+ else
52
+ nil
53
+ end
54
+ end
55
+ else
56
+ super
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,7 @@
1
+ module StateMachinable
2
+ class EventNotHandledException < StandardError
3
+ def initialize(event:, state:)
4
+ super("EVENT '#{event}' not implemented for state '#{state}'")
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,40 @@
1
+ module StateMachinable
2
+ module Model
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ def state_machine_class
7
+ "#{self}StateMachine".constantize
8
+ end
9
+
10
+ def transition_class
11
+ "#{self}Transition".constantize
12
+ end
13
+ end
14
+
15
+ included do
16
+ before_save :send_ev_before_save, :if => Proc.new { |obj| obj.changed? }
17
+ after_save :send_ev_after_save, :if => Proc.new { |obj| !obj.id_changed? && obj.changed? }
18
+ after_save :transition_to_initial_state, :if => Proc.new { |obj| obj.id_changed? }
19
+ delegate :can_transition_to?, :transition_to!, :transition_to, :to => :state_machine
20
+
21
+ def state_machine
22
+ @state_machine ||= self.class.state_machine_class.new(self, :transition_class => self.class.transition_class)
23
+ end
24
+
25
+ def send_ev_before_save
26
+ self.state_machine.send('ev_before_save')
27
+ end
28
+
29
+ def send_ev_after_save
30
+ self.state_machine.send('ev_after_save')
31
+ end
32
+
33
+ private def transition_to_initial_state
34
+ if !self.respond_to?(:skip_state_machine?) || !self.skip_state_machine?
35
+ self.transition_to!(self.state_machine.class.successors['initial'].first)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module StateMachinable
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -1,41 +1,5 @@
1
- require "state_machinable/version"
2
1
  require 'active_support'
3
-
4
- module StateMachinable
5
- extend ActiveSupport::Concern
6
-
7
- class_methods do
8
- def state_machine_class
9
- "#{self}StateMachine".constantize
10
- end
11
-
12
- def transition_class
13
- "#{self}Transition".constantize
14
- end
15
- end
16
-
17
- included do
18
- before_save :send_ev_before_save, :if => Proc.new { |obj| obj.changed? }
19
- after_save :send_ev_after_save, :if => Proc.new { |obj| !obj.id_changed? && obj.changed? }
20
- after_save :transition_to_initial_state, :if => Proc.new { |obj| obj.id_changed? }
21
- delegate :can_transition_to?, :transition_to!, :transition_to, :to => :state_machine
22
-
23
- def state_machine
24
- @state_machine ||= self.class.state_machine_class.new(self, :transition_class => self.class.transition_class)
25
- end
26
-
27
- def send_ev_before_save
28
- self.state_machine.send('ev_before_save')
29
- end
30
-
31
- def send_ev_after_save
32
- self.state_machine.send('ev_after_save')
33
- end
34
-
35
- private def transition_to_initial_state
36
- if !self.respond_to?(:skip_state_machine?) || !self.skip_state_machine?
37
- self.transition_to!(self.state_machine.class.successors['initial'].first)
38
- end
39
- end
40
- end
41
- end
2
+ require "state_machinable/event_not_handled_exception"
3
+ require "state_machinable/version"
4
+ require "state_machinable/base"
5
+ require "state_machinable/model"
@@ -2,7 +2,6 @@
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'state_machinable/version'
5
- require 'base_state_machine'
6
5
 
7
6
  Gem::Specification.new do |spec|
8
7
  spec.name = "state_machinable"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: state_machinable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Santiago Herrera
@@ -103,8 +103,10 @@ files:
103
103
  - Rakefile
104
104
  - bin/console
105
105
  - bin/setup
106
- - lib/base_state_machine.rb
107
106
  - lib/state_machinable.rb
107
+ - lib/state_machinable/base.rb
108
+ - lib/state_machinable/event_not_handled_exception.rb
109
+ - lib/state_machinable/model.rb
108
110
  - lib/state_machinable/version.rb
109
111
  - state_machinable.gemspec
110
112
  homepage: https://github.com/bodyshopbidsdotcom/state_machinable
@@ -1,61 +0,0 @@
1
- require 'active_support'
2
-
3
- module BaseStateMachine
4
- extend ActiveSupport::Concern
5
-
6
- class_methods do
7
- def state_class(state)
8
- "#{self}::#{state.classify}".constantize
9
- rescue NameError
10
- nil
11
- end
12
- end
13
-
14
- included do
15
- include Statesman::Machine
16
-
17
- state :initial, :initial => true
18
-
19
- before_transition do |obj, _transition|
20
- state_class = obj.state_machine.class.state_class(obj.state_machine.current_state)
21
- if state_class.present? && state_class.respond_to?(:exit)
22
- state_class.exit(obj)
23
- end
24
- end
25
-
26
- after_transition do |obj, transition|
27
- obj.update_column(:current_state, transition.to_state)
28
-
29
- state_class = obj.state_machine.class.state_class(transition.to_state)
30
- if state_class.present? && state_class.respond_to?(:enter)
31
- state_class.enter(obj)
32
- end
33
- end
34
-
35
- def method_missing(name, *args, &block)
36
- begin
37
- events = "#{self.class}::EVENTS".constantize
38
- rescue NameError
39
- events = []
40
- end
41
-
42
- events.concat([:ev_before_save, :ev_after_save]).uniq
43
- clean_name = name.to_s.chomp('!').to_sym
44
-
45
- if events.include?(clean_name)
46
- state_class = self.class.state_class(self.current_state)
47
- if state_class.present? && state_class.respond_to?(clean_name)
48
- state_class.send(clean_name, self.object, *args)
49
- else
50
- if name.to_s.last == '!'
51
- raise EventNotHandledException.new(:event => clean_name, :state => self.current_state)
52
- else
53
- nil
54
- end
55
- end
56
- else
57
- super
58
- end
59
- end
60
- end
61
- end