paper_trail-rails 0.1.0 → 0.2.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/Changelog.md +15 -0
- data/Readme.md +51 -7
- data/lib/paper_trail/rails/configuration.rb +13 -17
- data/lib/paper_trail/rails/console.rb +102 -0
- data/lib/paper_trail/rails/general.rb +20 -18
- data/lib/paper_trail/rails/paper_trail_extensions.rb +6 -0
- data/lib/paper_trail/rails/railtie.rb +0 -33
- data/lib/paper_trail/rails/version.rb +1 -1
- data/lib/paper_trail/rails.rb +19 -12
- 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: 70c683fd54f3d91ce5136dc79ccf3cae67564beebaed69d6fc94590588b2f9b2
|
4
|
+
data.tar.gz: 6b75131fbe1e81b1cb40943ec9148a52357310ed7e6d505b0bde16f2bb126d14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffa6a5dbfa8c843e651a27394f51d7515498a0c486dc890e136f2c57cfcb832f932d931bdbe260efb4b758d02cf1d812ea8e3de7298443aaee69872fa55f3fbf
|
7
|
+
data.tar.gz: faeb455308c26c59e0de58849563ac8fafe70b22b57f49fc7f2f844c9d32312646ca6d6f7ac1acb59e3552af4465dbadbe889c55db02c7a750134c7c1f7a33d1
|
data/Changelog.md
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
## 0.2.0 (2019-05-23)
|
2
|
+
|
3
|
+
### Breaking changes
|
4
|
+
- Moved config specific to rails console under `config.console`
|
5
|
+
- Rename `PaperTrail::Rails.set_default_paper_trail_metadata` to `PaperTrail::Rails.set_default_metadata`
|
6
|
+
- Rename `PaperTrail::Rails.select_paper_trail_user_or_system` to `PaperTrail::Rails.select_user`
|
7
|
+
- and others
|
8
|
+
|
9
|
+
### Added
|
10
|
+
- Automatically reset reason so it doesn't keep assuming and using the same reason for all changes you make in this console session.(Can be disabled with `config.console.auto_reset_reason = false`)
|
11
|
+
- Add `config.console.ask_for_user`, `config.console.require_user`, and `config.console.auto_reset_user`
|
12
|
+
|
13
|
+
## 0.1.0 (2019-05-22)
|
14
|
+
|
15
|
+
Initial release
|
data/Readme.md
CHANGED
@@ -1,8 +1,22 @@
|
|
1
1
|
# PaperTrail::Rails
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
[![Gem Version][1]][2]
|
4
|
+
|
5
|
+
An extension to [PaperTrail](https://github.com/paper-trail-gem/paper_trail)
|
6
|
+
that adds some useful automatic integrations with Rails:
|
7
|
+
|
8
|
+
- Automatically record which migration made the change in the version record (in
|
9
|
+
the `command` attribute) when migrations make changes to data.
|
10
|
+
- Automatically record `rails console` as the command in the version record (in
|
11
|
+
the `command` attribute).
|
12
|
+
- Automatically record the source location that initiated the change so you can
|
13
|
+
figure out what caused caused the change later when inspecting a version
|
14
|
+
record
|
15
|
+
- (Optional) Never forget to set the actor (whodunnit) when making changes in the `rails
|
16
|
+
console`. It will prompt you to choose an actor user as soon as you try to
|
17
|
+
make a change that would record a PaperTrail Version. (Enter `system` if you
|
18
|
+
don't want any particular user recorded as the actor.)
|
19
|
+
- (Optional) Automatically ask for a reason whenever you make a change
|
6
20
|
|
7
21
|
## Installation
|
8
22
|
|
@@ -16,13 +30,40 @@ And then execute:
|
|
16
30
|
|
17
31
|
$ bundle
|
18
32
|
|
19
|
-
|
33
|
+
Add and run this migration:
|
34
|
+
```
|
35
|
+
class VersionsAddSourceLocationCommandReason < ActiveRecord::Migration[5.2]
|
36
|
+
def change
|
37
|
+
change_table :versions do |t|
|
38
|
+
t.text :source_location
|
39
|
+
t.text :command
|
40
|
+
t.text :reason
|
41
|
+
end
|
42
|
+
change_table :versions do |t|
|
43
|
+
t.index :command
|
44
|
+
t.index :reason
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
## Configuration
|
20
51
|
|
21
|
-
|
52
|
+
Add to `config/initializers/paper_trail.rb` and change as needed:
|
22
53
|
|
23
|
-
|
54
|
+
```ruby
|
55
|
+
PaperTrail::Rails.configure do |config|
|
56
|
+
config.console.ask_for_user = true
|
57
|
+
config.console.require_user = false
|
58
|
+
config.console.auto_reset_user = false
|
59
|
+
|
60
|
+
config.console.ask_for_reason = true
|
61
|
+
config.console.require_reason = false
|
62
|
+
config.console.auto_reset_reason = true
|
24
63
|
|
25
|
-
|
64
|
+
config.user_filter = ->(users) { users.admins }
|
65
|
+
end
|
66
|
+
```
|
26
67
|
|
27
68
|
## Development
|
28
69
|
|
@@ -33,3 +74,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
33
74
|
## Contributing
|
34
75
|
|
35
76
|
Bug reports and pull requests are welcome on GitHub at https://github.com/TylerRick/paper_trail-rails.
|
77
|
+
|
78
|
+
[1]: https://badge.fury.io/rb/paper_trail-rails.svg
|
79
|
+
[2]: https://rubygems.org/gems/paper_trail-rails
|
@@ -2,31 +2,27 @@ module PaperTrail
|
|
2
2
|
module Rails
|
3
3
|
class Configuration
|
4
4
|
def initialize
|
5
|
-
|
6
|
-
|
5
|
+
config = self
|
6
|
+
|
7
|
+
config.select_user_filter = :itself
|
8
|
+
config.select_user_other_allowed_values = ['system', 'admin']
|
9
|
+
config.user_for_test = ->(users) {
|
7
10
|
users.admins.last
|
8
11
|
}
|
9
|
-
|
10
|
-
self.ask_reason = true
|
11
|
-
self.require_reason = false
|
12
12
|
end
|
13
13
|
|
14
|
-
# Filter users
|
14
|
+
# Filter proc to use to show a list of users in select_user helper. For example:
|
15
15
|
# ->(users) { users.admins) }
|
16
|
-
|
16
|
+
# or
|
17
|
+
# ->(users) { users.none) }
|
18
|
+
# Can be also be a symbol or anything that responds to to_proc.
|
19
|
+
attr_accessor :select_user_filter
|
20
|
+
|
21
|
+
attr_accessor :select_user_other_allowed_values
|
17
22
|
|
18
23
|
# A proc that returns a user if you ever run `rails console` in test
|
19
24
|
# environment (where you probably won't have any real data)
|
20
|
-
attr_accessor :
|
21
|
-
|
22
|
-
attr_accessor :ask_reason
|
23
|
-
attr_accessor :require_reason
|
24
|
-
|
25
|
-
class << self
|
26
|
-
def configure
|
27
|
-
yield self
|
28
|
-
end
|
29
|
-
end
|
25
|
+
attr_accessor :user_for_test
|
30
26
|
end
|
31
27
|
end
|
32
28
|
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require_relative 'configuration'
|
2
|
+
require_relative 'railtie'
|
3
|
+
|
4
|
+
module PaperTrail
|
5
|
+
module Rails
|
6
|
+
module Console
|
7
|
+
class << self
|
8
|
+
end
|
9
|
+
|
10
|
+
class Configuration
|
11
|
+
def initialize
|
12
|
+
config = self
|
13
|
+
|
14
|
+
config.ask_for_user = true
|
15
|
+
config.require_user = false
|
16
|
+
config.auto_reset_user = false
|
17
|
+
|
18
|
+
config.ask_for_reason = true
|
19
|
+
config.require_reason = false
|
20
|
+
config.auto_reset_reason = true
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_accessor :ask_for_user
|
24
|
+
attr_accessor :require_user
|
25
|
+
attr_accessor :auto_reset_user
|
26
|
+
|
27
|
+
attr_accessor :ask_for_reason
|
28
|
+
attr_accessor :require_reason
|
29
|
+
attr_accessor :auto_reset_reason
|
30
|
+
|
31
|
+
class << self
|
32
|
+
def configure
|
33
|
+
yield self
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class Configuration
|
40
|
+
def console
|
41
|
+
@console ||= Console::Configuration.new
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Engine
|
46
|
+
initializer "paper_trail-rails.set_default_metadata" do |app|
|
47
|
+
# There's no way to set up deferred evaluation of PaperTrail.request.controller_info from
|
48
|
+
# here like we can with whodunnit, so abuse that property of PaperTrail.request.whodunnit to
|
49
|
+
# set other metadata. Reserve the whodunnit field for storing the actual name or id of the
|
50
|
+
# human who made the change.
|
51
|
+
PaperTrail.request.whodunnit = ->() {
|
52
|
+
PaperTrail::Rails.set_default_metadata
|
53
|
+
nil
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
console do
|
58
|
+
config = PaperTrail::Rails.config
|
59
|
+
PaperTrail.update_metadata command: "rails console"
|
60
|
+
PaperTrail.request.whodunnit = ->() {
|
61
|
+
PaperTrail::Rails.set_default_metadata
|
62
|
+
@paper_trail_whodunnit ||= (
|
63
|
+
if config.console.ask_for_user
|
64
|
+
if ::Rails.env.test?
|
65
|
+
user = config.console.user_for_test.(User.all)
|
66
|
+
else
|
67
|
+
puts "Before you make any changes... We need to know who is making the changes, to store in the PaperTrail version history."
|
68
|
+
user = PaperTrail::Rails.select_user(required: config.console.require_reason)
|
69
|
+
puts "Thank you, #{user}! Have a wonderful time!" if user
|
70
|
+
end
|
71
|
+
user.respond.id
|
72
|
+
end
|
73
|
+
)
|
74
|
+
|
75
|
+
if config.console.ask_for_reason
|
76
|
+
@paper_trail_reason ||= PaperTrail::Rails.get_reason(required: config.console.require_reason)
|
77
|
+
end
|
78
|
+
PaperTrail.update_metadata reason: @paper_trail_reason
|
79
|
+
|
80
|
+
@paper_trail_whodunnit
|
81
|
+
}
|
82
|
+
|
83
|
+
|
84
|
+
if config.console.auto_reset_user || config.console.auto_reset_reason
|
85
|
+
if defined?(Pry)
|
86
|
+
Pry.hooks.add_hook(:after_eval, "paper_trail-rails-auto_reset") do |output, binding, pry|
|
87
|
+
if config.console.auto_reset_user
|
88
|
+
@paper_trail_whodunnit = nil
|
89
|
+
end
|
90
|
+
if config.console.auto_reset_reason
|
91
|
+
@paper_trail_reason = nil
|
92
|
+
PaperTrail.update_metadata reason: @paper_trail_reason
|
93
|
+
end
|
94
|
+
end
|
95
|
+
else
|
96
|
+
raise "Pry is required in order to use `auto_reset`. Please add pry-rails to your Gemfile or disable this in the config."
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -2,28 +2,30 @@
|
|
2
2
|
|
3
3
|
module PaperTrail
|
4
4
|
module Rails
|
5
|
-
|
6
|
-
|
7
|
-
User
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
module General
|
6
|
+
class << self
|
7
|
+
def select_user(filter: :itself, other_allowed_values: [], prompt: 'Please enter a User id', required: true)
|
8
|
+
User.logger.silence do
|
9
|
+
puts 'id. user'
|
10
|
+
filter.to_proc.(User.all).default_order.each do |user|
|
11
|
+
puts "%4s. %s" % [user.id, user.inspect]
|
12
|
+
end
|
11
13
|
end
|
12
|
-
end
|
13
|
-
other_values_prompt = " (#{other_values_prompt})" if other_values_prompt.present?
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
15
|
+
user = nil
|
16
|
+
until user.present? do
|
17
|
+
print "#{prompt}: "
|
18
|
+
input = gets.chomp
|
19
|
+
case input
|
20
|
+
when *other_allowed_values
|
21
|
+
user = input
|
22
|
+
else
|
23
|
+
user = User.find(input) rescue nil
|
24
|
+
end
|
25
|
+
break unless required
|
24
26
|
end
|
27
|
+
user
|
25
28
|
end
|
26
|
-
user
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -15,6 +15,12 @@ PaperTrail.class_eval do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
unless methods.include?(:reset_metadata)
|
19
|
+
def self.reset_metadata
|
20
|
+
PaperTrail.request.controller_info = nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
18
24
|
unless methods.include?(:update_metadata)
|
19
25
|
def self.update_metadata(metadata)
|
20
26
|
merged_metadata = (::PaperTrail.request.controller_info || {}).merge(metadata)
|
@@ -7,39 +7,6 @@ require 'paper_trail/frameworks/rails/engine'
|
|
7
7
|
module PaperTrail
|
8
8
|
module Rails
|
9
9
|
class Engine
|
10
|
-
initializer "paper_trail-rails.set_default_paper_trail_metadata" do |app|
|
11
|
-
# There's no way to set up deferred evaluation of PaperTrail.request.controller_info from
|
12
|
-
# here like we can with whodunnit, so abuse that property of PaperTrail.request.whodunnit to
|
13
|
-
# set other metadata. Reserve the whodunnit field for storing the actual name or id of the
|
14
|
-
# human who made the change.
|
15
|
-
PaperTrail.request.whodunnit = ->() {
|
16
|
-
PaperTrail::Rails.set_default_paper_trail_metadata
|
17
|
-
nil
|
18
|
-
}
|
19
|
-
end
|
20
|
-
|
21
|
-
console do
|
22
|
-
config = PaperTrail::Rails.config
|
23
|
-
PaperTrail.update_metadata command: "rails console"
|
24
|
-
PaperTrail.request.whodunnit = ->() {
|
25
|
-
PaperTrail::Rails.set_default_paper_trail_metadata
|
26
|
-
@paper_trail_whodunnit ||= (
|
27
|
-
if ::Rails.env.test?
|
28
|
-
user = config.paper_trail_user_for_test_console.(User.all)
|
29
|
-
else
|
30
|
-
puts "Before you make any changes... We need to know who is making the changes, to store in the PaperTrail version history."
|
31
|
-
user = PaperTrail::Rails.select_paper_trail_user_or_system
|
32
|
-
puts "Thank you, #{user}! Have a wonderful time!"
|
33
|
-
end
|
34
|
-
user.respond.id
|
35
|
-
)
|
36
|
-
if config.ask_reason
|
37
|
-
@paper_trail_reason ||= PaperTrail::Rails.get_paper_trail_reason(required: config.require_reason)
|
38
|
-
end
|
39
|
-
PaperTrail.update_metadata reason: @paper_trail_reason
|
40
|
-
@paper_trail_whodunnit
|
41
|
-
}
|
42
|
-
end
|
43
10
|
end
|
44
11
|
end
|
45
12
|
end
|
data/lib/paper_trail/rails.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
require 'paper_trail'
|
2
2
|
|
3
3
|
require_relative 'rails/version'
|
4
|
-
|
5
|
-
|
4
|
+
|
5
|
+
# (In alphabetical order)
|
6
6
|
require_relative 'rails/configuration'
|
7
|
+
require_relative 'rails/console'
|
8
|
+
require_relative 'rails/general'
|
7
9
|
require_relative 'rails/migration_extensions'
|
10
|
+
require_relative 'rails/paper_trail_extensions'
|
8
11
|
|
9
12
|
module PaperTrail
|
13
|
+
# This is the main module for this gem. Can't make it a class because
|
14
|
+
# paper_trail gem already defines this module; otherwise I would have made
|
15
|
+
# this a class.
|
10
16
|
module Rails
|
11
17
|
class << self
|
12
18
|
def configuration
|
@@ -18,8 +24,8 @@ module PaperTrail
|
|
18
24
|
yield config
|
19
25
|
end
|
20
26
|
|
21
|
-
# Store some metadata about where the change came from
|
22
|
-
def
|
27
|
+
# Store some metadata about where the change came from
|
28
|
+
def set_default_metadata
|
23
29
|
PaperTrail.update_metadata(
|
24
30
|
command: "#{File.basename($PROGRAM_NAME)} #{ARGV.join ' '}",
|
25
31
|
source_location: caller.find { |line|
|
@@ -29,15 +35,18 @@ module PaperTrail
|
|
29
35
|
)
|
30
36
|
end
|
31
37
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
def select_user(required: false)
|
39
|
+
other_allowed_values = config.select_user_other_allowed_values
|
40
|
+
other_values_prompt = " (or #{other_allowed_values.join(' or ')})" if other_allowed_values.present?
|
41
|
+
General.select_user(
|
42
|
+
filter: config.select_user_filter,
|
43
|
+
other_allowed_values: other_allowed_values,
|
44
|
+
prompt: "Please enter a User id#{other_values_prompt}",
|
45
|
+
required: required
|
37
46
|
)
|
38
47
|
end
|
39
48
|
|
40
|
-
def
|
49
|
+
def get_reason(required: false)
|
41
50
|
reason = nil
|
42
51
|
until reason.present? do
|
43
52
|
print "What is the reason for this change? "
|
@@ -49,5 +58,3 @@ module PaperTrail
|
|
49
58
|
end
|
50
59
|
end
|
51
60
|
end
|
52
|
-
|
53
|
-
require_relative 'rails/railtie'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paper_trail-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Rick
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: paper_trail
|
@@ -100,6 +100,7 @@ files:
|
|
100
100
|
- bin/setup
|
101
101
|
- lib/paper_trail/rails.rb
|
102
102
|
- lib/paper_trail/rails/configuration.rb
|
103
|
+
- lib/paper_trail/rails/console.rb
|
103
104
|
- lib/paper_trail/rails/general.rb
|
104
105
|
- lib/paper_trail/rails/migration_extensions.rb
|
105
106
|
- lib/paper_trail/rails/paper_trail_extensions.rb
|