rosette_api 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/bad_request_error.rb +8 -0
- data/lib/bad_request_format_error.rb +8 -0
- data/lib/document_parameters.rb +66 -0
- data/lib/name_parameter.rb +44 -0
- data/lib/name_similarity_parameters.rb +52 -0
- data/lib/name_translation_parameters.rb +70 -0
- data/lib/request_builder.rb +155 -0
- data/lib/rosette_api.rb +338 -0
- data/lib/rosette_api_error.rb +13 -0
- data/tests/tests_spec.rb +470 -0
- metadata +68 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3179104e400cf9675967df11a64722393758fe06
|
4
|
+
data.tar.gz: 31bb38876a1964f3d0d35d9b98ea7dfb955f66d4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a16a11cb4cc29064a694f9878f81a74c4ceb861aec94509bb4fc33f981cefb439d09c4e55884f7a4a7333bf07854e70996c8f487f551b1898d9727dd49118b62
|
7
|
+
data.tar.gz: 4fd8a574f8c52f3502e8ed6dc3db810810c06cf10f081d4bef93d9339df2b774c88e3890e5966adb41d558ab91f4fc247cac579200b8061de37a911e0d7a548e
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative 'bad_request_format_error'
|
2
|
+
|
3
|
+
# This class encapsulates parameters that will be used by most of the endpoints
|
4
|
+
# with exclusion of name-similarity and name-translation.
|
5
|
+
class DocumentParameters
|
6
|
+
# Content to be analyzed (required if no content_uri and file_path)
|
7
|
+
attr_accessor :content
|
8
|
+
# URL to retrieve content from and analyze (required if no content and file_path)
|
9
|
+
attr_accessor :content_uri
|
10
|
+
# File path of the file to be analyzed (required if no content and content_uri)
|
11
|
+
attr_accessor :file_path
|
12
|
+
# genre to categorize the input data
|
13
|
+
attr_accessor :genre
|
14
|
+
# ISO 639-3 language code of the provided content (optional)
|
15
|
+
attr_accessor :language
|
16
|
+
|
17
|
+
def initialize(options = {}) #:notnew:
|
18
|
+
options = {
|
19
|
+
content: nil,
|
20
|
+
content_uri: nil,
|
21
|
+
file_path: nil,
|
22
|
+
genre: nil,
|
23
|
+
language: nil
|
24
|
+
}.update options
|
25
|
+
@content = options[:content]
|
26
|
+
@content_uri = options[:content_uri]
|
27
|
+
@file_path = options[:file_path]
|
28
|
+
@genre = options[:genre]
|
29
|
+
@language = options[:language]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Validates the parameters by checking if there are multiple content sources
|
33
|
+
# set or no content provided at all.
|
34
|
+
def validate_params
|
35
|
+
if [@content, @content_uri, @file_path].compact.length > 1
|
36
|
+
raise BadRequestFormatError.new 'The format of the request is invalid: multiple content sources;' \
|
37
|
+
' must be one of an attachment, an inline "content" field, or an external' \
|
38
|
+
'"contentUri"'
|
39
|
+
elsif [@content, @content_uri, @file_path].all?(&:nil?)
|
40
|
+
raise BadRequestFormatError.new 'The format of the request is invalid: no content provided; must' \
|
41
|
+
' be one of an attachment, an inline "content" field, or an external "contentUri"'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Converts this class to Hash with its keys in lower CamelCase.
|
46
|
+
#
|
47
|
+
# Returns the new Hash.
|
48
|
+
def load_params
|
49
|
+
self.validate_params
|
50
|
+
self.to_hash.select { |_key, value| !value.nil? }
|
51
|
+
.map { |key, value| [key.to_s.split('_').map(&:capitalize).join.sub!(/\D/, &:downcase), value] }
|
52
|
+
.to_h
|
53
|
+
end
|
54
|
+
|
55
|
+
# Converts this class to Hash.
|
56
|
+
#
|
57
|
+
# Returns the new Hash.
|
58
|
+
def to_hash
|
59
|
+
{
|
60
|
+
content: @content,
|
61
|
+
content_uri: @content_uri,
|
62
|
+
file_path: @file_path,
|
63
|
+
language: @language
|
64
|
+
}
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# This class represents an entity name in Rosette API.
|
2
|
+
class NameParameter
|
3
|
+
# Name's entity type (PERSON, LOCATION, ORGANIZATION) (optional)
|
4
|
+
attr_accessor :entity_type
|
5
|
+
# ISO 639-3 code of the name's language (optional)
|
6
|
+
attr_accessor :language
|
7
|
+
# ISO 15924 code of the name's script (optional)
|
8
|
+
attr_accessor :script
|
9
|
+
# Name to be analyzed
|
10
|
+
attr_accessor :text
|
11
|
+
|
12
|
+
def initialize(text, options = {}) #:notnew:
|
13
|
+
options = {
|
14
|
+
entity_type: nil,
|
15
|
+
language: nil,
|
16
|
+
script: nil
|
17
|
+
}.update options
|
18
|
+
@text = text
|
19
|
+
@entity_type = options[:entity_type]
|
20
|
+
@language = options[:language]
|
21
|
+
@script = options[:script]
|
22
|
+
end
|
23
|
+
|
24
|
+
# Converts this class to Hash with its keys in lower CamelCase.
|
25
|
+
#
|
26
|
+
# Returns the new Hash.
|
27
|
+
def load_param
|
28
|
+
self.to_hash.select { |_key, value| !value.nil? }
|
29
|
+
.map { |key, value| [key.to_s.split('_').map(&:capitalize).join.sub!(/\D/, &:downcase), value] }
|
30
|
+
.to_h
|
31
|
+
end
|
32
|
+
|
33
|
+
# Converts this class to Hash.
|
34
|
+
#
|
35
|
+
# Returns the new Hash.
|
36
|
+
def to_hash
|
37
|
+
{
|
38
|
+
entity_type: @entity_type,
|
39
|
+
language: @language,
|
40
|
+
script: @script,
|
41
|
+
text: @text
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative 'bad_request_error'
|
2
|
+
require_relative 'name_parameter'
|
3
|
+
|
4
|
+
# This class encapsulates parameters that are needed for name-similarity in
|
5
|
+
# Rosette API.
|
6
|
+
class NameSimilarityParameters
|
7
|
+
# genre to categorize the input data
|
8
|
+
attr_accessor :genre
|
9
|
+
# Name to be compared to name2
|
10
|
+
attr_accessor :name1
|
11
|
+
# Name to be compared to name1
|
12
|
+
attr_accessor :name2
|
13
|
+
|
14
|
+
def initialize(name1, name2, options = {}) #:notnew:
|
15
|
+
options = {
|
16
|
+
genre: nil
|
17
|
+
}.update options
|
18
|
+
@genre = options[:genre]
|
19
|
+
@name1 = name1
|
20
|
+
@name2 = name2
|
21
|
+
end
|
22
|
+
|
23
|
+
# Validates the parameters by checking if name1 and name2 are instances of
|
24
|
+
# a String or NameParameter.
|
25
|
+
def validate_params
|
26
|
+
if [String, NameParameter].none? { |clazz| @name1.is_a? clazz }
|
27
|
+
raise BadRequestError.new('name1 option can only be an instance of a String or NameParameter')
|
28
|
+
elsif [String, NameParameter].none? { |clazz| @name2.is_a? clazz }
|
29
|
+
raise BadRequestError.new('name2 option can only be an instance of a String or NameParameter')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Converts this class to Hash with its keys in lower CamelCase.
|
34
|
+
#
|
35
|
+
# Returns the new Hash.
|
36
|
+
def load_params
|
37
|
+
self.validate_params
|
38
|
+
self.to_hash.select { |_key, value| !value.nil? }
|
39
|
+
.map { |key, value| [key.to_s.split('_').map(&:capitalize).join.sub!(/\D/, &:downcase), value] }
|
40
|
+
.to_h
|
41
|
+
end
|
42
|
+
|
43
|
+
# Converts this class to Hash.
|
44
|
+
#
|
45
|
+
# Returns the new Hash.
|
46
|
+
def to_hash
|
47
|
+
{
|
48
|
+
name1: @name1.is_a?(NameParameter) ? @name1.load_param : @name1,
|
49
|
+
name2: @name2.is_a?(NameParameter) ? @name2.load_param : @name2
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require_relative 'rosette_api_error'
|
2
|
+
|
3
|
+
# This class encapsulates parameters that are needed for name-translation in
|
4
|
+
# Rosette API.
|
5
|
+
class NameTranslationParameters
|
6
|
+
# Name's entity type (PERSON, LOCATION, ORGANIZATION) (optional)
|
7
|
+
attr_accessor :entity_type
|
8
|
+
# genre to categorize the input data
|
9
|
+
attr_accessor :genre
|
10
|
+
# Name to translate
|
11
|
+
attr_accessor :name
|
12
|
+
# ISO 693-3 code of the name's native language the name originates in (optional)
|
13
|
+
attr_accessor :source_language_of_origin
|
14
|
+
# ISO 693-3 code of the name's language of use (optional)
|
15
|
+
attr_accessor :source_language_of_use
|
16
|
+
# ISO 15924 code of the name's script (optional)
|
17
|
+
attr_accessor :source_script
|
18
|
+
# ISO 639-3 code of the translation language
|
19
|
+
attr_accessor :target_language
|
20
|
+
# Transliteration scheme for the translation (optional)
|
21
|
+
attr_accessor :target_scheme
|
22
|
+
# ISO 15924 code of name's script (optional)
|
23
|
+
attr_accessor :target_script
|
24
|
+
|
25
|
+
def initialize(name, target_language, options = {}) #:notnew:
|
26
|
+
options = {
|
27
|
+
entity_type: nil,
|
28
|
+
genre: nil,
|
29
|
+
source_language_of_origin: nil,
|
30
|
+
source_language_of_use: nil,
|
31
|
+
source_script: nil,
|
32
|
+
target_scheme: nil,
|
33
|
+
target_script: nil
|
34
|
+
}.update options
|
35
|
+
@name = name
|
36
|
+
@entity_type = options[:entity_type]
|
37
|
+
@genre = options[:genre]
|
38
|
+
@source_language_of_origin = options[:source_language_of_origin]
|
39
|
+
@source_language_of_use = options[:source_language_of_use]
|
40
|
+
@source_script = options[:source_script]
|
41
|
+
@target_language = target_language
|
42
|
+
@target_scheme = options[:target_scheme]
|
43
|
+
@target_script = options[:target_script]
|
44
|
+
end
|
45
|
+
|
46
|
+
# Converts this class to Hash with its keys in lower CamelCase.
|
47
|
+
#
|
48
|
+
# Returns the new Hash.
|
49
|
+
def load_params
|
50
|
+
self.to_hash.select { |_key, value| !value.nil? }
|
51
|
+
.map { |key, value| [key.to_s.split('_').map(&:capitalize).join.sub!(/\D/, &:downcase), value] }
|
52
|
+
.to_h
|
53
|
+
end
|
54
|
+
|
55
|
+
# Converts this class to Hash.
|
56
|
+
#
|
57
|
+
# Returns the new Hash.
|
58
|
+
def to_hash
|
59
|
+
{
|
60
|
+
entity_type: @entity_type,
|
61
|
+
name: @name,
|
62
|
+
source_language_of_origin: @source_language_of_origin,
|
63
|
+
source_language_of_use: @source_language_of_use,
|
64
|
+
source_script: @source_script,
|
65
|
+
target_language: @target_language,
|
66
|
+
target_scheme: @target_scheme,
|
67
|
+
target_script: @target_script
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'net/https'
|
3
|
+
require 'json'
|
4
|
+
require 'securerandom'
|
5
|
+
require_relative 'rosette_api_error'
|
6
|
+
|
7
|
+
# This class handles all Rosette API requests.
|
8
|
+
class RequestBuilder
|
9
|
+
@retries = 5
|
10
|
+
# Alternate Rosette API URL
|
11
|
+
attr_reader :alternate_url
|
12
|
+
# Parameters to build the body of the request from
|
13
|
+
attr_accessor :params
|
14
|
+
# Rosette API key
|
15
|
+
attr_accessor :user_key
|
16
|
+
|
17
|
+
def initialize(user_key, alternate_url, params = {}) #:notnew:
|
18
|
+
@user_key = user_key
|
19
|
+
@alternate_url = alternate_url
|
20
|
+
@params = params
|
21
|
+
end
|
22
|
+
|
23
|
+
# Prepares a plain POST request for Rosette API.
|
24
|
+
#
|
25
|
+
# ==== Attributes
|
26
|
+
#
|
27
|
+
# * +params+ - Parameters to build the body of the request.
|
28
|
+
#
|
29
|
+
# Returns a HTTP connection and the built POST request.
|
30
|
+
def prepare_plain_request(params)
|
31
|
+
begin
|
32
|
+
uri = URI.parse @alternate_url
|
33
|
+
http = Net::HTTP.new uri.host, uri.port
|
34
|
+
http.use_ssl = uri.scheme == 'https'
|
35
|
+
request = Net::HTTP::Post.new uri.request_uri
|
36
|
+
rescue
|
37
|
+
raise RosetteAPIError.new 'connectionError', 'Failed to establish connection with Rosette API server.'
|
38
|
+
end
|
39
|
+
|
40
|
+
request['X-RosetteAPI-Key'] = @user_key
|
41
|
+
request['Content-Type'] = 'application/json'
|
42
|
+
request['Accept'] = 'application/json'
|
43
|
+
request.body = params.to_json
|
44
|
+
|
45
|
+
[http, request]
|
46
|
+
end
|
47
|
+
|
48
|
+
# Prepares a multipart/form-data POST request for Rosette API.
|
49
|
+
#
|
50
|
+
# ==== Attributes
|
51
|
+
#
|
52
|
+
# * +params+ - Parameters to build the body of the request.
|
53
|
+
#
|
54
|
+
# Returns a HTTP connection and the built POST request.
|
55
|
+
def prepare_multipart_request(params)
|
56
|
+
begin
|
57
|
+
file = File.open params['filePath'], 'r'
|
58
|
+
text = file.read
|
59
|
+
rescue => err
|
60
|
+
raise err
|
61
|
+
end
|
62
|
+
|
63
|
+
boundary = SecureRandom.hex
|
64
|
+
post_body = []
|
65
|
+
request_file = params.to_json
|
66
|
+
|
67
|
+
# Add the content data
|
68
|
+
post_body << "--#{boundary}\r\n"
|
69
|
+
post_body << "Content-Disposition: form-data; name=\"content\"; filename=\"#{File.basename(file)}\"\r\n"
|
70
|
+
post_body << "Content-Type: text/plain\r\n\r\n"
|
71
|
+
post_body << text
|
72
|
+
|
73
|
+
# Add the request data
|
74
|
+
post_body << "\r\n\r\n--#{boundary}\r\n"
|
75
|
+
post_body << "Content-Disposition: form-data; name=\"request\"\r\n"
|
76
|
+
post_body << "Content-Type: application/json\r\n\r\n"
|
77
|
+
post_body << request_file
|
78
|
+
post_body << "\r\n\r\n--#{boundary}--\r\n"
|
79
|
+
|
80
|
+
# Create the HTTP objects
|
81
|
+
uri = URI.parse @alternate_url
|
82
|
+
http = Net::HTTP.new uri.host, uri.port
|
83
|
+
http.use_ssl = uri.scheme == 'https'
|
84
|
+
request = Net::HTTP::Post.new uri.request_uri
|
85
|
+
request.add_field 'Content-Type', "multipart/form-data; boundary=#{boundary}"
|
86
|
+
request.add_field 'X-RosetteAPI-Key', @user_key
|
87
|
+
request.body = post_body.join
|
88
|
+
|
89
|
+
[http, request]
|
90
|
+
end
|
91
|
+
|
92
|
+
# Sends a GET request to Rosette API.
|
93
|
+
#
|
94
|
+
# Returns JSON response or raises RosetteAPIError if encountered.
|
95
|
+
def send_get_request
|
96
|
+
uri = URI.parse @alternate_url
|
97
|
+
http = Net::HTTP.new uri.host, uri.port
|
98
|
+
http.use_ssl = uri.scheme == 'https'
|
99
|
+
|
100
|
+
request = Net::HTTP::Get.new uri.request_uri
|
101
|
+
request['X-RosetteAPI-Key'] = @user_key
|
102
|
+
|
103
|
+
self.get_response http, request
|
104
|
+
end
|
105
|
+
|
106
|
+
# Sends a POST request to Rosette API.
|
107
|
+
#
|
108
|
+
# Returns JSON response or raises RosetteAPIError if encountered.
|
109
|
+
def send_post_request
|
110
|
+
params = (@alternate_url.to_s.include? '/info?clientVersion=') ? '{"body": "version check"}' : @params
|
111
|
+
|
112
|
+
if !params['filePath'].nil?
|
113
|
+
http, request = self.prepare_multipart_request params
|
114
|
+
else
|
115
|
+
http, request = self.prepare_plain_request params
|
116
|
+
end
|
117
|
+
|
118
|
+
self.get_response http, request
|
119
|
+
end
|
120
|
+
|
121
|
+
# Gets response from HTTP connection.
|
122
|
+
#
|
123
|
+
# ==== Attributes
|
124
|
+
#
|
125
|
+
# * +http+ - HTTP connection.
|
126
|
+
#
|
127
|
+
# * +request+ - Prepared Rosette API request.
|
128
|
+
#
|
129
|
+
# Returns JSON response or raises RosetteAPIError if encountered.
|
130
|
+
def get_response(http, request)
|
131
|
+
response = http.request request
|
132
|
+
|
133
|
+
if response.code != '200'
|
134
|
+
message = JSON.parse(response.body)['message']
|
135
|
+
code = JSON.parse(response.body)['code']
|
136
|
+
if response.code == '429'
|
137
|
+
if @retries != 0
|
138
|
+
@retries = @retries - 1
|
139
|
+
sleep 15
|
140
|
+
self.get_response(http, request)
|
141
|
+
else
|
142
|
+
raise RosetteAPIError.new code, message
|
143
|
+
end
|
144
|
+
else
|
145
|
+
raise RosetteAPIError.new code, message
|
146
|
+
end
|
147
|
+
else
|
148
|
+
response_headers = {}
|
149
|
+
response.header.each_header { |key, value| response_headers[key] = value }
|
150
|
+
response_headers = { responseHeaders: response_headers }
|
151
|
+
|
152
|
+
JSON.parse(response.body).merge(response_headers)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
data/lib/rosette_api.rb
ADDED
@@ -0,0 +1,338 @@
|
|
1
|
+
require_relative 'request_builder'
|
2
|
+
require_relative 'document_parameters'
|
3
|
+
require_relative 'name_translation_parameters'
|
4
|
+
require_relative 'name_similarity_parameters'
|
5
|
+
require_relative 'rosette_api_error'
|
6
|
+
require_relative 'bad_request_error'
|
7
|
+
require_relative 'bad_request_format_error'
|
8
|
+
|
9
|
+
# This class allows you to access all Rosette API endpoints.
|
10
|
+
class RosetteAPI
|
11
|
+
# Version of Ruby binding
|
12
|
+
BINDING_VERSION = '1.0.2'
|
13
|
+
# Rosette API language endpoint
|
14
|
+
LANGUAGE_ENDPOINT = '/language'
|
15
|
+
# Rosette API morphology endpoint
|
16
|
+
MORPHOLOGY_ENDPOINT = '/morphology'
|
17
|
+
# Rosette API entities endpoint
|
18
|
+
ENTITIES_ENDPOINT = '/entities'
|
19
|
+
# Rosette API entities/linked endpoint
|
20
|
+
ENTITIES_LINKED_ENDPOINT = '/entities/linked'
|
21
|
+
# Rosette API categories endpoint
|
22
|
+
CATEGORIES_ENDPOINT = '/categories'
|
23
|
+
# Rosette API relationships endpoint
|
24
|
+
RELATIONSHIPS_ENDPOINT = '/relationships'
|
25
|
+
# Rosette API sentiment endpoint
|
26
|
+
SENTIMENT_ENDPOINT = '/sentiment'
|
27
|
+
# Rosette API name-translation endpoint
|
28
|
+
NAME_TRANSLATION_ENDPOINT = '/name-translation'
|
29
|
+
# Rosette API name-similarity endpoint
|
30
|
+
NAME_SIMILARITY_ENDPOINT = '/name-similarity'
|
31
|
+
# Rosette API tokens endpoint
|
32
|
+
TOKENS_ENDPOINT = '/tokens'
|
33
|
+
# Rosette API sentences endpoint
|
34
|
+
SENTENCES_ENDPOINT = '/sentences'
|
35
|
+
# Rosette API info endpoint
|
36
|
+
INFO = '/info'
|
37
|
+
# Rosette API version check endpoint
|
38
|
+
VERSION_CHECK = '/info?clientVersion=' + BINDING_VERSION
|
39
|
+
# Rosette API ping endpoint
|
40
|
+
PING = '/ping'
|
41
|
+
|
42
|
+
# Rosette API key
|
43
|
+
attr_accessor :user_key
|
44
|
+
# Alternate Rosette API URL
|
45
|
+
attr_accessor :alternate_url
|
46
|
+
|
47
|
+
def initialize(user_key, alternate_url = 'https://api.rosette.com/rest/v1') #:notnew:
|
48
|
+
@user_key = user_key
|
49
|
+
@alternate_url = alternate_url
|
50
|
+
|
51
|
+
if @alternate_url.to_s.end_with?('/')
|
52
|
+
@alternate_url = alternate_url.to_s.slice(0..-2)
|
53
|
+
end
|
54
|
+
|
55
|
+
self.check_version_compatibility
|
56
|
+
end
|
57
|
+
|
58
|
+
# Checks binding version compatibility against the Rosette API server.
|
59
|
+
def check_version_compatibility
|
60
|
+
response = RequestBuilder.new(@user_key, @alternate_url + VERSION_CHECK)
|
61
|
+
.send_post_request
|
62
|
+
|
63
|
+
unless response['versionChecked']
|
64
|
+
puts JSON.pretty_generate(response)
|
65
|
+
|
66
|
+
exit
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Identifies in which language(s) the input is written.
|
71
|
+
#
|
72
|
+
# ==== Attributes
|
73
|
+
#
|
74
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
75
|
+
#
|
76
|
+
# Returns list of candidate languages in order of descending confidence.
|
77
|
+
def get_language(params)
|
78
|
+
check_params params
|
79
|
+
|
80
|
+
params = params.load_params
|
81
|
+
|
82
|
+
RequestBuilder.new(@user_key, @alternate_url + LANGUAGE_ENDPOINT, params)
|
83
|
+
.send_post_request
|
84
|
+
end
|
85
|
+
|
86
|
+
# Extracts parts-of-speech, lemmas (dictionary form), compound components,
|
87
|
+
# and Han-readings for each token in the input.
|
88
|
+
#
|
89
|
+
# ==== Attributes
|
90
|
+
#
|
91
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
92
|
+
#
|
93
|
+
# Returns the lemmas, compound components, Han-readings, and parts-of-speech
|
94
|
+
# tags of the input for supported languages.
|
95
|
+
def get_morphology_complete(params)
|
96
|
+
check_params params
|
97
|
+
|
98
|
+
params = params.load_params
|
99
|
+
|
100
|
+
RequestBuilder.new(@user_key, @alternate_url + MORPHOLOGY_ENDPOINT + '/complete', params)
|
101
|
+
.send_post_request
|
102
|
+
end
|
103
|
+
|
104
|
+
# Extracts compound-components from the input.
|
105
|
+
#
|
106
|
+
# ==== Attributes
|
107
|
+
#
|
108
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
109
|
+
#
|
110
|
+
# Returns list of components for each compound word of the input for supported
|
111
|
+
# languages.
|
112
|
+
def get_compound_components(params)
|
113
|
+
check_params params
|
114
|
+
|
115
|
+
params = params.load_params
|
116
|
+
|
117
|
+
RequestBuilder.new(@user_key, @alternate_url + MORPHOLOGY_ENDPOINT + '/compound-components', params)
|
118
|
+
.send_post_request
|
119
|
+
end
|
120
|
+
|
121
|
+
# Extracts Han-readings from the input.
|
122
|
+
#
|
123
|
+
# ==== Attributes
|
124
|
+
#
|
125
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
126
|
+
#
|
127
|
+
# Returns list of Han-readings which provide pronunciation information for
|
128
|
+
# Han script, in both Chinese and Japanese input text.
|
129
|
+
def get_han_readings(params)
|
130
|
+
check_params params
|
131
|
+
|
132
|
+
params = params.load_params
|
133
|
+
|
134
|
+
RequestBuilder.new(@user_key, @alternate_url + MORPHOLOGY_ENDPOINT + '/han-readings', params)
|
135
|
+
.send_post_request
|
136
|
+
end
|
137
|
+
|
138
|
+
# Extracts lemmas from the input.
|
139
|
+
#
|
140
|
+
# ==== Attributes
|
141
|
+
#
|
142
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
143
|
+
#
|
144
|
+
# Returns list of lemmas for each token of the input for supported languages.
|
145
|
+
def get_lemmas(params)
|
146
|
+
check_params params
|
147
|
+
|
148
|
+
params = params.load_params
|
149
|
+
|
150
|
+
RequestBuilder.new(@user_key, @alternate_url + MORPHOLOGY_ENDPOINT + '/lemmas', params)
|
151
|
+
.send_post_request
|
152
|
+
end
|
153
|
+
|
154
|
+
# Extracts parts-of-speech from the input.
|
155
|
+
#
|
156
|
+
# ==== Attributes
|
157
|
+
#
|
158
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
159
|
+
#
|
160
|
+
# Returns list of part-of-speech (POS) tags for each of the words of the
|
161
|
+
# input, depending on the context of how it is used.
|
162
|
+
def get_parts_of_speech(params)
|
163
|
+
check_params params
|
164
|
+
|
165
|
+
params = params.load_params
|
166
|
+
|
167
|
+
RequestBuilder.new(@user_key, @alternate_url + MORPHOLOGY_ENDPOINT + '/parts-of-speech', params)
|
168
|
+
.send_post_request
|
169
|
+
end
|
170
|
+
|
171
|
+
# Extracts entities from the input.
|
172
|
+
#
|
173
|
+
# ==== Attributes
|
174
|
+
#
|
175
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
176
|
+
#
|
177
|
+
# Returns each entity extracted from the input.
|
178
|
+
def get_entities(params)
|
179
|
+
check_params params
|
180
|
+
|
181
|
+
params = params.load_params
|
182
|
+
|
183
|
+
RequestBuilder.new(@user_key, @alternate_url + ENTITIES_ENDPOINT, params)
|
184
|
+
.send_post_request
|
185
|
+
end
|
186
|
+
|
187
|
+
# Extracts entities from the input.
|
188
|
+
#
|
189
|
+
# ==== Attributes
|
190
|
+
#
|
191
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
192
|
+
#
|
193
|
+
# Returns list of entities that have been linked to entities in the knowledge
|
194
|
+
# base.
|
195
|
+
def get_entities_linked(params)
|
196
|
+
check_params params
|
197
|
+
|
198
|
+
params = params.load_params
|
199
|
+
|
200
|
+
RequestBuilder.new(@user_key, @alternate_url + ENTITIES_LINKED_ENDPOINT, params)
|
201
|
+
.send_post_request
|
202
|
+
end
|
203
|
+
|
204
|
+
# Extracts Tier 1 contextual categories from the input.
|
205
|
+
#
|
206
|
+
# ==== Attributes
|
207
|
+
#
|
208
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
209
|
+
#
|
210
|
+
# Returns the contextual categories identified in the input.
|
211
|
+
def get_categories(params)
|
212
|
+
check_params params
|
213
|
+
|
214
|
+
params = params.load_params
|
215
|
+
|
216
|
+
RequestBuilder.new(@user_key, @alternate_url + CATEGORIES_ENDPOINT, params)
|
217
|
+
.send_post_request
|
218
|
+
end
|
219
|
+
|
220
|
+
# Extracts relationships from the input.
|
221
|
+
#
|
222
|
+
# ==== Attributes
|
223
|
+
#
|
224
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
225
|
+
#
|
226
|
+
# Returns each relationship extracted from the input.
|
227
|
+
def get_relationships(params)
|
228
|
+
check_params params
|
229
|
+
|
230
|
+
params = params.load_params
|
231
|
+
|
232
|
+
RequestBuilder.new(@user_key, @alternate_url + RELATIONSHIPS_ENDPOINT, params)
|
233
|
+
.send_post_request
|
234
|
+
end
|
235
|
+
|
236
|
+
# Analyzes the positive and negative sentiment expressed by the input.
|
237
|
+
#
|
238
|
+
# ==== Attributes
|
239
|
+
#
|
240
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
241
|
+
#
|
242
|
+
# Returns sentiment analysis results.
|
243
|
+
def get_sentiment(params)
|
244
|
+
check_params params
|
245
|
+
|
246
|
+
params = params.load_params
|
247
|
+
|
248
|
+
RequestBuilder.new(@user_key, @alternate_url + SENTIMENT_ENDPOINT, params)
|
249
|
+
.send_post_request
|
250
|
+
end
|
251
|
+
|
252
|
+
# Translates a given name to a supported specified language.
|
253
|
+
#
|
254
|
+
# ==== Attributes
|
255
|
+
#
|
256
|
+
# * +params+ - NameTranslationParameters helps to build the request body in RequestBuilder.
|
257
|
+
#
|
258
|
+
# Returns the translation of a name.
|
259
|
+
def name_translation(params)
|
260
|
+
check_params params, 'Expects a NameTranslationParameters type as an argument', NameTranslationParameters
|
261
|
+
|
262
|
+
params = params.load_params
|
263
|
+
|
264
|
+
RequestBuilder.new(@user_key, @alternate_url + NAME_TRANSLATION_ENDPOINT, params)
|
265
|
+
.send_post_request
|
266
|
+
end
|
267
|
+
|
268
|
+
# Compares two entity names (person, location, or organization) and returns a
|
269
|
+
# match score from 0 to 1.
|
270
|
+
#
|
271
|
+
# ==== Attributes
|
272
|
+
#
|
273
|
+
# * +params+ - NameSimilarityParameters helps to build the request body in RequestBuilder.
|
274
|
+
#
|
275
|
+
# Returns the confidence score of matching 2 names.
|
276
|
+
def name_similarity(params)
|
277
|
+
check_params params, 'Expects a NameSimilarityParameters type as an argument', NameSimilarityParameters
|
278
|
+
|
279
|
+
params = params.load_params
|
280
|
+
|
281
|
+
RequestBuilder.new(@user_key, @alternate_url + NAME_SIMILARITY_ENDPOINT, params)
|
282
|
+
.send_post_request
|
283
|
+
end
|
284
|
+
|
285
|
+
# Divides the input into tokens.
|
286
|
+
#
|
287
|
+
# ==== Attributes
|
288
|
+
#
|
289
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
290
|
+
#
|
291
|
+
# Returns list of tokens of the input.
|
292
|
+
def get_tokens(params)
|
293
|
+
check_params params
|
294
|
+
|
295
|
+
params = params.load_params
|
296
|
+
|
297
|
+
RequestBuilder.new(@user_key, @alternate_url + TOKENS_ENDPOINT, params)
|
298
|
+
.send_post_request
|
299
|
+
end
|
300
|
+
|
301
|
+
# Divides the input into sentences.
|
302
|
+
#
|
303
|
+
# ==== Attributes
|
304
|
+
#
|
305
|
+
# * +params+ - DocumentParameters helps to build the request body in RequestBuilder.
|
306
|
+
#
|
307
|
+
# Returns list of linguistic sentences of the input.
|
308
|
+
def get_sentences(params)
|
309
|
+
check_params params
|
310
|
+
|
311
|
+
params = params.load_params
|
312
|
+
|
313
|
+
RequestBuilder.new(@user_key, @alternate_url + SENTENCES_ENDPOINT, params)
|
314
|
+
.send_post_request
|
315
|
+
end
|
316
|
+
|
317
|
+
# Gets information about the Rosette API, returns name, version, build number
|
318
|
+
# and build time.
|
319
|
+
def info
|
320
|
+
RequestBuilder.new(@user_key, @alternate_url + INFO)
|
321
|
+
.send_get_request
|
322
|
+
end
|
323
|
+
|
324
|
+
# Pings the Rosette API for a response indicting that the service is
|
325
|
+
# available.
|
326
|
+
def ping
|
327
|
+
RequestBuilder.new(@user_key, @alternate_url + PING)
|
328
|
+
.send_get_request
|
329
|
+
end
|
330
|
+
|
331
|
+
private
|
332
|
+
|
333
|
+
# Checks that the right parameter type is being passed in.
|
334
|
+
def check_params(params, message = 'Expects a DocumentParameters type as an argument', type = DocumentParameters)
|
335
|
+
raise BadRequest.new message unless params.is_a? type
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# This class encapsulates all Rosette API server errors encountered during
|
2
|
+
# requests.
|
3
|
+
class RosetteAPIError < StandardError
|
4
|
+
# Rosette API error's status code
|
5
|
+
attr_accessor :status_code
|
6
|
+
# Rosette API error's message
|
7
|
+
attr_accessor :message
|
8
|
+
|
9
|
+
def initialize(status_code, message) #:notnew:
|
10
|
+
@status_code = status_code
|
11
|
+
@message = message
|
12
|
+
end
|
13
|
+
end
|
data/tests/tests_spec.rb
ADDED
@@ -0,0 +1,470 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rosette_api'
|
3
|
+
require 'rspec'
|
4
|
+
require 'webmock/rspec'
|
5
|
+
require 'json'
|
6
|
+
WebMock.disable_net_connect!(allow_localhost: true)
|
7
|
+
|
8
|
+
describe RosetteAPI do
|
9
|
+
|
10
|
+
describe '.get_language' do
|
11
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/language.json'))
|
12
|
+
before do
|
13
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
14
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
15
|
+
headers: {'Accept' => 'application/json',
|
16
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
17
|
+
'Content-Type' => 'application/json',
|
18
|
+
'User-Agent' => 'Ruby',
|
19
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
20
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
21
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/language').
|
22
|
+
with(body: request_file,
|
23
|
+
headers: {'Accept' => 'application/json',
|
24
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
25
|
+
'Content-Type' => 'application/json',
|
26
|
+
'User-Agent' => 'Ruby',
|
27
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
28
|
+
to_return(status: 200, body: {'test': 'language'}.to_json, headers: {})
|
29
|
+
end
|
30
|
+
it 'test language' do
|
31
|
+
params = DocumentParameters.new
|
32
|
+
params.content = 'Por favor Senorita, says the man.?'
|
33
|
+
response = RosetteAPI.new('0123456789').get_language(params)
|
34
|
+
expect(response).instance_of? Hash
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'badRequestFormat: the format of the request is invalid: multiple content sources' do
|
38
|
+
params = DocumentParameters.new
|
39
|
+
params.content = 'Por favor Senorita, says the man.?'
|
40
|
+
params.content_uri = 'Por favor Senorita, says the man.?'
|
41
|
+
expect { RosetteAPI.new('0123456789').get_language(params) }.to raise_error(BadRequestFormatError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'badRequestFormat: the format of the request is invalid: no content provided;' do
|
45
|
+
params = DocumentParameters.new
|
46
|
+
expect { RosetteAPI.new('0123456789')
|
47
|
+
.get_language(params) }
|
48
|
+
.to raise_error(BadRequestFormatError)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '.get_morphology_complete' do
|
53
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/morphology_complete.json'))
|
54
|
+
before do
|
55
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
56
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
57
|
+
headers: {'Accept' => 'application/json',
|
58
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
59
|
+
'Content-Type' => 'application/json',
|
60
|
+
'User-Agent' => 'Ruby',
|
61
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
62
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
63
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/morphology/complete').
|
64
|
+
with(body: request_file,
|
65
|
+
headers: {'Accept' => 'application/json',
|
66
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
67
|
+
'Content-Type' => 'application/json',
|
68
|
+
'User-Agent' => 'Ruby',
|
69
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
70
|
+
to_return(status: 200, body: {'test': 'morphology/complete'}.to_json, headers: {})
|
71
|
+
end
|
72
|
+
it 'test morphology complete' do
|
73
|
+
params = DocumentParameters.new
|
74
|
+
params.content = 'The quick brown fox jumped over the lazy dog. Yes he did.'
|
75
|
+
response = RosetteAPI.new('0123456789').get_morphology_complete(params)
|
76
|
+
expect(response).instance_of? Hash
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '.get_compound_components' do
|
81
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/morphology_compound_components.json'))
|
82
|
+
before do
|
83
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
84
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
85
|
+
headers: {'Accept' => 'application/json',
|
86
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
87
|
+
'Content-Type' => 'application/json',
|
88
|
+
'User-Agent' => 'Ruby',
|
89
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
90
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
91
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/morphology/compound-components').
|
92
|
+
with(body: request_file,
|
93
|
+
headers: {'Accept' => 'application/json',
|
94
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
95
|
+
'Content-Type' => 'application/json',
|
96
|
+
'User-Agent' => 'Ruby',
|
97
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
98
|
+
to_return(status: 200, body: {'test': 'morphology/compound-components'}.to_json, headers: {})
|
99
|
+
end
|
100
|
+
it 'test morphology compound components' do
|
101
|
+
params = DocumentParameters.new
|
102
|
+
params.content = 'Rechtsschutzversicherungsgesellschaften'
|
103
|
+
response = RosetteAPI.new('0123456789').get_compound_components(params)
|
104
|
+
expect(response).instance_of? Hash
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe '.get_han_readings' do
|
109
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/morphology_han_readings.json')), encoding: 'utf-8'
|
110
|
+
before do
|
111
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
112
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
113
|
+
headers: {'Accept' => 'application/json',
|
114
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
115
|
+
'Content-Type' => 'application/json',
|
116
|
+
'User-Agent' => 'Ruby',
|
117
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
118
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
119
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/morphology/han-readings').
|
120
|
+
with(body: request_file,
|
121
|
+
headers: {'Accept' => 'application/json',
|
122
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
123
|
+
'Content-Type' => 'application/json',
|
124
|
+
'User-Agent' => 'Ruby',
|
125
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
126
|
+
to_return(status: 200, body: {'test': 'morphology/han-readings'}.to_json, headers: {})
|
127
|
+
end
|
128
|
+
it 'test morphology han readings' do
|
129
|
+
params = DocumentParameters.new
|
130
|
+
params.content = '北京大学生物系主任办公室内部会议'
|
131
|
+
response = RosetteAPI.new('0123456789').get_han_readings(params)
|
132
|
+
expect(response).instance_of? Hash
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe '.get_parts_of_speech' do
|
137
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/morphology_parts_of_speech.json'))
|
138
|
+
before do
|
139
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
140
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
141
|
+
headers: {'Accept' => 'application/json',
|
142
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
143
|
+
'Content-Type' => 'application/json',
|
144
|
+
'User-Agent' => 'Ruby',
|
145
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
146
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
147
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/morphology/parts-of-speech').
|
148
|
+
with(body: request_file,
|
149
|
+
headers: {'Accept' => 'application/json',
|
150
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
151
|
+
'Content-Type' => 'application/json',
|
152
|
+
'User-Agent' => 'Ruby',
|
153
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
154
|
+
to_return(status: 200, body: {'test': 'morphology/parts-of-speech'}.to_json, headers: {})
|
155
|
+
end
|
156
|
+
it 'test morphology parts of speech' do
|
157
|
+
params = DocumentParameters.new
|
158
|
+
params.content = "The fact is that the geese just went back to get a rest and I'm not banking on their return soon"
|
159
|
+
response = RosetteAPI.new('0123456789').get_parts_of_speech(params)
|
160
|
+
expect(response).instance_of? Hash
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe '.get_lemmas' do
|
165
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/morphology_lemmas.json'))
|
166
|
+
before do
|
167
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
168
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
169
|
+
headers: {'Accept' => 'application/json',
|
170
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
171
|
+
'Content-Type' => 'application/json',
|
172
|
+
'User-Agent' => 'Ruby',
|
173
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
174
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
175
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/morphology/lemmas').
|
176
|
+
with(body: request_file,
|
177
|
+
headers: {'Accept' => 'application/json',
|
178
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
179
|
+
'Content-Type' => 'application/json',
|
180
|
+
'User-Agent' => 'Ruby',
|
181
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
182
|
+
to_return(status: 200, body: {'test': 'morphology/lemmas'}.to_json, headers: {})
|
183
|
+
end
|
184
|
+
it 'test morphology lemmas' do
|
185
|
+
params = DocumentParameters.new
|
186
|
+
params.content = "The fact is that the geese just went back to get a rest and I'm not banking on their return soon"
|
187
|
+
response = RosetteAPI.new('0123456789').get_lemmas(params)
|
188
|
+
expect(response).instance_of? Hash
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe '.get_entities' do
|
193
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/entities.json')), encoding: 'utf-8'
|
194
|
+
before do
|
195
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
196
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
197
|
+
headers: {'Accept' => 'application/json',
|
198
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
199
|
+
'Content-Type' => 'application/json',
|
200
|
+
'User-Agent' => 'Ruby',
|
201
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
202
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
203
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/entities').
|
204
|
+
with(body: request_file,
|
205
|
+
headers: {'Accept' => 'application/json',
|
206
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
207
|
+
'Content-Type' => 'application/json',
|
208
|
+
'User-Agent' => 'Ruby',
|
209
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
210
|
+
to_return(status: 200, body: {'test': 'entities'}.to_json, headers: {})
|
211
|
+
end
|
212
|
+
it 'test entities' do
|
213
|
+
params = DocumentParameters.new
|
214
|
+
params.content = 'Bill Murray will appear in new Ghostbusters film: Dr. Peter Venkman was spotted filming a' \
|
215
|
+
' cameo in Boston this… http://dlvr.it/BnsFfS'
|
216
|
+
response = RosetteAPI.new('0123456789').get_entities(params)
|
217
|
+
expect(response).instance_of? Hash
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
describe '.get_entities_linked' do
|
222
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/entities_linked.json'))
|
223
|
+
before do
|
224
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
225
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
226
|
+
headers: {'Accept' => 'application/json',
|
227
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
228
|
+
'Content-Type' => 'application/json',
|
229
|
+
'User-Agent' => 'Ruby',
|
230
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
231
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
232
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/entities/linked').
|
233
|
+
with(body: request_file,
|
234
|
+
headers: {'Accept' => 'application/json',
|
235
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
236
|
+
'Content-Type' => 'application/json',
|
237
|
+
'User-Agent' => 'Ruby',
|
238
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
239
|
+
to_return(status: 200, body: {'test': 'entities/linked'}.to_json, headers: {})
|
240
|
+
end
|
241
|
+
it 'test entities linked' do
|
242
|
+
params = DocumentParameters.new
|
243
|
+
params.content = 'Last month director Paul Feig announced the movie will have an all-star female cast including' \
|
244
|
+
' Kristen Wiig, Melissa McCarthy, Leslie Jones and Kate McKinnon.'
|
245
|
+
response = RosetteAPI.new('0123456789').get_entities_linked(params)
|
246
|
+
expect(response).instance_of? Hash
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
describe '.get_categories' do
|
251
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/categories.json'))
|
252
|
+
before do
|
253
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
254
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
255
|
+
headers: {'Accept' => 'application/json',
|
256
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
257
|
+
'Content-Type' => 'application/json',
|
258
|
+
'User-Agent' => 'Ruby',
|
259
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
260
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
261
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/categories').
|
262
|
+
with(body: request_file,
|
263
|
+
headers: {'Accept' => 'application/json',
|
264
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
265
|
+
'Content-Type' => 'application/json',
|
266
|
+
'User-Agent' => 'Ruby',
|
267
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
268
|
+
to_return(status: 200, body: {'test': 'categories'}.to_json, headers: {})
|
269
|
+
end
|
270
|
+
it 'test categories' do
|
271
|
+
params = DocumentParameters.new
|
272
|
+
params.content_uri = 'http://www.onlocationvacations.com/2015/03/05/the-new-ghostbusters-movie-begins-filming-in-boston-in-june/'
|
273
|
+
response = RosetteAPI.new('0123456789').get_categories(params)
|
274
|
+
expect(response).instance_of? Hash
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
describe '.get_relationships' do
|
279
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/relationships.json'))
|
280
|
+
before do
|
281
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
282
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
283
|
+
headers: {'Accept' => 'application/json',
|
284
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
285
|
+
'Content-Type' => 'application/json',
|
286
|
+
'User-Agent' => 'Ruby',
|
287
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
288
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
289
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/relationships').
|
290
|
+
with(body: request_file,
|
291
|
+
headers: {'Accept' => 'application/json',
|
292
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
293
|
+
'Content-Type' => 'application/json',
|
294
|
+
'User-Agent' => 'Ruby',
|
295
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
296
|
+
to_return(status: 200, body: {'test': 'relationships'}.to_json, headers: {})
|
297
|
+
end
|
298
|
+
it 'test relationships' do
|
299
|
+
params = DocumentParameters.new
|
300
|
+
params.content = 'The Ghostbusters movie was filmed in Boston.'
|
301
|
+
response = RosetteAPI.new('0123456789').get_relationships(params)
|
302
|
+
expect(response).instance_of? Hash
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
describe '.name_translation' do
|
307
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/name_translation.json')), encoding: 'utf-8'
|
308
|
+
before do
|
309
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
310
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
311
|
+
headers: {'Accept' => 'application/json',
|
312
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
313
|
+
'Content-Type' => 'application/json',
|
314
|
+
'User-Agent' => 'Ruby',
|
315
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
316
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
317
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/name-translation').
|
318
|
+
with(body: request_file,
|
319
|
+
headers: {'Accept' => 'application/json',
|
320
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
321
|
+
'Content-Type' => 'application/json',
|
322
|
+
'User-Agent' => 'Ruby',
|
323
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
324
|
+
to_return(status: 200, body: {'test': 'name-translation'}.to_json, headers: {})
|
325
|
+
end
|
326
|
+
it 'test name translation' do
|
327
|
+
params = NameTranslationParameters.new('معمر محمد أبو منيار القذاف'.encode('UTF-8'), 'eng')
|
328
|
+
params.target_script = 'Latn'
|
329
|
+
response = RosetteAPI.new('0123456789').name_translation(params)
|
330
|
+
expect(response).instance_of? Hash
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
describe '.name_similarity' do
|
335
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/name_similarity.json')), encoding: 'utf-8'
|
336
|
+
before do
|
337
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
338
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
339
|
+
headers: {'Accept' => 'application/json',
|
340
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
341
|
+
'Content-Type' => 'application/json',
|
342
|
+
'User-Agent' => 'Ruby',
|
343
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
344
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
345
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/name-similarity').
|
346
|
+
with(body: request_file,
|
347
|
+
headers: {'Accept' => 'application/json',
|
348
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
349
|
+
'Content-Type' => 'application/json',
|
350
|
+
'User-Agent' => 'Ruby',
|
351
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
352
|
+
to_return(status: 200, body: {'test': 'name-similarity'}.to_json, headers: {})
|
353
|
+
end
|
354
|
+
it 'test name similarity' do
|
355
|
+
params = NameSimilarityParameters.new('Michael Jackson', '迈克尔·杰克逊')
|
356
|
+
response = RosetteAPI.new('0123456789').name_similarity(params)
|
357
|
+
expect(response).instance_of? Hash
|
358
|
+
end
|
359
|
+
|
360
|
+
it 'badRequestFormat: name2 option can only be an instance of a String or NameParameter' do
|
361
|
+
params = NameSimilarityParameters.new('Michael Jackson', 123)
|
362
|
+
expect { RosetteAPI.new('0123456789').name_similarity(params) }.to raise_error(BadRequestError)
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
describe '.get_tokens' do
|
367
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/tokens.json')), encoding: 'utf-8'
|
368
|
+
before do
|
369
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
370
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
371
|
+
headers: {'Accept' => 'application/json',
|
372
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
373
|
+
'Content-Type' => 'application/json',
|
374
|
+
'User-Agent' => 'Ruby',
|
375
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
376
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
377
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/tokens').
|
378
|
+
with(body: request_file,
|
379
|
+
headers: {'Accept' => 'application/json',
|
380
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
381
|
+
'Content-Type' => 'application/json',
|
382
|
+
'User-Agent' => 'Ruby',
|
383
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
384
|
+
to_return(status: 200, body: {'test': 'tokens'}.to_json, headers: {})
|
385
|
+
end
|
386
|
+
it 'test tokens' do
|
387
|
+
params = DocumentParameters.new
|
388
|
+
params.content = '北京大学生物系主任办公室内部会议'
|
389
|
+
response = RosetteAPI.new('0123456789').get_tokens(params)
|
390
|
+
expect(response).instance_of? Hash
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
describe '.get_sentences' do
|
395
|
+
request_file = File.read File.expand_path(File.join(File.dirname(__FILE__), '../mock-data/request/sentences.json'))
|
396
|
+
before do
|
397
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
398
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
399
|
+
headers: {'Accept' => 'application/json',
|
400
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
401
|
+
'Content-Type' => 'application/json',
|
402
|
+
'User-Agent' => 'Ruby',
|
403
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
404
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
405
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/sentences').
|
406
|
+
with(body: request_file,
|
407
|
+
headers: {'Accept' => 'application/json',
|
408
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
409
|
+
'Content-Type' => 'application/json',
|
410
|
+
'User-Agent' => 'Ruby',
|
411
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
412
|
+
to_return(status: 200, body: {'test': 'sentences'}.to_json, headers: {})
|
413
|
+
end
|
414
|
+
it 'test sentences' do
|
415
|
+
params = DocumentParameters.new
|
416
|
+
params.content = 'This land is your land. This land is my land\nFrom California to the New York island;\nFrom' \
|
417
|
+
' the wood forest to the Gulf Stream waters\n\nThis land was made for you and Me.\n\nAs I was' \
|
418
|
+
' walking that ribbon of highway,\nI saw above me that endless skyway:\nI saw below me that' \
|
419
|
+
' golden valley:\nThis land was made for you and me.'
|
420
|
+
response = RosetteAPI.new('0123456789').get_sentences(params)
|
421
|
+
expect(response).instance_of? Hash
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
describe '.info' do
|
426
|
+
before do
|
427
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
428
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
429
|
+
headers: {'Accept' => 'application/json',
|
430
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
431
|
+
'Content-Type' => 'application/json',
|
432
|
+
'User-Agent' => 'Ruby',
|
433
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
434
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
435
|
+
stub_request(:get, 'https://api.rosette.com/rest/v1/info').
|
436
|
+
with(headers: {'Accept' => '*/*',
|
437
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
438
|
+
'User-Agent' => 'Ruby',
|
439
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
440
|
+
to_return(status: 200, body: {'test': 'info'}.to_json, headers: {})
|
441
|
+
end
|
442
|
+
it 'test info' do
|
443
|
+
response = RosetteAPI.new('0123456789').info
|
444
|
+
expect(response).instance_of? Hash
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
describe '.ping' do
|
449
|
+
before do
|
450
|
+
stub_request(:post, 'https://api.rosette.com/rest/v1/info?clientVersion=1.0.2').
|
451
|
+
with(body: "\"{\\\"body\\\": \\\"version check\\\"}\"",
|
452
|
+
headers: {'Accept' => 'application/json',
|
453
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
454
|
+
'Content-Type' => 'application/json',
|
455
|
+
'User-Agent' => 'Ruby',
|
456
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
457
|
+
to_return(status: 200, body: {'versionChecked': true}.to_json, headers: {})
|
458
|
+
stub_request(:get, 'https://api.rosette.com/rest/v1/ping').
|
459
|
+
with(headers: {'Accept' => '*/*',
|
460
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
461
|
+
'User-Agent' => 'Ruby',
|
462
|
+
'X-Rosetteapi-Key' => '0123456789'}).
|
463
|
+
to_return(status: 200, body: {'test': 'ping'}.to_json, headers: {})
|
464
|
+
end
|
465
|
+
it 'test ping' do
|
466
|
+
response = RosetteAPI.new('0123456789').ping
|
467
|
+
expect(response).instance_of? Hash
|
468
|
+
end
|
469
|
+
end
|
470
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rosette_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Basis Technology Corp
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rubysl-securerandom
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
description: Rosette API gem
|
28
|
+
email: support@rosette.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/bad_request_error.rb
|
34
|
+
- lib/bad_request_format_error.rb
|
35
|
+
- lib/document_parameters.rb
|
36
|
+
- lib/name_parameter.rb
|
37
|
+
- lib/name_similarity_parameters.rb
|
38
|
+
- lib/name_translation_parameters.rb
|
39
|
+
- lib/request_builder.rb
|
40
|
+
- lib/rosette_api.rb
|
41
|
+
- lib/rosette_api_error.rb
|
42
|
+
- tests/tests_spec.rb
|
43
|
+
homepage: https://github.com/rosette-api/ruby
|
44
|
+
licenses:
|
45
|
+
- MIT
|
46
|
+
metadata: {}
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 2.3.0
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 2.6.4
|
64
|
+
signing_key:
|
65
|
+
specification_version: 2
|
66
|
+
summary: Rosette API gem that supports multilingual text-analytics.
|
67
|
+
test_files:
|
68
|
+
- tests/tests_spec.rb
|