enumattr 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,7 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in enumattr.gemspec
4
4
  gemspec
5
-
6
- group :development do
7
- gem 'rspec'
8
- end
data/README.ja.md ADDED
@@ -0,0 +1,144 @@
1
+ # Enumattr
2
+
3
+ * 定数値とキーワードをマッピングすることができます
4
+ * クラスはそのマッピングを知っています
5
+ * インスタンスは自身の属性値から、マッピングされたキーワードを知ることができます
6
+
7
+ ## 導入
8
+
9
+ bundler を利用しているなら、Gemfile に以下の行を加え、
10
+
11
+ gem 'enumattr'
12
+
13
+ 以下のコマンドを実行します。
14
+
15
+ $ bundle
16
+
17
+ あるいは自身でインストールすることもできます。
18
+
19
+ $ gem install enumattr
20
+
21
+ ## 使い方
22
+
23
+ ### 基本
24
+
25
+ 1. `include Enumattr::Base`
26
+ 2. `enumattr :attr_name do ... end` を宣言
27
+ 3. `enum :keyword, value` を `do ... end` ブロックのなかで記述
28
+
29
+ 例:
30
+
31
+ class User
32
+ include Enumattr::Base
33
+
34
+ attr_accessor :status
35
+
36
+ enumattr :status do
37
+ enum :active, 1
38
+ enum :inactive, 2
39
+ enum :deleted, 3
40
+ end
41
+
42
+ def initialize(status)
43
+ @status = status
44
+ end
45
+ end
46
+
47
+ すると、クラスメソッドとインスタンスメソッドが定義されます。
48
+
49
+ * クラスメソッド
50
+ * `User.status_keys` (`{attr_name}_keys`) は、キーワードの集合を返します
51
+ * `User.status_values` (`{attr_name}_values`) は、値の集合を返します
52
+ * `User.status_enums` (`{attr_name}_enums`) は Enum オブジェクトの集合を返します
53
+ * `User.status_enum(:active)` (`{attr_name}_enum(:keyword)`) は、`:keyword` に対応する Enum オブジェクトを返します
54
+ * `User.status_value(:active)` (`{attr_name}_value(:keyword)`) は、`:keyword` に対応する値を返します
55
+ * インスタンスメソッド
56
+ * `User#status_key` (`{attr_name}_key`) はマッピングに対応するキーワードを返します
57
+ * `User#status_enum` (`{attr_name}_enum`) はマッピングに対応する Enum オブジェクトを返します
58
+ * `User#status_value` (`{attr_name}_value`) は値を返します (`alias status_value status` とほぼ同義です)
59
+ * `User#status_key = :inactive` (`{attr_name}_key=`) というキーワードによるセッターが定義されます
60
+ * `User#status_active?` (`{attr_name}_{keyword}?`) という、オブジェクトに尋ねるメソッドが定義されます
61
+
62
+ _Enum オブジェクト_ (`Enumattr::Enums::Enum`) は、`key` と `value` という属性を持ったオブジェクトです。
63
+
64
+ 例:
65
+
66
+ User.status_keys
67
+ #=> #<Set: {:active, :inactive, :deleted}>
68
+
69
+ User.status_values
70
+ #=> #<Set: {1, 2, 3}>
71
+
72
+ User.status_enums
73
+ #=> #<Set: {#<Enumattr::Enums::Enum:0x007ff58b220618 @container=#<Enumattr::Enums:0x007ff58b2207a8>, #<Enumattr::Enums::Enum:0x007ff58b220488 @container=#<Enumattr::Enums:0x007ff58b2207a8>, @key=:inactive, @value=2, @extras=[]>, #<Enumattr::Enums::Enum:0x007ff58b220488 @container=#<Enumattr::Enums:0x007ff58b2207a8>, @key=:deleted, @value=3, @extras=[]>}>
74
+
75
+
76
+ enum = User.status_enum(:active)
77
+ #=> #<Enumattr::Enums::Enum:0x007ff58b220618 @container=#<Enumattr::Enums:0x007ff58b2207a8>, @key=:active, @value=1, @extras=[]>
78
+
79
+ # Enum オブジェクトは key と value という属性を持っている
80
+ enum.key
81
+ #=> :active
82
+
83
+ enum.value
84
+ #=> 1
85
+
86
+ User.status_enum(:dummy)
87
+ #=> nil
88
+
89
+ User.status_value(:active)
90
+ #=> 1
91
+
92
+ User.status_value(:dummy)
93
+ #=> nil
94
+
95
+
96
+ user = User.new(1)
97
+ #=> #<User:0x007ff58b050dd8 @status=1>
98
+
99
+ user.status
100
+ #=> 1
101
+
102
+ user.status_key
103
+ #=> :active
104
+
105
+ user.status_value
106
+ #=> 1
107
+
108
+ user.status_key = :inactive
109
+ #=> :inactive
110
+
111
+ user.status
112
+ #=> 2
113
+
114
+ user.status_active?
115
+ #=> false
116
+
117
+ user.status_inactive?
118
+ #=> true
119
+
120
+ ### オプション
121
+
122
+ * `:on`
123
+ * enumattr に指定している名前と同じメソッドあるいは属性が存在しない場合に、参照すべきメソッドや属性を指定できます
124
+ * `enumattr :enumattr_name, :on => :existent_attribute do ...`
125
+ * `:enums`
126
+ * ハッシュで enum オブジェクトのマッピングを定義できます。ブロックによる enum オブジェクトの指定の代替記法です
127
+ * `enumattr :enumattr_name, :enums => {:keyword1 => value1, :keyword2 => value2}`
128
+ * `:extend`
129
+ * モジュールを指定して enum オブジェクトを拡張することができます
130
+ * `enumattr :enumattr_name, :extend => Extension do ...`
131
+
132
+ ## その他の例
133
+
134
+ _examples/*.rb_ と _spec/enumattr/*.rb_ を参照してください。
135
+
136
+ ## ご意見・ご指導
137
+
138
+ ご意見やご指導を歓迎しています!
139
+
140
+ 1. Fork して
141
+ 2. feature branch を作って (`git checkout -b my-new-feature`)
142
+ 3. コミットして (`git commit -am 'Added some feature'`)
143
+ 4. branch を push して (`git push origin my-new-feature`)
144
+ 5. Pull Request してください
data/README.md CHANGED
@@ -20,11 +20,11 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
- ### defining
23
+ ### Basics
24
24
 
25
25
  1. `include Enumattr::Base`
26
- 2. declare `enumattr attribute_name do ... end`
27
- 2. `enum :symbol, value` in `do ... end`
26
+ 2. declare `enumattr :attr_name do ... end`
27
+ 3. `enum :keyword, value` in `do ... end` block
28
28
 
29
29
  example:
30
30
 
@@ -44,112 +44,66 @@ example:
44
44
  end
45
45
  end
46
46
 
47
- or alternative style
47
+ then defining class methods and instance methods.
48
48
 
49
- 1. `include Enumattr::Base`
50
- 2. declare `enumattr attribute_name, :enums => {:symbol => value ...}`
51
-
52
- example:
53
-
54
- class User
55
- include Enumattr::Base
56
-
57
- attr_accessor :status
58
-
59
- enumattr :status, :enums => {:active => 1, :inactive => 2, :deleted => 3}
60
-
61
- def initialize(status)
62
- @status = status
63
- end
64
- end
65
-
66
- ### defining options
49
+ * class methods
50
+ * `User.status_keys` as `{attr_name}_keys` return keyword set
51
+ * `User.status_values` as `{attr_name}_values` return value set
52
+ * `User.status_enums` as `{attr_name}_enums` return Enum object set
53
+ * `User.status_enum(:active)` as `{attr_name}_enum(:keyword)` return an Enum object
54
+ * `User.status_value(:active)` as `{attr_name}_value(:keyword)` return a value
55
+ * instance methods
56
+ * `User#status_key` as `{attr_name}_key` return a keyword correspond to mapping
57
+ * `User#status_enum` as `{attr_name}_enum` return a Enum object correspond to mapping
58
+ * `User#status_value` as `{attr_name}_value` return a value (`alias status_value status`)
59
+ * `User#status_key = :inactive` as `{attr_name}_key=` setter by keyword
60
+ * `User#status_active?` as `{attr_name}_{keyword}?` query method return true or false
67
61
 
68
- class User
69
- include Enumattr::Base
70
-
71
- attr_accessor :status
72
-
73
- # alt enum attribute_name and :on option with real_attribute_name
74
- enumattr :use_status, :on => :status do
75
- enum :active, 1
76
- enum :inactive, 2
77
- enum :deleted, 3
78
- end
79
-
80
- def initialize(status)
81
- @status = status
82
- end
83
- end
84
-
85
- #### class methods
86
-
87
- * `#{attribute_name}_enums` return enum set
88
- * `#{attribute_name}_keys` return key set
89
- * `#{attribute_name}_values` return value set
62
+ _Enum object_ (`Enumattr::Enums::Enum`) has `key` and `value` attributes
90
63
 
91
64
  example:
92
65
 
93
- User.status_enums
94
- #=> #<Set: {#<Enumattr::Enums::Enum:0x8a8d13c @key=:active, @value=1>, #<Enumattr::Enums::Enum:0x8a8d100 @key=:inactive, @value=2>, #<Enumattr::Enums::Enum:0x8a8d0ec @key=:deleted, @value=3>}>
95
-
96
66
  User.status_keys
97
67
  #=> #<Set: {:active, :inactive, :deleted}>
98
68
 
99
69
  User.status_values
100
70
  #=> #<Set: {1, 2, 3}>
101
71
 
102
- * `#{attribute_name}_enum(key)` return an enum
103
- * `#{attribute_name}_value(key)` return a value
72
+ User.status_enums
73
+ #=> #<Set: {#<Enumattr::Enums::Enum:0x007ff58b220618 @container=#<Enumattr::Enums:0x007ff58b2207a8>, #<Enumattr::Enums::Enum:0x007ff58b220488 @container=#<Enumattr::Enums:0x007ff58b2207a8>, @key=:inactive, @value=2, @extras=[]>, #<Enumattr::Enums::Enum:0x007ff58b220488 @container=#<Enumattr::Enums:0x007ff58b2207a8>, @key=:deleted, @value=3, @extras=[]>}>
104
74
 
105
- example:
106
75
 
107
- User.status_enum :active
108
- #=> #<Enumattr::Enums::Enum:0x8a8d13c @key=:active, @value=1>
109
-
110
- User.status_enum :inactive
111
- #=> #<Enumattr::Enums::Enum:0x8a8d100 @key=:inactive, @value=2>
112
-
113
- User.status_enum :dummy
114
- #=> nil
115
-
116
- User.status_value :active
76
+ enum = User.status_enum(:active)
77
+ #=> #<Enumattr::Enums::Enum:0x007ff58b220618 @container=#<Enumattr::Enums:0x007ff58b2207a8>, @key=:active, @value=1, @extras=[]>
78
+
79
+ # Enum object has key and value attributes
80
+ enum.key
81
+ #=> :active
82
+
83
+ enum.value
117
84
  #=> 1
118
-
119
- User.status_value :inactive
120
- #=> 2
121
-
122
- User.status_value :dummy
85
+
86
+ User.status_enum(:dummy)
123
87
  #=> nil
124
88
 
125
- #### instance methods
89
+ User.status_value(:active)
90
+ #=> 1
126
91
 
127
- * getters
128
- * alias `#{attribute_name}_value` `attribute_name`
129
- * `#{attribute_name}_key` return symbol
130
- * `#{attribute_name}_enum` return enum
131
- * setter (if writable)
132
- * `#{attribute_name}_key=(key)`
133
-
92
+ User.status_value(:dummy)
93
+ #=> nil
134
94
 
135
- getters example:
136
95
 
137
96
  user = User.new(1)
138
- #=> #<User:0x8e17dac @status=1>
139
-
97
+ #=> #<User:0x007ff58b050dd8 @status=1>
98
+
140
99
  user.status
141
100
  #=> 1
142
-
143
- user.status_value # alias
144
- #=> 1
145
-
101
+
146
102
  user.status_key
147
103
  #=> :active
148
-
149
- user.status_enum
150
- #=> #<Enumattr::Enums::Enum:0x8de2e68 @key=:active, @value=1>
151
104
 
152
- setter example:
105
+ user.status_value
106
+ #=> 1
153
107
 
154
108
  user.status_key = :inactive
155
109
  #=> :inactive
@@ -157,23 +111,27 @@ setter example:
157
111
  user.status
158
112
  #=> 2
159
113
 
160
-
161
- * Query Method
162
- * `#{attribute_name}_#{key}?` return true or false
163
-
164
- example:
165
-
166
114
  user.status_active?
167
115
  #=> false
168
-
116
+
169
117
  user.status_inactive?
170
118
  #=> true
171
-
172
- user.status_deleted?
173
- #=> false
174
-
175
- user.status_dummy?
176
- NoMethodError: undefined method `status_dummy?' for #<User:0x8e17dac @status=2>
119
+
120
+ ### Options
121
+
122
+ * `:on`
123
+ * specify existent attribute or method if `enumattr_name` attribute or method doesn't exist
124
+ * `enumattr :enumattr_name, :on => :existent_attribute do ...`
125
+ * `:enums`
126
+ * altenative enum defining leteral by hash instead of block
127
+ * `enumattr :enumattr_name, :enums => {:keyword1 => value1, :keyword2 => value2}`
128
+ * `:extend`
129
+ * enum object extension
130
+ * `enumattr :enumattr_name, :extend => Extension do ...`
131
+
132
+ ## More examples
133
+
134
+ see: _examples/*.rb_ and _spec/enumattr/*.rb_
177
135
 
178
136
  ## Contributing
179
137
 
data/enumattr.gemspec CHANGED
@@ -14,4 +14,6 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "enumattr"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Enumattr::VERSION
17
+
18
+ gem.add_development_dependency('rspec')
17
19
  end
data/lib/enumattr/base.rb CHANGED
@@ -9,29 +9,18 @@ module Enumattr
9
9
  module ClassMethods
10
10
  private
11
11
  def enumattr(enumattr_name, options = {}, &block)
12
- if options[:enums]
13
- closure = Proc.new do
14
- options[:enums].each{|key, value| enum key, value }
15
- end
16
- else
17
- closure = block
18
- end
19
-
20
- context = options.merge(:enumattr => enumattr_name, :base => self)
21
-
22
- enumattrs[enumattr_name] = Enums.new(context, &closure)
23
- enumattr_bases[enumattr_name] = options[:on] || enumattr_name
24
-
25
- define_enumattr_class_methods enumattr_name
26
- define_enumattr_instance_methods enumattr_name
12
+ enums = Enums.new(enumattr_name, self, options, &block)
13
+ enumattrs[enumattr_name] = enums
14
+ define_enumattr_methods(enumattr_name)
27
15
  end
28
16
 
29
17
  def enumattrs
30
18
  @enumattrs ||= {}
31
19
  end
32
20
 
33
- def enumattr_bases
34
- @enumattr_bases ||= {}
21
+ def define_enumattr_methods(enumattr_name)
22
+ define_enumattr_class_methods(enumattr_name)
23
+ define_enumattr_instance_methods(enumattr_name)
35
24
  end
36
25
 
37
26
  def define_enumattr_class_methods(enumattr_name)
@@ -66,10 +55,10 @@ module Enumattr
66
55
  def define_enumattr_instance_methods(enumattr_name)
67
56
  enums = enumattrs[enumattr_name]
68
57
  method_prefix = "#{enumattr_name}_"
69
- enumattr_base = enumattr_bases[enumattr_name]
58
+ enumattr_on = enums.opts[:on] || enumattr_name
70
59
 
71
60
  define_method("#{method_prefix}enum") do
72
- value = send enumattr_base
61
+ value = send enumattr_on
73
62
  enums.enum_by_value(value)
74
63
  end
75
64
 
@@ -79,20 +68,20 @@ module Enumattr
79
68
  end
80
69
 
81
70
  define_method(:"#{method_prefix}value") do
82
- send enumattr_base
71
+ send enumattr_on
83
72
  end
84
73
 
85
74
  # setter by key
86
75
  define_method("#{method_prefix}key=") do |new_key|
87
76
  new_enum = enums.enum_by_key(new_key)
88
77
  new_value = new_enum && new_enum.value
89
- send "#{enumattr_base}=", new_value
78
+ send "#{enumattr_on}=", new_value
90
79
  end
91
80
 
92
81
  # Query methods
93
82
  enums.enums.each do |enum|
94
83
  define_method("#{method_prefix}#{enum.key}?") do
95
- value = send enumattr_base
84
+ value = send enumattr_on
96
85
  value == enum.value
97
86
  end
98
87
  end
@@ -3,12 +3,14 @@ require 'set'
3
3
 
4
4
  module Enumattr
5
5
  class Enums
6
- attr_reader :context
6
+ attr_reader :enumattr, :base, :opts
7
7
 
8
- def initialize(context, &block)
9
- @context = context.freeze
10
- @set = Set.new
11
- instance_eval(&block)
8
+ def initialize(enumattr, base, opts = {}, &block)
9
+ @enumattr = enumattr
10
+ @base = base
11
+ @opts = opts.freeze
12
+ @set = enum_set(&block)
13
+ decorate @set
12
14
  end
13
15
 
14
16
  def enums
@@ -32,21 +34,44 @@ module Enumattr
32
34
  end
33
35
 
34
36
  private
35
- def enum(key, value)
36
- @set.add Enum.new(key, value, self)
37
+ def enum_set(&block)
38
+ if enums_hash = @opts[:enums]
39
+ closure = proc{ enums_hash.each{|key, value| enum key, value } }
40
+ else
41
+ closure = block
42
+ end
43
+
44
+ context = Context.new(self, &closure)
45
+ context.instance_variable_get(:@set)
37
46
  end
38
47
 
39
- class Enum
40
- attr_reader :key, :value
48
+ def decorate(set)
49
+ if @opts.has_key?(:extend)
50
+ set.each{|enum| enum.extend @opts[:extend] }
51
+ end
52
+ end
41
53
 
42
- def initialize(key, value, container)
43
- @key = key.to_sym
44
- @value = value
54
+ class Context
55
+ def initialize(container, &closure)
45
56
  @container = container
57
+ @set = Set.new
58
+ instance_eval(&closure)
59
+ end
60
+
61
+ private
62
+ def enum(key, value, *extras)
63
+ @set.add Enum.new(@container, key, value, *extras)
46
64
  end
65
+ end
47
66
 
48
- def enums
49
- @container.enums
67
+ class Enum
68
+ attr_reader :key, :value
69
+
70
+ def initialize(container, key, value, *extras)
71
+ @container = container
72
+ @key = key.to_sym
73
+ @value = value
74
+ @extras = extras
50
75
  end
51
76
 
52
77
  def hash
@@ -57,5 +82,6 @@ module Enumattr
57
82
  @key == other.key
58
83
  end
59
84
  end
85
+
60
86
  end
61
87
  end
@@ -1,3 +1,3 @@
1
1
  module Enumattr
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -2,119 +2,129 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Enumattr::Enums do
5
- let(:enums) do
6
- defining_context = {
7
- :class => Object,
8
- :enumattr => :example,
9
- :something => :something
10
- }
11
-
12
- Enumattr::Enums.new(defining_context) do
13
- enum :key1, 1
14
- enum :key2, 2
15
- enum :key3, 3
5
+ shared_examples "Enumattr::Enums find methods" do
6
+ describe "enum_by_key" do
7
+ context "with :test1" do
8
+ subject { enums.enum_by_key(:test1) }
9
+ it { should be_a Enumattr::Enums::Enum }
10
+ its(:key) { should == :test1 }
11
+ its(:value) { should == 1 }
12
+ end
16
13
  end
17
- end
18
-
19
- describe "#context" do
20
- subject { enums.context }
21
- it { should be_a Hash }
22
- it { should be_frozen }
23
- end
24
14
 
25
- describe "#context contents" do
26
- describe ":class" do
27
- subject { enums.context[:class] }
28
- it { should == Object }
15
+ describe "enum_by_value" do
16
+ context "with 1" do
17
+ subject { enums.enum_by_value(1) }
18
+ it { should be_a Enumattr::Enums::Enum }
19
+ its(:key) { should == :test1 }
20
+ its(:value) { should == 1 }
21
+ end
29
22
  end
30
23
 
31
- describe ":enumattr" do
32
- subject { enums.context[:enumattr] }
33
- it { should == :example }
24
+ describe "enum_by_key :test1" do
25
+ subject { enums.enum_by_key(:test1) }
26
+ it { should be_a Enumattr::Enums::Enum }
27
+ its(:key) { should == :test1 }
28
+ its(:value) { should == 1 }
34
29
  end
35
30
 
36
- describe ":something" do
37
- subject { enums.context[:something] }
38
- it { should == :something }
31
+ describe "enum_by_key :not_registered" do
32
+ subject { enums.enum_by_key(:not_registered) }
33
+ it { should be_nil }
39
34
  end
40
35
  end
41
36
 
42
- describe "#enums" do
43
- subject { enums.enums }
44
- it { should be_a Set }
45
- it { should have(3).items }
46
- it "should have Enumattr::Enums::Enum instances" do
47
- should satisfy { |enums|
48
- enums.all?{|item| item.is_a? Enumattr::Enums::Enum }
49
- }
37
+ context "with enumattr, base and block" do
38
+ class EnumsTest1
39
+ include Enumattr::Base
40
+
41
+ attr_accessor :test
42
+
43
+ enumattr :test do
44
+ enum :test1, 1
45
+ enum :test2, 2
46
+ enum :test3, 3
47
+ enum :test4, 4
48
+ enum :test5, 5
49
+ end
50
50
  end
51
- end
52
51
 
53
- describe "#keys" do
54
- subject { enums.keys }
55
- it { should be_a Set }
56
- it { should have(3).items }
57
- it "should have Symbol instances" do
58
- should satisfy { |keys|
59
- keys.all?{|item| item.is_a? Symbol }
60
- }
52
+ let(:enums) { EnumsTest1.instance_eval("enumattrs[:test]") }
53
+
54
+ describe "attributes" do
55
+ subject { enums }
56
+ its(:base) { should == EnumsTest1 }
57
+ its(:enums) { should have(5).enums }
58
+ its(:opts) { should be_empty }
59
+ its(:keys) { should == Set.new([:test1, :test2, :test3, :test4, :test5]) }
60
+ its(:values) { should == Set.new([1, 2, 3, 4, 5]) }
61
61
  end
62
+
63
+ include_examples "Enumattr::Enums find methods"
64
+
62
65
  end
63
66
 
64
- describe "#values" do
65
- subject { enums.values }
66
- it { should be_a Set }
67
- it { should have(3).items }
68
- it "should have Numeric instances" do
69
- should satisfy { |values|
70
- values.all?{|item| item.is_a? Numeric }
71
- }
67
+ context "with enumattr, base and :enums option" do
68
+ class EnumsTest2
69
+ include Enumattr::Base
70
+
71
+ attr_accessor :test
72
+
73
+ enumattr :test, :enums => {:test1 => 1, :test2 => 2, :test3 => 3}
72
74
  end
73
- end
74
75
 
75
- describe "find methods" do
76
- shared_examples "#enum_by_foo(foo) each items" do
77
- it { should be_a Enumattr::Enums::Enum }
78
- its(:key) { should == expects[:key] }
79
- its(:value) { should == expects[:value] }
76
+ let(:enums) { EnumsTest2.instance_eval("enumattrs[:test]") }
77
+
78
+ describe "attributes" do
79
+ subject { enums }
80
+ its(:base) { should == EnumsTest2 }
81
+ its(:enums) { should have(3).enums }
82
+ its(:opts) { should_not be_empty }
83
+ its(:keys) { should == Set.new([:test1, :test2, :test3]) }
84
+ its(:values) { should == Set.new([1, 2, 3]) }
80
85
  end
81
86
 
82
- samples = [
83
- {:key => :key1, :value => 1},
84
- {:key => :key2, :value => 2},
85
- {:key => :key3, :value => 3},
86
- ]
87
-
88
- describe "#enum_by_key(key)" do
89
- subject { enums.enum_by_key(key) }
90
- samples.each do |sample|
91
- context "key: #{sample[:key]}" do
92
- let(:key) { sample[:key] }
93
- let(:expects) { sample }
94
-
95
- include_examples "#enum_by_foo(foo) each items"
96
- end
87
+ include_examples "Enumattr::Enums find methods"
88
+ end
89
+
90
+ context "with enumattr, base and :extend option" do
91
+ module NameExteision
92
+ def name
93
+ @extras.first
97
94
  end
98
95
  end
99
96
 
100
- describe "#enum_by_value(value)" do
101
- subject { enums.enum_by_value(value) }
97
+ class EnumsTest3
98
+ include Enumattr::Base
102
99
 
103
- samples.each do |sample|
104
- context "value: #{sample[:value]}" do
105
- let(:value) { sample[:value] }
106
- let(:expects) { sample }
100
+ attr_accessor :test
107
101
 
108
- include_examples "#enum_by_foo(foo) each items"
109
- end
102
+ enumattr :test, :extend => NameExteision do
103
+ enum :test1, 1, "test1 name"
104
+ enum :test2, 2, "test2 name"
105
+ enum :test3, 3, "test3 name"
106
+ enum :test4, 4, "test4 name"
110
107
  end
111
108
  end
112
- end
113
109
 
114
- describe Enumattr::Enums::Enum do
115
- subject { enums.enum_by_key(:key1) }
116
- its(:key) { should == :key1 }
117
- its(:value) { should == 1 }
118
- its(:enums) { should == enums.enums }
110
+ let(:enums) { EnumsTest3.instance_eval("enumattrs[:test]") }
111
+
112
+ describe "attributes" do
113
+ subject { enums }
114
+ its(:base) { should == EnumsTest3 }
115
+ its(:enums) { should have(4).enums }
116
+ its(:opts) { should_not be_empty }
117
+ its(:keys) { should == Set.new([:test1, :test2, :test3, :test4]) }
118
+ its(:values) { should == Set.new([1, 2, 3, 4]) }
119
+ end
120
+
121
+ include_examples "Enumattr::Enums find methods"
122
+
123
+ describe "enum_by_key :test1" do
124
+ describe "extension method" do
125
+ subject { enums.enum_by_key(:test1) }
126
+ its(:name) { should == "test1 name" }
127
+ end
128
+ end
119
129
  end
120
130
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumattr
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:
@@ -9,8 +9,19 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-30 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2012-05-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70160534844020 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70160534844020
14
25
  description: simple enum
15
26
  email:
16
27
  - aisuiiaisuii@gmail.com
@@ -22,6 +33,7 @@ files:
22
33
  - .rspec
23
34
  - Gemfile
24
35
  - LICENSE
36
+ - README.ja.md
25
37
  - README.md
26
38
  - Rakefile
27
39
  - enumattr.gemspec