inum 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.
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: