Skip to content
5 changes: 5 additions & 0 deletions lib/typesense.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,13 @@ module Typesense
require_relative 'typesense/key'
require_relative 'typesense/multi_search'
require_relative 'typesense/analytics'
require_relative 'typesense/analytics_events'
require_relative 'typesense/analytics_rules'
require_relative 'typesense/analytics_rule'
require_relative 'typesense/analytics_v1'
require_relative 'typesense/analytics_events_v1'
require_relative 'typesense/analytics_rules_v1'
require_relative 'typesense/analytics_rule_v1'
require_relative 'typesense/presets'
require_relative 'typesense/preset'
require_relative 'typesense/debug'
Expand Down
4 changes: 4 additions & 0 deletions lib/typesense/analytics.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,9 @@ def initialize(api_call)
def rules
@rules ||= AnalyticsRules.new(@api_call)
end

def events
@events ||= AnalyticsEvents.new(@api_call)
end
end
end
19 changes: 19 additions & 0 deletions lib/typesense/analytics_events.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

module Typesense
class AnalyticsEvents
RESOURCE_PATH = '/analytics/events'

def initialize(api_call)
@api_call = api_call
end

def create(params)
@api_call.post(self.class::RESOURCE_PATH, params)
end

def retrieve(params = {})
@api_call.get(self.class::RESOURCE_PATH, params)
end
end
end
21 changes: 21 additions & 0 deletions lib/typesense/analytics_events_v1.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# frozen_string_literal: true

module Typesense
class AnalyticsEventsV1
RESOURCE_PATH = '/analytics/events'

def initialize(api_call)
@api_call = api_call
end

def create(params)
@api_call.post(endpoint_path, params)
end

private

def endpoint_path(operation = nil)
"#{AnalyticsEventsV1::RESOURCE_PATH}#{"/#{URI.encode_www_form_component(operation)}" unless operation.nil?}"
end
end
end
4 changes: 4 additions & 0 deletions lib/typesense/analytics_rule.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ def delete
@api_call.delete(endpoint_path)
end

def update(params)
@api_call.put(endpoint_path, params)
end

private

def endpoint_path
Expand Down
24 changes: 24 additions & 0 deletions lib/typesense/analytics_rule_v1.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# frozen_string_literal: true

module Typesense
class AnalyticsRuleV1
def initialize(rule_name, api_call)
@rule_name = rule_name
@api_call = api_call
end

def retrieve
@api_call.get(endpoint_path)
end

def delete
@api_call.delete(endpoint_path)
end

private

def endpoint_path
"#{AnalyticsRulesV1::RESOURCE_PATH}/#{URI.encode_www_form_component(@rule_name)}"
end
end
end
19 changes: 10 additions & 9 deletions lib/typesense/analytics_rules.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,27 @@ class AnalyticsRules
RESOURCE_PATH = '/analytics/rules'

def initialize(api_call)
@api_call = api_call
@analytics_rules = {}
@api_call = api_call
end

def upsert(rule_name, params)
@api_call.put(endpoint_path(rule_name), params)
def create(rules)
@api_call.post(self.class::RESOURCE_PATH, rules)
end

def retrieve
@api_call.get(endpoint_path)
@api_call.get(self.class::RESOURCE_PATH)
end

def [](rule_name)
@analytics_rules[rule_name] ||= AnalyticsRule.new(rule_name, @api_call)
AnalyticsRule.new(rule_name, @api_call)
end

private
def respond_to_missing?(_method_name, _include_private = false)
true
end

def endpoint_path(operation = nil)
"#{AnalyticsRules::RESOURCE_PATH}#{"/#{URI.encode_www_form_component(operation)}" unless operation.nil?}"
def method_missing(method_name, *_args, &_block)
self[method_name.to_s]
end
end
end
30 changes: 30 additions & 0 deletions lib/typesense/analytics_rules_v1.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# frozen_string_literal: true

module Typesense
class AnalyticsRulesV1
RESOURCE_PATH = '/analytics/rules'

def initialize(api_call)
@api_call = api_call
@analytics_rules = {}
end

def upsert(rule_name, params)
@api_call.put(endpoint_path(rule_name), params)
end

def retrieve
@api_call.get(endpoint_path)
end

def [](rule_name)
@analytics_rules[rule_name] ||= AnalyticsRuleV1.new(rule_name, @api_call)
end

private

def endpoint_path(operation = nil)
"#{AnalyticsRulesV1::RESOURCE_PATH}#{"/#{URI.encode_www_form_component(operation)}" unless operation.nil?}"
end
end
end
19 changes: 19 additions & 0 deletions lib/typesense/analytics_v1.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

module Typesense
class AnalyticsV1
RESOURCE_PATH = '/analytics'

def initialize(api_call)
@api_call = api_call
end

def rules
@rules ||= AnalyticsRulesV1.new(@api_call)
end

def events
@events ||= AnalyticsEventsV1.new(@api_call)
end
end
end
3 changes: 2 additions & 1 deletion lib/typesense/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
module Typesense
class Client
attr_reader :configuration, :collections, :aliases, :keys, :debug, :health, :metrics, :stats, :operations,
:multi_search, :analytics, :presets, :stemming, :nl_search_models
:multi_search, :analytics, :analytics_v1, :presets, :stemming, :nl_search_models

def initialize(options = {})
@configuration = Configuration.new(options)
Expand All @@ -18,6 +18,7 @@ def initialize(options = {})
@stats = Stats.new(@api_call)
@operations = Operations.new(@api_call)
@analytics = Analytics.new(@api_call)
@analytics_v1 = AnalyticsV1.new(@api_call)
@stemming = Stemming.new(@api_call)
@presets = Presets.new(@api_call)
@nl_search_models = NlSearchModels.new(@api_call)
Expand Down
32 changes: 31 additions & 1 deletion spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,37 @@ def typesense_healthy?(host = 'localhost', port = 8108)
false
end

def typesense_version
WebMock.allow_net_connect!
conn = Faraday.new('http://localhost:8108')
response = conn.get('/debug') do |req|
req.headers['X-TYPESENSE-API-KEY'] = 'xyz'
end

if response.status == 200 && !response.body.empty?
debug_info = JSON.parse(response.body)
debug_info['version']
end
rescue StandardError
nil
ensure
WebMock.disable_net_connect!(allow_localhost: true)
end

def typesense_v30_or_above?
version = typesense_version
return false unless version

return true if version == 'nightly'

if version.match(/^v(\d+)/)
major_version = Regexp.last_match(1).to_i
return major_version >= 30
end

false
end

def ensure_typesense_running
if typesense_healthy?
puts '✅ Typesense is already running and healthy, ready for use in integration tests'
Expand Down Expand Up @@ -96,7 +127,6 @@ def stop_typesense_if_started

config.before(:suite) do
ensure_typesense_running
WebMock.disable_net_connect!
end

config.after(:suite) do
Expand Down
Loading