i18n_flow 0.1.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 +7 -0
- data/.gitignore +7 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +13 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +45 -0
- data/LICENSE +22 -0
- data/README.md +103 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/doc/rules.md +316 -0
- data/doc/tags.md +488 -0
- data/example/example.en.yml +14 -0
- data/example/example.ja.yml +9 -0
- data/exe/i18n_flow +11 -0
- data/i18n_flow.gemspec +28 -0
- data/i18n_flow.yml +8 -0
- data/lib/i18n_flow/cli/color.rb +18 -0
- data/lib/i18n_flow/cli/command_base.rb +33 -0
- data/lib/i18n_flow/cli/copy_command.rb +69 -0
- data/lib/i18n_flow/cli/help_command.rb +29 -0
- data/lib/i18n_flow/cli/lint_command/ascii.erb +45 -0
- data/lib/i18n_flow/cli/lint_command/ascii_renderer.rb +58 -0
- data/lib/i18n_flow/cli/lint_command/markdown.erb +49 -0
- data/lib/i18n_flow/cli/lint_command/markdown_renderer.rb +55 -0
- data/lib/i18n_flow/cli/lint_command.rb +55 -0
- data/lib/i18n_flow/cli/read_config_command.rb +20 -0
- data/lib/i18n_flow/cli/search_command/default.erb +11 -0
- data/lib/i18n_flow/cli/search_command/default_renderer.rb +67 -0
- data/lib/i18n_flow/cli/search_command/oneline.erb +5 -0
- data/lib/i18n_flow/cli/search_command/oneline_renderer.rb +39 -0
- data/lib/i18n_flow/cli/search_command.rb +59 -0
- data/lib/i18n_flow/cli/split_command.rb +20 -0
- data/lib/i18n_flow/cli/version_command.rb +9 -0
- data/lib/i18n_flow/cli.rb +42 -0
- data/lib/i18n_flow/configuration.rb +205 -0
- data/lib/i18n_flow/parser.rb +34 -0
- data/lib/i18n_flow/repository.rb +39 -0
- data/lib/i18n_flow/search.rb +176 -0
- data/lib/i18n_flow/splitter/merger.rb +60 -0
- data/lib/i18n_flow/splitter/strategy.rb +66 -0
- data/lib/i18n_flow/splitter.rb +5 -0
- data/lib/i18n_flow/util.rb +57 -0
- data/lib/i18n_flow/validator/errors.rb +99 -0
- data/lib/i18n_flow/validator/file_scope.rb +58 -0
- data/lib/i18n_flow/validator/multiplexer.rb +58 -0
- data/lib/i18n_flow/validator/symmetry.rb +154 -0
- data/lib/i18n_flow/validator.rb +4 -0
- data/lib/i18n_flow/version.rb +7 -0
- data/lib/i18n_flow/yaml_ast_proxy/mapping.rb +72 -0
- data/lib/i18n_flow/yaml_ast_proxy/node.rb +128 -0
- data/lib/i18n_flow/yaml_ast_proxy/node_meta_data.rb +86 -0
- data/lib/i18n_flow/yaml_ast_proxy/sequence.rb +29 -0
- data/lib/i18n_flow/yaml_ast_proxy.rb +57 -0
- data/lib/i18n_flow.rb +15 -0
- data/spec/lib/i18n_flow/cli/command_base_spec.rb +46 -0
- data/spec/lib/i18n_flow/cli/help_command_spec.rb +13 -0
- data/spec/lib/i18n_flow/cli/version_command_spec.rb +13 -0
- data/spec/lib/i18n_flow/configuration_spec.rb +334 -0
- data/spec/lib/i18n_flow/repository_spec.rb +40 -0
- data/spec/lib/i18n_flow/splitter/merger_spec.rb +149 -0
- data/spec/lib/i18n_flow/util_spec.rb +194 -0
- data/spec/lib/i18n_flow/validator/file_scope_spec.rb +74 -0
- data/spec/lib/i18n_flow/validator/multiplexer_spec.rb +68 -0
- data/spec/lib/i18n_flow/validator/symmetry_spec.rb +511 -0
- data/spec/lib/i18n_flow/yaml_ast_proxy/node_spec.rb +151 -0
- data/spec/lib/i18n_flow_spec.rb +21 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/repository_examples.rb +60 -0
- data/spec/support/util_macro.rb +14 -0
- metadata +214 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
<%- errors.each do |file, errs| -%>
|
2
|
+
=== <%= file %>
|
3
|
+
<%- errs.each do |full_key, err| -%>
|
4
|
+
<%= full_key %> #<%= err.line %>
|
5
|
+
<%- case err when nil -%>
|
6
|
+
<%- when I18nFlow::Validator::InvalidTypeError -%>
|
7
|
+
<%- if err.single? -%>
|
8
|
+
A file must start with scopes that derive from its file path
|
9
|
+
reason: it must not have a scalar value
|
10
|
+
<%- else -%>
|
11
|
+
Structure mismatches with the master file
|
12
|
+
<%- end -%>
|
13
|
+
<%- when I18nFlow::Validator::MissingKeyError -%>
|
14
|
+
<%- if err.single? -%>
|
15
|
+
A file must start with scopes that derive from its file path
|
16
|
+
reason: missing key
|
17
|
+
<%- else -%>
|
18
|
+
The key is missing
|
19
|
+
<%- end -%>
|
20
|
+
<%- when I18nFlow::Validator::ExtraKeyError -%>
|
21
|
+
<%- if err.single? -%>
|
22
|
+
A file must start with scopes that derive from its file path
|
23
|
+
reason: extra key
|
24
|
+
<%- else -%>
|
25
|
+
An extra key found
|
26
|
+
<%- end -%>
|
27
|
+
<%- when I18nFlow::Validator::InvalidTodoError -%>
|
28
|
+
Todo cannot be annotated on a mapping/sequence
|
29
|
+
<%- when I18nFlow::Validator::TodoContentError -%>
|
30
|
+
It has "!todo" but the content diverges from the master file
|
31
|
+
master: <%= err.expect %>
|
32
|
+
foreign: <%= err.actual %>
|
33
|
+
<%- when I18nFlow::Validator::InvalidLocaleError -%>
|
34
|
+
It has "!only" but the locale is invalid
|
35
|
+
valid: [<%= err.expect.join(', ') %>]
|
36
|
+
got: <%= err.actual %>
|
37
|
+
<%- when I18nFlow::Validator::AsymmetricArgsError -%>
|
38
|
+
Interpolation arguments diverge from the master file
|
39
|
+
master: [<%= err.expect.join(', ') %>]
|
40
|
+
foreign: [<%= err.actual.join(', ') %>]
|
41
|
+
<%- end -%>
|
42
|
+
<%- end -%>
|
43
|
+
|
44
|
+
<%- end -%>
|
45
|
+
<%= summary_line %>
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require_relative '../../validator/errors'
|
3
|
+
require_relative '../color'
|
4
|
+
|
5
|
+
class I18nFlow::CLI::LintCommand
|
6
|
+
class AsciiRenderer
|
7
|
+
include I18nFlow::CLI::Color
|
8
|
+
|
9
|
+
FILE = __dir__ + '/ascii.erb'
|
10
|
+
|
11
|
+
attr_reader :errors
|
12
|
+
|
13
|
+
def initialize(errors, color: true)
|
14
|
+
@errors = errors
|
15
|
+
@color_enabled = !!color
|
16
|
+
end
|
17
|
+
|
18
|
+
def render
|
19
|
+
with_color(erb.result(binding))
|
20
|
+
end
|
21
|
+
|
22
|
+
def color_enabled?
|
23
|
+
@color_enabled
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_count
|
27
|
+
@file_count ||= errors.size
|
28
|
+
end
|
29
|
+
|
30
|
+
def error_count
|
31
|
+
@error_count ||= errors.sum { |_, errs| errs.size }
|
32
|
+
end
|
33
|
+
|
34
|
+
def summary_line
|
35
|
+
@summary_line ||= 'Found %d %s in %d %s' % [
|
36
|
+
error_count,
|
37
|
+
error_count == 1 ? 'violation' : 'violations',
|
38
|
+
file_count,
|
39
|
+
file_count == 1 ? 'file' : 'files',
|
40
|
+
]
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def with_color(str)
|
46
|
+
return str unless color_enabled?
|
47
|
+
|
48
|
+
str = str.gsub(/^(=== )(.+)$/) { $1 + color($2, :yellow) }
|
49
|
+
str = str.gsub(/(#\d+)$/) { color($1, :yellow) }
|
50
|
+
str = str.gsub(/^([ ]{8})(.+)$/) { $1 + color($2, :red) }
|
51
|
+
str
|
52
|
+
end
|
53
|
+
|
54
|
+
def erb
|
55
|
+
@erb ||= ERB.new(File.read(FILE), 0, '-')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
[I18nFlow] <%= summary_line %>
|
2
|
+
[→ Lint rules and how to fix](https://github.com/creasty/i18n_flow/blob/master/doc/rules.md)
|
3
|
+
|
4
|
+
<%- errors.each do |file, errs| -%>
|
5
|
+
## [<%= file %>](@<%= file %>)
|
6
|
+
<%- errs.each do |full_key, err| -%>
|
7
|
+
|
8
|
+
### <%= full_key %> [L<%= err.line %>](@<%= err.file %>:<%= err.line %>)
|
9
|
+
|
10
|
+
<%- case err when nil -%>
|
11
|
+
<%- when I18nFlow::Validator::InvalidTypeError -%>
|
12
|
+
<%- if err.single? -%>
|
13
|
+
A file must start with scopes that derive from its file path
|
14
|
+
reason: it must not have a scalar value
|
15
|
+
<%- else -%>
|
16
|
+
Structure mismatches with the master file
|
17
|
+
<%- end -%>
|
18
|
+
<%- when I18nFlow::Validator::MissingKeyError -%>
|
19
|
+
<%- if err.single? -%>
|
20
|
+
A file must start with scopes that derive from its file path
|
21
|
+
reason: missing key
|
22
|
+
<%- else -%>
|
23
|
+
The key is missing
|
24
|
+
<%- end -%>
|
25
|
+
<%- when I18nFlow::Validator::ExtraKeyError -%>
|
26
|
+
<%- if err.single? -%>
|
27
|
+
A file must start with scopes that derive from its file path
|
28
|
+
reason: extra key
|
29
|
+
<%- else -%>
|
30
|
+
An extra key found
|
31
|
+
<%- end -%>
|
32
|
+
<%- when I18nFlow::Validator::InvalidTodoError -%>
|
33
|
+
Todo cannot be annotated on a mapping/sequence
|
34
|
+
<%- when I18nFlow::Validator::TodoContentError -%>
|
35
|
+
It has "!todo" but the content diverges from the master file
|
36
|
+
master: `<%= err.expect %>`
|
37
|
+
foreign: `<%= err.actual %>`
|
38
|
+
<%- when I18nFlow::Validator::InvalidLocaleError -%>
|
39
|
+
It has "!only" but the locale is invalid
|
40
|
+
valid: `[<%= err.expect.join(', ') %>]`
|
41
|
+
got: `<%= err.actual %>`
|
42
|
+
<%- when I18nFlow::Validator::AsymmetricArgsError -%>
|
43
|
+
Interpolation arguments diverge from the master file
|
44
|
+
master: `[<%= err.expect.join(', ') %>]`
|
45
|
+
foreign: `[<%= err.actual.join(', ') %>]`
|
46
|
+
<%- end -%>
|
47
|
+
<%- end -%>
|
48
|
+
|
49
|
+
<%- end -%>
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require_relative '../../validator/errors'
|
3
|
+
|
4
|
+
class I18nFlow::CLI::LintCommand
|
5
|
+
class MarkdownRenderer
|
6
|
+
FILE = __dir__ + '/markdown.erb'
|
7
|
+
|
8
|
+
attr_reader :errors
|
9
|
+
attr_reader :url_formatter
|
10
|
+
|
11
|
+
def initialize(errors, url_formatter:)
|
12
|
+
@errors = errors
|
13
|
+
@url_formatter = url_formatter
|
14
|
+
end
|
15
|
+
|
16
|
+
def render
|
17
|
+
with_link(erb.result(binding))
|
18
|
+
end
|
19
|
+
|
20
|
+
def file_count
|
21
|
+
@file_count ||= errors.size
|
22
|
+
end
|
23
|
+
|
24
|
+
def error_count
|
25
|
+
@error_count ||= errors.sum { |_, errs| errs.size }
|
26
|
+
end
|
27
|
+
|
28
|
+
def summary_line
|
29
|
+
@summary_line ||= 'Found %d %s in %d %s' % [
|
30
|
+
error_count,
|
31
|
+
error_count == 1 ? 'violation' : 'violations',
|
32
|
+
file_count,
|
33
|
+
file_count == 1 ? 'file' : 'files',
|
34
|
+
]
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def with_link(str)
|
40
|
+
str.gsub(/\[([^\]]+)\]\(@([^\):]+)(?::(\d+))?\)/) do
|
41
|
+
'[%s](%s)' % [$1, format_link(path: $2, line: $3)]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def format_link(path:, line:)
|
46
|
+
url_formatter
|
47
|
+
.gsub(/%f\b/, path)
|
48
|
+
.gsub(/%l\b/, line.to_s)
|
49
|
+
end
|
50
|
+
|
51
|
+
def erb
|
52
|
+
@erb ||= ERB.new(File.read(FILE), 0, '-')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative 'command_base'
|
2
|
+
require_relative '../repository'
|
3
|
+
require_relative '../validator/multiplexer'
|
4
|
+
|
5
|
+
class I18nFlow::CLI
|
6
|
+
class LintCommand < CommandBase
|
7
|
+
require_relative 'lint_command/ascii_renderer'
|
8
|
+
require_relative 'lint_command/markdown_renderer'
|
9
|
+
|
10
|
+
DEFAULT_FORMAT = 'ascii'
|
11
|
+
|
12
|
+
def invoke!
|
13
|
+
validator.validate!
|
14
|
+
|
15
|
+
case output_format
|
16
|
+
when 'ascii'
|
17
|
+
puts AsciiRenderer.new(validator.errors, color: color_enabled?).render
|
18
|
+
when 'markdown'
|
19
|
+
puts MarkdownRenderer.new(validator.errors, url_formatter: url_formatter).render
|
20
|
+
else
|
21
|
+
exit_with_message(1, 'Unsupported format: %s' % [output_format])
|
22
|
+
end
|
23
|
+
|
24
|
+
exit validator.errors.size.zero? ? 0 : 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def output_format
|
28
|
+
@output_format ||= options['format'] || DEFAULT_FORMAT
|
29
|
+
end
|
30
|
+
|
31
|
+
def url_formatter
|
32
|
+
return @url_formatter if @url_formatter
|
33
|
+
@url_formatter = options['url-formatter']
|
34
|
+
@url_formatter ||= "file://#{I18nFlow.config.base_path}/%f#%l"
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def repository
|
40
|
+
@repository ||= I18nFlow::Repository.new(
|
41
|
+
base_path: I18nFlow.config.base_path,
|
42
|
+
glob_patterns: I18nFlow.config.glob_patterns,
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
def validator
|
47
|
+
@validator ||= I18nFlow::Validator::Multiplexer.new(
|
48
|
+
repository: repository,
|
49
|
+
valid_locales: I18nFlow.config.valid_locales,
|
50
|
+
locale_pairs: I18nFlow.config.locale_pairs,
|
51
|
+
linters: I18nFlow.config.linters,
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'command_base'
|
2
|
+
|
3
|
+
class I18nFlow::CLI
|
4
|
+
class ReadConfigCommand < CommandBase
|
5
|
+
def invoke!
|
6
|
+
unless key
|
7
|
+
exit_with_message(1, 'usage: i18n_flow read_config KEY')
|
8
|
+
end
|
9
|
+
|
10
|
+
case key
|
11
|
+
when 'base_path'
|
12
|
+
puts I18nFlow.config.base_path
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def key
|
17
|
+
args[0]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%- results.each do |key, matches| -%>
|
2
|
+
=== <%= key %>
|
3
|
+
<%- matches.each do |m| -%>
|
4
|
+
<%= m.locale %> (<%= m.file %>:<%= m.line %>)
|
5
|
+
<%- if m.value -%>
|
6
|
+
<%= m.value.gsub(/^/, ' ') %>
|
7
|
+
<%- end -%>
|
8
|
+
<%- end -%>
|
9
|
+
|
10
|
+
<%- end -%>
|
11
|
+
<%= results.size %> <%= results.size == 1 ? 'hit' : 'hits' %>
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require_relative '../../validator/errors'
|
3
|
+
require_relative '../color'
|
4
|
+
|
5
|
+
class I18nFlow::CLI::SearchCommand
|
6
|
+
class DefaultRenderer
|
7
|
+
include I18nFlow::CLI::Color
|
8
|
+
|
9
|
+
FILE = __dir__ + '/default.erb'
|
10
|
+
|
11
|
+
attr_reader :results
|
12
|
+
|
13
|
+
def initialize(results, color: true)
|
14
|
+
@results = results
|
15
|
+
@color_enabled = !!color
|
16
|
+
end
|
17
|
+
|
18
|
+
def render
|
19
|
+
with_color(erb.result(binding))
|
20
|
+
end
|
21
|
+
|
22
|
+
def color_enabled?
|
23
|
+
@color_enabled
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def with_color(str)
|
29
|
+
return str unless color_enabled?
|
30
|
+
|
31
|
+
state = nil
|
32
|
+
|
33
|
+
str.each_line.map do |l|
|
34
|
+
case l
|
35
|
+
when /^(=== )(.+)$/
|
36
|
+
state = :header if state == nil
|
37
|
+
when /^( )([^\s]+)( \(.+:\d+\))$/
|
38
|
+
state = :location if %i[header content].include?(state)
|
39
|
+
when /^( )(.+)/
|
40
|
+
state = :content if %i[location content].include?(state)
|
41
|
+
else
|
42
|
+
state = nil
|
43
|
+
end
|
44
|
+
|
45
|
+
case state
|
46
|
+
when :header
|
47
|
+
l = $~[1]
|
48
|
+
l << color($~[2], :yellow)
|
49
|
+
l << "\n"
|
50
|
+
when :location
|
51
|
+
l = $~[1]
|
52
|
+
l << color($~[2], :blue)
|
53
|
+
l << $~[3]
|
54
|
+
l << "\n"
|
55
|
+
when :content
|
56
|
+
l = color(l, :green)
|
57
|
+
end
|
58
|
+
|
59
|
+
l
|
60
|
+
end.join
|
61
|
+
end
|
62
|
+
|
63
|
+
def erb
|
64
|
+
@erb ||= ERB.new(File.read(FILE), 0, '-')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require_relative '../../validator/errors'
|
3
|
+
require_relative '../color'
|
4
|
+
|
5
|
+
class I18nFlow::CLI::SearchCommand
|
6
|
+
class OnelineRenderer
|
7
|
+
include I18nFlow::CLI::Color
|
8
|
+
|
9
|
+
FILE = __dir__ + '/oneline.erb'
|
10
|
+
|
11
|
+
attr_reader :results
|
12
|
+
|
13
|
+
def initialize(results, color: true)
|
14
|
+
@results = results
|
15
|
+
@color_enabled = !!color
|
16
|
+
end
|
17
|
+
|
18
|
+
def render
|
19
|
+
with_color(erb.result(binding))
|
20
|
+
end
|
21
|
+
|
22
|
+
def color_enabled?
|
23
|
+
@color_enabled
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def with_color(str)
|
29
|
+
return str unless color_enabled?
|
30
|
+
|
31
|
+
str.gsub!(/^(\S+)( \[)([^\]]+)(\] \([^\)]+\))(.*)/) { color($1, :yellow) + $2 + color($3, :blue) + $4 + color($5, :green) }
|
32
|
+
str
|
33
|
+
end
|
34
|
+
|
35
|
+
def erb
|
36
|
+
@erb ||= ERB.new(File.read(FILE), 0, '-')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative 'command_base'
|
2
|
+
require_relative 'color'
|
3
|
+
require_relative '../repository'
|
4
|
+
require_relative '../search'
|
5
|
+
|
6
|
+
class I18nFlow::CLI
|
7
|
+
class SearchCommand < CommandBase
|
8
|
+
require_relative 'search_command/default_renderer'
|
9
|
+
require_relative 'search_command/oneline_renderer'
|
10
|
+
|
11
|
+
DEFAULT_FORMAT = 'default'
|
12
|
+
|
13
|
+
def invoke!
|
14
|
+
unless pattern
|
15
|
+
exit_with_message(1, 'usage: i18n_flow search PATTERN')
|
16
|
+
end
|
17
|
+
|
18
|
+
search.search!
|
19
|
+
|
20
|
+
case output_format
|
21
|
+
when 'default'
|
22
|
+
puts DefaultRenderer.new(search.results, color: color_enabled?).render
|
23
|
+
when 'oneline'
|
24
|
+
puts OnelineRenderer.new(search.results, color: color_enabled?).render
|
25
|
+
else
|
26
|
+
exit_with_message(1, 'Unsupported format: %s' % [output_format])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def pattern
|
31
|
+
args[0]
|
32
|
+
end
|
33
|
+
|
34
|
+
def output_format
|
35
|
+
@output_format ||= options['format'] || DEFAULT_FORMAT
|
36
|
+
end
|
37
|
+
|
38
|
+
def include_all?
|
39
|
+
!!(options['all'] || options['a'])
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def repository
|
45
|
+
@repository ||= I18nFlow::Repository.new(
|
46
|
+
base_path: I18nFlow.config.base_path,
|
47
|
+
glob_patterns: I18nFlow.config.glob_patterns,
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def search
|
52
|
+
@search ||= I18nFlow::Search.new(
|
53
|
+
repository: repository,
|
54
|
+
pattern: pattern,
|
55
|
+
include_all: include_all?,
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'command_base'
|
2
|
+
require_relative '../repository'
|
3
|
+
require_relative '../splitter'
|
4
|
+
|
5
|
+
class I18nFlow::CLI
|
6
|
+
class SplitCommand < CommandBase
|
7
|
+
def invoke!
|
8
|
+
exit_with_message(1, 'not implemented')
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def repository
|
14
|
+
@repository ||= I18nFlow::Repository.new(
|
15
|
+
base_path: I18nFlow.config.base_path,
|
16
|
+
glob_patterns: I18nFlow.config.glob_patterns,
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'util'
|
2
|
+
|
3
|
+
class I18nFlow::CLI
|
4
|
+
require_relative 'cli/lint_command'
|
5
|
+
require_relative 'cli/split_command'
|
6
|
+
require_relative 'cli/copy_command'
|
7
|
+
require_relative 'cli/search_command'
|
8
|
+
require_relative 'cli/version_command'
|
9
|
+
require_relative 'cli/help_command'
|
10
|
+
require_relative 'cli/read_config_command'
|
11
|
+
|
12
|
+
COMMANDS = {
|
13
|
+
'lint' => LintCommand,
|
14
|
+
'search' => SearchCommand,
|
15
|
+
'split' => SplitCommand,
|
16
|
+
'copy' => CopyCommand,
|
17
|
+
'version' => VersionCommand,
|
18
|
+
'help' => HelpCommand,
|
19
|
+
'read_config' => ReadConfigCommand,
|
20
|
+
}
|
21
|
+
|
22
|
+
attr_reader :args
|
23
|
+
attr_reader :command
|
24
|
+
attr_reader :global_options
|
25
|
+
|
26
|
+
def initialize(args)
|
27
|
+
@global_options = I18nFlow::Util.parse_options(args)
|
28
|
+
@command, *@args = args
|
29
|
+
end
|
30
|
+
|
31
|
+
def run
|
32
|
+
if global_options['v'] || global_options['version']
|
33
|
+
@command = 'version'
|
34
|
+
end
|
35
|
+
if global_options['h']
|
36
|
+
@command = 'help'
|
37
|
+
end
|
38
|
+
|
39
|
+
command_class = COMMANDS[command] || COMMANDS['help']
|
40
|
+
command_class.new(args).invoke!
|
41
|
+
end
|
42
|
+
end
|