ad_localize 5.0.0 → 6.0.0

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.
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