approval 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +20 -0
- data/app/models/approval/item.rb +26 -17
- data/app/models/approval/request_form/perform.rb +25 -0
- data/app/models/concerns/approval/acts_as_user.rb +4 -0
- data/lib/approval/version.rb +1 -1
- metadata +3 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 2b64f5cbbf148b7340aff7de77d998bded8d7b3ee0437e7993f9a2089adb7c66
         | 
| 4 | 
            +
              data.tar.gz: e80a019fd898640e4ed837664661e84053c7bee2501d1e26ea73ce1587ff6ace
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a0ab4cfb2e56c725b36188c4d6c91962c2c67c0cc64a95e9624e95d94d24560a733cc8d648ec9364e05b20bff396b553c49a439fb933bfbd576b9d42cf05a78f
         | 
| 7 | 
            +
              data.tar.gz: '090a5b2c02d64f05a7c0b3519b5bb7c2439bc1ba4d279817c4df24c294228763ae9b56c7d38df49fa05223a8f26ade7e7e1ff485b637806ad4a5e8a6d054ce95'
         | 
    
        data/README.md
    CHANGED
    
    | @@ -35,6 +35,16 @@ | |
| 35 35 | 
             
              end
         | 
| 36 36 | 
             
              ```
         | 
| 37 37 |  | 
| 38 | 
            +
              Or if you want to use PORO:
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              ```ruby
         | 
| 41 | 
            +
              class SomeProcess
         | 
| 42 | 
            +
                def self.perform
         | 
| 43 | 
            +
                  # something
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
              ```
         | 
| 47 | 
            +
             | 
| 38 48 | 
             
            ## Approval Flow
         | 
| 39 49 |  | 
| 40 50 | 
             
            ### Make request
         | 
| @@ -83,6 +93,16 @@ request = staff.request_for_destroy(records, reason: "something") | |
| 83 93 | 
             
            request.save!
         | 
| 84 94 | 
             
            ```
         | 
| 85 95 |  | 
| 96 | 
            +
            #### :pray: Perform
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            ```ruby
         | 
| 99 | 
            +
            staff = User.find_or_create_by(email: "staff@example.com")
         | 
| 100 | 
            +
             | 
| 101 | 
            +
            record  = MyProcess.new(recipient: "somebody@example.com")
         | 
| 102 | 
            +
            request = staff.request_for_perform(record, reason: "something")
         | 
| 103 | 
            +
            request.save
         | 
| 104 | 
            +
            ```
         | 
| 105 | 
            +
             | 
| 86 106 | 
             
            ### Respond
         | 
| 87 107 |  | 
| 88 108 | 
             
            #### :ok_woman: Approve
         | 
    
        data/app/models/approval/item.rb
    CHANGED
    
    | @@ -3,7 +3,7 @@ module Approval | |
| 3 3 | 
             
                class UnexistResource < StandardError; end
         | 
| 4 4 |  | 
| 5 5 | 
             
                self.table_name = :approval_items
         | 
| 6 | 
            -
                EVENTS = %w[create update destroy].freeze
         | 
| 6 | 
            +
                EVENTS = %w[create update destroy perform].freeze
         | 
| 7 7 |  | 
| 8 8 | 
             
                belongs_to :request, class_name: :"Approval::Request", inverse_of: :items
         | 
| 9 9 | 
             
                belongs_to :resource, polymorphic: true, optional: true
         | 
| @@ -11,17 +11,11 @@ module Approval | |
| 11 11 | 
             
                serialize :params, Hash
         | 
| 12 12 |  | 
| 13 13 | 
             
                validates :resource_type, presence: true
         | 
| 14 | 
            +
                validates :resource_id,   presence: true, if: ->(item) { item.update_event? || item.destroy_event? }
         | 
| 14 15 | 
             
                validates :event,         presence: true, inclusion: { in: EVENTS }
         | 
| 16 | 
            +
                validates :params,        presence: true, if: :update_event?
         | 
| 15 17 |  | 
| 16 | 
            -
                 | 
| 17 | 
            -
                  validates :resource_id, presence: true
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                with_options if: :update_event? do
         | 
| 21 | 
            -
                  validates :params, presence: true
         | 
| 22 | 
            -
                end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                validate :ensure_resource_be_valid
         | 
| 18 | 
            +
                validate :ensure_resource_be_valid, if: ->(item) { item.create_event? || item.update_event? }
         | 
| 25 19 |  | 
| 26 20 | 
             
                EVENTS.each do |event_name|
         | 
| 27 21 | 
             
                  define_method "#{event_name}_event?" do
         | 
| @@ -30,30 +24,45 @@ module Approval | |
| 30 24 | 
             
                end
         | 
| 31 25 |  | 
| 32 26 | 
             
                def apply
         | 
| 33 | 
            -
                   | 
| 34 | 
            -
             | 
| 27 | 
            +
                  send("exec_#{event}")
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                private
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  def exec_create
         | 
| 35 33 | 
             
                    resource_model.create!(params).tap do |created_resource|
         | 
| 36 34 | 
             
                      update!(resource_id: created_resource.id)
         | 
| 37 35 | 
             
                    end
         | 
| 38 | 
            -
                   | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def exec_update
         | 
| 39 39 | 
             
                    raise UnexistResource unless resource
         | 
| 40 40 |  | 
| 41 41 | 
             
                    resource.update!(params)
         | 
| 42 | 
            -
                   | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  def exec_destroy
         | 
| 43 45 | 
             
                    raise UnexistResource unless resource
         | 
| 44 46 |  | 
| 45 47 | 
             
                    resource.destroy
         | 
| 46 48 | 
             
                  end
         | 
| 47 | 
            -
                end
         | 
| 48 49 |  | 
| 49 | 
            -
             | 
| 50 | 
            +
                  def exec_perform
         | 
| 51 | 
            +
                    raise NotImplementedError unless resource_model.respond_to?(:perform)
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    if resource_model.method(:perform).arity > 0
         | 
| 54 | 
            +
                      resource_model.perform(params)
         | 
| 55 | 
            +
                    else
         | 
| 56 | 
            +
                      resource_model.perform
         | 
| 57 | 
            +
                    end
         | 
| 58 | 
            +
                  end
         | 
| 50 59 |  | 
| 51 60 | 
             
                  def resource_model
         | 
| 52 61 | 
             
                    @resource_model ||= resource_type.to_s.safe_constantize
         | 
| 53 62 | 
             
                  end
         | 
| 54 63 |  | 
| 55 64 | 
             
                  def ensure_resource_be_valid
         | 
| 56 | 
            -
                    return  | 
| 65 | 
            +
                    return unless resource_model
         | 
| 57 66 |  | 
| 58 67 | 
             
                    record = if resource_id.present?
         | 
| 59 68 | 
             
                               resource_model.find(resource_id).tap {|m| m.assign_attributes(params) }
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            module Approval
         | 
| 2 | 
            +
              module RequestForm
         | 
| 3 | 
            +
                class Perform < Base
         | 
| 4 | 
            +
                  private
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def prepare
         | 
| 7 | 
            +
                      ::Approval::Request.transaction do
         | 
| 8 | 
            +
                        request.comments.new(user_id: user.id, content: reason)
         | 
| 9 | 
            +
                        Array(records).each do |record|
         | 
| 10 | 
            +
                          request.items.new(
         | 
| 11 | 
            +
                            event: "perform",
         | 
| 12 | 
            +
                            resource_type: record.class.to_s,
         | 
| 13 | 
            +
                            params: extract_params_from(record),
         | 
| 14 | 
            +
                          )
         | 
| 15 | 
            +
                        end
         | 
| 16 | 
            +
                        yield(request)
         | 
| 17 | 
            +
                      end
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def extract_params_from(record)
         | 
| 21 | 
            +
                      record.try(:attributes) || record.try(:to_h) || {}
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -19,6 +19,10 @@ module Approval | |
| 19 19 | 
             
                  Approval::RequestForm::Destroy.new(user: self, reason: reason, records: records)
         | 
| 20 20 | 
             
                end
         | 
| 21 21 |  | 
| 22 | 
            +
                def request_for_perform(records, reason:)
         | 
| 23 | 
            +
                  Approval::RequestForm::Perform.new(user: self, reason: reason, records: records)
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 22 26 | 
             
                def cancel_request(request, reason:)
         | 
| 23 27 | 
             
                  Approval::RespondForm::Cancel.new(user: self, reason: reason, request: request)
         | 
| 24 28 | 
             
                end
         | 
    
        data/lib/approval/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: approval
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.5.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Yoshiyuki Hirano
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018-04- | 
| 11 | 
            +
            date: 2018-04-18 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -41,6 +41,7 @@ files: | |
| 41 41 | 
             
            - app/models/approval/request_form/base.rb
         | 
| 42 42 | 
             
            - app/models/approval/request_form/create.rb
         | 
| 43 43 | 
             
            - app/models/approval/request_form/destroy.rb
         | 
| 44 | 
            +
            - app/models/approval/request_form/perform.rb
         | 
| 44 45 | 
             
            - app/models/approval/request_form/update.rb
         | 
| 45 46 | 
             
            - app/models/approval/respond_form/approve.rb
         | 
| 46 47 | 
             
            - app/models/approval/respond_form/approve_with_execute.rb
         |