status-manager 0.1.2 → 0.1.3
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/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
|