enumeration 1.0.0 → 1.1.0

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.
@@ -0,0 +1,25 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ enumeration (1.0.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ json (1.5.1)
10
+ kelredd-useful (0.4.1)
11
+ json
12
+ leftright (0.9.1)
13
+ shoulda (2.11.3)
14
+ test-belt (0.2.1)
15
+ kelredd-useful (~> 0.4.0)
16
+ leftright (~> 0.9.0)
17
+ shoulda (~> 2.11)
18
+
19
+ PLATFORMS
20
+ ruby
21
+
22
+ DEPENDENCIES
23
+ bundler (~> 1.0)
24
+ enumeration!
25
+ test-belt (= 0.2.1)
@@ -8,10 +8,58 @@ add enumerated value attributes to your ruby classes
8
8
 
9
9
  gem install enumeration
10
10
 
11
- == Usage
11
+ == Basic Example and Usage
12
12
 
13
13
  require 'enumeration'
14
14
 
15
+ class Thing
16
+ include Enumeration
17
+
18
+ # list enumeration
19
+ enum :word, %w{aye bee see}
20
+
21
+ # map enumeration
22
+ enum :stuff, {
23
+ :a => "aye",
24
+ :b => "bee",
25
+ :c => "see"
26
+ }
27
+ end
28
+
29
+ # get the enum sets
30
+ Thing.word_set # => ['aye', 'bee', 'see']
31
+ Thing.stuff_set # => [:a, :b, :c]
32
+
33
+ # lookup mapped enum values
34
+ Thing.stuff(:a) # => "aye"
35
+
36
+
37
+ t = Thing.new
38
+
39
+ # write list enum values
40
+ t.word # => nil
41
+ t.word = "aye"
42
+ t.word # => "aye"
43
+ t.word_key # => "aye" (a list's 'keys' are it's values, vice-versa)
44
+ t.word = "dee"
45
+ t.word # => nil (won't write non enum values)
46
+ t.word_key # => nil
47
+
48
+ # write mapped enum value
49
+ t.stuff # => nil
50
+ t.stuff = :b # (write using key)
51
+ t.stuff # => "bee"
52
+ t.stuff_key # => :b
53
+ t.stuff = "see" # (write using value)
54
+ t.stuff # => "see"
55
+ t.stuff_key # => :c
56
+ t.stuff = :d
57
+ t.stuff # => nil (won't write non enum keys)
58
+ t.stuff_key # => nil
59
+ t.stuff = "dee"
60
+ t.stuff # => nil (won't write non enum values)
61
+ t.stuff_key # => nil
62
+
15
63
  == License
16
64
 
17
65
  Copyright (c) 2011 Kelly D. Redding
@@ -11,8 +11,9 @@ module Enumeration
11
11
  # define an anonymous Module to extend on
12
12
  # defining a class level map reader
13
13
  class_methods = Module.new do
14
- define_method(name) {|k| class_variable_get("@@#{name}")[k]} if c.map?
14
+ define_method(name.to_s+'_collection') { c.data }
15
15
  define_method(name.to_s+'_set') { c.set }
16
+ define_method(name) {|k| class_variable_get("@@#{name}")[k]} if c.map?
16
17
  end
17
18
 
18
19
  # set a class variable to store the enum map (used by above reader)
@@ -30,8 +31,12 @@ module Enumeration
30
31
  end
31
32
 
32
33
  # instance reader for the enum value
33
- define_method(name) do
34
- instance_variable_get("@#{name}")
34
+ define_method(name) { instance_variable_get("@#{name}") }
35
+
36
+ # instance reader for the enum key
37
+ define_method(name.to_s+'_key') do
38
+ c = self.class.send(:class_variable_get, "@@#{name}")
39
+ c.key(instance_variable_get("@#{name}"))
35
40
  end
36
41
  end
37
42
  end
@@ -1,6 +1,8 @@
1
1
  module Enumeration
2
2
  class Collection
3
3
 
4
+ attr_reader :data
5
+
4
6
  def initialize(map_or_list)
5
7
  unless map_or_list.kind_of?(::Hash) || map_or_list.kind_of?(::Array)
6
8
  raise ArgumentError, "please specify the enum collection as a Hash or Array"
@@ -8,11 +10,24 @@ module Enumeration
8
10
  @data = map_or_list
9
11
  end
10
12
 
11
- def [](value)
12
- if self.map? && @data.has_key?(value)
13
- @data[value]
14
- elsif (self.map? && @data.has_value?(value)) ||
15
- (@data.include?(value))
13
+ # lookup collection value by a key
14
+ def [](key)
15
+ if self.map? && @data.has_key?(key)
16
+ @data[key]
17
+ elsif (self.map? && @data.has_value?(key)) ||
18
+ (self.list? && @data.include?(key))
19
+ key
20
+ else
21
+ nil
22
+ end
23
+ end
24
+
25
+ # lookup collection key by a value
26
+ def key(value)
27
+ if self.map? && @data.has_value?(value)
28
+ @data.index(value)
29
+ elsif (self.map? && @data.has_key?(value)) ||
30
+ (self.list? && @data.include?(value))
16
31
  value
17
32
  else
18
33
  nil
@@ -1,3 +1,3 @@
1
1
  module Enumeration
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -5,6 +5,7 @@ class CollectionAPITest < Test::Unit::TestCase
5
5
  context "Enumeration collection" do
6
6
  subject { Enumeration::Collection.new([]) }
7
7
 
8
+ should_have_reader :data
8
9
  should_have_instance_methods :set, :map?, :list?, :[]
9
10
 
10
11
  should "only be created from Arrays or Hashes" do
@@ -29,14 +30,22 @@ class ListCollectionTest < Test::Unit::TestCase
29
30
  assert_equal false, subject.map?
30
31
  end
31
32
 
33
+ should "know it's data" do
34
+ assert_equal ['one', 'two', 'three'], subject.data
35
+ end
36
+
32
37
  should "know it's set" do
33
38
  assert_equal ['one', 'two', 'three'], subject.set
34
39
  end
35
40
 
36
- should "lookup by value" do
41
+ should "lookup value by key" do
37
42
  assert_equal 'two', subject['two']
38
43
  end
39
44
 
45
+ should "lookup key by value" do
46
+ assert_equal 'three', subject.key('three')
47
+ end
48
+
40
49
  end
41
50
  end
42
51
 
@@ -49,17 +58,29 @@ class MapCollectionTest < Test::Unit::TestCase
49
58
  assert_equal false, subject.list?
50
59
  end
51
60
 
61
+ should "know it's data" do
62
+ assert_equal({:one=>1,:two=>2,:three=>3}, subject.data)
63
+ end
64
+
52
65
  should "know it's set" do
53
66
  [:one, :two, :three].each{|n| assert subject.set.include?(n)}
54
67
  end
55
68
 
56
- should "lookup by key" do
69
+ should "lookup value by key" do
57
70
  assert_equal 2, subject[:two]
58
71
  end
59
72
 
60
- should "lookup by value" do
73
+ should "lookup value by value" do
61
74
  assert_equal 2, subject[2]
62
75
  end
63
76
 
77
+ should "lookup key by value" do
78
+ assert_equal :two, subject.key(2)
79
+ end
80
+
81
+ should "lookup key by key" do
82
+ assert_equal :two, subject.key(:two)
83
+ end
84
+
64
85
  end
65
86
  end
@@ -9,7 +9,7 @@ class ListEnumTest < Test::Unit::TestCase
9
9
  Thing.send(:enum, :word, %w{aye bee see})
10
10
  end
11
11
 
12
- should_have_class_method :word_set
12
+ should_have_class_methods :word_set, :word_collection
13
13
  should_have_accessor :word
14
14
 
15
15
  should "not have a class level lookup method" do
@@ -25,16 +25,23 @@ class ListEnumTest < Test::Unit::TestCase
25
25
  assert !words.empty?
26
26
  assert_equal 3, words.size
27
27
  assert_equal ['aye', 'bee', 'see'], Thing.word_set
28
+ assert_equal Thing.word_set, Thing.word_collection
28
29
  end
29
30
 
30
- should "write by value and read by value" do
31
+ should "write a value and read the value" do
31
32
  subject.word = "see"
32
33
  assert_equal "see", subject.word
33
34
  end
34
35
 
36
+ should "write a value and read the key" do
37
+ subject.word = "see"
38
+ assert_equal "see", subject.word_key
39
+ end
40
+
35
41
  should "write nil for values that aren't in the enum" do
36
42
  subject.word = "bady-bad"
37
43
  assert_equal nil, subject.word
44
+ assert_equal nil, subject.word_key
38
45
  end
39
46
 
40
47
  end
@@ -13,7 +13,7 @@ class MapEnumTest < Test::Unit::TestCase
13
13
  })
14
14
  end
15
15
 
16
- should_have_class_methods :stuff, :stuff_set
16
+ should_have_class_methods :stuff, :stuff_set, :stuff_collection
17
17
  should_have_accessor :stuff
18
18
 
19
19
  should "provide class level access to the enum set" do
@@ -23,23 +23,26 @@ class MapEnumTest < Test::Unit::TestCase
23
23
  assert !stuffs.empty?
24
24
  assert_equal 3, stuffs.size
25
25
  [:a, :b, :c].each{|t| assert Thing.stuff_set.include?(t)}
26
+ assert_equal({:a=>'aye',:b=>'bee',:c=>'see'}, Thing.stuff_collection)
26
27
  end
27
28
 
28
29
  should "provide class level lookup of the enum" do
29
30
  assert_equal "aye", Thing.stuff(:a)
30
31
  end
31
32
 
32
- should "write by key and read by value" do
33
+ should "write a key and read the value and key" do
33
34
  subject.stuff = :b
34
35
  assert_equal "bee", subject.stuff
36
+ assert_equal :b, subject.stuff_key
35
37
  end
36
38
 
37
- should "write by value and read by value" do
39
+ should "write a value and read the value" do
38
40
  subject.stuff = "see"
39
41
  assert_equal "see", subject.stuff
42
+ assert_equal :c, subject.stuff_key
40
43
  end
41
44
 
42
- should "not read by key" do
45
+ should "not read keys like you would values" do
43
46
  subject.stuff = :c
44
47
  assert_not_equal :c, subject.stuff
45
48
  end
@@ -47,11 +50,13 @@ class MapEnumTest < Test::Unit::TestCase
47
50
  should "write nil for keys that aren't in the enum" do
48
51
  subject.stuff = :bad
49
52
  assert_equal nil, subject.stuff
53
+ assert_equal nil, subject.stuff_key
50
54
  end
51
55
 
52
56
  should "write nil for values that aren't in the enum" do
53
57
  subject.stuff = "bady-bad"
54
58
  assert_equal nil, subject.stuff
59
+ assert_equal nil, subject.stuff_key
55
60
  end
56
61
 
57
62
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumeration
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly D. Redding
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-05 00:00:00 -05:00
18
+ date: 2011-04-06 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -61,6 +61,7 @@ extra_rdoc_files: []
61
61
  files:
62
62
  - .gitignore
63
63
  - Gemfile
64
+ - Gemfile.lock
64
65
  - README.rdoc
65
66
  - Rakefile
66
67
  - enumeration.gemspec