alter-ego-mongoid 0.1.2
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/Manifest +9 -0
- data/README.rdoc +37 -0
- data/Rakefile +18 -0
- data/alter-ego-mongoid.gemspec +40 -0
- data/init.rb +1 -0
- data/lib/alter_ego/mongoid_adapter.rb +31 -0
- data/test/adapter_test.rb +70 -0
- data/test/helper.rb +16 -0
- data/test/traffic_signal.rb +30 -0
- metadata +130 -0
data/Manifest
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
= AlterEgo-Mongoid
|
2
|
+
|
3
|
+
== Motivation
|
4
|
+
AlterEgo is my favorite Ruby state machine for the following reasons:
|
5
|
+
1. It's not dependent on Mongoid - it can be used on plain Ruby objects.
|
6
|
+
2. It most closely follows the GOF State Pattern because it allows for
|
7
|
+
polymorphic behavior based on state.
|
8
|
+
|
9
|
+
Out of the box, AlterEgo doesn't play nicely with Mongoid because it
|
10
|
+
stores state in <tt>@state</tt>, whereas Mongoid::Document
|
11
|
+
persists with setter methods.
|
12
|
+
|
13
|
+
This mixin overrides the AlterEgo's accessor methods for state to allow it
|
14
|
+
to be properly persisted to a database, as well as serialized/unserialized as
|
15
|
+
json, yml, and xml.
|
16
|
+
|
17
|
+
== Installation
|
18
|
+
=== As a Ruby Gem
|
19
|
+
gem install alter-ego-mongoid
|
20
|
+
=== OR as a Rails plugin
|
21
|
+
script/plugin install git://github.com/wink/alter-ego-mongoid.git
|
22
|
+
|
23
|
+
== Usage
|
24
|
+
This plugin automatically adds a string field to your model called "state".
|
25
|
+
|
26
|
+
# you'll only need the following two lines if you're NOT using
|
27
|
+
# alter-ego-mongoid as a plugin
|
28
|
+
gem 'alter-ego-mongoid'
|
29
|
+
require 'alter_ego/mongoid_adapter'
|
30
|
+
|
31
|
+
class Example
|
32
|
+
include Mongoid::Document
|
33
|
+
include AlterEgo # include this first
|
34
|
+
include AlterEgo::MongoidAdapter
|
35
|
+
|
36
|
+
# Your code here
|
37
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('alter-ego-mongoid', '0.1.2') do |p|
|
6
|
+
p.description = "Adapter to allow Mongoid to persist and restore state of objects using the AlterEgo state machine, ported from the alter-ego-activerecord gem by Paul Hieromnimon"
|
7
|
+
p.author = "Micah Winkelspecht"
|
8
|
+
p.email = "winkelspecht@gmail.com"
|
9
|
+
p.url = "http://github.com/wink/alter-ego-mongoid"
|
10
|
+
p.runtime_dependencies = ["mongoid >=2.0.0.rc.6", "bson_ext ~>1.2", "alter-ego >=1.0.1" ]
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'rake/testtask'
|
14
|
+
Rake::TestTask.new(:test) do |test|
|
15
|
+
test.libs << 'lib' << 'test'
|
16
|
+
test.pattern = 'test/**/test_*.rb'
|
17
|
+
test.verbose = true
|
18
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{alter-ego-mongoid}
|
5
|
+
s.version = "0.1.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Micah Winkelspecht"]
|
9
|
+
s.date = %q{2011-01-30}
|
10
|
+
s.description = %q{Adapter to allow Mongoid to persist and restore state of objects using the AlterEgo state machine, ported from the alter-ego-activerecord gem by Paul Hieromnimon}
|
11
|
+
s.email = %q{winkelspecht@gmail.com}
|
12
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/alter_ego/mongoid_adapter.rb"]
|
13
|
+
s.files = ["Manifest", "README.rdoc", "Rakefile", "alter-ego-mongoid.gemspec", "init.rb", "lib/alter_ego/mongoid_adapter.rb", "test/adapter_test.rb", "test/helper.rb", "test/traffic_signal.rb"]
|
14
|
+
s.homepage = %q{http://github.com/wink/alter-ego-mongoid}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Alter-ego-mongoid", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{alter-ego-mongoid}
|
18
|
+
s.rubygems_version = %q{1.3.7}
|
19
|
+
s.summary = %q{Adapter to allow Mongoid to persist and restore state of objects using the AlterEgo state machine, ported from the alter-ego-activerecord gem by Paul Hieromnimon}
|
20
|
+
s.test_files = ["test/adapter_test.rb"]
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 3
|
25
|
+
|
26
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_runtime_dependency(%q<mongoid>, [">= 2.0.0.rc.6"])
|
28
|
+
s.add_runtime_dependency(%q<bson_ext>, ["~> 1.2"])
|
29
|
+
s.add_runtime_dependency(%q<alter-ego>, [">= 1.0.1"])
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<mongoid>, [">= 2.0.0.rc.6"])
|
32
|
+
s.add_dependency(%q<bson_ext>, ["~> 1.2"])
|
33
|
+
s.add_dependency(%q<alter-ego>, [">= 1.0.1"])
|
34
|
+
end
|
35
|
+
else
|
36
|
+
s.add_dependency(%q<mongoid>, [">= 2.0.0.rc.6"])
|
37
|
+
s.add_dependency(%q<bson_ext>, ["~> 1.2"])
|
38
|
+
s.add_dependency(%q<alter-ego>, [">= 1.0.1"])
|
39
|
+
end
|
40
|
+
end
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'alter_ego/mongoid_adapter'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module AlterEgo
|
2
|
+
module MongoidAdapter
|
3
|
+
|
4
|
+
def self.included klass
|
5
|
+
klass.field :state
|
6
|
+
klass.after_initialize do |r|
|
7
|
+
r.state = r.state
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# # rails needs this method to be defined for the
|
12
|
+
# # class method after_initialize to be able to take a block
|
13
|
+
# # this is because of some performance optimization
|
14
|
+
# def after_initialize; end
|
15
|
+
|
16
|
+
# Override methods from AlterEgo to store state
|
17
|
+
# in @attributes["state"] instead of @state
|
18
|
+
def state=(identifier)
|
19
|
+
# state needs to always be stored as a string - symbol serialization is strange
|
20
|
+
self[:state] = identifier.to_s unless identifier.nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
def state
|
24
|
+
result = self[:state] || self.class.default_state
|
25
|
+
result = result.to_sym unless result.nil?
|
26
|
+
assert(result.nil? || self.class.states.keys.include?(result))
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class AdapterTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_state_stored_in_attributes
|
6
|
+
t = TrafficSignal.new
|
7
|
+
assert_not_nil t.state
|
8
|
+
t.state = :caution
|
9
|
+
assert_equal :caution, t.state
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_state_stored_as_string
|
13
|
+
t = TrafficSignal.new
|
14
|
+
assert_equal String, t[:state].class
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_state_returned_as_symbol
|
18
|
+
t = TrafficSignal.new
|
19
|
+
assert_equal Symbol, t.state.class
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_state_is_persisted_and_restored
|
23
|
+
t = TrafficSignal.new
|
24
|
+
old_state = t.state
|
25
|
+
t.cycle!
|
26
|
+
new_state = t.state
|
27
|
+
|
28
|
+
#sanity check
|
29
|
+
assert_not_equal old_state, new_state
|
30
|
+
|
31
|
+
t.save!
|
32
|
+
t = t.reload
|
33
|
+
|
34
|
+
assert_equal t.state, new_state
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_new_object_has_default_state
|
38
|
+
t=TrafficSignal.new
|
39
|
+
assert_equal t.state, TrafficSignal.default_state
|
40
|
+
assert_equal t[:state].to_sym, TrafficSignal.default_state
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_yaml
|
44
|
+
require 'yaml'
|
45
|
+
t= TrafficSignal.new
|
46
|
+
t.cycle!
|
47
|
+
yaml = YAML::dump t
|
48
|
+
t2 = YAML::load yaml
|
49
|
+
assert_equal t.state, t2.state
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_json
|
53
|
+
t = TrafficSignal.new
|
54
|
+
t.cycle!
|
55
|
+
json = t.to_json
|
56
|
+
t2 = TrafficSignal.new
|
57
|
+
t2.from_json json
|
58
|
+
assert_equal t.state, t2.state
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_xml
|
62
|
+
t = TrafficSignal.new
|
63
|
+
t.cycle!
|
64
|
+
xml = t.to_xml
|
65
|
+
t2 = TrafficSignal.new
|
66
|
+
t2.from_xml xml
|
67
|
+
assert_equal t.state, t2.state
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
gem 'mongoid'
|
4
|
+
gem 'bson_ext'
|
5
|
+
require 'mongoid'
|
6
|
+
gem 'alter-ego'
|
7
|
+
require 'alter_ego'
|
8
|
+
require 'alter_ego/mongoid_adapter'
|
9
|
+
require 'traffic_signal'
|
10
|
+
|
11
|
+
Mongoid.configure do |config|
|
12
|
+
name = "alter-ego-mongoid-test"
|
13
|
+
host = "localhost"
|
14
|
+
config.master = Mongo::Connection.new.db(name)
|
15
|
+
config.persist_in_safe_mode = false
|
16
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class TrafficSignal
|
2
|
+
include Mongoid::Document
|
3
|
+
|
4
|
+
field :state
|
5
|
+
|
6
|
+
include AlterEgo
|
7
|
+
include AlterEgo::MongoidAdapter
|
8
|
+
|
9
|
+
state :proceed, :default=>true do
|
10
|
+
handle :color do
|
11
|
+
"green"
|
12
|
+
end
|
13
|
+
transition :to => :caution, :on => :cycle!
|
14
|
+
end
|
15
|
+
|
16
|
+
state :caution do
|
17
|
+
handle :color do
|
18
|
+
"yellow"
|
19
|
+
end
|
20
|
+
transition :to => :stop, :on => :cycle!
|
21
|
+
end
|
22
|
+
|
23
|
+
state :stop do
|
24
|
+
handle :color do
|
25
|
+
"red"
|
26
|
+
end
|
27
|
+
transition :to => :proceed, :on => :cycle!
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: alter-ego-mongoid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Micah Winkelspecht
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-30 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: mongoid
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 15424089
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
- rc
|
35
|
+
- 6
|
36
|
+
version: 2.0.0.rc.6
|
37
|
+
type: :runtime
|
38
|
+
version_requirements: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: bson_ext
|
41
|
+
prerelease: false
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 11
|
48
|
+
segments:
|
49
|
+
- 1
|
50
|
+
- 2
|
51
|
+
version: "1.2"
|
52
|
+
type: :runtime
|
53
|
+
version_requirements: *id002
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: alter-ego
|
56
|
+
prerelease: false
|
57
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
hash: 21
|
63
|
+
segments:
|
64
|
+
- 1
|
65
|
+
- 0
|
66
|
+
- 1
|
67
|
+
version: 1.0.1
|
68
|
+
type: :runtime
|
69
|
+
version_requirements: *id003
|
70
|
+
description: Adapter to allow Mongoid to persist and restore state of objects using the AlterEgo state machine, ported from the alter-ego-activerecord gem by Paul Hieromnimon
|
71
|
+
email: winkelspecht@gmail.com
|
72
|
+
executables: []
|
73
|
+
|
74
|
+
extensions: []
|
75
|
+
|
76
|
+
extra_rdoc_files:
|
77
|
+
- README.rdoc
|
78
|
+
- lib/alter_ego/mongoid_adapter.rb
|
79
|
+
files:
|
80
|
+
- Manifest
|
81
|
+
- README.rdoc
|
82
|
+
- Rakefile
|
83
|
+
- alter-ego-mongoid.gemspec
|
84
|
+
- init.rb
|
85
|
+
- lib/alter_ego/mongoid_adapter.rb
|
86
|
+
- test/adapter_test.rb
|
87
|
+
- test/helper.rb
|
88
|
+
- test/traffic_signal.rb
|
89
|
+
has_rdoc: true
|
90
|
+
homepage: http://github.com/wink/alter-ego-mongoid
|
91
|
+
licenses: []
|
92
|
+
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options:
|
95
|
+
- --line-numbers
|
96
|
+
- --inline-source
|
97
|
+
- --title
|
98
|
+
- Alter-ego-mongoid
|
99
|
+
- --main
|
100
|
+
- README.rdoc
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
hash: 3
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
version: "0"
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
hash: 11
|
118
|
+
segments:
|
119
|
+
- 1
|
120
|
+
- 2
|
121
|
+
version: "1.2"
|
122
|
+
requirements: []
|
123
|
+
|
124
|
+
rubyforge_project: alter-ego-mongoid
|
125
|
+
rubygems_version: 1.3.7
|
126
|
+
signing_key:
|
127
|
+
specification_version: 3
|
128
|
+
summary: Adapter to allow Mongoid to persist and restore state of objects using the AlterEgo state machine, ported from the alter-ego-activerecord gem by Paul Hieromnimon
|
129
|
+
test_files:
|
130
|
+
- test/adapter_test.rb
|