status-manager 0.1.4 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +15 -11
- data/lib/status-manager.rb +40 -31
- data/lib/status-manager/status_group_manager.rb +11 -12
- data/lib/status-manager/status_store.rb +63 -0
- data/lib/status-manager/version.rb +1 -1
- data/status-manager.gemspec +3 -3
- data/status_manager_test.sqlite3 +0 -0
- data/test/status-manager_test.rb +6 -3
- metadata +32 -54
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 63d931d22475e23678c82c510f8f704e8d1dbd06
|
4
|
+
data.tar.gz: 0920aa2e322e0f6a28b927cf347bf97fb33e0fd9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 94db437599edf8e5cb75c92f54569256229840e53f4ceccdb0bbb37b8baf137d397be7c673f4949ff67ff63162e4c7780419b2dc83f82c7b6ff2b7c3f2e18282
|
7
|
+
data.tar.gz: ae62746a25cffa1a24c52f6dfc3833a85c4661c2a75cfc10eaaf8a21eddc63652c932956e92b572a9b3d8f0febb6d16e6626c0a5055251b5aba629d27b1cb584
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@ status-manager
|
|
2
2
|
==============
|
3
3
|
|
4
4
|
## Description
|
5
|
-
|
5
|
+
ActiveRecord Model Status Manager, It provides easy ways managing model that have many statuses.
|
6
6
|
|
7
7
|
## Usage
|
8
8
|
|
@@ -20,36 +20,37 @@ class Product < ActiveRecord::Base
|
|
20
20
|
attr_accessible :title, :sale_status
|
21
21
|
|
22
22
|
# attr_as_status :status_attribute in model, {:status_value => 'status_value that is saved in database'}
|
23
|
-
attr_as_status :sale_status, :onsale => 'onsale', :reject => 'reject', :pending => 'pending', :soldout => 'soldout'
|
24
|
-
status_group :sale_status, :close => [:reject, :pending], :open => [:onsale, :soldout]
|
23
|
+
attr_as_status :sale_status, {:onsale => 'onsale', :reject => 'reject', :pending => 'pending', :soldout => 'soldout'}
|
24
|
+
status_group :sale_status, {:close => [:reject, :pending], :open => [:onsale, :soldout]}
|
25
25
|
|
26
26
|
end
|
27
27
|
```
|
28
28
|
|
29
|
-
|
29
|
+
#### Queries
|
30
30
|
```ruby
|
31
|
-
##
|
31
|
+
## status_list
|
32
32
|
Product.sale_statuses #=> {:onsale => 'onsale', :reject => 'reject', :pending => 'pending', :soldout => 'soldout'}
|
33
33
|
|
34
|
-
|
34
|
+
## use scope
|
35
|
+
@onsale_product = Product.sale_status_onsale.first # or Product.sale_status(:onsale).first
|
35
36
|
@closed_product = Product.sale_status_close.first
|
36
37
|
|
37
38
|
@onsale_product.sale_status_onsale? #=> true
|
38
39
|
#or
|
39
40
|
@closed_product.sale_status?(:close) #=> true
|
40
41
|
|
41
|
-
##
|
42
|
+
## change attribute value
|
42
43
|
@closed_product.sale_status_to(:onsale)
|
43
44
|
#or
|
44
45
|
@closed_product.sale_Status_to_onsale
|
45
46
|
|
46
|
-
## update with database
|
47
|
+
## update value with database
|
47
48
|
@closed_product.update_sale_status_to(:onsale)
|
48
49
|
#or
|
49
50
|
@closed_product.update_sale_status_to_onsale
|
50
51
|
```
|
51
52
|
|
52
|
-
|
53
|
+
#### Callback
|
53
54
|
``` ruby
|
54
55
|
class Product < ActiveRecord::Base
|
55
56
|
attr_accessible :title, :sale_status
|
@@ -58,6 +59,7 @@ class Product < ActiveRecord::Base
|
|
58
59
|
attr_as_status :sale_status, :onsale => 'onsale', :reject => 'reject', :pending => 'pending', :soldout => 'soldout'
|
59
60
|
status_group :sale_status, :close => [:reject, :pending], :open => [:onsale, :soldout]
|
60
61
|
|
62
|
+
#callback update status from specific status
|
61
63
|
before_status_update :sale_status, :onsale => :close do |product|
|
62
64
|
puts "#{product.title} is closed"
|
63
65
|
end
|
@@ -66,11 +68,13 @@ class Product < ActiveRecord::Base
|
|
66
68
|
puts "closed #{product.title} is opened"
|
67
69
|
# do something after update
|
68
70
|
end
|
69
|
-
|
71
|
+
|
72
|
+
#callback update status
|
70
73
|
after_status_update :sale_status, :reject do |prdocut|
|
71
74
|
puts "#{product.title} is rejected"
|
72
75
|
# do something after update
|
73
76
|
end
|
74
77
|
end
|
75
78
|
|
76
|
-
```
|
79
|
+
```
|
80
|
+
|
data/lib/status-manager.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'status-manager/status_group_manager'
|
2
2
|
require 'status-manager/status_update_callback'
|
3
3
|
require 'status-manager/status_validation'
|
4
|
+
require 'status-manager/status_store'
|
4
5
|
require 'active_support/inflector'
|
5
6
|
|
6
7
|
module StatusManager
|
@@ -13,69 +14,77 @@ module StatusManager
|
|
13
14
|
end
|
14
15
|
|
15
16
|
module ClassMethods
|
16
|
-
def attr_as_status (
|
17
|
-
|
17
|
+
def attr_as_status (status_attribute, status_sets={})
|
18
|
+
status_store = StatusStore.new(status_attribute, status_sets)
|
19
|
+
status_store_list.add(status_store)
|
20
|
+
|
21
|
+
scope "#{status_store.attribute_name}", lambda{ | status |
|
22
|
+
if status_store.status?(status)
|
23
|
+
where("#{self.table_name}.#{status_store.attribute_name.to_s}" => status_store_list.get(status_store.attribute_name).value(status))
|
24
|
+
elsif status_store.group_status?(status)
|
25
|
+
where("#{self.table_name}.#{status_store.attribute_name} in (?)", status_store.get_group_status_sets(status).values)
|
26
|
+
end
|
27
|
+
}
|
18
28
|
|
19
|
-
|
29
|
+
status_store.status_sets.each do |key, value|
|
20
30
|
#active_record scope setting
|
21
|
-
scope "#{
|
31
|
+
scope "#{status_store.attribute_name}_#{key}", where("#{self.table_name}.#{status_store.attribute_name}" => value)
|
22
32
|
|
23
33
|
#status check method
|
24
|
-
define_method "#{
|
25
|
-
self.send("#{
|
34
|
+
define_method "#{status_store.attribute_name}_#{key}?" do
|
35
|
+
self.send("#{status_store.attribute_name}") == value
|
26
36
|
end
|
27
37
|
|
28
|
-
define_method "#{
|
29
|
-
self.send("#{
|
38
|
+
define_method "#{status_store.attribute_name}_was_#{key}?" do
|
39
|
+
self.send("#{status_store.attribute_name}_was") == value
|
30
40
|
end
|
31
41
|
|
32
42
|
#update status
|
33
|
-
define_method "update_#{
|
34
|
-
self.update_attributes("#{
|
43
|
+
define_method "update_#{status_store.attribute_name}_to_#{key}" do
|
44
|
+
self.update_attributes("#{status_store.attribute_name}" => "#{value}")
|
35
45
|
end
|
36
46
|
|
37
|
-
define_method "#{
|
38
|
-
self.send("#{
|
47
|
+
define_method "#{status_store.attribute_name}_to_#{key}" do
|
48
|
+
self.send("#{status_store.attribute_name}=", value)
|
39
49
|
end
|
40
50
|
end
|
41
51
|
|
42
52
|
#status check method
|
43
|
-
define_method "#{
|
44
|
-
self.send("#{
|
53
|
+
define_method "#{status_store.attribute_name}?" do |status|
|
54
|
+
self.send("#{status_store.attribute_name}_#{status}?")
|
45
55
|
end
|
46
56
|
|
47
|
-
define_method "#{
|
48
|
-
self.send("#{
|
57
|
+
define_method "#{status_store.attribute_name}_was?" do |status|
|
58
|
+
self.send("#{status_store.attribute_name}_was_#{status}?")
|
49
59
|
end
|
50
60
|
|
51
61
|
#status setter (do not override attr_accessible)
|
52
|
-
define_method "#{
|
53
|
-
status_value = self.class.
|
54
|
-
self.send("#{
|
62
|
+
define_method "#{status_store.attribute_name}_to" do |status|
|
63
|
+
status_value = self.class.status_store_list.get(status_store.attribute_name).value(status)
|
64
|
+
self.send("#{status_store.attribute_name}=", status_value)
|
55
65
|
end
|
56
66
|
|
57
67
|
# update status
|
58
|
-
define_method "update_#{
|
59
|
-
self.update_attributes(
|
68
|
+
define_method "update_#{status_store.attribute_name}_to" do |status|
|
69
|
+
self.update_attributes(status_attribute.to_sym => self.class.status_store_list.get(status_store.attribute_name).value(status))
|
60
70
|
end
|
61
71
|
|
62
72
|
#get status list
|
63
|
-
define_singleton_method "#{
|
64
|
-
self.
|
73
|
+
define_singleton_method "#{status_store.attribute_name.to_s.pluralize}" do
|
74
|
+
self.class.status_store_list.get(status_attribute).status_sets
|
65
75
|
end
|
66
76
|
end
|
67
77
|
|
68
|
-
def
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
self.class_variable_set('@@manager_status_list', status_list)
|
78
|
+
def status_store_list
|
79
|
+
if self.class_variable_defined?(:@@status_store_list)
|
80
|
+
self.class_variable_get(:@@status_store_list)
|
81
|
+
else
|
82
|
+
self.class_variable_set(:@@status_store_list, StatusStoreList.new)
|
74
83
|
end
|
75
|
-
status_list
|
76
84
|
end
|
77
85
|
|
86
|
+
|
78
87
|
end
|
79
88
|
end
|
80
89
|
|
81
|
-
ActiveRecord::Base.send(:include, StatusManager) if defined? ActiveRecord
|
90
|
+
ActiveRecord::Base.send(:include, StatusManager) if defined? ActiveRecord
|
@@ -1,24 +1,23 @@
|
|
1
1
|
module StatusManager
|
2
2
|
module StatusGroupManager
|
3
|
-
def status_group (
|
4
|
-
|
3
|
+
def status_group (status_attribute_name, group_status_set={})
|
4
|
+
status_store = self.status_store_list.get(status_attribute_name.to_sym)
|
5
|
+
raise "undefined #{status_attribute_name}" unless status_store
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
group_status_values << self.manager_status_list[status_title][status]
|
10
|
-
end
|
7
|
+
group_status_set.each do |group_status_name, group_statuses|
|
8
|
+
raise "#{status_attribute_name}-#{group_status_name} is not a group, group must have statuses" if group_statuses.size < 1
|
9
|
+
status_store.add_group_status(group_status_name, group_statuses)
|
11
10
|
|
12
11
|
# set scope
|
13
|
-
scope "#{
|
12
|
+
scope "#{status_store.attribute_name}_#{group_status_name}", where("#{self.table_name}.#{status_store.attribute_name} in (?)", status_store.get_group_status_sets(group_status_name).values)
|
14
13
|
|
15
14
|
# status check method
|
16
|
-
define_method "#{
|
17
|
-
|
15
|
+
define_method "#{status_attribute_name}_#{group_status_name}?" do
|
16
|
+
status_store.get_group_status_sets(group_status_name).values.include? self.send(status_attribute_name)
|
18
17
|
end
|
19
18
|
|
20
|
-
define_method "#{
|
21
|
-
|
19
|
+
define_method "#{status_attribute_name}_was_#{group_status_name}?" do
|
20
|
+
status_store.get_group_status_sets(group_status_name).values.include? self.send("#{status_attribute_name}_was")
|
22
21
|
end
|
23
22
|
end
|
24
23
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module StatusManager
|
2
|
+
class StatusStoreList
|
3
|
+
attr_accessor :status_stores
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@status_stores = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def add(status_store)
|
10
|
+
@status_stores << status_store
|
11
|
+
end
|
12
|
+
|
13
|
+
def get(attribute)
|
14
|
+
@status_stores.select {|status_store| status_store.attribute_name == attribute}.first
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class StatusStore
|
19
|
+
attr_accessor :attribute_name, :status_sets, :group_statuses
|
20
|
+
|
21
|
+
def initialize(attribute_name, status_sets=nil )
|
22
|
+
@attribute_name = attribute_name
|
23
|
+
@status_sets = status_sets || {}
|
24
|
+
@group_statuses = {}
|
25
|
+
end
|
26
|
+
|
27
|
+
def status?(status)
|
28
|
+
@status_sets.key?(status)
|
29
|
+
end
|
30
|
+
|
31
|
+
def group_status?(group_status)
|
32
|
+
@group_statuses.key?(group_status)
|
33
|
+
end
|
34
|
+
|
35
|
+
def statuses
|
36
|
+
@status_sets.keys
|
37
|
+
end
|
38
|
+
|
39
|
+
def values
|
40
|
+
@status_sets.values
|
41
|
+
end
|
42
|
+
|
43
|
+
def value(status)
|
44
|
+
@status_sets[status]
|
45
|
+
end
|
46
|
+
|
47
|
+
def status(value)
|
48
|
+
@status_sets.select{ |status, _value| _value == value}.first[0]
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_group_status(group_status_name, statuses)
|
52
|
+
@group_statuses.merge!({group_status_name => statuses})
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_group_status_sets(group_status_name)
|
56
|
+
statuses = {}
|
57
|
+
@group_statuses[group_status_name].each do |status|
|
58
|
+
statuses[status] = self.value(status)
|
59
|
+
end
|
60
|
+
statuses
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/status-manager.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'status-manager'
|
3
|
-
s.version = '0.
|
4
|
-
s.date = '2013-
|
3
|
+
s.version = '0.7.0'
|
4
|
+
s.date = '2013-12-20'
|
5
5
|
s.summary = "ActiveRecord Model Status Manager"
|
6
|
-
s.description = "ActiveRecord Model Status Manager"
|
6
|
+
s.description = "ActiveRecord Model Status Manager, It provides easy ways managing model that have many statuses."
|
7
7
|
s.authors = ["Keepcosmos"]
|
8
8
|
s.email = 'keepcosmos@gmail.com'
|
9
9
|
s.licenses = 'MIT'
|
data/status_manager_test.sqlite3
CHANGED
Binary file
|
data/test/status-manager_test.rb
CHANGED
@@ -3,9 +3,11 @@ require 'models/product'
|
|
3
3
|
|
4
4
|
class StatusManagerTest < Test::Unit::TestCase
|
5
5
|
|
6
|
-
def
|
7
|
-
product = Product.
|
6
|
+
def test_status_change
|
7
|
+
product = Product.sale_status(:pending).first
|
8
|
+
assert product.sale_status?(:pending)
|
8
9
|
product.update_sale_status_to_onsale
|
10
|
+
assert product.sale_status?(:onsale)
|
9
11
|
end
|
10
12
|
|
11
13
|
def test_current_status
|
@@ -38,6 +40,8 @@ class StatusManagerTest < Test::Unit::TestCase
|
|
38
40
|
|
39
41
|
def test_group_status
|
40
42
|
closed_products = Product.sale_status_close
|
43
|
+
closed_products = Product.sale_status(:close)
|
44
|
+
assert closed_products == _closed_products
|
41
45
|
closed_products.each do |product|
|
42
46
|
assert product.sale_status_close?
|
43
47
|
assert product.sale_status? :close
|
@@ -50,5 +54,4 @@ class StatusManagerTest < Test::Unit::TestCase
|
|
50
54
|
end
|
51
55
|
end
|
52
56
|
|
53
|
-
|
54
57
|
end
|
metadata
CHANGED
@@ -1,89 +1,67 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: status-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Keepcosmos
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-12-20 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
|
-
description: ActiveRecord Model Status Manager
|
13
|
+
description: ActiveRecord Model Status Manager, It provides easy ways managing model
|
14
|
+
that have many statuses.
|
15
15
|
email: keepcosmos@gmail.com
|
16
16
|
executables: []
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
-
-
|
21
|
-
|
22
|
-
-
|
23
|
-
|
24
|
-
-
|
25
|
-
|
26
|
-
-
|
27
|
-
|
28
|
-
-
|
29
|
-
|
30
|
-
-
|
31
|
-
|
32
|
-
-
|
33
|
-
|
34
|
-
-
|
35
|
-
|
36
|
-
-
|
37
|
-
c3RhdHVzLW1hbmFnZXIuZ2Vtc3BlYw==
|
38
|
-
- !binary |-
|
39
|
-
c3RhdHVzX21hbmFnZXJfdGVzdC5zcWxpdGUz
|
40
|
-
- !binary |-
|
41
|
-
dGVzdC9jb25maWcvZGF0YWJhc2UueW1s
|
42
|
-
- !binary |-
|
43
|
-
dGVzdC9jb25maWcvc2NoZW1hLnJi
|
44
|
-
- !binary |-
|
45
|
-
dGVzdC9maXh0dXJlcy9wcm9kdWN0cy55bWw=
|
46
|
-
- !binary |-
|
47
|
-
dGVzdC9tb2RlbHMvcHJvZHVjdC5yYg==
|
48
|
-
- !binary |-
|
49
|
-
dGVzdC9zdGF0dXMtbWFuYWdlcl90ZXN0LnJi
|
50
|
-
- !binary |-
|
51
|
-
dGVzdC90ZXN0X2luaXRpYWxpemVyLnJi
|
20
|
+
- README.md
|
21
|
+
- Rakefile
|
22
|
+
- lib/status-manager.rb
|
23
|
+
- lib/status-manager/status_group_manager.rb
|
24
|
+
- lib/status-manager/status_store.rb
|
25
|
+
- lib/status-manager/status_update_callback.rb
|
26
|
+
- lib/status-manager/status_validation.rb
|
27
|
+
- lib/status-manager/version.rb
|
28
|
+
- status-manager-0.1.3.gem
|
29
|
+
- status-manager.gemspec
|
30
|
+
- status_manager_test.sqlite3
|
31
|
+
- test/config/database.yml
|
32
|
+
- test/config/schema.rb
|
33
|
+
- test/fixtures/products.yml
|
34
|
+
- test/models/product.rb
|
35
|
+
- test/status-manager_test.rb
|
36
|
+
- test/test_initializer.rb
|
52
37
|
homepage: https://github.com/keepcosmos/status-manager
|
53
38
|
licenses:
|
54
39
|
- MIT
|
40
|
+
metadata: {}
|
55
41
|
post_install_message:
|
56
42
|
rdoc_options: []
|
57
43
|
require_paths:
|
58
44
|
- lib
|
59
45
|
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
46
|
requirements:
|
62
|
-
- -
|
47
|
+
- - '>='
|
63
48
|
- !ruby/object:Gem::Version
|
64
49
|
version: '0'
|
65
50
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
51
|
requirements:
|
68
|
-
- -
|
52
|
+
- - '>='
|
69
53
|
- !ruby/object:Gem::Version
|
70
54
|
version: '0'
|
71
55
|
requirements: []
|
72
56
|
rubyforge_project:
|
73
|
-
rubygems_version: 1.
|
57
|
+
rubygems_version: 2.1.2
|
74
58
|
signing_key:
|
75
|
-
specification_version:
|
59
|
+
specification_version: 4
|
76
60
|
summary: ActiveRecord Model Status Manager
|
77
61
|
test_files:
|
78
|
-
-
|
79
|
-
|
80
|
-
-
|
81
|
-
|
82
|
-
-
|
83
|
-
|
84
|
-
- !binary |-
|
85
|
-
dGVzdC9tb2RlbHMvcHJvZHVjdC5yYg==
|
86
|
-
- !binary |-
|
87
|
-
dGVzdC9zdGF0dXMtbWFuYWdlcl90ZXN0LnJi
|
88
|
-
- !binary |-
|
89
|
-
dGVzdC90ZXN0X2luaXRpYWxpemVyLnJi
|
62
|
+
- test/config/database.yml
|
63
|
+
- test/config/schema.rb
|
64
|
+
- test/fixtures/products.yml
|
65
|
+
- test/models/product.rb
|
66
|
+
- test/status-manager_test.rb
|
67
|
+
- test/test_initializer.rb
|