0.0
No commit activity in last 3 years
No release in over 3 years
Add support for creating state machine on any ruby object
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

>= 0
 Project Readme

Big machine Build Status Dependency Status Code Climate

Big machine is a Gem which give state to your object

Resources

Bugs

Development

Testing

Source

  • git://github.com/alaibe/big_machine.git

Install

Add this to your Gemfile

  gem 'big_machine'

Usage

Create your first state

  class Draft < BigMachine::State
    def publish
      transition_to Online
    end
  end

  class Online < BigMachine::State
  end

All methods you override in you state can takes args and block

  class Draft < BigMachine::State
    def publish(now = Time.now)
      transition_to Online, now
    end
  end

  class Online < BigMachine::State
    def enter(*args)
      stateful.publish_at args.first
    end
  end

Make your object stateful

  class Car
    include BigMachine

    big_machine initial_state: :draft
  end

Now it's possible to publish your car object:

  car = Car.new
  car.current_state # => Draft
  car.publish
  car.current_state # => Online

Of course your object can be an ActiveRecord::Base object. In this case, the object must have a state column. ( if not, see the next section )

Big machine options

big_machine method can take several options:

  • initial_state is the only one necessary option
  • state_attribute is available only if the object is an active record object
  • workflow if you want to change the normal worklow It's possible to call workflow_is method in your different states

Example

  big_machine initial_state: :dradt, state_attribute: :big_state, workflow: small

  class Draft < BigMachine::State

    def publish
      return if workflow_is :small

      transition_to Online
    end

  end

Lock module

A state can include lock module, it will lock the state of your object when your enter in it. The unlock method should be call to unlock the module

  class Draft < BigMachine::State
    include BigMachine::Lock

    def publish
      transition_to Online
    end

  end

  class Article
    include BigMachine

    big_machine initial_state: :dradt
  end

  article = Article.new
  article.publish
  article.current_state # => Draft
  article.unlock
  article.publish
  article.current_state # => Online

Contributors

*Anthony Laibe

Bitdeli Badge