swiftype 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +95 -22
- data/lib/swiftype/client.rb +53 -1
- data/lib/swiftype/request.rb +24 -0
- data/lib/swiftype/version.rb +1 -1
- data/spec/client_spec.rb +181 -91
- data/spec/configuration_spec.rb +9 -8
- data/spec/deprecated_spec.rb +3 -3
- data/spec/fixtures/vcr/async_create_or_update_document_failure.yml +48 -0
- data/spec/fixtures/vcr/async_create_or_update_document_success.yml +51 -0
- data/spec/fixtures/vcr/document_receipts_multiple.yml +48 -0
- data/spec/fixtures/vcr/document_receipts_multiple_complete.yml +48 -0
- data/spec/platform_spec.rb +6 -6
- data/spec/sso_spec.rb +3 -3
- data/swiftype.gemspec +2 -2
- metadata +28 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54e1e3d18b1ef0d4ac96736071a83904c332fa62
|
4
|
+
data.tar.gz: 7c387aedb4ccca99caef021296dc6f9f2adad14f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 380b9b2cd117f33f243386e1b5dac701ceb460d6ffd4f5f898bdedd5717d77585f1049f07b396613ce18dbc5add22487f6444d07f062f069cceedce02e717576
|
7
|
+
data.tar.gz: ccf234d1156a1338b9c11f12c2e68b06fb7b0b58b94118c8c60c9fb80d67f5e994c7f138fdbc914ced223351c73e3945aa8d07559917ec7d382dc938fd258318
|
data/README.md
CHANGED
@@ -24,7 +24,7 @@ To install the gem, execute:
|
|
24
24
|
|
25
25
|
gem install swiftype
|
26
26
|
|
27
|
-
Or place `gem 'swiftype', '~> 1.0
|
27
|
+
Or place `gem 'swiftype', '~> 1.2.0` in your `Gemfile` and run `bundle install`.
|
28
28
|
|
29
29
|
## Usage
|
30
30
|
|
@@ -36,6 +36,10 @@ Before issuing commands to the API, configure the client with your API key:
|
|
36
36
|
|
37
37
|
You can find your API key in your [Account Settings](https://swiftype.com/settings/account).
|
38
38
|
|
39
|
+
If you're using Heroku, you can configure the client with the `SWIFTYPE_URL` configuration variable:
|
40
|
+
|
41
|
+
Swiftype.authenticated_url = ENV['SWIFTYPE_URL']
|
42
|
+
|
39
43
|
### Create a client
|
40
44
|
|
41
45
|
client = Swiftype::Client.new
|
@@ -137,9 +141,11 @@ Retrieve a specific Document using its `id` or `external_id`:
|
|
137
141
|
|
138
142
|
document = client.document('swiftype-api-example', 'videos', 'FHtvDA0W34I')
|
139
143
|
|
144
|
+
To create or update. single or multiple documents, we use the method `index_documents`.
|
145
|
+
|
140
146
|
Create a new Document with mandatory `external_id` and user-defined fields:
|
141
147
|
|
142
|
-
document = client.
|
148
|
+
document = client.index_documents('swiftype-api-example', 'videos', {
|
143
149
|
:external_id => 'FHtvDA0W34I',
|
144
150
|
:fields => [
|
145
151
|
{:name => 'title', :value => "Felix Baumgartner's supersonic freefall from 128k' - Mission Highlights", :type => 'string'},
|
@@ -149,7 +155,7 @@ Create a new Document with mandatory `external_id` and user-defined fields:
|
|
149
155
|
|
150
156
|
Create multiple Documents at once and return status for each Document creation:
|
151
157
|
|
152
|
-
response = client.
|
158
|
+
response = client.index_documents('swiftype-api-example', 'videos', [{
|
153
159
|
:external_id => 'FHtvDA0W34I',
|
154
160
|
:fields => [
|
155
161
|
{:name => 'title', :value => "Felix Baumgartner's supersonic freefall from 128k' - Mission Highlights", :type => 'string'},
|
@@ -162,35 +168,50 @@ Create multiple Documents at once and return status for each Document creation:
|
|
162
168
|
{:name => 'url', :value => 'http://www.youtube.com/watch?v='dMH0bHeiRNg', :type => 'enum'},
|
163
169
|
{:name => 'chanel_id', :value => UC5B9H4l2vtgo7cAoExcFh-w', :type => 'enum'}
|
164
170
|
]}])
|
165
|
-
#=> [true, true]
|
166
171
|
|
167
172
|
Update fields of an existing Document specified by `id` or `external_id`:
|
168
173
|
|
169
|
-
client.
|
174
|
+
client.index_documents('swiftype-api-example', 'videos', 'FHtvDA0W34I', {:title =>'New Title'})
|
170
175
|
|
171
176
|
**NOTE:** A field must already exist on a Document in order to update it.
|
172
177
|
|
173
178
|
Update multiple Documents at once:
|
174
179
|
|
175
|
-
response = client.
|
180
|
+
response = client.index_documents('swiftype-api-example','videos', [
|
176
181
|
{:external_id => 'FHtvDA0W34I', :fields => {:view_count => 32874417}},
|
177
182
|
{:external_id => 'dMH0bHeiRNg', :fields => {:view_count => 98323493}}
|
178
183
|
])
|
179
|
-
#=> [true, true]
|
180
|
-
|
181
|
-
Create or update a Document:
|
182
184
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
185
|
+
All methods above will have a return in the following format:
|
186
|
+
|
187
|
+
[
|
188
|
+
{
|
189
|
+
"id": "5473d6142ed96065a9000001",
|
190
|
+
"external_id": "FHtvDA0W34I",
|
191
|
+
"status": "complete",
|
192
|
+
"errors": [],
|
193
|
+
"links": {
|
194
|
+
"receipt": "https://api.swiftype.com/api/v1/document_receipts/5473d6142ed96065a9000001.json",
|
195
|
+
"document": "https://api.swiftype.com/api/v1/engine/xyz/document_type/abc/document/5473d6142ed96065a9000001.json"
|
196
|
+
}
|
197
|
+
},
|
198
|
+
{
|
199
|
+
"id": "5473d6142ed96065a9000002",
|
200
|
+
"external_id": "dMH0bHeiRNg",
|
201
|
+
"status": "complete",
|
202
|
+
"errors": [],
|
203
|
+
"links": {
|
204
|
+
"receipt": "https://api.swiftype.com/api/v1/document_receipts/5473d6142ed96065a9000001.json",
|
205
|
+
"document": "https://api.swiftype.com/api/v1/engine/xyz/document_type/abc/document/5473d6142ed96065a9000002.json"
|
206
|
+
}
|
207
|
+
}
|
208
|
+
]
|
209
|
+
|
210
|
+
**NOTE:** If you'd like to create or update documents asynchronously, simply pass the option `:async => true` as the last argument.
|
211
|
+
|
212
|
+
For instance, to Create multiple Documents at once:
|
213
|
+
|
214
|
+
response = client.index_documents('swiftype-api-example', 'videos', [{
|
194
215
|
:external_id => 'FHtvDA0W34I',
|
195
216
|
:fields => [
|
196
217
|
{:name => 'title', :value => "Felix Baumgartner's supersonic freefall from 128k' - Mission Highlights", :type => 'string'},
|
@@ -202,7 +223,59 @@ Create or update multiple `Documents` at once:
|
|
202
223
|
{:name => 'title', :value => 'Evolution of Dance - By Judson Laipply', :type => 'string'},
|
203
224
|
{:name => 'url', :value => 'http://www.youtube.com/watch?v='dMH0bHeiRNg', :type => 'enum'},
|
204
225
|
{:name => 'chanel_id', :value => UC5B9H4l2vtgo7cAoExcFh-w', :type => 'enum'}
|
205
|
-
]}]
|
226
|
+
]}],
|
227
|
+
:async => true )
|
228
|
+
#=> {
|
229
|
+
"batch_link": "https://api.swiftype.com/api/v1/document_receipts.json?ids=5473d6142ed96065a9000001,5473d6142ed96065a9000002",
|
230
|
+
"document_receipts": [
|
231
|
+
{
|
232
|
+
"id": "5473d6142ed96065a9000001",
|
233
|
+
"external_id": "FHtvDA0W34I",
|
234
|
+
"status": "pending",
|
235
|
+
"errors": [],
|
236
|
+
"links": {
|
237
|
+
"receipt": "https://api.swiftype.com/api/v1/document_receipts/5473d6142ed96065a9000001.json",
|
238
|
+
"document": null
|
239
|
+
}
|
240
|
+
},
|
241
|
+
{
|
242
|
+
"id": "5473d6342ed96065a9000002",
|
243
|
+
"external_id": "dMH0bHeiRNg",
|
244
|
+
"status": "pending",
|
245
|
+
"errors": [],
|
246
|
+
"links": {
|
247
|
+
"receipt": "https://api.swiftype.com/api/v1/document_receipts/5473d6142ed96065a9000002.json",
|
248
|
+
"document": null
|
249
|
+
}
|
250
|
+
}
|
251
|
+
]
|
252
|
+
}
|
253
|
+
|
254
|
+
To check the status of documents with their document_receipt ids:
|
255
|
+
|
256
|
+
response = client.document_receipts(["5473d6142ed96065a9000001", "5473d6342ed96065a9000002"])
|
257
|
+
#=> [
|
258
|
+
{
|
259
|
+
"id": "5473d6142ed96065a9000001",
|
260
|
+
"external_id": "FHtvDA0W34I",
|
261
|
+
"status": "complete",
|
262
|
+
"errors": [],
|
263
|
+
"links": {
|
264
|
+
"receipt": "https://api.swiftype.com/api/v1/document_receipts/5473d6142ed96065a9000001.json",
|
265
|
+
"document": "https://api.swiftype.com/api/v1/engine/xyz/document_type/abc/document/5473d6142ed96065a9000001.json"
|
266
|
+
}
|
267
|
+
},
|
268
|
+
{
|
269
|
+
"id": "5473d6142ed96065a9000002",
|
270
|
+
"external_id": "dMH0bHeiRNg",
|
271
|
+
"status": "complete",
|
272
|
+
"errors": [],
|
273
|
+
"links": {
|
274
|
+
"receipt": "https://api.swiftype.com/api/v1/document_receipts/5473d6142ed96065a9000001.json",
|
275
|
+
"document": "https://api.swiftype.com/api/v1/engine/xyz/document_type/abc/document/5473d6142ed96065a9000002.json"
|
276
|
+
}
|
277
|
+
}
|
278
|
+
]
|
206
279
|
|
207
280
|
Destroy a Document by external_id:
|
208
281
|
|
@@ -291,7 +364,7 @@ swiftype-rb 1.0 has been rewritten to be simpler and easier to use. However, it
|
|
291
364
|
|
292
365
|
To upgrade from the old version of swiftype-rb:
|
293
366
|
|
294
|
-
* If you previously used the `Swiftype` client, migrate your API calls to the `Swiftype::Client` format.
|
367
|
+
* If you previously used the `Swiftype` client, migrate your API calls to the `Swiftype::Client` format.
|
295
368
|
* If you previously used the `Swiftype::Easy` client, change `Swiftype::Easy` to `Swiftype::Client`. Almost all method calls should be the same (there are a few minor changes).
|
296
369
|
|
297
370
|
Additionally, the result object returned by search methods (for example, the old Swiftype gem's `Engine#search` or `Swiftype::Easy#search` methods) returns results in a different way. Instead of being an array of `Swiftype::Document` objects, it will be an array of Hashes.
|
data/lib/swiftype/client.rb
CHANGED
@@ -14,9 +14,12 @@ module Swiftype
|
|
14
14
|
|
15
15
|
# Create a new Swiftype::Client client
|
16
16
|
#
|
17
|
-
# @param options [Hash] a hash of configuration options that will
|
17
|
+
# @param options [Hash] a hash of configuration options that will override what is set on the Swiftype class.
|
18
18
|
# @option options [String] :api_key an API Key to use for this client
|
19
19
|
# @option options [String] :platform_access_token a user's access token, will be used instead of API key for authenticating requests
|
20
|
+
# @option options [Fixnum] :open_timeout the number of seconds Net::HTTP
|
21
|
+
# will wait while opening a connection before raising a Timeout::Error
|
22
|
+
|
20
23
|
def initialize(options={})
|
21
24
|
@options = options
|
22
25
|
end
|
@@ -29,6 +32,10 @@ module Swiftype
|
|
29
32
|
@options[:platform_access_token]
|
30
33
|
end
|
31
34
|
|
35
|
+
def open_timeout
|
36
|
+
@options[:open_timeout]
|
37
|
+
end
|
38
|
+
|
32
39
|
# Methods wrapping the Swiftype private search and API endpoints. Using these methods, you can perform full-text
|
33
40
|
# and prefix searches over the Documents in your Engine, in a specific DocumentType, or any subset of DocumentTypes.
|
34
41
|
# You can also filter results and get faceted counts for results.
|
@@ -312,6 +319,51 @@ module Swiftype
|
|
312
319
|
def update_documents(engine_id, document_type_id, documents={})
|
313
320
|
put("engines/#{engine_id}/document_types/#{document_type_id}/documents/bulk_update.json", { :documents => documents })
|
314
321
|
end
|
322
|
+
|
323
|
+
def async_create_or_update_documents(engine_id, document_type_id, documents=[])
|
324
|
+
post("engines/#{engine_id}/document_types/#{document_type_id}/documents/async_bulk_create_or_update.json", :documents => documents)
|
325
|
+
end
|
326
|
+
|
327
|
+
# Retrieve Document Receipts from the API by ID
|
328
|
+
#
|
329
|
+
# @param [Array<String>] receipt_ids an Array of Document Receipt IDs
|
330
|
+
#
|
331
|
+
# @return [Array<Hash>] an Array of Document Receipt hashes
|
332
|
+
def document_receipts(receipt_ids)
|
333
|
+
post("document_receipts.json", :ids => receipt_ids)
|
334
|
+
end
|
335
|
+
|
336
|
+
# Index a batch of documents using the {asynchronous API}[https://swiftype.com/documentation/asynchronous_indexing].
|
337
|
+
# This is a good choice if you have a large number of documents.
|
338
|
+
#
|
339
|
+
# @param [String] engine_id the Engine slug or ID
|
340
|
+
# @param [String] document_type_id the Document Type slug or ID
|
341
|
+
# @param [Array] documents an Array of Document Hashes
|
342
|
+
# @param [Hash] options additional options
|
343
|
+
# @option options [Boolean] :async (false) When true, output is document receipts created. When false, poll until all receipts are no longer pending or timeout is reached.
|
344
|
+
# @option options [Numeric] :timeout (10) Number of seconds to wait before raising an exception
|
345
|
+
#
|
346
|
+
# @return [Array<Hash>] an Array of newly-created Document Receipt hashes if used in :async => true mode
|
347
|
+
# @return [Array<Hash>] an Array of processed Document Receipt hashes if used in :async => false mode
|
348
|
+
#
|
349
|
+
# @raise [Timeout::Error] when used in :async => false mode and the timeout expires
|
350
|
+
def index_documents(engine_id, document_type_id, documents = [], options = {})
|
351
|
+
documents = Array(documents)
|
352
|
+
|
353
|
+
res = async_create_or_update_documents(engine_id, document_type_id, documents)
|
354
|
+
|
355
|
+
if options[:async]
|
356
|
+
res
|
357
|
+
else
|
358
|
+
receipt_ids = res["document_receipts"].map { |a| a["id"] }
|
359
|
+
|
360
|
+
poll(options) do
|
361
|
+
receipts = document_receipts(receipt_ids)
|
362
|
+
flag = receipts.all? { |a| a["status"] != "pending" }
|
363
|
+
flag ? receipts : false
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
315
367
|
end
|
316
368
|
|
317
369
|
# The analytics API provides a way to export analytics data similar to what is found in the Swiftype Dashboard.
|
data/lib/swiftype/request.rb
CHANGED
@@ -26,11 +26,35 @@ module Swiftype
|
|
26
26
|
request(:delete, path, params)
|
27
27
|
end
|
28
28
|
|
29
|
+
# Poll a block with backoff until a timeout is reached.
|
30
|
+
#
|
31
|
+
# @param [Hash] options optional arguments
|
32
|
+
# @option options [Numeric] :timeout (10) Number of seconds to wait before timing out
|
33
|
+
#
|
34
|
+
# @yieldreturn a truthy value to return from poll
|
35
|
+
# @yieldreturn [false] to continue polling.
|
36
|
+
#
|
37
|
+
# @return the truthy value returned from the block.
|
38
|
+
#
|
39
|
+
# @raise [Timeout::Error] when the timeout expires
|
40
|
+
def poll(options={})
|
41
|
+
timeout = options[:timeout] || 10
|
42
|
+
delay = 0.05
|
43
|
+
Timeout.timeout(timeout) do
|
44
|
+
while true
|
45
|
+
res = yield
|
46
|
+
return res if res
|
47
|
+
sleep delay *= 2
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
29
52
|
def request(method, path, params={})
|
30
53
|
uri = URI.parse("#{Swiftype.endpoint}#{path}")
|
31
54
|
|
32
55
|
request = build_request(method, uri, params)
|
33
56
|
http = Net::HTTP.new(uri.host, uri.port)
|
57
|
+
http.open_timeout = @options[:open_timeout]
|
34
58
|
|
35
59
|
if uri.scheme == 'https'
|
36
60
|
http.use_ssl = true
|
data/lib/swiftype/version.rb
CHANGED