omg-audit-group 0.1.0 → 0.1.2

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
2
  SHA256:
3
- metadata.gz: 4aefcd1c0eb006272723f7ed68f14cd719e6480d833e9354730ee42340d6b814
4
- data.tar.gz: 418949a9ea417499e1ff0566f1255940c273bcc5404311bfd4352eecc34b3196
3
+ metadata.gz: c0c376f111fedecd658dac64a321545b036c3a672cb8a7b4e8f6c443a90fbe74
4
+ data.tar.gz: d8c9fa53d36b22ef3b57c41bf11a73131e6c90ac8e011c45604b155025db7251
5
5
  SHA512:
6
- metadata.gz: 1ef815f6b87adb3fe2df279b84dd94a7ff48f8075fa2e91292680b270bec764ff1800b38b90523d02c7f5ed92d936fcdc95bf56548a454f4e899ad9e47672f29
7
- data.tar.gz: 7ce8a2a142907e59690af0cf912302aed6fe607cefd1b133b43520517a68dd1049845d6ef32155c73c088eaebe7ab4011899e3ed859ec48c8934567f788b2299
6
+ metadata.gz: 50c5f348251c2c296f3f778eb3704992b2c459926c0f4814e8a13cba5906a90349844037316aa682840518ca990312d5317ab2efaef40423fd5c41f27cb5d5fa
7
+ data.tar.gz: 9f49b04443555acd365e821367d378b63e832a76e16b8cf86d82a5dcfcca2d4356323330fe67712d40820676c8cda8f935d5d92547a225cc82847486a73bea09
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
- gem build audit_group.gemspec
33
+ rake build
15
34
 
16
35
  # Install gem
17
- gem i -l /path/to/this/repo/omg-audit_group-0.1.0.gem
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
- Here are some use cases:
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 (the above also returns it)
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
@@ -0,0 +1,17 @@
1
+ require_relative 'lib/audit_group'
2
+
3
+ require 'rake'
4
+
5
+ task :spec do
6
+ sh 'bundle exec rspec'
7
+ end
8
+
9
+ task :build do
10
+ sh 'gem build audit_group.gemspec'
11
+ end
12
+
13
+ task :push do
14
+ sh "gem push omg-audit-group-#{AuditGroup::VERSION}.gem"
15
+ end
16
+
17
+ task :publish => :push
data/audit_group.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/audit_group/version'
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
- module AuditGroup
6
+ class AuditGroup
7
+ VERSION = '0.1.2'
8
+
9
+ attr_reader :block, :request_uuid
10
+
11
+ delegate :current, :unset_request_uuid, to: :class
12
+
10
13
  class << self
11
- delegate :new, :request, :current, :request_uuid, :audits, to: Request
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
@@ -1,44 +1,108 @@
1
- # frozen_string_literal: true
2
-
3
1
  RSpec.describe AuditGroup do
4
- it 'has a version number' do
5
- expect(AuditGroup::VERSION).not_to be_nil
6
- end
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
- describe '.new' do
9
- it 'delegates to Request' do
10
- expect(AuditGroup.new).to be_a(AuditGroup::Request)
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
- describe '.request' do
15
- it 'creates a new Request' do
16
- request = AuditGroup.request { puts 'Hi, Mom!' }
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
- expect(request).to be_a(AuditGroup::Request)
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
- describe '.current' do
23
- it 'returns the last created Request object' do
24
- request = AuditGroup.request { puts 'Hi, Dad!' }
25
- expect(AuditGroup.current).to eq(request)
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
- describe '.request_uuid' do
30
- it 'returns the current request_uuid' do
31
- request = AuditGroup.request { puts 'Hi, Steve!' }
32
- expect(AuditGroup.request_uuid).to eq(request.request_uuid)
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 '.audits' do
37
- it 'delegates to Request' do
38
- AuditGroup.request { puts "Who's Steve?" }
39
- audited_audit = class_double('Audited::Audit').as_stubbed_const
40
- expect(audited_audit).to receive(:where).with(request_uuid: an_instance_of(String)).and_return('some audits')
41
- expect(AuditGroup.audits).to eq('some audits')
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
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "audit_group"
3
+ require 'audit_group'
4
4
 
5
5
  RSpec.configure do |config|
6
6
  # Enable flags like --only-failures and --next-failure
7
- config.example_status_persistence_file_path = ".rspec_status"
7
+ config.example_status_persistence_file_path = '.rspec_status'
8
8
 
9
9
  # Disable RSpec exposing methods globally on `Module` and `main`
10
10
  config.disable_monkey_patching!
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.0
4
+ version: 0.1.2
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-04-19 00:00:00.000000000 Z
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
@@ -89,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
87
  - !ruby/object:Gem::Version
90
88
  version: '0'
91
89
  requirements: []
92
- rubygems_version: 3.5.9
90
+ rubygems_version: 3.5.10
93
91
  signing_key:
94
92
  specification_version: 4
95
93
  summary: Groups transactions from the `audited` gem into a single request_uuid
@@ -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
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AuditGroup
4
- VERSION = "0.1.0"
5
- end
@@ -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