lableb_sdk 1.0.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 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: []