phraseapp_updater 3.3.1 → 3.3.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d137755330d9711327e6731a7b4ae1fc701ec705ce719055bca7479dcd3579a
4
- data.tar.gz: ab2839920b873ed264759eadf926d6b9df837b511b163f1f18e4ef777bcfc820
3
+ metadata.gz: b44812204928f9576633c2d59bd8c4deb220cdd70e7cfb2f52cdc059368b7b8a
4
+ data.tar.gz: 13e282dcfc436150b6edecf384ae6b54c4133c8cb19a73bd5f723fe90bbb923b
5
5
  SHA512:
6
- metadata.gz: afe9e8266f248e39c52095a762a64a9e1823bf94f825a4cbe7d166946892cd1c171252d2218b3dce0c47c6dd6e4cfe224c826a5ffea812d8f3011f07991c5034
7
- data.tar.gz: ba81fe027f6016fc759e72b5cf27c88e1c31ca7e08e1580dd4c5b110ecaa83dcd6f603ec686978b21071fbb5bc9e02e5967e32a1a102612a5a16448094c3158a
6
+ metadata.gz: 5bd3fe2ab57e511236b31902d21d31d3e80d2e07029c1c7f2d52c4983bf263d5839ab85a6eef904967f6560f387af4312170d3032307b73a2456a816ef97f59b
7
+ data.tar.gz: c0d4677afd153d1b8f0aa95d0f58bb2b1c1568abd6ee68b646610316c8cd7f28a82e0670e5302d6e39c4f4543a025fa867f4850e05922892d22276b5ba771f11
@@ -151,7 +151,7 @@ class PhraseAppUpdater
151
151
  # Return a map of locale name to upload id.
152
152
  def verify_uploads(uploads)
153
153
  successful_upload_ids = Concurrent::Hash.new
154
-
154
+ attempts = 1
155
155
  STDERR.puts('Verifying uploads...')
156
156
  until uploads.empty?
157
157
  threaded_request(uploads.to_a) do |upload_id, locale_file|
@@ -174,7 +174,12 @@ class PhraseAppUpdater
174
174
  end
175
175
  end
176
176
 
177
- sleep(2) unless uploads.empty?
177
+ unless uploads.empty?
178
+ delay = attempts ** 1.6 + 1
179
+ STDERR.puts("#{uploads.size} remaining, waiting #{delay.round} seconds...")
180
+ sleep(delay)
181
+ attempts += 1
182
+ end
178
183
  end
179
184
 
180
185
  successful_upload_ids
@@ -233,17 +238,30 @@ class PhraseAppUpdater
233
238
  phraseapp_request(Phrase::TagsApi,:tag_create, @project_id, params)
234
239
  end
235
240
 
236
- def wrap_phrase_errors
237
- yield
238
- rescue Phrase::ApiError => e
239
- if e.code == 401
240
- raise BadAPIKeyError.new(e)
241
- elsif e.message.match?(/not found/)
242
- raise BadProjectIDError.new(e, @project_id)
243
- elsif e.message.match?(/has already been taken/)
244
- raise ProjectNameTakenError.new(e)
245
- else
246
- raise
241
+ def wrap_phrase_errors(retries: 10)
242
+ begin
243
+ yield
244
+ rescue Phrase::ApiError => e
245
+ if e.code == 401
246
+ raise BadAPIKeyError.new(e)
247
+ elsif e.code == 429
248
+ # If we bail mid-sync, it can be expensive to recover from a partial
249
+ # merge. Instead, aggressively try to retry.
250
+ if retries >= 0
251
+ retries -= 1
252
+ STDERR.puts('Rate limited, retrying in 5...')
253
+ sleep(5)
254
+ retry
255
+ end
256
+
257
+ raise RateLimitError.new(e)
258
+ elsif e.message.match?(/not found/)
259
+ raise BadProjectIDError.new(e, @project_id)
260
+ elsif e.message.match?(/has already been taken/)
261
+ raise ProjectNameTakenError.new(e)
262
+ else
263
+ raise
264
+ end
247
265
  end
248
266
  end
249
267
 
@@ -348,5 +366,11 @@ class PhraseAppUpdater
348
366
  super(original_error.message)
349
367
  end
350
368
  end
369
+
370
+ class RateLimitError < RuntimeError
371
+ def initialize(original_error)
372
+ super(original_error.message)
373
+ end
374
+ end
351
375
  end
352
376
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class PhraseAppUpdater
4
- VERSION = '3.3.1'
4
+ VERSION = '3.3.2'
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.1
4
+ version: 3.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - iKnow Team
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-01 00:00:00.000000000 Z
11
+ date: 2025-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -192,7 +192,7 @@ homepage: https://github.com/iknow/phraseapp_updater
192
192
  licenses:
193
193
  - MIT
194
194
  metadata: {}
195
- post_install_message:
195
+ post_install_message:
196
196
  rdoc_options: []
197
197
  require_paths:
198
198
  - lib
@@ -208,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
208
  version: '0'
209
209
  requirements: []
210
210
  rubygems_version: 3.3.27
211
- signing_key:
211
+ signing_key:
212
212
  specification_version: 4
213
213
  summary: A three-way differ for PhraseApp projects.
214
214
  test_files: []