deepl-rb 3.9.0 → 3.10.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 (237) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab-ci.yml +70 -52
  3. data/.rubocop.yml +26 -0
  4. data/CHANGELOG.md +429 -18
  5. data/Gemfile +4 -0
  6. data/README.md +981 -223
  7. data/Rakefile +18 -5
  8. data/VERSION +1 -1
  9. data/deepl-rb.gemspec +6 -6
  10. data/lib/deepl/admin_client.rb +183 -0
  11. data/lib/deepl/api.rb +30 -6
  12. data/lib/deepl/app_info.rb +20 -0
  13. data/lib/deepl/client.rb +969 -0
  14. data/lib/deepl/configuration.rb +56 -10
  15. data/lib/deepl/constants/admin_usage_group_by.rb +13 -0
  16. data/lib/deepl/constants/custom_tag_usage_aggregate_by.rb +13 -0
  17. data/lib/deepl/constants/document_status_code.rb +17 -0
  18. data/lib/deepl/constants/language_include.rb +17 -0
  19. data/lib/deepl/constants/language_resource_name.rb +21 -0
  20. data/lib/deepl/constants/tag_handling_version.rb +14 -0
  21. data/lib/deepl/deprecation.rb +42 -0
  22. data/lib/deepl/document_api.rb +41 -22
  23. data/lib/deepl/exceptions/bad_request.rb +1 -3
  24. data/lib/deepl/exceptions/connection_error.rb +37 -0
  25. data/lib/deepl/exceptions/document_not_ready_error.rb +17 -0
  26. data/lib/deepl/exceptions/document_translation_error.rb +17 -1
  27. data/lib/deepl/exceptions/error.rb +13 -1
  28. data/lib/deepl/exceptions/not_found.rb +8 -3
  29. data/lib/deepl/exceptions/not_supported.rb +6 -0
  30. data/lib/deepl/exceptions/request_error.rb +19 -2
  31. data/lib/deepl/exceptions/server_error.rb +7 -1
  32. data/lib/deepl/exceptions/validation_error.rb +14 -0
  33. data/lib/deepl/requests/admin/base.rb +94 -0
  34. data/lib/deepl/requests/admin/create_developer_key.rb +38 -0
  35. data/lib/deepl/requests/admin/custom_tag_usage_analytics.rb +38 -0
  36. data/lib/deepl/requests/admin/list_developer_keys.rb +28 -0
  37. data/lib/deepl/requests/admin/update_developer_key.rb +35 -0
  38. data/lib/deepl/requests/admin/usage_analytics.rb +36 -0
  39. data/lib/deepl/requests/base.rb +229 -59
  40. data/lib/deepl/requests/correct.rb +57 -0
  41. data/lib/deepl/requests/document/download.rb +11 -3
  42. data/lib/deepl/requests/document/get_status.rb +2 -2
  43. data/lib/deepl/requests/document/upload.rb +43 -10
  44. data/lib/deepl/requests/glossary/create.rb +6 -2
  45. data/lib/deepl/requests/glossary/language_pairs.rb +20 -4
  46. data/lib/deepl/requests/language_resources.rb +41 -0
  47. data/lib/deepl/requests/languages.rb +28 -4
  48. data/lib/deepl/requests/languages_for_resource.rb +54 -0
  49. data/lib/deepl/requests/multilingual_glossary/create.rb +37 -0
  50. data/lib/deepl/requests/multilingual_glossary/destroy.rb +36 -0
  51. data/lib/deepl/requests/multilingual_glossary/destroy_dictionary.rb +51 -0
  52. data/lib/deepl/requests/multilingual_glossary/entries.rb +66 -0
  53. data/lib/deepl/requests/multilingual_glossary/find.rb +35 -0
  54. data/lib/deepl/requests/multilingual_glossary/helpers.rb +63 -0
  55. data/lib/deepl/requests/multilingual_glossary/list.rb +39 -0
  56. data/lib/deepl/requests/multilingual_glossary/replace_dictionary.rb +41 -0
  57. data/lib/deepl/requests/multilingual_glossary/update.rb +40 -0
  58. data/lib/deepl/requests/rephrase.rb +5 -9
  59. data/lib/deepl/requests/spoken_terms/create.rb +37 -0
  60. data/lib/deepl/requests/spoken_terms/destroy.rb +36 -0
  61. data/lib/deepl/requests/spoken_terms/destroy_term_list.rb +41 -0
  62. data/lib/deepl/requests/spoken_terms/entries.rb +46 -0
  63. data/lib/deepl/requests/spoken_terms/find.rb +35 -0
  64. data/lib/deepl/requests/spoken_terms/helpers.rb +67 -0
  65. data/lib/deepl/requests/spoken_terms/list.rb +35 -0
  66. data/lib/deepl/requests/spoken_terms/replace_term_list.rb +41 -0
  67. data/lib/deepl/requests/spoken_terms/update.rb +40 -0
  68. data/lib/deepl/requests/style_profile/base.rb +83 -0
  69. data/lib/deepl/requests/style_profile/create.rb +35 -0
  70. data/lib/deepl/requests/style_profile/destroy.rb +34 -0
  71. data/lib/deepl/requests/style_profile/find.rb +33 -0
  72. data/lib/deepl/requests/style_profile/list.rb +43 -0
  73. data/lib/deepl/requests/style_profile/update.rb +35 -0
  74. data/lib/deepl/requests/style_rule/create.rb +1 -1
  75. data/lib/deepl/requests/style_rule/create_custom_instruction.rb +4 -2
  76. data/lib/deepl/requests/style_rule/destroy.rb +4 -2
  77. data/lib/deepl/requests/style_rule/destroy_custom_instruction.rb +5 -3
  78. data/lib/deepl/requests/style_rule/find.rb +4 -2
  79. data/lib/deepl/requests/style_rule/find_custom_instruction.rb +5 -3
  80. data/lib/deepl/requests/style_rule/helpers.rb +35 -0
  81. data/lib/deepl/requests/style_rule/list.rb +1 -1
  82. data/lib/deepl/requests/style_rule/update.rb +4 -2
  83. data/lib/deepl/requests/style_rule/update_configured_rules.rb +4 -2
  84. data/lib/deepl/requests/style_rule/update_custom_instruction.rb +5 -3
  85. data/lib/deepl/requests/translate.rb +52 -20
  86. data/lib/deepl/requests/translation_memory/base.rb +1 -4
  87. data/lib/deepl/requests/translation_memory/create_export.rb +1 -1
  88. data/lib/deepl/requests/translation_memory/create_import.rb +1 -1
  89. data/lib/deepl/requests/translation_memory/destroy.rb +1 -1
  90. data/lib/deepl/requests/translation_memory/download_export.rb +4 -0
  91. data/lib/deepl/requests/translation_memory/find.rb +1 -1
  92. data/lib/deepl/requests/translation_memory/find_job.rb +1 -1
  93. data/lib/deepl/requests/translation_memory/list.rb +2 -1
  94. data/lib/deepl/requests/translation_memory/segments.rb +3 -2
  95. data/lib/deepl/requests/translation_memory/storage_base.rb +40 -8
  96. data/lib/deepl/requests/translation_memory/upload_file.rb +1 -1
  97. data/lib/deepl/requests/usage.rb +28 -1
  98. data/lib/deepl/requests/write_improvements.rb +35 -0
  99. data/lib/deepl/resources/admin_usage_report.rb +73 -0
  100. data/lib/deepl/resources/custom_tag_usage_report.rb +59 -0
  101. data/lib/deepl/resources/developer_key.rb +57 -0
  102. data/lib/deepl/resources/document_handle.rb +24 -25
  103. data/lib/deepl/resources/document_translation_status.rb +23 -4
  104. data/lib/deepl/resources/language.rb +10 -2
  105. data/lib/deepl/resources/language_resource.rb +57 -0
  106. data/lib/deepl/resources/language_support.rb +56 -0
  107. data/lib/deepl/resources/multilingual_glossary.rb +112 -0
  108. data/lib/deepl/resources/spoken_terms.rb +61 -0
  109. data/lib/deepl/resources/style_profile.rb +44 -0
  110. data/lib/deepl/resources/style_rule.rb +3 -0
  111. data/lib/deepl/resources/text.rb +18 -2
  112. data/lib/deepl/resources/translation_memory.rb +8 -2
  113. data/lib/deepl/resources/translation_memory_import.rb +1 -1
  114. data/lib/deepl/resources/translation_memory_job.rb +23 -3
  115. data/lib/deepl/resources/translation_memory_segments.rb +8 -6
  116. data/lib/deepl/resources/usage.rb +93 -4
  117. data/lib/deepl/style_rule_api.rb +11 -0
  118. data/lib/deepl/translation_memory_api.rb +104 -24
  119. data/lib/deepl/utils/client_builder.rb +54 -0
  120. data/lib/deepl/utils/document_poller.rb +70 -0
  121. data/lib/deepl/utils/exception_builder.rb +3 -2
  122. data/lib/deepl/utils/http_client_builder.rb +79 -0
  123. data/lib/deepl/utils/number_parser.rb +34 -0
  124. data/lib/deepl/utils/term_validator.rb +33 -0
  125. data/lib/deepl/utils/time_parser.rb +14 -0
  126. data/lib/deepl.rb +166 -41
  127. data/lib/http_client_options.rb +21 -1
  128. data/lib/version.rb +1 -1
  129. data/spec/fixtures.rb +33 -0
  130. data/spec/offline/admin_client_spec.rb +551 -0
  131. data/spec/offline/client_spec.rb +273 -0
  132. data/spec/{api → offline}/configuration_spec.rb +45 -3
  133. data/spec/{constants → offline}/constants_spec.rb +23 -1
  134. data/spec/offline/correct_text_spec.rb +50 -0
  135. data/spec/offline/deprecation_spec.rb +32 -0
  136. data/spec/offline/errors_spec.rb +92 -0
  137. data/spec/offline/glossaries_spec.rb +98 -0
  138. data/spec/offline/http_client_spec.rb +319 -0
  139. data/spec/offline/languages_spec.rb +155 -0
  140. data/spec/offline/module_methods_spec.rb +13 -0
  141. data/spec/offline/multilingual_glossaries_spec.rb +358 -0
  142. data/spec/offline/offline_helper.rb +71 -0
  143. data/spec/offline/rephrase_text_spec.rb +73 -0
  144. data/spec/offline/spoken_terms_spec.rb +215 -0
  145. data/spec/offline/style_profiles_spec.rb +266 -0
  146. data/spec/offline/style_rules_spec.rb +318 -0
  147. data/spec/offline/translate_document_spec.rb +606 -0
  148. data/spec/offline/translate_text_spec.rb +286 -0
  149. data/spec/offline/translation_memories_client_spec.rb +256 -0
  150. data/spec/offline/translation_memories_spec.rb +463 -0
  151. data/spec/offline/usage_spec.rb +151 -0
  152. data/spec/real_api/admin_client_spec.rb +77 -0
  153. data/spec/real_api/correct_text_spec.rb +20 -0
  154. data/spec/real_api/glossaries_spec.rb +28 -0
  155. data/spec/real_api/languages_spec.rb +27 -0
  156. data/spec/real_api/multilingual_glossaries_spec.rb +53 -0
  157. data/spec/real_api/proxy_spec.rb +41 -0
  158. data/spec/real_api/real_api_helper.rb +65 -0
  159. data/spec/real_api/rephrase_text_spec.rb +16 -0
  160. data/spec/real_api/spoken_terms_spec.rb +56 -0
  161. data/spec/real_api/style_profiles_spec.rb +46 -0
  162. data/spec/real_api/style_rules_spec.rb +46 -0
  163. data/spec/real_api/translate_document_spec.rb +18 -0
  164. data/spec/real_api/translate_text_spec.rb +16 -0
  165. data/spec/real_api/translation_memories_spec.rb +56 -0
  166. data/spec/real_api/usage_spec.rb +20 -0
  167. data/spec/spec_helper.rb +1 -50
  168. metadata +116 -76
  169. data/.circleci/config.yml +0 -27
  170. data/.github/workflows/add_issues_to_kanban.yml +0 -16
  171. data/spec/api/api_spec.rb +0 -20
  172. data/spec/api/deepl_spec.rb +0 -262
  173. data/spec/integration_tests/document_api_spec.rb +0 -211
  174. data/spec/integration_tests/document_error_paths_spec.rb +0 -33
  175. data/spec/integration_tests/glossary_api_spec.rb +0 -114
  176. data/spec/integration_tests/glossary_error_paths_spec.rb +0 -107
  177. data/spec/integration_tests/integration_test_utils.rb +0 -178
  178. data/spec/integration_tests/languages_api_spec.rb +0 -54
  179. data/spec/integration_tests/languages_error_paths_spec.rb +0 -25
  180. data/spec/integration_tests/rephrase_api_spec.rb +0 -90
  181. data/spec/integration_tests/rephrase_error_paths_spec.rb +0 -53
  182. data/spec/integration_tests/smoke_test_spec.rb +0 -24
  183. data/spec/integration_tests/style_rule_api_spec.rb +0 -117
  184. data/spec/integration_tests/style_rule_error_paths_spec.rb +0 -45
  185. data/spec/integration_tests/translate_api_spec.rb +0 -117
  186. data/spec/integration_tests/translate_error_paths_spec.rb +0 -48
  187. data/spec/integration_tests/translation_memory_api_spec.rb +0 -244
  188. data/spec/integration_tests/translation_memory_error_paths_spec.rb +0 -87
  189. data/spec/integration_tests/usage_api_spec.rb +0 -29
  190. data/spec/integration_tests/usage_error_paths_spec.rb +0 -18
  191. data/spec/requests/document/upload_spec.rb +0 -130
  192. data/spec/requests/extra_body_parameters_types_spec.rb +0 -82
  193. data/spec/requests/glossary/create_spec.rb +0 -44
  194. data/spec/requests/glossary/destroy_spec.rb +0 -27
  195. data/spec/requests/glossary/entries_spec.rb +0 -27
  196. data/spec/requests/glossary/find_spec.rb +0 -28
  197. data/spec/requests/glossary/language_pairs_spec.rb +0 -27
  198. data/spec/requests/glossary/list_spec.rb +0 -27
  199. data/spec/requests/languages_spec.rb +0 -27
  200. data/spec/requests/rephrase_spec.rb +0 -46
  201. data/spec/requests/style_rule/create_custom_instruction_spec.rb +0 -30
  202. data/spec/requests/style_rule/create_spec.rb +0 -29
  203. data/spec/requests/style_rule/destroy_custom_instruction_spec.rb +0 -28
  204. data/spec/requests/style_rule/destroy_spec.rb +0 -27
  205. data/spec/requests/style_rule/find_custom_instruction_spec.rb +0 -29
  206. data/spec/requests/style_rule/find_spec.rb +0 -28
  207. data/spec/requests/style_rule/list_spec.rb +0 -27
  208. data/spec/requests/style_rule/update_configured_rules_spec.rb +0 -31
  209. data/spec/requests/style_rule/update_custom_instruction_spec.rb +0 -32
  210. data/spec/requests/style_rule/update_spec.rb +0 -29
  211. data/spec/requests/translate_spec.rb +0 -338
  212. data/spec/requests/translation_memory/create_export_spec.rb +0 -37
  213. data/spec/requests/translation_memory/create_import_spec.rb +0 -61
  214. data/spec/requests/translation_memory/destroy_spec.rb +0 -36
  215. data/spec/requests/translation_memory/download_export_spec.rb +0 -54
  216. data/spec/requests/translation_memory/find_job_spec.rb +0 -37
  217. data/spec/requests/translation_memory/find_spec.rb +0 -36
  218. data/spec/requests/translation_memory/list_spec.rb +0 -27
  219. data/spec/requests/translation_memory/segments_spec.rb +0 -58
  220. data/spec/requests/translation_memory/upload_file_spec.rb +0 -55
  221. data/spec/requests/usage_spec.rb +0 -27
  222. data/spec/resources/custom_instruction_spec.rb +0 -32
  223. data/spec/resources/glossary_spec.rb +0 -38
  224. data/spec/resources/language_pair_spec.rb +0 -23
  225. data/spec/resources/language_spec.rb +0 -45
  226. data/spec/resources/style_rule_spec.rb +0 -68
  227. data/spec/resources/text_spec.rb +0 -23
  228. data/spec/resources/translation_memory_export_spec.rb +0 -38
  229. data/spec/resources/translation_memory_import_spec.rb +0 -30
  230. data/spec/resources/translation_memory_job_spec.rb +0 -109
  231. data/spec/resources/translation_memory_segments_spec.rb +0 -78
  232. data/spec/resources/translation_memory_spec.rb +0 -52
  233. data/spec/resources/usage_spec.rb +0 -35
  234. data/spec/support/live_mock_server.rb +0 -12
  235. data/spec/support/managed_glossary.rb +0 -65
  236. data/spec/support/managed_style_rule.rb +0 -17
  237. data/spec/support/managed_translation_memory.rb +0 -55
@@ -1,55 +0,0 @@
1
- # Copyright 2026 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::TranslationMemory::UploadFile do
9
- subject(:upload_file) { described_class.new(api, upload_url, file_content) }
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(:upload_url) { 'https://storage.example.com/upload/tm?signature=abc' }
19
- let(:file_content) { '<tmx version="1.4"/>' }
20
-
21
- describe '#initialize' do
22
- context 'when building a request' do
23
- it 'creates a request object' do
24
- expect(upload_file).to be_a(described_class)
25
- expect(upload_file.content_type).to eq(described_class::DEFAULT_CONTENT_TYPE)
26
- end
27
- end
28
-
29
- context 'when no upload URL is given' do
30
- let(:upload_url) { '' }
31
-
32
- it 'raises an error' do
33
- expect { upload_file }.to raise_error(DeepL::Exceptions::Error, /must not be empty/)
34
- end
35
- end
36
- end
37
-
38
- describe '#to_s' do
39
- context 'when building a request' do
40
- it 'puts to the pre-signed storage URL' do
41
- expect(upload_file.to_s).to eq('PUT /upload/tm?signature=abc')
42
- end
43
- end
44
- end
45
-
46
- describe '#details' do
47
- context 'when building a request' do
48
- # The upload URL points outside of the DeepL API, so the auth key must not be sent there.
49
- it 'does not send the DeepL authorization header' do
50
- expect(upload_file.details).not_to include('Authorization')
51
- expect(upload_file.details).to include('User-Agent')
52
- end
53
- end
54
- end
55
- end
@@ -1,27 +0,0 @@
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.
4
- # frozen_string_literal: true
5
-
6
- require 'spec_helper'
7
-
8
- describe DeepL::Requests::Usage do
9
- subject(:usage_req) { described_class.new(api, 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(:options) { {} }
19
-
20
- describe '#initialize' do
21
- context 'when building a request' do
22
- it 'creates a request object' do
23
- expect(usage_req).to be_a(described_class)
24
- end
25
- end
26
- end
27
- end
@@ -1,32 +0,0 @@
1
- # Copyright 2026 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::Resources::CustomInstruction do
9
- subject(:custom_instruction) do
10
- described_class.new({
11
- 'id' => 'ci-1',
12
- 'label' => 'Formal',
13
- 'prompt' => 'Always use formal language',
14
- 'source_language' => 'en'
15
- })
16
- end
17
-
18
- describe '#initialize' do
19
- context 'when building a basic object' do
20
- it 'creates a resource' do
21
- expect(custom_instruction).to be_a(described_class)
22
- end
23
-
24
- it 'assigns the attributes' do
25
- expect(custom_instruction.id).to eq('ci-1')
26
- expect(custom_instruction.label).to eq('Formal')
27
- expect(custom_instruction.prompt).to eq('Always use formal language')
28
- expect(custom_instruction.source_language).to eq('en')
29
- end
30
- end
31
- end
32
- end
@@ -1,38 +0,0 @@
1
- # Copyright 2022 Daniel Herzog
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::Resources::Glossary do
9
- subject(:glossary) do
10
- described_class.new({
11
- 'glossary_id' => 'def3a26b-3e84-45b3-84ae-0c0aaf3525f7',
12
- 'name' => 'Mein Glossar',
13
- 'ready' => true,
14
- 'source_lang' => 'EN',
15
- 'target_lang' => 'DE',
16
- 'creation_time' => '2021-08-03T14:16:18.329Z',
17
- 'entry_count' => 1
18
- }, nil, nil)
19
- end
20
-
21
- describe '#initialize' do
22
- context 'when building a basic object' do
23
- it 'creates a resource' do
24
- expect(glossary).to be_a(described_class)
25
- end
26
-
27
- it 'assigns the attributes' do
28
- expect(glossary.id).to eq('def3a26b-3e84-45b3-84ae-0c0aaf3525f7')
29
- expect(glossary.name).to eq('Mein Glossar')
30
- expect(glossary.ready).to be(true)
31
- expect(glossary.source_lang).to eq('EN')
32
- expect(glossary.target_lang).to eq('DE')
33
- expect(glossary.creation_time).to eq('2021-08-03T14:16:18.329Z')
34
- expect(glossary.entry_count).to eq(1)
35
- end
36
- end
37
- end
38
- end
@@ -1,23 +0,0 @@
1
- # Copyright 2022 Daniel Herzog
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::Resources::LanguagePair do
9
- subject(:language_pair) { described_class.new('en', 'de', nil, nil) }
10
-
11
- describe '#initialize' do
12
- context 'when building a basic object' do
13
- it 'creates a resource' do
14
- expect(language_pair).to be_a(described_class)
15
- end
16
-
17
- it 'assigns the attributes' do
18
- expect(language_pair.source_lang).to eq('en')
19
- expect(language_pair.target_lang).to eq('de')
20
- end
21
- end
22
- end
23
- end
@@ -1,45 +0,0 @@
1
- # Copyright 2021 Daniel Herzog
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::Resources::Language do
9
- subject(:language) { described_class.new('EN', 'English', nil, nil, nil) }
10
-
11
- describe '#initialize' do
12
- context 'when building a basic object' do
13
- it 'creates a resource' do
14
- expect(language).to be_a(described_class)
15
- end
16
-
17
- it 'assigns the attributes' do
18
- expect(language.code).to eq('EN')
19
- expect(language.name).to eq('English')
20
- end
21
-
22
- it 'does not define the supports formality method' do
23
- expect { language.supports_formality? }.to raise_error(DeepL::Exceptions::NotSupported)
24
- end
25
- end
26
-
27
- context 'when building a target language object' do
28
- subject(:language) { described_class.new('EN', 'English', true, nil, nil) }
29
-
30
- it 'creates a resource' do
31
- expect(language).to be_a(described_class)
32
- end
33
-
34
- it 'assigns the attributes' do
35
- expect(language.code).to eq('EN')
36
- expect(language.name).to eq('English')
37
- end
38
-
39
- it 'includes the supports formality method' do
40
- expect { language.supports_formality? }.not_to raise_error
41
- expect(language).to be_supports_formality
42
- end
43
- end
44
- end
45
- end
@@ -1,68 +0,0 @@
1
- # Copyright 2026 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::Resources::StyleRule do
9
- subject(:style_rule) do
10
- described_class.new({
11
- 'style_id' => 'dca2e053-8ae5-45e6-a0d2-881156e7f4e4',
12
- 'name' => 'Default Style Rule',
13
- 'creation_time' => '2025-01-01T00:00:00Z',
14
- 'updated_time' => '2025-01-02T00:00:00Z',
15
- 'language' => 'en',
16
- 'version' => 1
17
- }, nil, nil)
18
- end
19
-
20
- describe '#initialize' do
21
- context 'when building a basic object' do
22
- it 'creates a resource' do
23
- expect(style_rule).to be_a(described_class)
24
- end
25
-
26
- it 'assigns the attributes' do
27
- expect(style_rule.style_id).to eq('dca2e053-8ae5-45e6-a0d2-881156e7f4e4')
28
- expect(style_rule.name).to eq('Default Style Rule')
29
- expect(style_rule.language).to eq('en')
30
- expect(style_rule.version).to eq(1)
31
- expect(style_rule.creation_time).to eq(Time.parse('2025-01-01T00:00:00Z'))
32
- expect(style_rule.updated_time).to eq(Time.parse('2025-01-02T00:00:00Z'))
33
- expect(style_rule.configured_rules).to be_nil
34
- expect(style_rule.custom_instructions).to be_nil
35
- end
36
- end
37
-
38
- context 'when building an object with configured rules and custom instructions' do
39
- subject(:style_rule) do
40
- described_class.new({
41
- 'style_id' => 'dca2e053-8ae5-45e6-a0d2-881156e7f4e4',
42
- 'name' => 'Detailed Style Rule',
43
- 'language' => 'en',
44
- 'version' => 1,
45
- 'configured_rules' => {
46
- 'dates_and_times' => { 'calendar_era' => 'use_bc_and_ad' }
47
- },
48
- 'custom_instructions' => [
49
- { 'id' => 'ci-1', 'label' => 'Test', 'prompt' => 'Be formal' }
50
- ]
51
- }, nil, nil)
52
- end
53
-
54
- it 'maps configured_rules into a ConfiguredRules resource' do
55
- expect(style_rule.configured_rules).to be_a(DeepL::Resources::ConfiguredRules)
56
- expect(style_rule.configured_rules.dates_and_times)
57
- .to eq({ 'calendar_era' => 'use_bc_and_ad' })
58
- end
59
-
60
- it 'maps custom_instructions into an array of CustomInstruction resources' do
61
- expect(style_rule.custom_instructions).to all(be_a(DeepL::Resources::CustomInstruction))
62
- expect(style_rule.custom_instructions.first.id).to eq('ci-1')
63
- expect(style_rule.custom_instructions.first.label).to eq('Test')
64
- expect(style_rule.custom_instructions.first.prompt).to eq('Be formal')
65
- end
66
- end
67
- end
68
- end
@@ -1,23 +0,0 @@
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.
4
- # frozen_string_literal: true
5
-
6
- require 'spec_helper'
7
-
8
- describe DeepL::Resources::Text do
9
- subject(:text) { described_class.new('Target', 'es', nil, nil, nil) }
10
-
11
- describe '#initialize' do
12
- context 'when building a basic object' do
13
- it 'creates a resource' do
14
- expect(text).to be_a(described_class)
15
- end
16
-
17
- it 'assigns the attributes' do
18
- expect(text.text).to eq('Target')
19
- expect(text.detected_source_language).to eq('es')
20
- end
21
- end
22
- end
23
- end
@@ -1,38 +0,0 @@
1
- # Copyright 2026 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::Resources::TranslationMemoryExport do
9
- subject(:translation_memory_export) { described_class.new(response, false, nil, nil) }
10
-
11
- let(:response) do
12
- {
13
- 'job_id' => '5b1a0a52-1f3b-4b7f-9f6b-9d4d3f5b6c7d',
14
- 'parameters' => { 'translation_memory_id' => 'a74d88fb-ed2a-4943-a664-a4512398b994' }
15
- }
16
- end
17
-
18
- describe '#initialize' do
19
- it 'creates a resource' do
20
- expect(translation_memory_export).to be_a(described_class)
21
- end
22
-
23
- it 'assigns the attributes of a newly created export' do
24
- expect(translation_memory_export.job_id).to eq('5b1a0a52-1f3b-4b7f-9f6b-9d4d3f5b6c7d')
25
- expect(translation_memory_export.translation_memory_id)
26
- .to eq('a74d88fb-ed2a-4943-a664-a4512398b994')
27
- expect(translation_memory_export.reused_existing?).to be(false)
28
- end
29
-
30
- context 'when the API reused a previously completed export' do
31
- subject(:translation_memory_export) { described_class.new(response, true, nil, nil) }
32
-
33
- it 'reports the export as reused' do
34
- expect(translation_memory_export.reused_existing?).to be(true)
35
- end
36
- end
37
- end
38
- end
@@ -1,30 +0,0 @@
1
- # Copyright 2026 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::Resources::TranslationMemoryImport do
9
- subject(:translation_memory_import) do
10
- described_class.new({
11
- 'job_id' => '5b1a0a52-1f3b-4b7f-9f6b-9d4d3f5b6c7d',
12
- 'upload_url' => 'https://storage.example.com/upload',
13
- 'expires_at' => '2026-01-01T00:00:00Z'
14
- }, nil, nil)
15
- end
16
-
17
- describe '#initialize' do
18
- it 'creates a resource' do
19
- expect(translation_memory_import).to be_a(described_class)
20
- end
21
-
22
- it 'assigns the attributes' do
23
- expect(translation_memory_import.job_id).to eq('5b1a0a52-1f3b-4b7f-9f6b-9d4d3f5b6c7d')
24
- expect(translation_memory_import.upload_url).to eq('https://storage.example.com/upload')
25
- expect(translation_memory_import.expires_at).to eq(Time.parse('2026-01-01T00:00:00Z'))
26
- expect(translation_memory_import.to_s)
27
- .to eq('TranslationMemoryImport: ID: 5b1a0a52-1f3b-4b7f-9f6b-9d4d3f5b6c7d')
28
- end
29
- end
30
- end
@@ -1,109 +0,0 @@
1
- # Copyright 2026 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::Resources::TranslationMemoryJob do
9
- subject(:job) { described_class.new(response, nil, nil) }
10
-
11
- let(:response) do
12
- {
13
- 'job_id' => '5b1a0a52-1f3b-4b7f-9f6b-9d4d3f5b6c7d',
14
- 'product' => 'translation_memory',
15
- 'operation' => 'import',
16
- 'creation_time' => '2026-01-01T00:00:00Z',
17
- 'updated_time' => '2026-01-02T00:00:00Z',
18
- 'source_file' => { 'content_type' => 'application/xml', 'content_length' => 128 },
19
- 'parameters' => { 'display_name' => 'Legal' },
20
- 'results' => [
21
- { 'status' => 'completed', 'translation_memory_id' => 'tm-1',
22
- 'skipped_segment_count' => 2 }
23
- ]
24
- }
25
- end
26
-
27
- describe '#initialize' do
28
- it 'creates a resource' do
29
- expect(job).to be_a(described_class)
30
- end
31
-
32
- it 'assigns the job level attributes' do
33
- expect(job.job_id).to eq('5b1a0a52-1f3b-4b7f-9f6b-9d4d3f5b6c7d')
34
- expect(job.product).to eq('translation_memory')
35
- expect(job.operation).to eq('import')
36
- expect(job.creation_time).to eq(Time.parse('2026-01-01T00:00:00Z'))
37
- expect(job.updated_time).to eq(Time.parse('2026-01-02T00:00:00Z'))
38
- expect(job.display_name).to eq('Legal')
39
- expect(job.source_content_type).to eq('application/xml')
40
- expect(job.source_content_length).to eq(128)
41
- end
42
-
43
- it 'maps the single result and delegates the status helpers to it' do
44
- expect(job.result).to be_a(DeepL::Resources::TranslationMemoryJobResult)
45
- expect(job.status).to eq('completed')
46
- expect(job.finished?).to be(true)
47
- expect(job.awaiting_input?).to be(false)
48
- expect(job.error?).to be(false)
49
- expect(job.result.translation_memory_id).to eq('tm-1')
50
- expect(job.result.skipped_segment_count).to eq(2)
51
- end
52
- end
53
-
54
- context 'when the job is awaiting its file upload' do
55
- let(:response) do
56
- { 'job_id' => 'job-1', 'operation' => 'import',
57
- 'results' => [{ 'status' => 'awaiting_input',
58
- 'status_metadata' => { 'required_action' => 'Waiting for upload' } }] }
59
- end
60
-
61
- it 'exposes the required action and does not report the job as finished' do
62
- expect(job.awaiting_input?).to be(true)
63
- expect(job.finished?).to be(false)
64
- expect(job.result.required_action).to eq('Waiting for upload')
65
- end
66
- end
67
-
68
- context 'when the export job completed' do
69
- let(:response) do
70
- { 'job_id' => 'job-2', 'operation' => 'export',
71
- 'parameters' => { 'translation_memory_id' => 'tm-1' },
72
- 'results' => [{ 'status' => 'completed', 'download_url' => 'https://example.com/tmx',
73
- 'expires_at' => '2026-01-03T00:00:00Z' }] }
74
- end
75
-
76
- it 'exposes the download URL and its expiry' do
77
- expect(job.translation_memory_id).to eq('tm-1')
78
- expect(job.result.download_url).to eq('https://example.com/tmx')
79
- expect(job.result.expires_at).to eq(Time.parse('2026-01-03T00:00:00Z'))
80
- expect(job.to_s).to eq('TranslationMemoryJob: export - ID: job-2 - Status: completed')
81
- end
82
- end
83
-
84
- context 'when the job failed' do
85
- let(:response) do
86
- { 'job_id' => 'job-3', 'operation' => 'import',
87
- 'results' => [{ 'status' => 'failed', 'error' => { 'message' => 'Invalid TMX' } }] }
88
- end
89
-
90
- it 'reports the error and treats the job as finished' do
91
- expect(job.error?).to be(true)
92
- expect(job.finished?).to be(true)
93
- expect(job.error_message).to eq('Invalid TMX')
94
- end
95
- end
96
-
97
- context 'when the API returned no result' do
98
- let(:response) { { 'job_id' => 'job-4', 'operation' => 'import' } }
99
-
100
- it 'reports neither a status nor an error' do
101
- expect(job.result).to be_nil
102
- expect(job.status).to be_nil
103
- expect(job.finished?).to be(false)
104
- expect(job.awaiting_input?).to be(false)
105
- expect(job.error?).to be(false)
106
- expect(job.error_message).to be_nil
107
- end
108
- end
109
- end
@@ -1,78 +0,0 @@
1
- # Copyright 2026 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::Resources::TranslationMemorySegments do
9
- subject(:segments_page) { described_class.new(response, nil, nil) }
10
-
11
- let(:response) do
12
- {
13
- 'segments' => [
14
- {
15
- 'source_segment_id' => 'tm-1-source-0',
16
- 'source_text' => 'Quelltext Nummer 0',
17
- 'creation_time' => '2026-01-01T00:00:00Z',
18
- 'updated_time' => '2026-01-02T00:00:00Z',
19
- 'last_used_time' => '2026-01-03T00:00:00Z',
20
- 'targets' => [
21
- {
22
- 'target_segment_id' => 'tm-1-target-en-0',
23
- 'target_language' => 'en',
24
- 'target_text' => 'Source text number 0',
25
- 'creation_time' => '2026-01-01T00:00:00Z',
26
- 'updated_time' => '2026-01-02T00:00:00Z',
27
- 'last_used_time' => '2026-01-03T00:00:00Z'
28
- }
29
- ]
30
- }
31
- ],
32
- 'segment_count' => 12,
33
- 'next_page_cursor' => 'NQ'
34
- }
35
- end
36
-
37
- describe '#initialize' do
38
- it 'creates a resource' do
39
- expect(segments_page).to be_a(described_class)
40
- end
41
-
42
- it 'assigns the page level attributes' do
43
- expect(segments_page.segment_count).to eq(12)
44
- expect(segments_page.next_page_cursor).to eq('NQ')
45
- expect(segments_page.next_page?).to be(true)
46
- expect(segments_page.to_s).to eq('1 of 12 segment(s)')
47
- end
48
-
49
- it 'maps the segments into resources' do
50
- segment = segments_page.segments.first
51
- expect(segment).to be_a(DeepL::Resources::TranslationMemorySegment)
52
- expect(segment.source_segment_id).to eq('tm-1-source-0')
53
- expect(segment.source_text).to eq('Quelltext Nummer 0')
54
- expect(segment.creation_time).to eq(Time.parse('2026-01-01T00:00:00Z'))
55
- expect(segment.updated_time).to eq(Time.parse('2026-01-02T00:00:00Z'))
56
- expect(segment.last_used_time).to eq(Time.parse('2026-01-03T00:00:00Z'))
57
- end
58
-
59
- it 'maps the target segments into resources' do
60
- target = segments_page.segments.first.targets.first
61
- expect(target).to be_a(DeepL::Resources::TranslationMemoryTargetSegment)
62
- expect(target.target_segment_id).to eq('tm-1-target-en-0')
63
- expect(target.target_language).to eq('en')
64
- expect(target.target_text).to eq('Source text number 0')
65
- expect(target.to_s).to eq('en: Source text number 0')
66
- end
67
- end
68
-
69
- context 'when the response is the last page' do
70
- let(:response) { { 'segments' => [], 'segment_count' => 12 } }
71
-
72
- it 'reports no further page' do
73
- expect(segments_page.segments).to eq([])
74
- expect(segments_page.next_page_cursor).to be_nil
75
- expect(segments_page.next_page?).to be(false)
76
- end
77
- end
78
- end
@@ -1,52 +0,0 @@
1
- # Copyright 2026 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::Resources::TranslationMemory do
9
- subject(:translation_memory) do
10
- described_class.new({
11
- 'translation_memory_id' => 'a74d88fb-ed2a-4943-a664-a4512398b994',
12
- 'name' => 'Legal',
13
- 'source_language' => 'en',
14
- 'target_languages' => %w[es de],
15
- 'segment_count' => 3542,
16
- 'creation_time' => '2026-01-01T00:00:00Z',
17
- 'updated_time' => '2026-01-02T00:00:00Z'
18
- }, nil, nil)
19
- end
20
-
21
- describe '#initialize' do
22
- context 'when building a basic object' do
23
- it 'creates a resource' do
24
- expect(translation_memory).to be_a(described_class)
25
- end
26
-
27
- it 'assigns the attributes' do
28
- expect(translation_memory.translation_memory_id)
29
- .to eq('a74d88fb-ed2a-4943-a664-a4512398b994')
30
- expect(translation_memory.name).to eq('Legal')
31
- expect(translation_memory.source_language).to eq('en')
32
- expect(translation_memory.target_languages).to eq(%w[es de])
33
- expect(translation_memory.segment_count).to eq(3542)
34
- expect(translation_memory.creation_time).to eq(Time.parse('2026-01-01T00:00:00Z'))
35
- expect(translation_memory.updated_time).to eq(Time.parse('2026-01-02T00:00:00Z'))
36
- end
37
- end
38
-
39
- context 'when the optional timestamps are missing' do
40
- subject(:translation_memory) do
41
- described_class.new({ 'translation_memory_id' => 'tm-1', 'name' => 'Legal' }, nil, nil)
42
- end
43
-
44
- it 'leaves the timestamps nil and defaults the collections' do
45
- expect(translation_memory.creation_time).to be_nil
46
- expect(translation_memory.updated_time).to be_nil
47
- expect(translation_memory.target_languages).to eq([])
48
- expect(translation_memory.segment_count).to eq(0)
49
- end
50
- end
51
- end
52
- end
@@ -1,35 +0,0 @@
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.
4
- # frozen_string_literal: true
5
-
6
- require 'spec_helper'
7
-
8
- describe DeepL::Resources::Usage do
9
- subject(:usage) { described_class.new(3, 5, nil, nil) }
10
-
11
- describe '#initialize' do
12
- context 'when building a basic object' do
13
- it 'creates a resource' do
14
- expect(usage).to be_a(described_class)
15
- end
16
-
17
- it 'assigns the attributes' do
18
- expect(usage.character_count).to eq(3)
19
- expect(usage.character_limit).to eq(5)
20
- end
21
-
22
- it 'does not exceed the quota' do
23
- expect(usage).not_to be_quota_exceeded
24
- end
25
- end
26
-
27
- context 'when building a quota exceeded object' do
28
- subject(:usage) { described_class.new(5, 5, nil, nil) }
29
-
30
- it 'exceeds the quota' do
31
- expect(usage).to be_quota_exceeded
32
- end
33
- end
34
- end
35
- end
@@ -1,12 +0,0 @@
1
- # Copyright 2026 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
- # Shared setup for integration specs that hit the live mock server: expose an
7
- # API the server rejects as unauthorized without mutating global DeepL state.
8
- RSpec.shared_context 'with a live mock server' do
9
- let(:unauthorized_api) do
10
- DeepL::API.new(DeepL::Configuration.new(auth_key: 'invalid'))
11
- end
12
- end