diff --git a/.rubocop.yml b/.rubocop.yml index 8fac6d2..fbbb4a2 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,7 +5,7 @@ AllCops: SuggestExtensions: false Layout/SpaceBeforeBrackets: # (new in 1.7) Enabled: true -Layout/LineLength: +Layout/LineLength: Max: 350 Lint/AmbiguousAssignment: # (new in 1.7) Enabled: true @@ -110,4 +110,8 @@ Metrics/MethodLength: Metrics/CyclomaticComplexity: Max: 15 Metrics/PerceivedComplexity: - Max: 15 \ No newline at end of file + Max: 15 +Lint/DuplicateMethods: # Disables duplicate methods warning + Enabled: false +Gemspec/RequiredRubyVersion: # Disables required ruby version warning + Enabled: false diff --git a/Gemfile b/Gemfile index f932794..ec6fcb7 100644 --- a/Gemfile +++ b/Gemfile @@ -1,15 +1,15 @@ # frozen_string_literal: true -source "https://rubygems.org" +source 'https://rubygems.org' # Specify your gem's dependencies in outboxable.gemspec gemspec -gem "rake", "~> 13.0" +gem 'rake', '~> 13.0' -gem "rspec", "~> 3.0" +gem 'rspec', '~> 3.0' -gem "rubocop-rails", "~> 2.18" +gem 'rubocop-rails', '~> 2.18' gem 'sidekiq-cron', '~> 1.9' diff --git a/Rakefile b/Rakefile index cca7175..4964751 100644 --- a/Rakefile +++ b/Rakefile @@ -1,11 +1,11 @@ # frozen_string_literal: true -require "bundler/gem_tasks" -require "rspec/core/rake_task" +require 'bundler/gem_tasks' +require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) -require "rubocop/rake_task" +require 'rubocop/rake_task' RuboCop::RakeTask.new diff --git a/lib/generators/outboxable/install_generator.rb b/lib/generators/outboxable/install_generator.rb index 8963dbe..6dbfa0b 100644 --- a/lib/generators/outboxable/install_generator.rb +++ b/lib/generators/outboxable/install_generator.rb @@ -2,7 +2,7 @@ module Outboxable class InstallGenerator < Rails::Generators::Base include Rails::Generators::Migration - source_root File.expand_path('../../../templates', __FILE__) + source_root File.expand_path('../../templates', __dir__) # Copy initializer into user app def copy_initializer @@ -11,26 +11,26 @@ module Outboxable # Copy user information (model & Migrations) into user app def create_user_model - target_path = "app/models/outbox.rb" - unless File.exist?(File.join(Rails.root, target_path)) - template("outbox.rb", target_path) + target_path = 'app/models/outbox.rb' + if Rails.root.join(target_path).exist? + say_status('skipped', 'Model outbox already exists') else - say_status('skipped', "Model outbox already exists") + template('outbox.rb', target_path) end end # Copy migrations def copy_migrations - if self.class.migration_exists?('db/migrate', "create_outboxable_outboxes") - say_status('skipped', "Migration create_outboxable_outboxes already exists") + if self.class.migration_exists?('db/migrate', 'create_outboxable_outboxes') + say_status('skipped', 'Migration create_outboxable_outboxes already exists') else - migration_template('create_outboxable_outboxes.rb', "db/migrate/create_outboxable_outboxes.rb") + migration_template('create_outboxable_outboxes.rb', 'db/migrate/create_outboxable_outboxes.rb') end end # Use to assign migration time otherwise generator will error - def self.next_migration_number(dir) - Time.now.utc.strftime("%Y%m%d%H%M%S") + def self.next_migration_number(_dir) + Time.now.utc.strftime('%Y%m%d%H%M%S') end end end diff --git a/lib/outboxable.rb b/lib/outboxable.rb index 3de5943..48362ad 100644 --- a/lib/outboxable.rb +++ b/lib/outboxable.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require_relative "outboxable/version" +require_relative 'outboxable/version' require 'outboxable/worker' require 'outboxable/publishing_manager' @@ -10,7 +10,6 @@ require 'outboxable/configuration' require 'outboxable/rabbitmq/publisher' require 'active_support' - module Outboxable class Error < StandardError; end @@ -22,7 +21,7 @@ module Outboxable has_many :outboxes, as: :outboxable, autosave: false - def instantiate_outbox(routing_key: ) + def instantiate_outbox(routing_key:) outboxes.new( routing_key:, exchange: Outboxable.configuration.rabbitmq_event_bus_exchange, diff --git a/lib/outboxable/configuration.rb b/lib/outboxable/configuration.rb index 27bed0d..7bed8e8 100644 --- a/lib/outboxable/configuration.rb +++ b/lib/outboxable/configuration.rb @@ -12,7 +12,7 @@ module Outboxable ALLOWED_MESSAGE_BROKERS = %i[rabbitmq].freeze ALLOWED_ORMS = %i[activerecord].freeze - attr_accessor :rabbitmq_host, + attr_accessor :rabbitmq_host, :rabbitmq_port, :rabbitmq_user, :rabbitmq_password, @@ -31,7 +31,7 @@ module Outboxable Sidekiq::Options[:cron_poll_interval] = 5 # Create the cron job for the polling publisher - Sidekiq::Cron::Job.create(name: 'OutboxablePollingPublisher', cron: '*/5 * * * * *', class: 'Outboxable::PollingPublisherWorker') + Sidekiq::Cron::Job.create(name: 'OutboxablePollingPublisher', cron: '*/5 * * * * *', class: 'Outboxable::PollingPublisherWorker') end def message_broker=(message_broker) diff --git a/lib/outboxable/polling_publisher_worker.rb b/lib/outboxable/polling_publisher_worker.rb index 22ce75c..c955533 100644 --- a/lib/outboxable/polling_publisher_worker.rb +++ b/lib/outboxable/polling_publisher_worker.rb @@ -11,4 +11,4 @@ module Outboxable end end end -end \ No newline at end of file +end diff --git a/lib/outboxable/rabbitmq/publisher.rb b/lib/outboxable/rabbitmq/publisher.rb index f5a8840..8de96ec 100644 --- a/lib/outboxable/rabbitmq/publisher.rb +++ b/lib/outboxable/rabbitmq/publisher.rb @@ -4,34 +4,34 @@ module Outboxable def initialize(resource:) @resource = resource end - + def to_envelope(resource:) # throw not implemented method error - raise NotImplementedError, "Please implement the to_envelope method in your own module" + raise NotImplementedError, 'Please implement the to_envelope method in your own module' end - + def publish confirmed = nil - + Outboxable::Connection.instance.channel.with do |channel| channel.confirm_select - + # Declare a exchange exchange = channel.topic(@resource.exchange, durable: true) - + # Publish the CloudEvent resource to the exchange exchange.publish(to_envelope(resource: @resource), routing_key: @resource.routing_key, headers: @resource.try(:headers) || {}) - + # Wait for confirmation confirmed = channel.wait_for_confirms end - + return unless confirmed - + @resource.reload @resource.increment_attempt @resource.update(status: :published, retry_at: nil) end end end -end \ No newline at end of file +end diff --git a/lib/outboxable/version.rb b/lib/outboxable/version.rb index 8e32ea5..569abd5 100644 --- a/lib/outboxable/version.rb +++ b/lib/outboxable/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Outboxable - VERSION = "0.1.1" + VERSION = '0.1.1' end diff --git a/lib/templates/create_outboxable_outboxes.rb b/lib/templates/create_outboxable_outboxes.rb index a37aa85..800acdb 100644 --- a/lib/templates/create_outboxable_outboxes.rb +++ b/lib/templates/create_outboxable_outboxes.rb @@ -17,7 +17,7 @@ class CreateOutboxableOutboxes < ActiveRecord::Migration[7.0] t.integer :size, null: false, default: 0 - t.references :outboxable, polymorphic: true, null: true + t.references :outboxable, polymorphic: true, null: true t.timestamps end diff --git a/lib/templates/initializer.rb b/lib/templates/initializer.rb index d6fb457..32c81ad 100644 --- a/lib/templates/initializer.rb +++ b/lib/templates/initializer.rb @@ -1,4 +1,4 @@ -# This monkey patch allows you to customize the message format that you publish to your broker. +# This monkey patch allows you to customize the message format that you publish to your broker. # By default, Outboxable publishes a CloudEvent message to your broker. module Outboxable module RabbitMq diff --git a/lib/templates/outbox.rb b/lib/templates/outbox.rb index af428ca..c82e97e 100644 --- a/lib/templates/outbox.rb +++ b/lib/templates/outbox.rb @@ -29,4 +29,4 @@ class Outbox < ApplicationRecord def check_publishing self.allow_publish = false if published? end -end \ No newline at end of file +end diff --git a/outboxable.gemspec b/outboxable.gemspec index 8589162..d47ab47 100644 --- a/outboxable.gemspec +++ b/outboxable.gemspec @@ -1,24 +1,24 @@ # frozen_string_literal: true -require_relative "lib/outboxable/version" +require_relative 'lib/outboxable/version' Gem::Specification.new do |spec| - spec.name = "outboxable" + spec.name = 'outboxable' spec.version = Outboxable::VERSION - spec.authors = ["Brusk Awat"] - spec.email = ["broosk.edogawa@gmail.com"] + spec.authors = ['Brusk Awat'] + spec.email = ['broosk.edogawa@gmail.com'] - spec.summary = "An opiniated Gem for Rails applications to implement the transactional outbox pattern." - spec.description = "The Outboxable Gem is tailored for Rails applications to implement the transactional outbox pattern. It currently only supports ActiveRecord." - spec.homepage = "https://github.com/broosk1993/outboxable" - spec.license = "MIT" - spec.required_ruby_version = ">= 2.6.0" + spec.summary = 'An opiniated Gem for Rails applications to implement the transactional outbox pattern.' + spec.description = 'The Outboxable Gem is tailored for Rails applications to implement the transactional outbox pattern. It currently only supports ActiveRecord.' + spec.homepage = 'https://github.com/broosk1993/outboxable' + spec.license = 'MIT' + spec.required_ruby_version = '>= 2.6.0' spec.metadata['allowed_push_host'] = 'https://rubygems.org' - spec.metadata["homepage_uri"] = spec.homepage - spec.metadata["source_code_uri"] = "https://github.com/broosk1993/outboxable" - spec.metadata["changelog_uri"] = "https://github.com/broosk1993/outboxable/blob/main/CHANGELOG.md" + spec.metadata['homepage_uri'] = spec.homepage + spec.metadata['source_code_uri'] = 'https://github.com/broosk1993/outboxable' + spec.metadata['changelog_uri'] = 'https://github.com/broosk1993/outboxable/blob/main/CHANGELOG.md' # Specify which files should be added to the gem when it is released. # The `git ls-files -z` loads the files in the RubyGem that have been added into git. @@ -27,10 +27,11 @@ Gem::Specification.new do |spec| (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|circleci)|appveyor)}) end end - spec.bindir = "exe" + spec.bindir = 'exe' spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) } - spec.require_paths = ["lib"] - + spec.require_paths = ['lib'] + spec.add_dependency 'bunny', '>= 2.19.0' spec.add_dependency 'connection_pool', '~> 2.3.0' + spec.metadata['rubygems_mfa_required'] = 'true' end diff --git a/spec/outboxable_spec.rb b/spec/outboxable_spec.rb index bb14278..a4ea90a 100644 --- a/spec/outboxable_spec.rb +++ b/spec/outboxable_spec.rb @@ -1,11 +1,11 @@ # frozen_string_literal: true RSpec.describe Outboxable do - it "has a version number" do + it 'has a version number' do expect(Outboxable::VERSION).not_to be nil end - it "does something useful" do + it 'does something useful' do expect(true).to eq(true) end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 42b359d..6b08523 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,10 +1,10 @@ # frozen_string_literal: true -require "outboxable" +require 'outboxable' RSpec.configure do |config| # Enable flags like --only-failures and --next-failure - config.example_status_persistence_file_path = ".rspec_status" + config.example_status_persistence_file_path = '.rspec_status' # Disable RSpec exposing methods globally on `Module` and `main` config.disable_monkey_patching!