swiftype-app-search 0.1.0 → 0.1.1
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/README.md +18 -1
- data/lib/data/ca-bundle.crt +1474 -1690
- data/lib/swiftype-app-search/client/documents.rb +20 -11
- data/lib/swiftype-app-search/exceptions.rb +1 -0
- data/lib/swiftype-app-search/request.rb +2 -0
- data/lib/swiftype-app-search/version.rb +1 -1
- data/spec/client_spec.rb +58 -11
- data/swiftype-app-search.gemspec +1 -1
- metadata +5 -5
@@ -4,9 +4,6 @@
|
|
4
4
|
module SwiftypeAppSearch
|
5
5
|
class Client
|
6
6
|
module Documents
|
7
|
-
REQUIRED_TOP_LEVEL_KEYS = [
|
8
|
-
'id'
|
9
|
-
].map!(&:freeze).to_set.freeze
|
10
7
|
|
11
8
|
# Retrieve Documents from the API by IDs for the {App Search API}[https://swiftype.com/documentation/app-search/]
|
12
9
|
#
|
@@ -19,6 +16,22 @@ module SwiftypeAppSearch
|
|
19
16
|
get("engines/#{engine_name}/documents", ids)
|
20
17
|
end
|
21
18
|
|
19
|
+
# Index a document using the {App Search API}[https://swiftype.com/documentation/app-search/].
|
20
|
+
#
|
21
|
+
# @param [String] engine_name the unique Engine name
|
22
|
+
# @param [Array] document a Document Hash
|
23
|
+
#
|
24
|
+
# @return [Hash] processed Document Status hash
|
25
|
+
#
|
26
|
+
# @raise [SwiftypeAppSearch::InvalidDocument] when the document has processing errors returned from the api
|
27
|
+
# @raise [Timeout::Error] when timeout expires waiting for statuses
|
28
|
+
def index_document(engine_name, document)
|
29
|
+
response = index_documents(engine_name, [document])
|
30
|
+
errors = response.first['errors']
|
31
|
+
raise InvalidDocument.new(errors.join('; ')) if errors.any?
|
32
|
+
response.first.tap { |h| h.delete('errors') }
|
33
|
+
end
|
34
|
+
|
22
35
|
# Index a batch of documents using the {App Search API}[https://swiftype.com/documentation/app-search/].
|
23
36
|
#
|
24
37
|
# @param [String] engine_name the unique Engine name
|
@@ -26,10 +39,10 @@ module SwiftypeAppSearch
|
|
26
39
|
#
|
27
40
|
# @return [Array<Hash>] an Array of processed Document Status hashes
|
28
41
|
#
|
29
|
-
# @raise [SwiftypeAppSearch::InvalidDocument] when
|
42
|
+
# @raise [SwiftypeAppSearch::InvalidDocument] when any documents have processing errors returned from the api
|
30
43
|
# @raise [Timeout::Error] when timeout expires waiting for statuses
|
31
44
|
def index_documents(engine_name, documents)
|
32
|
-
documents.map! { |document|
|
45
|
+
documents.map! { |document| normalize_document(document) }
|
33
46
|
post("engines/#{engine_name}/documents", documents)
|
34
47
|
end
|
35
48
|
|
@@ -43,13 +56,9 @@ module SwiftypeAppSearch
|
|
43
56
|
end
|
44
57
|
|
45
58
|
private
|
46
|
-
def validate_and_normalize_document(document)
|
47
|
-
document = Utils.stringify_keys(document)
|
48
|
-
document_keys = document.keys.to_set
|
49
|
-
missing_keys = REQUIRED_TOP_LEVEL_KEYS - document_keys
|
50
|
-
raise InvalidDocument.new("missing required fields (#{missing_keys.to_a.join(', ')})") if missing_keys.any?
|
51
59
|
|
52
|
-
|
60
|
+
def normalize_document(document)
|
61
|
+
Utils.stringify_keys(document)
|
53
62
|
end
|
54
63
|
end
|
55
64
|
end
|
@@ -14,6 +14,7 @@ module SwiftypeAppSearch
|
|
14
14
|
class BadRequest < ClientException; end
|
15
15
|
class Forbidden < ClientException; end
|
16
16
|
class InvalidDocument < ClientException; end
|
17
|
+
class RequestEntityTooLarge < ClientException; end
|
17
18
|
|
18
19
|
class UnexpectedHTTPException < ClientException
|
19
20
|
def initialize(http_response)
|
@@ -67,6 +67,8 @@ module SwiftypeAppSearch
|
|
67
67
|
raise SwiftypeAppSearch::NonExistentRecord, response_json
|
68
68
|
when Net::HTTPForbidden
|
69
69
|
raise SwiftypeAppSearch::Forbidden, response_json
|
70
|
+
when Net::HTTPRequestEntityTooLarge
|
71
|
+
raise SwiftypeAppSearch::RequestEntityTooLarge, response_json
|
70
72
|
else
|
71
73
|
raise SwiftypeAppSearch::UnexpectedHTTPException, response
|
72
74
|
end
|
data/spec/client_spec.rb
CHANGED
@@ -5,13 +5,64 @@ describe SwiftypeAppSearch::Client do
|
|
5
5
|
let(:client) { SwiftypeAppSearch::Client.new(:account_host_key => as_account_host_key, :api_key => as_api_key) }
|
6
6
|
|
7
7
|
context 'Documents' do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
let(:document) { { 'url' => 'http://www.youtube.com/watch?v=v1uyQZNg2vE' } }
|
9
|
+
|
10
|
+
before do
|
11
|
+
client.create_engine(engine_name) rescue SwiftypeAppSearch::BadRequest
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
client.destroy_engine(engine_name) rescue SwiftypeAppSearch::NonExistentRecord
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#index_document' do
|
19
|
+
subject { client.index_document(engine_name, document) }
|
20
|
+
|
21
|
+
it 'should return a processed document status hash' do
|
22
|
+
expect(subject).to match('id' => anything)
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when the document has an id' do
|
26
|
+
let(:id) { 'some_id' }
|
27
|
+
let(:document) { { 'id' => id, 'url' => 'http://www.youtube.com/watch?v=v1uyQZNg2vE' } }
|
28
|
+
|
29
|
+
it 'should return a processed document status hash with the same id' do
|
30
|
+
expect(subject).to eq('id' => id)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when a document has processing errors' do
|
35
|
+
let(:document) { { 'bad' => { 'no' => 'nested hashes' } } }
|
36
|
+
|
37
|
+
it 'should raise an error when the API returns errors in the response' do
|
12
38
|
expect do
|
13
|
-
|
14
|
-
end.to raise_error(SwiftypeAppSearch::InvalidDocument,
|
39
|
+
subject
|
40
|
+
end.to raise_error(SwiftypeAppSearch::InvalidDocument, /Invalid field value/)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#index_documents' do
|
46
|
+
let(:documents) { [document, second_document] }
|
47
|
+
let(:second_document_id) { 'another_id' }
|
48
|
+
let(:second_document) { { 'id' => second_document_id, 'url' => 'https://www.youtube.com/watch?v=9T1vfsHYiKY' } }
|
49
|
+
subject { client.index_documents(engine_name, documents) }
|
50
|
+
|
51
|
+
it 'should return an array of document status hashes' do
|
52
|
+
expect(subject).to match([
|
53
|
+
{ 'id' => anything, 'errors' => [] },
|
54
|
+
{ 'id' => second_document_id, 'errors' => [] }
|
55
|
+
])
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when one of the documents has processing errors' do
|
59
|
+
let(:second_document) { { 'bad' => { 'no' => 'nested hashes' } } }
|
60
|
+
|
61
|
+
it 'should return respective errors in an array of document processing hashes' do
|
62
|
+
expect(subject).to match([
|
63
|
+
{ 'id' => anything, 'errors' => [] },
|
64
|
+
{ 'id' => anything, 'errors' => ['Invalid field value: Value \'{"no"=>"nested hashes"}\' cannot be an object'] },
|
65
|
+
])
|
15
66
|
end
|
16
67
|
end
|
17
68
|
end
|
@@ -19,11 +70,7 @@ describe SwiftypeAppSearch::Client do
|
|
19
70
|
|
20
71
|
context 'Engines' do
|
21
72
|
after do
|
22
|
-
|
23
|
-
begin
|
24
|
-
client.destroy_engine(engine_name)
|
25
|
-
rescue SwiftypeAppSearch::NonExistentRecord
|
26
|
-
end
|
73
|
+
client.destroy_engine(engine_name) rescue SwiftypeAppSearch::NonExistentRecord
|
27
74
|
end
|
28
75
|
|
29
76
|
context '#create_engine' do
|
data/swiftype-app-search.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swiftype-app-search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Quin Hoxie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1
|
61
|
+
version: '2.1'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '1
|
68
|
+
version: '2.1'
|
69
69
|
description: API client for accessing the Swiftype App Search API with no dependencies.
|
70
70
|
email:
|
71
71
|
- support@swiftype.com
|
@@ -114,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
114
|
version: '0'
|
115
115
|
requirements: []
|
116
116
|
rubyforge_project:
|
117
|
-
rubygems_version: 2.4.5
|
117
|
+
rubygems_version: 2.4.5
|
118
118
|
signing_key:
|
119
119
|
specification_version: 4
|
120
120
|
summary: Official gem for accessing the Swiftype App Search API
|