abbyy-cloud 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -13
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +11 -0
  5. data/README.md +29 -0
  6. data/abbyy-cloud.gemspec +4 -2
  7. data/lib/abbyy/cloud.rb +14 -26
  8. data/lib/abbyy/cloud/connection.rb +3 -10
  9. data/lib/abbyy/cloud/exceptions/response_error.rb +1 -1
  10. data/lib/abbyy/cloud/models/cost_type.rb +14 -0
  11. data/lib/abbyy/cloud/models/currency.rb +14 -0
  12. data/lib/abbyy/cloud/models/direction.rb +0 -1
  13. data/lib/abbyy/cloud/models/discount.rb +2 -1
  14. data/lib/abbyy/cloud/models/discount_type.rb +19 -0
  15. data/lib/abbyy/cloud/models/engine.rb +0 -2
  16. data/lib/abbyy/cloud/models/error.rb +0 -1
  17. data/lib/abbyy/cloud/models/file_format.rb +19 -0
  18. data/lib/abbyy/cloud/models/file_info.rb +33 -0
  19. data/lib/abbyy/cloud/models/file_link.rb +18 -0
  20. data/lib/abbyy/cloud/models/file_read_error.rb +20 -0
  21. data/lib/abbyy/cloud/models/file_read_status.rb +14 -0
  22. data/lib/abbyy/cloud/models/file_reference.rb +11 -0
  23. data/lib/abbyy/cloud/models/full_order.rb +46 -0
  24. data/lib/abbyy/cloud/models/label.rb +14 -0
  25. data/lib/abbyy/cloud/models/ocr_mode.rb +19 -0
  26. data/lib/abbyy/cloud/models/ocr_quality.rb +18 -0
  27. data/lib/abbyy/cloud/models/ocr_settings.rb +16 -0
  28. data/lib/abbyy/cloud/models/ocr_statistics.rb +13 -0
  29. data/lib/abbyy/cloud/models/ocr_warning.rb +16 -0
  30. data/lib/abbyy/cloud/models/ocr_warning_type.rb +29 -0
  31. data/lib/abbyy/cloud/models/order_statistics.rb +15 -0
  32. data/lib/abbyy/cloud/models/payment_type.rb +14 -0
  33. data/lib/abbyy/cloud/models/price.rb +1 -1
  34. data/lib/abbyy/cloud/models/reading_status.rb +20 -0
  35. data/lib/abbyy/cloud/models/source_segment.rb +0 -1
  36. data/lib/abbyy/cloud/models/source_tag.rb +0 -1
  37. data/lib/abbyy/cloud/models/status.rb +25 -0
  38. data/lib/abbyy/cloud/models/text_statistics.rb +15 -0
  39. data/lib/abbyy/cloud/models/transfer_data.rb +0 -3
  40. data/lib/abbyy/cloud/models/translation.rb +0 -2
  41. data/lib/abbyy/cloud/models/translation_link.rb +18 -0
  42. data/lib/abbyy/cloud/models/translation_segment.rb +0 -1
  43. data/lib/abbyy/cloud/models/translation_type.rb +14 -0
  44. data/lib/abbyy/cloud/models/unit_price.rb +3 -0
  45. data/lib/abbyy/cloud/models/unit_type.rb +14 -0
  46. data/lib/abbyy/cloud/namespaces/files.rb +19 -0
  47. data/lib/abbyy/cloud/namespaces/orders.rb +17 -0
  48. data/lib/abbyy/cloud/namespaces/prices.rb +1 -1
  49. data/lib/abbyy/cloud/operations/base.rb +56 -19
  50. data/lib/abbyy/cloud/operations/download_file.rb +12 -0
  51. data/lib/abbyy/cloud/operations/engines.rb +1 -1
  52. data/lib/abbyy/cloud/operations/find_order.rb +13 -0
  53. data/lib/abbyy/cloud/operations/prices.rb +1 -1
  54. data/lib/abbyy/cloud/operations/submit_order.rb +32 -0
  55. data/lib/abbyy/cloud/operations/translate.rb +1 -1
  56. data/lib/abbyy/cloud/operations/translate_segments.rb +1 -1
  57. data/lib/abbyy/cloud/operations/upload_file.rb +22 -0
  58. data/lib/abbyy/cloud/types.rb +8 -17
  59. data/spec/feature/abbyy/files_download_spec.rb +57 -0
  60. data/spec/feature/abbyy/files_upload_spec.rb +129 -0
  61. data/spec/feature/abbyy/orders_create_spec.rb +245 -0
  62. data/spec/feature/abbyy/orders_find_spec.rb +116 -0
  63. data/spec/{abbyy → unit/abbyy}/cloud/connection_spec.rb +1 -1
  64. data/spec/{abbyy → unit/abbyy}/cloud/models/direction_spec.rb +0 -0
  65. data/spec/{abbyy → unit/abbyy}/cloud/models/discount_spec.rb +0 -0
  66. data/spec/{abbyy → unit/abbyy}/cloud/models/engine_spec.rb +0 -0
  67. data/spec/{abbyy → unit/abbyy}/cloud/models/error_spec.rb +0 -0
  68. data/spec/unit/abbyy/cloud/models/file_link_spec.rb +51 -0
  69. data/spec/unit/abbyy/cloud/models/file_reference_spec.rb +24 -0
  70. data/spec/unit/abbyy/cloud/models/full_order_spec.rb +192 -0
  71. data/spec/{abbyy → unit/abbyy}/cloud/models/locale_spec.rb +0 -0
  72. data/spec/unit/abbyy/cloud/models/order_statistics_spec.rb +15 -0
  73. data/spec/{abbyy → unit/abbyy}/cloud/models/price_spec.rb +0 -8
  74. data/spec/{abbyy → unit/abbyy}/cloud/models/source_segment_spec.rb +0 -0
  75. data/spec/{abbyy → unit/abbyy}/cloud/models/source_tag_spec.rb +0 -0
  76. data/spec/{abbyy → unit/abbyy}/cloud/models/transfer_data_spec.rb +0 -0
  77. data/spec/unit/abbyy/cloud/models/translation_link_spec.rb +66 -0
  78. data/spec/{abbyy → unit/abbyy}/cloud/models/translation_segment_spec.rb +0 -0
  79. data/spec/{abbyy → unit/abbyy}/cloud/models/translation_spec.rb +0 -0
  80. data/spec/{abbyy → unit/abbyy}/cloud/models/unit_price_spec.rb +0 -0
  81. data/spec/{abbyy → unit/abbyy}/cloud/response_error_spec.rb +0 -0
  82. data/spec/{abbyy → unit/abbyy}/cloud/settings_spec.rb +0 -0
  83. data/spec/{abbyy → unit/abbyy}/cloud_spec.rb +0 -0
  84. metadata +114 -37
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9a52f7f789832f6f81c8b3e5dc41fcef0abdd29c
4
- data.tar.gz: 83bec335d92f5c4fe7768decbd276d4b742c6d07
3
+ metadata.gz: e315b9643988d2d779dbbe0e22deca6552111e47
4
+ data.tar.gz: 1255379a0e408cdba1c524395d8c2a3a653bf7f9
5
5
  SHA512:
6
- metadata.gz: 70b33579612619b85d5bd822f491539cde7e0e19f83b68c2d34eb96fe6bee344f46c688bce6b950404b32736fa9cd3d4780ed2526968e2552595e2867ff5b15f
7
- data.tar.gz: bbfca1cbaf178990630606f6d9646b977761b12e2dedeeb9ec42e877f946cbada95d42829660183ae97ef9a5fa44facd0012436197e3ae3a8eab4a8d206fe45a
6
+ metadata.gz: 71b4414e1f7f9aba1058e7bac40dc5fa38c0f14079c593ba5426b89f1b015b492a626472debad76e2282c4cf3f1ad543ab7b9f5005f7446034b8a0e831ce0153
7
+ data.tar.gz: 8fe5ec65636e196b1a9e2e1da3cd539a279b89891929414256bdc91c79d0620dee8906a0329c0756af60186b724b315fe16afb1fa82ecb87ca3a4e04a62b2877
@@ -1,4 +1,4 @@
1
- require: rubocop-rspec
1
+ require: rubocop
2
2
 
3
3
  AllCops:
4
4
  Include:
@@ -12,12 +12,6 @@ AllCops:
12
12
  - vendor/**/*
13
13
  TargetRubyVersion: 2.3
14
14
 
15
- RSpec/NamedSubject:
16
- Enabled: false
17
-
18
- RSpec/DescribeClass:
19
- Enabled: false
20
-
21
15
  Documentation:
22
16
  Enabled: false
23
17
 
@@ -41,21 +35,21 @@ Style/AccessorMethodName:
41
35
  Style/Alias:
42
36
  Enabled: false # `alias_method` and `alias` have diferent behaviour
43
37
 
44
- Style/FileName:
38
+ Style/ClassAndModuleChildren:
45
39
  Enabled: false
46
40
 
47
- Style/Lambda:
41
+ Style/FileName:
48
42
  Enabled: false
49
43
 
50
- Style/ClassAndModuleChildren:
44
+ Style/FrozenStringLiteralComment:
45
+ Enabled: false # not to be used before migration to Ruby 3+
46
+
47
+ Style/Lambda:
51
48
  Enabled: false
52
49
 
53
50
  Style/NumericLiterals:
54
51
  Enabled: false
55
52
 
56
- Style/FrozenStringLiteralComment:
57
- Enabled: false # not to be used before migration to Ruby 3+
58
-
59
53
  Style/RaiseArgs:
60
54
  Enabled: false
61
55
 
@@ -8,7 +8,7 @@ script:
8
8
  rvm:
9
9
  - '2.3.0'
10
10
  - ruby-head
11
- - jruby-9
11
+ - jruby-9.1.0.0 # The first MRI-2.3 compatible version
12
12
  - jruby-head
13
13
  before_install: gem install bundler -v 1.12.5
14
14
  matrix:
@@ -1,3 +1,14 @@
1
+ # Master (to be released)
2
+
3
+ ### Added
4
+
5
+ * Operation `files.upload` (nepalez)
6
+ * Operation `files.download` (nepalez)
7
+ * Operation `orders.create(options)` (nepalez)
8
+ * Operation `orders.find(id)` (nepalez)
9
+
10
+ [Compare v0.0.5...HEAD](https://github.com/nepalez/abbyy-cloud/compare/v0.0.5...HEAD)
11
+
1
12
  # [v0.0.5 2016-08-23](https://github.com/nepalez/abbyy-cloud/tree/v0.0.5)
2
13
 
3
14
  ### Fixed
data/README.md CHANGED
@@ -108,6 +108,35 @@ result.class # => ABBYY::Cloud::Models::TranslationSequence
108
108
  result.map(&:text) # => ["Быть", "или не быть"]
109
109
  ```
110
110
 
111
+ ### Files
112
+
113
+ The namespace `files` contains operations with <uploaded> files.
114
+
115
+ #### upload
116
+
117
+ Uploads a file
118
+
119
+ See [the specification](https://api.abbyy.cloud/swagger/ui/index#!/File/File_UploadFile)
120
+
121
+ ```ruby
122
+ file = File.read("file_to_upload.xml")
123
+ result = CLIENT.files.upload file
124
+ result.id # => "18323"
125
+ result.token # => "foobarbaz"
126
+ # ...
127
+ ```
128
+
129
+ #### download
130
+
131
+ Dowloads a file by id and token
132
+
133
+ See [the specification](https://api.abbyy.cloud/swagger/ui/index#!/File/File_DownloadFile)
134
+
135
+ ```ruby
136
+ result = CLIENT.files.download(id: "foo", token: "bar")
137
+ # => #<StringIO ...>
138
+ ```
139
+
111
140
  ### Prices
112
141
 
113
142
  The namespace `prices` contains operations with prices details.
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = "abbyy-cloud"
3
- gem.version = "0.0.5"
3
+ gem.version = "0.0.6"
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,11 +16,13 @@ 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 "hashie", "~> 3.4"
20
+ gem.add_runtime_dependency "multipart_body", "~> 0.2"
19
21
 
20
22
  gem.add_development_dependency "bundler", "~> 1.12"
21
23
  gem.add_development_dependency "rake", "~> 10.0"
22
24
  gem.add_development_dependency "rspec", "~> 3.0"
23
25
  gem.add_development_dependency "rspec-its", "~> 1.2"
24
- gem.add_development_dependency "rubocop-rspec", "~> 1.6"
26
+ gem.add_development_dependency "rubocop", "~> 0.42"
25
27
  gem.add_development_dependency "webmock", "~> 2.0"
26
28
  end
@@ -1,8 +1,10 @@
1
1
  require "dry-initializer"
2
2
  require "dry-struct"
3
+ require "hashie/mash"
3
4
  require "json"
4
5
  require "net/http"
5
6
  require "net/https"
7
+ require "multipart_body"
6
8
 
7
9
  module ABBYY
8
10
  class Cloud
@@ -11,32 +13,10 @@ module ABBYY
11
13
  require_relative "cloud/connection"
12
14
  require_relative "cloud/settings"
13
15
 
14
- require_relative "cloud/exceptions/argument_error"
15
- require_relative "cloud/exceptions/response_error"
16
- require_relative "cloud/exceptions/type_error"
17
-
18
- require_relative "cloud/models/direction"
19
- require_relative "cloud/models/discount"
20
- require_relative "cloud/models/engine"
21
- require_relative "cloud/models/error"
22
- require_relative "cloud/models/locale"
23
- require_relative "cloud/models/price"
24
- require_relative "cloud/models/source_segment"
25
- require_relative "cloud/models/source_tag"
26
- require_relative "cloud/models/transfer_data"
27
- require_relative "cloud/models/translation"
28
- require_relative "cloud/models/translation_segment"
29
- require_relative "cloud/models/unit_price"
30
-
31
- require_relative "cloud/operations/base"
32
- require_relative "cloud/operations/engines"
33
- require_relative "cloud/operations/prices"
34
- require_relative "cloud/operations/translate"
35
- require_relative "cloud/operations/translate_segments"
36
-
37
- require_relative "cloud/namespaces/base"
38
- require_relative "cloud/namespaces/machine_translations"
39
- require_relative "cloud/namespaces/prices"
16
+ %w(exceptions models operations namespaces).each do |dir|
17
+ path = File.expand_path("lib/abbyy/cloud/#{dir}/**")
18
+ Dir[path].each { |file| require file }
19
+ end
40
20
 
41
21
  attr_reader :settings
42
22
 
@@ -44,10 +24,18 @@ module ABBYY
44
24
  Namespaces::MachineTranslations.new(settings)
45
25
  end
46
26
 
27
+ def orders
28
+ Namespaces::Orders.new(settings)
29
+ end
30
+
47
31
  def prices
48
32
  Namespaces::Prices.new(settings)
49
33
  end
50
34
 
35
+ def files
36
+ Namespaces::Files.new(settings)
37
+ end
38
+
51
39
  private
52
40
 
53
41
  def initialize(*args)
@@ -13,11 +13,11 @@ class ABBYY::Cloud
13
13
 
14
14
  attr_reader :root
15
15
 
16
- def call(http_method, path, **options)
16
+ def call(http_method, path, body: nil, **options)
17
17
  uri = prepare_uri(path, options)
18
18
  req = Net::HTTP.const_get(http_method.capitalize).new(uri)
19
+ req.body = body
19
20
  setup_headers(req, options)
20
- setup_body(req, options)
21
21
 
22
22
  res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
23
23
  http.request(req)
@@ -42,19 +42,12 @@ class ABBYY::Cloud
42
42
  def setup_headers(req, headers: nil, **)
43
43
  req.basic_auth id, token
44
44
  req["accept-charset"] = "utf-8"
45
- req["accept"] = "application/json"
46
- req["content-type"] = "application/json"
47
45
  headers.to_h.each { |key, value| req[key.to_s] = value }
48
46
  end
49
47
 
50
- def setup_body(req, body: nil, **)
51
- return unless req["content-type"] == "application/json"
52
- req.body = JSON(body.to_h)
53
- end
54
-
55
48
  def handle_response(response)
56
49
  raise ResponseError.new(response) unless response.is_a? Net::HTTPSuccess
57
- JSON.parse(response.body)
50
+ response.body
58
51
  end
59
52
  end
60
53
  end
@@ -9,7 +9,7 @@ class ABBYY::Cloud
9
9
  @status = response.code.to_i
10
10
 
11
11
  super <<-MESSAGE.gsub(/ +\|/, "")
12
- |ABBYY Cloud API responded to the request {data.request_id} with a status #{status}
12
+ |ABBYY Cloud API responded to the request #{data.request_id} with a status #{status}
13
13
  | error: #{data.error}
14
14
  | description: #{data.error_description}
15
15
  | model_state: #{data.model_state}
@@ -0,0 +1,14 @@
1
+ class ABBYY::Cloud
2
+ module Models
3
+ class CostType < ::String
4
+ VALUES = %w(Default SomeDiscounts AllDiscounts).freeze
5
+
6
+ def self.new(string)
7
+ super Types::Strict::String.constrained(included_in: VALUES)[string]
8
+ end
9
+ end
10
+
11
+ # Registers type Types::CostType
12
+ Types.register_type CostType
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class ABBYY::Cloud
2
+ module Models
3
+ class Currency < ::String
4
+ FORMAT = /\A[A-Z]{3}\z/
5
+
6
+ def self.new(string)
7
+ super Types::Strict::String.constrained(format: FORMAT)[string]
8
+ end
9
+ end
10
+
11
+ # Registers type Types::Currency
12
+ Types.register_type Currency
13
+ end
14
+ end
@@ -2,7 +2,6 @@ require_relative "locale"
2
2
 
3
3
  class ABBYY::Cloud
4
4
  module Models
5
- # Description of the translation direction
6
5
  class Direction < Struct
7
6
  attribute :source, Types::Locale
8
7
  attribute :target, Types::Locale
@@ -1,6 +1,7 @@
1
+ require_relative "discount_type"
2
+
1
3
  class ABBYY::Cloud
2
4
  module Models
3
- # Description of the price discount
4
5
  class Discount < Struct
5
6
  attribute :discount_type, Types::DiscountType
6
7
  attribute :discount, Types::Coercible::Float
@@ -0,0 +1,19 @@
1
+ class ABBYY::Cloud
2
+ module Models
3
+ class DiscountType < ::String
4
+ VALUES = %w(
5
+ TMTextMatch
6
+ TMTaggedTextMatch
7
+ TMHalfContextMatch
8
+ TMFullContextMatch
9
+ ).freeze
10
+
11
+ def self.new(string)
12
+ super Types::Strict::String.constrained(included_in: VALUES)[string]
13
+ end
14
+ end
15
+
16
+ # Registers type Types::DiscountType
17
+ Types.register_type DiscountType
18
+ end
19
+ end
@@ -2,9 +2,7 @@ require_relative "locale"
2
2
  require_relative "direction"
3
3
 
4
4
  class ABBYY::Cloud
5
- # Collection of models returned in requests
6
5
  module Models
7
- # Description of the engine
8
6
  class Engine < Struct
9
7
  attribute :name, Types::Strict::String
10
8
  attribute :languages, Types::Array.member(Types::Locale)
@@ -1,7 +1,6 @@
1
1
  class ABBYY::Cloud
2
2
  # Collection of models returned in requests
3
3
  module Models
4
- # An error returned by the server in case of wrong response
5
4
  class Error < Struct
6
5
  attribute :request_id, Types::Strict::String.optional
7
6
  attribute :error, Types::Strict::String.optional
@@ -0,0 +1,19 @@
1
+ class ABBYY::Cloud
2
+ module Models
3
+ class FileFormat < ::String
4
+ VALUES = %w(
5
+ Doc
6
+ Docx
7
+ Rtf
8
+ Txt
9
+ ).freeze
10
+
11
+ def self.new(string)
12
+ super Types::Strict::String.constrained(included_in: VALUES)[string]
13
+ end
14
+ end
15
+
16
+ # Registers type Types::FileFormat
17
+ Types.register_type FileFormat
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ require_relative "file_reference"
2
+ require_relative "locale"
3
+ require_relative "ocr_settings"
4
+ require_relative "ocr_statistics"
5
+ require_relative "ocr_warning"
6
+ require_relative "reading_status"
7
+ require_relative "text_statistics"
8
+
9
+ class ABBYY::Cloud
10
+ module Models
11
+ class FileInfo < FileReference
12
+ attribute :name, Types::Strict::String
13
+ attribute :mime, Types::Strict::String
14
+ attribute :created, Types::Form::Time
15
+ attribute :is_recognizable, Types::Form::Bool
16
+ attribute :is_deleted, Types::Form::Bool
17
+ attribute :reading_status, Types::Strict::String
18
+ attribute :reading_progress, Types::Coercible::Int
19
+ attribute :expected_languages, Types::Array.member(Types::Locale).optional
20
+ attribute :processed, Types::Form::Time.optional
21
+ attribute :deleted, Types::Form::Time.optional
22
+ attribute :error, Types::Strict::String.optional
23
+ attribute :statistics, Types::TextStatistics.optional
24
+ attribute :ocr_settings, Types::OcrSettings.optional
25
+ attribute :ocr_statistics, Types::OcrStatistics.optional
26
+ attribute :ocr_warnings,
27
+ Types::Array.member(Types::OcrWarning).optional
28
+ end
29
+
30
+ # Registers type Types::FileInfo
31
+ Types.register_type FileInfo
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ require_relative "file_reference"
2
+ require_relative "locale"
3
+
4
+ class ABBYY::Cloud
5
+ module Models
6
+ class FileLink < FileReference
7
+ attribute :name, Types::Strict::String
8
+ attribute :language, Types::Locale
9
+ attribute :is_deleted, Types::Form::Bool
10
+ attribute :chars_count, Types::Coercible::Int.optional
11
+ attribute :words_count, Types::Coercible::Int.optional
12
+ attribute :pages_count, Types::Coercible::Int.optional
13
+ end
14
+
15
+ # Registers type Types::FileLink
16
+ Types.register_type FileLink
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ class ABBYY::Cloud
2
+ module Models
3
+ class FileReadError < ::String
4
+ VALUES = %w(
5
+ Unsupported
6
+ FileEmpty
7
+ FileEncrypted
8
+ FileFormatError
9
+ UnknownError
10
+ ).freeze
11
+
12
+ def self.new(string)
13
+ super Types::Strict::String.constrained(included_in: VALUES)[string]
14
+ end
15
+ end
16
+
17
+ # Registers type Types::FileReadError
18
+ Types.register_type FileReadError
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ class ABBYY::Cloud
2
+ module Models
3
+ class FileReadStatus < ::String
4
+ VALUES = %w(New Submitted InProgress Done Error).freeze
5
+
6
+ def self.new(string)
7
+ super Types::Strict::String.constrained(included_in: VALUES)[string]
8
+ end
9
+ end
10
+
11
+ # Registers type Types::FileReadStatus
12
+ Types.register_type FileReadStatus
13
+ end
14
+ end