can_has_state 0.2.2 → 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.
Files changed (38) hide show
  1. data/README.md +19 -4
  2. data/Rakefile +1 -28
  3. data/lib/can_has_state/definition.rb +15 -3
  4. data/lib/can_has_state/dirty_helper.rb +28 -0
  5. data/lib/can_has_state/machine.rb +3 -3
  6. data/lib/can_has_state/version.rb +1 -1
  7. data/lib/can_has_state.rb +3 -2
  8. data/test/can_has_state_test.rb +208 -3
  9. data/test/test_helper.rb +3 -14
  10. metadata +21 -66
  11. data/test/dummy/README.rdoc +0 -261
  12. data/test/dummy/Rakefile +0 -7
  13. data/test/dummy/app/assets/javascripts/application.js +0 -15
  14. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  15. data/test/dummy/app/controllers/application_controller.rb +0 -3
  16. data/test/dummy/app/helpers/application_helper.rb +0 -2
  17. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  18. data/test/dummy/config/application.rb +0 -59
  19. data/test/dummy/config/boot.rb +0 -10
  20. data/test/dummy/config/database.yml +0 -25
  21. data/test/dummy/config/environment.rb +0 -5
  22. data/test/dummy/config/environments/development.rb +0 -37
  23. data/test/dummy/config/environments/production.rb +0 -67
  24. data/test/dummy/config/environments/test.rb +0 -37
  25. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  26. data/test/dummy/config/initializers/inflections.rb +0 -15
  27. data/test/dummy/config/initializers/mime_types.rb +0 -5
  28. data/test/dummy/config/initializers/secret_token.rb +0 -7
  29. data/test/dummy/config/initializers/session_store.rb +0 -8
  30. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  31. data/test/dummy/config/locales/en.yml +0 -5
  32. data/test/dummy/config/routes.rb +0 -58
  33. data/test/dummy/config.ru +0 -4
  34. data/test/dummy/public/404.html +0 -26
  35. data/test/dummy/public/422.html +0 -26
  36. data/test/dummy/public/500.html +0 -25
  37. data/test/dummy/public/favicon.ico +0 -0
  38. data/test/dummy/script/rails +0 -6
data/README.md CHANGED
@@ -104,7 +104,8 @@ Add it to your `Gemfile`:
104
104
  # triggers are useful for logging or cascading changes to association
105
105
  # models. Deferred trigger actions are run within the same database
106
106
  # transaction (for ActiveRecord and other ActiveModel children that
107
- # implement this).
107
+ # implement this). Deferred triggers require support for after_save
108
+ # callbacks, compatible with that supported by ActiveRecord.
108
109
  #
109
110
  # Last, wildcards are supported. Note that the ruby parser requires a
110
111
  # space after the asterisk for wildcards on the left side:
@@ -131,11 +132,13 @@ Add it to your `Gemfile`:
131
132
  ### Just ActiveModel ###
132
133
 
133
134
  class Account
134
- include ActiveModel::Dirty
135
+ include CanHasState::DirtyHelper
135
136
  include ActiveModel::Validations
136
137
  include ActiveModel::Validations::Callbacks
137
138
  include CanHasState::Machine
138
139
 
140
+ track_dirty :account_state
141
+
139
142
  state_machine :account_state do
140
143
  state :active, :initial,
141
144
  :from => :inactive
@@ -148,6 +151,16 @@ Add it to your `Gemfile`:
148
151
 
149
152
  end
150
153
 
154
+ ActiveModel::Dirty tracking must be enabled for the attribute(s) that hold the
155
+ state(s) in your model (see docs for ActiveModel::Dirty). If you're building on
156
+ top of a library that supports this (ActiveRecord, Mongoid, etc.), you're fine.
157
+ If not, CanHasState provides a helper module, `CanHasState::DirtyHelper`, that
158
+ provides the supporting implementation required by ActiveModel::Dirty. Just call
159
+ `track_dirty :attr_one, :attr_two` as shown above.
160
+
161
+ Hint: deferred triggers aren't supported with bare ActiveModel. However, if a
162
+ non-ActiveRecord persistence engine provides #after_save, then deferred triggers
163
+ will be enabled.
151
164
 
152
165
 
153
166
  ## Managing states ##
@@ -230,7 +243,9 @@ will be called.
230
243
  ## Notes on triggers and initial state ##
231
244
 
232
245
  `can_has_state` relies on the `ActiveModel::Dirty` module to detect when a state
233
- attribute has changed. In general, this shouldn't matter much to you.
246
+ attribute has changed. In general, this shouldn't matter much to you as long as
247
+ you're using ActiveRecord, Mongoid, or something that implements full Dirty
248
+ support.
234
249
 
235
250
  However, triggers involving initial values can be tricky. If your database
236
251
  schema sets the default value to the initial value, `:on_enter` and custom
@@ -242,4 +257,4 @@ because the initial state value changed from nil to the initial state.
242
257
 
243
258
  ## Compatibility ##
244
259
 
245
- Tested with Ruby 1.9 and ActiveSupport and ActiveModel 3.2.8.
260
+ Tested with Ruby 1.9 and ActiveSupport and ActiveModel 4.0.
data/Rakefile CHANGED
@@ -1,30 +1,4 @@
1
- #!/usr/bin/env rake
2
- begin
3
- require 'bundler/setup'
4
- rescue LoadError
5
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
- end
7
- begin
8
- require 'rdoc/task'
9
- rescue LoadError
10
- require 'rdoc/rdoc'
11
- require 'rake/rdoctask'
12
- RDoc::Task = Rake::RDocTask
13
- end
14
-
15
- RDoc::Task.new(:rdoc) do |rdoc|
16
- rdoc.rdoc_dir = 'rdoc'
17
- rdoc.title = 'CanHasState'
18
- rdoc.options << '--line-numbers'
19
- rdoc.rdoc_files.include('README.rdoc')
20
- rdoc.rdoc_files.include('lib/**/*.rb')
21
- end
22
-
23
-
24
-
25
-
26
- Bundler::GemHelper.install_tasks
27
-
1
+ require 'bundler/gem_tasks'
28
2
  require 'rake/testtask'
29
3
 
30
4
  Rake::TestTask.new(:test) do |t|
@@ -34,5 +8,4 @@ Rake::TestTask.new(:test) do |t|
34
8
  t.verbose = false
35
9
  end
36
10
 
37
-
38
11
  task :default => :test
@@ -35,20 +35,26 @@ module CanHasState
35
35
  when :from
36
36
  from_vals = Array(val).map(&:to_s)
37
37
  from_vals << nil # for new records
38
- guards << Proc.new{|r| from_vals.include? r.send("#{column}_was").try(:to_s)}
38
+ guards << Proc.new do |r|
39
+ val_was = r.send("#{column}_was")
40
+ val_was &&= val_was.to_s
41
+ from_vals.include? val_was
42
+ end
39
43
  when :guard, :require
40
44
  guards += Array(val)
41
45
  when :message
42
46
  message = val
43
47
  when :timestamp
44
- @triggers << {:from=>["*"], :to=>[state_name], :trigger=>[Proc.new{|r| r.send("#{val}=", Time.current)}]}
48
+ @triggers << {:from=>["*"], :to=>[state_name], :trigger=>[Proc.new{|r| r.send("#{val}=", Time.now.utc)}]}
45
49
  when :on_enter
46
50
  @triggers << {:from=>["*"], :to=>[state_name], :trigger=>Array(val), :type=>:on_enter}
47
51
  when :on_enter_deferred
52
+ raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") unless respond_to?(:after_save)
48
53
  @triggers << {:from=>["*"], :to=>[state_name], :trigger=>Array(val), :type=>:on_enter, :deferred=>true}
49
54
  when :on_exit
50
55
  @triggers << {:from=>[state_name], :to=>["*"], :trigger=>Array(val), :type=>:on_exit}
51
56
  when :on_exit_deferred
57
+ raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") unless respond_to?(:after_save)
52
58
  @triggers << {:from=>[state_name], :to=>["*"], :trigger=>Array(val), :type=>:on_exit, :deferred=>true}
53
59
  end
54
60
  end
@@ -60,6 +66,7 @@ module CanHasState
60
66
  def on(pairs)
61
67
  trigger = pairs.delete :trigger
62
68
  deferred = pairs.delete :deferred
69
+ raise(ArgumentError, "use of deferred triggers requires support for #after_save callbacks") if deferred && !respond_to?(:after_save)
63
70
  pairs.each do |from, to|
64
71
  @triggers << {:from=>Array(from).map(&:to_s), :to=>Array(to).map(&:to_s),
65
72
  :trigger=>Array(trigger), :type=>:trigger, :deferred=>!!deferred}
@@ -69,10 +76,12 @@ module CanHasState
69
76
 
70
77
 
71
78
  def known?(to)
72
- @states.keys.include? to
79
+ to &&= to.to_s
80
+ @states.keys.include? to
73
81
  end
74
82
 
75
83
  def allow?(record, to)
84
+ to &&= to.to_s
76
85
  return false unless known?(to)
77
86
  states[to][:guards].all? do |g|
78
87
  case g
@@ -87,11 +96,14 @@ module CanHasState
87
96
  end
88
97
 
89
98
  def message(to)
99
+ to &&= to.to_s
90
100
  states[to][:message]
91
101
  end
92
102
 
93
103
 
94
104
  def trigger(record, from, to, deferred=false)
105
+ from &&= from.to_s
106
+ to &&= to.to_s
95
107
  # Rails.logger.debug "Checking triggers for transition #{from} to #{to} (deferred:#{deferred.inspect})"
96
108
  @triggers.select do |trigger|
97
109
  deferred ? trigger[:deferred] : !trigger[:deferred]
@@ -0,0 +1,28 @@
1
+ module CanHasState
2
+ module DirtyHelper
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include ActiveModel::Dirty
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def track_dirty(*attrs)
12
+ define_attribute_methods attrs
13
+ attrs.each do |attr|
14
+ attr = attr.to_s
15
+ attr_reader(attr) unless respond_to?(attr)
16
+ has_writer = respond_to?("#{attr}=")
17
+ define_method "#{attr}=" do |val|
18
+ send("#{attr}_will_change!") unless val == instance_variable_get("@#{attr}")
19
+ has_writer ? super(val) : instance_variable_set("@#{attr}", val)
20
+ changed_attributes.delete(attr) if attribute_was(attr) == send(attr)
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+ end
@@ -16,7 +16,7 @@ module CanHasState
16
16
 
17
17
  def extend_state_machine(column, &block)
18
18
  sm = state_machines.detect{|(col, stm)| col == column}
19
- raise("Unknown state machine #{column}") unless sm
19
+ raise(ArgumentError, "Unknown state machine #{column}") unless sm
20
20
  sm[1].extend_machine &block
21
21
  end
22
22
 
@@ -30,7 +30,7 @@ module CanHasState
30
30
  before_validation :can_has_initial_states
31
31
  before_validation :can_has_state_triggers
32
32
  validate :can_has_valid_state_machines
33
- after_save :can_has_deferred_state_triggers
33
+ after_save :can_has_deferred_state_triggers if respond_to?(:after_save)
34
34
  end
35
35
 
36
36
 
@@ -81,7 +81,7 @@ module CanHasState
81
81
  from, to = send("#{column}_was"), send(column)
82
82
  next if from == to
83
83
  if !sm.known?(to)
84
- err << [column, "is not a known state"]
84
+ err << [column, "is not in a known state"]
85
85
  elsif !sm.allow?(self, to) #state_machine_allow?(column, to)
86
86
  err << [column, sm.message(to) % {:from=>from, :to=>to}]
87
87
  end
@@ -1,3 +1,3 @@
1
1
  module CanHasState
2
- VERSION = "0.2.2"
2
+ VERSION = '0.3.0'
3
3
  end
data/lib/can_has_state.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  require 'active_support'
2
2
  require 'active_model'
3
3
 
4
- require 'can_has_state/definition'
5
- require 'can_has_state/machine'
4
+ %w(definition dirty_helper machine).each do |f|
5
+ require "can_has_state/#{f}"
6
+ end
6
7
 
7
8
  require 'can_has_state/railtie' if defined?(Rails)
@@ -1,7 +1,212 @@
1
1
  require 'test_helper'
2
2
 
3
- class CanHasStateTest < ActiveSupport::TestCase
4
- test "truth" do
5
- assert_kind_of Module, CanHasState
3
+ class Account
4
+ include ActiveModel::Validations
5
+ include ActiveModel::Validations::Callbacks
6
+ include CanHasState::DirtyHelper
7
+ include CanHasState::Machine
8
+
9
+ attr_accessor :deleted_at, :undeleted, :allow_special
10
+ track_dirty :account_state
11
+
12
+ state_machine :account_state do
13
+ state :active,
14
+ from: [:inactive, :special]
15
+ state :special,
16
+ require: :allow_special
17
+ state :inactive,
18
+ from: [:active, :deleted, :special]
19
+ state :deleted,
20
+ from: [:active, :inactive],
21
+ timestamp: :deleted_at
22
+ on :deleted => :*, trigger: ->(acct){ acct.undeleted = true }
23
+ end
24
+
25
+ def fake_persist
26
+ if valid?
27
+ # just reset dirty tracking and pretend all is good
28
+ changed_attributes.clear
29
+ true
30
+ end
31
+ end
32
+ end
33
+
34
+ class UserBare ; end
35
+ class UserState
36
+ include ActiveModel::Validations
37
+ include ActiveModel::Validations::Callbacks
38
+ include CanHasState::Machine
39
+ state_machine :state do
40
+ state :awesome
41
+ state :fabulous, :initial
42
+ end
43
+ end
44
+ class UserExtended
45
+ include ActiveModel::Validations
46
+ include ActiveModel::Validations::Callbacks
47
+ include CanHasState::Machine
48
+ state_machine :state do
49
+ state :awesome
50
+ state :fabulous, :initial
51
+ end
52
+ extend_state_machine :state do
53
+ state :incredible, :initial
54
+ end
55
+ extend_state_machine :state do
56
+ state :fantastic
57
+ end
58
+ end
59
+ class UserPreState
60
+ include ActiveModel::Validations
61
+ include ActiveModel::Validations::Callbacks
62
+ include CanHasState::Machine
63
+ end
64
+
65
+ class CanHasStateTest < MiniTest::Unit::TestCase #Minitest::Test
66
+
67
+ def test_builder_simple
68
+ refute UserBare.respond_to?(:state_machine)
69
+ assert UserState.respond_to?(:state_machine)
70
+ assert UserState.respond_to?(:state_machines)
71
+ assert UserState.new.respond_to?(:allow_state?)
72
+ assert_equal 1, UserState.state_machines.size
73
+ sm = UserState.state_machines[0][1]
74
+ assert_equal :state, sm.column
75
+ assert_equal 2, sm.states.size
76
+ assert_equal 0, sm.triggers.size
77
+ assert_equal 'fabulous', sm.initial_state
78
+ end
79
+
80
+ def test_builder_extended
81
+ assert_equal 1, UserExtended.state_machines.size
82
+ sm = UserExtended.state_machines[0][1]
83
+ assert_equal :state, sm.column
84
+ assert_equal 4, sm.states.size
85
+ assert_equal 0, sm.triggers.size
86
+ assert_equal 'incredible', sm.initial_state
87
+ end
88
+
89
+ def test_extending
90
+ assert_raises(ArgumentError) do
91
+ UserState.class_eval do
92
+ extend_state_machine :doesnt_exist do
93
+ state :phantom
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ def test_deferred_unavailable
100
+ assert_raises(ArgumentError) do
101
+ UserPreState.class_eval do
102
+ state_machine :state_one do
103
+ state :one, on_enter_deferred: ->{ raise "Shouldn't get here" }
104
+ end
105
+ end
106
+ end
107
+
108
+ assert_raises(ArgumentError) do
109
+ UserPreState.class_eval do
110
+ state_machine :state_two do
111
+ state :two, on_exit_deferred: ->{ raise "Shouldn't get here" }
112
+ end
113
+ end
114
+ end
115
+
116
+ assert_raises(ArgumentError) do
117
+ UserPreState.class_eval do
118
+ state_machine :state_three do
119
+ state :three
120
+ on :* => :*, trigger: ->{ raise "Shouldn't get here" }, deferred: true
121
+ end
122
+ end
123
+ end
6
124
  end
125
+
126
+ def test_builder_complex
127
+ assert_equal 1, Account.state_machines.size
128
+ sm = Account.state_machines[0][1]
129
+ assert_equal :account_state, sm.column
130
+ assert_equal 4, sm.states.size
131
+ assert_equal 2, sm.triggers.size
132
+ assert_equal 'active', sm.initial_state
133
+ end
134
+
135
+ def test_state_builder
136
+ sm_acct = Account.state_machines[0][1]
137
+ sm_user = UserState.state_machines[0][1]
138
+ assert_equal 0, sm_user.states['awesome'][:guards].size
139
+ assert_equal 1, sm_acct.states['active'][:guards].size
140
+ end
141
+
142
+
143
+ def test_dirty_helper
144
+ assert Account.new.respond_to?(:account_state)
145
+ assert Account.new.respond_to?(:account_state_was)
146
+
147
+ a = Account.new
148
+ a.fake_persist
149
+ assert_equal 'active', a.account_state
150
+ assert_equal 'active', a.account_state_was
151
+ a.account_state = 'inactive'
152
+ assert_equal 'inactive', a.account_state
153
+ assert_equal 'active', a.account_state_was
154
+ a.fake_persist
155
+ assert_equal 'inactive', a.account_state
156
+ assert_equal 'inactive', a.account_state_was
157
+ end
158
+
159
+ def test_state_vals
160
+ a = Account.new
161
+ a.account_state = :inactive
162
+ assert a.valid?, "Should be valid; got errors: #{a.errors.to_a}"
163
+
164
+ a = Account.new
165
+ a.account_state = 'inactive'
166
+ assert a.valid?, "Should be valid; got errors: #{a.errors.to_a}"
167
+
168
+ a = Account.new
169
+ a.account_state = 'madeup'
170
+ refute a.valid?
171
+ assert_equal ['Account state is not in a known state'], a.errors.to_a
172
+ end
173
+
174
+ def test_triggers
175
+ a = Account.new
176
+ a.fake_persist
177
+ assert_equal 'active', a.account_state
178
+ refute a.deleted_at
179
+ refute a.undeleted
180
+
181
+ a.account_state = 'deleted'
182
+ assert a.fake_persist
183
+ assert_kind_of Time, a.deleted_at
184
+ refute a.undeleted
185
+
186
+ a.account_state = 'inactive'
187
+ assert a.fake_persist, "Unexpected error: #{a.errors.to_a}"
188
+ assert a.undeleted, 'Expecting undeleted to be set'
189
+ end
190
+
191
+ def test_guards
192
+ a = Account.new
193
+ a.account_state = 'deleted'
194
+ assert a.fake_persist
195
+
196
+ a.account_state = 'active'
197
+ a.valid?
198
+ assert_match /invalid transition/, a.errors.to_a.first
199
+
200
+ a.account_state = 'inactive'
201
+ assert a.valid?, "Errors: #{a.errors.to_a}"
202
+
203
+
204
+ a.account_state = 'special'
205
+ a.valid?
206
+ assert_match /invalid transition/, a.errors.to_a.first
207
+
208
+ a.allow_special = true
209
+ assert a.valid?, "Errors: #{a.errors.to_a}"
210
+ end
211
+
7
212
  end
data/test/test_helper.rb CHANGED
@@ -1,15 +1,4 @@
1
- # Configure Rails Environment
2
- ENV["RAILS_ENV"] = "test"
1
+ require 'minitest/autorun'
2
+ require 'turn'
3
3
 
4
- require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
- require "rails/test_help"
6
-
7
- Rails.backtrace_cleaner.remove_silencers!
8
-
9
- # Load support files
10
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
11
-
12
- # Load fixtures from the engine
13
- if ActiveSupport::TestCase.method_defined?(:fixture_path=)
14
- ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
15
- end
4
+ require 'can_has_state'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: can_has_state
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
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-06-10 00:00:00.000000000 Z
12
+ date: 2013-07-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -56,7 +56,23 @@ dependencies:
56
56
  - !ruby/object:Gem::Version
57
57
  version: '5.0'
58
58
  - !ruby/object:Gem::Dependency
59
- name: sqlite3
59
+ name: minitest
60
+ requirement: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: '4.2'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ version: '4.2'
74
+ - !ruby/object:Gem::Dependency
75
+ name: turn
60
76
  requirement: !ruby/object:Gem::Requirement
61
77
  none: false
62
78
  requirements:
@@ -80,6 +96,7 @@ extensions: []
80
96
  extra_rdoc_files: []
81
97
  files:
82
98
  - lib/can_has_state/definition.rb
99
+ - lib/can_has_state/dirty_helper.rb
83
100
  - lib/can_has_state/machine.rb
84
101
  - lib/can_has_state/railtie.rb
85
102
  - lib/can_has_state/version.rb
@@ -89,34 +106,6 @@ files:
89
106
  - Rakefile
90
107
  - README.md
91
108
  - test/can_has_state_test.rb
92
- - test/dummy/app/assets/javascripts/application.js
93
- - test/dummy/app/assets/stylesheets/application.css
94
- - test/dummy/app/controllers/application_controller.rb
95
- - test/dummy/app/helpers/application_helper.rb
96
- - test/dummy/app/views/layouts/application.html.erb
97
- - test/dummy/config/application.rb
98
- - test/dummy/config/boot.rb
99
- - test/dummy/config/database.yml
100
- - test/dummy/config/environment.rb
101
- - test/dummy/config/environments/development.rb
102
- - test/dummy/config/environments/production.rb
103
- - test/dummy/config/environments/test.rb
104
- - test/dummy/config/initializers/backtrace_silencers.rb
105
- - test/dummy/config/initializers/inflections.rb
106
- - test/dummy/config/initializers/mime_types.rb
107
- - test/dummy/config/initializers/secret_token.rb
108
- - test/dummy/config/initializers/session_store.rb
109
- - test/dummy/config/initializers/wrap_parameters.rb
110
- - test/dummy/config/locales/en.yml
111
- - test/dummy/config/routes.rb
112
- - test/dummy/config.ru
113
- - test/dummy/public/404.html
114
- - test/dummy/public/422.html
115
- - test/dummy/public/500.html
116
- - test/dummy/public/favicon.ico
117
- - test/dummy/Rakefile
118
- - test/dummy/README.rdoc
119
- - test/dummy/script/rails
120
109
  - test/test_helper.rb
121
110
  homepage: https://github.com/zarqman/can_has_state
122
111
  licenses: []
@@ -130,52 +119,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
119
  - - ! '>='
131
120
  - !ruby/object:Gem::Version
132
121
  version: '0'
133
- segments:
134
- - 0
135
- hash: 1517895089536744781
136
122
  required_rubygems_version: !ruby/object:Gem::Requirement
137
123
  none: false
138
124
  requirements:
139
125
  - - ! '>='
140
126
  - !ruby/object:Gem::Version
141
127
  version: '0'
142
- segments:
143
- - 0
144
- hash: 1517895089536744781
145
128
  requirements: []
146
129
  rubyforge_project:
147
- rubygems_version: 1.8.24
130
+ rubygems_version: 1.8.25
148
131
  signing_key:
149
132
  specification_version: 3
150
133
  summary: Super simple state machine for ActiveModel
151
134
  test_files:
152
135
  - test/can_has_state_test.rb
153
- - test/dummy/app/assets/javascripts/application.js
154
- - test/dummy/app/assets/stylesheets/application.css
155
- - test/dummy/app/controllers/application_controller.rb
156
- - test/dummy/app/helpers/application_helper.rb
157
- - test/dummy/app/views/layouts/application.html.erb
158
- - test/dummy/config/application.rb
159
- - test/dummy/config/boot.rb
160
- - test/dummy/config/database.yml
161
- - test/dummy/config/environment.rb
162
- - test/dummy/config/environments/development.rb
163
- - test/dummy/config/environments/production.rb
164
- - test/dummy/config/environments/test.rb
165
- - test/dummy/config/initializers/backtrace_silencers.rb
166
- - test/dummy/config/initializers/inflections.rb
167
- - test/dummy/config/initializers/mime_types.rb
168
- - test/dummy/config/initializers/secret_token.rb
169
- - test/dummy/config/initializers/session_store.rb
170
- - test/dummy/config/initializers/wrap_parameters.rb
171
- - test/dummy/config/locales/en.yml
172
- - test/dummy/config/routes.rb
173
- - test/dummy/config.ru
174
- - test/dummy/public/404.html
175
- - test/dummy/public/422.html
176
- - test/dummy/public/500.html
177
- - test/dummy/public/favicon.ico
178
- - test/dummy/Rakefile
179
- - test/dummy/README.rdoc
180
- - test/dummy/script/rails
181
136
  - test/test_helper.rb