approval 0.3.5 → 0.3.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1e5565e3f6c257574039cad1c483a21489d18c15
4
- data.tar.gz: f51f115da397201f00071fe460e09f25d491ecbf
2
+ SHA256:
3
+ metadata.gz: d170c89efb6ba5bbe4ce8133d3a147c2be3ed08f01565d6b4108a4f2adce5d3b
4
+ data.tar.gz: e9b81099a7b01e3c43ff49c68d81ac5924189234d6c24fe314726abd736538e1
5
5
  SHA512:
6
- metadata.gz: 4b0f80d3cd453758bbc95b07f57e9b379940f61242e19dc348a5ad96c327f4599d5ad15a96b6f067dc2c9662632c3b1dd9a8eca73c7aad674abbf0bdc47cb883
7
- data.tar.gz: 8613e89392f7b110b2871a1a8849ae0dbfa1f3c15121bc7f23c70ec1e0980e0447f56a024e57a5fbf782a1ac042e60ef85045cb60dd9128fa8d1f07878b64004
6
+ metadata.gz: 5444fc5b21bff736ea8a1459f24b6e79dac72f88748911fcdc94c464502c59b33691867e6bfa8d79f782ef0fcb297ce888d58295c9a37976371130cea8efec99
7
+ data.tar.gz: 01fb588b9092d6ed0515ef34e83e0ab545ae8b3ffb529b687909a54e7ed18613f8574d9c85913af5e249a8f2f82e47cd04b398082d83710672d96b7190e0f2c3
@@ -1,10 +1,7 @@
1
1
  module Approval
2
2
  class Config
3
- attr_accessor(
4
- :user_class_name,
5
- :comment_maximum,
6
- :permit_to_respond_to_own_request,
7
- )
3
+ attr_accessor :user_class_name, :comment_maximum,
4
+ :permit_to_respond_to_own_request
8
5
 
9
6
  def initialize
10
7
  @user_class_name = "User"
@@ -1,11 +1,10 @@
1
+ require "rails"
2
+
1
3
  module Approval
2
4
  class Engine < ::Rails::Engine
3
- paths["app/models"] << "lib/approval/models"
4
-
5
- initializer "approval" do
5
+ initializer "approval.mixins" do
6
6
  ActiveSupport.on_load :active_record do
7
- require "approval/mixins"
8
- ActiveRecord::Base.include ::Approval::Mixins
7
+ extend ::Approval::Mixins
9
8
  end
10
9
  end
11
10
 
@@ -1,3 +1,3 @@
1
1
  module Approval
2
- VERSION = "0.3.5".freeze
2
+ VERSION = "0.3.6".freeze
3
3
  end
data/lib/approval.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Approval
2
2
  def self.config
3
- @_config ||= Config.new
3
+ @config ||= Config.new
4
4
  end
5
5
 
6
6
  def self.configure
@@ -9,8 +9,11 @@ module Approval
9
9
 
10
10
  def self.init!
11
11
  user_model = Approval.config.user_class_name.safe_constantize
12
- user_model.include ::Approval::Mixins::User if user_model
13
- [Approval::Request, Approval::Comment].each(&:define_user_association)
12
+
13
+ if user_model
14
+ ::Approval::Request.define_user_association
15
+ ::Approval::Comment.define_user_association
16
+ end
14
17
  end
15
18
  end
16
19
 
@@ -1,45 +1,13 @@
1
- require "rails/generators"
2
- require "rails/generators/active_record"
3
-
4
1
  module Approval
5
- class InstallGenerator < ::Rails::Generators::Base
6
- include ::Rails::Generators::Migration
2
+ class InstallGenerator < Rails::Generators::Base
7
3
  source_root File.expand_path("templates", __dir__)
8
4
 
9
- class << self
10
- def next_migration_number(dirname)
11
- ::ActiveRecord::Generators::Base.next_migration_number(dirname)
12
- end
13
- end
14
-
15
5
  def create_migration_file
16
- add_migration_file("create_approval_requests")
17
- add_migration_file("create_approval_comments")
18
- add_migration_file("create_approval_items")
6
+ rake "approval_engine:install:migrations"
19
7
  end
20
8
 
21
9
  def create_initializer
22
- copy_file("initializer.rb", "config/initializers/approval.rb")
10
+ copy_file "initializer.rb.tt", "config/initializers/approval.rb"
23
11
  end
24
-
25
- private
26
-
27
- def add_migration_file(template)
28
- migration_dir = File.expand_path("db/migrate")
29
-
30
- if self.class.migration_exists?(migration_dir, template)
31
- ::Kernel.warn "Migration already exists: #{template}"
32
- else
33
- migration_template("#{template}.rb.tt", "db/migrate/#{template}.rb", migration_version: migration_version)
34
- end
35
- end
36
-
37
- def migration_version
38
- major = ActiveRecord::VERSION::MAJOR
39
-
40
- if major >= 5
41
- "[#{major}.#{ActiveRecord::VERSION::MINOR}]"
42
- end
43
- end
44
12
  end
45
13
  end
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.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshiyuki Hirano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-17 00:00:00.000000000 Z
11
+ date: 2018-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -37,29 +37,10 @@ files:
37
37
  - lib/approval.rb
38
38
  - lib/approval/config.rb
39
39
  - lib/approval/engine.rb
40
- - lib/approval/mixins.rb
41
- - lib/approval/mixins/resource.rb
42
- - lib/approval/mixins/user.rb
43
- - lib/approval/models/approval/comment.rb
44
- - lib/approval/models/approval/item.rb
45
- - lib/approval/models/approval/request.rb
46
- - lib/approval/models/approval/request_form.rb
47
- - lib/approval/models/approval/request_form/base.rb
48
- - lib/approval/models/approval/request_form/create.rb
49
- - lib/approval/models/approval/request_form/destroy.rb
50
- - lib/approval/models/approval/request_form/update.rb
51
- - lib/approval/models/approval/respond_form.rb
52
- - lib/approval/models/approval/respond_form/approve.rb
53
- - lib/approval/models/approval/respond_form/base.rb
54
- - lib/approval/models/approval/respond_form/cancel.rb
55
- - lib/approval/models/approval/respond_form/reject.rb
56
40
  - lib/approval/version.rb
57
41
  - lib/generators/approval/USAGE
58
42
  - lib/generators/approval/install_generator.rb
59
- - lib/generators/approval/templates/create_approval_comments.rb.tt
60
- - lib/generators/approval/templates/create_approval_items.rb.tt
61
- - lib/generators/approval/templates/create_approval_requests.rb.tt
62
- - lib/generators/approval/templates/initializer.rb
43
+ - lib/generators/approval/templates/initializer.rb.tt
63
44
  homepage: https://github.com/yhirano55/approval
64
45
  licenses:
65
46
  - MIT
@@ -72,7 +53,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
72
53
  requirements:
73
54
  - - ">="
74
55
  - !ruby/object:Gem::Version
75
- version: 2.2.0
56
+ version: 2.2.2
76
57
  required_rubygems_version: !ruby/object:Gem::Requirement
77
58
  requirements:
78
59
  - - ">="
@@ -80,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
61
  version: '0'
81
62
  requirements: []
82
63
  rubyforge_project:
83
- rubygems_version: 2.6.10
64
+ rubygems_version: 2.7.6
84
65
  signing_key:
85
66
  specification_version: 4
86
67
  summary: Approval flow for Rails
@@ -1,28 +0,0 @@
1
- module Approval
2
- module Mixins
3
- module Resource
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- class_attribute :approval_ignore_fields
8
- self.approval_ignore_fields = %w[id created_at updated_at]
9
-
10
- has_many :approval_items, class_name: :"Approval::Item", as: :resource
11
- end
12
-
13
- class_methods do
14
- def assign_ignore_fields(ignore_fields = [])
15
- self.approval_ignore_fields = approval_ignore_fields.concat(ignore_fields).map(&:to_s).uniq
16
- end
17
- end
18
-
19
- def create_params_for_approval
20
- attributes.except(*approval_ignore_fields).compact
21
- end
22
-
23
- def update_params_for_approval
24
- changes.except(*approval_ignore_fields).each_with_object({}) { |(k, v), h| h[k] = v.last }.compact
25
- end
26
- end
27
- end
28
- end
@@ -1,36 +0,0 @@
1
- module Approval
2
- module Mixins
3
- module User
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- has_many :approval_requests, class_name: :"Approval::Request", foreign_key: :request_user_id
8
- has_many :approval_comments, class_name: :"Approval::Comment", foreign_key: :user_id
9
- end
10
-
11
- def request_for_create(records, reason:)
12
- Approval::RequestForm::Create.new(user: self, reason: reason, records: records)
13
- end
14
-
15
- def request_for_update(records, reason:)
16
- Approval::RequestForm::Update.new(user: self, reason: reason, records: records)
17
- end
18
-
19
- def request_for_destroy(records, reason:)
20
- Approval::RequestForm::Destroy.new(user: self, reason: reason, records: records)
21
- end
22
-
23
- def cancel_request(request, reason:)
24
- Approval::RespondForm::Cancel.new(user: self, reason: reason, request: request)
25
- end
26
-
27
- def approve_request(request, reason:)
28
- Approval::RespondForm::Approve.new(user: self, reason: reason, request: request)
29
- end
30
-
31
- def reject_request(request, reason:)
32
- Approval::RespondForm::Reject.new(user: self, reason: reason, request: request)
33
- end
34
- end
35
- end
36
- end
@@ -1,19 +0,0 @@
1
- module Approval
2
- module Mixins
3
- extend ActiveSupport::Concern
4
-
5
- class_methods do
6
- def acts_as_approval_resource(ignore_fields: [])
7
- include ::Approval::Mixins::Resource
8
- assign_ignore_fields(ignore_fields)
9
- end
10
-
11
- def acts_as_approval_user
12
- include ::Approval::Mixins::User
13
- end
14
- end
15
- end
16
- end
17
-
18
- require "approval/mixins/resource"
19
- require "approval/mixins/user"
@@ -1,15 +0,0 @@
1
- module Approval
2
- class Comment < ::ActiveRecord::Base
3
- self.table_name_prefix = "approval_".freeze
4
-
5
- class << self
6
- def define_user_association
7
- belongs_to :user, class_name: Approval.config.user_class_name
8
- end
9
- end
10
-
11
- belongs_to :request, class_name: :"Approval::Request", inverse_of: :comments
12
-
13
- validates :content, presence: true, length: { maximum: Approval.config.comment_maximum }
14
- end
15
- end
@@ -1,66 +0,0 @@
1
- module Approval
2
- class Item < ::ActiveRecord::Base
3
- class UnexistResource < StandardError; end
4
-
5
- EVENTS = %w[create update destroy].freeze
6
-
7
- self.table_name_prefix = "approval_".freeze
8
-
9
- belongs_to :request, class_name: :"Approval::Request", inverse_of: :items
10
- belongs_to :resource, polymorphic: true, optional: true
11
-
12
- serialize :params, Hash
13
-
14
- with_options presence: true do
15
- validates :resource_id, unless: :create_event?
16
- validates :resource_type
17
- validates :event, inclusion: { in: EVENTS }
18
- validates :params, if: :update_event?
19
- end
20
-
21
- validate :ensure_resource_be_valid
22
-
23
- EVENTS.each do |event_name|
24
- define_method "#{event_name}_event?" do
25
- event_name.to_s == event.to_s
26
- end
27
- end
28
-
29
- def apply
30
- case event
31
- when "create"
32
- resource_model.create!(params).tap do |created_resource|
33
- update!(resource_id: created_resource.id)
34
- end
35
- when "update"
36
- raise UnexistResource unless resource
37
- resource.update!(params)
38
- when "destroy"
39
- raise UnexistResource unless resource
40
- resource.destroy
41
- end
42
- end
43
-
44
- private
45
-
46
- def resource_model
47
- @_resource_model ||= resource_type.to_s.safe_constantize
48
- end
49
-
50
- def ensure_resource_be_valid
51
- return if resource_model.nil? || destroy_event?
52
- record = if resource_id.present?
53
- resource_model.find(resource_id).tap { |m| m.assign_attributes(params) }
54
- else
55
- resource_model.new(params || {})
56
- end
57
-
58
- unless record.valid?
59
- errors.add(:base, :invalid)
60
- record.errors.full_messages.each do |message|
61
- request.errors.add(:base, message)
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,46 +0,0 @@
1
- module Approval
2
- class Request < ::ActiveRecord::Base
3
- self.table_name_prefix = "approval_".freeze
4
-
5
- class << self
6
- def define_user_association
7
- with_options class_name: Approval.config.user_class_name do
8
- belongs_to :request_user
9
- belongs_to :respond_user, optional: true
10
- end
11
- end
12
- end
13
-
14
- with_options dependent: :destroy, inverse_of: :request do
15
- has_many :comments, class_name: "::Approval::Comment"
16
- has_many :items, class_name: "::Approval::Item"
17
- end
18
-
19
- enum state: { pending: 0, cancelled: 1, approved: 2, rejected: 3 }
20
-
21
- scope :recently, -> { order(id: :desc) }
22
-
23
- with_options presence: true do
24
- validates :state
25
- validates :respond_user, unless: :pending?
26
- validates :comments
27
- validates :items
28
- end
29
-
30
- validates_associated :comments
31
- validates_associated :items
32
-
33
- validate :ensure_state_was_pending
34
-
35
- before_create do
36
- self.requested_at = Time.current
37
- end
38
-
39
- private
40
-
41
- def ensure_state_was_pending
42
- return unless persisted?
43
- errors.add(:base, :already_performed) if state_was != "pending"
44
- end
45
- end
46
- end
@@ -1,45 +0,0 @@
1
- module Approval
2
- module RequestForm
3
- class Base
4
- include ::ActiveModel::Model
5
-
6
- attr_accessor :user, :reason, :records
7
-
8
- def initialize(user:, reason:, records:)
9
- @user = user
10
- @reason = reason
11
- @records = records
12
- end
13
-
14
- with_options presence: true do
15
- validates :user
16
- validates :reason, length: { maximum: Approval.config.comment_maximum }
17
- validates :records
18
- end
19
-
20
- def save
21
- return false unless valid?
22
- prepare(&:save)
23
- end
24
-
25
- def save!
26
- raise ::ActiveRecord::RecordInvalid unless valid?
27
- prepare(&:save!)
28
- end
29
-
30
- def request
31
- @request ||= user.approval_requests.new
32
- end
33
-
34
- def error_full_messages
35
- [errors, request.errors].flat_map(&:full_messages)
36
- end
37
-
38
- private
39
-
40
- def prepare
41
- raise NotImplementedError, "you must implement #{self.class}##{__method__}"
42
- end
43
- end
44
- end
45
- end
@@ -1,21 +0,0 @@
1
- module Approval
2
- module RequestForm
3
- class Create < 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: "create",
12
- resource_type: record.class.to_s,
13
- params: record.create_params_for_approval,
14
- )
15
- end
16
- yield(request)
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,21 +0,0 @@
1
- module Approval
2
- module RequestForm
3
- class Destroy < 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: "destroy",
12
- resource_type: record.class.to_s,
13
- resource_id: record.id,
14
- )
15
- end
16
- yield(request)
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,22 +0,0 @@
1
- module Approval
2
- module RequestForm
3
- class Update < 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: "update",
12
- resource_type: record.class.to_s,
13
- resource_id: record.id,
14
- params: record.update_params_for_approval,
15
- )
16
- end
17
- yield(request)
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,4 +0,0 @@
1
- module Approval
2
- module RequestForm
3
- end
4
- end
@@ -1,19 +0,0 @@
1
- module Approval
2
- module RespondForm
3
- class Approve < Base
4
- validate :ensure_user_cannot_respond_to_my_request
5
-
6
- private
7
-
8
- def prepare
9
- ::Approval::Request.transaction do
10
- request.lock!
11
- request.assign_attributes(state: :approved, approved_at: Time.current, respond_user_id: user.id)
12
- request.comments.new(user_id: user.id, content: reason)
13
- request.items.each(&:apply)
14
- yield(request)
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,42 +0,0 @@
1
- module Approval
2
- module RespondForm
3
- class Base
4
- include ::ActiveModel::Model
5
-
6
- attr_accessor :user, :reason, :request
7
-
8
- def initialize(user:, reason:, request:)
9
- @user = user
10
- @reason = reason
11
- @request = request
12
- end
13
-
14
- with_options presence: true do
15
- validates :user
16
- validates :reason, length: { maximum: Approval.config.comment_maximum }
17
- validates :request
18
- end
19
-
20
- def save
21
- return false unless valid?
22
- prepare(&:save)
23
- end
24
-
25
- def save!
26
- raise ::ActiveRecord::RecordInvalid unless valid?
27
- prepare(&:save!)
28
- end
29
-
30
- private
31
-
32
- def prepare
33
- raise NotImplementedError, "you must implement #{self.class}##{__method__}"
34
- end
35
-
36
- def ensure_user_cannot_respond_to_my_request
37
- return if Approval.config.permit_to_respond_to_own_request?
38
- errors.add(:user, :cannot_respond_to_own_request) if user.try(:id) == request.request_user_id
39
- end
40
- end
41
- end
42
- end
@@ -1,16 +0,0 @@
1
- module Approval
2
- module RespondForm
3
- class Cancel < Base
4
- private
5
-
6
- def prepare
7
- ::Approval::Request.transaction do
8
- request.lock!
9
- request.assign_attributes(state: :cancelled, cancelled_at: Time.current, respond_user_id: user.id)
10
- request.comments.new(user_id: user.id, content: reason)
11
- yield(request)
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,18 +0,0 @@
1
- module Approval
2
- module RespondForm
3
- class Reject < Base
4
- validate :ensure_user_cannot_respond_to_my_request
5
-
6
- private
7
-
8
- def prepare
9
- ::Approval::Request.transaction do
10
- request.lock!
11
- request.assign_attributes(state: :rejected, rejected_at: Time.current, respond_user_id: user.id)
12
- request.comments.new(user_id: user.id, content: reason)
13
- yield(request)
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,4 +0,0 @@
1
- module Approval
2
- module RespondForm
3
- end
4
- end
@@ -1,14 +0,0 @@
1
- class CreateApprovalComments < ActiveRecord::Migration<%= migration_version %>
2
- def change
3
- create_table :approval_comments do |t|
4
- t.integer :request_id, null: false
5
- t.integer :user_id, null: false
6
- t.text :content, null: false
7
-
8
- t.timestamps
9
-
10
- t.index :request_id
11
- t.index :user_id
12
- end
13
- end
14
- end
@@ -1,17 +0,0 @@
1
- class CreateApprovalItems < ActiveRecord::Migration<%= migration_version %>
2
- def change
3
- create_table :approval_items do |t|
4
- t.integer :request_id, null: false
5
- t.integer :resource_id
6
- t.string :resource_type, null: false
7
- t.string :event, null: false
8
- t.text :params
9
-
10
- t.timestamps
11
-
12
- t.index :request_id
13
- end
14
-
15
- add_index :approval_items, [:resource_id, :resource_type]
16
- end
17
- end
@@ -1,19 +0,0 @@
1
- class CreateApprovalRequests < ActiveRecord::Migration<%= migration_version %>
2
- def change
3
- create_table :approval_requests do |t|
4
- t.integer :request_user_id, null: false
5
- t.integer :respond_user_id
6
- t.integer :state, null: false, limit: 1, default: 0
7
- t.datetime :requested_at, null: false
8
- t.datetime :cancelled_at
9
- t.datetime :approved_at
10
- t.datetime :rejected_at
11
-
12
- t.timestamps
13
-
14
- t.index :request_user_id
15
- t.index :respond_user_id
16
- t.index :state
17
- end
18
- end
19
- end