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
data/lib/deepl.rb CHANGED
@@ -4,11 +4,16 @@
4
4
  # frozen_string_literal: true
5
5
 
6
6
  # -- Dependencies
7
+ require 'fileutils'
7
8
  require 'json'
8
9
  require 'net/http'
9
10
 
11
+ # -- Deprecation
12
+ require_relative 'deepl/deprecation'
13
+
10
14
  # -- Exceptions
11
15
  require_relative 'deepl/exceptions/error'
16
+ require_relative 'deepl/exceptions/validation_error'
12
17
  require_relative 'deepl/exceptions/request_error'
13
18
  require_relative 'deepl/exceptions/authorization_failed'
14
19
  require_relative 'deepl/exceptions/bad_request'
@@ -19,6 +24,8 @@ require_relative 'deepl/exceptions/not_supported'
19
24
  require_relative 'deepl/exceptions/request_entity_too_large'
20
25
  require_relative 'deepl/exceptions/document_translation_error'
21
26
  require_relative 'deepl/exceptions/server_error'
27
+ require_relative 'deepl/exceptions/document_not_ready_error'
28
+ require_relative 'deepl/exceptions/connection_error'
22
29
 
23
30
  # -- Requests
24
31
  require_relative 'deepl/requests/base'
@@ -31,6 +38,16 @@ require_relative 'deepl/requests/glossary/entries'
31
38
  require_relative 'deepl/requests/glossary/find'
32
39
  require_relative 'deepl/requests/glossary/language_pairs'
33
40
  require_relative 'deepl/requests/glossary/list'
41
+ require_relative 'deepl/requests/multilingual_glossary/helpers'
42
+ require_relative 'deepl/requests/multilingual_glossary/create'
43
+ require_relative 'deepl/requests/multilingual_glossary/destroy'
44
+ require_relative 'deepl/requests/multilingual_glossary/destroy_dictionary'
45
+ require_relative 'deepl/requests/multilingual_glossary/entries'
46
+ require_relative 'deepl/requests/multilingual_glossary/find'
47
+ require_relative 'deepl/requests/multilingual_glossary/list'
48
+ require_relative 'deepl/requests/multilingual_glossary/replace_dictionary'
49
+ require_relative 'deepl/requests/multilingual_glossary/update'
50
+ require_relative 'deepl/requests/style_rule/helpers'
34
51
  require_relative 'deepl/requests/style_rule/list'
35
52
  require_relative 'deepl/requests/style_rule/create'
36
53
  require_relative 'deepl/requests/style_rule/find'
@@ -41,6 +58,21 @@ require_relative 'deepl/requests/style_rule/create_custom_instruction'
41
58
  require_relative 'deepl/requests/style_rule/find_custom_instruction'
42
59
  require_relative 'deepl/requests/style_rule/update_custom_instruction'
43
60
  require_relative 'deepl/requests/style_rule/destroy_custom_instruction'
61
+ require_relative 'deepl/requests/spoken_terms/helpers'
62
+ require_relative 'deepl/requests/spoken_terms/create'
63
+ require_relative 'deepl/requests/spoken_terms/list'
64
+ require_relative 'deepl/requests/spoken_terms/find'
65
+ require_relative 'deepl/requests/spoken_terms/update'
66
+ require_relative 'deepl/requests/spoken_terms/entries'
67
+ require_relative 'deepl/requests/spoken_terms/replace_term_list'
68
+ require_relative 'deepl/requests/spoken_terms/destroy'
69
+ require_relative 'deepl/requests/spoken_terms/destroy_term_list'
70
+ require_relative 'deepl/requests/style_profile/base'
71
+ require_relative 'deepl/requests/style_profile/list'
72
+ require_relative 'deepl/requests/style_profile/create'
73
+ require_relative 'deepl/requests/style_profile/find'
74
+ require_relative 'deepl/requests/style_profile/update'
75
+ require_relative 'deepl/requests/style_profile/destroy'
44
76
  require_relative 'deepl/requests/translation_memory/base'
45
77
  require_relative 'deepl/requests/translation_memory/storage_base'
46
78
  require_relative 'deepl/requests/translation_memory/list'
@@ -53,16 +85,29 @@ require_relative 'deepl/requests/translation_memory/create_export'
53
85
  require_relative 'deepl/requests/translation_memory/find_job'
54
86
  require_relative 'deepl/requests/translation_memory/download_export'
55
87
  require_relative 'deepl/requests/languages'
88
+ require_relative 'deepl/requests/languages_for_resource'
89
+ require_relative 'deepl/requests/language_resources'
56
90
  require_relative 'deepl/requests/translate'
57
91
  require_relative 'deepl/requests/usage'
92
+ require_relative 'deepl/requests/write_improvements'
58
93
  require_relative 'deepl/requests/rephrase'
94
+ require_relative 'deepl/requests/correct'
95
+ require_relative 'deepl/requests/admin/base'
96
+ require_relative 'deepl/requests/admin/usage_analytics'
97
+ require_relative 'deepl/requests/admin/custom_tag_usage_analytics'
98
+ require_relative 'deepl/requests/admin/create_developer_key'
99
+ require_relative 'deepl/requests/admin/list_developer_keys'
100
+ require_relative 'deepl/requests/admin/update_developer_key'
59
101
 
60
102
  # -- Responses and resources
61
103
  require_relative 'deepl/resources/base'
62
104
  require_relative 'deepl/resources/document_handle'
63
105
  require_relative 'deepl/resources/document_translation_status'
64
106
  require_relative 'deepl/resources/glossary'
107
+ require_relative 'deepl/resources/multilingual_glossary'
65
108
  require_relative 'deepl/resources/style_rule'
109
+ require_relative 'deepl/resources/spoken_terms'
110
+ require_relative 'deepl/resources/style_profile'
66
111
  require_relative 'deepl/resources/translation_memory'
67
112
  require_relative 'deepl/resources/translation_memory_segments'
68
113
  require_relative 'deepl/resources/translation_memory_import'
@@ -70,22 +115,38 @@ require_relative 'deepl/resources/translation_memory_export'
70
115
  require_relative 'deepl/resources/translation_memory_job'
71
116
  require_relative 'deepl/resources/language'
72
117
  require_relative 'deepl/resources/language_pair'
118
+ require_relative 'deepl/resources/language_resource'
119
+ require_relative 'deepl/resources/language_support'
73
120
  require_relative 'deepl/resources/text'
74
121
  require_relative 'deepl/resources/usage'
122
+ require_relative 'deepl/resources/developer_key'
123
+ require_relative 'deepl/resources/admin_usage_report'
124
+ require_relative 'deepl/resources/custom_tag_usage_report'
75
125
 
76
126
  # -- Utils
77
127
  require_relative 'deepl/utils/exception_builder'
128
+ require_relative 'deepl/utils/http_client_builder'
129
+ require_relative 'deepl/utils/client_builder'
78
130
  require_relative 'deepl/utils/backoff_timer'
79
131
  require_relative 'deepl/utils/time_parser'
132
+ require_relative 'deepl/utils/number_parser'
133
+ require_relative 'deepl/utils/term_validator'
134
+ require_relative 'deepl/utils/document_poller'
80
135
 
81
136
  # -- Constants
82
137
  require_relative 'deepl/constants/base_constant'
138
+ require_relative 'deepl/constants/document_status_code'
83
139
  require_relative 'deepl/constants/formality'
140
+ require_relative 'deepl/constants/language_include'
141
+ require_relative 'deepl/constants/language_resource_name'
84
142
  require_relative 'deepl/constants/model_type'
85
143
  require_relative 'deepl/constants/split_sentences'
86
144
  require_relative 'deepl/constants/tag_handling'
145
+ require_relative 'deepl/constants/tag_handling_version'
87
146
  require_relative 'deepl/constants/tone'
88
147
  require_relative 'deepl/constants/writing_style'
148
+ require_relative 'deepl/constants/admin_usage_group_by'
149
+ require_relative 'deepl/constants/custom_tag_usage_aggregate_by'
89
150
 
90
151
  # -- HTTP Utils
91
152
  require_relative 'http_client_options'
@@ -100,19 +161,32 @@ require_relative 'deepl/document_api'
100
161
  require_relative 'deepl/glossary_api'
101
162
  require_relative 'deepl/style_rule_api'
102
163
  require_relative 'deepl/translation_memory_api'
164
+ require_relative 'deepl/app_info'
165
+ require_relative 'deepl/client'
166
+ require_relative 'deepl/admin_client'
103
167
 
104
168
  # -- Gem interface
169
+ #
170
+ # The module-level API (+DeepL.configure+, +DeepL.translate+, +DeepL.glossaries+, ...) keeps its
171
+ # configuration in module state. It is deprecated in favour of DeepL::Client and will be removed
172
+ # in the next major version.
105
173
  module DeepL
106
174
  extend self
107
175
 
108
176
  ## -- API shortcuts
109
177
 
178
+ # @deprecated Use DeepL::Client instead.
110
179
  def api
111
- @api ||= API.new(configuration)
180
+ deprecated(:api, 'DeepL::Client')
181
+ module_api
112
182
  end
113
183
 
184
+ # @deprecated Use DeepL::Client#get_source_languages or DeepL::Client#get_target_languages
185
+ # instead.
114
186
  def languages(options = {})
115
- Requests::Languages.new(api, options).request
187
+ deprecated(:languages,
188
+ 'DeepL::Client#get_source_languages or DeepL::Client#get_target_languages')
189
+ Requests::Languages.new(module_api, options).request
116
190
  end
117
191
 
118
192
  ##
@@ -122,88 +196,139 @@ module DeepL
122
196
  # @param [String, nil] source_lang Source language. `nil` enables automatic detection.
123
197
  # @param [String] target_lang Target language.
124
198
  # @param [Hash] options Additional (body) options for the translation. Notable options:
125
- # * +:glossary_id+ - A single glossary ID (string) to use for the translation. Requires
126
- # +source_lang+ to be set. Cannot be combined with +:glossary_ids+.
127
- # * +:glossary_ids+ - An array of up to 5 glossary IDs (strings or
128
- # `DeepL::Resources::Glossary` objects) to use for the translation. Glossaries are applied
129
- # in order (first match wins). Requires +source_lang+ to be set. Cannot be combined with
130
- # +:glossary_id+. Raises `ArgumentError` if these rules are violated or more than 5 IDs are
131
- # provided.
199
+ # * +:glossary+ - A glossary ID, `DeepL::Resources::Glossary` or
200
+ # `DeepL::Resources::MultilingualGlossary` to use for the translation, sent as
201
+ # +glossary_id+. Cannot be combined with +:glossary_id+ or +:glossary_ids+.
202
+ # * +:glossary_id+ - Deprecated, use +:glossary+. A single glossary ID (string).
203
+ # * +:glossary_ids+ - An array of up to 5 glossary IDs (strings,
204
+ # `DeepL::Resources::Glossary` or `DeepL::Resources::MultilingualGlossary` objects) to
205
+ # use for the translation. Glossaries are applied in order (first match wins). Without
206
+ # +source_lang+, the API detects it. Cannot be combined with +:glossary+ or
207
+ # +:glossary_id+. Raises `ArgumentError` if these rules are violated or more than 5 IDs
208
+ # are provided.
209
+ # * +:style_rule+ - A style rule ID string or a `DeepL::Resources::StyleRule` object.
210
+ # * +:style_profile+ - A style profile ID string or a `DeepL::Resources::StyleProfile`
211
+ # object. Applies the profile's glossaries, style rule lists and translation memories.
132
212
  # @param [Hash] additional_headers Additional HTTP headers for the translation.
133
213
  # @return [DeepL::Resources::Text, Array<DeepL::Resources::Text>] Translated text resource(s).
214
+ # @deprecated Use DeepL::Client#translate_text instead.
134
215
  def translate(text, source_lang, target_lang, options = {}, additional_headers = {})
135
- configure if @configuration.nil?
136
- Requests::Translate.new(api, text, source_lang, target_lang, options,
216
+ deprecated(:translate, 'DeepL::Client#translate_text')
217
+ ensure_configured
218
+ Requests::Translate.new(module_api, text, source_lang, target_lang, options,
137
219
  additional_headers).request
138
220
  end
139
221
 
222
+ # @deprecated Use DeepL::Client instead.
140
223
  def document(options = {})
141
- configure if @configuration.nil?
142
- DocumentApi.new(api, options)
224
+ deprecated(:document, 'DeepL::Client')
225
+ ensure_configured
226
+ DocumentApi.new(module_api, options)
143
227
  end
144
228
 
229
+ # @deprecated Use DeepL::Client instead.
145
230
  def glossaries(options = {})
146
- configure if @configuration.nil?
147
- GlossaryApi.new(api, options)
231
+ deprecated(:glossaries, 'DeepL::Client')
232
+ ensure_configured
233
+ GlossaryApi.new(module_api, options)
148
234
  end
149
235
 
236
+ # @deprecated Use DeepL::Client instead.
150
237
  def style_rules(options = {})
151
- configure if @configuration.nil?
152
- StyleRuleApi.new(api, options)
238
+ deprecated(:style_rules, 'DeepL::Client')
239
+ ensure_configured
240
+ StyleRuleApi.new(module_api, options)
153
241
  end
154
242
 
243
+ # @deprecated Use DeepL::Client instead.
155
244
  def translation_memories(options = {})
156
- configure if @configuration.nil?
157
- TranslationMemoryApi.new(api, options)
245
+ deprecated(:translation_memories, 'DeepL::Client')
246
+ ensure_configured
247
+ TranslationMemoryApi.new(module_api, options)
158
248
  end
159
249
 
250
+ # @deprecated Use DeepL::Client#rephrase_text instead.
160
251
  def rephrase(text, target_lang = nil, writing_style = nil, tone = nil, options = {}, # rubocop:disable Metrics/ParameterLists
161
252
  additional_headers = {})
162
- configure if @configuration.nil?
163
- Requests::Rephrase.new(api, text, target_lang, writing_style, tone, options,
253
+ deprecated(:rephrase, 'DeepL::Client#rephrase_text')
254
+ ensure_configured
255
+ Requests::Rephrase.new(module_api, text, target_lang, writing_style, tone, options,
164
256
  additional_headers).request
165
257
  end
166
258
 
259
+ # @deprecated Use DeepL::Client#get_usage instead.
167
260
  def usage(options = {})
168
- configure if @configuration.nil?
169
- Requests::Usage.new(api, options).request
261
+ deprecated(:usage, 'DeepL::Client#get_usage')
262
+ ensure_configured
263
+ Requests::Usage.new(module_api, options).request
170
264
  end
171
265
 
266
+ # @deprecated Use DeepL::Client with +http_client_options:+ instead.
172
267
  def http_client
268
+ deprecated(:http_client, 'DeepL::Client')
173
269
  @http_client
174
270
  end
175
271
 
176
- def with_session(client_options = HTTPClientOptions.new()) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
177
- raise ArgumentError 'This method requires a block to be passed in which contains the actual API calls, see README for example usage.' unless block_given? # rubocop:disable Layout/LineLength
272
+ # @deprecated Use DeepL::Client with +http_client_options:+ instead.
273
+ def with_session(client_options = HTTPClientOptions.new) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
274
+ raise ArgumentError, 'This method requires a block to be passed in which contains the actual API calls, see README for example usage.' unless block_given? # rubocop:disable Layout/LineLength
178
275
 
179
- has_proxy = client_options.proxy.key?('proxy_addr') and client_options.proxy.key?('proxy_port')
276
+ deprecated(:with_session, 'DeepL::Client')
277
+ previous_api_client = module_api.http_client
278
+ previous_api_options = module_api.http_client_options
279
+ previous_http_client = @http_client
180
280
  begin
181
- uri = URI(configuration.host)
182
- http = Net::HTTP.new(uri.host, uri.port, has_proxy ? client_options.proxy['proxy_addr'] : nil,
183
- has_proxy ? client_options.proxy['proxy_port'] : nil)
184
- http.use_ssl = client_options.enable_ssl_verification
185
- http.ca_file = client_options.cert_path if client_options.cert_path
186
- http.open_timeout = client_options.open_timeout unless client_options.open_timeout.nil?
187
- http.read_timeout = client_options.read_timeout unless client_options.read_timeout.nil?
188
- http.write_timeout = client_options.write_timeout unless client_options.write_timeout.nil?
189
- http.ssl_timeout = client_options.ssl_timeout unless client_options.ssl_timeout.nil?
190
- http.start
281
+ http = Utils::HTTPClientBuilder.build(module_configuration.host, client_options)
282
+ start_session(http, client_options)
191
283
  @http_client = http
192
- api.update_http_client(http)
284
+ module_api.update_http_client(http, client_options)
193
285
  yield
194
286
  ensure
195
- http.finish
287
+ module_api.update_http_client(previous_api_client, previous_api_options)
288
+ @http_client = previous_http_client
289
+ http.finish if http&.started?
196
290
  end
197
291
  end
198
292
 
199
293
  # -- Configuration
200
294
 
295
+ # @deprecated Use DeepL::Client.new instead.
201
296
  def configuration
202
- @configuration ||= Configuration.new
297
+ deprecated(:configuration, 'DeepL::Client.new')
298
+ module_configuration
203
299
  end
204
300
 
301
+ # @deprecated Use DeepL::Client.new instead.
205
302
  def configure
206
- yield configuration if block_given?
207
- configuration.validate!
303
+ deprecated(:configure, 'DeepL::Client.new')
304
+ yield module_configuration if block_given?
305
+ module_configuration.validate!
306
+ end
307
+
308
+ private
309
+
310
+ def module_configuration
311
+ @configuration ||= Configuration.new # rubocop:disable Naming/MemoizedInstanceVariableName
312
+ end
313
+
314
+ def module_api
315
+ @api ||= API.new(module_configuration) # rubocop:disable Naming/MemoizedInstanceVariableName
316
+ end
317
+
318
+ # Opens the session connection within the configured timeout, unless the options set one.
319
+ def start_session(http, client_options)
320
+ timeout = module_configuration.timeout
321
+ http.open_timeout = timeout if client_options.open_timeout.nil? && timeout
322
+ http.start
323
+ end
324
+
325
+ def ensure_configured
326
+ module_configuration.validate! if @configuration.nil?
327
+ end
328
+
329
+ def deprecated(name, replacement)
330
+ Deprecation.warn_once("DeepL.#{name}",
331
+ "[DEPRECATION] DeepL.#{name} is deprecated, use #{replacement} instead.",
332
+ uplevel: 3)
208
333
  end
209
334
  end
@@ -8,7 +8,7 @@ module DeepL
8
8
  attr_reader :proxy, :send_platform_info, :enable_ssl_verification, :cert_path, :open_timeout,
9
9
  :read_timeout, :write_timeout, :ssl_timeout
10
10
 
11
- def initialize(proxy, cert_path, enable_ssl_verification: true, open_timeout: nil, # rubocop:disable Metrics/ParameterLists
11
+ def initialize(proxy = {}, cert_path = nil, enable_ssl_verification: true, open_timeout: nil, # rubocop:disable Metrics/ParameterLists
12
12
  read_timeout: nil, write_timeout: nil, ssl_timeout: nil)
13
13
  @proxy = proxy
14
14
  @enable_ssl_verification = enable_ssl_verification
@@ -18,5 +18,25 @@ module DeepL
18
18
  @write_timeout = write_timeout
19
19
  @ssl_timeout = ssl_timeout
20
20
  end
21
+
22
+ # Hides the user info of a proxy URL: +http://user:pass@host:port+ becomes
23
+ # +http://[REDACTED]@host:port+.
24
+ def self.redact_proxy(proxy)
25
+ if proxy.is_a?(String)
26
+ return proxy.sub(%r{\A([a-z][a-z0-9+.-]*://)?[^/@]*@}i,
27
+ '\1[REDACTED]@')
28
+ end
29
+ return proxy unless proxy.is_a?(Hash)
30
+
31
+ proxy.to_h { |key, value| [key, key.to_s =~ /user|pass/i ? '[REDACTED]' : value] }
32
+ end
33
+
34
+ # Leaves out the proxy credentials.
35
+ def inspect
36
+ shown = { proxy: self.class.redact_proxy(proxy), cert_path: cert_path,
37
+ enable_ssl_verification: enable_ssl_verification, open_timeout: open_timeout,
38
+ read_timeout: read_timeout, write_timeout: write_timeout, ssl_timeout: ssl_timeout }
39
+ "#<#{self.class.name} #{shown.map { |name, value| "#{name}=#{value.inspect}" }.join(', ')}>"
40
+ end
21
41
  end
22
42
  end
data/lib/version.rb CHANGED
@@ -4,5 +4,5 @@
4
4
  # frozen_string_literal: true
5
5
 
6
6
  module DeepL
7
- VERSION = '3.9.0'
7
+ VERSION = '3.10.0'
8
8
  end
data/spec/fixtures.rb ADDED
@@ -0,0 +1,33 @@
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
+ require 'tmpdir'
7
+
8
+ # Fixtures shared by the offline and the real-API specs.
9
+ module Fixtures
10
+ EXAMPLE_TMX = <<~TMX
11
+ <?xml version="1.0" encoding="UTF-8"?>
12
+ <tmx version="1.4"><header creationtool="deepl-rb-spec" creationtoolversion="1"
13
+ segtype="sentence" o-tmf="plain" adminlang="en" srclang="en" datatype="plaintext"/>
14
+ <body><tu><tuv xml:lang="en"><seg>Segment number 1</seg></tuv>
15
+ <tuv xml:lang="de"><seg>Segment Nummer 1</seg></tuv></tu></body></tmx>
16
+ TMX
17
+
18
+ # Every byte value, to check that downloads are written unchanged.
19
+ BINARY_CONTENT = (0..255).map(&:chr).join.b.freeze
20
+
21
+ # Writes an example .txt document in +dir+. Returns the input path and a free output path.
22
+ def create_text_document(dir)
23
+ input = File.join(dir, 'example_document.txt')
24
+ File.write(input, 'proton beam')
25
+ [input, File.join(dir, 'output_document.txt')]
26
+ end
27
+ end
28
+
29
+ RSpec.shared_context 'with a temporary directory' do
30
+ let(:temp_dir) { Dir.mktmpdir('deepl-rspec-') }
31
+
32
+ after { FileUtils.remove_entry(temp_dir) }
33
+ end