low_state 0.1.2 → 0.2.0
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 +87 -0
- data/lib/version.rb +5 -0
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0a89a7e89f29c28b76d0b8a6ffc54ec2fa5fbf5eb9e6511b2a58505f4f75e3cd
|
|
4
|
+
data.tar.gz: 79b05d82e962249e9e5e341d1fcdd2cf7878388a2894f42fef37730ed42fa458
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4ff419f702882cae619b45fc478a01c402bad30422f95152d1ef44acda50f931c6bf4ce13132c2a66d38285c4395600cbf41eae0bb1318d200b0471cb28229ed
|
|
7
|
+
data.tar.gz: 82c52726c0739ac33117dbc217ea2ef41d389f45373aa054302fc8e55b84130978f425ebef059ca65cb4173caca6ac680027c5b4719cea806b1343e3335504ff
|
data/lib/low_state.rb
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'version'
|
|
4
|
+
|
|
5
|
+
module LowState
|
|
6
|
+
class StateChangeError < StandardError; end
|
|
7
|
+
class MissingStateError < StandardError; end
|
|
8
|
+
|
|
9
|
+
def current_state
|
|
10
|
+
@current_state ||= states.keys.first
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def change_state(new_state, *args)
|
|
14
|
+
state = states[new_state]
|
|
15
|
+
raise MissingStateError, "State :#{new_state} missing in #{states.keys}" if state.nil?
|
|
16
|
+
|
|
17
|
+
before_result = state.has_before_callback?(self.class) ? send(state.before, *args) : true
|
|
18
|
+
|
|
19
|
+
if before_result != false && state.can_change_state?(current_state)
|
|
20
|
+
@current_state = new_state
|
|
21
|
+
elsif before_result != false && !state.can_change_state?(current_state) && state.can_error?
|
|
22
|
+
raise StateChangeError, "State did not change from :#{current_state} to :#{new_state}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
send(state.after, *args) if state.has_after_callback?(self.class)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def states
|
|
29
|
+
self.class.states
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.included(base)
|
|
33
|
+
class << base
|
|
34
|
+
def states
|
|
35
|
+
@states ||= {}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def set_states(states)
|
|
39
|
+
@states = states
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def low_state(state, **args)
|
|
43
|
+
class_states = states
|
|
44
|
+
|
|
45
|
+
if state.is_a?(Symbol)
|
|
46
|
+
class_states[state] = State.new(state:, **args)
|
|
47
|
+
elsif state.is_a?(State)
|
|
48
|
+
class_states[state.state] = state
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
set_states(class_states)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
class State
|
|
57
|
+
attr_reader :state, :from, :before, :after
|
|
58
|
+
|
|
59
|
+
def initialize(state:, from: [], before: nil, after: nil, error: true)
|
|
60
|
+
@state = state
|
|
61
|
+
@from = [*from]
|
|
62
|
+
@before = before || "#{@state}_state_before"
|
|
63
|
+
@after = after || "#{@state}_state_after"
|
|
64
|
+
@error = error
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def can_change_state?(current_state)
|
|
68
|
+
if @from.empty? || @from.include?(current_state)
|
|
69
|
+
return true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
false
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def can_error?
|
|
76
|
+
@error
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def has_before_callback?(klass)
|
|
80
|
+
@has_before_callback ||= klass.method_defined?(@before)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def has_after_callback?(klass)
|
|
84
|
+
@has_after_callback ||= klass.method_defined?(@after)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
data/lib/version.rb
ADDED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: low_state
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- maedi
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-09-
|
|
11
|
+
date: 2025-09-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: A very fast low-level state machine. Uses no events for simplicity and
|
|
14
14
|
speed, it just changes state.
|
|
@@ -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:
|