status-manager 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +21 -12
- data/lib/status-manager/status-group-manager.rb +22 -0
- data/lib/status-manager/version.rb +1 -1
- data/lib/status-manager.rb +36 -30
- data/status-manager.gemspec +2 -2
- data/status_manager_test.sqlite3 +0 -0
- data/test/config/schema.rb +1 -1
- data/test/fixtures/products.yml +6 -6
- data/test/models/product.rb +4 -3
- data/test/status-manager_test.rb +53 -17
- metadata +4 -4
- data/status-manager-0.1.1.gem +0 -0
data/README.md
CHANGED
@@ -16,23 +16,32 @@ gem 'status-manager'
|
|
16
16
|
|
17
17
|
```ruby
|
18
18
|
class Product < ActiveRecord::Base
|
19
|
-
attr_accessible :title, :
|
19
|
+
attr_accessible :title, :my_status
|
20
20
|
|
21
|
-
#
|
22
|
-
|
23
|
-
status_group :
|
21
|
+
# attr_as_status :status_attribute in model, {:status_value => 'status_value that is saved in database'}
|
22
|
+
attr_as_status :my_status, :onsale => 'onsale', :reject => 'reject', :pending => 'pending', :soldout => 'soldout'
|
23
|
+
status_group :my_status, :close => [:reject, :pending], :open => [:onsale, :soldout]
|
24
24
|
|
25
25
|
end
|
26
26
|
```
|
27
27
|
|
28
28
|
```ruby
|
29
|
-
|
30
|
-
@
|
31
|
-
@
|
29
|
+
## select
|
30
|
+
@onsale_product = Product.my_status_onsale.first
|
31
|
+
@closed_product = Product.my_status_close.first
|
32
|
+
|
33
|
+
@onsale_product.my_status_onsale? #=> true
|
34
|
+
#or
|
35
|
+
@closed_product.my_status?(:close) #=> true
|
36
|
+
|
37
|
+
## update just attribute value
|
38
|
+
@closed_product.my_status_to(:onsale)
|
39
|
+
#or
|
40
|
+
@closed_product.my_Status_to_onsale
|
41
|
+
|
42
|
+
## update with database
|
43
|
+
@closed_product.update_my_status(:onsale)
|
44
|
+
#or
|
45
|
+
@closed_product.update_my_status_onsale
|
32
46
|
|
33
|
-
assert @onsale_products.first.status_onsale?
|
34
|
-
assert @closed_products.first.status_close?
|
35
47
|
|
36
|
-
# update
|
37
|
-
@closed_products.first.status_to(:onsale) ## => update just attribute value
|
38
|
-
@closed_products.first.update_status_onsale ## => update with database
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module StatusManager
|
2
|
+
module StatusGroupManager
|
3
|
+
def status_group (status_title, group_status_list={})
|
4
|
+
raise "undefined #{status_title}" unless self.manager_status_list.key? status_title.to_sym
|
5
|
+
|
6
|
+
group_status_list.each do |group_status_title, group_statuses|
|
7
|
+
group_status_values = []
|
8
|
+
group_statuses.each do |status|
|
9
|
+
group_status_values << self.manager_status_list[status_title][status]
|
10
|
+
end
|
11
|
+
|
12
|
+
# set scope
|
13
|
+
scope "#{status_title}_#{group_status_title}", where("#{self.table_name}.#{status_title} in (?)", group_status_values)
|
14
|
+
|
15
|
+
# status check method
|
16
|
+
define_method "#{status_title}_#{group_status_title}?" do
|
17
|
+
group_status_values.include? self.send(status_title.to_sym)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/status-manager.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'status-manager/status-group-manager'
|
2
|
+
|
1
3
|
module StatusManager
|
2
4
|
|
3
5
|
def self.included(base)
|
@@ -5,51 +7,55 @@ module StatusManager
|
|
5
7
|
end
|
6
8
|
|
7
9
|
module ClassMethods
|
8
|
-
def
|
9
|
-
|
10
|
-
raise "#{status_title} variable is already exist" if @@status_manager_status_list.key? status_title.to_sym
|
11
|
-
@@status_manager_status_list[status_title.to_sym] = {}
|
12
|
-
|
13
|
-
status.each do |key, value|
|
14
|
-
#set status
|
15
|
-
@@status_manager_status_list[status_title.to_sym][key.to_sym] = value
|
10
|
+
def attr_as_status (status_title, statuses={})
|
11
|
+
manager_status_list[status_title] = statuses
|
16
12
|
|
17
|
-
|
13
|
+
statuses.each do |key, value|
|
14
|
+
#active_record scope setting
|
18
15
|
scope "#{status_title}_#{key}", where("#{self.table_name}.#{status_title}" => value)
|
19
16
|
|
20
|
-
#
|
21
|
-
define_method "#{status_title}_#{key}?" do
|
22
|
-
|
17
|
+
#status check method
|
18
|
+
define_method "#{status_title}_#{key}?" do
|
19
|
+
self.send("#{status_title}") == value
|
23
20
|
end
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
#update status
|
23
|
+
define_method "update_#{status_title}_to_#{key}" do
|
24
|
+
self.update_attributes("#{status_title}" => "#{value}")
|
25
|
+
end
|
28
26
|
|
29
|
-
define_method "
|
30
|
-
self.
|
27
|
+
define_method "#{status_title}_to_#{key}" do
|
28
|
+
self.send("#{status_title}=", value)
|
31
29
|
end
|
32
30
|
end
|
33
31
|
|
34
|
-
|
35
|
-
|
32
|
+
#status check method
|
33
|
+
define_method "#{status_title}?" do |status|
|
34
|
+
self.send("#{status_title}_#{status}?")
|
36
35
|
end
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
#status setter (do not override attr_accessible)
|
38
|
+
define_method "#{status_title}_to" do |next_status|
|
39
|
+
status_value = self.class.manager_status_list[status_title][next_status]
|
40
|
+
self.send("#{status_title}=", status_value)
|
41
|
+
end
|
41
42
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
# update status
|
44
|
+
define_method "update_#{status_title}" do |next_status|
|
45
|
+
self.update_attributes(status_title.to_sym => self.class.manager_status_list[status_title][next_status])
|
46
|
+
end
|
46
47
|
|
47
|
-
|
48
|
+
extend StatusManager::StatusGroupManager
|
49
|
+
end
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
def manager_status_list
|
52
|
+
status_list = {}
|
53
|
+
begin
|
54
|
+
status_list = self.class_variable_get('@@manager_status_list')
|
55
|
+
rescue NameError
|
56
|
+
self.class_variable_set('@@manager_status_list', status_list)
|
52
57
|
end
|
58
|
+
status_list
|
53
59
|
end
|
54
60
|
end
|
55
61
|
end
|
data/status-manager.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'status-manager'
|
3
|
-
s.version = '0.1.
|
4
|
-
s.date = '2013-
|
3
|
+
s.version = '0.1.3'
|
4
|
+
s.date = '2013-08-16'
|
5
5
|
s.summary = "ActiveRecord Model Status Manager"
|
6
6
|
s.description = "ActiveRecord Model Status Manager"
|
7
7
|
s.authors = ["Keepcosmos"]
|
data/status_manager_test.sqlite3
CHANGED
Binary file
|
data/test/config/schema.rb
CHANGED
data/test/fixtures/products.yml
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
first_product:
|
2
2
|
id: 1
|
3
3
|
title: beer
|
4
|
-
|
4
|
+
sale_status: 'onsale'
|
5
5
|
second_product:
|
6
6
|
id: 2
|
7
7
|
title: 'ipad'
|
8
|
-
|
8
|
+
sale_status: 'onsale'
|
9
9
|
third_product:
|
10
10
|
id: 3
|
11
11
|
title: 'iphone'
|
12
|
-
|
12
|
+
sale_status: 'pending'
|
13
13
|
fourth_product:
|
14
14
|
id: 4
|
15
15
|
title: 'gem'
|
16
|
-
|
16
|
+
sale_status: 'reject'
|
17
17
|
fifth_product:
|
18
18
|
id: 5
|
19
19
|
title: 'ruby'
|
20
|
-
|
20
|
+
sale_status: 'soldout'
|
21
21
|
sixth_product:
|
22
22
|
id: 7
|
23
23
|
title: 'book'
|
24
|
-
|
24
|
+
sale_status: 'soldout'
|
data/test/models/product.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
class Product < ActiveRecord::Base
|
2
|
-
attr_accessible :title, :
|
2
|
+
attr_accessible :title, :sale_status
|
3
3
|
|
4
4
|
# acts_as_status :status_attribute in model, {:status_value => 'status_value that is saved in database'}
|
5
|
-
|
6
|
-
status_group :
|
5
|
+
attr_as_status :sale_status, :onsale => 'onsale', :reject => 'reject', :pending => 'pending', :soldout => 'soldout'
|
6
|
+
status_group :sale_status, :close => [:reject, :pending], :open => [:onsale, :soldout]
|
7
|
+
|
7
8
|
|
8
9
|
end
|
data/test/status-manager_test.rb
CHANGED
@@ -4,31 +4,67 @@ require 'models/product'
|
|
4
4
|
class StatusManagerTest < Test::Unit::TestCase
|
5
5
|
|
6
6
|
def test_current_status
|
7
|
-
|
8
|
-
puts product.status
|
9
|
-
assert_equal true, product.status_onsale?
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_status_scope
|
13
|
-
products = Product.status_reject
|
7
|
+
products = Product.sale_status_onsale
|
14
8
|
products.each do |product|
|
15
|
-
assert product.
|
9
|
+
assert product.sale_status_onsale?
|
10
|
+
assert product.sale_status? :onsale
|
11
|
+
end
|
12
|
+
|
13
|
+
rejected_products = Product.sale_status_reject
|
14
|
+
rejected_products.each do |product|
|
15
|
+
assert product.sale_status_reject?
|
16
|
+
assert product.sale_status? :reject
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
20
|
def test_status_update
|
20
|
-
product = Product.
|
21
|
-
product.
|
22
|
-
|
23
|
-
assert product.
|
24
|
-
assert product.
|
21
|
+
product = Product.sale_status_onsale.first
|
22
|
+
product.sale_status_to :reject
|
23
|
+
product.sale_status_to_reject
|
24
|
+
assert product.sale_status_reject?
|
25
|
+
assert product.sale_status? :reject
|
26
|
+
|
27
|
+
product.update_sale_status :soldout
|
28
|
+
assert Product.find(product.id).sale_status_soldout?
|
29
|
+
|
30
|
+
product.update_sale_status_to_onsale
|
31
|
+
assert Product.find(product.id).sale_status_onsale?
|
25
32
|
end
|
26
33
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
assert product.
|
34
|
+
def test_group_status
|
35
|
+
closed_products = Product.sale_status_close
|
36
|
+
closed_products.each do |product|
|
37
|
+
assert product.sale_status_close?
|
38
|
+
assert product.sale_status? :close
|
39
|
+
end
|
40
|
+
|
41
|
+
opened_products = Product.sale_status_open
|
42
|
+
opened_products.each do |product|
|
43
|
+
assert product.sale_status_open?
|
44
|
+
assert product.sale_status? :open
|
31
45
|
end
|
32
46
|
end
|
33
47
|
|
48
|
+
# def test_current_status
|
49
|
+
# product = Product.first
|
50
|
+
# assert_equal true, product.sale_status_onsale?
|
51
|
+
# end
|
52
|
+
|
53
|
+
# def test_status_scope
|
54
|
+
# products = Product.sale_status_reject
|
55
|
+
# products.each do |product|
|
56
|
+
# assert product.sale_status_reject?, "#{product.id} is not rejected product"
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
|
60
|
+
# def test_status_update
|
61
|
+
# product = Product.sale_status_reject.first
|
62
|
+
# product.sale_status_to(:soldout)
|
63
|
+
# assert product.sale_status_soldout?
|
64
|
+
# assert product.update_status_to_onsale
|
65
|
+
# assert product.sale_status_onsale?
|
66
|
+
# product.update_status(:soldout)
|
67
|
+
# assert product.sale_status_soldout?
|
68
|
+
# end
|
69
|
+
|
34
70
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: status-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-16 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ActiveRecord Model Status Manager
|
15
15
|
email: keepcosmos@gmail.com
|
@@ -24,9 +24,9 @@ files:
|
|
24
24
|
- !binary |-
|
25
25
|
bGliL3N0YXR1cy1tYW5hZ2VyLnJi
|
26
26
|
- !binary |-
|
27
|
-
|
27
|
+
bGliL3N0YXR1cy1tYW5hZ2VyL3N0YXR1cy1ncm91cC1tYW5hZ2VyLnJi
|
28
28
|
- !binary |-
|
29
|
-
|
29
|
+
bGliL3N0YXR1cy1tYW5hZ2VyL3ZlcnNpb24ucmI=
|
30
30
|
- !binary |-
|
31
31
|
c3RhdHVzLW1hbmFnZXIuZ2Vtc3BlYw==
|
32
32
|
- !binary |-
|
data/status-manager-0.1.1.gem
DELETED
Binary file
|