discover_tabs 0.5 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -1
- data/discover_tabs.gemspec +23 -0
- data/lib/discover_tabs.rb +96 -29
- data/lib/version.rb +1 -1
- data/spec/discover_tabs_spec.rb +114 -48
- data/spec/test_data/dir_with_some_tabbed_files/1.rb +2 -2
- data/spec/test_data/dir_with_some_tabbed_files/8/1.rb +2 -2
- data/spec/test_data/dir_with_some_tabbed_files/dir/4.rb +2 -2
- data/spec/test_data/dir_with_some_tabbed_files_and_different_extensions/tabs.cpp +2 -2
- data/spec/test_data/dir_with_some_tabbed_files_and_different_extensions/tabs.rb +2 -2
- data/spec/test_data/dir_without_tabbed_files/binary_file +0 -0
- data/spec/test_data/file_with_tabs.rb +2 -2
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e13fe304b1c8b92808bcd20b17a994774143f4b1
|
4
|
+
data.tar.gz: 1e649395b0c028c1470f383348e7e73c6ef0a669
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b673f98cdbf7819267b04701e2174d352209d9ca704bef66e4f92a98090436dcbfca5d2ecd9387bc53f3ba42efa6f957f9e98ba97f5af886a5a6223204135181
|
7
|
+
data.tar.gz: 086de983bfc6e27dbba21af102424313903470c935fbf58a077b9cf042c74d48336a3d568a0db8f9c837300a5913a73d80b8102a3333e3118ddaf3d3699231e9
|
data/README.md
CHANGED
@@ -1,4 +1,23 @@
|
|
1
1
|
discover_tabs
|
2
2
|
=============
|
3
3
|
|
4
|
-
Discover which files use tabs
|
4
|
+
Discover which files use tabs (and potentially replace them with spaces if you like)
|
5
|
+
|
6
|
+
### Usage
|
7
|
+
|
8
|
+
After installation, there should be a command line app called "discover_tabs" on your path.
|
9
|
+
|
10
|
+
usage: discover_tabs [options] [filename|directory]
|
11
|
+
-r N Replace tabs intending with N spaces
|
12
|
+
-h, --help Show this message
|
13
|
+
|
14
|
+
It will output all of the files that have indentation with tabs. The -r options will replace them with spaces.
|
15
|
+
|
16
|
+
examples:
|
17
|
+
|
18
|
+
* discover_tabs *.cpp
|
19
|
+
* discover_tabs *.cpp -r4
|
20
|
+
|
21
|
+
### Installation
|
22
|
+
|
23
|
+
gem discover_tabs
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.expand_path('../lib/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = 'discover_tabs'
|
6
|
+
gem.version = DiscoverTabs::VERSION
|
7
|
+
gem.date = Date.today.to_s
|
8
|
+
gem.license = 'MIT'
|
9
|
+
gem.executables = [ "discover_tabs" ]
|
10
|
+
|
11
|
+
gem.summary = "Discover which files are tab indented"
|
12
|
+
gem.description = "Library and Command line for discovering files that contain tab indentation"
|
13
|
+
|
14
|
+
gem.authors = ['Bas Vodde']
|
15
|
+
gem.email = 'basv@odd-e.com'
|
16
|
+
gem.homepage = 'https://github.com/basvodde/discover_tabs'
|
17
|
+
|
18
|
+
gem.add_runtime_dependency( 'rake', '~> 0')
|
19
|
+
gem.add_runtime_dependency( 'ptools', '~> 1.1')
|
20
|
+
gem.add_development_dependency('rspec', '~> 2.0', '>= 2.0.0')
|
21
|
+
|
22
|
+
gem.files = `git ls-files -- {.,test,spec,lib,bin}/*`.split("\n")
|
23
|
+
end
|
data/lib/discover_tabs.rb
CHANGED
@@ -1,45 +1,112 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
require 'ptools'
|
3
|
+
require 'optparse'
|
3
4
|
|
4
5
|
module DiscoverTabs
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def files_with_tab_indenting(full_path)
|
10
|
+
filename = File.basename(full_path)
|
11
|
+
dirname = File.dirname(full_path)
|
12
|
+
|
13
|
+
files_with_tabs = []
|
14
|
+
if File.directory?(full_path)
|
15
|
+
files_with_tabs += files_with_tab_indenting_in_dir(full_path)
|
16
|
+
elsif filename.include?("*")
|
17
|
+
files_with_tabs += files_with_tab_indenting_in_dir(dirname, filename)
|
18
|
+
else
|
19
|
+
files_with_tabs << full_path if file_has_tabs_indenting?(full_path)
|
20
|
+
end
|
21
|
+
files_with_tabs
|
22
|
+
end
|
23
|
+
|
24
|
+
def files_with_tab_indenting_in_dir(dir, pattern = "*")
|
25
|
+
files_with_tabs = []
|
26
|
+
Dir["#{dir}/**/#{pattern}"].each do |file|
|
27
|
+
begin
|
28
|
+
unless File.directory?(file) || File.binary?(file)
|
29
|
+
files_with_tabs << file if file_has_tabs_indenting?(file)
|
30
|
+
end
|
31
|
+
rescue ArgumentError
|
13
32
|
end
|
14
|
-
rescue ArgumentError
|
15
33
|
end
|
16
|
-
files_with_tabs
|
34
|
+
files_with_tabs
|
17
35
|
end
|
18
|
-
files_with_tabs
|
19
|
-
end
|
20
36
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
puts Pathname.new(filename).cleanpath.to_s
|
25
|
-
return true
|
37
|
+
def file_has_tabs_indenting?(filename)
|
38
|
+
File.readlines(filename).each do |line|
|
39
|
+
return true if line =~ /^\t+/
|
26
40
|
end
|
41
|
+
false
|
27
42
|
end
|
28
|
-
false
|
29
|
-
end
|
30
43
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
44
|
+
def parse_argv(argv)
|
45
|
+
options = {}
|
46
|
+
|
47
|
+
opt_parser = OptionParser.new do |opts|
|
48
|
+
opts.banner = "usage: discover_tabs [options] [filename|directory]"
|
49
|
+
|
50
|
+
opts.on("-r N", Integer, "Replace tabs intending with N spaces") do |n|
|
51
|
+
options[:replace_tabs] = n
|
52
|
+
end
|
53
|
+
|
54
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
55
|
+
puts opts.to_s
|
56
|
+
exit(0)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
opt_parser.parse!(argv)
|
60
|
+
|
61
|
+
options[:files] = argv
|
62
|
+
options[:files] = ["."] if argv.empty?
|
63
|
+
|
64
|
+
|
65
|
+
options
|
66
|
+
rescue OptionParser::InvalidOption => error
|
67
|
+
puts error.message
|
68
|
+
exit 1
|
69
|
+
end
|
70
|
+
|
71
|
+
def cmdline_run(argv)
|
72
|
+
options = parse_argv(argv)
|
73
|
+
|
74
|
+
files_with_tabs = []
|
75
|
+
options[:files].each do |full_path|
|
76
|
+
files_with_tabs += files_with_tab_indenting(full_path)
|
77
|
+
end
|
78
|
+
|
79
|
+
files_with_tabs.each { |file| puts Pathname.new(file).cleanpath.to_s }
|
80
|
+
|
81
|
+
if options[:replace_tabs]
|
82
|
+
replace_tabs_in_files(files_with_tabs, options[:replace_tabs])
|
83
|
+
end
|
84
|
+
|
85
|
+
files_with_tabs.empty? ? 1 : 0
|
86
|
+
end
|
87
|
+
|
88
|
+
def replace_tabs_in_files(files, amount_of_spaces_per_tab)
|
89
|
+
files.each do |file|
|
90
|
+
content = File.read(file)
|
91
|
+
new_content = replace_tabs_with_spaces(content, amount_of_spaces_per_tab)
|
92
|
+
File.write(file, new_content)
|
93
|
+
end
|
94
|
+
end
|
35
95
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
96
|
+
def replace_tabs_with_spaces(content, amount_of_spaces_per_tab)
|
97
|
+
new_content = ""
|
98
|
+
content.lines.each { |line| new_content += replace_tabs_with_spaces_on_line(line, amount_of_spaces_per_tab)}
|
99
|
+
new_content
|
100
|
+
end
|
101
|
+
|
102
|
+
def replace_tabs_with_spaces_on_line(string, amount_of_spaces_per_tab)
|
103
|
+
new_string = string
|
104
|
+
if string =~ /^(\t+)/
|
105
|
+
replacement_spaces = " " * amount_of_spaces_per_tab * $1.size
|
106
|
+
new_string = string.gsub(/^#{$1}/, replacement_spaces)
|
107
|
+
end
|
108
|
+
new_string
|
42
109
|
end
|
43
|
-
found_tabs ? 0 : 1
|
44
110
|
end
|
45
111
|
end
|
112
|
+
|
data/lib/version.rb
CHANGED
data/spec/discover_tabs_spec.rb
CHANGED
@@ -2,67 +2,133 @@ require 'spec_helper.rb'
|
|
2
2
|
|
3
3
|
describe "It can discover tabs" do
|
4
4
|
|
5
|
-
|
6
|
-
DiscoverTabs.should_receive(:puts).with(/file_with_tabs.rb/)
|
7
|
-
DiscoverTabs.in_file(test_data("file_with_tabs.rb")).should== true
|
8
|
-
end
|
5
|
+
context "Discovering files with tab indentation" do
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
7
|
+
it "Can discover tabs in one file" do
|
8
|
+
DiscoverTabs.file_has_tabs_indenting?(test_data("file_with_tabs.rb")).should== true
|
9
|
+
end
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
11
|
+
it "Won't discover tabs in one file without tabs" do
|
12
|
+
DiscoverTabs.file_has_tabs_indenting?(test_data("file_without_tabs.rb")).should== false
|
13
|
+
end
|
19
14
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
DiscoverTabs.should_receive(:puts).with(/dir_with_some_tabbed_files\/dir\/4.rb/)
|
24
|
-
DiscoverTabs.in_dir(test_data("dir_with_some_tabbed_files")).should== true
|
25
|
-
end
|
15
|
+
it "Won't discover any files with tabs in a directory when there are none" do
|
16
|
+
DiscoverTabs.files_with_tab_indenting_in_dir(test_data("dir_without_tabbled_files")).should be_empty
|
17
|
+
end
|
26
18
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
19
|
+
it "Won't discover any files with tabs in a directory when there are none" do
|
20
|
+
files_with_tabs = DiscoverTabs.files_with_tab_indenting_in_dir(test_data("dir_with_some_tabbed_files"))
|
21
|
+
files_with_tabs[0].should== test_data("dir_with_some_tabbed_files/1.rb")
|
22
|
+
files_with_tabs[1].should== test_data("dir_with_some_tabbed_files/8/1.rb")
|
23
|
+
files_with_tabs[2].should== test_data("dir_with_some_tabbed_files/dir/4.rb")
|
24
|
+
files_with_tabs.size.should== 3
|
25
|
+
end
|
31
26
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
27
|
+
it "Can deal with the current dir" do
|
28
|
+
DiscoverTabs.files_with_tab_indenting_in_dir(".").should_not be_empty
|
29
|
+
end
|
36
30
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
31
|
+
it "Should swallow ArgumentError expections" do
|
32
|
+
DiscoverTabs.stub(:file_has_tabs_indenting?).and_raise(ArgumentError)
|
33
|
+
DiscoverTabs.files_with_tab_indenting_in_dir(".").should== []
|
34
|
+
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
36
|
+
it "will only find the files with a certain extension" do
|
37
|
+
files_with_tabs = DiscoverTabs.files_with_tab_indenting_in_dir(test_data("dir_with_some_tabbed_files_and_different_extensions"), "*rb")
|
38
|
+
files_with_tabs.size.should== 1
|
39
|
+
files_with_tabs[0].should== test_data("dir_with_some_tabbed_files_and_different_extensions/tabs.rb")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "will discover tabs in a file when a filename it passed (success)" do
|
43
|
+
DiscoverTabs.should_receive(:file_has_tabs_indenting?).with(test_data("file_with_tabs.rb")).and_return(true)
|
44
|
+
DiscoverTabs.files_with_tab_indenting(test_data("file_with_tabs.rb")).should== [test_data("file_with_tabs.rb")]
|
45
|
+
end
|
48
46
|
|
49
|
-
|
50
|
-
|
51
|
-
|
47
|
+
it "will discover tabs in a dir when a directory it passed (failed)" do
|
48
|
+
DiscoverTabs.should_receive(:files_with_tab_indenting_in_dir).with(test_data("dir_with_some_tabbed_files")).and_return([])
|
49
|
+
DiscoverTabs.files_with_tab_indenting(test_data("dir_with_some_tabbed_files")).should== []
|
50
|
+
end
|
51
|
+
|
52
|
+
it "will discover a pattern (based on having an * in the filename) and it passes the pattern (success)" do
|
53
|
+
DiscoverTabs.should_receive(:files_with_tab_indenting_in_dir).with(test_data("dir_with_some_tabbed_files"), "*").and_return(["file"])
|
54
|
+
DiscoverTabs.files_with_tab_indenting(test_data("dir_with_some_tabbed_files/*")).should== ["file"]
|
55
|
+
end
|
52
56
|
end
|
53
57
|
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
context "tab replacement" do
|
59
|
+
|
60
|
+
it "will return the same line if there is no tab on the line" do
|
61
|
+
DiscoverTabs.replace_tabs_with_spaces_on_line("string", 4).should== "string"
|
62
|
+
end
|
63
|
+
|
64
|
+
it "will convert one tab at the beginning to spaces" do
|
65
|
+
DiscoverTabs.replace_tabs_with_spaces_on_line("\tstring", 2).should== " string"
|
66
|
+
end
|
67
|
+
|
68
|
+
it "will convert multiple tabs at the beginning to spaces" do
|
69
|
+
DiscoverTabs.replace_tabs_with_spaces_on_line("\t\t\tstring", 3).should== " string"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "will not convert tabs that are not at the beginning" do
|
73
|
+
DiscoverTabs.replace_tabs_with_spaces_on_line(" \tstri\tng\t", 3).should== " \tstri\tng\t"
|
74
|
+
end
|
75
|
+
|
76
|
+
it "will replace all tabs in a multi-line file" do
|
77
|
+
DiscoverTabs.replace_tabs_with_spaces("\t\thello\nworld\n\t", 2).should== " hello\nworld\n "
|
78
|
+
end
|
79
|
+
|
80
|
+
it "will read and re-write the files which it replaces spaces" do
|
81
|
+
File.should_receive(:read).with("file").and_return("content")
|
82
|
+
DiscoverTabs.should_receive(:replace_tabs_with_spaces).with("content", 3).and_return("new_content")
|
83
|
+
File.should_receive(:write).with("file", "new_content")
|
84
|
+
DiscoverTabs.replace_tabs_in_files(["file"], 3)
|
85
|
+
end
|
57
86
|
end
|
58
87
|
|
59
|
-
|
60
|
-
|
61
|
-
|
88
|
+
context "Parsing parameters" do
|
89
|
+
it "Can print out an error on error" do
|
90
|
+
DiscoverTabs.should_receive(:puts).with("invalid option: --wrong_parameter")
|
91
|
+
DiscoverTabs.should_receive(:exit).with(1)
|
92
|
+
DiscoverTabs.parse_argv(["--wrong_parameter"])
|
93
|
+
end
|
94
|
+
|
95
|
+
it "Should receive the help text on -h" do
|
96
|
+
DiscoverTabs.should_receive(:puts).with("usage: discover_tabs [options] [filename|directory]\n -r N Replace tabs intending with N spaces\n -h, --help\
|
97
|
+
Show this message\n")
|
98
|
+
DiscoverTabs.should_receive(:exit).with(0)
|
99
|
+
DiscoverTabs.parse_argv(["-h"])
|
100
|
+
end
|
101
|
+
|
102
|
+
it "Should parse the -r4 and pass it back properly" do
|
103
|
+
DiscoverTabs.parse_argv(["-r4", "file"])[:replace_tabs].should == 4
|
104
|
+
end
|
105
|
+
|
106
|
+
it "Should parse the filename|directory" do
|
107
|
+
DiscoverTabs.parse_argv(["file"])[:files].should == ["file"]
|
108
|
+
end
|
109
|
+
|
110
|
+
it "Should default the filename|directory to current dir" do
|
111
|
+
DiscoverTabs.parse_argv([])[:files].should == ["."]
|
112
|
+
end
|
113
|
+
|
114
|
+
it "Options also set the files" do
|
115
|
+
DiscoverTabs.parse_argv(["-r4"])[:files].should == ["."]
|
116
|
+
end
|
62
117
|
end
|
63
118
|
|
64
|
-
|
65
|
-
|
66
|
-
|
119
|
+
context "Command line main entry point" do
|
120
|
+
it "Should print all the file to stdout" do
|
121
|
+
DiscoverTabs.should_receive(:files_with_tab_indenting).with("file").and_return(["file"])
|
122
|
+
DiscoverTabs.should_receive(:files_with_tab_indenting).with("file2").and_return([])
|
123
|
+
DiscoverTabs.should_receive(:puts).with("file")
|
124
|
+
DiscoverTabs.cmdline_run(["file", "file2"]).should== 0
|
125
|
+
end
|
126
|
+
|
127
|
+
it "Makes sure the pathname is clean when printing a file" do
|
128
|
+
DiscoverTabs.should_receive(:files_with_tab_indenting).and_return(["file"])
|
129
|
+
DiscoverTabs.should_receive(:puts)
|
130
|
+
DiscoverTabs.should_receive(:replace_tabs_in_files).with(["file"], 4)
|
131
|
+
DiscoverTabs.cmdline_run(["-r4", "file"]).should== 0
|
132
|
+
end
|
67
133
|
end
|
68
134
|
end
|
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discover_tabs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bas Vodde
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- README.md
|
71
71
|
- Rakefile
|
72
72
|
- bin/discover_tabs
|
73
|
+
- discover_tabs.gemspec
|
73
74
|
- lib/discover_tabs.rb
|
74
75
|
- lib/version.rb
|
75
76
|
- spec/discover_tabs_spec.rb
|
@@ -84,6 +85,7 @@ files:
|
|
84
85
|
- spec/test_data/dir_with_some_tabbed_files_and_different_extensions/tabs.rb
|
85
86
|
- spec/test_data/dir_without_tabbed_files/3.rb
|
86
87
|
- spec/test_data/dir_without_tabbed_files/9.rb
|
88
|
+
- spec/test_data/dir_without_tabbed_files/binary_file
|
87
89
|
- spec/test_data/dir_without_tabbed_files/file_without_tabs.rb
|
88
90
|
- spec/test_data/file_with_tabs.rb
|
89
91
|
- spec/test_data/file_without_tabs.rb
|