deepl-rb 3.7.0 → 3.9.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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab-ci.yml +4 -2
  3. data/CHANGELOG.md +39 -1
  4. data/Gemfile +0 -2
  5. data/README.md +225 -16
  6. data/VERSION +1 -1
  7. data/deepl-rb.gemspec +52 -19
  8. data/lib/deepl/document_api.rb +11 -1
  9. data/lib/deepl/requests/base.rb +55 -3
  10. data/lib/deepl/requests/document/upload.rb +50 -1
  11. data/lib/deepl/requests/rephrase.rb +3 -2
  12. data/lib/deepl/requests/translate.rb +6 -3
  13. data/lib/deepl/requests/translation_memory/base.rb +47 -0
  14. data/lib/deepl/requests/translation_memory/create_export.rb +41 -0
  15. data/lib/deepl/requests/translation_memory/create_import.rb +53 -0
  16. data/lib/deepl/requests/translation_memory/destroy.rb +37 -0
  17. data/lib/deepl/requests/translation_memory/download_export.rb +35 -0
  18. data/lib/deepl/requests/translation_memory/find.rb +38 -0
  19. data/lib/deepl/requests/translation_memory/find_job.rb +38 -0
  20. data/lib/deepl/requests/translation_memory/list.rb +5 -18
  21. data/lib/deepl/requests/translation_memory/segments.rb +46 -0
  22. data/lib/deepl/requests/translation_memory/storage_base.rb +47 -0
  23. data/lib/deepl/requests/translation_memory/upload_file.rb +47 -0
  24. data/lib/deepl/resources/translation_memory.rb +4 -1
  25. data/lib/deepl/resources/translation_memory_export.rb +37 -0
  26. data/lib/deepl/resources/translation_memory_import.rb +29 -0
  27. data/lib/deepl/resources/translation_memory_job.rb +142 -0
  28. data/lib/deepl/resources/translation_memory_segments.rb +78 -0
  29. data/lib/deepl/translation_memory_api.rb +293 -1
  30. data/lib/deepl/utils/time_parser.rb +26 -0
  31. data/lib/deepl.rb +38 -4
  32. data/lib/version.rb +1 -1
  33. data/spec/api/deepl_spec.rb +134 -332
  34. data/spec/integration_tests/document_api_spec.rb +51 -18
  35. data/spec/integration_tests/document_error_paths_spec.rb +33 -0
  36. data/spec/integration_tests/glossary_api_spec.rb +114 -0
  37. data/spec/integration_tests/glossary_error_paths_spec.rb +107 -0
  38. data/spec/integration_tests/integration_test_utils.rb +8 -0
  39. data/spec/integration_tests/languages_api_spec.rb +54 -0
  40. data/spec/integration_tests/languages_error_paths_spec.rb +25 -0
  41. data/spec/integration_tests/rephrase_api_spec.rb +90 -0
  42. data/spec/integration_tests/rephrase_error_paths_spec.rb +53 -0
  43. data/spec/integration_tests/smoke_test_spec.rb +24 -0
  44. data/spec/integration_tests/style_rule_api_spec.rb +1 -19
  45. data/spec/integration_tests/style_rule_error_paths_spec.rb +45 -0
  46. data/spec/integration_tests/translate_api_spec.rb +117 -0
  47. data/spec/integration_tests/translate_error_paths_spec.rb +48 -0
  48. data/spec/integration_tests/translation_memory_api_spec.rb +191 -17
  49. data/spec/integration_tests/translation_memory_error_paths_spec.rb +87 -0
  50. data/spec/integration_tests/usage_api_spec.rb +29 -0
  51. data/spec/integration_tests/usage_error_paths_spec.rb +18 -0
  52. data/spec/requests/document/upload_spec.rb +130 -0
  53. data/spec/requests/glossary/create_spec.rb +0 -21
  54. data/spec/requests/glossary/destroy_spec.rb +0 -39
  55. data/spec/requests/glossary/entries_spec.rb +0 -35
  56. data/spec/requests/glossary/find_spec.rb +0 -40
  57. data/spec/requests/glossary/language_pairs_spec.rb +0 -13
  58. data/spec/requests/glossary/list_spec.rb +0 -27
  59. data/spec/requests/languages_spec.rb +0 -41
  60. data/spec/requests/rephrase_spec.rb +13 -139
  61. data/spec/requests/style_rule/create_custom_instruction_spec.rb +0 -24
  62. data/spec/requests/style_rule/create_spec.rb +0 -16
  63. data/spec/requests/style_rule/destroy_custom_instruction_spec.rb +0 -26
  64. data/spec/requests/style_rule/destroy_spec.rb +0 -27
  65. data/spec/requests/style_rule/find_custom_instruction_spec.rb +0 -27
  66. data/spec/requests/style_rule/find_spec.rb +0 -28
  67. data/spec/requests/style_rule/list_spec.rb +0 -31
  68. data/spec/requests/style_rule/update_configured_rules_spec.rb +0 -21
  69. data/spec/requests/style_rule/update_custom_instruction_spec.rb +0 -26
  70. data/spec/requests/style_rule/update_spec.rb +0 -19
  71. data/spec/requests/translate_spec.rb +63 -217
  72. data/spec/requests/translation_memory/create_export_spec.rb +37 -0
  73. data/spec/requests/translation_memory/create_import_spec.rb +61 -0
  74. data/spec/requests/translation_memory/destroy_spec.rb +36 -0
  75. data/spec/requests/translation_memory/download_export_spec.rb +54 -0
  76. data/spec/requests/translation_memory/find_job_spec.rb +37 -0
  77. data/spec/requests/translation_memory/find_spec.rb +36 -0
  78. data/spec/requests/translation_memory/list_spec.rb +0 -34
  79. data/spec/requests/translation_memory/segments_spec.rb +58 -0
  80. data/spec/requests/translation_memory/upload_file_spec.rb +55 -0
  81. data/spec/requests/usage_spec.rb +0 -16
  82. data/spec/resources/custom_instruction_spec.rb +32 -0
  83. data/spec/resources/style_rule_spec.rb +68 -0
  84. data/spec/resources/translation_memory_export_spec.rb +38 -0
  85. data/spec/resources/translation_memory_import_spec.rb +30 -0
  86. data/spec/resources/translation_memory_job_spec.rb +109 -0
  87. data/spec/resources/translation_memory_segments_spec.rb +78 -0
  88. data/spec/resources/translation_memory_spec.rb +18 -1
  89. data/spec/spec_helper.rb +15 -45
  90. data/spec/support/live_mock_server.rb +12 -0
  91. data/spec/support/managed_glossary.rb +65 -0
  92. data/spec/support/managed_style_rule.rb +17 -0
  93. data/spec/support/managed_translation_memory.rb +55 -0
  94. metadata +50 -17
  95. data/spec/fixtures/vcr_cassettes/deepl_document.yml +0 -95
  96. data/spec/fixtures/vcr_cassettes/deepl_document_download.yml +0 -1214
  97. data/spec/fixtures/vcr_cassettes/deepl_glossaries.yml +0 -1163
  98. data/spec/fixtures/vcr_cassettes/deepl_languages.yml +0 -54
  99. data/spec/fixtures/vcr_cassettes/deepl_rephrase.yml +0 -87
  100. data/spec/fixtures/vcr_cassettes/deepl_translate.yml +0 -358
  101. data/spec/fixtures/vcr_cassettes/deepl_usage.yml +0 -129
  102. data/spec/fixtures/vcr_cassettes/glossaries.yml +0 -1702
  103. data/spec/fixtures/vcr_cassettes/languages.yml +0 -229
  104. data/spec/fixtures/vcr_cassettes/rephrase_texts.yml +0 -401
  105. data/spec/fixtures/vcr_cassettes/style_rules.yml +0 -92
  106. data/spec/fixtures/vcr_cassettes/style_rules_crud.yml +0 -926
  107. data/spec/fixtures/vcr_cassettes/translate_texts.yml +0 -10630
  108. data/spec/fixtures/vcr_cassettes/translation_memories.yml +0 -74
  109. data/spec/fixtures/vcr_cassettes/usage.yml +0 -171
@@ -0,0 +1,65 @@
1
+ # Copyright 2025 DeepL SE (https://www.deepl.com)
2
+ # Use of this source code is governed by an MIT
3
+ # license that can be found in the LICENSE file.
4
+ # frozen_string_literal: true
5
+
6
+ module ManagedGlossary
7
+ # Bounded retry budget for tolerating a freshly-created glossary that is not
8
+ # yet resolvable on the real API (eventual consistency): up to ~10 seconds.
9
+ GLOSSARY_RETRY_ATTEMPTS = 20
10
+ GLOSSARY_RETRY_DELAY = 0.5
11
+
12
+ def with_managed_glossary(name:, source_lang:, target_lang:, entries:, options: {})
13
+ glossary = DeepL.glossaries.create(name, source_lang, target_lang, entries, options)
14
+ yield glossary
15
+ ensure
16
+ begin
17
+ DeepL.glossaries.destroy(glossary.id) if glossary
18
+ rescue StandardError
19
+ nil
20
+ end
21
+ end
22
+
23
+ # A just-created glossary is not always immediately resolvable by id on the
24
+ # real API (eventual consistency). Poll #find until each glossary is
25
+ # retrievable so subsequent calls (e.g. translate with glossary_ids) do not
26
+ # fail with a transient "Glossary <uuid> not found" error.
27
+ #
28
+ # Note: no keyword arguments here — Ruby 2.7 would fold a trailing options
29
+ # hash from callers into keywords, breaking positional-hash APIs.
30
+ def wait_until_glossaries_ready(*glossaries)
31
+ glossaries.each do |glossary|
32
+ remaining = GLOSSARY_RETRY_ATTEMPTS
33
+ begin
34
+ DeepL.glossaries.find(glossary.id)
35
+ rescue DeepL::Exceptions::RequestError
36
+ raise if (remaining -= 1) <= 0
37
+
38
+ sleep(GLOSSARY_RETRY_DELAY)
39
+ retry
40
+ end
41
+ end
42
+ end
43
+
44
+ # Translate with a bounded retry that tolerates a transient
45
+ # "Glossary <uuid> not found" error caused by eventual consistency on a
46
+ # freshly created glossary. Depending on timing the real API returns this as
47
+ # either a 400 or a 404, so match on the message rather than the status.
48
+ # Any other error is re-raised immediately.
49
+ #
50
+ # `options` is an explicit positional hash (matching DeepL.translate) rather
51
+ # than keyword arguments, so passing `{ glossary_ids: [...] }` works on Ruby
52
+ # 2.7 as well as 3.x.
53
+ def translate_retrying_missing_glossary(text, source_lang, target_lang, options = {})
54
+ remaining = GLOSSARY_RETRY_ATTEMPTS
55
+ begin
56
+ DeepL.translate(text, source_lang, target_lang, options)
57
+ rescue DeepL::Exceptions::RequestError => e
58
+ raise unless e.to_s.match?(/glossary .* not found/i)
59
+ raise if (remaining -= 1) <= 0
60
+
61
+ sleep(GLOSSARY_RETRY_DELAY)
62
+ retry
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,17 @@
1
+ # Copyright 2025 DeepL SE (https://www.deepl.com)
2
+ # Use of this source code is governed by an MIT
3
+ # license that can be found in the LICENSE file.
4
+ # frozen_string_literal: true
5
+
6
+ module ManagedStyleRule
7
+ def with_managed_style_rule(name:, language:, options: {})
8
+ style_rule = DeepL.style_rules.create(name, language, options)
9
+ yield style_rule
10
+ ensure
11
+ begin
12
+ DeepL.style_rules.destroy(style_rule.style_id) if style_rule
13
+ rescue StandardError
14
+ nil
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,55 @@
1
+ # Copyright 2025 DeepL SE (https://www.deepl.com)
2
+ # Use of this source code is governed by an MIT
3
+ # license that can be found in the LICENSE file.
4
+ # frozen_string_literal: true
5
+
6
+ module ManagedTranslationMemory
7
+ # A minimal, valid TMX document to import in the translation memory specs.
8
+ EXAMPLE_TMX = <<~TMX
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <tmx version="1.4">
11
+ <header creationtool="deepl-rb-spec" srclang="de" segtype="sentence"
12
+ adminlang="en" datatype="plaintext" o-tmf="TMX"/>
13
+ <body>
14
+ <tu>
15
+ <tuv xml:lang="de"><seg>Quelltext Nummer 0</seg></tuv>
16
+ <tuv xml:lang="en"><seg>Source text number 0</seg></tuv>
17
+ </tu>
18
+ </body>
19
+ </tmx>
20
+ TMX
21
+
22
+ # Imports the TMX file at +input_file_path+ and yields the finished import job, deleting the
23
+ # resulting translation memory afterwards.
24
+ def with_managed_translation_memory(input_file_path, display_name: nil)
25
+ job = DeepL.translation_memories.import_from_filepath(input_file_path,
26
+ display_name: display_name)
27
+ yield job
28
+ ensure
29
+ begin
30
+ DeepL.translation_memories.destroy(job.result.translation_memory_id) if job
31
+ rescue StandardError
32
+ nil
33
+ end
34
+ end
35
+
36
+ # Creates an import job for the TMX file at +input_file_path+ through +translation_memories+
37
+ # and uploads the file, then returns the created import. The mock server keeps the job in the
38
+ # `awaiting_input` status for +processing_polls+ status queries before completing it, standing
39
+ # in for the live API detecting the upload asynchronously.
40
+ def create_uploaded_import(translation_memories, input_file_path, processing_polls:)
41
+ file_content = File.binread(input_file_path)
42
+ created = translation_memories.create_import(
43
+ File.basename(input_file_path), file_content.bytesize,
44
+ additional_headers: tm_job_processing_polls_header(processing_polls)
45
+ )
46
+ translation_memories.upload_file(created, file_content)
47
+ created
48
+ end
49
+
50
+ # Writes the example TMX document to +path+ and returns the path.
51
+ def write_example_tmx(path)
52
+ File.write(path, EXAMPLE_TMX)
53
+ path
54
+ end
55
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deepl-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.0
4
+ version: 3.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DeepL SE
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-05-14 00:00:00.000000000 Z
11
+ date: 2026-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: juwelier
@@ -109,7 +109,17 @@ files:
109
109
  - lib/deepl/requests/style_rule/update_configured_rules.rb
110
110
  - lib/deepl/requests/style_rule/update_custom_instruction.rb
111
111
  - lib/deepl/requests/translate.rb
112
+ - lib/deepl/requests/translation_memory/base.rb
113
+ - lib/deepl/requests/translation_memory/create_export.rb
114
+ - lib/deepl/requests/translation_memory/create_import.rb
115
+ - lib/deepl/requests/translation_memory/destroy.rb
116
+ - lib/deepl/requests/translation_memory/download_export.rb
117
+ - lib/deepl/requests/translation_memory/find.rb
118
+ - lib/deepl/requests/translation_memory/find_job.rb
112
119
  - lib/deepl/requests/translation_memory/list.rb
120
+ - lib/deepl/requests/translation_memory/segments.rb
121
+ - lib/deepl/requests/translation_memory/storage_base.rb
122
+ - lib/deepl/requests/translation_memory/upload_file.rb
113
123
  - lib/deepl/requests/usage.rb
114
124
  - lib/deepl/resources/base.rb
115
125
  - lib/deepl/resources/document_handle.rb
@@ -120,11 +130,16 @@ files:
120
130
  - lib/deepl/resources/style_rule.rb
121
131
  - lib/deepl/resources/text.rb
122
132
  - lib/deepl/resources/translation_memory.rb
133
+ - lib/deepl/resources/translation_memory_export.rb
134
+ - lib/deepl/resources/translation_memory_import.rb
135
+ - lib/deepl/resources/translation_memory_job.rb
136
+ - lib/deepl/resources/translation_memory_segments.rb
123
137
  - lib/deepl/resources/usage.rb
124
138
  - lib/deepl/style_rule_api.rb
125
139
  - lib/deepl/translation_memory_api.rb
126
140
  - lib/deepl/utils/backoff_timer.rb
127
141
  - lib/deepl/utils/exception_builder.rb
142
+ - lib/deepl/utils/time_parser.rb
128
143
  - lib/http_client_options.rb
129
144
  - lib/version.rb
130
145
  - license_checker.sh
@@ -132,25 +147,25 @@ files:
132
147
  - spec/api/configuration_spec.rb
133
148
  - spec/api/deepl_spec.rb
134
149
  - spec/constants/constants_spec.rb
135
- - spec/fixtures/vcr_cassettes/deepl_document.yml
136
- - spec/fixtures/vcr_cassettes/deepl_document_download.yml
137
- - spec/fixtures/vcr_cassettes/deepl_glossaries.yml
138
- - spec/fixtures/vcr_cassettes/deepl_languages.yml
139
- - spec/fixtures/vcr_cassettes/deepl_rephrase.yml
140
- - spec/fixtures/vcr_cassettes/deepl_translate.yml
141
- - spec/fixtures/vcr_cassettes/deepl_usage.yml
142
- - spec/fixtures/vcr_cassettes/glossaries.yml
143
- - spec/fixtures/vcr_cassettes/languages.yml
144
- - spec/fixtures/vcr_cassettes/rephrase_texts.yml
145
- - spec/fixtures/vcr_cassettes/style_rules.yml
146
- - spec/fixtures/vcr_cassettes/style_rules_crud.yml
147
- - spec/fixtures/vcr_cassettes/translate_texts.yml
148
- - spec/fixtures/vcr_cassettes/translation_memories.yml
149
- - spec/fixtures/vcr_cassettes/usage.yml
150
150
  - spec/integration_tests/document_api_spec.rb
151
+ - spec/integration_tests/document_error_paths_spec.rb
152
+ - spec/integration_tests/glossary_api_spec.rb
153
+ - spec/integration_tests/glossary_error_paths_spec.rb
151
154
  - spec/integration_tests/integration_test_utils.rb
155
+ - spec/integration_tests/languages_api_spec.rb
156
+ - spec/integration_tests/languages_error_paths_spec.rb
157
+ - spec/integration_tests/rephrase_api_spec.rb
158
+ - spec/integration_tests/rephrase_error_paths_spec.rb
159
+ - spec/integration_tests/smoke_test_spec.rb
152
160
  - spec/integration_tests/style_rule_api_spec.rb
161
+ - spec/integration_tests/style_rule_error_paths_spec.rb
162
+ - spec/integration_tests/translate_api_spec.rb
163
+ - spec/integration_tests/translate_error_paths_spec.rb
153
164
  - spec/integration_tests/translation_memory_api_spec.rb
165
+ - spec/integration_tests/translation_memory_error_paths_spec.rb
166
+ - spec/integration_tests/usage_api_spec.rb
167
+ - spec/integration_tests/usage_error_paths_spec.rb
168
+ - spec/requests/document/upload_spec.rb
154
169
  - spec/requests/extra_body_parameters_types_spec.rb
155
170
  - spec/requests/glossary/create_spec.rb
156
171
  - spec/requests/glossary/destroy_spec.rb
@@ -171,15 +186,33 @@ files:
171
186
  - spec/requests/style_rule/update_custom_instruction_spec.rb
172
187
  - spec/requests/style_rule/update_spec.rb
173
188
  - spec/requests/translate_spec.rb
189
+ - spec/requests/translation_memory/create_export_spec.rb
190
+ - spec/requests/translation_memory/create_import_spec.rb
191
+ - spec/requests/translation_memory/destroy_spec.rb
192
+ - spec/requests/translation_memory/download_export_spec.rb
193
+ - spec/requests/translation_memory/find_job_spec.rb
194
+ - spec/requests/translation_memory/find_spec.rb
174
195
  - spec/requests/translation_memory/list_spec.rb
196
+ - spec/requests/translation_memory/segments_spec.rb
197
+ - spec/requests/translation_memory/upload_file_spec.rb
175
198
  - spec/requests/usage_spec.rb
199
+ - spec/resources/custom_instruction_spec.rb
176
200
  - spec/resources/glossary_spec.rb
177
201
  - spec/resources/language_pair_spec.rb
178
202
  - spec/resources/language_spec.rb
203
+ - spec/resources/style_rule_spec.rb
179
204
  - spec/resources/text_spec.rb
205
+ - spec/resources/translation_memory_export_spec.rb
206
+ - spec/resources/translation_memory_import_spec.rb
207
+ - spec/resources/translation_memory_job_spec.rb
208
+ - spec/resources/translation_memory_segments_spec.rb
180
209
  - spec/resources/translation_memory_spec.rb
181
210
  - spec/resources/usage_spec.rb
182
211
  - spec/spec_helper.rb
212
+ - spec/support/live_mock_server.rb
213
+ - spec/support/managed_glossary.rb
214
+ - spec/support/managed_style_rule.rb
215
+ - spec/support/managed_translation_memory.rb
183
216
  homepage: https://github.com/DeepLcom/deepl-rb
184
217
  licenses:
185
218
  - MIT
@@ -1,95 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://api.deepl.com/v2/document
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- Authorization:
11
- - DeepL-Auth-Key VALID_TOKEN
12
- User-Agent:
13
- - deepl-ruby/3.0.2 (darwin23) ruby/3.3.3
14
- Content-Type:
15
- - multipart/form-data
16
- Accept-Encoding:
17
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
- Accept:
19
- - "*/*"
20
- Fake-Header:
21
- - fake_value
22
- response:
23
- status:
24
- code: 200
25
- message: OK
26
- headers:
27
- Date:
28
- - Tue, 09 Jul 2024 02:02:17 GMT
29
- Content-Type:
30
- - application/json; charset=utf-8
31
- Transfer-Encoding:
32
- - chunked
33
- Vary:
34
- - Accept-Encoding
35
- Access-Control-Allow-Origin:
36
- - "*"
37
- X-Trace-Id:
38
- - cdde031b7a5e48d7a8c4a5a2f1b9dc6e
39
- Strict-Transport-Security:
40
- - max-age=63072000; includeSubDomains; preload
41
- Server-Timing:
42
- - l7_lb_tls;dur=100, l7_lb_idle;dur=2, l7_lb_receive;dur=0, l7_lb_total;dur=192
43
- Access-Control-Expose-Headers:
44
- - Server-Timing, X-Trace-ID
45
- body:
46
- encoding: ASCII-8BIT
47
- string: '{"document_id":"9B7CB9418DCDEBF2C4C519F65A32B99F","document_key":"EA637EA43BB3F8A52A2A25B76EF3E0C72CE9CD00C881148D1236CB584CB34815"}'
48
- recorded_at: Tue, 09 Jul 2024 02:02:17 GMT
49
- - request:
50
- method: post
51
- uri: https://api.deepl.com/v2/document/9B7CB9418DCDEBF2C4C519F65A32B99F
52
- body:
53
- encoding: UTF-8
54
- string: '{"document_key":"EA637EA43BB3F8A52A2A25B76EF3E0C72CE9CD00C881148D1236CB584CB34815","param":"fake"}'
55
- headers:
56
- Authorization:
57
- - DeepL-Auth-Key VALID_TOKEN
58
- User-Agent:
59
- - deepl-ruby/3.0.2 (darwin23) ruby/3.3.3
60
- Content-Type:
61
- - application/json
62
- Accept-Encoding:
63
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
64
- Accept:
65
- - "*/*"
66
- Fake-Header:
67
- - fake_value
68
- response:
69
- status:
70
- code: 200
71
- message: OK
72
- headers:
73
- Date:
74
- - Tue, 09 Jul 2024 02:03:49 GMT
75
- Content-Type:
76
- - application/json; charset=utf-8
77
- Transfer-Encoding:
78
- - chunked
79
- Vary:
80
- - Accept-Encoding
81
- Access-Control-Allow-Origin:
82
- - "*"
83
- X-Trace-Id:
84
- - 73fc4be8f3964b4080f89ee686c090be
85
- Strict-Transport-Security:
86
- - max-age=63072000; includeSubDomains; preload
87
- Server-Timing:
88
- - l7_lb_tls;dur=152, l7_lb_idle;dur=9, l7_lb_receive;dur=0, l7_lb_total;dur=166
89
- Access-Control-Expose-Headers:
90
- - Server-Timing, X-Trace-ID
91
- body:
92
- encoding: ASCII-8BIT
93
- string: '{"document_id":"9B7CB9418DCDEBF2C4C519F65A32B99F","status":"done","billed_characters":256}'
94
- recorded_at: Tue, 09 Jul 2024 02:03:49 GMT
95
- recorded_with: VCR 6.2.0