1TIDYALL(1) User Contributed Perl Documentation TIDYALL(1)
2
3
4
6 tidyall - Your all-in-one code tidier and validator
7
9 # Create a tidyall.ini or .tidyallrc at the top of your project
10 #
11 [PerlTidy]
12 select = **/*.{pl,pm,t}
13 argv = -noll -it=2
14
15 [PerlCritic]
16 select = lib/**/*.pm
17 ignore = lib/UtterHack.pm
18 argv = -severity 3
19
20 # Process all files in the current project,
21 # look upwards from cwd for conf file
22 #
23 % tidyall -a
24
25 # Process one or more specific files,
26 # look upwards from the first file for conf file
27 #
28 % tidyall file [file...]
29
30 # Process a directory recursively
31 #
32 % tidyall -r dir
33
35 There are a lot of great code tidiers and validators out there.
36 "tidyall" makes them available from a single unified interface.
37
38 You can run "tidyall" on a single file or on an entire project
39 hierarchy, and configure which tidiers/validators are applied to which
40 files. "tidyall" will back up files beforehand, and for efficiency will
41 only consider files that have changed since they were last processed.
42
43 What's a tidier? What's a validator?
44 A tidier transforms a file so as to improve its appearance without
45 changing its semantics. Examples include perltidy, podtidy and js-
46 beautify <https://npmjs.org/package/js-beautify>.
47
48 A validator analyzes a file for some definition of correctness.
49 Examples include perlcritic, podchecker and jshint
50 <http://www.jshint.com/>.
51
52 Many tidiers are also validators, e.g. "perltidy" will throw an error
53 on badly formed Perl.
54
55 To use a tidier or validator with "tidyall" it must have a
56 corresponding plugin class, usually under the prefix
57 "Code::TidyAll::Plugin::". This distribution comes with plugins for:
58
59 • Perl: perlcritic, perltidy, perltidy-sweet
60
61 • Pod: podchecker, podspell, podtidy
62
63 • Mason: masontidy
64
65 • JavaScript: js-beautify, jshint, jslint
66
67 • JSON: JSON
68
69 • CSS: cssunminifier
70
71 • PHP: phpcs
72
73 • Misc: Code::TidyAll::Plugin::SortLines
74
75 See Code::TidyAll::Plugin for information about creating your own
76 plugin.
77
79 "tidyall" works on a project basis, where a project is just a directory
80 hierarchy of files. svn or git working directories are typical examples
81 of projects.
82
83 The top of the project is called the root directory. In the root
84 directory you'll need a config file named "tidyall.ini" or
85 ".tidyallrc"; it defines how various tidiers and validators will be
86 applied to the files in your project.
87
88 "tidyall" will find your root directory and config file automatically
89 depending on how you call it:
90
91 "tidyall file [file...]"
92 "tidyall" will search upwards from the first file for the conf
93 file.
94
95 "tidyall -p/--pipe file"
96 "tidyall" will search upwards from the specified file for the conf
97 file.
98
99 "tidyall -a/--all" or "tidyall -s/--svn" or "tidyall -g/--git"
100 "tidyall" will search upwards from the current working directory
101 for the conf file.
102
103 "tidyall -a --root-dir dir"
104 "tidyall" will expect to find the conf file in the specified root
105 directory.
106
107 You can also pass --conf-name to change the name that is searched for,
108 or --conf-file to specify an explicit path.
109
111 The config file ("tidyall.ini" or ".tidyallrc") is in Config::INI
112 format. Here's a sample:
113
114 ignore = **/*.bak
115
116 [PerlTidy]
117 select = **/*.{pl,pm,t}
118 argv = -noll -it=2
119
120 [PerlCritic]
121 select = lib/**/*.pm
122 ignore = lib/UtterHack.pm lib/OneTime/*.pm
123 argv = -severity 3
124
125 [PodTidy]
126 select = lib/**/*.{pm,pod}
127
128 In order, the four sections declare:
129
130 • Always ignore "*.bak" files.
131
132 • Apply "PerlTidy" with settings "-noll -it=2" to all *.pl, *.pm, and
133 *.t files.
134
135 • Apply "PerlCritic" with severity 3 to all Perl modules somewhere
136 underneath "lib/", except for "lib/UtterHack.pm".
137
138 • Apply "PodTidy" with default settings to all *.pm and *.pod files
139 underneath "lib/".
140
141 Standard configuration elements
142 [class] or [class description]
143 The header of each section refers to a tidyall plugin. The name is
144 automatically prefixed with "Code::TidyAll::Plugin::" unless it
145 begins with a '+', e.g.
146
147 ; Uses plugin Code::TidyAll::Plugin::PerlTidy
148 ;
149 [PerlTidy]
150
151 ; Uses plugin My::TidyAll::Plugin
152 ;
153 [+My::TidyAll::Plugin]
154
155 You can also include an optional description after the class. The
156 description will be ignored and only the first word will be used
157 for the plugin. This allows you to a list a plugin more than once,
158 with different configuration each time. For example, two different
159 "PerlCritic" configurations:
160
161 ; Be brutal on libraries
162 ;
163 [PerlCritic strict]
164 select = lib/**/*.pm
165 argv = --brutal
166
167 ; but gentle on scripts
168 ;
169 [PerlCritic lenient]
170 select = bin/**/*.pl
171 argv = --gentle
172
173 Warning: If you simply list the same plugin twice with no
174 description (or the same description), one of them will be silently
175 ignored.
176
177 select
178 One or more File::Zglob patterns, separated by whitespace or on
179 multiple lines, indicating which files to select. At least one is
180 required. e.g.
181
182 ; All .t and .pl somewhere under bin and t;
183 ; plus all .pm files directly under lib/Foo and lib/Bar
184 ;
185 select = {bin,t}/**/*.p[lm]
186 select = lib/{Foo,Bar}/*.pm
187
188 ; All .txt files anywhere in the project
189 ;
190 select = **/*.txt
191
192 The pattern is relative to the root directory and should have no
193 leading slash. All standard glob characters ("*", "?", "[]", "{}")
194 will work; in addition, "**" can be used to represent zero or more
195 directories. See File::Zglob documentation for more details.
196
197 ignore
198 One or more File::Zglob patterns, separated by whitespace or on
199 multiple lines, indicating which files to ignore. This is optional
200 and overrides "select". e.g.
201
202 ; All .pl files anywhere under bin, except bin/awful.pl or anywhere
203 ; under bin/tmp
204 ;
205 select = bin/**/*.pl
206 ignore = bin/awful.pl bin/tmp/**/*.pl
207
208 Ignore patterns can also specified at the beginning of the file
209 before any plugin section was started, thus making them global.
210 These ignores will be applied for all plugins.
211
212 shebang
213 One or more words on multiple lines, indicating which shebang lines
214 to accept. This is optional and further filters "select". e.g.
215
216 ; All files with no extension anywhere under bin that include a "perl" or
217 ; "perl5" shebang line.
218 select = bin/**/*
219 ignore = bin/**/*.*
220 shebang = perl
221 shebang = perl5
222
223 only_modes
224 A list of modes, separated by whitespace. e.g.
225
226 only_modes = test cli
227
228 The plugin will only run if one of these modes is passed to
229 "tidyall" via "-m" or "--mode".
230
231 except_modes
232 A list of modes, separated by whitespace. e.g.
233
234 except_modes = commit editor
235
236 The plugin will not run if one of these modes is passed to
237 "tidyall" via "-m" or "--mode".
238
239 argv
240 Many plugins (such as perltidy, perlcritic and podtidy) take this
241 option, which specifies arguments to pass to the underlying
242 command-line utility.
243
244 weight
245 This is an integer that is used to sort plugins. By default, tidier
246 plugins run first, then validator plugins, with each group sorted
247 alphabetically.
248
250 If multiple plugins match a file, tidiers are applied before validators
251 so that validators are checking the final result. Within those two
252 groups, the plugins are applied in alphabetical order by plugin
253 name/description.
254
255 You can also explicitly set the weight of each plugin. By default,
256 tidiers have a weight of 50 and validators have a weight of 60. You can
257 set the weight to any integer to influence when the plugin runs.
258
259 The application of multiple plugins is all-or-nothing. If an error
260 occurs during the application of any plugin, the file is not modified
261 at all.
262
264 -a, --all
265 Process all files. Does a recursive search for all files in the
266 project hierarchy, starting at the root, and processes any file
267 that matches at least one plugin in the configuration.
268
269 -i, --ignore
270 Ignore matching files. This uses zglob syntax. You can pass this
271 option more than once.
272
273 -g, --git
274 Process all added or modified files in the current git working
275 directory.
276
277 -l, --list
278 List each file along with the list of plugins it matches (files
279 without any matches are skipped). Does not actually process any
280 files and does not care whether files are cached. Generally used
281 with -a, -g, or -s. e.g.
282
283 % tidyall -a -l
284 lib/CHI.pm (PerlCritic, PerlTidy, PodTidy)
285 lib/CHI/Benchmarks.pod (PodTidy)
286 lib/CHI/CacheObject.pm (PerlCritic, PerlTidy, PodTidy)
287
288 -m, --mode
289 Optional mode that can affect which plugins run. Defaults to "cli".
290 See "MODES".
291
292 -p path, --pipe path
293 Read content from STDIN and write the resulting content to STDOUT.
294 If successful, tidyall exits with status 0. If an error occurs,
295 tidyall outputs the error message to STDERR, mirrors the input
296 content to STDOUT with no changes, and exits with status 1. The
297 mirroring means that you can safely pipe to your destination
298 regardless of whether an error occurs.
299
300 When specifying this option you must specify exactly one filename,
301 relative or absolute, which will be used to determine which plugins
302 to apply and also where the root directory and configuration file
303 are. The file will not actually be read and does need even need to
304 exist.
305
306 This option implies --no-backups and --no-cache (since there's no
307 actual file) and --quiet (since we don't want to mix extraneous
308 output with the tidied result).
309
310 # Read from STDIN and write to STDOUT, with appropriate plugins
311 # for some/path.pl (which need not exist)
312 #
313 % tidyall --pipe some/path.pl
314
315 -r, --recursive
316 Recursively enter any directories listed on the command-line and
317 process all the files within. By default, directories encountered
318 on the command-line will generate a warning.
319
320 -j, --jobs
321 Specify how many jobs should run in parallel. By default, we only
322 run 1, but if you have multiple cores this should cause tidyall to
323 run faster, especially on larger code bases.
324
325 -s, --svn
326 Process all added or modified files in the current svn working
327 directory.
328
329 -q, --quiet
330 Suppress output except for errors.
331
332 -v, --verbose
333 Show extra output.
334
335 -I path1,path2,...
336 Add one or more library paths to @INC, like Perl's -I. Useful if
337 --tidyall-class or plugins are in an alternate lib directory.
338
339 --backup-ttl duration
340 Amount of time before backup files can be purged. Can be a number
341 of seconds or any string recognized by Time::Duration::Parse, e.g.
342 "4h" or "1day". Defaults to "1h".
343
344 --check-only
345 Instead of actually tidying files, check if each file is tidied
346 (i.e. if its tidied version is equal to its current version) and
347 consider it an error if not. This is used by Test::Code::TidyAll
348 and the svn and git pre-commit hooks, for example, to enforce that
349 you've tidied your files.
350
351 --plugins name
352 Only run the specified plugins. The name should match the name
353 given in the config file exactly, including a leading "+" if one
354 exists.
355
356 This overrides the "--mode" option.
357
358 Note that plugins will still only run on files which match their
359 "select" and "ignore" configuration.
360
361 --conf-file path
362 Specify relative or absolute path to conf file, instead of
363 searching for it in the usual way.
364
365 --conf-name name
366 Specify a conf file name to search for instead of the defaults
367 ("tidyall.ini" / ".tidyallrc").
368
369 --data-dir path
370 Contains data like backups and cache. Defaults to
371 root_dir/.tidyall.d
372
373 --iterations count
374 Run each tidier transform count times. Default is 1.
375
376 In some cases (hopefully rare) the output from a tidier can be
377 different if it is applied multiple times. You may want to perform
378 multiple iterations to make sure the content "settles" into its
379 final tidied form -- especially if the tidiness is being enforced
380 with a version-control hook or a test. Of course, performance will
381 suffer a little. You should rarely need to set this higher than 2.
382
383 This only affects tidiers, not validators; e.g. perlcritic and
384 jshint would still only be run once.
385
386 --no-backups
387 Don't backup files before processing.
388
389 --no-cache
390 Don't cache last processed times; process all files every time. See
391 also "--refresh-cache".
392
393 --no-cleanup
394 Don't clean up temporary files.
395
396 --output-suffix suffix
397 Suffix to add to a filename before outputting the modified version,
398 e.g. ".tdy". Default is none, which means overwrite the file.
399
400 --refresh-cache
401 Erase any existing cache info before processing each file, then
402 write new cache info. See also "--no-cache".
403
404 --root-dir
405 Specify root directory explicitly. Usually this is inferred from
406 the specified files or the current working directory.
407
408 --tidyall-class class
409 Subclass to use instead of "Code::TidyAll".
410
411 --version
412 Show the version of Code::TidyAll that this script invokes.
413
414 -h, --help
415 Print help message
416
417 Specifying options in configuration
418 Almost any command-line option can be specified at the top of the
419 config file, above the plugin sections. Replace dashes with
420 underscores. e.g.
421
422 backup_ttl = 4h
423 iterations = 2
424 tidyall_class = My::Code::TidyAll
425
426 [PerlTidy]
427 select = **/*.{pl,pm,t}
428 argv = -noll -it=2
429
430 ...
431
432 If an option is passed in both places, the command-line takes
433 precedence.
434
435 inc
436
437 You can specify "inc" as a global configuration option outside of any
438 plugin's section. You can specify this more than once to include
439 multiple directories. Any directories you list here will be prepended
440 to @INC before loading plugins or a "tidyall_class"
441
443 "tidyall" will exit with status 1 if any errors occurred while
444 processing files, and 0 otherwise.
445
447 You can use tidyall in a number of different contexts, and you may not
448 want to run all plugins in all of them.
449
450 You can pass a mode to tidyall via "-m" or "--mode", and then specify
451 that certain plugins should only be run in certain modes (via
452 "only_modes") or should be run in all but certain modes (via
453 "except_modes").
454
455 Examples of modes:
456
457 • "cli" - when invoking tidyall explicitly from the command-line with
458 no mode specified
459
460 • "editor" - when invoking from an editor
461
462 • "commit" - when using a commit hook like
463 Code::TidyAll::SVN::Precommit or Code::TidyAll::Git::Precommit
464
465 • "test" - when using Test::Code::TidyAll
466
467 Now since perlcritic is a bit time-consuming, you might only want to
468 run it during tests and explicit command-line invocation:
469
470 [PerlCritic]
471 select = lib/**/*.pm
472 only_modes = test cli
473 ...
474
475 Or you could specify that it be run in all modes except the editor:
476
477 [PerlCritic]
478 select = lib/**/*.pm
479 except_modes = editor
480 ...
481
482 If you specify neither "only_modes" nor "except_modes" for a plugin,
483 then it will always run.
484
486 "tidyall" keeps track of each file's signature after it was last
487 processed. On subsequent runs, it will only process a file if its
488 signature has changed. The cache is kept in files under the data dir.
489
490 You can force a refresh of the cache with "--refresh-cache", or turn
491 off the behavior entirely with "--no-cache".
492
494 "tidyall" will backup each file before modifying it. The timestamped
495 backups are kept in a separate directory hierarchy under the data dir.
496
497 Old backup files will be purged automatically as part of occasional
498 "tidyall" runs. The duration specified in "--backup-ttl" indicates both
499 the minimum amount of time backups should be kept, and the frequency
500 that purges should be run. It may be specified as "30m" or "4 hours" or
501 any string acceptable to Time::Duration::Parse. It defaults to "1h" (1
502 hour).
503
504 You can turn off backups with "--no-backups".
505
507 The "Code::TidyAll" distribution intentionally does not depend on the
508 prereqs needed for each plugin. This means that if you want to use the
509 perltidy, you must install the Perl::Tidy module manually.
510
512 • etc/editors/tidyall.el <https://raw.github.com/autarch-code/perl-
513 code-tidyall/master/etc/editors/tidyall.el> and
514 etc/editors/tidyall.vim <https://raw.github.com/autarch-code/perl-
515 code-tidyall/master/etc/editors/tidyall.vim> in this distribution
516 contains Emacs and Vim commands for running "tidyall" on the
517 current buffer. You can assign this to the keystroke of your choice
518 (e.g. ctrl-t or ,t).
519
520 • Code::TidyAll::SVN::Precommit implements a subversion pre-commit
521 hook that checks if all files are tidied and valid according to
522 "tidyall", and rejects the commit if not.
523
524 • Code::TidyAll::Git::Precommit and Code::TidyAll::Git::Prereceive
525 implement git pre-commit and pre-receive hooks, respectively, that
526 check if all files are tidied and valid according to "tidyall".
527
528 • Test::Code::TidyAll is a testing library to check that all the
529 files in your project are in a tidied and valid state.
530
532 • Does not yet work on Windows
533
535 Jonathan Swartz
536
538 Thanks to Jeff Thalhammer for helping me refine this API. Thanks to
539 Jeff for perlcritic, Steve Hancock for perltidy, and all the other
540 authors of great open source tidiers and validators.
541
542
543
544perl v5.36.0 2023-01-20 TIDYALL(1)