state_store 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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.3
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
 
@@ -12,7 +12,7 @@ describe StateStore::BinaryStore do
12
12
  }.not_to raise_error
13
13
  end
14
14
 
15
- it "it should raise error when statuses not Array" do
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{
@@ -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
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "state_store"
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Arturs Meisters"]
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.3
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: &17268180 !ruby/object:Gem::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: *17268180
24
+ version_requirements: *11849260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &17266720 !ruby/object:Gem::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: *17266720
35
+ version_requirements: *11847580
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &17284400 !ruby/object:Gem::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: *17284400
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: -4107345820124143679
86
+ hash: -101757466199403532
87
87
  required_rubygems_version: !ruby/object:Gem::Requirement
88
88
  none: false
89
89
  requirements: