diff --git a/.byebug_history b/.byebug_history new file mode 100644 index 0000000..929d26a --- /dev/null +++ b/.byebug_history @@ -0,0 +1,14 @@ +c +attrs +c +attrs +attrs["workflow_state"] +attrs[:workflow_state] +attrs +c +@current_sequence +item +c +n +item +@transitions diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..4a36342 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +3.0.0 diff --git a/Gemfile.lock b/Gemfile.lock index a36ef7f..867597a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -13,6 +13,7 @@ GEM minitest (~> 5.1) tzinfo (~> 1.1) ast (2.4.2) + byebug (11.1.3) concurrent-ruby (1.1.8) diff-lcs (1.4.4) i18n (1.8.9) @@ -56,9 +57,11 @@ GEM unicode-display_width (1.7.0) PLATFORMS + ruby x86_64-linux DEPENDENCIES + byebug rake (~> 13.0) rspec (~> 3.0) rubocop (~> 0.80) diff --git a/lib/workflower/acts_as_workflower.rb b/lib/workflower/acts_as_workflower.rb index 95dff2b..5710b8d 100644 --- a/lib/workflower/acts_as_workflower.rb +++ b/lib/workflower/acts_as_workflower.rb @@ -1,13 +1,19 @@ +# frozen_string_literal: true + require "active_support" +# Workflower Module Defintion module Workflower mattr_accessor :workflower_state_column_name mattr_accessor :workflow_model mattr_accessor :transition_model mattr_accessor :conditions + + # ActsAsWorkflower Module Definition module ActsAsWorkflower extend ActiveSupport::Concern + # InstanceMethods module InstanceMethods # mattr_accessor :workflower_base attr_accessor :possible_events, :allowed_events, :allowed_transitions @@ -54,7 +60,9 @@ module Workflower end end + # Class Methods module ClassMethods + # rubocop:disable Metrics/AbcSize def workflower(options = { workflower_state_column_name: "workflow_state" }) if options[:source].blank? || options[:conditions].blank? raise Workflower::WorkflowerError, "Options can't be blank" @@ -75,21 +83,20 @@ module Workflower def workflower_abilities load = source.get_workflows.values.flatten.uniq - unless load.blank? - # transitions = load.transitions.where("(metadata->>'roles') IS NOT NULL") - transitions = load.select { |item| item.try(:[], :metadata).try(:key?, :roles) } + return [] if load.blank? - roles = transitions.map { |item| item[:metadata][:roles] }.flatten.uniq + # transitions = load.transitions.where("(metadata->>'roles') IS NOT NULL") + transitions = load.select { |item| item.try(:[], :metadata).try(:key?, :roles) } - roles_hash = {} + roles = transitions.map { |item| item[:metadata][:roles] }.flatten.uniq - roles.each do |role| - roles_hash[role] = transitions.select { |trans| trans[:metadata][:roles].to_a.include?(role) }.map { |item| item[:event] }.uniq - end - - roles_hash + roles_hash = {} + roles.each do |role| + roles_hash[role] = transitions.select { |trans| trans[:metadata][:roles].to_a.include?(role) }.map { |item| item[:event] }.uniq end + + roles_hash end end diff --git a/lib/workflower/flow.rb b/lib/workflower/flow.rb index 230625f..a916336 100644 --- a/lib/workflower/flow.rb +++ b/lib/workflower/flow.rb @@ -2,6 +2,7 @@ module Workflower class Flow attr_accessor :state, :transition_into, :trigger_action_name, :boolean_action_name, :sequence, :downgrade_sequence, :event, :condition, :condition_type, :before_transit, :after_transit, :metadata, :workflow_id, :deviation_id + # rubocop:disable Metrics/AbcSize def initialize(options) @state = options[:state] @transition_into = options[:transition_into] diff --git a/lib/workflower/manager.rb b/lib/workflower/manager.rb index 20f531a..c932e24 100644 --- a/lib/workflower/manager.rb +++ b/lib/workflower/manager.rb @@ -1,6 +1,6 @@ require "workflower/errors" require "workflower/flow" - +require "byebug" module Workflower class Manager attr_reader :events, :flows_container, :allowed_events diff --git a/spec/dummy_feature.rb b/spec/dummy_feature.rb new file mode 100644 index 0000000..06d136c --- /dev/null +++ b/spec/dummy_feature.rb @@ -0,0 +1,29 @@ +# A dummy class to showcase the use of the Gem + +require "workflower" +require "workflow_source" +require "byebug" + +class DummyFeature + attr_accessor :workflow_id, :workflow_state, :sequence + + include Workflower::ActsAsWorkflower + + def initialize + @workflow_id = 1 + @workflow_state = "saved" + @sequence = 1 + end + + def self.before_create(method_name) + end + + def assign_attributes(attrs) + @workflow_state = attrs["workflow_state"] + @sequence = attrs["sequence"] + end + + workflower source: WorkflowSource.new, + workflower_state_column_name: "workflow_state", + conditions: { name: "Test Workflow", workflow_model_name: "DummyEntity" } +end diff --git a/spec/workflow_source.rb b/spec/workflow_source.rb new file mode 100644 index 0000000..a80cb2a --- /dev/null +++ b/spec/workflow_source.rb @@ -0,0 +1,22 @@ +class WorkflowSource + def initialize + @workflows = { + "1": [ + { + state: "saved", + transition_into: "submitted", + event: "submit", + sequence: 1 + } + ].flatten + } + end + + def get_workflows + @workflows + end + + def get_workflows_for_workflow_id(workflow_id) + get_workflows[workflow_id.to_s.to_sym] + end +end diff --git a/spec/workflower_spec.rb b/spec/workflower_spec.rb index 79426d3..2831f5b 100644 --- a/spec/workflower_spec.rb +++ b/spec/workflower_spec.rb @@ -1,11 +1,17 @@ # frozen_string_literal: true +require "dummy_feature" + RSpec.describe Workflower do it "has a version number" do expect(Workflower::VERSION).not_to be nil end it "transitions from saved to submitted" do - expect(true).to eq(true) + @test = DummyFeature.new + @test.workflower_initializer + + @test.submit! + expect(@test.workflow_state).to eq("submitted") end end diff --git a/workflower.gemspec b/workflower.gemspec index 1f9174e..6409802 100644 --- a/workflower.gemspec +++ b/workflower.gemspec @@ -30,8 +30,9 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] # Uncomment to register a new dependency of your gem - spec.add_dependency 'activesupport', '~> 5.0', '>= 5.0.0.1' - + spec.add_dependency "activesupport", "~> 5.0", ">= 5.0.0.1" + spec.add_development_dependency "byebug" + # For more information and examples about making a new gem, checkout our # guide at: https://bundler.io/guides/creating_gem.html end