omg-audit-group 0.1.0 → 0.1.1
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 +42 -4
- data/Rakefile +11 -0
- data/audit_group.gemspec +1 -6
- data/lib/audit_group.rb +52 -5
- data/spec/audit_group_spec.rb +93 -29
- metadata +3 -5
- data/lib/audit_group/request.rb +0 -59
- data/lib/audit_group/version.rb +0 -5
- data/spec/audit_group/request_spec.rb +0 -110
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8826c5193da34c27182b2f70bdf09828c3fbc9044a483540cba3ae491147e3ea
|
4
|
+
data.tar.gz: 46b18034462d5c30df7d028e3b4bb337e4bd221d522f430646b4b50304663c30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 783b7104fd8427d4183c8d777f9c91ad0129a5b8a24e65a50a252061579d183756c926564fa8e75caa09ec6146206d5852f020af984ae29b1d49fb17e1c7219e
|
7
|
+
data.tar.gz: ae01514472dd81d6f209b2a5a3e99623a8e497687024aacc790073c71965b88c5512d75491a186449cda76105da4161c2737d1dfa45febf974aa8e4645a9ad10
|
data/README.md
CHANGED
@@ -2,19 +2,42 @@
|
|
2
2
|
|
3
3
|
Group ActiveRecord operations together by assigning all of their audits the same `request_uuid`.
|
4
4
|
|
5
|
+
## TODO
|
6
|
+
|
7
|
+
- [ ] Add `rails` as dependency instead of `active_support`
|
8
|
+
- [ ] Add `dry_run` method
|
9
|
+
|
5
10
|
## Requirements
|
6
11
|
|
7
12
|
- [Audited](https://github.com/collectiveidea/audited) gem
|
8
13
|
|
9
14
|
## Installation
|
10
15
|
|
16
|
+
### From RubyGems.org
|
17
|
+
|
18
|
+
#### Globally
|
19
|
+
|
20
|
+
```sh
|
21
|
+
gem i omg-audit-group
|
22
|
+
```
|
23
|
+
|
24
|
+
#### In `Gemfile`
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
gem 'omg-audit-group'
|
28
|
+
```
|
29
|
+
|
11
30
|
### Testing locally
|
12
31
|
```sh
|
13
32
|
# Build gem
|
14
|
-
|
33
|
+
rake build
|
15
34
|
|
16
35
|
# Install gem
|
17
|
-
|
36
|
+
## From this directory
|
37
|
+
rake install
|
38
|
+
|
39
|
+
## From other directory
|
40
|
+
gem i -l /path/to/this/folder/omg-audit-group-0.1.0.gem
|
18
41
|
```
|
19
42
|
|
20
43
|
## Usage
|
@@ -27,19 +50,34 @@ For convenience, the following operations are delegated from the `AuditGroup` mo
|
|
27
50
|
- `request_uuid`
|
28
51
|
- `audits`
|
29
52
|
|
30
|
-
|
53
|
+
### Using class methods
|
31
54
|
|
32
55
|
```ruby
|
33
56
|
# Group operations under the same request_uuid
|
34
57
|
AuditGroup.request { perform_some_operations }
|
35
58
|
|
36
|
-
# View the last request_uuid
|
59
|
+
# View the last request_uuid
|
37
60
|
AuditGroup.request_uuid
|
38
61
|
|
39
62
|
# View the audits from the last request
|
40
63
|
AuditGroup.audits
|
41
64
|
```
|
42
65
|
|
66
|
+
### Saving Request object for later use
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
# Group operations under the same request_uuid
|
70
|
+
request = AuditGroup.request { perform_some_operations }
|
71
|
+
|
72
|
+
# View the last request_uuid
|
73
|
+
request.request_uuid
|
74
|
+
|
75
|
+
# View the audits from the last request
|
76
|
+
request.audits
|
77
|
+
```
|
78
|
+
|
79
|
+
### Instantiating a group
|
80
|
+
|
43
81
|
You can also create separate `AuditGroup::Request` objects to reuse.
|
44
82
|
|
45
83
|
```ruby
|
data/Rakefile
ADDED
data/audit_group.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'lib/audit_group
|
3
|
+
require_relative 'lib/audit_group'
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'omg-audit-group'
|
@@ -20,8 +20,6 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.metadata['homepage_uri'] = spec.homepage
|
21
21
|
spec.metadata['rubygems_mfa_required'] = 'true'
|
22
22
|
|
23
|
-
# Specify which files should be added to the gem when it is released.
|
24
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
23
|
spec.files = Dir.chdir(__dir__) do
|
26
24
|
`git ls-files -z`.split("\x0").reject do |f|
|
27
25
|
(File.expand_path(f) == __FILE__) ||
|
@@ -32,7 +30,4 @@ Gem::Specification.new do |spec|
|
|
32
30
|
|
33
31
|
spec.add_dependency 'activesupport', '>= 6.0', '< 8.0'
|
34
32
|
spec.add_dependency 'audited', '>= 4.9', '< 6.0'
|
35
|
-
|
36
|
-
# For more information and examples about making a new gem, check out our
|
37
|
-
# guide at: https://bundler.io/guides/creating_gem.html
|
38
33
|
end
|
data/lib/audit_group.rb
CHANGED
@@ -1,13 +1,60 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'audit_group/request'
|
4
|
-
require_relative 'audit_group/version'
|
5
|
-
|
6
3
|
require 'active_support/all'
|
7
4
|
require 'audited'
|
8
5
|
|
9
|
-
|
6
|
+
class AuditGroup
|
7
|
+
VERSION = '0.1.1'
|
8
|
+
|
9
|
+
attr_reader :block, :request_uuid
|
10
|
+
|
11
|
+
delegate :current, :unset_request_uuid, to: :class
|
12
|
+
|
10
13
|
class << self
|
11
|
-
|
14
|
+
attr_accessor :current
|
15
|
+
|
16
|
+
delegate :request_uuid, :audits, to: :current
|
17
|
+
|
18
|
+
def set_request_uuid(request_uuid = SecureRandom.uuid)
|
19
|
+
Audited.store[:current_request_uuid] = request_uuid
|
20
|
+
end
|
21
|
+
|
22
|
+
def unset_request_uuid
|
23
|
+
Audited.store.delete(:current_request_uuid)
|
24
|
+
end
|
25
|
+
|
26
|
+
def reset
|
27
|
+
unset_request_uuid
|
28
|
+
@current = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def request(&block)
|
32
|
+
raise ArgumentError, 'No block given and no active group' unless block_given?
|
33
|
+
|
34
|
+
new.request(&block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize(request_uuid = SecureRandom.uuid)
|
39
|
+
@request_uuid = request_uuid
|
40
|
+
self.class.current = self
|
41
|
+
end
|
42
|
+
|
43
|
+
def request(&block)
|
44
|
+
set_request_uuid
|
45
|
+
|
46
|
+
block.call if block.present?
|
47
|
+
|
48
|
+
self
|
49
|
+
ensure
|
50
|
+
unset_request_uuid
|
51
|
+
end
|
52
|
+
|
53
|
+
def set_request_uuid
|
54
|
+
self.class.set_request_uuid(request_uuid)
|
55
|
+
end
|
56
|
+
|
57
|
+
def audits
|
58
|
+
Audited::Audit.where(request_uuid: request_uuid)
|
12
59
|
end
|
13
60
|
end
|
data/spec/audit_group_spec.rb
CHANGED
@@ -1,44 +1,108 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
RSpec.describe AuditGroup do
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
describe 'class methods' do
|
3
|
+
describe '.current' do
|
4
|
+
it 'returns the last request created' do
|
5
|
+
request = described_class.request {}
|
6
|
+
expect(described_class.current).to eq(request)
|
7
|
+
end
|
8
|
+
end
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
10
|
+
describe '.set_request_uuid' do
|
11
|
+
it "sets the Audit store's current_request_uuid" do
|
12
|
+
described_class.set_request_uuid('123')
|
13
|
+
expect(Audited.store[:current_request_uuid]).to eq('123')
|
14
|
+
|
15
|
+
described_class.set_request_uuid
|
16
|
+
expect(Audited.store[:current_request_uuid]).to match(/\A\h{8}-\h{4}-\h{4}-\h{4}-\h{12}\z/)
|
17
|
+
end
|
11
18
|
end
|
12
|
-
end
|
13
19
|
|
14
|
-
|
15
|
-
|
16
|
-
|
20
|
+
describe '.unset_request_uuid' do
|
21
|
+
it "resets the Audit store's current_request_uuid" do
|
22
|
+
Audited.store[:current_request_uuid] = '123'
|
23
|
+
described_class.unset_request_uuid
|
24
|
+
expect(Audited.store[:current_request_uuid]).to be_nil
|
25
|
+
end
|
26
|
+
end
|
17
27
|
|
18
|
-
|
28
|
+
describe '.reset' do
|
29
|
+
it 'unsets the request_uuid and current request' do
|
30
|
+
described_class.set_request_uuid('123')
|
31
|
+
described_class.current = 'some request'
|
32
|
+
|
33
|
+
expect(Audited.store[:current_request_uuid]).to eq('123')
|
34
|
+
expect(described_class.current).to eq('some request')
|
35
|
+
|
36
|
+
described_class.reset
|
37
|
+
|
38
|
+
expect(Audited.store[:current_request_uuid]).to be_nil
|
39
|
+
expect(described_class.current).to be_nil
|
40
|
+
end
|
19
41
|
end
|
20
|
-
end
|
21
42
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
43
|
+
describe '.request' do
|
44
|
+
it 'raises an ArgumentError if no block is given and no active group' do
|
45
|
+
expect { described_class.request }.to raise_error(ArgumentError, 'No block given and no active group')
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'creates a new request if block is given' do
|
49
|
+
expect { |block| described_class.request(&block) }.to yield_control
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '.request_uuid' do
|
54
|
+
it 'delegates to current' do
|
55
|
+
described_class.request {}
|
56
|
+
expect(described_class.request_uuid).to eq(described_class.current.request_uuid)
|
57
|
+
end
|
26
58
|
end
|
27
|
-
end
|
28
59
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
60
|
+
describe '.audits' do
|
61
|
+
it 'delegates to current' do
|
62
|
+
described_class.new('123')
|
63
|
+
audited_audit = class_double('Audited::Audit').as_stubbed_const
|
64
|
+
expect(audited_audit).to receive(:where).with(request_uuid: '123').and_return('some audits')
|
65
|
+
expect(described_class.audits).to eq('some audits')
|
66
|
+
end
|
33
67
|
end
|
34
68
|
end
|
35
69
|
|
36
|
-
describe '
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
70
|
+
describe 'instance methods' do
|
71
|
+
describe '#initialize' do
|
72
|
+
it 'sets the request_uuid and current request' do
|
73
|
+
request = described_class.new('123')
|
74
|
+
expect(request.request_uuid).to eq('123')
|
75
|
+
expect(described_class.current).to eq(request)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#request' do
|
80
|
+
it 'sets the current_request_uuid, calls the block, then resets current_request_uuid' do
|
81
|
+
request = described_class.new('123')
|
82
|
+
|
83
|
+
request.request do
|
84
|
+
expect(Audited.store[:current_request_uuid]).to eq('123')
|
85
|
+
end
|
86
|
+
|
87
|
+
expect(Audited.store[:current_request_uuid]).to be_nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#set_request_uuid' do
|
92
|
+
it 'delegates to class' do
|
93
|
+
request = described_class.new('123')
|
94
|
+
expect(request).to receive(:set_request_uuid)
|
95
|
+
request.set_request_uuid
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#audits' do
|
100
|
+
it 'returns audits with request_uuid' do
|
101
|
+
request = described_class.new('123')
|
102
|
+
audited_audit = class_double('Audited::Audit').as_stubbed_const
|
103
|
+
expect(audited_audit).to receive(:where).with(request_uuid: '123').and_return('some audits')
|
104
|
+
expect(request.audits).to eq('some audits')
|
105
|
+
end
|
42
106
|
end
|
43
107
|
end
|
44
108
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omg-audit-group
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Greenfield
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -61,11 +61,9 @@ files:
|
|
61
61
|
- ".gitignore"
|
62
62
|
- ".rspec"
|
63
63
|
- README.md
|
64
|
+
- Rakefile
|
64
65
|
- audit_group.gemspec
|
65
66
|
- lib/audit_group.rb
|
66
|
-
- lib/audit_group/request.rb
|
67
|
-
- lib/audit_group/version.rb
|
68
|
-
- spec/audit_group/request_spec.rb
|
69
67
|
- spec/audit_group_spec.rb
|
70
68
|
- spec/spec_helper.rb
|
71
69
|
homepage: https://github.com/omgreenfield/omg-util/tree/main/audit_group
|
data/lib/audit_group/request.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'active_support/all'
|
2
|
-
require 'audited'
|
3
|
-
require 'pry-byebug'
|
4
|
-
|
5
|
-
module AuditGroup
|
6
|
-
class Request
|
7
|
-
attr_reader :block, :request_uuid
|
8
|
-
|
9
|
-
delegate :current, :unset_request_uuid, to: :class
|
10
|
-
|
11
|
-
class << self
|
12
|
-
delegate :request_uuid, :audits, to: :current
|
13
|
-
|
14
|
-
attr_accessor :current
|
15
|
-
|
16
|
-
def set_request_uuid(request_uuid = SecureRandom.uuid)
|
17
|
-
Audited.store[:current_request_uuid] = request_uuid
|
18
|
-
end
|
19
|
-
|
20
|
-
def unset_request_uuid
|
21
|
-
Audited.store.delete(:current_request_uuid)
|
22
|
-
end
|
23
|
-
|
24
|
-
def reset
|
25
|
-
unset_request_uuid
|
26
|
-
@current = nil
|
27
|
-
end
|
28
|
-
|
29
|
-
def request(&block)
|
30
|
-
raise ArgumentError, 'No block given and no active group' unless block_given?
|
31
|
-
|
32
|
-
new.request(&block)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def initialize(request_uuid = SecureRandom.uuid)
|
37
|
-
@request_uuid = request_uuid
|
38
|
-
self.class.current = self
|
39
|
-
end
|
40
|
-
|
41
|
-
def request(&block)
|
42
|
-
set_request_uuid
|
43
|
-
|
44
|
-
block.call if block.present?
|
45
|
-
|
46
|
-
self
|
47
|
-
ensure
|
48
|
-
unset_request_uuid
|
49
|
-
end
|
50
|
-
|
51
|
-
def set_request_uuid
|
52
|
-
self.class.set_request_uuid(request_uuid)
|
53
|
-
end
|
54
|
-
|
55
|
-
def audits
|
56
|
-
Audited::Audit.where(request_uuid: request_uuid)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/lib/audit_group/version.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
require 'audit_group/request'
|
2
|
-
|
3
|
-
RSpec.describe AuditGroup::Request do
|
4
|
-
describe 'class methods' do
|
5
|
-
describe '.current' do
|
6
|
-
it 'returns the last request created' do
|
7
|
-
request = described_class.request {}
|
8
|
-
expect(described_class.current).to eq(request)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
describe '.set_request_uuid' do
|
13
|
-
it "sets the Audit store's current_request_uuid" do
|
14
|
-
described_class.set_request_uuid('123')
|
15
|
-
expect(Audited.store[:current_request_uuid]).to eq('123')
|
16
|
-
|
17
|
-
described_class.set_request_uuid
|
18
|
-
expect(Audited.store[:current_request_uuid]).to match(/\A\h{8}-\h{4}-\h{4}-\h{4}-\h{12}\z/)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe '.unset_request_uuid' do
|
23
|
-
it "resets the Audit store's current_request_uuid" do
|
24
|
-
Audited.store[:current_request_uuid] = '123'
|
25
|
-
described_class.unset_request_uuid
|
26
|
-
expect(Audited.store[:current_request_uuid]).to be_nil
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe '.reset' do
|
31
|
-
it 'unsets the request_uuid and current request' do
|
32
|
-
described_class.set_request_uuid('123')
|
33
|
-
described_class.current = 'some request'
|
34
|
-
|
35
|
-
expect(Audited.store[:current_request_uuid]).to eq('123')
|
36
|
-
expect(described_class.current).to eq('some request')
|
37
|
-
|
38
|
-
described_class.reset
|
39
|
-
|
40
|
-
expect(Audited.store[:current_request_uuid]).to be_nil
|
41
|
-
expect(described_class.current).to be_nil
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '.request' do
|
46
|
-
it 'raises an ArgumentError if no block is given and no active group' do
|
47
|
-
expect { described_class.request }.to raise_error(ArgumentError, 'No block given and no active group')
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'creates a new request if block is given' do
|
51
|
-
expect { |block| described_class.request(&block) }.to yield_control
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe '.request_uuid' do
|
56
|
-
it 'delegates to current' do
|
57
|
-
described_class.request {}
|
58
|
-
expect(described_class.request_uuid).to eq(described_class.current.request_uuid)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe '.audits' do
|
63
|
-
it 'delegates to current' do
|
64
|
-
described_class.new('123')
|
65
|
-
audited_audit = class_double('Audited::Audit').as_stubbed_const
|
66
|
-
expect(audited_audit).to receive(:where).with(request_uuid: '123').and_return('some audits')
|
67
|
-
expect(described_class.audits).to eq('some audits')
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
describe 'instance methods' do
|
73
|
-
describe '#initialize' do
|
74
|
-
it 'sets the request_uuid and current request' do
|
75
|
-
request = described_class.new('123')
|
76
|
-
expect(request.request_uuid).to eq('123')
|
77
|
-
expect(described_class.current).to eq(request)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe '#request' do
|
82
|
-
it 'sets the current_request_uuid, calls the block, then resets current_request_uuid' do
|
83
|
-
request = described_class.new('123')
|
84
|
-
|
85
|
-
request.request do
|
86
|
-
expect(Audited.store[:current_request_uuid]).to eq('123')
|
87
|
-
end
|
88
|
-
|
89
|
-
expect(Audited.store[:current_request_uuid]).to be_nil
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe '#set_request_uuid' do
|
94
|
-
it 'delegates to class' do
|
95
|
-
request = described_class.new('123')
|
96
|
-
expect(request).to receive(:set_request_uuid)
|
97
|
-
request.set_request_uuid
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe '#audits' do
|
102
|
-
it 'returns audits with request_uuid' do
|
103
|
-
request = described_class.new('123')
|
104
|
-
audited_audit = class_double('Audited::Audit').as_stubbed_const
|
105
|
-
expect(audited_audit).to receive(:where).with(request_uuid: '123').and_return('some audits')
|
106
|
-
expect(request.audits).to eq('some audits')
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|