Skip to content

Commit 99ae28e

Browse files
BREAKING CHANGE: Use ruby 2.7 'Forward all arguments' syntax: (...) to forward arguments (#78)
BREAKING CHANGE: Hash arguments will throw an error. Keyword arguments must be used instead.
1 parent 1320c3e commit 99ae28e

3 files changed

Lines changed: 25 additions & 47 deletions

File tree

lib/phraseapp-in-context-editor-ruby/adapters/i18n.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
if defined?(I18n)
22
module I18n
33
class << self
4-
def translate_with_phraseapp(*args)
5-
PhraseApp::InContextEditor.backend.translate(*args)
4+
def translate_with_phraseapp(...)
5+
PhraseApp::InContextEditor.backend.translate(...)
66
end
77
alias_method :translate_without_phraseapp, :translate
88
alias_method :translate, :translate_with_phraseapp

lib/phraseapp-in-context-editor-ruby/backend_service.rb

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,49 +9,29 @@ def initialize(args = {})
99
self
1010
end
1111

12-
def translate(*args)
13-
if to_be_translated_without_phraseapp?(args)
14-
# *Ruby 2.7+ keyword arguments warning*
15-
#
16-
# This method uses keyword arguments.
17-
# There is a breaking change in ruby that produces warning with ruby 2.7 and won't work as expected with ruby 3.0
18-
# The "hash" parameter must be passed as keyword argument.
19-
#
20-
# Good:
21-
# I18n.t(:salutation, :gender => 'w', :name => 'Smith')
22-
# I18n.t(:salutation, **{ :gender => 'w', :name => 'Smith' })
23-
# I18n.t(:salutation, **any_hash)
24-
#
25-
# Bad:
26-
# I18n.t(:salutation, { :gender => 'w', :name => 'Smith' })
27-
# I18n.t(:salutation, any_hash)
28-
#
29-
kw_args = args[1]
30-
if kw_args.present?
31-
I18n.translate_without_phraseapp(args[0], **kw_args)
32-
else
33-
I18n.translate_without_phraseapp(args[0])
34-
end
12+
def translate(...)
13+
if to_be_translated_without_phraseapp?(...)
14+
I18n.translate_without_phraseapp(...)
3515
else
36-
phraseapp_delegate_for(args)
16+
phraseapp_delegate_for(...)
3717
end
3818
end
3919

4020
protected
4121

42-
def to_be_translated_without_phraseapp?(args)
43-
PhraseApp::InContextEditor.disabled? || has_been_forced_to_resolve_with_phraseapp?(args)
22+
def to_be_translated_without_phraseapp?(...)
23+
PhraseApp::InContextEditor.disabled? || has_been_forced_to_resolve_with_phraseapp?(...)
4424
end
4525

46-
def has_been_forced_to_resolve_with_phraseapp?(args)
26+
def has_been_forced_to_resolve_with_phraseapp?(*args)
4727
(args.last.is_a?(Hash) && args.last[:resolve] == false)
4828
end
4929

5030
def given_key_from_args(args)
5131
extract_normalized_key_from_args(args)
5232
end
5333

54-
def phraseapp_delegate_for(args)
34+
def phraseapp_delegate_for(*args)
5535
key = given_key_from_args(args)
5636
return nil unless present?(key)
5737

spec/phraseapp-in-context-editor-ruby/backend_service_spec.rb

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@
1616
allow(I18n).to receive(:translate_without_phraseapp).with(key_name).and_return(i18n_translation)
1717
end
1818

19-
subject { phraseapp_service.translate(*args) }
20-
2119
context "phrase is enabled" do
2220
before(:each) do
2321
PhraseApp::InContextEditor.enabled = true
2422
end
2523

2624
context "resolve: false given as argument" do
27-
let(:args) { [key_name, resolve: false] }
25+
subject { phraseapp_service.translate(key_name, resolve: false) }
2826

2927
before(:each) do
3028
allow(I18n).to receive(:translate_without_phraseapp).with(key_name, resolve: false).and_return(i18n_translation)
@@ -34,35 +32,36 @@
3432
end
3533

3634
context "resolve: true given as argument" do
37-
let(:args) { [key_name, resolve: true] }
35+
subject { phraseapp_service.translate(key_name, resolve: true) }
3836

3937
it { is_expected.to be_a String }
4038
it { is_expected.to eql "{{__phrase_foo.bar__}}" }
4139
end
4240

4341
describe "different arguments given" do
4442
context "default array given", vcr: {cassette_name: "fetch list of keys filtered by fallback key names"} do
45-
let(:args) { [:key, {default: [:first_fallback, :second_fallback]}] }
43+
subject { phraseapp_service.translate(:key, default: [:first_fallback, :second_fallback]) }
44+
4645
it { is_expected.to eql "{{__phrase_key__}}" }
4746
end
4847

4948
context "default string given" do
50-
let(:args) { [:key, {default: "first fallback"}] }
49+
subject { phraseapp_service.translate(:key, default: "first fallback") }
5150

5251
it { is_expected.to eql "{{__phrase_key__}}" }
5352
end
5453

5554
context "scope array given" do
55+
subject { phraseapp_service.translate(:key, scope: [:context]) }
5656
let(:context_key_translation) { double }
57-
let(:args) { [:key, {scope: [:context]}] }
5857

5958
it { is_expected.to eql "{{__phrase_context.key__}}" }
6059
end
6160
end
6261
end
6362

6463
context "phrase is disabled" do
65-
let(:args) { [key_name] }
64+
subject { phraseapp_service.translate(key_name) }
6665

6766
before(:each) do
6867
PhraseApp::InContextEditor.enabled = false
@@ -71,7 +70,7 @@
7170
it { is_expected.to eql i18n_translation }
7271

7372
context "given arguments other than key_name" do
74-
let(:args) { [key_name, locale: :ru] }
73+
subject { phraseapp_service.translate(key_name, locale: :ru) }
7574
let(:ru_translation) { double }
7675

7776
before(:each) do
@@ -87,27 +86,26 @@
8786
end
8887

8988
context "default array given" do
90-
let(:args) { [:key, {default: [:first_fallback, :second_fallback]}] }
89+
subject { phraseapp_service.translate(:key, default: [:first_fallback, :second_fallback]) }
9190

9291
it { is_expected.to eql "Translation missing. Options considered were:\n- en.key\n- en.first_fallback\n- en.second_fallback" }
9392
end
9493

9594
context "default string given" do
96-
let(:args) { [:key, {default: "first fallback"}] }
95+
subject { phraseapp_service.translate(:key, default: "first fallback") }
9796

9897
it { is_expected.to eql "first fallback" }
9998
end
10099

101-
context "scope array given" do
102-
let(:context_key_translation) { double }
103-
let(:args) { [:key, {scope: [:context]}] }
100+
context "default string given without key" do
101+
subject { phraseapp_service.translate(default: "first fallback") }
104102

105-
it { is_expected.to eql "Translation missing: en.context.key" }
103+
it { is_expected.to eql "first fallback" }
106104
end
107105

108-
context "scope array given in rails 3 style" do
106+
context "scope array given" do
107+
subject { phraseapp_service.translate(:key, scope: [:context]) }
109108
let(:context_key_translation) { double }
110-
let(:args) { [:key, scope: [:context]] }
111109

112110
it { is_expected.to eql "Translation missing: en.context.key" }
113111
end

0 commit comments

Comments
 (0)