exnum 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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