progne_tapera 0.5 → 2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2c2a069aea2e81297eeac4d046451dbc3f94601c
4
- data.tar.gz: b71391edfc0e159fbe3897b26181cf8db8042aa5
2
+ SHA256:
3
+ metadata.gz: 453bfbf458de730766d872c7c38bd1f27731adc35ed619afe8202246e37fa9cd
4
+ data.tar.gz: 6e51e656f3c4df6d82fa1c7a6dc28a603c72ed615f712a246a2c2d688d35bce0
5
5
  SHA512:
6
- metadata.gz: 6304fa68a8688b52add3af79d93912a5d0db3af98f15c12a0f6dff3408f4b63d21dcbb787ca72b882c344f0030cf43c1bf2c3b44a817a5b9832905475c670506
7
- data.tar.gz: f0b24325729107a134e6994ca57196f9f18d2e657938b44ad10f2b54be30dad1435b21423c91366dcd859f885b57625cec8ba4793a307987213e30e384a5cb0b
6
+ metadata.gz: 9ce9d7440bbbf8d7adefd0e713f3f9098277d5e75dbc62cd2932f1e54c35f8d520cd5cef0297174b154611de4c9058fa936a15c629bde32743ac1dc1901dbe57
7
+ data.tar.gz: c27f37405a2e5703e0a6b9ed2783237ad4bd74daed09e01caa115a77ae1bf99f3c826b25a2e632789ca041c0ad3f9733795746cf8fe2fb71800f25df116a87d7
data/CHANGELOG.md CHANGED
@@ -1,22 +1,46 @@
1
1
  # Progne Tapera Change Log 枚举库变更日志
2
2
 
3
3
  ## v0.1
4
+
4
5
  1. Enum Item class
5
6
  2. Enum List concern
6
7
  3. Enum Config concern
7
8
  4. Enum Code concern
8
9
 
9
10
  ## v0.1.1
10
- 1. Improved the Ruby Gem Specification to depend on [rails](https://github.com/rails/rails) v4.2
11
+
12
+ 1. Improved the Ruby Gem Specification to depend on [rails](https://github.com/rails/rails) v4.2.
11
13
 
12
14
  ## v0.2
13
- 1. Improved the Enum Config concern to support the customized enum i18n name
15
+
16
+ 1. Improved the Enum Config concern to support the customized enum i18n name.
14
17
 
15
18
  ## v0.3
16
- 1. Improved the Enum Config concern to support the overloaded enum i18n name
19
+
20
+ 1. Improved the Enum Config concern to support the overloaded enum i18n name.
17
21
 
18
22
  ## v0.4
19
- 1. Improved the Enum List concern to add the .``lookup`` method
23
+
24
+ 1. Improved the Enum List concern to add the .``lookup`` method.
20
25
 
21
26
  ## v0.5
22
- 1. Improve the Enum Code concern to be able to be extended by lambda
27
+
28
+ 1. Improved the Enum Config concern to be able to be extended by lambda.
29
+
30
+ ## v0.5.1
31
+
32
+ 1. Improved the Enum config concern for the Item Methods module.
33
+
34
+ ## v0.5.2
35
+
36
+ 1. Improved the Enum Config concern for the Item Methods module.
37
+
38
+ ## v1.0
39
+
40
+ 1. Improved the Ruby Gem Specification to depend on [rails](https://github.com/rails/rails) v6.0, bundler v2.0, rake v13.0, & rspec v3.9.
41
+
42
+ ## v2.0
43
+
44
+ 1. Improved the compatibility for Ruby 3.0.
45
+ 2. Improved the Enum List concern for the Item Methods module.
46
+ 3. Improved the Enum Config concern to remove support for the Item Methods module.
data/Gemfile.lock CHANGED
@@ -1,133 +1,161 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- progne_tapera (0.4)
5
- rails (>= 4.2)
4
+ progne_tapera (2.0)
5
+ rails (~> 6.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actioncable (5.0.0.1)
11
- actionpack (= 5.0.0.1)
12
- nio4r (~> 1.2)
13
- websocket-driver (~> 0.6.1)
14
- actionmailer (5.0.0.1)
15
- actionpack (= 5.0.0.1)
16
- actionview (= 5.0.0.1)
17
- activejob (= 5.0.0.1)
10
+ actioncable (6.1.4)
11
+ actionpack (= 6.1.4)
12
+ activesupport (= 6.1.4)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (6.1.4)
16
+ actionpack (= 6.1.4)
17
+ activejob (= 6.1.4)
18
+ activerecord (= 6.1.4)
19
+ activestorage (= 6.1.4)
20
+ activesupport (= 6.1.4)
21
+ mail (>= 2.7.1)
22
+ actionmailer (6.1.4)
23
+ actionpack (= 6.1.4)
24
+ actionview (= 6.1.4)
25
+ activejob (= 6.1.4)
26
+ activesupport (= 6.1.4)
18
27
  mail (~> 2.5, >= 2.5.4)
19
28
  rails-dom-testing (~> 2.0)
20
- actionpack (5.0.0.1)
21
- actionview (= 5.0.0.1)
22
- activesupport (= 5.0.0.1)
23
- rack (~> 2.0)
24
- rack-test (~> 0.6.3)
29
+ actionpack (6.1.4)
30
+ actionview (= 6.1.4)
31
+ activesupport (= 6.1.4)
32
+ rack (~> 2.0, >= 2.0.9)
33
+ rack-test (>= 0.6.3)
25
34
  rails-dom-testing (~> 2.0)
26
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
27
- actionview (5.0.0.1)
28
- activesupport (= 5.0.0.1)
35
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
36
+ actiontext (6.1.4)
37
+ actionpack (= 6.1.4)
38
+ activerecord (= 6.1.4)
39
+ activestorage (= 6.1.4)
40
+ activesupport (= 6.1.4)
41
+ nokogiri (>= 1.8.5)
42
+ actionview (6.1.4)
43
+ activesupport (= 6.1.4)
29
44
  builder (~> 3.1)
30
- erubis (~> 2.7.0)
45
+ erubi (~> 1.4)
31
46
  rails-dom-testing (~> 2.0)
32
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
33
- activejob (5.0.0.1)
34
- activesupport (= 5.0.0.1)
47
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
48
+ activejob (6.1.4)
49
+ activesupport (= 6.1.4)
35
50
  globalid (>= 0.3.6)
36
- activemodel (5.0.0.1)
37
- activesupport (= 5.0.0.1)
38
- activerecord (5.0.0.1)
39
- activemodel (= 5.0.0.1)
40
- activesupport (= 5.0.0.1)
41
- arel (~> 7.0)
42
- activesupport (5.0.0.1)
51
+ activemodel (6.1.4)
52
+ activesupport (= 6.1.4)
53
+ activerecord (6.1.4)
54
+ activemodel (= 6.1.4)
55
+ activesupport (= 6.1.4)
56
+ activestorage (6.1.4)
57
+ actionpack (= 6.1.4)
58
+ activejob (= 6.1.4)
59
+ activerecord (= 6.1.4)
60
+ activesupport (= 6.1.4)
61
+ marcel (~> 1.0.0)
62
+ mini_mime (>= 1.1.0)
63
+ activesupport (6.1.4)
43
64
  concurrent-ruby (~> 1.0, >= 1.0.2)
44
- i18n (~> 0.7)
45
- minitest (~> 5.1)
46
- tzinfo (~> 1.1)
47
- arel (7.1.4)
48
- builder (3.2.2)
49
- concurrent-ruby (1.0.2)
50
- diff-lcs (1.2.5)
51
- erubis (2.7.0)
52
- globalid (0.3.7)
53
- activesupport (>= 4.1.0)
54
- i18n (0.7.0)
55
- loofah (2.0.3)
65
+ i18n (>= 1.6, < 2)
66
+ minitest (>= 5.1)
67
+ tzinfo (~> 2.0)
68
+ zeitwerk (~> 2.3)
69
+ builder (3.2.4)
70
+ concurrent-ruby (1.1.9)
71
+ crass (1.0.6)
72
+ diff-lcs (1.4.4)
73
+ erubi (1.10.0)
74
+ globalid (0.5.2)
75
+ activesupport (>= 5.0)
76
+ i18n (1.8.10)
77
+ concurrent-ruby (~> 1.0)
78
+ loofah (2.11.0)
79
+ crass (~> 1.0.2)
56
80
  nokogiri (>= 1.5.9)
57
- mail (2.6.4)
58
- mime-types (>= 1.16, < 4)
59
- method_source (0.8.2)
60
- mime-types (3.1)
61
- mime-types-data (~> 3.2015)
62
- mime-types-data (3.2016.0521)
63
- mini_portile2 (2.1.0)
64
- minitest (5.9.1)
65
- nio4r (1.2.1)
66
- nokogiri (1.6.8.1)
67
- mini_portile2 (~> 2.1.0)
68
- rack (2.0.1)
69
- rack-test (0.6.3)
70
- rack (>= 1.0)
71
- rails (5.0.0.1)
72
- actioncable (= 5.0.0.1)
73
- actionmailer (= 5.0.0.1)
74
- actionpack (= 5.0.0.1)
75
- actionview (= 5.0.0.1)
76
- activejob (= 5.0.0.1)
77
- activemodel (= 5.0.0.1)
78
- activerecord (= 5.0.0.1)
79
- activesupport (= 5.0.0.1)
80
- bundler (>= 1.3.0, < 2.0)
81
- railties (= 5.0.0.1)
81
+ mail (2.7.1)
82
+ mini_mime (>= 0.1.1)
83
+ marcel (1.0.1)
84
+ method_source (1.0.0)
85
+ mini_mime (1.1.0)
86
+ mini_portile2 (2.6.1)
87
+ minitest (5.14.4)
88
+ nio4r (2.5.8)
89
+ nokogiri (1.12.2)
90
+ mini_portile2 (~> 2.6.1)
91
+ racc (~> 1.4)
92
+ racc (1.5.2)
93
+ rack (2.2.3)
94
+ rack-test (1.1.0)
95
+ rack (>= 1.0, < 3)
96
+ rails (6.1.4)
97
+ actioncable (= 6.1.4)
98
+ actionmailbox (= 6.1.4)
99
+ actionmailer (= 6.1.4)
100
+ actionpack (= 6.1.4)
101
+ actiontext (= 6.1.4)
102
+ actionview (= 6.1.4)
103
+ activejob (= 6.1.4)
104
+ activemodel (= 6.1.4)
105
+ activerecord (= 6.1.4)
106
+ activestorage (= 6.1.4)
107
+ activesupport (= 6.1.4)
108
+ bundler (>= 1.15.0)
109
+ railties (= 6.1.4)
82
110
  sprockets-rails (>= 2.0.0)
83
- rails-dom-testing (2.0.1)
84
- activesupport (>= 4.2.0, < 6.0)
85
- nokogiri (~> 1.6.0)
86
- rails-html-sanitizer (1.0.3)
87
- loofah (~> 2.0)
88
- railties (5.0.0.1)
89
- actionpack (= 5.0.0.1)
90
- activesupport (= 5.0.0.1)
111
+ rails-dom-testing (2.0.3)
112
+ activesupport (>= 4.2.0)
113
+ nokogiri (>= 1.6)
114
+ rails-html-sanitizer (1.3.0)
115
+ loofah (~> 2.3)
116
+ railties (6.1.4)
117
+ actionpack (= 6.1.4)
118
+ activesupport (= 6.1.4)
91
119
  method_source
92
- rake (>= 0.8.7)
93
- thor (>= 0.18.1, < 2.0)
94
- rake (11.3.0)
95
- rspec (3.5.0)
96
- rspec-core (~> 3.5.0)
97
- rspec-expectations (~> 3.5.0)
98
- rspec-mocks (~> 3.5.0)
99
- rspec-core (3.5.2)
100
- rspec-support (~> 3.5.0)
101
- rspec-expectations (3.5.0)
120
+ rake (>= 0.13)
121
+ thor (~> 1.0)
122
+ rake (13.0.6)
123
+ rspec (3.10.0)
124
+ rspec-core (~> 3.10.0)
125
+ rspec-expectations (~> 3.10.0)
126
+ rspec-mocks (~> 3.10.0)
127
+ rspec-core (3.10.1)
128
+ rspec-support (~> 3.10.0)
129
+ rspec-expectations (3.10.1)
102
130
  diff-lcs (>= 1.2.0, < 2.0)
103
- rspec-support (~> 3.5.0)
104
- rspec-mocks (3.5.0)
131
+ rspec-support (~> 3.10.0)
132
+ rspec-mocks (3.10.2)
105
133
  diff-lcs (>= 1.2.0, < 2.0)
106
- rspec-support (~> 3.5.0)
107
- rspec-support (3.5.0)
108
- sprockets (3.7.0)
134
+ rspec-support (~> 3.10.0)
135
+ rspec-support (3.10.2)
136
+ sprockets (4.0.2)
109
137
  concurrent-ruby (~> 1.0)
110
138
  rack (> 1, < 3)
111
- sprockets-rails (3.2.0)
139
+ sprockets-rails (3.2.2)
112
140
  actionpack (>= 4.0)
113
141
  activesupport (>= 4.0)
114
142
  sprockets (>= 3.0.0)
115
- thor (0.19.1)
116
- thread_safe (0.3.5)
117
- tzinfo (1.2.2)
118
- thread_safe (~> 0.1)
119
- websocket-driver (0.6.4)
143
+ thor (1.1.0)
144
+ tzinfo (2.0.4)
145
+ concurrent-ruby (~> 1.0)
146
+ websocket-driver (0.7.5)
120
147
  websocket-extensions (>= 0.1.0)
121
- websocket-extensions (0.1.2)
148
+ websocket-extensions (0.1.5)
149
+ zeitwerk (2.4.2)
122
150
 
123
151
  PLATFORMS
124
152
  ruby
125
153
 
126
154
  DEPENDENCIES
127
- bundler (~> 1.12)
155
+ bundler (~> 2.0)
128
156
  progne_tapera!
129
- rake (~> 11.3)
130
- rspec (~> 3.5)
157
+ rake (~> 13.0)
158
+ rspec (~> 3.0)
131
159
 
132
160
  BUNDLED WITH
133
- 1.12.5
161
+ 2.2.13
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Progne Tapera
2
2
 
3
+ [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/progne_tapera/frames)
3
4
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](http://opensource.org/licenses/MIT)
5
+
4
6
  [![Gem Version](https://badge.fury.io/rb/progne_tapera.svg)](https://badge.fury.io/rb/progne_tapera)
5
7
  [![Dependency Status](https://gemnasium.com/badges/github.com/topbitdu/progne_tapera.svg)](https://gemnasium.com/github.com/topbitdu/progne_tapera)
6
8
 
@@ -97,21 +99,28 @@ app/types/ethnicity.rb
97
99
  ```ruby
98
100
  class Ethnicity < ActiveRecord::Type::Value
99
101
 
100
- include ProgneTapera::EnumConfig
102
+ # The Item Methods module must be defined before the ``enum :china_ethnicity`` code block, so it could be called there.
103
+ module ItemMethods
101
104
 
102
- enum :china_ethnicity
103
- # 用 :china_ethnicity 指定的 i18n 资源。
105
+ extend ActiveSupport::Concern
104
106
 
105
- module ItemMethods
107
+ included do |includer|
108
+
109
+ def major?
110
+ 'HA'==code
111
+ end
112
+ # Ethnicity::HAN.major? returns true
113
+ # Ethnicity::MONGEL.major? returns false
106
114
 
107
- def major?
108
- 'HA'==code
109
115
  end
110
- # Ethnicity::HAN.major? returns true
111
- # Ethnicity::MONGEL.major? returns false
112
116
 
113
117
  end
114
118
 
119
+ include ProgneTapera::EnumConfig
120
+
121
+ enum :china_ethnicity
122
+ # 用 :china_ethnicity 指定的 i18n 资源。
123
+
115
124
  end
116
125
  ```
117
126
 
@@ -169,19 +178,31 @@ include ProgneTapera::EnumCode
169
178
 
170
179
  ### Enum List concern
171
180
 
172
- The Enum List concern do the following tasks for the includer automatically:
173
- 1. Include the Enumerable module
174
- 2. Define the .enum_name method as: ``enum_name(name = nil)``
175
- 3. Define the .item_defined? method as: ``item_defined?(item)``
176
- 4. Define the .add_item method as: ``add_item(item)``
177
- 5. Define the .safe_add_item method as: ``safe_add_item(item)``
178
- 6. Define the .enum_constants method as: ``enum_constants``
179
- 7. Define the .all method as: ``all``
180
- 8. Define the .selected method as: ``selected(&block)``
181
- 9. Define the .each method as: ``each(&block)``
181
+ The Enum List concern do the following tasks for the includer automatically:
182
+ 1. Include the Enumerable module
183
+
184
+ 2. Define the .enum_name method as: ``enum_name(name = nil)``
185
+
186
+ 3. Define the .item_defined? method as: ``item_defined?(item)``
187
+
188
+ 4. Define the .add_item method as: ``add_item(item)``
189
+
190
+ 5. Define the .safe_add_item method as: ``safe_add_item(item)``
191
+
192
+ 6. Define the .enum_constants method as: ``enum_constants``
193
+
194
+ 7. Define the .all method as: ``all``
195
+
196
+ 8. Define the .selected method as: ``selected(&block)``
197
+
198
+ 9. Define the .each method as: ``each(&block)``
199
+
182
200
  10. Define the .lookup method as: ``lookup(code)``
183
- 11. Define the .form_options method as: ``form_options(&block)``
184
- 12. Define the .deserialize method as: ``deserialize(value)``
201
+
202
+ 11. Define the .form_options method as: ``form_options(&block)``
203
+
204
+ 12. Define the .deserialize method as: ``deserialize(value)``
205
+
185
206
  13. Define the .serialize method as: ``serialize(value)``
186
207
 
187
208
  ```ruby
@@ -194,9 +215,11 @@ Gender.form_options # { '男' => '1', '女' => '2', '未指定' => '9' }
194
215
 
195
216
  ### Enum Config concern
196
217
 
197
- The Enum Config concern do the following tasks for the includer automatically:
198
- 1. Include the Enum List concern
218
+ The Enum Config concern do the following tasks for the includer automatically:
219
+ 1. Include the Enum List concern
220
+
199
221
  2. Define the .enum method as: ``enum(name = nil, localized_name = name, &block)``
222
+
200
223
  3. Define the .overload_enum_i18n method as: ``overload_enum_i18n(localized_name = nil)``
201
224
 
202
225
  config/locales/enum.zh-CN.yml
@@ -239,7 +262,7 @@ Ethnicity::YI.localized_name # '彝'
239
262
 
240
263
  ### Enum Code concern
241
264
 
242
- The Enum Code concern do the following tasks for the includer automatically:
265
+ The Enum Code concern do the following tasks for the includer automatically:
243
266
  1. Define the .code method as: ``code(field, enum)``
244
267
 
245
268
 
data/ROADMAP.md CHANGED
@@ -1,22 +1,46 @@
1
1
  # Progne Tapera Road Map 枚举库线路图
2
2
 
3
3
  ## v0.1
4
+
4
5
  1. Enum Item class
5
6
  2. Enum List concern
6
7
  3. Enum Config concern
7
8
  4. Enum Code concern
8
9
 
9
10
  ## v0.1.1
10
- 1. Improve the Ruby Gem Specification to depend on [rails](https://github.com/rails/rails) v4.2
11
+
12
+ 1. Improve the Ruby Gem Specification to depend on [rails](https://github.com/rails/rails) v4.2.
11
13
 
12
14
  ## v0.2
13
- 1. Improve the Enum Config concern to support the customized enum i18n name
15
+
16
+ 1. Improve the Enum Config concern to support the customized enum i18n name.
14
17
 
15
18
  ## v0.3
16
- 1. Improve the Enum Config concern to support the overloaded enum i18n name
19
+
20
+ 1. Improve the Enum Config concern to support the overloaded enum i18n name.
17
21
 
18
22
  ## v0.4
19
- 1. Improve the Enum List concern to add the .``lookup`` method
23
+
24
+ 1. Improve the Enum List concern to add the .``lookup`` method.
20
25
 
21
26
  ## v0.5
22
- 1. Improve the Enum Code concern to be able to be extended by lambda
27
+
28
+ 1. Improve the Enum Code concern to be able to be extended by lambda.
29
+
30
+ ## v0.5.1
31
+
32
+ 1. Improve the Enum config concern for the Item Methods module.
33
+
34
+ ## v0.5.2
35
+
36
+ 1. Improve the Enum Config concern for the Item Methods module.
37
+
38
+ ## v1.0
39
+
40
+ 1. Improve the Ruby Gem Specification to depend on [rails](https://github.com/rails/rails) v6.0, bundler v2.0, rake v13.0, & rspec v3.9.
41
+
42
+ ## v2.0
43
+
44
+ 1. Improve the compatibility for Ruby 3.0.
45
+ 2. Improve the Enum List concern for the Item Methods module.
46
+ 3. Improve the Enum Config concern to remove support for the Item Methods module.
data/lib/progne_tapera.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'progne_tapera/version'
2
2
 
3
+ require 'rails'
4
+
3
5
  require 'progne_tapera/enum_list'
4
6
  require 'progne_tapera/enum_item'
5
7
  require 'progne_tapera/enum_config'
@@ -1,23 +1,36 @@
1
- module ProgneTapera::EnumCode
1
+ ##
2
+ # Enum Code 是在模型层配置知识层枚举的关注点,提供 .code 宏方法。
2
3
 
3
- extend ActiveSupport::Concern
4
+ module ProgneTapera
4
5
 
5
- included do |includer|
6
- end
6
+ module EnumCode
7
7
 
8
- module ClassMethods
8
+ extend ActiveSupport::Concern
9
9
 
10
- def code(field, enum)
11
- code_field_name = :"#{field}_code"
12
- validates code_field_name, inclusion: enum.all.map { |item| item.code }
13
- instance_eval do
14
- define_method field do
15
- enum.select { |item| item.code==send(code_field_name.to_sym) }.first
16
- end
17
- define_method "#{field}=" do |value|
18
- send "#{code_field_name}=".to_sym, value.code
10
+ included do |includer|
11
+ end
12
+
13
+ #module ClassMethods
14
+ class_methods do
15
+
16
+ ##
17
+ # 为关注的类提供以下逻辑:
18
+ # 1. 验证 ``field``_code 字段的值,是否在枚举类型的定义中。
19
+ # 2. 定义 ``field`` 方法,用于获取枚举型的值。
20
+ # 3. 定义 ``field``= 方法,用于为枚举型字段赋值。
21
+ def code(field, enum)
22
+ code_field_name = :"#{field}_code"
23
+ validates code_field_name, inclusion: enum.all.map { |item| item.code }
24
+ instance_eval do
25
+ define_method field do
26
+ enum.select { |item| item.code==send(code_field_name.to_sym) }.first
27
+ end
28
+ define_method "#{field}=" do |value|
29
+ send "#{code_field_name}=".to_sym, value.code
30
+ end
19
31
  end
20
32
  end
33
+
21
34
  end
22
35
 
23
36
  end
@@ -1,44 +1,66 @@
1
- module ProgneTapera::EnumConfig
1
+ ##
2
+ # Enum Config 是知识层枚举类型的配置关注点。提供 .enum 和 .overload_enum_i18n 方法。
2
3
 
3
- extend ActiveSupport::Concern
4
- include ProgneTapera::EnumList
4
+ module ProgneTapera
5
5
 
6
- included do |includer|
7
- end
6
+ module EnumConfig
8
7
 
9
- module ClassMethods
8
+ extend ActiveSupport::Concern
9
+ include ProgneTapera::EnumList
10
10
 
11
- def enum(name = nil, localized_name = name)
11
+ included do |includer|
12
+ end
12
13
 
13
- if block_given?
14
+ #module ClassMethods
15
+ class_methods do
14
16
 
15
- yield.each do |key, value|
16
- options = value.map { |k, v| [ k.to_sym, v ] }.to_h
17
- code = options.delete :code
18
- safe_add_item ProgneTapera::EnumItem.new(code, key.to_s, options)
19
- end
17
+ ##
18
+ # 为枚举类型提供 .enum 方法。如:
19
+ # enum :gender
20
+ # #
21
+ # enum :gender, :localized_gender
22
+ # 第一个参数是枚举类型在配置文件中存储的枚举项的 key 。
23
+ # 第二个参数是枚举类型在国际化配置文件中存储的枚举项文本的 key 。如果不提供第二个参数,则自动使用第一个参数进行查找。
24
+ def enum(name = nil, localized_name = name)
25
+
26
+ if block_given?
27
+
28
+ yield.each do |key, value|
29
+ options = value.map { |k, v| [ k.to_sym, v ] }.to_h
30
+ #options[:optional] = true if options[:optional].nil?
31
+ code = options.delete :code
32
+ safe_add_item ProgneTapera::EnumItem.new(code, key.to_s, options)
33
+ end
20
34
 
21
- else
35
+ else
22
36
 
23
- name = enum_name(name).to_s
24
- enumerations = Rails.configuration.enum[name]
25
- raise ArgumentError.new("The enum.#{name} was not configured in the config/enum.yml file.") if enumerations.blank?
37
+ name = enum_name(name).to_s
38
+ enumerations = Rails.configuration.enum[name]
39
+ raise ArgumentError.new("The enum.#{name} was not configured in the config/enum.yml file.") if enumerations.blank?
40
+
41
+ enumerations.each do |key, value|
42
+ options = value.map { |k, v| [ k.to_sym, v ] }.to_h
43
+ #options[:optional] = false
44
+ code = options.delete :code
45
+ options[:localized_name] = I18n.t "enum.#{localized_name||name}.#{key}"
46
+ item = ProgneTapera::EnumItem.new code, key, options
47
+
48
+ safe_add_item item
49
+ end
26
50
 
27
- enumerations.each do |key, value|
28
- options = value.map { |k, v| [ k.to_sym, v ] }.to_h
29
- code = options.delete :code
30
- options[:localized_name] = I18n.t "enum.#{localized_name||name}.#{key}"
31
- safe_add_item ProgneTapera::EnumItem.new(code, key, options)
32
51
  end
33
52
 
34
53
  end
35
54
 
36
- end
55
+ ##
56
+ # 为枚举类型提供 .overload_enum_i18n 方法。如:
57
+ # overload_enum_i18n :your_gender_i18n_key
58
+ def overload_enum_i18n(localized_name = nil)
37
59
 
38
- def overload_enum_i18n(localized_name = nil)
60
+ each do |enum_item|
61
+ enum_item.options[:localized_name] = I18n.t "enum.#{localized_name}.#{enum_item.name}"
62
+ end
39
63
 
40
- each do |enum_item|
41
- enum_item.options[:localized_name] = I18n.t "enum.#{localized_name}.#{enum_item.name}"
42
64
  end
43
65
 
44
66
  end
@@ -1,42 +1,53 @@
1
- require 'rails'
1
+ ##
2
+ # Enum Item 是枚举项。
3
+ # enum_item = ProgneTapera::EnumItem.new '1', 'male', { localized_name: '男' }
2
4
 
3
- class ProgneTapera::EnumItem
5
+ module ProgneTapera
4
6
 
5
- attr_reader :code, :name, :options
7
+ class EnumItem
6
8
 
7
- # code = HA (value)
8
- # name = han
9
- # options = { localized_name: '汉' }
10
- # -> constant: HAN
11
- def initialize(code, name, options = {})
9
+ attr_reader :code, :name, :options
12
10
 
13
- raise ArgumentError.new('The code argument is required.') if code.blank?
14
- raise ArgumentError.new('The name argument is required.') if name.blank?
11
+ ##
12
+ # code = HA (value)
13
+ # name = han
14
+ # options = { localized_name: '汉' }
15
+ # -> constant: HAN
16
+ def initialize(code, name, options = {})
15
17
 
16
- @code = code
17
- @name = name
18
- @options = options
18
+ raise ArgumentError.new('The code argument is required.') if code.blank?
19
+ raise ArgumentError.new('The name argument is required.') if name.blank?
19
20
 
20
- @options.each do |key, value|
21
- class_eval do
22
- define_method(key.to_sym) do
23
- @options[key] #value
21
+ @code = code
22
+ @name = name
23
+ @options = options
24
+
25
+ @options.each do |key, value|
26
+ EnumItem.class_eval do
27
+ define_method(key.to_sym) do
28
+ @options[key] #value
29
+ end
24
30
  end
25
31
  end
32
+
26
33
  end
27
34
 
28
- end
35
+ ##
36
+ # 判断两个枚举项的 #code 字段是否相等。
37
+ def ==(that)
38
+ self.code==that.code
39
+ end
29
40
 
30
- def ==(that)
31
- self.code==that.code
32
- end
41
+ ##
42
+ # 根据 #code 字段的值,比较大小。
43
+ def <=>(that)
44
+ self.code<=>that.code
45
+ end
33
46
 
34
- def <=>(that)
35
- self.code<=>that.code
36
- end
47
+ def constant_name
48
+ name.to_s.upcase
49
+ end
37
50
 
38
- def constant_name
39
- name.to_s.upcase
40
51
  end
41
52
 
42
53
  end
@@ -1,80 +1,115 @@
1
- require 'rails'
1
+ ##
2
+ # Enum List 是知识层枚举列表的领域逻辑关注点。
2
3
 
3
- module ProgneTapera::EnumList
4
+ module ProgneTapera
4
5
 
5
- extend ActiveSupport::Concern
6
+ module EnumList
6
7
 
7
- included do |includer|
8
- end
9
-
10
- module ClassMethods
11
-
12
- include Enumerable
13
-
14
- # Define the Enum type
15
- def enum_name(name = nil)
16
- return @enum_name if @enum_name.present?
17
- @enum_name = (name||self.name.demodulize.underscore).to_sym
18
- end
19
-
20
- # Define the Enum Items
21
- def item_defined?(item)
22
- const_defined? item.constant_name
23
- end
24
-
25
- def add_item(item)
26
- raise ArgumentError.new "The #{item.inspect} item should be an instance of ProgneTapera::EnumItem." unless item.is_a? ProgneTapera::EnumItem
27
- raise ArgumentError.new "The #{item.constant_name} enum item was defined already." if item_defined? item
28
-
29
- item_methods_module = "#{self.name}::ItemMethods".safe_constantize
30
- item.class.include item_methods_module if item_methods_module.present?
31
-
32
- const_set item.constant_name, item
33
- end
34
-
35
- def safe_add_item(item)
36
- const_set item.constant_name, item if item.is_a?(ProgneTapera::EnumItem)&&!item_defined?(item)
37
- end
38
-
39
- # Infrastructure for the Enumerable
40
- def enum_constants
41
- constants.select { |constant|
42
- value = const_get constant
43
- value.is_a? ProgneTapera::EnumItem
44
- }
45
- end
46
-
47
- def all
48
- enum_constants.map { |constant| const_get constant }
49
- end
50
-
51
- def selected
52
- block_given? ? yield(all) : all
53
- end
54
-
55
- # Enumerable
56
- def each(&block)
57
- all.each &block
58
- end
8
+ extend ActiveSupport::Concern
59
9
 
60
- # Lookup
61
- def lookup(code)
62
- select { |item| item.code==code }.first
10
+ included do |includer|
63
11
  end
64
12
 
65
- # Form Option
66
- def form_options(&block)
67
- items = block_given? ? selected(&block) : selected
68
- items.map { |item| [ item.localized_name, item.code ] }.to_h
69
- end
70
-
71
- # ActiveRecord::Type::Value
72
- def deserialize(value)
73
- select { |item| item.code==value }
74
- end
13
+ # module ClassMethods
14
+ class_methods do
15
+
16
+ include Enumerable
17
+
18
+ # Define the Enum type
19
+
20
+ ##
21
+ # 向枚举类型提供枚举的配置名。如果不提供配置名则根据枚举类型的名称自动猜测。如:
22
+ # eumu_name
23
+ # # 或
24
+ # enum_name :gender
25
+ def enum_name(name = nil)
26
+ return @enum_name if @enum_name.present?
27
+ @enum_name = (name||self.name.demodulize.underscore).to_sym
28
+ end
29
+
30
+ # Define the Enum Items
31
+
32
+ ##
33
+ # 判断指定的枚举项是否已经定义。如:
34
+ # item_defined? male
35
+ def item_defined?(item)
36
+ const_defined? item.constant_name
37
+ end
38
+
39
+ def add_item(item)
40
+ raise ArgumentError.new "The #{item.inspect} item should be an instance of ProgneTapera::EnumItem." unless item.is_a? ProgneTapera::EnumItem
41
+ raise ArgumentError.new "The #{item.constant_name} enum item was defined already." if item_defined? item
42
+
43
+ const_set item.constant_name, item
44
+ after_add_item item
45
+ end
46
+
47
+ ##
48
+ # 以安全的方式向一个枚举列表中添加一个枚举项。如果该枚举项已经在枚举列表中,则不添加。如:
49
+ # Gender.safe_add_item male
50
+ # Gender.safe_add_item female
51
+ # Gender.safe_add_item male # male won't be added twice.
52
+ def safe_add_item(item)
53
+ const_set item.constant_name, item if item.is_a?(ProgneTapera::EnumItem)&&!item_defined?(item)
54
+ after_add_item item
55
+ end
56
+
57
+ def after_add_item(item)
58
+ item_method_module = "#{self.name}::ItemMethods".safe_constantize
59
+ item.instance_eval do
60
+ item.extend item_method_module
61
+ end if item_method_module.present?
62
+ end
63
+
64
+ # Destroy or Update the Enum Items
65
+ #def clear_optional_items
66
+ #
67
+ #end
68
+
69
+ # Infrastructure for the Enumerable
70
+ def enum_constants
71
+ constants.select { |constant|
72
+ value = const_get constant
73
+ value.is_a? ProgneTapera::EnumItem
74
+ }
75
+ end
76
+
77
+ ##
78
+ # 列出所有的枚举型。如:
79
+ # Gender.all
80
+ def all
81
+ enum_constants.map { |constant| const_get constant }
82
+ end
83
+
84
+ def selected
85
+ block_given? ? yield(all) : all
86
+ end
87
+
88
+ # Enumerable
89
+ def each(&block)
90
+ all.each &block
91
+ end
92
+
93
+ # Lookup
94
+ def lookup(code)
95
+ select { |item| item.code==code }.first
96
+ end
97
+
98
+ # Form Option
99
+ def form_options(&block)
100
+ items = block_given? ? selected(&block) : selected
101
+ items.map { |item| [ item.localized_name, item.code ] }.to_h
102
+ end
103
+
104
+ # ActiveRecord::Type::Value
105
+ def deserialize(value)
106
+ select { |item| item.code==value }
107
+ end
108
+
109
+ def serialize(value)
110
+ value.respond_to?(:code) ? value.code : value
111
+ end
75
112
 
76
- def serialize(value)
77
- value.respond_to?(:code) ? value.code : value
78
113
  end
79
114
 
80
115
  end
@@ -1,3 +1,3 @@
1
1
  module ProgneTapera
2
- VERSION = '0.5'
2
+ VERSION = '2.0'
3
3
  end
@@ -18,10 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = [ 'lib' ]
20
20
 
21
- spec.add_dependency 'rails', '>= 4.2'
21
+ spec.add_dependency 'rails', '~> 6.0'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.12'
24
- spec.add_development_dependency 'rake', '~> 11.3'
25
- spec.add_development_dependency 'rspec', '~> 3.5'
23
+ spec.add_development_dependency 'bundler', '~> 2.0'
24
+ spec.add_development_dependency 'rake', '~> 13.0'
25
+ spec.add_development_dependency 'rspec', '~> 3.0'
26
26
 
27
27
  end
@@ -5,6 +5,7 @@ describe ProgneTapera::EnumList do
5
5
  let :subject do
6
6
  class GenderEnum
7
7
  include ProgneTapera::EnumList
8
+ #include ProgneTapera::EnumConfig
8
9
  module ItemMethods
9
10
  def hello(name)
10
11
  case code
@@ -23,9 +24,9 @@ describe ProgneTapera::EnumList do
23
24
  let :not_specified do ProgneTapera::EnumItem.new '9', :not_specified, localized_name: '未指定' end
24
25
 
25
26
  before :each do
26
- subject.add_item male unless subject.item_defined? male
27
- subject.add_item female unless subject.item_defined? female
28
- subject.add_item not_specified unless subject.item_defined? not_specified
27
+ subject.safe_add_item male
28
+ subject.safe_add_item female
29
+ subject.safe_add_item not_specified
29
30
  end
30
31
 
31
32
  after :each do
metadata CHANGED
@@ -1,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: progne_tapera
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.5'
4
+ version: '2.0'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Topbit Du
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-16 00:00:00.000000000 Z
11
+ date: 2021-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '4.2'
19
+ version: '6.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '4.2'
26
+ version: '6.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.12'
33
+ version: '2.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.12'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '11.3'
47
+ version: '13.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '11.3'
54
+ version: '13.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.5'
61
+ version: '3.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.5'
68
+ version: '3.0'
69
69
  description: Progne Tapera is a Rails-based configurable enumeration implementation.
70
70
  Progne Tapera is the Brown-chested Martin in Latin. Progne Tapera 是基于 Rails 的可配置的枚举实现。Progne
71
71
  Tapera 是棕胸崖燕的拉丁学名。
@@ -98,7 +98,7 @@ homepage: https://github.com/topbitdu/progne_tapera
98
98
  licenses:
99
99
  - MIT
100
100
  metadata: {}
101
- post_install_message:
101
+ post_install_message:
102
102
  rdoc_options: []
103
103
  require_paths:
104
104
  - lib
@@ -113,9 +113,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
113
  - !ruby/object:Gem::Version
114
114
  version: '0'
115
115
  requirements: []
116
- rubyforge_project:
117
- rubygems_version: 2.6.4
118
- signing_key:
116
+ rubygems_version: 3.2.3
117
+ signing_key:
119
118
  specification_version: 4
120
119
  summary: Rails-based configurable enumeration 基于 Rails 的可配置的枚举
121
120
  test_files: