diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9a57e1..d5d714f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,23 +17,19 @@ jobs: strategy: fail-fast: false matrix: - gemfile: ['rails_7.0', 'rails_7.1'] - ruby: [3.3, 3.2, 3.1] + gemfile: ['rails_7.0', 'rails_7.1', 'rails_8.0'] + ruby: [3.3, 3.2] include: + - gemfile: rails_7.1 + ruby: '3.1' + - gemfile: rails_7.0 + ruby: '3.1' - gemfile: rails_7.0 ruby: '3.0' - gemfile: rails_7.0 ruby: 2.7 - gemfile: rails_6.1 ruby: 2.7 - - gemfile: rails_6.0 - ruby: 2.7 - - gemfile: rails_5.2 - ruby: 2.7 - - gemfile: rails_5.1 - ruby: 2.7 - - gemfile: rails_5.0 - ruby: 2.7 env: BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile diff --git a/gemfiles/rails_5.0.gemfile b/gemfiles/rails_5.0.gemfile deleted file mode 100644 index fe17ba9..0000000 --- a/gemfiles/rails_5.0.gemfile +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -gem "rails", "~> 5.0.7" -gem "sqlite3", "~> 1.3.6" - -gemspec path: "../" diff --git a/gemfiles/rails_5.1.gemfile b/gemfiles/rails_5.1.gemfile deleted file mode 100644 index 16067aa..0000000 --- a/gemfiles/rails_5.1.gemfile +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -gem "rails", "~> 5.1.7" -gem "sqlite3", "~> 1.3.6" - -gemspec path: "../" diff --git a/gemfiles/rails_5.2.gemfile b/gemfiles/rails_5.2.gemfile deleted file mode 100644 index 3b10fc4..0000000 --- a/gemfiles/rails_5.2.gemfile +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -gem "rails", "~> 5.2.6" -gem "sqlite3", "~> 1.4.1" - -gemspec path: "../" diff --git a/gemfiles/rails_7.0.gemfile b/gemfiles/rails_7.0.gemfile index f32a1ff..f395ee7 100644 --- a/gemfiles/rails_7.0.gemfile +++ b/gemfiles/rails_7.0.gemfile @@ -3,6 +3,6 @@ source "https://rubygems.org" gem "rails", "~> 7.0.2" -gem "sqlite3" +gem "sqlite3", "~> 1.4.0" gemspec path: "../" diff --git a/gemfiles/rails_7.1.gemfile b/gemfiles/rails_7.1.gemfile index 0f1d346..1b7beb0 100644 --- a/gemfiles/rails_7.1.gemfile +++ b/gemfiles/rails_7.1.gemfile @@ -2,7 +2,6 @@ source "https://rubygems.org" -gem "active_attr", "~> 0.16" # git: "https://github.com/mathieujobin/active_attr", branch: "rails-7.1-support" gem "rails", "~> 7.1.1" gem "sqlite3" diff --git a/gemfiles/rails_6.0.gemfile b/gemfiles/rails_8.0.gemfile similarity index 80% rename from gemfiles/rails_6.0.gemfile rename to gemfiles/rails_8.0.gemfile index 2a3054b..a1651b2 100644 --- a/gemfiles/rails_6.0.gemfile +++ b/gemfiles/rails_8.0.gemfile @@ -2,7 +2,7 @@ source "https://rubygems.org" -gem "rails", "~> 6.0.4" +gem "rails", "~> 8.0.1" gem "sqlite3" gemspec path: "../" diff --git a/lib/webhook_system.rb b/lib/webhook_system.rb index 9d2ef4d..79c15fe 100644 --- a/lib/webhook_system.rb +++ b/lib/webhook_system.rb @@ -3,7 +3,6 @@ require 'active_support/all' require 'active_record' require 'active_job' -require 'ph_model' require 'validate_url' require 'faraday' require 'faraday-encoding' diff --git a/lib/webhook_system/base_event.rb b/lib/webhook_system/base_event.rb index f8cce27..a906eb7 100644 --- a/lib/webhook_system/base_event.rb +++ b/lib/webhook_system/base_event.rb @@ -4,10 +4,12 @@ module WebhookSystem # This is the class meant to be used as the base class for any Events sent through the Webhook system class BaseEvent - include PhModel + include ActiveModel::Attributes + include ActiveModel::AttributeAssignment + include ActiveModel::Validations - def initialize(*args, &block) - super(*args, &block) + def initialize(...) + super @event_id = SecureRandom.uuid.freeze end @@ -39,6 +41,10 @@ def as_json result.deep_stringify_keys end + def self.build(attrs) + new.tap { |instance| instance.assign_attributes(attrs) } + end + def self.key_is_reserved?(key) key.to_s.in? %w[event event_id] end diff --git a/lib/webhook_system/encoder.rb b/lib/webhook_system/encoder.rb index 75837cd..cb1362a 100644 --- a/lib/webhook_system/encoder.rb +++ b/lib/webhook_system/encoder.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'base64' + module WebhookSystem # Class in charge of encoding and decoding encrypted payload diff --git a/lib/webhook_system/event_log.rb b/lib/webhook_system/event_log.rb index 192084a..9fa0a82 100644 --- a/lib/webhook_system/event_log.rb +++ b/lib/webhook_system/event_log.rb @@ -15,8 +15,8 @@ class EventLog < ActiveRecord::Base validates :event_name, presence: true validates :status, presence: true - serialize :request, JSON - serialize :response, JSON + serialize :request, coder: JSON + serialize :response, coder: JSON def self.construct(subscription, event, request, response) request_info = { diff --git a/lib/webhook_system/subscription.rb b/lib/webhook_system/subscription.rb index fba26bc..638cd70 100644 --- a/lib/webhook_system/subscription.rb +++ b/lib/webhook_system/subscription.rb @@ -53,10 +53,8 @@ def topic_names=(new_topics) new_topics.reject!(&:blank?) add_topics = new_topics - topic_names - new_topics_attributes = [] - - topics.each do |topic| - new_topics_attributes << { + new_topics_attributes = topics.map do |topic| + { id: topic.id, name: topic.name, _destroy: new_topics.exclude?(topic.name), diff --git a/spec/event_spec.rb b/spec/event_spec.rb index da6139b..3157f8e 100644 --- a/spec/event_spec.rb +++ b/spec/event_spec.rb @@ -5,13 +5,20 @@ describe WebhookSystem, aggregate_failures: true do let(:widget_class) do Class.new do - include PhModel + include ActiveModel::Attributes + include ActiveModel::AttributeAssignment + include ActiveModel::Validations + attribute :foo attribute :bar def as_json { foo: foo, bar: bar } end + + def self.build(attrs) + new.tap { |instance| instance.assign_attributes(attrs) } + end end end diff --git a/spec/integration_spec.rb b/spec/integration_spec.rb index d41f5b8..0f8c279 100644 --- a/spec/integration_spec.rb +++ b/spec/integration_spec.rb @@ -31,7 +31,7 @@ def payload_attributes end end - let(:event) { event_class.build(name: 'John', age: 21) } + let(:event) { event_class.new.tap { |e| e.assign_attributes(name: 'John', age: 21) } } let(:expected_payload) do { diff --git a/test.db-shm b/test.db-shm new file mode 100644 index 0000000..b371393 Binary files /dev/null and b/test.db-shm differ diff --git a/test.db-wal b/test.db-wal new file mode 100644 index 0000000..0e80a56 Binary files /dev/null and b/test.db-wal differ diff --git a/webhook_system.gemspec b/webhook_system.gemspec index b932e9b..71d3de4 100644 --- a/webhook_system.gemspec +++ b/webhook_system.gemspec @@ -37,12 +37,12 @@ Gem::Specification.new do |gem| } gem.required_ruby_version = '> 2.7.0' - gem.add_runtime_dependency 'activesupport', '> 5.0', '< 7.2' - gem.add_runtime_dependency 'activerecord', '> 5.0', '< 7.2' - gem.add_runtime_dependency 'activejob', '> 5.0', '< 7.2' + gem.add_runtime_dependency 'activemodel', '>= 6.1', '< 8.1' + gem.add_runtime_dependency 'activesupport', '>= 6.1', '< 8.1' + gem.add_runtime_dependency 'activerecord', '>= 6.1', '< 8.1' + gem.add_runtime_dependency 'activejob', '>= 6.1', '< 8.1' gem.add_runtime_dependency 'faraday', '> 0.9' gem.add_runtime_dependency 'faraday-encoding', '>= 0.0.2', '< 1.0' - gem.add_runtime_dependency 'ph_model' gem.add_runtime_dependency 'validate_url', '~> 1.0' gem.add_development_dependency 'bundler', '> 1.17', '< 2.6'