state_store 0.0.3 → 0.0.4
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 +22 -0
- data/VERSION +1 -1
- data/lib/state_store/binary_store.rb +26 -2
- data/lib/state_store/extension.rb +9 -1
- data/spec/binary_store_spec.rb +18 -1
- data/spec/extension_spec.rb +21 -0
- data/state_store.gemspec +1 -1
- metadata +8 -8
data/README.md
CHANGED
@@ -73,6 +73,28 @@ Then if you decide to add _hungry_ then you change states as shown below and tha
|
|
73
73
|
wolf.characteristic #=> 5
|
74
74
|
```
|
75
75
|
|
76
|
+
### Changing states
|
77
|
+
|
78
|
+
It is possible to alter states Array and changes storage attribute will be updated automaticly.
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
class Apple
|
82
|
+
attr_accessor :status
|
83
|
+
include StateStore
|
84
|
+
has_states :big, :red, :"with-worm", :in => :status
|
85
|
+
end
|
86
|
+
|
87
|
+
apple = Apple.new
|
88
|
+
apple.states = [:big,:red]
|
89
|
+
apple.status #=> 6
|
90
|
+
apple.states.remove(:red)
|
91
|
+
apple.status #=> 4
|
92
|
+
apple.states.add(:"with-worm")
|
93
|
+
apple.status #=> 5
|
94
|
+
```
|
95
|
+
|
96
|
+
But remember if you will modify `states` with other methods, like '<<' or 'delete' or others changes will not be stored in status.
|
97
|
+
|
76
98
|
|
77
99
|
## Copyright
|
78
100
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'observer'
|
2
|
+
|
1
3
|
module StateStore
|
2
4
|
class BinaryStore
|
3
5
|
attr_reader :statuses, :states, :total_positions
|
@@ -11,14 +13,16 @@ module StateStore
|
|
11
13
|
|
12
14
|
def humanize(value)
|
13
15
|
raise ArgumentError.new("Out of range") if self.total_positions < value
|
14
|
-
value_to_statuses(value)
|
16
|
+
humanized_array = value_to_statuses(value)
|
17
|
+
humanized_array.extend(HumanizedArrayOperations)
|
18
|
+
humanized_array
|
15
19
|
end
|
16
20
|
|
17
21
|
def value(humanized_array)
|
18
22
|
raise ArgumentError.new("Out of range") if self.states < humanized_array.size
|
19
23
|
statuses_to_values(humanized_array)
|
20
24
|
end
|
21
|
-
|
25
|
+
|
22
26
|
def has_status?(symbol,value)
|
23
27
|
human_array = humanize(value)
|
24
28
|
human_array.include?(symbol)
|
@@ -58,6 +62,26 @@ module StateStore
|
|
58
62
|
value.to_s(2).split("")
|
59
63
|
end
|
60
64
|
|
65
|
+
module HumanizedArrayOperations
|
66
|
+
include Observable
|
67
|
+
|
68
|
+
def add(*args)
|
69
|
+
changed
|
70
|
+
args.each do |value|
|
71
|
+
self << value
|
72
|
+
end
|
73
|
+
notify_observers(self)
|
74
|
+
end
|
75
|
+
|
76
|
+
def remove(*args)
|
77
|
+
changed
|
78
|
+
args.each do |value|
|
79
|
+
self.delete(value)
|
80
|
+
end
|
81
|
+
notify_observers(self)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
61
85
|
class BinaryValue
|
62
86
|
attr_reader :value,:store
|
63
87
|
|
@@ -42,10 +42,13 @@ module StateStore
|
|
42
42
|
def create_methods_for_state_store(name)
|
43
43
|
|
44
44
|
self.class_eval do
|
45
|
+
|
45
46
|
define_method name do
|
46
47
|
method_name = self.class.states_stores_options[name][:in]
|
47
48
|
value = self.send(method_name)
|
48
|
-
self.class.states_stores[name].humanize(value)
|
49
|
+
humanized_array = self.class.states_stores[name].humanize(value)
|
50
|
+
humanized_array.add_observer(self,:__state_store_humanized_array_updated__)
|
51
|
+
humanized_array
|
49
52
|
end
|
50
53
|
|
51
54
|
define_method :"#{name}=" do |humanized_array|
|
@@ -53,6 +56,11 @@ module StateStore
|
|
53
56
|
store = self.class.states_stores[name]
|
54
57
|
humanized_array = [humanized_array] unless humanized_array.is_a?(Array)
|
55
58
|
self.send(:"#{method_name}=",store.value(humanized_array))
|
59
|
+
humanized_array
|
60
|
+
end
|
61
|
+
|
62
|
+
define_method :__state_store_humanized_array_updated__ do |humanized_array|
|
63
|
+
self.send(:"#{name}=",humanized_array)
|
56
64
|
end
|
57
65
|
end
|
58
66
|
|
data/spec/binary_store_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe StateStore::BinaryStore do
|
|
12
12
|
}.not_to raise_error
|
13
13
|
end
|
14
14
|
|
15
|
-
it "
|
15
|
+
it "should raise error when statuses not Array" do
|
16
16
|
expect{
|
17
17
|
klass.new(Object.new)
|
18
18
|
}.to raise_error(ArgumentError,"Only array is accepted.")
|
@@ -48,6 +48,23 @@ describe StateStore::BinaryStore do
|
|
48
48
|
store.humanize(7).should eq([:read,:write,:execute])
|
49
49
|
end
|
50
50
|
|
51
|
+
describe "humanized array observation" do
|
52
|
+
let(:store){klass.new([:read,:write,:execute])}
|
53
|
+
it "should notify observers when element is added to array" do
|
54
|
+
h_array = store.humanize(1)
|
55
|
+
h_array.should_receive(:changed)
|
56
|
+
h_array.should_receive(:notify_observers)
|
57
|
+
h_array.add(:write)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should notify observers when element is removed from array" do
|
61
|
+
h_array = store.humanize(1)
|
62
|
+
h_array.should_receive(:changed)
|
63
|
+
h_array.should_receive(:notify_observers)
|
64
|
+
h_array.remove(:execute)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
51
68
|
it "should raise error when given value is greated then store total positions" do
|
52
69
|
store = klass.new([:one])
|
53
70
|
expect{
|
data/spec/extension_spec.rb
CHANGED
@@ -92,6 +92,27 @@ describe StateStore::Extension do
|
|
92
92
|
object.states= [:read,:write]
|
93
93
|
object.status_name.should eq(6)
|
94
94
|
end
|
95
|
+
|
96
|
+
context "observation" do
|
97
|
+
before(:each) do
|
98
|
+
klass.class_eval do
|
99
|
+
def status_name=(value)
|
100
|
+
@status_name = value
|
101
|
+
end
|
102
|
+
end
|
103
|
+
klass.has_states :read,:write,:execute, :in => :status_name
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should change storage attribute when state is added to states array" do
|
107
|
+
object.states.add(:write)
|
108
|
+
object.status_name.should eq(7)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should change storage attribute when state is removed from states array" do
|
112
|
+
object.states.remove(:read)
|
113
|
+
object.status_name.should eq(1)
|
114
|
+
end
|
115
|
+
end
|
95
116
|
end
|
96
117
|
|
97
118
|
end
|
data/state_store.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: state_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-03-29 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
16
|
-
requirement: &
|
16
|
+
requirement: &11849260 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.12'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *11849260
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &11847580 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *11847580
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: jeweler
|
38
|
-
requirement: &
|
38
|
+
requirement: &11865240 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 1.8.3
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *11865240
|
47
47
|
description: Create numeric value to Array of states.
|
48
48
|
email: arturs.meisters@gmail.com
|
49
49
|
executables: []
|
@@ -83,7 +83,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
83
83
|
version: '0'
|
84
84
|
segments:
|
85
85
|
- 0
|
86
|
-
hash: -
|
86
|
+
hash: -101757466199403532
|
87
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
88
|
none: false
|
89
89
|
requirements:
|