lableb_sdk 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 939511b56c642e7cd8edaa7e2d2a69ea94ad4d69e03de67917a95d7c5d9bb47f
4
+ data.tar.gz: bb30281e4d485a6aca6d16df53f15ae341fd166cc32f1890beaa5baa1443eb14
5
+ SHA512:
6
+ metadata.gz: a2c729ba7b71a790530fe827d59564d779d3c460cbe58ff4bc0ad1f45ca2db0e32b08084df2ff1402429fd02f982b2512dfa96db34c9aaf25dff63031c7f4be2
7
+ data.tar.gz: b5caed6a6c4175c3a7b83427df78fc5a7e13e7690920ac81c47ebebf303b37aa15e2193f79906eec65efe06a2afcfcf2732ecf56f7e4ff3c9ded71746ae41c96
@@ -0,0 +1,14 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "lableb_sdk"
3
+ s.version = "1.0.0"
4
+ s.date = "2019-06-01"
5
+ s.summary = "lableb cloud search sdk"
6
+ s.description = "Lableb cloud search api sdk"
7
+ s.homepage = "https://gitlab.com/cse-sdk/ruby-sdk"
8
+ s.authors = ["Lableb"]
9
+ s.email = "support@lableb.com"
10
+ s.files = %w(lableb_sdk.gemspec) + Dir["lib/**/*.rb"]
11
+ s.require_paths = ["lib"]
12
+ s.required_ruby_version = ">=2.0.0"
13
+ s.license = "MIT"
14
+ end
@@ -0,0 +1,63 @@
1
+ require "net/http"
2
+ require "net/https"
3
+ require "json"
4
+
5
+ module Lableb
6
+ class Client
7
+ def createRequest(url, headers)
8
+ http = Net::HTTP.new(url.host, url.port)
9
+ headers.each do | key, value |
10
+ req[key] = value
11
+ end
12
+ http.use_ssl = true
13
+ return http
14
+ end
15
+
16
+ def getJSON(url, qs = {}, headers = {})
17
+ uri = URI("#{url}?#{self.buildQueryString(qs)}")
18
+ http = self.createRequest(uri, headers)
19
+ req = Net::HTTP::Get.new(uri)
20
+ response = http.request(req)
21
+ return response
22
+ end
23
+
24
+ def postJSON(url, body = {}, qs = {}, headers = {})
25
+ uri = URI("#{url}?#{self.buildQueryString(qs)}")
26
+ http = self.createRequest(uri, headers)
27
+ req = Net::HTTP::Post.new(uri, { 'Content-Type': 'application/json' })
28
+ req.body = body.to_json
29
+ response = http.request(req)
30
+ return response
31
+ end
32
+
33
+ def deleteJSON(url, qs = {}, headers = {})
34
+ uri = URI("#{url}?#{self.buildQueryString(qs)}")
35
+ http = self.createRequest(uri, headers)
36
+ req = Net::HTTP::Delete.new(uri)
37
+ response = http.request(req)
38
+ return response
39
+ end
40
+
41
+ def buildQueryString(params)
42
+ res = []
43
+ params.each do | key, value |
44
+ if value.kind_of? Array
45
+ res.push(value.map{|el| "#{key}=#{el}"})
46
+ elsif value.is_a? Hash
47
+ value.each do | key2, val2 |
48
+ temp = {}
49
+ if val2.is_a? String
50
+ temp[key] = "#{key2}:\"#{val2}\""
51
+ elsif val2.is_a? Array
52
+ temp[key] = val2.map{|el| "#{key2}:\"#{el}\""}
53
+ end
54
+ res.push(buildQueryString(temp))
55
+ end
56
+ else
57
+ res.push("#{key}=#{value.to_s}")
58
+ end
59
+ end
60
+ res.join("&")
61
+ end
62
+ end
63
+ end
data/lib/lableb_sdk.rb ADDED
@@ -0,0 +1,231 @@
1
+ require "json"
2
+ require "date"
3
+ require "./lib/lableb_client"
4
+
5
+ module Lableb
6
+ class SDK
7
+ def initialize(projectName, searchToken, indexingToken)
8
+ @projectName = projectName
9
+ @searchToken = searchToken
10
+ @indexingToken = indexingToken
11
+ @apiURL = "https://api-bahuth.lableb.com/api/v1"
12
+ @baseURL = "#{@apiURL}/#{@projectName}/collections"
13
+ @client = Lableb::Client.new
14
+ @customSessionID = nil
15
+ end
16
+
17
+ # Indexes documents to Lableb
18
+ # @param collection {String} - collection name in Lableb index
19
+ # @param document {Hash | Array} - docuemnts to index
20
+ def index(collection, documents)
21
+ docs = nil
22
+ if documents.kind_of? Array
23
+ docs = documents.map{|document| self.convertDates(document)}
24
+ else
25
+ docs = [self.convertDates(documents)]
26
+ end
27
+ url = "#{@baseURL}/#{collection}/documents"
28
+ response = @client.postJSON(url, docs, { token: @indexingToken })
29
+ indexed = response.code.to_i < 400
30
+ return indexed, response.code.to_i
31
+ end
32
+
33
+ # Searches documents on Lableb
34
+ # @param collection {String} - collection name in Lableb index
35
+ # @param params {Hash} - query string parameters
36
+ # @param handler {String} - search handler name
37
+ def search(collection, params, handler="default")
38
+ params['token'] = @searchToken
39
+ params['session_id'] = self.getSessionID()
40
+ url = "#{@baseURL}/#{collection}/search/#{handler}"
41
+ response = @client.getJSON(url, params)
42
+ code = response.code.to_i
43
+ data = JSON.parse(response.body)
44
+
45
+ if code >= 400
46
+ return data['response'], code
47
+ end
48
+
49
+ facets = {}
50
+ data['response']['facets'].map do |facet|
51
+ if facet[0] != "count"
52
+ facets[facet[0]] = facet[1]['buckets']
53
+ end
54
+ end
55
+
56
+ docuemntsWithFeedbackUrl = data['response']['results'].map.with_index do |document, idx|
57
+ document['feedbackUrl'] = self.generateSearchFeedbackUrl(collection, handler, document, idx + 1, params[:q])
58
+ document
59
+ end
60
+
61
+ return {
62
+ totalDocuments: data['response']['found_documents'],
63
+ documents: docuemntsWithFeedbackUrl,
64
+ facets: facets
65
+ }, code
66
+ end
67
+
68
+ # generates a feedback url for a search result
69
+ def generateSearchFeedbackUrl(collection, handler, document, order, query)
70
+ qs = @client.buildQueryString({
71
+ session_id: self.getSessionID(),
72
+ token: @searchToken,
73
+ query: query,
74
+ item_id: document['id'],
75
+ item_order: order,
76
+ url: document['url']
77
+ })
78
+ url = "#{@baseURL}/#{collection}/search/#{handler}/feedback/hits?#{qs}"
79
+ return url
80
+ end
81
+
82
+ # Gets autcomplete suggestions
83
+ # @param collection {String} - collection name in Lableb index
84
+ # @param params {Hash} - query string parameters
85
+ # @param handler {String} - autocomplete handler name
86
+ def autocomplete(collection, params, handler="suggest")
87
+ params['token'] = @searchToken
88
+ params['session_id'] = self.getSessionID()
89
+ url = "#{@baseURL}/#{collection}/autocomplete/#{handler}"
90
+ response = @client.getJSON(url, params)
91
+ data = JSON.parse(response.body)
92
+ code = response.code.to_i
93
+
94
+ if code >= 400
95
+ return data['response'], code
96
+ end
97
+
98
+ suggestionsWithFeedbackUrl = data['response']['results'].map.with_index do |suggestion, idx|
99
+ suggestion['feedbackUrl'] = self.generateAutocompleteFeedbackUrl(collection, handler, suggestion, idx + 1, params[:q])
100
+ suggestion
101
+ end
102
+
103
+ return {
104
+ totalSuggestions: data['response']['found_documents'],
105
+ suggestions: suggestionsWithFeedbackUrl
106
+ }
107
+ end
108
+
109
+ # generates autocomplete feedback url for an autocomplete suggestion
110
+ def generateAutocompleteFeedbackUrl(collection, handler, suggestion, order, query)
111
+ params = {
112
+ session_id: self.getSessionID(),
113
+ token: @searchToken,
114
+ query: query,
115
+ item_order: order
116
+ }
117
+
118
+ if suggestion['url']
119
+ params['url'] = suggestion['url']
120
+ end
121
+
122
+ qs = @client.buildQueryString(params)
123
+ url = "#{@baseURL}/#{collection}/autocomplete/#{handler}/feedback/hits?#{qs}"
124
+ return url
125
+ end
126
+
127
+ # Gets related posts to the specified one in passed params
128
+ # @param collection {String} - collection name in Lableb index
129
+ # @param params {Hash} - query string parameters
130
+ # @param handler {String} - recommendation handler name
131
+ def recommend(collection, params, handler="recommend")
132
+ params['token'] = @searchToken
133
+ params['session_id'] = self.getSessionID()
134
+ url = "#{@baseURL}/#{collection}/recommend/#{handler}"
135
+ response = @client.getJSON(url, params)
136
+ data = JSON.parse(response.body)
137
+ code = response.code.to_i
138
+
139
+ if code >= 400
140
+ return data['response'], code
141
+ end
142
+
143
+ recommendationsWithFeedbackUrl = data['response']['results'].map.with_index do |recommendation, idx|
144
+ recommendation['feedbackUrl'] = self.generateRecommendationFeedbackUrl(collection, handler, recommendation, idx + 1)
145
+ recommendation
146
+ end
147
+
148
+ return {
149
+ totalDocuments: data['response']['found_documents'],
150
+ documents: recommendationsWithFeedbackUrl
151
+ }
152
+ end
153
+
154
+ # generates recommendation hit feedback url, but the url needs to be completed with
155
+ # the source document params
156
+ def generateRecommendationFeedbackUrl(collection, handler, target, order)
157
+ params = {
158
+ session_id: self.getSessionID(),
159
+ token: @searchToken,
160
+ target_id: target['id'],
161
+ item_order: order
162
+ }
163
+
164
+ if target['url']
165
+ params['target_url'] = target['url']
166
+ end
167
+
168
+ if target['title']
169
+ params['target_title'] = target['title']
170
+ end
171
+
172
+ qs = @client.buildQueryString(params)
173
+ url = "#{@baseURL}/#{collection}/recommend/#{handler}/feedback/hits?#{qs}"
174
+ return url
175
+ end
176
+
177
+ # Deletes a document from Lableb index by id
178
+ # @param collection {String} - collection name in Lableb index
179
+ # @param id {String} - id of the document to be deleted
180
+ def delete(collection, id)
181
+ url = "#{@baseURL}/#{collection}/documents/#{id}"
182
+ response = @client.deleteJSON(url, { token: @indexingToken })
183
+ data = JSON.parse(response.body)
184
+ code = response.code.to_i
185
+
186
+ if code >= 400
187
+ return data['response'], code
188
+ end
189
+
190
+ return true, code
191
+ end
192
+
193
+ # covert each date in a document to ISO8601 date string
194
+ def convertDates(doc)
195
+ doc.each do | key, value |
196
+ if key[-2..key.length] == "dt"
197
+ doc[key] = self.toISODateString(value)
198
+ elsif key[-3..key.length] == "dta"
199
+ doc[key] = value.map{ | date | self.toISODateString(date) }
200
+ end
201
+ end
202
+ doc
203
+ end
204
+
205
+ # convert a date object or a date string into ISO8601 date string
206
+ def toISODateString(date)
207
+ str = ""
208
+ if (date.kind_of? Date)
209
+ str = date.to_s
210
+ elsif date.is_a? String
211
+ str = date
212
+ end
213
+ dt = DateTime.parse(str).iso8601.split('+')[0] + "Z"
214
+ dt
215
+ end
216
+
217
+ # sets custom session id generator
218
+ def setSessionIDGenerator(method)
219
+ @customSessionID = method
220
+ end
221
+
222
+ # returns the custom session id generator if it exists
223
+ # else generates and returns a random string
224
+ def getSessionID()
225
+ if @customSessionID
226
+ return @customSessionID.call()
227
+ end
228
+ return rand(7958661109946400884391936).to_s(36)
229
+ end
230
+ end
231
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lableb_sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Lableb
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-06-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Lableb cloud search api sdk
14
+ email: support@lableb.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lableb_sdk.gemspec
20
+ - lib/lableb_client.rb
21
+ - lib/lableb_sdk.rb
22
+ homepage: https://gitlab.com/cse-sdk/ruby-sdk
23
+ licenses:
24
+ - MIT
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 2.0.0
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 2.7.6
43
+ signing_key:
44
+ specification_version: 4
45
+ summary: lableb cloud search sdk
46
+ test_files: []