def_enum_helper 0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 590ddea64979d3f00a57ed5bf26f468377ca13c7
4
+ data.tar.gz: a362fd79ea34dbe0f1e0ff72190637acf44a7988
5
+ SHA512:
6
+ metadata.gz: b9c5c97a0201046f5bcb2e08eff89a21dc2ad9fd202d3e46cfa3d234497ca3e24fc88ab0135dba49db08fb3a8f14856c40263f2d404fb3bb6c2ab0a8bd14202d
7
+ data.tar.gz: 04aeb46bad251b7ef006b1fd1ac9b5ca5501110e8c6dc0b93d24e24cc7f8767008322aa50c1112d167164850884c3c62423ab5a70aa6435fef3e0fe214a94581
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.gem
11
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in def_enum_helper.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # DefEnumHelper
2
+
3
+ Define very powerful enum class.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'def_enum_helper'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install def_enum_helper
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ # 默认枚举从1开始递增
25
+
26
+ def_enum :YinYang, {YANG: "阳", YIN: "阴"}
27
+
28
+ puts YinYang::YANG # 1
29
+ puts YinYang::YIN # 2
30
+ y = YinYang[1]
31
+ puts y.index # 1
32
+ puts y.display # 阳
33
+ YinYang[:YANG] # same as YinYang[1]
34
+ YinYang["阳"] # same as YinYang[1]
35
+ YinYang.all # 所有枚举的struct array [#<struct index=1, display="阳">, # <struct index=2, display="阴">]
36
+ puts YinYang.count # 2
37
+ YinYang.each{|x| puts x} # <struct index=1, display="阳"> #<struct index=2, display="阴">
38
+ puts YinYang.to_hash_array # [{:index=>1, :display=>"阳"}, {:index=>2, :display=>"阴"}]
39
+ puts YingYang.to_json_array # [{"index":1,"display":"阳"},{"index":2,"display":"阴"}]
40
+ ```
41
+
42
+ ```ruby
43
+ # 自定义枚举整数值
44
+
45
+ def_enum_with_index(:DataOperationType,
46
+ [:INSERT, 3, '插入'],
47
+ [:UPDATE, 4, '修改'],
48
+ [:DELETE, 5, '删除'])
49
+
50
+ puts DataOperationType::INSERT # 3
51
+
52
+ ```
53
+
54
+ ```ruby
55
+ # 自定义枚举对象
56
+ CustomStruct = Struct.new(:index, :display, :short_name)
57
+
58
+ def_enum_struct_with_index(:Country,
59
+ {
60
+ CHINA: CustomStruct.new(1, '中华人民共和国', '中国'),
61
+ USA: CustomStruct.new(2, '美利坚合众国', '美国')
62
+ })
63
+
64
+ Country[:CHINA] # <struct CustomStruct index=1, display="中华人民共和国", short_name="中国">
65
+
66
+ ```
67
+
68
+ ### License
69
+
70
+ (MIT License) - Copyright (c) 2016 Charles Zhang
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "def_enum_helper"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'def_enum_helper/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "def_enum_helper"
8
+ spec.version = DefEnumHelper::VERSION
9
+ spec.authors = ["Charles Zhang"]
10
+ spec.email = ["gis05zc@163.com"]
11
+
12
+ spec.summary = %q{define very powerful enum class}
13
+ spec.homepage = "https://github.com/chinazhangchao/def_enum_helper"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.13"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ end
@@ -0,0 +1,3 @@
1
+ module DefEnumHelper
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,111 @@
1
+ require "def_enum_helper/version"
2
+
3
+ # example
4
+
5
+ # def_enum :YinYang, {YANG: "阳", YIN: "阴"}
6
+
7
+ # puts YinYang::YANG #1
8
+ # puts YinYang::YIN #2
9
+ # y = YinYang[1]
10
+ # puts y.index #1
11
+ # puts y.display #阳
12
+ # puts YinYang[:YANG] #same as YinYang[1]
13
+ # puts YinYang["阳"] #same as YinYang[1]
14
+ # YinYang.all #所有枚举的struct array [#<struct index=1, display="阳">, #<struct index=2, display="阴">]
15
+ # puts YinYang.count #2
16
+ # YinYang.each{|x| puts x} #<struct index=1, display="阳"> #<struct index=2, display="阴">
17
+ # puts YingYang.to_json_array #[{"index":1,"display":"阳"},{"index":2,"display":"阴"}]
18
+
19
+ DEFAULT_ENUM_BASE_INDEX = 1
20
+
21
+ def def_enum(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, index_name: :index, display_name: :display)
22
+ temp_struct = Struct.new(index_name, display_name)
23
+ new_enum_hash = {}
24
+ enum_hash.each do |k, v|
25
+ new_enum_hash[k] = temp_struct.new(0, v)
26
+ end
27
+ def_enum_struct(module_name, new_enum_hash, enum_base: enum_base)
28
+ end
29
+
30
+ def def_enum_struct(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, index_name: :index, display_name: :display)
31
+ i = 0
32
+ set_index = (index_name.to_s + '=').to_sym
33
+ enum_hash.each do |_k, v|
34
+ enum_value = enum_base + i
35
+ v.public_send(set_index, enum_value)
36
+ i += 1
37
+ end
38
+
39
+ def_enum_struct_with_index(module_name, enum_hash, index_name: index_name, display_name: display_name)
40
+ end
41
+
42
+ EnumHelperStruct = Struct.new(:index, :display)
43
+
44
+ def def_enum_with_index(module_name, *value_array)
45
+ h = {}
46
+ value_array.each do |variable|
47
+ h[variable[0]] = EnumHelperStruct.new(variable[1], variable[2])
48
+ end
49
+
50
+ def_enum_struct_with_index module_name, h
51
+ end
52
+
53
+ def define_iterator_methods(m, enum_index_hash)
54
+ m.define_singleton_method(:each) { |&blk| enum_index_hash.each_value { |v| blk.call(v) } }
55
+
56
+ m.define_singleton_method(:all) { enum_index_hash.values }
57
+ end
58
+
59
+ def define_subscript_method(m, enum_index_hash, enum_display_hash)
60
+ divisor = enum_index_hash.count
61
+
62
+ m.define_singleton_method(:from_number) { |n| (n - DEFAULT_ENUM_BASE_INDEX) % divisor + DEFAULT_ENUM_BASE_INDEX }
63
+ m.define_singleton_method(:[]) do |k|
64
+ case k
65
+ when String
66
+ enum_display_hash[k]
67
+ when Symbol
68
+ enum_index_hash[const_get(k)]
69
+ else
70
+ enum_index_hash[from_number(k)]
71
+ end
72
+ end
73
+ end
74
+
75
+ def define_convert_methods(m, enum_index_hash)
76
+ m.define_singleton_method(:to_hash_array) { enum_index_hash.each_value.map(&:to_h) }
77
+
78
+ m.define_singleton_method(:to_json_array) { to_hash_array.to_json }
79
+ end
80
+
81
+ def define_enum_methods(m, enum_index_hash, enum_display_hash)
82
+ define_iterator_methods(m, enum_index_hash)
83
+
84
+ m.define_singleton_method(:include?) { |n| n.is_a?(Symbol) ? constants.include?(n) : enum_index_hash.key?(n) }
85
+
86
+ m.define_singleton_method(:member?) { |n| include?(n) }
87
+
88
+ m.define_singleton_method(:count) { enum_index_hash.count }
89
+
90
+ define_convert_methods(m, enum_index_hash)
91
+
92
+ define_subscript_method(m, enum_index_hash, enum_display_hash)
93
+ end
94
+
95
+ def def_enum_struct_with_index(module_name, enum_hash, index_name: :index, display_name: :display)
96
+ m = Module.new
97
+ enum_index_hash = {}
98
+ enum_display_hash = {}
99
+ i = 0
100
+ enum_hash.each do |k, v|
101
+ enum_value = v.public_send(index_name)
102
+ m.const_set(k, enum_value)
103
+ enum_index_hash[enum_value] = v
104
+ enum_display_hash[v.public_send(display_name)] = v
105
+ i += 1
106
+ end
107
+
108
+ define_enum_methods(m, enum_index_hash, enum_display_hash)
109
+
110
+ Kernel.const_set(module_name, m)
111
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: def_enum_helper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Charles Zhang
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-11-23 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.13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description:
42
+ email:
43
+ - gis05zc@163.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - README.md
51
+ - Rakefile
52
+ - bin/console
53
+ - bin/setup
54
+ - def_enum_helper.gemspec
55
+ - lib/def_enum_helper.rb
56
+ - lib/def_enum_helper/version.rb
57
+ homepage: https://github.com/chinazhangchao/def_enum_helper
58
+ licenses: []
59
+ metadata: {}
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project:
76
+ rubygems_version: 2.6.6
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: define very powerful enum class
80
+ test_files: []