apollo 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,20 @@
1
1
  Apollo Changelog
2
2
  ================
3
3
 
4
- 1.1
4
+ ## 1.2
5
+
6
+ * Added `StateSet` class. (ace5f98)
7
+ * Renamed `State#sets` to `State#set_names`. (d3185f5)
8
+ * Added `ActiveRecordExtensions` for instance & class methods. (baf6177)
9
+ * Added AR class method `state_set_sql` for easy SQL usage.
10
+
11
+ ## 1.1
5
12
 
6
13
  * Added state sets. (7498cf0)
7
14
  * Unbranded methods. E.g. `Apollo::apollo` -> `Apollo::state_machine` (f8b42b8)
8
15
 
9
- 1.0
10
- ---
16
+ ## 1.0
17
+
11
18
  This is an initial release of the Apollo fork from [Workflow](http://github.com/geekq/workflow). The reason I decided to fork Workflow, and in particular change the name, is because I feel that Workflow is an excellent starting point for my needs; however, my desire for Apollo is somewhat different from the desires of the creators of Workflow. **In no way is my fork (and renaming) intended to be any kind of insult or intellectual rights infringement.** I chose Workflow for the basis of Apollo because I feel it is the **best** state machine gem available. I will most certainly maintain the original MIT-LICENSE as apart of Apollo so long as *any* portion of the code is derived from Workflow (which I suspect will always be the case).
12
19
 
13
20
  * Rebranded modules from "workflow" to "apollo".
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{apollo}
8
- s.version = "1.1.0"
8
+ s.version = "1.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Travis D. Warlick, Jr."]
@@ -25,10 +25,11 @@ Gem::Specification.new do |s|
25
25
  "VERSION",
26
26
  "apollo.gemspec",
27
27
  "lib/apollo.rb",
28
- "lib/apollo/active_record_instance_methods.rb",
28
+ "lib/apollo/active_record_extensions.rb",
29
29
  "lib/apollo/event.rb",
30
30
  "lib/apollo/specification.rb",
31
31
  "lib/apollo/state.rb",
32
+ "lib/apollo/state_set.rb",
32
33
  "test/couchtiny_example.rb",
33
34
  "test/main_test.rb",
34
35
  "test/readme_example.rb",
@@ -16,10 +16,11 @@
16
16
  # Copyright (c) 2008-2009 Vodafone
17
17
  # Copyright (c) 2007-2008 Ryan Allen, FlashDen Pty Ltd
18
18
  module Apollo
19
- autoload :Event, 'apollo/event'
20
- autoload :State, 'apollo/state'
21
- autoload :Specification, 'apollo/specification'
22
- autoload :ActiveRecordInstanceMethods, 'apollo/active_record_instance_methods'
19
+ autoload :Event, 'apollo/event'
20
+ autoload :State, 'apollo/state'
21
+ autoload :StateSet, 'apollo/state_set'
22
+ autoload :Specification, 'apollo/specification'
23
+ autoload :ActiveRecordExtensions, 'apollo/active_record_extensions'
23
24
 
24
25
  # The current version
25
26
  VERSION = File.read(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'VERSION')).strip
@@ -74,7 +75,7 @@ module Apollo
74
75
  @apollo_spec.state_sets.keys.each do |set_name|
75
76
  module_eval do
76
77
  define_method "#{set_name}?" do
77
- current_state.sets.include?(set_name)
78
+ current_state.set_names.include?(set_name.to_sym)
78
79
  end
79
80
  end
80
81
  end
@@ -219,8 +220,9 @@ module Apollo
219
220
  klass.extend ClassMethods
220
221
  if Object.const_defined?(:ActiveRecord)
221
222
  if klass < ActiveRecord::Base
222
- klass.send :include, ActiveRecordInstanceMethods
223
- klass.before_validation :write_initial_state
223
+ klass.send :include, ActiveRecordExtensions::InstanceMethods
224
+ klass.extend ActiveRecordExtensions::ClassMethods
225
+ klass.before_validation :write_initial_state
224
226
  end
225
227
  end
226
228
  end
@@ -0,0 +1,38 @@
1
+ module Apollo
2
+ module ActiveRecordExtensions
3
+ module InstanceMethods
4
+ def load_current_state
5
+ read_attribute(self.class.current_state_column)
6
+ end
7
+
8
+ # On transition the new current state is immediately saved in the
9
+ # database.
10
+ def persist_current_state(new_value)
11
+ update_attribute self.class.current_state_column, new_value
12
+ end
13
+
14
+ private
15
+
16
+ # Motivation: even if NULL is stored in the current_state database column,
17
+ # the current_state is correctly recognized in the Ruby code. The problem
18
+ # arises when you want to SELECT records filtering by the value of initial
19
+ # state. That's why it is important to save the string with the name of the
20
+ # initial state in all the new records.
21
+ def write_initial_state
22
+ write_attribute self.class.current_state_column, current_state.to_s
23
+ end
24
+ end
25
+
26
+ module ClassMethods
27
+ def state_set_sql( set_name, options = {} )
28
+ quotes = (options[:quotes] or %('))
29
+ join = (options[:join] or %(,))
30
+ surround = (options[:surround] or ['(',')'])
31
+
32
+ str = state_machine.state_sets[set_name.to_sym].state_names
33
+ str = str.collect { |state_name| quotes + state_name + quotes }.join(join)
34
+ surround.first + str + surround.last
35
+ end
36
+ end
37
+ end
38
+ end
@@ -22,19 +22,23 @@ module Apollo
22
22
  instance_eval(&events_and_etc) if events_and_etc
23
23
  end
24
24
 
25
- def state_set(name, *state_names)
26
- validate_state_set_name(name)
25
+ def state_set(set_name, *state_names)
26
+ validate_state_set_name(set_name)
27
27
 
28
- set = Set.new
28
+ state_names.flatten!
29
+ state_names.collect! {|n| n.to_sym}
30
+ state_names.uniq!
31
+
32
+ set = StateSet.new
29
33
  state_names.each do |state_name|
30
34
  if state = @states[state_name]
31
35
  set << state
32
- state.sets << name
36
+ state.set_names << set_name.to_sym
33
37
  else
34
- raise ApolloDefinitionError, "Unknown state: #{state}"
38
+ raise ApolloDefinitionError, "Unknown state: #{state_name}"
35
39
  end
36
40
  end
37
- @state_sets[name] = set
41
+ @state_sets[set_name] = set
38
42
  end
39
43
 
40
44
  def event(name, args = {}, &action)
@@ -1,9 +1,9 @@
1
1
  module Apollo
2
2
  class State
3
- attr_accessor :name, :events, :meta, :on_entry, :on_exit, :sets
3
+ attr_accessor :name, :events, :meta, :on_entry, :on_exit, :set_names
4
4
 
5
5
  def initialize(name, meta = {})
6
- @name, @events, @meta, @sets = name, Hash.new, meta, Set.new
6
+ @name, @events, @meta, @set_names = name, Hash.new, meta, Set.new
7
7
  end
8
8
 
9
9
  def to_s
@@ -0,0 +1,7 @@
1
+ module Apollo
2
+ class StateSet < Set
3
+ def state_names
4
+ collect {|state| state.name.to_s}
5
+ end
6
+ end
7
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 1
7
+ - 2
8
8
  - 0
9
- version: 1.1.0
9
+ version: 1.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Travis D. Warlick, Jr.
@@ -37,10 +37,11 @@ files:
37
37
  - VERSION
38
38
  - apollo.gemspec
39
39
  - lib/apollo.rb
40
- - lib/apollo/active_record_instance_methods.rb
40
+ - lib/apollo/active_record_extensions.rb
41
41
  - lib/apollo/event.rb
42
42
  - lib/apollo/specification.rb
43
43
  - lib/apollo/state.rb
44
+ - lib/apollo/state_set.rb
44
45
  - test/couchtiny_example.rb
45
46
  - test/main_test.rb
46
47
  - test/readme_example.rb
@@ -1,24 +0,0 @@
1
- module Apollo
2
- module ActiveRecordInstanceMethods
3
- def load_current_state
4
- read_attribute(self.class.current_state_column)
5
- end
6
-
7
- # On transition the new current state is immediately saved in the
8
- # database.
9
- def persist_current_state(new_value)
10
- update_attribute self.class.current_state_column, new_value
11
- end
12
-
13
- private
14
-
15
- # Motivation: even if NULL is stored in the current_state database column,
16
- # the current_state is correctly recognized in the Ruby code. The problem
17
- # arises when you want to SELECT records filtering by the value of initial
18
- # state. That's why it is important to save the string with the name of the
19
- # initial state in all the new records.
20
- def write_initial_state
21
- write_attribute self.class.current_state_column, current_state.to_s
22
- end
23
- end
24
- end