minimal_state_machine 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ rvm:
2
+ - 1.9.3
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # MinimalStateMachine
1
+ # MinimalStateMachine [![Build Status](https://travis-ci.org/issuehunter/minimal_state_machine.png?branch=master)](https://travis-ci.org/issuehunter/minimal_state_machine)
2
2
 
3
3
  A state machine for ActiveRecord implemented with the state pattern
4
4
 
@@ -66,7 +66,7 @@ issue.state
66
66
  => #<IssueState::Closed id: 1, type: "IssueState::Closed", state_machine_id: 1, state_machine_type: "Issue", created_at: "2013-01-03 19:13:31", updated_at: "2013-01-03 19:13:31">
67
67
  ```
68
68
 
69
- If you try to change the state to a non valid state a `MinimalStateMachine::InvalidTransitionError` will be raised.
69
+ If you try to change the state to a non valid state record validation will fail with *invalid transition* error.
70
70
 
71
71
  If you try to set the state to a non declared state a `MinimalStateMachine::InvalidStateError` will be raised.
72
72
 
@@ -14,14 +14,14 @@ class MinimalStateMachineGenerator < Rails::Generators::Base
14
14
  end
15
15
 
16
16
  def create_migration_files
17
- create_migration_file_if_not_exist 'create_msm_states'
17
+ create_migration_file_if_not_exist 'create_msm_states', '001'
18
18
  end
19
19
 
20
20
  private
21
21
 
22
- def create_migration_file_if_not_exist(file_name)
22
+ def create_migration_file_if_not_exist(file_name, version)
23
23
  unless self.class.migration_exists?(File.dirname(File.expand_path("db/migrate/#{file_name}")), file_name)
24
- migration_template "#{file_name}.rb", "db/migrate/#{file_name}.rb"
24
+ migration_template "#{version}_#{file_name}.rb", "db/migrate/#{file_name}.rb"
25
25
  end
26
26
  end
27
27
  end
@@ -11,6 +11,10 @@ module MinimalStateMachine
11
11
  after_initialize :set_initial_state, :if => proc { state.nil? }
12
12
  after_save :destroy_previous_state, :if => proc { previous_state && previous_state != state }
13
13
 
14
+ validate do
15
+ self.errors.add(:state, 'invalid transition') if previous_state && !previous_state.class.valid_transition_states.include?(state_name)
16
+ end
17
+
14
18
  attr_accessor :previous_state
15
19
 
16
20
  def self.states
@@ -21,12 +25,8 @@ module MinimalStateMachine
21
25
 
22
26
  def state_name=(state_name)
23
27
  raise InvalidStateError unless self.class.states.keys.map(&:to_s).include?(state_name)
24
-
25
- if state.nil? || state.new_record?
26
- self.state = self.class.states[state_name.to_sym].new
27
- else
28
- transition_to state_name
29
- end
28
+
29
+ transition_to(state_name)
30
30
  end
31
31
 
32
32
  def state_name
@@ -35,15 +35,9 @@ module MinimalStateMachine
35
35
 
36
36
  private
37
37
 
38
- class InvalidTransitionError < StandardError; end
39
-
40
38
  def transition_to(state_name)
41
- if state.class.valid_transition_states.include?(state_name)
42
- self.previous_state = state
43
- self.state = self.class.states[state_name.to_sym].new
44
- else
45
- raise InvalidTransitionError
46
- end
39
+ self.previous_state = state
40
+ self.state = self.class.states[state_name.to_sym].new
47
41
  end
48
42
 
49
43
  def set_initial_state
@@ -1,3 +1,3 @@
1
1
  module MinimalStateMachine
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -22,4 +22,6 @@ Gem::Specification.new do |gem|
22
22
 
23
23
  gem.add_development_dependency 'rspec'
24
24
  gem.add_development_dependency 'debugger'
25
+ gem.add_development_dependency 'rake'
26
+ gem.add_development_dependency 'sqlite3'
25
27
  end
@@ -1,15 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'msm_states'")
4
- ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'state_machines'")
5
- ActiveRecord::Base.connection.create_table(:msm_states) do |t|
6
- t.string :type
7
- t.references :state_machine, :polymorphic => true
8
- t.timestamps
9
- end
10
-
11
- ActiveRecord::Base.connection.create_table(:state_machines)
12
-
13
3
  class StateMachine < ActiveRecord::Base
14
4
  include MinimalStateMachine
15
5
 
@@ -63,8 +53,10 @@ describe StateMachine do
63
53
  MinimalStateMachine::State.count.should == 1
64
54
  end
65
55
 
66
- it 'raises an invalid transition error if the new state is not among the allowed transition states' do
67
- expect { @state_machine.state_name = 'solved' }.to raise_error('MinimalStateMachine::InvalidTransitionError')
56
+ it 'adds error if the new state is not among the allowed transition states' do
57
+ @state_machine.state_name = 'solved'
58
+ @state_machine.should_not be_valid
59
+ @state_machine.errors[:state].should include('invalid transition')
68
60
  end
69
61
 
70
62
  it 'raises an invalid state error if the state assigned in not among the allowed states' do
@@ -1,20 +1,17 @@
1
1
  require 'minimal_state_machine'
2
2
  require 'debugger'
3
3
 
4
- root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
5
- ActiveRecord::Base.establish_connection(
6
- :adapter => "sqlite3",
7
- :database => "#{root}/db/minimal_state_machine.sqlite3"
8
- )
4
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
9
5
 
10
- RSpec.configure do |config|
11
- config.before(:each) do
12
- ActiveRecord::Base.connection.increment_open_transactions
13
- ActiveRecord::Base.connection.begin_db_transaction
14
- end
6
+ ActiveRecord::Migration.verbose = false
7
+ ActiveRecord::Migrator.up("lib/generators/minimal_state_machine/templates")
8
+ ActiveRecord::Migration.create_table :state_machines
15
9
 
16
- config.after(:each) do
17
- ActiveRecord::Base.connection.rollback_db_transaction
18
- ActiveRecord::Base.connection.decrement_open_transactions
10
+ RSpec.configure do |config|
11
+ config.around do |example|
12
+ ActiveRecord::Base.transaction do
13
+ example.run
14
+ raise ActiveRecord::Rollback
15
+ end
19
16
  end
20
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minimal_state_machine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-04 00:00:00.000000000 Z
12
+ date: 2013-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -75,6 +75,38 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: sqlite3
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
78
110
  description: A state machine for activerecord implemented with the state pattern
79
111
  email:
80
112
  - matteodepalo@gmail.com
@@ -84,13 +116,13 @@ extra_rdoc_files: []
84
116
  files:
85
117
  - .gitignore
86
118
  - .rspec
119
+ - .travis.yml
87
120
  - Gemfile
88
121
  - LICENSE.txt
89
122
  - README.md
90
123
  - Rakefile
91
- - db/.gitkeep
92
124
  - lib/generators/minimal_state_machine/minimal_state_machine_generator.rb
93
- - lib/generators/minimal_state_machine/templates/create_msm_states.rb
125
+ - lib/generators/minimal_state_machine/templates/001_create_msm_states.rb
94
126
  - lib/minimal_state_machine.rb
95
127
  - lib/minimal_state_machine/state.rb
96
128
  - lib/minimal_state_machine/version.rb
@@ -109,12 +141,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
141
  - - ! '>='
110
142
  - !ruby/object:Gem::Version
111
143
  version: '0'
144
+ segments:
145
+ - 0
146
+ hash: 3458422209847177818
112
147
  required_rubygems_version: !ruby/object:Gem::Requirement
113
148
  none: false
114
149
  requirements:
115
150
  - - ! '>='
116
151
  - !ruby/object:Gem::Version
117
152
  version: '0'
153
+ segments:
154
+ - 0
155
+ hash: 3458422209847177818
118
156
  requirements: []
119
157
  rubyforge_project:
120
158
  rubygems_version: 1.8.24
File without changes