leftovers 0.5.2 → 0.6.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 +5 -5
- data/CHANGELOG.md +17 -0
- data/README.md +23 -3
- data/docs/Configuration.md +119 -2
- data/leftovers.gemspec +8 -4
- data/lib/.DS_Store +0 -0
- data/lib/config/actionpack.yml +11 -0
- data/lib/config/activesupport.yml +1 -0
- data/lib/config/ruby.yml +10 -0
- data/lib/config/slim.yml +4 -0
- data/lib/leftovers/collector.rb +3 -1
- data/lib/leftovers/config.rb +12 -4
- data/lib/leftovers/config_validator/schema_hash.rb +171 -149
- data/lib/leftovers/config_validator.rb +1 -0
- data/lib/leftovers/definition.rb +1 -1
- data/lib/leftovers/dynamic_processors/call.rb +0 -4
- data/lib/leftovers/dynamic_processors/call_definition.rb +0 -4
- data/lib/leftovers/dynamic_processors/definition.rb +0 -4
- data/lib/leftovers/erb.rb +1 -1
- data/lib/leftovers/file.rb +53 -5
- data/lib/leftovers/file_collector.rb +33 -2
- data/lib/leftovers/json.rb +28 -0
- data/lib/leftovers/matcher_builders/document.rb +13 -0
- data/lib/leftovers/matcher_builders/node.rb +3 -1
- data/lib/leftovers/matcher_builders/node_has_argument.rb +3 -4
- data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +1 -1
- data/lib/leftovers/matcher_builders/node_has_positional_argument.rb +1 -1
- data/lib/leftovers/matcher_builders.rb +1 -0
- data/lib/leftovers/matchers/all.rb +0 -4
- data/lib/leftovers/matchers/and.rb +0 -4
- data/lib/leftovers/matchers/any.rb +0 -4
- data/lib/leftovers/matchers/node_has_any_keyword_argument.rb +1 -7
- data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +1 -7
- data/lib/leftovers/matchers/node_has_positional_argument_with_value.rb +0 -4
- data/lib/leftovers/matchers/node_name.rb +0 -4
- data/lib/leftovers/matchers/node_pair_value.rb +0 -4
- data/lib/leftovers/matchers/node_path.rb +0 -4
- data/lib/leftovers/matchers/node_scalar_value.rb +0 -4
- data/lib/leftovers/matchers/node_type.rb +0 -4
- data/lib/leftovers/matchers/not.rb +0 -4
- data/lib/leftovers/matchers/or.rb +0 -4
- data/lib/leftovers/merged_config.rb +43 -9
- data/lib/leftovers/processor_builders/dynamic.rb +2 -1
- data/lib/leftovers/slim.rb +21 -0
- data/lib/leftovers/todo_reporter.rb +10 -35
- data/lib/leftovers/value_processors/camelize.rb +1 -1
- data/lib/leftovers/value_processors/deconstantize.rb +1 -1
- data/lib/leftovers/value_processors/delete_prefix.rb +0 -6
- data/lib/leftovers/value_processors/delete_suffix.rb +0 -6
- data/lib/leftovers/value_processors/demodulize.rb +1 -1
- data/lib/leftovers/value_processors/keyword.rb +0 -4
- data/lib/leftovers/value_processors/keyword_argument.rb +0 -4
- data/lib/leftovers/value_processors/parameterize.rb +1 -1
- data/lib/leftovers/value_processors/pluralize.rb +1 -1
- data/lib/leftovers/value_processors/return_definition.rb +0 -4
- data/lib/leftovers/value_processors/singularize.rb +1 -1
- data/lib/leftovers/value_processors/titleize.rb +1 -1
- data/lib/leftovers/value_processors/underscore.rb +1 -1
- data/lib/leftovers/version.rb +1 -1
- data/lib/leftovers/yaml.rb +73 -0
- data/lib/leftovers.rb +8 -8
- metadata +51 -18
- data/lib/leftovers/backports.rb +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 32e8f2762f7f513145ea799b64a059c7228dd7e9a4e08c2762abe92aad1370b1
|
4
|
+
data.tar.gz: 9134e7d5c66bcbb25bb5fba15f5b1bb661ce18972cf91e179f165af52f955662
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e361dc15e0a3496dadf81f91d356183631b1ad9f0b44951f976785622aa8550ccd0d8a6632064ab646a65231c4b772236cf1136b9267ceb81c59217d36bb4f78
|
7
|
+
data.tar.gz: d82fd190746370c9ead45a27e5a660f81aafadf58736afd644d5fafad816daa450f25eebcf30d18875b185ab7d76b3215a696ed35bb75ad33509a474cff87736
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
# 0.6.0
|
2
|
+
- drop ruby 2.4 support, allowing for some performance improvements
|
3
|
+
- Add ability to parse JSON and YAML files
|
4
|
+
- Add magic comment that points to a particular dynamic rule
|
5
|
+
- repeated calls to --write-todo won't have ordering differences
|
6
|
+
- fix issue with --write-todo and unused methods defined in test files
|
7
|
+
|
8
|
+
# 0.5.5
|
9
|
+
- Fix rails resource/resources method signatures
|
10
|
+
|
11
|
+
# 0.5.4
|
12
|
+
- Add support for slim templates #13 - thanks @veganstraightedge
|
13
|
+
- fix the #how-to-resolve link #11 - thanks @veganstraightedge
|
14
|
+
|
15
|
+
# v0.5.3
|
16
|
+
- fix incompatibility with activesupport 7.
|
17
|
+
|
1
18
|
# v0.5.2
|
2
19
|
- allow config entries to have duplicates (especially as --write-todo) can write a file with duplicates)
|
3
20
|
|
data/README.md
CHANGED
@@ -57,7 +57,7 @@ Not directly called at all:
|
|
57
57
|
lib/hello_world.rb:6:6 generated_method= attr_accessor :generated_method
|
58
58
|
lib/hello_world.rb:6:6 generated_method attr_accessor :generated_method
|
59
59
|
|
60
|
-
how to resolve: https://github.com/robotdana/leftovers/tree/main/Readme.md#
|
60
|
+
how to resolve: https://github.com/robotdana/leftovers/tree/main/Readme.md#how-to-resolve
|
61
61
|
```
|
62
62
|
|
63
63
|
if there is an overwhelming number of results, try using [`--write-todo`](#write-todo)
|
@@ -129,7 +129,7 @@ To do this for all definitions of this name, instead of adding a comment, add th
|
|
129
129
|
|
130
130
|
### `# leftovers:call`
|
131
131
|
_aliases `leftovers:calls`_
|
132
|
-
To mark a
|
132
|
+
To mark a call that doesn't use literal values, use `leftovers:call` with the method name listed
|
133
133
|
```ruby
|
134
134
|
method = [:puts, :warn].sample # leftovers:call puts, warn
|
135
135
|
send(method, 'text')
|
@@ -137,6 +137,26 @@ send(method, 'text')
|
|
137
137
|
|
138
138
|
This would consider `puts` and `warn` to both have been called
|
139
139
|
|
140
|
+
### `# leftovers:dynamic:*`
|
141
|
+
To mark a dynamic call for literal hash and array values without enumerating everything in the comment again, use `leftovers:dynamic:` on the same line as the beginning of the array or hash
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
[ # leftovers:dynamic:call_login
|
145
|
+
:user,
|
146
|
+
:admin
|
147
|
+
].each { |method| send("#{method}_login") }
|
148
|
+
```
|
149
|
+
|
150
|
+
with the following configuration matching the `name: value` to the `leftovers:dynamic:process_name`
|
151
|
+
|
152
|
+
```yaml
|
153
|
+
dynamic:
|
154
|
+
name: call_login
|
155
|
+
arguments: '*'
|
156
|
+
add_suffix: '_login'
|
157
|
+
```
|
158
|
+
This would consider `user_login` and `admin_login` to both have been called.
|
159
|
+
|
140
160
|
## Configuration file
|
141
161
|
|
142
162
|
The configuration is read from `.leftovers.yml` in your project root.
|
@@ -163,7 +183,7 @@ see the [built in config files](https://github.com/robotdana/leftovers/tree/main
|
|
163
183
|
|
164
184
|
Add the method/pattern to the `dynamic:` list with `skip: true` in the `.leftovers.yml`, or add an inline comment with the list of possibilities `# leftovers:call my_method_1, my_method_2`.
|
165
185
|
- Leftovers compares by name only, so multiple definitions with the same name will count as used even if only one is.
|
166
|
-
- haml & erb line and column numbers will be wrong as the files have to be precompiled before checking.
|
186
|
+
- haml, slim & erb line and column numbers will be wrong as the files have to be precompiled before checking.
|
167
187
|
|
168
188
|
## Other tools
|
169
189
|
|
data/docs/Configuration.md
CHANGED
@@ -7,7 +7,10 @@ Its presence is optional and all of these settings are optional.
|
|
7
7
|
- [`exclude_paths:`](#exclude_paths)
|
8
8
|
- [`test_paths:`](#test_paths)
|
9
9
|
- [`haml_paths:`](#haml_paths)
|
10
|
+
- [`slim_paths:`](#slim_paths)
|
10
11
|
- [`erb_paths:`](#erb_paths)
|
12
|
+
- [`yaml_paths:`](#yaml_paths)
|
13
|
+
- [`json_paths:`](#json_paths)
|
11
14
|
- [`requires:`](#requires)
|
12
15
|
- [`gems:`](#gems)
|
13
16
|
- [`keep:`](#keep)
|
@@ -92,6 +95,18 @@ haml_paths:
|
|
92
95
|
|
93
96
|
Arrays are not necessary for single values. `*.haml` is recognized by default
|
94
97
|
|
98
|
+
## `slim_paths:`
|
99
|
+
|
100
|
+
list filenames/paths of test directories that are in the slim format
|
101
|
+
Defined using the [.gitignore pattern format](https://git-scm.com/docs/gitignore#_pattern_format)
|
102
|
+
|
103
|
+
```yml
|
104
|
+
slim_paths:
|
105
|
+
- '*.slim'
|
106
|
+
```
|
107
|
+
|
108
|
+
Arrays are not necessary for single values. `*.slim` is recognized by default
|
109
|
+
|
95
110
|
## `erb_paths:`
|
96
111
|
|
97
112
|
list filenames/paths of test directories that are in the erb format
|
@@ -104,6 +119,76 @@ erb_paths:
|
|
104
119
|
|
105
120
|
Arrays are not necessary for single values. `*.erb` is recognized by default
|
106
121
|
|
122
|
+
## `yaml_paths:`
|
123
|
+
|
124
|
+
list filenames/paths of test directories that are in the yaml format
|
125
|
+
Defined using the [.gitignore pattern format](https://git-scm.com/docs/gitignore#_pattern_format)
|
126
|
+
|
127
|
+
```yml
|
128
|
+
include:
|
129
|
+
- 'config/*.yml'
|
130
|
+
yaml_paths:
|
131
|
+
- '*.yml'
|
132
|
+
```
|
133
|
+
|
134
|
+
These documents will consider yaml tags like `!ruby/class 'MyClass'` to be a call to `MyClass` and render the structure of the yaml as arguments for the [`document:true`](#document-true) rule.
|
135
|
+
|
136
|
+
so you could, e.g. read the class name out of a yaml document like:
|
137
|
+
|
138
|
+
```yml
|
139
|
+
class_name: MyClass
|
140
|
+
```
|
141
|
+
|
142
|
+
with config like:
|
143
|
+
|
144
|
+
```yml
|
145
|
+
include_paths:
|
146
|
+
- 'config/*.yml'
|
147
|
+
|
148
|
+
dynamic:
|
149
|
+
document: true
|
150
|
+
path: config/*.yml
|
151
|
+
calls:
|
152
|
+
argument: class_name
|
153
|
+
```
|
154
|
+
|
155
|
+
[`nested:`](#nested) may be useful for more complex yaml structures
|
156
|
+
|
157
|
+
## `json_paths:`
|
158
|
+
|
159
|
+
list filenames/paths of test directories that are in the json format
|
160
|
+
Defined using the [.gitignore pattern format](https://git-scm.com/docs/gitignore#_pattern_format)
|
161
|
+
|
162
|
+
```yml
|
163
|
+
include:
|
164
|
+
- 'config/*.json'
|
165
|
+
json_paths:
|
166
|
+
- '*.json'
|
167
|
+
```
|
168
|
+
|
169
|
+
These documents render the structure of the yaml as arguments for the [`document:true`](#document-true) rule.
|
170
|
+
|
171
|
+
so you could, e.g. read the class name out of a yaml document like:
|
172
|
+
|
173
|
+
```json
|
174
|
+
{ "class_name": "MyClass" }
|
175
|
+
```
|
176
|
+
|
177
|
+
with config like:
|
178
|
+
|
179
|
+
```yml
|
180
|
+
include_paths:
|
181
|
+
- 'config/*.json'
|
182
|
+
|
183
|
+
dynamic:
|
184
|
+
document: true
|
185
|
+
path: config/*.json
|
186
|
+
calls:
|
187
|
+
argument: class_name
|
188
|
+
```
|
189
|
+
|
190
|
+
[`nested:`](#nested) may be useful for more complex json structures
|
191
|
+
|
107
192
|
## `gems:`
|
108
193
|
_alias `gem:`_
|
109
194
|
|
@@ -189,7 +274,8 @@ Each entry must have at least one of the following properties to restrict which
|
|
189
274
|
- [`paths:`](#paths)
|
190
275
|
- [`has_arguments:`](#has_arguments)
|
191
276
|
- [`has_receiver:`](#has_receiver)
|
192
|
-
- [`unless
|
277
|
+
- [`unless:`](#unless)
|
278
|
+
- [`document: true`](#document-true)
|
193
279
|
|
194
280
|
And must have one or both of
|
195
281
|
- ['calls:`](#calls-defines)
|
@@ -286,6 +372,33 @@ keep:
|
|
286
372
|
path: /app/helpers
|
287
373
|
```
|
288
374
|
|
375
|
+
## `document: true`
|
376
|
+
|
377
|
+
Instructs to consider the whole document. this is useful when parsing [YAML](#yaml-paths) or [JSON](#json-paths) config files for various values.
|
378
|
+
|
379
|
+
e.g.
|
380
|
+
|
381
|
+
```yml
|
382
|
+
includes: /config/roles.yml
|
383
|
+
dynamic:
|
384
|
+
- document: true
|
385
|
+
path: /config/roles.yml
|
386
|
+
defines:
|
387
|
+
arguments: '*'
|
388
|
+
add_suffix: '?'
|
389
|
+
add_prefix: can_
|
390
|
+
```
|
391
|
+
|
392
|
+
will parse "config/roles.yml"
|
393
|
+
```yml
|
394
|
+
- build_house
|
395
|
+
- drive_car
|
396
|
+
```
|
397
|
+
|
398
|
+
and consider it to have created methods like `can_build_house?` and `can_drive_car?`
|
399
|
+
|
400
|
+
[`nested:`](#nested) may be useful for more complex data structures
|
401
|
+
|
289
402
|
## `calls:`, `defines:`
|
290
403
|
_aliases `call:`, `define:`_
|
291
404
|
|
@@ -353,7 +466,9 @@ It can have any of these properties:
|
|
353
466
|
- [`at:`](#at)
|
354
467
|
- [`has_value:`](#has_value_has_receiver)
|
355
468
|
|
356
|
-
Arrays are not necessary for single values and if the rule contains only `at:` it can be omitted, and the values moved up a level
|
469
|
+
Arrays are not necessary for single values and if the rule contains only `at:` it can be omitted, and the values moved up a level.
|
470
|
+
|
471
|
+
Positional arguments are zero indexed
|
357
472
|
|
358
473
|
## `has_arguments:`
|
359
474
|
_alias `has_argument:`_
|
@@ -371,6 +486,8 @@ It can have any of these properties:
|
|
371
486
|
|
372
487
|
Arrays are not necessary for single values and if the rule contains only `at:` it can be omitted, and the values moved up a level
|
373
488
|
|
489
|
+
Positional arguments are zero indexed
|
490
|
+
|
374
491
|
## `keywords:`
|
375
492
|
When the keyword argument **keywords** are the thing being called.
|
376
493
|
|
data/leftovers.gemspec
CHANGED
@@ -17,7 +17,9 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.metadata['homepage_uri'] = spec.homepage
|
18
18
|
spec.metadata['source_code_uri'] = 'http://github.com/robotdana/leftovers'
|
19
19
|
spec.metadata['changelog_uri'] = 'http://github.com/robotdana/leftovers/blob/main/CHANGELOG.md'
|
20
|
-
|
20
|
+
|
21
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
22
|
+
spec.required_ruby_version = '>= 2.5.0'
|
21
23
|
|
22
24
|
spec.files = Dir.glob('{lib,exe,docs}/**/{*,.*}') + %w{
|
23
25
|
CHANGELOG.md
|
@@ -37,11 +39,13 @@ Gem::Specification.new do |spec|
|
|
37
39
|
spec.add_development_dependency 'pry', '~> 0.1'
|
38
40
|
spec.add_development_dependency 'rake', '>= 13'
|
39
41
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
40
|
-
spec.add_development_dependency 'rubocop'
|
41
|
-
spec.add_development_dependency 'rubocop-performance'
|
42
|
-
spec.add_development_dependency 'rubocop-
|
42
|
+
spec.add_development_dependency 'rubocop'
|
43
|
+
spec.add_development_dependency 'rubocop-performance'
|
44
|
+
spec.add_development_dependency 'rubocop-rake'
|
45
|
+
spec.add_development_dependency 'rubocop-rspec'
|
43
46
|
spec.add_development_dependency 'simplecov', '>= 0.18.5'
|
44
47
|
spec.add_development_dependency 'simplecov-console'
|
48
|
+
spec.add_development_dependency 'slim'
|
45
49
|
spec.add_development_dependency 'timecop'
|
46
50
|
spec.add_development_dependency 'tty_string', '>= 0.2.1'
|
47
51
|
|
data/lib/.DS_Store
ADDED
Binary file
|
data/lib/config/actionpack.yml
CHANGED
@@ -73,8 +73,12 @@ dynamic:
|
|
73
73
|
- name:
|
74
74
|
- resource
|
75
75
|
- resources
|
76
|
+
has_argument: 0
|
76
77
|
calls:
|
77
78
|
- argument: only
|
79
|
+
- argument: only
|
80
|
+
nested:
|
81
|
+
argument: '*'
|
78
82
|
- argument: controller
|
79
83
|
camelize: true
|
80
84
|
add_suffix: Controller
|
@@ -82,6 +86,7 @@ dynamic:
|
|
82
86
|
- name:
|
83
87
|
- resource
|
84
88
|
- resources
|
89
|
+
has_argument: 0
|
85
90
|
unless:
|
86
91
|
has_argument:
|
87
92
|
- at: only
|
@@ -96,6 +101,7 @@ dynamic:
|
|
96
101
|
- name:
|
97
102
|
- resource
|
98
103
|
- resources
|
104
|
+
has_argument: 0
|
99
105
|
unless:
|
100
106
|
has_argument:
|
101
107
|
- at: only
|
@@ -110,6 +116,7 @@ dynamic:
|
|
110
116
|
- name:
|
111
117
|
- resource
|
112
118
|
- resources
|
119
|
+
has_argument: 0
|
113
120
|
unless:
|
114
121
|
has_argument:
|
115
122
|
- at: only
|
@@ -124,6 +131,7 @@ dynamic:
|
|
124
131
|
- name:
|
125
132
|
- resource
|
126
133
|
- resources
|
134
|
+
has_argument: 0
|
127
135
|
unless:
|
128
136
|
has_argument:
|
129
137
|
- at: only
|
@@ -138,6 +146,7 @@ dynamic:
|
|
138
146
|
- name:
|
139
147
|
- resource
|
140
148
|
- resources
|
149
|
+
has_argument: 0
|
141
150
|
unless:
|
142
151
|
has_argument:
|
143
152
|
- at: only
|
@@ -152,6 +161,7 @@ dynamic:
|
|
152
161
|
- name:
|
153
162
|
- resource
|
154
163
|
- resources
|
164
|
+
has_argument: 0
|
155
165
|
unless:
|
156
166
|
has_argument:
|
157
167
|
- at: only
|
@@ -165,6 +175,7 @@ dynamic:
|
|
165
175
|
- value: destroy
|
166
176
|
- name:
|
167
177
|
- resources
|
178
|
+
- resource
|
168
179
|
- controller
|
169
180
|
- namespace
|
170
181
|
calls:
|
data/lib/config/ruby.yml
CHANGED
@@ -10,6 +10,13 @@ include_paths:
|
|
10
10
|
- '*.erb'
|
11
11
|
- '*.rb'
|
12
12
|
|
13
|
+
yaml_paths:
|
14
|
+
- '*.yml'
|
15
|
+
- '*.yaml'
|
16
|
+
|
17
|
+
json_paths:
|
18
|
+
- '*.json'
|
19
|
+
|
13
20
|
test_paths:
|
14
21
|
- /tests/
|
15
22
|
- /test/
|
@@ -20,6 +27,9 @@ erb_paths:
|
|
20
27
|
haml_paths:
|
21
28
|
- '*.haml'
|
22
29
|
|
30
|
+
slim_paths:
|
31
|
+
- '*.slim'
|
32
|
+
|
23
33
|
keep:
|
24
34
|
- initialize # called by new
|
25
35
|
- inspect # called by repl, to_s
|
data/lib/config/slim.yml
ADDED
data/lib/leftovers/collector.rb
CHANGED
@@ -28,7 +28,9 @@ module Leftovers
|
|
28
28
|
|
29
29
|
def collect_file_list(list)
|
30
30
|
if Leftovers.parallel?
|
31
|
-
Parallel.each(list, finish: method(:finish_file)
|
31
|
+
Parallel.each(list, finish: method(:finish_file)) do |file|
|
32
|
+
collect_file(file)
|
33
|
+
end
|
32
34
|
else
|
33
35
|
list.each { |file| finish_file(nil, nil, collect_file(file)) }
|
34
36
|
end
|
data/lib/leftovers/config.rb
CHANGED
@@ -4,10 +4,6 @@ require 'yaml'
|
|
4
4
|
|
5
5
|
module Leftovers
|
6
6
|
class Config
|
7
|
-
# :nocov:
|
8
|
-
using ::Leftovers::Backports::SetCaseEq if defined?(::Leftovers::Backports::SetCaseEq)
|
9
|
-
# :nocov:
|
10
|
-
|
11
7
|
attr_reader :name
|
12
8
|
|
13
9
|
def initialize(name, path: nil, content: nil)
|
@@ -36,6 +32,18 @@ module Leftovers
|
|
36
32
|
@haml_paths ||= Array(yaml[:haml_paths])
|
37
33
|
end
|
38
34
|
|
35
|
+
def slim_paths
|
36
|
+
@slim_paths ||= Array(yaml[:slim_paths])
|
37
|
+
end
|
38
|
+
|
39
|
+
def yaml_paths
|
40
|
+
@yaml_paths ||= Array(yaml[:yaml_paths])
|
41
|
+
end
|
42
|
+
|
43
|
+
def json_paths
|
44
|
+
@json_paths ||= Array(yaml[:json_paths])
|
45
|
+
end
|
46
|
+
|
39
47
|
def erb_paths
|
40
48
|
@erb_paths ||= Array(yaml[:erb_paths])
|
41
49
|
end
|