tailor 1.1.5 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +1 -0
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +23 -23
  6. data/History.rdoc +14 -0
  7. data/README.rdoc +42 -2
  8. data/Rakefile +7 -0
  9. data/features/continuous_integration.feature +28 -0
  10. data/lib/tailor/cli.rb +17 -4
  11. data/lib/tailor/cli/options.rb +6 -0
  12. data/lib/tailor/configuration.rb +19 -3
  13. data/lib/tailor/configuration/style.rb +7 -0
  14. data/lib/tailor/critic.rb +4 -2
  15. data/lib/tailor/formatters/yaml.rb +51 -0
  16. data/lib/tailor/lexer.rb +6 -4
  17. data/lib/tailor/rake_task.rb +44 -6
  18. data/lib/tailor/reporter.rb +9 -3
  19. data/lib/tailor/rulers/allow_invalid_ruby_ruler.rb +3 -3
  20. data/lib/tailor/rulers/indentation_spaces_ruler.rb +24 -6
  21. data/lib/tailor/rulers/indentation_spaces_ruler/indentation_manager.rb +2 -2
  22. data/lib/tailor/rulers/spaces_before_rbrace_ruler.rb +9 -6
  23. data/lib/tailor/rulers/spaces_in_empty_braces_ruler.rb +1 -1
  24. data/lib/tailor/version.rb +1 -1
  25. data/spec/functional/configuration_spec.rb +37 -0
  26. data/spec/functional/horizontal_spacing/braces_spec.rb +113 -113
  27. data/spec/functional/horizontal_spacing/brackets_spec.rb +39 -39
  28. data/spec/functional/horizontal_spacing/comma_spacing_spec.rb +27 -27
  29. data/spec/functional/horizontal_spacing/hard_tabs_spec.rb +42 -42
  30. data/spec/functional/horizontal_spacing/long_lines_spec.rb +16 -16
  31. data/spec/functional/horizontal_spacing/parens_spec.rb +48 -48
  32. data/spec/functional/horizontal_spacing/trailing_whitespace_spec.rb +23 -23
  33. data/spec/functional/horizontal_spacing_spec.rb +11 -11
  34. data/spec/functional/indentation_spacing/bad_indentation_spec.rb +212 -215
  35. data/spec/functional/indentation_spacing_spec.rb +8 -7
  36. data/spec/functional/naming/camel_case_methods_spec.rb +16 -16
  37. data/spec/functional/naming/screaming_snake_case_classes_spec.rb +30 -30
  38. data/spec/functional/naming_spec.rb +5 -4
  39. data/spec/functional/rake_task_spec.rb +56 -10
  40. data/spec/functional/vertical_spacing/class_length_spec.rb +16 -16
  41. data/spec/functional/vertical_spacing/method_length_spec.rb +16 -16
  42. data/spec/functional/vertical_spacing_spec.rb +5 -4
  43. data/spec/support/bad_indentation_cases.rb +35 -35
  44. data/spec/support/good_indentation_cases.rb +108 -108
  45. data/spec/support/horizontal_spacing_cases.rb +37 -37
  46. data/spec/support/naming_cases.rb +6 -6
  47. data/spec/support/vertical_spacing_cases.rb +4 -4
  48. data/spec/unit/tailor/cli_spec.rb +34 -12
  49. data/spec/unit/tailor/configuration_spec.rb +18 -0
  50. data/spec/unit/tailor/formatters/yaml_spec.rb +75 -0
  51. data/spec/unit/tailor/reporter_spec.rb +23 -4
  52. data/spec/unit/tailor/rulers/indentation_spaces_ruler_spec.rb +12 -10
  53. data/spec/unit/tailor/version_spec.rb +3 -2
  54. metadata +35 -63
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f695173027042af6a56e7cada6e1b408a9b5ce5a
4
+ data.tar.gz: 516aaac032622983b31d33148f14240b1be63d1b
5
+ SHA512:
6
+ metadata.gz: 98bd7768f8d97ffdeead10bbff2010c25236873499eb2eb62f0ecf6a94b1c0b921ad3e088e722752cbbd7c965c6b54b05e23bb5e01e1cb3bf9eea60eb30efecc
7
+ data.tar.gz: da3a3b39e51d1542cc86d975b209352d883e3b1569300f46f1387b569426cd945393ba0b7aa789ba2785e46efd1e53f69fc6f62772728f24dc96ca55bc6218e9
data/.gitignore CHANGED
@@ -2,6 +2,7 @@
2
2
  .DS_Store
3
3
  .loadpath
4
4
  .project
5
+ .ruby-version
5
6
  .yardoc/
6
7
  logic.txt
7
8
  output.txt
@@ -1,3 +1,4 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
+ - 2.0.0
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
  gemspec
@@ -1,54 +1,54 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tailor (1.1.5)
4
+ tailor (1.2.0)
5
5
  log_switch (>= 0.3.0)
6
6
  term-ansicolor (>= 1.0.5)
7
7
  text-table (>= 1.2.2)
8
8
 
9
9
  GEM
10
- remote: http://rubygems.org/
10
+ remote: https://rubygems.org/
11
11
  specs:
12
12
  aruba (0.5.1)
13
13
  childprocess (~> 0.3.6)
14
14
  cucumber (>= 1.1.1)
15
15
  rspec-expectations (>= 2.7.0)
16
- builder (3.1.4)
17
- childprocess (0.3.7)
18
- ffi (~> 1.0, >= 1.0.6)
19
- cucumber (1.2.1)
16
+ builder (3.2.0)
17
+ childprocess (0.3.9)
18
+ ffi (~> 1.0, >= 1.0.11)
19
+ cucumber (1.2.2)
20
20
  builder (>= 2.1.2)
21
21
  diff-lcs (>= 1.1.3)
22
- gherkin (~> 2.11.0)
23
- json (>= 1.4.6)
24
- diff-lcs (1.1.3)
22
+ gherkin (~> 2.11.6)
23
+ multi_json (~> 1.3)
24
+ diff-lcs (1.2.1)
25
25
  fakefs (0.4.2)
26
- ffi (1.3.1)
27
- ffi (1.3.1-java)
26
+ ffi (1.4.0)
27
+ ffi (1.4.0-java)
28
28
  gherkin (2.11.6)
29
29
  json (>= 1.7.6)
30
30
  gherkin (2.11.6-java)
31
31
  json (>= 1.7.6)
32
- json (1.7.6)
33
- json (1.7.6-java)
32
+ json (1.7.7)
33
+ json (1.7.7-java)
34
34
  log_switch (0.4.0)
35
- multi_json (1.5.0)
35
+ multi_json (1.6.1)
36
36
  rake (10.0.3)
37
- rspec (2.12.0)
38
- rspec-core (~> 2.12.0)
39
- rspec-expectations (~> 2.12.0)
40
- rspec-mocks (~> 2.12.0)
41
- rspec-core (2.12.2)
42
- rspec-expectations (2.12.1)
43
- diff-lcs (~> 1.1.3)
44
- rspec-mocks (2.12.2)
37
+ rspec (2.13.0)
38
+ rspec-core (~> 2.13.0)
39
+ rspec-expectations (~> 2.13.0)
40
+ rspec-mocks (~> 2.13.0)
41
+ rspec-core (2.13.0)
42
+ rspec-expectations (2.13.0)
43
+ diff-lcs (>= 1.1.3, < 2.0)
44
+ rspec-mocks (2.13.0)
45
45
  simplecov (0.7.1)
46
46
  multi_json (~> 1.0)
47
47
  simplecov-html (~> 0.7.1)
48
48
  simplecov-html (0.7.1)
49
49
  term-ansicolor (1.0.7)
50
50
  text-table (1.2.2)
51
- yard (0.8.3)
51
+ yard (0.8.5.2)
52
52
 
53
53
  PLATFORMS
54
54
  java
@@ -1,3 +1,17 @@
1
+ === 1.2.0 2013-03-06
2
+
3
+ * gh-119[https://github.com/turboladen/tailor/issues/119]
4
+ * AllowInvalidRubyRuler now uses Gem.ruby to use the ruby that tailor was
5
+ run with.
6
+ * gh-130[https://github.com/turboladen/tailor/issues/130]
7
+ * AllowInvalidRubyRuler now handles file names with spaces in them.
8
+ * gh-131[https://github.com/turboladen/tailor/issues/131]
9
+ * Added YAML output formatter. Thanks @leandronsp!
10
+ * gh-133[https://github.com/turboladen/tailor/issues/133]
11
+ * Added support for Ruby 2.0.0-p0. ...which is actually just accounting for
12
+ a {fix to Ripper}[https://bugs.ruby-lang.org/issues/6211] that finally got
13
+ merged in to a Ruby release.
14
+
1
15
  === 1.1.5 2013-01-30
2
16
 
3
17
  * gh-127[https://github.com/turboladen/tailor/issues/127]
@@ -93,11 +93,16 @@ Check only files ending in .rb under the 'test' directory:
93
93
  Check defaults (lib/**/*.rb):
94
94
 
95
95
  $ tailor
96
-
96
+
97
+ Printing the results in a output file (if using a formatter that accepts output files, like 'yaml'):
98
+
99
+ $ tailor path/to/check --output-file=my-results.yaml
100
+ $ tailor --output-file=my-results-from-defaults.yaml
101
+
97
102
  Use defaults via a Rake task (if you have a .tailor file, it'll use those settings):
98
103
 
99
104
  require 'tailor/rake_task'
100
-
105
+
101
106
  Tailor::RakeTask.new
102
107
 
103
108
  ==== On style...
@@ -270,6 +275,21 @@ level to +:off+:
270
275
  end
271
276
 
272
277
 
278
+ ===== Formatters
279
+
280
+ By default Tailor uses the text formatter, printing the results on console. Tailor
281
+ also provides a YAML formatter, that accepts an output file if using the option
282
+ --output-file=*.yaml
283
+
284
+ # .tailor
285
+ Tailor.config do |config|
286
+ config.formatters 'text', 'yaml'
287
+
288
+ # just one
289
+ config.formatters 'text'
290
+ end
291
+
292
+
273
293
  === Define A Custom Ruler
274
294
 
275
295
  While tailor provides a number of Rulers for checking style, it also provides a
@@ -343,10 +363,30 @@ add infomation about your ruler to your config file. If you created a Ruler:
343
363
 
344
364
  Next time you run tailor, your Ruler will get initialized and used.
345
365
 
366
+ === Using the lib
367
+
368
+ Sometimes you could use tailor as a lib, getting the results as a hash
369
+ and manipulate them according your domain.
370
+
371
+ require 'tailor/cli'
372
+
373
+ # only results from a specific path
374
+ tailor = Tailor::CLI.new %w(app/controllers)
375
+ tailor.result # result should be a hash {"filename" => [problems]}
376
+
377
+ # using other file config (hiding path, it'll use from default config)
378
+ Tailor::CLI.new %w(--config-file=.other-config)
379
+ Tailor::CLI.new [] # uses file set from .tailor file config
380
+
381
+ # printing the results in a output file
382
+ tailor = Tailor::CLI.new %w(--output-file=results.yaml)
383
+ tailor.execute!
384
+
346
385
  == REQUIREMENTS:
347
386
 
348
387
  * Rubies (tested)
349
388
  * 1.9.3
389
+ * 2.0.0
350
390
  * Gems
351
391
  * log_switch
352
392
  * term-ansicolor
data/Rakefile CHANGED
@@ -3,6 +3,13 @@ require 'cucumber'
3
3
  require 'cucumber/rake/task'
4
4
  require 'rspec/core/rake_task'
5
5
  require 'yard'
6
+ require_relative 'lib/tailor/rake_task'
7
+
8
+
9
+ Tailor::RakeTask.new do |task|
10
+ task.formatters = %w[yaml]
11
+ task.tailor_opts = %w[--output-file=output.yml]
12
+ end
6
13
 
7
14
 
8
15
  #------------------------------------------------------------------------------
@@ -92,6 +92,34 @@ Feature: Continuous Integration
92
92
  And the output should not match /SystemExit/
93
93
  And the exit status should be 1
94
94
 
95
+ Scenario: Rake task, override config file
96
+ Given a file named "errors.rb" with:
97
+ """
98
+ puts 'hi'
99
+
100
+
101
+ """
102
+ And my configuration file ".tailor" looks like:
103
+ """
104
+ Tailor.config do |config|
105
+ config.file_set 'errors.rb' do |style|
106
+ style.trailing_newlines 0, level: :error
107
+ end
108
+ end
109
+ """
110
+ And a file named "Rakefile" with:
111
+ """
112
+ require 'tailor/rake_task'
113
+
114
+ Tailor::RakeTask.new do |task|
115
+ task.file_set 'errors.rb' do |style|
116
+ style.trailing_newlines 2, level: :error
117
+ end
118
+ end
119
+ """
120
+ When I successfully run `rake tailor`
121
+ Then the output should match /errors\.rb\s+|\s+0/
122
+
95
123
  Scenario: Rake task, missing config file
96
124
  Given a file named "errors.rb" with:
97
125
  """
@@ -4,6 +4,7 @@ require_relative 'cli/options'
4
4
  require_relative 'logger'
5
5
  require_relative 'reporter'
6
6
 
7
+
7
8
  class Tailor
8
9
 
9
10
  # The Command-Line Interface worker. Execution from the command line
@@ -11,16 +12,19 @@ class Tailor
11
12
  class CLI
12
13
  include LogSwitch::Mixin
13
14
 
15
+ # @return [Tailor::Configuration]
16
+ attr_reader :configuration
17
+
14
18
  # The main method of execution from the command line.
19
+ #
20
+ # @param [Array] args Arguments from the command-line.
15
21
  def self.run(args)
16
22
  new(args).execute!
17
23
  end
18
24
 
19
25
  # @param [Array] args Arguments from the command-line.
20
26
  def initialize(args)
21
- Tailor::Logger.log = false
22
27
  options = Options.parse!(args)
23
-
24
28
  @configuration = Configuration.new(args, options)
25
29
  @configuration.load!
26
30
 
@@ -43,9 +47,18 @@ class Tailor
43
47
  @reporter.file_report(problems_for_file, label)
44
48
  end
45
49
 
46
- @reporter.summary_report(@critic.problems)
47
-
50
+ @reporter.summary_report(@critic.problems, output_file: @configuration.output_file)
48
51
  @critic.problem_count(:error) > 0
49
52
  end
53
+
54
+ # Critiques all file sets, then returns the problems found as a result.
55
+ #
56
+ # @return [Hash{String => Array}] The list of problems, where the keys are
57
+ # the file names in which the problems were found, and the values are the
58
+ # respective lists of problems for each file.
59
+ def result
60
+ @critic.critique(@configuration.file_sets)
61
+ @critic.problems
62
+ end
50
63
  end
51
64
  end
@@ -14,6 +14,7 @@ class Tailor
14
14
  def self.parse!(args)
15
15
  options = OpenStruct.new
16
16
  options.config_file = ''
17
+ options.output_file = ''
17
18
  options.formatters = []
18
19
  options.show_config = false
19
20
  options.style = {}
@@ -33,6 +34,11 @@ class Tailor
33
34
  options.config_file = config
34
35
  end
35
36
 
37
+ opt.on('-o', '--output-file FILE',
38
+ "Print result in a output file if using the proper formatter.") do |output|
39
+ options.output_file = output
40
+ end
41
+
36
42
  opt.on('--create-config', 'Create a new .tailor file') do
37
43
  if create_config
38
44
  msg = "Your new tailor config file was created at "
@@ -28,17 +28,24 @@ class Tailor
28
28
  new
29
29
  end
30
30
 
31
+ # @return [Hash]
31
32
  attr_reader :file_sets
33
+
34
+ # @return [Array]
32
35
  attr_reader :formatters
33
36
 
37
+ # @return [String]
38
+ attr_reader :output_file
39
+
34
40
  # @param [Array] runtime_file_list
35
41
  # @param [OpenStruct] options
36
42
  # @option options [String] config_file
37
43
  # @option options [Array] formatters
38
44
  # @option options [Hash] style
39
45
  def initialize(runtime_file_list=nil, options=nil)
40
- @formatters = ['text']
46
+ @formatters = %w[text]
41
47
  @file_sets = {}
48
+ @output_file = ''
42
49
  @runtime_file_list = runtime_file_list
43
50
  log "Got runtime file list: #{@runtime_file_list}"
44
51
 
@@ -65,6 +72,7 @@ class Tailor
65
72
  @file_sets = { default: FileSet.new(@runtime_file_list) }
66
73
  end
67
74
 
75
+ get_output_file_from_cli_opts
68
76
  get_formatters_from_cli_opts
69
77
  get_file_sets_from_cli_opts
70
78
  get_style_from_cli_opts
@@ -118,7 +126,7 @@ class Tailor
118
126
  @file_sets[label].update_file_list(file_set[:file_list])
119
127
  @file_sets[label].update_style(file_set[:style])
120
128
  else
121
- log "Creating new label..."
129
+ log "Creating new label: #{label}"
122
130
  @file_sets[label] =
123
131
  FileSet.new(file_set[:file_list], file_set[:style])
124
132
  end
@@ -162,10 +170,17 @@ class Tailor
162
170
  end
163
171
  end
164
172
 
173
+ def get_output_file_from_cli_opts
174
+ unless @options.nil? || @options.output_file.empty? || @options.output_file.nil?
175
+ @output_file = @options.output_file
176
+ log "@output_file is now: '#{@output_file}'"
177
+ end
178
+ end
179
+
165
180
  def get_formatters_from_cli_opts
166
181
  unless @options.nil? || @options.formatters.empty? || @options.formatters.nil?
167
182
  @formatters = @options.formatters
168
- log "@formatters is now #{@formatters}"
183
+ log "@formatters is now: '#{@formatters}'"
169
184
  end
170
185
  end
171
186
 
@@ -207,6 +222,7 @@ class Tailor
207
222
  table.head = [{ value: 'Configuration', colspan: 2, align: :center }]
208
223
  table.rows << :separator
209
224
  table.rows << ['Formatters', @formatters]
225
+ table.rows << ['Output File', @output_file]
210
226
 
211
227
  @file_sets.each do |label, file_set|
212
228
  table.rows << :separator
@@ -80,6 +80,13 @@ class Tailor
80
80
  result
81
81
  end
82
82
  end
83
+
84
+ # Yields each property and values.
85
+ def each
86
+ to_hash.each do |property, values|
87
+ yield property, values
88
+ end
89
+ end
83
90
  end
84
91
  end
85
92
  end
@@ -10,7 +10,7 @@ class Tailor
10
10
  # files. It handles initializing the Ruler objects it needs based on the
11
11
  # configuration given to it.
12
12
  class Critic
13
- include Tailor::Logger::Mixin
13
+ include LogSwitch::Mixin
14
14
  include Tailor::Rulers
15
15
 
16
16
  # The instance method that starts the process of looking for problems in
@@ -41,7 +41,9 @@ class Tailor
41
41
  end
42
42
  end
43
43
 
44
- # @return [Hash]
44
+ # @return [Hash{String => Array}] The list of problems, where the keys are
45
+ # the file names in which the problems were found, and the values are the
46
+ # respective lists of problems for each file.
45
47
  def problems
46
48
  @problems ||= {}
47
49
  end
@@ -0,0 +1,51 @@
1
+ require 'pathname'
2
+ require 'yaml'
3
+ require_relative '../formatter'
4
+
5
+ class Tailor
6
+ module Formatters
7
+ class Yaml < Tailor::Formatter
8
+ attr_reader :accepts_output_file
9
+
10
+ def initialize
11
+ @accepts_output_file = true
12
+ super
13
+ end
14
+
15
+ # Prints the report on all of the files that just got checked.
16
+ #
17
+ # @param [Hash] report Values are filenames; keys are problems for each
18
+ # of those files.
19
+ def summary_report(report)
20
+ build_hash(report).to_yaml
21
+ end
22
+
23
+ private
24
+
25
+ # @param [Hash] report The list of problems found by Tailor::CLI.
26
+ # @return [Hash] The Hash of problems to be converted to YAML.
27
+ def build_hash(report)
28
+ report.reject! { |_, v| v.empty? }
29
+
30
+ report.inject({}) do |result, problem_set|
31
+ file_name = problem_set.first
32
+ problems = problem_set.last
33
+
34
+ problems.each do |problem|
35
+ result[file_name] ||= []
36
+
37
+ result[file_name] << {
38
+ type: problem[:type],
39
+ line: problem[:line],
40
+ column: problem[:column],
41
+ message: problem[:message],
42
+ level: problem[:level]
43
+ }
44
+ end
45
+
46
+ result
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end