From 8de9065916444445fa0ffdec8dea5d0bd4057775 Mon Sep 17 00:00:00 2001 From: Vladimir Kochnev Date: Sat, 12 Feb 2022 06:19:10 +0300 Subject: [PATCH] Fix Ruby 3 quirks and allow to pass a list of arguments Something like this must be allowed for simple cases: ```ruby def_initialize(:foo, :bar, :baz) ``` --- lib/def_initialize.rb | 10 ++++++---- spec/def_initialize/accessors_builder_spec.rb | 2 +- spec/def_initialize_spec.rb | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/def_initialize.rb b/lib/def_initialize.rb index 672d7f9..61b5e16 100644 --- a/lib/def_initialize.rb +++ b/lib/def_initialize.rb @@ -6,9 +6,11 @@ module DefInitialize require 'def_initialize/accessors_builder' class Mixin < Module - def initialize(args_str, readers: :private, writers: nil) + def initialize(*args, readers: :private, writers: nil) accessors_options = { readers_access_level: readers, writers_access_level: writers } + args_str = args.join(', ') + # Create empty method just to inspect its parameters. module_eval <<-CODE, __FILE__, __LINE__ + 1 def initialize(#{args_str}); end @@ -30,14 +32,14 @@ def initialize(#{args_str}) #{rows.join("\n")} end - #{AccessorsBuilder.build(accessors, accessors_options)} + #{AccessorsBuilder.build(accessors, **accessors_options)} CODE end end class << self - def with(args_str, **opts) - Mixin.new(args_str, **opts) + def with(*args, **opts) + Mixin.new(*args, **opts) end end end diff --git a/spec/def_initialize/accessors_builder_spec.rb b/spec/def_initialize/accessors_builder_spec.rb index 4b57c03..dc4f4f3 100644 --- a/spec/def_initialize/accessors_builder_spec.rb +++ b/spec/def_initialize/accessors_builder_spec.rb @@ -1,5 +1,5 @@ RSpec.describe DefInitialize::AccessorsBuilder do - subject { described_class.build(accessors, options) } + subject { described_class.build(accessors, **options) } let(:accessors) { [':x', ':y', ':z'] } diff --git a/spec/def_initialize_spec.rb b/spec/def_initialize_spec.rb index af3a99e..6f6208d 100644 --- a/spec/def_initialize_spec.rb +++ b/spec/def_initialize_spec.rb @@ -10,7 +10,7 @@ opts = options Class.new do - include DefInitialize.with(str, opts) + include DefInitialize.with(str, **opts) end end @@ -82,7 +82,7 @@ Class.new do include DefInitialize.with("name, uuid = SecureRandom.uuid, age:, position: 'manager'") - def initialize(*args) + def initialize(name, **) super @age = 50