state_machina 0.1.7 → 0.1.8

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: 3f0a424d08f9a7c3103b4e1eca3d27cda85089c72c25fecdceaad77bf4ba7ad1
4
- data.tar.gz: 5eb6269265360180bc155872205765ae49574e593b1614ec003125ab8109c27a
3
+ metadata.gz: da7744a0dd9bd422710ba97e8db2799be0ce7a9c2aed9da7c580f0f0941b3276
4
+ data.tar.gz: ffa9c6ab967b3490b0bc54fbd34ea51332d9d2e61470e1c07468a1f8caf81b80
5
5
  SHA512:
6
- metadata.gz: 3f19e17c7e7ac1f8420027b727954bac2677878ef4c9bc2c8b9b8a17af09b9902b7d00f170d3eea7cab154caa90a0e13382a4237f4adbed5c2436f5958608bf5
7
- data.tar.gz: ee4ba5d3bdc4aa9e4f6fa03612312a5f53215fdabf270d99d032a1e4ba73a72429dc45b1bc3166de030b34217c8c03288cf4458ce35a95b9dd16e5b32f0f00cf
6
+ metadata.gz: ca9ee7f05f7790ebe6cedb28d7d62963f1718ac1d0baf2317640ae26b42846e06999784ebb906cc62035dc320e51520a1479204c62c98051c7989de862b83d65
7
+ data.tar.gz: 96215bace1c18c7d7a9829541e035d4cdb46f6ee136ca0f5a6621b31d49df22b44f6f9224f825863a5a84255eb4ff817ed07a769c0fa8bf32a9dccb0e5d965ce
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 3.2.0
1
+ ruby 4.0.2
data/Gemfile.lock CHANGED
@@ -1,25 +1,40 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- state_machina (0.1.6)
4
+ state_machina (0.1.8)
5
+ activesupport (>= 5.0, < 8)
5
6
  concurrent-ruby (< 2)
7
+ i18n (>= 0.7, < 2)
6
8
 
7
9
  GEM
8
10
  remote: https://rubygems.org/
9
11
  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)
12
+ activesupport (7.2.4)
13
+ base64
14
+ benchmark (>= 0.3)
15
+ bigdecimal
16
+ concurrent-ruby (~> 1.0, >= 1.3.1)
17
+ connection_pool (>= 2.2.5, < 3)
18
+ drb
19
+ i18n (>= 1.6, < 2)
20
+ logger (>= 1.4.2)
21
+ minitest (>= 5.1, < 6)
22
+ securerandom (>= 0.3)
23
+ tzinfo (~> 2.0, >= 2.0.5)
15
24
  ast (2.4.2)
25
+ base64 (0.3.0)
26
+ benchmark (0.5.0)
27
+ bigdecimal (4.1.3)
16
28
  coderay (1.1.3)
17
- concurrent-ruby (1.2.3)
29
+ concurrent-ruby (1.3.8)
30
+ connection_pool (2.5.5)
18
31
  diff-lcs (1.5.0)
19
- i18n (1.14.5)
32
+ drb (2.2.3)
33
+ i18n (1.15.2)
20
34
  concurrent-ruby (~> 1.0)
35
+ logger (1.7.0)
21
36
  method_source (1.0.0)
22
- minitest (5.22.3)
37
+ minitest (5.27.0)
23
38
  parallel (1.21.0)
24
39
  parser (3.1.1.0)
25
40
  ast (~> 2.4.1)
@@ -55,15 +70,16 @@ GEM
55
70
  rubocop-ast (1.16.0)
56
71
  parser (>= 3.1.1.0)
57
72
  ruby-progressbar (1.11.0)
58
- thread_safe (0.3.6)
59
- tzinfo (1.2.11)
60
- thread_safe (~> 0.1)
73
+ securerandom (0.4.1)
74
+ tzinfo (2.0.6)
75
+ concurrent-ruby (~> 1.0)
61
76
  unicode-display_width (2.1.0)
62
77
 
63
78
  PLATFORMS
64
79
  arm64-darwin-21
65
80
  arm64-darwin-22
66
81
  arm64-darwin-23
82
+ arm64-darwin-25
67
83
  x86_64-darwin-20
68
84
 
69
85
  DEPENDENCIES
@@ -2,7 +2,7 @@ module StateMachina
2
2
  module ExtendedIntegration
3
3
  module ClassMethods
4
4
  # Extends a machine on a model where the machine is already defined
5
- def extend_machine(klass, machine_name = 'default')
5
+ def extend_machine(klass, machine_name = StateMachina::Machine::DEFAULT_MACHINE_NAME)
6
6
  model_name = StateMachina::Util.normalized_klass_to_name(klass)
7
7
 
8
8
  yield(StateMachina::Registry.find_machine!(model_name, machine_name))
@@ -2,9 +2,15 @@ module StateMachina
2
2
  module Integration
3
3
  module ClassMethods
4
4
  # Defines a new machine on a model
5
- def define_machine(machine_name = 'default', column_name: :state, metadata: {})
5
+ def define_machine(machine_name = StateMachina::Machine::DEFAULT_MACHINE_NAME, column_name: :state, i18n_scope: nil, metadata: {})
6
6
  model_name = StateMachina::Util.normalized_klass_to_name(self)
7
- machine = StateMachina::Machine.new(model_name, machine_name, column_name: column_name, metadata: metadata)
7
+ machine = StateMachina::Machine.new(
8
+ model_name,
9
+ machine_name,
10
+ column_name: column_name,
11
+ i18n_scope: i18n_scope,
12
+ metadata: metadata
13
+ )
8
14
 
9
15
  yield(StateMachina::Registry.register_machine(machine))
10
16
  end
@@ -12,7 +18,7 @@ module StateMachina
12
18
  alias_method :define_state_machine, :define_machine
13
19
 
14
20
  # Extends a machine on a model where the machine is already defined
15
- def extend_machine(klass, machine_name = 'default')
21
+ def extend_machine(klass, machine_name = StateMachina::Machine::DEFAULT_MACHINE_NAME)
16
22
  model_name = StateMachina::Util.normalized_klass_to_name(klass)
17
23
 
18
24
  yield(StateMachina::Registry.find_machine!(model_name, machine_name))
@@ -21,7 +27,7 @@ module StateMachina
21
27
  alias_method :extend_state_machine, :extend_machine
22
28
 
23
29
  # Returns the defined machine on a model
24
- def machine(machine_name = 'default')
30
+ def machine(machine_name = StateMachina::Machine::DEFAULT_MACHINE_NAME)
25
31
  model_name = StateMachina::Util.normalized_klass_to_name(self)
26
32
 
27
33
  StateMachina::Registry.find_machine!(model_name, machine_name)
@@ -44,7 +50,7 @@ module StateMachina
44
50
  end
45
51
 
46
52
  # Returns the defined machine on a model instance
47
- def machine(machine_name = 'default')
53
+ def machine(machine_name = StateMachina::Machine::DEFAULT_MACHINE_NAME)
48
54
  model_name = StateMachina::Util.normalized_klass_to_name(self.class)
49
55
 
50
56
  machine = StateMachina::Registry.find_machine!(model_name, machine_name).dup
@@ -1,17 +1,32 @@
1
1
  module StateMachina
2
2
  class Machine
3
- attr_reader :model_name, :name, :column_name, :metadata
3
+ DEFAULT_MACHINE_NAME = 'default'
4
+
5
+ attr_reader :model_name, :name, :column_name, :i18n_scope, :metadata
4
6
  attr_accessor :model
5
7
 
6
8
  delegate :before?, :before_inclusive?, :past?, :past_inclusive?, :between?, :between_inclusive?, to: :current_state
7
9
 
8
- def initialize(model_name, name, column_name: :state, metadata: {})
10
+ def initialize(model_name, name, column_name: :state, i18n_scope: nil, metadata: {})
9
11
  @model_name = model_name
10
12
  @name = name.to_s
11
13
  @column_name = column_name
14
+ @i18n_scope = i18n_scope || default_i18n_scope
12
15
  @metadata = metadata
13
16
  end
14
17
 
18
+ def default?
19
+ name == DEFAULT_MACHINE_NAME
20
+ end
21
+
22
+ def self.default_i18n_scope(model_name)
23
+ "activerecord.attributes.#{model_name}"
24
+ end
25
+
26
+ def human_name
27
+ I18n.t(name, scope: "#{i18n_scope}.machines", default: name.humanize)
28
+ end
29
+
15
30
  def state(state_name, metadata: {})
16
31
  state = StateMachina::State.new(model_name, name, state_name, metadata: metadata)
17
32
 
@@ -55,6 +70,7 @@ module StateMachina
55
70
  end
56
71
 
57
72
  def update_state(new_state)
73
+ raise(UnknownStateError, "for model: #{model_name}, with name: #{new_state}") unless states.find_by_name(new_state)
58
74
  if model.respond_to?(:update)
59
75
  model.update(column_name => new_state)
60
76
  else
@@ -63,6 +79,7 @@ module StateMachina
63
79
  end
64
80
 
65
81
  def update_state!(new_state)
82
+ raise(UnknownStateError, "for model: #{model_name}, with name: #{new_state}") unless states.find_by_name(new_state)
66
83
  if model.respond_to?(:update!)
67
84
  model.update!(column_name => new_state)
68
85
  else
@@ -72,6 +89,10 @@ module StateMachina
72
89
 
73
90
  private
74
91
 
92
+ def default_i18n_scope
93
+ self.class.default_i18n_scope(model_name)
94
+ end
95
+
75
96
  def select_possible_events(events)
76
97
  events.select(&:possible?)
77
98
  end
@@ -10,6 +10,16 @@ module StateMachina
10
10
  @metadata = metadata
11
11
  end
12
12
 
13
+ def human_name
14
+ return name.humanize if machine.nil?
15
+
16
+ I18n.t(name, scope: i18n_scope, default: name.humanize)
17
+ end
18
+
19
+ def i18n_scope
20
+ "#{machine.i18n_scope}.states.#{machine_name}"
21
+ end
22
+
13
23
  def before?(other_state_name)
14
24
  return false if machine.nil?
15
25
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StateMachina
4
- VERSION = "0.1.7"
4
+ VERSION = "0.1.8"
5
5
  end
data/lib/state_machina.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "concurrent"
4
+ require "i18n"
4
5
  require "active_support/core_ext/module/delegation"
6
+ require "active_support/core_ext/string/inflections"
5
7
 
6
8
  require_relative "state_machina/event"
7
9
  require_relative "state_machina/events_collection"
@@ -19,4 +21,5 @@ module StateMachina
19
21
  class Error < StandardError; end
20
22
 
21
23
  class NoMachineFoundError < Error; end
24
+ class UnknownStateError < Error; end
22
25
  end
metadata CHANGED
@@ -1,15 +1,34 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: state_machina
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan van der Pas
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-05-14 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activesupport
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '5.0'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '8'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '5.0'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '8'
13
32
  - !ruby/object:Gem::Dependency
14
33
  name: concurrent-ruby
15
34
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +43,26 @@ dependencies:
24
43
  - - "<"
25
44
  - !ruby/object:Gem::Version
26
45
  version: '2'
46
+ - !ruby/object:Gem::Dependency
47
+ name: i18n
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0.7'
53
+ - - "<"
54
+ - !ruby/object:Gem::Version
55
+ version: '2'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0.7'
63
+ - - "<"
64
+ - !ruby/object:Gem::Version
65
+ version: '2'
27
66
  - !ruby/object:Gem::Dependency
28
67
  name: pry
29
68
  requirement: !ruby/object:Gem::Requirement
@@ -38,7 +77,6 @@ dependencies:
38
77
  - - "<"
39
78
  - !ruby/object:Gem::Version
40
79
  version: '0.15'
41
- description:
42
80
  email:
43
81
  - jan.vanderpas@beequip.nl
44
82
  executables: []
@@ -68,11 +106,9 @@ files:
68
106
  - lib/state_machina/util.rb
69
107
  - lib/state_machina/version.rb
70
108
  - sig/state_machina.rbs
71
- homepage:
72
109
  licenses:
73
110
  - MIT
74
111
  metadata: {}
75
- post_install_message:
76
112
  rdoc_options: []
77
113
  require_paths:
78
114
  - lib
@@ -87,8 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
123
  - !ruby/object:Gem::Version
88
124
  version: '0'
89
125
  requirements: []
90
- rubygems_version: 3.4.21
91
- signing_key:
126
+ rubygems_version: 4.0.13
92
127
  specification_version: 4
93
128
  summary: State machine supporting multiple machines per object
94
129
  test_files: []