deepl-rb 3.1.0 → 3.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1de43b1593c5b5d4236c0b064c08436ab57fe13bf3fdc29069220fd899ca8e1d
4
- data.tar.gz: a486d446fa3bebddbf3fd6aa468300bead03eafe8bc075c33a28d80be6e555b8
3
+ metadata.gz: 47bf797967929a4b7775e21ce7021cdc1871283b3358cbb36d13a8f6f6b5ac6b
4
+ data.tar.gz: df4399cc6c552fb5c03b79b0566d2370101b58246bfd5e0b05d27c83e994ae6c
5
5
  SHA512:
6
- metadata.gz: ca167089f7a190915436fb316a8a82aa69bf8093316b4074c6536bb21e002811d9bdd57fc8711eeb634025b094a9fe17e2b057eee5ea5d2499539060e09b8ebd
7
- data.tar.gz: 1c63cd745170652f01a2335cc064ceb0266c1584a19bd1fcd6683c6d461241b646d33df0b3e36f516e1dff6a1d6158e706994b862b6bd8d671b1db399cabfa03
6
+ metadata.gz: 4639c87e107dfa0a13b1bace938e9a3580fb15bb1e2f280267527e3d5d0c9b8913752b841bd095039f1e4f7d15b13813075131c0767216855bf5e7d28a4b81a1
7
+ data.tar.gz: 19743f57e84c550e5fe35b1d6c39f853df1d0d1d357eb8c0f061a0202831af8a557651f34f50dcad10928b45638a3a09b9ab64652fdadab6d6ad62ec3f2a1242
data/CHANGELOG.md CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [3.2.0]
8
+ ### Added
9
+ * Added `rephrase` functionality to get a new version of submitted text with various possible styles or tones applied
10
+ * Added `DeepL::Constants` namespace and associated constant values for options possibilities
7
11
 
8
12
  ## [3.1.0]
9
13
  ### Added
@@ -50,7 +54,7 @@ The change in major version is only due to the change in maintainership, there i
50
54
  ### Fixed
51
55
  * Make RequestEntityTooLarge error message more clear
52
56
 
53
-
57
+ [3.2.0]: https://github.com/DeepLcom/deepl-rb/compare/v3.1.0...3.2.0
54
58
  [3.1.0]: https://github.com/DeepLcom/deepl-rb/compare/v3.0.2...v3.1.0
55
59
  [3.0.2]: https://github.com/DeepLcom/deepl-rb/compare/v3.0.1...v3.0.2
56
60
  [3.0.1]: https://github.com/DeepLcom/deepl-rb/compare/v3.0.0...v3.0.1
data/README.md CHANGED
@@ -168,6 +168,37 @@ The following parameters will be automatically converted:
168
168
  | `glossary_id` | No conversion applied
169
169
  | `context` | No conversion applied
170
170
 
171
+ ### Rephrase Text
172
+
173
+ To rephrase or improve text, including changing the writing style or tone of the text, use the `rephrase` method:
174
+
175
+ ```rb
176
+ rephrased_text = DeepL.rephrase 'you will acquire new rephrased text', 'EN'
177
+
178
+ puts rephrased_text.class
179
+ # => DeepL::Resources::Text
180
+ puts rephrased_text.text
181
+ # => 'You get new rephrased text.'
182
+ ```
183
+
184
+ As with translate, the text input can be a single string or an array of strings.
185
+
186
+ You can use the additional arguments to specify the writing style or tone you want for the rephrased text:
187
+
188
+ ```rb
189
+ rephrased_text = DeepL.rephrase 'you will acquire new rephrased text', 'EN', 'casual'
190
+
191
+ puts rephrased_text.text
192
+ # => 'You'll get new, rephrased text.'
193
+ ```
194
+
195
+ ```rb
196
+ rephrased_text = DeepL.rephrase 'you will acquire new rephrased text', 'EN', nil, 'friendly'
197
+
198
+ puts rephrased_text.text
199
+ # => 'You'll get to enjoy new, rephrased text!'
200
+ ```
201
+
171
202
  ### Glossaries
172
203
 
173
204
  To create a glossary, use the `glossaries.create` method. The glossary `entries` argument should be an array of text pairs. Each pair includes the source and the target translations.
@@ -389,6 +420,30 @@ end
389
420
 
390
421
  This information is passed along when the library makes calls to the DeepL API. Both name and version are required. Please note that setting the `User-Agent` header via `deepl.configure` will override this setting, if you need to use this, please manually identify your Application in the `User-Agent` header.
391
422
 
423
+ ## Options Constants
424
+
425
+ The available values for various possible options are provided under the `DeepL::Constants` namespace. The currently available options are
426
+
427
+ `TagHandling`
428
+ `SplitSentences`
429
+ `ModelType`
430
+ `Formality`
431
+ `WritingStyle`
432
+ `Tone`
433
+
434
+ To view all the possible options for a given constant, call `options`:
435
+
436
+ ```rb
437
+ all_available_tones = DeepL::Constants::Tones.options
438
+ ```
439
+
440
+ To check if a given string is a possible option for a given constant, call `valid?`:
441
+
442
+ ```rb
443
+ DeepL::Constants::Tones.valid?('friendly') # true
444
+ DeepL::Constants::Tones.valid?('rude') # false
445
+ ```
446
+
392
447
  ## Integrations
393
448
 
394
449
  ### Ruby on Rails
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.1.0
1
+ 3.2.0
data/deepl-rb.gemspec CHANGED
@@ -2,17 +2,17 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: deepl-rb 3.1.0 ruby lib
5
+ # stub: deepl-rb 3.2.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "deepl-rb".freeze
9
- s.version = "3.1.0"
9
+ s.version = "3.2.0".freeze
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.metadata = { "bug_tracker_uri" => "https://github.com/DeepLcom/deepl-rb/issues", "changelog_uri" => "https://github.com/DeepLcom/deepl-rb/blob/main/CHANGELOG.md", "documentation_uri" => "https://github.com/DeepLcom/deepl-rb/blob/main/README.md", "homepage_uri" => "https://github.com/DeepLcom/deepl-rb" } if s.respond_to? :metadata=
13
13
  s.require_paths = ["lib".freeze]
14
14
  s.authors = ["DeepL SE".freeze]
15
- s.date = "2024-11-15"
15
+ s.date = "2025-01-15"
16
16
  s.description = "Official Ruby library for the DeepL language translation API (v2). For more information, check this: https://www.deepl.com/docs/api-reference.html".freeze
17
17
  s.email = "open-source@deepl.com".freeze
18
18
  s.extra_rdoc_files = [
@@ -39,6 +39,13 @@ Gem::Specification.new do |s|
39
39
  "lib/deepl.rb",
40
40
  "lib/deepl/api.rb",
41
41
  "lib/deepl/configuration.rb",
42
+ "lib/deepl/constants/base_constant.rb",
43
+ "lib/deepl/constants/formality.rb",
44
+ "lib/deepl/constants/model_type.rb",
45
+ "lib/deepl/constants/split_sentences.rb",
46
+ "lib/deepl/constants/tag_handling.rb",
47
+ "lib/deepl/constants/tone.rb",
48
+ "lib/deepl/constants/writing_style.rb",
42
49
  "lib/deepl/document_api.rb",
43
50
  "lib/deepl/exceptions/authorization_failed.rb",
44
51
  "lib/deepl/exceptions/bad_request.rb",
@@ -63,6 +70,7 @@ Gem::Specification.new do |s|
63
70
  "lib/deepl/requests/glossary/language_pairs.rb",
64
71
  "lib/deepl/requests/glossary/list.rb",
65
72
  "lib/deepl/requests/languages.rb",
73
+ "lib/deepl/requests/rephrase.rb",
66
74
  "lib/deepl/requests/translate.rb",
67
75
  "lib/deepl/requests/usage.rb",
68
76
  "lib/deepl/resources/base.rb",
@@ -80,6 +88,7 @@ Gem::Specification.new do |s|
80
88
  "spec/api/api_spec.rb",
81
89
  "spec/api/configuration_spec.rb",
82
90
  "spec/api/deepl_spec.rb",
91
+ "spec/constants/constants_spec.rb",
83
92
  "spec/fixtures/vcr_cassettes/deepl_document.yml",
84
93
  "spec/fixtures/vcr_cassettes/deepl_document_download.yml",
85
94
  "spec/fixtures/vcr_cassettes/deepl_glossaries.yml",
@@ -88,6 +97,7 @@ Gem::Specification.new do |s|
88
97
  "spec/fixtures/vcr_cassettes/deepl_usage.yml",
89
98
  "spec/fixtures/vcr_cassettes/glossaries.yml",
90
99
  "spec/fixtures/vcr_cassettes/languages.yml",
100
+ "spec/fixtures/vcr_cassettes/rephrase_texts.yml",
91
101
  "spec/fixtures/vcr_cassettes/translate_texts.yml",
92
102
  "spec/fixtures/vcr_cassettes/usage.yml",
93
103
  "spec/integration_tests/document_api_spec.rb",
@@ -99,6 +109,7 @@ Gem::Specification.new do |s|
99
109
  "spec/requests/glossary/language_pairs_spec.rb",
100
110
  "spec/requests/glossary/list_spec.rb",
101
111
  "spec/requests/languages_spec.rb",
112
+ "spec/requests/rephrase_spec.rb",
102
113
  "spec/requests/translate_spec.rb",
103
114
  "spec/requests/usage_spec.rb",
104
115
  "spec/resources/glossary_spec.rb",
@@ -110,12 +121,12 @@ Gem::Specification.new do |s|
110
121
  ]
111
122
  s.homepage = "https://github.com/DeepLcom/deepl-rb".freeze
112
123
  s.licenses = ["MIT".freeze]
113
- s.rubygems_version = "3.4.6".freeze
124
+ s.rubygems_version = "3.5.3".freeze
114
125
  s.summary = "Official Ruby library for the DeepL language translation API.".freeze
115
126
 
116
127
  s.specification_version = 4
117
128
 
118
- s.add_development_dependency(%q<juwelier>.freeze, [">= 0"])
119
- s.add_development_dependency(%q<byebug>.freeze, [">= 0"])
129
+ s.add_development_dependency(%q<juwelier>.freeze, [">= 0".freeze])
130
+ s.add_development_dependency(%q<byebug>.freeze, [">= 0".freeze])
120
131
  end
121
132
 
@@ -0,0 +1,18 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ module DeepL
7
+ module Constants
8
+ class BaseConstant
9
+ def self.options
10
+ constants.map { |const| const_get(const) }
11
+ end
12
+
13
+ def self.valid?(value)
14
+ options.include?(value)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ module DeepL
7
+ module Constants
8
+ class Formality < BaseConstant
9
+ DEFAULT = 'default'
10
+ MORE = 'more'
11
+ LESS = 'less'
12
+ PREFER_MORE = 'prefer_more'
13
+ PREFER_LESS = 'prefer_less'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ module DeepL
7
+ module Constants
8
+ class ModelType < BaseConstant
9
+ QUALITY_OPTIMIZED = 'quality_optimized'
10
+ PREFER_QUALITY_OPTIMIZED = 'prefer_quality_optimized'
11
+ LATENCY_OPTIMIZED = 'latency_optimized'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ module DeepL
7
+ module Constants
8
+ class SplitSentences < BaseConstant
9
+ NO_SPLITTING = '0'
10
+ SPLIT_ON_PUNCTUATION_AND_NEWLINES = '1'
11
+ SPLIT_ON_PUNCTUATION_ONLY = 'nonewlines'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ module DeepL
7
+ module Constants
8
+ class TagHandling < BaseConstant
9
+ XML = 'xml'
10
+ HTML = 'html'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ module DeepL
7
+ module Constants
8
+ class Tone < BaseConstant
9
+ DEFAULT = 'default'
10
+ ENTHUSIASTIC = 'enthusiastic'
11
+ FRIENDLY = 'friendly'
12
+ CONFIDENT = 'confident'
13
+ DIPLOMATIC = 'diplomatic'
14
+ PREFER_ENTHUSIASTIC = 'prefer_enthusiastic'
15
+ PREFER_FRIENDLY = 'prefer_friendly'
16
+ PREFER_CONFIDENT = 'prefer_confident'
17
+ PREFER_DIPLOMATIC = 'prefer_diplomatic'
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ module DeepL
7
+ module Constants
8
+ class WritingStyle < BaseConstant
9
+ DEFAULT = 'default'
10
+ SIMPLE = 'simple'
11
+ BUSINESS = 'business'
12
+ ACADEMIC = 'academic'
13
+ CASUAL = 'casual'
14
+ PREFER_SIMPLE = 'prefer_simple'
15
+ PREFER_BUSINESS = 'prefer_business'
16
+ PREFER_ACADEMIC = 'prefer_academic'
17
+ PREFER_CASUAL = 'prefer_casual'
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,54 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ module DeepL
7
+ module Requests
8
+ class Rephrase < Base
9
+ attr_reader :text, :target_lang, :writing_style, :tone
10
+
11
+ def initialize(api, text, target_lang, writing_style = nil, tone = nil, options = {})
12
+ super(api, options)
13
+ @text = text
14
+ @target_lang = target_lang
15
+ @writing_style = writing_style
16
+ @tone = tone
17
+ end
18
+
19
+ def request
20
+ text_arrayified = text.is_a?(Array) ? text : [text]
21
+ payload = { text: text_arrayified, target_lang: target_lang }
22
+ payload[:writing_style] = writing_style unless writing_style.nil?
23
+ payload[:tone] = tone unless tone.nil?
24
+ build_texts(*execute_request_with_retries(post_request(payload)))
25
+ end
26
+
27
+ def details
28
+ "HTTP Headers: #{headers}\nPayload #{{ text: text, target_lang: target_lang,
29
+ writing_style: writing_style, tone: tone }}"
30
+ end
31
+
32
+ def to_s
33
+ "POST #{uri.request_uri}"
34
+ end
35
+
36
+ private
37
+
38
+ def build_texts(request, response)
39
+ data = JSON.parse(response.body)
40
+
41
+ texts = data['improvements'].map do |improvement|
42
+ Resources::Text.new(improvement['text'], improvement['detected_source_language'], nil,
43
+ request, response)
44
+ end
45
+
46
+ texts.size == 1 ? texts.first : texts
47
+ end
48
+
49
+ def path
50
+ 'write/rephrase'
51
+ end
52
+ end
53
+ end
54
+ end
data/lib/deepl.rb CHANGED
@@ -34,6 +34,7 @@ require 'deepl/requests/glossary/list'
34
34
  require 'deepl/requests/languages'
35
35
  require 'deepl/requests/translate'
36
36
  require 'deepl/requests/usage'
37
+ require 'deepl/requests/rephrase'
37
38
 
38
39
  # -- Responses and resources
39
40
  require 'deepl/resources/base'
@@ -49,6 +50,15 @@ require 'deepl/resources/usage'
49
50
  require 'deepl/utils/exception_builder'
50
51
  require 'deepl/utils/backoff_timer'
51
52
 
53
+ # -- Constants
54
+ require 'deepl/constants/base_constant'
55
+ require 'deepl/constants/formality'
56
+ require 'deepl/constants/model_type'
57
+ require 'deepl/constants/split_sentences'
58
+ require 'deepl/constants/tag_handling'
59
+ require 'deepl/constants/tone'
60
+ require 'deepl/constants/writing_style'
61
+
52
62
  # -- HTTP Utils
53
63
  require 'http_client_options'
54
64
 
@@ -0,0 +1,158 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ require 'spec_helper'
7
+
8
+ describe 'DeepL::Constants' do
9
+ describe DeepL::Constants::Tone do
10
+ subject(:tone) { described_class }
11
+
12
+ it 'includes all expected tone values' do # rubocop:disable RSpec/ExampleLength
13
+ expect(tone.options).to contain_exactly(
14
+ 'confident',
15
+ 'default',
16
+ 'diplomatic',
17
+ 'enthusiastic',
18
+ 'friendly',
19
+ 'prefer_confident',
20
+ 'prefer_diplomatic',
21
+ 'prefer_enthusiastic',
22
+ 'prefer_friendly'
23
+ )
24
+ end
25
+
26
+ it 'validates correct tone values' do
27
+ expect(tone.valid?('enthusiastic')).to be true
28
+ expect(tone.valid?('friendly')).to be true
29
+ expect(tone.valid?('confident')).to be true
30
+ expect(tone.valid?('diplomatic')).to be true
31
+ expect(tone.valid?('default')).to be true
32
+ end
33
+
34
+ it 'invalidates incorrect tone values' do
35
+ expect(tone.valid?('angry')).to be false
36
+ expect(tone.valid?('')).to be false
37
+ expect(tone.valid?(nil)).to be false
38
+ end
39
+ end
40
+
41
+ describe DeepL::Constants::WritingStyle do
42
+ subject(:writing_style) { described_class }
43
+
44
+ it 'includes all expected writing style values' do # rubocop:disable RSpec/ExampleLength
45
+ expect(writing_style.options).to contain_exactly(
46
+ 'default',
47
+ 'simple',
48
+ 'business',
49
+ 'academic',
50
+ 'casual',
51
+ 'prefer_academic',
52
+ 'prefer_business',
53
+ 'prefer_casual',
54
+ 'prefer_simple'
55
+ )
56
+ end
57
+
58
+ it 'validates correct writing style values' do
59
+ expect(writing_style.valid?('simple')).to be true
60
+ expect(writing_style.valid?('business')).to be true
61
+ expect(writing_style.valid?('academic')).to be true
62
+ expect(writing_style.valid?('casual')).to be true
63
+ expect(writing_style.valid?('default')).to be true
64
+ end
65
+
66
+ it 'invalidates incorrect writing style values' do
67
+ expect(writing_style.valid?('wordy')).to be false
68
+ expect(writing_style.valid?('')).to be false
69
+ expect(writing_style.valid?(nil)).to be false
70
+ end
71
+ end
72
+
73
+ describe DeepL::Constants::TagHandling do
74
+ subject(:tag_handling) { described_class }
75
+
76
+ it 'includes all expected tag handling values' do
77
+ expect(tag_handling.options).to contain_exactly('xml', 'html')
78
+ end
79
+
80
+ it 'validates correct tag handling values' do
81
+ expect(tag_handling.valid?('xml')).to be true
82
+ expect(tag_handling.valid?('html')).to be true
83
+ end
84
+
85
+ it 'invalidates incorrect tag handling values' do
86
+ expect(tag_handling.valid?('json')).to be false
87
+ expect(tag_handling.valid?('')).to be false
88
+ expect(tag_handling.valid?(nil)).to be false
89
+ end
90
+ end
91
+
92
+ describe DeepL::Constants::SplitSentences do
93
+ subject(:split_sentences) { described_class }
94
+
95
+ it 'includes all expected split sentences values' do
96
+ expect(split_sentences.options).to contain_exactly('0', '1', 'nonewlines')
97
+ end
98
+
99
+ it 'validates correct split sentences values' do
100
+ expect(split_sentences.valid?('0')).to be true
101
+ expect(split_sentences.valid?('1')).to be true
102
+ expect(split_sentences.valid?('nonewlines')).to be true
103
+ end
104
+
105
+ it 'invalidates incorrect split sentences values' do
106
+ expect(split_sentences.valid?('2')).to be false
107
+ expect(split_sentences.valid?('')).to be false
108
+ expect(split_sentences.valid?(nil)).to be false
109
+ end
110
+ end
111
+
112
+ describe DeepL::Constants::ModelType do
113
+ subject(:model_type) { described_class }
114
+
115
+ it 'includes all expected model type values' do
116
+ expect(model_type.options).to contain_exactly(
117
+ 'quality_optimized',
118
+ 'prefer_quality_optimized',
119
+ 'latency_optimized'
120
+ )
121
+ end
122
+
123
+ it 'validates correct model type values' do
124
+ expect(model_type.valid?('quality_optimized')).to be true
125
+ expect(model_type.valid?('prefer_quality_optimized')).to be true
126
+ expect(model_type.valid?('latency_optimized')).to be true
127
+ end
128
+
129
+ it 'invalidates incorrect model type values' do
130
+ expect(model_type.valid?('speed_optimized')).to be false
131
+ expect(model_type.valid?('')).to be false
132
+ expect(model_type.valid?(nil)).to be false
133
+ end
134
+ end
135
+
136
+ describe DeepL::Constants::Formality do
137
+ subject(:formality) { described_class }
138
+
139
+ it 'includes all expected formality values' do
140
+ expect(formality.options).to contain_exactly('default', 'more', 'less', 'prefer_more',
141
+ 'prefer_less')
142
+ end
143
+
144
+ it 'validates correct formality values' do
145
+ expect(formality.valid?('default')).to be true
146
+ expect(formality.valid?('more')).to be true
147
+ expect(formality.valid?('less')).to be true
148
+ expect(formality.valid?('prefer_more')).to be true
149
+ expect(formality.valid?('prefer_less')).to be true
150
+ end
151
+
152
+ it 'invalidates incorrect formality values' do
153
+ expect(formality.valid?('neutral')).to be false
154
+ expect(formality.valid?('')).to be false
155
+ expect(formality.valid?(nil)).to be false
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,401 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.deepl.com/v2/write/rephrase
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
9
+ himself transformed."],"target_lang":"EN"}'
10
+ headers:
11
+ Authorization:
12
+ - DeepL-Auth-Key VALID_TOKEN
13
+ User-Agent:
14
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
15
+ Content-Type:
16
+ - application/json
17
+ Accept-Encoding:
18
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
19
+ Accept:
20
+ - "*/*"
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ Date:
27
+ - Fri, 10 Jan 2025 07:00:45 GMT
28
+ Content-Type:
29
+ - application/json; charset=utf-8
30
+ Transfer-Encoding:
31
+ - chunked
32
+ Vary:
33
+ - Accept-Encoding
34
+ X-Trace-Id:
35
+ - '09daf98547c94050b68e39cf38b0fe7d'
36
+ Strict-Transport-Security:
37
+ - max-age=63072000; includeSubDomains; preload
38
+ Server-Timing:
39
+ - l7_lb_tls;dur=95, l7_lb_idle;dur=3, l7_lb_receive;dur=0, l7_lb_total;dur=378
40
+ Access-Control-Expose-Headers:
41
+ - Server-Timing, X-Trace-ID
42
+ body:
43
+ encoding: ASCII-8BIT
44
+ string: '{"improvements":[{"text":"When Gregor Samsa awoke one morning from
45
+ troubled dreams, he found himself transformed.","detected_source_language":"en","target_language":"en-US"}]}'
46
+ recorded_at: Fri, 10 Jan 2025 07:00:45 GMT
47
+ - request:
48
+ method: post
49
+ uri: https://api.deepl.com/v2/write/rephrase
50
+ body:
51
+ encoding: UTF-8
52
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
53
+ himself transformed.","He lay on his armour-like back, and if he lifted his
54
+ head a little"],"target_lang":"EN"}'
55
+ headers:
56
+ Authorization:
57
+ - DeepL-Auth-Key VALID_TOKEN
58
+ User-Agent:
59
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
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
+ response:
67
+ status:
68
+ code: 200
69
+ message: OK
70
+ headers:
71
+ Date:
72
+ - Fri, 10 Jan 2025 07:00:45 GMT
73
+ Content-Type:
74
+ - application/json; charset=utf-8
75
+ Transfer-Encoding:
76
+ - chunked
77
+ Vary:
78
+ - Accept-Encoding
79
+ X-Trace-Id:
80
+ - df25db169c5f4c198ff7b5a319a16669
81
+ Strict-Transport-Security:
82
+ - max-age=63072000; includeSubDomains; preload
83
+ Server-Timing:
84
+ - l7_lb_tls;dur=95, l7_lb_idle;dur=0, l7_lb_receive;dur=0, l7_lb_total;dur=423
85
+ Access-Control-Expose-Headers:
86
+ - Server-Timing, X-Trace-ID
87
+ body:
88
+ encoding: ASCII-8BIT
89
+ string: '{"improvements":[{"text":"When Gregor Samsa awoke one morning from
90
+ troubled dreams, he found himself transformed.","detected_source_language":"en","target_language":"en-US"},{"text":"He
91
+ lay on his armor-like back, and when he lifted his head a little","detected_source_language":"en","target_language":"en-US"}]}'
92
+ recorded_at: Fri, 10 Jan 2025 07:00:45 GMT
93
+ - request:
94
+ method: post
95
+ uri: https://api.deepl.com/v2/write/rephrase
96
+ body:
97
+ encoding: UTF-8
98
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
99
+ himself transformed."],"target_lang":"EN","tone":"friendly"}'
100
+ headers:
101
+ Authorization:
102
+ - DeepL-Auth-Key VALID_TOKEN
103
+ User-Agent:
104
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
105
+ Content-Type:
106
+ - application/json
107
+ Accept-Encoding:
108
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
109
+ Accept:
110
+ - "*/*"
111
+ response:
112
+ status:
113
+ code: 200
114
+ message: OK
115
+ headers:
116
+ Date:
117
+ - Fri, 10 Jan 2025 07:00:46 GMT
118
+ Content-Type:
119
+ - application/json; charset=utf-8
120
+ Transfer-Encoding:
121
+ - chunked
122
+ Vary:
123
+ - Accept-Encoding
124
+ X-Trace-Id:
125
+ - 14fdbaa36544495a993136451b65e52b
126
+ Strict-Transport-Security:
127
+ - max-age=63072000; includeSubDomains; preload
128
+ Server-Timing:
129
+ - l7_lb_tls;dur=94, l7_lb_idle;dur=0, l7_lb_receive;dur=0, l7_lb_total;dur=460
130
+ Access-Control-Expose-Headers:
131
+ - Server-Timing, X-Trace-ID
132
+ body:
133
+ encoding: ASCII-8BIT
134
+ string: '{"improvements":[{"text":"One morning, Gregor Samsa woke up from restless
135
+ dreams to find himself in a strange new form.","detected_source_language":"en","target_language":"en-US"}]}'
136
+ recorded_at: Fri, 10 Jan 2025 07:00:46 GMT
137
+ - request:
138
+ method: post
139
+ uri: https://api.deepl.com/v2/write/rephrase
140
+ body:
141
+ encoding: UTF-8
142
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
143
+ himself transformed.","He lay on his armour-like back, and if he lifted his
144
+ head a little"],"target_lang":"EN","tone":"friendly"}'
145
+ headers:
146
+ Authorization:
147
+ - DeepL-Auth-Key VALID_TOKEN
148
+ User-Agent:
149
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
150
+ Content-Type:
151
+ - application/json
152
+ Accept-Encoding:
153
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
154
+ Accept:
155
+ - "*/*"
156
+ response:
157
+ status:
158
+ code: 200
159
+ message: OK
160
+ headers:
161
+ Date:
162
+ - Fri, 10 Jan 2025 07:00:46 GMT
163
+ Content-Type:
164
+ - application/json; charset=utf-8
165
+ Transfer-Encoding:
166
+ - chunked
167
+ Vary:
168
+ - Accept-Encoding
169
+ X-Trace-Id:
170
+ - a31d9cca4073414c9be843fffed914c3
171
+ Strict-Transport-Security:
172
+ - max-age=63072000; includeSubDomains; preload
173
+ Server-Timing:
174
+ - l7_lb_tls;dur=93, l7_lb_idle;dur=1, l7_lb_receive;dur=0, l7_lb_total;dur=413
175
+ Access-Control-Expose-Headers:
176
+ - Server-Timing, X-Trace-ID
177
+ body:
178
+ encoding: ASCII-8BIT
179
+ string: '{"improvements":[{"text":"One morning, Gregor Samsa woke up from restless
180
+ dreams to find himself in a strange new form.","detected_source_language":"en","target_language":"en-US"},{"text":"He
181
+ was lying on his armor-like back, and if he lifted his head just a little
182
+ bit...","detected_source_language":"en","target_language":"en-US"}]}'
183
+ recorded_at: Fri, 10 Jan 2025 07:00:47 GMT
184
+ - request:
185
+ method: post
186
+ uri: https://api.deepl.com/v2/write/rephrase
187
+ body:
188
+ encoding: UTF-8
189
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
190
+ himself transformed."],"target_lang":"EN","writing_style":"business"}'
191
+ headers:
192
+ Authorization:
193
+ - DeepL-Auth-Key VALID_TOKEN
194
+ User-Agent:
195
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
196
+ Content-Type:
197
+ - application/json
198
+ Accept-Encoding:
199
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
200
+ Accept:
201
+ - "*/*"
202
+ response:
203
+ status:
204
+ code: 200
205
+ message: OK
206
+ headers:
207
+ Date:
208
+ - Fri, 10 Jan 2025 07:00:47 GMT
209
+ Content-Type:
210
+ - application/json; charset=utf-8
211
+ Transfer-Encoding:
212
+ - chunked
213
+ Vary:
214
+ - Accept-Encoding
215
+ X-Trace-Id:
216
+ - 58d0bbf1167f40b2a62f87c2a6d7dda3
217
+ Strict-Transport-Security:
218
+ - max-age=63072000; includeSubDomains; preload
219
+ Server-Timing:
220
+ - l7_lb_tls;dur=98, l7_lb_idle;dur=1, l7_lb_receive;dur=0, l7_lb_total;dur=385
221
+ Access-Control-Expose-Headers:
222
+ - Server-Timing, X-Trace-ID
223
+ body:
224
+ encoding: ASCII-8BIT
225
+ string: '{"improvements":[{"text":"Gregor Samsa awoke one morning, having had
226
+ disturbing dreams, to find himself transformed.","detected_source_language":"en","target_language":"en-US"}]}'
227
+ recorded_at: Fri, 10 Jan 2025 07:00:47 GMT
228
+ - request:
229
+ method: post
230
+ uri: https://api.deepl.com/v2/write/rephrase
231
+ body:
232
+ encoding: UTF-8
233
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
234
+ himself transformed.","He lay on his armour-like back, and if he lifted his
235
+ head a little"],"target_lang":"EN","writing_style":"business"}'
236
+ headers:
237
+ Authorization:
238
+ - DeepL-Auth-Key VALID_TOKEN
239
+ User-Agent:
240
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
241
+ Content-Type:
242
+ - application/json
243
+ Accept-Encoding:
244
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
245
+ Accept:
246
+ - "*/*"
247
+ response:
248
+ status:
249
+ code: 200
250
+ message: OK
251
+ headers:
252
+ Date:
253
+ - Fri, 10 Jan 2025 07:00:48 GMT
254
+ Content-Type:
255
+ - application/json; charset=utf-8
256
+ Transfer-Encoding:
257
+ - chunked
258
+ Vary:
259
+ - Accept-Encoding
260
+ X-Trace-Id:
261
+ - 37a69ff78833465cbc9ddadd4f9aca36
262
+ Strict-Transport-Security:
263
+ - max-age=63072000; includeSubDomains; preload
264
+ Server-Timing:
265
+ - l7_lb_tls;dur=96, l7_lb_idle;dur=0, l7_lb_receive;dur=0, l7_lb_total;dur=374
266
+ Access-Control-Expose-Headers:
267
+ - Server-Timing, X-Trace-ID
268
+ body:
269
+ encoding: ASCII-8BIT
270
+ string: '{"improvements":[{"text":"Gregor Samsa awoke one morning, having had
271
+ disturbing dreams, to find himself transformed.","detected_source_language":"en","target_language":"en-US"},{"text":"He
272
+ was positioned on his back, which was similar to armor. If he lifted his head
273
+ slightly,","detected_source_language":"en","target_language":"en-US"}]}'
274
+ recorded_at: Fri, 10 Jan 2025 07:00:48 GMT
275
+ - request:
276
+ method: post
277
+ uri: https://api.deepl.com/v2/write/rephrase
278
+ body:
279
+ encoding: UTF-8
280
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
281
+ himself transformed."],"target_lang":"EN","writing_style":"angry"}'
282
+ headers:
283
+ Authorization:
284
+ - DeepL-Auth-Key VALID_TOKEN
285
+ User-Agent:
286
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
287
+ Content-Type:
288
+ - application/json
289
+ Accept-Encoding:
290
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
291
+ Accept:
292
+ - "*/*"
293
+ response:
294
+ status:
295
+ code: 400
296
+ message: Bad Request
297
+ headers:
298
+ Date:
299
+ - Fri, 10 Jan 2025 07:00:48 GMT
300
+ Content-Type:
301
+ - application/json; charset=utf-8
302
+ Transfer-Encoding:
303
+ - chunked
304
+ X-Trace-Id:
305
+ - b406cc026c004d4c80d76131df636d8a
306
+ Strict-Transport-Security:
307
+ - max-age=63072000; includeSubDomains; preload
308
+ Server-Timing:
309
+ - l7_lb_tls;dur=98, l7_lb_idle;dur=1, l7_lb_receive;dur=0, l7_lb_total;dur=109
310
+ Access-Control-Expose-Headers:
311
+ - Server-Timing, X-Trace-ID
312
+ body:
313
+ encoding: UTF-8
314
+ string: '{"message":"Bad request. Reason: Unsupported value for field writing_style."}'
315
+ recorded_at: Fri, 10 Jan 2025 07:00:48 GMT
316
+ - request:
317
+ method: post
318
+ uri: https://api.deepl.com/v2/write/rephrase
319
+ body:
320
+ encoding: UTF-8
321
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
322
+ himself transformed."],"target_lang":"EN","writing_style":"business","tone":"friendly"}'
323
+ headers:
324
+ Authorization:
325
+ - DeepL-Auth-Key VALID_TOKEN
326
+ User-Agent:
327
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
328
+ Content-Type:
329
+ - application/json
330
+ Accept-Encoding:
331
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
332
+ Accept:
333
+ - "*/*"
334
+ response:
335
+ status:
336
+ code: 400
337
+ message: Bad Request
338
+ headers:
339
+ Date:
340
+ - Fri, 10 Jan 2025 07:00:48 GMT
341
+ Content-Type:
342
+ - application/json; charset=utf-8
343
+ Transfer-Encoding:
344
+ - chunked
345
+ X-Trace-Id:
346
+ - 1b7680d714c24de49ded702b382c69b0
347
+ Strict-Transport-Security:
348
+ - max-age=63072000; includeSubDomains; preload
349
+ Server-Timing:
350
+ - l7_lb_tls;dur=98, l7_lb_idle;dur=1, l7_lb_receive;dur=0, l7_lb_total;dur=105
351
+ Access-Control-Expose-Headers:
352
+ - Server-Timing, X-Trace-ID
353
+ body:
354
+ encoding: UTF-8
355
+ string: '{"message":"Bad request. Reason: Both writing_style and tone defined.
356
+ Currently only style OR tone can be chosen for a single request.."}'
357
+ recorded_at: Fri, 10 Jan 2025 07:00:48 GMT
358
+ - request:
359
+ method: post
360
+ uri: https://api.deepl.com/v2/write/rephrase
361
+ body:
362
+ encoding: UTF-8
363
+ string: '{"text":["As Gregor Samsa awoke one morning from uneasy dreams he found
364
+ himself transformed."],"target_lang":"EN"}'
365
+ headers:
366
+ Authorization:
367
+ - DeepL-Auth-Key invalid
368
+ User-Agent:
369
+ - deepl-ruby/3.0.2 (darwin24) ruby/3.3.0
370
+ Content-Type:
371
+ - application/json
372
+ Accept-Encoding:
373
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
374
+ Accept:
375
+ - "*/*"
376
+ response:
377
+ status:
378
+ code: 403
379
+ message: Forbidden
380
+ headers:
381
+ Date:
382
+ - Fri, 10 Jan 2025 07:00:48 GMT
383
+ Content-Type:
384
+ - application/json; charset=utf-8
385
+ Transfer-Encoding:
386
+ - chunked
387
+ Vary:
388
+ - Accept-Encoding
389
+ X-Trace-Id:
390
+ - 568ef89e665f499ebcbc62b90ba09019
391
+ Strict-Transport-Security:
392
+ - max-age=63072000; includeSubDomains; preload
393
+ Server-Timing:
394
+ - l7_lb_tls;dur=121, l7_lb_idle;dur=1, l7_lb_receive;dur=0, l7_lb_total;dur=132
395
+ Access-Control-Expose-Headers:
396
+ - Server-Timing, X-Trace-ID
397
+ body:
398
+ encoding: ASCII-8BIT
399
+ string: '{"message":"Invalid API key."}'
400
+ recorded_at: Fri, 10 Jan 2025 07:00:48 GMT
401
+ recorded_with: VCR 6.3.1
@@ -0,0 +1,172 @@
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.md file.
4
+ # frozen_string_literal: true
5
+
6
+ require 'spec_helper'
7
+
8
+ describe DeepL::Requests::Rephrase do
9
+ subject(:rephrase) { described_class.new(api, text, target_lang, writing_style, tone, options) }
10
+
11
+ around do |tests|
12
+ tmp_env = replace_env_preserving_deepl_vars_except_mock_server
13
+ tests.call
14
+ ENV.replace(tmp_env)
15
+ end
16
+
17
+ let(:api) { build_deepl_api }
18
+ let(:text) do
19
+ 'As Gregor Samsa awoke one morning from uneasy dreams he found himself transformed.'
20
+ end
21
+ let(:target_lang) { 'EN' }
22
+ let(:writing_style) { nil }
23
+ let(:tone) { nil }
24
+ let(:options) { {} }
25
+
26
+ describe '#request' do
27
+ around do |example|
28
+ VCR.use_cassette('rephrase_texts') { example.call }
29
+ end
30
+
31
+ context 'without a style or tone applied' do
32
+ context 'with a string as input' do
33
+ it 'returns a valid response as a DeepL Text resource' do
34
+ original_length = text.length
35
+ response_text = rephrase.request
36
+
37
+ expect(response_text).to be_a(DeepL::Resources::Text)
38
+ expect(response_text.text.length).not_to eq(original_length)
39
+ expect(response_text.detected_source_language.upcase).to eq('EN')
40
+ end
41
+ end
42
+
43
+ context 'with an array of texts as input' do
44
+ let(:text) do
45
+ [
46
+ 'As Gregor Samsa awoke one morning from uneasy dreams he found himself transformed.',
47
+ 'He lay on his armour-like back, and if he lifted his head a little'
48
+ ]
49
+ end
50
+
51
+ it 'returns a valid response as an array of DeepL Text resources' do
52
+ response_texts = rephrase.request
53
+
54
+ expect(response_texts).to all(be_a(DeepL::Resources::Text))
55
+ response_texts.each_with_index do |response_text, index|
56
+ expect(response_text.text.length).not_to eq(text[index].length)
57
+ expect(response_text.detected_source_language.upcase).to eq('EN')
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ context 'with a valid tone applied' do
64
+ let(:tone) { 'friendly' }
65
+
66
+ context 'with a string as input' do
67
+ it 'returns a valid response with a string as text input' do
68
+ original_length = text.length
69
+ response_text = rephrase.request
70
+
71
+ expect(response_text).to be_a(DeepL::Resources::Text)
72
+ expect(response_text.text.length).not_to eq(original_length)
73
+ expect(response_text.detected_source_language.upcase).to eq('EN')
74
+ end
75
+ end
76
+
77
+ context 'with an array of texts as input' do
78
+ let(:text) do
79
+ [
80
+ 'As Gregor Samsa awoke one morning from uneasy dreams he found himself transformed.',
81
+ 'He lay on his armour-like back, and if he lifted his head a little'
82
+ ]
83
+ end
84
+
85
+ it 'returns an array of valid text objects' do
86
+ response_texts = rephrase.request
87
+
88
+ expect(response_texts).to all(be_a(DeepL::Resources::Text))
89
+ response_texts.each_with_index do |response_text, index|
90
+ expect(response_text.text.length).not_to eq(text[index].length)
91
+ expect(response_text.detected_source_language.upcase).to eq('EN')
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ context 'with a valid writing style applied' do
98
+ let(:writing_style) { 'business' }
99
+
100
+ context 'with a string as input' do
101
+ it 'returns a valid response with a string as text input' do
102
+ original_length = text.length
103
+ response_text = rephrase.request
104
+
105
+ expect(response_text).to be_a(DeepL::Resources::Text)
106
+ expect(response_text.text.length).not_to eq(original_length)
107
+ expect(response_text.detected_source_language.upcase).to eq('EN')
108
+ end
109
+ end
110
+
111
+ context 'with an array of texts as input' do
112
+ let(:text) do
113
+ [
114
+ 'As Gregor Samsa awoke one morning from uneasy dreams he found himself transformed.',
115
+ 'He lay on his armour-like back, and if he lifted his head a little'
116
+ ]
117
+ end
118
+
119
+ it 'returns an array of valid text objects' do
120
+ response_texts = rephrase.request
121
+
122
+ expect(response_texts).to all(be_a(DeepL::Resources::Text))
123
+ response_texts.each_with_index do |response_text, index|
124
+ expect(response_text.text.length).not_to eq(text[index].length)
125
+ expect(response_text.detected_source_language.upcase).to eq('EN')
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ context 'with a writing style or tone from the provided constants applied' do
132
+ let(:writing_style) { DeepL::Constants::WritingStyle::BUSINESS }
133
+ let(:tone) { DeepL::Constants::Tone::FRIENDLY }
134
+
135
+ it 'has the correct writing style and tone applied' do
136
+ expect(rephrase.writing_style).to eq('business')
137
+ expect(rephrase.tone).to eq('friendly')
138
+ end
139
+ end
140
+
141
+ context 'with an invalid writing style applied' do
142
+ let(:writing_style) { 'angry' }
143
+
144
+ it 'raises a bad request error' do
145
+ expect { rephrase.request }.to raise_error(DeepL::Exceptions::BadRequest)
146
+ end
147
+ end
148
+
149
+ context 'when both writing style and tone are applied' do
150
+ let(:writing_style) { 'business' }
151
+ let(:tone) { 'friendly' }
152
+
153
+ it 'raises a bad request error' do
154
+ expect { rephrase.request }.to raise_error(DeepL::Exceptions::BadRequest)
155
+ end
156
+ end
157
+
158
+ context 'when performing a bad request' do
159
+ context 'when using an invalid token' do
160
+ let(:api) do
161
+ api = build_deepl_api
162
+ api.configuration.auth_key = 'invalid'
163
+ api
164
+ end
165
+
166
+ it 'raises an unauthorized error' do
167
+ expect { rephrase.request }.to raise_error(DeepL::Exceptions::AuthorizationFailed)
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
@@ -121,6 +121,17 @@ describe DeepL::Requests::Translate do
121
121
  request = described_class.new(api, nil, nil, nil, split_sentences: '1')
122
122
  expect(request.options[:split_sentences]).to eq('1')
123
123
  end
124
+
125
+ it 'works with provided constants' do
126
+ request = described_class.new(
127
+ api,
128
+ nil,
129
+ nil,
130
+ nil,
131
+ split_sentences: DeepL::Constants::SplitSentences::SPLIT_ON_PUNCTUATION_AND_NEWLINES
132
+ )
133
+ expect(request.options[:split_sentences]).to eq('1')
134
+ end
124
135
  end
125
136
 
126
137
  context 'when using `preserve_formatting` options' do
@@ -189,6 +200,12 @@ describe DeepL::Requests::Translate do
189
200
  request = described_class.new(api, nil, nil, nil, formality: 'more')
190
201
  expect(request.options[:formality]).to eq('more')
191
202
  end
203
+
204
+ it 'works with provided constants' do
205
+ request = described_class.new(api, nil, nil, nil,
206
+ formality: DeepL::Constants::Formality::MORE)
207
+ expect(request.options[:formality]).to eq('more')
208
+ end
192
209
  end
193
210
 
194
211
  context 'when using `model_type` options' do
@@ -201,6 +218,12 @@ describe DeepL::Requests::Translate do
201
218
  request = described_class.new(api, nil, nil, nil, model_type: 'latency_optimized')
202
219
  expect(request.options[:model_type]).to eq('latency_optimized')
203
220
  end
221
+
222
+ it 'works with provided constants' do
223
+ request = described_class.new(api, nil, nil, nil,
224
+ model_type: DeepL::Constants::ModelType::LATENCY_OPTIMIZED)
225
+ expect(request.options[:model_type]).to eq('latency_optimized')
226
+ end
204
227
  end
205
228
  end
206
229
 
data/spec/spec_helper.rb CHANGED
@@ -57,9 +57,13 @@ VCR.configure do |config|
57
57
  config.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
58
58
  config.hook_into :webmock
59
59
  config.filter_sensitive_data('VALID_TOKEN') { ENV.fetch('DEEPL_AUTH_KEY', nil) }
60
+
61
+ # to record new or missing VCR cassettes, call rspec like this:
62
+ # $ VCR_RECORD_MODE=new_episodes bundle exec rspec
63
+
64
+ record_mode = ENV['VCR_RECORD_MODE'] ? ENV['VCR_RECORD_MODE'].to_sym : :none
60
65
  config.default_cassette_options = {
61
- # Uncomment this line when adding new tests, run the tests once, then comment it again
62
- # record: :new_episodes,
66
+ record: record_mode,
63
67
  match_requests_on: [:method, uri_ignoring_deepl_api_subdomain, :body,
64
68
  headers_ignoring_user_agent]
65
69
  }
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.1.0
4
+ version: 3.2.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: 2024-11-15 00:00:00.000000000 Z
11
+ date: 2025-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: juwelier
@@ -66,6 +66,13 @@ files:
66
66
  - lib/deepl.rb
67
67
  - lib/deepl/api.rb
68
68
  - lib/deepl/configuration.rb
69
+ - lib/deepl/constants/base_constant.rb
70
+ - lib/deepl/constants/formality.rb
71
+ - lib/deepl/constants/model_type.rb
72
+ - lib/deepl/constants/split_sentences.rb
73
+ - lib/deepl/constants/tag_handling.rb
74
+ - lib/deepl/constants/tone.rb
75
+ - lib/deepl/constants/writing_style.rb
69
76
  - lib/deepl/document_api.rb
70
77
  - lib/deepl/exceptions/authorization_failed.rb
71
78
  - lib/deepl/exceptions/bad_request.rb
@@ -90,6 +97,7 @@ files:
90
97
  - lib/deepl/requests/glossary/language_pairs.rb
91
98
  - lib/deepl/requests/glossary/list.rb
92
99
  - lib/deepl/requests/languages.rb
100
+ - lib/deepl/requests/rephrase.rb
93
101
  - lib/deepl/requests/translate.rb
94
102
  - lib/deepl/requests/usage.rb
95
103
  - lib/deepl/resources/base.rb
@@ -107,6 +115,7 @@ files:
107
115
  - spec/api/api_spec.rb
108
116
  - spec/api/configuration_spec.rb
109
117
  - spec/api/deepl_spec.rb
118
+ - spec/constants/constants_spec.rb
110
119
  - spec/fixtures/vcr_cassettes/deepl_document.yml
111
120
  - spec/fixtures/vcr_cassettes/deepl_document_download.yml
112
121
  - spec/fixtures/vcr_cassettes/deepl_glossaries.yml
@@ -115,6 +124,7 @@ files:
115
124
  - spec/fixtures/vcr_cassettes/deepl_usage.yml
116
125
  - spec/fixtures/vcr_cassettes/glossaries.yml
117
126
  - spec/fixtures/vcr_cassettes/languages.yml
127
+ - spec/fixtures/vcr_cassettes/rephrase_texts.yml
118
128
  - spec/fixtures/vcr_cassettes/translate_texts.yml
119
129
  - spec/fixtures/vcr_cassettes/usage.yml
120
130
  - spec/integration_tests/document_api_spec.rb
@@ -126,6 +136,7 @@ files:
126
136
  - spec/requests/glossary/language_pairs_spec.rb
127
137
  - spec/requests/glossary/list_spec.rb
128
138
  - spec/requests/languages_spec.rb
139
+ - spec/requests/rephrase_spec.rb
129
140
  - spec/requests/translate_spec.rb
130
141
  - spec/requests/usage_spec.rb
131
142
  - spec/resources/glossary_spec.rb
@@ -157,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
168
  - !ruby/object:Gem::Version
158
169
  version: '0'
159
170
  requirements: []
160
- rubygems_version: 3.4.6
171
+ rubygems_version: 3.5.3
161
172
  signing_key:
162
173
  specification_version: 4
163
174
  summary: Official Ruby library for the DeepL language translation API.