state_store 0.0.1 → 0.0.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -14,6 +14,11 @@ module StateStore
14
14
  value_to_statuses(value)
15
15
  end
16
16
 
17
+ def value(humanized_array)
18
+ raise ArgumentError.new("Out of range") if self.states < humanized_array.size
19
+ statuses_to_values(humanized_array)
20
+ end
21
+
17
22
  def has_status?(symbol,value)
18
23
  human_array = humanize(value)
19
24
  human_array.include?(symbol)
@@ -23,6 +28,10 @@ module StateStore
23
28
  statuses[index] if state.to_s == "1"
24
29
  end
25
30
 
31
+ def index_by_state(state)
32
+ statuses[state]
33
+ end
34
+
26
35
  private
27
36
 
28
37
  def value_to_statuses(value)
@@ -35,6 +44,12 @@ module StateStore
35
44
  result
36
45
  end
37
46
 
47
+ def statuses_to_values(statuses_array)
48
+ self.statuses.map do |status|
49
+ statuses_array.include?(status) ? "1" : "0"
50
+ end.join("").to_i(2)
51
+ end
52
+
38
53
  def normalized_array(array)
39
54
  (Array.new(self.states - array.size, "0")+ array)
40
55
  end
@@ -2,47 +2,66 @@ module StateStore
2
2
  module Extension
3
3
 
4
4
  module ClassMethods
5
- def has_statuses *statuses
6
- @state_store_options = statuses && statuses.last.is_a?(Hash) && statuses.pop || {}
7
- raise ArgumentError.new("No statuses given") if statuses.empty?
8
- raise ArgumentError.new(":in is required") unless @state_store_options[:in]
9
- @store = StateStore::BinaryStore.new(statuses)
10
- override_method_store_in_method
5
+
6
+ def has_states *states
7
+ state_store_options = states && states.last.is_a?(Hash) && states.pop || {}
8
+ raise ArgumentError.new("No states given") if states.empty?
9
+ raise ArgumentError.new(":in is required") unless state_store_options[:in]
10
+
11
+ state_store_options[:as] ||= :states
12
+ store = StateStore::BinaryStore.new(states)
13
+
14
+ @states_stores ||={}
15
+ @states_stores_options ||={}
16
+
17
+ @states_stores[state_store_options[:as]] = store
18
+ @states_stores_options[state_store_options[:as]] = state_store_options
19
+ create_methods_for_state_store(state_store_options[:as])
11
20
  end
12
21
 
13
- def state_store_store
14
- @store
22
+ def states_stores
23
+ @states_stores
15
24
  end
16
25
 
17
- def state_store_options
18
- @state_store_options
26
+ def states_stores_options
27
+ @states_stores_options
19
28
  end
20
29
 
21
30
  private
22
31
 
23
- def override_method_store_in_method
24
- class_eval <<-ALIAS,__FILE__,__LINE__+1
25
- if self.instance_methods.include?(:#{self.state_store_options[:in]})
26
- alias :status_store_original_#{self.state_store_options[:in]} :#{self.state_store_options[:in]}
27
- end
28
- ALIAS
32
+ def create_methods_for_state_store(name)
29
33
 
30
34
  self.class_eval do
31
- define_method self.state_store_options[:in] do
32
- original_method_name = :"status_store_original_#{self.class.state_store_options[:in]}"
33
- value = self.respond_to?(original_method_name) ? self.send(original_method_name) : super
34
- self.class.state_store_store.humanize(value)
35
+ define_method name do
36
+ method_name = self.class.states_stores_options[name][:in]
37
+ value = self.send(method_name)
38
+ self.class.states_stores[name].humanize(value)
39
+ end
40
+
41
+ define_method :"#{name}=" do |humanized_array|
42
+ method_name = self.class.states_stores_options[name][:in]
43
+ store = self.class.states_stores[name]
44
+ self.send(:"#{method_name}=",store.value(humanized_array))
35
45
  end
36
46
  end
47
+
37
48
  end
38
49
  end
39
50
 
40
51
  module InstanceMethods
41
52
  def self.included(base)
42
-
43
53
  def method_missing(method_name, *args)
44
- if method_name.to_s == "has_#{self.class.state_store_options[:in]}?"
45
- self.class.state_store_store.has_status?(args[0],self.send(self.class.state_store_options[:in]))
54
+ state_method_name = method_name.to_s.match(/^has_(\w+)\?$/)
55
+ state_method_name = state_method_name && state_method_name[1].to_sym
56
+ if state_method_name
57
+ options = self.class.states_stores_options.detect{|key,value| value[:in].to_sym == state_method_name}
58
+ options = options && options[1]
59
+ if options
60
+ instance_method_name = options && options[:in]
61
+ self.class.states_stores[options[:as]].has_status?(args[0],self.send(instance_method_name))
62
+ else
63
+ super
64
+ end
46
65
  else
47
66
  super
48
67
  end
@@ -66,4 +66,16 @@ describe StateStore::BinaryStore do
66
66
  store.index(1,"1").should eq(:two)
67
67
  store.index(1,"0").should be_nil
68
68
  end
69
+
70
+ it "should return value from statuses array" do
71
+ store = klass.new([:read,:write,:execute])
72
+ store.value([]).should eq(0)
73
+ store.value([:execute]).should eq(1)
74
+ store.value([:write]).should eq(2)
75
+ store.value([:write,:execute]).should eq(3)
76
+ store.value([:read]).should eq(4)
77
+ store.value([:read,:execute]).should eq(5)
78
+ store.value([:read,:write]).should eq(6)
79
+ store.value([:read,:write,:execute]).should eq(7)
80
+ end
69
81
  end
@@ -14,26 +14,26 @@ describe StateStore::Extension do
14
14
  klass.send(:include,StateStore)
15
15
  end
16
16
 
17
- it "should raise error when no statuses is given" do
17
+ it "should raise error when no states is given" do
18
18
  expect{
19
- klass.has_statuses()
20
- }.to raise_error(ArgumentError,"No statuses given")
19
+ klass.has_states()
20
+ }.to raise_error(ArgumentError,"No states given")
21
21
  end
22
22
 
23
23
  it "should raise error when no :in key is given" do
24
24
  expect{
25
- klass.has_statuses :read,:write
25
+ klass.has_states :read,:write
26
26
  }.to raise_error(ArgumentError,":in is required")
27
27
  end
28
28
 
29
29
  it "should create store with given statuses" do
30
- klass.has_statuses :read,:write, :in => :status
31
- klass.state_store_store.statuses.should eq([:read,:write])
30
+ klass.has_states :read,:write, :in => :status
31
+ klass.states_stores[:states].statuses.should eq([:read,:write])
32
32
  end
33
33
 
34
34
  it "should store given options in #state_store_options" do
35
- klass.has_statuses :read,:write, :in => :status
36
- klass.state_store_options.should eq({:in => :status})
35
+ klass.has_states :read,:write, :in => :status
36
+ klass.states_stores_options[:states].should eq({:in => :status, :as => :states})
37
37
  end
38
38
  end
39
39
 
@@ -42,14 +42,14 @@ describe StateStore::Extension do
42
42
  before(:each){
43
43
  klass.class_eval do
44
44
  def status_name
45
- 5
45
+ @status_name || 5
46
46
  end
47
47
  end
48
48
  klass.send(:include,StateStore)
49
49
  }
50
50
 
51
51
  it "should call store #has_status? when #has_status_name? is called on klass instance" do
52
- klass.has_statuses :read,:write,:execute, :in => :status_name
52
+ klass.has_states :read,:write,:execute, :in => :status_name
53
53
  klass.any_instance.stub(:status_name).and_return(5)
54
54
 
55
55
  object.has_status_name?(:read).should be_true
@@ -57,12 +57,19 @@ describe StateStore::Extension do
57
57
  end
58
58
 
59
59
  it "should call store #humanize when [status_name] is called on instance of class" do
60
- klass.has_statuses :read,:write,:execute, :in => :status_name
61
- object.status_name.should eq([:read,:execute])
60
+ klass.has_states :read,:write,:execute, :in => :status_name
61
+ object.states.should eq([:read,:execute])
62
62
  end
63
63
 
64
- it "should call super if base class not respond to method" do
65
-
64
+ it "should assign value from array to status method" do
65
+ klass.has_states :read, :write, :execute, :in => :status_name
66
+ klass.class_eval do
67
+ def status_name=(value)
68
+ @status_name = value
69
+ end
70
+ end
71
+ object.states= [:read,:write]
72
+ object.status_name.should eq(6)
66
73
  end
67
74
  end
68
75
 
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.1
4
+ version: 0.0.2
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: &18782820 !ruby/object:Gem::Requirement
16
+ requirement: &19920720 !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: *18782820
24
+ version_requirements: *19920720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &18781480 !ruby/object:Gem::Requirement
27
+ requirement: &19919080 !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: *18781480
35
+ version_requirements: *19919080
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &18799320 !ruby/object:Gem::Requirement
38
+ requirement: &19936760 !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: *18799320
46
+ version_requirements: *19936760
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: -2956134080418210540
86
+ hash: -2977312246934280863
87
87
  required_rubygems_version: !ruby/object:Gem::Requirement
88
88
  none: false
89
89
  requirements: