affairs_of_state 0.0.1
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/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +74 -0
- data/Rakefile +2 -0
- data/affairs_of_state.gemspec +24 -0
- data/lib/affairs_of_state/version.rb +3 -0
- data/lib/affairs_of_state.rb +53 -0
- data/spec/affairs_of_state_spec.rb +70 -0
- data/spec/db/.gitkeep +0 -0
- data/spec/db/test.sqlite3 +0 -0
- data/spec/spec_helper.rb +22 -0
- metadata +106 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Kevin McPhillips
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# AffairsOfState
|
2
|
+
|
3
|
+
You have an Active Record model. It nees to have multiple states, but not complex rules. This gem gives you validation, easy check and change methods, and a single configuration line.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'affairs_of_state'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install affairs_of_state
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
The gem assumes you have a string column named "status" on your model:
|
22
|
+
|
23
|
+
add_column :model_name, :status, :default => "active"
|
24
|
+
|
25
|
+
Then you just list your states in the model:
|
26
|
+
|
27
|
+
affairs_of_state :active, :inactive
|
28
|
+
|
29
|
+
If you'd like to use another column, lets say "state", pass it in as a configuration option:
|
30
|
+
|
31
|
+
affairs_of_state :active, :inactive, :column => :state
|
32
|
+
|
33
|
+
You can also turn off validation:
|
34
|
+
|
35
|
+
affairs_of_state :active, :inactive, :allow_blank => true
|
36
|
+
|
37
|
+
Or give it a long list of statuses:
|
38
|
+
|
39
|
+
affairs_of_state :ordered, :cancelled, :shipped, :lost, :in_transit
|
40
|
+
|
41
|
+
|
42
|
+
## Methods
|
43
|
+
|
44
|
+
The gem provides methods for checking and setting your status. The question mark method returns a boolean, and the bang method changes to that status. Lets assume you have "active" and "cancelled" as defined status:
|
45
|
+
|
46
|
+
widget = Widget.first
|
47
|
+
|
48
|
+
widget.cancelled! if widget.active?
|
49
|
+
|
50
|
+
You can also access all your statuses on the model like so:
|
51
|
+
|
52
|
+
Widget::STATUES # -> ["active", "cancelled"]
|
53
|
+
|
54
|
+
|
55
|
+
## "But I want callbacks and validations and other things."
|
56
|
+
|
57
|
+
Then this gem isn't for you. Consider:
|
58
|
+
|
59
|
+
https://github.com/rubyist/aasm
|
60
|
+
|
61
|
+
https://github.com/pluginaweek/state_machine
|
62
|
+
|
63
|
+
|
64
|
+
## Tests
|
65
|
+
|
66
|
+
Just run rspec:
|
67
|
+
|
68
|
+
rspec
|
69
|
+
|
70
|
+
|
71
|
+
## The usual
|
72
|
+
|
73
|
+
Author: Kevin McPhillips - github@kevinmcphillips.ca
|
74
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/affairs_of_state/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Kevin McPhillips"]
|
6
|
+
gem.email = ["github@kevinmcphillips.ca"]
|
7
|
+
gem.description = %q{Add a simple state to a gem, without all the hassle of a complex state machine.}
|
8
|
+
gem.summary = %q{You have an Active Record model. It nees to have multiple states, but not complex rules. This gem gives you validation, easy check and change methods, and a single configuration line.}
|
9
|
+
gem.homepage = "http://github.com/kimos/affairs_of_state"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "affairs_of_state"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = AffairsOfState::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency "activerecord", "~> 3.0"
|
19
|
+
|
20
|
+
gem.add_development_dependency "rspec"
|
21
|
+
gem.add_development_dependency "sqlite3"
|
22
|
+
gem.add_development_dependency "pry"
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "affairs_of_state/version"
|
2
|
+
|
3
|
+
module AffairsOfState
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def affairs_of_state(*args)
|
11
|
+
@_status_options = ({:column => :status, :allow_blank => false}).merge(args.extract_options!)
|
12
|
+
@_statuses = args.map(&:to_s)
|
13
|
+
|
14
|
+
const_set("STATUSES", @_statuses)
|
15
|
+
|
16
|
+
validates(@_status_options[:column], :presence => true) unless @_status_options[:allow_blank]
|
17
|
+
|
18
|
+
include InstanceMethods
|
19
|
+
extend SingletonMethods
|
20
|
+
true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module InstanceMethods
|
25
|
+
def method_missing(method, *args)
|
26
|
+
if self.class::STATUSES.map{|s| "#{s}?".to_sym }.include?(method)
|
27
|
+
self.class.send(:define_method, method) do
|
28
|
+
self.status == method.to_s.gsub(/\?$/, "")
|
29
|
+
end
|
30
|
+
|
31
|
+
send method
|
32
|
+
|
33
|
+
elsif self.class::STATUSES.map{|s| "#{s}!".to_sym }.include?(method)
|
34
|
+
self.class.send(:define_method, method) do
|
35
|
+
self.update_attribute(self.class.instance_variable_get('@_status_options')[:column], method.to_s.gsub(/\!$/, ""))
|
36
|
+
end
|
37
|
+
|
38
|
+
send method
|
39
|
+
else
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module SingletonMethods
|
46
|
+
def statuses_for_select
|
47
|
+
@_statuses.map{|s| [s.humanize, s]}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
ActiveRecord::Base.send :include, AffairsOfState
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AffairsOfState do
|
4
|
+
|
5
|
+
describe "with a simple configuration" do
|
6
|
+
class Pie < ActiveRecord::Base
|
7
|
+
affairs_of_state :active, :inactive, :cancelled
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should set the constant" do
|
11
|
+
Pie::STATUSES.should == ["active", "inactive", "cancelled"]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should validate the column is set" do
|
15
|
+
p = Pie.new :status => nil
|
16
|
+
p.should_not be_valid
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "boolean methods" do
|
20
|
+
it "should find the set status" do
|
21
|
+
p = Pie.new :status => "active"
|
22
|
+
p.active?.should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not find if a different status is set" do
|
26
|
+
p = Pie.new :status => "inactive"
|
27
|
+
p.cancelled?.should be_false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "update methods" do
|
32
|
+
it "should set the value" do
|
33
|
+
p = Pie.create! :status => "active"
|
34
|
+
p.inactive!.should be_true
|
35
|
+
p.status.should == "inactive"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should provide a method to pass to dropdowns" do
|
40
|
+
Pie.statuses_for_select.should == [["Active", "active"], ["Inactive", "inactive"], ["Cancelled", "cancelled"]]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "with a non-standard column name" do
|
45
|
+
class Pie2 < ActiveRecord::Base
|
46
|
+
self.table_name = "pies"
|
47
|
+
|
48
|
+
affairs_of_state :active, :inactive, :column => :super_status
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should validate the column is set" do
|
52
|
+
p = Pie2.new :status => nil, :super_status => "active"
|
53
|
+
p.should be_valid
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "without validations" do
|
58
|
+
class Pie3 < ActiveRecord::Base
|
59
|
+
self.table_name = "pies"
|
60
|
+
|
61
|
+
affairs_of_state :active, :inactive, :allow_blank => true
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should validate the column is set" do
|
65
|
+
p = Pie3.new :status => nil
|
66
|
+
p.should be_valid
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
data/spec/db/.gitkeep
ADDED
File without changes
|
Binary file
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'affairs_of_state'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
|
+
config.run_all_when_everything_filtered = true
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
## Create an AR model to test with
|
12
|
+
|
13
|
+
ActiveRecord::Base.establish_connection(
|
14
|
+
:adapter => "sqlite3",
|
15
|
+
:database => "#{File.expand_path(File.join(File.dirname(__FILE__), '..'))}/spec/db/test.sqlite3"
|
16
|
+
)
|
17
|
+
|
18
|
+
ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'pies'")
|
19
|
+
ActiveRecord::Base.connection.create_table(:pies) do |t|
|
20
|
+
t.string :status
|
21
|
+
t.string :super_status
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: affairs_of_state
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Kevin McPhillips
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-31 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: &75399850 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *75399850
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &75399640 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *75399640
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: sqlite3
|
38
|
+
requirement: &75399410 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *75399410
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: pry
|
49
|
+
requirement: &75399200 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *75399200
|
58
|
+
description: Add a simple state to a gem, without all the hassle of a complex state
|
59
|
+
machine.
|
60
|
+
email:
|
61
|
+
- github@kevinmcphillips.ca
|
62
|
+
executables: []
|
63
|
+
extensions: []
|
64
|
+
extra_rdoc_files: []
|
65
|
+
files:
|
66
|
+
- .gitignore
|
67
|
+
- .rspec
|
68
|
+
- Gemfile
|
69
|
+
- LICENSE
|
70
|
+
- README.md
|
71
|
+
- Rakefile
|
72
|
+
- affairs_of_state.gemspec
|
73
|
+
- lib/affairs_of_state.rb
|
74
|
+
- lib/affairs_of_state/version.rb
|
75
|
+
- spec/affairs_of_state_spec.rb
|
76
|
+
- spec/db/.gitkeep
|
77
|
+
- spec/db/test.sqlite3
|
78
|
+
- spec/spec_helper.rb
|
79
|
+
homepage: http://github.com/kimos/affairs_of_state
|
80
|
+
licenses: []
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
requirements: []
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 1.8.17
|
100
|
+
signing_key:
|
101
|
+
specification_version: 3
|
102
|
+
summary: You have an Active Record model. It nees to have multiple states, but not
|
103
|
+
complex rules. This gem gives you validation, easy check and change methods, and
|
104
|
+
a single configuration line.
|
105
|
+
test_files: []
|
106
|
+
has_rdoc:
|