i18n-tasks 0.9.6 → 0.9.7

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +2 -1
  4. data/bin/i18n-tasks +1 -0
  5. data/config/locales/en.yml +15 -9
  6. data/config/locales/ru.yml +80 -74
  7. data/i18n-tasks.gemspec +9 -8
  8. data/lib/i18n/tasks.rb +2 -5
  9. data/lib/i18n/tasks/cli.rb +14 -18
  10. data/lib/i18n/tasks/command/commander.rb +2 -3
  11. data/lib/i18n/tasks/command/commands/health.rb +1 -1
  12. data/lib/i18n/tasks/command/commands/meta.rb +2 -2
  13. data/lib/i18n/tasks/command/commands/missing.rb +17 -19
  14. data/lib/i18n/tasks/command/commands/tree.rb +3 -3
  15. data/lib/i18n/tasks/command/commands/usages.rb +6 -5
  16. data/lib/i18n/tasks/command/commands/xlsx.rb +1 -1
  17. data/lib/i18n/tasks/command/dsl.rb +1 -2
  18. data/lib/i18n/tasks/command/option_parsers/enum.rb +6 -6
  19. data/lib/i18n/tasks/command/option_parsers/locale.rb +3 -1
  20. data/lib/i18n/tasks/command/options/data.rb +22 -21
  21. data/lib/i18n/tasks/command_error.rb +1 -3
  22. data/lib/i18n/tasks/configuration.rb +37 -27
  23. data/lib/i18n/tasks/console_context.rb +3 -2
  24. data/lib/i18n/tasks/data.rb +5 -4
  25. data/lib/i18n/tasks/data/adapter/json_adapter.rb +13 -12
  26. data/lib/i18n/tasks/data/adapter/yaml_adapter.rb +13 -14
  27. data/lib/i18n/tasks/data/file_formats.rb +15 -10
  28. data/lib/i18n/tasks/data/file_system_base.rb +18 -22
  29. data/lib/i18n/tasks/data/router/conservative_router.rb +3 -6
  30. data/lib/i18n/tasks/data/router/pattern_router.rb +4 -5
  31. data/lib/i18n/tasks/data/tree/node.rb +20 -19
  32. data/lib/i18n/tasks/data/tree/nodes.rb +4 -3
  33. data/lib/i18n/tasks/data/tree/siblings.rb +36 -29
  34. data/lib/i18n/tasks/data/tree/traversal.rb +32 -35
  35. data/lib/i18n/tasks/google_translation.rb +22 -25
  36. data/lib/i18n/tasks/html_keys.rb +2 -0
  37. data/lib/i18n/tasks/ignore_keys.rb +3 -2
  38. data/lib/i18n/tasks/key_pattern_matching.rb +9 -8
  39. data/lib/i18n/tasks/locale_list.rb +4 -6
  40. data/lib/i18n/tasks/locale_pathname.rb +8 -8
  41. data/lib/i18n/tasks/logging.rb +3 -3
  42. data/lib/i18n/tasks/missing_keys.rb +29 -31
  43. data/lib/i18n/tasks/plural_keys.rb +6 -7
  44. data/lib/i18n/tasks/references.rb +72 -41
  45. data/lib/i18n/tasks/reports/base.rb +8 -7
  46. data/lib/i18n/tasks/reports/spreadsheet.rb +15 -16
  47. data/lib/i18n/tasks/reports/terminal.rb +32 -32
  48. data/lib/i18n/tasks/scanners/file_scanner.rb +6 -5
  49. data/lib/i18n/tasks/scanners/files/caching_file_finder_provider.rb +1 -2
  50. data/lib/i18n/tasks/scanners/files/caching_file_reader.rb +0 -1
  51. data/lib/i18n/tasks/scanners/files/file_finder.rb +12 -15
  52. data/lib/i18n/tasks/scanners/files/file_reader.rb +0 -1
  53. data/lib/i18n/tasks/scanners/occurrence_from_position.rb +8 -7
  54. data/lib/i18n/tasks/scanners/pattern_mapper.rb +2 -2
  55. data/lib/i18n/tasks/scanners/pattern_scanner.rb +9 -7
  56. data/lib/i18n/tasks/scanners/pattern_with_scope_scanner.rb +1 -2
  57. data/lib/i18n/tasks/scanners/relative_keys.rb +11 -11
  58. data/lib/i18n/tasks/scanners/results/key_occurrences.rb +3 -4
  59. data/lib/i18n/tasks/scanners/results/occurrence.rb +8 -7
  60. data/lib/i18n/tasks/scanners/ruby_ast_call_finder.rb +2 -2
  61. data/lib/i18n/tasks/scanners/ruby_ast_scanner.rb +39 -31
  62. data/lib/i18n/tasks/scanners/scanner_multiplexer.rb +9 -3
  63. data/lib/i18n/tasks/split_key.rb +5 -6
  64. data/lib/i18n/tasks/stats.rb +10 -8
  65. data/lib/i18n/tasks/string_interpolation.rb +1 -1
  66. data/lib/i18n/tasks/unused_keys.rb +2 -2
  67. data/lib/i18n/tasks/used_keys.rb +47 -43
  68. data/lib/i18n/tasks/version.rb +1 -1
  69. data/templates/rspec/i18n_spec.rb +2 -2
  70. metadata +30 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e38c549e1d0303125dde7b029aa4ed4f5daa13ba
4
- data.tar.gz: 55337517009dfeba3b60027c9c2fe1d9dd3aca21
3
+ metadata.gz: cec4fddc37a4bbc56edf707c49e247e8418a8199
4
+ data.tar.gz: 38edd490aaa36f481f2c0ae7868649c87ebad8ef
5
5
  SHA512:
6
- metadata.gz: d9bada34e186461d3c9941f24fba746e06628681d68f925e34a874769c8046cec65d7ed06717fe0f16efefa85543db799c8a8f0997eff2f28ec2f8b3f7b81d44
7
- data.tar.gz: e83e89d336812b51fc0ea49fe1364f086d1efa56008e26810955205032d7839d590d905985ef4891bd477e111f1820807f707adfc73d1f33e5245c427ec5f3c7
6
+ metadata.gz: 2a727430cb2f8ca4ad602db64766da00f6eb9711be9a1425096c18dff6906c60b8af52defdecb67a54521ec7edd18bb7a7487d093aebabbebf5f3e8cc6a58dfc
7
+ data.tar.gz: 2ec48ffcff555fbb597deed2270a0b0c5d2a859d29069751ff681429292c6652be5c57106a9a5ab22326bce32183cfb1ea36aaeaf70f20ea4303e74330a7fbcf
data/README.md CHANGED
@@ -24,7 +24,7 @@ i18n-tasks can be used with any project using the ruby [i18n gem][i18n-gem] (def
24
24
  Add i18n-tasks to the Gemfile:
25
25
 
26
26
  ```ruby
27
- gem 'i18n-tasks', '~> 0.9.6'
27
+ gem 'i18n-tasks', '~> 0.9.7'
28
28
  ```
29
29
 
30
30
  Copy the default [configuration file](#configuration):
data/Rakefile CHANGED
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'bundler/gem_tasks'
2
3
  require 'rspec/core/rake_task'
3
4
  RSpec::Core::RakeTask.new(:rspec)
4
- task :default => :rspec
5
+ task default: :rspec
5
6
 
6
7
  task :irb do
7
8
  # $: << File.expand_path('lib', __FILE__)
data/bin/i18n-tasks CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  if ENV['I18N_TASKS_BIN_SIMPLECOV_COVERAGE']
4
5
  require_relative '../spec/bin_simplecov_helper'
@@ -21,9 +21,12 @@ en:
21
21
  nostdin: Do not read from stdin
22
22
  out_format: 'Output format: %{valid_text}'
23
23
  pattern_router: 'Use pattern router: keys moved per config data.write'
24
- strict: Avoid inferring dynamic key usages such as t("cats.#{cat}.name"). Takes precedence over the
25
- config setting if set.
26
- value: 'Value. Interpolates: %{value}, %{human_key}, %{key}, %{default}, %{value_or_human_key}, %{value_or_default_or_human_key}'
24
+ strict: >-
25
+ Avoid inferring dynamic key usages such as t("cats.#{cat}.name"). Takes precedence over
26
+ the config setting if set.
27
+ value: >-
28
+ Value. Interpolates: %{value}, %{human_key}, %{key}, %{default}, %{value_or_human_key},
29
+ %{value_or_default_or_human_key}
27
30
  desc:
28
31
  add_missing: add missing keys to locale data
29
32
  config: display i18n-tasks configuration
@@ -73,17 +76,20 @@ en:
73
76
  type: Type
74
77
  value: Value
75
78
  data_stats:
76
- text: has %{key_count} keys across %{locale_count} locales. On average, values are %{value_chars_avg}
79
+ text: >-
80
+ has %{key_count} keys across %{locale_count} locales. On average, values are %{value_chars_avg}
77
81
  characters long, keys have %{key_segments_avg} segments, a locale has %{per_locale_avg} keys.
78
- text_single_locale: has %{key_count} keys in total. On average, values are %{value_chars_avg}
79
- characters long, keys have %{key_segments_avg} segments.
82
+ text_single_locale: >-
83
+ has %{key_count} keys in total. On average, values are %{value_chars_avg} characters long,
84
+ keys have %{key_segments_avg} segments.
80
85
  title: Forest (%{locales})
81
86
  google_translate:
82
87
  errors:
83
- no_api_key: Set Google API key via GOOGLE_TRANSLATE_API_KEY environment variable or translation.api_key
88
+ no_api_key: >-
89
+ Set Google API key via GOOGLE_TRANSLATE_API_KEY environment variable or translation.api_key
84
90
  in config/i18n-tasks.yml. Get the key at https://code.google.com/apis/console.
85
- no_results: Google Translate returned no results. Make sure billing information is set at
86
- https://code.google.com/apis/console.
91
+ no_results: >-
92
+ Google Translate returned no results. Make sure billing information is set at https://code.google.com/apis/console.
87
93
  health:
88
94
  no_keys_detected: No keys detected. Check data.read in config/i18n-tasks.yml.
89
95
  missing:
@@ -2,100 +2,106 @@
2
2
  ru:
3
3
  i18n_tasks:
4
4
  add_missing:
5
- added: "Добавлены ключи (%{count})"
5
+ added: Добавлены ключи (%{count})
6
6
  cmd:
7
7
  args:
8
- default_text: "По умолчанию: %{value}"
8
+ default_text: 'По умолчанию: %{value}'
9
9
  desc:
10
- confirm: "Подтвердить автоматом"
11
- data_format: "Формат данных: %{valid_text}. %{default_text}."
12
- key_pattern: "Маска ключа (например, common.*)"
13
- key_pattern_to_rename: "Полный ключ (шаблон) для переименования. Необходимый параметр."
14
- locale: "Язык. По умолчанию: base"
15
- locale_to_translate_from: "Язык, с которого переводить (по умолчанию: base)"
16
- locales_filter: "Список языков для обработки, разделенный запятыми (,). По умолчанию: все.
17
- Специальное значение: base."
18
- missing_types: "Типы недостающих переводов: %{valid}. По умолчанию: все"
19
- new_key_name: "Новое имя, интерполирует оригинальное название как %{key}. Необходимый параметр."
20
- nostdin: "Не читать дерево из стандартного ввода"
21
- out_format: "Формат вывода: %{valid_text}. %{default_text}."
22
- pattern_router: "Использовать pattern_router: ключи распределятся по файлам согласно data.write"
10
+ confirm: Подтвердить автоматом
11
+ data_format: 'Формат данных: %{valid_text}. %{default_text}.'
12
+ key_pattern: Маска ключа (например, common.*)
13
+ key_pattern_to_rename: Полный ключ (шаблон) для переименования. Необходимый параметр.
14
+ locale: 'Язык. По умолчанию: base'
15
+ locale_to_translate_from: 'Язык, с которого переводить (по умолчанию: base)'
16
+ locales_filter: >-
17
+ Список языков для обработки, разделенный запятыми (,). По умолчанию: все. Специальное
18
+ значение: base.
19
+ missing_types: 'Типы недостающих переводов: %{valid}. По умолчанию: все'
20
+ new_key_name: Новое имя, интерполирует оригинальное название как %{key}. Необходимый параметр.
21
+ nostdin: Не читать дерево из стандартного ввода
22
+ out_format: 'Формат вывода: %{valid_text}. %{default_text}.'
23
+ pattern_router: 'Использовать pattern_router: ключи распределятся по файлам согласно data.write'
23
24
  strict: Не угадывать динамические использования ключей, например `t("category.#{category.key}")`
24
- value: "Значение, интерполируется с %{value}, %{human_key}, %{key}, %{default}, %{value_or_human_key}, %{value_or_default_or_human_key}"
25
+ value: >-
26
+ Значение, интерполируется с %{value}, %{human_key}, %{key}, %{default}, %{value_or_human_key},
27
+ %{value_or_default_or_human_key}
25
28
  desc:
26
- add_missing: "добавить недостающие ключи к переводам"
27
- config: "показать конфигурацию"
28
- data: "показать данные переводов"
29
- data_merge: "добавить дерево к переводам"
30
- data_remove: "удалить ключи, которые есть в дереве, из данных"
31
- data_write: "заменить переводы деревом"
32
- eq_base: "показать переводы, равные значениям в основном языке"
33
- find: "показать, где ключи используются в коде"
34
- gem_path: "показать путь к ruby gem"
35
- health: "Всё ОК?"
36
- irb: "начать REPL сессию в контексте i18n-tasks"
37
- missing: "показать недостающие переводы"
38
- normalize: "нормализовать файлы переводов (сортировка и распределение)"
39
- remove_unused: "удалить неиспользуемые ключи"
40
- translate_missing: "перевести недостающие переводы с Google Translate"
41
- tree_convert: "преобразовать дерево между форматами"
42
- tree_filter: "фильтровать дерево по ключу"
43
- tree_merge: "объединенить деревья"
44
- tree_rename_key: "переименовать узел дерева"
45
- tree_set_value: "заменить значения ключей"
46
- tree_subtract: "дерево A минус ключи в дереве B"
47
- tree_translate: "Перевести дерево при помощи Google Translate на язык корневых узлов"
48
- unused: "показать неиспользуемые переводы"
49
- xlsx_report: "сохранить недостающие и неиспользуемые переводы в Excel-файл"
29
+ add_missing: добавить недостающие ключи к переводам
30
+ config: показать конфигурацию
31
+ data: показать данные переводов
32
+ data_merge: добавить дерево к переводам
33
+ data_remove: удалить ключи, которые есть в дереве, из данных
34
+ data_write: заменить переводы деревом
35
+ eq_base: показать переводы, равные значениям в основном языке
36
+ find: показать, где ключи используются в коде
37
+ gem_path: показать путь к ruby gem
38
+ health: Всё ОК?
39
+ irb: начать REPL сессию в контексте i18n-tasks
40
+ missing: показать недостающие переводы
41
+ normalize: нормализовать файлы переводов (сортировка и распределение)
42
+ remove_unused: удалить неиспользуемые ключи
43
+ translate_missing: перевести недостающие переводы с Google Translate
44
+ tree_convert: преобразовать дерево между форматами
45
+ tree_filter: фильтровать дерево по ключу
46
+ tree_merge: объединенить деревья
47
+ tree_rename_key: переименовать узел дерева
48
+ tree_set_value: заменить значения ключей
49
+ tree_subtract: дерево A минус ключи в дереве B
50
+ tree_translate: Перевести дерево при помощи Google Translate на язык корневых узлов
51
+ unused: показать неиспользуемые переводы
52
+ xlsx_report: сохранить недостающие и неиспользуемые переводы в Excel-файл
50
53
  encourage:
51
- - "Хорошая работа!"
52
- - "Отлично!"
53
- - "Прекрасно!"
54
+ - Хорошая работа!
55
+ - Отлично!
56
+ - Прекрасно!
54
57
  enum_list_opt:
55
58
  invalid: "%{invalid} не в: %{valid}."
56
59
  enum_opt:
57
60
  invalid: "%{invalid} не является одним из: %{valid}."
58
61
  errors:
59
- invalid_format: "Неизвестный формат %{invalid}. Форматы: %{valid}."
60
- invalid_locale: "Неверный язык %{invalid}"
62
+ invalid_format: 'Неизвестный формат %{invalid}. Форматы: %{valid}.'
63
+ invalid_locale: Неверный язык %{invalid}
61
64
  invalid_missing_type:
62
- one: "Неизвестный тип %{invalid}. Типы: %{valid}."
63
- other: "Неизвестные типы: %{invalid}. Типы: %{valid}."
64
- pass_forest: "Передайте дерево"
65
+ one: 'Неизвестный тип %{invalid}. Типы: %{valid}.'
66
+ other: 'Неизвестные типы: %{invalid}. Типы: %{valid}.'
67
+ pass_forest: Передайте дерево
65
68
  common:
66
- base_value: "Исходное значение"
67
- continue_q: "Продолжить?"
68
- key: "Ключ"
69
- locale: "Язык"
70
- n_more: "ещё %{count}"
71
- type: "Тип"
72
- value: "Значение"
69
+ base_value: Исходное значение
70
+ continue_q: Продолжить?
71
+ key: Ключ
72
+ locale: Язык
73
+ n_more: ещё %{count}
74
+ type: Тип
75
+ value: Значение
73
76
  data_stats:
74
- text: "%{key_count} ключей в %{locale_count} языках. В среднем, длина строки: %{value_chars_avg},
75
- сегменты ключей: %{key_segments_avg}, ключей в языке %{per_locale_avg}."
76
- text_single_locale: "%{key_count} ключей. В среднем, длина строки: %{value_chars_avg}, сегменты
77
- ключей: %{key_segments_avg}."
78
- title: "Данные (%{locales}):"
77
+ text: >-
78
+ %{key_count} ключей в %{locale_count} языках. В среднем, длина строки: %{value_chars_avg},
79
+ сегменты ключей: %{key_segments_avg}, ключей в языке %{per_locale_avg}.
80
+ text_single_locale: >-
81
+ %{key_count} ключей. В среднем, длина строки: %{value_chars_avg}, сегменты ключей: %{key_segments_avg}.
82
+ title: 'Данные (%{locales}):'
79
83
  google_translate:
80
84
  errors:
81
- no_api_key: "Задайте ключ API Google через переменную окружения GOOGLE_TRANSLATE_API_KEY или
82
- translation.api_key в config/i18n-tasks.yml. Получите ключ через https://code.google.com/apis/console."
83
- no_results: Google Translate не дал результатов. Убедитесь в том, что платежная информация
84
- добавлена в https://code.google.com/apis/console.
85
+ no_api_key: >-
86
+ Задайте ключ API Google через переменную окружения GOOGLE_TRANSLATE_API_KEY или translation.api_key
87
+ в config/i18n-tasks.yml. Получите ключ через https://code.google.com/apis/console.
88
+ no_results: >-
89
+ Google Translate не дал результатов. Убедитесь в том, что платежная информация добавлена
90
+ в https://code.google.com/apis/console.
85
91
  health:
86
- no_keys_detected: "Ключи не обнаружены. Проверьте data.read в config/i18n-tasks.yml."
92
+ no_keys_detected: Ключи не обнаружены. Проверьте data.read в config/i18n-tasks.yml.
87
93
  missing:
88
- details_title: "На других языках или в коде"
89
- none: "Всё переведено."
94
+ details_title: На других языках или в коде
95
+ none: Всё переведено.
90
96
  remove_unused:
91
97
  confirm:
92
- one: "Один перевод будут удалён из %{locales}."
93
- other: "Переводы (%{count}) будут удалены из %{locales}."
94
- noop: "Нет неиспользуемых ключей"
95
- removed: "Удалены ключи (%{count})"
98
+ one: Один перевод будут удалён из %{locales}.
99
+ other: Переводы (%{count}) будут удалены из %{locales}.
100
+ noop: Нет неиспользуемых ключей
101
+ removed: Удалены ключи (%{count})
96
102
  translate_missing:
97
- translated: "Переведены ключи (%{count})"
103
+ translated: Переведены ключи (%{count})
98
104
  unused:
99
- none: "Все переводы используются."
105
+ none: Все переводы используются.
100
106
  usages:
101
- none: "Не найдено использований."
107
+ none: Не найдено использований.
data/i18n-tasks.gemspec CHANGED
@@ -1,14 +1,15 @@
1
+ # frozen_string_literal: true
1
2
  lib = File.expand_path('../lib', __FILE__)
2
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
4
  require 'i18n/tasks/version'
4
5
 
5
- Gem::Specification.new do |s|
6
+ Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
6
7
  s.name = 'i18n-tasks'
7
8
  s.version = I18n::Tasks::VERSION
8
9
  s.authors = ['glebm']
9
10
  s.email = ['glex.spb@gmail.com']
10
11
  s.license = 'MIT'
11
- s.summary = %q{Manage localization and translation with the awesome power of static analysis}
12
+ s.summary = 'Manage localization and translation with the awesome power of static analysis'
12
13
  s.description = <<-TEXT
13
14
  i18n-tasks helps you find and manage missing and unused translations.
14
15
 
@@ -21,16 +22,14 @@ cp $(i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/
21
22
  # Add an RSpec for missing and unused keys:
22
23
  cp $(i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/
23
24
  TEXT
24
- s.homepage = 'https://github.com/glebm/i18n-tasks'
25
+ s.homepage = 'https://github.com/glebm/i18n-tasks'
25
26
  if s.respond_to?(:metadata=)
26
27
  s.metadata = { 'issue_tracker' => 'https://github.com/glebm/i18n-tasks' }
27
28
  end
28
- if s.respond_to?(:required_ruby_version=)
29
- s.required_ruby_version = '~> 2.1'
30
- end
29
+ s.required_ruby_version = '~> 2.1' if s.respond_to?(:required_ruby_version=)
31
30
 
32
- s.files = `git ls-files`.split($/)
33
- s.files -= s.files.grep(%r{^(doc/|\.|spec/)}) + %w(CHANGES.md config/i18n-tasks.yml Gemfile)
31
+ s.files = `git ls-files`.split($/)
32
+ s.files -= s.files.grep(%r{^(doc/|\.|spec/)}) + %w(CHANGES.md config/i18n-tasks.yml Gemfile)
34
33
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) } - %w(i18n-tasks.cmd)
35
34
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
36
35
  s.require_paths = ['lib']
@@ -48,5 +47,7 @@ TEXT
48
47
  s.add_development_dependency 'bundler', '~> 1.3'
49
48
  s.add_development_dependency 'rake'
50
49
  s.add_development_dependency 'rspec', '~> 3.3'
50
+ s.add_development_dependency 'rubocop'
51
+ s.add_development_dependency 'simplecov'
51
52
  s.add_development_dependency 'yard'
52
53
  end
data/lib/i18n/tasks.rb CHANGED
@@ -11,9 +11,7 @@ module I18n
11
11
  @verbose
12
12
  end
13
13
 
14
- def verbose=(value)
15
- @verbose = value
16
- end
14
+ attr_writer :verbose
17
15
 
18
16
  # Add a scanner to the default configuration.
19
17
  #
@@ -37,14 +35,13 @@ module I18n
37
35
  end
38
36
  end
39
37
 
40
- @verbose = !!ENV['VERBOSE']
38
+ @verbose = !ENV['VERBOSE'].nil?
41
39
 
42
40
  module Data
43
41
  end
44
42
  end
45
43
  end
46
44
 
47
-
48
45
  require 'active_support/inflector'
49
46
  require 'active_support/core_ext/hash'
50
47
  require 'active_support/core_ext/array/access'
@@ -10,16 +10,13 @@ class I18n::Tasks::CLI
10
10
  new.start(argv)
11
11
  end
12
12
 
13
- def initialize
14
- end
13
+ def initialize; end
15
14
 
16
15
  def start(argv)
17
16
  I18n.with_locale(base_task.internal_locale) do
18
17
  auto_output_coloring do
19
18
  begin
20
- if run(argv) == :exit_1
21
- exit 1
22
- end
19
+ exit 1 if run(argv) == :exit_1
23
20
  rescue OptionParser::ParseError => e
24
21
  error e.message, 64
25
22
  rescue I18n::Tasks::CommandError => e
@@ -51,7 +48,7 @@ class I18n::Tasks::CLI
51
48
  def commands
52
49
  # load base task to initialize plugins
53
50
  base_task
54
- @commands ||= ::I18n::Tasks::Commands.cmds.transform_keys { |k| k.to_s.tr('_'.freeze, '-'.freeze) }
51
+ @commands ||= ::I18n::Tasks::Commands.cmds.transform_keys { |k| k.to_s.tr('_', '-') }
55
52
  end
56
53
 
57
54
  private
@@ -64,7 +61,7 @@ class I18n::Tasks::CLI
64
61
  command = parse_command! argv
65
62
  options = optparse! command, argv
66
63
  parse_options! options, command, argv
67
- [command.tr('-'.freeze, '_'.freeze), options.update(arguments: argv)]
64
+ [command.tr('-', '_'), options.update(arguments: argv)]
68
65
  end
69
66
 
70
67
  def optparse!(command, argv)
@@ -103,14 +100,14 @@ class I18n::Tasks::CLI
103
100
 
104
101
  def allow_help_arg_first!(argv)
105
102
  # allow `i18n-tasks --help command` in addition to `i18n-tasks command --help`
106
- if %w(-h --help).include?(argv[0]) && argv[1] && !argv[1].start_with?('-'.freeze)
103
+ if %w(-h --help).include?(argv[0]) && argv[1] && !argv[1].start_with?('-')
107
104
  argv[0], argv[1] = argv[1], argv[0]
108
105
  end
109
106
  end
110
107
 
111
108
  def parse_command!(argv)
112
109
  allow_help_arg_first! argv
113
- if argv[0] && !argv[0].start_with?('-'.freeze)
110
+ if argv[0] && !argv[0].start_with?('-')
114
111
  if commands.keys.include?(argv[0])
115
112
  argv.shift
116
113
  else
@@ -120,9 +117,9 @@ class I18n::Tasks::CLI
120
117
  end
121
118
 
122
119
  def verbose_option(op)
123
- op.on('--verbose', 'Verbose output') {
120
+ op.on('--verbose', 'Verbose output') do
124
121
  ::I18n::Tasks.verbose = true
125
- }
122
+ end
126
123
  end
127
124
 
128
125
  def help_option(op)
@@ -157,14 +154,14 @@ class I18n::Tasks::CLI
157
154
  def parse_options!(options, command, argv)
158
155
  commands[command][:args].each do |flag|
159
156
  name = option_name flag
160
- options[name] = parse_option flag, options[name], argv, self.context
157
+ options[name] = parse_option flag, options[name], argv, context
161
158
  end
162
159
  end
163
160
 
164
161
  def parse_option(flag, val, argv, context)
165
162
  conf = flag.last.is_a?(Hash) ? flag.last : {}
166
163
  if conf[:consume_positional]
167
- val = Array(val) + Array(flag.include?(Array) ? argv.flat_map { |x| x.split(','.freeze) } : argv)
164
+ val = Array(val) + Array(flag.include?(Array) ? argv.flat_map { |x| x.split(',') } : argv)
168
165
  end
169
166
  val = conf[:default] if val.nil? && conf.key?(:default)
170
167
  val = conf[:parser].call(val, context) if conf.key?(:parser)
@@ -172,9 +169,9 @@ class I18n::Tasks::CLI
172
169
  end
173
170
 
174
171
  def option_name(flag)
175
- flag.detect { |f|
176
- f.start_with?('--'.freeze)
177
- }.sub(/\A--(\[no-\])?/, ''.freeze).sub(/[^\-\w].*\z/, ''.freeze).to_sym
172
+ flag.detect do |f|
173
+ f.start_with?('--')
174
+ end.sub(/\A--(\[no-\])?/, '').sub(/[^\-\w].*\z/, '').to_sym
178
175
  end
179
176
 
180
177
  def try_call(v)
@@ -190,7 +187,7 @@ class I18n::Tasks::CLI
190
187
  fail ExecutionError.new(message, exit_code)
191
188
  end
192
189
 
193
- class ExecutionError < Exception
190
+ class ExecutionError < RuntimeError
194
191
  attr_reader :exit_code
195
192
 
196
193
  def initialize(message, exit_code)
@@ -206,5 +203,4 @@ class I18n::Tasks::CLI
206
203
  ensure
207
204
  Term::ANSIColor.coloring = coloring_was
208
205
  end
209
-
210
206
  end
@@ -10,7 +10,6 @@ module I18n::Tasks
10
10
 
11
11
  attr_reader :i18n
12
12
 
13
-
14
13
  # @param [I18n::Tasks::BaseTask] i18n
15
14
  def initialize(i18n)
16
15
  @i18n = i18n
@@ -18,8 +17,8 @@ module I18n::Tasks
18
17
 
19
18
  def run(name, opts = {})
20
19
  name = name.to_sym
21
- public_name = name.to_s.tr '_'.freeze, '-'.freeze
22
- log_verbose "task: #{public_name}(#{opts.map { |k, v| "#{k}: #{v.inspect}" } * ', '.freeze})"
20
+ public_name = name.to_s.tr '_', '-'
21
+ log_verbose "task: #{public_name}(#{opts.map { |k, v| "#{k}: #{v.inspect}" } * ', '})"
23
22
  if opts.empty? || method(name).arity.zero?
24
23
  send name
25
24
  else