translate-yaml-generator 0.0.1
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/.travis.yml +20 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +72 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +28 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/data/sample-1.xlsx +0 -0
- data/data/sample-1.yml +6 -0
- data/lib/translate_yaml_generator.rb +11 -0
- data/lib/translate_yaml_generator/cli.rb +48 -0
- data/lib/translate_yaml_generator/core.rb +102 -0
- data/lib/translate_yaml_generator/reader.rb +63 -0
- data/lib/translate_yaml_generator/writer.rb +80 -0
- data/spec/lib/translate_yaml_generator/core_spec.rb +111 -0
- data/spec/lib/translate_yaml_generator/reader_spec.rb +31 -0
- data/spec/lib/translate_yaml_generator/writer_spec.rb +101 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 140024afd6a25bf8699f89c366e7077f0f05ab0e
|
4
|
+
data.tar.gz: 4ef47e62b17de2c5a5c88971d695d5cb8f21fba4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bf49ba1f1219e3711db15eaf0455b68bea1e14c9a9099bd5d867996d639ff927cfce2af67947f80d98c021f358ec05cdd133821621b9e29ed8c1e953bec102f1
|
7
|
+
data.tar.gz: a6df5cd9f3ec176927f83ed1008d0cafc9a147761776aa13da4cc9e4684c89208a6fb111ef15da1bf33c23255cdf929469f6aaab8a2ddee7cb4ffa387ee6be54
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.3.6)
|
5
|
+
builder (3.1.4)
|
6
|
+
descendants_tracker (0.0.4)
|
7
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
8
|
+
diff-lcs (1.2.5)
|
9
|
+
faraday (0.9.0)
|
10
|
+
multipart-post (>= 1.2, < 3)
|
11
|
+
git (1.2.7)
|
12
|
+
github_api (0.12.2)
|
13
|
+
addressable (~> 2.3)
|
14
|
+
descendants_tracker (~> 0.0.4)
|
15
|
+
faraday (~> 0.8, < 0.10)
|
16
|
+
hashie (>= 3.3)
|
17
|
+
multi_json (>= 1.7.5, < 2.0)
|
18
|
+
nokogiri (~> 1.6.3)
|
19
|
+
oauth2
|
20
|
+
hashie (3.3.2)
|
21
|
+
highline (1.6.21)
|
22
|
+
jeweler (2.0.1)
|
23
|
+
builder
|
24
|
+
bundler (>= 1.0)
|
25
|
+
git (>= 1.2.5)
|
26
|
+
github_api
|
27
|
+
highline (>= 1.6.15)
|
28
|
+
nokogiri (>= 1.5.10)
|
29
|
+
rake
|
30
|
+
rdoc
|
31
|
+
json (1.8.1)
|
32
|
+
jwt (1.2.0)
|
33
|
+
mini_portile (0.6.2)
|
34
|
+
multi_json (1.10.1)
|
35
|
+
multi_xml (0.5.5)
|
36
|
+
multipart-post (2.0.0)
|
37
|
+
nokogiri (1.6.5)
|
38
|
+
mini_portile (~> 0.6.0)
|
39
|
+
oauth2 (1.0.0)
|
40
|
+
faraday (>= 0.8, < 0.10)
|
41
|
+
jwt (~> 1.0)
|
42
|
+
multi_json (~> 1.3)
|
43
|
+
multi_xml (~> 0.5)
|
44
|
+
rack (~> 1.2)
|
45
|
+
rack (1.5.2)
|
46
|
+
rake (0.9.6)
|
47
|
+
rdoc (3.12.2)
|
48
|
+
json (~> 1.4)
|
49
|
+
rspec (2.99.0)
|
50
|
+
rspec-core (~> 2.99.0)
|
51
|
+
rspec-expectations (~> 2.99.0)
|
52
|
+
rspec-mocks (~> 2.99.0)
|
53
|
+
rspec-core (2.99.2)
|
54
|
+
rspec-expectations (2.99.2)
|
55
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
56
|
+
rspec-mocks (2.99.2)
|
57
|
+
rubyXL (3.3.2)
|
58
|
+
nokogiri (>= 1.4.4)
|
59
|
+
rubyzip (>= 1.1.6)
|
60
|
+
rubyzip (1.1.6)
|
61
|
+
thread_safe (0.3.4)
|
62
|
+
|
63
|
+
PLATFORMS
|
64
|
+
ruby
|
65
|
+
|
66
|
+
DEPENDENCIES
|
67
|
+
bundler (~> 1.0)
|
68
|
+
jeweler (~> 2.0.1)
|
69
|
+
rake (~> 0.9.2)
|
70
|
+
rdoc (~> 3.12)
|
71
|
+
rspec (~> 2.13)
|
72
|
+
rubyXL (>= 3.3.2)
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2015 if1live
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
= translate-yaml-generator
|
2
|
+
|
3
|
+
{<img src="https://travis-ci.org/5minlab/translate-yaml-generator.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/5minlab/translate-yaml-generator]
|
4
|
+
|
5
|
+
|
6
|
+
Generate translation yaml from excel file. (for L10N, I18N)
|
7
|
+
|
8
|
+
== Feature
|
9
|
+
* Manage translation via MS Excel file.
|
10
|
+
* Generate YAML Locale file from Excel file.
|
11
|
+
|
12
|
+
== Install:
|
13
|
+
gem install bundler
|
14
|
+
bundle install
|
15
|
+
|
16
|
+
== Usage:
|
17
|
+
Usage: ./lib/translate_yaml_generator.rb <translate data excel> <config yaml>
|
18
|
+
i18n excel : Excel File for Translate Data (extension: xlsx)
|
19
|
+
config yaml : Configuration File (extension: yml)
|
20
|
+
|
21
|
+
=== Sample:
|
22
|
+
./lib/translate_yaml_generator.rb data/sample-1.xlsx data/sample-1.yml
|
23
|
+
|
24
|
+
== Copyright
|
25
|
+
|
26
|
+
Copyright (c) 2015 if1live. See LICENSE.txt for
|
27
|
+
further details.
|
28
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
17
|
+
gem.name = "translate-yaml-generator"
|
18
|
+
gem.homepage = "http://github.com/5minlab/translate-yaml-generator"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{Generate translation yaml from excel file. (for L10N, I18N)}
|
21
|
+
gem.description = %Q{Generate translation yaml from excel file. (for L10N, I18N)}
|
22
|
+
gem.email = "libsora25@gmail.com"
|
23
|
+
gem.authors = ["if1live"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require "rspec/core/rake_task"
|
29
|
+
RSpec::Core::RakeTask.new(:spec)
|
30
|
+
task :test => :spec
|
31
|
+
|
32
|
+
desc "Code coverage detail"
|
33
|
+
task :simplecov do
|
34
|
+
ENV['COVERAGE'] = "true"
|
35
|
+
Rake::Task['test'].execute
|
36
|
+
end
|
37
|
+
|
38
|
+
task :default => :test
|
39
|
+
|
40
|
+
require 'rdoc/task'
|
41
|
+
Rake::RDocTask.new do |rdoc|
|
42
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
43
|
+
|
44
|
+
rdoc.rdoc_dir = 'rdoc'
|
45
|
+
rdoc.title = "translate-yaml-generator #{version}"
|
46
|
+
rdoc.rdoc_files.include('README*')
|
47
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
48
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/data/sample-1.xlsx
ADDED
Binary file
|
data/data/sample-1.yml
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require_relative "translate_yaml_generator/core"
|
5
|
+
require_relative "translate_yaml_generator/reader"
|
6
|
+
require_relative "translate_yaml_generator/writer"
|
7
|
+
require_relative "translate_yaml_generator/cli"
|
8
|
+
|
9
|
+
if __FILE__ == $0
|
10
|
+
TranslateYamlGenerator::main
|
11
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
require "fileutils"
|
5
|
+
|
6
|
+
module TranslateYamlGenerator
|
7
|
+
def self.run(data_filename, config_filename)
|
8
|
+
config_content = File.read config_filename
|
9
|
+
config = YAML.load(config_content)
|
10
|
+
|
11
|
+
reader = TranslateYamlGenerator::Reader::XlsxReader.new
|
12
|
+
root = reader.read data_filename
|
13
|
+
|
14
|
+
base_dir = File.dirname(data_filename)
|
15
|
+
|
16
|
+
config["languages"].each_with_index do |data, idx|
|
17
|
+
writer = TranslateYamlGenerator::Writer::YamlWriter.new
|
18
|
+
writer.locale = data["lang"]
|
19
|
+
writer.locale_idx = idx
|
20
|
+
|
21
|
+
filename = data["file"]
|
22
|
+
if filename[0] == '/'
|
23
|
+
target_dir = File.dirname(filename)
|
24
|
+
else
|
25
|
+
target_dir = File.join(base_dir, File.dirname(filename))
|
26
|
+
end
|
27
|
+
FileUtils::mkdir_p target_dir
|
28
|
+
|
29
|
+
File.open(File.join(base_dir, filename), 'w') do |f|
|
30
|
+
f.write(writer.write root)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.main
|
36
|
+
if ARGV.length == 2
|
37
|
+
data_filename = ARGV[0]
|
38
|
+
config_filename = ARGV[1]
|
39
|
+
run data_filename, config_filename
|
40
|
+
else
|
41
|
+
puts <<eos
|
42
|
+
Usage: #{$0} <translate excel> <config yaml>
|
43
|
+
translate excel : Internationalization Excel File (extension: xlsx)
|
44
|
+
config yaml : Configuration File (extension: yml)
|
45
|
+
eos
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TranslateYamlGenerator
|
4
|
+
class Record
|
5
|
+
INDEX_NAMESPACE = 0
|
6
|
+
INDEX_NAME = 1
|
7
|
+
METADATA_FIELD_COUNT = 2
|
8
|
+
|
9
|
+
def initialize(row)
|
10
|
+
raise ArgumentError, "No language data inside row" if row.length <= METADATA_FIELD_COUNT
|
11
|
+
@row = row
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
def namespace
|
16
|
+
@row[INDEX_NAMESPACE]
|
17
|
+
end
|
18
|
+
|
19
|
+
def name
|
20
|
+
@row[INDEX_NAME]
|
21
|
+
end
|
22
|
+
|
23
|
+
def item idx
|
24
|
+
raise ArgumentError, "not valid language index" if idx < 0 or idx >= self.count
|
25
|
+
@row[idx + METADATA_FIELD_COUNT]
|
26
|
+
end
|
27
|
+
|
28
|
+
def count
|
29
|
+
@row.length - METADATA_FIELD_COUNT
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
class Node
|
35
|
+
attr_reader :name, :children, :records
|
36
|
+
attr_accessor :parent
|
37
|
+
protected :parent=
|
38
|
+
|
39
|
+
def initialize(name="")
|
40
|
+
@name = name
|
41
|
+
@parent = nil
|
42
|
+
@children = []
|
43
|
+
@records = []
|
44
|
+
end
|
45
|
+
|
46
|
+
def fullname
|
47
|
+
token_list = [@name]
|
48
|
+
parent = @parent
|
49
|
+
while parent != nil
|
50
|
+
token_list << parent.name
|
51
|
+
parent = parent.parent
|
52
|
+
end
|
53
|
+
token_list.reject! { |c| c.empty? }
|
54
|
+
token_list.reverse.join(".")
|
55
|
+
end
|
56
|
+
|
57
|
+
def add_child(child)
|
58
|
+
@children << child
|
59
|
+
child.parent = self
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_record(record)
|
63
|
+
@records << record
|
64
|
+
end
|
65
|
+
|
66
|
+
def find_child!(ns)
|
67
|
+
return self if @name == ns
|
68
|
+
find_child_r!(ns)
|
69
|
+
end
|
70
|
+
|
71
|
+
def find_child_r!(ns)
|
72
|
+
return self if ns == ""
|
73
|
+
token_list = ns.split(".")
|
74
|
+
child_name = token_list[0]
|
75
|
+
next_ns = token_list[1, token_list.length].join(".")
|
76
|
+
|
77
|
+
@children.each do |child|
|
78
|
+
return child.find_child_r! next_ns if child.name == child_name
|
79
|
+
end
|
80
|
+
|
81
|
+
if token_list.length == 1
|
82
|
+
node = TranslateYamlGenerator::Node.new child_name
|
83
|
+
self << node
|
84
|
+
return node
|
85
|
+
else
|
86
|
+
node = TranslateYamlGenerator::Node.new child_name
|
87
|
+
self << node
|
88
|
+
node.find_child! next_ns
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def <<(item)
|
93
|
+
if item.is_a? TranslateYamlGenerator::Record
|
94
|
+
add_record item
|
95
|
+
elsif item.is_a? TranslateYamlGenerator::Node
|
96
|
+
add_child item
|
97
|
+
else
|
98
|
+
raise ArgumentError, "not valid type"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "rubyXL"
|
4
|
+
require_relative "core"
|
5
|
+
|
6
|
+
module TranslateYamlGenerator
|
7
|
+
module Reader
|
8
|
+
class BaseReader
|
9
|
+
def build_tree(records)
|
10
|
+
root = TranslateYamlGenerator::Node.new
|
11
|
+
records.each do |r|
|
12
|
+
node = root.find_child! r.namespace
|
13
|
+
node << r
|
14
|
+
end
|
15
|
+
root
|
16
|
+
end
|
17
|
+
|
18
|
+
def read(filename)
|
19
|
+
check_filename(filename)
|
20
|
+
records = read_records filename
|
21
|
+
root = build_tree records
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
class XlsxReader < BaseReader
|
27
|
+
RE_XLSX = Regexp.new("\.xlsx$", Regexp::IGNORECASE)
|
28
|
+
|
29
|
+
def check_filename(filename)
|
30
|
+
raise ArgumentError, "not vaild xlsx file" unless filename =~ RE_XLSX
|
31
|
+
end
|
32
|
+
|
33
|
+
def read_records(filename)
|
34
|
+
workbook = RubyXL::Parser.parse filename
|
35
|
+
worksheet = workbook[0]
|
36
|
+
|
37
|
+
records = []
|
38
|
+
|
39
|
+
worksheet.each_with_index do |row, row_idx|
|
40
|
+
ns_cell = row[0]
|
41
|
+
name_cell = row[1]
|
42
|
+
|
43
|
+
# allow empty namespace
|
44
|
+
ns = (defined? ns_cell.value) ? (ns_cell.value) : ""
|
45
|
+
|
46
|
+
# empty name is not allowed
|
47
|
+
next unless defined? name_cell.value
|
48
|
+
|
49
|
+
rowdata = ns, name_cell.value
|
50
|
+
(2...row.size).each do |col_idx|
|
51
|
+
item_cell = row[col_idx]
|
52
|
+
rowdata << item_cell.value
|
53
|
+
end
|
54
|
+
|
55
|
+
record = TranslateYamlGenerator::Record.new rowdata
|
56
|
+
records << record
|
57
|
+
end
|
58
|
+
|
59
|
+
return records
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module TranslateYamlGenerator
|
6
|
+
module Writer
|
7
|
+
class BaseWriter
|
8
|
+
attr_accessor :locale_idx, :locale
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@locale_idx = 0
|
12
|
+
@locale = "en"
|
13
|
+
end
|
14
|
+
|
15
|
+
def write(node)
|
16
|
+
reset
|
17
|
+
visit_r node, ""
|
18
|
+
result
|
19
|
+
end
|
20
|
+
|
21
|
+
def reset
|
22
|
+
end
|
23
|
+
|
24
|
+
def result
|
25
|
+
end
|
26
|
+
|
27
|
+
def visit_r(node, parent_ns)
|
28
|
+
ns = [parent_ns, node.name].reject(&:empty?).join(".")
|
29
|
+
node.records.each do |r|
|
30
|
+
handle_record ns, r
|
31
|
+
end
|
32
|
+
node.children.each { |c| visit_r c, ns}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class LineWriter < BaseWriter
|
37
|
+
def reset; @item_list = []; end
|
38
|
+
def result; @item_list; end
|
39
|
+
|
40
|
+
def handle_record(ns, record)
|
41
|
+
data = {
|
42
|
+
:ns => ns,
|
43
|
+
:name => record.name,
|
44
|
+
:value => (record.item @locale_idx)
|
45
|
+
}
|
46
|
+
@item_list << data
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class HashWriter < BaseWriter
|
51
|
+
def reset; @root = {}; end
|
52
|
+
def result; @root; end
|
53
|
+
|
54
|
+
def handle_record(ns, record)
|
55
|
+
token_list = ns.split(".")
|
56
|
+
curr_hash = @root
|
57
|
+
token_list.each do |token|
|
58
|
+
if curr_hash.has_key? token
|
59
|
+
curr_hash = curr_hash[token]
|
60
|
+
else
|
61
|
+
curr_hash[token] = {}
|
62
|
+
curr_hash = curr_hash[token]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
curr_hash[record.name] = record.item @locale_idx
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class YamlWriter < HashWriter
|
71
|
+
def result
|
72
|
+
root = {
|
73
|
+
@locale => @root
|
74
|
+
}
|
75
|
+
result = YAML.dump(root)
|
76
|
+
result.gsub "---\n", ""
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "translate_yaml_generator/core"
|
4
|
+
|
5
|
+
describe TranslateYamlGenerator::Record do
|
6
|
+
describe "#item" do
|
7
|
+
let(:row) { ["ns", "name", "english", "한국어"] }
|
8
|
+
let(:record) { TranslateYamlGenerator::Record.new row }
|
9
|
+
|
10
|
+
it "valid index" do
|
11
|
+
expect(record.item 0).to eq("english")
|
12
|
+
expect(record.item 1).to eq("한국어")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "invalid index" do
|
16
|
+
expect { record.item -1 }.to raise_error(ArgumentError)
|
17
|
+
expect { record.item 2 }.to raise_error(ArgumentError)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#item" do
|
22
|
+
let(:row) { ["", "name"] }
|
23
|
+
|
24
|
+
it "empty language data" do
|
25
|
+
expect { TranslateYamlGenerator::Record.new row }.to raise_error(ArgumentError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
describe TranslateYamlGenerator::Node do
|
32
|
+
let(:root) { TranslateYamlGenerator::Node.new "" }
|
33
|
+
let(:child) { TranslateYamlGenerator::Node.new "child" }
|
34
|
+
let(:record) { TranslateYamlGenerator::Record.new ["ns", "name", "english", "한국어"] }
|
35
|
+
|
36
|
+
describe "#add_child" do
|
37
|
+
it "add child node" do
|
38
|
+
expect(root.children.length).to eq(0)
|
39
|
+
|
40
|
+
root.add_child child
|
41
|
+
expect(root.children.length).to eq(1)
|
42
|
+
expect(child.parent).to eq(root)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#add_record" do
|
47
|
+
it "add record" do
|
48
|
+
expect(root.records.length).to eq(0)
|
49
|
+
|
50
|
+
root.add_record record
|
51
|
+
expect(root.records.length).to eq(1)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#fullname" do
|
56
|
+
it "get fulllname" do
|
57
|
+
node = TranslateYamlGenerator::Node.new "node"
|
58
|
+
child << node
|
59
|
+
|
60
|
+
expect(root.fullname).to eq("")
|
61
|
+
expect(child.fullname).to eq("child")
|
62
|
+
expect(node.fullname).to eq("child.node")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#<< " do
|
67
|
+
it "child" do
|
68
|
+
root << child
|
69
|
+
expect(root.children.length).to eq(1)
|
70
|
+
expect(root.records.length).to eq(0)
|
71
|
+
end
|
72
|
+
it "record" do
|
73
|
+
root << record
|
74
|
+
expect(root.children.length).to eq(0)
|
75
|
+
expect(root.records.length).to eq(1)
|
76
|
+
end
|
77
|
+
it "not valid" do
|
78
|
+
expect { root << "not-valid" }.to raise_error(ArgumentError)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "#find_child!" do
|
83
|
+
before(:each) do
|
84
|
+
root << child
|
85
|
+
end
|
86
|
+
|
87
|
+
it "ns equal current node" do
|
88
|
+
expect(root.find_child! "").to eq(root)
|
89
|
+
expect(child.find_child! "child").to eq(child)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "child exist" do
|
93
|
+
expect(root.find_child! "child").to eq(child)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "create child if parent exist" do
|
97
|
+
name_list = "new_child", "child.new_child"
|
98
|
+
name_list.each do |name|
|
99
|
+
node = root.find_child! name
|
100
|
+
expect(node.fullname).to eq(name)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
it "create child if parent not exist" do
|
104
|
+
name_list = "foo.bar.spam", "child.foo.bar.spam"
|
105
|
+
name_list.each do |name|
|
106
|
+
node = root.find_child! name
|
107
|
+
expect(node.fullname).to eq(name)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "translate_yaml_generator/reader"
|
4
|
+
|
5
|
+
def get_data_file filename
|
6
|
+
root_path = __FILE__
|
7
|
+
4.times { root_path = File.dirname(root_path) }
|
8
|
+
File.join(root_path, "data", filename)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe TranslateYamlGenerator::Reader::XlsxReader do
|
12
|
+
let(:reader) { TranslateYamlGenerator::Reader::XlsxReader.new }
|
13
|
+
|
14
|
+
describe "#read" do
|
15
|
+
it "not valid xlsx extension" do
|
16
|
+
expect { reader.read "foo.csv" }.to raise_error(ArgumentError)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "read record" do
|
20
|
+
filename = get_data_file "sample-1.xlsx"
|
21
|
+
root = reader.read filename
|
22
|
+
|
23
|
+
expect(root.children.length).to eq(2)
|
24
|
+
expect(root.records.length).to eq(1)
|
25
|
+
|
26
|
+
node = root.find_child! "admin.debug"
|
27
|
+
expect(node.children.length).to eq(0)
|
28
|
+
expect(node.records.length).to eq(2)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "translate_yaml_generator/writer"
|
4
|
+
require "translate_yaml_generator/core"
|
5
|
+
|
6
|
+
|
7
|
+
def get_data_file filename
|
8
|
+
root_path = __FILE__
|
9
|
+
4.times { root_path = File.dirname(root_path) }
|
10
|
+
File.join(root_path, "data", filename)
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
describe TranslateYamlGenerator::Writer::HashWriter do
|
15
|
+
let(:writer) { TranslateYamlGenerator::Writer::HashWriter.new }
|
16
|
+
|
17
|
+
describe "#write" do
|
18
|
+
it "use data" do
|
19
|
+
filename = get_data_file "sample-1.xlsx"
|
20
|
+
reader = TranslateYamlGenerator::Reader::XlsxReader.new
|
21
|
+
root = reader.read filename
|
22
|
+
actual = writer.write root
|
23
|
+
expected = {
|
24
|
+
"unknown" => "빈거",
|
25
|
+
"admin" => {
|
26
|
+
"item_1" => "한글",
|
27
|
+
"item_2" => "테스트",
|
28
|
+
"item_3" => "서비스",
|
29
|
+
"debug" => {
|
30
|
+
"sample_1" => "임시",
|
31
|
+
"sample_2" => "점검"
|
32
|
+
}
|
33
|
+
},
|
34
|
+
"foo" => {
|
35
|
+
"bar" => {
|
36
|
+
"spam" => {
|
37
|
+
"dummy_1" => "메뉴",
|
38
|
+
"dummy_2" => "항목"
|
39
|
+
},
|
40
|
+
"menu" => {
|
41
|
+
"elem_1" => "일부",
|
42
|
+
"elem_2" => "요소"
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
expect(actual).to eq(expected)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
describe TranslateYamlGenerator::Writer::LineWriter do
|
54
|
+
let(:writer) { TranslateYamlGenerator::Writer::LineWriter.new }
|
55
|
+
|
56
|
+
describe "#locale_idx" do
|
57
|
+
it "get/set" do
|
58
|
+
expect(writer.locale_idx).to eq(0)
|
59
|
+
writer.locale_idx = 1
|
60
|
+
expect(writer.locale_idx).to eq(1)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#write" do
|
65
|
+
it "use data" do
|
66
|
+
filename = get_data_file "sample-1.xlsx"
|
67
|
+
reader = TranslateYamlGenerator::Reader::XlsxReader.new
|
68
|
+
root = reader.read filename
|
69
|
+
|
70
|
+
actual = writer.write root
|
71
|
+
expected = [
|
72
|
+
{:ns=>"", :name=>"unknown", :value=>"빈거"},
|
73
|
+
{:ns=>"admin", :name=>"item_1", :value=>"한글"},
|
74
|
+
{:ns=>"admin", :name=>"item_2", :value=>"테스트"},
|
75
|
+
{:ns=>"admin", :name=>"item_3", :value=>"서비스"},
|
76
|
+
{:ns=>"admin.debug", :name=>"sample_1", :value=>"임시"},
|
77
|
+
{:ns=>"admin.debug", :name=>"sample_2", :value=>"점검"},
|
78
|
+
{:ns=>"foo.bar.spam", :name=>"dummy_1", :value=>"메뉴"},
|
79
|
+
{:ns=>"foo.bar.spam", :name=>"dummy_2", :value=>"항목"},
|
80
|
+
{:ns=>"foo.bar.menu", :name=>"elem_1", :value=>"일부"},
|
81
|
+
{:ns=>"foo.bar.menu", :name=>"elem_2", :value=>"요소"},
|
82
|
+
]
|
83
|
+
expect(actual).to eq(expected)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
describe TranslateYamlGenerator::Writer::YamlWriter do
|
90
|
+
let(:writer) { TranslateYamlGenerator::Writer::YamlWriter.new }
|
91
|
+
|
92
|
+
describe "#write" do
|
93
|
+
it "use data" do
|
94
|
+
filename = get_data_file "sample-1.xlsx"
|
95
|
+
reader = TranslateYamlGenerator::Reader::XlsxReader.new
|
96
|
+
root = reader.read filename
|
97
|
+
actual = writer.write root
|
98
|
+
#puts actual
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: translate-yaml-generator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- if1live
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rubyXL
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.3.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.3.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rdoc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.12'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.12'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jeweler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.0.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.0.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.9.2
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.9.2
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.13'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.13'
|
97
|
+
description: Generate translation yaml from excel file. (for L10N, I18N)
|
98
|
+
email: libsora25@gmail.com
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files:
|
102
|
+
- LICENSE.txt
|
103
|
+
- README.rdoc
|
104
|
+
files:
|
105
|
+
- ".travis.yml"
|
106
|
+
- Gemfile
|
107
|
+
- Gemfile.lock
|
108
|
+
- LICENSE.txt
|
109
|
+
- README.rdoc
|
110
|
+
- Rakefile
|
111
|
+
- VERSION
|
112
|
+
- data/sample-1.xlsx
|
113
|
+
- data/sample-1.yml
|
114
|
+
- lib/translate_yaml_generator.rb
|
115
|
+
- lib/translate_yaml_generator/cli.rb
|
116
|
+
- lib/translate_yaml_generator/core.rb
|
117
|
+
- lib/translate_yaml_generator/reader.rb
|
118
|
+
- lib/translate_yaml_generator/writer.rb
|
119
|
+
- spec/lib/translate_yaml_generator/core_spec.rb
|
120
|
+
- spec/lib/translate_yaml_generator/reader_spec.rb
|
121
|
+
- spec/lib/translate_yaml_generator/writer_spec.rb
|
122
|
+
homepage: http://github.com/5minlab/translate-yaml-generator
|
123
|
+
licenses:
|
124
|
+
- MIT
|
125
|
+
metadata: {}
|
126
|
+
post_install_message:
|
127
|
+
rdoc_options: []
|
128
|
+
require_paths:
|
129
|
+
- lib
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
requirements: []
|
141
|
+
rubyforge_project:
|
142
|
+
rubygems_version: 2.2.2
|
143
|
+
signing_key:
|
144
|
+
specification_version: 4
|
145
|
+
summary: Generate translation yaml from excel file. (for L10N, I18N)
|
146
|
+
test_files: []
|