approval 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
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