booletania 0.0.2 → 0.1.0

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
2
  SHA1:
3
- metadata.gz: 8a7290fd84e48977e1d6b4684d2794a07f6f1c2f
4
- data.tar.gz: 7b2b170dc90d2fb5fcab599f4d742bffebc3c826
3
+ metadata.gz: ede554f41aa09745752edb4854169d4963e1ed95
4
+ data.tar.gz: 5a30b3dafe3f9c28f9219ada50ac9010e0b5fdde
5
5
  SHA512:
6
- metadata.gz: 57c575c2d5c130906903019a03959f2f275e22f76e536aac982be240e7b965533359ccd2c4ba2be45972b2782e264231b7e0dbf4eb1b22b96cb0f2e8f3693218
7
- data.tar.gz: 25362bbda2696e947f631ede4998d6b402e9491ac686b3bddaa3267d7820a348d5f874f6db6cd3d0fa98355ae6b2bf69bf496df6de4942a6c79baa12948e0bc1
6
+ metadata.gz: 7f21d26ce0ae7bad0621cd7845387ab7cfa14d808d49a08a61650385d358f9f851ff5388503f49eef44e3db7bce76362f830091f985ea6a61ae399f65ee45da0
7
+ data.tar.gz: aca04acd22d101420233411e5cd15fe5c5e9f476b7b7a45622b3d48ba19c3f9b219b53bfe7e956e5b3288425335d8800e5d980bd60787316b1c49d85c86b9a4e
data/.travis.yml CHANGED
@@ -1,3 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.0
3
+ - 2.2.9
4
+ - 2.3.5
5
+ - 2.4.3
6
+ - 2.5.0
7
+ before_install:
8
+ - gem update --system
9
+ - gem install bundler -v 1.16.1
10
+ cache: bundler
11
+ before_script:
12
+ - cp config/database.travis.yml config/database.yml
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Booletania
2
2
 
3
- translating AR booleans in I18n files
3
+ [![Build Status](https://travis-ci.org/ryoff/booletania.svg?branch=master)](https://travis-ci.org/ryoff/booletania)
4
+
5
+ Translate ActiveRecord's boolean column
4
6
 
5
7
  ## Installation
6
8
 
@@ -22,7 +24,7 @@ Or install it yourself as:
22
24
 
23
25
  migration
24
26
 
25
- ````ruby
27
+ ```ruby
26
28
  create_table(:invitations) do |t|
27
29
  t.boolean :accepted
28
30
  end
@@ -30,7 +32,7 @@ end
30
32
 
31
33
  model
32
34
 
33
- ````ruby
35
+ ```ruby
34
36
  class Invitation < ActiveRecord::Base
35
37
  include Booletania
36
38
  end
@@ -38,7 +40,16 @@ end
38
40
 
39
41
  i18n
40
42
 
41
- ````ruby
43
+ ```ruby
44
+ ja:
45
+ activerecord:
46
+ attributes:
47
+ invitation/accepted:
48
+ 'true': 承諾
49
+ 'false': 拒否
50
+ ```
51
+ or
52
+ ```ruby
42
53
  ja:
43
54
  booletania:
44
55
  invitation:
@@ -53,7 +64,7 @@ ja:
53
64
  - https://groups.google.com/forum/#!topic/rails-i18n/aL-Ed1Y1KGo
54
65
 
55
66
  ### #xxx_text
56
- ````ruby
67
+ ```ruby
57
68
  invitation.accepted = true
58
69
  invitation.accepted_text # => "承諾"
59
70
 
@@ -68,7 +79,7 @@ invitation.accepted_text # => "accept"
68
79
  ```
69
80
 
70
81
  ### .xxx_options
71
- ````ruby
82
+ ```ruby
72
83
  Invitation.accepted_options # => [['accept', true], ['deny', false]]
73
84
 
74
85
  I18n.locale = :ja
@@ -76,7 +87,7 @@ Invitation.accepted_options # => [["承諾", true], ["拒否", false]]
76
87
  ```
77
88
 
78
89
  for use in form
79
- ````ruby
90
+ ```ruby
80
91
  f.collection_radio_buttons :accepted, Invitation.accepted_options, :last, :first
81
92
  ```
82
93
 
@@ -0,0 +1,4 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: ":memory:"
4
+ timeout: 500
@@ -3,22 +3,22 @@ module Booletania
3
3
  class << self
4
4
  def define_methods!(klass, boolean_columns)
5
5
  boolean_columns.each do |boolean_column|
6
- column_obj = Booletania::Column.new(klass, boolean_column)
6
+ method_obj = Booletania::Method.new(klass, boolean_column)
7
7
 
8
- define_attribute_text(column_obj)
8
+ define_attribute_text(method_obj)
9
9
 
10
- define_attribute_options(column_obj)
10
+ define_attribute_options(method_obj)
11
11
  end
12
12
  end
13
13
 
14
14
  private
15
15
 
16
- def define_attribute_text(column_obj)
17
- column_obj.klass.class_eval column_obj._text, __FILE__, __LINE__ + 1
16
+ def define_attribute_text(method_obj)
17
+ method_obj.klass.class_eval method_obj._text, __FILE__, __LINE__ + 1
18
18
  end
19
19
 
20
- def define_attribute_options(column_obj)
21
- column_obj.klass.class_eval column_obj._options, __FILE__, __LINE__ + 1
20
+ def define_attribute_options(method_obj)
21
+ method_obj.klass.instance_eval method_obj._options, __FILE__, __LINE__ + 1
22
22
  end
23
23
  end
24
24
  end
@@ -0,0 +1,69 @@
1
+ module Booletania
2
+ class Method
3
+ attr_reader :klass, :boolean_column
4
+
5
+ def initialize(klass, boolean_column)
6
+ @klass = klass
7
+ @boolean_column = boolean_column
8
+ end
9
+
10
+ def _text
11
+ i18n_true_keys = i18n_keys('true') + [true.to_s.humanize]
12
+ i18n_false_keys = i18n_keys('false') + [false.to_s.humanize]
13
+ <<-RUBY
14
+ def #{boolean_column.name}_text
15
+ keys = #{boolean_column.name}? ? #{i18n_true_keys} : #{i18n_false_keys}
16
+
17
+ I18n.t(keys[0], default: keys[1..-1])
18
+ end
19
+ RUBY
20
+ end
21
+
22
+ def _options
23
+ path_keys = i18n_path_keys + [{}]
24
+ <<-RUBY
25
+ def #{boolean_column.name}_options
26
+ I18n.t("#{path_keys[0]}", default: #{path_keys[1..-1]}).invert.map { |k, v| [k, v.to_b] }
27
+ end
28
+ RUBY
29
+ end
30
+
31
+ private
32
+
33
+ # For example,
34
+ # [
35
+ # :booletania.invitation.accepted.true,
36
+ # :activerecord.attributes.invitation/accepted.true
37
+ # ]
38
+ # For example,
39
+ # [
40
+ # :booletania.invitation.accepted.false,
41
+ # :activerecord.attributes.invitation/accepted.false
42
+ # ]
43
+ def i18n_keys(true_or_false)
44
+ i18n_path_keys.map do |i18n_path_key|
45
+ (i18n_path_key.to_s + '.' + true_or_false.to_b.to_s).to_sym
46
+ end
47
+ end
48
+
49
+ def i18n_path_keys
50
+ @i18n_path_keys ||= begin
51
+ [].tap do |list|
52
+ list << booletania_i18n_path_key
53
+ list << activerecord_i18n_path_key
54
+ list
55
+ end
56
+ end
57
+ end
58
+
59
+ # For example, :booletania.invitation.accepted
60
+ def booletania_i18n_path_key
61
+ :"booletania.#{klass.name.underscore}.#{boolean_column.name}"
62
+ end
63
+
64
+ # For example, :activerecord.attributes.invitation/accepted
65
+ def activerecord_i18n_path_key
66
+ :"activerecord.attributes.#{klass.name.underscore}/#{boolean_column.name}"
67
+ end
68
+ end
69
+ end
@@ -1,3 +1,3 @@
1
1
  module Booletania
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/booletania.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  require "booletania/version"
2
- require "booletania/column"
2
+ require "booletania/method"
3
3
  require "booletania/attribute"
4
4
 
5
5
  module Booletania
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  included do
9
- fail ArgumentError, "booletania only support ActiveRecord" unless ancestors.include? ActiveRecord::Base
10
- fail ArgumentError, "not found .columns method" unless respond_to? :columns
9
+ raise ArgumentError, "booletania only support ActiveRecord" unless ancestors.include? ActiveRecord::Base
10
+ raise ArgumentError, "not found .columns method" unless respond_to? :columns
11
11
 
12
12
  Booletania::Attribute.define_methods!(self, columns.select{ |column| column.type == :boolean })
13
13
  end
@@ -25,63 +25,187 @@ describe Booletania do
25
25
  end
26
26
 
27
27
  describe "#_text" do
28
- let!(:invitation) { Invitation.create(accepted: accepted) }
28
+ let!(:invitation) { Invitation.create(accepted1: accepted1, accepted2: accepted2, accepted3: accepted3, accepted4: accepted4) }
29
+ let(:accepted1) { true }
30
+ let(:accepted2) { true }
31
+ let(:accepted3) { true }
32
+ let(:accepted4) { true }
29
33
  after { Invitation.delete_all }
30
34
 
31
- subject { invitation.accepted_text }
35
+ shared_examples_for 'translated by :booletania i18n key' do
36
+ context "lang is ja" do
37
+ before { I18n.locale = :ja }
32
38
 
33
- context "lang is ja" do
34
- before { I18n.locale = :ja }
39
+ context "column is true" do
40
+ let(:accepted) { true }
41
+ it { is_expected.to eq '承諾' }
42
+ end
35
43
 
36
- context "column is true" do
37
- let(:accepted) { true }
44
+ context "column is false" do
45
+ let(:accepted) { false }
46
+ it { is_expected.to eq '拒否' }
47
+ end
48
+ end
38
49
 
39
- it { is_expected.to eq '承諾' }
50
+ context "lang is en" do
51
+ before { I18n.locale = :en }
52
+
53
+ context "column is true" do
54
+ let(:accepted) { true }
55
+ it { is_expected.to eq 'accept' }
56
+ end
57
+
58
+ context "column is false" do
59
+ let(:accepted) { false }
60
+ it { is_expected.to eq 'deny' }
61
+ end
40
62
  end
41
63
 
42
- context "column is false" do
43
- let(:accepted) { false }
64
+ context "lans is invalid" do
65
+ before { I18n.locale = :xx }
66
+ let(:accepted) { true }
44
67
 
45
- it { is_expected.to eq '拒否' }
68
+ it { is_expected.to eq 'True' }
46
69
  end
47
70
  end
48
71
 
49
- context "lang is en" do
50
- before { I18n.locale = :en }
72
+ shared_examples_for 'translated by :activerecord i18n key' do
73
+ context "lang is ja" do
74
+ before { I18n.locale = :ja }
51
75
 
52
- context "column is true" do
76
+ context "column is true" do
77
+ let(:accepted) { true }
78
+ it { is_expected.to eq '許可' }
79
+ end
80
+
81
+ context "column is false" do
82
+ let(:accepted) { false }
83
+ it { is_expected.to eq '不可' }
84
+ end
85
+ end
86
+
87
+ context "lang is en" do
88
+ before { I18n.locale = :en }
89
+
90
+ context "column is true" do
91
+ let(:accepted) { true }
92
+ it { is_expected.to eq 'ok' }
93
+ end
94
+
95
+ context "column is false" do
96
+ let(:accepted) { false }
97
+ it { is_expected.to eq 'ng' }
98
+ end
99
+ end
100
+
101
+ context "lans is invalid" do
102
+ before { I18n.locale = :xx }
53
103
  let(:accepted) { true }
54
104
 
55
- it { is_expected.to eq 'accept' }
105
+ it { is_expected.to eq 'True' }
56
106
  end
107
+ end
57
108
 
58
- context "column is false" do
59
- let(:accepted) { false }
109
+ describe "#accepted1_text. has only a :booletania i18n key" do
110
+ subject { invitation.accepted1_text }
111
+ let(:accepted1) { accepted }
112
+ it_behaves_like 'translated by :booletania i18n key'
113
+ end
114
+
115
+ describe "#accepted2_text. has :booletania and :activerecord i18n keys" do
116
+ subject { invitation.accepted2_text }
117
+ let(:accepted2) { accepted }
118
+ it_behaves_like 'translated by :booletania i18n key'
119
+ end
120
+
121
+ describe "#accepted3_text. has only a :activerecord i18n key" do
122
+ subject { invitation.accepted3_text }
123
+ let(:accepted3) { accepted }
124
+ it_behaves_like 'translated by :activerecord i18n key'
125
+ end
126
+
127
+ describe "#accepted4_text. do not have any i18n keys" do
128
+ subject { invitation.accepted4_text }
60
129
 
61
- it { is_expected.to eq 'deny' }
130
+ context "column is true" do
131
+ let(:accepted4) { true }
132
+ it { is_expected.to eq 'True' }
133
+ end
134
+
135
+ context "column is false" do
136
+ let(:accepted4) { false }
137
+ it { is_expected.to eq 'False' }
62
138
  end
63
139
  end
64
140
  end
65
141
 
66
142
  describe "._options" do
67
- subject { Invitation.accepted_options }
143
+ shared_examples_for 'translated by :booletania i18n key' do
144
+ context "lang is ja" do
145
+ before { I18n.locale = :ja }
146
+ it { is_expected.to eq [['承諾', true], ['拒否', false]] }
147
+ end
148
+
149
+ context "lang is en" do
150
+ before { I18n.locale = :en }
151
+ it { is_expected.to eq [['accept', true], ['deny', false]] }
152
+ end
153
+
154
+ context "lans is invalid" do
155
+ before { I18n.locale = :xx }
156
+ it { is_expected.to eq [] }
157
+ end
158
+ end
159
+
160
+ shared_examples_for 'translated by :activerecord i18n key' do
161
+ context "lang is ja" do
162
+ before { I18n.locale = :ja }
163
+ it { is_expected.to eq [['許可', true], ['不可', false]] }
164
+ end
165
+
166
+ context "lang is en" do
167
+ before { I18n.locale = :en }
168
+ it { is_expected.to eq [['ok', true], ['ng', false]] }
169
+ end
68
170
 
69
- context "lang is ja" do
70
- before { I18n.locale = :ja }
171
+ context "lans is invalid" do
172
+ before { I18n.locale = :xx }
173
+ it { is_expected.to eq [] }
174
+ end
175
+ end
71
176
 
72
- it { is_expected.to eq [['承諾', true], ['拒否', false]] }
177
+ describe ".accepted1_options. has only a :booletania i18n key" do
178
+ subject { Invitation.accepted1_options }
179
+ it_behaves_like 'translated by :booletania i18n key'
73
180
  end
74
181
 
75
- context "lang is en" do
76
- before { I18n.locale = :en }
182
+ describe ".accepted2_options. has :booletania and :activerecord i18n keys" do
183
+ subject { Invitation.accepted2_options }
184
+ it_behaves_like 'translated by :booletania i18n key'
185
+ end
77
186
 
78
- it { is_expected.to eq [['accept', true], ['deny', false]] }
187
+ describe ".accepted3_options. has only a :activerecord i18n key" do
188
+ subject { Invitation.accepted3_options }
189
+ it_behaves_like 'translated by :activerecord i18n key'
79
190
  end
80
191
 
81
- context "lans is invalid" do
82
- before { I18n.locale = :xx }
192
+ describe ".accepted4_options. do not have any i18n keys" do
193
+ subject { Invitation.accepted4_options }
83
194
 
84
- it { is_expected.to eq [] }
195
+ context "lang is ja" do
196
+ before { I18n.locale = :ja }
197
+ it { is_expected.to eq [] }
198
+ end
199
+
200
+ context "lang is en" do
201
+ before { I18n.locale = :en }
202
+ it { is_expected.to eq [] }
203
+ end
204
+
205
+ context "lans is invalid" do
206
+ before { I18n.locale = :xx }
207
+ it { is_expected.to eq [] }
208
+ end
85
209
  end
86
210
  end
87
211
  end
@@ -1,6 +1,17 @@
1
1
  en:
2
+ activerecord:
3
+ attributes:
4
+ invitation/accepted2:
5
+ 'true': ok
6
+ 'false': ng
7
+ invitation/accepted3:
8
+ 'true': ok
9
+ 'false': ng
2
10
  booletania:
3
11
  invitation:
4
- accepted:
12
+ accepted1:
13
+ 'true': accept
14
+ 'false': deny
15
+ accepted2:
5
16
  'true': accept
6
17
  'false': deny
@@ -1,6 +1,17 @@
1
1
  ja:
2
+ activerecord:
3
+ attributes:
4
+ invitation/accepted2:
5
+ 'true': 許可
6
+ 'false': 不可
7
+ invitation/accepted3:
8
+ 'true': 許可
9
+ 'false': 不可
2
10
  booletania:
3
11
  invitation:
4
- accepted:
12
+ accepted1:
13
+ 'true': 承諾
14
+ 'false': 拒否
15
+ accepted2:
5
16
  'true': 承諾
6
17
  'false': 拒否
@@ -1,10 +1,17 @@
1
- ActiveRecord::Base.configurations = {'test' => {adapter: 'sqlite3', database: ':memory:'}}
1
+ ActiveRecord::Base.configurations = if ENV['TRAVIS']
2
+ YAML.load_file("config/database.yml")
3
+ else
4
+ { 'test' => { 'adapter' => 'sqlite3', 'database' => ':memory:' } }
5
+ end
2
6
  ActiveRecord::Base.establish_connection :test
3
7
 
4
- class CreateAllTables < ActiveRecord::Migration
8
+ class CreateAllTables < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration[4.2]
5
9
  def self.up
6
10
  create_table(:invitations) do |t|
7
- t.boolean :accepted
11
+ t.boolean :accepted1
12
+ t.boolean :accepted2
13
+ t.boolean :accepted3
14
+ t.boolean :accepted4
8
15
  end
9
16
  end
10
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: booletania
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ryoff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-01 00:00:00.000000000 Z
11
+ date: 2018-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -137,9 +137,10 @@ files:
137
137
  - README.md
138
138
  - Rakefile
139
139
  - booletania.gemspec
140
+ - config/database.travis.yml
140
141
  - lib/booletania.rb
141
142
  - lib/booletania/attribute.rb
142
- - lib/booletania/column.rb
143
+ - lib/booletania/method.rb
143
144
  - lib/booletania/version.rb
144
145
  - spec/booletania_spec.rb
145
146
  - spec/fixtures/locales/en.yml
@@ -166,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
167
  version: '0'
167
168
  requirements: []
168
169
  rubyforge_project:
169
- rubygems_version: 2.2.0
170
+ rubygems_version: 2.5.1
170
171
  signing_key:
171
172
  specification_version: 4
172
173
  summary: translating AR booleans in I18n files
@@ -1,30 +0,0 @@
1
- module Booletania
2
- class Column
3
- attr_accessor :klass, :boolean_column
4
-
5
- def initialize(klass, boolean_column)
6
- @klass = klass
7
- @boolean_column = boolean_column
8
- end
9
-
10
- def booletania_i18n_path
11
- "booletania.#{@klass.name.underscore}.#{@boolean_column.name}"
12
- end
13
-
14
- def _text
15
- <<-RUBY
16
- def #{@boolean_column.name}_text
17
- I18n.t "#{booletania_i18n_path}." + #{@boolean_column.name}.__send__(:to_s), default: #{@boolean_column.name}.__send__(:to_s)
18
- end
19
- RUBY
20
- end
21
-
22
- def _options
23
- <<-RUBY
24
- def self.#{@boolean_column.name}_options
25
- (I18n.t "#{booletania_i18n_path}", default: {}).invert.map { |k, v| [k, v.to_b] }
26
- end
27
- RUBY
28
- end
29
- end
30
- end