deepl-rb 2.2.0 → 2.3.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 (43) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +1 -13
  3. data/.rubocop.yml +1 -0
  4. data/Gemfile +6 -0
  5. data/README.md +55 -24
  6. data/Rakefile +2 -0
  7. data/VERSION +1 -1
  8. data/deepl-rb.gemspec +16 -10
  9. data/lib/deepl.rb +9 -0
  10. data/lib/deepl/api.rb +2 -0
  11. data/lib/deepl/configuration.rb +2 -0
  12. data/lib/deepl/exceptions/authorization_failed.rb +2 -0
  13. data/lib/deepl/exceptions/bad_request.rb +4 -0
  14. data/lib/deepl/exceptions/error.rb +2 -0
  15. data/lib/deepl/exceptions/limit_exceeded.rb +2 -0
  16. data/lib/deepl/exceptions/quota_exceeded.rb +11 -0
  17. data/lib/deepl/exceptions/request_error.rb +4 -1
  18. data/lib/deepl/requests/base.rb +4 -1
  19. data/lib/deepl/requests/languages.rb +28 -0
  20. data/lib/deepl/requests/translate.rb +3 -0
  21. data/lib/deepl/requests/usage.rb +2 -0
  22. data/lib/deepl/resources/base.rb +2 -0
  23. data/lib/deepl/resources/language.rb +20 -0
  24. data/lib/deepl/resources/text.rb +2 -0
  25. data/lib/deepl/resources/usage.rb +2 -0
  26. data/spec/api/api_spec.rb +2 -0
  27. data/spec/api/configuration_spec.rb +3 -1
  28. data/spec/api/deepl_spec.rb +24 -0
  29. data/spec/fixtures/vcr_cassettes/deepl_languages.yml +41 -0
  30. data/spec/fixtures/vcr_cassettes/deepl_translate.yml +4 -5
  31. data/spec/fixtures/vcr_cassettes/deepl_usage.yml +10 -7
  32. data/spec/fixtures/vcr_cassettes/languages.yml +108 -0
  33. data/spec/fixtures/vcr_cassettes/translate_texts.yml +69 -33
  34. data/spec/fixtures/vcr_cassettes/usage.yml +10 -7
  35. data/spec/requests/languages_spec.rb +58 -0
  36. data/spec/requests/translate_spec.rb +6 -3
  37. data/spec/requests/usage_spec.rb +2 -0
  38. data/spec/resources/language_spec.rb +20 -0
  39. data/spec/resources/text_spec.rb +4 -2
  40. data/spec/resources/usage_spec.rb +5 -3
  41. data/spec/spec_helper.rb +3 -1
  42. metadata +27 -8
  43. data/Gemfile.lock +0 -113
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 00b65dd648e7d29dc160d9e8b66c2eecc15dccdc
4
- data.tar.gz: 47a4e9cd8476b801b617f1290a020e017aa80bb4
2
+ SHA256:
3
+ metadata.gz: f531ff13d2ba139bab65f6027f2e673f6480b097847d898531ecc7a9b247faea
4
+ data.tar.gz: e12727852eff8153dbb3a95d853d0fbd5ef5c703f02eaf7dedd089320e6873a2
5
5
  SHA512:
6
- metadata.gz: 3ef63e90c6708751fffd2229c0e3ba96951932b2a520f66f566856b2990466bb1dc876c815f224495ae642fba9266591af74d1029fadf4abc2263f8ba25a570b
7
- data.tar.gz: a017cc9b56ee7c10cba7e41c59bb17e5969f2e285d8293493ef1dff02947cfdb508684901dd0891ae3c1e17cce1511273ed9f758074607f5e9066c590adffd0d
6
+ metadata.gz: 1d783cba5c207fb772589bc3f328a942919eff214778ea739a6924022bb7589a1898ab62a1cad2b9f6b177f857beb1bd0c5fbe290eba1467c31b26ab9cad461e
7
+ data.tar.gz: f14387ba9bc6e7ca3b97176fe1d51f4fa001ca9caba1dc6377d13e4c573896f953575f6efa682bbf55d6704657a53eb73686f9ec51711298549b49a2e5a07701
data/.circleci/config.yml CHANGED
@@ -3,26 +3,14 @@ jobs:
3
3
  build:
4
4
  working_directory: ~/deepl-rb
5
5
  docker:
6
- - image: circleci/ruby:2.1
6
+ - image: circleci/ruby:2.7
7
7
  steps:
8
8
  - checkout
9
9
 
10
- # Restore bundle cache
11
- - type: cache-restore
12
- name: Restore bundle cache
13
- key: deepl-rb-bundle-{{ checksum "Gemfile.lock" }}
14
-
15
10
  - run:
16
11
  name: Bundle Install
17
12
  command: bundle install --path vendor/bundle
18
13
 
19
- # Store bundle cache
20
- - type: cache-save
21
- name: Store bundle cache
22
- key: deepl-rb-bundle-{{ checksum "Gemfile.lock" }}
23
- paths:
24
- - vendor/bundle
25
-
26
14
  # Run rspec
27
15
  - type: shell
28
16
  command: |
data/.rubocop.yml CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  AllCops:
4
4
  DisplayCopNames: true
5
+ NewCops: enable
5
6
  Exclude:
6
7
  - deepl-rb.gemspec
7
8
  - vendor/**/*
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  group :development do
@@ -5,6 +7,10 @@ group :development do
5
7
  gem 'juwelier'
6
8
  end
7
9
 
10
+ group :test, :development do
11
+ gem 'byebug', require: 'byebug'
12
+ end
13
+
8
14
  group :test do
9
15
  # Test
10
16
  gem 'codecov', require: false
data/README.md CHANGED
@@ -40,11 +40,39 @@ You can also configure the API host and the API version:
40
40
  ```rb
41
41
  DeepL.configure do |config|
42
42
  config.auth_key = 'your-api-token'
43
- config.host = 'https://test-api.deepl.com' # Default value is 'https://api.deepl.com'
43
+ config.host = 'https://api-free.deepl.com' # Default value is 'https://api.deepl.com'
44
44
  config.version = 'v1' # Default value is 'v2'
45
45
  end
46
46
  ```
47
47
 
48
+ ### Available languages
49
+
50
+ Available languages can be retrieved via API:
51
+
52
+ ```rb
53
+ languages = DeepL.languages
54
+
55
+ puts languages.class
56
+ # => Array
57
+ puts languages.first.class
58
+ # => DeepL::Resources::Language
59
+ puts "#{languages.first.code} -> #{languages.first.name}"
60
+ # => "ES -> Spanish"
61
+ ```
62
+
63
+ Note that source and target languages may be different, which can be retrieved by using the `type`
64
+ option:
65
+
66
+ ```rb
67
+ puts DeepL.languages(type: :source).count
68
+ # => 24
69
+ puts DeepL.languages(type: :target).count
70
+ # => 26
71
+ ```
72
+
73
+ All languages are also defined on the
74
+ [official API documentation](https://www.deepl.com/docs-api/translating-text/)
75
+
48
76
  ### Translate
49
77
 
50
78
  To translate a simple text, use the `translate` method:
@@ -79,18 +107,6 @@ puts translations.first.class
79
107
  # => DeepL::Resources::Text
80
108
  ```
81
109
 
82
- Here's a list of available language codes:
83
-
84
- | Language code | Language
85
- | --------------- | ---------------
86
- | `EN` | English
87
- | `DE` | German
88
- | `FR` | French
89
- | `ES` | Spanish
90
- | `IT` | Italian
91
- | `NL` | Dutch
92
- | `PL` | Polish
93
-
94
110
  You can also use custom query parameters, like `tag_handling`, `split_sentences`, `non_splitting_tags` or `ignore_tags`:
95
111
 
96
112
  ```rb
@@ -111,7 +127,7 @@ The following parameters will be automatically converted:
111
127
  | `non_splitting_tags` | Converts arrays to strings joining by commas
112
128
  | `ignore_tags` | Converts arrays to strings joining by commas
113
129
 
114
- ### Usage
130
+ ### Monitor usage
115
131
 
116
132
  To check current API usage, use:
117
133
 
@@ -128,11 +144,12 @@ puts usage.character_limit
128
144
 
129
145
  You can capture and process exceptions that may be raised during API calls. These are all the possible exceptions:
130
146
 
131
- | Exception class | Descripcion |
147
+ | Exception class | Description |
132
148
  | --------------- | ----------- |
133
- | `DeepL::Exceptions::AuthorizationFailed` | The authorization process has failed. Check your auth_key value. |
149
+ | `DeepL::Exceptions::AuthorizationFailed` | The authorization process has failed. Check your `auth_key` value. |
134
150
  | `DeepL::Exceptions::BadRequest` | Something is wrong in your request. Check `exception.message` for more information. |
135
151
  | `DeepL::Exceptions::LimitExceeded` | You've reached the API's call limit. |
152
+ | `DeepL::Exceptions::QuotaExceeded` | You've reached the API's character limit. |
136
153
  | `DeepL::Exceptions::RequestError` | An unkown request error. Check `exception.response` and `exception.request` for more information. |
137
154
 
138
155
  An exampling of handling a generic exception:
@@ -146,9 +163,31 @@ rescue DeepL::Exceptions::RequestError => e
146
163
  puts "Response body: #{e.response.body}"
147
164
  puts "Request body: #{e.request.body}"
148
165
  end
166
+ ```
167
+
168
+ ## Integrations
169
+
170
+ ### Ruby on Rails
171
+
172
+ You may use this gem as a standalone service by creating an initializer on your
173
+ `config/initializers` folder with your DeepL configuration. For example:
149
174
 
175
+ ```rb
176
+ # config/initializers/deepl.rb
177
+ DeepL.configure do |config|
178
+ # Your configuration goes here
179
+ end
150
180
  ```
151
181
 
182
+ Since the DeepL service is defined globally, you can use service anywhere in your code
183
+ (controllers, models, views, jobs, plain ruby objects… you name it).
184
+
185
+ ### i18n-tasks
186
+
187
+ You may also take a look at [`i18n-tasks`](https://github.com/glebm/i18n-tasks), which is a gem
188
+ that helps you find and manage missing and unused translations. `deepl-rb` is used as one of the
189
+ backend services to translate content.
190
+
152
191
  ## Development
153
192
 
154
193
  Clone the repository, and install its dependencies:
@@ -164,11 +203,3 @@ To run tests (rspec and rubocop), use
164
203
  ```
165
204
  bundle exec rake test
166
205
  ```
167
-
168
- ## Contributors
169
-
170
- This project has been developed by:
171
-
172
- | Avatar | Name | Nickname | Email |
173
- | ------ | ---- | -------- | ----- |
174
- | ![](http://www.gravatar.com/avatar/2ae6d81e0605177ba9e17b19f54e6b6c.jpg?s=64) | Daniel Herzog | Wikiti | [info@danielherzog.es](mailto:info@danielherzog.es)
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
  require 'bundler'
3
5
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.3.0
data/deepl-rb.gemspec CHANGED
@@ -2,16 +2,16 @@
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 2.2.0 ruby lib
5
+ # stub: deepl-rb 2.3.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "deepl-rb".freeze
9
- s.version = "2.2.0"
9
+ s.version = "2.3.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Daniel Herzog".freeze]
14
- s.date = "2018-11-28"
14
+ s.date = "2021-05-17"
15
15
  s.description = "A simple ruby wrapper for the DeepL translation API (v1). For more information, check this: https://www.deepl.com/docs/api-reference.html".freeze
16
16
  s.email = "info@danielherzog.es".freeze
17
17
  s.extra_rdoc_files = [
@@ -22,7 +22,6 @@ Gem::Specification.new do |s|
22
22
  ".circleci/config.yml",
23
23
  ".rubocop.yml",
24
24
  "Gemfile",
25
- "Gemfile.lock",
26
25
  "LICENSE.md",
27
26
  "README.md",
28
27
  "Rakefile",
@@ -35,41 +34,48 @@ Gem::Specification.new do |s|
35
34
  "lib/deepl/exceptions/bad_request.rb",
36
35
  "lib/deepl/exceptions/error.rb",
37
36
  "lib/deepl/exceptions/limit_exceeded.rb",
37
+ "lib/deepl/exceptions/quota_exceeded.rb",
38
38
  "lib/deepl/exceptions/request_error.rb",
39
39
  "lib/deepl/requests/base.rb",
40
+ "lib/deepl/requests/languages.rb",
40
41
  "lib/deepl/requests/translate.rb",
41
42
  "lib/deepl/requests/usage.rb",
42
43
  "lib/deepl/resources/base.rb",
44
+ "lib/deepl/resources/language.rb",
43
45
  "lib/deepl/resources/text.rb",
44
46
  "lib/deepl/resources/usage.rb",
45
47
  "spec/api/api_spec.rb",
46
48
  "spec/api/configuration_spec.rb",
47
49
  "spec/api/deepl_spec.rb",
50
+ "spec/fixtures/vcr_cassettes/deepl_languages.yml",
48
51
  "spec/fixtures/vcr_cassettes/deepl_translate.yml",
49
52
  "spec/fixtures/vcr_cassettes/deepl_usage.yml",
53
+ "spec/fixtures/vcr_cassettes/languages.yml",
50
54
  "spec/fixtures/vcr_cassettes/translate_texts.yml",
51
55
  "spec/fixtures/vcr_cassettes/usage.yml",
56
+ "spec/requests/languages_spec.rb",
52
57
  "spec/requests/translate_spec.rb",
53
58
  "spec/requests/usage_spec.rb",
59
+ "spec/resources/language_spec.rb",
54
60
  "spec/resources/text_spec.rb",
55
61
  "spec/resources/usage_spec.rb",
56
62
  "spec/spec_helper.rb"
57
63
  ]
58
64
  s.homepage = "http://github.com/wikiti/deepl-rb".freeze
59
65
  s.licenses = ["MIT".freeze]
60
- s.rubygems_version = "2.6.14".freeze
66
+ s.rubygems_version = "3.1.2".freeze
61
67
  s.summary = "A simple ruby wrapper for the DeepL API".freeze
62
68
 
63
69
  if s.respond_to? :specification_version then
64
70
  s.specification_version = 4
71
+ end
65
72
 
66
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
67
- s.add_development_dependency(%q<juwelier>.freeze, [">= 0"])
68
- else
69
- s.add_dependency(%q<juwelier>.freeze, [">= 0"])
70
- end
73
+ if s.respond_to? :add_runtime_dependency then
74
+ s.add_development_dependency(%q<juwelier>.freeze, [">= 0"])
75
+ s.add_development_dependency(%q<byebug>.freeze, [">= 0"])
71
76
  else
72
77
  s.add_dependency(%q<juwelier>.freeze, [">= 0"])
78
+ s.add_dependency(%q<byebug>.freeze, [">= 0"])
73
79
  end
74
80
  end
75
81
 
data/lib/deepl.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -- Dependencies
2
4
  require 'json'
3
5
  require 'net/http'
@@ -8,14 +10,17 @@ require 'deepl/exceptions/request_error'
8
10
  require 'deepl/exceptions/authorization_failed'
9
11
  require 'deepl/exceptions/bad_request'
10
12
  require 'deepl/exceptions/limit_exceeded'
13
+ require 'deepl/exceptions/quota_exceeded'
11
14
 
12
15
  # -- Requests
13
16
  require 'deepl/requests/base'
17
+ require 'deepl/requests/languages'
14
18
  require 'deepl/requests/translate'
15
19
  require 'deepl/requests/usage'
16
20
 
17
21
  # -- Responses and resources
18
22
  require 'deepl/resources/base'
23
+ require 'deepl/resources/language'
19
24
  require 'deepl/resources/text'
20
25
  require 'deepl/resources/usage'
21
26
 
@@ -33,6 +38,10 @@ module DeepL
33
38
  @api ||= API.new(configuration)
34
39
  end
35
40
 
41
+ def languages(options = {})
42
+ Requests::Languages.new(api, options).request
43
+ end
44
+
36
45
  def translate(text, source_lang, target_lang, options = {})
37
46
  configure if @configuration.nil?
38
47
  Requests::Translate.new(api, text, source_lang, target_lang, options).request
data/lib/deepl/api.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeepL
2
4
  class API
3
5
  attr_reader :configuration
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeepL
2
4
  class Configuration
3
5
  ATTRIBUTES = %i[auth_key host version].freeze
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeepL
2
4
  module Exceptions
3
5
  class AuthorizationFailed < RequestError
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeepL
2
4
  module Exceptions
3
5
  class BadRequest < RequestError
4
6
  def message
5
7
  JSON.parse(response.body)['message']
8
+ rescue JSON::ParserError
9
+ response.body
6
10
  end
7
11
  end
8
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeepL
2
4
  module Exceptions
3
5
  class Error < StandardError
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeepL
2
4
  module Exceptions
3
5
  class LimitExceeded < RequestError
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeepL
4
+ module Exceptions
5
+ class QuotaExceeded < RequestError
6
+ def message
7
+ 'Quota exceeded. The character limit has been reached.'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,15 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeepL
2
4
  module Exceptions
3
5
  class RequestError < Error
4
6
  attr_reader :request, :response
5
7
 
6
8
  def initialize(request, response)
9
+ super()
7
10
  @request = request
8
11
  @response = response
9
12
  end
10
13
 
11
14
  def message
12
- 'Unkown error.'
15
+ 'Unknown error.'
13
16
  end
14
17
  end
15
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeepL
2
4
  module Requests
3
5
  class Base
@@ -32,7 +34,7 @@ module DeepL
32
34
 
33
35
  def post(payload)
34
36
  request = Net::HTTP::Post.new(uri.request_uri)
35
- request.set_form_data(payload.reject { |_, v| v.nil? })
37
+ request.set_form_data(payload.compact)
36
38
  response = http.request(request)
37
39
 
38
40
  validate_response!(request, response)
@@ -62,6 +64,7 @@ module DeepL
62
64
  when '400' then raise Exceptions::BadRequest.new(request, response)
63
65
  when '403' then raise Exceptions::AuthorizationFailed.new(request, response)
64
66
  when '429' then raise Exceptions::LimitExceeded.new(request, response)
67
+ when '456' then raise Exceptions::QuotaExceeded.new(request, response)
65
68
  else raise Exceptions::RequestError.new(request, response)
66
69
  end
67
70
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeepL
4
+ module Requests
5
+ class Languages < Base
6
+ def initialize(api, options = {})
7
+ super(api, options)
8
+ end
9
+
10
+ def request
11
+ build_languages(*get)
12
+ end
13
+
14
+ private
15
+
16
+ def build_languages(request, response)
17
+ data = JSON.parse(response.body)
18
+ data.map do |language|
19
+ Resources::Language.new(language['language'], language['name'], request, response)
20
+ end
21
+ end
22
+
23
+ def path
24
+ 'languages'
25
+ end
26
+ end
27
+ end
28
+ end