deepl-rb 2.5.3 → 3.0.1

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/add_issues_to_kanban.yml +16 -0
  3. data/.gitlab-ci.yml +135 -0
  4. data/.rubocop.yml +27 -0
  5. data/CHANGELOG.md +39 -0
  6. data/CODE_OF_CONDUCT.md +132 -0
  7. data/CONTRIBUTING.md +37 -0
  8. data/Gemfile +3 -1
  9. data/LICENSE.md +1 -0
  10. data/README.md +115 -5
  11. data/Rakefile +7 -5
  12. data/SECURITY.md +58 -0
  13. data/VERSION +1 -1
  14. data/deepl-rb.gemspec +36 -20
  15. data/lib/deepl/api.rb +11 -1
  16. data/lib/deepl/configuration.rb +34 -3
  17. data/lib/deepl/document_api.rb +121 -0
  18. data/lib/deepl/exceptions/authorization_failed.rb +3 -0
  19. data/lib/deepl/exceptions/bad_request.rb +3 -0
  20. data/lib/deepl/exceptions/document_translation_error.rb +15 -0
  21. data/lib/deepl/exceptions/error.rb +6 -0
  22. data/lib/deepl/exceptions/limit_exceeded.rb +7 -0
  23. data/lib/deepl/exceptions/not_found.rb +3 -0
  24. data/lib/deepl/exceptions/not_supported.rb +3 -0
  25. data/lib/deepl/exceptions/quota_exceeded.rb +3 -0
  26. data/lib/deepl/exceptions/request_entity_too_large.rb +3 -0
  27. data/lib/deepl/exceptions/request_error.rb +4 -2
  28. data/lib/deepl/exceptions/server_error.rb +18 -0
  29. data/lib/deepl/glossary_api.rb +3 -0
  30. data/lib/deepl/requests/base.rb +89 -34
  31. data/lib/deepl/requests/document/download.rb +44 -0
  32. data/lib/deepl/requests/document/get_status.rb +44 -0
  33. data/lib/deepl/requests/document/upload.rb +64 -0
  34. data/lib/deepl/requests/glossary/create.rb +15 -1
  35. data/lib/deepl/requests/glossary/destroy.rb +8 -1
  36. data/lib/deepl/requests/glossary/entries.rb +8 -1
  37. data/lib/deepl/requests/glossary/find.rb +8 -1
  38. data/lib/deepl/requests/glossary/language_pairs.rb +9 -2
  39. data/lib/deepl/requests/glossary/list.rb +9 -2
  40. data/lib/deepl/requests/languages.rb +9 -2
  41. data/lib/deepl/requests/translate.rb +33 -11
  42. data/lib/deepl/requests/usage.rb +9 -2
  43. data/lib/deepl/resources/base.rb +3 -0
  44. data/lib/deepl/resources/document_handle.rb +57 -0
  45. data/lib/deepl/resources/document_translation_status.rb +54 -0
  46. data/lib/deepl/resources/glossary.rb +3 -0
  47. data/lib/deepl/resources/language.rb +3 -0
  48. data/lib/deepl/resources/language_pair.rb +3 -0
  49. data/lib/deepl/resources/text.rb +3 -0
  50. data/lib/deepl/resources/usage.rb +3 -0
  51. data/lib/deepl/utils/backoff_timer.rb +46 -0
  52. data/lib/deepl/utils/exception_builder.rb +18 -13
  53. data/lib/deepl.rb +47 -0
  54. data/lib/http_client_options.rb +22 -0
  55. data/license_checker.sh +8 -0
  56. data/spec/api/api_spec.rb +8 -4
  57. data/spec/api/configuration_spec.rb +92 -18
  58. data/spec/api/deepl_spec.rb +225 -86
  59. data/spec/fixtures/vcr_cassettes/deepl_document.yml +95 -0
  60. data/spec/fixtures/vcr_cassettes/deepl_document_download.yml +1214 -0
  61. data/spec/fixtures/vcr_cassettes/deepl_glossaries.yml +812 -23
  62. data/spec/fixtures/vcr_cassettes/deepl_languages.yml +28 -17
  63. data/spec/fixtures/vcr_cassettes/deepl_translate.yml +161 -53
  64. data/spec/fixtures/vcr_cassettes/deepl_usage.yml +93 -3
  65. data/spec/fixtures/vcr_cassettes/glossaries.yml +1237 -15
  66. data/spec/fixtures/vcr_cassettes/languages.yml +159 -44
  67. data/spec/fixtures/vcr_cassettes/translate_texts.yml +9742 -12
  68. data/spec/fixtures/vcr_cassettes/usage.yml +134 -2
  69. data/spec/integration_tests/document_api_spec.rb +155 -0
  70. data/spec/integration_tests/integration_test_utils.rb +170 -0
  71. data/spec/requests/glossary/create_spec.rb +23 -13
  72. data/spec/requests/glossary/destroy_spec.rb +33 -17
  73. data/spec/requests/glossary/entries_spec.rb +31 -17
  74. data/spec/requests/glossary/find_spec.rb +31 -17
  75. data/spec/requests/glossary/language_pairs_spec.rb +17 -7
  76. data/spec/requests/glossary/list_spec.rb +21 -11
  77. data/spec/requests/languages_spec.rb +31 -21
  78. data/spec/requests/translate_spec.rb +125 -131
  79. data/spec/requests/usage_spec.rb +17 -7
  80. data/spec/resources/glossary_spec.rb +15 -12
  81. data/spec/resources/language_pair_spec.rb +10 -7
  82. data/spec/resources/language_spec.rb +21 -18
  83. data/spec/resources/text_spec.rb +10 -7
  84. data/spec/resources/usage_spec.rb +16 -13
  85. data/spec/spec_helper.rb +63 -6
  86. metadata +32 -9
@@ -1,40 +1,55 @@
1
+ # Copyright 2018 Daniel Herzog
2
+ # Use of this source code is governed by an MIT
3
+ # license that can be found in the LICENSE.md file.
1
4
  # frozen_string_literal: true
2
5
 
3
6
  require 'spec_helper'
7
+ require 'tempfile'
4
8
 
5
9
  describe DeepL do
6
- subject { DeepL.dup }
10
+ subject(:deepl) { described_class.dup }
11
+
12
+ around do |tests|
13
+ tmp_env = replace_env_preserving_deepl_vars_except_mock_server
14
+ tests.call
15
+ ENV.replace(tmp_env)
16
+ end
7
17
 
8
18
  describe '#configure' do
9
- context 'When providing no block' do
19
+ context 'when providing no block' do
10
20
  let(:configuration) { DeepL::Configuration.new }
11
- before { subject.configure }
12
21
 
13
- it 'should use default configuration' do
14
- expect(subject.configuration).to eq(configuration)
22
+ before do
23
+ deepl.configure
24
+ end
25
+
26
+ it 'uses default configuration' do
27
+ expect(deepl.configuration).to eq(configuration)
15
28
  end
16
29
  end
17
30
 
18
- context 'When providing a valid configuration' do
31
+ context 'when providing a valid configuration' do
19
32
  let(:configuration) do
20
- DeepL::Configuration.new(auth_key: 'VALID', host: 'http://www.example.org', version: 'v1')
33
+ DeepL::Configuration.new({ auth_key: 'VALID', host: 'http://www.example.org',
34
+ version: 'v1' })
21
35
  end
36
+
22
37
  before do
23
- subject.configure do |config|
38
+ deepl.configure do |config|
24
39
  config.auth_key = configuration.auth_key
25
40
  config.host = configuration.host
26
41
  config.version = configuration.version
27
42
  end
28
43
  end
29
44
 
30
- it 'should use the provided configuration' do
31
- expect(subject.configuration).to eq(configuration)
45
+ it 'uses the provided configuration' do
46
+ expect(deepl.configuration).to eq(configuration)
32
47
  end
33
48
  end
34
49
 
35
- context 'When providing an invalid configuration' do
36
- it 'should raise an error' do
37
- expect { subject.configure { |c| c.auth_key = '' } }
50
+ context 'when providing an invalid configuration' do
51
+ it 'raises an error' do
52
+ expect { deepl.configure { |c| c.auth_key = '' } }
38
53
  .to raise_error(DeepL::Exceptions::Error)
39
54
  end
40
55
  end
@@ -47,37 +62,40 @@ describe DeepL do
47
62
  let(:options) { { param: 'fake' } }
48
63
 
49
64
  around do |example|
50
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
65
+ deepl.configure
51
66
  VCR.use_cassette('deepl_translate') { example.call }
52
67
  end
53
68
 
54
- context 'When translating a text' do
55
- it 'should create and call a request object' do
69
+ context 'when translating a text' do
70
+ it 'creates and call a request object' do
56
71
  expect(DeepL::Requests::Translate).to receive(:new)
57
- .with(subject.api, input, source_lang, target_lang, options).and_call_original
72
+ .with(deepl.api, input, source_lang, target_lang, options).and_call_original
58
73
 
59
- text = subject.translate(input, source_lang, target_lang, options)
74
+ text = deepl.translate(input, source_lang, target_lang, options)
60
75
  expect(text).to be_a(DeepL::Resources::Text)
61
76
  end
62
77
  end
63
78
 
64
- context 'When translating a text using a glossary' do
65
- before(:each) do
66
- @glossary = subject.glossaries.create('fixture', 'EN', 'ES', [%w[car auto]])
79
+ context 'when translating a text using a glossary' do
80
+ before do
81
+ @glossary = deepl.glossaries.create('fixture', 'EN', 'ES', [%w[car auto]])
67
82
  end
83
+
68
84
  let(:input) { 'I wish we had a car.' }
85
+ # rubocop:disable RSpec/InstanceVariable
69
86
  let(:options) { { glossary_id: @glossary.id } }
70
87
 
71
- it 'should create and call a request object' do
72
- expect(DeepL::Requests::Translate).to receive(:new)
73
- .with(subject.api, input, source_lang, target_lang, options).and_call_original
74
- text = subject.translate(input, source_lang, target_lang, options)
75
- expect(text).to be_a(DeepL::Resources::Text)
76
- expect(text.text).to eq('Ojalá tuviéramos un auto.')
88
+ after do
89
+ deepl.glossaries.destroy(@glossary.id)
77
90
  end
91
+ # rubocop:enable RSpec/InstanceVariable
78
92
 
79
- after(:each) do
80
- subject.glossaries.destroy(@glossary.id)
93
+ it 'creates and call a request object' do
94
+ expect(DeepL::Requests::Translate).to receive(:new)
95
+ .with(deepl.api, input, source_lang, target_lang, options).and_call_original
96
+ text = deepl.translate(input, source_lang, target_lang, options)
97
+ expect(text).to be_a(DeepL::Resources::Text)
98
+ expect(text.text).to eq('Ojalá tuviéramos auto.')
81
99
  end
82
100
  end
83
101
  end
@@ -86,37 +104,157 @@ describe DeepL do
86
104
  let(:options) { {} }
87
105
 
88
106
  around do |example|
89
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
107
+ deepl.configure
90
108
  VCR.use_cassette('deepl_usage') { example.call }
91
109
  end
92
110
 
93
- context 'When checking usage' do
94
- it 'should create and call a request object' do
111
+ context 'when checking usage' do
112
+ it 'creates and call a request object' do
95
113
  expect(DeepL::Requests::Usage).to receive(:new)
96
- .with(subject.api, options).and_call_original
114
+ .with(deepl.api, options).and_call_original
97
115
 
98
- usage = subject.usage(options)
116
+ usage = deepl.usage(options)
99
117
  expect(usage).to be_a(DeepL::Resources::Usage)
100
118
  end
101
119
  end
102
120
  end
103
121
 
122
+ # rubocop:disable RSpec/InstanceVariable
123
+ describe '#document' do
124
+ describe '#document.upload' do
125
+ before do
126
+ @tmpfile = Tempfile.new('foo')
127
+ @tmpfile.write("Geology for Beginners Report
128
+ A test report for the DeepL API
129
+ It is with great pleasure, that I, Urna Semper, write this fake document on geology.
130
+ Geology is an excellent field that deals with how to extract oil from the earth.")
131
+ @tmpfile.close
132
+ end
133
+
134
+ after do
135
+ @tmpfile.unlink
136
+ end
137
+
138
+ let(:input_file) { @tmpfile.path }
139
+ let(:source_lang) { 'EN' }
140
+ let(:target_lang) { 'ES' }
141
+ let(:output_file) { 'test_translated_doc.txt' }
142
+ let(:options) { { param: 'fake' } }
143
+ let(:additional_headers) { { 'Fake-Header': 'fake_value' } }
144
+
145
+ around do |example|
146
+ deepl.configure
147
+ VCR.use_cassette('deepl_document') { example.call }
148
+ end
149
+
150
+ context 'when uploading a document' do
151
+ it 'creates an upload object' do
152
+ expect(DeepL::Requests::Document::Upload).to receive(:new)
153
+ .with(deepl.api, input_file, source_lang, target_lang,
154
+ "#{File.basename(@tmpfile.path)}.txt", options,
155
+ additional_headers).and_call_original
156
+ doc_handle = deepl.document.upload(input_file, source_lang, target_lang,
157
+ "#{File.basename(@tmpfile.path)}.txt", options,
158
+ additional_headers)
159
+ expect(doc_handle).to be_a(DeepL::Resources::DocumentHandle)
160
+ end
161
+ end
162
+ end
163
+ # rubocop:enable RSpec/InstanceVariable
164
+
165
+ describe '#document.get_status' do
166
+ let(:document_handle) do
167
+ DeepL::Resources::DocumentHandle.new('9B7CB9418DCDEBF2C4C519F65A32B99F',
168
+ 'EA637EA43BB3F8A52A2A25B76EF3E0C72CE9CD00C881148D1236CB584CB34815', # rubocop:disable Layout/LineLength
169
+ nil,
170
+ nil)
171
+ end
172
+ let(:options) { { param: 'fake' } }
173
+ let(:additional_headers) { { 'Fake-Header': 'fake_value' } }
174
+
175
+ around do |example|
176
+ deepl.configure
177
+ VCR.use_cassette('deepl_document') { example.call }
178
+ end
179
+
180
+ context 'when querying the status of a document' do
181
+ it 'creates a GetStatus object' do
182
+ expect(DeepL::Requests::Document::GetStatus).to receive(:new)
183
+ .with(
184
+ deepl.api,
185
+ document_handle.document_id,
186
+ document_handle.document_key,
187
+ options,
188
+ additional_headers
189
+ ).and_call_original
190
+ status = deepl.document.get_status(document_handle, options, additional_headers)
191
+ expect(status).to be_a(DeepL::Resources::DocumentTranslationStatus)
192
+ end
193
+ end
194
+ end
195
+
196
+ # rubocop:disable RSpec/InstanceVariable
197
+ describe '#document.download' do
198
+ before do
199
+ @tmpfile = Tempfile.new('bar')
200
+ end
201
+
202
+ after do
203
+ @tmpfile.close
204
+ @tmpfile.unlink
205
+ end
206
+
207
+ let(:document_handle) do
208
+ DeepL::Resources::DocumentHandle.new('9B7CB9418DCDEBF2C4C519F65A32B99F',
209
+ 'EA637EA43BB3F8A52A2A25B76EF3E0C72CE9CD00C881148D1236CB584CB34815', # rubocop:disable Layout/LineLength
210
+ nil,
211
+ nil)
212
+ end
213
+ let(:output_file_path) { @tmpfile.path }
214
+ let(:options) { { param: 'fake' } }
215
+
216
+ around do |example|
217
+ deepl.configure
218
+ VCR.use_cassette('deepl_document_download', preserve_exact_body_bytes: true) do
219
+ example.call
220
+ end
221
+ end
222
+
223
+ context 'when downloading a document' do
224
+ it 'creates an downloading object and writes to the output file' do # rubocop:disable RSpec/ExampleLength
225
+ expect(DeepL::Requests::Document::Download).to receive(:new)
226
+ .with(
227
+ deepl.api,
228
+ document_handle.document_id,
229
+ document_handle.document_key,
230
+ output_file_path
231
+ ).and_call_original
232
+ deepl.document.download(document_handle, output_file_path)
233
+ file_contents = File.read(output_file_path)
234
+ expect(file_contents).to be_a(String)
235
+ expect(file_contents.length).to be > 200
236
+ end
237
+ end
238
+ end
239
+ end
240
+ # rubocop:enable RSpec/InstanceVariable
241
+
104
242
  describe '#languages' do
105
243
  let(:options) { { type: :target } }
106
244
 
107
245
  around do |example|
108
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
246
+ deepl.configure
109
247
  VCR.use_cassette('deepl_languages') { example.call }
110
248
  end
111
249
 
112
- context 'When checking languages' do
113
- it 'should create and call a request object' do
250
+ context 'when checking languages' do
251
+ it 'creates and call a request object' do
114
252
  expect(DeepL::Requests::Languages).to receive(:new)
115
- .with(subject.api, options).and_call_original
253
+ .with(deepl.api, options).and_call_original
116
254
 
117
- languages = subject.languages(options)
255
+ languages = deepl.languages(options)
118
256
  expect(languages).to be_an(Array)
119
- expect(languages.all? { |l| l.is_a?(DeepL::Resources::Language) }).to be_truthy
257
+ expect(languages).to(be_all { |l| l.is_a?(DeepL::Resources::Language) })
120
258
  end
121
259
  end
122
260
  end
@@ -135,47 +273,47 @@ describe DeepL do
135
273
  let(:options) { { param: 'fake', entries_format: 'tsv' } }
136
274
 
137
275
  around do |example|
138
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
276
+ deepl.configure
139
277
  VCR.use_cassette('deepl_glossaries') { example.call }
140
278
  end
141
279
 
142
- context 'When creating a glossary' do
143
- it 'should create and call a request object' do
280
+ context 'when creating a glossary' do
281
+ it 'creates and call a request object' do
144
282
  expect(DeepL::Requests::Glossary::Create).to receive(:new)
145
- .with(subject.api, name, source_lang, target_lang, entries, options).and_call_original
283
+ .with(deepl.api, name, source_lang, target_lang, entries, options).and_call_original
146
284
 
147
- glossary = subject.glossaries.create(name, source_lang, target_lang, entries, options)
285
+ glossary = deepl.glossaries.create(name, source_lang, target_lang, entries, options)
148
286
  expect(glossary).to be_a(DeepL::Resources::Glossary)
149
287
  end
150
288
  end
151
289
  end
152
290
 
153
291
  describe '#glossaries.find' do
154
- let(:id) { 'd9ad833f-c818-430c-a3c9-47071384fa3e' }
292
+ let(:id) { 'e7a62637-7ef4-4959-a355-09ba61dd0126' }
155
293
  let(:options) { {} }
156
294
 
157
295
  around do |example|
158
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
296
+ deepl.configure
159
297
  VCR.use_cassette('deepl_glossaries') { example.call }
160
298
  end
161
299
 
162
- context 'When fetching a glossary' do
163
- it 'should create and call a request object' do
300
+ context 'when fetching a glossary' do
301
+ it 'creates and call a request object' do
164
302
  expect(DeepL::Requests::Glossary::Find).to receive(:new)
165
- .with(subject.api, id, options).and_call_original
303
+ .with(deepl.api, id, options).and_call_original
166
304
 
167
- glossary = subject.glossaries.find(id, options)
305
+ glossary = deepl.glossaries.find(id, options)
168
306
  expect(glossary).to be_a(DeepL::Resources::Glossary)
169
307
  end
170
308
  end
171
309
 
172
- context 'When fetching a non existing glossary' do
310
+ context 'when fetching a non existing glossary' do
173
311
  let(:id) { '00000000-0000-0000-0000-000000000000' }
174
312
 
175
- it 'should raise an exception when the glossary does not exist' do
313
+ it 'raises an exception when the glossary does not exist' do
176
314
  expect(DeepL::Requests::Glossary::Find).to receive(:new)
177
- .with(subject.api, id, options).and_call_original
178
- expect { subject.glossaries.find(id, options) }
315
+ .with(deepl.api, id, options).and_call_original
316
+ expect { deepl.glossaries.find(id, options) }
179
317
  .to raise_error(DeepL::Exceptions::NotFound)
180
318
  end
181
319
  end
@@ -185,70 +323,71 @@ describe DeepL do
185
323
  let(:options) { {} }
186
324
 
187
325
  around do |example|
188
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
326
+ deepl.configure
189
327
  VCR.use_cassette('deepl_glossaries') { example.call }
190
328
  end
191
329
 
192
- context 'When fetching glossaries' do
193
- it 'should create and call a request object' do
330
+ context 'when fetching glossaries' do
331
+ it 'creates and call a request object' do
194
332
  expect(DeepL::Requests::Glossary::List).to receive(:new)
195
- .with(subject.api, options).and_call_original
333
+ .with(deepl.api, options).and_call_original
196
334
 
197
- glossaries = subject.glossaries.list(options)
335
+ glossaries = deepl.glossaries.list(options)
198
336
  expect(glossaries).to all(be_a(DeepL::Resources::Glossary))
199
337
  end
200
338
  end
201
339
  end
202
340
 
203
341
  describe '#glossaries.destroy' do
204
- let(:id) { 'd9ad833f-c818-430c-a3c9-47071384fa3e' }
342
+ let(:id) { 'e7a62637-7ef4-4959-a355-09ba61dd0126' }
205
343
  let(:options) { {} }
206
344
 
207
345
  around do |example|
208
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
346
+ deepl.configure
209
347
  VCR.use_cassette('deepl_glossaries') { example.call }
210
348
  end
211
349
 
212
- context 'When destroy a glossary' do
350
+ context 'when destroy a glossary' do
213
351
  let(:new_glossary) do
214
- subject.glossaries.create('fixture', 'EN', 'ES', [%w[Hello Hola]])
352
+ deepl.glossaries.create('fixture', 'EN', 'ES', [%w[Hello Hola]])
215
353
  end
216
- it 'should create and call a request object' do
354
+
355
+ it 'creates and call a request object' do
217
356
  expect(DeepL::Requests::Glossary::Destroy).to receive(:new)
218
- .with(subject.api, new_glossary.id, options).and_call_original
357
+ .with(deepl.api, new_glossary.id, options).and_call_original
219
358
 
220
- glossary_id = subject.glossaries.destroy(new_glossary.id, options)
359
+ glossary_id = deepl.glossaries.destroy(new_glossary.id, options)
221
360
  expect(glossary_id).to eq(new_glossary.id)
222
361
  end
223
362
  end
224
363
 
225
- context 'When destroying a non existing glossary' do
364
+ context 'when destroying a non existing glossary' do
226
365
  let(:id) { '00000000-0000-0000-0000-000000000000' }
227
366
 
228
- it 'should raise an exception when the glossary does not exist' do
367
+ it 'raises an exception when the glossary does not exist' do
229
368
  expect(DeepL::Requests::Glossary::Destroy).to receive(:new)
230
- .with(subject.api, id, options).and_call_original
231
- expect { subject.glossaries.destroy(id, options) }
369
+ .with(deepl.api, id, options).and_call_original
370
+ expect { deepl.glossaries.destroy(id, options) }
232
371
  .to raise_error(DeepL::Exceptions::NotFound)
233
372
  end
234
373
  end
235
374
  end
236
375
 
237
376
  describe '#glossaries.entries' do
238
- let(:id) { '012a5576-b551-4d4c-b917-ce01bc8debb6' }
377
+ let(:id) { 'e7a62637-7ef4-4959-a355-09ba61dd0126' }
239
378
  let(:options) { {} }
240
379
 
241
380
  around do |example|
242
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
381
+ deepl.configure
243
382
  VCR.use_cassette('deepl_glossaries') { example.call }
244
383
  end
245
384
 
246
- context 'When listing glossary entries' do
247
- it 'should create and call a request object' do
385
+ context 'when listing glossary entries' do
386
+ it 'creates and call a request object' do
248
387
  expect(DeepL::Requests::Glossary::Entries).to receive(:new)
249
- .with(subject.api, id, options).and_call_original
388
+ .with(deepl.api, id, options).and_call_original
250
389
 
251
- entries = subject.glossaries.entries(id, options)
390
+ entries = deepl.glossaries.entries(id, options)
252
391
  expect(entries).to all(be_a(Array))
253
392
  entries.each do |entry|
254
393
  expect(entry.size).to eq(2)
@@ -258,13 +397,13 @@ describe DeepL do
258
397
  end
259
398
  end
260
399
 
261
- context 'When listing entries of a non existing glossary' do
400
+ context 'when listing entries of a non existing glossary' do
262
401
  let(:id) { '00000000-0000-0000-0000-000000000000' }
263
402
 
264
- it 'should raise an exception when the glossary does not exist' do
403
+ it 'raises an exception when the glossary does not exist' do
265
404
  expect(DeepL::Requests::Glossary::Entries).to receive(:new)
266
- .with(subject.api, id, options).and_call_original
267
- expect { subject.glossaries.entries(id, options) }
405
+ .with(deepl.api, id, options).and_call_original
406
+ expect { deepl.glossaries.entries(id, options) }
268
407
  .to raise_error(DeepL::Exceptions::NotFound)
269
408
  end
270
409
  end
@@ -274,16 +413,16 @@ describe DeepL do
274
413
  let(:options) { {} }
275
414
 
276
415
  around do |example|
277
- subject.configure { |config| config.host = 'https://api-free.deepl.com' }
416
+ deepl.configure
278
417
  VCR.use_cassette('deepl_glossaries') { example.call }
279
418
  end
280
419
 
281
- context 'When fetching language pairs supported by glossaries' do
282
- it 'should create and call a request object' do
420
+ context 'when fetching language pairs supported by glossaries' do
421
+ it 'creates and call a request object' do
283
422
  expect(DeepL::Requests::Glossary::LanguagePairs).to receive(:new)
284
- .with(subject.api, options).and_call_original
423
+ .with(deepl.api, options).and_call_original
285
424
 
286
- language_pairs = subject.glossaries.language_pairs(options)
425
+ language_pairs = deepl.glossaries.language_pairs(options)
287
426
  expect(language_pairs).to all(be_a(DeepL::Resources::LanguagePair))
288
427
  end
289
428
  end
@@ -0,0 +1,95 @@
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/2.5.3 (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/2.5.3 (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