exnum 0.2.0 → 0.3.1

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: a889d91abfec93390a88c459399ecf290eb423aa
4
- data.tar.gz: 0b8ff8395450606497d5fad9ac1b30002393d0eb
2
+ SHA256:
3
+ metadata.gz: a0eb597ee0732dc06f4b3bc40185a72b60e66deef74d5d316375a8d30edc1c91
4
+ data.tar.gz: f7feab5a390467426f4382b878e87dde7da108379474fc4088005407fe256471
5
5
  SHA512:
6
- metadata.gz: 8ae6c85007d53ba42904d20ae51b93bb9b83c4457fd04b360ca001a61f5e03bdd6df34eaf63753f1c1a91c7f7dbae3a366341c966a360da4656cb2d744d94eef
7
- data.tar.gz: a30f52b4f502f79f09f3a36c8ce42bfdb897faab41f913b8663c51f0568c5abeac0b36c2785129d6756898abf44a3d9ed055027be191fc2400cec82db2c11046
6
+ metadata.gz: e7d4dd9a76bc8d775247f57dc616cc00f9b2d290d3a61a560306f72eb0f46711cc35ea6d48ec400ed835fcc9879694fd6bca708bbcb4af7aac7443000f89ce45
7
+ data.tar.gz: b52fcad419966bd7ef14101e0984657e1b3949c03e6e6a6e4e15d2718d612c861d7db995226e57fd7899bec79b0a71634a1d7283a75fd98528fa850e6a793ff9
@@ -0,0 +1,32 @@
1
+ version: 2.1
2
+
3
+ orbs:
4
+ # https://circleci.com/developer/orbs/orb/circleci/ruby?version=1.4.0
5
+ ruby: circleci/ruby@1.4.0
6
+
7
+ jobs:
8
+ build:
9
+ docker:
10
+ - image: 'cimg/ruby:3.1.1'
11
+ steps:
12
+ - checkout
13
+ - restore_cache:
14
+ name: Restore bundle cache
15
+ keys:
16
+ - bundle-3.1
17
+ - run:
18
+ name: Bundle Install
19
+ command: |
20
+ bundle config set --local path 'vendor/bundle'
21
+ bundle install --jobs=4 --retry=3
22
+ - save_cache:
23
+ name: Store bundle cache
24
+ key: bundle-3.1
25
+ paths:
26
+ - vendor/bundle
27
+ - ruby/rspec-test
28
+
29
+ workflows:
30
+ build_and_test:
31
+ jobs:
32
+ - build
data/README.md CHANGED
@@ -1,12 +1,10 @@
1
1
  # Exnum
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/exnum.svg)](https://badge.fury.io/rb/exnum)
4
- [![Build Status](https://travis-ci.org/Kta-M/exnum.svg?branch=master)](https://travis-ci.org/Kta-M/exnum)
5
- [![Code Climate](https://codeclimate.com/github/Kta-M/exnum/badges/gpa.svg)](https://codeclimate.com/github/Kta-M/exnum)
6
- [![Test Coverage](https://codeclimate.com/github/Kta-M/exnum/badges/coverage.svg)](https://codeclimate.com/github/Kta-M/exnum/coverage)
4
+ [![CircleCI](https://circleci.com/gh/Kta-M/exnum.svg?style=svg)](https://circleci.com/gh/Kta-M/exnum)
7
5
 
8
6
  Exnum is enum extention for Rails.
9
- This gem extends enum about i18n and associated parameters.
7
+ This gem extends enum about i18n, associated parameters, and array for select box.
10
8
 
11
9
  ## Installation
12
10
 
@@ -18,30 +16,51 @@ gem 'exnum'
18
16
 
19
17
  And then execute:
20
18
 
21
- $ bundle
19
+ ```
20
+ $ bundle
21
+ ```
22
22
 
23
23
  Or install it yourself as:
24
24
 
25
- $ gem install exnum
25
+ ```
26
+ $ gem install exnum
27
+ ```
26
28
 
27
29
  ## Usage
28
30
 
29
- ActiveRecord:
30
- ```
31
+ ```ruby
31
32
  class User < ActiveRecord::Base
32
33
  # the value of the key "val" defines enum values
33
34
  # and the others defines associated parameters
34
35
  exnum role: {
35
- guest: {val: 10, label: :red },
36
- general: {val: 20, label: :green, permission: false },
37
- admin: {val: 30, label: :blue, permission: true},
36
+ guest: {val: 10, label: :red, selectable: true, },
37
+ general: {val: 20, label: :green, selectable: true, permission: false},
38
+ admin: {val: 30, label: :blue, selectable: false, permission: true},
38
39
  }
39
40
  end
41
+ ```
40
42
 
43
+ ### Assosiated parameter extention
44
+ ```ruby
45
+ User.role_labels
46
+ # => {"guest" => :red, "general" => :green, "admin" => :blue}
47
+ User.role_labels{|p| p[:selectable]}
48
+ # => {"guest" => :red, "general" => :green}
49
+ User.role_permissions
50
+ # => {"guest" => nil, "general" => false, "admin" => true}
41
51
  ```
42
52
 
43
- I18n:
53
+ ```ruby
54
+ user = User.new(role: :general)
55
+ user.role_label
56
+ # => :green
57
+ user.role_permission
58
+ # => false
44
59
  ```
60
+
61
+ ### I18n extention
62
+
63
+ ```yaml
45
64
  ja:
46
65
  activerecord:
47
66
  enum:
@@ -50,47 +69,51 @@ ja:
50
69
  guest: ゲスト
51
70
  general: 一般ユーザー
52
71
  admin: 管理者
53
-
54
72
  ```
55
73
 
56
- Then you can use i18n extention
57
- ```
74
+ ```ruby
58
75
  User.roles_i18n
59
76
  # => {"guest" => "ゲスト", "general" => "一般ユーザー", "admin" => "管理者"}
77
+ User.roles_i18n{|p| p[:selectable]}
78
+ # => {"guest" => "ゲスト", "general" => "一般ユーザー"}
79
+ ```
60
80
 
81
+ ```ruby
61
82
  user = User.new(role: :guest)
62
83
  user.role_i18n
63
84
  # => "ゲスト"
64
85
  ```
65
86
 
66
- and assosiated parameter extention.
87
+ ### Array for select box extention
88
+ ```ruby
89
+ User.roles_for_select
90
+ # => [["ゲスト", "guest"], ["一般ユーザー", "general"], ["管理者", "admin"]]
91
+ User.roles_for_select{|p| p[:selectable]}
92
+ # => [["ゲスト", "guest"], ["一般ユーザー", "general"]]
67
93
  ```
68
- User.role_labels
69
- # => {"guest" => :red, "general" => :green, "admin" => :blue}
70
- User.role_permissions
71
- # => {"guest" => nil, "general" => false, "admin" => true}
72
94
 
73
- user = User.new(role: :general)
74
- user.role_label
75
- # => :green
76
- user.role_permission
77
- # => false
95
+ You can use it like this:
96
+ ```ruby
97
+ <%= f.select :role, User.roles_for_select %>
78
98
  ```
79
99
 
80
- And of cause, you can use methods provided by `enum`.
81
-
82
- `exnum` can also use as well as `enum`.
83
- Then you can use extention only about i18n.
84
- ```
100
+ ### enum
101
+ Of course, you can use methods provided by `enum`.
102
+ ```ruby
85
103
  class User < ActiveRecord::Base
86
104
  exnum role: [:guest, :general, :admin]
87
105
  end
88
106
  ```
89
- ```
107
+ ```ruby
90
108
  class User < ActiveRecord::Base
91
109
  exnum role: {guest: 10, general: 20, admin: 30}
92
110
  end
93
111
  ```
112
+ ```ruby
113
+ class User < ActiveRecord::Base
114
+ exnum role: {guest: 10, general: 20, admin: 30}, _prefix: true
115
+ end
116
+ ```
94
117
 
95
118
  ## Contributing
96
119
 
@@ -104,3 +127,4 @@ end
104
127
 
105
128
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
106
129
 
130
+
data/exnum.gemspec CHANGED
@@ -19,11 +19,12 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency 'activerecord'
23
- spec.add_development_dependency "bundler", "~> 1.12"
24
- spec.add_development_dependency "rake", "~> 10.0"
25
- spec.add_development_dependency "rspec", "~> 3.0"
26
- spec.add_development_dependency "sqlite3", "~> 1.0"
22
+ spec.add_dependency 'activerecord', "~> 7.0"
23
+ spec.add_development_dependency "bundler"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "rspec_junit_formatter"
27
+ spec.add_development_dependency "sqlite3"
27
28
  spec.add_development_dependency "pry-rails"
28
- spec.add_development_dependency "codeclimate-test-reporter"
29
+ spec.add_development_dependency "simplecov"
29
30
  end
@@ -1,8 +1,10 @@
1
1
  module ActiveRecord
2
2
  module Exnum
3
+
3
4
  def self.prepended(base)
4
5
  base.singleton_class.class_eval { self.prepend(ClassMethods) }
5
6
  end
7
+
6
8
  module ClassMethods
7
9
  def extended(base)
8
10
  base.class_attribute(:defined_params, instance_writer: false)
@@ -19,65 +21,77 @@ module ActiveRecord
19
21
  #--------------------------------------------------------------------------
20
22
 
21
23
  def exnum(definitions)
22
- divided_definitions = definitions.inject({enums: {}, params: {}}) do |ret, (name, values)|
23
- if !values.kind_of?(Hash)
24
- ret[:enums][name] = values
25
- else
26
- ret[:enums][name] = extract_enums(name, values)
27
- ret[:params][name] = extract_params(name, values)
24
+ enum_definitions = definitions.each_with_object({}) do |(name, values), ret|
25
+ ret[name] = extract_enums(values)
26
+ end
27
+ enum(**enum_definitions)
28
+
29
+ pram_definitions = definitions.each_with_object({}) do |(name, values), ret|
30
+ next if %i[_prefix _suffix].include?(name)
31
+
32
+ ret[name] = extract_params(values)
33
+ self.send(name.to_s.pluralize).each do |k, v|
34
+ ret[name][k.to_sym] ||= {}
35
+ ret[name][k.to_sym][:val] = v
28
36
  end
29
- ret
30
37
  end
31
38
 
32
- enum(divided_definitions[:enums])
33
- enum_i18n(divided_definitions[:enums])
34
- enum_param(divided_definitions[:params])
39
+ enum_i18n(pram_definitions)
40
+ enum_param(pram_definitions)
41
+ enum_for_select(pram_definitions)
35
42
  end
36
43
 
37
- #--------------------------------------------------------------------------
44
+ #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
38
45
 
39
46
  private
40
- def extract_enums(_name, values)
41
- values.inject({}) do |ret, (field, value)|
47
+ def extract_enums(values)
48
+ return values unless values.kind_of?(Hash)
49
+
50
+ values.each_with_object({}) do |(field, value), ret|
42
51
  ret[field.to_sym] = (value.kind_of?(Hash) ? value[:val] : value)
43
- ret
44
52
  end
45
53
  end
46
54
 
47
- def extract_params(_name, values)
48
- values.inject({}) do |ret, (field, value)|
49
- if value.kind_of?(Hash)
50
- ret[field.to_sym] = value.reject{|k, _| k == :val}
51
- end
52
- ret
55
+ def extract_params(values)
56
+ return {} unless values.kind_of?(Hash)
57
+
58
+ target_values = values.select{|_field, value| value.kind_of?(Hash)}
59
+ target_values.each_with_object({}) do |(field, value), ret|
60
+ ret[field.to_sym] = value
53
61
  end
54
62
  end
55
63
 
56
- def enum_i18n(definitions)
57
- klass = self
58
- definitions.delete(:_prefix)
59
- definitions.delete(:_suffix)
64
+ #--------------------------------------------------------------------------
60
65
 
66
+ def enum_i18n(definitions)
61
67
  definitions.each do |name, values|
68
+ enum_i18n_class_method(name, values)
69
+ enum_i18n_instance_method(name)
70
+ end
71
+ end
62
72
 
63
- # define class method which returns i18n string of each satus
64
- method_name = "#{name.to_s.pluralize}_i18n"
65
- detect_enum_conflict!(name, method_name, true)
66
- klass.singleton_class.send(:define_method, method_name) do
67
- i18n_hash = ActiveSupport::HashWithIndifferentAccess.new
68
- values.inject(i18n_hash) do |ret, (enum_name, _value)|
69
- ret[enum_name] = i18n_string(klass, name, enum_name)
70
- ret
71
- end
73
+ # define class method which returns i18n string of each satus
74
+ def enum_i18n_class_method(name, values)
75
+ klass = self
76
+ method_name = "#{name.to_s.pluralize}_i18n"
77
+ detect_enum_conflict!(name, method_name, true)
78
+ klass.singleton_class.send(:define_method, method_name) do |&block|
79
+ i18n_hash = ActiveSupport::HashWithIndifferentAccess.new
80
+ values.each_with_object(i18n_hash) do |(enum_name, value), ret|
81
+ next if block.present? && !block.call(value)
82
+ ret[enum_name] = i18n_string(klass, name, enum_name)
72
83
  end
84
+ end
85
+ end
73
86
 
74
- # define instance method which returns current i18n string of the instance
75
- method_name = "#{name}_i18n"
76
- detect_enum_conflict!(name, method_name, false)
77
- klass.send(:define_method, method_name) do
78
- status = self.send(name)
79
- status.nil? ? nil : klass.send(:i18n_string, klass, name, status)
80
- end
87
+ # define instance method which returns current i18n string of the instance
88
+ def enum_i18n_instance_method(name)
89
+ klass = self
90
+ method_name = "#{name}_i18n"
91
+ detect_enum_conflict!(name, method_name, false)
92
+ klass.send(:define_method, method_name) do
93
+ status = self.send(name)
94
+ status.nil? ? nil : klass.send(:i18n_string, klass, name, status)
81
95
  end
82
96
  end
83
97
 
@@ -85,36 +99,68 @@ module ActiveRecord
85
99
  I18n.t("#{klass.i18n_scope}.enum.#{klass.model_name.i18n_key}.#{name}.#{enum_name}")
86
100
  end
87
101
 
102
+ #--------------------------------------------------------------------------
103
+
88
104
  def enum_param(definitions)
89
105
  klass = self
90
- klass.defined_params = definitions
106
+ klass.defined_params.merge!(definitions)
91
107
 
92
108
  definitions.each do |name, values|
93
109
  param_names = values.values.map(&:keys).flatten.uniq
94
110
  param_names.each do |param_name|
111
+ enum_param_class_method(name, values, param_name)
112
+ enum_param_instance_method(name, values, param_name)
113
+ end
114
+ end
115
+ end
95
116
 
96
- # define class methods which returns the parameter's values of each status
97
- method_name = "#{name}_#{param_name.to_s.pluralize}"
98
- detect_enum_conflict!(name, method_name, true)
99
- klass.singleton_class.send(:define_method, method_name) do
100
- param_hash = ActiveSupport::HashWithIndifferentAccess.new
101
- values.inject(param_hash) do |ret, (enum_name, params)|
102
- ret[enum_name] = params[param_name]
103
- ret
104
- end
105
- end
106
-
107
- # define instance methods which returns the parameter's current value of the instance
108
- method_name = "#{name}_#{param_name}"
109
- detect_enum_conflict!(name, method_name, false)
110
- define_method(method_name) do
111
- status = self.send(name)
112
- return if status.nil?
113
- defined_params[name][status.to_sym][param_name]
114
- end
117
+ # define class methods which returns the parameter's values of each status
118
+ def enum_param_class_method(name, values, param_name)
119
+ klass = self
120
+ method_name = "#{name}_#{param_name.to_s.pluralize}"
121
+ detect_enum_conflict!(name, method_name, true)
122
+ klass.singleton_class.send(:define_method, method_name) do |&block|
123
+ param_hash = ActiveSupport::HashWithIndifferentAccess.new
124
+ values.each_with_object(param_hash) do |(enum_name, params), ret|
125
+ next if block.present? && !block.call(params)
126
+ ret[enum_name] = params[param_name]
115
127
  end
116
128
  end
117
129
  end
130
+
131
+ # define instance methods which returns the parameter's current value of the instance
132
+ def enum_param_instance_method(name, values, param_name)
133
+ method_name = "#{name}_#{param_name}"
134
+ detect_enum_conflict!(name, method_name, false)
135
+ define_method(method_name) do
136
+ status = self.send(name)
137
+ return if status.nil?
138
+ defined_params[name][status.to_sym][param_name]
139
+ end
140
+ end
141
+
142
+ #--------------------------------------------------------------------------
143
+
144
+ def enum_for_select(definitions)
145
+ definitions.each do |name, values|
146
+ param_names = values.values.map(&:keys).flatten.uniq
147
+ param_names.each do |param_name|
148
+ enum_for_select_class_method(name, values, param_name)
149
+ end
150
+ end
151
+ end
152
+
153
+ # define class methods which returns the array for select box
154
+ def enum_for_select_class_method(name, values, param_name)
155
+ klass = self
156
+ method_name = "#{name.to_s.pluralize}_for_select"
157
+ detect_enum_conflict!(name, method_name, true)
158
+ klass.singleton_class.send(:define_method, method_name) do |&block|
159
+ i18n_hash = klass.send("#{name.to_s.pluralize}_i18n", &block)
160
+ i18n_hash.to_a.map(&:reverse)
161
+ end
162
+ end
163
+
118
164
  end
119
165
  end
120
166
 
data/lib/exnum/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Exnum
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.1"
3
3
  end
metadata CHANGED
@@ -1,85 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exnum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kta-M
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-04 00:00:00.000000000 Z
11
+ date: 2022-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '7.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: '0'
26
+ version: '7.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: '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: '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: '10.0'
47
+ version: '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: '10.0'
54
+ version: '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.0'
61
+ version: '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.0'
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec_junit_formatter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: sqlite3
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: '1.0'
89
+ version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: '1.0'
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: pry-rails
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -95,7 +109,7 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: codeclimate-test-reporter
112
+ name: simplecov
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ">="
@@ -116,9 +130,9 @@ executables: []
116
130
  extensions: []
117
131
  extra_rdoc_files: []
118
132
  files:
133
+ - ".circleci/config.yml"
119
134
  - ".gitignore"
120
135
  - ".rspec"
121
- - ".travis.yml"
122
136
  - CODE_OF_CONDUCT.md
123
137
  - Gemfile
124
138
  - LICENSE.txt
@@ -134,7 +148,7 @@ homepage: https://github.com/Kta-M/exnum
134
148
  licenses:
135
149
  - MIT
136
150
  metadata: {}
137
- post_install_message:
151
+ post_install_message:
138
152
  rdoc_options: []
139
153
  require_paths:
140
154
  - lib
@@ -149,9 +163,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
163
  - !ruby/object:Gem::Version
150
164
  version: '0'
151
165
  requirements: []
152
- rubyforge_project:
153
- rubygems_version: 2.5.1
154
- signing_key:
166
+ rubygems_version: 3.3.3
167
+ signing_key:
155
168
  specification_version: 4
156
169
  summary: Enum extention for Rails
157
170
  test_files: []
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.3.1
5
- before_install: gem install bundler -v 1.12.5
6
- script: CODECLIMATE_REPO_TOKEN=9eff3c4d9a268cc72972edde460103ef26b162565dafa64ef5b86649fd43427f bundle exec rake