i18n-tasks 0.7.12 → 0.7.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9d57ea517b4561e2eb31ddee6376bb9d65ef9c7
4
- data.tar.gz: ddaf2b27bca1586c84625864809c970ac697e8de
3
+ metadata.gz: f23b45a33ecdc2b1ff1ce24733bbfc7561e64462
4
+ data.tar.gz: 4b09900b186afbf6ee67276cca45847f0d8e15f5
5
5
  SHA512:
6
- metadata.gz: 669191968390c3ed44ba2537ecd51603a76f56f542c82499dbf3ce89d5c0b303085ba6d37ba40a0099c7947cf319a42e2b3513756aacf2c2f40c89dd592e9396
7
- data.tar.gz: 88f3289f9e4734a074056d6be1d0310c2c8299c98679988664f62819cf39fa9b11ebb58df353bed86dc4fca21f72bed5bc784c5af0ba9820434e0fd18a6ead89
6
+ metadata.gz: 8b1cca5e5a2f5ede2defb56fe16bf9f15ba1546c2b610ebaeb282538611a800ad93f8cfb7521b13888cbecda2ca73e2718e2624250f989ffd0a7ad7350a557cf
7
+ data.tar.gz: d42a79921370c760f5fc557c9344d47e921580abf198fb00e19138474825b609f80104965eb7fc753de3ecacbf01a5e46390e8898e44c5a71c6806b2524c24ba
@@ -1,11 +1,13 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.0
4
- - 2.1.5
5
- - 2.0.0
3
+ - 2.2.1
6
4
  - 1.9.3
7
5
  - jruby
8
- - rbx-2.4.1
6
+ - rbx
7
+ # travis uses old bundler (https://travis-ci.org/glebm/i18n-tasks/jobs/53485782)
8
+ before_install: gem install bundler
9
+ cache: bundler
10
+ script: bundle exec rspec
9
11
  env:
10
12
  global:
11
13
  - TRAVIS=1
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.7.13
2
+
3
+ * Fix relative keys when controller name consists of more than one word by [Yuji Nakayama](https://github.com/yujinakayama) [#132](https://github.com/glebm/i18n-tasks/pull/132).
4
+ * Support keys with UTF8 word characters in the name. [#133](https://github.com/glebm/i18n-tasks/issues/133).
5
+ * Change missing report column title from "Details" to "Value in other locales or source", display the locale [#130](https://github.com/glebm/i18n-tasks/issues/130).
6
+
1
7
  ## 0.7.12
2
8
 
3
9
  * Handle relative keys in controllers nested in modules by [Alexander Tipugin](https://github.com/atipugin). [#128](https://github.com/glebm/i18n-tasks/issues/128).
data/Gemfile CHANGED
@@ -4,7 +4,8 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  group :development do
7
- gem 'byebug', platform: :mri_21, require: false
7
+ gem 'byebug', platforms: [:mri_21, :mri_22], require: false
8
+ gem 'rubinius-debugger', platform: :rbx, require: false
8
9
  end
9
10
 
10
11
  gem 'codeclimate-test-reporter', group: :test, require: nil
data/README.md CHANGED
@@ -22,7 +22,7 @@ i18n-tasks can be used with any project using the ruby [i18n gem][i18n-gem] (def
22
22
  Add it to the Gemfile:
23
23
 
24
24
  ```ruby
25
- gem 'i18n-tasks', '~> 0.7.12'
25
+ gem 'i18n-tasks', '~> 0.7.13'
26
26
  ```
27
27
 
28
28
  Copy default [configuration file](#configuration) (optional):
@@ -2,7 +2,9 @@
2
2
  en:
3
3
  i18n_tasks:
4
4
  add_missing:
5
- added: Added %{count} keys
5
+ added:
6
+ one: Added %{count} key
7
+ other: Added %{count} keys
6
8
  cmd:
7
9
  args:
8
10
  default_all: 'Default: all'
@@ -67,7 +69,6 @@ en:
67
69
  common:
68
70
  base_value: Base Value
69
71
  continue_q: Continue?
70
- details: Details
71
72
  key: Key
72
73
  locale: Locale
73
74
  n_more: "%{count} more"
@@ -88,6 +89,7 @@ en:
88
89
  health:
89
90
  no_keys_detected: No keys detected. Check data.read in config/i18n-tasks.yml.
90
91
  missing:
92
+ details_title: Value in other locales or source
91
93
  none: No translations are missing.
92
94
  remove_unused:
93
95
  confirm:
@@ -68,7 +68,6 @@ ru:
68
68
  common:
69
69
  base_value: "Исходное значение"
70
70
  continue_q: "Продолжить?"
71
- details: "Детали"
72
71
  key: "Ключ"
73
72
  locale: "Язык"
74
73
  n_more: "ещё %{count}"
@@ -82,13 +81,14 @@ ru:
82
81
  title: "Данные (%{locales}):"
83
82
  google_translate:
84
83
  errors:
85
- no_api_key: Задайте ключ API Google через переменную окружения GOOGLE_TRANSLATE_API_KEY
86
- или translation.api_key в config/i18n-tasks.yml. Получите ключ через https://code.google.com/apis/console.
84
+ no_api_key: "Задайте ключ API Google через переменную окружения GOOGLE_TRANSLATE_API_KEY или
85
+ translation.api_key в config/i18n-tasks.yml. Получите ключ через https://code.google.com/apis/console."
87
86
  no_results: Google Translate не дал результатов. Убедитесь в том, что платежная информация
88
87
  добавлена в https://code.google.com/apis/console.
89
88
  health:
90
89
  no_keys_detected: "Ключи не обнаружены. Проверьте data.read в config/i18n-tasks.yml."
91
90
  missing:
91
+ details_title: "На других языках или в коде"
92
92
  none: "Всё переведено."
93
93
  remove_unused:
94
94
  confirm:
@@ -43,12 +43,11 @@ module I18n::Tasks
43
43
  cmd :tree_rename_key,
44
44
  args: '<key> <name> [tree]',
45
45
  desc: t('i18n_tasks.cmd.desc.tree_rename_key'),
46
- opt: [
47
- cmd_opt(:pattern).merge(short: :k, long: :key=, desc: proc {
48
- t('i18n_tasks.cmd.args.desc.key_pattern_to_rename') }),
49
- cmd_opt(:pattern).merge(short: :n, long: :name=, desc: proc {
50
- t('i18n_tasks.cmd.args.desc.new_key_name') })
51
- ] + cmd_opts(:data_format)
46
+ opt: [cmd_opt(:pattern).merge(short: :k, long: :key=,
47
+ desc: t('i18n_tasks.cmd.args.desc.key_pattern_to_rename')),
48
+ cmd_opt(:pattern).merge(short: :n, long: :name=,
49
+ desc: t('i18n_tasks.cmd.args.desc.new_key_name')),
50
+ *cmd_opts(:data_format)]
52
51
 
53
52
  def tree_rename_key(opt = {})
54
53
  key = opt_or_arg! :key, opt
@@ -43,10 +43,10 @@ module I18n::Tasks
43
43
  opt[key]
44
44
  end
45
45
 
46
- VALID_LOCALE_RE = /\A\w[\w\-\.]*\z/i
47
-
48
46
  def validate_locale!(locale)
49
- raise CommandError.new(I18n.t('i18n_tasks.cmd.errors.invalid_locale', invalid: locale)) if VALID_LOCALE_RE !~ locale
47
+ if Common::VALID_LOCALE_RE !~ locale
48
+ raise CommandError.new(I18n.t('i18n_tasks.cmd.errors.invalid_locale', invalid: locale))
49
+ end
50
50
  end
51
51
  end
52
52
  end
@@ -13,7 +13,7 @@ module I18n::Tasks::Configuration
13
13
 
14
14
  def file_config
15
15
  file = CONFIG_FILES.detect { |f| File.exist?(f) }
16
- config = file && YAML.load(Erubis::Eruby.new(File.read(file)).result)
16
+ config = file && YAML.load(Erubis::Eruby.new(File.read(file, encoding: 'UTF-8')).result)
17
17
  if config.present?
18
18
  config.with_indifferent_access.tap do |c|
19
19
  if c[:relative_roots]
@@ -34,7 +34,7 @@ module I18n
34
34
  end
35
35
 
36
36
  def load_file(path)
37
- adapter_parse ::File.read(path), self.class.adapter_name_for_path(path)
37
+ adapter_parse ::File.read(path, encoding: 'UTF-8'), self.class.adapter_name_for_path(path)
38
38
  end
39
39
 
40
40
  def write_tree(path, tree)
@@ -69,10 +69,12 @@ module I18n::Tasks
69
69
  data[compared_to].select_keys { |key, _node|
70
70
  locale_key_missing? locale, depluralize_key(key, compared_to)
71
71
  }.set_root_key!(locale, type: :missing_diff).keys { |_key, node|
72
+ # change path and locale to base
73
+ data = {locale: locale, missing_diff_locale: node.data[:locale]}
72
74
  if node.data.key?(:path)
73
- # change path and locale to base
74
- node.data.update path: LocalePathname.replace_locale(node.data[:path], node.data[:locale], locale), locale: locale
75
+ data[:path] = LocalePathname.replace_locale(node.data[:path], node.data[:locale], locale)
75
76
  end
77
+ node.data.update data
76
78
  }
77
79
  end
78
80
 
@@ -11,7 +11,6 @@ module I18n::Tasks::Reports
11
11
  add_missing_sheet p.workbook
12
12
  add_unused_sheet p.workbook
13
13
  add_eq_base_sheet p.workbook
14
- p.use_shared_strings = true
15
14
  FileUtils.mkpath(File.dirname(path))
16
15
  p.serialize(path)
17
16
  $stderr.puts Term::ANSIColor.green "Saved to #{path}"
@@ -11,9 +11,11 @@ module I18n
11
11
  forest = task.collapse_plural_nodes!(forest)
12
12
  if forest.present?
13
13
  print_title missing_title(forest)
14
- print_table headings: [cyan(bold(I18n.t('i18n_tasks.common.locale'))), cyan(bold I18n.t('i18n_tasks.common.key')), I18n.t('i18n_tasks.common.details')] do |t|
14
+ print_table headings: [cyan(bold(I18n.t('i18n_tasks.common.locale'))),
15
+ cyan(bold I18n.t('i18n_tasks.common.key')),
16
+ I18n.t('i18n_tasks.missing.details_title')] do |t|
15
17
  t.rows = sort_by_attr!(forest_to_attr(forest)).map do |a|
16
- [{value: cyan(a[:locale]), alignment: :center}, cyan(a[:key]), key_info(a)]
18
+ [{value: cyan(a[:locale]), alignment: :center}, cyan(a[:key]), missing_key_info(a)]
17
19
  end
18
20
  end
19
21
  else
@@ -74,6 +76,14 @@ module I18n
74
76
 
75
77
  private
76
78
 
79
+ def missing_key_info(leaf)
80
+ if leaf[:type] == :missing_used
81
+ first_occurrence leaf
82
+ else
83
+ "#{cyan leaf[:data][:missing_diff_locale]} #{leaf[:value].to_s.strip}"
84
+ end
85
+ end
86
+
77
87
  def print_occurrences(node, full_key = node.full_key)
78
88
  occurrences = node.data[:source_occurrences]
79
89
  puts "#{bold "#{full_key}"} #{green(occurrences.size.to_s) if occurrences.size > 1}"
@@ -84,8 +94,12 @@ module I18n
84
94
 
85
95
  def print_locale_key_value_table(locale_key_values)
86
96
  if locale_key_values.present?
87
- print_table headings: [bold(cyan(I18n.t('i18n_tasks.common.locale'))), bold(cyan(I18n.t('i18n_tasks.common.key'))), I18n.t('i18n_tasks.common.value')] do |t|
88
- t.rows = locale_key_values.map { |(locale, k, v)| [{value: cyan(locale), alignment: :center}, cyan(k), v.to_s] }
97
+ print_table headings: [bold(cyan(I18n.t('i18n_tasks.common.locale'))),
98
+ bold(cyan(I18n.t('i18n_tasks.common.key'))),
99
+ I18n.t('i18n_tasks.common.value')] do |t|
100
+ t.rows = locale_key_values.map { |(locale, k, v)|
101
+ [{value: cyan(locale), alignment: :center}, cyan(k), v.to_s]
102
+ }
89
103
  end
90
104
  else
91
105
  puts 'ø'
@@ -124,17 +138,7 @@ module I18n
124
138
  end
125
139
 
126
140
  def highlight_key(full_key, line, range = (0..-1))
127
- result = line.dup
128
- result[range] = result[range].sub(full_key) { |m| underline m }
129
- result
130
- end
131
-
132
- def key_info(leaf)
133
- if leaf[:type] == :missing_used
134
- first_occurrence leaf
135
- else
136
- leaf[:value].to_s.strip
137
- end
141
+ line.dup.tap { |s| s[range] = s[range].sub(full_key) { |m| underline m } }
138
142
  end
139
143
 
140
144
  def first_occurrence(leaf)
@@ -27,10 +27,11 @@ module I18n::Tasks::Scanners
27
27
  conf[:ignore_lines] = nil
28
28
  end
29
29
  conf[:ignore_lines] ||= {
30
- 'rb' => %q(^\s*#(?!\si18n-tasks-use)),
31
- 'haml' => %q(^\s*-\s*#(?!\si18n-tasks-use)),
32
- 'slim' => %q(^\s*(?:-#|/)(?!\si18n-tasks-use)),
33
- 'erb' => %q(^\s*<%\s*#(?!\si18n-tasks-use)),
30
+ 'rb' => %q(^\s*#(?!\si18n-tasks-use)),
31
+ 'haml' => %q(^\s*-\s*#(?!\si18n-tasks-use)),
32
+ 'slim' => %q(^\s*(?:-#|/)(?!\si18n-tasks-use)),
33
+ 'coffee' => %q(^\s*#(?!\si18n-tasks-use)),
34
+ 'erb' => %q(^\s*<%\s*#(?!\si18n-tasks-use)),
34
35
  }
35
36
  @ignore_lines_res = conf[:ignore_lines].inject({}) { |h, (ext, re)| h.update(ext => Regexp.new(re)) }
36
37
  @key_filter = nil
@@ -59,7 +60,7 @@ module I18n::Tasks::Scanners
59
60
 
60
61
  def read_file(path)
61
62
  result = nil
62
- File.open(path, 'rb') { |f| result = f.read }
63
+ File.open(path, 'rb', encoding: 'UTF-8') { |f| result = f.read }
63
64
  result
64
65
  end
65
66
 
@@ -126,7 +127,7 @@ module I18n::Tasks::Scanners
126
127
  key
127
128
  end
128
129
 
129
- VALID_KEY_CHARS = /[-\w.?!;]/
130
+ VALID_KEY_CHARS = /(?:[[:word:]]|[-.?!;À-ž])/
130
131
  VALID_KEY_RE_STRICT = /^#{VALID_KEY_CHARS}+$/
131
132
  VALID_KEY_RE = /^(#{VALID_KEY_CHARS}|[:\#{@}\[\]])+$/
132
133
 
@@ -60,7 +60,7 @@ module I18n::Tasks::Scanners
60
60
  end
61
61
 
62
62
  def closest_method(location)
63
- method = File.readlines(location[:src_path]).first(location[:line_num] - 1).reverse_each.find { |x| x=~ /\bdef\b/ }
63
+ method = File.readlines(location[:src_path], encoding: 'UTF-8').first(location[:line_num] - 1).reverse_each.find { |x| x=~ /\bdef\b/ }
64
64
  method &&= method.strip.sub(/^def\s*/, '').sub(/[\(\s;].*$/, '')
65
65
  method
66
66
  end
@@ -42,7 +42,8 @@ module I18n
42
42
  file_name = normalized_path.gsub(%r(#{path_root(normalized_path, roots)}/|(\.[^/]+)*$), '')
43
43
 
44
44
  if options[:closest_method].present?
45
- "#{file_name.split('_').first}.#{options[:closest_method]}".tr('/', '.')
45
+ controller_name = file_name.sub(/_controller$/, '')
46
+ "#{controller_name}.#{options[:closest_method]}".tr('/', '.')
46
47
  else
47
48
  file_name.tr('/', '.').gsub(%r(\._), '.')
48
49
  end
@@ -11,11 +11,10 @@ module I18n::Tasks
11
11
  # @return [Array<String>]
12
12
  def used_tree(opts = {})
13
13
  return scanner.with_key_filter(opts[:key_filter]) { used_tree(opts.except(:key_filter)) } if opts[:key_filter]
14
- key_attrs = scanner.keys(opts.slice(:strict))
15
14
  Data::Tree::Node.new(
16
15
  key: 'used',
17
16
  data: {key_filter: scanner.key_filter},
18
- children: Data::Tree::Siblings.from_key_attr(key_attrs)
17
+ children: Data::Tree::Siblings.from_key_attr(scanner.keys(opts.slice(:strict)))
19
18
  ).to_siblings
20
19
  end
21
20
 
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
  module I18n
3
3
  module Tasks
4
- VERSION = '0.7.12'
4
+ VERSION = '0.7.13'
5
5
  end
6
6
  end
@@ -41,17 +41,18 @@ describe 'Tree commands' do
41
41
  {'a' => {'b' => {'a' => '1'}}}
42
42
  end
43
43
 
44
+ def rename_key(from, to)
45
+ JSON.parse run_cmd(:tree_rename_key, key: from, name: to, format: 'json', arguments: [forest.to_json])
46
+ end
47
+
44
48
  it 'renames root node' do
45
- renamed = JSON.parse run_cmd(:tree_rename_key, key: 'a', name: 'x', format: 'json', arguments: [forest.to_json])
46
- expect(renamed).to eq(forest.tap { |f| f['x'] = f.delete('a') })
49
+ expect(rename_key('a', 'x')).to eq(forest.tap { |f| f['x'] = f.delete('a') })
47
50
  end
48
51
  it 'renames node' do
49
- renamed = JSON.parse run_cmd(:tree_rename_key, key: 'a.b', name: 'x', format: 'json', arguments: [forest.to_json])
50
- expect(renamed).to eq(forest.tap { |f| f['a']['x'] = f['a'].delete('b') })
52
+ expect(rename_key('a.b', 'x')).to eq(forest.tap { |f| f['a']['x'] = f['a'].delete('b') })
51
53
  end
52
54
  it 'renames leaf' do
53
- renamed = JSON.parse run_cmd(:tree_rename_key, key: 'a.b.a', name: 'x', format: 'json', arguments: [forest.to_json])
54
- expect(renamed).to eq(forest.tap { |f| f['a']['b']['x'] = f['a']['b'].delete('a') })
55
+ expect(rename_key('a.b.a', 'x')).to eq(forest.tap { |f| f['a']['b']['x'] = f['a']['b'].delete('a') })
55
56
  end
56
57
  end
57
58
 
@@ -95,7 +95,7 @@ describe 'File system i18n' do
95
95
  data[:en] = data[:en].merge!('en' => locale_data)
96
96
  files = %w(pizza.en.json sushi.en.json)
97
97
  expect(Dir['*.json'].sort).to eq(files.sort)
98
- files.each { |f| expect(JSON.parse(File.read f)['en']).to eq({File.basename(f, '.en.json') => keys}) }
98
+ files.each { |f| expect(JSON.parse(File.read(f, encoding: 'UTF-8'))['en']).to eq({File.basename(f, '.en.json') => keys}) }
99
99
  }
100
100
  end
101
101
  end
@@ -3,6 +3,7 @@
3
3
  / t(:fp_comment)
4
4
  / i18n-tasks-use t(:fn_comment)
5
5
  = t 'only_in_es'
6
+ #x = t 'not_a_comment'
6
7
  p #{t('ca.a')} #{t 'ca.b'} #{t "ca.c"}
7
8
  p #{t 'ca.d'} #{t 'ca.f', i: 'world'} #{t 'ca.e', i: 'world'}
8
9
  p #{t 'missing_in_es.a'} #{t 'same_in_es.a'} #{t 'blank_in_es.a'}
@@ -25,3 +26,4 @@ p = t 'devise.a'
25
26
  p = t :missing_symbol_key
26
27
  p #{t :"missing_symbol.key_two"} #{t :'missing_symbol.key_three'}
27
28
  = t 'present_in_es_but_not_en.a'
29
+ = t 'latin_extra.çüéö'
@@ -3,13 +3,13 @@ require 'spec_helper'
3
3
  require 'fileutils'
4
4
 
5
5
  describe 'i18n-tasks' do
6
- delegate :run_cmd, :i18n_task, :in_test_app_dir, to: :TestCodebase
6
+ delegate :run_cmd, :i18n_task, :in_test_app_dir, :i18n_cmd, to: :TestCodebase
7
7
 
8
8
  describe 'health' do
9
9
  it 'outputs stats' do
10
10
  t = i18n_task
11
11
  stats = in_test_app_dir { t.forest_stats(t.data_forest t.locales) }
12
- out = capture_stderr { run_cmd :health }
12
+ out = in_test_app_dir { capture_stderr { capture_stdout { i18n_cmd.run(:health) } } }
13
13
  stats.values.each do |v|
14
14
  expect(out).to include(v.to_s)
15
15
  end
@@ -37,26 +37,22 @@ describe 'i18n-tasks' do
37
37
  )
38
38
  }
39
39
  it 'detects missing' do
40
- capture_stderr do
41
- es_keys = expected_missing_keys.grep(/^es\./)
42
- expect(run_cmd :missing).to be_i18n_keys expected_missing_keys
43
- # locale argument
44
- expect(run_cmd :missing, locales: %w(es)).to be_i18n_keys es_keys
45
- expect(run_cmd :missing, arguments: %w(es)).to be_i18n_keys es_keys
46
- end
40
+ es_keys = expected_missing_keys.grep(/^es\./)
41
+ expect(run_cmd :missing).to be_i18n_keys expected_missing_keys
42
+ # locale argument
43
+ expect(run_cmd :missing, locales: %w(es)).to be_i18n_keys es_keys
44
+ expect(run_cmd :missing, arguments: %w(es)).to be_i18n_keys es_keys
47
45
  end
48
46
  end
49
47
 
50
48
  describe 'eq_base' do
51
49
  it 'detects eq_base' do
52
- capture_stderr do
53
- expect(run_cmd :eq_base).to be_i18n_keys %w(es.same_in_es.a)
54
- end
50
+ expect(run_cmd :eq_base).to be_i18n_keys %w(es.same_in_es.a)
55
51
  end
56
52
  end
57
53
 
58
54
  let(:expected_unused_keys) do
59
- %w(unused.a unused.numeric unused.plural).map do |k|
55
+ %w(unused.a unused.numeric unused.plural).map do |k|
60
56
  %w(en es).map { |l| "#{l}.#{k}" }
61
57
  end.reduce(:+)
62
58
  end
@@ -69,31 +65,25 @@ describe 'i18n-tasks' do
69
65
 
70
66
  describe 'unused' do
71
67
  it 'detects unused' do
72
- capture_stderr do
73
- expect(run_cmd :unused).to be_i18n_keys expected_unused_keys
74
- end
68
+ expect(run_cmd :unused).to be_i18n_keys expected_unused_keys
75
69
  end
76
70
 
77
71
  it 'detects unused (--strict)' do
78
- capture_stderr do
79
- expect(run_cmd :unused, strict: true).to be_i18n_keys expected_unused_keys_strict
80
- end
72
+ expect(run_cmd :unused, strict: true).to be_i18n_keys expected_unused_keys_strict
81
73
  end
82
74
  end
83
75
 
84
76
  describe 'remove_unused' do
85
77
  it 'removes unused' do
86
78
  in_test_app_dir do
87
- t = i18n_task
79
+ t = i18n_task
88
80
  unused = expected_unused_keys.map { |k| ::I18n::Tasks::SplitKey.split_key(k, 2)[1] }
89
81
  unused.each do |key|
90
82
  expect(t.key_value?(key, :en)).to be true
91
83
  expect(t.key_value?(key, :es)).to be true
92
84
  end
93
85
  ENV['CONFIRM'] = '1'
94
- capture_stderr {
95
- run_cmd :remove_unused
96
- }
86
+ run_cmd :remove_unused
97
87
  t.data.reload
98
88
  unused.each do |key|
99
89
  expect(t.key_value?(key, :en)).to be false
@@ -131,7 +121,7 @@ describe 'i18n-tasks' do
131
121
  describe 'xlsx_report' do
132
122
  it 'saves' do
133
123
  in_test_app_dir {
134
- capture_stderr { run_cmd :xlsx_report }
124
+ run_cmd :xlsx_report
135
125
  expect(File).to exist 'tmp/i18n-report.xlsx'
136
126
  FileUtils.cp('tmp/i18n-report.xlsx', '..')
137
127
  }
@@ -197,20 +187,18 @@ describe 'i18n-tasks' do
197
187
 
198
188
  describe 'find' do
199
189
  it 'prints usages' do
200
- capture_stderr do
201
- result = Term::ANSIColor.uncolor(run_cmd :find, arguments: ['used.*'])
202
- expect(result).to eq(<<-TXT)
190
+ result = Term::ANSIColor.uncolor(run_cmd :find, arguments: ['used.*'])
191
+ expect(result).to eq(<<-TXT)
203
192
  used.a 2
204
193
  app/views/usages.html.slim:1 p = t 'used.a'
205
194
  app/views/usages.html.slim:2 b = t 'used.a'
206
- TXT
207
- end
195
+ TXT
208
196
  end
209
197
  end
210
198
 
211
199
 
212
200
  # --- setup ---
213
- BENCH_KEYS = 10
201
+ BENCH_KEYS = ENV['BENCH_KEYS'].to_i
214
202
  before(:each) do
215
203
  gen_data = ->(v) {
216
204
  v_num = v.chars.map(&:ord).join('').to_i
@@ -242,21 +230,25 @@ used.a 2
242
230
  'devise' => {'a' => v},
243
231
  'scoped' => {'x' => v},
244
232
  'very' => {'scoped' => {'x' => v}},
245
- 'used' => {'a' => v}
233
+ 'used' => {'a' => v},
234
+ 'latin_extra' => {'çüéö' => v},
235
+ 'not_a_comment' => v
246
236
  }.tap { |r|
247
- gen = r["bench"] = {}
248
- BENCH_KEYS.times { |i| gen["key#{i}"] = v }
237
+ if BENCH_KEYS > 0
238
+ gen = r['bench'] = {}
239
+ BENCH_KEYS.times { |i| gen["key#{i}"] = v }
240
+ end
249
241
  }
250
242
  }
251
243
 
252
- en_data = gen_data.('EN_TEXT')
253
- es_data = gen_data.('ES_TEXT').except(
254
- 'missing_in_es', 'missing_in_es_plural_1', 'missing_in_es_plural_2')
255
- es_data['same_in_es']['a'] = 'EN_TEXT'
256
- es_data['blank_in_es']['a'] = ''
257
- es_data['ignore_eq_base_all']['a'] = 'EN_TEXT'
258
- es_data['ignore_eq_base_es']['a'] = 'EN_TEXT'
259
- es_data['only_in_es'] = 1
244
+ en_data = gen_data.('EN_TEXT')
245
+ es_data = gen_data.('ES_TEXT').except('missing_in_es', 'missing_in_es_plural_1', 'missing_in_es_plural_2')
246
+
247
+ es_data['same_in_es']['a'] = 'EN_TEXT'
248
+ es_data['blank_in_es']['a'] = ''
249
+ es_data['ignore_eq_base_all']['a'] = 'EN_TEXT'
250
+ es_data['ignore_eq_base_es']['a'] = 'EN_TEXT'
251
+ es_data['only_in_es'] = 1
260
252
  es_data['present_in_es_but_not_en'] = {'a' => 'ES_TEXT'}
261
253
 
262
254
  fs = fixtures_contents.merge(
@@ -29,6 +29,19 @@ describe 'Relative keys' do
29
29
  expect(key).to eq('users.create.success')
30
30
  end
31
31
 
32
+ context 'multiple words in controller name' do
33
+ it 'works' do
34
+ key = scanner.absolutize_key(
35
+ '.success',
36
+ 'app/controllers/admin_users_controller.rb',
37
+ %w(app/controllers),
38
+ 'create'
39
+ )
40
+
41
+ expect(key).to eq('admin_users.create.success')
42
+ end
43
+ end
44
+
32
45
  context 'nested in module' do
33
46
  it 'works' do
34
47
  key = scanner.absolutize_key(
@@ -15,7 +15,6 @@ RSpec::Matchers.define :be_i18n_keys do |expected|
15
15
  locale_col = 0
16
16
  key_col = 1
17
17
  actual.map { |row|
18
- key =
19
18
  key = "#{row[locale_col]}.#{row[key_col]}"
20
19
  key = key[0..-2] if key.end_with?(':')
21
20
  key
@@ -22,11 +22,7 @@ module TestCodebase
22
22
  end
23
23
 
24
24
  def run_cmd(name, *args, &block)
25
- in_test_app_dir do
26
- silence_stream($stderr) {
27
- capture_stdout { i18n_cmd.run(name, *args, &block) }
28
- }
29
- end
25
+ in_test_app_dir { capture_stdout { capture_stderr { i18n_cmd.run(name, *args, &block) } } }
30
26
  end
31
27
 
32
28
  def setup(files = {})
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: 0.7.12
4
+ version: 0.7.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - glebm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-05 00:00:00.000000000 Z
11
+ date: 2015-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubis
@@ -333,7 +333,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
333
333
  version: '0'
334
334
  requirements: []
335
335
  rubyforge_project:
336
- rubygems_version: 2.4.5
336
+ rubygems_version: 2.4.6
337
337
  signing_key:
338
338
  specification_version: 4
339
339
  summary: Manage localization and translation with the awesome power of static analysis