diff --git a/lib/pathway.rb b/lib/pathway.rb index 3dfcb7f..76ffc6f 100644 --- a/lib/pathway.rb +++ b/lib/pathway.rb @@ -34,6 +34,7 @@ class DSL class Error attr_reader :type, :message, :details + singleton_class.send :attr_accessor, :default_messages @default_messages = {} @@ -44,13 +45,8 @@ def initialize(type:, message: nil, details: nil) @details = details || {} end - def deconstruct - [type, message, details] - end - - def deconstruct_keys(_) - { type: type, message: message, details: details } - end + def deconstruct = [type, message, details] + def deconstruct_keys(_) = { type:, message:, details: } private @@ -61,26 +57,20 @@ def default_message_for(type) class State extend Forwardable + delegate %i([] []= fetch store include? values_at deconstruct_keys) => :@hash def initialize(operation, values = {}) @hash = operation.context.merge(values) @result_key = operation.result_key end - delegate %i([] []= fetch store include? values_at deconstruct_keys) => :@hash - def update(kargs) @hash.update(kargs) self end - def result - @hash[@result_key] - end - - def to_hash - @hash - end + def result = @hash[@result_key] + def to_hash = @hash def use(&bl) raise ArgumentError, 'a block must be provided' if !block_given? @@ -106,20 +96,19 @@ module Plugins module Base module ClassMethods attr_accessor :result_key - alias :result_at :result_key= + + alias_method :result_at, :result_key= def process(&bl) dsl = self::DSL define_method(:call) do |input| - dsl.new(State.new(self, input: input), self) + dsl.new(State.new(self, input:), self) .run(&bl) .then(&:result) end end - def call(ctx,...) - new(ctx).call(...) - end + def call(ctx,...) = new(ctx).call(...) def inherited(subclass) super @@ -133,18 +122,16 @@ module InstanceMethods delegate :result_key => 'self.class' delegate %i[result success failure] => Result - alias :wrap :result + alias_method :wrap, :result - def call(*) - fail 'must implement at subclass' - end + def call(*) = raise 'must implement at subclass' def error(type, message: nil, details: nil) - failure(Error.new(type: type, message: message, details: details)) + failure(Error.new(type:, message:, details:)) end def wrap_if_present(value, type: :not_found, message: nil, details: {}) - value.nil? ? error(type, message: message, details: details) : success(value) + value.nil? ? error(type, message:, details:) : success(value) end end @@ -166,43 +153,41 @@ def run(&bl) # Execute step and preserve the former state def step(callable,...) bl = _callable(callable) - @result = @result.tee { |state| bl.call(state,...) } end # Execute step and modify the former state setting the key - def set(callable, *args, to: @operation.result_key) + def set(callable, *args, to: @operation.result_key, **kwargs) bl = _callable(callable) @result = @result.then do |state| - wrap(bl.call(state, *args)) + wrap(bl.call(state, *args, **kwargs)) .then { |value| state.update(to => value) } end end # Execute step and replace the current state completely - def map(callable) + def map(callable,...) bl = _callable(callable) - @result = @result.then(bl) + @result = @result.then { |state| bl.call(state,...) } end - def around(wrapper, &steps) + def around(execution_strategy, &dsl_block) @result.then do |state| - seq = -> (dsl = self) { @result = dsl.run(&steps) } - _callable(wrapper).call(seq, state) + dsl_runner = ->(dsl = self) { @result = dsl.run(&dsl_block) } + + _callable(execution_strategy).call(dsl_runner, state) end end - def if_true(cond, &steps) + def if_true(cond, &dsl_block) cond = _callable(cond) - around(-> seq, state { - seq.call if cond.call(state) - }, &steps) + around(->(dsl_runner, state) { dsl_runner.call if cond.call(state) }, &dsl_block) end - def if_false(cond, &steps) + def if_false(cond, &dsl_block) cond = _callable(cond) - if_true(-> state { !cond.call(state) }, &steps) + if_true(->(state) { !cond.call(state) }, &dsl_block) end alias_method :sequence, :around @@ -210,16 +195,14 @@ def if_false(cond, &steps) private - def wrap(obj) - Result.result(obj) - end + def wrap(obj) = Result.result(obj) def _callable(callable) case callable when Proc - -> *args, **kwargs { @operation.instance_exec(*args, **kwargs, &callable) } + ->(*args, **kwargs) { @operation.instance_exec(*args, **kwargs, &callable) } when Symbol - -> *args, **kwargs { @operation.send(callable, *args, **kwargs) } + ->(*args, **kwargs) { @operation.send(callable, *args, **kwargs) } else callable end diff --git a/lib/pathway/plugins/dry_validation.rb b/lib/pathway/plugins/dry_validation.rb index 76be08c..320fa69 100644 --- a/lib/pathway/plugins/dry_validation.rb +++ b/lib/pathway/plugins/dry_validation.rb @@ -8,7 +8,7 @@ module DryValidation def self.apply(operation, **kwargs) #:nocov: if Gem.loaded_specs['dry-validation'].version < Gem::Version.new('0.11') - fail 'unsupported dry-validation gem version' + raise 'unsupported dry-validation gem version' elsif Gem.loaded_specs['dry-validation'].version < Gem::Version.new('0.12') require 'pathway/plugins/dry_validation/v0_11' operation.plugin(Plugins::DryValidation::V0_11, **kwargs) diff --git a/lib/pathway/plugins/dry_validation/v0_11.rb b/lib/pathway/plugins/dry_validation/v0_11.rb index f260cc1..c4e39f4 100644 --- a/lib/pathway/plugins/dry_validation/v0_11.rb +++ b/lib/pathway/plugins/dry_validation/v0_11.rb @@ -66,7 +66,7 @@ def validate(state, with: nil) end opts = Hash(with).map { |opt, key| [opt, state[key]] }.to_h validate_with(state[:input], opts) - .then { |params| state.update(params: params) } + .then { |params| state.update(params:) } end def validate_with(params, opts = {}) diff --git a/lib/pathway/plugins/dry_validation/v0_12.rb b/lib/pathway/plugins/dry_validation/v0_12.rb index b349e49..7c66064 100644 --- a/lib/pathway/plugins/dry_validation/v0_12.rb +++ b/lib/pathway/plugins/dry_validation/v0_12.rb @@ -66,7 +66,7 @@ def validate(state, with: nil) end opts = Hash(with).map { |opt, key| [opt, state[key]] }.to_h validate_with(state[:input], opts) - .then { |params| state.update(params: params) } + .then { |params| state.update(params:) } end def validate_with(params, opts = {}) diff --git a/lib/pathway/plugins/dry_validation/v1_0.rb b/lib/pathway/plugins/dry_validation/v1_0.rb index c81823d..bbb9006 100644 --- a/lib/pathway/plugins/dry_validation/v1_0.rb +++ b/lib/pathway/plugins/dry_validation/v1_0.rb @@ -58,7 +58,7 @@ def validate(state, with: nil) end opts = Hash(with).map { |to, from| [to, state[from]] }.to_h validate_with(state[:input], **opts) - .then { |params| state.update(params: params) } + .then { |params| state.update(params:) } end def validate_with(input, **opts) diff --git a/lib/pathway/plugins/responder.rb b/lib/pathway/plugins/responder.rb index 5779fe8..2b20e1f 100644 --- a/lib/pathway/plugins/responder.rb +++ b/lib/pathway/plugins/responder.rb @@ -21,9 +21,7 @@ def initialize(result, &bl) instance_eval(&bl) end - def success(&bl) - @ok = bl - end + def success(&bl)= @ok = bl def failure(type = nil, &bl) if type.nil? diff --git a/lib/pathway/plugins/sequel_models.rb b/lib/pathway/plugins/sequel_models.rb index 4128179..cbf31db 100644 --- a/lib/pathway/plugins/sequel_models.rb +++ b/lib/pathway/plugins/sequel_models.rb @@ -6,33 +6,33 @@ module Pathway module Plugins module SequelModels module DSLMethods - def transaction(step_name = nil, &bl) - fail 'must provide a step or a block but not both' if !step_name.nil? == block_given? + def transaction(step_name = nil, &dsl_bl) + raise 'must provide a step or a block but not both' if !step_name.nil? == block_given? if step_name transaction { step step_name } else - around(-> steps, _ { + around(->(runner, _) { db.transaction(savepoint: true) do - raise Sequel::Rollback if steps.call.failure? + raise Sequel::Rollback if runner.call.failure? end - }, &bl) + }, &dsl_bl) end end - def after_commit(step_name = nil, &bl) - fail 'must provide a step or a block but not both' if !step_name.nil? == block_given? + def after_commit(step_name = nil, &dsl_bl) + raise 'must provide a step or a block but not both' if !step_name.nil? == block_given? if step_name after_commit { step step_name } else - around(-> steps, state { - dsl = self.class::DSL.new(State.new(self, state.to_h.dup), self) + around(->(runner, state) { + dsl_copy = self.class::DSL.new(State.new(self, state.to_h.dup), self) db.after_commit do - steps.call(dsl) + runner.call(dsl_copy) end - }, &bl) + }, &dsl_bl) end end end @@ -41,10 +41,10 @@ module ClassMethods attr_accessor :model_class, :search_field, :model_not_found def model(model_class, search_by: model_class.primary_key, set_result_key: true, set_context_param: true, error_message: nil) - self.model_class = model_class - self.search_field = search_by - self.result_key = Inflector.underscore(Inflector.demodulize(model_class.name)).to_sym if set_result_key - self.model_not_found = error_message || "#{Inflector.humanize(Inflector.underscore(Inflector.demodulize(model_class.name)))} not found".freeze + self.model_class = model_class + self.search_field = search_by + self.result_key = Inflector.underscore(Inflector.demodulize(model_class.name)).to_sym if set_result_key + self.model_not_found = error_message || "#{Inflector.humanize(Inflector.underscore(Inflector.demodulize(model_class.name)))} not found".freeze self.context(result_key => Contextualizer::OPTIONAL) if set_result_key && set_context_param end diff --git a/lib/pathway/plugins/simple_auth.rb b/lib/pathway/plugins/simple_auth.rb index a69e55f..6d6402f 100644 --- a/lib/pathway/plugins/simple_auth.rb +++ b/lib/pathway/plugins/simple_auth.rb @@ -26,9 +26,7 @@ def authorize_with(*objs) authorized?(*objs) ? wrap(objs) : error(:forbidden) end - def authorized?(*) - true - end + def authorized?(*) = true end end end diff --git a/lib/pathway/result.rb b/lib/pathway/result.rb index b32f0d9..b1ac967 100644 --- a/lib/pathway/result.rb +++ b/lib/pathway/result.rb @@ -6,13 +6,8 @@ class Result attr_reader :value, :error class Success < Result - def initialize(value) - @value = value - end - - def success? - true - end + def initialize(value) = @value = value + def success? = true def then(bl=nil) result(block_given? ? yield(value): bl.call(value)) @@ -25,29 +20,18 @@ def tee(bl=nil, &block) private - alias :value_for_deconstruct :value + alias_method :value_for_deconstruct, :value end class Failure < Result - def initialize(error) - @error = error - end - - def success? - false - end - - def then(_=nil) - self - end - - def tee(_=nil) - self - end + def initialize(error) = @error = error + def success? = false + def then(_=nil) = self + def tee(_=nil) = self private - alias :value_for_deconstruct :error + alias_method :value_for_deconstruct, :error end module Mixin @@ -55,10 +39,16 @@ module Mixin Failure = Result::Failure end - def deconstruct - [value_for_deconstruct] + def self.success(value) = Success.new(value) + def self.failure(error) = Failure.new(error) + + def self.result(object) + object.is_a?(Result) ? object : success(object) end + def failure? = !success? + def deconstruct = [value_for_deconstruct] + def deconstruct_keys(keys) if value_for_deconstruct.respond_to?(:deconstruct_keys) value_for_deconstruct.deconstruct_keys(keys) @@ -67,22 +57,6 @@ def deconstruct_keys(keys) end end - def failure? - !success? - end - - def self.success(value) - Success.new(value) - end - - def self.failure(error) - Failure.new(error) - end - - def self.result(object) - object.is_a?(Result) ? object : success(object) - end - delegate :result => 'self.class' end end diff --git a/lib/pathway/rspec/matchers/fail_on.rb b/lib/pathway/rspec/matchers/fail_on.rb index a634f27..c36344a 100644 --- a/lib/pathway/rspec/matchers/fail_on.rb +++ b/lib/pathway/rspec/matchers/fail_on.rb @@ -22,22 +22,22 @@ @type = type end - alias :with_type :type - alias :and_type :type + alias_method :with_type, :type + alias_method :and_type, :type chain :message do |message| @message = message end - alias :with_message :message - alias :and_message :message + alias_method :with_message, :message + alias_method :and_message, :message chain :details do |details| @details = details end - alias :with_details :details - alias :and_details :details + alias_method :with_details, :details + alias_method :and_details, :details description do 'fail' + (@type ? " with :#@type error" : '') diff --git a/lib/pathway/version.rb b/lib/pathway/version.rb index 87941e4..59b9f10 100644 --- a/lib/pathway/version.rb +++ b/lib/pathway/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Pathway - VERSION = '0.12.2' + VERSION = '1.0.0b1' end