low_state 0.1.1 → 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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/low_state.rb +90 -0
  3. data/lib/version.rb +5 -0
  4. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e28def9de139dd9c0e35741ab9b81370e64517e2964e47bd4ae5ede805cdc8e9
4
- data.tar.gz: 8a864615d7515de0c2bd13c62a662b80f6fc1f8b305d2d292fcdbcc937b1cbdd
3
+ metadata.gz: a7f8551226b4f95f7ef5778fb8e83cc7580007ccf9d463d151311203a6427dc3
4
+ data.tar.gz: 88a706762b5372cf69b96a043db9b29f24766652b560aba8843355190d8cb6e9
5
5
  SHA512:
6
- metadata.gz: 2c04141ffe236e8257bc4f6249fffb819214a166868a9aea57f7f8f55bb0ff67862c5b685c0aa4aefb0f64ffef98dd5a79f0dd407246ffbc6c11fdc5b5f99ebb
7
- data.tar.gz: 4e26ed60e3bebaf742b30fd3db4bae22efe272c4fe6a495a2f723e83534e64111c4c47dad9a2602a38414113177d8ea5d6e587e66d543f980846def0c5286ba6
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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LowState
4
+ VERSION = '0.1.3'
5
+ end
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.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: