translate_enum 0.1.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 +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README.md +90 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/translate_enum.rb +46 -0
- data/lib/translate_enum/active_record.rb +11 -0
- data/lib/translate_enum/builder.rb +55 -0
- data/lib/translate_enum/version.rb +3 -0
- data/translate_enum.gemspec +30 -0
- metadata +153 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: '0458034e29b34aa38f6ef31d4953f49b251c64d7'
|
|
4
|
+
data.tar.gz: 0fba5acb5a6f1ab53d84cd3fd16c43de285c34a5
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: f98032ffc41ba60eabea064af70fa58c083665bf1378379f79e4ff1a5db9a21554ace3b74290962085f34019879cc9f2602d6d2fc1c8b5098d532c8d44ee05ef
|
|
7
|
+
data.tar.gz: f32895d7d47d84777a602cbb381866f463de14b90852ab7119ab9b9add9a6bad58af105236f4e31d7f9e86721ba08bf862f43699c0e954f025a88735b6e25b70
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
[](https://semaphoreci.com/shlima/translate_enum)
|
|
2
|
+
[](https://codeclimate.com/github/shlima/translate_enum)
|
|
3
|
+
|
|
4
|
+
# TranslateEnum
|
|
5
|
+
|
|
6
|
+
Simple, zero-dependant `enum` translation gem for Rails
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
`gem install translate_enum`
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
Here is a regular use case. ActiveRecord model:
|
|
15
|
+
|
|
16
|
+
```ruby
|
|
17
|
+
class Post < ActiveRecord::Base
|
|
18
|
+
include TranslateEnum
|
|
19
|
+
|
|
20
|
+
enum status: { published: 0, archive: 1 }
|
|
21
|
+
translate_enum :status
|
|
22
|
+
end
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Localization file
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
en:
|
|
29
|
+
activerecord:
|
|
30
|
+
attributes:
|
|
31
|
+
post:
|
|
32
|
+
status_list:
|
|
33
|
+
published: Was published
|
|
34
|
+
archive: Was achieved
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```ruby
|
|
38
|
+
Post.translated_status(:published) #=> "Was published"
|
|
39
|
+
Post.translated_statuses => [["Was published", :published, 0], ["Was achieved", :archive, 1]]
|
|
40
|
+
|
|
41
|
+
@post = Post.new(status: :published)
|
|
42
|
+
@post.translated_status #=> "Was published"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Use in a Form
|
|
46
|
+
|
|
47
|
+
```haml
|
|
48
|
+
= form_for @post do |f|
|
|
49
|
+
= f.select :status, options_for_select(f.object.translated_statuses.map { |translation, k, _v| [translation, k] })
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Extending ActiveRecord
|
|
53
|
+
|
|
54
|
+
Be default you should extend each `ActiveRecord` model manually by including `TranslateEnum` module in it.
|
|
55
|
+
You can extend `ActiveRecord` by requiring `translate_enum/active_record` in initializer or inside yout `Gemfile`:
|
|
56
|
+
|
|
57
|
+
Gemfile:
|
|
58
|
+
|
|
59
|
+
```ruby
|
|
60
|
+
gem 'translate_enum', require: 'translate_enum/active_record'
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Initializer:
|
|
64
|
+
|
|
65
|
+
```ruby
|
|
66
|
+
# config/initializers/translate_enum.rb
|
|
67
|
+
require 'translate_enum/active_record'
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Advanced options
|
|
71
|
+
|
|
72
|
+
```ruby
|
|
73
|
+
class User < ActiveRecord::Base
|
|
74
|
+
enum gender: [:male, :female]
|
|
75
|
+
|
|
76
|
+
translate_enum :gender do |tr|
|
|
77
|
+
tr.i18n_scope = 'activerecord.attributes'
|
|
78
|
+
tr.i18n_key = 'gender_list'
|
|
79
|
+
tr.enum_klass_method_name = 'genders'
|
|
80
|
+
tr.enum_instance_method_name = 'gender'
|
|
81
|
+
tr.method_name_singular = 'translated_gender'
|
|
82
|
+
tr.method_name_plural = 'translated_genders'
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Or even provide your own logic
|
|
86
|
+
def self.translated_gender(key)
|
|
87
|
+
I18n.t(key, scope: 'global.gender_list')
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
```
|
data/Rakefile
ADDED
data/bin/console
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "translate_enum"
|
|
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(__FILE__)
|
data/bin/setup
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
require 'active_support/core_ext/string'
|
|
3
|
+
require 'translate_enum/version'
|
|
4
|
+
require 'translate_enum/builder'
|
|
5
|
+
|
|
6
|
+
module TranslateEnum
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
# include TranslateEnum in ActiveModel or ActiveRecord
|
|
10
|
+
module ClassMethods
|
|
11
|
+
# @example
|
|
12
|
+
# class User < ActiveRecord::Base
|
|
13
|
+
# include TranslateEnum
|
|
14
|
+
# enum status: %i(active archived)
|
|
15
|
+
# translate_enum :status
|
|
16
|
+
# end
|
|
17
|
+
#
|
|
18
|
+
# User.translated_status(:active) #=> "Active translation"
|
|
19
|
+
def translate_enum(attribute, &block)
|
|
20
|
+
builder = Builder.new(self, attribute, &block)
|
|
21
|
+
|
|
22
|
+
# User.translated_status(:active)
|
|
23
|
+
define_singleton_method(builder.method_name_singular) do |key|
|
|
24
|
+
I18n.translate(builder.i18n_location(key), scope: builder.i18n_scope)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @return [Array]
|
|
28
|
+
# @example
|
|
29
|
+
# f.select_field :gender, f.object.class.translated_genders
|
|
30
|
+
define_singleton_method(builder.method_name_plural) do
|
|
31
|
+
public_send(builder.enum_klass_method_name).map do |key, value|
|
|
32
|
+
[public_send(builder.method_name_singular, key), key, value]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @return [String]
|
|
37
|
+
# @example
|
|
38
|
+
# @user.translated_gender
|
|
39
|
+
define_method(builder.method_name_singular) do
|
|
40
|
+
if (key = public_send(builder.enum_instance_method_name)).present?
|
|
41
|
+
self.class.public_send(builder.method_name_singular, key)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Require this fle in order to be +TranslateEnum+ included in +ActiveRecord::Base+
|
|
2
|
+
# @example
|
|
3
|
+
# require 'translate_enum/active_record'
|
|
4
|
+
|
|
5
|
+
require_relative '../translate_enum'
|
|
6
|
+
|
|
7
|
+
unless defined?(ActiveRecord::Base)
|
|
8
|
+
raise NameError, 'TranslateEnum requires ActiveRecord be defined but it is not'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
ActiveRecord::Base.include(TranslateEnum)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module TranslateEnum
|
|
2
|
+
class Builder
|
|
3
|
+
attr_accessor :i18n_scope
|
|
4
|
+
attr_accessor :i18n_key
|
|
5
|
+
|
|
6
|
+
attr_accessor :enum_instance_method_name
|
|
7
|
+
attr_accessor :enum_klass_method_name
|
|
8
|
+
|
|
9
|
+
attr_accessor :method_name_singular
|
|
10
|
+
attr_accessor :method_name_plural
|
|
11
|
+
|
|
12
|
+
attr_reader :model, :attribute
|
|
13
|
+
|
|
14
|
+
# @param model [ActiveModel::Model, ActiveRecord::Base]
|
|
15
|
+
# @param attribute [String]
|
|
16
|
+
def initialize(model, attribute)
|
|
17
|
+
@model = model
|
|
18
|
+
@attribute = attribute
|
|
19
|
+
yield(self) if block_given?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# like "activerecord.attributes" or "activemodel.attributes"
|
|
23
|
+
def i18n_scope
|
|
24
|
+
@i18n_scope ||= "#{model.i18n_scope}.attributes"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def i18n_key
|
|
28
|
+
@i18n_key ||= "#{attribute}_list"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def i18n_location(key)
|
|
32
|
+
"#{model.model_name.i18n_key}.#{i18n_key}.#{key}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @param [String]
|
|
36
|
+
# like "translated_genders"
|
|
37
|
+
def method_name_plural
|
|
38
|
+
@method_name_plural ||= "translated_#{attribute.to_s.pluralize}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param [String]
|
|
42
|
+
# like "translated_gender"
|
|
43
|
+
def method_name_singular
|
|
44
|
+
@method_name_singular ||= "translated_#{attribute.to_s.singularize}"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def enum_klass_method_name
|
|
48
|
+
@enum_klass_method_name ||= attribute.to_s.pluralize
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def enum_instance_method_name
|
|
52
|
+
@enum_instance_method_name ||= attribute
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
|
+
require 'translate_enum/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = 'translate_enum'
|
|
7
|
+
spec.version = TranslateEnum::VERSION
|
|
8
|
+
spec.authors = ['Aliaksandr Shylau']
|
|
9
|
+
spec.email = ['alex.shilov.by@gmail.com']
|
|
10
|
+
spec.summary = 'Rails translate enum'
|
|
11
|
+
spec.description = 'Simple, zero-dependant enum translation gem for Rails'
|
|
12
|
+
spec.homepage = 'https://github.com/shlima/translate_enum'
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
16
|
+
f.match(%r{^(test|spec|features)/})
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
spec.bindir = 'exe'
|
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
21
|
+
spec.require_paths = ['lib']
|
|
22
|
+
|
|
23
|
+
spec.add_dependency 'activesupport'
|
|
24
|
+
spec.add_development_dependency 'pry'
|
|
25
|
+
spec.add_development_dependency 'bundler'
|
|
26
|
+
spec.add_development_dependency 'rake'
|
|
27
|
+
spec.add_development_dependency 'rspec'
|
|
28
|
+
spec.add_development_dependency 'activemodel'
|
|
29
|
+
spec.add_development_dependency 'actionview'
|
|
30
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: translate_enum
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Aliaksandr Shylau
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2017-03-07 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: activesupport
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: pry
|
|
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: bundler
|
|
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: rake
|
|
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
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rspec
|
|
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'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: activemodel
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ">="
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: actionview
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">="
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
description: Simple, zero-dependant enum translation gem for Rails
|
|
112
|
+
email:
|
|
113
|
+
- alex.shilov.by@gmail.com
|
|
114
|
+
executables: []
|
|
115
|
+
extensions: []
|
|
116
|
+
extra_rdoc_files: []
|
|
117
|
+
files:
|
|
118
|
+
- ".gitignore"
|
|
119
|
+
- ".rspec"
|
|
120
|
+
- Gemfile
|
|
121
|
+
- README.md
|
|
122
|
+
- Rakefile
|
|
123
|
+
- bin/console
|
|
124
|
+
- bin/setup
|
|
125
|
+
- lib/translate_enum.rb
|
|
126
|
+
- lib/translate_enum/active_record.rb
|
|
127
|
+
- lib/translate_enum/builder.rb
|
|
128
|
+
- lib/translate_enum/version.rb
|
|
129
|
+
- translate_enum.gemspec
|
|
130
|
+
homepage: https://github.com/shlima/translate_enum
|
|
131
|
+
licenses: []
|
|
132
|
+
metadata: {}
|
|
133
|
+
post_install_message:
|
|
134
|
+
rdoc_options: []
|
|
135
|
+
require_paths:
|
|
136
|
+
- lib
|
|
137
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
138
|
+
requirements:
|
|
139
|
+
- - ">="
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: '0'
|
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
|
+
requirements:
|
|
144
|
+
- - ">="
|
|
145
|
+
- !ruby/object:Gem::Version
|
|
146
|
+
version: '0'
|
|
147
|
+
requirements: []
|
|
148
|
+
rubyforge_project:
|
|
149
|
+
rubygems_version: 2.6.10
|
|
150
|
+
signing_key:
|
|
151
|
+
specification_version: 4
|
|
152
|
+
summary: Rails translate enum
|
|
153
|
+
test_files: []
|