solidstate 0.4.2 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cf9d24356e1045263be132b87cd0cf51e259ce8f
4
- data.tar.gz: a396a2ad162c852bae0b92ea911cf6e756433ad6
2
+ SHA256:
3
+ metadata.gz: 02c75674c24aca47405018404c16421089516578ac830b15e41ecdb419fb6a1f
4
+ data.tar.gz: 5cf34c64280885cc441dfc61aa2c856d8764d89b99b59aaa969e870a3ce7e84d
5
5
  SHA512:
6
- metadata.gz: ace7f75ac671daa60c4d6470a55cdf042b81fc9d8cec6c77ae2935e83ce008f08379501e7acc33368a67f66a1e0ad69affe8f45a3ad47600d577c43b7af89448
7
- data.tar.gz: 556060b92175ad4d4ad80e89e732a1f2968adf2a55cac957248a107731dec2f441b18e85879c8fdd15ccca3657f0538c79d11fd05ce7ac508ff7b0cca3cbf9b0
6
+ metadata.gz: cc2da012e5e8c15ed0b7301f8b85a319fe9b5313110916cb892e68ac0924d35c68cde203c1b475d90717fa89cb5240a3c1c9e6d8a62a60cbbd937fbf1d761d1a
7
+ data.tar.gz: 0614d3eafab0d4d96534d9cffd586d0f5ef2a14bd4fee71b11567838e84b98f635950512a529373bdfc7c71e63ee477eaedd8264a2a8f5112f8e62d8259bb80a
data/lib/solidstate.rb CHANGED
@@ -1,22 +1,23 @@
1
1
  require 'active_support/concern'
2
+ require 'active_support/core_ext/class/attribute'
3
+ # require 'active_support/core_ext/class/attribute_accessors'
2
4
 
3
5
  module SolidState
4
6
  extend ActiveSupport::Concern
5
-
6
7
  class InvalidTransitionError < ArgumentError; end
7
8
 
8
9
  STATE_ATTRIBUTE = :state.freeze
9
10
 
10
11
  module ClassMethods
11
- attr_accessor :possible_states
12
- attr_accessor :state_transitions
13
-
14
12
  def states(*list, &block)
15
13
  list = list.collect(&:to_s)
16
14
 
17
- raise "states have already been set! To get list of possible states, call #{name}.possible_states" if self.possible_states
15
+ raise "states for #{self.name} class have already been set! To get list of possible states, call #{name}.possible_states" if self.respond_to?(:possible_states)
18
16
  raise "This is not a list of names" unless list.first.respond_to?(:downcase)
19
17
 
18
+ class_attribute :possible_states
19
+ class_attribute :state_transitions
20
+
20
21
  self.possible_states = list
21
22
  self.state_transitions = {}
22
23
 
@@ -49,7 +50,6 @@ module SolidState
49
50
 
50
51
  # puts "From #{from} to #{to.join(' or ')}"
51
52
  to.each do |dest|
52
-
53
53
  self.state_transitions[from.to_sym] ||= []
54
54
  self.state_transitions[from.to_sym].push(dest.to_sym)
55
55
 
@@ -70,11 +70,23 @@ module SolidState
70
70
  end
71
71
  end
72
72
 
73
- def set_state(new_state)
74
- return false unless can_transition_to?(new_state)
73
+ def set_state!(new_state)
74
+ raise InvalidTransitionError.new("Cannot transition from #{state} to #{dest}") unless can_transition_to?(new_state)
75
75
  self.state = new_state
76
76
  end
77
77
 
78
+ def set_state(new_state)
79
+ set_state!(new_state) rescue false
80
+ end
81
+
82
+ def update_state(new_state)
83
+ save if set_state(new_state)
84
+ end if respond_to?(:_validators)
85
+
86
+ def update_state!(new_state)
87
+ save! if set_state!(new_state)
88
+ end if respond_to?(:_validators)
89
+
78
90
  private
79
91
 
80
92
  def ensure_valid_transition
@@ -90,4 +102,4 @@ module SolidState
90
102
  possible.include?(new_state.to_sym)
91
103
  end
92
104
 
93
- end
105
+ end
data/solidstate.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "solidstate"
5
- s.version = '0.4.2'
5
+ s.version = '0.4.3'
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ['Tomás Pollak']
8
8
  s.email = ['tomas@forkhq.com']
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.add_development_dependency "activerecord" #, ">= 4.0.0"
17
17
  s.add_development_dependency "sqlite3" #, ">= 4.0.0"
18
18
  s.add_development_dependency "mongo_mapper" #, ">= 4.0.0"
19
+ s.add_development_dependency "fuubar" #, ">= 4.0.0"
19
20
 
20
21
  s.files = `git ls-files`.split("\n")
21
22
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Solidstate' do
4
+
5
+ describe 'inheritance' do
6
+ it 'works' do
7
+ expect(Subscriber.possible_states).to eq(['inactive', 'active', 'unsubscribed', 'disabled'])
8
+ expect(PaidSubscriber.possible_states).to eq(['inactive', 'active', 'unsubscribed', 'disabled'])
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
2
+
3
+ require 'bundler/setup'
4
+ require 'solidstate'
5
+
6
+ class Subscriber
7
+ include SolidState
8
+
9
+ states :inactive, :active, :unsubscribed, :disabled do
10
+ transitions :from => :inactive, :to => :active
11
+ transitions :from => :active, :to => [:unsubscribed, :disabled]
12
+ transitions :from => :unsubscribed, :to => :active
13
+ end
14
+ end
15
+
16
+ class PaidSubscriber < Subscriber
17
+
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidstate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomás Pollak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-23 00:00:00.000000000 Z
11
+ date: 2019-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,6 +86,20 @@ dependencies:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: fuubar
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
89
103
  description: Minuscule state machine.
90
104
  email:
91
105
  - tomas@forkhq.com
@@ -100,6 +114,8 @@ files:
100
114
  - examples/mongo_mapper.rb
101
115
  - lib/solidstate.rb
102
116
  - solidstate.gemspec
117
+ - spec/solidstate/solidstate_spec.rb
118
+ - spec/spec_helper.rb
103
119
  homepage: https://github.com/tomas/solidstate
104
120
  licenses: []
105
121
  metadata: {}
@@ -119,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
135
  version: 1.3.6
120
136
  requirements: []
121
137
  rubyforge_project:
122
- rubygems_version: 2.6.13
138
+ rubygems_version: 2.7.3
123
139
  signing_key:
124
140
  specification_version: 4
125
141
  summary: Minuscule state machine.