effective_logging 3.5.3 → 4.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 29a2f35841f2c300e99ba671235f38282574392f3e0ad58ac1a4b19e78603f51
4
- data.tar.gz: 3460cc2ed8dcac7975fe8fe18ed1d111c121499bb540ce1ba587d9420f8d888c
3
+ metadata.gz: 07b93fb924886c7eb67bebfa52af0ebba0955dcf70f882631b20b6c8d1ad4561
4
+ data.tar.gz: af822e66e051e26100da80e9edab36e0c3665922924fadae8d2d8a9f0a34eed4
5
5
  SHA512:
6
- metadata.gz: a73c5c23e02b3e230e343f32d185231ad30ac8ec2282cea0481d1943c3b7c8887c7245d09e118f946822aac38e175992450be9d12971fdc68fa1bab65d8b6fc3
7
- data.tar.gz: dff10915122c29bf7adc3585550721dcd2ee913c32d9bf7f7443774c44ed367096f227cf0a5e2a6fd0c582f523e2ddcd203323a214836281f6dff41beeef4f2a
6
+ metadata.gz: 39fca8a1eb4fe170a48c4e588d711cdee34cbd5999f05220a905e308e346ce80c2ece0bb840b480d67c11f43cd7f5215c009e32f1e13bf15c3526dab20a790f8
7
+ data.tar.gz: aff176f1e23569d3f91a6e3b9c59bf3d8636efb753ae32dee906937db304769230762f85df3ef986cfc6b461c3251233e2affe8c6cd5887fd249b7167a0656fc
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2021 Code and Effect Inc.
1
+ Copyright 2023 Code and Effect Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -254,7 +254,7 @@ First, require the javascript in your application.js:
254
254
  and add the user permission:
255
255
 
256
256
  ```ruby
257
- can :create, Effective::Log
257
+ can :create, EffectiveLogging.Log
258
258
  ```
259
259
 
260
260
  then logging an event from JavaScript is almost the same one-liner as from ruby:
@@ -290,7 +290,7 @@ link_to 'Logs', effective_logging.admin_logs_path # /admin/logs
290
290
  But you may need to add the permission (using CanCan):
291
291
 
292
292
  ```ruby
293
- can :manage, Effective::Log
293
+ can :manage, EffectiveLoggging.Log
294
294
  can :admin, :effective_logging
295
295
  ```
296
296
 
@@ -6,6 +6,9 @@ module Admin
6
6
  include Effective::CrudController
7
7
  skip_log_page_views
8
8
 
9
+ resource_scope -> { EffectiveLogging.Log.deep.all }
10
+ datatable -> { Admin::EffectiveLogsDatatable.new }
11
+
9
12
  if (config = EffectiveLogging.layout)
10
13
  layout(config.kind_of?(Hash) ? config[:admin] : config)
11
14
  end
@@ -5,15 +5,17 @@ module Effective
5
5
  include Effective::CrudController
6
6
  skip_log_page_views
7
7
 
8
+ resource_scope -> { EffectiveLogging.Log.all }
9
+
8
10
  if (config = EffectiveLogging.layout)
9
11
  layout(config.kind_of?(Hash) ? config[:application] : config)
10
12
  end
11
13
 
12
14
  # This is a post from our Javascript
13
15
  def create
14
- EffectiveResources.authorize!(self, :create, Effective::Log.new)
16
+ EffectiveResources.authorize!(self, :create, resource_scope.new)
15
17
 
16
- @log = Effective::Log.new.tap do |log|
18
+ @log = resource_scope.new.tap do |log|
17
19
  log.message = log_params[:message]
18
20
  log.status = EffectiveLogging.statuses.find { |status| status == log_params[:status] } || 'info'
19
21
  log.user = EffectiveLogging.current_user || current_user
@@ -40,12 +42,12 @@ module Effective
40
42
 
41
43
  # This is the User index event
42
44
  def index
43
- EffectiveResources.authorize!(self, :index, Effective::Log.new(user_id: current_user.id))
45
+ EffectiveResources.authorize!(self, :index, resource_scope.new(user: current_user, user_id: current_user.id))
44
46
  @datatable = EffectiveLogsDatatable.new(self, for: current_user.id)
45
47
  end
46
48
 
47
49
  def html_part
48
- @log = Effective::Log.find(params[:id])
50
+ @log = resource_scope.find(params[:id])
49
51
 
50
52
  EffectiveResources.authorize!(self, :show, @log)
51
53
 
@@ -0,0 +1,2 @@
1
+ class Admin::EffectiveLogsDatatable < EffectiveLogsDatatable
2
+ end
@@ -37,7 +37,7 @@ class EffectiveLogChangesDatatable < Effective::Datatable
37
37
  # A nil attributes[:log_id] means give me all the top level log entries
38
38
  # If we set a log_id then it's for sub logs
39
39
  collection do
40
- Effective::Log.logged_changes.deep
40
+ EffectiveLogging.Log.logged_changes.deep
41
41
  .where(changes_to_type: attributes[:changes_to_type], changes_to_id: attributes[:changes_to_id])
42
42
  end
43
43
 
@@ -42,7 +42,7 @@ class EffectiveLogsDatatable < Effective::Datatable
42
42
  # A nil attributes[:log_id] means give me all the top level log entries
43
43
  # If we set a log_id then it's for sub logs
44
44
  collection do
45
- scope = Effective::Log.deep.all
45
+ scope = EffectiveLogging.Log.deep.all
46
46
 
47
47
  # Older syntax, pass by integer
48
48
  if attributes[:for]
@@ -20,7 +20,7 @@ module ActsAsLoggable
20
20
  end
21
21
 
22
22
  included do
23
- has_many :logged_changes, -> { order(:id).where(status: EffectiveLogging.log_changes_status) }, as: :changes_to, class_name: 'Effective::Log'
23
+ has_many :logged_changes, -> { EffectiveLogging.Log.order(:id).where(status: EffectiveLogging.log_changes_status) }, as: :changes_to
24
24
 
25
25
  log_changes_options = {
26
26
  to: @acts_as_loggable_options[:to],
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ # EffectiveLoggingLog
4
+ #
5
+ # Mark your log model with effective_logging_log to get all the includes
6
+
7
+ module EffectiveLoggingLog
8
+ extend ActiveSupport::Concern
9
+
10
+ module Base
11
+ def effective_logging_log
12
+ include ::EffectiveLoggingLog
13
+ end
14
+ end
15
+
16
+ module ClassMethods
17
+ def effective_logging_log?; true; end
18
+ end
19
+
20
+ included do
21
+ self.table_name = (EffectiveLogging.logs_table_name || :logs).to_s
22
+
23
+ belongs_to :user, polymorphic: true, optional: true
24
+ belongs_to :changes_to, polymorphic: true, optional: true # This is the log_changes to: option
25
+ belongs_to :associated, polymorphic: true, optional: true
26
+
27
+ effective_resource do
28
+ status :string
29
+
30
+ changes_to_type :string
31
+ changes_to_id :string
32
+
33
+ associated_type :string
34
+ associated_id :integer
35
+ associated_to_s :string
36
+
37
+ message :text
38
+ details :text
39
+
40
+ timestamps
41
+ end
42
+
43
+ serialize :details, Hash
44
+
45
+ validates :message, presence: true
46
+ validates :status, presence: true
47
+
48
+ validate(if: -> { status.present? }) do
49
+ errors.add(:status, "is not included") unless EffectiveLogging.statuses.include?(status)
50
+ end
51
+
52
+ scope :deep, -> { includes(:user, :associated, :changes_to) }
53
+ scope :sorted, -> { order(:id) }
54
+ scope :logged_changes, -> { where(status: EffectiveLogging.log_changes_status) }
55
+ scope :changes, -> { where(status: EffectiveLogging.log_changes_status) }
56
+
57
+ # Dynamically add logging methods based on the defined statuses
58
+ # EffectiveLogging.info 'my message'
59
+ (EffectiveLogging.statuses || []).each do |status|
60
+ send(:define_method, status) { |message, options={}| log(message, status, options) }
61
+ end
62
+
63
+ end
64
+
65
+ # Instance Methods
66
+ def to_s
67
+ "#{model_name.human} ##{id}"
68
+ end
69
+
70
+ def associated_to_s=(value)
71
+ super(value.to_s[0...255].presence) # Take only first 255 characters
72
+ end
73
+
74
+ def log(message, status = nil, options = {})
75
+ status ||= EffectiveLogging.statuses.first
76
+ EffectiveLogger.log(message, status, options)
77
+ end
78
+
79
+ def details
80
+ self[:details] || {}
81
+ end
82
+
83
+ def next_log
84
+ self.class.order(id: :asc).where('id > ?', id).first
85
+ end
86
+
87
+ def prev_log
88
+ self.class.order(id: :desc).where('id < ?', id).first
89
+ end
90
+
91
+ end
@@ -1,68 +1,7 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Effective
4
2
  class Log < ActiveRecord::Base
5
3
  self.table_name = EffectiveLogging.logs_table_name.to_s
6
4
 
7
- belongs_to :user, polymorphic: true, optional: true
8
- belongs_to :changes_to, polymorphic: true, optional: true # This is the log_changes to: option
9
- belongs_to :associated, polymorphic: true, optional: true
10
-
11
- effective_resource do
12
- status :string
13
-
14
- changes_to_type :string
15
- changes_to_id :string
16
-
17
- associated_type :string
18
- associated_id :integer
19
- associated_to_s :string
20
-
21
- message :text
22
- details :text
23
-
24
- timestamps
25
- end
26
-
27
- serialize :details, Hash
28
-
29
- validates :message, presence: true
30
- validates :status, presence: true, inclusion: { in: EffectiveLogging.statuses }
31
-
32
- scope :deep, -> { includes(:user, :associated) }
33
- scope :sorted, -> { order(:id) }
34
- scope :logged_changes, -> { where(status: EffectiveLogging.log_changes_status) }
35
- scope :changes, -> { where(status: EffectiveLogging.log_changes_status) }
36
-
37
- def to_s
38
- "Log #{id}"
39
- end
40
-
41
- def associated_to_s=(value)
42
- super(value.to_s[0...255].presence) # Take only first 255 characters
43
- end
44
-
45
- def log(message, status = EffectiveLogging.statuses.first, options = {})
46
- EffectiveLogger.log(message, status, options)
47
- end
48
-
49
- def details
50
- self[:details] || {}
51
- end
52
-
53
- def next_log
54
- Log.order(id: :asc).where('id > ?', id).first
55
- end
56
-
57
- def prev_log
58
- Log.order(id: :desc).where('id < ?', id).first
59
- end
60
-
61
- # Dynamically add logging methods based on the defined statuses
62
- # EffectiveLogging.info 'my message'
63
- (EffectiveLogging.statuses || []).each do |status|
64
- send(:define_method, status) { |message, options={}| log(message, status, options) }
65
- end
66
-
5
+ effective_logging_log
67
6
  end
68
7
  end
@@ -24,7 +24,7 @@ class EffectiveLogger
24
24
  options[:user_agent] ||= request.user_agent
25
25
  end
26
26
 
27
- log = Effective::Log.new(
27
+ log = EffectiveLogging.Log.new(
28
28
  message: message,
29
29
  status: status,
30
30
  user_id: options.delete(:user_id),
@@ -2,6 +2,9 @@ EffectiveLogging.setup do |config|
2
2
  # Configure Database Tables
3
3
  config.logs_table_name = :logs
4
4
 
5
+ # Specify Log class
6
+ # config.log_class_name = 'Effective::Log'
7
+
5
8
  # Admin Screens Layout Settings
6
9
  # config.layout = { application: 'application', admin: 'admin' }
7
10
 
@@ -43,7 +43,7 @@ module EffectiveLogging
43
43
  end
44
44
 
45
45
  def log(message, details)
46
- Effective::Log.create!(
46
+ EffectiveLogging.Log.create!(
47
47
  changes_to: log_changes_to,
48
48
  associated: object,
49
49
  associated_to_s: (object.to_s rescue nil),
@@ -51,17 +51,13 @@ module EffectiveLogging
51
51
  private
52
52
 
53
53
  def self.log_email(message, fields, user_klass)
54
- tos = Array(message.to) - [nil, '']
54
+ tos = (Array(message.to) + Array(message.cc)) - [nil, '']
55
55
 
56
56
  tos.each do |to|
57
57
  user = (user_klass.where(email: to.downcase).first if user_klass.present?)
58
+ details = fields.merge(to: to, user: user)
58
59
 
59
- user_fields = fields.merge(to: to, user: user)
60
- ::EffectiveLogger.email("#{message.subject} - #{tos.join(', ')}", user_fields)
61
- end
62
-
63
- if tos.blank? && (message.cc.present? || message.bcc.present?)
64
- ::EffectiveLogger.email("#{message.subject} - multiple recipients", fields)
60
+ ::EffectiveLogger.email("#{message.subject} - #{to}", details)
65
61
  end
66
62
 
67
63
  true
@@ -28,6 +28,7 @@ module EffectiveLogging
28
28
  app.config.to_prepare do
29
29
  ActiveSupport.on_load :active_record do
30
30
  ActiveRecord::Base.extend(ActsAsLoggable::Base)
31
+ ActiveRecord::Base.extend(EffectiveLoggingLog::Base)
31
32
  end
32
33
  end
33
34
  end
@@ -1,3 +1,3 @@
1
1
  module EffectiveLogging
2
- VERSION = '3.5.3'.freeze
2
+ VERSION = '4.0.0'.freeze
3
3
  end
@@ -6,12 +6,17 @@ module EffectiveLogging
6
6
  def self.config_keys
7
7
  [
8
8
  :logs_table_name, :layout, :additional_statuses,
9
+ :log_class_name,
9
10
  :active_storage_enabled, :email_enabled, :sign_in_enabled, :sign_out_enabled
10
11
  ]
11
12
  end
12
13
 
13
14
  include EffectiveGem
14
15
 
16
+ def self.Log
17
+ log_class_name&.constantize || Effective::Log
18
+ end
19
+
15
20
  def self.statuses
16
21
  @statuses ||= (
17
22
  base = [
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_logging
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.3
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-29 00:00:00.000000000 Z
11
+ date: 2023-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -94,10 +94,12 @@ files:
94
94
  - app/assets/javascripts/effective_logging/effective_logger.js.coffee.erb
95
95
  - app/controllers/admin/logs_controller.rb
96
96
  - app/controllers/effective/logs_controller.rb
97
+ - app/datatables/admin/effective_logs_datatable.rb
97
98
  - app/datatables/effective_log_changes_datatable.rb
98
99
  - app/datatables/effective_logs_datatable.rb
99
100
  - app/helpers/effective_logging_helper.rb
100
101
  - app/models/concerns/acts_as_loggable.rb
102
+ - app/models/concerns/effective_logging_log.rb
101
103
  - app/models/effective/log.rb
102
104
  - app/models/effective_logger.rb
103
105
  - app/views/admin/logs/_layout.html.haml
@@ -139,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
141
  - !ruby/object:Gem::Version
140
142
  version: '0'
141
143
  requirements: []
142
- rubygems_version: 3.1.2
144
+ rubygems_version: 3.4.10
143
145
  signing_key:
144
146
  specification_version: 4
145
147
  summary: Automatically log all sent emails, user logins, and page views. This also