cowl 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONFIGURE.md +50 -0
- data/README.md +85 -0
- data/bin/cowl +54 -15
- data/lib/cowl.rb +24 -9
- data/lib/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 436d01bac929781a14589af2137d683976216efd
|
4
|
+
data.tar.gz: 21b34be19ede64bfea48b8c1318d3ce644de4212
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 543230d30dff94fe4b73c722786835d2d426f225010f651eeec5afb4a49e452f6670587b2a041342db5a532a124917fccdd619262359cfa8ba749fe912992bac
|
7
|
+
data.tar.gz: 44ab04bc4bf5782135459ea0ba832de48081d03724f9f2cc0260991c840737aa2a709679e499c465db835e203070f377f478ddcbb6aafb3a7c83e410f9aa6c85
|
data/CONFIGURE.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Configuration
|
2
|
+
|
3
|
+
Cowl offers multiple ways to resolve preferences:
|
4
|
+
|
5
|
+
1. Command-line flags (`cowl -i`, `cowl -w`)
|
6
|
+
2. Dotfiles (`.cowlignore`, `.cowlrc.yml`)
|
7
|
+
3. Built-in defaults (`DEFAULT_IGNORES`, `DEFAULT_MAX_WIDTH`)
|
8
|
+
|
9
|
+
Any command-line flags that are present override the same settings in dotfiles and built-in defaults.
|
10
|
+
|
11
|
+
# Command-line flags
|
12
|
+
|
13
|
+
Run `cowl -h` or `cowl --help` for a full list, or refer to the source code for `bin/cowl`.
|
14
|
+
|
15
|
+
```
|
16
|
+
$ cowl -h
|
17
|
+
Usage: cowl [options] [<files>]
|
18
|
+
-i, --ignore pattern Ignore file names matching Ruby regex pattern
|
19
|
+
-w, --max-width= Maximum column width, either an integer or "unlimited". Default: 80
|
20
|
+
-h, --help Print usage info
|
21
|
+
-v, --version Print version info
|
22
|
+
```
|
23
|
+
|
24
|
+
# Dotfiles
|
25
|
+
|
26
|
+
Cowl automatically applies any `.cowlignore` and/or `.cowlrc.yml` configuration files in the same directory as a file being scanned, or a parent directory (`../.cowlignore`, `../.cowlrc.yml`), up to `$HOME/.cowlignore`, `$HOME/.cowlrc.yml`, if any such files exist.
|
27
|
+
|
28
|
+
## `.cowlignore`
|
29
|
+
|
30
|
+
Samples:
|
31
|
+
|
32
|
+
* [cowl/.cowlignore](https://github.com/mcandre/cowl/blob/master/.cowlignore)
|
33
|
+
* [examples/.cowlignore](https://github.com/mcandre/cowl/blob/master/examples/.cowlignore)
|
34
|
+
|
35
|
+
A `.cowlignore` may contain Ruby regex patterns of files and/or folders to exclude from scanning, one pattern per line.
|
36
|
+
|
37
|
+
## `.cowlrc.yml`
|
38
|
+
|
39
|
+
Samples:
|
40
|
+
|
41
|
+
* [cowl/.cowlrc.yml](https://github.com/mcandre/cowl/blob/master/.cowlrc.yml)
|
42
|
+
* [unwrapped-books/.cowlrc.yml](https://github.com/mcandre/cowl/blob/master/examples/unwrapped-books/.cowlrc.yml)
|
43
|
+
|
44
|
+
`.cowlrc.yml` may contain a number of keys:
|
45
|
+
|
46
|
+
* `max_width` may be an integer (e.g. `80`), or `unlimited`.
|
47
|
+
|
48
|
+
# Built-in defaults
|
49
|
+
|
50
|
+
`max_width` defaults to `80`.
|
data/README.md
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# cowl - column width linter
|
2
|
+
|
3
|
+
# HOMEPAGE
|
4
|
+
|
5
|
+
https://github.com/mcandre/cowl
|
6
|
+
|
7
|
+
# RUBYGEMS
|
8
|
+
|
9
|
+
https://rubygems.org/gems/cowl
|
10
|
+
|
11
|
+
# ABOUT
|
12
|
+
|
13
|
+
Cowl is a command line program for identifying text lines that are considered too long, wider than the conventional column width `80` or so.
|
14
|
+
|
15
|
+
cowl is a shell wrapper around the traditional GNU [grep](http://www.gnu.org/software/grep/) backend, presenting a frontend similar to modern linters like [Reek](https://github.com/troessner/reek/wiki) and [JSHint](http://jshint.com/).
|
16
|
+
|
17
|
+
* Recursive file search by default
|
18
|
+
* Optional ignore patterns
|
19
|
+
* Configuration via per-project and per-user [dotfiles](https://github.com/mcandre/cowl/blob/master/CONFIGURE.md#dotfiles)
|
20
|
+
* Install via a standard programming language package manager
|
21
|
+
|
22
|
+
# EXAMPLE
|
23
|
+
|
24
|
+
```
|
25
|
+
$ cowl examples/
|
26
|
+
examples/hello.bf:3:++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
|
27
|
+
|
28
|
+
$ wc -L examples/hello.bf
|
29
|
+
106 examples/hello.bf
|
30
|
+
|
31
|
+
$ cowl -w 106 examples/
|
32
|
+
$
|
33
|
+
|
34
|
+
$ cowl -i .bf examples/
|
35
|
+
$
|
36
|
+
```
|
37
|
+
|
38
|
+
# REQUIREMENTS
|
39
|
+
|
40
|
+
* [Ruby](https://www.ruby-lang.org/) 2+
|
41
|
+
* [grep](http://www.gnu.org/software/grep/) (often built-in, or provided by [git](http://git-scm.com/))
|
42
|
+
|
43
|
+
E.g., Windows users can `chocolatey install git`.
|
44
|
+
|
45
|
+
## Optional
|
46
|
+
|
47
|
+
* [wc](http://linux.die.net/man/1/wc) can help determine the longest line in a file
|
48
|
+
|
49
|
+
# INSTALL
|
50
|
+
|
51
|
+
Install via [RubyGems](http://rubygems.org/):
|
52
|
+
|
53
|
+
```
|
54
|
+
$ gem install cowl
|
55
|
+
```
|
56
|
+
|
57
|
+
# CONFIGURE
|
58
|
+
|
59
|
+
See [CONFIGURE.md](https://github.com/mcandre/cowl/blob/master/CONFIGURE.md) for details.
|
60
|
+
|
61
|
+
# LICENSE
|
62
|
+
|
63
|
+
FreeBSD
|
64
|
+
|
65
|
+
# DEVELOPMENT
|
66
|
+
|
67
|
+
## Testing
|
68
|
+
|
69
|
+
Keep the interface working:
|
70
|
+
|
71
|
+
```
|
72
|
+
$ cucumber
|
73
|
+
```
|
74
|
+
|
75
|
+
## Linting
|
76
|
+
|
77
|
+
Keep the code tidy:
|
78
|
+
|
79
|
+
```
|
80
|
+
$ rake lint
|
81
|
+
```
|
82
|
+
|
83
|
+
## Git Hooks
|
84
|
+
|
85
|
+
See `hooks/`.
|
data/bin/cowl
CHANGED
@@ -1,32 +1,30 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
require 'rubygems'
|
3
4
|
require 'find'
|
4
5
|
require 'optparse'
|
5
|
-
|
6
|
-
require 'rubygems'
|
6
|
+
require 'yaml'
|
7
7
|
require 'cowl'
|
8
8
|
|
9
|
+
IGNORE_FILENAME = '.cowlignore'
|
10
|
+
CONFIGURATION_FILENAME = '.cowlrc.yml'
|
11
|
+
|
9
12
|
def main
|
10
13
|
ignores = DEFAULT_IGNORES
|
11
14
|
|
12
15
|
filenames = ['.']
|
13
16
|
|
14
|
-
|
17
|
+
configuration_flags = {}
|
15
18
|
|
16
19
|
option = OptionParser.new do |option|
|
17
|
-
option.banner =
|
20
|
+
option.banner = "Usage: cowl [options] [<files>]"
|
18
21
|
|
19
22
|
option.on('-i', '--ignore pattern', 'Ignore file names matching Ruby regex pattern') do |pattern|
|
20
23
|
ignores << pattern
|
21
24
|
end
|
22
25
|
|
23
|
-
option.on('-w=', '--max-width',
|
24
|
-
max_width =
|
25
|
-
|
26
|
-
if max_width <= 0 then
|
27
|
-
puts option
|
28
|
-
exit
|
29
|
-
end
|
26
|
+
option.on('-w=', '--max-width', "Maximum column width, either an integer or \"unlimited\". Default: 80") do |max_width|
|
27
|
+
configuration_flags["max_width"] = max_width
|
30
28
|
end
|
31
29
|
|
32
30
|
option.on('-h', '--help', 'Print usage info') do
|
@@ -54,16 +52,57 @@ def main
|
|
54
52
|
end
|
55
53
|
end
|
56
54
|
|
57
|
-
|
55
|
+
configuration_dotfile = DEFAULT_CONFIGURATION
|
56
|
+
|
57
|
+
recursive_filenames.each do |f|
|
58
|
+
dir = File.expand_path("..", f)
|
59
|
+
|
60
|
+
parent_of_home = File.expand_path("..", ENV["HOME"])
|
61
|
+
|
62
|
+
while dir != parent_of_home
|
63
|
+
ignore_file = dir + File::SEPARATOR + IGNORE_FILENAME
|
64
|
+
|
65
|
+
if File.exist?(ignore_file) then
|
66
|
+
ignores.concat(open(ignore_file).read.split("\n"))
|
67
|
+
end
|
68
|
+
|
69
|
+
dir = File.expand_path("..", dir)
|
70
|
+
end
|
71
|
+
|
72
|
+
if ignores.none? { |ignore| f =~ %r(#{ignore}) } then
|
73
|
+
dir = File.expand_path("..", f)
|
74
|
+
|
75
|
+
parent_of_home = File.expand_path("..", ENV["HOME"])
|
76
|
+
|
77
|
+
while dir != parent_of_home
|
78
|
+
config_file = dir + File::SEPARATOR + CONFIGURATION_FILENAME
|
79
|
+
|
80
|
+
if File.exist?(config_file) then
|
81
|
+
configuration_dotfile = YAML.load_file(config_file)
|
82
|
+
break
|
83
|
+
else
|
84
|
+
dir = File.expand_path("..", dir)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Command line flags override dotfile settings
|
89
|
+
configuration = configuration_dotfile.merge(configuration_flags)
|
90
|
+
|
91
|
+
check(f, configuration)
|
92
|
+
end
|
93
|
+
end
|
58
94
|
end
|
59
95
|
|
60
96
|
begin
|
61
97
|
main
|
62
|
-
# User may quit
|
98
|
+
# User may quit before completion.
|
63
99
|
rescue Interrupt
|
64
100
|
nil
|
65
|
-
#
|
66
|
-
|
101
|
+
# Bad regex
|
102
|
+
rescue RegexpError => e
|
103
|
+
puts e
|
104
|
+
# This program may be piped to another program (e.g. `less`),
|
105
|
+
# which is quit before this program completes.
|
67
106
|
rescue Errno::EPIPE, Errno::EMFILE
|
68
107
|
nil
|
69
108
|
end
|
data/lib/cowl.rb
CHANGED
@@ -3,8 +3,6 @@ require 'ptools'
|
|
3
3
|
|
4
4
|
require 'version'
|
5
5
|
|
6
|
-
DEFAULT_MAX_WIDTH = 80
|
7
|
-
|
8
6
|
DEFAULT_IGNORES = %w(
|
9
7
|
.hg/
|
10
8
|
.svn/
|
@@ -24,6 +22,14 @@ DEFAULT_IGNORES = %w(
|
|
24
22
|
-min.js
|
25
23
|
)
|
26
24
|
|
25
|
+
DEFAULT_MAX_WIDTH = 80
|
26
|
+
|
27
|
+
UNLIMITED = 'unlimited'
|
28
|
+
|
29
|
+
DEFAULT_CONFIGURATION = {
|
30
|
+
"max_width" => DEFAULT_MAX_WIDTH
|
31
|
+
}
|
32
|
+
|
27
33
|
#
|
28
34
|
# Parse, model, and print a line too wide for its own good
|
29
35
|
#
|
@@ -53,17 +59,26 @@ end
|
|
53
59
|
def self.recursive_list(directory, ignores = DEFAULT_IGNORES)
|
54
60
|
Find.find(directory).reject do |f|
|
55
61
|
File.directory?(f) ||
|
56
|
-
ignores.any? { |ignore| f =~
|
57
|
-
|
62
|
+
ignores.any? { |ignore| f =~ %r(#{ignore}) } ||
|
63
|
+
|
64
|
+
begin
|
65
|
+
File.binary?(f)
|
66
|
+
rescue Errno::ENOENT
|
67
|
+
true
|
68
|
+
end
|
58
69
|
end
|
59
70
|
end
|
60
71
|
|
61
|
-
def self.check(filename,
|
62
|
-
|
72
|
+
def self.check(filename, configuration = DEFAULT_CONFIGURATION)
|
73
|
+
max_width = configuration["max_width"]
|
63
74
|
|
64
|
-
|
75
|
+
if max_width != UNLIMITED
|
76
|
+
output = `grep -n \'^.\\{#{max_width.to_i + 1},\\}$\' \"#{filename}\"`
|
65
77
|
|
66
|
-
|
78
|
+
lines = output.split("\n")
|
67
79
|
|
68
|
-
|
80
|
+
widenings = lines.map { |line| Widening.parse(filename, line) }
|
81
|
+
|
82
|
+
widenings.each { |m| puts m }
|
83
|
+
end
|
69
84
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cowl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Pennebaker
|
@@ -227,10 +227,12 @@ executables:
|
|
227
227
|
extensions: []
|
228
228
|
extra_rdoc_files: []
|
229
229
|
files:
|
230
|
-
- LICENSE.md
|
231
|
-
- bin/cowl
|
232
230
|
- lib/cowl.rb
|
233
231
|
- lib/version.rb
|
232
|
+
- CONFIGURE.md
|
233
|
+
- LICENSE.md
|
234
|
+
- README.md
|
235
|
+
- bin/cowl
|
234
236
|
homepage: https://github.com/mcandre/cowl
|
235
237
|
licenses:
|
236
238
|
- FreeBSD
|
@@ -251,8 +253,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
251
253
|
version: '0'
|
252
254
|
requirements: []
|
253
255
|
rubyforge_project:
|
254
|
-
rubygems_version: 2.
|
256
|
+
rubygems_version: 2.1.10
|
255
257
|
signing_key:
|
256
258
|
specification_version: 4
|
257
259
|
summary: column width linter
|
258
260
|
test_files: []
|
261
|
+
has_rdoc:
|