effective_logging 3.5.4 → 4.1.0

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: 5b0d07832764f1aca2982e520809195ae26b36c947b04b15f4ae5318ec74b4f7
4
- data.tar.gz: 507ff8215257de3ce69a6ded010f18ec123469b111b8cb74f426263cec3e43ac
3
+ metadata.gz: 1e01f3b3cf8eef9efac4f4632689436b4af1a306d404751c8bb7ef3a4b0bfaac
4
+ data.tar.gz: d202700416cfc326a4629308efe158a22f86ced2b338cf73992ec4b711991fb7
5
5
  SHA512:
6
- metadata.gz: d11842ba982615466b169a5415bed591f7e025cd912a94c0dc1ee4f105ea15b191833a73e78e6e406206c57de9456c5e12c6bc62961c5cb106fd24b4a5677446
7
- data.tar.gz: 7f270c7159f350a5de6db15f30e42665a541dd060747a967078212dc4f39b2036ff21b218c209c3d72f14667d26db62c6825fbd7a0493ca0ac2240166935b95f
6
+ metadata.gz: 6e8bc213d1d252c3f1b52af723f4ff49f134d159bc1d48f4e6213e75257596c0426dc7b2e0f319b047436662bd93a71deadc271a31dac91a26fb2e45ec954149
7
+ data.tar.gz: 6ce20cf20608edc2aba0c6145c44cb8ee7cbddc02b39324852f632763b2553fe4d553e9345249fe12917a38b33c91819fe980364222120be1d4b1be9c83daa00
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
- self.table_name = EffectiveLogging.logs_table_name.to_s
6
-
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
3
+ self.table_name = (EffectiveLogging.logs_table_name || :logs).to_s
66
4
 
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),
@@ -1,6 +1,6 @@
1
1
  EffectiveLogging.setup do |config|
2
- # Configure Database Tables
3
- config.logs_table_name = :logs
2
+ # Specify Log class
3
+ # config.log_class_name = 'Effective::Log'
4
4
 
5
5
  # Admin Screens Layout Settings
6
6
  # config.layout = { application: 'application', admin: 'admin' }
@@ -0,0 +1,34 @@
1
+ class CreateEffectiveLogging < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :logs do |t|
4
+ t.string :status
5
+
6
+ t.string :user_type
7
+ t.integer :user_id
8
+
9
+ t.string :changes_to_type
10
+ t.integer :changes_to_id
11
+
12
+ t.string :associated_type
13
+ t.integer :associated_id
14
+ t.string :associated_to_s
15
+
16
+ t.text :message
17
+ t.text :details
18
+
19
+ t.timestamps
20
+ end
21
+
22
+ add_index :logs, :id, order: { id: :desc }
23
+ add_index :logs, :updated_at
24
+ add_index :logs, :user_id
25
+ add_index :logs, :status
26
+ add_index :logs, :associated_to_s
27
+ add_index :logs, [:associated_type, :associated_id]
28
+ add_index :logs, [:changes_to_type, :changes_to_id]
29
+
30
+ enable_extension('pg_trgm')
31
+ add_index :logs, :message, using: :gin, opclass: :gin_trgm_ops
32
+ add_index :logs, :details, using: :gin, opclass: :gin_trgm_ops
33
+ end
34
+ end
@@ -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),
@@ -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.4'.freeze
2
+ VERSION = '4.1.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 = [
@@ -20,9 +20,7 @@ module EffectiveLogging
20
20
  end
21
21
 
22
22
  def create_migration_file
23
- @logs_table_name = ':' + EffectiveLogging.logs_table_name.to_s
24
-
25
- migration_template ('../' * 3) + 'db/migrate/01_create_effective_logging.rb.erb', 'db/migrate/create_effective_logging.rb'
23
+ migration_template ('../' * 3) + 'db/migrate/101_create_effective_logging.rb', 'db/migrate/create_effective_logging.rb'
26
24
  end
27
25
  end
28
26
  end
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.4
4
+ version: 4.1.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-06-29 00:00:00.000000000 Z
11
+ date: 2023-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -80,6 +80,90 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sqlite3
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: devise
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: effective_test_bot
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: effective_developer
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: psych
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "<"
158
+ - !ruby/object:Gem::Version
159
+ version: '4'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "<"
165
+ - !ruby/object:Gem::Version
166
+ version: '4'
83
167
  description: Automatically log all sent emails, user logins, and page views. This
84
168
  also will log custom events from Ruby and JavaScript.
85
169
  email:
@@ -94,10 +178,12 @@ files:
94
178
  - app/assets/javascripts/effective_logging/effective_logger.js.coffee.erb
95
179
  - app/controllers/admin/logs_controller.rb
96
180
  - app/controllers/effective/logs_controller.rb
181
+ - app/datatables/admin/effective_logs_datatable.rb
97
182
  - app/datatables/effective_log_changes_datatable.rb
98
183
  - app/datatables/effective_logs_datatable.rb
99
184
  - app/helpers/effective_logging_helper.rb
100
185
  - app/models/concerns/acts_as_loggable.rb
186
+ - app/models/concerns/effective_logging_log.rb
101
187
  - app/models/effective/log.rb
102
188
  - app/models/effective_logger.rb
103
189
  - app/views/admin/logs/_layout.html.haml
@@ -109,7 +195,7 @@ files:
109
195
  - app/views/effective/logs/show.html.haml
110
196
  - config/effective_logging.rb
111
197
  - config/routes.rb
112
- - db/migrate/01_create_effective_logging.rb.erb
198
+ - db/migrate/101_create_effective_logging.rb
113
199
  - lib/effective_logging.rb
114
200
  - lib/effective_logging/active_record_logger.rb
115
201
  - lib/effective_logging/active_storage_logger.rb
@@ -139,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
225
  - !ruby/object:Gem::Version
140
226
  version: '0'
141
227
  requirements: []
142
- rubygems_version: 3.4.10
228
+ rubygems_version: 3.3.7
143
229
  signing_key:
144
230
  specification_version: 4
145
231
  summary: Automatically log all sent emails, user logins, and page views. This also
@@ -1,38 +0,0 @@
1
- class CreateEffectiveLogging < ActiveRecord::Migration[4.2]
2
- def self.up
3
- create_table <%= @logs_table_name %> do |t|
4
- t.string :status
5
-
6
- t.string :user_type
7
- t.integer :user_id
8
-
9
- t.string :changes_to_type
10
- t.integer :changes_to_id
11
-
12
- t.string :associated_type
13
- t.integer :associated_id
14
- t.string :associated_to_s
15
-
16
- t.text :message
17
- t.text :details
18
-
19
- t.timestamps
20
- end
21
-
22
- add_index <%= @logs_table_name %>, :id, order: { id: :desc }
23
- add_index <%= @logs_table_name %>, :updated_at
24
- add_index <%= @logs_table_name %>, :user_id
25
- add_index <%= @logs_table_name %>, :status
26
- add_index <%= @logs_table_name %>, :associated_to_s
27
- add_index <%= @logs_table_name %>, [:associated_type, :associated_id]
28
- add_index <%= @logs_table_name %>, [:changes_to_type, :changes_to_id]
29
-
30
- enable_extension('pg_trgm')
31
- add_index <%= @logs_table_name %>, :message, using: :gin, opclass: :gin_trgm_ops
32
- add_index <%= @logs_table_name %>, :details, using: :gin, opclass: :gin_trgm_ops
33
- end
34
-
35
- def self.down
36
- drop_table <%= @logs_table_name %>
37
- end
38
- end