- Add support for Rails 6 @greysteil
- Fix statesman index detection for indexes that start t-z @hmarr
- Correct access of metadata via
state_machine
@glenpike
- Add better support for mysql (and others) in
transition_conflict_error?
@greysteil (gocardless#342)
- Forces Statesman to use a new transactions with
requires_new: true
(gocardless#249) - Fixes an issue with
after_commit
transition blocks that where being executed even if the transaction rolled back. (patch by @matid)
- Expose
most_recent_transition_join
- ActiveRecordsor
requires that both sides of the query match up. Exposing this methods makes things easier if one side of theor
usesin_state
ornot_in_state
. (patch by @adambutler) - Various Readme and CI related changes.
- Support ActiveRecord transition classes which don't include
Statesman::Adapters::ActiveRecordTransition
, and thus don't have a.updated_timestamp_column
method (see #310 for further details) (patch by @timrogers)
- When unsetting the
most_recent
flag during a transition, don't assume that transitions have anupdated_at
attribute, but rather allow the "updated timestamp column" to be re-configured or disabled entirely (patch by @timrogers)
- Touch
updated_at
on transitions when unsettingmost_recent
flag (patch by @NGMarmaduke) - Fix
force_reload
for ActiveRecord models with loaded transitions (patch by @jacobpgn)
- Allow specifying metadata with
Machine#allowed_transitions
(patch by @vvondra)
- Add support for Rails 5.0.x and 5.1.x (patch by @kenchan0130 and @timrogers)
- Run tests in CircleCI instead of TravisCI (patch by @timrogers)
- Update Rubocop and fix offences (patch by @timrogers)
Breaking changes
- Drop support for Rails < 4.2
- Drop support for Ruby < 2.2
For details on our compatibility policy, see docs/COMPATIBILITY.md
.
Changes
- Better handling of custom transition association names (patch by @greysteil)
- Add foreign keys to transition table generator (patch by @greysteil)
- Support partial indexes in transition table update generator (patch by @kenchan0130)
- Add support for Rails 5 (excluding Mongoid adapter)
- No changes from v2.0.0.rc1
Breaking changes
- Unset most_recent after before transitions
- TL;DR: set
autosave: false
on thehas_many
association between your parent and transition model and this change will almost certainly not affect your integration - Previously the
most_recent
flag would be set tofalse
on all transitions during anybefore_transition
callbacks - After this change, the
most_recent
flag will still betrue
for the previous transition during these callbacks - Whilst this behaviour is almost certainly what your integration already expected, as a result of it any attempt to save the new, as yet unpersisted, transition during a
before_transition
callback will result in a uniqueness error. In particular, if you have not setautosave: false
on thehas_many
association between your parent and transition model then any attempt to save the parent model during abefore_transition
will result in an error
- TL;DR: set
- Require a most_recent column on transition tables
- The
most_recent
column, added in v1.2.0, is now required on all transition tables - This greatly speeds up queries on large tables
- A zero-downtime migration path is outlined in the changelog for v1.2.0. You should use that migration path before upgrading to v2.0.0
- The
- Increase default initial sort key to 10
- Drop support for Ruby 1.9.3, which reached end-of-life in February 2015
- Move support for events to a companion gem
- Previously, Statesman supported the use of "events" to trigger transitions
- To keep Statesman lightweight we've moved event functionality into the
statesman-events
gem - If you are using events, add
statesman-events
to your gemfile and includeStatesman::Events
in your state machines
Changes
- Add after_destroy hook to ActiveRecord transition model templates
- Add
in_state?
instance method toStatesman::Machine
- Add
force_reload
option toStatesman::Machine#last_transition
- Fix
in_state
queries with a customtransition_name
(patch by 0tsuki) - Fix
backfill_most_recent
rake task for databases that support partial indexes (patch by greysteil)
- Rename
last_transition
alias inActiveRecordQueries
tomost_recent_#{model_name}
, to allow merging of two such queries (patch by @isaacseymour)
- Make
backfill_most_recent
rake task db-agnostic (patch by @timothyp)
- Clarify error messages when misusing
Statesman::Adapters::ActiveRecordTransition
(patch by @isaacseymour)
- Fix use of most_recent column in MySQL (partial indexes aren't supported) (patch by @greysteil)
- Add support for namespaced transition models (patch by @DanielWright)
- Add support for Postgres 9.4's
jsonb
column type (patch by @isaacseymour)
Changes
- Add a
most_recent
column to transition tables to greatly speed up queries (ActiveRecord adapter only).- All queries are backwards-compatible, so everything still works without the new column.
- The upgrade path is:
- Generate and run a migration for adding the column, by running
rails generate statesman:add_most_recent <ParentModel> <TransitionModel>
. - Backfill the
most_recent
column on old records by runningrake statesman:backfill_most_recent[ParentModel]
. - Add constraints and indexes to the transition table that make use of the new field, by running
rails g statesman:add_constraints_to_most_recent <ParentModel> <TransitionModel>
.
- Generate and run a migration for adding the column, by running
- The upgrade path has been designed to be zero-downtime, even on large tables. As a result, please note that queries will only use the
most_recent
field after the constraints have been added.
ActiveRecordQueries.{not_,}in_state
now accepts an array of states.
Fixes
- Support for Rails 4.2.0.rc2:
- Remove use of serialized_attributes when using 4.2+. (patch by @greysteil)
- Use reflect_on_association rather than directly using the reflections hash. (patch by @timrogers)
- Fix
ActiveRecordQueries.in_state
whenModel.initial_state
is defined as a symbol. (patch by @isaacseymour)
Changes
- Transition metadata now defaults to
{}
rather thannil
. (patch by @greysteil)
No changes from v1.0.0.beta2
Breaking changes
- Rename
ActiveRecordModel
toActiveRecordQueries
, to reflect the fact that it mixes in some helpful scopes, but is not required.
Breaking changes
- Classes which include
ActiveRecordModel
must define aninitial_state
class method.
Fixes
ActiveRecordModel.in_state
andActiveRecordModel.not_in_state
now handle inital states correctly (patch by @isaacseymour)
Additions
- Transition tables created by generated migrations have
NOT NULL
constraints onto_state
,sort_key
and foreign key columns (patch by @greysteil) before_transition
andafter_transition
allow an array of to states (patch by @isaacseymour)
Fixes
- Optimisation for Machine#available_events (patch by @pacso)
Fixes
- Stop generating a default value for the metadata column if using MySQL.
Fixes
- Adds check in Machine#transition to make sure the 'to' state is not an empty array (patch by @barisbalic)
Additions
- Events. Machines can now define events as a logical grouping of transitions (patch by @iurimatias)
- Retries. Individual transitions can be executed with a retry policy by wrapping the method call in a
Machine.retry_conflicts {}
block (patch by @greysteil)
Additions
Adapters::ActiveRecord
now handlesActiveRecord::RecordNotUnique
errors explicitly and re-raises with aStatesman::TransitionConflictError
if it is due to duplicate sort_keys (patch by @greysteil)
Fixes
- Fixes an issue where the wrong transition was passed to after_transition callbacks for the second and subsequent transition of a given state machine (patch by @alan)
Additions
- Generators now handle namespaced classes (patch by @hrmrebecca)
Changes
Machine#transition_to
now only swallows Statesman generated errors. An exception in your guard or callback will no longer be caught by Statesman (patch by @paulspringett)
Additions
- Scope methods. Adds a module which can be mixed in to an ActiveRecord model to provide
.in_state
and.not_in_state
query scopes. - Adds
Machine#after_initialize
hook (patch by @att14)
Fixes
Additions
- Adds after_commit flag to after_transition for callbacks to be executed after the transaction has been committed on the ActiveRecord adapter. These callbacks will still be executed on non transactional adapters.
Additions
- Adds Machine#allowed_transitions method (patch by @prikha)
Fixes
- Don't add attr_accessible to generated transition model if running in Rails 4
Additions
- Adds Ruby 1.9.3 support (patch by @jakehow)
- All Mongo dependent tests are tagged so they can be excluded from test runs
Changes
- Specs now crash immediately if Mongo is not running
Additions
- Adds Mongoid adapter and generators (patch by @dluxemburg)
Changes
- Replaces
config#transition_class
withStatesman::Adapters::ActiveRecordTransition
mixin. (inspired by @cjbell88) - Renames the active record transition generator from
statesman:transition
tostatesman:active_record_transition
. - Moves to using
require_relative
internally where possible to avoid stomping on application load paths.
- Initial release