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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70c29e81f0f1972e5b8833b0ab7a9f9b079186f055e7d988b207043930144708
4
- data.tar.gz: 3277c0fc92c99421c183f19356ea49f8830df54c8bfdf2913c1433a4e30e6268
3
+ metadata.gz: 4c37179f53ed11fd69930c2b4ff36d6597d0e83ab45e749c5711b7bef254ff2d
4
+ data.tar.gz: b67cd75f1997c995ba84bee721267b2ceeb1df236907d71c982b5b2058702dc1
5
5
  SHA512:
6
- metadata.gz: f7ca85e2ebd4d5f8634edc0a2b6c4ac1450d35c49e4bd81740c0bf31166ee8937c1cf29a4af4bda9ba5c1bf30d1985282635c9092a8ee2c6b931a0fcdb78c9f2
7
- data.tar.gz: 680d69dcfee71fb565c08a948a41fae83946fd407045e50e4169266fdb83ef366dbb0c4a16326206ef1e7dae646e3d7a375bf98c88e3d5d8217bb1d755acbff4
6
+ metadata.gz: b17a757326468fa69d31d6e86ea684c9f7df6b76b6792429da5cd5d7db0cb0e15392ebdd9f20f66952ebdb7f8770ff3baa636a77f7742134a4053032a2d6e230
7
+ data.tar.gz: a2df2195d3096ff198893298f968c453564f479a98393f6bfe93f133fcbc414fec7bd004142e6d9f680df28dbebb79535813f79fc273c1b0448906784edfd4d2
@@ -8,4 +8,7 @@
8
8
  "cSpell.words": [
9
9
  "mkpath"
10
10
  ],
11
+ "[ruby]": {
12
+ "editor.defaultFormatter": "rubocop.vscode-rubocop",
13
+ }
11
14
  }
@@ -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
- _hash = key.split('.').reverse.inject(value) { |memo, key| { key => memo } }
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
- .take_while { |i| all_keys[i]&.start_with?(prefix) }
20
- .map { |i| all_keys[i] }
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
- module_function :to_h, :conflict_keys
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
- # NOTE: 色々考慮する必要があることが分かったため暫定対応として、ツリーキャッシュを使用しないようにしている
91
- # ensure_tree_cache_current
92
- # tree_result = lookup_in_tree_cache(parts)
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
 
@@ -1,6 +1,6 @@
1
1
  module CopyTunerClient
2
2
  # Client version
3
- VERSION = '1.2.1'.freeze
3
+ VERSION = '1.2.2'.freeze
4
4
 
5
5
  # API version being used to communicate with the server
6
6
  API_VERSION = '2.0'.freeze
@@ -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 'empty keys' do
7
+ context '空のキーの場合' do
8
8
  let(:dotted_hash) { {} }
9
9
 
10
10
  it { is_expected.to eq({}) }
11
11
  end
12
12
 
13
- context 'with single-level keys' do
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 'array of key value pairs' do
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 "with multi-level blurb keys" do
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 "with conflicting keys" do
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 'valid keys' do
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 'invalid keys' do
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
- xdescribe 'ツリー構造のlookup' do # rubocop:disable Metrics/BlockLength
247
+ describe 'ツリー構造のlookup' do # rubocop:disable Metrics/BlockLength
248
248
  subject { build_backend }
249
249
 
250
250
  context '完全一致が存在する場合' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: copy_tuner_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - SonicGarden