leftovers 0.1.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.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.leftovers.yml +19 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +216 -0
  6. data/.ruby-version +1 -0
  7. data/.spellr.yml +13 -0
  8. data/.spellr_wordlists/english.txt +21 -0
  9. data/.spellr_wordlists/lorem.txt +1 -0
  10. data/.spellr_wordlists/ruby.txt +67 -0
  11. data/.spellr_wordlists/shell.txt +3 -0
  12. data/.travis.yml +10 -0
  13. data/Configuration.md +427 -0
  14. data/Gemfile +6 -0
  15. data/LICENSE.txt +21 -0
  16. data/README.md +172 -0
  17. data/Rakefile +16 -0
  18. data/bin/console +15 -0
  19. data/bin/setup +8 -0
  20. data/exe/leftovers +6 -0
  21. data/leftovers.gemspec +42 -0
  22. data/lib/config/attr_encrypted.yml +16 -0
  23. data/lib/config/builder.yml +3 -0
  24. data/lib/config/capistrano.yml +3 -0
  25. data/lib/config/datagrid.yml +9 -0
  26. data/lib/config/flipper.yml +3 -0
  27. data/lib/config/graphql.yml +20 -0
  28. data/lib/config/guard.yml +3 -0
  29. data/lib/config/haml.yml +2 -0
  30. data/lib/config/jbuilder.yml +2 -0
  31. data/lib/config/okcomputer.yml +3 -0
  32. data/lib/config/parser.yml +91 -0
  33. data/lib/config/pry.yml +3 -0
  34. data/lib/config/rack.yml +2 -0
  35. data/lib/config/rails.yml +387 -0
  36. data/lib/config/rake.yml +5 -0
  37. data/lib/config/redcarpet.yml +38 -0
  38. data/lib/config/rollbar.yml +3 -0
  39. data/lib/config/rspec.yml +56 -0
  40. data/lib/config/ruby.yml +77 -0
  41. data/lib/config/selenium.yml +21 -0
  42. data/lib/config/simplecov.yml +2 -0
  43. data/lib/config/will_paginate.yml +14 -0
  44. data/lib/leftovers/argument_rule.rb +216 -0
  45. data/lib/leftovers/backports.rb +56 -0
  46. data/lib/leftovers/cli.rb +50 -0
  47. data/lib/leftovers/collector.rb +67 -0
  48. data/lib/leftovers/config.rb +53 -0
  49. data/lib/leftovers/core_ext.rb +32 -0
  50. data/lib/leftovers/definition.rb +70 -0
  51. data/lib/leftovers/definition_set.rb +44 -0
  52. data/lib/leftovers/erb.rb +20 -0
  53. data/lib/leftovers/file.rb +30 -0
  54. data/lib/leftovers/file_collector.rb +219 -0
  55. data/lib/leftovers/file_list.rb +24 -0
  56. data/lib/leftovers/haml.rb +24 -0
  57. data/lib/leftovers/hash_rule.rb +40 -0
  58. data/lib/leftovers/merged_config.rb +71 -0
  59. data/lib/leftovers/name_rule.rb +53 -0
  60. data/lib/leftovers/node.rb +182 -0
  61. data/lib/leftovers/rake_task.rb +62 -0
  62. data/lib/leftovers/reporter.rb +11 -0
  63. data/lib/leftovers/rule.rb +74 -0
  64. data/lib/leftovers/transform_rule.rb +171 -0
  65. data/lib/leftovers/value_rule.rb +56 -0
  66. data/lib/leftovers/version.rb +5 -0
  67. data/lib/leftovers.rb +127 -0
  68. metadata +281 -0
data/leftovers.gemspec ADDED
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = ::File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'leftovers/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'leftovers'
9
+ spec.version = Leftovers::VERSION
10
+ spec.authors = ['Dana Sherson']
11
+ spec.email = ['robot@dana.sh']
12
+
13
+ spec.summary = 'Find unused methods and classes/modules'
14
+ spec.homepage = 'http://github.com/robotdana/leftovers'
15
+ spec.license = 'MIT'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'http://github.com/robotdana/leftovers'
19
+ spec.metadata['changelog_uri'] = 'http://github.com/robotdana/leftovers/blob/master/CHANGELOG'
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(::File.expand_path(__dir__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = 'exe'
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| ::File.basename(f) }
28
+ spec.require_paths = ['lib']
29
+
30
+ spec.add_development_dependency 'activesupport'
31
+ spec.add_development_dependency 'bundler', '~> 2.0'
32
+ spec.add_development_dependency 'haml'
33
+ spec.add_development_dependency 'pry', '~> 0.1'
34
+ spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency 'rspec', '~> 3.0'
36
+ spec.add_development_dependency 'rubocop'
37
+ spec.add_development_dependency 'rubocop-rspec'
38
+ spec.add_development_dependency 'spellr', '>= 0.8.1'
39
+ spec.add_dependency 'fast_ignore', '>= 0.8.3'
40
+ spec.add_dependency 'parallel'
41
+ spec.add_dependency 'parser'
42
+ end
@@ -0,0 +1,16 @@
1
+ rules:
2
+ # this doesn't handle custom prefix, suffix, attribute
3
+ - name: attr_encrypted
4
+ defines:
5
+ - argument: 1
6
+ calls:
7
+ - argument: 1
8
+ transforms:
9
+ - add_prefix: encrypted_
10
+ - add_prefix: encrypted_
11
+ add_suffix: _iv
12
+ - arguments:
13
+ - encryptor
14
+ - encrypt_method
15
+ - decrypt_method
16
+ - key
@@ -0,0 +1,3 @@
1
+
2
+ include_paths:
3
+ - '*.builder'
@@ -0,0 +1,3 @@
1
+ include_paths:
2
+ - Capfile
3
+ - capfile
@@ -0,0 +1,9 @@
1
+ rules:
2
+ - name: filter
3
+ calls:
4
+ arguments:
5
+ - default
6
+ - select
7
+ - name: column
8
+ calls:
9
+ arguments: [if, unless]
@@ -0,0 +1,3 @@
1
+ rules:
2
+ skip: true
3
+ name: flipper_id
@@ -0,0 +1,20 @@
1
+ rules:
2
+ - skip: true
3
+ names:
4
+ - cursor_from_node
5
+ - paged_nodes
6
+ - sliced_nodes
7
+ - name: field
8
+ calls:
9
+ - argument: 1
10
+ unless:
11
+ has_argument: method
12
+ - argument: method
13
+ - name: argument
14
+ calls:
15
+ - argument: 1
16
+ add_suffix: '='
17
+ unless:
18
+ has_argument: as
19
+ - argument: as
20
+ add_suffix: '='
@@ -0,0 +1,3 @@
1
+ include_paths:
2
+ - Guardfile
3
+ - .Guardfile
@@ -0,0 +1,2 @@
1
+ include_paths:
2
+ - '*.haml'
@@ -0,0 +1,2 @@
1
+ include_paths:
2
+ - '*.jbuilder'
@@ -0,0 +1,3 @@
1
+ rules:
2
+ skip: true
3
+ name: check
@@ -0,0 +1,91 @@
1
+ rules:
2
+ skip: true
3
+ names: |
4
+ on_alias
5
+ on_and
6
+ on_and_asgn
7
+ on_arg
8
+ on_arg_expr
9
+ on_args
10
+ on_argument
11
+ on_array
12
+ on_back_ref
13
+ on_begin
14
+ on_block
15
+ on_block_pass
16
+ on_blockarg
17
+ on_blockarg_expr
18
+ on_break
19
+ on_case
20
+ on_casgn
21
+ on_class
22
+ on_const
23
+ on_csend
24
+ on_cvar
25
+ on_cvasgn
26
+ on_def
27
+ on_defined?
28
+ on_defs
29
+ on_dstr
30
+ on_dsym
31
+ on_eflipflop
32
+ on_ensure
33
+ on_erange
34
+ on_for
35
+ on_gvar
36
+ on_gvasgn
37
+ on_hash
38
+ on_if
39
+ on_iflipflop
40
+ on_irange
41
+ on_ivar
42
+ on_ivasgn
43
+ on_kwarg
44
+ on_kwbegin
45
+ on_kwoptarg
46
+ on_kwrestarg
47
+ on_lvar
48
+ on_lvasgn
49
+ on_masgn
50
+ on_match_current_line
51
+ on_match_with_lvasgn
52
+ on_mlhs
53
+ on_module
54
+ on_next
55
+ on_not
56
+ on_nth_ref
57
+ on_op_asgn
58
+ on_optarg
59
+ on_or
60
+ on_or_asgn
61
+ on_pair
62
+ on_postexe
63
+ on_preexe
64
+ on_procarg0
65
+ on_redo
66
+ on_regexp
67
+ on_resbody
68
+ on_rescue
69
+ on_restarg
70
+ on_restarg_expr
71
+ on_retry
72
+ on_return
73
+ on_sclass
74
+ on_send
75
+ on_shadowarg
76
+ on_splat
77
+ on_super
78
+ on_undef
79
+ on_until
80
+ on_until_post
81
+ on_var
82
+ on_vasgn
83
+ on_when
84
+ on_while
85
+ on_while_post
86
+ on_xstr
87
+ on_yield
88
+ process_argument_node
89
+ process_regular_node
90
+ process_var_asgn_node
91
+ process_variable_node
@@ -0,0 +1,3 @@
1
+ include_paths:
2
+ - pryrc
3
+ - .pryrc
@@ -0,0 +1,2 @@
1
+ include_paths:
2
+ - '*.ru'
@@ -0,0 +1,387 @@
1
+
2
+ exclude_paths:
3
+ - db/migrate/*
4
+ include_paths:
5
+ - '*.rjs'
6
+ - '*.rhtml'
7
+
8
+ # THIS IS INCOMPLETE (you can help by expanding it)
9
+ # rails is _really complicated_ and has a lot of magic which calls methods for you.
10
+ # some is currently impossible to handle (with_options).
11
+ # Some is just corners of rails I haven't hit yet.
12
+ # TODO: split this up by the actual gems
13
+ rules:
14
+ - skip: true
15
+ names:
16
+ - ClassMethods # ActiveSupport::Concern
17
+ - process_action # ActiveSupport::LogSubscriber
18
+ - validate_each # ActiveModel::EachValidator
19
+ - format_message # ActiveSupport::Logger
20
+ - ssl_configured? # ApplicationController
21
+ - skip: true
22
+ names:
23
+ has_suffix: Helper
24
+ path: /app/helpers
25
+ - names:
26
+ - after_initialize
27
+ - after_find
28
+ - after_touch
29
+ - before_validation
30
+ - after_validation
31
+ - before_save
32
+ - around_save
33
+ - after_save
34
+ - before_create
35
+ - around_create
36
+ - after_create
37
+ - before_update
38
+ - around_update
39
+ - after_update
40
+ - before_destroy
41
+ - around_destroy
42
+ - after_destroy
43
+ - after_commit
44
+ - after_rollback
45
+ - after_create_commit
46
+ - after_update_commit
47
+ - after_destroy_commit
48
+ - after_save_commit
49
+ calls:
50
+ arguments:
51
+ - 1
52
+ - if
53
+ - unless
54
+ - name:
55
+ - after_action
56
+ - append_after_action
57
+ - append_around_action
58
+ - append_before_action
59
+ - around_action
60
+ - before_action
61
+ - prepend_after_action
62
+ - prepend_around_action
63
+ - prepend_before_action
64
+ - skip_before_action
65
+ - skip_after_action
66
+ - skip_around_action
67
+ - validates_associated
68
+ calls:
69
+ - arguments:
70
+ - '*'
71
+ - if
72
+ - unless
73
+ - name: validates
74
+ calls:
75
+ - arguments:
76
+ - '*'
77
+ - 'in'
78
+ - inclusion
79
+ - scope
80
+ - if
81
+ - unless
82
+ - keys: '*'
83
+ camelize: true
84
+ add_suffix: Validator
85
+ - names:
86
+ - validate
87
+ - validate_associated
88
+ calls:
89
+ - arguments: ['*', if, unless]
90
+ - name:
91
+ - check_box
92
+ - date_select
93
+ - datetime_select
94
+ - file_field
95
+ - hidden_field
96
+ - label
97
+ - radio_button
98
+ - select
99
+ - time_select
100
+ - time_zone_select
101
+ - color_field
102
+ - date_field
103
+ - datetime_field
104
+ - datetime_local_field
105
+ - email_field
106
+ - month_field
107
+ - number_field
108
+ - password_field
109
+ - phone_field
110
+ - range_field
111
+ - search_field
112
+ - telephone_field
113
+ - text_area
114
+ - text_field
115
+ - time_field
116
+ - url_field
117
+ - week_field
118
+ calls:
119
+ - arguments: [1,2] # 1: with a receiver, 2: with no receiver
120
+ - arguments: [1,2]
121
+ add_suffix: '='
122
+ - name: fields_for
123
+ calls:
124
+ argument: 1
125
+ add_suffix: _attributes
126
+ - name: options_from_collection_for_select
127
+ calls:
128
+ - arguments: [2,3]
129
+ - name:
130
+ - collection_select
131
+ - collection_check_boxes
132
+ - collection_radio_buttons
133
+ calls:
134
+ - argument: 2
135
+ add_suffix: '='
136
+ - arguments: [4,5]
137
+ - name: grouped_collection_select
138
+ calls:
139
+ - argument: 2
140
+ add_suffix: '='
141
+ - arguments: [4,5,6,7]
142
+ - name: option_groups_from_collection_for_select
143
+ calls:
144
+ - arguments: [1,2,3,4]
145
+ - name: scope
146
+ path: /app/models
147
+ defines:
148
+ argument: 1 # ar
149
+ - name: scope
150
+ path: /config/routes*
151
+ calls:
152
+ argument: module # routes
153
+ camelize: true
154
+ - name: namespace
155
+ calls:
156
+ - argument: 1
157
+ camelize: true
158
+ - name:
159
+ - attribute
160
+ - alias_attribute
161
+ path: app/models/*
162
+ defines:
163
+ argument: 1
164
+ linked_transforms:
165
+ - original
166
+ - add_suffix: '?'
167
+ - add_suffix: '='
168
+ - name: alias_attribute
169
+ calls:
170
+ - argument: 2
171
+ - argument: 2
172
+ add_suffix: '?'
173
+ - argument: 2
174
+ add_suffix: '='
175
+ - name:
176
+ - has_one
177
+ - belongs_to
178
+ calls:
179
+ argument: 1
180
+ camelize: true
181
+ unless:
182
+ has_argument: class_name
183
+ - name:
184
+ - has_many
185
+ - has_and_belongs_to_many
186
+ calls:
187
+ argument: 1
188
+ camelize: true
189
+ singularize: true
190
+ unless:
191
+ has_argument: class_name
192
+ - name:
193
+ - has_many
194
+ - has_one
195
+ - has_and_belongs_to_many
196
+ calls:
197
+ argument: as
198
+ - name:
199
+ - has_one
200
+ - has_many
201
+ - belongs_to
202
+ - has_and_belongs_to_many
203
+ defines:
204
+ - argument: 1
205
+ linked_transforms:
206
+ - original
207
+ - add_suffix: '='
208
+ calls:
209
+ - argument:
210
+ - through
211
+ - class_name
212
+ - inverse_of
213
+ - argument: 1
214
+ if:
215
+ has_argument: dependent
216
+ - argument: 1
217
+ if:
218
+ has_argument: inverse_of
219
+ - name:
220
+ - rescue_from
221
+ calls:
222
+ - argument: with
223
+ - name:
224
+ - match
225
+ - delete
226
+ - get
227
+ - patch
228
+ - post
229
+ - put
230
+ calls:
231
+ - arguments: [1, action]
232
+ - argument: '**'
233
+ delete_before: '#'
234
+ - argument: '**'
235
+ delete_after: '#'
236
+ camelize: true
237
+ add_suffix: Controller
238
+ - name: delegate
239
+ defines:
240
+ - argument: '*'
241
+ if:
242
+ has_argument:
243
+ keyword: prefix
244
+ value: true
245
+ add_prefix:
246
+ from_argument: to
247
+ joiner: '_'
248
+ - argument: '*'
249
+ if:
250
+ has_argument:
251
+ keyword: prefix
252
+ value:
253
+ type: [String, Symbol]
254
+ add_prefix:
255
+ from_argument: prefix
256
+ joiner: '_'
257
+ calls:
258
+ - argument: to
259
+ - argument: '*'
260
+ if:
261
+ has_argument: prefix
262
+ - name:
263
+ - resource
264
+ - resources
265
+ calls:
266
+ - argument: only
267
+ - argument: controller
268
+ camelize: true
269
+ add_suffix: Controller
270
+ - name:
271
+ - resources
272
+ - controller
273
+ - namespace
274
+ calls:
275
+ - argument: 1
276
+ camelize: true
277
+ add_suffix: Controller
278
+ - name: accepts_nested_attributes_for
279
+ defines:
280
+ argument: '*'
281
+ linked_transforms:
282
+ - add_suffix: _attributes
283
+ - add_suffix: _attributes=
284
+ calls:
285
+ argument: reject_if
286
+ - name: resource
287
+ calls:
288
+ - argument: 1
289
+ camelize: true
290
+ pluralize: true
291
+ add_suffix: Controller
292
+ - name:
293
+ - new
294
+ - create
295
+ - create!
296
+ - update
297
+ - update!
298
+ - assign_attributes
299
+ calls:
300
+ keys: '*'
301
+ add_suffix: '='
302
+ - name: permit
303
+ calls:
304
+ arguments: ['*', '**']
305
+ keys: '*'
306
+ add_suffix: "="
307
+ - name: layout
308
+ calls:
309
+ argument: 1
310
+ - name:
311
+ - includes
312
+ - preload
313
+ - eager_load
314
+ - joins
315
+ - left_joins
316
+ - left_outer_joins
317
+ calls:
318
+ arguments: ['*', '**']
319
+ keys: '*'
320
+ - name:
321
+ - string
322
+ - text
323
+ - integer
324
+ - bigint
325
+ - float
326
+ - decimal
327
+ - numeric
328
+ - datetime
329
+ - time
330
+ - date
331
+ - binary
332
+ - boolean
333
+ path: /db/schema.rb
334
+ calls:
335
+ argument: 1
336
+ transforms:
337
+ - original
338
+ - add_suffix: '='
339
+ - add_suffix: '?'
340
+ - name:
341
+ - cattr_accessor
342
+ - mattr_accessor
343
+ defines:
344
+ - argument: '*'
345
+ transforms:
346
+ - original
347
+ - add_suffix: '='
348
+ calls:
349
+ - argument: '*'
350
+ add_prefix: '@'
351
+ - name:
352
+ - cattr_reader
353
+ - mattr_reader
354
+ defines:
355
+ - argument: '*'
356
+ calls:
357
+ - argument: '*'
358
+ add_prefix: '@'
359
+ - name:
360
+ - cattr_writer
361
+ - mattr_writer
362
+ defines:
363
+ - argument: '*'
364
+ add_suffix: '='
365
+
366
+ - name:
367
+ - thread_cattr_accessor
368
+ - thread_mattr_accessor
369
+ defines:
370
+ argument: '*'
371
+ transforms:
372
+ - original
373
+ - add_suffix: '='
374
+ - name:
375
+ - thread_cattr_reader
376
+ - thread_mattr_reader
377
+ defines:
378
+ argument: '*'
379
+ - name:
380
+ - thread_cattr_writer
381
+ - thread_mattr_writer
382
+ defines:
383
+ argument: '*'
384
+ add_suffix: '='
385
+ - name: delegate_missing_to
386
+ calls:
387
+ argument: 1
@@ -0,0 +1,5 @@
1
+ include_paths:
2
+ - '*.rake'
3
+ - Rakefile
4
+ - rakefile
5
+ - Rake
@@ -0,0 +1,38 @@
1
+ ---
2
+ rules:
3
+ skip: true
4
+ names:
5
+ - block_code
6
+ - block_quote
7
+ - block_html
8
+ - footnotes
9
+ - footnote_def
10
+ - header
11
+ - hrule
12
+ - list
13
+ - list_item
14
+ - paragraph
15
+ - table
16
+ - table_row
17
+ - table_cell
18
+ - autolink
19
+ - codespan
20
+ - double_emphasis
21
+ - emphasis
22
+ - image
23
+ - linebreak
24
+ - link
25
+ - raw_html
26
+ - triple_emphasis
27
+ - strikethrough
28
+ - superscript
29
+ - underline
30
+ - highlight
31
+ - quote
32
+ - footnote_ref
33
+ - entity
34
+ - normal_text
35
+ - doc_header
36
+ - doc_footer
37
+ - preprocess
38
+ - postprocess
@@ -0,0 +1,3 @@
1
+ rules:
2
+ skip: true
3
+ name: current_user_for_rollbar