copy_tuner_client 1.2.1 → 1.2.2
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 +4 -4
- data/.vscode/settings.json +3 -0
- data/lib/copy_tuner_client/dotted_hash.rb +22 -4
- data/lib/copy_tuner_client/i18n_backend.rb +8 -8
- data/lib/copy_tuner_client/version.rb +1 -1
- data/spec/copy_tuner_client/dotted_hash_spec.rb +83 -9
- data/spec/copy_tuner_client/i18n_backend_spec.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4c37179f53ed11fd69930c2b4ff36d6597d0e83ab45e749c5711b7bef254ff2d
|
|
4
|
+
data.tar.gz: b67cd75f1997c995ba84bee721267b2ceeb1df236907d71c982b5b2058702dc1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b17a757326468fa69d31d6e86ea684c9f7df6b76b6792429da5cd5d7db0cb0e15392ebdd9f20f66952ebdb7f8770ff3baa636a77f7742134a4053032a2d6e230
|
|
7
|
+
data.tar.gz: a2df2195d3096ff198893298f968c453564f479a98393f6bfe93f133fcbc414fec7bd004142e6d9f680df28dbebb79535813f79fc273c1b0448906784edfd4d2
|
data/.vscode/settings.json
CHANGED
|
@@ -3,7 +3,9 @@ module CopyTunerClient
|
|
|
3
3
|
def to_h(dotted_hash)
|
|
4
4
|
hash = {}
|
|
5
5
|
dotted_hash.to_h.transform_keys(&:to_s).sort.each do |key, value|
|
|
6
|
-
|
|
6
|
+
# Rails i18n標準との互換性のため、特定のキーを適切な型に変換
|
|
7
|
+
converted_value = convert_value_type(key, value)
|
|
8
|
+
_hash = key.split('.').reverse.inject(converted_value) { |memo, _key| { _key => memo } }
|
|
7
9
|
hash.deep_merge!(_hash)
|
|
8
10
|
end
|
|
9
11
|
hash
|
|
@@ -16,8 +18,8 @@ module CopyTunerClient
|
|
|
16
18
|
all_keys.each_with_index do |key, index|
|
|
17
19
|
prefix = "#{key}."
|
|
18
20
|
conflict_keys = ((index + 1)..Float::INFINITY)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
.take_while { |i| all_keys[i]&.start_with?(prefix) }
|
|
22
|
+
.map { |i| all_keys[i] }
|
|
21
23
|
|
|
22
24
|
if conflict_keys.present?
|
|
23
25
|
results[key] = conflict_keys
|
|
@@ -27,6 +29,22 @@ module CopyTunerClient
|
|
|
27
29
|
results
|
|
28
30
|
end
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def convert_value_type(key, value)
|
|
35
|
+
return value unless value.is_a?(String)
|
|
36
|
+
|
|
37
|
+
# Rails i18n標準で数値型として扱われるキー
|
|
38
|
+
if key.end_with?('.precision')
|
|
39
|
+
value.to_i
|
|
40
|
+
# Rails i18n標準で真偽値として扱われるキー
|
|
41
|
+
elsif key.end_with?('.significant', '.strip_insignificant_zeros')
|
|
42
|
+
value == 'true'
|
|
43
|
+
else
|
|
44
|
+
value
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
module_function :to_h, :conflict_keys, :convert_value_type # rubocop:disable Style/AccessModifierDeclarations
|
|
31
49
|
end
|
|
32
50
|
end
|
|
@@ -69,17 +69,18 @@ module CopyTunerClient
|
|
|
69
69
|
key_with_locale = parts.join('.')
|
|
70
70
|
key_without_locale = parts[1..].join('.')
|
|
71
71
|
|
|
72
|
-
if CopyTunerClient::configuration.ignored_keys.include?(key_without_locale)
|
|
73
|
-
CopyTunerClient::configuration.ignored_key_handler.call(IgnoredKey.new("Ignored key: #{key_without_locale}"))
|
|
74
|
-
end
|
|
75
|
-
|
|
76
72
|
# NOTE: local_first_key_regexp にマッチするキーは copy_tuner キャッシュをスキップし、
|
|
77
73
|
# ローカル config/locales(I18n::Backend::Simple)を優先する。段階的にローカルへ移行するための仕組み。
|
|
78
74
|
# ローカルに無い場合は nil(未訳)のまま返し、copy_tuner へのフォールバックも空キー登録も行わない(完全分離)。
|
|
75
|
+
# ignored_keys より先に評価することで、両方にマッチするキーでも確実にローカルへ委譲する。
|
|
79
76
|
if local_first_key?(key_without_locale)
|
|
80
77
|
return super
|
|
81
78
|
end
|
|
82
79
|
|
|
80
|
+
if CopyTunerClient::configuration.ignored_keys.include?(key_without_locale)
|
|
81
|
+
CopyTunerClient::configuration.ignored_key_handler.call(IgnoredKey.new("Ignored key: #{key_without_locale}"))
|
|
82
|
+
end
|
|
83
|
+
|
|
83
84
|
# NOTE: ハッシュ化した場合に削除されるキーに対応するため、最初に完全一致をチェック(旧クライアントの動作を維持)
|
|
84
85
|
# 例: `en.test.key` が `en.test.key.conflict` のように別のキーで上書きされている場合の対応
|
|
85
86
|
exact_match = cache[key_with_locale]
|
|
@@ -87,10 +88,9 @@ module CopyTunerClient
|
|
|
87
88
|
return exact_match
|
|
88
89
|
end
|
|
89
90
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
# return tree_result if tree_result
|
|
91
|
+
ensure_tree_cache_current
|
|
92
|
+
tree_result = lookup_in_tree_cache(parts)
|
|
93
|
+
return tree_result if tree_result
|
|
94
94
|
|
|
95
95
|
content = super
|
|
96
96
|
|
|
@@ -4,25 +4,25 @@ describe CopyTunerClient::DottedHash do
|
|
|
4
4
|
describe ".to_h" do
|
|
5
5
|
subject { CopyTunerClient::DottedHash.to_h(dotted_hash) }
|
|
6
6
|
|
|
7
|
-
context '
|
|
7
|
+
context '空のキーの場合' do
|
|
8
8
|
let(:dotted_hash) { {} }
|
|
9
9
|
|
|
10
10
|
it { is_expected.to eq({}) }
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
context '
|
|
13
|
+
context '1階層のキーの場合' do
|
|
14
14
|
let(:dotted_hash) { { 'key' => 'test value', other_key: 'other value' } }
|
|
15
15
|
|
|
16
16
|
it { is_expected.to eq({ 'key' => 'test value', 'other_key' => 'other value' }) }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
context '
|
|
19
|
+
context 'キーと値の配列の場合' do
|
|
20
20
|
let(:dotted_hash) { [['key', 'test value'], ['other_key', 'other value']] }
|
|
21
21
|
|
|
22
22
|
it { is_expected.to eq({ 'key' => 'test value', 'other_key' => 'other value' }) }
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
context "
|
|
25
|
+
context "複数階層のblurbキーの場合" do
|
|
26
26
|
let(:dotted_hash) do
|
|
27
27
|
{
|
|
28
28
|
'en.test.key' => 'en test value',
|
|
@@ -31,7 +31,7 @@ describe CopyTunerClient::DottedHash do
|
|
|
31
31
|
}
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
it do
|
|
34
|
+
it "正しくネストされたハッシュに変換されること" do
|
|
35
35
|
is_expected.to eq({
|
|
36
36
|
'en' => {
|
|
37
37
|
'test' => {
|
|
@@ -48,7 +48,7 @@ describe CopyTunerClient::DottedHash do
|
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
context "
|
|
51
|
+
context "キーの競合がある場合" do
|
|
52
52
|
let(:dotted_hash) do
|
|
53
53
|
{
|
|
54
54
|
'en.test' => 'invalid value',
|
|
@@ -58,12 +58,86 @@ describe CopyTunerClient::DottedHash do
|
|
|
58
58
|
|
|
59
59
|
it { is_expected.to eq({ 'en' => { 'test' => { 'key' => 'en test value' } } }) }
|
|
60
60
|
end
|
|
61
|
+
|
|
62
|
+
context "Rails i18nの数値precisionキーの場合" do
|
|
63
|
+
let(:dotted_hash) do
|
|
64
|
+
{
|
|
65
|
+
'en.number.currency.format.precision' => '2',
|
|
66
|
+
'en.number.format.precision' => '3',
|
|
67
|
+
}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "precision値を整数に変換する" do
|
|
71
|
+
is_expected.to eq({
|
|
72
|
+
'en' => {
|
|
73
|
+
'number' => {
|
|
74
|
+
'currency' => {
|
|
75
|
+
'format' => {
|
|
76
|
+
'precision' => 2,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
'format' => {
|
|
80
|
+
'precision' => 3,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
})
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context "Rails i18nのbooleanキーの場合" do
|
|
89
|
+
let(:dotted_hash) do
|
|
90
|
+
{
|
|
91
|
+
'en.number.currency.format.significant' => 'false',
|
|
92
|
+
'en.number.format.strip_insignificant_zeros' => 'true',
|
|
93
|
+
}
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "boolean値を実際の真偽値に変換する" do
|
|
97
|
+
is_expected.to eq({
|
|
98
|
+
'en' => {
|
|
99
|
+
'number' => {
|
|
100
|
+
'currency' => {
|
|
101
|
+
'format' => {
|
|
102
|
+
'significant' => false,
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
'format' => {
|
|
106
|
+
'strip_insignificant_zeros' => true,
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
})
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context "Rails i18n以外で似たパターンを含むキーの場合" do
|
|
115
|
+
let(:dotted_hash) do
|
|
116
|
+
{
|
|
117
|
+
'en.custom.precision' => 'custom_value',
|
|
118
|
+
'en.other.significant_value' => 'true',
|
|
119
|
+
}
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "Rails i18nパターンで終わるキーのみ変換する" do
|
|
123
|
+
is_expected.to eq({
|
|
124
|
+
'en' => {
|
|
125
|
+
'custom' => {
|
|
126
|
+
'precision' => 0, # .precision suffix triggers conversion
|
|
127
|
+
},
|
|
128
|
+
'other' => {
|
|
129
|
+
'significant_value' => 'true', # no conversion for non-exact match
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
})
|
|
133
|
+
end
|
|
134
|
+
end
|
|
61
135
|
end
|
|
62
136
|
|
|
63
137
|
describe ".conflict_keys" do
|
|
64
138
|
subject { CopyTunerClient::DottedHash.conflict_keys(dotted_hash) }
|
|
65
139
|
|
|
66
|
-
context '
|
|
140
|
+
context '有効なキーの場合' do
|
|
67
141
|
let(:dotted_hash) do
|
|
68
142
|
{
|
|
69
143
|
'ja.hoge.test' => 'test',
|
|
@@ -74,7 +148,7 @@ describe CopyTunerClient::DottedHash do
|
|
|
74
148
|
it { is_expected.to eq({}) }
|
|
75
149
|
end
|
|
76
150
|
|
|
77
|
-
context '
|
|
151
|
+
context '無効なキーの場合' do
|
|
78
152
|
let(:dotted_hash) do
|
|
79
153
|
{
|
|
80
154
|
'ja.hoge.test' => 'test',
|
|
@@ -85,7 +159,7 @@ describe CopyTunerClient::DottedHash do
|
|
|
85
159
|
}
|
|
86
160
|
end
|
|
87
161
|
|
|
88
|
-
it do
|
|
162
|
+
it "競合するキーが正しく検出されること" do
|
|
89
163
|
is_expected.to eq({
|
|
90
164
|
'ja.fuga.test' => %w[ja.fuga.test.hoge],
|
|
91
165
|
'ja.hoge.test' => %w[ja.hoge.test.fuga ja.hoge.test.hoge],
|
|
@@ -244,7 +244,7 @@ describe 'CopyTunerClient::I18nBackend' do
|
|
|
244
244
|
end
|
|
245
245
|
|
|
246
246
|
# NOTE: 色々考慮する必要があることが分かったため暫定対応として、ツリーキャッシュを使用しないようにしている
|
|
247
|
-
|
|
247
|
+
describe 'ツリー構造のlookup' do # rubocop:disable Metrics/BlockLength
|
|
248
248
|
subject { build_backend }
|
|
249
249
|
|
|
250
250
|
context '完全一致が存在する場合' do
|