inum 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 544234bb17ff082ebab6a647cbd6de98e9537ad1
4
+ data.tar.gz: 2e9ed5c46161e3fc72d8a5fa137e6f21178a97af
5
+ SHA512:
6
+ metadata.gz: 33196201c228dbcb269d823423f8cd2c2e55779f615a7d47b2aab6d6d6666b68ce64e366459f02bdabb03978f3f98bf55fd059dca2a4d7dc4eaa82ae2fb40b2b
7
+ data.tar.gz: ad2bf42518ac9e2c7242bf6f20ceeceb6f9b03f17ec50d265334e089e426cb2dcc25fb65728d375ee71317b23e39c726c52f8af247beeb5a3cee36d2b5c4375c
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ vendor/
19
+ nbproject/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in inum.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Atsushi Nakamura
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,90 @@
1
+ # Inum
2
+
3
+ Inum(enumerated type of Integer) provide a Java-enum-like Enum.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'inum'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install inum
18
+
19
+ ## Usage
20
+
21
+
22
+ ### Define Enum(Inum)
23
+ For example create enum(inum) of Japanese Anime.
24
+
25
+ ``` ruby
26
+ class AnimeType < Inum::Base
27
+ define_enum :EVANGELION, 0
28
+ define_enum :HARUHI, 1
29
+ define_enum :NYARUKO, 2
30
+ end
31
+ ```
32
+
33
+ ### Use Enum(Inum)
34
+ How to use Enum(Inum).
35
+
36
+ ``` ruby
37
+ p AnimeType::EVANGELION # => EVANGELION
38
+ p AnimeType::EVANGELION.to_i # => 0
39
+
40
+ type = AnimeType::Parse(0) # parse object to instance of AnimeType.
41
+ p type.equal?(AnimeType::EVANGELION) # => true (member of Enum is singleton.)
42
+
43
+ p AnimeType::HARUHI.eql?('HARUHI') # => true (eql? can compare all parsable object.)
44
+
45
+ ```
46
+
47
+ - more detail is [Class::Base](http://rubydoc.info/github/alfa-jpn/inum/Inum/Base)
48
+
49
+ ### Use define\_check\_method
50
+ define\_check\_method can extend your class.
51
+
52
+ ``` ruby
53
+ class Anime
54
+ extend Inum::DefineCheckMethod
55
+
56
+ attr_accessor :type
57
+
58
+ define_check_method :type, AnimeType
59
+ end
60
+
61
+ ```
62
+
63
+ define\_check\_method generates methods for type confirmation.
64
+
65
+ ``` ruby
66
+ anime = Anime.new
67
+ anime.type = AnimeType::NYARUKO
68
+
69
+ p anime.evangelion? # => false
70
+ p anime.nyaruko? # => true
71
+
72
+
73
+ # type can use all parsable object.
74
+ anime.type = 1
75
+ p anime.haruhi? # => true
76
+
77
+ ```
78
+
79
+
80
+ ## API DOCUMENT
81
+
82
+ - [Documentation for alfa-jpn/Inum(master)](http://rubydoc.info/github/alfa-jpn/inum/frames)
83
+
84
+ ## Contributing
85
+
86
+ 1. Fork it
87
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
88
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
89
+ 4. Push to the branch (`git push origin my-new-feature`)
90
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/inum.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'inum/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "inum"
8
+ spec.version = Inum::VERSION
9
+ spec.authors = ["alfa-jpn"]
10
+ spec.email = ["a.nkmr.ja@gmail.com"]
11
+ spec.description = "Inum(enumerated type of Integer) provide a java-Enum-like."
12
+ spec.summary = "Inum(enumerated type of Integer) provide a java-Enum-like."
13
+ spec.homepage = "https://github.com/alfa-jpn/inum"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "yard"
25
+ end
data/lib/inum.rb ADDED
@@ -0,0 +1 @@
1
+ require "inum/version"
data/lib/inum/base.rb ADDED
@@ -0,0 +1,132 @@
1
+ module Inum
2
+ # InumBase class.
3
+ #
4
+ # @abstract Inum class should be a inheritance of Inum::Base.
5
+ # @example
6
+ # class FruitType < Inum::Base
7
+ # define_enum :APPLE, 0
8
+ # define_enum :BANANA, 1
9
+ # define_enum :ORANGE, 2
10
+ # end
11
+ class Base
12
+
13
+ attr_accessor :value
14
+ private_class_method :new
15
+
16
+ # initialize Inum::Base with value.
17
+ # @note Inum::Base can't call new method.
18
+ #
19
+ # @param value [Integer] value of Enum.
20
+ def initialize(value)
21
+ unless self.class.defined_enums.has_value?(value)
22
+ raise ArgumentError, "unknown value #{value}!"
23
+ end
24
+ @value = value
25
+ end
26
+
27
+ # Compare object.
28
+ #
29
+ # @param [Object] parsable object.
30
+ # @return [Boolean] result.
31
+ def eql?(object)
32
+ self.equal?(self.class.parse(object))
33
+ end
34
+
35
+ # Enum to Integer.
36
+ #
37
+ # @return [Integer] integer value of Enum.
38
+ def to_i
39
+ @value
40
+ end
41
+
42
+ # Enum to String.
43
+ #
44
+ # @return [String] string value of Enum.
45
+ def to_s
46
+ self.class.defined_enums.key(@value).to_s
47
+ end
48
+
49
+ # return array of Enums.
50
+ #
51
+ # @return [Array<Array<String, Integer>>] sorted array of Enums.
52
+ def self.to_a
53
+ defined_enums.map{|k,v| [k.to_s,v] }.sort{|a,b| a[1] <=> b[1] }
54
+ end
55
+
56
+ # return hash of Enums.
57
+ #
58
+ # @return [Hash] hash of Enums.
59
+ def self.to_h
60
+ defined_enums.dup
61
+ end
62
+
63
+ # Parse Object to Enum.
64
+ #
65
+ # @param object [Object] string or symbol or integer or Inum::Base.
66
+ # @return [Inum::Base] instance of Inum::Base.
67
+ def self.parse(object)
68
+ case object
69
+ when String
70
+ self.const_get(object)
71
+ when Symbol
72
+ parse object.to_s
73
+ when Integer
74
+ parse self.defined_enums.key(object).to_s
75
+ when self
76
+ object
77
+ else
78
+ raise ArgumentError, "#{object} is nani?"
79
+ end
80
+ end
81
+
82
+ private
83
+ # Define Enum in called class.
84
+ #
85
+ # @param name [String, Symbol] name of Enum.
86
+ # @param value [Integer,Fixnum] value of Enum.
87
+ def self.define_enum(name, value)
88
+
89
+ validate_enum_args!(name, value)
90
+
91
+ defined_enums[name] = value
92
+ self.const_set(name, new(value))
93
+ end
94
+
95
+ # get hash of :DEFINED_ENUMS.
96
+ def self.defined_enums
97
+ self.const_get(:DEFINED_ENUMS)
98
+ end
99
+
100
+ # call after inherited.
101
+ # @note Define hash of :DEFINED_ENUMS in child.
102
+ def self.inherited(child)
103
+ child.const_set(:DEFINED_ENUMS, Hash.new)
104
+ end
105
+
106
+ # Validate enum args, and raise exception.
107
+ #
108
+ # @param name [Object] name of Enum.
109
+ # @param value [Object] value of Enum.
110
+ def self.validate_enum_args!(name, value)
111
+ unless name.instance_of?(String) or name.instance_of?(Symbol)
112
+ raise ArgumentError, "#{name}<#{name.class}> isn't String or Symbol."
113
+ end
114
+
115
+ unless value.instance_of?(Integer) or value.instance_of?(Fixnum)
116
+ raise ArgumentError, "#{value}<#{value.class}> isn't Integer or Fixnum."
117
+ end
118
+
119
+ if name == :DEFINED_ENUMS
120
+ raise ArgumentError, "#{name} is keyword."
121
+ end
122
+
123
+ if defined_enums.has_key?(name)
124
+ raise ArgumentError, "name(#{name}!) already exists!!"
125
+ end
126
+
127
+ if defined_enums.has_value?(value)
128
+ raise ArgumentError, "value(#{value}!) already exists!!"
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,27 @@
1
+ module Inum
2
+ # DefinedCheckMethod module should be extend.
3
+ #
4
+ # @example
5
+ # class Fruit
6
+ # extend Inum::DefineCheckMethod
7
+ # define_check_method :type, FruitType
8
+ #
9
+ # attr_accessor :type
10
+ # end
11
+ #
12
+ module DefineCheckMethod
13
+ # Define compare method in class.
14
+ #
15
+ # @param variable_name [String] name of variable.
16
+ # @param enum_class [Inum::Base] class of extended Enum::EnumBase.
17
+ def define_check_method(variable_name, enum_class)
18
+ self.class_eval do
19
+ enum_class::DEFINED_ENUMS.each_key do |enum_name|
20
+ define_method("#{enum_name.downcase}?") do
21
+ enum_class::parse(enum_name).eql?(send(variable_name))
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Inum
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,111 @@
1
+ require 'rspec'
2
+ require 'spec_helper'
3
+
4
+ describe Inum::Base do
5
+
6
+ it 'define_method validate correct' do
7
+ # correct.
8
+ expect{
9
+ Class.new(Inum::Base) { define_enum :REDBULL, 0 }
10
+ Class.new(Inum::Base) { define_enum 'REDBULL', 0 }
11
+ Class.new(Inum::Base) { define_enum :REDBULL, 0.to_i }
12
+ Class.new(Inum::Base) {
13
+ define_enum :REDBULL, 0
14
+ define_enum :MONSTER, 1
15
+ }
16
+ }.not_to raise_error
17
+
18
+ # wrong name.
19
+ expect{
20
+ Class.new(Inum::Base) { define_enum 1111, 0 }
21
+ }.to raise_error
22
+
23
+ # wrong value.
24
+ expect{
25
+ Class.new(Inum::Base) { define_enum :REDBULL, :no_int }
26
+ }.to raise_error
27
+
28
+ # dup name.
29
+ expect{
30
+ Class.new(Inum::Base) {
31
+ define_enum :REDBULL, 0
32
+ define_enum :REDBULL, 1
33
+ }
34
+ }.to raise_error
35
+
36
+ # dup value.
37
+ expect{
38
+ Class.new(Inum::Base) {
39
+ define_enum :REDBULL, 0
40
+ define_enum :REDBULL2, 0
41
+ }
42
+ }.to raise_error
43
+ end
44
+
45
+ context 'define class of extended Inum::Base,' do
46
+ before(:each) do
47
+ @enum = Class.new(Inum::Base) do
48
+ define_enum :REDBULL, 0
49
+ define_enum :MONSTER, 1
50
+ define_enum :BURN, 2
51
+ end
52
+ end
53
+
54
+ it 'can not call new.' do
55
+ expect{ @enum.new(1) }.to raise_error
56
+ end
57
+
58
+ it 'DEFINED_ENUM is different instance.' do
59
+ @enum2 = Class.new(Inum::Base) do
60
+ define_enum :REDBULL, 0
61
+ end
62
+ expect( @enum::DEFINED_ENUMS.equal?(@enum2::DEFINED_ENUMS) ).to be_false
63
+ end
64
+
65
+ it 'A enum instance is equal instance.' do
66
+ expect( @enum::BURN.equal?(@enum::BURN )).to be_true
67
+ end
68
+
69
+ it 'eql? return a correct result.' do
70
+ expect( @enum::REDBULL.eql?(0) ).to be_true
71
+ expect( @enum::REDBULL.eql?(1) ).to be_false
72
+ end
73
+
74
+ it 'to_i return integer.' do
75
+ expect( @enum::REDBULL.to_i ).to eq(0)
76
+ end
77
+
78
+ it 'to_s return string.' do
79
+ expect( @enum::MONSTER.to_s ).to eq('MONSTER')
80
+ end
81
+
82
+ it 'to_a return Array' do
83
+ expect(@enum::to_a.instance_of?(Array)).to be_true
84
+ expect(@enum::to_a.length).to eq(3)
85
+ expect(@enum::to_a[0][0]).to eq('REDBULL')
86
+ (0..2).each{|i| expect(@enum::to_a[i][1]).to eq(i) }
87
+ end
88
+
89
+ it 'to_h return Hash' do
90
+ expect(@enum::to_h.instance_of?(Hash)).to be_true
91
+ expect(@enum::to_h.eql?(@enum::DEFINED_ENUMS)).to be_true
92
+ expect(@enum::to_h.equal?(@enum::DEFINED_ENUMS)).to be_false
93
+ end
94
+
95
+ it 'parse return instance from string.' do
96
+ expect( @enum::parse('REDBULL') ).to eq( @enum::REDBULL )
97
+ end
98
+
99
+ it 'parse return instance from integer.' do
100
+ expect( @enum::parse(1) ).to eq( @enum::MONSTER )
101
+ end
102
+
103
+ it 'parse return instance from symbol.' do
104
+ expect( @enum::parse(:BURN) ).to eq( @enum::BURN )
105
+ end
106
+
107
+ it 'parse return instance from self instance.' do
108
+ expect( @enum::parse(@enum::REDBULL) ).to eq( @enum::REDBULL )
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,59 @@
1
+ require 'rspec'
2
+ require 'spec_helper'
3
+
4
+ describe Inum::DefineCheckMethod do
5
+
6
+ context 'create class of called define_check_method,' do
7
+ before(:each) do
8
+ enum = @enum = Class.new(Inum::Base) do
9
+ define_enum :REDBULL, 0
10
+ define_enum :MONSTER, 1
11
+ define_enum :BURN, 2
12
+ end
13
+
14
+ @mixin = Class.new do
15
+ attr_accessor :drink
16
+
17
+ extend Inum::DefineCheckMethod
18
+ self.define_check_method(:drink, enum)
19
+ end
20
+ end
21
+
22
+ it 'defined comparison method.' do
23
+ expect(@mixin.method_defined?(:redbull?)).to be_true
24
+ expect(@mixin.method_defined?(:monster?)).to be_true
25
+ expect(@mixin.method_defined?(:burn?)).to be_true
26
+ end
27
+
28
+ context 'create instance the class,' do
29
+ before(:each) do
30
+ @inst = @mixin.new
31
+ end
32
+
33
+ it 'can compare integer.' do
34
+ @inst.drink = 0
35
+ expect(@inst.redbull?).to be_true
36
+ expect(@inst.monster?).to be_false
37
+ end
38
+
39
+ it 'can compare string.' do
40
+ @inst.drink = 'REDBULL'
41
+ expect(@inst.redbull?).to be_true
42
+ expect(@inst.monster?).to be_false
43
+ end
44
+
45
+ it 'can compare symbol.' do
46
+ @inst.drink = :REDBULL
47
+ expect(@inst.redbull?).to be_true
48
+ expect(@inst.monster?).to be_false
49
+ end
50
+
51
+ it 'can compare self instance.' do
52
+ @inst.drink = @enum::REDBULL
53
+ expect(@inst.redbull?).to be_true
54
+ expect(@inst.monster?).to be_false
55
+ end
56
+
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'inum/base'
4
+ require 'inum/define_check_method'
5
+
6
+ RSpec.configure do |config|
7
+ config.mock_framework = :rspec
8
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: inum
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - alfa-jpn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Inum(enumerated type of Integer) provide a java-Enum-like.
70
+ email:
71
+ - a.nkmr.ja@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - inum.gemspec
82
+ - lib/inum.rb
83
+ - lib/inum/base.rb
84
+ - lib/inum/define_check_method.rb
85
+ - lib/inum/version.rb
86
+ - spec/inum/base_spec.rb
87
+ - spec/inum/define_check_method_spec.rb
88
+ - spec/spec_helper.rb
89
+ homepage: https://github.com/alfa-jpn/inum
90
+ licenses:
91
+ - MIT
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 2.0.3
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: Inum(enumerated type of Integer) provide a java-Enum-like.
113
+ test_files:
114
+ - spec/inum/base_spec.rb
115
+ - spec/inum/define_check_method_spec.rb
116
+ - spec/spec_helper.rb
117
+ has_rdoc: