enumerative 1.0.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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rvmrc ADDED
@@ -0,0 +1,4 @@
1
+ rvm ruby-1.9.2-p320@enumerative --create
2
+ if [ `uname -s` = "Darwin" ]; then
3
+ rvm current
4
+ fi
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in enumerative.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Ninja Loss
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # Enumerative
2
+
3
+ Provides enumeration functionality.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'enumerative'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install enumerative
18
+
19
+ ## Usage
20
+
21
+ Create an enumeration class and include the modiule.
22
+
23
+ class Color
24
+
25
+ def self.valid_keys
26
+ %w(
27
+ black
28
+ blue
29
+ green
30
+ )
31
+ end
32
+
33
+ include Enumerative::Enumeration # this must come after ::valid_keys
34
+
35
+ end
36
+
37
+ Declare the enumeration in an ActiveModel.
38
+
39
+ class Vehicle
40
+
41
+ include Enumerative::HasEnumeration
42
+
43
+ # add_column :vehicles, :color, :string, :limit => 35
44
+
45
+ has_enumeration :color, :from => Color
46
+
47
+ end
48
+
49
+ Translate the enumeration using localization:
50
+
51
+ en:
52
+ enumerations:
53
+ color:
54
+ black: Black
55
+ blue: Blue
56
+ green: Green
57
+
58
+ Use the enumeration:
59
+
60
+ vehicle = Vehicle.create( :color => 'black' )
61
+
62
+ vehicle.attributes['color'] # => black
63
+ vehicle.color # => #<Color:0x10702d5e8 @key="black">
64
+ vehicle.color.key # => black
65
+ vehicle.color.value # => Black
66
+ vehicle.color.to_s # => black
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/enumerative/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Nils Jonsson", "C. Jason Harrelson"]
6
+ gem.email = ["ninja.loss@gmail.com"]
7
+ gem.description = %q{Tools for defining and using enumerations.}
8
+ gem.summary = %q{Tools for enumerations.}
9
+ gem.homepage = "https://github.com/ninja-loss/enumerative"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "enumerative"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Enumerative::VERSION
17
+ end
@@ -0,0 +1,8 @@
1
+ require "enumerative/version"
2
+
3
+ module Enumerative
4
+
5
+ autoload :Enumeration, "enumerative/enumeration"
6
+ autoload :HasEnumeration, "enumerative/has_enumeration"
7
+
8
+ end
@@ -0,0 +1,66 @@
1
+ module Enumerative
2
+
3
+ module Enumeration
4
+
5
+ def self.included( other_module )
6
+ other_module.module_eval do
7
+ valid_keys.each do |k|
8
+ const_set k.gsub( /\s/, '_' ).upcase, other_module.new( k )
9
+ end
10
+
11
+ extend ClassMethods
12
+
13
+ attr_reader :key
14
+ end
15
+ end
16
+
17
+ module ClassMethods
18
+
19
+ def to_select
20
+ valid_keys.sort.collect do |k|
21
+ [translate( k ), k]
22
+ end
23
+ end
24
+
25
+ def translate( key )
26
+ I18n.translate "enumerations.#{name.underscore}.#{key}", :raise => true
27
+ rescue I18n::MissingTranslationData
28
+ nil
29
+ end
30
+
31
+ end
32
+
33
+ def initialize( key )
34
+ @key = key.to_s.try( :dup ).try( :freeze )
35
+ end
36
+
37
+ def ==( other )
38
+ other.is_a?( self.class ) && (other.key == key)
39
+ end
40
+
41
+ def to_s
42
+ key
43
+ end
44
+
45
+ def valid?
46
+ key.blank? || self.class.valid_keys.include?( key )
47
+ end
48
+
49
+ def value
50
+ key.blank? ? nil : self.class.translate( key )
51
+ end
52
+
53
+ def blank?
54
+ key.blank?
55
+ end
56
+
57
+ # Method is required for Rails > 3.2.x due to ActiveRecord's autosave
58
+ # functionality.
59
+ #
60
+ def marked_for_destruction?
61
+ false
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'an Enumeration' do
4
+
5
+ describe 'an instance' do
6
+
7
+ let :instance do
8
+ described_class.new 'foo'
9
+ end
10
+
11
+ it 'should have the expected #key' do
12
+ instance.key.should == 'foo'
13
+ end
14
+
15
+ it 'should have an immutable #key' do
16
+ instance.should_not respond_to( :key= )
17
+
18
+ expect {
19
+ instance.key.gsub!( /./, 'x' )
20
+ }.to raise_error( RuntimeError, "can't modify frozen string")
21
+ end
22
+
23
+ it 'should equal an equivalent instance' do
24
+ instance.should == described_class.new( 'foo' )
25
+ end
26
+
27
+ it 'should have the expected string representation' do
28
+ instance.to_s.should == 'foo'
29
+ end
30
+
31
+ describe 'that is valid' do
32
+
33
+ subject { described_class.new described_class.valid_keys.first }
34
+
35
+ it { should be_valid }
36
+
37
+ it 'should have a #value' do
38
+ subject.value.should_not == nil
39
+ end
40
+
41
+ end
42
+
43
+ describe 'that is invalid' do
44
+
45
+ subject { described_class.new "not a valid #{described_class.name} key" }
46
+
47
+ it { should_not be_valid }
48
+
49
+ it 'should not have a #value' do
50
+ subject.value.should == nil
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,37 @@
1
+ module Enumerative
2
+
3
+ module HasEnumeration
4
+
5
+ def self.included( other_module )
6
+ other_module.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def has_enumeration( *attributes )
12
+ options = attributes.extract_options!
13
+ class_name = if options[:from].try( :is_a?, Class )
14
+ options[:from].name
15
+ else
16
+ options[:from]
17
+ end
18
+ if class_name && !class_name.constantize.include?( Enumeration )
19
+ raise ArgumentError,
20
+ ':from option should refer to a class that mixes in Enumeration'
21
+ end
22
+
23
+ attributes.each do |a|
24
+ composed_of a, :allow_nil => true,
25
+ :class_name => class_name || a.to_s.classify,
26
+ :mapping => [a, 'key'],
27
+ :converter => :new
28
+
29
+ validates_associated a, :allow_blank => true
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,5 @@
1
+ module Enumerative
2
+
3
+ VERSION = "1.0.0"
4
+
5
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'an Enumeration' do
4
+
5
+ describe 'an instance' do
6
+
7
+ let :instance do
8
+ described_class.new 'foo'
9
+ end
10
+
11
+ it 'should have the expected #key' do
12
+ instance.key.should == 'foo'
13
+ end
14
+
15
+ it 'should have an immutable #key' do
16
+ instance.should_not respond_to( :key= )
17
+
18
+ expect {
19
+ instance.key.gsub!( /./, 'x' )
20
+ }.to raise_error( RuntimeError, "can't modify frozen string")
21
+ end
22
+
23
+ it 'should equal an equivalent instance' do
24
+ instance.should == described_class.new( 'foo' )
25
+ end
26
+
27
+ it 'should have the expected string representation' do
28
+ instance.to_s.should == 'foo'
29
+ end
30
+
31
+ describe 'that is valid' do
32
+
33
+ subject { described_class.new described_class.valid_keys.first }
34
+
35
+ it { should be_valid }
36
+
37
+ it 'should have a #value' do
38
+ subject.value.should_not == nil
39
+ end
40
+
41
+ end
42
+
43
+ describe 'that is invalid' do
44
+
45
+ subject { described_class.new "not a valid #{described_class.name} key" }
46
+
47
+ it { should_not be_valid }
48
+
49
+ it 'should not have a #value' do
50
+ subject.value.should == nil
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: enumerative
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nils Jonsson
9
+ - C. Jason Harrelson
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-09-14 00:00:00.000000000 Z
14
+ dependencies: []
15
+ description: Tools for defining and using enumerations.
16
+ email:
17
+ - ninja.loss@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - .rvmrc
24
+ - Gemfile
25
+ - LICENSE
26
+ - README.md
27
+ - Rakefile
28
+ - enumerative.gemspec
29
+ - lib/enumerative.rb
30
+ - lib/enumerative/enumeration.rb
31
+ - lib/enumerative/enumeration_sharedspec.rb
32
+ - lib/enumerative/has_enumeration.rb
33
+ - lib/enumerative/version.rb
34
+ - spec/support/enumeration_sharedspec.rb
35
+ homepage: https://github.com/ninja-loss/enumerative
36
+ licenses: []
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 1.8.24
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: Tools for enumerations.
59
+ test_files:
60
+ - spec/support/enumeration_sharedspec.rb