abbyy-cloud 0.0.1 → 0.0.2
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 +4 -4
- data/.rubocop.yml +4 -2
- data/CHANGELOG.md +21 -0
- data/README.md +15 -6
- data/abbyy-cloud.gemspec +1 -2
- data/lib/abbyy/cloud.rb +20 -21
- data/lib/abbyy/cloud/{argument_error.rb → exceptions/argument_error.rb} +0 -0
- data/lib/abbyy/cloud/{response_error.rb → exceptions/response_error.rb} +1 -8
- data/lib/abbyy/cloud/{type_error.rb → exceptions/type_error.rb} +0 -0
- data/lib/abbyy/cloud/models/error.rb +12 -0
- data/lib/abbyy/cloud/models/translation.rb +10 -0
- data/lib/abbyy/cloud/namespaces/base.rb +11 -0
- data/lib/abbyy/cloud/namespaces/orders.rb +25 -0
- data/lib/abbyy/cloud/operations/base.rb +78 -0
- data/lib/abbyy/cloud/{operation → operations}/translate.rb +3 -6
- data/lib/abbyy/cloud/settings.rb +16 -0
- data/spec/abbyy/cloud/settings_spec.rb +101 -0
- data/spec/abbyy/cloud_spec.rb +3 -47
- data/spec/feature/abbyy/{cloud_translate_spec.rb → order_translate_spec.rb} +10 -5
- metadata +18 -23
- data/lib/abbyy/cloud/operation.rb +0 -76
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d52d8a388887b3f4e08cf42ef30ae712b906871
|
4
|
+
data.tar.gz: a10ee9b0f18b09cb669b1d48f8724f2df89a9ba2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad61bbb9f0c6fa939e34383692fece8384ed621269eb4761e530907e12d8a95d34b5ce3c36dd001f616b94f500ea0d21fc964bb788b80b79997f8417c2341c2a
|
7
|
+
data.tar.gz: 66999b7e975385018c8d40f6f31e67414ece9f4f36781af0359237024dff32f23de0880691f608613aaf4539ca6012316b95bb2fc3f7a6394bae2702be283a3f
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# [v0.0.2 2016-08-18](https://github.com/nepalez/abbyy-cloud/tree/v0.0.2)
|
2
|
+
|
3
|
+
### Changed
|
4
|
+
|
5
|
+
* Move `#translation` from root to `#orders` namespace (nepalez)
|
6
|
+
|
7
|
+
Instead of `client.translation(*)` use `client.orders.translation(*)`
|
8
|
+
|
9
|
+
* Make `#translation` return model `ABBYY::Cloud::Models::Translation` instead of hash (nepalez)
|
10
|
+
|
11
|
+
### Internal
|
12
|
+
|
13
|
+
* Extract settings from root object and isolate them in the shareable container `ABBYY::Cloud::Settings` (nepalez)
|
14
|
+
* Add namespaces for operations (nepalez)
|
15
|
+
* Add models for objects returned by operations (nepalez)
|
16
|
+
|
17
|
+
[Compare v0.0.1...v0.0.2](https://github.com/nepalez/abbyy-cloud/compare/v0.0.1...v0.0.2)
|
18
|
+
|
19
|
+
# [v0.0.1 2016-08-16](https://github.com/nepalez/abbyy-cloud/tree/v0.0.1)
|
20
|
+
|
21
|
+
First public release
|
data/README.md
CHANGED
@@ -31,22 +31,25 @@ CLIENT = ABBYY::Cloud.new id: "foo",
|
|
31
31
|
version: 0 # the only supported version
|
32
32
|
```
|
33
33
|
|
34
|
-
###
|
34
|
+
### Orders
|
35
|
+
|
36
|
+
#### Instant Translation
|
35
37
|
|
36
38
|
See [the specification](https://api.abbyy.cloud/swagger/ui/index#!/Order/Order_Translate).
|
37
39
|
|
38
40
|
```ruby
|
39
|
-
result = CLIENT.translate("To be or not to be", from: :en, to: :ru)
|
41
|
+
result = CLIENT.orders.translate("To be or not to be", from: :en, to: :ru)
|
40
42
|
|
41
|
-
result.class # => ABBYY::Cloud::Translation
|
43
|
+
result.class # => ABBYY::Cloud::Models::Translation
|
42
44
|
result.translation # => "Быть или не быть"
|
43
|
-
result.
|
45
|
+
result.id # => "2832934"
|
46
|
+
result.to_h # => { id: "2832934", translation: "Быть или не быть" }
|
44
47
|
```
|
45
48
|
|
46
49
|
You can specify an engine (different from default):
|
47
50
|
|
48
51
|
```ruby
|
49
|
-
CLIENT.translate("To be or not to be", from: :en, to: :ru, engine: "Bing")
|
52
|
+
CLIENT.orders.translate("To be or not to be", from: :en, to: :ru, engine: "Bing")
|
50
53
|
```
|
51
54
|
|
52
55
|
The method raises an exception in case the cloud responded with error.
|
@@ -54,13 +57,19 @@ The method raises an exception in case the cloud responded with error.
|
|
54
57
|
```ruby
|
55
58
|
error = \
|
56
59
|
begin
|
57
|
-
CLIENT.translate("To be or not to be")
|
60
|
+
CLIENT.orders.translate("To be or not to be")
|
58
61
|
rescue ABBYY::Cloud::Error => error
|
59
62
|
error
|
60
63
|
end
|
61
64
|
|
62
65
|
error.class # => ABBYY::Cloud::ResponceError
|
63
66
|
error.status # => 400
|
67
|
+
```
|
68
|
+
|
69
|
+
The exception carries returned error model in its `#data` attribute:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
error.data # => ABBYY::Cloud::Models::Error
|
64
73
|
error.data.to_h
|
65
74
|
# => {
|
66
75
|
# model_state: {},
|
data/abbyy-cloud.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = "abbyy-cloud"
|
3
|
-
gem.version = "0.0.
|
3
|
+
gem.version = "0.0.2"
|
4
4
|
gem.authors = ["Andrew Kozin"]
|
5
5
|
gem.email = ["andrew.kozin@gmail.com"]
|
6
6
|
gem.summary = "HTTP client to ABBYY Cloud API"
|
@@ -16,7 +16,6 @@ Gem::Specification.new do |gem|
|
|
16
16
|
|
17
17
|
gem.add_runtime_dependency "dry-initializer", "~> 0.4.0"
|
18
18
|
gem.add_runtime_dependency "dry-struct", "~> 0.0.1"
|
19
|
-
gem.add_runtime_dependency "dry-types", "~> 0.8.0"
|
20
19
|
|
21
20
|
gem.add_development_dependency "bundler", "~> 1.12"
|
22
21
|
gem.add_development_dependency "rake", "~> 10.0"
|
data/lib/abbyy/cloud.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require "dry-initializer"
|
2
2
|
require "dry-struct"
|
3
|
-
require "dry-types"
|
4
3
|
require "json"
|
5
4
|
require "net/http"
|
6
5
|
require "net/https"
|
@@ -9,32 +8,32 @@ module ABBYY
|
|
9
8
|
class Cloud
|
10
9
|
require_relative "cloud/struct"
|
11
10
|
require_relative "cloud/types"
|
12
|
-
require_relative "cloud/response_error"
|
13
|
-
require_relative "cloud/argument_error"
|
14
|
-
require_relative "cloud/type_error"
|
15
11
|
require_relative "cloud/connection"
|
16
|
-
require_relative "cloud/
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
12
|
+
require_relative "cloud/settings"
|
13
|
+
|
14
|
+
require_relative "cloud/exceptions/response_error"
|
15
|
+
require_relative "cloud/exceptions/argument_error"
|
16
|
+
require_relative "cloud/exceptions/type_error"
|
17
|
+
|
18
|
+
require_relative "cloud/models/error"
|
19
|
+
require_relative "cloud/models/translation"
|
20
|
+
|
21
|
+
require_relative "cloud/operations/base"
|
22
|
+
require_relative "cloud/operations/translate"
|
23
|
+
|
24
|
+
require_relative "cloud/namespaces/base"
|
25
|
+
require_relative "cloud/namespaces/orders"
|
26
|
+
|
27
|
+
attr_reader :settings
|
25
28
|
|
26
|
-
def
|
27
|
-
|
28
|
-
source_language: from,
|
29
|
-
target_language: to,
|
30
|
-
engine: engine,
|
31
|
-
**opts
|
29
|
+
def orders
|
30
|
+
Namespaces::Orders.new(settings)
|
32
31
|
end
|
33
32
|
|
34
33
|
private
|
35
34
|
|
36
|
-
def
|
37
|
-
@
|
35
|
+
def initialize(*args)
|
36
|
+
@settings ||= Settings.new(*args)
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|
File without changes
|
@@ -2,17 +2,10 @@
|
|
2
2
|
# It takes a raw Net::HTTPResponse and extracts all the data returned by API.
|
3
3
|
class ABBYY::Cloud
|
4
4
|
class ResponseError < StandardError
|
5
|
-
class Data < Struct
|
6
|
-
attribute :request_id, Types::Coercible::String.optional
|
7
|
-
attribute :error, Types::Coercible::String.optional
|
8
|
-
attribute :error_description, Types::Coercible::String.optional
|
9
|
-
attribute :model_state, Types::Hash.optional
|
10
|
-
end
|
11
|
-
|
12
5
|
attr_reader :status, :data
|
13
6
|
|
14
7
|
def initialize(response)
|
15
|
-
@data =
|
8
|
+
@data = Models::Error[JSON.parse(response.body)]
|
16
9
|
@status = response.code.to_i
|
17
10
|
|
18
11
|
super <<-MESSAGE.gsub(/ +\|/, "")
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class ABBYY::Cloud
|
2
|
+
# Collection of models returned in requests
|
3
|
+
module Models
|
4
|
+
# An error returned by the server in case of wrong response
|
5
|
+
class Error < Struct
|
6
|
+
attribute :request_id, Types::Coercible::String.optional
|
7
|
+
attribute :error, Types::Coercible::String.optional
|
8
|
+
attribute :error_description, Types::Coercible::String.optional
|
9
|
+
attribute :model_state, Types::Hash.optional
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class ABBYY::Cloud
|
2
|
+
module Namespaces
|
3
|
+
# Namespace for operations with orders
|
4
|
+
# @see [https://api.abbyy.cloud/swagger/ui/index#!/Order] ABBYY Cloud API
|
5
|
+
class Orders < Base
|
6
|
+
# Instantly (synchronously) translates the text
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# translate "Hello world!", from: "en", to: "fr_FR"
|
10
|
+
#
|
11
|
+
# @param [String] text
|
12
|
+
# @option [ABBYY::Cloud::Types::Language] :from Source language
|
13
|
+
# @option [ABBYY::Cloud::Types::Language] :to Target language
|
14
|
+
# @return [Hash<Symbol, Object>] translation
|
15
|
+
#
|
16
|
+
def translate(text, from:, to:, **opts)
|
17
|
+
Operations::Translate.new(settings).call source_text: text,
|
18
|
+
source_language: from,
|
19
|
+
target_language: to,
|
20
|
+
engine: settings.engine,
|
21
|
+
**opts
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# Base class for specific operations
|
2
|
+
# It validates request and response using corresponding structs
|
3
|
+
#
|
4
|
+
# @abstract
|
5
|
+
#
|
6
|
+
class ABBYY::Cloud
|
7
|
+
module Operations
|
8
|
+
class Base
|
9
|
+
# Contains helper methods to specify concrete operations
|
10
|
+
class << self
|
11
|
+
include Forwardable
|
12
|
+
|
13
|
+
def http_method(value = nil)
|
14
|
+
@http_method = value.to_s.capitalize if value
|
15
|
+
@http_method || "Post"
|
16
|
+
end
|
17
|
+
|
18
|
+
def path(value = nil)
|
19
|
+
value ? @path = value : @path
|
20
|
+
end
|
21
|
+
|
22
|
+
def link(value = nil)
|
23
|
+
value ? @link = value : @link
|
24
|
+
end
|
25
|
+
|
26
|
+
def request_body(struct = nil, &block)
|
27
|
+
provide_struct :@request_body, struct, &block
|
28
|
+
end
|
29
|
+
|
30
|
+
def response_body(struct = nil, &block)
|
31
|
+
provide_struct :@response_body, struct, &block
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def provide_struct(variable, struct, &block)
|
37
|
+
if block || instance_variable_get(variable).nil?
|
38
|
+
struct ||= Class.new(Struct).tap { |obj| obj.instance_eval(&block) }
|
39
|
+
instance_variable_set(variable, struct)
|
40
|
+
else
|
41
|
+
instance_variable_get(variable)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def_delegators :"self.class",
|
47
|
+
:link,
|
48
|
+
:http_method,
|
49
|
+
:path,
|
50
|
+
:request_body,
|
51
|
+
:response_body
|
52
|
+
|
53
|
+
include Dry::Initializer.define -> do
|
54
|
+
param :settings
|
55
|
+
end
|
56
|
+
|
57
|
+
def call(**data)
|
58
|
+
body = prepare_request_body(data)
|
59
|
+
res = settings.connection.call(http_method, path, body: body)
|
60
|
+
handle_response_body(res)
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def prepare_request_body(data)
|
66
|
+
request_body[data]
|
67
|
+
rescue => error
|
68
|
+
raise ArgumentError.new(link, data, error.message)
|
69
|
+
end
|
70
|
+
|
71
|
+
def handle_response_body(data)
|
72
|
+
response_body[data]
|
73
|
+
rescue => error
|
74
|
+
raise TypeError.new(link, data, error.message)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class ABBYY::Cloud
|
2
|
-
|
3
|
-
class Translate <
|
2
|
+
module Operations
|
3
|
+
class Translate < Base
|
4
4
|
link "https://api.abbyy.cloud/swagger/ui/index#!/Order/Order_Translate"
|
5
5
|
path "order/mt/sync"
|
6
6
|
http_method "post"
|
@@ -12,10 +12,7 @@ class ABBYY::Cloud
|
|
12
12
|
attribute :source_text, Types::Strict::String
|
13
13
|
end
|
14
14
|
|
15
|
-
response_body
|
16
|
-
attribute :id, Types::OrderId
|
17
|
-
attribute :translation, Types::Strict::String
|
18
|
-
end
|
15
|
+
response_body Models::Translation
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Container for settings, that is initialized by [ABBYY::Cloud#initializer]
|
2
|
+
# and then shared by namespaces and operations.
|
3
|
+
class ABBYY::Cloud
|
4
|
+
class Settings
|
5
|
+
include Dry::Initializer.define -> do
|
6
|
+
option :id, type: Types::AuthId
|
7
|
+
option :token, type: Types::AuthToken
|
8
|
+
option :version, type: Types::Version, default: proc { 0 }
|
9
|
+
option :engine, type: Types::Engine, default: proc { "Sandbox" }
|
10
|
+
end
|
11
|
+
|
12
|
+
def connection
|
13
|
+
@connection ||= Connection.new(version: version, id: id, token: token)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
RSpec.describe ABBYY::Cloud::Settings do
|
2
|
+
let(:options) { { id: "foo", token: "bar" } }
|
3
|
+
let(:settings) { described_class.new options }
|
4
|
+
|
5
|
+
describe ".new" do
|
6
|
+
subject { settings }
|
7
|
+
|
8
|
+
context "with wrong engine" do
|
9
|
+
before { options[:engine] = "Wrong" }
|
10
|
+
|
11
|
+
it "fails" do
|
12
|
+
expect { subject }.to raise_error(StandardError)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "without id" do
|
17
|
+
before { options.delete :id }
|
18
|
+
|
19
|
+
it "fails" do
|
20
|
+
expect { subject }.to raise_error(StandardError)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "without token" do
|
25
|
+
before { options.delete :token }
|
26
|
+
|
27
|
+
it "fails" do
|
28
|
+
expect { subject }.to raise_error(StandardError)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with empty id" do
|
33
|
+
before { options[:id] = nil }
|
34
|
+
|
35
|
+
it "fails" do
|
36
|
+
expect { subject }.to raise_error(StandardError)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "with empty token" do
|
41
|
+
before { options[:token] = nil }
|
42
|
+
|
43
|
+
it "fails" do
|
44
|
+
expect { subject }.to raise_error(StandardError)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "with wrong version" do
|
49
|
+
before { options[:id] = 1 }
|
50
|
+
|
51
|
+
it "fails" do
|
52
|
+
expect { subject }.to raise_error(StandardError)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#id" do
|
58
|
+
subject { settings.id }
|
59
|
+
it { is_expected.to eq "foo" }
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#token" do
|
63
|
+
subject { settings.token }
|
64
|
+
it { is_expected.to eq "bar" }
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#engine" do
|
68
|
+
subject { settings.engine }
|
69
|
+
|
70
|
+
context "by default:" do
|
71
|
+
it { is_expected.to eq "Sandbox" }
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when assigned:" do
|
75
|
+
before { options[:engine] = "Google" }
|
76
|
+
it { is_expected.to eq "Google" }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#version" do
|
81
|
+
subject { settings.version }
|
82
|
+
|
83
|
+
context "by default:" do
|
84
|
+
it { is_expected.to eq 0 }
|
85
|
+
end
|
86
|
+
|
87
|
+
context "when assigned:" do
|
88
|
+
before { options[:version] = 0 }
|
89
|
+
it { is_expected.to eq 0 }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "#connection" do
|
94
|
+
subject { settings.connection }
|
95
|
+
|
96
|
+
it { is_expected.to be_instance_of ABBYY::Cloud::Connection }
|
97
|
+
its(:version) { is_expected.to eq settings.version }
|
98
|
+
its(:id) { is_expected.to eq settings.id }
|
99
|
+
its(:token) { is_expected.to eq settings.token }
|
100
|
+
end
|
101
|
+
end
|
data/spec/abbyy/cloud_spec.rb
CHANGED
@@ -2,57 +2,13 @@ RSpec.describe ABBYY::Cloud do
|
|
2
2
|
let(:options) { { id: "foo", token: "bar" } }
|
3
3
|
let(:cloud) { described_class.new options }
|
4
4
|
|
5
|
-
describe "
|
6
|
-
subject { cloud }
|
5
|
+
describe "#settings" do
|
6
|
+
subject { cloud.settings }
|
7
7
|
|
8
|
+
it { is_expected.to be_a ABBYY::Cloud::Settings }
|
8
9
|
its(:version) { is_expected.to eq 0 }
|
9
10
|
its(:engine) { is_expected.to eq "Sandbox" }
|
10
11
|
its(:id) { is_expected.to eq "foo" }
|
11
12
|
its(:token) { is_expected.to eq "bar" }
|
12
|
-
|
13
|
-
context "with custom engine" do
|
14
|
-
before { options[:engine] = "Google" }
|
15
|
-
its(:engine) { is_expected.to eq "Google" }
|
16
|
-
end
|
17
|
-
|
18
|
-
context "with wrong engine" do
|
19
|
-
before { options[:engine] = "Wrong" }
|
20
|
-
|
21
|
-
it "fails" do
|
22
|
-
expect { subject }.to raise_error(StandardError)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context "without id" do
|
27
|
-
before { options.delete :id }
|
28
|
-
|
29
|
-
it "fails" do
|
30
|
-
expect { subject }.to raise_error(StandardError)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context "without token" do
|
35
|
-
before { options.delete :token }
|
36
|
-
|
37
|
-
it "fails" do
|
38
|
-
expect { subject }.to raise_error(StandardError)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context "with empty id" do
|
43
|
-
before { options[:id] = nil }
|
44
|
-
|
45
|
-
it "fails" do
|
46
|
-
expect { subject }.to raise_error(StandardError)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context "with empty token" do
|
51
|
-
before { options[:token] = nil }
|
52
|
-
|
53
|
-
it "fails" do
|
54
|
-
expect { subject }.to raise_error(StandardError)
|
55
|
-
end
|
56
|
-
end
|
57
13
|
end
|
58
14
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
RSpec.describe
|
2
|
-
let(:client) {
|
1
|
+
RSpec.describe "orders.translate" do
|
2
|
+
let(:client) { ABBYY::Cloud.new settings }
|
3
3
|
let(:settings) { { id: "foo", token: "bar", engine: default_engine } }
|
4
4
|
let(:default_engine) { "Google" }
|
5
5
|
let(:custom_engine) { "Bing" }
|
@@ -21,13 +21,18 @@ RSpec.describe ABBYY::Cloud, "#translate" do
|
|
21
21
|
body: JSON(response_model)
|
22
22
|
end
|
23
23
|
|
24
|
-
subject { client.translate source_text, params }
|
24
|
+
subject { client.orders.translate source_text, params }
|
25
25
|
|
26
|
-
it "sends a request to ABBYY Cloud API
|
27
|
-
|
26
|
+
it "sends a request to ABBYY Cloud API" do
|
27
|
+
subject
|
28
28
|
expect(a_request(:post, path)).to have_been_made
|
29
29
|
end
|
30
30
|
|
31
|
+
it "returns translation model" do
|
32
|
+
expect(subject).to be_instance_of ABBYY::Cloud::Models::Translation
|
33
|
+
expect(subject.to_h).to eq response_model
|
34
|
+
end
|
35
|
+
|
31
36
|
context "without custom engine:" do
|
32
37
|
before { params.delete :engine }
|
33
38
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abbyy-cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kozin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-initializer
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.0.1
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: dry-types
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.8.0
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.8.0
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: bundler
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,29 +129,37 @@ executables: []
|
|
143
129
|
extensions: []
|
144
130
|
extra_rdoc_files:
|
145
131
|
- README.md
|
132
|
+
- CHANGELOG.md
|
146
133
|
files:
|
147
134
|
- ".gitignore"
|
148
135
|
- ".rspec"
|
149
136
|
- ".rubocop.yml"
|
150
137
|
- ".travis.yml"
|
138
|
+
- CHANGELOG.md
|
151
139
|
- Gemfile
|
152
140
|
- LICENSE.txt
|
153
141
|
- README.md
|
154
142
|
- Rakefile
|
155
143
|
- abbyy-cloud.gemspec
|
156
144
|
- lib/abbyy/cloud.rb
|
157
|
-
- lib/abbyy/cloud/argument_error.rb
|
158
145
|
- lib/abbyy/cloud/connection.rb
|
159
|
-
- lib/abbyy/cloud/
|
160
|
-
- lib/abbyy/cloud/
|
161
|
-
- lib/abbyy/cloud/
|
146
|
+
- lib/abbyy/cloud/exceptions/argument_error.rb
|
147
|
+
- lib/abbyy/cloud/exceptions/response_error.rb
|
148
|
+
- lib/abbyy/cloud/exceptions/type_error.rb
|
149
|
+
- lib/abbyy/cloud/models/error.rb
|
150
|
+
- lib/abbyy/cloud/models/translation.rb
|
151
|
+
- lib/abbyy/cloud/namespaces/base.rb
|
152
|
+
- lib/abbyy/cloud/namespaces/orders.rb
|
153
|
+
- lib/abbyy/cloud/operations/base.rb
|
154
|
+
- lib/abbyy/cloud/operations/translate.rb
|
155
|
+
- lib/abbyy/cloud/settings.rb
|
162
156
|
- lib/abbyy/cloud/struct.rb
|
163
|
-
- lib/abbyy/cloud/type_error.rb
|
164
157
|
- lib/abbyy/cloud/types.rb
|
165
158
|
- spec/abbyy/cloud/connection_spec.rb
|
166
159
|
- spec/abbyy/cloud/response_error_spec.rb
|
160
|
+
- spec/abbyy/cloud/settings_spec.rb
|
167
161
|
- spec/abbyy/cloud_spec.rb
|
168
|
-
- spec/feature/abbyy/
|
162
|
+
- spec/feature/abbyy/order_translate_spec.rb
|
169
163
|
- spec/spec_helper.rb
|
170
164
|
homepage: https://github.com/nepalez/abbyy-cloud
|
171
165
|
licenses:
|
@@ -194,6 +188,7 @@ summary: HTTP client to ABBYY Cloud API
|
|
194
188
|
test_files:
|
195
189
|
- spec/abbyy/cloud/connection_spec.rb
|
196
190
|
- spec/abbyy/cloud/response_error_spec.rb
|
191
|
+
- spec/abbyy/cloud/settings_spec.rb
|
197
192
|
- spec/abbyy/cloud_spec.rb
|
198
|
-
- spec/feature/abbyy/
|
193
|
+
- spec/feature/abbyy/order_translate_spec.rb
|
199
194
|
- spec/spec_helper.rb
|
@@ -1,76 +0,0 @@
|
|
1
|
-
# Base class for specific operations
|
2
|
-
# It validates request and response using corresponding structs
|
3
|
-
#
|
4
|
-
# @abstract
|
5
|
-
#
|
6
|
-
class ABBYY::Cloud
|
7
|
-
class Operation
|
8
|
-
# Contains helper methods to specify concrete operations
|
9
|
-
class << self
|
10
|
-
include Forwardable
|
11
|
-
|
12
|
-
def http_method(value = nil)
|
13
|
-
@http_method = value.to_s.capitalize if value
|
14
|
-
@http_method || "Post"
|
15
|
-
end
|
16
|
-
|
17
|
-
def path(value = nil)
|
18
|
-
value ? @path = value : @path
|
19
|
-
end
|
20
|
-
|
21
|
-
def link(value = nil)
|
22
|
-
value ? @link = value : @link
|
23
|
-
end
|
24
|
-
|
25
|
-
def request_body(struct = nil, &block)
|
26
|
-
provide_struct :@request_body, struct, &block
|
27
|
-
end
|
28
|
-
|
29
|
-
def response_body(struct = nil, &block)
|
30
|
-
provide_struct :@response_body, struct, &block
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def provide_struct(variable, struct, &block)
|
36
|
-
if block || instance_variable_get(variable).nil?
|
37
|
-
struct ||= Class.new(Struct).tap { |item| item.instance_eval(&block) }
|
38
|
-
instance_variable_set(variable, struct)
|
39
|
-
else
|
40
|
-
instance_variable_get(variable)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def_delegators :"self.class",
|
46
|
-
:link,
|
47
|
-
:http_method,
|
48
|
-
:path,
|
49
|
-
:request_body,
|
50
|
-
:response_body
|
51
|
-
|
52
|
-
include Dry::Initializer.define -> do
|
53
|
-
param :connection
|
54
|
-
end
|
55
|
-
|
56
|
-
def call(**data)
|
57
|
-
body = prepare_request_body(data)
|
58
|
-
res = connection.call(http_method, path, body: body)
|
59
|
-
handle_response_body(res)
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
|
64
|
-
def prepare_request_body(data)
|
65
|
-
request_body[data]
|
66
|
-
rescue => error
|
67
|
-
raise ArgumentError.new(link, data, error.message)
|
68
|
-
end
|
69
|
-
|
70
|
-
def handle_response_body(data)
|
71
|
-
response_body[data].to_h
|
72
|
-
rescue => error
|
73
|
-
raise TypeError.new(link, data, error.message)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|