i18n_checker 0.5.0 → 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.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -1
- data/README.md +48 -1
- data/Rakefile +11 -1
- data/examples/unused/example.haml +1 -0
- data/examples/unused/example.rb +11 -0
- data/examples/unused/locales/en.yml +7 -0
- data/examples/unused/locales/ja.yml +7 -0
- data/i18n-checker.gemspec +3 -0
- data/lib/i18n_checker/command/check.rb +22 -0
- data/lib/i18n_checker/command/clean.rb +21 -0
- data/lib/i18n_checker/locale/file.rb +69 -7
- data/lib/i18n_checker/locale/files.rb +9 -0
- data/lib/i18n_checker/locale/text.rb +12 -0
- data/lib/i18n_checker/locale/texts.rb +16 -1
- data/lib/i18n_checker/locale.rb +8 -1
- data/lib/i18n_checker/{detector/locale_text_not_found.rb → not_found/detector.rb} +4 -4
- data/lib/i18n_checker/not_found/reporter/base.rb +17 -0
- data/lib/i18n_checker/not_found/reporter/default.rb +30 -0
- data/lib/i18n_checker/not_found/reporter.rb +2 -0
- data/lib/i18n_checker/{detector/detected_result.rb → not_found/result.rb} +2 -2
- data/lib/i18n_checker/{detector/text_result.rb → not_found/text.rb} +2 -2
- data/lib/i18n_checker/rake_task/{locale_check.rb → check.rb} +7 -6
- data/lib/i18n_checker/rake_task/clean.rb +50 -0
- data/lib/i18n_checker/rake_task.rb +2 -1
- data/lib/i18n_checker/unused/detector.rb +38 -0
- data/lib/i18n_checker/unused/reporter/base.rb +15 -0
- data/lib/i18n_checker/unused/reporter/default.rb +37 -0
- data/lib/i18n_checker/unused/reporter.rb +2 -0
- data/lib/i18n_checker/unused/result.rb +44 -0
- data/lib/i18n_checker/unused/text.rb +18 -0
- data/lib/i18n_checker/version.rb +1 -1
- data/lib/i18n_checker.rb +4 -6
- metadata +52 -11
- data/lib/i18n_checker/locale_text_not_found_checker.rb +0 -20
- data/lib/i18n_checker/reporter/default_reporter.rb +0 -28
- data/lib/i18n_checker/reporter/detect_result_reporter.rb +0 -15
- data/lib/i18n_checker/reporter.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f5558d107c756fa782ad6a425a9c13189e96fc5
|
4
|
+
data.tar.gz: 321f55bfa86d773d871532ce7c4aab9105e0eb31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f83fcce7f6caba897b78d27557090394e69802fd3034ecde81d2dbacafd992b4cbfb464a326535ac16615e9739152085de28b81003b834e685a74de5bd047d1f
|
7
|
+
data.tar.gz: df76434f18429622f5da5680e6b55a9db20d138f61d525d83b2bf6bb361b8415878095ebfde46fd55fd6dca76ccfa24305d065c46d07f209ccec6916a249800d
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
i18n_checker (0.
|
4
|
+
i18n_checker (0.6.0)
|
5
5
|
colorator (~> 1.1.0)
|
6
6
|
haml_parser (~> 0.4)
|
7
7
|
parser
|
@@ -44,6 +44,8 @@ GEM
|
|
44
44
|
diff-lcs (>= 1.2.0, < 2.0)
|
45
45
|
rspec-support (~> 3.6.0)
|
46
46
|
rspec-support (3.6.0)
|
47
|
+
rspec-temp_dir (1.0.0)
|
48
|
+
rspec (>= 3.0)
|
47
49
|
rubocop (0.47.1)
|
48
50
|
parser (>= 2.3.3.1, < 3.0)
|
49
51
|
powerpack (~> 0.1)
|
@@ -67,6 +69,7 @@ GEM
|
|
67
69
|
thor (0.19.4)
|
68
70
|
tins (1.13.2)
|
69
71
|
unicode-display_width (1.1.3)
|
72
|
+
yard (0.9.9)
|
70
73
|
|
71
74
|
PLATFORMS
|
72
75
|
ruby
|
@@ -78,8 +81,10 @@ DEPENDENCIES
|
|
78
81
|
onkcop
|
79
82
|
rake (~> 10.0)
|
80
83
|
rspec
|
84
|
+
rspec-temp_dir
|
81
85
|
simplecov
|
82
86
|
simplecov-console
|
87
|
+
yard
|
83
88
|
|
84
89
|
BUNDLED WITH
|
85
90
|
1.14.6
|
data/README.md
CHANGED
@@ -14,12 +14,18 @@ Current version supports Ruby source code, Haml template file.
|
|
14
14
|
|
15
15
|
## Basic usage
|
16
16
|
|
17
|
+
Detected out of reference text, Delete unused translation text at once.
|
17
18
|
Add the following tasks to your **Rakefile**.
|
18
19
|
|
19
20
|
```ruby
|
20
21
|
require 'i18n_checker/rake_task'
|
21
22
|
|
22
|
-
I18nChecker::RakeTask::
|
23
|
+
I18nChecker::RakeTask::Check.new do |task|
|
24
|
+
task.source_paths = FileList['app/models/*', 'app/views/*'] # haml templates, ruby sources
|
25
|
+
task.locale_file_paths = FileList['config/locales/*'] # locale file paths
|
26
|
+
end
|
27
|
+
|
28
|
+
I18nChecker::RakeTask::Clean do |task|
|
23
29
|
task.source_paths = FileList['app/models/*', 'app/views/*'] # haml templates, ruby sources
|
24
30
|
task.locale_file_paths = FileList['config/locales/*'] # locale file paths
|
25
31
|
end
|
@@ -29,6 +35,47 @@ After that we just execute the task.
|
|
29
35
|
|
30
36
|
```shell
|
31
37
|
bundle exec rake locale_check
|
38
|
+
bundle exec rake locale_clean
|
39
|
+
```
|
40
|
+
|
41
|
+
## Check translation of translated text
|
42
|
+
|
43
|
+
Detect translated text references that are broken.
|
44
|
+
It is useful for detecting text that is not in the translation file of a particular language.
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
require 'i18n_checker/rake_task'
|
48
|
+
|
49
|
+
I18nChecker::RakeTask::Check.new do |task|
|
50
|
+
task.source_paths = FileList['app/models/*', 'app/views/*'] # haml templates, ruby sources
|
51
|
+
task.locale_file_paths = FileList['config/locales/*'] # locale file paths
|
52
|
+
end
|
53
|
+
```
|
54
|
+
|
55
|
+
After that we just execute the task.
|
56
|
+
|
57
|
+
```shell
|
58
|
+
bundle exec rake locale_check
|
59
|
+
```
|
60
|
+
|
61
|
+
## Delete unused translated text
|
62
|
+
|
63
|
+
Using the **locale_clean** task you can delete unused translated text from the file.
|
64
|
+
Since you can delete translated text that you do not use safely, you can reduce the maintenance cost by running it periodically.
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
require 'i18n_checker/rake_task'
|
68
|
+
|
69
|
+
I18nChecker::RakeTask::Clean do |task|
|
70
|
+
task.source_paths = FileList['app/models/*', 'app/views/*'] # haml templates, ruby sources
|
71
|
+
task.locale_file_paths = FileList['config/locales/*'] # locale file paths
|
72
|
+
end
|
73
|
+
```
|
74
|
+
|
75
|
+
After that we just execute the task.
|
76
|
+
|
77
|
+
```shell
|
78
|
+
bundle exec rake locale_clean
|
32
79
|
```
|
33
80
|
|
34
81
|
## Run the test
|
data/Rakefile
CHANGED
@@ -1,12 +1,22 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
2
|
require 'rspec/core/rake_task'
|
3
|
+
require 'yard'
|
3
4
|
require 'i18n_checker/rake_task'
|
4
5
|
|
5
6
|
RSpec::Core::RakeTask.new(:spec)
|
6
7
|
|
7
|
-
I18nChecker::RakeTask::
|
8
|
+
I18nChecker::RakeTask::Check.new do |task|
|
8
9
|
task.source_paths = FileList['spec/fixtures/haml/*', 'spec/fixtures/ruby/*']
|
9
10
|
task.locale_file_paths = FileList['spec/fixtures/locales/**']
|
10
11
|
end
|
11
12
|
|
13
|
+
I18nChecker::RakeTask::Clean.new do |task|
|
14
|
+
task.source_paths = FileList['examples/unused/**']
|
15
|
+
task.locale_file_paths = FileList['examples/unused/locales/**']
|
16
|
+
end
|
17
|
+
|
18
|
+
YARD::Rake::YardocTask.new do |t|
|
19
|
+
t.files = ['lib/**/*.rb']
|
20
|
+
end
|
21
|
+
|
12
22
|
task :default => :spec
|
@@ -0,0 +1 @@
|
|
1
|
+
%p= t('nested.foo')
|
data/i18n-checker.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
21
|
spec.require_paths = ['lib']
|
22
|
+
spec.metadata['yard.run'] = 'yri'
|
22
23
|
spec.add_dependency 'haml_parser', '~> 0.4'
|
23
24
|
spec.add_dependency 'colorator', '~> 1.1.0'
|
24
25
|
spec.add_dependency 'parser'
|
@@ -29,4 +30,6 @@ Gem::Specification.new do |spec|
|
|
29
30
|
spec.add_development_dependency 'simplecov-console'
|
30
31
|
spec.add_development_dependency 'coveralls'
|
31
32
|
spec.add_development_dependency 'onkcop'
|
33
|
+
spec.add_development_dependency 'rspec-temp_dir'
|
34
|
+
spec.add_development_dependency 'yard'
|
32
35
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'i18n_checker/not_found/detector'
|
2
|
+
require 'i18n_checker/not_found/text'
|
3
|
+
require 'i18n_checker/not_found/result'
|
4
|
+
|
5
|
+
module I18nChecker
|
6
|
+
module Command
|
7
|
+
class Check
|
8
|
+
def initialize(locale_file_paths: [], source_paths: [], reporter:)
|
9
|
+
@reporter = reporter
|
10
|
+
@locale_texts = I18nChecker::Locale.texts_of(source_paths)
|
11
|
+
@locale_files = I18nChecker::Locale.load_of(locale_file_paths)
|
12
|
+
end
|
13
|
+
|
14
|
+
def check
|
15
|
+
not_found_detector = I18nChecker::NotFound::Detector.new(@locale_files)
|
16
|
+
not_found_result = @locale_texts.detect(not_found_detector)
|
17
|
+
@reporter.report not_found_result
|
18
|
+
yield not_found_result if block_given?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'i18n_checker/unused/detector'
|
2
|
+
|
3
|
+
module I18nChecker
|
4
|
+
module Command
|
5
|
+
class Clean
|
6
|
+
def initialize(locale_file_paths: [], source_paths: [], reporter:)
|
7
|
+
@reporter = reporter
|
8
|
+
@locale_texts = I18nChecker::Locale.texts_of(source_paths)
|
9
|
+
@locale_files = I18nChecker::Locale.load_of(locale_file_paths)
|
10
|
+
@unused_detector = I18nChecker::Unused::Detector.new(@locale_files)
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
unused_result = @locale_texts.detect(@unused_detector)
|
15
|
+
@reporter.report unused_result
|
16
|
+
unused_result.apply(@locale_files)
|
17
|
+
yield unused_result if block_given?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -2,29 +2,71 @@ require 'yaml'
|
|
2
2
|
|
3
3
|
module I18nChecker
|
4
4
|
module Locale
|
5
|
+
# Translation file for each language
|
6
|
+
#
|
7
|
+
# @attr_reader [String] file_name Translation file path
|
8
|
+
# @attr_reader [String] lang language
|
9
|
+
# @attr_reader [Hash<String,String>] locale_texts translation texts
|
5
10
|
class File
|
6
|
-
attr_reader :lang, :locale_texts
|
11
|
+
attr_reader :file_name, :lang, :locale_texts
|
7
12
|
|
8
13
|
class << self
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
14
|
+
# Read translation file
|
15
|
+
#
|
16
|
+
# @param yaml_file [String] Translation file path
|
17
|
+
# @return [I18nChecker::Locale::File] Translation file
|
13
18
|
def load_yaml_file(yaml_file)
|
14
|
-
|
19
|
+
new(yaml_file, YAML.load(::File.open(yaml_file, &:read)))
|
15
20
|
end
|
16
21
|
end
|
17
22
|
|
18
|
-
|
23
|
+
# Create a translation file
|
24
|
+
#
|
25
|
+
# @param yaml_file [String] Translation file path
|
26
|
+
# @param locale_texts [Hash<String,String>] translation text
|
27
|
+
def initialize(yaml_file, locale_texts = {})
|
19
28
|
lang = locale_texts.keys.first
|
20
29
|
@lang = lang.to_sym
|
21
30
|
@locale_texts = compact_of(locale_texts[lang] || {})
|
31
|
+
@file_name = yaml_file
|
22
32
|
end
|
23
33
|
|
34
|
+
# Check for translated text
|
35
|
+
#
|
36
|
+
# @param locale_text [Stirng] Translation text key
|
37
|
+
# @return [Boolean] Returns true if there is translated text
|
24
38
|
def include?(locale_text)
|
25
39
|
@locale_texts.key?(locale_text.text)
|
26
40
|
end
|
27
41
|
|
42
|
+
# Deletes the specified translation text
|
43
|
+
#
|
44
|
+
# @param locale_text [Array<Stirng>] Translation text key
|
45
|
+
# @return [I18nChecker::Locale::File] New translation file
|
46
|
+
def remove_texts(locale_texts)
|
47
|
+
registry = locale_texts.map { |locale_text| [locale_text, true] }.to_h
|
48
|
+
|
49
|
+
current_locale_texts = @locale_texts.dup
|
50
|
+
current_locale_texts.delete_if { |locale_text| registry.key?(locale_text) }
|
51
|
+
|
52
|
+
remain_texts = {}
|
53
|
+
remain_texts[@lang] = current_locale_texts
|
54
|
+
|
55
|
+
self.class.new(file_name, remain_texts)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Save the translation file
|
59
|
+
#
|
60
|
+
# @return [I18nChecker::Locale::File] translation file
|
61
|
+
def save
|
62
|
+
locale = {}
|
63
|
+
locale[@lang.to_s] = tree_of(locale_texts)
|
64
|
+
yaml_file = ::File.open(file_name, 'w')
|
65
|
+
yaml_file.write(YAML.dump(locale))
|
66
|
+
yaml_file.close
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
28
70
|
private
|
29
71
|
|
30
72
|
def compact_of(values = {}, path = KeyPath.new)
|
@@ -40,6 +82,26 @@ module I18nChecker
|
|
40
82
|
end
|
41
83
|
result
|
42
84
|
end
|
85
|
+
|
86
|
+
def tree_of(values = [])
|
87
|
+
result = {}
|
88
|
+
values.each do |path, value|
|
89
|
+
dest = nil
|
90
|
+
paths = path.split('.')
|
91
|
+
last_key = paths.last
|
92
|
+
paths.pop
|
93
|
+
paths.each do |p|
|
94
|
+
if result.key?(p)
|
95
|
+
dest = result[p]
|
96
|
+
else
|
97
|
+
result[p] = {}
|
98
|
+
dest = result[p]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
dest[last_key] = value
|
102
|
+
end
|
103
|
+
result
|
104
|
+
end
|
43
105
|
end
|
44
106
|
end
|
45
107
|
end
|
@@ -9,10 +9,19 @@ module I18nChecker
|
|
9
9
|
|
10
10
|
def_delegators :locale_files, :size, :each
|
11
11
|
|
12
|
+
# Translation files for each language
|
13
|
+
#
|
14
|
+
# @param locale_files [Array<I18nChecker::Locale::File>]
|
12
15
|
def initialize(locale_files = [])
|
13
16
|
@locale_files = locale_files
|
14
17
|
end
|
15
18
|
|
19
|
+
# Execute the specified block and delete the translation file
|
20
|
+
#
|
21
|
+
# @yield [file] Block to be evaluated
|
22
|
+
# @yieldparam [I18nChecker::Locale::File]
|
23
|
+
# @yieldreturn [Boolean]
|
24
|
+
# @return [I18nChecker::Locale::Files]
|
16
25
|
def delete_if(&block)
|
17
26
|
locale_files.delete_if(&block)
|
18
27
|
self
|
@@ -1,8 +1,20 @@
|
|
1
1
|
module I18nChecker
|
2
2
|
module Locale
|
3
|
+
# Translation text referenced from the file
|
4
|
+
#
|
5
|
+
# @attr_reader [String] file File referring to translated text
|
6
|
+
# @attr_reader [String] text Translation text key
|
7
|
+
# @attr_reader [Fixnum] line Line number of file
|
8
|
+
# @attr_reader [Fixnum] column Column number of file
|
3
9
|
class Text
|
4
10
|
attr_reader :file, :text, :line, :column
|
5
11
|
|
12
|
+
# Create translated text
|
13
|
+
#
|
14
|
+
# @param file [String] File referring to translated text
|
15
|
+
# @param text [String] Translation text key
|
16
|
+
# @param line [Fixnum] Line number of file
|
17
|
+
# @param column [Fixnum] Column number of file
|
6
18
|
def initialize(file:, text:, line:, column:)
|
7
19
|
@file = file
|
8
20
|
@text = text
|
@@ -3,27 +3,42 @@ require 'i18n_checker/locale/text'
|
|
3
3
|
|
4
4
|
module I18nChecker
|
5
5
|
module Locale
|
6
|
+
# List of translated text
|
7
|
+
#
|
6
8
|
class Texts
|
7
9
|
extend Forwardable
|
8
10
|
|
9
11
|
include Enumerable
|
10
12
|
|
11
|
-
def_delegators :texts, :size, :each
|
13
|
+
def_delegators :texts, :size, :each, :select
|
12
14
|
|
15
|
+
# Create list of translated text
|
16
|
+
#
|
17
|
+
# @param texts [Array<I18nChecker::Locale::Text>] List of translated text
|
13
18
|
def initialize(texts = [])
|
14
19
|
@texts = texts
|
15
20
|
end
|
16
21
|
|
22
|
+
# Combine lists of translated texts
|
23
|
+
#
|
24
|
+
# @param texts [Enumerable<I18nChecker::Locale::Text>] List of translated text
|
25
|
+
# @return [I18nChecker::Locale::Texts<I18nChecker::Locale::Text>] Returns the combined receiver itself
|
17
26
|
def concat(texts)
|
18
27
|
@texts.concat(texts.to_a)
|
19
28
|
self
|
20
29
|
end
|
21
30
|
|
31
|
+
# Delete translated text duplicates
|
32
|
+
#
|
33
|
+
# @return [I18nChecker::Locale::Texts<I18nChecker::Locale::Text>] Returns the combined receiver itself
|
22
34
|
def uniq!
|
23
35
|
@texts.uniq!
|
24
36
|
self
|
25
37
|
end
|
26
38
|
|
39
|
+
# Compare lists of translated texts
|
40
|
+
#
|
41
|
+
# @return [Boolean]
|
27
42
|
def ==(other)
|
28
43
|
@texts == other.to_a
|
29
44
|
end
|
data/lib/i18n_checker/locale.rb
CHANGED
@@ -6,11 +6,18 @@ require 'i18n_checker/locale/collector'
|
|
6
6
|
module I18nChecker
|
7
7
|
module Locale
|
8
8
|
module Methods
|
9
|
+
# Read specified translation file
|
10
|
+
#
|
11
|
+
# @return [I18nChecker::Locale::Files]
|
9
12
|
def load_of(locale_files)
|
10
|
-
|
13
|
+
files = locale_files.delete_if { |resource| ::File.directory?(resource) }.to_a
|
14
|
+
loaded_locale_files = files.map { |locale_file| I18nChecker::Locale::File.load_yaml_file(locale_file) }
|
11
15
|
Files.new(loaded_locale_files)
|
12
16
|
end
|
13
17
|
|
18
|
+
# Collect translation text from specified file list
|
19
|
+
#
|
20
|
+
# @return [I18nChecker::Locale::Texts]
|
14
21
|
def texts_of(resources)
|
15
22
|
caches = I18nChecker::Cache::Files.new
|
16
23
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module I18nChecker
|
2
|
-
module
|
3
|
-
class
|
2
|
+
module NotFound
|
3
|
+
class Detector
|
4
4
|
def initialize(locale_files)
|
5
5
|
@locale_files = locale_files
|
6
6
|
end
|
7
7
|
|
8
8
|
def detect(locale_texts)
|
9
9
|
results = locale_texts.map { |local_text| detect_not_found(local_text) }
|
10
|
-
|
10
|
+
Result.new(results.compact.flatten)
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
@@ -16,7 +16,7 @@ module I18nChecker
|
|
16
16
|
locale_files = @locale_files.dup
|
17
17
|
locale_files.delete_if { |locale_file| locale_file.include?(locale_text) }
|
18
18
|
locale_files.map do |locale_file|
|
19
|
-
|
19
|
+
Text.new(
|
20
20
|
locale_text: locale_text,
|
21
21
|
locale_file: locale_file
|
22
22
|
)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'colorator'
|
2
|
+
|
3
|
+
module I18nChecker
|
4
|
+
module NotFound
|
5
|
+
module Reporter
|
6
|
+
class Default < Base
|
7
|
+
CHECK_COMPLETED = 'Translation text checking is complete.'.freeze
|
8
|
+
|
9
|
+
def report(result)
|
10
|
+
return passed if result.empty?
|
11
|
+
failed(result)
|
12
|
+
end
|
13
|
+
|
14
|
+
def passed
|
15
|
+
logger.info CHECK_COMPLETED.green
|
16
|
+
logger.info 'There was no translated text that can not be referenced'.green
|
17
|
+
end
|
18
|
+
|
19
|
+
def failed(result)
|
20
|
+
logger.info CHECK_COMPLETED.red
|
21
|
+
logger.info "There are settings where translated text can not be found\n".red
|
22
|
+
result.locale_texts.each do |locale_text|
|
23
|
+
logger.info locale_text.file.cyan.to_s
|
24
|
+
logger.info " line:#{locale_text.line}, column:#{locale_text.column} - #{locale_text.lang}.#{locale_text.text}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -2,12 +2,13 @@ require 'rake'
|
|
2
2
|
require 'rake/tasklib'
|
3
3
|
require 'i18n_checker/cache'
|
4
4
|
require 'i18n_checker/locale'
|
5
|
-
require 'i18n_checker/reporter'
|
6
|
-
require 'i18n_checker/
|
5
|
+
require 'i18n_checker/not_found/reporter/base'
|
6
|
+
require 'i18n_checker/not_found/reporter/default'
|
7
|
+
require 'i18n_checker/command/check'
|
7
8
|
|
8
9
|
module I18nChecker
|
9
10
|
module RakeTask
|
10
|
-
class
|
11
|
+
class Check < ::Rake::TaskLib
|
11
12
|
attr_accessor :name
|
12
13
|
attr_accessor :reporter
|
13
14
|
attr_accessor :source_paths
|
@@ -22,7 +23,7 @@ module I18nChecker
|
|
22
23
|
@logger.formatter = proc { |_severity, _datetime, _progname, message|
|
23
24
|
"#{message}\n"
|
24
25
|
}
|
25
|
-
@reporter = I18nChecker::Reporter::
|
26
|
+
@reporter = I18nChecker::NotFound::Reporter::Default.new(logger: logger)
|
26
27
|
yield self if block_given?
|
27
28
|
define
|
28
29
|
end
|
@@ -35,12 +36,12 @@ module I18nChecker
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def run_task
|
38
|
-
|
39
|
+
commmand = I18nChecker::Command::Check.new(
|
39
40
|
reporter: reporter,
|
40
41
|
source_paths: source_paths,
|
41
42
|
locale_file_paths: locale_file_paths
|
42
43
|
)
|
43
|
-
|
44
|
+
commmand.check do |result|
|
44
45
|
exit 1 unless result.empty?
|
45
46
|
end
|
46
47
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
require 'i18n_checker/cache'
|
4
|
+
require 'i18n_checker/locale'
|
5
|
+
require 'i18n_checker/unused/detector'
|
6
|
+
require 'i18n_checker/unused/reporter/default'
|
7
|
+
require 'i18n_checker/command/clean'
|
8
|
+
|
9
|
+
module I18nChecker
|
10
|
+
module RakeTask
|
11
|
+
class Clean < ::Rake::TaskLib
|
12
|
+
attr_accessor :name
|
13
|
+
attr_accessor :reporter
|
14
|
+
attr_accessor :source_paths
|
15
|
+
attr_accessor :locale_file_paths
|
16
|
+
attr_accessor :logger
|
17
|
+
|
18
|
+
def initialize(name = :locale_clean)
|
19
|
+
@name = name
|
20
|
+
@source_paths = FileList['app/views/*', 'app/controllers/*', 'app/jobs/*', 'app/models/*', 'app/helpers/*']
|
21
|
+
@locale_file_paths = FileList['config/locales/*']
|
22
|
+
@logger = Logger.new(STDOUT)
|
23
|
+
@logger.formatter = proc { |_severity, _datetime, _progname, message|
|
24
|
+
"#{message}\n"
|
25
|
+
}
|
26
|
+
@reporter = I18nChecker::Unused::Reporter::Default.new(logger: logger)
|
27
|
+
yield self if block_given?
|
28
|
+
define
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def define
|
34
|
+
desc 'Delete unused translation text.'
|
35
|
+
task(name) { run_task }
|
36
|
+
end
|
37
|
+
|
38
|
+
def run_task
|
39
|
+
command = I18nChecker::Command::Clean.new(
|
40
|
+
reporter: reporter,
|
41
|
+
source_paths: source_paths,
|
42
|
+
locale_file_paths: locale_file_paths
|
43
|
+
)
|
44
|
+
command.run do |result|
|
45
|
+
exit 1 unless result.empty?
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1 +1,2 @@
|
|
1
|
-
require 'i18n_checker/rake_task/
|
1
|
+
require 'i18n_checker/rake_task/check'
|
2
|
+
require 'i18n_checker/rake_task/clean'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'i18n_checker/unused/text'
|
2
|
+
require 'i18n_checker/unused/result'
|
3
|
+
|
4
|
+
module I18nChecker
|
5
|
+
module Unused
|
6
|
+
class Detector
|
7
|
+
def initialize(locale_files)
|
8
|
+
@locale_files = locale_files
|
9
|
+
end
|
10
|
+
|
11
|
+
def detect(locale_texts)
|
12
|
+
unused_texts = cleaned_locale_files(locale_texts).map do |locale_file|
|
13
|
+
locale_file.locale_texts.map do |key, _v|
|
14
|
+
I18nChecker::Unused::Text.new(
|
15
|
+
text: key,
|
16
|
+
file: locale_file
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
I18nChecker::Unused::Result.new(unused_texts.compact.flatten)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def cleaned_locale_files(locale_texts)
|
26
|
+
remove_locale_texts = used_locale_texts(locale_texts)
|
27
|
+
@locale_files.map { |locale_file| locale_file.remove_texts(remove_locale_texts) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def used_locale_texts(locale_texts)
|
31
|
+
used_locale_texts = locale_texts.dup.select do |locale_text|
|
32
|
+
@locale_files.any? { |locale_file| locale_file.include?(locale_text) }
|
33
|
+
end
|
34
|
+
used_locale_texts.map(&:text)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'i18n_checker/unused/result'
|
2
|
+
require 'i18n_checker/unused/result'
|
3
|
+
require 'i18n_checker/unused/detector'
|
4
|
+
require 'i18n_checker/unused/reporter/base'
|
5
|
+
|
6
|
+
module I18nChecker
|
7
|
+
module Unused
|
8
|
+
module Reporter
|
9
|
+
class Default < Base
|
10
|
+
CHECK_COMPLETED = 'Checking of unused translated text is finished.'.freeze
|
11
|
+
|
12
|
+
#
|
13
|
+
# @param unused_result [I18nChecker::Unused::Result]
|
14
|
+
def report(unused_result)
|
15
|
+
return passed if unused_result.empty?
|
16
|
+
failed(unused_result)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def passed
|
22
|
+
logger.info CHECK_COMPLETED.green
|
23
|
+
logger.info 'Unused translation text was not found'.green
|
24
|
+
end
|
25
|
+
|
26
|
+
def failed(unused_result)
|
27
|
+
logger.info CHECK_COMPLETED.red
|
28
|
+
logger.info "An unused translation text was found.\n".red
|
29
|
+
unused_result.locale_files.each do |file_name, unused_texts|
|
30
|
+
logger.info file_name.cyan.to_s
|
31
|
+
unused_texts.map { |text| logger.info " #{text.text}" }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module I18nChecker
|
2
|
+
module Unused
|
3
|
+
# Detection result of unused translated text
|
4
|
+
#
|
5
|
+
# @attr_reader [Array<I18nChecker::Unused::Text>] unused_texts
|
6
|
+
# @attr_reader [Hash<String, Array<I18nChecker::Unused::File>>] locale_files
|
7
|
+
class Result
|
8
|
+
attr_reader :unused_texts, :locale_files
|
9
|
+
|
10
|
+
#
|
11
|
+
#
|
12
|
+
# @param unused_texts [Array<I18nChecker::Unused::Text>]
|
13
|
+
def initialize(unused_texts = [])
|
14
|
+
@unused_texts = unused_texts
|
15
|
+
@locale_files = unused_texts.group_by(&:file_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
#
|
20
|
+
# @return [Boolean]
|
21
|
+
def empty?
|
22
|
+
unused_texts.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
# Apply the detected unused translated text to the current translation file.
|
26
|
+
# Unused text has been deleted from the translation file.
|
27
|
+
#
|
28
|
+
# @param target_locale_files [Array<I18nChecker::Locale::File>]
|
29
|
+
# @return [Array<I18nChecker::Locale::File>]
|
30
|
+
def apply(target_locale_files)
|
31
|
+
locale_files = target_locale_files.
|
32
|
+
group_by(&:file_name).
|
33
|
+
map { |k, v| [k, v.first] }
|
34
|
+
|
35
|
+
cleanup_locale_files = locale_files.map do |file_name, locale_file|
|
36
|
+
return locale_file unless @locale_files.key?(file_name)
|
37
|
+
unused_texts = @locale_files[file_name]
|
38
|
+
locale_file.remove_texts(unused_texts.map(&:text))
|
39
|
+
end
|
40
|
+
cleanup_locale_files.each(&:save)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module I18nChecker
|
4
|
+
module Unused
|
5
|
+
class Text
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
attr_reader :file, :text
|
9
|
+
|
10
|
+
def_delegators :file, :lang, :file_name
|
11
|
+
|
12
|
+
def initialize(file:, text:)
|
13
|
+
@file = file
|
14
|
+
@text = text
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/i18n_checker/version.rb
CHANGED
data/lib/i18n_checker.rb
CHANGED
@@ -11,12 +11,10 @@ require 'i18n_checker/locale/texts'
|
|
11
11
|
require 'i18n_checker/locale/key_path'
|
12
12
|
require 'i18n_checker/locale/file'
|
13
13
|
require 'i18n_checker/locale/files'
|
14
|
-
require 'i18n_checker/detector
|
15
|
-
require 'i18n_checker/
|
16
|
-
require 'i18n_checker/detector
|
17
|
-
require 'i18n_checker/reporter
|
18
|
-
require 'i18n_checker/reporter/default_reporter'
|
19
|
-
require 'i18n_checker/locale_text_not_found_checker'
|
14
|
+
require 'i18n_checker/unused/detector'
|
15
|
+
require 'i18n_checker/unused/reporter'
|
16
|
+
require 'i18n_checker/not_found/detector'
|
17
|
+
require 'i18n_checker/not_found/reporter'
|
20
18
|
|
21
19
|
module I18nChecker
|
22
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i18n_checker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- holyshared
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: haml_parser
|
@@ -150,6 +150,34 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rspec-temp_dir
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: yard
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
153
181
|
description: Verification of translation of Ruby source and Haml template
|
154
182
|
email:
|
155
183
|
- holy.shared.design@gmail.com
|
@@ -168,13 +196,16 @@ files:
|
|
168
196
|
- LICENSE
|
169
197
|
- README.md
|
170
198
|
- Rakefile
|
199
|
+
- examples/unused/example.haml
|
200
|
+
- examples/unused/example.rb
|
201
|
+
- examples/unused/locales/en.yml
|
202
|
+
- examples/unused/locales/ja.yml
|
171
203
|
- i18n-checker.gemspec
|
172
204
|
- lib/i18n_checker.rb
|
173
205
|
- lib/i18n_checker/cache.rb
|
174
206
|
- lib/i18n_checker/collectible.rb
|
175
|
-
- lib/i18n_checker/
|
176
|
-
- lib/i18n_checker/
|
177
|
-
- lib/i18n_checker/detector/text_result.rb
|
207
|
+
- lib/i18n_checker/command/check.rb
|
208
|
+
- lib/i18n_checker/command/clean.rb
|
178
209
|
- lib/i18n_checker/locale.rb
|
179
210
|
- lib/i18n_checker/locale/collector.rb
|
180
211
|
- lib/i18n_checker/locale/collector/haml.rb
|
@@ -185,18 +216,28 @@ files:
|
|
185
216
|
- lib/i18n_checker/locale/text.rb
|
186
217
|
- lib/i18n_checker/locale/text_processor.rb
|
187
218
|
- lib/i18n_checker/locale/texts.rb
|
188
|
-
- lib/i18n_checker/
|
219
|
+
- lib/i18n_checker/not_found/detector.rb
|
220
|
+
- lib/i18n_checker/not_found/reporter.rb
|
221
|
+
- lib/i18n_checker/not_found/reporter/base.rb
|
222
|
+
- lib/i18n_checker/not_found/reporter/default.rb
|
223
|
+
- lib/i18n_checker/not_found/result.rb
|
224
|
+
- lib/i18n_checker/not_found/text.rb
|
189
225
|
- lib/i18n_checker/rake_task.rb
|
190
|
-
- lib/i18n_checker/rake_task/
|
191
|
-
- lib/i18n_checker/
|
192
|
-
- lib/i18n_checker/
|
193
|
-
- lib/i18n_checker/reporter
|
226
|
+
- lib/i18n_checker/rake_task/check.rb
|
227
|
+
- lib/i18n_checker/rake_task/clean.rb
|
228
|
+
- lib/i18n_checker/unused/detector.rb
|
229
|
+
- lib/i18n_checker/unused/reporter.rb
|
230
|
+
- lib/i18n_checker/unused/reporter/base.rb
|
231
|
+
- lib/i18n_checker/unused/reporter/default.rb
|
232
|
+
- lib/i18n_checker/unused/result.rb
|
233
|
+
- lib/i18n_checker/unused/text.rb
|
194
234
|
- lib/i18n_checker/version.rb
|
195
235
|
- screenshot.png
|
196
236
|
homepage: https://github.com/holyshared/i18n-checker
|
197
237
|
licenses:
|
198
238
|
- MIT
|
199
|
-
metadata:
|
239
|
+
metadata:
|
240
|
+
yard.run: yri
|
200
241
|
post_install_message:
|
201
242
|
rdoc_options: []
|
202
243
|
require_paths:
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'i18n_checker/detector/locale_text_not_found'
|
2
|
-
require 'i18n_checker/detector/text_result'
|
3
|
-
require 'i18n_checker/detector/detected_result'
|
4
|
-
|
5
|
-
module I18nChecker
|
6
|
-
class LocaleTextNotFoundChecker
|
7
|
-
def initialize(locale_file_paths: [], source_paths: [], reporter:)
|
8
|
-
@reporter = reporter
|
9
|
-
@locale_texts = I18nChecker::Locale.texts_of(source_paths)
|
10
|
-
@locale_files = I18nChecker::Locale.load_of(locale_file_paths)
|
11
|
-
end
|
12
|
-
|
13
|
-
def check
|
14
|
-
not_found_detector = I18nChecker::Detector::LocaleTextNotFound.new(@locale_files)
|
15
|
-
not_found_result = @locale_texts.detect(not_found_detector)
|
16
|
-
@reporter.report not_found_result
|
17
|
-
yield not_found_result if block_given?
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'colorator'
|
2
|
-
|
3
|
-
module I18nChecker
|
4
|
-
module Reporter
|
5
|
-
class DefaultReporter < DetectResultReporter
|
6
|
-
CHECK_COMPLETED = 'Translation text checking is complete.'.freeze
|
7
|
-
|
8
|
-
def report(result)
|
9
|
-
return passed if result.empty?
|
10
|
-
failed(result)
|
11
|
-
end
|
12
|
-
|
13
|
-
def passed
|
14
|
-
logger.info CHECK_COMPLETED.green
|
15
|
-
logger.info 'There was no translated text that can not be referenced'.green
|
16
|
-
end
|
17
|
-
|
18
|
-
def failed(result)
|
19
|
-
logger.info CHECK_COMPLETED.red
|
20
|
-
logger.info "There are settings where translated text can not be found\n".red
|
21
|
-
result.locale_texts.each do |locale_text|
|
22
|
-
logger.info locale_text.file.cyan.to_s
|
23
|
-
logger.info " line:#{locale_text.line}, column:#{locale_text.column} - #{locale_text.lang}.#{locale_text.text}"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|