low_state 0.1.2 → 0.1.3
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.
- checksums.yaml +4 -4
- data/lib/low_state.rb +90 -0
- data/lib/version.rb +5 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a7f8551226b4f95f7ef5778fb8e83cc7580007ccf9d463d151311203a6427dc3
|
|
4
|
+
data.tar.gz: 88a706762b5372cf69b96a043db9b29f24766652b560aba8843355190d8cb6e9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3633447429803efb5bc09b8c228ca84c105b3123824031786e437c91ee9c48b47da04810ef2c9096001f5098b7f5a4ad00dc12e00e2eec90e0dcd5fb2775b539
|
|
7
|
+
data.tar.gz: ef99c7f8107902aa4026063898e86f0fdc9fd5e0de6702f18c642d90495a3993fe67c4e94c66293c3ba3a84d0a46f7463915705d564e420195dc8d483d6461b2
|
data/lib/low_state.rb
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'version'
|
|
4
|
+
|
|
5
|
+
module LowState
|
|
6
|
+
class StateChangeError < StandardError; end
|
|
7
|
+
|
|
8
|
+
def current_state
|
|
9
|
+
@current_state ||= states.keys.first
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def change_state(new_state, *args)
|
|
13
|
+
state = states[new_state]
|
|
14
|
+
before_result = state.has_before_callback?(self.class) ? send(state.before, *args) : true
|
|
15
|
+
|
|
16
|
+
if before_result != false && state.can_change_state?(current_state)
|
|
17
|
+
@current_state = new_state
|
|
18
|
+
elsif before_result != false && !state.can_change_state?(current_state) && state.can_error?
|
|
19
|
+
raise StateChangeError, "State did not change from :#{current_state} to :#{new_state}"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
send(state.after, *args) if state.has_after_callback?(self.class)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def states
|
|
26
|
+
self.class.states
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.included(base)
|
|
30
|
+
class << base
|
|
31
|
+
# Class level variables because we want states to be accessed by any other included module or subclass.
|
|
32
|
+
@@states = {}
|
|
33
|
+
|
|
34
|
+
def states
|
|
35
|
+
@@states
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
base.extend ClassMethods
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
module ClassMethods
|
|
43
|
+
def low_state(state)
|
|
44
|
+
class_states = class_variable_get :@@states
|
|
45
|
+
|
|
46
|
+
if state.is_a?(Symbol)
|
|
47
|
+
class_states[state] = State.new(state:)
|
|
48
|
+
elsif state.is_a?(Hash)
|
|
49
|
+
state_name = state.keys.first
|
|
50
|
+
class_states[state_name] = State.new(state:, from: [*state[state_name]])
|
|
51
|
+
elsif state.is_a?(State)
|
|
52
|
+
class_states[state.state] = state
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class_variable_set :@@states, class_states
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class State
|
|
60
|
+
attr_reader :state, :from, :before, :after
|
|
61
|
+
|
|
62
|
+
def initialize(state:, from: nil, before: nil, after: nil, error: true)
|
|
63
|
+
@state = state
|
|
64
|
+
@from = [*from]
|
|
65
|
+
@before = before || "#{@state}_state_before"
|
|
66
|
+
@after = after || "#{@state}_state_after"
|
|
67
|
+
@error = error
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def can_change_state?(current_state)
|
|
71
|
+
if @from.nil? || @from.include?(current_state)
|
|
72
|
+
return true
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
false
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def can_error?
|
|
79
|
+
@error
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def has_before_callback?(klass)
|
|
83
|
+
@has_before_callback ||= klass.method_defined?(@before)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def has_after_callback?(klass)
|
|
87
|
+
@has_after_callback ||= klass.method_defined?(@after)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
data/lib/version.rb
ADDED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: low_state
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- maedi
|
|
@@ -17,7 +17,9 @@ email:
|
|
|
17
17
|
executables: []
|
|
18
18
|
extensions: []
|
|
19
19
|
extra_rdoc_files: []
|
|
20
|
-
files:
|
|
20
|
+
files:
|
|
21
|
+
- lib/low_state.rb
|
|
22
|
+
- lib/version.rb
|
|
21
23
|
homepage: https://codeberg.org/maedi/low_state
|
|
22
24
|
licenses: []
|
|
23
25
|
metadata:
|