ad_localize 5.0.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +6 -3
  3. data/.rubocop.yml +5 -0
  4. data/.rubocop_todo.yml +319 -0
  5. data/CHANGELOG.md +24 -0
  6. data/Gemfile +1 -0
  7. data/Gemfile.lock +54 -48
  8. data/README.md +32 -10
  9. data/Rakefile +1 -0
  10. data/ad_localize.gemspec +10 -9
  11. data/bin/console +1 -0
  12. data/exe/ad_localize +2 -1
  13. data/lib/ad_localize/ad_logger.rb +5 -10
  14. data/lib/ad_localize/cli.rb +10 -3
  15. data/lib/ad_localize/entities/key.rb +3 -76
  16. data/lib/ad_localize/entities/locale_wording.rb +32 -52
  17. data/lib/ad_localize/entities/platform.rb +13 -0
  18. data/lib/ad_localize/entities/simple_wording.rb +6 -0
  19. data/lib/ad_localize/entities/wording_type.rb +11 -0
  20. data/lib/ad_localize/interactors/base_generate_files.rb +37 -0
  21. data/lib/ad_localize/interactors/download_spreadsheets.rb +20 -0
  22. data/lib/ad_localize/interactors/export_wording.rb +26 -20
  23. data/lib/ad_localize/interactors/generate_info_plist.rb +24 -0
  24. data/lib/ad_localize/interactors/generate_ios_files.rb +12 -0
  25. data/lib/ad_localize/interactors/generate_json.rb +20 -0
  26. data/lib/ad_localize/interactors/generate_localizable_strings.rb +24 -0
  27. data/lib/ad_localize/interactors/generate_localizable_strings_dict.rb +24 -0
  28. data/lib/ad_localize/interactors/generate_properties.rb +20 -0
  29. data/lib/ad_localize/interactors/generate_strings.rb +25 -0
  30. data/lib/ad_localize/interactors/generate_yaml.rb +20 -0
  31. data/lib/ad_localize/interactors/merge_wordings.rb +49 -18
  32. data/lib/ad_localize/interactors/parse_csv_files.rb +22 -0
  33. data/lib/ad_localize/interactors/process_export_request.rb +21 -0
  34. data/lib/ad_localize/mappers/locale_wording_to_hash.rb +45 -24
  35. data/lib/ad_localize/mappers/options_to_export_request.rb +14 -22
  36. data/lib/ad_localize/option_handler.rb +50 -27
  37. data/lib/ad_localize/parsers/csv_parser.rb +84 -0
  38. data/lib/ad_localize/parsers/key_parser.rb +62 -0
  39. data/lib/ad_localize/repositories/drive_repository.rb +53 -0
  40. data/lib/ad_localize/repositories/file_system_repository.rb +2 -1
  41. data/lib/ad_localize/requests/export_request.rb +95 -57
  42. data/lib/ad_localize/sanitizers/ios_sanitizer.rb +12 -0
  43. data/lib/ad_localize/{mappers/android_translation_mapper.rb → sanitizers/ios_to_android_sanitizer.rb} +8 -8
  44. data/lib/ad_localize/sanitizers/pass_through_sanitizer.rb +10 -0
  45. data/lib/ad_localize/serializers/info_plist_serializer.rb +9 -11
  46. data/lib/ad_localize/serializers/json_serializer.rb +3 -5
  47. data/lib/ad_localize/serializers/localizable_strings_serializer.rb +9 -15
  48. data/lib/ad_localize/serializers/localizable_stringsdict_serializer.rb +12 -25
  49. data/lib/ad_localize/serializers/properties_serializer.rb +9 -11
  50. data/lib/ad_localize/serializers/strings_serializer.rb +12 -21
  51. data/lib/ad_localize/serializers/templated_serializer.rb +51 -0
  52. data/lib/ad_localize/serializers/yaml_serializer.rb +4 -6
  53. data/lib/ad_localize/templates/android/strings.xml.erb +6 -6
  54. data/lib/ad_localize/templates/ios/Localizable.stringsdict.erb +14 -14
  55. data/lib/ad_localize/version.rb +2 -1
  56. data/lib/ad_localize/view_models/compound_wording_view_model.rb +2 -0
  57. data/lib/ad_localize/view_models/simple_wording_view_model.rb +2 -0
  58. data/lib/ad_localize.rb +33 -35
  59. metadata +70 -47
  60. data/lib/ad_localize/constant.rb +0 -6
  61. data/lib/ad_localize/entities/translation.rb +0 -32
  62. data/lib/ad_localize/entities/wording.rb +0 -24
  63. data/lib/ad_localize/interactors/execute_export_request.rb +0 -45
  64. data/lib/ad_localize/interactors/export_csv_files.rb +0 -20
  65. data/lib/ad_localize/interactors/export_g_spreadsheet.rb +0 -64
  66. data/lib/ad_localize/interactors/platforms/export_android_locale_wording.rb +0 -44
  67. data/lib/ad_localize/interactors/platforms/export_csv_locale_wording.rb +0 -22
  68. data/lib/ad_localize/interactors/platforms/export_ios_locale_wording.rb +0 -75
  69. data/lib/ad_localize/interactors/platforms/export_json_locale_wording.rb +0 -27
  70. data/lib/ad_localize/interactors/platforms/export_platform_factory.rb +0 -50
  71. data/lib/ad_localize/interactors/platforms/export_properties_locale_wording.rb +0 -32
  72. data/lib/ad_localize/interactors/platforms/export_yaml_locale_wording.rb +0 -27
  73. data/lib/ad_localize/mappers/csv_path_to_wording.rb +0 -73
  74. data/lib/ad_localize/mappers/ios_translation_mapper.rb +0 -12
  75. data/lib/ad_localize/mappers/translation_group_mapper.rb +0 -14
  76. data/lib/ad_localize/mappers/translation_mapper.rb +0 -30
  77. data/lib/ad_localize/mappers/value_range_to_wording.rb +0 -67
  78. data/lib/ad_localize/repositories/g_sheets_repository.rb +0 -44
  79. data/lib/ad_localize/requests/export_wording_options.rb +0 -24
  80. data/lib/ad_localize/requests/g_spreadsheet_options.rb +0 -47
  81. data/lib/ad_localize/requests/merge_policy.rb +0 -28
  82. data/lib/ad_localize/serializers/with_template.rb +0 -19
  83. data/lib/ad_localize/validators/key_validator.rb +0 -31
  84. data/lib/ad_localize/view_models/translation_group_view_model.rb +0 -19
  85. data/lib/ad_localize/view_models/translation_view_model.rb +0 -23
data/lib/ad_localize.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'active_support'
2
3
  require 'active_support/core_ext'
3
4
  require 'fileutils'
@@ -8,56 +9,49 @@ require 'csv'
8
9
  require 'logger'
9
10
  require 'colorize'
10
11
  require 'optparse'
11
- require 'nokogiri'
12
12
  require 'erb'
13
13
  require 'googleauth'
14
14
  require 'google/apis/sheets_v4'
15
+ require 'google/apis/drive_v3'
15
16
 
16
- require 'ad_localize/version'
17
- require 'ad_localize/ad_logger'
18
- require 'ad_localize/constant'
19
- require 'ad_localize/cli'
20
- require 'ad_localize/option_handler'
21
-
22
- require 'ad_localize/repositories/g_sheets_repository'
17
+ require 'ad_localize/repositories/drive_repository'
23
18
  require 'ad_localize/repositories/file_system_repository'
24
19
 
25
- require 'ad_localize/view_models/translation_view_model'
26
- require 'ad_localize/view_models/translation_group_view_model'
20
+ require 'ad_localize/view_models/simple_wording_view_model'
21
+ require 'ad_localize/view_models/compound_wording_view_model'
22
+
23
+ require 'ad_localize/parsers/key_parser'
24
+ require 'ad_localize/parsers/csv_parser'
27
25
 
28
26
  require 'ad_localize/mappers/options_to_export_request'
29
- require 'ad_localize/mappers/csv_path_to_wording'
30
27
  require 'ad_localize/mappers/locale_wording_to_hash'
31
- require 'ad_localize/mappers/value_range_to_wording'
32
- require 'ad_localize/mappers/translation_mapper'
33
- require 'ad_localize/mappers/translation_group_mapper'
34
- require 'ad_localize/mappers/android_translation_mapper'
35
- require 'ad_localize/mappers/ios_translation_mapper'
36
28
 
37
29
  require 'ad_localize/entities/key'
38
- require 'ad_localize/entities/translation'
39
30
  require 'ad_localize/entities/locale_wording'
40
- require 'ad_localize/entities/wording'
41
-
42
- require 'ad_localize/requests/g_spreadsheet_options'
43
- require 'ad_localize/requests/export_request'
44
- require 'ad_localize/requests/export_wording_options'
45
- require 'ad_localize/requests/merge_policy'
31
+ require 'ad_localize/entities/platform'
32
+ require 'ad_localize/entities/simple_wording'
33
+ require 'ad_localize/entities/wording_type'
46
34
 
35
+ require 'ad_localize/interactors/base_generate_files'
36
+ require 'ad_localize/interactors/process_export_request'
37
+ require 'ad_localize/interactors/parse_csv_files'
38
+ require 'ad_localize/interactors/download_spreadsheets'
47
39
  require 'ad_localize/interactors/merge_wordings'
48
- require 'ad_localize/interactors/execute_export_request'
49
- require 'ad_localize/interactors/export_csv_files'
50
- require 'ad_localize/interactors/export_g_spreadsheet'
51
40
  require 'ad_localize/interactors/export_wording'
52
- require 'ad_localize/interactors/platforms/export_android_locale_wording'
53
- require 'ad_localize/interactors/platforms/export_ios_locale_wording'
54
- require 'ad_localize/interactors/platforms/export_json_locale_wording'
55
- require 'ad_localize/interactors/platforms/export_yaml_locale_wording'
56
- require 'ad_localize/interactors/platforms/export_properties_locale_wording'
57
- require 'ad_localize/interactors/platforms/export_csv_locale_wording'
58
- require 'ad_localize/interactors/platforms/export_platform_factory'
41
+ require 'ad_localize/interactors/generate_info_plist'
42
+ require 'ad_localize/interactors/generate_ios_files'
43
+ require 'ad_localize/interactors/generate_json'
44
+ require 'ad_localize/interactors/generate_localizable_strings'
45
+ require 'ad_localize/interactors/generate_localizable_strings_dict'
46
+ require 'ad_localize/interactors/generate_properties'
47
+ require 'ad_localize/interactors/generate_strings'
48
+ require 'ad_localize/interactors/generate_yaml'
49
+
50
+ require 'ad_localize/sanitizers/ios_sanitizer'
51
+ require 'ad_localize/sanitizers/ios_to_android_sanitizer'
52
+ require 'ad_localize/sanitizers/pass_through_sanitizer'
59
53
 
60
- require 'ad_localize/serializers/with_template'
54
+ require 'ad_localize/serializers/templated_serializer'
61
55
  require 'ad_localize/serializers/info_plist_serializer'
62
56
  require 'ad_localize/serializers/localizable_strings_serializer'
63
57
  require 'ad_localize/serializers/localizable_stringsdict_serializer'
@@ -66,7 +60,11 @@ require 'ad_localize/serializers/properties_serializer'
66
60
  require 'ad_localize/serializers/json_serializer'
67
61
  require 'ad_localize/serializers/yaml_serializer'
68
62
 
69
- require 'ad_localize/validators/key_validator'
63
+ require 'ad_localize/requests/export_request'
64
+ require 'ad_localize/option_handler'
65
+ require 'ad_localize/cli'
66
+ require 'ad_localize/version'
67
+ require 'ad_localize/ad_logger'
70
68
 
71
69
  module AdLocalize
72
70
  class Error < StandardError; end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ad_localize
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 6.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edouard Siegel
@@ -21,7 +21,7 @@ authors:
21
21
  autorequire:
22
22
  bindir: exe
23
23
  cert_chain: []
24
- date: 2018-04-18 00:00:00.000000000 Z
24
+ date: 2023-07-17 00:00:00.000000000 Z
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
@@ -106,39 +106,59 @@ dependencies:
106
106
  - !ruby/object:Gem::Version
107
107
  version: '3.3'
108
108
  - !ruby/object:Gem::Dependency
109
- name: activesupport
109
+ name: debug
110
110
  requirement: !ruby/object:Gem::Requirement
111
111
  requirements:
112
112
  - - ">="
113
113
  - !ruby/object:Gem::Version
114
- version: 6.1.3.2
114
+ version: 1.0.0
115
115
  - - "<"
116
116
  - !ruby/object:Gem::Version
117
- version: '8.0'
118
- type: :runtime
117
+ version: '2.0'
118
+ type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 6.1.3.2
124
+ version: 1.0.0
125
125
  - - "<"
126
126
  - !ruby/object:Gem::Version
127
- version: '8.0'
127
+ version: '2.0'
128
128
  - !ruby/object:Gem::Dependency
129
- name: nokogiri
129
+ name: rubocop
130
130
  requirement: !ruby/object:Gem::Requirement
131
131
  requirements:
132
132
  - - "~>"
133
133
  - !ruby/object:Gem::Version
134
- version: '1.10'
135
- type: :runtime
134
+ version: '1.0'
135
+ type: :development
136
136
  prerelease: false
137
137
  version_requirements: !ruby/object:Gem::Requirement
138
138
  requirements:
139
139
  - - "~>"
140
140
  - !ruby/object:Gem::Version
141
- version: '1.10'
141
+ version: '1.0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: activesupport
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: 6.1.3.2
149
+ - - "<"
150
+ - !ruby/object:Gem::Version
151
+ version: '8.0'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 6.1.3.2
159
+ - - "<"
160
+ - !ruby/object:Gem::Version
161
+ version: '8.0'
142
162
  - !ruby/object:Gem::Dependency
143
163
  name: colorize
144
164
  requirement: !ruby/object:Gem::Requirement
@@ -154,33 +174,33 @@ dependencies:
154
174
  - !ruby/object:Gem::Version
155
175
  version: '0.8'
156
176
  - !ruby/object:Gem::Dependency
157
- name: googleauth
177
+ name: google-apis-sheets_v4
158
178
  requirement: !ruby/object:Gem::Requirement
159
179
  requirements:
160
180
  - - "~>"
161
181
  - !ruby/object:Gem::Version
162
- version: '0.12'
182
+ version: '0.9'
163
183
  type: :runtime
164
184
  prerelease: false
165
185
  version_requirements: !ruby/object:Gem::Requirement
166
186
  requirements:
167
187
  - - "~>"
168
188
  - !ruby/object:Gem::Version
169
- version: '0.12'
189
+ version: '0.9'
170
190
  - !ruby/object:Gem::Dependency
171
- name: google-apis-sheets_v4
191
+ name: google-apis-drive_v3
172
192
  requirement: !ruby/object:Gem::Requirement
173
193
  requirements:
174
194
  - - "~>"
175
195
  - !ruby/object:Gem::Version
176
- version: '0.9'
196
+ version: 0.33.0
177
197
  type: :runtime
178
198
  prerelease: false
179
199
  version_requirements: !ruby/object:Gem::Requirement
180
200
  requirements:
181
201
  - - "~>"
182
202
  - !ruby/object:Gem::Version
183
- version: '0.9'
203
+ version: 0.33.0
184
204
  description: |-
185
205
  AdLocalize produces localization files from platform agnostic wording.
186
206
  Supported wording format : CSV. Supported export format: iOS, Android, JSON and YAML
@@ -195,6 +215,8 @@ extra_rdoc_files: []
195
215
  files:
196
216
  - ".github/workflows/ruby.yml"
197
217
  - ".gitignore"
218
+ - ".rubocop.yml"
219
+ - ".rubocop_todo.yml"
198
220
  - ".travis.yml"
199
221
  - CHANGELOG.md
200
222
  - CODE_OF_CONDUCT.md
@@ -211,59 +233,57 @@ files:
211
233
  - lib/ad_localize.rb
212
234
  - lib/ad_localize/ad_logger.rb
213
235
  - lib/ad_localize/cli.rb
214
- - lib/ad_localize/constant.rb
215
236
  - lib/ad_localize/entities/key.rb
216
237
  - lib/ad_localize/entities/locale_wording.rb
217
- - lib/ad_localize/entities/translation.rb
218
- - lib/ad_localize/entities/wording.rb
219
- - lib/ad_localize/interactors/execute_export_request.rb
220
- - lib/ad_localize/interactors/export_csv_files.rb
221
- - lib/ad_localize/interactors/export_g_spreadsheet.rb
238
+ - lib/ad_localize/entities/platform.rb
239
+ - lib/ad_localize/entities/simple_wording.rb
240
+ - lib/ad_localize/entities/wording_type.rb
241
+ - lib/ad_localize/interactors/base_generate_files.rb
242
+ - lib/ad_localize/interactors/download_spreadsheets.rb
222
243
  - lib/ad_localize/interactors/export_wording.rb
244
+ - lib/ad_localize/interactors/generate_info_plist.rb
245
+ - lib/ad_localize/interactors/generate_ios_files.rb
246
+ - lib/ad_localize/interactors/generate_json.rb
247
+ - lib/ad_localize/interactors/generate_localizable_strings.rb
248
+ - lib/ad_localize/interactors/generate_localizable_strings_dict.rb
249
+ - lib/ad_localize/interactors/generate_properties.rb
250
+ - lib/ad_localize/interactors/generate_strings.rb
251
+ - lib/ad_localize/interactors/generate_yaml.rb
223
252
  - lib/ad_localize/interactors/merge_wordings.rb
224
- - lib/ad_localize/interactors/platforms/export_android_locale_wording.rb
225
- - lib/ad_localize/interactors/platforms/export_csv_locale_wording.rb
226
- - lib/ad_localize/interactors/platforms/export_ios_locale_wording.rb
227
- - lib/ad_localize/interactors/platforms/export_json_locale_wording.rb
228
- - lib/ad_localize/interactors/platforms/export_platform_factory.rb
229
- - lib/ad_localize/interactors/platforms/export_properties_locale_wording.rb
230
- - lib/ad_localize/interactors/platforms/export_yaml_locale_wording.rb
231
- - lib/ad_localize/mappers/android_translation_mapper.rb
232
- - lib/ad_localize/mappers/csv_path_to_wording.rb
233
- - lib/ad_localize/mappers/ios_translation_mapper.rb
253
+ - lib/ad_localize/interactors/parse_csv_files.rb
254
+ - lib/ad_localize/interactors/process_export_request.rb
234
255
  - lib/ad_localize/mappers/locale_wording_to_hash.rb
235
256
  - lib/ad_localize/mappers/options_to_export_request.rb
236
- - lib/ad_localize/mappers/translation_group_mapper.rb
237
- - lib/ad_localize/mappers/translation_mapper.rb
238
- - lib/ad_localize/mappers/value_range_to_wording.rb
239
257
  - lib/ad_localize/option_handler.rb
258
+ - lib/ad_localize/parsers/csv_parser.rb
259
+ - lib/ad_localize/parsers/key_parser.rb
260
+ - lib/ad_localize/repositories/drive_repository.rb
240
261
  - lib/ad_localize/repositories/file_system_repository.rb
241
- - lib/ad_localize/repositories/g_sheets_repository.rb
242
262
  - lib/ad_localize/requests/export_request.rb
243
- - lib/ad_localize/requests/export_wording_options.rb
244
- - lib/ad_localize/requests/g_spreadsheet_options.rb
245
- - lib/ad_localize/requests/merge_policy.rb
263
+ - lib/ad_localize/sanitizers/ios_sanitizer.rb
264
+ - lib/ad_localize/sanitizers/ios_to_android_sanitizer.rb
265
+ - lib/ad_localize/sanitizers/pass_through_sanitizer.rb
246
266
  - lib/ad_localize/serializers/info_plist_serializer.rb
247
267
  - lib/ad_localize/serializers/json_serializer.rb
248
268
  - lib/ad_localize/serializers/localizable_strings_serializer.rb
249
269
  - lib/ad_localize/serializers/localizable_stringsdict_serializer.rb
250
270
  - lib/ad_localize/serializers/properties_serializer.rb
251
271
  - lib/ad_localize/serializers/strings_serializer.rb
252
- - lib/ad_localize/serializers/with_template.rb
272
+ - lib/ad_localize/serializers/templated_serializer.rb
253
273
  - lib/ad_localize/serializers/yaml_serializer.rb
254
274
  - lib/ad_localize/templates/android/strings.xml.erb
255
275
  - lib/ad_localize/templates/ios/InfoPlist.strings.erb
256
276
  - lib/ad_localize/templates/ios/Localizable.strings.erb
257
277
  - lib/ad_localize/templates/ios/Localizable.stringsdict.erb
258
278
  - lib/ad_localize/templates/properties/template.properties.erb
259
- - lib/ad_localize/validators/key_validator.rb
260
279
  - lib/ad_localize/version.rb
261
- - lib/ad_localize/view_models/translation_group_view_model.rb
262
- - lib/ad_localize/view_models/translation_view_model.rb
280
+ - lib/ad_localize/view_models/compound_wording_view_model.rb
281
+ - lib/ad_localize/view_models/simple_wording_view_model.rb
263
282
  homepage: https://github.com/applidium/ad_localize
264
283
  licenses:
265
284
  - MIT
266
- metadata: {}
285
+ metadata:
286
+ rubygems_mfa_required: 'true'
267
287
  post_install_message:
268
288
  rdoc_options: []
269
289
  require_paths:
@@ -273,13 +293,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
273
293
  - - ">="
274
294
  - !ruby/object:Gem::Version
275
295
  version: '2.7'
296
+ - - "<"
297
+ - !ruby/object:Gem::Version
298
+ version: '4.0'
276
299
  required_rubygems_version: !ruby/object:Gem::Requirement
277
300
  requirements:
278
301
  - - ">="
279
302
  - !ruby/object:Gem::Version
280
303
  version: '0'
281
304
  requirements: []
282
- rubygems_version: 3.2.15
305
+ rubygems_version: 3.3.7
283
306
  signing_key:
284
307
  specification_version: 4
285
308
  summary: AdLocalize helps with mobile and web applications wording
@@ -1,6 +0,0 @@
1
- module AdLocalize
2
- module Constant
3
- COMMENT_KEY_COLUMN_IDENTIFIER = 'comment'.freeze
4
- CSV_WORDING_KEYS_COLUMN = 'key'.freeze
5
- end
6
- end
@@ -1,32 +0,0 @@
1
- module AdLocalize
2
- module Entities
3
- class Translation
4
- attr_reader(
5
- :locale,
6
- :key,
7
- :comment
8
- )
9
-
10
- attr_accessor(:value)
11
-
12
- def initialize(locale:, key:, value:, comment: nil)
13
- @locale = locale
14
- @key = key
15
- @value = value
16
- @comment = comment
17
- end
18
-
19
- def ==(o)
20
- o.class == self.class &&
21
- o.locale == locale &&
22
- o.key == key &&
23
- o.value == value &&
24
- o.comment == comment
25
- end
26
-
27
- def has_value?
28
- value.present?
29
- end
30
- end
31
- end
32
- end
@@ -1,24 +0,0 @@
1
- module AdLocalize
2
- module Entities
3
- class Wording
4
- attr_reader(:default_locale, :locale_wordings)
5
-
6
- def initialize(locale_wordings:, default_locale:)
7
- @locale_wordings = locale_wordings
8
- @default_locale = default_locale
9
- end
10
-
11
- def translations_for(locale:)
12
- @locale_wordings.find { |locale_wording| locale_wording.locale == locale }
13
- end
14
-
15
- def locales
16
- @locale_wordings.map(&:locale)
17
- end
18
-
19
- def default_locale?(locale:)
20
- locale == @default_locale
21
- end
22
- end
23
- end
24
- end
@@ -1,45 +0,0 @@
1
- module AdLocalize
2
- module Interactors
3
- class ExecuteExportRequest
4
- def initialize(csv_path_to_wording: nil, value_range_to_wording: nil)
5
- @csv_path_to_wording = csv_path_to_wording
6
- @value_range_to_wording = value_range_to_wording
7
- end
8
-
9
- def call(export_request:)
10
- export_request.verbose? ? LOGGER.debug! : LOGGER.info!
11
- print_export_request(export_request: export_request) if export_request.verbose?
12
- LOGGER.debug("Checking request validity")
13
- return unless export_request.valid?
14
-
15
- if export_request.has_csv_files?
16
- ExportCSVFiles.new(csv_path_to_wording: @csv_path_to_wording).call(export_request: export_request)
17
- elsif export_request.has_g_spreadsheet_options?
18
- ExportGSpreadsheet.new(value_range_to_wording: @value_range_to_wording).call(export_request: export_request)
19
- end
20
- LOGGER.debug("End of export request execution")
21
- end
22
-
23
- private
24
-
25
- def print_export_request(export_request:)
26
- LOGGER.debug("Export Request info")
27
- LOGGER.debug("locales : #{export_request.locales.to_sentence}")
28
- LOGGER.debug("platforms : #{export_request.platforms.to_sentence}")
29
- LOGGER.debug("output_path : #{export_request.output_path}")
30
- LOGGER.debug("verbose : #{export_request.verbose}")
31
- LOGGER.debug("non_empty_values : #{export_request.non_empty_values}")
32
- LOGGER.debug("merge_policy : #{export_request.merge_policy&.policy}")
33
- LOGGER.debug("csv_paths : #{export_request.csv_paths.to_sentence}")
34
- if export_request.has_g_spreadsheet_options?
35
- g_options = export_request.g_spreadsheet_options
36
- LOGGER.debug("spreadsheet_id : #{g_options.spreadsheet_id}")
37
- LOGGER.debug("sheet_ids : #{g_options.sheet_ids.to_sentence}")
38
- LOGGER.debug("export_all: #{g_options.export_all}")
39
- LOGGER.debug("service_account: #{g_options.service_account_config.present?}")
40
- end
41
- LOGGER.debug("End Export Request info")
42
- end
43
- end
44
- end
45
- end
@@ -1,20 +0,0 @@
1
- module AdLocalize
2
- module Interactors
3
- class ExportCSVFiles
4
- def initialize(csv_path_to_wording: nil)
5
- @csv_path_to_wording = csv_path_to_wording.presence || Mappers::CSVPathToWording.new
6
- @merge_wordings = MergeWordings.new
7
- @export_wording = ExportWording.new
8
- end
9
-
10
- def call(export_request:)
11
- LOGGER.debug("Starting export csv files : #{export_request.csv_paths.to_sentence}")
12
- wordings = export_request.csv_paths.map { |csv_path| @csv_path_to_wording.map(csv_path: csv_path) }.compact
13
- return if wordings.blank?
14
-
15
- wording = @merge_wordings.call(wordings: wordings, merge_policy: export_request.merge_policy)
16
- @export_wording.call(export_request: export_request, wording: wording)
17
- end
18
- end
19
- end
20
- end
@@ -1,64 +0,0 @@
1
- module AdLocalize
2
- module Interactors
3
- class ExportGSpreadsheet
4
- def initialize(value_range_to_wording: nil)
5
- @value_range_to_wording = value_range_to_wording.presence || Mappers::ValueRangeToWording.new
6
- @g_sheets_repository = Repositories::GSheetsRepository.new
7
- @export_wording = ExportWording.new
8
- @merge_wordings = MergeWordings.new
9
- @export_csv_files = ExportCSVFiles.new
10
- end
11
-
12
- def call(export_request:)
13
- LOGGER.debug("Starting export google spreadsheet")
14
- if export_request.g_spreadsheet_options.service_account_config
15
- export_with_service_account(export_request: export_request)
16
- else
17
- export_without_service_account(export_request: export_request)
18
- end
19
- end
20
-
21
- private
22
-
23
- def export_with_service_account(export_request:)
24
- LOGGER.debug("Using service account")
25
- value_ranges = @g_sheets_repository.get_sheets_values(g_spreadsheet_options: export_request.g_spreadsheet_options)
26
- wordings = value_ranges.map { |value_range| @value_range_to_wording.map(value_range: value_range) }.compact
27
- return if wordings.blank?
28
-
29
- wording = @merge_wordings.call(wordings: wordings, merge_policy: export_request.merge_policy)
30
- @export_wording.call(export_request: export_request, wording: wording)
31
- end
32
-
33
- def export_without_service_account(export_request:)
34
- LOGGER.debug("Using direct access to spreadsheet")
35
- downloaded_files = export_request.g_spreadsheet_options.public_download_urls.map do |sheet_download_url|
36
- download_public_sheet(url: sheet_download_url)
37
- end
38
- export_request.csv_paths = downloaded_files.map(&:path)
39
- if export_request.has_csv_files?
40
- @export_csv_files.call(export_request: export_request)
41
- elsif export_request.has_empty_files?
42
- # When downloading an empty spreadsheet, the content type of the downloaded file is "inode/x-empty"
43
- LOGGER.warn("Your spreadsheet is empty. Add content and retry.")
44
- else
45
- # When shared configuration is misconfigured, the content type of the downloaded file is "text/html"
46
- LOGGER.error("Invalid export request. Check the spreadsheet share configuration")
47
- end
48
- downloaded_files.select { |downloaded_file| File.exist?(downloaded_file.path) }.each do |downloaded_file|
49
- downloaded_file.close
50
- downloaded_file.unlink
51
- end
52
- end
53
-
54
- def download_public_sheet(url:)
55
- tempfile = Tempfile.new
56
- URI.open(url) do |uri_io|
57
- tempfile.write uri_io.read
58
- tempfile.rewind
59
- end
60
- tempfile
61
- end
62
- end
63
- end
64
- end
@@ -1,44 +0,0 @@
1
- module AdLocalize
2
- module Interactors
3
- module Platforms
4
- class ExportAndroidLocaleWording
5
- STRINGS_FILENAME = 'strings.xml'.freeze
6
- LOCALE_DIRECTORY_CONVENTION = "values%{locale_suffix}".freeze
7
-
8
- def initialize
9
- @strings_serializer = Serializers::StringsSerializer.new
10
- @file_system_repository = Repositories::FileSystemRepository.new
11
- end
12
-
13
- def call(export_wording_options:)
14
- platform_dir = export_wording_options.platform_output_directory
15
- wording = export_wording_options.wording
16
-
17
- export_wording_options.locales.each do |locale|
18
- LOGGER.debug("Starting export Android wording for locale #{locale}")
19
- locale_wording = export_wording_options.wording.translations_for(locale: locale)
20
- return unless has_android_wording?(locale_wording: locale_wording)
21
-
22
- output_dir = compute_output_dir(wording: wording, locale: locale, platform_dir: platform_dir)
23
- @file_system_repository.create_directory(path: output_dir)
24
-
25
- content = @strings_serializer.render(locale_wording: locale_wording)
26
- @file_system_repository.write(content: content, path: output_dir.join(STRINGS_FILENAME))
27
- LOGGER.debug("#{STRINGS_FILENAME} done !")
28
- end
29
- end
30
-
31
- private
32
-
33
- def has_android_wording?(locale_wording:)
34
- locale_wording.has_singular_keys? || locale_wording.has_plural_keys?
35
- end
36
-
37
- def compute_output_dir(wording:, locale:, platform_dir:)
38
- locale_suffix = wording.default_locale?(locale: locale) ? '' : "-#{locale}"
39
- platform_dir.join(LOCALE_DIRECTORY_CONVENTION % { locale_suffix: locale_suffix })
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,22 +0,0 @@
1
- module AdLocalize
2
- module Interactors
3
- module Platforms
4
- class ExportCSVLocaleWording
5
- def initialize
6
- @file_system_repository = Repositories::FileSystemRepository.new
7
- end
8
-
9
- def call(export_wording_options:)
10
- LOGGER.debug("Starting export CSV wording")
11
- @file_system_repository.create_directory(path: export_wording_options.platform_output_directory)
12
- export_wording_options.csv_paths.each_with_index do |csv_path, i|
13
- file = File.basename("localization_#{i}.csv")
14
- output_path = export_wording_options.platform_output_directory.join(file.to_s)
15
- FileUtils.cp(csv_path, output_path)
16
- end
17
- LOGGER.debug("CSV wording export done !")
18
- end
19
- end
20
- end
21
- end
22
- end