stator 0.5.0 → 0.9.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,44 +1,39 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Stator
2
4
  class Transition
3
-
4
- ANY = '__any__'
5
-
6
- attr_reader :name
7
- attr_reader :full_name
5
+ attr_reader :namespace, :name, :attr_name, :from_states, :to_state, :class_name, :callbacks
8
6
 
9
7
  def initialize(class_name, name, namespace = nil)
10
- @class_name = class_name
11
- @name = name
12
- @namespace = namespace
13
- @full_name = [@namespace, @name].compact.join('_') if @name
14
- @froms = []
15
- @to = nil
16
- @callbacks = {}
8
+ @class_name = class_name
9
+ @name = name&.to_sym
10
+ @namespace = namespace&.to_sym
11
+ @from_states = []
12
+ @to_state = nil
13
+ @callbacks = {}
17
14
  end
18
15
 
19
- def from(*froms)
20
- @froms |= froms.map{|f| f.try(:to_s) } # nils are ok
16
+ def attr_name
17
+ @attr_name ||= generate_attr_name
21
18
  end
22
19
 
23
- def to(to)
24
- @to = to.to_s
20
+ def from_states(*new_froms)
21
+ @from_states |= new_froms
25
22
  end
23
+ alias from from_states
26
24
 
27
- def to_state
28
- @to
29
- end
30
-
31
- def from_states
32
- @froms
25
+ def to(new_to)
26
+ @to_state = new_to
33
27
  end
34
28
 
35
29
  def can?(current_state)
36
- @froms.include?(current_state) || @froms.include?(ANY) || current_state == ANY
30
+ from_states.include?(current_state) || from_states.include?(Stator::ANY) || current_state == Stator::ANY
37
31
  end
38
32
 
39
- def valid?(from, to)
40
- can?(from) &&
41
- (@to == to || @to == ANY || to == ANY)
33
+ def valid?(from_check, to_check)
34
+ from_check = from_check&.to_sym # coming from the database, i suspect
35
+
36
+ can?(from_check) && (to_check == to_state || to_check == ANY || to_state == ANY)
42
37
  end
43
38
 
44
39
  def conditional(options = {}, &block)
@@ -46,79 +41,85 @@ module Stator
46
41
  end
47
42
 
48
43
  def any
49
- ANY
44
+ Stator::ANY
50
45
  end
51
46
 
52
47
  def evaluate
53
- generate_methods unless @full_name.blank?
48
+ generate_methods if attr_name.present?
54
49
  end
55
50
 
56
- protected
51
+ private
57
52
 
58
53
  def klass
59
- @class_name.constantize
54
+ class_name.constantize
55
+ end
56
+
57
+ def generate_attr_name
58
+ if namespace == Stator.default_namespace
59
+ name
60
+ else
61
+ [namespace, name].compact.join('_').to_sym
62
+ end
60
63
  end
61
64
 
62
65
  def callbacks(kind)
63
- @callbacks[kind] || []
66
+ callbacks[kind] || []
64
67
  end
65
68
 
66
69
  def conditional_block(options = {})
67
70
  options[:use_previous] ||= false
68
71
 
69
- _namespace = @namespace
70
- _froms = @froms
71
- _to = @to
72
-
73
- Proc.new do
74
- (
75
- self._stator(_namespace).integration(self).state_changed?(options[:use_previous])
76
- ) && (
77
- _froms.include?(self._stator(_namespace).integration(self).state_was(options[:use_previous])) ||
78
- _froms.include?(::Stator::Transition::ANY)
79
- ) && (
80
- self._stator(_namespace).integration(self).state == _to ||
81
- _to == ::Stator::Transition::ANY
82
- )
72
+ _namespace = namespace
73
+ _froms = from_states
74
+ _to = to_state
75
+
76
+ proc do
77
+ integration = self.class._stator(_namespace).integration(self)
78
+
79
+ integration.state_changed?(options[:use_previous]) &&
80
+ _froms.include?(integration.state_was(options[:use_previous])) ||
81
+ _froms.include?(Stator::ANY) &&
82
+ integration.state == _to || _to == Stator::ANY
83
83
  end
84
84
  end
85
85
 
86
86
  def generate_methods
87
87
  klass.class_eval <<-EV, __FILE__, __LINE__ + 1
88
- def #{@full_name}(should_save = true)
89
- integration = _integration(#{@namespace.to_s.inspect})
88
+ def #{attr_name}(should_save = true)
89
+ integration = _stator_integration(:#{namespace})
90
90
 
91
- unless can_#{@full_name}?
92
- integration.invalid_transition!(integration.state, #{@to.inspect}) if should_save
91
+ unless can_#{attr_name}?
92
+ integration.invalid_transition!(integration.state, :#{to_state}) if should_save
93
93
  return false
94
94
  end
95
95
 
96
- integration.state = #{@to.inspect}
96
+ integration.state = :#{to_state}
97
+
97
98
  self.save if should_save
98
99
  end
99
100
 
100
- def #{@full_name}!
101
- integration = _integration(#{@namespace.to_s.inspect})
101
+ def #{attr_name}!
102
+ integration = _stator_integration(:#{namespace})
102
103
 
103
- unless can_#{@full_name}?
104
- integration.invalid_transition!(integration.state, #{@to.inspect})
104
+ unless can_#{attr_name}?
105
+ integration.invalid_transition!(integration.state, :#{to_state})
105
106
  raise ActiveRecord::RecordInvalid.new(self)
106
107
  end
107
108
 
108
- integration.state = #{@to.inspect}
109
+ integration.state = :#{to_state}
109
110
  self.save!
110
111
  end
111
112
 
112
- def can_#{@full_name}?
113
- integration = _integration(#{@namespace.to_s.inspect})
113
+ def can_#{attr_name}?
114
+ integration = _stator_integration(:#{namespace})
114
115
  return true if integration.skip_validations
115
116
 
116
- machine = self._stator(#{@namespace.to_s.inspect})
117
- transition = machine.transitions.detect{|t| t.full_name.to_s == #{@full_name.inspect}.to_s }
117
+ machine = self._stator(:#{namespace})
118
+ transition = machine.transitions.detect { |t| t.attr_name == :#{attr_name} }
119
+
118
120
  transition.can?(integration.state)
119
121
  end
120
122
  EV
121
123
  end
122
-
123
124
  end
124
125
  end
@@ -1,12 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stator
4
-
5
4
  MAJOR = 0
6
- MINOR = 5
5
+ MINOR = 9
7
6
  PATCH = 0
8
- PRERELEASE = nil
9
-
10
- VERSION = [MAJOR, MINOR, PATCH, PRERELEASE].compact.join(".")
7
+ PRERELEASE = "beta"
11
8
 
9
+ VERSION = [MAJOR, MINOR, PATCH, PRERELEASE].compact.join('.')
12
10
  end
data/lib/stator.rb CHANGED
@@ -1,6 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'stator/version'
2
4
  require 'stator/alias'
3
5
  require 'stator/integration'
4
6
  require 'stator/machine'
5
7
  require 'stator/model'
6
8
  require 'stator/transition'
9
+
10
+ require 'active_support/concern'
11
+ require 'debug'
12
+
13
+ module Stator
14
+ ANY = :__ANY__
15
+
16
+ def self.default_namespace
17
+ ENV.fetch('STATOR_NAMESPACE', :default).to_sym
18
+ end
19
+ end