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 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: