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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +2 -1
- data/bin/i18n-tasks +1 -0
- data/config/locales/en.yml +15 -9
- data/config/locales/ru.yml +80 -74
- data/i18n-tasks.gemspec +9 -8
- data/lib/i18n/tasks.rb +2 -5
- data/lib/i18n/tasks/cli.rb +14 -18
- data/lib/i18n/tasks/command/commander.rb +2 -3
- data/lib/i18n/tasks/command/commands/health.rb +1 -1
- data/lib/i18n/tasks/command/commands/meta.rb +2 -2
- data/lib/i18n/tasks/command/commands/missing.rb +17 -19
- data/lib/i18n/tasks/command/commands/tree.rb +3 -3
- data/lib/i18n/tasks/command/commands/usages.rb +6 -5
- data/lib/i18n/tasks/command/commands/xlsx.rb +1 -1
- data/lib/i18n/tasks/command/dsl.rb +1 -2
- data/lib/i18n/tasks/command/option_parsers/enum.rb +6 -6
- data/lib/i18n/tasks/command/option_parsers/locale.rb +3 -1
- data/lib/i18n/tasks/command/options/data.rb +22 -21
- data/lib/i18n/tasks/command_error.rb +1 -3
- data/lib/i18n/tasks/configuration.rb +37 -27
- data/lib/i18n/tasks/console_context.rb +3 -2
- data/lib/i18n/tasks/data.rb +5 -4
- data/lib/i18n/tasks/data/adapter/json_adapter.rb +13 -12
- data/lib/i18n/tasks/data/adapter/yaml_adapter.rb +13 -14
- data/lib/i18n/tasks/data/file_formats.rb +15 -10
- data/lib/i18n/tasks/data/file_system_base.rb +18 -22
- data/lib/i18n/tasks/data/router/conservative_router.rb +3 -6
- data/lib/i18n/tasks/data/router/pattern_router.rb +4 -5
- data/lib/i18n/tasks/data/tree/node.rb +20 -19
- data/lib/i18n/tasks/data/tree/nodes.rb +4 -3
- data/lib/i18n/tasks/data/tree/siblings.rb +36 -29
- data/lib/i18n/tasks/data/tree/traversal.rb +32 -35
- data/lib/i18n/tasks/google_translation.rb +22 -25
- data/lib/i18n/tasks/html_keys.rb +2 -0
- data/lib/i18n/tasks/ignore_keys.rb +3 -2
- data/lib/i18n/tasks/key_pattern_matching.rb +9 -8
- data/lib/i18n/tasks/locale_list.rb +4 -6
- data/lib/i18n/tasks/locale_pathname.rb +8 -8
- data/lib/i18n/tasks/logging.rb +3 -3
- data/lib/i18n/tasks/missing_keys.rb +29 -31
- data/lib/i18n/tasks/plural_keys.rb +6 -7
- data/lib/i18n/tasks/references.rb +72 -41
- data/lib/i18n/tasks/reports/base.rb +8 -7
- data/lib/i18n/tasks/reports/spreadsheet.rb +15 -16
- data/lib/i18n/tasks/reports/terminal.rb +32 -32
- data/lib/i18n/tasks/scanners/file_scanner.rb +6 -5
- data/lib/i18n/tasks/scanners/files/caching_file_finder_provider.rb +1 -2
- data/lib/i18n/tasks/scanners/files/caching_file_reader.rb +0 -1
- data/lib/i18n/tasks/scanners/files/file_finder.rb +12 -15
- data/lib/i18n/tasks/scanners/files/file_reader.rb +0 -1
- data/lib/i18n/tasks/scanners/occurrence_from_position.rb +8 -7
- data/lib/i18n/tasks/scanners/pattern_mapper.rb +2 -2
- data/lib/i18n/tasks/scanners/pattern_scanner.rb +9 -7
- data/lib/i18n/tasks/scanners/pattern_with_scope_scanner.rb +1 -2
- data/lib/i18n/tasks/scanners/relative_keys.rb +11 -11
- data/lib/i18n/tasks/scanners/results/key_occurrences.rb +3 -4
- data/lib/i18n/tasks/scanners/results/occurrence.rb +8 -7
- data/lib/i18n/tasks/scanners/ruby_ast_call_finder.rb +2 -2
- data/lib/i18n/tasks/scanners/ruby_ast_scanner.rb +39 -31
- data/lib/i18n/tasks/scanners/scanner_multiplexer.rb +9 -3
- data/lib/i18n/tasks/split_key.rb +5 -6
- data/lib/i18n/tasks/stats.rb +10 -8
- data/lib/i18n/tasks/string_interpolation.rb +1 -1
- data/lib/i18n/tasks/unused_keys.rb +2 -2
- data/lib/i18n/tasks/used_keys.rb +47 -43
- data/lib/i18n/tasks/version.rb +1 -1
- data/templates/rspec/i18n_spec.rb +2 -2
- metadata +30 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cec4fddc37a4bbc56edf707c49e247e8418a8199
|
4
|
+
data.tar.gz: 38edd490aaa36f481f2c0ae7868649c87ebad8ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
27
|
+
gem 'i18n-tasks', '~> 0.9.7'
|
28
28
|
```
|
29
29
|
|
30
30
|
Copy the default [configuration file](#configuration):
|
data/Rakefile
CHANGED
data/bin/i18n-tasks
CHANGED
data/config/locales/en.yml
CHANGED
@@ -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:
|
25
|
-
|
26
|
-
|
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:
|
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:
|
79
|
-
|
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:
|
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:
|
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:
|
data/config/locales/ru.yml
CHANGED
@@ -2,100 +2,106 @@
|
|
2
2
|
ru:
|
3
3
|
i18n_tasks:
|
4
4
|
add_missing:
|
5
|
-
added:
|
5
|
+
added: Добавлены ключи (%{count})
|
6
6
|
cmd:
|
7
7
|
args:
|
8
|
-
default_text:
|
8
|
+
default_text: 'По умолчанию: %{value}'
|
9
9
|
desc:
|
10
|
-
confirm:
|
11
|
-
data_format:
|
12
|
-
key_pattern:
|
13
|
-
key_pattern_to_rename:
|
14
|
-
locale:
|
15
|
-
locale_to_translate_from:
|
16
|
-
locales_filter:
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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:
|
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:
|
35
|
-
health:
|
36
|
-
irb:
|
37
|
-
missing:
|
38
|
-
normalize:
|
39
|
-
remove_unused:
|
40
|
-
translate_missing:
|
41
|
-
tree_convert:
|
42
|
-
tree_filter:
|
43
|
-
tree_merge:
|
44
|
-
tree_rename_key:
|
45
|
-
tree_set_value:
|
46
|
-
tree_subtract:
|
47
|
-
tree_translate:
|
48
|
-
unused:
|
49
|
-
xlsx_report:
|
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:
|
60
|
-
invalid_locale:
|
62
|
+
invalid_format: 'Неизвестный формат %{invalid}. Форматы: %{valid}.'
|
63
|
+
invalid_locale: Неверный язык %{invalid}
|
61
64
|
invalid_missing_type:
|
62
|
-
one:
|
63
|
-
other:
|
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:
|
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:
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
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:
|
82
|
-
|
83
|
-
|
84
|
-
|
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:
|
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:
|
93
|
-
other:
|
94
|
-
noop:
|
95
|
-
removed:
|
98
|
+
one: Один перевод будут удалён из %{locales}.
|
99
|
+
other: Переводы (%{count}) будут удалены из %{locales}.
|
100
|
+
noop: Нет неиспользуемых ключей
|
101
|
+
removed: Удалены ключи (%{count})
|
96
102
|
translate_missing:
|
97
|
-
translated:
|
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 =
|
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
|
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
|
33
|
-
s.files
|
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
|
-
|
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 =
|
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'
|
data/lib/i18n/tasks/cli.rb
CHANGED
@@ -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('_'
|
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('-'
|
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?('-'
|
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?('-'
|
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,
|
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(','
|
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
|
176
|
-
f.start_with?('--'
|
177
|
-
|
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 <
|
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 '_'
|
22
|
-
log_verbose "task: #{public_name}(#{opts.map { |k, v| "#{k}: #{v.inspect}" } * ', '
|
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
|