tailor 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -0
- data/Manifest.txt +22 -2
- data/PostInstall.txt +4 -0
- data/README.rdoc +7 -6
- data/Rakefile +7 -1
- data/bin/tailor +21 -5
- data/features/indentation.feature +22 -0
- data/features/spacing.feature +13 -18
- data/features/spacing/commas.feature +44 -0
- data/features/step_definitions/indentation_steps.rb +139 -0
- data/features/step_definitions/spacing/commas_steps.rb +14 -0
- data/features/step_definitions/spacing_steps.rb +1 -36
- data/features/support/1_file_with_bad_comma_spacing/bad_comma_spacing.rb +43 -5
- data/features/support/1_file_with_bad_curly_brace_spacing/bad_curly_brace_spacing.rb +60 -0
- data/features/support/1_file_with_bad_operator_spacing/bad_op_spacing.rb +31 -0
- data/features/support/1_file_with_bad_parenthesis/bad_parenthesis.rb +1 -3
- data/features/support/1_file_with_bad_square_brackets/bad_square_brackets.rb +62 -0
- data/features/support/1_file_with_bad_ternary_colon_spacing/bad_ternary_colon_spacing.rb +31 -0
- data/features/support/1_good_simple_file/simple_project.rb +5 -0
- data/features/support/1_long_file_with_indentation/my_project.rb +56 -0
- data/features/support/common.rb +74 -1
- data/features/support/env.rb +3 -1
- data/features/support/world.rb +0 -52
- data/lib/tailor.rb +132 -41
- data/lib/tailor/file_line.rb +66 -177
- data/lib/tailor/indentation.rb +251 -0
- data/lib/tailor/spacing.rb +243 -0
- data/lib/tasks/metrics.rake +23 -0
- data/lib/tasks/stats.rake +11 -0
- data/logic.txt +30 -0
- data/ruby-style-checker.rb +77 -46
- data/spec/file_line_spec.rb +18 -193
- data/spec/indentation_spec.rb +259 -0
- data/spec/spacing/colon_spacing_spec.rb +71 -0
- data/spec/spacing/comma_spacing_spec.rb +159 -0
- data/spec/spacing/curly_brace_spacing_spec.rb +258 -0
- data/spec/spacing/parentheses_spacing_spec.rb +28 -0
- data/spec/spacing/square_bracket_spacing_spec.rb +116 -0
- data/spec/spacing_spec.rb +167 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/tailor_spec.rb +2 -2
- metadata +73 -38
- data/features/support/1_good_simple_file/my_project.rb +0 -7
- data/lib/tailor/indentation_checker.rb +0 -27
@@ -0,0 +1,14 @@
|
|
1
|
+
Given /^a file with (\d+) spaces? after a comma in a:$/ do |arg1, table|
|
2
|
+
# table is a Cucumber::Ast::Table
|
3
|
+
pending # express the regexp above with the code you wish you had
|
4
|
+
end
|
5
|
+
|
6
|
+
Given /^a file with more than (\d+) spaces before a comma in a:$/ do |arg1, table|
|
7
|
+
# table is a Cucumber::Ast::Table
|
8
|
+
pending # express the regexp above with the code you wish you had
|
9
|
+
end
|
10
|
+
|
11
|
+
Given /^a file with (\d+) spaces before a comma in a:$/ do |arg1, table|
|
12
|
+
# table is a Cucumber::Ast::Table
|
13
|
+
pending # express the regexp above with the code you wish you had
|
14
|
+
end
|
@@ -1,18 +1,5 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
-
require 'tailor/indentation_checker'
|
3
1
|
require 'tailor/file_line'
|
4
2
|
|
5
|
-
include Tailor
|
6
|
-
include Tailor::IndentationChecker
|
7
|
-
|
8
|
-
def check_file
|
9
|
-
ruby_source = File.open(@file_list[0], 'r')
|
10
|
-
|
11
|
-
ruby_source.each_line do |line|
|
12
|
-
yield(line)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
3
|
def check_spacing method_name, line_type
|
17
4
|
is_line_type = false
|
18
5
|
bad_spacing = false
|
@@ -56,17 +43,6 @@ Given /^that file contains lines with hard tabs$/ do
|
|
56
43
|
contains_hard_tabs.should be_true
|
57
44
|
end
|
58
45
|
|
59
|
-
Given /^that file does not contain any "([^\"]*)" statements$/ do |keyword|
|
60
|
-
ruby_source = File.open(@file_list[0], 'r')
|
61
|
-
|
62
|
-
count = count_keywords(ruby_source, keyword)
|
63
|
-
count.should == 0
|
64
|
-
end
|
65
|
-
|
66
|
-
Given /^that file is indented properly$/ do
|
67
|
-
pending
|
68
|
-
end
|
69
|
-
|
70
46
|
Given /^that file contains lines with trailing whitespace$/ do
|
71
47
|
line_number = 1
|
72
48
|
|
@@ -128,13 +104,6 @@ Given /^that file contains a "([^\"]*)" line with spaces after an open parenthes
|
|
128
104
|
check_spacing("space_before_closed_parenthesis?", line_type)
|
129
105
|
end
|
130
106
|
|
131
|
-
#-----------------------------------------------------------------------------
|
132
|
-
# "When" statements
|
133
|
-
#-----------------------------------------------------------------------------
|
134
|
-
When "I run the checker on the project" do
|
135
|
-
@result = `#{@tailor} #{@project_dir}`
|
136
|
-
end
|
137
|
-
|
138
107
|
#-----------------------------------------------------------------------------
|
139
108
|
# "Then" statements
|
140
109
|
#-----------------------------------------------------------------------------
|
@@ -142,16 +111,12 @@ Then /^the checker should tell me each line that has a hard tab$/ do
|
|
142
111
|
@result.should include("Line contains hard tabs")
|
143
112
|
end
|
144
113
|
|
145
|
-
Then "the checker should tell me my indentation is OK" do
|
146
|
-
pending
|
147
|
-
end
|
148
|
-
|
149
114
|
Then /^the checker should tell me each line has trailing whitespace$/ do
|
150
115
|
@result.should include("Line contains #{@whitespace_count} trailing whitespace(s)")
|
151
116
|
end
|
152
117
|
|
153
118
|
Then /^the checker should tell me each line is too long$/ do
|
154
|
-
message = "Line is
|
119
|
+
message = "Line is >#{Tailor::FileLine::LINE_LENGTH_MAX} characters"
|
155
120
|
@result.should include(message)
|
156
121
|
end
|
157
122
|
|
@@ -1,5 +1,43 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
# Perfect spacing after a comma, in comment and method
|
2
|
+
def do_something this, that, other
|
3
|
+
puts "We, I mean I, am doing, er, something!"
|
4
|
+
end
|
5
|
+
|
6
|
+
# More than one space, after a comma, in a comment & method
|
7
|
+
def do_something this, that, other
|
8
|
+
puts "We, I mean I, am doing, er, something!"
|
9
|
+
end
|
10
|
+
|
11
|
+
# No space,after a comma,in a comment & method
|
12
|
+
def do_something this,that,other
|
13
|
+
puts "We,I mean I ,am doing,er ,something!"
|
14
|
+
end
|
15
|
+
|
16
|
+
# Spaces , before a comma ,in a comment & method
|
17
|
+
def do_something this , that ,other
|
18
|
+
puts "We , I mean I ,am doing ,er , something!"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Perfect spacing around a comma, in an array
|
22
|
+
thing = [ 1, 2, 3 ]
|
23
|
+
|
24
|
+
# More than one space, after elements in an array
|
25
|
+
thing = [ 1, 2, 3 ]
|
26
|
+
|
27
|
+
# No space, after elements in an array
|
28
|
+
thing = [ 1,2,3 ]
|
29
|
+
|
30
|
+
# Spaces, before elements in an array
|
31
|
+
thing = [ 1 , 2 ,3 ]
|
32
|
+
|
33
|
+
# Perfect spacing around a comma, in a hash
|
34
|
+
thing = { :one => 1, :two => 2, :three => 3 }
|
35
|
+
|
36
|
+
# More than one space, after elements in a hash
|
37
|
+
thing = { :one => 1, :two => 2, :three => 3 }
|
38
|
+
|
39
|
+
# No space, after elements in an array
|
40
|
+
thing = { :one => 1,:two => 2,:three => 3 }
|
41
|
+
|
42
|
+
# Spaces, before elements in an array
|
43
|
+
thing = { :one => 1 , :two => 2 , :three => 3 }
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# Blocks...
|
2
|
+
# No space after {
|
3
|
+
1..10.times {|number| puts number }
|
4
|
+
|
5
|
+
# No space before {
|
6
|
+
1..10.times{ |number| puts number }
|
7
|
+
|
8
|
+
# No space before or after {
|
9
|
+
1..10.times{|number| puts number }
|
10
|
+
|
11
|
+
# No space before }
|
12
|
+
1..10.times { |number| puts number}
|
13
|
+
|
14
|
+
# No space before or after { and }
|
15
|
+
1..10.times{|number| puts number}
|
16
|
+
|
17
|
+
# >1 space before {
|
18
|
+
1..10.times { |number| puts number }
|
19
|
+
|
20
|
+
# >1 space after {
|
21
|
+
1..10.times { |number| puts number }
|
22
|
+
|
23
|
+
# >1 space before, no spaces after {
|
24
|
+
1..10.times {|number| puts number }
|
25
|
+
|
26
|
+
# >1 space after, no spaces before {
|
27
|
+
1..10.times{ |number| puts number }
|
28
|
+
|
29
|
+
# >1 space before }
|
30
|
+
1..10.times { |number| puts number }
|
31
|
+
|
32
|
+
# Perfect
|
33
|
+
1..10.times { |number| puts number }
|
34
|
+
|
35
|
+
|
36
|
+
# Hashes...
|
37
|
+
# No space after {
|
38
|
+
thing = {:one => 1 }
|
39
|
+
|
40
|
+
# No space before {
|
41
|
+
thing ={ :one => 1 }
|
42
|
+
|
43
|
+
# No space before or after {
|
44
|
+
thing ={:one => 1 }
|
45
|
+
|
46
|
+
# No space before }
|
47
|
+
thing = { :one => 1}
|
48
|
+
|
49
|
+
# No space before or after { and }
|
50
|
+
thing ={:one => 1}
|
51
|
+
|
52
|
+
# Perfect
|
53
|
+
thing = { :one => 1 }
|
54
|
+
|
55
|
+
# Skip on default params in methods...
|
56
|
+
def a_method; one={}; end;
|
57
|
+
|
58
|
+
# Skip on strings...
|
59
|
+
a_string = "This is a #{thing}..."
|
60
|
+
b_string = "This has #{Class.methods}"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Comment with a +
|
2
|
+
# Comment with a -
|
3
|
+
# Comment with a *
|
4
|
+
# Comment with a /
|
5
|
+
# Comment with a =
|
6
|
+
# Comment with a +=
|
7
|
+
# Comment with a -=
|
8
|
+
# Comment with a *=
|
9
|
+
# Comment with a /=
|
10
|
+
# Comment with a %=
|
11
|
+
# Comment with a **=
|
12
|
+
# Comment with a ||=
|
13
|
+
# Comment with a &&=
|
14
|
+
# Comment with a ==
|
15
|
+
# Comment with a ===
|
16
|
+
# Comment with a !=
|
17
|
+
# Comment with a >
|
18
|
+
# Comment with a <
|
19
|
+
# Comment with a >=
|
20
|
+
# Comment with a <=
|
21
|
+
# Comment with a <=>
|
22
|
+
# Comment with a &&
|
23
|
+
# Comment with a ||
|
24
|
+
# Comment with a ?
|
25
|
+
# Comment with a :
|
26
|
+
# Comment with a =~
|
27
|
+
|
28
|
+
class BadOps
|
29
|
+
def +@
|
30
|
+
end
|
31
|
+
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
# This is a comment; this should also get caught: [ us, them ]
|
1
|
+
# Spaces after open and before closed parentheses in a comment: ( me, you )
|
3
2
|
def do_something( hello, and_hi=[ "me", "you" ] )
|
4
|
-
test = [ "one", "two" ]
|
5
3
|
File.expand_path( File.dirname (__FILE__) )
|
6
4
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Arrays...
|
2
|
+
# Perfect
|
3
|
+
thing = []
|
4
|
+
|
5
|
+
# 1 space after [
|
6
|
+
thing = [ ]
|
7
|
+
|
8
|
+
# Perfect with element
|
9
|
+
one = 'won'
|
10
|
+
thing = [one]
|
11
|
+
|
12
|
+
# 1 space after [ with element
|
13
|
+
thing = [ one]
|
14
|
+
|
15
|
+
# 1 space before ] with element
|
16
|
+
thing = [one ]
|
17
|
+
|
18
|
+
# 1 space before and after [ and ]
|
19
|
+
thing = [ one ]
|
20
|
+
|
21
|
+
# Perfect element reference
|
22
|
+
thing[0]
|
23
|
+
|
24
|
+
# 1 space after [ with element reference
|
25
|
+
thing[ 0]
|
26
|
+
|
27
|
+
# 1 space before [ with element reference
|
28
|
+
thing [0]
|
29
|
+
|
30
|
+
# 1 space before ] with element reference
|
31
|
+
thing[0 ]
|
32
|
+
|
33
|
+
# Pefect multi-line
|
34
|
+
two = 'too'
|
35
|
+
thing = [
|
36
|
+
one,
|
37
|
+
two
|
38
|
+
]
|
39
|
+
|
40
|
+
# Perfect multi-line, indented
|
41
|
+
def thing
|
42
|
+
a_thing = [
|
43
|
+
one,
|
44
|
+
two
|
45
|
+
]
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
# Hash references...
|
50
|
+
thing = { :one => 1 }
|
51
|
+
|
52
|
+
# Perfect element reference
|
53
|
+
thing[:one]
|
54
|
+
|
55
|
+
# 1 space after [ with element reference
|
56
|
+
thing[ :one]
|
57
|
+
|
58
|
+
# 1 space before [ with element reference
|
59
|
+
thing [:one]
|
60
|
+
|
61
|
+
# 1 space before ] with element reference
|
62
|
+
thing[:one ]
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Perfect spacing around ternary colon
|
2
|
+
bobo = true ? true : false
|
3
|
+
|
4
|
+
# No space after ternary colon
|
5
|
+
bobo = true ? true :false
|
6
|
+
|
7
|
+
# No space before ternary colon
|
8
|
+
bobo = true ? true: false
|
9
|
+
|
10
|
+
# No space before or after ternary colon
|
11
|
+
bobo = true ? true:false
|
12
|
+
|
13
|
+
# 2 spaces after ternary colon
|
14
|
+
bobo = true ? true : false
|
15
|
+
|
16
|
+
# 2 spaces before ternary colon
|
17
|
+
bobo = true ? true : false
|
18
|
+
|
19
|
+
# Skip when colon is part of a symbol or namespace operator
|
20
|
+
bobo = { :thing => ":clown" }
|
21
|
+
bobo[:thing] == :dog ? bobo[:thing] : Math::PI
|
22
|
+
|
23
|
+
# Skip when colon is part of Regexp class
|
24
|
+
bobo[:thing].scan(/[:alpha:]/)
|
25
|
+
|
26
|
+
# Skip when setting load path
|
27
|
+
$:.unshift File.dirname(__FILE__)
|
28
|
+
|
29
|
+
# Skip when question mark method is followed by a symbol
|
30
|
+
if bobo[:thing].eql? :clown
|
31
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# This file contains 1 method, no class, and is properly indented
|
2
|
+
# in order to test a related scenario.
|
3
|
+
module MyModule
|
4
|
+
|
5
|
+
# This is a class!
|
6
|
+
class AnotherThing
|
7
|
+
|
8
|
+
# This is a method!
|
9
|
+
def a_method
|
10
|
+
case
|
11
|
+
when 1
|
12
|
+
1..10.each { |num| puts num }
|
13
|
+
when 2
|
14
|
+
else
|
15
|
+
while false
|
16
|
+
# Don't do anything
|
17
|
+
# And stuff
|
18
|
+
"meow".scan(/woem/)
|
19
|
+
array = [1 ,2 ,3]
|
20
|
+
other_thing = [
|
21
|
+
4,
|
22
|
+
5,
|
23
|
+
6
|
24
|
+
]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
an_array = Array.new
|
29
|
+
a_hash = Hash.new
|
30
|
+
|
31
|
+
# This is another comment
|
32
|
+
an_array = [1, 2, 3]
|
33
|
+
a_hash = {
|
34
|
+
:one => 1,
|
35
|
+
:two => 2
|
36
|
+
}
|
37
|
+
|
38
|
+
if true
|
39
|
+
# Let's return!
|
40
|
+
return true
|
41
|
+
elsif false
|
42
|
+
return false
|
43
|
+
else
|
44
|
+
return nil
|
45
|
+
end
|
46
|
+
|
47
|
+
# Now how about a block...
|
48
|
+
1..10.each do |number|
|
49
|
+
begin
|
50
|
+
rescue
|
51
|
+
ensure
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/features/support/common.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
+
|
3
|
+
require 'tailor'
|
4
|
+
|
5
|
+
include Tailor
|
6
|
+
|
1
7
|
module CommonHelpers
|
2
8
|
def in_tmp_folder(&block)
|
3
9
|
FileUtils.chdir(@tmp_root, &block)
|
@@ -26,4 +32,71 @@ module CommonHelpers
|
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
29
|
-
World(CommonHelpers)
|
35
|
+
World(CommonHelpers)
|
36
|
+
|
37
|
+
# Counts keywords in the file provided.
|
38
|
+
#
|
39
|
+
# @param [String] file Path to the file to check
|
40
|
+
# @param [String] keyword Keyword to count
|
41
|
+
# @return [Number] Number of keywords counted
|
42
|
+
def count_keywords file, keyword
|
43
|
+
ruby_source = File.open(file, 'r')
|
44
|
+
|
45
|
+
count = 0
|
46
|
+
ruby_source.each_line do |line|
|
47
|
+
if line =~ /^#{keyword}/
|
48
|
+
count =+ 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
ruby_source.close
|
52
|
+
count
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_file
|
56
|
+
ruby_source = File.open(@file_list[0], 'r')
|
57
|
+
|
58
|
+
ruby_source.each_line do |line|
|
59
|
+
yield(line)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Prep for the testing
|
64
|
+
Before do
|
65
|
+
@tailor = "#{File.dirname(__FILE__)}/../../bin/tailor"
|
66
|
+
end
|
67
|
+
|
68
|
+
#-----------------------------------------------------------------------------
|
69
|
+
# "Given" statements
|
70
|
+
#-----------------------------------------------------------------------------
|
71
|
+
Given /^I have a project directory "([^\"]*)"$/ do |project_dir|
|
72
|
+
project_dir = "#{@features_path}/support/#{project_dir}"
|
73
|
+
File.exists?(project_dir).should be_true
|
74
|
+
File.directory?(project_dir).should be_true
|
75
|
+
@project_dir = project_dir
|
76
|
+
end
|
77
|
+
|
78
|
+
Given /^the file contains only "([^\"]*)" "([^\"]*)" statement$/ do
|
79
|
+
|count_in_spec, keyword|
|
80
|
+
#count_in_file = count_keywords(@ruby_source, keyword)
|
81
|
+
count_in_file = count_keywords(@file_list[0], keyword)
|
82
|
+
count_in_file.should == count_in_spec.to_i
|
83
|
+
end
|
84
|
+
|
85
|
+
Given /^I have 1 file in my project$/ do
|
86
|
+
@file_list = Dir.glob("#{@project_dir}/*")
|
87
|
+
@file_list.length.should == 1
|
88
|
+
end
|
89
|
+
|
90
|
+
Given /^that file does not contain any "([^\"]*)" statements$/ do |keyword|
|
91
|
+
ruby_source = File.open(@file_list[0], 'r')
|
92
|
+
|
93
|
+
count = count_keywords(ruby_source, keyword)
|
94
|
+
count.should == 0
|
95
|
+
end
|
96
|
+
|
97
|
+
#-----------------------------------------------------------------------------
|
98
|
+
# "When" statements
|
99
|
+
#-----------------------------------------------------------------------------
|
100
|
+
When "I run the checker on the project" do
|
101
|
+
@result = `#{@tailor} #{@project_dir}`
|
102
|
+
end
|