toledo 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/toledo.rb +162 -4
  3. metadata +26 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81503b97abd0e784908bfe98ec5d67eb5b13ac69aa47006a5b094e0278532905
4
- data.tar.gz: 46303869ae318654d7f9e45ba64ddf0d4187e1fcc02313f2c4370e04a09939ed
3
+ metadata.gz: d39c9aa99c05a86062e8e960993cb010fce3a3d59f8b63e2a1fcbc84d603481b
4
+ data.tar.gz: d8ede1aba532e3a83a0cab1f260019780e336235b8151b1ba2ab8715398a1b9b
5
5
  SHA512:
6
- metadata.gz: 25b235c722e7ee546e126be332ce0121075dd3d9ad506cc9081ae2768cc1a1ea2b6914f9fe59fada846baf28595e04e5212601e2fed52d9d158147c0ff8690bb
7
- data.tar.gz: b6d574336187ee34f37fe547920db6de4ccdf849cfc322208af9b21cf98a6659257382bec4425e147b93c344f2287aaf44b9591cb4010f62bf21e7c49cbfca06
6
+ metadata.gz: 44ef08a246ddc1df31dce0744a89c3a0e1b3b10a1fe39b25d7c937af6e0d93bf2258a6fcc6df98587ab8279ad05aae84c09512967b05127848d627d5dbe070b9
7
+ data.tar.gz: '064310926bfe6f7293c7f983a75723363e1182e0023b1cc805181a14cebf23cd7cac2a4dcd896ac14b6b2ca34d35899c8b48b84dcef25194514eef3069d0fb0d'
data/lib/toledo.rb CHANGED
@@ -1,5 +1,163 @@
1
- class Toledo
2
- def self.hi
3
- puts "Hello world!!"
1
+ require "google/apis/sheets_v4"
2
+ require "googleauth"
3
+ require "googleauth/stores/file_token_store"
4
+ require "fileutils"
5
+ require "yaml"
6
+ require 'json'
7
+
8
+ OOB_URI = "urn:ietf:wg:oauth:2.0:oob".freeze
9
+ APPLICATION_NAME = "Google Sheets API Ruby Quickstart".freeze
10
+ CREDENTIALS_PATH = ".credentials.json".freeze
11
+ TOKEN_PATH = ".token.yaml".freeze
12
+ SCOPE = Google::Apis::SheetsV4::AUTH_SPREADSHEETS_READONLY
13
+
14
+ def authorize
15
+ client_id = Google::Auth::ClientId.from_file CREDENTIALS_PATH
16
+ token_store = Google::Auth::Stores::FileTokenStore.new file: TOKEN_PATH
17
+ authorizer = Google::Auth::UserAuthorizer.new client_id, SCOPE, token_store
18
+ user_id = "default"
19
+ credentials = authorizer.get_credentials user_id
20
+ if credentials.nil?
21
+ url = authorizer.get_authorization_url base_url: OOB_URI
22
+ puts "Open the following URL in the browser and enter the " \
23
+ "resulting code after authorization:\n" + url
24
+ code = gets
25
+ credentials = authorizer.get_and_store_credentials_from_code(
26
+ user_id: user_id, code: code, base_url: OOB_URI
27
+ )
28
+ end
29
+ credentials
30
+ end
31
+
32
+ def self.build_row(key, value, target)
33
+ if target == "ios"
34
+ return self.build_ios_row(key, value)
35
+ else
36
+ return self.build_android_row(key, value)
37
+ end
38
+ end
39
+
40
+ def self.build_ios_row(key, value)
41
+ value.gsub! "\n", "\\n"
42
+ value.gsub! "\"", "\\\""
43
+ value.gsub!(/\%[0-9]\$s/) { |s| s.gsub! 's', '@'}
44
+ value.gsub! '%s', '%@'
45
+ return "\"" + key + "\" = \"" + value + "\";\n"
46
+ end
47
+
48
+ def self.build_android_row(key, value)
49
+ value.gsub! "&", "&"
50
+ value.gsub! "\n", "\\n"
51
+ value.gsub! "'", %q(\\\')
52
+ value.gsub! "\"", "\\\""
53
+ value.gsub! "...", "…"
54
+ value.gsub! "<", "&lt;"
55
+ value.gsub! ">", "&gt;"
56
+ return " <string name=\"" + key + "\">" + value + "</string>\n"
57
+ end
58
+
59
+ def self.build_comment(comment, target)
60
+ if target == "ios"
61
+ return "// #{comment}\n"
62
+ else
63
+ return " <!-- #{comment} -->\n"
64
+ end
65
+ end
66
+
67
+ def self.get_file_path(language, modul, file_name, target, is_default_language)
68
+ if target == "ios"
69
+ return "#{language}.lproj/#{file_name}.strings"
70
+ else
71
+ language_suffix = is_default_language ? "" : "-#{language}"
72
+ return "#{modul}/**/values#{language_suffix}/#{file_name}.xml"
73
+ end
74
+ end
75
+
76
+ def self.file_prefix(target)
77
+ if target == "ios"
78
+ return ""
79
+ else
80
+ return "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n"
81
+ end
82
+ end
83
+
84
+ def self.file_suffix(target)
85
+ if target == "ios"
86
+ return ""
87
+ else
88
+ return "</resources>\n"
89
+ end
90
+ end
91
+
92
+ def fetch(spreadsheet_id, languages, default_language, target, sheets)
93
+ service = Google::Apis::SheetsV4::SheetsService.new
94
+ service.client_options.application_name = APPLICATION_NAME
95
+ service.authorization = authorize
96
+
97
+
98
+ sheets.each do |sheet|
99
+ range = sheet["name"]
100
+ response = service.get_spreadsheet_values spreadsheet_id, range
101
+ puts "No data found." if response.values.empty?
102
+ sheet_data = response.values
103
+
104
+ headers = sheet_data.first
105
+ languages = headers.select { |key| key.length == 2 }
106
+
107
+ rows = sheet_data.drop(1)
108
+
109
+ languages.each_with_index do |language, index|
110
+ is_default_language = default_language == language || languages.count == 1
111
+ file_content = file_prefix(target)
112
+ file_name = sheet["file_name"]
113
+ modul = sheet["module"]
114
+ file_path = get_file_path(language, modul, file_name, target, is_default_language)
115
+ file = Dir[file_path].first
116
+
117
+ if file.nil?
118
+ puts "File with name: \"#{file_name}\" for language \"#{language}\" does not exist in module \"#{modul}\"! Please create it first!"
119
+ next
120
+ end
121
+
122
+ puts "Generating translation file for language \"#{language}\""
123
+ rows.each do |row|
124
+ key = row.first
125
+ value = row[index + 1]
126
+
127
+ description = nil
128
+ if row.count == headers.count
129
+ description = row.last
130
+ end
131
+
132
+ if value.nil? || value.empty?
133
+ if !key.nil? && !key.empty?
134
+ file_content += build_comment(key, target)
135
+ else
136
+ file_content += "\n"
137
+ end
138
+ next
139
+ end
140
+
141
+ if description != nil
142
+ file_content += build_comment(description, target)
143
+ end
144
+
145
+ file_content += build_row(key, value, target)
146
+ end
147
+ file_content += file_suffix(target)
148
+
149
+ File.open(file, "w") do |f|
150
+ f.write(file_content)
151
+ end
4
152
  end
5
- end
153
+ end
154
+ end
155
+
156
+ config = YAML.load_file("config.yaml")
157
+ spreadsheet_id = config["spreadsheet_id"]
158
+ languages = JSON.parse("#{config["languages"]}")
159
+ default_language = config["default_language"]
160
+ target = config["target"]
161
+ sheets = config["sheets"]
162
+
163
+ fetch(spreadsheet_id, languages, default_language, target, sheets)
metadata CHANGED
@@ -1,16 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toledo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Marschall
8
- autorequire:
8
+ - Martin Daum
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2021-02-18 00:00:00.000000000 Z
12
- dependencies: []
13
- description: ''
12
+ date: 2021-11-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: fileutils
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ description: A simple tool for exporting strings from Google Sheets to Android/iOS
29
+ projects
14
30
  email: office@sebastianmarschall.com
15
31
  executables: []
16
32
  extensions: []
@@ -19,9 +35,9 @@ files:
19
35
  - lib/toledo.rb
20
36
  homepage: https://rubygems.org/gems/toledo
21
37
  licenses:
22
- - APACHE 2.0
38
+ - GPL-2.0
23
39
  metadata: {}
24
- post_install_message:
40
+ post_install_message:
25
41
  rdoc_options: []
26
42
  require_paths:
27
43
  - lib
@@ -36,8 +52,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
36
52
  - !ruby/object:Gem::Version
37
53
  version: '0'
38
54
  requirements: []
39
- rubygems_version: 3.0.3
40
- signing_key:
55
+ rubygems_version: 3.2.22
56
+ signing_key:
41
57
  specification_version: 4
42
- summary: import/export strings to/from google sheets
58
+ summary: Google Sheets to Android/iOS translation file!
43
59
  test_files: []