super_state 0.2.1 → 0.3.0

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.
data/Rakefile CHANGED
@@ -45,7 +45,7 @@ spec = Gem::Specification.new do |s|
45
45
 
46
46
  # Change these as appropriate
47
47
  s.name = "super_state"
48
- s.version = "0.2.1"
48
+ s.version = "0.3.0"
49
49
  s.summary = "Super Simple State Machine"
50
50
  s.author = "Matthew Rudy Jacobs"
51
51
  s.email = "MatthewRudyJacobs@gmail.com"
data/lib/super_state.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'super_state/common_states'
2
+ require 'active_support/ordered_hash'
2
3
 
3
4
  module SuperState
4
5
 
@@ -15,6 +16,8 @@ module SuperState
15
16
 
16
17
  # the initial_state only takes effect when we say record.valid?
17
18
  before_validation :set_initial_super_state, :on => :create
19
+
20
+ validate :ensure_super_state
18
21
  end
19
22
  end
20
23
 
@@ -102,6 +105,12 @@ module SuperState
102
105
  self.current_super_state.humanize
103
106
  end
104
107
 
108
+ def ensure_super_state
109
+ unless self.class.__super_states.include?(self.current_super_state)
110
+ errors[self.class.super_state_column] << "is not a valid super state"
111
+ end
112
+ end
113
+
105
114
  end
106
115
 
107
116
  class BadState < ArgumentError ; end
@@ -2,19 +2,15 @@ require 'test_helper'
2
2
 
3
3
  class CommonStatesTest < Test::Unit::TestCase
4
4
 
5
- class MyClass < ActiveRecord::Base
6
- include SuperState::CommonStates
7
- end
8
-
9
5
  # a DD::Batch is a simple example
10
6
  def setup
11
- @object = MyClass.create!()
7
+ @object = Commoner.create!()
12
8
  assert @object.pending?
13
- assert @object.class.ancestors.include?(CommonStates), "mate, it's not a CommonState thing"
9
+ assert @object.class.ancestors.include?(SuperState::CommonStates), "mate, it's not a CommonState thing"
14
10
  end
15
11
 
16
12
  test "a new record is pending?" do
17
- @object = MyClass.new
13
+ @object = Commoner.new
18
14
  assert @object.pending?
19
15
  end
20
16
 
@@ -2,6 +2,21 @@ require 'test_helper'
2
2
 
3
3
  class SuperStateTest < Test::Unit::TestCase
4
4
 
5
+ test "status must be valid" do
6
+ record = Something.new
7
+ assert record.valid?
8
+
9
+ record.save!
10
+ assert record.start?
11
+
12
+ record.status = "not_valid"
13
+ assert !record.valid?
14
+ assert_errors record, :status => "is not a valid super state"
15
+
16
+ record.status = "start"
17
+ assert record.valid?
18
+ end
19
+
5
20
  test "abstract the tests" do
6
21
  puts "this has been abstracted from a live project"
7
22
  puts "as such the tests have not yet been abstracted"
data/test/test_helper.rb CHANGED
@@ -3,6 +3,62 @@ require 'test/unit'
3
3
  require 'active_support/testing/declarative'
4
4
  $: << File.expand_path(File.dirname(__FILE__)+"/../lib")
5
5
 
6
+ require 'super_state'
7
+
8
+ require 'active_record'
9
+ require 'mocha'
10
+
11
+ ActiveRecord::Base.establish_connection(
12
+ :adapter => (RUBY_PLATFORM=="java" ? "jdbcsqlite3" : "sqlite3"),
13
+ :database => ":memory:"
14
+ )
15
+
16
+ ActiveRecord::Schema.define(:version => 0) do
17
+ create_table :somethings, :force => true do |t|
18
+ t.string :status
19
+ end
20
+ end
21
+
22
+ class Something < ActiveRecord::Base
23
+
24
+ include SuperState
25
+
26
+ super_state :start, :initial => true
27
+ super_state :middle
28
+ super_state :end
29
+
30
+ end
31
+
32
+ ActiveRecord::Schema.define(:version => 0) do
33
+ create_table :commoners, :force => true do |t|
34
+ t.string :status
35
+ end
36
+ end
37
+
38
+ class Commoner < ActiveRecord::Base
39
+ include SuperState::CommonStates
40
+ end
41
+
6
42
  class Test::Unit::TestCase
7
43
  extend ActiveSupport::Testing::Declarative
44
+
45
+ def before_and_after_reload(record)
46
+ yield
47
+ record.reload
48
+ yield
49
+ end
50
+
51
+ def assert_errors(record, fields)
52
+ fields.each do |field, errors|
53
+ assert_errors_on(errors, record, field)
54
+ end
55
+ end
56
+
57
+ def assert_errors_on(errors, record, field)
58
+ assert_equal Array(errors), Array(record.errors[field]), "unexpected errors on #{field.inspect}"
59
+ end
60
+
61
+ def assert_no_errors_on(record, field)
62
+ assert_errors_on([], record, field)
63
+ end
8
64
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: super_state
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease: false
4
+ hash: 19
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 1
10
- version: 0.2.1
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matthew Rudy Jacobs
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-17 00:00:00 +08:00
18
+ date: 2011-03-15 00:00:00 +08:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -67,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
67
  requirements: []
68
68
 
69
69
  rubyforge_project:
70
- rubygems_version: 1.3.7
70
+ rubygems_version: 1.5.2
71
71
  signing_key:
72
72
  specification_version: 3
73
73
  summary: Super Simple State Machine