snip_snip 0.0.1 → 0.0.2

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
  SHA1:
3
- metadata.gz: 1db377244c92bb3ad11cd32325360adae82845f4
4
- data.tar.gz: e3c3d7ff1afcdc0df5de5b13bd599d6004f82351
3
+ metadata.gz: 062261f05f636bb28b9196d5c084d17cfa4b31c6
4
+ data.tar.gz: 10bca413ac95b6bcf7fb6b6b7fddf9f01ed04e88
5
5
  SHA512:
6
- metadata.gz: e9b20a7fe43cd61f7532a6ea81a71b6d9b42370cc103c5366668fa10e5573a374d9dd595bfa0b149fd5ed67f1ab410c1aadce8fed8081551b38c6d0d22149eb4
7
- data.tar.gz: 03d5eaac57e21cb5c0f48de1423ad332791756d2b3ae3eac3935cd86267d60a35f23a5d327abecbfbfa9392b8238ca92280d94eaf369408f499e0681acf67847
6
+ metadata.gz: 8fdaf95d1674c764032cad5706d195c8842b19badf348fa16d81ca1edeed25beaed99fa881eefc56692c3be566e8cca84b12f53a4c6bbbc1cf61af68717c595d
7
+ data.tar.gz: 7911d7040597f852ca55a1c6b74e48f68b19a58c0d8fd0ee4c0987145300183f32cbb0d87190b6492726cb21809db7a4e6d599634740900b4a2723bc650394b3
data/Rakefile CHANGED
@@ -1,23 +1,11 @@
1
- # frozen_string_literal: true
2
- begin
3
- require 'bundler/setup'
4
- rescue LoadError
5
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
- end
7
-
8
- require 'rdoc/task'
9
-
10
- RDoc::Task.new(:rdoc) do |rdoc|
11
- rdoc.rdoc_dir = 'rdoc'
12
- rdoc.title = 'SnipSnip'
13
- rdoc.options << '--line-numbers'
14
- rdoc.rdoc_files.include('README.md')
15
- rdoc.rdoc_files.include('lib/**/*.rb')
16
- end
17
-
1
+ require 'bundler/setup'
18
2
  require 'bundler/gem_tasks'
19
-
20
3
  require 'rake/testtask'
4
+ require 'yard'
5
+
6
+ YARD::Rake::YardocTask.new(:yard) do |t|
7
+ t.stats_options = ['--list-undoc']
8
+ end
21
9
 
22
10
  Rake::TestTask.new(:test) do |t|
23
11
  t.libs << 'lib'
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
- require 'forwardable'
3
1
  require 'logger'
4
2
 
5
3
  require 'snip_snip/filter'
@@ -7,7 +5,9 @@ require 'snip_snip/railtie'
7
5
  require 'snip_snip/registry'
8
6
  require 'snip_snip/reporter'
9
7
 
8
+ # Top-level wrapper module.
10
9
  module SnipSnip
10
+ # The logger object used to report unused columns.
11
11
  def self.logger
12
12
  @logger ||= Logger.new(Rails.root.join('log', 'snip-snip.log'))
13
13
  end
@@ -1,26 +1,22 @@
1
- # frozen_string_literal: true
2
1
  module SnipSnip
2
+ # Classes to filter out of the tracking when looking at which columns were
3
+ # selected.
3
4
  class Filter
4
-
5
- attr_accessor :filtered
5
+ attr_reader :filtered
6
6
 
7
7
  def initialize(filtered = [])
8
- filtered << ActiveRecord::InternalMetadata if ActiveRecord.const_defined?(:InternalMetadata)
9
- self.filtered = filtered
8
+ @filtered = filtered
9
+
10
+ return unless ActiveRecord.const_defined?(:InternalMetadata)
11
+ @filtered << ActiveRecord::InternalMetadata
10
12
  end
11
13
 
12
14
  def filtered?(record)
13
15
  filtered.any? { |filter| record.is_a?(filter) }
14
16
  end
15
17
 
16
- class << self
17
- def filtered?(record)
18
- instance.filtered?(record)
19
- end
20
-
21
- def instance
22
- @instance ||= new
23
- end
18
+ def self.filtered?(record)
19
+ (@instance ||= new).filtered?(record)
24
20
  end
25
21
  end
26
22
  end
@@ -1,9 +1,9 @@
1
- # frozen_string_literal: true
2
1
  module SnipSnip
2
+ # Hooks into Rails to track when columns are selected but not necessary.
3
3
  class Railtie < Rails::Railtie
4
-
5
4
  initializer 'snip_snip.load_extensions' do
6
5
  ActiveSupport.on_load(:action_controller) do
6
+ before_action { Registry.clear }
7
7
  after_action { Reporter.report(self) }
8
8
  end
9
9
 
@@ -1,33 +1,47 @@
1
- # frozen_string_literal: true
2
1
  module SnipSnip
2
+ # A list of records that were found during the course of the last request
3
+ # on which we are tracking columns.
3
4
  class Registry
4
-
5
- attr_accessor :records
5
+ attr_reader :records
6
6
 
7
7
  def initialize
8
8
  clear
9
9
  end
10
10
 
11
+ # Wipe the registry clear of found objects so that we don't report on them
12
+ # twice.
11
13
  def clear
12
- self.records = []
14
+ @records = []
13
15
  end
14
16
 
17
+ # Loop through each record that was found during the lifespan of this
18
+ # registry
15
19
  def each_record(&block)
16
20
  return to_enum(:each_record) unless block_given?
17
21
  records.each(&block)
18
22
  end
19
23
 
24
+ # Add a record to this registry
20
25
  def register(record)
21
26
  records << record
22
27
  end
23
28
 
24
29
  class << self
25
- extend Forwardable
26
- def_delegators :instance, :clear, :each_record, :register
27
-
30
+ # The singleton instance of this registry.
28
31
  def instance
29
32
  @instance ||= new
30
33
  end
34
+
35
+ # Delegate all missing methods to the singleton instance.
36
+ def method_missing(method, *args, &block)
37
+ return super unless respond_to_missing?(method)
38
+ instance.public_send(method, *args, &block)
39
+ end
40
+
41
+ # Respond to all of the missing methods on the singleton instance.
42
+ def respond_to_missing?(method)
43
+ instance.respond_to?(method)
44
+ end
31
45
  end
32
46
  end
33
47
  end
@@ -1,22 +1,29 @@
1
- # frozen_string_literal: true
2
1
  module SnipSnip
2
+ # Handles outputting unnecessarily selected columns to the logs.
3
3
  class Reporter
4
- Result = Struct.new(:class_name, :primary_key, :unused) do
5
- def report
6
- @report ||= "#{class_name} #{primary_key}: #{unused.sort.join(', ')}"
4
+ # Represents a result that has unused columns.
5
+ Result =
6
+ Struct.new(:class_name, :primary_key, :unused) do
7
+ # A string representing the unused columns for the given record.
8
+ def report
9
+ @report ||= "#{class_name} #{primary_key}: #{unused.sort.join(', ')}"
10
+ end
7
11
  end
8
- end
9
12
 
10
- attr_accessor :results
13
+ attr_reader :results
11
14
 
12
15
  def initialize
13
- self.results = find_results
16
+ @results = find_results
14
17
  end
15
18
 
19
+ # Report on the unused columns that were selected during the course of the
20
+ # processing the action on the given controller.
16
21
  def report(controller)
17
22
  return if results.empty?
18
23
 
19
- SnipSnip.logger.info("#{controller.controller_name}##{controller.action_name}")
24
+ action_display = "#{controller.controller_name}##{controller.action_name}"
25
+ SnipSnip.logger.info(action_display)
26
+
20
27
  results.sort_by(&:report).each do |result|
21
28
  SnipSnip.logger.info(" #{result.report}")
22
29
  end
@@ -24,6 +31,7 @@ module SnipSnip
24
31
  Registry.clear
25
32
  end
26
33
 
34
+ # Report on the specified controller.
27
35
  def self.report(controller)
28
36
  new.report(controller)
29
37
  end
@@ -34,11 +42,13 @@ module SnipSnip
34
42
  Registry.each_record.each_with_object([]) do |record, records|
35
43
  accessed = record.accessed_fields
36
44
  unused = (record.attributes.keys - accessed)
37
- next if unused.empty?
38
-
39
- primary_key = record.class.primary_key
40
- records << Result.new(record.class.name, record.send(primary_key), unused)
45
+ records << result_from(record, unused) if unused.any?
41
46
  end
42
47
  end
48
+
49
+ def result_from(record, unused)
50
+ primary_key = record.class.primary_key
51
+ Result.new(record.class.name, record.public_send(primary_key), unused)
52
+ end
43
53
  end
44
54
  end
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: true
2
1
  module SnipSnip
3
- VERSION = '0.0.1'
2
+ # The current version of the gem.
3
+ VERSION = '0.0.2'.freeze
4
4
  end
metadata CHANGED
@@ -1,37 +1,37 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snip_snip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Deisz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-11 00:00:00.000000000 Z
11
+ date: 2017-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 5.0.0.beta4
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
19
  version: '5.1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 5.0.0.beta
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 5.0.0.beta4
30
- - - "<"
27
+ - - "~>"
31
28
  - !ruby/object:Gem::Version
32
29
  version: '5.1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.0.0.beta
33
33
  - !ruby/object:Gem::Dependency
34
- name: coveralls
34
+ name: rubocop
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
@@ -45,7 +45,7 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
47
  - !ruby/object:Gem::Dependency
48
- name: rubocop
48
+ name: simplecov
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
@@ -59,7 +59,7 @@ dependencies:
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
61
  - !ruby/object:Gem::Dependency
62
- name: simplecov
62
+ name: sqlite3
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - ">="
@@ -73,7 +73,7 @@ dependencies:
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  - !ruby/object:Gem::Dependency
76
- name: sqlite3
76
+ name: yard
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - ">="
@@ -122,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
122
  version: '0'
123
123
  requirements: []
124
124
  rubyforge_project:
125
- rubygems_version: 2.5.1
125
+ rubygems_version: 2.6.13
126
126
  signing_key:
127
127
  specification_version: 4
128
128
  summary: SnipSnip cuts the deadweight