state_machina 0.1.5 → 0.1.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 31ba09ef350378e653c3f7c99c3ade469cdb2da45bffebd2669ab7e61e316a8c
4
- data.tar.gz: 97b54c53c83db2dbc0fe7e25664b0feb98ef7b82b7c8a5ad5dde536aaba24f8f
3
+ metadata.gz: 3f0a424d08f9a7c3103b4e1eca3d27cda85089c72c25fecdceaad77bf4ba7ad1
4
+ data.tar.gz: 5eb6269265360180bc155872205765ae49574e593b1614ec003125ab8109c27a
5
5
  SHA512:
6
- metadata.gz: 1edbdd79a822c472e7eadb77869c68282c467f36602a323214170af7690dce27e18dec9b53f821690f47a65c7a189fb4441d1df8ed48301e96b05c855a71ea63
7
- data.tar.gz: ed5e069229f0b4c8d6abae3fe050a97b73066a784b6abfe94d2e37a940a8b86f5cf4251fa1e6a9d632ad16af9743675e06c6b0e081a8566a41347459e08f7f1b
6
+ metadata.gz: 3f19e17c7e7ac1f8420027b727954bac2677878ef4c9bc2c8b9b8a17af09b9902b7d00f170d3eea7cab154caa90a0e13382a4237f4adbed5c2436f5958608bf5
7
+ data.tar.gz: ee4ba5d3bdc4aa9e4f6fa03612312a5f53215fdabf270d99d032a1e4ba73a72429dc45b1bc3166de030b34217c8c03288cf4458ce35a95b9dd16e5b32f0f00cf
data/Gemfile CHANGED
@@ -10,3 +10,5 @@ gem "rake", "~> 13.0"
10
10
  gem "rspec", "~> 3.0"
11
11
 
12
12
  gem "rubocop", "~> 1.21"
13
+
14
+ gem "activesupport", "< 8", require: false
data/Gemfile.lock CHANGED
@@ -1,17 +1,25 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- state_machina (0.1.5)
4
+ state_machina (0.1.6)
5
5
  concurrent-ruby (< 2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ activesupport (5.2.8.1)
11
+ concurrent-ruby (~> 1.0, >= 1.0.2)
12
+ i18n (>= 0.7, < 2)
13
+ minitest (~> 5.1)
14
+ tzinfo (~> 1.1)
10
15
  ast (2.4.2)
11
16
  coderay (1.1.3)
12
17
  concurrent-ruby (1.2.3)
13
18
  diff-lcs (1.5.0)
19
+ i18n (1.14.5)
20
+ concurrent-ruby (~> 1.0)
14
21
  method_source (1.0.0)
22
+ minitest (5.22.3)
15
23
  parallel (1.21.0)
16
24
  parser (3.1.1.0)
17
25
  ast (~> 2.4.1)
@@ -47,14 +55,19 @@ GEM
47
55
  rubocop-ast (1.16.0)
48
56
  parser (>= 3.1.1.0)
49
57
  ruby-progressbar (1.11.0)
58
+ thread_safe (0.3.6)
59
+ tzinfo (1.2.11)
60
+ thread_safe (~> 0.1)
50
61
  unicode-display_width (2.1.0)
51
62
 
52
63
  PLATFORMS
53
64
  arm64-darwin-21
54
65
  arm64-darwin-22
66
+ arm64-darwin-23
55
67
  x86_64-darwin-20
56
68
 
57
69
  DEPENDENCIES
70
+ activesupport (< 8)
58
71
  pry (< 0.15)
59
72
  rake (~> 13.0)
60
73
  rspec (~> 3.0)
@@ -19,11 +19,12 @@ module StateMachina
19
19
  end
20
20
 
21
21
  def transitions
22
- transitions = StateMachina::Registry.find_transitions(model_name, machine_name, name)
22
+ transitions = StateMachina::Registry.find_transitions(model_name, machine_name, name).map(&:dup)
23
23
  transitions.each do |transition|
24
24
  transition.machine = machine
25
25
  transition.guard_context = guard_context
26
26
  end
27
+
27
28
  transitions
28
29
  end
29
30
 
@@ -32,9 +33,7 @@ module StateMachina
32
33
  end
33
34
 
34
35
  def resolve_to_transition
35
- transitions.find do |transition|
36
- transition.possible? && transition.permitted?
37
- end
36
+ transitions.find(&:permitted?)
38
37
  end
39
38
 
40
39
  def possible?
@@ -47,7 +47,7 @@ module StateMachina
47
47
  def machine(machine_name = 'default')
48
48
  model_name = StateMachina::Util.normalized_klass_to_name(self.class)
49
49
 
50
- machine = StateMachina::Registry.find_machine!(model_name, machine_name)
50
+ machine = StateMachina::Registry.find_machine!(model_name, machine_name).dup
51
51
  machine.model = self
52
52
  machine
53
53
  end
@@ -58,7 +58,7 @@ module StateMachina
58
58
  def machines
59
59
  model_name = StateMachina::Util.normalized_klass_to_name(self.class)
60
60
 
61
- machines = StateMachina::Registry.find_machines(model_name)
61
+ machines = StateMachina::Registry.find_machines(model_name).map(&:dup)
62
62
  machines.map do |machine|
63
63
  machine.model = self
64
64
  machine
@@ -3,6 +3,8 @@ module StateMachina
3
3
  attr_reader :model_name, :name, :column_name, :metadata
4
4
  attr_accessor :model
5
5
 
6
+ delegate :before?, :before_inclusive?, :past?, :past_inclusive?, :between?, :between_inclusive?, to: :current_state
7
+
6
8
  def initialize(model_name, name, column_name: :state, metadata: {})
7
9
  @model_name = model_name
8
10
  @name = name.to_s
@@ -23,7 +25,7 @@ module StateMachina
23
25
  end
24
26
 
25
27
  def states
26
- states = StateMachina::Registry.find_states(model_name, name).values
28
+ states = StateMachina::Registry.find_states(model_name, name).values.map(&:dup)
27
29
  states.each do |state|
28
30
  state.machine = self
29
31
  end
@@ -32,7 +34,7 @@ module StateMachina
32
34
  end
33
35
 
34
36
  def events(possible: false, permitted: false, guard_context: model)
35
- events = StateMachina::Registry.find_events(model_name, name).values
37
+ events = StateMachina::Registry.find_events(model_name, name).values.map(&:dup)
36
38
  events.each do |event|
37
39
  event.machine = self
38
40
  event.guard_context = guard_context
@@ -14,7 +14,7 @@ module StateMachina
14
14
 
15
15
  def self.register_machine(machine)
16
16
  machines[machine.model_name] ||= {}
17
- machines[machine.model_name][machine.name] = machine
17
+ machines[machine.model_name][machine.name] = machine.freeze
18
18
 
19
19
  machine
20
20
  end
@@ -30,7 +30,7 @@ module StateMachina
30
30
  def self.register_state(state)
31
31
  states[state.model_name] ||= {}
32
32
  states[state.model_name][state.machine_name] ||= {}
33
- states[state.model_name][state.machine_name][state.name] = state
33
+ states[state.model_name][state.machine_name][state.name] = state.freeze
34
34
 
35
35
  state
36
36
  end
@@ -46,7 +46,7 @@ module StateMachina
46
46
  def self.register_event(event)
47
47
  events[event.model_name] ||= {}
48
48
  events[event.model_name][event.machine_name] ||= {}
49
- events[event.model_name][event.machine_name][event.name] = event
49
+ events[event.model_name][event.machine_name][event.name] = event.freeze
50
50
 
51
51
  event
52
52
  end
@@ -63,7 +63,7 @@ module StateMachina
63
63
  transitions[transition.model_name] ||= {}
64
64
  transitions[transition.model_name][transition.machine_name] ||= {}
65
65
  transitions[transition.model_name][transition.machine_name][transition.event_name] ||= []
66
- transitions[transition.model_name][transition.machine_name][transition.event_name].append(transition)
66
+ transitions[transition.model_name][transition.machine_name][transition.event_name].append(transition.freeze)
67
67
 
68
68
  transition
69
69
  end
@@ -13,25 +13,25 @@ module StateMachina
13
13
  def before?(other_state_name)
14
14
  return false if machine.nil?
15
15
 
16
- !machine.states.before(machine.current_state_name).map(&:name).include?(other_state_name)
16
+ machine.states.before(other_state_name).map(&:name).include?(machine.current_state_name)
17
17
  end
18
18
 
19
19
  def before_inclusive?(other_state_name)
20
20
  return false if machine.nil?
21
21
 
22
- !machine.states.before_inclusive(machine.current_state_name).map(&:name).include?(other_state_name)
22
+ machine.states.before_inclusive(other_state_name).map(&:name).include?(machine.current_state_name)
23
23
  end
24
24
 
25
25
  def past?(other_state_name)
26
26
  return false if machine.nil?
27
27
 
28
- !machine.states.past(machine.current_state_name).map(&:name).include?(other_state_name)
28
+ machine.states.past(other_state_name).map(&:name).include?(machine.current_state_name)
29
29
  end
30
30
 
31
31
  def past_inclusive?(other_state_name)
32
32
  return false if machine.nil?
33
33
 
34
- !machine.states.past_inclusive(machine.current_state_name).map(&:name).include?(other_state_name)
34
+ machine.states.past_inclusive(other_state_name).map(&:name).include?(machine.current_state_name)
35
35
  end
36
36
 
37
37
  def between?(from_state_name, to_state_name)
@@ -21,7 +21,10 @@ module StateMachina
21
21
  end
22
22
 
23
23
  def before(state_name)
24
- to_a[..(index_by_name(state_name) - 1)]
24
+ index = index_by_name(state_name) - 1
25
+ return [] if index.negative?
26
+
27
+ to_a[..index]
25
28
  end
26
29
 
27
30
  def before_inclusive(state_name)
@@ -37,11 +40,17 @@ module StateMachina
37
40
  end
38
41
 
39
42
  def between(from_state_name, to_state_name)
40
- to_a[index_by_name(from_state_name)...index_by_name(to_state_name)]
43
+ indexes = [index_by_name(from_state_name), index_by_name(to_state_name)]
44
+ raise(ArgumentError, "to_state should be higher than from_state") if indexes != indexes.sort
45
+
46
+ to_a[indexes[0]...indexes[1]]
41
47
  end
42
48
 
43
49
  def between_inclusive(from_state_name, to_state_name)
44
- to_a[index_by_name(from_state_name)..index_by_name(to_state_name)]
50
+ indexes = [index_by_name(from_state_name), index_by_name(to_state_name)]
51
+ raise(ArgumentError, "to_state should be higher than from_state") if indexes != indexes.sort
52
+
53
+ to_a[indexes[0]..indexes[1]]
45
54
  end
46
55
 
47
56
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StateMachina
4
- VERSION = "0.1.5"
4
+ VERSION = "0.1.7"
5
5
  end
data/lib/state_machina.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "concurrent"
4
+ require "active_support/core_ext/module/delegation"
4
5
 
5
6
  require_relative "state_machina/event"
6
7
  require_relative "state_machina/events_collection"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: state_machina
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan van der Pas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-29 00:00:00.000000000 Z
11
+ date: 2024-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby