cruft_tracker 0.2.0 → 0.2.1

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: 20710aba981f3164c44b99d0aa870650f19aac7a64b31b8b866655a479dae74c
4
- data.tar.gz: 3a4b8fec7d399446a31aef44d77a8fc35e8affc209370393fc3d6bae9037f95b
3
+ metadata.gz: c9a8291697321237133216a66cb9d58b1e526fe537dddd05644c1fafeaaafb36
4
+ data.tar.gz: 4ff9fe36c9efd852b03dfc45b7511a74f08f6d92687582ca1316dd8a992031e2
5
5
  SHA512:
6
- metadata.gz: ad71fc2c540815704899075e337d1c5030165911441befb63d8432689b258e56319c111a3b9dc445eaa67c1e2486dd9bb1af80a82270bfc74c7a523354bf9a5a
7
- data.tar.gz: a2d602fa9a427d8c457e38379c8e03707a3d8b58fe4497dbaea8b0e1c3493812dae652c8843645cb42deb430798c67fdcd2213f3491afda1625c3284f97951fe
6
+ metadata.gz: 7151e6f098431af83070f860877bf3a7e7446b3b13ba0116c56cf5b6b77bf023282c602bf78e1cca181e5cef25ac3e27fac6b2a95ca45d9c1e69b01652efea5b
7
+ data.tar.gz: bebf3b0e9acbaaf3f4b60753903f48cd548b9e935061c6a28333e8b53eaff8f2099e0d5ff34234864c257c7110b8ce6a7ad75d3e0cae84bd23e264118ee652d8
data/README.md CHANGED
@@ -59,7 +59,7 @@ class SomeOldClass
59
59
  end
60
60
  ```
61
61
 
62
- You're unsure if the `some_old_method` method is actually being used. All you need to do is add an instance of the `is_this_method_used? ` to the CruftTracker initializer. This method requires you to pass the class constant and a symbol to identify the name of the method to track. For example:
62
+ You're unsure if the `some_old_method` method is actually being used. All you need to do is add an instance of the `is_this_method_used? ` to the CruftTracker initializer. This method requires you to pass the class constant and a symbol to identify the name of the method to track. For example:
63
63
 
64
64
  ```ruby
65
65
  # config/initializers/cruft_tracker.rb
@@ -445,7 +445,7 @@ When the view is actually rendered, CruftTracker will collect information about
445
445
  | ---- | ------- | -------------------------------- | -------------- | ------------ | ---------------------- | ------------ | ----------- | ------------------- | ------------------- |
446
446
  | 1 | 1 | 98cc3bd79cf6f3606c5afe3b9faf925b | SomeController | do_something | /foo/:id/bar(.:format) | [{...}] | 1 | 2022-07-06 15:29:06 | 2022-07-06 15:29:06 |
447
447
 
448
- This record is represented by the `CruftTracker::ViewRender` model and can be loaded in the usual ways. You can also access it from a specific view record. EG: `CruftTracker::View.find(1).view_renders`, which will return an association of unique renders.
448
+ This record is represented by the `CruftTracker::ViewRender` model and can be loaded in the usual ways. You can also access it from a specific view record. EG: `CruftTracker::View.find(1).view_renders`, which will return an association of unique renders.
449
449
 
450
450
  There's a lot packed into that record. Let's disect it:
451
451
 
@@ -531,6 +531,34 @@ A word of caution: don't track ever variable. Variables are, by definition, vari
531
531
 
532
532
  CruftTacker automatically cleans up after itself. ✨🧹 If you remove any configured tracking, CruftTracker will recognize this when your application starts up and mark the associated `cruft_tracker_methods` record as deleted.
533
533
 
534
+ ## Configuration
535
+
536
+ Imagine a scenario where you have a method or view that is used in many places, or maybe as a result of metaprogramming. Perhaps you have some logic that is user-configurable and might lead to a tracked method being called with any number of backtraces. It's not super helpful to track all possible backtraces and it's actively bad, since it wastes space in your database and slows down queries. Besides, it's no fun drinking from the firehose.
537
+
538
+ CruftTracker provides a few configurable settings to control the amount of data recorded in some of its tables.
539
+
540
+ | Name | Default | Description |
541
+ | ------------------------------------------------ | ------- | ------------------------------------------------------------ |
542
+ | `max_argument_variations_per_tracked_method` | 50 | Sets the maximum number of distinct arguments that can be recorded for any tracked method. |
543
+ | `max_backtrace_variations_per_tracked_method` | 50 | Sets the maximum number of distinct backtraces that can be recorded for any tracked method. |
544
+ | `max_view_renders_per_view` | 50 | Sets the maximum number of distinct renders that can be recorded for any tracked view. |
545
+ | `max_render_metadata_variations_per_view_render` | 50 | Sets the maximum number of distinct render metadata records that can be recorded for any specific render of a view. |
546
+
547
+ These configuration values can be set within the CruftTracker initializer like this:
548
+
549
+ ```ruby
550
+ # config/initializers/cruft_tracker.rb
551
+
552
+ CruftTracker.init do
553
+ config.max_argument_variations_per_tracked_method = 20
554
+ config.max_backtrace_variations_per_tracked_method = 25
555
+ config.max_view_renders_per_view = 30
556
+ config.max_render_metadata_variations_per_view_render = 35
557
+
558
+ # ... your configuration for tracking methods or views ...
559
+ end
560
+ ```
561
+
534
562
  ## API Docs
535
563
 
536
564
  ### `CruftTracker` module methods
@@ -2,9 +2,7 @@
2
2
 
3
3
  module CruftTracker
4
4
  class MethodsController < ApplicationController
5
-
6
5
  def index
7
-
8
6
  end
9
7
  end
10
8
  end
@@ -17,7 +17,7 @@ module CruftTracker
17
17
  private
18
18
 
19
19
  def cruft_tracker_view
20
- path = render_stack.first[:path].gsub(/#{Rails.root}\//, "")
20
+ path = render_stack.first[:path].gsub(%r{#{Rails.root}/}, '')
21
21
  view = CruftTracker::View.find_by(view: path)
22
22
 
23
23
  return view if view.present?
@@ -26,9 +26,9 @@ module CruftTracker
26
26
  end
27
27
 
28
28
  def route_path
29
- _routes.router.recognize(request) do |route, _|
30
- return route.path.spec.to_s
31
- end
29
+ _routes
30
+ .router
31
+ .recognize(request) { |route, _| return route.path.spec.to_s }
32
32
 
33
33
  nil
34
34
  end
@@ -38,18 +38,20 @@ module CruftTracker
38
38
  end
39
39
 
40
40
  def render_stack
41
- caller_locations.select do |caller_location|
42
- paths_to_views.any? do |path_for_view|
43
- caller_location.path.match?(/^#{path_for_view}\//)
41
+ caller_locations
42
+ .select do |caller_location|
43
+ paths_to_views.any? do |path_for_view|
44
+ caller_location.path.match?(%r{^#{path_for_view}/})
45
+ end
46
+ end
47
+ .map do |location|
48
+ {
49
+ path: location.path,
50
+ label: location.label,
51
+ base_label: location.base_label,
52
+ lineno: location.lineno
53
+ }
44
54
  end
45
- end.map do |location|
46
- {
47
- path: location.path,
48
- label: location.label,
49
- base_label: location.base_label,
50
- lineno: location.lineno
51
- }
52
- end
53
55
  end
54
56
  end
55
57
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CruftTracker
4
- class RenderMetadata < ActiveRecord::Base
4
+ class RenderMetadata < ActiveRecord::Base
5
5
  belongs_to :view_render, class_name: 'CruftTracker::ViewRender'
6
6
  end
7
7
  end
@@ -11,7 +11,9 @@ module CruftTracker
11
11
 
12
12
  def still_tracked?
13
13
  return true if CruftTracker::Registry.include?(self)
14
- return true if File.read(absolute_path).match?(/record_cruft_tracker_view_render/)
14
+ if File.read(absolute_path).match?(/record_cruft_tracker_view_render/)
15
+ return true
16
+ end
15
17
 
16
18
  false
17
19
  end
@@ -9,10 +9,10 @@ module CruftTracker
9
9
  CruftTracker::View
10
10
  .where(deleted_at: nil)
11
11
  .each do |view|
12
- unless view.still_exists? && view.still_tracked?
13
- view.update(deleted_at: Time.current)
12
+ unless view.still_exists? && view.still_tracked?
13
+ view.update(deleted_at: Time.current)
14
+ end
14
15
  end
15
- end
16
16
  end
17
17
  rescue StandardError
18
18
  # I'm actively ignoring all errors. Chances are, these are due to something like running rake
@@ -9,6 +9,8 @@ module CruftTracker
9
9
  private
10
10
 
11
11
  def execute
12
+ return unless arguments_record.present?
13
+
12
14
  CruftTracker::LogSuppressor.suppress_logging do
13
15
  arguments_record.with_lock do
14
16
  arguments_record.reload
@@ -22,16 +24,22 @@ module CruftTracker
22
24
  def arguments_record
23
25
  @arguments_record ||=
24
26
  begin
27
+ return find_existing_arguments_record if max_records_reached?
28
+
25
29
  CruftTracker::Argument.create(
26
30
  method: method,
27
31
  arguments_hash: arguments_hash,
28
32
  arguments: transformed_arguments
29
33
  )
30
34
  rescue ActiveRecord::RecordNotUnique
31
- CruftTracker::Argument.find_by(arguments_hash: arguments_hash)
35
+ find_existing_arguments_record
32
36
  end
33
37
  end
34
38
 
39
+ def find_existing_arguments_record
40
+ CruftTracker::Argument.find_by(arguments_hash: arguments_hash)
41
+ end
42
+
35
43
  def arguments_hash
36
44
  Digest::MD5.hexdigest(transformed_arguments.to_json)
37
45
  end
@@ -39,5 +47,9 @@ module CruftTracker
39
47
  def transformed_arguments
40
48
  @transformed_arguments ||= transformer.call(arguments)
41
49
  end
50
+
51
+ def max_records_reached?
52
+ CruftTracker::Argument.where(method: method).count >= CruftTracker.config.max_argument_variations_per_tracked_method
53
+ end
42
54
  end
43
55
  end
@@ -7,6 +7,8 @@ module CruftTracker
7
7
  private
8
8
 
9
9
  def execute
10
+ return unless backtrace_record.present?
11
+
10
12
  CruftTracker::LogSuppressor.suppress_logging do
11
13
  backtrace_record.with_lock do
12
14
  backtrace_record.reload
@@ -20,16 +22,22 @@ module CruftTracker
20
22
  def backtrace_record
21
23
  @backtrace_record ||=
22
24
  begin
25
+ return find_existing_backtrace_record if max_records_reached?
26
+
23
27
  CruftTracker::Backtrace.create(
24
28
  traceable: method,
25
29
  trace_hash: backtrace_hash,
26
30
  trace: filtered_backtrace
27
31
  )
28
32
  rescue ActiveRecord::RecordNotUnique
29
- CruftTracker::Backtrace.find_by(trace_hash: backtrace_hash)
33
+ find_existing_backtrace_record
30
34
  end
31
35
  end
32
36
 
37
+ def find_existing_backtrace_record
38
+ CruftTracker::Backtrace.find_by(trace_hash: backtrace_hash)
39
+ end
40
+
33
41
  def backtrace_hash
34
42
  Digest::MD5.hexdigest(filtered_backtrace.to_json)
35
43
  end
@@ -51,5 +59,9 @@ module CruftTracker
51
59
  }
52
60
  end
53
61
  end
62
+
63
+ def max_records_reached?
64
+ CruftTracker::Backtrace.where(traceable: method).count >= CruftTracker.config.max_backtrace_variations_per_tracked_method
65
+ end
54
66
  end
55
67
  end
@@ -10,11 +10,14 @@ module CruftTracker
10
10
 
11
11
  def execute
12
12
  return unless metadata.present?
13
+ return unless render_metadata_record.present?
13
14
 
14
15
  CruftTracker::LogSuppressor.suppress_logging do
15
16
  render_metadata_record.with_lock do
16
17
  render_metadata_record.reload
17
- render_metadata_record.update(occurrences: render_metadata_record.occurrences + 1)
18
+ render_metadata_record.update(
19
+ occurrences: render_metadata_record.occurrences + 1
20
+ )
18
21
  end
19
22
  end
20
23
  end
@@ -22,18 +25,28 @@ module CruftTracker
22
25
  def render_metadata_record
23
26
  @render_metadata_record ||=
24
27
  begin
28
+ return find_existing_render_metadata_record if max_records_reached?
29
+
25
30
  CruftTracker::RenderMetadata.create(
26
31
  view_render: view_render,
27
32
  metadata_hash: metadata_hash,
28
33
  metadata: metadata
29
34
  )
30
35
  rescue ActiveRecord::RecordNotUnique
31
- CruftTracker::RenderMetadata.find_by(metadata_hash: metadata_hash)
36
+ find_existing_render_metadata_record
32
37
  end
33
38
  end
34
39
 
40
+ def find_existing_render_metadata_record
41
+ CruftTracker::RenderMetadata.find_by(metadata_hash: metadata_hash)
42
+ end
43
+
35
44
  def metadata_hash
36
45
  Digest::MD5.hexdigest([view_render.render_hash, metadata].to_json)
37
46
  end
47
+
48
+ def max_records_reached?
49
+ CruftTracker::RenderMetadata.where(view_render: view_render).count >= CruftTracker.config.max_render_metadata_variations_per_view_render
50
+ end
38
51
  end
39
52
  end
@@ -20,6 +20,8 @@ module CruftTracker
20
20
  private
21
21
 
22
22
  def execute
23
+ return unless view_render_record.present?
24
+
23
25
  CruftTracker::LogSuppressor.suppress_logging do
24
26
  view.with_lock do
25
27
  view.reload
@@ -28,7 +30,9 @@ module CruftTracker
28
30
 
29
31
  view_render_record.with_lock do
30
32
  view_render_record.reload
31
- view_render_record.update(occurrences: view_render_record.occurrences + 1)
33
+ view_render_record.update(
34
+ occurrences: view_render_record.occurrences + 1
35
+ )
32
36
 
33
37
  record_render_metadata(view_render_record)
34
38
 
@@ -38,14 +42,18 @@ module CruftTracker
38
42
  end
39
43
 
40
44
  def record_render_metadata(view_render_record)
41
- compose(CruftTracker::RecordRenderMetadata,
42
- view_render: view_render_record,
43
- metadata: metadata)
45
+ compose(
46
+ CruftTracker::RecordRenderMetadata,
47
+ view_render: view_render_record,
48
+ metadata: metadata
49
+ )
44
50
  end
45
51
 
46
52
  def view_render_record
47
53
  @view_render_record ||=
48
54
  begin
55
+ return find_existing_view_render_record if max_records_reached?
56
+
49
57
  CruftTracker::ViewRender.create(
50
58
  view: view,
51
59
  render_hash: render_hash,
@@ -56,10 +64,14 @@ module CruftTracker
56
64
  render_stack: render_stack
57
65
  )
58
66
  rescue ActiveRecord::RecordNotUnique
59
- CruftTracker::ViewRender.find_by(render_hash: render_hash)
67
+ find_existing_view_render_record
60
68
  end
61
69
  end
62
70
 
71
+ def find_existing_view_render_record
72
+ CruftTracker::ViewRender.find_by(render_hash: render_hash)
73
+ end
74
+
63
75
  def render_hash
64
76
  Digest::MD5.hexdigest(
65
77
  {
@@ -72,5 +84,8 @@ module CruftTracker
72
84
  )
73
85
  end
74
86
 
87
+ def max_records_reached?
88
+ CruftTracker::ViewRender.where(view: view).count >= CruftTracker.config.max_view_renders_per_view
89
+ end
75
90
  end
76
91
  end
@@ -9,13 +9,14 @@ module CruftTracker
9
9
  interface :comment, methods: %i[to_json], default: nil
10
10
 
11
11
  def execute
12
- view_record = CruftTracker::LogSuppressor.suppress_logging do
13
- view_record = create_or_find_view_record
14
- view_record.deleted_at = nil
15
- view_record.comment = comment if comment != view_record.comment
16
- view_record.save
17
- view_record
18
- end
12
+ view_record =
13
+ CruftTracker::LogSuppressor.suppress_logging do
14
+ view_record = create_or_find_view_record
15
+ view_record.deleted_at = nil
16
+ view_record.comment = comment if comment != view_record.comment
17
+ view_record.save
18
+ view_record
19
+ end
19
20
 
20
21
  listen_for_render(view_record)
21
22
 
@@ -33,7 +34,7 @@ module CruftTracker
33
34
  'CruftTracker was unable to record a view. Have migrations been run?'
34
35
  )
35
36
  rescue Mysql2::Error::ConnectionError,
36
- ActiveRecord::ConnectionNotEstablished
37
+ ActiveRecord::ConnectionNotEstablished
37
38
  Rails.logger.warn(
38
39
  'CruftTracker was unable to record a view due to being unable to connect to the database. This may be a non-issue in cases where the database is intentionally not available.'
39
40
  )
@@ -51,14 +52,9 @@ module CruftTracker
51
52
  end
52
53
 
53
54
  def create_or_find_view_record
54
- CruftTracker::View.create(
55
- view: view,
56
- comment: comment
57
- )
55
+ CruftTracker::View.create(view: view, comment: comment)
58
56
  rescue ActiveRecord::RecordNotUnique
59
- CruftTracker::View.find_by(
60
- view: view
61
- )
57
+ CruftTracker::View.find_by(view: view)
62
58
  end
63
59
  end
64
60
  end
data/config/routes.rb CHANGED
@@ -1,3 +1 @@
1
- CruftTracker::Engine.routes.draw do
2
- resources :methods, only: %i[index]
3
- end
1
+ CruftTracker::Engine.routes.draw { resources :methods, only: %i[index] }
@@ -14,6 +14,5 @@ module CruftTracker
14
14
  helper CruftTracker::ApplicationHelper
15
15
  end
16
16
  end
17
-
18
17
  end
19
18
  end
@@ -1,3 +1,3 @@
1
1
  module CruftTracker
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
data/lib/cruft_tracker.rb CHANGED
@@ -4,18 +4,18 @@ require 'cruft_tracker/registry'
4
4
  require 'cruft_tracker/log_suppressor'
5
5
 
6
6
  module CruftTracker
7
+ class << self
8
+ attr_accessor :config
9
+ end
10
+
7
11
  def self.init(&block)
12
+ self.config = Config.instance
13
+
8
14
  self.instance_eval(&block)
9
15
  end
10
16
 
11
- def self.is_this_view_used?(
12
- view,
13
- comment: nil
14
- )
15
- CruftTracker::TrackView.run!(
16
- view: view,
17
- comment: comment
18
- )
17
+ def self.is_this_view_used?(view, comment: nil)
18
+ CruftTracker::TrackView.run!(view: view, comment: comment)
19
19
  end
20
20
 
21
21
  def self.is_this_method_used?(
@@ -37,4 +37,28 @@ module CruftTracker
37
37
  def self.are_any_of_these_methods_being_used?(owner, comment: nil)
38
38
  CruftTracker::TrackAllMethods.run!(owner: owner, comment: comment)
39
39
  end
40
+
41
+ class Config
42
+ include Singleton
43
+
44
+ DEFAULT_MAX_ARGUMENTS_VARIATIONS_PER_TRACKED_METHOD = 50
45
+ DEFAULT_MAX_BACKTRACE_VARIATIONS_PER_TRACKED_METHOD = 50
46
+ DEFAULT_MAX_VIEW_RENDERS_PER_VIEW = 50
47
+ DEFAULT_MAX_RENDER_METADATA_VARIATIONS_PER_VIEW_RENDER = 50
48
+
49
+ attr_accessor :max_argument_variations_per_tracked_method,
50
+ :max_backtrace_variations_per_tracked_method,
51
+ :max_view_renders_per_view,
52
+ :max_render_metadata_variations_per_view_render
53
+
54
+ def initialize
55
+ @max_argument_variations_per_tracked_method =
56
+ DEFAULT_MAX_ARGUMENTS_VARIATIONS_PER_TRACKED_METHOD
57
+ @max_backtrace_variations_per_tracked_method =
58
+ DEFAULT_MAX_BACKTRACE_VARIATIONS_PER_TRACKED_METHOD
59
+ @max_view_renders_per_view = DEFAULT_MAX_VIEW_RENDERS_PER_VIEW
60
+ @max_render_metadata_variations_per_view_render =
61
+ DEFAULT_MAX_RENDER_METADATA_VARIATIONS_PER_VIEW_RENDER
62
+ end
63
+ end
40
64
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cruft_tracker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adwerx Inc.
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-07-06 00:00:00.000000000 Z
12
+ date: 2022-07-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: active_interaction
@@ -235,6 +235,20 @@ dependencies:
235
235
  - - "~>"
236
236
  - !ruby/object:Gem::Version
237
237
  version: 2.5.0
238
+ - !ruby/object:Gem::Dependency
239
+ name: prettier
240
+ requirement: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: '0'
245
+ type: :development
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
238
252
  description: |
239
253
  Have you ever asked yourself, "Is this method even being used?!" Or, "What the heck is this method receiving?" Does your application use Rails? If the answers these questions are yes, this gem may be of use to you!
240
254