Skip to content

Commit 558a323

Browse files
committed
Add support for presets
1 parent 7638e03 commit 558a323

6 files changed

Lines changed: 170 additions & 2 deletions

File tree

lib/typesense.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ module Typesense
2121
require_relative 'typesense/key'
2222
require_relative 'typesense/multi_search'
2323
require_relative 'typesense/analytics'
24-
require_relative 'typesense/analytics_rule'
2524
require_relative 'typesense/analytics_rules'
25+
require_relative 'typesense/analytics_rule'
26+
require_relative 'typesense/presets'
27+
require_relative 'typesense/preset'
2628
require_relative 'typesense/debug'
2729
require_relative 'typesense/health'
2830
require_relative 'typesense/metrics'

lib/typesense/client.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Typesense
44
class Client
55
attr_reader :configuration, :collections, :aliases, :keys, :debug, :health, :metrics, :operations,
6-
:multi_search, :analytics
6+
:multi_search, :analytics, :presets
77

88
def initialize(options = {})
99
@configuration = Configuration.new(options)
@@ -17,6 +17,7 @@ def initialize(options = {})
1717
@metrics = Metrics.new(@api_call)
1818
@operations = Operations.new(@api_call)
1919
@analytics = Analytics.new(@api_call)
20+
@presets = Presets.new(@api_call)
2021
end
2122
end
2223
end

lib/typesense/preset.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# frozen_string_literal: true
2+
3+
module Typesense
4+
class Preset
5+
def initialize(preset_name, api_call)
6+
@preset_name = preset_name
7+
@api_call = api_call
8+
end
9+
10+
def retrieve
11+
@api_call.get(endpoint_path)
12+
end
13+
14+
def delete
15+
@api_call.delete(endpoint_path)
16+
end
17+
18+
private
19+
20+
def endpoint_path
21+
"#{Presets::RESOURCE_PATH}/#{@preset_name}"
22+
end
23+
end
24+
end

lib/typesense/presets.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# frozen_string_literal: true
2+
3+
module Typesense
4+
class Presets
5+
RESOURCE_PATH = '/presets'
6+
7+
def initialize(api_call)
8+
@api_call = api_call
9+
@presets = {}
10+
end
11+
12+
def upsert(preset_name, params)
13+
@api_call.put(endpoint_path(preset_name), params)
14+
end
15+
16+
def retrieve
17+
@api_call.get(endpoint_path)
18+
end
19+
20+
def [](preset_name)
21+
@presets[preset_name] ||= Preset.new(preset_name, @api_call)
22+
end
23+
24+
private
25+
26+
def endpoint_path(operation = nil)
27+
"#{Presets::RESOURCE_PATH}#{operation.nil? ? '' : "/#{operation}"}"
28+
end
29+
end
30+
end

spec/typesense/preset_spec.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../spec_helper'
4+
require_relative 'shared_configuration_context'
5+
6+
describe Typesense::Preset do
7+
subject(:preset) { typesense.presets['search-view'] }
8+
9+
include_context 'with Typesense configuration'
10+
11+
let(:preset_data) do
12+
{
13+
'name' => 'search-view',
14+
'value' => {
15+
'query_by' => 'title,subjects,author',
16+
'query_by_weights' => '1,4,8',
17+
'sort_by' => '_text_match:desc'
18+
}
19+
}
20+
end
21+
22+
describe '#retrieve' do
23+
it 'returns the specified preset' do
24+
stub_request(:get, Typesense::ApiCall.new(typesense.configuration).send(:uri_for, '/presets/search-view', typesense.configuration.nodes[0]))
25+
.with(headers: {
26+
'X-Typesense-Api-Key' => typesense.configuration.api_key,
27+
'Content-Type': 'application/json'
28+
})
29+
.to_return(status: 200, body: JSON.dump(preset_data), headers: { 'Content-Type': 'application/json' })
30+
31+
result = preset.retrieve
32+
33+
expect(result).to eq(preset_data)
34+
end
35+
end
36+
37+
describe '#delete' do
38+
it 'deletes the specified preset' do
39+
stub_request(:delete, Typesense::ApiCall.new(typesense.configuration).send(:uri_for, '/presets/search-view', typesense.configuration.nodes[0]))
40+
.with(headers: {
41+
'X-Typesense-Api-Key' => typesense.configuration.api_key
42+
})
43+
.to_return(status: 200, body: JSON.dump('name' => 'search-view'), headers: { 'Content-Type': 'application/json' })
44+
45+
result = preset.delete
46+
47+
expect(result).to eq('name' => 'search-view')
48+
end
49+
end
50+
end

spec/typesense/presets_spec.rb

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../spec_helper'
4+
require_relative 'shared_configuration_context'
5+
6+
describe Typesense::Presets do
7+
subject(:presets) { typesense.presets }
8+
9+
include_context 'with Typesense configuration'
10+
11+
let(:preset_data) do
12+
{
13+
'name' => 'search-view',
14+
'value' => {
15+
'query_by' => 'title,subjects,author',
16+
'query_by_weights' => '1,4,8',
17+
'sort_by' => '_text_match:desc'
18+
}
19+
}
20+
end
21+
22+
describe '#upsert' do
23+
it 'creates a preset and returns it' do
24+
stub_request(:put, Typesense::ApiCall.new(typesense.configuration).send(:uri_for, '/presets/search-view', typesense.configuration.nodes[0]))
25+
.with(body: preset_data,
26+
headers: {
27+
'X-Typesense-Api-Key' => typesense.configuration.api_key,
28+
'Content-Type' => 'application/json'
29+
})
30+
.to_return(status: 201, body: JSON.dump(preset_data), headers: { 'Content-Type': 'application/json' })
31+
32+
result = presets.upsert(preset_data['name'], preset_data)
33+
34+
expect(result).to eq(preset_data)
35+
end
36+
end
37+
38+
describe '#retrieve' do
39+
it 'retrieves all presets' do
40+
stub_request(:get, Typesense::ApiCall.new(typesense.configuration).send(:uri_for, '/presets', typesense.configuration.nodes[0]))
41+
.with(headers: {
42+
'X-Typesense-Api-Key' => typesense.configuration.api_key,
43+
'Content-Type' => 'application/json'
44+
})
45+
.to_return(status: 201, body: JSON.dump([preset_data]), headers: { 'Content-Type': 'application/json' })
46+
47+
result = presets.retrieve
48+
49+
expect(result).to eq([preset_data])
50+
end
51+
end
52+
53+
describe '#[]' do
54+
it 'creates a preset object and returns it' do
55+
result = presets['search-view']
56+
57+
expect(result).to be_a_kind_of(Typesense::Preset)
58+
expect(result.instance_variable_get(:@preset_name)).to eq('search-view')
59+
end
60+
end
61+
end

0 commit comments

Comments
 (0)