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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/low_state.rb +87 -0
  3. data/lib/version.rb +5 -0
  4. metadata +5 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 529a5fa5c7b7aa94d9df0d5bab5cb409970206f6d4f0e41cafb370fcee8788f3
4
- data.tar.gz: c3f2a4bfb4fa7c32be0731e0fe37e0befd93a112932ba7283940d57c3fd1a2b1
3
+ metadata.gz: 0a89a7e89f29c28b76d0b8a6ffc54ec2fa5fbf5eb9e6511b2a58505f4f75e3cd
4
+ data.tar.gz: 79b05d82e962249e9e5e341d1fcdd2cf7878388a2894f42fef37730ed42fa458
5
5
  SHA512:
6
- metadata.gz: 0a96425242664f4438c6b59febcdc55a287237a9b30a5883f94a7dc31e69cfabcdae52f48a29427583d6bf7f585c7076c9bf14f9fed9d0a0151ace5c3e376e89
7
- data.tar.gz: a686f5c2a10f54e4878fc15cb2b0ba8ca8453b5f968e299183166ec105d8c992fcc81e24a7fa676b669d9363132e630ff21532d4c64b9f1e3e4a7b94c8056ec6
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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LowState
4
+ VERSION = '0.2.0'
5
+ end
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.1.2
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-24 00:00:00.000000000 Z
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: