bisu 1.2.4 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +4 -0
- data/lib/bisu/config.rb +43 -27
- data/lib/bisu/google_sheet.rb +1 -1
- data/lib/bisu/localizer.rb +1 -1
- data/lib/bisu/object_extension.rb +41 -0
- data/lib/bisu/version.rb +2 -2
- data/lib/bisu.rb +28 -36
- data/spec/fixtures/sample.translatable.yml +17 -0
- data/spec/lib/bisu/config_spec.rb +53 -0
- data/spec/{bisu → lib/bisu}/dictionary_spec.rb +0 -0
- data/spec/{bisu → lib/bisu}/google_sheet_spec.rb +9 -9
- data/spec/{bisu → lib/bisu}/localizer_spec.rb +0 -2
- data/spec/{bisu → lib/bisu}/logger_spec.rb +0 -0
- data/spec/lib/bisu/object_extension_spec.rb +100 -0
- data/spec/lib/bisu_spec.rb +35 -0
- data/spec/spec_helper.rb +1 -0
- metadata +11 -8
- data/spec/bisu/config_spec.rb +0 -35
- data/spec/fixtures/sample_translatable.yml +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6986c97d7458f01354dfea511217a6fe565e8623
|
4
|
+
data.tar.gz: 13ef8e986f57451ec5170612794ca098c285f0be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91712afc1636778325e5119513a76173a4a8623fe7ec1b36e06bd97cafc8f180f3a311840e234d33f294c752ee243fe247a7d9ab708c38301607d4f475dd4348
|
7
|
+
data.tar.gz: 500e7bcc77107d003d032c71e53d5a79b6579a52ea3c1a0250e91e71f693edff0e0aecb2c9b8125ed52e5d536032e9e61acaef67122f6e94692bae899405d735
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -16,6 +16,9 @@ GEM
|
|
16
16
|
rspec-expectations (3.5.0)
|
17
17
|
diff-lcs (>= 1.2.0, < 2.0)
|
18
18
|
rspec-support (~> 3.5.0)
|
19
|
+
rspec-its (1.2.0)
|
20
|
+
rspec-core (>= 3.0.0)
|
21
|
+
rspec-expectations (>= 3.0.0)
|
19
22
|
rspec-mocks (3.5.0)
|
20
23
|
diff-lcs (>= 1.2.0, < 2.0)
|
21
24
|
rspec-support (~> 3.5.0)
|
@@ -33,6 +36,7 @@ PLATFORMS
|
|
33
36
|
DEPENDENCIES
|
34
37
|
colorize (~> 0.7)
|
35
38
|
rspec
|
39
|
+
rspec-its
|
36
40
|
safe_yaml (~> 1.0)
|
37
41
|
webmock (~> 1.20)
|
38
42
|
xml-simple (~> 1.1)
|
data/lib/bisu/config.rb
CHANGED
@@ -1,38 +1,54 @@
|
|
1
|
-
require "yaml"
|
2
|
-
|
3
1
|
module Bisu
|
4
|
-
|
5
|
-
|
2
|
+
class Config
|
3
|
+
def initialize(hash:)
|
4
|
+
@hash = hash.deep_symbolize
|
5
|
+
@hash.validate_structure!(EXPECTED_HASH)
|
6
|
+
end
|
6
7
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
return nil
|
11
|
-
end
|
8
|
+
def to_h
|
9
|
+
@hash
|
10
|
+
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
def dictionary
|
13
|
+
@hash[:dictionary]
|
14
|
+
end
|
15
|
+
|
16
|
+
def type
|
17
|
+
@hash[:type]
|
18
|
+
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
def localize_files
|
21
|
+
@hash[:translate].each do |t|
|
22
|
+
@hash[:languages].each do |l|
|
23
|
+
downcase_locale = l[:locale].downcase.gsub("-", "_").gsub(" ", "_")
|
24
|
+
yield(t[:in], (t[:"out_#{downcase_locale}"] || t[:out]) % l, l[:language], l[:locale])
|
25
|
+
end
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
29
|
private
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
31
|
+
EXPECTED_HASH = {
|
32
|
+
type: Hash,
|
33
|
+
elements: {
|
34
|
+
type: { type: String },
|
35
|
+
dictionary: { type: Hash, elements: {
|
36
|
+
sheet_id: { type: String },
|
37
|
+
keys_column: { type: String }
|
38
|
+
} },
|
39
|
+
translate: { type: Array, elements: {
|
40
|
+
type: Hash, elements: {
|
41
|
+
in: { type: String },
|
42
|
+
out: { type: String }
|
43
|
+
}
|
44
|
+
} },
|
45
|
+
languages: { type: Array, elements: {
|
46
|
+
type: Hash, elements: {
|
47
|
+
locale: { type: String },
|
48
|
+
language: { type: String }
|
49
|
+
}
|
50
|
+
} }
|
51
|
+
}
|
52
|
+
}
|
37
53
|
end
|
38
54
|
end
|
data/lib/bisu/google_sheet.rb
CHANGED
data/lib/bisu/localizer.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
Object.class_eval do
|
2
|
+
def deep_symbolize
|
3
|
+
case self
|
4
|
+
when Array
|
5
|
+
self.map { |v| v.deep_symbolize }
|
6
|
+
when Hash
|
7
|
+
self.inject({}) { |memo, (k,v)| memo[k.to_sym] = v.deep_symbolize; memo }
|
8
|
+
else
|
9
|
+
self
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate_structure!(structure, error_prefix=[])
|
14
|
+
return if self == nil && structure[:optional]
|
15
|
+
|
16
|
+
prepend_error = error_prefix.empty? ? "" : (["self"] + error_prefix + [": "]).join
|
17
|
+
|
18
|
+
unless self.is_a? structure[:type]
|
19
|
+
raise ArgumentError.new("#{prepend_error}Expected #{structure[:type]}, got #{self.class}")
|
20
|
+
end
|
21
|
+
|
22
|
+
return unless structure[:elements]
|
23
|
+
|
24
|
+
case self
|
25
|
+
when Array
|
26
|
+
self.each_with_index do |e, i|
|
27
|
+
e.validate_structure!(structure[:elements], error_prefix + ["[#{i}]"])
|
28
|
+
end
|
29
|
+
when Hash
|
30
|
+
mandatory_keys = structure[:elements].map { |k,s| k unless s[:optional] }.compact
|
31
|
+
|
32
|
+
unless (missing = mandatory_keys - self.keys).empty?
|
33
|
+
raise ArgumentError.new("#{prepend_error}Missing keys: #{missing.join(', ')}")
|
34
|
+
end
|
35
|
+
|
36
|
+
structure[:elements].each do |key, structure|
|
37
|
+
self[key].validate_structure!(structure, error_prefix + ["[:#{key}]"])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/bisu/version.rb
CHANGED
data/lib/bisu.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'yaml'
|
3
|
+
|
1
4
|
require 'bisu/logger'
|
5
|
+
require 'bisu/object_extension'
|
2
6
|
require 'bisu/config'
|
3
7
|
require 'bisu/google_sheet'
|
4
8
|
require 'bisu/dictionary'
|
5
9
|
require 'bisu/localizer'
|
6
10
|
require 'bisu/version'
|
7
|
-
require 'optparse'
|
8
11
|
|
9
12
|
module Bisu
|
10
13
|
extend self
|
@@ -12,20 +15,19 @@ module Bisu
|
|
12
15
|
def run(options)
|
13
16
|
options = command_line_options(options)
|
14
17
|
|
15
|
-
if
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
if config_file = open_file("translatable.yml", "r", true)
|
19
|
+
config = Bisu::Config.new(hash: YAML::load(config_file))
|
20
|
+
google_sheet = Bisu::GoogleSheet.new(config.dictionary[:sheet_id], config.dictionary[:keys_column])
|
21
|
+
dictionary = Bisu::Dictionary.new(google_sheet.to_h)
|
22
|
+
localizer = Bisu::Localizer.new(dictionary, config.type)
|
19
23
|
|
20
|
-
config
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
return false
|
25
|
-
end
|
26
|
-
|
27
|
-
localize_file(localizer, out[:locale], out[:kb_language], options[:default_language], in_path, out[:path] || config[:out_path])
|
24
|
+
config.localize_files do |in_path, out_path, language, locale|
|
25
|
+
unless dictionary.has_language?(language)
|
26
|
+
Logger.error("Unknown language #{language}")
|
27
|
+
return false
|
28
28
|
end
|
29
|
+
|
30
|
+
localize_file(localizer, locale, language, options[:default_language], in_path, out_path)
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
@@ -57,22 +59,25 @@ module Bisu
|
|
57
59
|
opts_hash
|
58
60
|
end
|
59
61
|
|
60
|
-
def
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
def open_file(file_name, method, should_exist)
|
63
|
+
if !File.file?(File.expand_path(file_name))
|
64
|
+
if should_exist
|
65
|
+
Logger.error("File #{file_name} not found!")
|
66
|
+
return nil
|
67
|
+
else
|
68
|
+
FileUtils.mkdir_p(File.dirname(file_name))
|
69
|
+
end
|
67
70
|
end
|
68
71
|
|
69
|
-
|
72
|
+
File.open(File.expand_path(file_name), method)
|
73
|
+
end
|
74
|
+
|
75
|
+
def localize_file(localizer, locale, language, default_language, in_path, out_path)
|
76
|
+
Logger.info("Translating #{in_path} to #{language} > #{out_path}...")
|
70
77
|
|
71
78
|
return false unless in_file = open_file(in_path, "r", true)
|
72
79
|
return false unless out_file = open_file(out_path, "w", false)
|
73
80
|
|
74
|
-
Logger.info("Translating #{in_path} to #{language} > #{out_path}...")
|
75
|
-
|
76
81
|
in_file.each_line do |line|
|
77
82
|
out_file.write(localizer.localize(line, language, locale, default_language))
|
78
83
|
end
|
@@ -83,17 +88,4 @@ module Bisu
|
|
83
88
|
|
84
89
|
true
|
85
90
|
end
|
86
|
-
|
87
|
-
def open_file(file_name, method, should_exist)
|
88
|
-
if !File.file?(File.expand_path(file_name))
|
89
|
-
if should_exist
|
90
|
-
Logger.error("File #{file_name} not found!")
|
91
|
-
return nil
|
92
|
-
else
|
93
|
-
FileUtils.mkdir_p(File.dirname(file_name))
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
File.open(File.expand_path(file_name), method)
|
98
|
-
end
|
99
91
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
type: iOS
|
2
|
+
|
3
|
+
dictionary:
|
4
|
+
sheet_id: sheet-id
|
5
|
+
keys_column: keys-column
|
6
|
+
|
7
|
+
translate:
|
8
|
+
- in: hole19/Localizable.strings.translatable
|
9
|
+
out: hole19/%{locale}.lproj/Localizable.strings
|
10
|
+
- in: hole19/Countries.strings.translatable
|
11
|
+
out: hole19/%{locale}.lproj/Countries.strings
|
12
|
+
|
13
|
+
languages:
|
14
|
+
- locale: en
|
15
|
+
language: english
|
16
|
+
- locale: en-US
|
17
|
+
language: english
|
@@ -0,0 +1,53 @@
|
|
1
|
+
describe Bisu::Config do
|
2
|
+
subject(:config) { Bisu::Config.new(hash: hash) }
|
3
|
+
|
4
|
+
let(:hash) { {
|
5
|
+
type: "BisuOS",
|
6
|
+
dictionary: {
|
7
|
+
sheet_id: "abc1234567890",
|
8
|
+
keys_column: "key_name"
|
9
|
+
},
|
10
|
+
translate: [
|
11
|
+
{ in: "path/to/file/to/1.ext.translatable",
|
12
|
+
out: "path/to/final-%{locale}/1.ext",
|
13
|
+
out_en_us: "path/to/default/1.ext"
|
14
|
+
},
|
15
|
+
{ in: "path/to/file/to/2.ext.translatable",
|
16
|
+
out: "path/to/final-%{locale}/2.ext",
|
17
|
+
out_en_us: "path/to/default/2.ext"
|
18
|
+
},
|
19
|
+
],
|
20
|
+
languages: [
|
21
|
+
{ locale: "en-US", language: "english" },
|
22
|
+
{ locale: "pt", language: "portuguese" },
|
23
|
+
{ locale: "pt-PT", language: "portuguese" },
|
24
|
+
{ locale: "pt-Batatas", language: "portuguese" }
|
25
|
+
]
|
26
|
+
} }
|
27
|
+
|
28
|
+
context "when hash is missing params" do
|
29
|
+
before { hash.delete(:type) }
|
30
|
+
it { expect { config }.to raise_error /missing keys/i }
|
31
|
+
end
|
32
|
+
|
33
|
+
its(:to_h) { should eq(hash) }
|
34
|
+
its(:type) { should eq("BisuOS") }
|
35
|
+
its(:dictionary) { should eq({ sheet_id: "abc1234567890", keys_column: "key_name" }) }
|
36
|
+
|
37
|
+
describe "#localize_files" do
|
38
|
+
it "yields 5 times with the expected arguments" do
|
39
|
+
expect { |b|
|
40
|
+
config.localize_files(&b)
|
41
|
+
}.to yield_successive_args(
|
42
|
+
["path/to/file/to/1.ext.translatable", "path/to/default/1.ext", "english", "en-US" ],
|
43
|
+
["path/to/file/to/1.ext.translatable", "path/to/final-pt/1.ext", "portuguese", "pt" ],
|
44
|
+
["path/to/file/to/1.ext.translatable", "path/to/final-pt-PT/1.ext", "portuguese", "pt-PT" ],
|
45
|
+
["path/to/file/to/1.ext.translatable", "path/to/final-pt-Batatas/1.ext", "portuguese", "pt-Batatas"],
|
46
|
+
["path/to/file/to/2.ext.translatable", "path/to/default/2.ext", "english", "en-US" ],
|
47
|
+
["path/to/file/to/2.ext.translatable", "path/to/final-pt/2.ext", "portuguese", "pt" ],
|
48
|
+
["path/to/file/to/2.ext.translatable", "path/to/final-pt-PT/2.ext", "portuguese", "pt-PT" ],
|
49
|
+
["path/to/file/to/2.ext.translatable", "path/to/final-pt-Batatas/2.ext", "portuguese", "pt-Batatas"]
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
File without changes
|
@@ -1,5 +1,5 @@
|
|
1
1
|
describe Bisu::GoogleSheet do
|
2
|
-
subject(:
|
2
|
+
subject(:to_h) { Bisu::GoogleSheet.new(sheet_id, key_column).to_h }
|
3
3
|
|
4
4
|
let(:sheet_id) { "abc1234567890" }
|
5
5
|
let(:url_info) { "https://spreadsheets.google.com/feeds/worksheets/#{sheet_id}/public/full" }
|
@@ -17,20 +17,20 @@ describe Bisu::GoogleSheet do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it do
|
20
|
-
expect {
|
20
|
+
expect { to_h }.not_to raise_error
|
21
21
|
end
|
22
22
|
|
23
23
|
it "returns an hash" do
|
24
|
-
expect(
|
25
|
-
expect(
|
26
|
-
expect(
|
24
|
+
expect(to_h).to include("kConnectEmail")
|
25
|
+
expect(to_h["kConnectEmail"]).to include("korean")
|
26
|
+
expect(to_h["kConnectEmail"]).to include("spanish" => "Conéctate con Email")
|
27
27
|
end
|
28
28
|
|
29
29
|
context "but the key column is not present in the first sheet" do
|
30
30
|
let(:key_column) { "expecting_another_key_column" }
|
31
31
|
|
32
32
|
it do
|
33
|
-
expect {
|
33
|
+
expect { to_h }.to raise_error /Cannot find key column/
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -39,7 +39,7 @@ describe Bisu::GoogleSheet do
|
|
39
39
|
before { stub_request(:get, url_info).to_return(:status => 400, :body => "Not Found", :headers => {}) }
|
40
40
|
|
41
41
|
it do
|
42
|
-
expect {
|
42
|
+
expect { to_h }.to raise_error /Cannot access sheet/
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -47,7 +47,7 @@ describe Bisu::GoogleSheet do
|
|
47
47
|
before { stub_request(:get, url_info).to_return(:status => 302, :body => "<HTML></HTML>", :headers => {}) }
|
48
48
|
|
49
49
|
it do
|
50
|
-
expect {
|
50
|
+
expect { to_h }.to raise_error /Cannot access sheet/
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -55,7 +55,7 @@ describe Bisu::GoogleSheet do
|
|
55
55
|
before { stub_request(:get, url_info).to_return(:status => 200, :body => "This is not XML; { this: \"is json\" }", :headers => {}) }
|
56
56
|
|
57
57
|
it do
|
58
|
-
expect {
|
58
|
+
expect { to_h }.to raise_error /Cannot parse. Expected XML/
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -85,8 +85,6 @@ describe Bisu::Localizer do
|
|
85
85
|
end
|
86
86
|
|
87
87
|
it "does not throw an error when key parameters where given" do
|
88
|
-
Bisu::Logger.silent_mode = false
|
89
|
-
|
90
88
|
expect {
|
91
89
|
localizer.localize("$k1ParameterKey{name:%1$s}$", language, locale)
|
92
90
|
}.to not_change { Bisu::Logger.summary[:warn] }
|
File without changes
|
@@ -0,0 +1,100 @@
|
|
1
|
+
describe Object do
|
2
|
+
|
3
|
+
describe "#deep_symbolize" do
|
4
|
+
subject { obj.deep_symbolize }
|
5
|
+
|
6
|
+
context "when object is an Hash" do
|
7
|
+
let(:obj) { { "key1" => "value1", key2: "value2" } }
|
8
|
+
it { should eq({ key1: "value1", key2: "value2" }) }
|
9
|
+
|
10
|
+
context "with inner Hashes" do
|
11
|
+
before { obj["key2"] = { "key3" => { "key4" => "value4" } } }
|
12
|
+
it { should eq({ key1: "value1", key2: { key3: { key4: "value4" } }}) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when object is an Array" do
|
17
|
+
let(:obj) { ["value1"] }
|
18
|
+
it { should eq obj }
|
19
|
+
|
20
|
+
context "with inner Hashes" do
|
21
|
+
let(:obj) { [{ "key1" => "value1" }, { "key2" => "value2" }] }
|
22
|
+
it { should eq([{ key1: "value1" }, { key2: "value2" }]) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "when object is something else" do
|
27
|
+
let(:obj) { "value1" }
|
28
|
+
it { should eq obj }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#validate_structure!" do
|
33
|
+
subject { obj.validate_structure!(structure) }
|
34
|
+
|
35
|
+
context "when object type differs of the structure type" do
|
36
|
+
let(:obj) { "a string" }
|
37
|
+
let(:structure) { { type: Integer } }
|
38
|
+
it { expect { subject }.to raise_error /expected Integer, got String/i }
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when object is a Nil" do
|
42
|
+
let(:obj) { nil }
|
43
|
+
let(:structure) { { type: Integer } }
|
44
|
+
it { expect { subject }.to raise_error /expected Integer, got NilClass/i }
|
45
|
+
|
46
|
+
context "but is also optional" do
|
47
|
+
before { structure[:optional] = true }
|
48
|
+
it { expect { subject }.not_to raise_error }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when object is an Array" do
|
53
|
+
let(:obj) { ["elem1", "elem2"] }
|
54
|
+
let(:structure) { { type: Array } }
|
55
|
+
it { expect { subject }.not_to raise_error }
|
56
|
+
|
57
|
+
context "given an element structure" do
|
58
|
+
before { structure[:elements] = { type: String } }
|
59
|
+
it { expect { subject }.not_to raise_error }
|
60
|
+
|
61
|
+
context "which is not respected" do
|
62
|
+
before { structure[:elements] = { type: Integer } }
|
63
|
+
it { expect { subject }.to raise_error /expected Integer, got String/i }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "when object is an Hash" do
|
69
|
+
let(:obj) { { key1: "value1", key2: "value2", key3: "value3" } }
|
70
|
+
let(:structure) { { type: Hash } }
|
71
|
+
it { expect { subject }.not_to raise_error }
|
72
|
+
|
73
|
+
context "when given an element structure" do
|
74
|
+
let(:structure) { { type: Hash, elements: { key1: { type: String }, key2: { type: String }, key3: { type: String } } } }
|
75
|
+
it { expect { subject }.not_to raise_error }
|
76
|
+
|
77
|
+
context "which is not respected" do
|
78
|
+
before { obj[:key2] = {} }
|
79
|
+
it { expect { subject }.to raise_error /expected String, got Hash/i }
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when missing keys" do
|
83
|
+
before do
|
84
|
+
obj.delete(:key1)
|
85
|
+
obj.delete(:key3)
|
86
|
+
end
|
87
|
+
it { expect { subject }.to raise_error /missing keys: key1, key3/i }
|
88
|
+
|
89
|
+
context "which are optional" do
|
90
|
+
before do
|
91
|
+
structure[:elements][:key1][:optional] = true
|
92
|
+
structure[:elements][:key3][:optional] = true
|
93
|
+
end
|
94
|
+
it { expect { subject }.not_to raise_error }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
describe Bisu do
|
2
|
+
subject(:run) { Bisu.run([]) }
|
3
|
+
|
4
|
+
context "when there is a translatable.yml" do
|
5
|
+
let(:file) { File.open("spec/fixtures/sample.translatable.yml") }
|
6
|
+
|
7
|
+
before do
|
8
|
+
allow(Bisu).to receive(:open_file).and_return(file)
|
9
|
+
allow_any_instance_of(Bisu::GoogleSheet).to receive(:to_h).and_return({
|
10
|
+
"kKey" => { "english" => "Value" }
|
11
|
+
})
|
12
|
+
allow(Bisu).to receive(:localize_file)
|
13
|
+
end
|
14
|
+
|
15
|
+
it { expect { run }.not_to raise_error }
|
16
|
+
|
17
|
+
it "logs an error" do
|
18
|
+
expect {
|
19
|
+
run
|
20
|
+
}.to not_change { Bisu::Logger.summary[:warn] }
|
21
|
+
.and not_change { Bisu::Logger.summary[:error] }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when translatable.yml does not exist locally" do
|
26
|
+
it { expect { run }.not_to raise_error }
|
27
|
+
|
28
|
+
it "logs an error" do
|
29
|
+
expect {
|
30
|
+
run
|
31
|
+
}.to not_change { Bisu::Logger.summary[:warn] }
|
32
|
+
.and change { Bisu::Logger.summary[:error] }.by(1)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bisu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- joaoffcosta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: safe_yaml
|
@@ -89,15 +89,18 @@ files:
|
|
89
89
|
- lib/bisu/google_sheet.rb
|
90
90
|
- lib/bisu/localizer.rb
|
91
91
|
- lib/bisu/logger.rb
|
92
|
+
- lib/bisu/object_extension.rb
|
92
93
|
- lib/bisu/version.rb
|
93
|
-
- spec/
|
94
|
-
- spec/bisu/dictionary_spec.rb
|
95
|
-
- spec/bisu/google_sheet_spec.rb
|
96
|
-
- spec/bisu/localizer_spec.rb
|
97
|
-
- spec/bisu/logger_spec.rb
|
94
|
+
- spec/fixtures/sample.translatable.yml
|
98
95
|
- spec/fixtures/sample_kb_public_info.html
|
99
96
|
- spec/fixtures/sample_kb_public_sheet.html
|
100
|
-
- spec/
|
97
|
+
- spec/lib/bisu/config_spec.rb
|
98
|
+
- spec/lib/bisu/dictionary_spec.rb
|
99
|
+
- spec/lib/bisu/google_sheet_spec.rb
|
100
|
+
- spec/lib/bisu/localizer_spec.rb
|
101
|
+
- spec/lib/bisu/logger_spec.rb
|
102
|
+
- spec/lib/bisu/object_extension_spec.rb
|
103
|
+
- spec/lib/bisu_spec.rb
|
101
104
|
- spec/spec_helper.rb
|
102
105
|
homepage: https://github.com/hole19/bisu
|
103
106
|
licenses:
|
data/spec/bisu/config_spec.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
describe Bisu::Config do
|
2
|
-
subject { Bisu::Config.parse(file_path) }
|
3
|
-
|
4
|
-
context "given a yml file" do
|
5
|
-
let(:file_path) { "spec/fixtures/sample_translatable.yml" }
|
6
|
-
|
7
|
-
it "should parse the yml with deep key symbolization" do
|
8
|
-
expect(subject).to eq({
|
9
|
-
type: "BisuOS",
|
10
|
-
sheet_id: "abc1234567890",
|
11
|
-
keys_column: "key_name",
|
12
|
-
in: [
|
13
|
-
"path/to/file/to/1.ext.translatable",
|
14
|
-
"path/to/file/to/2.ext.translatable"
|
15
|
-
],
|
16
|
-
out_path: "path/to/final-%{locale}/%{out_name}",
|
17
|
-
out: [
|
18
|
-
{ locale: "en", kb_language: "english", path: "path/to/default/%{out_name}" },
|
19
|
-
{ locale: "pt", kb_language: "portuguese" },
|
20
|
-
{ locale: "pt-PT", kb_language: "portuguese" }
|
21
|
-
]
|
22
|
-
})
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context "given an inexistent file" do
|
27
|
-
let(:file_path) { "does_not_exist" }
|
28
|
-
it { should be nil }
|
29
|
-
end
|
30
|
-
|
31
|
-
context "given no file path" do
|
32
|
-
let(:file_path) { nil }
|
33
|
-
it { should be nil }
|
34
|
-
end
|
35
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
type: BisuOS
|
2
|
-
|
3
|
-
sheet_id: abc1234567890
|
4
|
-
keys_column: key_name
|
5
|
-
|
6
|
-
in:
|
7
|
-
- path/to/file/to/1.ext.translatable
|
8
|
-
- path/to/file/to/2.ext.translatable
|
9
|
-
|
10
|
-
out_path: path/to/final-%{locale}/%{out_name}
|
11
|
-
out:
|
12
|
-
- locale: en
|
13
|
-
kb_language: english
|
14
|
-
path: path/to/default/%{out_name}
|
15
|
-
- locale: pt
|
16
|
-
kb_language: portuguese
|
17
|
-
- locale: pt-PT
|
18
|
-
kb_language: portuguese
|