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.
- 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
|