rubocop-i18n 2.0.1 → 2.0.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: 62d835699bdabb7e10b8d95d5ce733140f838a2f65dbd029dfb75691dfd58049
4
- data.tar.gz: 4394d46b1b659c1f4cd215fe58909510569a27a7b8526d0f4861fb551dbe2480
3
+ metadata.gz: 298270613b63bb269fc258034c5a16aab14f764e5631540d672a44662e2d8b66
4
+ data.tar.gz: 2422d8f873a23edbbd9873df60af5db71370ceca545b4134a8ea9d7e0f1ffc37
5
5
  SHA512:
6
- metadata.gz: e9f6ef1704638617704d6cb90108f602f68b526c72969ee8c0b7ef55190e4f750ebe9a7ceab0540b1456182ab627857247e7701b055dade0c187dcabcc270e24
7
- data.tar.gz: 1dd88d4249181c8acd93c5a86771aa6205f298370f3432055f65af96cc0edb3f289fc41c9a43ffa53ec69e26d44c6edf78853d2f83ab2b13ed049eb1beeaf5f0
6
+ metadata.gz: 3d4ae45e34a92d3b3eb013929e4fef7ae3fb7967575a55273575edf6032bfcac243e6e320e15a010f8c914032fc7e1e05acc0e14ab155f25d91512ea9e610e0e
7
+ data.tar.gz: 92507187ded035d39a07ae4b967cd97017a1879876c0cb74877fc20d0f04d3606aa6d0ef12b377a8e1e178a46e3da6f1a5d77a7fa995bfa1378ffce8c09d57dd
@@ -9,7 +9,6 @@
9
9
  # Offense count: 6
10
10
  Lint/InterpolationCheck:
11
11
  Exclude:
12
- - 'spec/rubocop/cop/i18n/gettext/decorate_string_formatting_using_interpolation_spec.rb'
13
12
  - 'spec/rubocop/cop/i18n/gettext/decorate_string_spec.rb'
14
13
 
15
14
  # Offense count: 4
@@ -19,11 +18,13 @@ Metrics/AbcSize:
19
18
  # Offense count: 6
20
19
  # Configuration parameters: CountComments, ExcludedMethods.
21
20
  Metrics/BlockLength:
21
+ Enabled: false
22
22
  Max: 61
23
23
 
24
24
  # Offense count: 1
25
25
  # Configuration parameters: CountComments.
26
26
  Metrics/ClassLength:
27
+ Enabled: false
27
28
  Max: 106
28
29
 
29
30
  # Offense count: 3
@@ -47,13 +48,14 @@ Style/Documentation:
47
48
  - 'lib/rubocop/cop/i18n/gettext.rb'
48
49
  - 'lib/rubocop/cop/i18n/gettext/decorate_function_message.rb'
49
50
 
50
- # Offense count: 11
51
+ # Offense count: 12
51
52
  # Configuration parameters: EnforcedStyle.
52
53
  # SupportedStyles: annotated, template, unannotated
53
54
  Style/FormatStringToken:
54
55
  Exclude:
55
56
  - 'spec/rubocop/cop/i18n/gettext/decorate_function_message_spec.rb'
56
57
  - 'spec/rubocop/cop/i18n/gettext/decorate_string_formatting_using_interpolation_spec.rb'
58
+ - 'spec/rubocop/cop/i18n/rails_i18n/decorate_string_formatting_using_interpolation_spec.rb'
57
59
  - 'spec/rubocop/cop/i18n/gettext/decorate_string_formatting_using_percent_spec.rb'
58
60
  - 'spec/rubocop/cop/i18n/gettext/decorate_string_spec.rb'
59
61
 
@@ -62,7 +64,6 @@ Style/FormatStringToken:
62
64
  Style/GuardClause:
63
65
  Exclude:
64
66
  - 'lib/rubocop/cop/i18n/gettext/decorate_function_message.rb'
65
- - 'lib/rubocop/cop/i18n/gettext/decorate_string_formatting_using_interpolation.rb'
66
67
  - 'lib/rubocop/cop/i18n/gettext/decorate_string_formatting_using_percent.rb'
67
68
 
68
69
  # Offense count: 10
@@ -70,7 +71,6 @@ Style/GuardClause:
70
71
  Style/IfUnlessModifier:
71
72
  Exclude:
72
73
  - 'lib/rubocop/cop/i18n/gettext/decorate_function_message.rb'
73
- - 'lib/rubocop/cop/i18n/gettext/decorate_string_formatting_using_interpolation.rb'
74
74
  - 'lib/rubocop/cop/i18n/gettext/decorate_string_formatting_using_percent.rb'
75
75
  - 'lib/rubocop/rspec/cop_helper.rb'
76
76
 
@@ -0,0 +1 @@
1
+ 2.5.6
@@ -1,7 +1,4 @@
1
1
  language: ruby
2
- matrix:
3
- fast_finish: true
4
- include:
5
- - rvm: 2.4.1
2
+ fast_finish: true
6
3
  notifications:
7
- email: false
4
+ email: true
@@ -1,8 +1,19 @@
1
1
  # Change Log
2
2
 
3
- ### master (Unreleased)
3
+ ### [master (Unreleased)](https://github.com/puppetlabs/rubocop-i18n/compare/v2.0.2...master)
4
4
 
5
- * None
5
+ ### [2.0.2](https://github.com/puppetlabs/rubocop-i18n/compare/v2.0.1...v2.0.2)
6
+
7
+ * Add auto-correct for `DecorateString` (#40) Thanks @mvz!
8
+ * Update rake and bundler requirements to be more permissive of newer versions (#43)
9
+
10
+ ### 2.0.1
11
+
12
+ * `chmod` all the files to be world readable and ensured that `gem
13
+ build` doesn't emit any warnings.
14
+ * fixes license name
15
+ * specifies version for pry and rb-readline
16
+ * bump Z version
6
17
 
7
18
  ### 2.0.0
8
19
 
@@ -0,0 +1,5 @@
1
+ # These owners will be the default owners for everything in
2
+ # the repo. Unless a later match takes precedence,
3
+ # @global-owner1 and @global-owner2 will be requested for
4
+ # review when someone opens a pull request.
5
+ * @highb @tphoney
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in rubocop-i18n.gemspec
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Rubocop::I18n
2
2
 
3
+ [![Build Status](https://travis-ci.org/puppetlabs/rubocop-i18n.svg?branch=master)](https://travis-ci.org/puppetlabs/rubocop-i18n)
4
+
3
5
  A set of cops for detecting strings that need i18n decoration in your project.
4
6
 
5
7
  Supports the following framework styles:
@@ -44,6 +46,8 @@ GetText:
44
46
  # If you want custom control of all the cops
45
47
  GetText/DecorateString:
46
48
  Enabled: false
49
+ # Disable the autocorrect
50
+ AutoCorrect: false
47
51
  GetText/DecorateFunctionMessage:
48
52
  Enabled: false
49
53
  GetText/DecorateStringFormattingUsingInterpolation:
@@ -276,6 +280,33 @@ raise(translate("Warning is %{value}") % { value: 'good' })
276
280
  raise(I18n.t("Warning is %{value}") % { value: 'good' })
277
281
  ```
278
282
 
283
+ ### RailsI18n/DecorateStringFormattingUsingInterpolation
284
+
285
+ This cop looks for decorated rails-i18n methods like `t()` and `translate()` and checks that all strings contained
286
+ within do not use string interpolation '#{}'
287
+
288
+ #### Simple decoration of a message
289
+
290
+ Simple message strings should be decorated with the t() function
291
+
292
+ ##### Error message thrown
293
+
294
+ ```
295
+ 't' function, message key string should not contain #{} formatting
296
+ ```
297
+
298
+ ##### Bad
299
+
300
+ ``` ruby
301
+ puts t("path.to.key.with.#{'interpolation'}")
302
+ ```
303
+
304
+ ##### Good
305
+
306
+ ``` ruby
307
+ puts t("path.to.key.with.interpolation")
308
+ ```
309
+
279
310
  ## How to ignore rules in code
280
311
 
281
312
  It may be necessary to ignore a cop for a particular piece of code. We follow standard rubocop idioms.
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'rubocop/i18n'
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubocop/cop/i18n'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubocop'
2
4
  require 'rubocop/cop/i18n/gettext'
3
5
  require 'rubocop/cop/i18n/gettext/decorate_string'
@@ -7,3 +9,4 @@ require 'rubocop/cop/i18n/gettext/decorate_string_formatting_using_percent'
7
9
 
8
10
  require 'rubocop/cop/i18n/rails_i18n'
9
11
  require 'rubocop/cop/i18n/rails_i18n/decorate_string'
12
+ require 'rubocop/cop/i18n/rails_i18n/decorate_string_formatting_using_interpolation'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module I18n
@@ -7,7 +9,8 @@ module RuboCop
7
9
  method_name = node.loc.selector.source
8
10
  return unless GetText.supported_method?(method_name)
9
11
 
10
- _, method_name, *arg_nodes = *node
12
+ method_name = node.method_name
13
+ arg_nodes = node.arguments
11
14
  if !arg_nodes.empty? && !already_decorated?(node) && (contains_string?(arg_nodes) || string_constant?(arg_nodes))
12
15
  message_section = if string_constant?(arg_nodes)
13
16
  arg_nodes[1]
@@ -53,7 +56,7 @@ module RuboCop
53
56
  errors = how_bad_is_it(message_section)
54
57
  return if errors.empty?
55
58
 
56
- error_message = "'#{method_name}' function, "
59
+ error_message = ["'#{method_name}' function, "]
57
60
  errors.each do |error|
58
61
  error_message << 'message string should be decorated. ' if error == :simple
59
62
  error_message << 'message should not be a concatenated string. ' if error == :concatenation
@@ -61,6 +64,7 @@ module RuboCop
61
64
  error_message << 'message should use correctly formatted interpolation. ' if error == :interpolation
62
65
  error_message << 'message should be decorated. ' if error == :no_decoration
63
66
  end
67
+ error_message = error_message.join('\n')
64
68
  add_offense(message_section, message: error_message)
65
69
  end
66
70
 
@@ -37,6 +37,10 @@ module RuboCop
37
37
  check_for_parent_decorator(node)
38
38
  end
39
39
 
40
+ def autocorrect(node)
41
+ single_string_correct(node) if node.str_type?
42
+ end
43
+
40
44
  private
41
45
 
42
46
  def sentence?(node)
@@ -63,11 +67,18 @@ module RuboCop
63
67
  if parent.respond_to?(:type) && parent.send_type?
64
68
  method_name = parent.loc.selector.source
65
69
  return if GetText.supported_decorator?(method_name)
66
- elsif parent.respond_to?(:method_name) && parent.method_name == :[]
70
+ elsif parent.respond_to?(:method_name) && parent.method?(:[])
67
71
  return
68
72
  end
69
73
  add_offense(node, message: 'decorator is missing around sentence')
70
74
  end
75
+
76
+ def single_string_correct(node)
77
+ lambda { |corrector|
78
+ corrector.insert_before(node.source_range, '_(')
79
+ corrector.insert_after(node.source_range, ')')
80
+ }
81
+ end
71
82
  end
72
83
  end
73
84
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module I18n
@@ -25,11 +27,12 @@ module RuboCop
25
27
  decorator_name = node.loc.selector.source
26
28
  return unless GetText.supported_decorator?(decorator_name)
27
29
 
28
- _, method_name, *arg_nodes = *node
29
- if !arg_nodes.empty? && contains_string_formatting_with_interpolation?(arg_nodes)
30
- message_section = arg_nodes[0]
31
- add_offense(message_section, message: "'#{method_name}' function, message string should not contain \#{} formatting")
32
- end
30
+ method_name = node.method_name
31
+ arg_nodes = node.arguments
32
+ return unless !arg_nodes.empty? && contains_string_formatting_with_interpolation?(arg_nodes)
33
+
34
+ message_section = arg_nodes[0]
35
+ add_offense(message_section, message: "'#{method_name}' function, message string should not contain \#{} formatting")
33
36
  end
34
37
 
35
38
  private
@@ -39,19 +42,11 @@ module RuboCop
39
42
  end
40
43
 
41
44
  def contains_string_formatting_with_interpolation?(node)
42
- if node.is_a?(Array)
43
- return node.any? { |n| contains_string_formatting_with_interpolation?(n) }
44
- end
45
-
46
- if node.respond_to?(:type)
47
- if node.str_type? || node.dstr_type?
48
- return string_contains_interpolation_format?(node.source)
49
- end
50
- end
51
-
52
- if node.respond_to?(:children)
53
- return node.children.any? { |child| contains_string_formatting_with_interpolation?(child) }
54
- end
45
+ return node.any? { |n| contains_string_formatting_with_interpolation?(n) } if node.is_a?(Array)
46
+
47
+ return string_contains_interpolation_format?(node.source) if node.respond_to?(:type) && (node.str_type? || node.dstr_type?)
48
+
49
+ return node.children.any? { |child| contains_string_formatting_with_interpolation?(child) } if node.respond_to?(:children)
55
50
 
56
51
  false
57
52
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Cop
3
5
  module I18n
@@ -28,7 +30,8 @@ module RuboCop
28
30
  decorator_name = node.loc.selector.source
29
31
  return unless GetText.supported_decorator?(decorator_name)
30
32
 
31
- _, method_name, *arg_nodes = *node
33
+ method_name = node.method_name
34
+ arg_nodes = node.arguments
32
35
  if !arg_nodes.empty? && contains_string_with_percent_format?(arg_nodes)
33
36
  message_section = arg_nodes[0]
34
37
  add_offense(message_section, message: "'#{method_name}' function, message string should not contain sprintf style formatting (ie %s)")
@@ -6,6 +6,18 @@ module RuboCop
6
6
  # The Rails I18n module contains cops used to lint and enforce the use of strings
7
7
  # in rails applications that want to use the I18n gem.
8
8
  module RailsI18n
9
+ def self.supported_decorators
10
+ %w[
11
+ t
12
+ t!
13
+ translate
14
+ translate!
15
+ ].freeze
16
+ end
17
+
18
+ def self.supported_decorator?(decorator_name)
19
+ supported_decorators.include?(decorator_name)
20
+ end
9
21
  end
10
22
  end
11
23
  end
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module I18n
6
6
  module RailsI18n
7
7
  # This cop is looks for strings that appear to be sentences but are not decorated.
8
- # Sentences are determined by the STRING_REGEXP. (Upper case character, at least one space,
8
+ # Sentences are determined by the SENTENCE_REGEXP. (Upper case character, at least one space,
9
9
  # and sentence punctuation at the end)
10
10
  #
11
11
  # @example
@@ -21,8 +21,59 @@ module RuboCop
21
21
  # t("result_is_good")
22
22
  # I18n.t("result_is_good")
23
23
  #
24
+ # There are several options for configuration.
25
+ #
26
+ # @example IgnoreExceptions: true
27
+ # # OK
28
+ #
29
+ # raise "Some string sentence"
30
+ #
31
+ # @example EnforcedSentenceType: sentence
32
+ # # bad
33
+ #
34
+ # "Result is bad."
35
+ #
36
+ # # good
37
+ #
38
+ # t("result_is_good")
39
+ # I18n.t("result_is_good")
40
+ #
41
+ # @example EnforcedSentenceType: fragmented_sentence
42
+ # # bad
43
+ #
44
+ # "Result is bad" # Contains a capital to start
45
+ # "result is bad." # Ends in punctuation
46
+ #
47
+ # # good
48
+ #
49
+ # t("result_is_good")
50
+ # I18n.t("result_is_good")
51
+ #
52
+ # @example EnforcedSentenceType: fragment
53
+ # # bad
54
+ #
55
+ # "result is bad" # A series of words
56
+ #
57
+ # # good
58
+ #
59
+ # t("result_is_good")
60
+ # I18n.t("result_is_good")
61
+ #
62
+ # @example Regexp: ^only-this-text$
63
+ #
64
+ # # bad
65
+ #
66
+ # "only-this-text"
67
+ #
68
+ # # good
69
+ #
70
+ # "Any other string is fine now"
71
+ # t("only_this_text")
72
+ #
24
73
  class DecorateString < Cop
25
- STRING_REGEXP = /^\s*[[:upper:]][[:alpha:]]*[[:blank:]]+.*[.!?]$/.freeze
74
+ SENTENCE_REGEXP = /^\s*[[:upper:]][[:alpha:]]*[[:blank:]]+.*[.!?]$/.freeze
75
+ FRAGMENTED_SENTENCE_REGEXP = /^\s*([[:upper:]][[:alpha:]]*[[:blank:]]+.*)|([[:alpha:]]*[[:blank:]]+.*[.!?])$/.freeze
76
+ FRAGMENT_REGEXP = /^\s*[[:alpha:]]*[[:blank:]]+.*$/.freeze
26
77
  SUPPORTED_DECORATORS = %w[
27
78
  t
28
79
  t!
@@ -51,7 +102,7 @@ module RuboCop
51
102
  child = node.children[0]
52
103
  if child.is_a?(String)
53
104
  if child.valid_encoding?
54
- child.encode(Encoding::UTF_8).chomp =~ STRING_REGEXP
105
+ child.encode(Encoding::UTF_8).chomp =~ regexp
55
106
  else
56
107
  false
57
108
  end
@@ -62,6 +113,24 @@ module RuboCop
62
113
  end
63
114
  end
64
115
 
116
+ def regexp
117
+ @regexp ||= regexp_from_config || regexp_from_string_type
118
+ end
119
+
120
+ def regexp_from_string_type
121
+ case cop_config['EnforcedSentenceType'].to_s.downcase
122
+ when 'sentence' then SENTENCE_REGEXP
123
+ when 'fragmented_sentence' then FRAGMENTED_SENTENCE_REGEXP
124
+ when 'fragment' then FRAGMENT_REGEXP
125
+ else
126
+ SENTENCE_REGEXP
127
+ end
128
+ end
129
+
130
+ def regexp_from_config
131
+ Regexp.new(cop_config['Regexp']) if cop_config['Regexp']
132
+ end
133
+
65
134
  def dstr_contains_sentence?(node)
66
135
  node.children.any? { |child| sentence?(child) }
67
136
  end
@@ -80,19 +149,19 @@ module RuboCop
80
149
  return true if parent.respond_to?(:method_name) && %i[raise fail].include?(parent.method_name)
81
150
 
82
151
  # Commonly exceptions are initialized manually.
83
- return ignoring_raised_parent?(parent.parent) if parent.respond_to?(:method_name) && parent.method_name == :new
152
+ return ignoring_raised_parent?(parent.parent) if parent.respond_to?(:method_name) && parent.method?(:new)
84
153
 
85
154
  false
86
155
  end
87
156
 
88
157
  def parent_is_indexer?(parent)
89
- parent.respond_to?(:method_name) && parent.method_name == :[]
158
+ parent.respond_to?(:method_name) && parent.method?(:[])
90
159
  end
91
160
 
92
161
  def parent_is_translator?(parent)
93
162
  if parent.respond_to?(:type) && parent.send_type?
94
163
  method_name = parent.loc.selector.source
95
- if supported_decorator?(method_name)
164
+ if RailsI18n.supported_decorator?(method_name)
96
165
  # Implicit receiver is assumed correct.
97
166
  return true if parent.receiver.nil?
98
167
  return true if parent.receiver.children == [nil, :I18n]
@@ -100,10 +169,6 @@ module RuboCop
100
169
  end
101
170
  false
102
171
  end
103
-
104
- def supported_decorator?(decorator_name)
105
- SUPPORTED_DECORATORS.include?(decorator_name)
106
- end
107
172
  end
108
173
  end
109
174
  end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module I18n
6
+ module RailsI18n
7
+ # When using an decorated string to support I18N, any strings inside the decoration should not contain
8
+ # the '#{}' interpolation string as this makes it hard to translate the strings.
9
+ #
10
+ # @example
11
+ #
12
+ # # bad
13
+ #
14
+ # t("status.#{status_string}")
15
+ # t("status." + "accepted")
16
+ #
17
+ # @example
18
+ #
19
+ # # good
20
+ #
21
+ # t("status.accepted")
22
+ #
23
+ class DecorateStringFormattingUsingInterpolation < Cop
24
+ def on_send(node)
25
+ return unless node&.loc&.selector
26
+
27
+ decorator_name = node.loc.selector.source
28
+ return unless RailsI18n.supported_decorator?(decorator_name)
29
+
30
+ method_name = node.method_name
31
+ arg_nodes = node.arguments
32
+ return unless !arg_nodes.empty? && contains_string_formatting_with_interpolation?(arg_nodes)
33
+
34
+ message_section = arg_nodes[0]
35
+ add_offense(message_section, message: error_message(method_name))
36
+ end
37
+
38
+ private
39
+
40
+ def error_message(method_name)
41
+ "'#{method_name}' function, message key string should not contain \#{} formatting"
42
+ end
43
+
44
+ def string_contains_interpolation_format?(str)
45
+ str.match(/\#{[^}]+}/)
46
+ end
47
+
48
+ def contains_string_formatting_with_interpolation?(node)
49
+ return node.any? { |n| contains_string_formatting_with_interpolation?(n) } if node.is_a?(Array)
50
+
51
+ return string_contains_interpolation_format?(node.source) if node.respond_to?(:type) && (node.str_type? || node.dstr_type?)
52
+
53
+ return node.children.any? { |child| contains_string_formatting_with_interpolation?(child) } if node.respond_to?(:children)
54
+
55
+ false
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  rubocop_version = '~> 0.51'
4
6
 
5
7
  Gem::Specification.new do |spec|
6
8
  spec.name = 'rubocop-i18n'
7
- spec.version = '2.0.1'
9
+ spec.version = '2.0.2'
8
10
  spec.authors = ['Puppet', 'Brandon High', 'TP Honey', 'Helen Campbell']
9
11
  spec.email = ['team-modules@puppet.com', 'brandon.high@puppet.com', 'tp@puppet.com', 'helen@puppet.com']
10
12
 
@@ -20,9 +22,9 @@ Gem::Specification.new do |spec|
20
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
23
  spec.require_paths = ['lib']
22
24
 
23
- spec.add_development_dependency 'bundler', '~> 1.14'
24
- spec.add_development_dependency 'pry', '~> 0.12.2'
25
- spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'bundler', '>= 1.17.3'
26
+ spec.add_development_dependency 'pry', '~> 0.13.1'
27
+ spec.add_development_dependency 'rake', '>= 12.3.3'
26
28
  spec.add_development_dependency 'rb-readline', '~> 0.5.5'
27
29
  spec.add_development_dependency 'rspec', '~> 3.0'
28
30
  spec.add_development_dependency 'rubocop', rubocop_version
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-i18n
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
@@ -11,50 +11,50 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2019-08-20 00:00:00.000000000 Z
14
+ date: 2020-05-19 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
- - - "~>"
20
+ - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: '1.14'
22
+ version: 1.17.3
23
23
  type: :development
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - "~>"
27
+ - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '1.14'
29
+ version: 1.17.3
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: pry
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
34
  - - "~>"
35
35
  - !ruby/object:Gem::Version
36
- version: 0.12.2
36
+ version: 0.13.1
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: 0.12.2
43
+ version: 0.13.1
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: rake
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
- - - "~>"
48
+ - - ">="
49
49
  - !ruby/object:Gem::Version
50
- version: '10.0'
50
+ version: 12.3.3
51
51
  type: :development
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
- - - "~>"
55
+ - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: '10.0'
57
+ version: 12.3.3
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rb-readline
60
60
  requirement: !ruby/object:Gem::Requirement
@@ -125,8 +125,10 @@ files:
125
125
  - ".gitignore"
126
126
  - ".rubocop.yml"
127
127
  - ".rubocop_todo.yml"
128
+ - ".ruby-version"
128
129
  - ".travis.yml"
129
130
  - CHANGELOG.md
131
+ - CODEOWNERS
130
132
  - CODE_OF_CONDUCT.md
131
133
  - Gemfile
132
134
  - LICENSE
@@ -143,7 +145,7 @@ files:
143
145
  - lib/rubocop/cop/i18n/gettext/decorate_string_formatting_using_percent.rb
144
146
  - lib/rubocop/cop/i18n/rails_i18n.rb
145
147
  - lib/rubocop/cop/i18n/rails_i18n/decorate_string.rb
146
- - lib/rubocop/rspec/cop_helper.rb
148
+ - lib/rubocop/cop/i18n/rails_i18n/decorate_string_formatting_using_interpolation.rb
147
149
  - rubocop-i18n.gemspec
148
150
  homepage: https://github.com/puppetlabs/rubocop-i18n
149
151
  licenses:
@@ -164,7 +166,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
166
  - !ruby/object:Gem::Version
165
167
  version: '0'
166
168
  requirements: []
167
- rubygems_version: 3.0.6
169
+ rubyforge_project:
170
+ rubygems_version: 2.7.6.2
168
171
  signing_key:
169
172
  specification_version: 4
170
173
  summary: RuboCop rules for i18n
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'tempfile'
4
-
5
- # This module provides methods that make it easier to test Cops.
6
- module CopHelper
7
- extend RSpec::SharedContext
8
-
9
- let(:ruby_version) { 2.2 }
10
- let(:enabled_rails) { false }
11
- let(:rails_version) { false }
12
-
13
- def inspect_source_file(source)
14
- Tempfile.open('tmp') { |f| inspect_source(source, f) }
15
- end
16
-
17
- def inspect_gemfile(source)
18
- inspect_source(source, 'Gemfile')
19
- end
20
-
21
- def inspect_source(source, file = nil)
22
- if source.is_a?(Array) && source.size == 1
23
- raise "Don't use an array for a single line of code: #{source}"
24
- end
25
-
26
- RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
27
- RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
28
- processed_source = parse_source(source, file)
29
- raise 'Error parsing example code' unless processed_source.valid_syntax?
30
-
31
- _investigate(cop, processed_source)
32
- end
33
-
34
- def parse_source(source, file = nil)
35
- source = source.join($RS) if source.is_a?(Array)
36
-
37
- if file && file.respond_to?(:write)
38
- file.write(source)
39
- file.rewind
40
- file = file.path
41
- end
42
-
43
- RuboCop::ProcessedSource.new(source, ruby_version, file)
44
- end
45
-
46
- def autocorrect_source_file(source)
47
- Tempfile.open('tmp') { |f| autocorrect_source(source, f) }
48
- end
49
-
50
- def autocorrect_source(source, file = nil)
51
- cop.instance_variable_get(:@options)[:auto_correct] = true
52
- processed_source = parse_source(source, file)
53
- _investigate(cop, processed_source)
54
-
55
- corrector =
56
- RuboCop::Cop::Corrector.new(processed_source.buffer, cop.corrections)
57
- corrector.rewrite
58
- end
59
-
60
- def autocorrect_source_with_loop(source, file = nil)
61
- loop do
62
- cop.instance_variable_set(:@corrections, [])
63
- new_source = autocorrect_source(source, file)
64
- return new_source if new_source == source
65
-
66
- source = new_source
67
- end
68
- end
69
-
70
- def _investigate(cop, processed_source)
71
- forces = RuboCop::Cop::Force.all.each_with_object([]) do |klass, instances|
72
- next unless cop.join_force?(klass)
73
-
74
- instances << klass.new([cop])
75
- end
76
-
77
- commissioner =
78
- RuboCop::Cop::Commissioner.new([cop], forces, raise_error: true)
79
- commissioner.investigate(processed_source)
80
- commissioner
81
- end
82
- end
83
-
84
- module RuboCop
85
- module Cop
86
- # Monkey-patch Cop for tests to provide easy access to messages and
87
- # highlights.
88
- class Cop
89
- def messages
90
- offenses.sort.map(&:message)
91
- end
92
-
93
- def highlights
94
- offenses.sort.map { |o| o.location.source }
95
- end
96
- end
97
- end
98
- end
99
-
100
- RSpec.configure do |config|
101
- config.include CopHelper
102
- end