phraseapp_updater 3.3.0 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a32efb606f930f644881f15a2c3c1edf0bf72eddefd4de9de61524145e8b74c0
4
- data.tar.gz: 3fd1b4164ee16b056b8ecc964863d66dac48a459aee374f1056268b524d2bbaf
3
+ metadata.gz: 5d137755330d9711327e6731a7b4ae1fc701ec705ce719055bca7479dcd3579a
4
+ data.tar.gz: ab2839920b873ed264759eadf926d6b9df837b511b163f1f18e4ef777bcfc820
5
5
  SHA512:
6
- metadata.gz: c03c6ffd3ef4c33825884d9e14552445d5a86d3e7248d3295e3998a66b482f496bf716961bb61df602f293681ad4a755082813ce997e41a3507414f7973f586e
7
- data.tar.gz: 0b08b5b4ddec6a3fd38675acf3d00c79f9bf3bc51dba94290cfde4a2f5223414b87ce50d7d9e06834c9c64872b111469625f4419afee17012c4dcc1171e3e3ea
6
+ metadata.gz: afe9e8266f248e39c52095a762a64a9e1823bf94f825a4cbe7d166946892cd1c171252d2218b3dce0c47c6dd6e4cfe224c826a5ffea812d8f3011f07991c5034
7
+ data.tar.gz: ba81fe027f6016fc759e72b5cf27c88e1c31ca7e08e1580dd4c5b110ecaa83dcd6f603ec686978b21071fbb5bc9e02e5967e32a1a102612a5a16448094c3158a
@@ -4,6 +4,7 @@ require 'phraseapp_updater/locale_file'
4
4
  require 'phraseapp_updater/index_by'
5
5
  require 'uri'
6
6
  require 'phrase'
7
+ require 'concurrent'
7
8
  require 'parallel'
8
9
  require 'tempfile'
9
10
 
@@ -96,38 +97,60 @@ class PhraseAppUpdater
96
97
  end
97
98
  end
98
99
 
99
- # Empirically, PhraseApp fails to parse the uploaded files when uploaded in
100
- # parallel. Give it a better chance by uploading them one at a time.
101
100
  def upload_files(locale_files, default_locale:)
102
- is_default = ->(l) { l.locale_name == default_locale }
101
+ locale_files = locale_files.sort_by(&:locale_name)
102
+ default_locale_file = locale_files.detect { |l| l.locale_name == default_locale }
103
+ locale_files.delete(default_locale_file) if default_locale_file
103
104
 
104
- # Ensure the locales all exist
105
- STDERR.puts('Creating locales')
106
105
  known_locales = fetch_locales.index_by(&:name)
106
+
107
+ # Phraseapp appears to use to use the first file uploaded to resolve conflicts
108
+ # between pluralized and non-pluralized keys. Upload and verify the canonical
109
+ # default locale first before uploading translated locales.
110
+ if default_locale_file
111
+ unless known_locales.has_key?(default_locale_file.locale_name)
112
+ STDERR.puts("Creating default locale (#{default_locale_file})")
113
+ create_locale(default_locale_file.locale_name, default: true)
114
+ end
115
+
116
+ STDERR.puts("Uploading default locale (#{default_locale_file})")
117
+ upload_id = upload_file(default_locale_file)
118
+
119
+ successful_default_upload = verify_uploads({ upload_id => default_locale_file })
120
+ else
121
+ STDERR.puts("No upload for default locale (#{default_locale})")
122
+ end
123
+
124
+ # Ensure the locales all exist
125
+ STDERR.puts('Creating translation locales')
107
126
  threaded_request(locale_files) do |locale_file|
108
127
  unless known_locales.has_key?(locale_file.locale_name)
109
- create_locale(locale_file.locale_name, default: is_default.(locale_file))
128
+ create_locale(locale_file.locale_name, default: false)
110
129
  end
111
130
  end
112
131
 
113
- # Upload the files in a stable order, ensuring the default locale is first.
114
- locale_files.sort! do |a, b|
115
- next -1 if is_default.(a)
116
- next 1 if is_default.(b)
132
+ uploads = Concurrent::Hash.new
117
133
 
118
- a.locale_name <=> b.locale_name
134
+ threaded_request(locale_files) do |locale_file|
135
+ STDERR.puts("Uploading #{locale_file}")
136
+ upload_id = upload_file(locale_file)
137
+ uploads[upload_id] = locale_file
119
138
  end
120
139
 
121
- uploads = {}
140
+ successful_uploads = verify_uploads(uploads)
122
141
 
123
- uploads = locale_files.to_h do |locale_file|
124
- STDERR.puts("Uploading #{locale_file}")
125
- upload_id = upload_file(locale_file)
126
- [upload_id, locale_file]
142
+ if default_locale_file
143
+ successful_uploads = successful_uploads.merge(successful_default_upload)
127
144
  end
128
145
 
129
- # Validate the uploads, retrying failures as necessary
130
- successful_upload_ids = {}
146
+ successful_uploads
147
+ end
148
+
149
+ # Given a map of {upload_id => locale_file} pairs, use the upload_show
150
+ # API to verify that they're complete, and re-upload them if they failed.
151
+ # Return a map of locale name to upload id.
152
+ def verify_uploads(uploads)
153
+ successful_upload_ids = Concurrent::Hash.new
131
154
 
132
155
  STDERR.puts('Verifying uploads...')
133
156
  until uploads.empty?
@@ -157,6 +180,7 @@ class PhraseAppUpdater
157
180
  successful_upload_ids
158
181
  end
159
182
 
183
+
160
184
  def remove_keys_not_in_uploads(upload_ids)
161
185
  threaded_request(upload_ids) do |upload_id|
162
186
  STDERR.puts "Removing keys not in upload #{upload_id}"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class PhraseAppUpdater
4
- VERSION = '3.3.0'
4
+ VERSION = '3.3.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phraseapp_updater
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - iKnow Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-24 00:00:00.000000000 Z
11
+ date: 2024-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.23'
97
+ - !ruby/object:Gem::Dependency
98
+ name: concurrent-ruby
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.0.2
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.0.2
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: bundler
99
113
  requirement: !ruby/object:Gem::Requirement