i18n-tasks 0.5.4 → 0.6.0

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +9 -0
  3. data/README.md +46 -36
  4. data/Rakefile +2 -2
  5. data/lib/i18n/tasks/base_task.rb +2 -0
  6. data/lib/i18n/tasks/commands.rb +55 -35
  7. data/lib/i18n/tasks/commands_base.rb +36 -9
  8. data/lib/i18n/tasks/configuration.rb +14 -13
  9. data/lib/i18n/tasks/console_context.rb +0 -1
  10. data/lib/i18n/tasks/data.rb +2 -2
  11. data/lib/i18n/tasks/data/adapter/json_adapter.rb +6 -2
  12. data/lib/i18n/tasks/data/file_formats.rb +19 -4
  13. data/lib/i18n/tasks/data/file_system_base.rb +1 -1
  14. data/lib/i18n/tasks/data/tree/node.rb +11 -37
  15. data/lib/i18n/tasks/data/tree/nodes.rb +6 -2
  16. data/lib/i18n/tasks/data/tree/siblings.rb +53 -29
  17. data/lib/i18n/tasks/data/tree/traversal.rb +4 -2
  18. data/lib/i18n/tasks/fill_tasks.rb +5 -2
  19. data/lib/i18n/tasks/ignore_keys.rb +1 -1
  20. data/lib/i18n/tasks/locale_pathname.rb +1 -1
  21. data/lib/i18n/tasks/logging.rb +2 -0
  22. data/lib/i18n/tasks/missing_keys.rb +74 -31
  23. data/lib/i18n/tasks/plural_keys.rb +4 -3
  24. data/lib/i18n/tasks/reports/base.rb +8 -5
  25. data/lib/i18n/tasks/reports/spreadsheet.rb +15 -3
  26. data/lib/i18n/tasks/reports/terminal.rb +62 -23
  27. data/lib/i18n/tasks/scanners/base_scanner.rb +4 -2
  28. data/lib/i18n/tasks/scanners/relative_keys.rb +21 -0
  29. data/lib/i18n/tasks/split_key.rb +39 -0
  30. data/lib/i18n/tasks/used_keys.rb +1 -1
  31. data/lib/i18n/tasks/version.rb +1 -1
  32. data/spec/fixtures/app/views/index.html.slim +2 -0
  33. data/spec/i18n_tasks_spec.rb +19 -5
  34. data/spec/locale_pathname_spec.rb +24 -0
  35. data/spec/locale_tree/siblings_spec.rb +41 -4
  36. data/spec/split_key_spec.rb +27 -0
  37. data/spec/support/i18n_tasks_output_matcher.rb +7 -13
  38. data/spec/support/trees.rb +4 -0
  39. data/templates/config/i18n-tasks.yml +82 -0
  40. data/templates/rspec/i18n_spec.rb +18 -0
  41. metadata +10 -3
  42. data/lib/i18n/tasks/relative_keys.rb +0 -19
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'SplitKey' do
4
+ include SplitKey
5
+
6
+ [['', %w()],
7
+ ['a', %w(a)],
8
+ ['a.b', %w(a b)],
9
+ ['a.b.', %w(a b)],
10
+ ['a.b.c', %w(a b c)],
11
+ ['a.#{b.c}', %w(a #{b.c})],
12
+ ['a.#{b.c}.', %w(a #{b.c})],
13
+ ['a.#{b.c}.d', %w(a #{b.c} d)],
14
+ ['a.#{b.c}.d.[e.f]', %w(a #{b.c} d [e.f])],
15
+ ].each do |(arg, ret)|
16
+ it "#{arg} is split into #{ret.inspect}" do
17
+ expect(split_key arg).to eq(ret)
18
+ end
19
+ end
20
+
21
+ it 'limits results to second argument' do
22
+ expect(split_key 'a.b.c', 1).to eq(['a.b.c'])
23
+ expect(split_key 'a.b.c', 2).to eq(['a', 'b.c'])
24
+ expect(split_key 'a.b.c.', 2).to eq(['a', 'b.c.'])
25
+ end
26
+
27
+ end
@@ -6,23 +6,17 @@ RSpec::Matchers.define :be_i18n_keys do |expected|
6
6
 
7
7
  def extract_keys(actual)
8
8
  actual = Term::ANSIColor.uncolor(actual).split("\n").map(&:presence).compact
9
- actual = actual[3..-2] if actual[0] = /^\s*[+-]+\s*$/
9
+ actual = actual[3..-2]
10
10
  actual = actual.map { |row|
11
+ next if row =~ /^\|\s+\|/
11
12
  row.gsub(/(?:\s|^)\|(?:\s|$)/, ' ').gsub(/\s+/, ' ').strip.split(' ').map(&:presence).compact
12
- }
13
+ }.compact
13
14
  return [] if actual.empty?
14
- if actual[0][1] =~ /([✗∅=])/
15
- locale_col = 0
16
- key_col = 2
17
- elsif actual[0].length == 3
18
- locale_col = 0
19
- key_col = 1
20
- else
21
- key_col = 0
22
- end
15
+ locale_col = 0
16
+ key_col = 1
23
17
  actual.map { |row|
24
- key = row[key_col]
25
- key = row[locale_col] + '.' + key if locale_col
18
+ key =
19
+ key = "#{row[locale_col]}.#{row[key_col]}"
26
20
  key = key[0..-2] if key.end_with?(':')
27
21
  key
28
22
  }.compact
@@ -8,4 +8,8 @@ module Trees
8
8
  def build_tree(hash)
9
9
  I18n::Tasks::Data::Tree::Siblings.from_nested_hash(hash)
10
10
  end
11
+
12
+ def build_node(attr = {})
13
+ I18n::Tasks::Data::Tree::Node.new(attr)
14
+ end
11
15
  end
@@ -0,0 +1,82 @@
1
+ # i18n-tasks find and manage missing and unused translations ⚙ https://github.com/glebm/i18n-tasks
2
+
3
+ base_locale: en
4
+ ## i18n-tasks detects locales automatically from the existing locale files
5
+ ## uncomment to set locales explicitly
6
+ # locales: [en, es, fr]
7
+
8
+ # Read and write locale data
9
+ data:
10
+ ## by default, translation data are read from the file system, or you can provide a custom data adapter
11
+ # adapter: I18n::Tasks::Data::FileSystem
12
+
13
+ # Locale files to read from
14
+ read:
15
+ - config/locales/%{locale}.yml
16
+ # - config/locales/*.%{locale}.yml
17
+ # - config/locales/**/*.%{locale}.yml
18
+
19
+ # key => file routes, matched top to bottom
20
+ write:
21
+ ## E.g., write devise and simple form keys to their respective files
22
+ # - ['{devise, simple_form}.*', 'config/locales/\1.%{locale.yml}']
23
+ # Catch-all
24
+ - config/locales/%{locale}.yml
25
+ # `i18n-tasks normalize -p` will force move the keys according to these rules
26
+
27
+ # YAML / JSON serializer options, passed to load / dump / parse / serialize
28
+ yaml:
29
+ write:
30
+ ## do not wrap lines at 80 characters (override default)
31
+ # line_width: -1
32
+ json:
33
+ write:
34
+ # pretty print JSON
35
+ indent: ' '
36
+ space: ' '
37
+ object_nl: "\n"
38
+ array_nl: "\n"
39
+
40
+ # Find translate calls
41
+ search:
42
+ ## Default scanner finds t() and I18n.t() calls
43
+ # scanner: I18n::Tasks::Scanners::PatternWithScopeScanner
44
+
45
+ ## Paths to search in, passed to File.find
46
+ paths:
47
+ - app/
48
+
49
+ ## Root for resolving relative keys (default)
50
+ # relative_roots:
51
+ # - app/views
52
+
53
+ ## File.fnmatch patterns to exclude from search (default)
54
+ # exclude: ["*.jpg", "*.png", "*.gif", "*.svg", "*.ico", "*.eot", "*.ttf", "*.woff", "*.pdf"]
55
+
56
+ ## Or, File.fnmatch patterns to include
57
+ # include: ["*.rb", "*.html.slim"]
58
+
59
+ ## Lines starting with # or / are ignored by default
60
+ # ignore_lines:
61
+ # - "^\\s*[#/](?!\\si18n-tasks-use)"
62
+
63
+ ## Consider these keys not missing
64
+ # ignore_missing:
65
+ # - pagination.views.*
66
+
67
+ ## Consider these keys used
68
+ # ignore_unused:
69
+ # - 'simple_form.{yes,no}'
70
+ # - 'simple_form.{placeholders,hints,labels}.*'
71
+ # - 'simple_form.{error_notification,required}.:'
72
+
73
+ ## Exclude these keys from `i18n-tasks eq-base' report
74
+ # ignore_eq_base:
75
+ # all:
76
+ # - common.ok
77
+ # fr,es:
78
+ # - common.brand
79
+
80
+ ## Exclude these keys from all of the reports
81
+ # ignore:
82
+ # - kaminari.*
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'i18n/tasks'
3
+
4
+ describe 'I18n' do
5
+ let(:i18n) { I18n::Tasks::BaseTask.new }
6
+ let(:missing_keys) { i18n.missing_keys }
7
+ let(:unused_keys) { i18n.unused_keys }
8
+
9
+ it 'does not have missing keys' do
10
+ expect(missing_keys).to be_empty,
11
+ "Missing #{missing_keys.leaves.count} i18n keys, run `i18n-tasks missing' to show them"
12
+ end
13
+
14
+ it 'does not have unused keys' do
15
+ expect(i18n.unused_keys).to be_empty,
16
+ "#{unused_keys.leaves.count} unused i18n keys, run `i18n-tasks unused' to show them"
17
+ end
18
+ end
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.5.4
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - glebm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-04 00:00:00.000000000 Z
11
+ date: 2014-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubis
@@ -229,13 +229,14 @@ files:
229
229
  - lib/i18n/tasks/logging.rb
230
230
  - lib/i18n/tasks/missing_keys.rb
231
231
  - lib/i18n/tasks/plural_keys.rb
232
- - lib/i18n/tasks/relative_keys.rb
233
232
  - lib/i18n/tasks/reports/base.rb
234
233
  - lib/i18n/tasks/reports/spreadsheet.rb
235
234
  - lib/i18n/tasks/reports/terminal.rb
236
235
  - lib/i18n/tasks/scanners/base_scanner.rb
237
236
  - lib/i18n/tasks/scanners/pattern_scanner.rb
238
237
  - lib/i18n/tasks/scanners/pattern_with_scope_scanner.rb
238
+ - lib/i18n/tasks/scanners/relative_keys.rb
239
+ - lib/i18n/tasks/split_key.rb
239
240
  - lib/i18n/tasks/unused_keys.rb
240
241
  - lib/i18n/tasks/used_keys.rb
241
242
  - lib/i18n/tasks/version.rb
@@ -250,12 +251,14 @@ files:
250
251
  - spec/google_translate_spec.rb
251
252
  - spec/i18n_tasks_spec.rb
252
253
  - spec/key_pattern_matching_spec.rb
254
+ - spec/locale_pathname_spec.rb
253
255
  - spec/locale_tree/siblings_spec.rb
254
256
  - spec/pattern_scanner_spec.rb
255
257
  - spec/plural_keys_spec.rb
256
258
  - spec/readme_spec.rb
257
259
  - spec/relative_keys_spec.rb
258
260
  - spec/spec_helper.rb
261
+ - spec/split_key_spec.rb
259
262
  - spec/support/capture_std.rb
260
263
  - spec/support/fixtures.rb
261
264
  - spec/support/i18n_tasks_output_matcher.rb
@@ -263,6 +266,8 @@ files:
263
266
  - spec/support/test_codebase.rb
264
267
  - spec/support/trees.rb
265
268
  - spec/used_keys_spec.rb
269
+ - templates/config/i18n-tasks.yml
270
+ - templates/rspec/i18n_spec.rb
266
271
  homepage: https://github.com/glebm/i18n-tasks
267
272
  licenses:
268
273
  - MIT
@@ -301,12 +306,14 @@ test_files:
301
306
  - spec/google_translate_spec.rb
302
307
  - spec/i18n_tasks_spec.rb
303
308
  - spec/key_pattern_matching_spec.rb
309
+ - spec/locale_pathname_spec.rb
304
310
  - spec/locale_tree/siblings_spec.rb
305
311
  - spec/pattern_scanner_spec.rb
306
312
  - spec/plural_keys_spec.rb
307
313
  - spec/readme_spec.rb
308
314
  - spec/relative_keys_spec.rb
309
315
  - spec/spec_helper.rb
316
+ - spec/split_key_spec.rb
310
317
  - spec/support/capture_std.rb
311
318
  - spec/support/fixtures.rb
312
319
  - spec/support/i18n_tasks_output_matcher.rb
@@ -1,19 +0,0 @@
1
- # coding: utf-8
2
- module I18n
3
- module Tasks
4
- module RelativeKeys
5
- # @param key [String] relative i18n key (starts with a .)
6
- # @param path [String] path to the file containing the key
7
- # @return [String] absolute version of the key
8
- def absolutize_key(key, path, roots = relative_roots)
9
- # normalized path
10
- path = File.expand_path path
11
- (path_root = roots.map { |path| File.expand_path path }.sort.reverse.detect { |root| path.start_with?(root + '/') }) or
12
- raise CommandError.new("Error scanning #{path}: cannot resolve relative key \"#{key}\".\nSet relative_roots in config/i18n-tasks.yml (currently #{relative_roots.inspect})")
13
- # key prefix based on path
14
- prefix = path.gsub(%r(#{path_root}/|(\.[^/]+)*$), '').tr('/', '.').gsub(%r(\._), '.')
15
- "#{prefix}#{key}"
16
- end
17
- end
18
- end
19
- end