From 821cef8e57d4edd177f7ea2817abc72cde92cfd3 Mon Sep 17 00:00:00 2001 From: "Tj (bougyman) Vanderpoel" Date: Mon, 5 Jan 2026 06:34:54 -0600 Subject: [PATCH] feat: adds search endpoints --- Gemfile.lock | 4 ++-- Readme.adoc | 26 ++++++++++++++++++++++++ lib/kalshi/api_client.rb | 14 +++++++++++++ lib/kalshi/client.rb | 4 ++++ lib/kalshi/search/client.rb | 18 +++++++++++++++++ lib/kalshi/search/series_tags.rb | 14 +++++++++++++ lib/kalshi/search/sports_filters.rb | 14 +++++++++++++ test/kalshi/client_test.rb | 8 ++++++++ test/kalshi/search/client_test.rb | 31 +++++++++++++++++++++++++++++ 9 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 lib/kalshi/api_client.rb create mode 100644 lib/kalshi/search/client.rb create mode 100644 lib/kalshi/search/series_tags.rb create mode 100644 lib/kalshi/search/sports_filters.rb create mode 100644 test/kalshi/search/client_test.rb diff --git a/Gemfile.lock b/Gemfile.lock index 9de2ae2..da9c235 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - kalshi (0.0.1) + kalshi (0.0.2) dry-cli dry-configurable dry-container @@ -230,7 +230,7 @@ CHECKSUMS httpx (1.7.0) sha256=e219689555951f9c13c40862da120cdd2535e1454189bed589f04d7059557154 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505 - kalshi (0.0.1) + kalshi (0.0.2) language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 diff --git a/Readme.adoc b/Readme.adoc index 44f83e8..4f9ea15 100644 --- a/Readme.adoc +++ b/Readme.adoc @@ -156,6 +156,32 @@ candlesticks = client.market.candlesticks.batch( ) ---- +=== Search + +Access Search endpoints via the `search` namespace. + +==== Tags by Category + +https://docs.kalshi.com/api-reference/search/get-tags-for-series-categories[API Reference] + +Get tags organized by series categories: + +[source,ruby] +---- +tags = client.search.tags_by_category +---- + +==== Filters by Sport + +https://docs.kalshi.com/api-reference/search/get-filters-for-sports[API Reference] + +Get filters organized by sport: + +[source,ruby] +---- +filters = client.search.filters_by_sport +---- + === WebSocket Client A raw WebSocket client is included in `bin/wss-raw` for testing connection and subscription. diff --git a/lib/kalshi/api_client.rb b/lib/kalshi/api_client.rb new file mode 100644 index 0000000..758e1f7 --- /dev/null +++ b/lib/kalshi/api_client.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Rubyists + module Kalshi + # API Client Base Class + class ApiClient + attr_reader :client + + def initialize(client) + @client = client + end + end + end +end diff --git a/lib/kalshi/client.rb b/lib/kalshi/client.rb index 0c54f02..09d3eba 100644 --- a/lib/kalshi/client.rb +++ b/lib/kalshi/client.rb @@ -28,6 +28,10 @@ def market @market ||= Market::Client.new(clone) end + def search + @search ||= Search::Client.new(clone) + end + private def full_url(path) diff --git a/lib/kalshi/search/client.rb b/lib/kalshi/search/client.rb new file mode 100644 index 0000000..2e7748e --- /dev/null +++ b/lib/kalshi/search/client.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Rubyists + module Kalshi + module Search + # Search API Client + class Client < ApiClient + def tags_by_categories + SeriesTags.new(client).all + end + + def filters_by_sports + SportsFilters.new(client).all + end + end + end + end +end diff --git a/lib/kalshi/search/series_tags.rb b/lib/kalshi/search/series_tags.rb new file mode 100644 index 0000000..c28b022 --- /dev/null +++ b/lib/kalshi/search/series_tags.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Rubyists + module Kalshi + module Search + # Series Tags API endpoint + class SeriesTags < Kalshi::Endpoint + def all + client.get('search/tags_by_categories') + end + end + end + end +end diff --git a/lib/kalshi/search/sports_filters.rb b/lib/kalshi/search/sports_filters.rb new file mode 100644 index 0000000..86362d7 --- /dev/null +++ b/lib/kalshi/search/sports_filters.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Rubyists + module Kalshi + module Search + # Sports Filters API endpoint + class SportsFilters < Kalshi::Endpoint + def all + client.get('search/filters_by_sports') + end + end + end + end +end diff --git a/test/kalshi/client_test.rb b/test/kalshi/client_test.rb index 669e8aa..28b2e29 100644 --- a/test/kalshi/client_test.rb +++ b/test/kalshi/client_test.rb @@ -25,6 +25,14 @@ assert_instance_of Rubyists::Kalshi::Market::Client, client.market end end + + describe '#search' do + it 'returns a Search::Client instance' do + client = Rubyists::Kalshi::Client.new + + assert_instance_of Rubyists::Kalshi::Search::Client, client.search + end + end end describe Rubyists::Kalshi do diff --git a/test/kalshi/search/client_test.rb b/test/kalshi/search/client_test.rb new file mode 100644 index 0000000..3e0bd8d --- /dev/null +++ b/test/kalshi/search/client_test.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require_relative '../../helper' + +describe Rubyists::Kalshi::Search::Client do + let(:client) { Rubyists::Kalshi::Client.new } + let(:search_client) { client.search } + let(:base_url) { Rubyists::Kalshi.config.base_url } + + describe '#tags_by_categories' do + it 'fetches tags by categories' do + stub_request(:get, "#{base_url}/search/tags_by_categories") + .to_return(status: 200, body: '{"tags_by_categories": {}}', headers: { 'Content-Type' => 'application/json' }) + + response = search_client.tags_by_categories + + assert_equal({ tags_by_categories: {} }, response) + end + end + + describe '#filters_by_sports' do + it 'fetches filters by sports' do + stub_request(:get, "#{base_url}/search/filters_by_sports") + .to_return(status: 200, body: '{"filters_by_sports": {}}', headers: { 'Content-Type' => 'application/json' }) + + response = search_client.filters_by_sports + + assert_equal({ filters_by_sports: {} }, response) + end + end +end