From fe5a7c6ae6d3767eb233119c14574ca520d2ff92 Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 11:12:09 +0200 Subject: [PATCH 1/9] Remove unused Castle::Validators::NotSupported This validator was defined and had specs but was never called from any command or API module. Removing dead code to keep the codebase lean. --- lib/castle.rb | 1 - lib/castle/validators/not_supported.rb | 18 ------------------ .../castle/validators/not_supported_spec.rb | 19 ------------------- 3 files changed, 38 deletions(-) delete mode 100644 lib/castle/validators/not_supported.rb delete mode 100644 spec/lib/castle/validators/not_supported_spec.rb diff --git a/lib/castle.rb b/lib/castle.rb index bfc1ba7b..425c78b6 100644 --- a/lib/castle.rb +++ b/lib/castle.rb @@ -14,7 +14,6 @@ castle/utils/get_timestamp castle/utils/secure_compare castle/validators/present - castle/validators/not_supported castle/webhooks/verify castle/context/merge castle/context/sanitize diff --git a/lib/castle/validators/not_supported.rb b/lib/castle/validators/not_supported.rb deleted file mode 100644 index b76b3345..00000000 --- a/lib/castle/validators/not_supported.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -module Castle - module Validators - # Checks if required keys are supported - class NotSupported - class << self - def call(options, keys) - keys.each do |key| - next unless options.key?(key) - - raise Castle::InvalidParametersError, "#{key} is/are not supported" - end - end - end - end - end -end diff --git a/spec/lib/castle/validators/not_supported_spec.rb b/spec/lib/castle/validators/not_supported_spec.rb deleted file mode 100644 index b2ec33e2..00000000 --- a/spec/lib/castle/validators/not_supported_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Castle::Validators::NotSupported do - describe '#call' do - subject(:call) { described_class.call({ first: 1 }, keys) } - - context 'when keys is present' do - let(:keys) { %i[first second] } - - it { expect { call }.to raise_error(Castle::InvalidParametersError, 'first is/are not supported') } - end - - context 'when key is not present' do - let(:keys) { %i[second third] } - - it { expect { call }.not_to raise_error } - end - end -end From 2e738813b60c460d36598cc1e5832f5d15f4d293 Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 11:14:44 +0200 Subject: [PATCH 2/9] Add Events API support (schema, query, group) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expose Castle's enterprise Events API through three new endpoints: - GET /v1/events/schema — fetch available fields and their operations - POST /v1/events/query — search raw event records - POST /v1/events/group — aggregate and group events Follows the same layered pattern as Lists/ListItems: command builder, API module, client action mixin. Filters and sort options are validated client-side via Castle::Validators::Present. --- lib/castle.rb | 7 ++++ lib/castle/api/events/group.rb | 22 ++++++++++++ lib/castle/api/events/query.rb | 22 ++++++++++++ lib/castle/api/events/schema.rb | 22 ++++++++++++ lib/castle/client.rb | 1 + lib/castle/client_actions/events.rb | 23 +++++++++++++ lib/castle/commands/events/group.rb | 21 ++++++++++++ lib/castle/commands/events/query.rb | 21 ++++++++++++ lib/castle/commands/events/schema.rb | 18 ++++++++++ spec/lib/castle/api/events/group_spec.rb | 21 ++++++++++++ spec/lib/castle/api/events/query_spec.rb | 21 ++++++++++++ spec/lib/castle/api/events/schema_spec.rb | 17 ++++++++++ spec/lib/castle/client_spec.rb | 1 + spec/lib/castle/commands/events/group_spec.rb | 34 +++++++++++++++++++ spec/lib/castle/commands/events/query_spec.rb | 34 +++++++++++++++++++ .../lib/castle/commands/events/schema_spec.rb | 11 ++++++ spec/support/shared_examples/events.rb | 24 +++++++++++++ 17 files changed, 320 insertions(+) create mode 100644 lib/castle/api/events/group.rb create mode 100644 lib/castle/api/events/query.rb create mode 100644 lib/castle/api/events/schema.rb create mode 100644 lib/castle/client_actions/events.rb create mode 100644 lib/castle/commands/events/group.rb create mode 100644 lib/castle/commands/events/query.rb create mode 100644 lib/castle/commands/events/schema.rb create mode 100644 spec/lib/castle/api/events/group_spec.rb create mode 100644 spec/lib/castle/api/events/query_spec.rb create mode 100644 spec/lib/castle/api/events/schema_spec.rb create mode 100644 spec/lib/castle/commands/events/group_spec.rb create mode 100644 spec/lib/castle/commands/events/query_spec.rb create mode 100644 spec/lib/castle/commands/events/schema_spec.rb create mode 100644 spec/support/shared_examples/events.rb diff --git a/lib/castle.rb b/lib/castle.rb index 425c78b6..df3056f4 100644 --- a/lib/castle.rb +++ b/lib/castle.rb @@ -36,6 +36,9 @@ castle/commands/list_items/query castle/commands/list_items/unarchive castle/commands/list_items/update + castle/commands/events/schema + castle/commands/events/query + castle/commands/events/group castle/commands/privacy/request_data castle/commands/privacy/delete_data castle/api/filter @@ -55,6 +58,9 @@ castle/api/list_items/query castle/api/list_items/unarchive castle/api/list_items/update + castle/api/events/schema + castle/api/events/query + castle/api/events/group castle/api/privacy/request_data castle/api/privacy/delete_data castle/payload/prepare @@ -63,6 +69,7 @@ castle/logger castle/failover/prepare_response castle/failover/strategy + castle/client_actions/events castle/client_actions/lists castle/client_actions/list_items castle/client_actions/privacy diff --git a/lib/castle/api/events/group.rb b/lib/castle/api/events/group.rb new file mode 100644 index 00000000..b5c3744a --- /dev/null +++ b/lib/castle/api/events/group.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Castle + module API + module Events + # Sends POST /events/group request + module Group + class << self + # @param options [Hash] + # @return [Hash] + def call(options = {}) + options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) + http = options.delete(:http) + config = options.delete(:config) || Castle.config + + Castle::API.call(Castle::Commands::Events::Group.build(options), {}, http, config) + end + end + end + end + end +end diff --git a/lib/castle/api/events/query.rb b/lib/castle/api/events/query.rb new file mode 100644 index 00000000..69ea7ccb --- /dev/null +++ b/lib/castle/api/events/query.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Castle + module API + module Events + # Sends POST /events/query request + module Query + class << self + # @param options [Hash] + # @return [Hash] + def call(options = {}) + options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) + http = options.delete(:http) + config = options.delete(:config) || Castle.config + + Castle::API.call(Castle::Commands::Events::Query.build(options), {}, http, config) + end + end + end + end + end +end diff --git a/lib/castle/api/events/schema.rb b/lib/castle/api/events/schema.rb new file mode 100644 index 00000000..91d36a58 --- /dev/null +++ b/lib/castle/api/events/schema.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Castle + module API + module Events + # Sends GET /events/schema request + module Schema + class << self + # @param options [Hash] + # @return [Hash] + def call(options = {}) + options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) + http = options.delete(:http) + config = options.delete(:config) || Castle.config + + Castle::API.call(Castle::Commands::Events::Schema.build(options), {}, http, config) + end + end + end + end + end +end diff --git a/lib/castle/client.rb b/lib/castle/client.rb index a03e3327..9da7292d 100644 --- a/lib/castle/client.rb +++ b/lib/castle/client.rb @@ -3,6 +3,7 @@ module Castle # Castle's client. class Client + include Castle::ClientActions::Events include Castle::ClientActions::ListItems include Castle::ClientActions::Lists include Castle::ClientActions::Privacy diff --git a/lib/castle/client_actions/events.rb b/lib/castle/client_actions/events.rb new file mode 100644 index 00000000..cefe8150 --- /dev/null +++ b/lib/castle/client_actions/events.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Castle + module ClientActions + # Client actions for the Events API + module Events + # @param options [Hash] + def events_schema(options = {}) + Castle::API::Events::Schema.call(options) + end + + # @param options [Hash] + def query_events(options = {}) + Castle::API::Events::Query.call(options) + end + + # @param options [Hash] + def group_events(options = {}) + Castle::API::Events::Group.call(options) + end + end + end +end diff --git a/lib/castle/commands/events/group.rb b/lib/castle/commands/events/group.rb new file mode 100644 index 00000000..4aaa5993 --- /dev/null +++ b/lib/castle/commands/events/group.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Castle + module Commands + module Events + # Builds the command to query aggregated events + class Group + class << self + # @param options [Hash] + # @return [Castle::Command] + def build(options = {}) + options[:filters]&.each { |f| Castle::Validators::Present.call(f, %i[field op value]) } + Castle::Validators::Present.call(options[:sort], %i[field order]) if options[:sort] + + Castle::Command.new('events/group', options, :post) + end + end + end + end + end +end diff --git a/lib/castle/commands/events/query.rb b/lib/castle/commands/events/query.rb new file mode 100644 index 00000000..bd7c5e69 --- /dev/null +++ b/lib/castle/commands/events/query.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Castle + module Commands + module Events + # Builds the command to query raw events + class Query + class << self + # @param options [Hash] + # @return [Castle::Command] + def build(options = {}) + options[:filters]&.each { |f| Castle::Validators::Present.call(f, %i[field op value]) } + Castle::Validators::Present.call(options[:sort], %i[field order]) if options[:sort] + + Castle::Command.new('events/query', options, :post) + end + end + end + end + end +end diff --git a/lib/castle/commands/events/schema.rb b/lib/castle/commands/events/schema.rb new file mode 100644 index 00000000..ff673f3e --- /dev/null +++ b/lib/castle/commands/events/schema.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Castle + module Commands + module Events + # Builds the command to get the events schema + class Schema + class << self + # @param options [Hash] + # @return [Castle::Command] + def build(options = {}) + Castle::Command.new('events/schema', nil, :get) + end + end + end + end + end +end diff --git a/spec/lib/castle/api/events/group_spec.rb b/spec/lib/castle/api/events/group_spec.rb new file mode 100644 index 00000000..9dc58e4b --- /dev/null +++ b/spec/lib/castle/api/events/group_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +RSpec.describe Castle::API::Events::Group do + before do + stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(status: 200, body: '{}', headers: {}) + end + + describe '.call' do + subject(:call) { described_class.call(options) } + + let(:options) { { filters: [{ field: 'user.id', op: '$eq', value: 'u-42' }] } } + + before { call } + + it do + assert_requested :post, 'https://api.castle.io/v1/events/group', times: 1 do |req| + expect(JSON.parse(req.body, symbolize_names: true)).to eq(options) + end + end + end +end diff --git a/spec/lib/castle/api/events/query_spec.rb b/spec/lib/castle/api/events/query_spec.rb new file mode 100644 index 00000000..db094519 --- /dev/null +++ b/spec/lib/castle/api/events/query_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +RSpec.describe Castle::API::Events::Query do + before do + stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(status: 200, body: '{}', headers: {}) + end + + describe '.call' do + subject(:call) { described_class.call(options) } + + let(:options) { { filters: [{ field: 'user.id', op: '$eq', value: 'u-42' }], query_type: '$records' } } + + before { call } + + it do + assert_requested :post, 'https://api.castle.io/v1/events/query', times: 1 do |req| + expect(JSON.parse(req.body, symbolize_names: true)).to eq(options) + end + end + end +end diff --git a/spec/lib/castle/api/events/schema_spec.rb b/spec/lib/castle/api/events/schema_spec.rb new file mode 100644 index 00000000..c92843a7 --- /dev/null +++ b/spec/lib/castle/api/events/schema_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +RSpec.describe Castle::API::Events::Schema do + before do + stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(status: 200, body: '[]', headers: {}) + end + + describe '.call' do + subject(:call) { described_class.call } + + before { call } + + it do + assert_requested :get, 'https://api.castle.io/v1/events/schema', times: 1 + end + end +end diff --git a/spec/lib/castle/client_spec.rb b/spec/lib/castle/client_spec.rb index a1009811..3248df1f 100644 --- a/spec/lib/castle/client_spec.rb +++ b/spec/lib/castle/client_spec.rb @@ -93,6 +93,7 @@ end describe 'client action mixins' do + it_behaves_like 'it has event actions' it_behaves_like 'it has list actions' it_behaves_like 'it has list item actions' it_behaves_like 'it has privacy actions' diff --git a/spec/lib/castle/commands/events/group_spec.rb b/spec/lib/castle/commands/events/group_spec.rb new file mode 100644 index 00000000..78cb24a6 --- /dev/null +++ b/spec/lib/castle/commands/events/group_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +RSpec.describe Castle::Commands::Events::Group do + describe '.build' do + subject(:command) { described_class.build(options) } + + context 'with valid options' do + let(:options) { { filters: [{ field: 'user.id', op: '$eq', value: 'u-42' }] } } + + it { expect(command.method).to be(:post) } + it { expect(command.path).to eql('events/group') } + it { expect(command.data).to eq(options) } + end + + context 'with invalid filters' do + let(:options) { { filters: [{ field: 'user.id', op: '$eq' }] } } + + it { expect { command }.to raise_error(Castle::InvalidParametersError) } + end + + context 'with invalid sort' do + let(:options) { { sort: { field: 'created_at' } } } + + it { expect { command }.to raise_error(Castle::InvalidParametersError) } + end + + context 'with valid sort' do + let(:options) { { sort: { field: 'created_at', order: '$desc' } } } + + it { expect(command.method).to be(:post) } + it { expect(command.path).to eql('events/group') } + end + end +end diff --git a/spec/lib/castle/commands/events/query_spec.rb b/spec/lib/castle/commands/events/query_spec.rb new file mode 100644 index 00000000..5e5fd82c --- /dev/null +++ b/spec/lib/castle/commands/events/query_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +RSpec.describe Castle::Commands::Events::Query do + describe '.build' do + subject(:command) { described_class.build(options) } + + context 'with valid options' do + let(:options) { { filters: [{ field: 'user.id', op: '$eq', value: 'u-42' }], query_type: '$records' } } + + it { expect(command.method).to be(:post) } + it { expect(command.path).to eql('events/query') } + it { expect(command.data).to eq(options) } + end + + context 'with invalid filters' do + let(:options) { { filters: [{ field: 'user.id', op: '$eq' }] } } + + it { expect { command }.to raise_error(Castle::InvalidParametersError) } + end + + context 'with invalid sort' do + let(:options) { { sort: { field: 'created_at' } } } + + it { expect { command }.to raise_error(Castle::InvalidParametersError) } + end + + context 'with valid sort' do + let(:options) { { sort: { field: 'created_at', order: '$desc' } } } + + it { expect(command.method).to be(:post) } + it { expect(command.path).to eql('events/query') } + end + end +end diff --git a/spec/lib/castle/commands/events/schema_spec.rb b/spec/lib/castle/commands/events/schema_spec.rb new file mode 100644 index 00000000..e2ab66e0 --- /dev/null +++ b/spec/lib/castle/commands/events/schema_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +RSpec.describe Castle::Commands::Events::Schema do + describe '.build' do + subject(:command) { described_class.build } + + it { expect(command.method).to be(:get) } + it { expect(command.path).to eql('events/schema') } + it { expect(command.data).to be_nil } + end +end diff --git a/spec/support/shared_examples/events.rb b/spec/support/shared_examples/events.rb new file mode 100644 index 00000000..ecfb40ef --- /dev/null +++ b/spec/support/shared_examples/events.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'it has event actions' do + describe 'events_schema' do + it do + client.events_schema + assert_requested :get, 'https://api.castle.io/v1/events/schema', times: 1 + end + end + + describe 'query_events' do + it do + client.query_events(filters: [{ field: 'user.id', op: '$eq', value: 'u-42' }], query_type: '$records') + assert_requested :post, 'https://api.castle.io/v1/events/query', times: 1 + end + end + + describe 'group_events' do + it do + client.group_events(filters: [{ field: 'user.id', op: '$eq', value: 'u-42' }]) + assert_requested :post, 'https://api.castle.io/v1/events/group', times: 1 + end + end +end From dce50bf1bda2b5f11d9ae4341872417ccbd4795c Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 11:14:51 +0200 Subject: [PATCH 3/9] Bump version to 9.1.0 --- lib/castle/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/castle/version.rb b/lib/castle/version.rb index cabe2fab..015dc9d9 100644 --- a/lib/castle/version.rb +++ b/lib/castle/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Castle - VERSION = '9.0.0' + VERSION = '9.1.0' end From 7b6fb1fce3387fca7b4beb90ece9fe3845755926 Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 11:16:37 +0200 Subject: [PATCH 4/9] Fix rubocop: prefix unused argument in Events::Schema --- Gemfile.lock | 2 +- lib/castle/commands/events/schema.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 41252592..a7f1d719 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - castle-rb (9.0.0) + castle-rb (9.1.0) base64 (~> 0.2) GEM diff --git a/lib/castle/commands/events/schema.rb b/lib/castle/commands/events/schema.rb index ff673f3e..10cf24fd 100644 --- a/lib/castle/commands/events/schema.rb +++ b/lib/castle/commands/events/schema.rb @@ -8,7 +8,7 @@ class Schema class << self # @param options [Hash] # @return [Castle::Command] - def build(options = {}) + def build(_options = {}) Castle::Command.new('events/schema', nil, :get) end end From 11f9b3e56f1b7d1767bc2cf057d970dd64aa3e10 Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 11:25:01 +0200 Subject: [PATCH 5/9] Remove unused Session::HTTPS_SCHEME constant Duplicate of GetConnection::HTTPS_SCHEME which is the one actually used in the connection logic. --- lib/castle/core/get_connection.rb | 4 +--- lib/castle/session.rb | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/castle/core/get_connection.rb b/lib/castle/core/get_connection.rb index 237d01d7..c8e4f1d7 100644 --- a/lib/castle/core/get_connection.rb +++ b/lib/castle/core/get_connection.rb @@ -4,8 +4,6 @@ module Castle module Core # this module returns a new configured Net::HTTP object module GetConnection - HTTPS_SCHEME = 'https' - class << self # @param config [Castle::Configuration, Castle::SingletonConfiguration] # @return [Net::HTTP] @@ -18,7 +16,7 @@ def call(config = nil) http.open_timeout = timeout_seconds http.read_timeout = timeout_seconds - if config.base_url.scheme == HTTPS_SCHEME + if config.base_url.scheme == 'https' http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_PEER end diff --git a/lib/castle/session.rb b/lib/castle/session.rb index ad875491..a226ba25 100644 --- a/lib/castle/session.rb +++ b/lib/castle/session.rb @@ -5,8 +5,6 @@ module Castle # and provides start method for persistent connection usage # when there is a need of sending multiple requests at once module Session - HTTPS_SCHEME = 'https' - class << self def call(&block) return unless block From 73e9c979cc6069b2b0cfb8c55b913d17c69f70ce Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 11:32:09 +0200 Subject: [PATCH 6/9] Bump Bundler 2.6.9 -> 2.7.2 --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index a7f1d719..e7c8e469 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -133,4 +133,4 @@ DEPENDENCIES webmock BUNDLED WITH - 2.6.9 + 2.7.2 From 69b0def322e0253ff6238c6ea53150d0b6774490 Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 11:38:22 +0200 Subject: [PATCH 7/9] Replace deprecated :mingw, :x64_mingw platforms with :windows Bundler 2.7+ deprecates these platform selectors in favour of :windows. Updated across Gemfile and all Rails gemfiles. --- Gemfile | 2 +- gemfiles/rails_7.0.gemfile | 2 +- gemfiles/rails_7.1.gemfile | 2 +- gemfiles/rails_7.2.gemfile | 2 +- gemfiles/rails_8.0.gemfile | 2 +- gemfiles/rails_8.1.gemfile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 3a3f17ec..8a859e36 100644 --- a/Gemfile +++ b/Gemfile @@ -16,7 +16,7 @@ group :development do end group :development, :test do - gem 'debug', platforms: %i[mri mingw x64_mingw] + gem 'debug', platforms: %i[mri windows] end group :test do diff --git a/gemfiles/rails_7.0.gemfile b/gemfiles/rails_7.0.gemfile index 9c43a4be..dc79c02f 100644 --- a/gemfiles/rails_7.0.gemfile +++ b/gemfiles/rails_7.0.gemfile @@ -7,7 +7,7 @@ gem 'rails', '~> 7.0.0' gem 'rake' group :development, :test do - gem 'debug', platforms: %i[mri mingw x64_mingw] + gem 'debug', platforms: %i[mri windows] end group :test do diff --git a/gemfiles/rails_7.1.gemfile b/gemfiles/rails_7.1.gemfile index d4b69185..2f9635c3 100644 --- a/gemfiles/rails_7.1.gemfile +++ b/gemfiles/rails_7.1.gemfile @@ -7,7 +7,7 @@ gem 'rails', '~> 7.1.0' gem 'rake' group :development, :test do - gem 'debug', platforms: %i[mri mingw x64_mingw] + gem 'debug', platforms: %i[mri windows] end group :test do diff --git a/gemfiles/rails_7.2.gemfile b/gemfiles/rails_7.2.gemfile index d3606875..7ed57c4b 100644 --- a/gemfiles/rails_7.2.gemfile +++ b/gemfiles/rails_7.2.gemfile @@ -7,7 +7,7 @@ gem 'rails', '~> 7.2.0' gem 'rake' group :development, :test do - gem 'debug', platforms: %i[mri mingw x64_mingw] + gem 'debug', platforms: %i[mri windows] end group :test do diff --git a/gemfiles/rails_8.0.gemfile b/gemfiles/rails_8.0.gemfile index 38ab650d..1f288a2f 100644 --- a/gemfiles/rails_8.0.gemfile +++ b/gemfiles/rails_8.0.gemfile @@ -7,7 +7,7 @@ gem 'rails', '~> 8.0.0' gem 'rake' group :development, :test do - gem 'debug', platforms: %i[mri mingw x64_mingw] + gem 'debug', platforms: %i[mri windows] end group :test do diff --git a/gemfiles/rails_8.1.gemfile b/gemfiles/rails_8.1.gemfile index 1f82d0cb..f2620fd4 100644 --- a/gemfiles/rails_8.1.gemfile +++ b/gemfiles/rails_8.1.gemfile @@ -7,7 +7,7 @@ gem 'rails', '~> 8.1.0' gem 'rake' group :development, :test do - gem 'debug', platforms: %i[mri mingw x64_mingw] + gem 'debug', platforms: %i[mri windows] end group :test do From a838e09d2cb9a9616e114cc056d532d3630882f0 Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 11:40:06 +0200 Subject: [PATCH 8/9] Bump json 2.19.5 -> 2.19.6 --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index e7c8e469..8bb3dce1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,7 +29,7 @@ GEM prism (>= 1.3.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - json (2.19.5) + json (2.19.7) language_server-protocol (3.17.0.5) lint_roller (1.1.0) parallel (2.1.0) From 1cb8f7f72a24674bc7f9e30fdb749fad9ef19bb9 Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 May 2026 14:46:04 +0200 Subject: [PATCH 9/9] Add 9.1.0 changelog entry --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe7a9c9e..9120c576 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 9.1.0 + +**Enhancements:** + +- Add Events API support (enterprise) — three new client methods for querying event data: + - `events_schema` — `GET /v1/events/schema` + - `query_events` — `POST /v1/events/query` + - `group_events` — `POST /v1/events/group` + +**Housekeeping:** + +- Remove unused `Castle::Validators::NotSupported` (dead code) +- Remove unused `Session::HTTPS_SCHEME` constant; inline the comparison in `GetConnection` +- Replace deprecated `:mingw, :x64_mingw` Bundler platforms with `:windows` +- Bump Bundler 2.6.9 → 2.7.2 +- Bump json 2.19.5 → 2.19.7 + ## master - Bump dependencies (rack 3.1.19 → 3.2.6, rake, rspec-\*, timecop, simplecov-html, diff-lcs)