i18n-tasks 1.0.14 → 1.1.0

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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +138 -39
  3. data/Rakefile +4 -4
  4. data/bin/i18n-tasks +3 -3
  5. data/config/locales/en.yml +17 -1
  6. data/config/locales/ru.yml +18 -1
  7. data/i18n-tasks.gemspec +28 -38
  8. data/lib/i18n/tasks/base_task.rb +19 -19
  9. data/lib/i18n/tasks/cli.rb +37 -30
  10. data/lib/i18n/tasks/command/collection.rb +4 -4
  11. data/lib/i18n/tasks/command/commander.rb +5 -5
  12. data/lib/i18n/tasks/command/commands/check_prism.rb +126 -0
  13. data/lib/i18n/tasks/command/commands/data.rb +33 -33
  14. data/lib/i18n/tasks/command/commands/eq_base.rb +3 -3
  15. data/lib/i18n/tasks/command/commands/health.rb +6 -5
  16. data/lib/i18n/tasks/command/commands/interpolations.rb +14 -3
  17. data/lib/i18n/tasks/command/commands/meta.rb +6 -6
  18. data/lib/i18n/tasks/command/commands/missing.rb +28 -26
  19. data/lib/i18n/tasks/command/commands/tree.rb +33 -33
  20. data/lib/i18n/tasks/command/commands/usages.rb +24 -24
  21. data/lib/i18n/tasks/command/dsl.rb +1 -1
  22. data/lib/i18n/tasks/command/option_parsers/enum.rb +8 -7
  23. data/lib/i18n/tasks/command/option_parsers/locale.rb +4 -4
  24. data/lib/i18n/tasks/command/options/common.rb +16 -16
  25. data/lib/i18n/tasks/command/options/data.rb +18 -18
  26. data/lib/i18n/tasks/command/options/locales.rb +33 -24
  27. data/lib/i18n/tasks/commands.rb +14 -12
  28. data/lib/i18n/tasks/concurrent/cache.rb +1 -1
  29. data/lib/i18n/tasks/concurrent/cached_value.rb +1 -1
  30. data/lib/i18n/tasks/configuration.rb +26 -20
  31. data/lib/i18n/tasks/console_context.rb +11 -11
  32. data/lib/i18n/tasks/data/adapter/json_adapter.rb +1 -1
  33. data/lib/i18n/tasks/data/adapter/yaml_adapter.rb +5 -5
  34. data/lib/i18n/tasks/data/file_formats.rb +3 -3
  35. data/lib/i18n/tasks/data/file_system.rb +5 -5
  36. data/lib/i18n/tasks/data/file_system_base.rb +26 -26
  37. data/lib/i18n/tasks/data/language_names.rb +202 -0
  38. data/lib/i18n/tasks/data/router/conservative_router.rb +3 -3
  39. data/lib/i18n/tasks/data/router/isolating_router.rb +19 -19
  40. data/lib/i18n/tasks/data/router/pattern_router.rb +5 -5
  41. data/lib/i18n/tasks/data/tree/node.rb +27 -27
  42. data/lib/i18n/tasks/data/tree/nodes.rb +10 -10
  43. data/lib/i18n/tasks/data/tree/siblings.rb +20 -20
  44. data/lib/i18n/tasks/data/tree/traversal.rb +5 -5
  45. data/lib/i18n/tasks/data.rb +4 -4
  46. data/lib/i18n/tasks/html_keys.rb +2 -2
  47. data/lib/i18n/tasks/ignore_keys.rb +9 -9
  48. data/lib/i18n/tasks/interpolations.rb +21 -1
  49. data/lib/i18n/tasks/key_pattern_matching.rb +8 -8
  50. data/lib/i18n/tasks/logging.rb +2 -1
  51. data/lib/i18n/tasks/missing_keys.rb +24 -8
  52. data/lib/i18n/tasks/plural_keys.rb +6 -4
  53. data/lib/i18n/tasks/references.rb +4 -4
  54. data/lib/i18n/tasks/reports/base.rb +18 -14
  55. data/lib/i18n/tasks/reports/terminal.rb +64 -47
  56. data/lib/i18n/tasks/scanners/ast_matchers/base_matcher.rb +3 -3
  57. data/lib/i18n/tasks/scanners/ast_matchers/default_i18n_subject_matcher.rb +3 -3
  58. data/lib/i18n/tasks/scanners/ast_matchers/message_receivers_matcher.rb +10 -10
  59. data/lib/i18n/tasks/scanners/ast_matchers/rails_model_matcher.rb +2 -2
  60. data/lib/i18n/tasks/scanners/erb_ast_scanner.rb +69 -10
  61. data/lib/i18n/tasks/scanners/file_scanner.rb +5 -5
  62. data/lib/i18n/tasks/scanners/files/caching_file_finder.rb +3 -3
  63. data/lib/i18n/tasks/scanners/files/caching_file_finder_provider.rb +3 -3
  64. data/lib/i18n/tasks/scanners/files/caching_file_reader.rb +2 -2
  65. data/lib/i18n/tasks/scanners/files/file_finder.rb +8 -8
  66. data/lib/i18n/tasks/scanners/files/file_reader.rb +1 -1
  67. data/lib/i18n/tasks/scanners/local_ruby_parser.rb +9 -9
  68. data/lib/i18n/tasks/scanners/occurrence_from_position.rb +1 -1
  69. data/lib/i18n/tasks/scanners/pattern_mapper.rb +7 -7
  70. data/lib/i18n/tasks/scanners/pattern_scanner.rb +20 -20
  71. data/lib/i18n/tasks/scanners/pattern_with_scope_scanner.rb +8 -8
  72. data/lib/i18n/tasks/scanners/prism_scanners/arguments_visitor.rb +48 -0
  73. data/lib/i18n/tasks/scanners/prism_scanners/nodes.rb +374 -0
  74. data/lib/i18n/tasks/scanners/prism_scanners/visitor.rb +337 -0
  75. data/lib/i18n/tasks/scanners/relative_keys.rb +8 -8
  76. data/lib/i18n/tasks/scanners/results/key_occurrences.rb +3 -3
  77. data/lib/i18n/tasks/scanners/results/occurrence.rb +14 -10
  78. data/lib/i18n/tasks/scanners/ruby_ast_call_finder.rb +1 -1
  79. data/lib/i18n/tasks/scanners/ruby_key_literals.rb +6 -6
  80. data/lib/i18n/tasks/scanners/ruby_parser_factory.rb +27 -0
  81. data/lib/i18n/tasks/scanners/ruby_scanner.rb +225 -0
  82. data/lib/i18n/tasks/scanners/scanner.rb +2 -2
  83. data/lib/i18n/tasks/scanners/scanner_multiplexer.rb +1 -1
  84. data/lib/i18n/tasks/split_key.rb +4 -4
  85. data/lib/i18n/tasks/stats.rb +3 -3
  86. data/lib/i18n/tasks/translation.rb +8 -5
  87. data/lib/i18n/tasks/translators/base_translator.rb +43 -13
  88. data/lib/i18n/tasks/translators/deepl_translator.rb +22 -14
  89. data/lib/i18n/tasks/translators/google_translator.rb +178 -26
  90. data/lib/i18n/tasks/translators/openai_translator.rb +56 -31
  91. data/lib/i18n/tasks/translators/watsonx_translator.rb +155 -0
  92. data/lib/i18n/tasks/translators/yandex_translator.rb +13 -9
  93. data/lib/i18n/tasks/unused_keys.rb +1 -1
  94. data/lib/i18n/tasks/used_keys.rb +32 -32
  95. data/lib/i18n/tasks/version.rb +1 -1
  96. data/lib/i18n/tasks.rb +17 -16
  97. data/templates/config/i18n-tasks.yml +14 -2
  98. data/templates/minitest/i18n_test.rb +3 -3
  99. data/templates/rspec/i18n_spec.rb +7 -7
  100. metadata +38 -172
  101. data/lib/i18n/tasks/scanners/ruby_ast_scanner.rb +0 -145
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n-tasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.14
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - glebm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-10 00:00:00.000000000 Z
11
+ date: 2025-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 2.0.0
61
+ version: 3.0.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 2.0.0
68
+ version: 3.0.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: i18n
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: 3.2.2.1
97
97
  - !ruby/object:Gem::Dependency
98
- name: rails-i18n
98
+ name: prism
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,213 +109,73 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rainbow
112
+ name: rails-i18n
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 2.2.2
118
- - - "<"
119
- - !ruby/object:Gem::Version
120
- version: '4.0'
117
+ version: '0'
121
118
  type: :runtime
122
119
  prerelease: false
123
120
  version_requirements: !ruby/object:Gem::Requirement
124
121
  requirements:
125
122
  - - ">="
126
123
  - !ruby/object:Gem::Version
127
- version: 2.2.2
128
- - - "<"
129
- - !ruby/object:Gem::Version
130
- version: '4.0'
124
+ version: '0'
131
125
  - !ruby/object:Gem::Dependency
132
- name: terminal-table
126
+ name: rainbow
133
127
  requirement: !ruby/object:Gem::Requirement
134
128
  requirements:
135
129
  - - ">="
136
130
  - !ruby/object:Gem::Version
137
- version: 1.5.1
131
+ version: 2.2.2
132
+ - - "<"
133
+ - !ruby/object:Gem::Version
134
+ version: '4.0'
138
135
  type: :runtime
139
136
  prerelease: false
140
137
  version_requirements: !ruby/object:Gem::Requirement
141
138
  requirements:
142
139
  - - ">="
143
140
  - !ruby/object:Gem::Version
144
- version: 1.5.1
145
- - !ruby/object:Gem::Dependency
146
- name: bundler
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: '2.0'
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- version: 2.0.1
155
- type: :development
156
- prerelease: false
157
- version_requirements: !ruby/object:Gem::Requirement
158
- requirements:
159
- - - "~>"
160
- - !ruby/object:Gem::Version
161
- version: '2.0'
162
- - - ">="
141
+ version: 2.2.2
142
+ - - "<"
163
143
  - !ruby/object:Gem::Version
164
- version: 2.0.1
144
+ version: '4.0'
165
145
  - !ruby/object:Gem::Dependency
166
- name: overcommit
146
+ name: ruby-progressbar
167
147
  requirement: !ruby/object:Gem::Requirement
168
148
  requirements:
169
149
  - - "~>"
170
150
  - !ruby/object:Gem::Version
171
- version: 0.58.0
172
- type: :development
173
- prerelease: false
174
- version_requirements: !ruby/object:Gem::Requirement
175
- requirements:
176
- - - "~>"
177
- - !ruby/object:Gem::Version
178
- version: 0.58.0
179
- - !ruby/object:Gem::Dependency
180
- name: rake
181
- requirement: !ruby/object:Gem::Requirement
182
- requirements:
183
- - - ">="
184
- - !ruby/object:Gem::Version
185
- version: '0'
186
- type: :development
187
- prerelease: false
188
- version_requirements: !ruby/object:Gem::Requirement
189
- requirements:
151
+ version: '1.8'
190
152
  - - ">="
191
153
  - !ruby/object:Gem::Version
192
- version: '0'
193
- - !ruby/object:Gem::Dependency
194
- name: rspec
195
- requirement: !ruby/object:Gem::Requirement
196
- requirements:
197
- - - "~>"
198
- - !ruby/object:Gem::Version
199
- version: '3.3'
200
- type: :development
201
- prerelease: false
202
- version_requirements: !ruby/object:Gem::Requirement
203
- requirements:
204
- - - "~>"
205
- - !ruby/object:Gem::Version
206
- version: '3.3'
207
- - !ruby/object:Gem::Dependency
208
- name: rubocop
209
- requirement: !ruby/object:Gem::Requirement
210
- requirements:
211
- - - "~>"
212
- - !ruby/object:Gem::Version
213
- version: 1.50.1
214
- type: :development
215
- prerelease: false
216
- version_requirements: !ruby/object:Gem::Requirement
217
- requirements:
218
- - - "~>"
219
- - !ruby/object:Gem::Version
220
- version: 1.50.1
221
- - !ruby/object:Gem::Dependency
222
- name: rubocop-rake
223
- requirement: !ruby/object:Gem::Requirement
224
- requirements:
225
- - - "~>"
226
- - !ruby/object:Gem::Version
227
- version: 0.6.0
228
- type: :development
229
- prerelease: false
230
- version_requirements: !ruby/object:Gem::Requirement
231
- requirements:
232
- - - "~>"
233
- - !ruby/object:Gem::Version
234
- version: 0.6.0
235
- - !ruby/object:Gem::Dependency
236
- name: rubocop-rspec
237
- requirement: !ruby/object:Gem::Requirement
238
- requirements:
239
- - - "~>"
240
- - !ruby/object:Gem::Version
241
- version: 2.19.0
242
- type: :development
154
+ version: 1.8.1
155
+ type: :runtime
243
156
  prerelease: false
244
157
  version_requirements: !ruby/object:Gem::Requirement
245
158
  requirements:
246
159
  - - "~>"
247
160
  - !ruby/object:Gem::Version
248
- version: 2.19.0
249
- - !ruby/object:Gem::Dependency
250
- name: simplecov
251
- requirement: !ruby/object:Gem::Requirement
252
- requirements:
253
- - - ">="
254
- - !ruby/object:Gem::Version
255
- version: '0'
256
- type: :development
257
- prerelease: false
258
- version_requirements: !ruby/object:Gem::Requirement
259
- requirements:
260
- - - ">="
261
- - !ruby/object:Gem::Version
262
- version: '0'
263
- - !ruby/object:Gem::Dependency
264
- name: yard
265
- requirement: !ruby/object:Gem::Requirement
266
- requirements:
267
- - - ">="
268
- - !ruby/object:Gem::Version
269
- version: '0'
270
- type: :development
271
- prerelease: false
272
- version_requirements: !ruby/object:Gem::Requirement
273
- requirements:
274
- - - ">="
275
- - !ruby/object:Gem::Version
276
- version: '0'
277
- - !ruby/object:Gem::Dependency
278
- name: deepl-rb
279
- requirement: !ruby/object:Gem::Requirement
280
- requirements:
281
- - - ">="
282
- - !ruby/object:Gem::Version
283
- version: 2.1.0
284
- type: :development
285
- prerelease: false
286
- version_requirements: !ruby/object:Gem::Requirement
287
- requirements:
288
- - - ">="
289
- - !ruby/object:Gem::Version
290
- version: 2.1.0
291
- - !ruby/object:Gem::Dependency
292
- name: easy_translate
293
- requirement: !ruby/object:Gem::Requirement
294
- requirements:
161
+ version: '1.8'
295
162
  - - ">="
296
163
  - !ruby/object:Gem::Version
297
- version: 0.5.1
298
- type: :development
299
- prerelease: false
300
- version_requirements: !ruby/object:Gem::Requirement
301
- requirements:
302
- - - ">="
303
- - !ruby/object:Gem::Version
304
- version: 0.5.1
164
+ version: 1.8.1
305
165
  - !ruby/object:Gem::Dependency
306
- name: yandex-translator
166
+ name: terminal-table
307
167
  requirement: !ruby/object:Gem::Requirement
308
168
  requirements:
309
169
  - - ">="
310
170
  - !ruby/object:Gem::Version
311
- version: 0.3.3
312
- type: :development
171
+ version: 1.5.1
172
+ type: :runtime
313
173
  prerelease: false
314
174
  version_requirements: !ruby/object:Gem::Requirement
315
175
  requirements:
316
176
  - - ">="
317
177
  - !ruby/object:Gem::Version
318
- version: 0.3.3
178
+ version: 1.5.1
319
179
  description: |
320
180
  i18n-tasks helps you find and manage missing and unused translations.
321
181
 
@@ -341,6 +201,7 @@ files:
341
201
  - lib/i18n/tasks/cli.rb
342
202
  - lib/i18n/tasks/command/collection.rb
343
203
  - lib/i18n/tasks/command/commander.rb
204
+ - lib/i18n/tasks/command/commands/check_prism.rb
344
205
  - lib/i18n/tasks/command/commands/data.rb
345
206
  - lib/i18n/tasks/command/commands/eq_base.rb
346
207
  - lib/i18n/tasks/command/commands/health.rb
@@ -367,6 +228,7 @@ files:
367
228
  - lib/i18n/tasks/data/file_formats.rb
368
229
  - lib/i18n/tasks/data/file_system.rb
369
230
  - lib/i18n/tasks/data/file_system_base.rb
231
+ - lib/i18n/tasks/data/language_names.rb
370
232
  - lib/i18n/tasks/data/router/conservative_router.rb
371
233
  - lib/i18n/tasks/data/router/isolating_router.rb
372
234
  - lib/i18n/tasks/data/router/pattern_router.rb
@@ -402,12 +264,16 @@ files:
402
264
  - lib/i18n/tasks/scanners/pattern_mapper.rb
403
265
  - lib/i18n/tasks/scanners/pattern_scanner.rb
404
266
  - lib/i18n/tasks/scanners/pattern_with_scope_scanner.rb
267
+ - lib/i18n/tasks/scanners/prism_scanners/arguments_visitor.rb
268
+ - lib/i18n/tasks/scanners/prism_scanners/nodes.rb
269
+ - lib/i18n/tasks/scanners/prism_scanners/visitor.rb
405
270
  - lib/i18n/tasks/scanners/relative_keys.rb
406
271
  - lib/i18n/tasks/scanners/results/key_occurrences.rb
407
272
  - lib/i18n/tasks/scanners/results/occurrence.rb
408
273
  - lib/i18n/tasks/scanners/ruby_ast_call_finder.rb
409
- - lib/i18n/tasks/scanners/ruby_ast_scanner.rb
410
274
  - lib/i18n/tasks/scanners/ruby_key_literals.rb
275
+ - lib/i18n/tasks/scanners/ruby_parser_factory.rb
276
+ - lib/i18n/tasks/scanners/ruby_scanner.rb
411
277
  - lib/i18n/tasks/scanners/scanner.rb
412
278
  - lib/i18n/tasks/scanners/scanner_multiplexer.rb
413
279
  - lib/i18n/tasks/split_key.rb
@@ -418,6 +284,7 @@ files:
418
284
  - lib/i18n/tasks/translators/deepl_translator.rb
419
285
  - lib/i18n/tasks/translators/google_translator.rb
420
286
  - lib/i18n/tasks/translators/openai_translator.rb
287
+ - lib/i18n/tasks/translators/watsonx_translator.rb
421
288
  - lib/i18n/tasks/translators/yandex_translator.rb
422
289
  - lib/i18n/tasks/unused_keys.rb
423
290
  - lib/i18n/tasks/used_keys.rb
@@ -429,8 +296,10 @@ homepage: https://github.com/glebm/i18n-tasks
429
296
  licenses:
430
297
  - MIT
431
298
  metadata:
299
+ changelog_uri: https://github.com/glebm/i18n-tasks/blob/main/CHANGES.md
432
300
  issue_tracker: https://github.com/glebm/i18n-tasks
433
301
  rubygems_mfa_required: 'true'
302
+ source_code_uri: https://github.com/glebm/i18n-tasks
434
303
  post_install_message: |
435
304
  # Install default configuration:
436
305
  cp $(bundle exec i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/
@@ -445,17 +314,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
445
314
  requirements:
446
315
  - - ">="
447
316
  - !ruby/object:Gem::Version
448
- version: '2.6'
449
- - - "<"
450
- - !ruby/object:Gem::Version
451
- version: '4.0'
317
+ version: '3.1'
452
318
  required_rubygems_version: !ruby/object:Gem::Requirement
453
319
  requirements:
454
320
  - - ">="
455
321
  - !ruby/object:Gem::Version
456
322
  version: '0'
457
323
  requirements: []
458
- rubygems_version: 3.5.3
324
+ rubygems_version: 3.2.3
459
325
  signing_key:
460
326
  specification_version: 4
461
327
  summary: Manage localization and translation with the awesome power of static analysis
@@ -1,145 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'i18n/tasks/scanners/file_scanner'
4
- require 'i18n/tasks/scanners/relative_keys'
5
- require 'i18n/tasks/scanners/ruby_ast_call_finder'
6
- require 'i18n/tasks/scanners/ast_matchers/default_i18n_subject_matcher'
7
- require 'i18n/tasks/scanners/ast_matchers/message_receivers_matcher'
8
- require 'i18n/tasks/scanners/ast_matchers/rails_model_matcher'
9
- require 'parser/current'
10
-
11
- module I18n::Tasks::Scanners
12
- # Scan for I18n.translate calls using whitequark/parser
13
- class RubyAstScanner < FileScanner
14
- include RelativeKeys
15
- include AST::Sexp
16
-
17
- MAGIC_COMMENT_PREFIX = /\A.\s*i18n-tasks-use\s+/.freeze
18
-
19
- def initialize(**args)
20
- super(**args)
21
- @parser = ::Parser::CurrentRuby.new
22
- @magic_comment_parser = ::Parser::CurrentRuby.new
23
- @matchers = setup_matchers
24
- end
25
-
26
- protected
27
-
28
- # Extract all occurrences of translate calls from the file at the given path.
29
- #
30
- # @return [Array<[key, Results::KeyOccurrence]>] each occurrence found in the file
31
- def scan_file(path)
32
- ast, comments = path_to_ast_and_comments(path)
33
-
34
- ast_to_occurences(ast) + comments_to_occurences(path, ast, comments)
35
- rescue Exception => e # rubocop:disable Lint/RescueException
36
- raise ::I18n::Tasks::CommandError.new(e, "Error scanning #{path}: #{e.message}")
37
- end
38
-
39
- # Parse file on path and returns AST and comments.
40
- #
41
- # @param path Path to file to parse
42
- # @return [{Parser::AST::Node}, [Parser::Source::Comment]]
43
- def path_to_ast_and_comments(path)
44
- @parser.reset
45
- @parser.parse_with_comments(make_buffer(path))
46
- end
47
-
48
- def keys_relative_to_calling_method?(path)
49
- /controllers|mailers/.match(path)
50
- end
51
-
52
- # Create an {Parser::Source::Buffer} with the given contents.
53
- # The contents are assigned a {Parser::Source::Buffer#raw_source}.
54
- #
55
- # @param path [String] Path to assign as the buffer name.
56
- # @param contents [String]
57
- # @return [Parser::Source::Buffer] file contents
58
- def make_buffer(path, contents = read_file(path))
59
- Parser::Source::Buffer.new(path).tap do |buffer|
60
- buffer.raw_source = contents
61
- end
62
- end
63
-
64
- # Convert an array of {Parser::Source::Comment} to occurrences.
65
- #
66
- # @param path Path to file
67
- # @param ast Parser::AST::Node
68
- # @param comments [Parser::Source::Comment]
69
- # @return [nil, [key, Occurrence]] full absolute key name and the occurrence.
70
- def comments_to_occurences(path, ast, comments)
71
- magic_comments = comments.select { |comment| comment.text =~ MAGIC_COMMENT_PREFIX }
72
- comment_to_node = Parser::Source::Comment.associate_locations(ast, magic_comments).tap do |h|
73
- h.transform_values!(&:first)
74
- end.invert
75
-
76
- magic_comments.flat_map do |comment|
77
- @parser.reset
78
- associated_node = comment_to_node[comment]
79
- ast = @parser.parse(make_buffer(path, comment.text.sub(MAGIC_COMMENT_PREFIX, '').split(/\s+(?=t)/).join('; ')))
80
- calls = RubyAstCallFinder.new.collect_calls(ast)
81
- results = []
82
-
83
- # method_name is not available at this stage
84
- calls.each do |(send_node, _method_name)|
85
- @matchers.each do |matcher|
86
- result = matcher.convert_to_key_occurrences(
87
- send_node,
88
- nil,
89
- location: associated_node || comment.location
90
- )
91
- results << result if result
92
- end
93
- end
94
-
95
- results
96
- end
97
- end
98
-
99
- # Convert {Parser::AST::Node} to occurrences.
100
- #
101
- # @param ast {Parser::Source::Comment}
102
- # @return [nil, [key, Occurrence]] full absolute key name and the occurrence.
103
- def ast_to_occurences(ast)
104
- calls = RubyAstCallFinder.new.collect_calls(ast)
105
- results = []
106
- calls.each do |send_node, method_name|
107
- @matchers.each do |matcher|
108
- result = matcher.convert_to_key_occurrences(send_node, method_name)
109
- results << result if result
110
- end
111
- end
112
-
113
- results
114
- end
115
-
116
- def setup_matchers
117
- if config[:receiver_messages]
118
- config[:receiver_messages].map do |receiver, message|
119
- AstMatchers::MessageReceiversMatcher.new(
120
- receivers: [receiver],
121
- message: message,
122
- scanner: self
123
- )
124
- end
125
- else
126
- matchers = %i[t t! translate translate!].map do |message|
127
- AstMatchers::MessageReceiversMatcher.new(
128
- receivers: [
129
- AST::Node.new(:const, [nil, :I18n]),
130
- nil
131
- ],
132
- message: message,
133
- scanner: self
134
- )
135
- end
136
-
137
- Array(config[:ast_matchers]).each do |class_name|
138
- matchers << ActiveSupport::Inflector.constantize(class_name).new(scanner: self)
139
- end
140
-
141
- matchers
142
- end
143
- end
144
- end
145
- end