csv2strings 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock DELETED
@@ -1,49 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- csv2strings (0.2.1)
5
- google_drive (= 0.3.6)
6
- nokogiri (= 1.5.10)
7
- thor
8
-
9
- GEM
10
- remote: http://rubygems.org/
11
- specs:
12
- faraday (0.8.8)
13
- multipart-post (~> 1.2.0)
14
- google_drive (0.3.6)
15
- nokogiri (>= 1.4.4, != 1.5.2, != 1.5.1)
16
- oauth (>= 0.3.6)
17
- oauth2 (>= 0.5.0)
18
- httpauth (0.2.0)
19
- jwt (0.1.6)
20
- multi_json (>= 1.0)
21
- multi_json (1.3.6)
22
- multi_xml (0.5.5)
23
- multipart-post (1.2.0)
24
- nokogiri (1.5.10)
25
- oauth (0.4.7)
26
- oauth2 (0.9.2)
27
- faraday (~> 0.8)
28
- httpauth (~> 0.2)
29
- jwt (~> 0.1.4)
30
- multi_json (~> 1.0)
31
- multi_xml (~> 0.5)
32
- rack (~> 1.2)
33
- rack (1.5.2)
34
- rake (0.9.2.2)
35
- simplecov (0.6.4)
36
- multi_json (~> 1.0)
37
- simplecov-html (~> 0.5.3)
38
- simplecov-html (0.5.3)
39
- test-unit (2.4.8)
40
- thor (0.18.1)
41
-
42
- PLATFORMS
43
- ruby
44
-
45
- DEPENDENCIES
46
- csv2strings!
47
- rake
48
- simplecov
49
- test-unit
@@ -1,133 +0,0 @@
1
- module CSV2Strings
2
- class Converter
3
- attr_accessor :csv_filename, :output_file
4
- attr_accessor :langs, :default_lang
5
- attr_accessor :default_path
6
- attr_accessor :excluded_states, :state_column, :keys_column
7
-
8
-
9
- def initialize(filename, langs, args = {})
10
- args.merge!({
11
- :excluded_states => [],
12
- :state_column => nil,
13
- :keys_column => 0})
14
-
15
- @csv_filename = filename
16
- @langs = langs
17
-
18
- if !@langs.is_a?(Hash) || @langs.size == 0
19
- raise "wrong format or/and languages parameter" + @langs.inspect
20
- end
21
- @output_file = (@langs.size == 1) ? args[:output_file] : nil
22
-
23
- @default_path = args[:default_path].to_s
24
- @excluded_states = args[:excluded_states]
25
- @state_column = args[:state_column]
26
- @keys_column = args[:keys_column]
27
- @default_lang = args[:default_lang]
28
- end
29
-
30
- def create_file_from_path(file_path)
31
- path = File.dirname(file_path)
32
- FileUtils.mkdir_p path
33
- return File.new(file_path,"w")
34
- end
35
-
36
- def process_header(excludedCols, files, row, index)
37
- files[index] = []
38
- lang_index = row[index]
39
-
40
- # create output files here
41
- if @output_file
42
- # one single file
43
- files[index] << self.create_file_from_path(@output_file)
44
- else
45
- # create one file for each languages
46
- if self.langs[lang_index].is_a?(Array)
47
-
48
- self.langs[lang_index].each do |locale|
49
- filename = self.file_path_for_locale(locale)
50
- files[index] << self.create_file_from_path(filename)
51
- end
52
- elsif self.langs[lang_index].is_a?(String)
53
- locale = self.langs[lang_index]
54
- filename = self.file_path_for_locale(locale)
55
- files[index] << self.create_file_from_path(filename)
56
- else
57
- raise "wrong format or/and languages parameter"
58
- end
59
-
60
- end
61
- end
62
-
63
- def file_path_for_locale(locale)
64
- require 'pathname'
65
- Pathname.new(self.default_path) + "#{locale}.lproj" + "Localizable.strings"
66
- end
67
-
68
- def process_value(row_value, default_value)
69
- value = row_value.nil? ? default_value : row_value
70
- value = "" if value.nil?
71
- value.gsub!(/\\*\"/, "\\\"") #escape double quotes
72
- value.gsub!(/\s*(\n|\\\s*n)\s*/, "\\n") #replace new lines with \n + strip
73
- value.gsub!(/%\s+([a-zA-Z@])([^a-zA-Z@]|$)/, "%\\1\\2") #repair string formats ("% d points" etc)
74
- value.gsub!(/([^0-9\s\(\{\[^])%/, "\\1 %")
75
- value.strip!
76
- return value
77
- end
78
-
79
- # Convert csv file to multiple Localizable.strings files for each column
80
- def csv_to_dotstrings(name = self.csv_filename)
81
- files = {}
82
- rowIndex = 0
83
- excludedCols = []
84
- defaultCol = 0
85
- nb_translations = 0
86
-
87
- CSVParserClass.foreach(name, :quote_char => '"', :col_sep =>',', :row_sep => :auto) do |row|
88
-
89
- if rowIndex == 0
90
- return unless row.count > 1 #check there's at least two columns
91
- else
92
- next if row == nil or row[self.keys_column].nil? #skip empty lines (or sections)
93
- end
94
-
95
- row.size.times do |i|
96
- next if excludedCols.include? i
97
- if rowIndex == 0 #header
98
- # ignore all headers not listed in langs to create files
99
- (excludedCols << i and next) unless self.langs.has_key?(row[i])
100
- self.process_header(excludedCols, files, row, i)
101
- # define defaultCol
102
- defaultCol = i if self.default_lang == row[i]
103
- elsif !self.state_column || (row[self.state_column].nil? or row[self.state_column] == '' or !self.excluded_states.include? row[self.state_column])
104
- # TODO: add option to strip the constant or referenced language
105
- key = row[self.keys_column].strip
106
- value = self.process_value(row[i], row[defaultCol])
107
- # files for a given language, i.e could group english US with english UK.
108
- localized_files = files[i]
109
- if localized_files
110
- localized_files.each do |file|
111
- nb_translations += 1
112
- file.write "\"#{key}\" = \"#{value}\";\n"
113
- end
114
- end
115
- end
116
- end
117
- rowIndex += 1
118
- end
119
- info = "Created #{files.size} files. Content: #{nb_translations} translations\n"
120
- info += "List of created files:\n"
121
-
122
- # closing I/O
123
- files.each do |key,locale_files|
124
- locale_files.each do |file|
125
- info += "#{file.path.to_s}\n"
126
- file.close
127
- end
128
- end
129
- info
130
- end # end of method
131
-
132
- end # end of class
133
- end
@@ -1,95 +0,0 @@
1
- module Strings2CSV
2
- class Converter
3
-
4
- attr_accessor :csv_filename, :headers, :filenames, :default_lang
5
-
6
- def initialize(args = {:filenames => []})
7
- if args[:filenames] && args[:headers]
8
- raise ArgumentError.new("number of headers and files don't match, don't forget the constant column") unless args[:headers].size == (args[:filenames].size + 1)
9
- end
10
-
11
- @filenames = args[:filenames]
12
-
13
- @csv_filename = args[:csv_filename] || "translations.csv"
14
- @default_lang = args[:default_lang]
15
- @headers = args[:headers] || self.default_headers
16
- end
17
-
18
- def default_headers
19
- headers = ['Variables']
20
- @filenames.each do |fname|
21
- headers << basename(fname)
22
- end
23
- end
24
-
25
-
26
- # Load all strings of a given file
27
- def load_strings(strings_filename)
28
- strings = {}
29
- File.open(strings_filename, 'r') do |strings_file|
30
- strings_file.read.each_line do |line|
31
- strings.merge!(self.parse_dotstrings_line(line))
32
- end
33
- end
34
- strings
35
- end
36
-
37
- def parse_dotstrings_line(line)
38
- line.strip!
39
- if (line[0] != ?# and line[0] != ?=)
40
- m = line.match(/^[^\"]*\"(.+)\"[^=]+=[^\"]*\"(.*)\";/)
41
- return {m[1] => m[2]} unless m.nil?
42
- end
43
- end
44
-
45
-
46
- # Convert Localizable.strings files to one CSV file
47
- # output:
48
- def dotstrings_to_csv(write_to_file = true)
49
- # Parse .strings files
50
- strings = {}
51
- keys = nil
52
- lang_order = []
53
-
54
- @filenames.each do |fname|
55
- header = basename(fname)
56
- strings[header] = load_strings(fname)
57
- lang_order << header
58
- keys ||= strings[header].keys
59
- end
60
-
61
- if(write_to_file)
62
- # Create csv file
63
- puts "Creating #{@csv_filename}"
64
- create_csv_file(keys, lang_order, strings)
65
- else
66
- return keys, lang_order, strings
67
- end
68
- end
69
-
70
- def basename(file_path)
71
- filename = File.basename(file_path)
72
- return filename.split('.')[0].to_sym if file_path
73
- end
74
-
75
- # Create the resulting file
76
- def create_csv_file(keys, lang_order, strings)
77
- raise "csv_filename must not be nil" unless self.csv_filename
78
- CSVParserClass.open(self.csv_filename, "wb") do |csv|
79
- csv << @headers
80
- keys.each do |key|
81
- line = [key]
82
- default_val = strings[self.default_lang][key] if strings[self.default_lang]
83
- lang_order.each do |lang|
84
- current_val = strings[lang][key]
85
- line << ((lang != self.default_lang and current_val == default_val) ? '' : current_val)
86
- end
87
- csv << line
88
- end
89
- puts "Done"
90
- end
91
- end
92
-
93
- end
94
- end
95
-
data/test/command_test.rb DELETED
@@ -1,90 +0,0 @@
1
- require File.expand_path('../../lib/command', __FILE__)
2
- require File.expand_path('../test_helper', __FILE__)
3
-
4
- class CommandTest < Test::Unit::TestCase
5
- def test_csv2strings_with_multiple_2_languages
6
- command = "./bin/csv2strings"
7
- command += " --filename test/data/test_data_multiple_langs.csv"
8
- command += " --langs=English:en French:fr"
9
- system(command)
10
-
11
- assert File.exist?("./en.lproj/Localizable.strings")
12
- assert File.exist?("./fr.lproj/Localizable.strings")
13
-
14
- #clean up
15
- system("rm -rf ./en.lproj/")
16
- system("rm -rf ./fr.lproj/")
17
- end
18
-
19
- def test_csv2strings_with_default_path
20
- command = "./bin/csv2strings"
21
- command += " --filename test/data/test_data_multiple_langs.csv"
22
- command += " --langs=English:en French:fr"
23
- command += " --default_path=mynewlocation"
24
- system(command)
25
-
26
- # testing
27
- assert File.exist?("./mynewlocation/en.lproj/Localizable.strings"), "can't find output file for English"
28
- assert File.exist?("./mynewlocation/fr.lproj/Localizable.strings"), "can't find output file for French"
29
-
30
- #clean up
31
- system("rm -rf ./mynewlocation")
32
- end
33
-
34
- def test_strings2csv
35
- command = "./bin/strings2csv"
36
- command += " --filenames test/data/test_data.strings"
37
- system(command)
38
-
39
- assert File.exist?("translations.csv")
40
-
41
- #clean up
42
- system("rm -f translations.csv")
43
- end
44
-
45
- def test_strings2csv_with_dryrun_option
46
- command = "./bin/strings2csv"
47
- command += " --filenames test/data/test_data.strings"
48
- command += " --dryrun"
49
- system(command)
50
-
51
- assert !File.exist?("translations.csv")
52
-
53
- #clean up
54
- system("rm -f translations.csv")
55
- end
56
-
57
- def test_strings2csv_with_output_file
58
- command = "./bin/strings2csv"
59
- command += " -i=test/data/test_data.strings"
60
- command += " -o=myfile.csv"
61
- system(command)
62
-
63
- assert File.exist?("myfile.csv")
64
-
65
- #clean up
66
- system("rm -f myfile.csv")
67
- end
68
-
69
- def test_strings2csv_with_headers
70
- command = "./bin/strings2csv"
71
- command += " -i=test/data/test_data.strings"
72
- command += " -h=constants english"
73
- system(command)
74
-
75
- #TODO assertion or move test on at lib level
76
-
77
- #clean up
78
- system("rm -f translations.csv")
79
- end
80
-
81
- def test_strings2csv_with_two_files
82
- command = "./bin/strings2csv"
83
- command += " --filenames=test/data/test_en.strings test/data/test_fr.strings"
84
- command += " --headers=Constants English French"
85
- command += " -o=enfr.csv"
86
- system(command)
87
- end
88
-
89
- end
90
-
@@ -1,6 +0,0 @@
1
- require File.expand_path('../../lib/google_doc', __FILE__)
2
- require File.expand_path('../test_helper', __FILE__)
3
-
4
- class GoogleDocTest < Test::Unit::TestCase
5
- # TODO implement test with mocks
6
- end