i18n-tasks 0.9.6 → 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
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