syntaxer 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -3,7 +3,7 @@
3
3
  == Overview
4
4
 
5
5
  Syntaxer make possible check syntax of scripts. It may be used in standalone mode and with git repository for checking changed and added files only.
6
- It is useful for for rails team, because you need to store only
6
+ It is useful for for rails team, because you need to store only file with rules, and git hook will be generated for you.
7
7
 
8
8
  == Installation
9
9
 
@@ -11,11 +11,24 @@ To install syntaxer run
11
11
 
12
12
  [sudo] gem install syntaxer
13
13
 
14
- Works with 1.8.x and 1.9.x
14
+
15
+ == Usage with rails
16
+
17
+ 1) Add to Gemfile
18
+
19
+ gem "syntaxer"
20
+
21
+ 2)
15
22
 
16
- == Fast Usage for Rails team
23
+ bundle install
17
24
 
18
- == Usage
25
+ 3)
26
+
27
+ rake syntaxer:install
28
+
29
+ It creates config/syntaxer.rb file with common rails options, you may edit it as you wish, and .git/hooks/pre-commit script, which will run syntax checking before every commit.
30
+
31
+ == Standalone usage
19
32
 
20
33
  Example of usage:
21
34
 
@@ -36,8 +49,6 @@ Indicate custom config file
36
49
  syntaxer -c config.rb
37
50
 
38
51
 
39
- Describe your rules in syntaxer.rb file and put in "initializers" folder for rails
40
-
41
52
  Example of syntaxer.rb file:
42
53
 
43
54
  syntaxer do
@@ -75,6 +86,8 @@ Options for usage
75
86
  -r, --repo indicate type of repository. Available git and svn at this time.
76
87
  -i, --install generates pre-commit hook and put it in .git/hooks folder. It checks syntax of languages what are indicated in options file before every commit
77
88
  -q, --quite disable information messages. Is needed when you only want to know the result: 1 or 0
89
+ -l, --loud informate about every checked file
90
+ -W, --warnings show warning messages
78
91
  -h, --help show help and options describe above.
79
92
 
80
93
  == Contributing to syntaxer
@@ -107,4 +120,4 @@ Artem Melnikov (ignar) Svitla Systems Inc (www.svitla.com)
107
120
 
108
121
  == Copyright
109
122
 
110
- See LICENSE.txt for further details.
123
+ See LICENSE.txt for further details.
data/Rakefile CHANGED
@@ -20,6 +20,7 @@ Jeweler::Tasks.new do |gem|
20
20
  gem.email = "kramarenko.artyom@gmail.com"
21
21
  gem.authors = ["artemk"]
22
22
  gem.executables = ["syntaxer"]
23
+ gem.files.include "lib/syntaxer/progress_bar.rb"
23
24
  end
24
25
  Jeweler::RubygemsDotOrgTasks.new
25
26
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
data/bin/syntaxer CHANGED
@@ -15,6 +15,8 @@ class SyntaxerCLI
15
15
  options.config_file = Syntaxer::SYNTAXER_RULES_FILE
16
16
  options.root_path = Dir.getwd
17
17
  options.languages = :all
18
+ options.warnings = false
19
+ options.rails = false
18
20
 
19
21
  opts = OptionParser.new do |opts|
20
22
  opts.banner = "Usage: syntaxer [options]"
@@ -40,14 +42,30 @@ class SyntaxerCLI
40
42
  options.repository = r
41
43
  end
42
44
 
43
- opts.on("-q", "--quite", "Run in verbose mode") do |r|
45
+ opts.on("-q", "--quite", "Run in quite mode") do |r|
44
46
  options.quite = true
45
47
  end
46
48
 
49
+ opts.on("-l", "--loud", "Run in loud mode") do |r|
50
+ options.loud = true
51
+ end
52
+
47
53
  opts.on("-i", "--install", "Write hooks to git") do |r|
48
54
  options.generate = true
49
55
  end
50
56
 
57
+ opts.on("-W", "--warnings", "Turn warning messages on") do |r|
58
+ options.warnings = true
59
+ end
60
+
61
+ opts.on("-H", "--hook", "Use syntaxer in hook context") do |r|
62
+ options.hook = true
63
+ end
64
+
65
+ opts.on("-R", "--rails", "Use syntaxer with rails") do |r|
66
+ options.rails = true
67
+ end
68
+
51
69
  opts.separator ""
52
70
  opts.separator "Common options:"
53
71
 
@@ -8,7 +8,7 @@ Feature: Check syntax in plain mode
8
8
  @plain
9
9
  Scenario: Run checker in directory
10
10
  Given directory contains two files
11
- When I run `syntaxer` interactively
11
+ When I run 'syntaxer'
12
12
  Then the exit status should not be 0
13
13
  And the output should not contain "Syntax OK"
14
14
 
@@ -0,0 +1,24 @@
1
+ @announce
2
+ Feature: Check output of script
3
+
4
+ In order to check outut of script
5
+ A user who used gem
6
+ Should to see errors in files
7
+
8
+ @plain @output
9
+ Scenario: Run checker with verbose mode
10
+ Given a file named "wrong.rb" with:
11
+ """
12
+ class A
13
+ """
14
+ And a file named "correct.rb" with:
15
+ """
16
+ class B; end;
17
+ """
18
+ Then I run 'syntaxer -l'
19
+ And the output should contain:
20
+ """
21
+ correct.rb OK
22
+ """
23
+
24
+
@@ -0,0 +1,12 @@
1
+ @announce
2
+ Feature: Check git repository before commit
3
+
4
+ @repo @rails
5
+ Scenario: Installation hook in rails environment
6
+ Given rails project
7
+ And some lib with wrong syntax
8
+ And installed hook in rails context
9
+ When I run `git commit -m "some message"`
10
+ Then the syntaxer shoud stop commit
11
+ And the output should contain "Errors:"
12
+ And the output should contain "EE"
@@ -11,3 +11,7 @@ Feature: Check git repository before commit
11
11
  And some file with wrong syntax
12
12
  When run `git commit -m "some message"` interactively
13
13
  Then the syntaxer should stop commit
14
+
15
+
16
+
17
+
@@ -1,7 +1,28 @@
1
+ Given /^I'am using a clean gemset test$/ do
2
+ Aruba::Api::DEFAULT_TIMEOUT_SECONDS = 20
3
+ use_clean_gemset("test")
4
+ end
5
+
1
6
  Given /^directory contains two files$/ do
2
7
  create_temp_plain_work_dir
3
8
  end
4
9
 
10
+ When /^I run 'syntaxer'$/ do
11
+ run_simple(unescape("#{File.join(File.dirname(__FILE__),'..','..','bin','syntaxer')}"), false)
12
+ end
13
+
14
+ Then /^I run 'syntaxer \-l'$/ do
15
+ run_simple(unescape("#{File.join(File.dirname(__FILE__),'..','..','bin','syntaxer')} -l"), false)
16
+ end
17
+
18
+ Then /^I run 'syntaxer \-W'$/ do
19
+ run_simple(unescape("#{File.join(File.dirname(__FILE__),'..','..','bin','syntaxer')} -W"), false)
20
+ end
21
+
22
+ Then /^I run 'syntaxer \-v'$/ do
23
+ run_simple(unescape("#{File.join(File.dirname(__FILE__),'..','..','bin','syntaxer')} -v"), false)
24
+ end
25
+
5
26
  When /^I cd to working directory$/ do
6
27
  cd(@tmp_dir)
7
28
  end
@@ -0,0 +1,29 @@
1
+ Given /^rails project$/ do
2
+ in_current_dir do
3
+ FileUtils.mkdir("config")
4
+ FileUtils.mkdir("app")
5
+ end
6
+ write_file('app/correct.rb','class C;end;')
7
+ run_simple(unescape("git init"), false)
8
+ run_simple(unescape("git add ."), false)
9
+ run_simple(unescape("git commit -m'first commit'"), false)
10
+ end
11
+
12
+ Given /^some lib with wrong syntax$/ do
13
+ write_file('lib/wrong.rb', "mod A;end")
14
+ write_file('app/wrong.rb', "mod A;end")
15
+ run_simple(unescape("git add ."), false)
16
+ end
17
+
18
+ Given /^installed hook in rails context$/ do
19
+ run_simple("#{File.join(File.dirname(__FILE__),'..','..','bin','syntaxer')} -i -r git --hook --rails")
20
+ in_current_dir do
21
+ FileUtils.cp(File.join(File.dirname(__FILE__),'..','..',"syntaxer_rails_rules.dist.rb"),"config/syntaxer.rb")
22
+ end
23
+ run_simple('chmod 755 .git/hooks/pre-commit')
24
+ end
25
+
26
+ Then /^the syntaxer shoud stop commit$/ do
27
+ @last_exit_status.should eql(1)
28
+ end
29
+
@@ -3,15 +3,31 @@ Given /^git repository$/ do
3
3
  end
4
4
 
5
5
  Given /^some file with wrong syntax$/ do
6
- in_current_dir do
6
+ #in_current_dir do
7
7
  add_fixtures_files
8
- end
8
+ #end
9
9
  end
10
10
 
11
11
  When /^run `git commit \-m \"some message\"` interactively$/ do
12
12
  add_hook
13
13
  end
14
14
 
15
+ Then /^I run 'syntaxer \-i \-r git'$/ do
16
+ run_simple(unescape("#{File.join(File.dirname(__FILE__),'..','..','bin','syntaxer')} -i -r git"), false)
17
+ end
18
+
19
+
15
20
  Then /^the syntaxer should stop commit$/ do
16
21
  lambda{make_git_commit}.should raise_exception
17
22
  end
23
+
24
+ Given /^I init empty repository$/ do
25
+ run_simple(unescape("git init"), false)
26
+ end
27
+
28
+ Given /^I make first commit$/ do
29
+ run_simple(unescape("git add ."), false)
30
+ run_simple(unescape("git commit -m 'first commit'"), false)
31
+ end
32
+
33
+
@@ -2,6 +2,6 @@ Before do
2
2
 
3
3
  end
4
4
 
5
- After do
6
-
5
+ AfterStep do
6
+ FileUtils.rm_r('tmp/arba/.git') if File.directory?('tmp/arba/.git')
7
7
  end
@@ -7,7 +7,25 @@ Feature: Test options
7
7
 
8
8
  @plain
9
9
  Scenario: Run version checking
10
- When I run `syntaxer -v`
10
+ When I run 'syntaxer -v'
11
11
  Then the exit status should be 0
12
12
  And the output should be the same as in "VERSION" file
13
13
 
14
+ @plain
15
+ Scenario: Run syntaxer with warning option and ruby files
16
+ Given a file named "correct.rb" with:
17
+ """
18
+ Method /^I love ruby$/ do
19
+ end
20
+ """
21
+ When I run 'syntaxer -W'
22
+ Then the output should contain "warning: ambiguous first argument;"
23
+
24
+ @plain
25
+ Scenario: Run syntaxer with warning option and non ruby files
26
+ Given a file named "correct.php" with:
27
+ """
28
+ <%php echo 1; %>
29
+ """
30
+ When I run 'syntaxer -W'
31
+ Then the output should contain "Syntax OK"
data/lib/syntaxer.rb CHANGED
@@ -3,20 +3,24 @@ require "rake"
3
3
  require "open3"
4
4
  require "forwardable"
5
5
  require "git"
6
+ require "rainbow"
7
+ require 'progress_bar'
6
8
  require File.join(%w{syntaxer reader})
7
9
  require File.join(%w{syntaxer file_status})
8
10
  require File.join(%w{syntaxer checker})
9
11
  require File.join(%w{syntaxer repository})
10
12
  require File.join(%w{syntaxer language_definition})
11
13
  require File.join(%w{syntaxer printer})
12
- require 'progress_bar'
14
+ require File.join(%w{syntaxer progress_bar})
15
+
16
+ require File.join(%w{syntaxer railtie}) if defined?(Rails)
13
17
 
14
18
  module Syntaxer
15
19
  DEFAULT_FILES_MASK = "**/*"
16
20
  SYNTAXER_RULES_FILE = File.join(File.dirname(__FILE__), "..", "syntaxer_rules.dist.rb")
17
21
 
18
22
  class << self
19
- attr_reader :reader, :repository, :root_path, :result, :verbose
23
+ attr_reader :reader, :repository, :root_path, :results, :warnings, :hook
20
24
 
21
25
  def configure
22
26
  yield(self) if block_given?
@@ -35,13 +39,16 @@ module Syntaxer
35
39
  def check_syntax(options = {})
36
40
  @root_path = options[:root_path]
37
41
  Printer.quite = options[:quite] || false
42
+ Printer.loud = options[:loud] || false
43
+ @warnings = options[:warnings]
44
+ @hook = options[:hook]
38
45
 
39
46
  @reader = Reader::DSLReader.load(options[:config_file])
40
47
  @repository = Repository.factory(@root_path, options[:repository]) if options[:repository]
41
48
 
42
- error_files = Checker.process(self).error_files
43
- Printer.print_result error_files
44
- exit(1) unless error_files.empty?
49
+ checker = Checker.process(self)
50
+ Printer.print_result checker
51
+ exit(1) unless checker.error_files.empty?
45
52
  end
46
53
 
47
54
  # This method generate and put hook to .git/hooks
@@ -56,10 +63,14 @@ module Syntaxer
56
63
  @root_path = options[:root_path]
57
64
  raise ArgumentError, 'Indicate repository type' unless options.include?(:repository)
58
65
  raise ArgumentError, "SVN is temporarily not supported" if options[:repository].to_sym == :svn
66
+
59
67
  repo = Repository.factory(@root_path, options[:repository])
60
68
  hook_file = "#{@root_path}/.git/hooks/pre-commit"
69
+ hook_string = "syntaxer -r git --hook"
70
+ hook_string += " -c config/syntaxer.rb" if options[:rails]
71
+
61
72
  File.open(hook_file, 'w') do |f|
62
- f.puts "syntaxer -r git" # #{@root_path}"
73
+ f.puts hook_string
63
74
  end
64
75
  File.chmod(0755, hook_file)
65
76
  rescue Exception => e
@@ -6,12 +6,16 @@ module Syntaxer
6
6
  include Observable
7
7
  extend Forwardable
8
8
 
9
- def_delegators Syntaxer::FileStatus, :error_files, :fine_files
10
-
9
+ def_delegators Syntaxer::FileStatus, :error_files, :all_files
10
+
11
11
  attr_accessor :syntaxer, :reader
12
12
 
13
13
  def initialize(syntaxer, count)
14
- Printer.count_of_files count
14
+ Printer.setup do |p|
15
+ p.count_of_files = count
16
+ p.mode = syntaxer.hook ? :hook : :default
17
+ end
18
+
15
19
  add_observer(Printer)
16
20
  @syntaxer = syntaxer
17
21
  @reader = @syntaxer.reader
@@ -31,7 +35,23 @@ module Syntaxer
31
35
  end
32
36
 
33
37
  protected
38
+
34
39
  def check rule, file
40
+ changed
41
+ unless rule.exec_existence
42
+ # notify if not exists
43
+ notify_observers({:rule => rule})
44
+ else
45
+ if @syntaxer.warnings && rule.name == :ruby
46
+ rule.exec_rule = rule.exec_rule.gsub(/(-\S+)\s/,'\1w ')
47
+ end
48
+ errors = run_exec_rule(rule, file)
49
+ FileStatus.build(file, errors)
50
+ notify_observers({:file_status => errors.empty?})
51
+ end
52
+ end
53
+
54
+ def run_exec_rule rule, file
35
55
  popen3(rule.exec_rule.gsub('%filename%', file)) do |stdin, stdout, stderr, wait_thr|
36
56
  stderr.read.split("\n")
37
57
  end
@@ -53,26 +73,29 @@ module Syntaxer
53
73
 
54
74
  def process
55
75
  checked_files = Set.new
76
+ rule_files = {}
77
+
56
78
  @reader.rules.each do |rule|
57
- files_collection = []
79
+ rule_files[rule.name] = {}
80
+ rule_files[rule.name][:rule] = rule
81
+ rule_files[rule.name][:files] = []
58
82
  rule.extensions.each do |ext|
59
83
  files.each do |file|
60
- if file.include?(ext) && !checked_files.include?(file)
61
- files_collection << file
62
- checked_files.add(file)
84
+ if File.extname(file).gsub(/\./,'') == ext || \
85
+ (!rule.specific_files.nil? && !rule_files[rule.name][:files].include?(file) && rule.specific_files.include?(file))
86
+ rule_files[rule.name][:files].push(file)
63
87
  end
64
88
  end
65
89
  end
90
+ end
66
91
 
67
- files_collection.each do |file|
92
+ rule_files.each do |rule_name, rule|
93
+ rule[:files].each do |file|
68
94
  full_path = File.join(@syntaxer.root_path,file)
69
- errors = check(rule, full_path)
70
- FileStatus.build(file, errors)
71
- changed
72
- notify_observers(errors.empty?)
95
+ check(rule[:rule], full_path)
73
96
  end
74
97
  end
75
-
98
+
76
99
  self
77
100
  end
78
101
 
@@ -94,11 +117,9 @@ module Syntaxer
94
117
 
95
118
  def process
96
119
  @reader.rules.each do |rule|
120
+ # check if executor exists
97
121
  rule.files_list(@syntaxer.root_path).each do |file|
98
- errors = check(rule, file)
99
- FileStatus.build(file, errors)
100
- changed
101
- notify_observers(errors.empty?)
122
+ check(rule, file)
102
123
  end
103
124
  end
104
125
 
@@ -4,7 +4,7 @@ module Syntaxer
4
4
 
5
5
  class FileStatus
6
6
  @@error_files = []
7
- @@fine_files = []
7
+ @@all_files = []
8
8
 
9
9
  attr_reader :file_name, :status, :errors
10
10
 
@@ -17,15 +17,16 @@ module Syntaxer
17
17
  class << self
18
18
  def build(file_name, errors = [])
19
19
  file_status = new(file_name, errors)
20
- errors.empty? ? @@fine_files << file_status : @@error_files << file_status
20
+ @@all_files << file_status
21
+ @@error_files << file_status unless errors.empty?
21
22
  end
22
23
 
23
24
  def error_files
24
- @@error_files
25
+ @@error_files
25
26
  end
26
27
 
27
- def fine_files
28
- @@fine_files
28
+ def all_files
29
+ @@all_files
29
30
  end
30
31
 
31
32
  end
@@ -1,19 +1,21 @@
1
1
  module Syntaxer
2
2
  class LanguageDefinitionException < Exception; end
3
3
 
4
- LanguageDefinition = Struct.new(:name, :extensions, :specific_files, :folders, :ignore_folders, :exec_rule) do
4
+ LanguageDefinition = Struct.new(:name, :extensions, :specific_files, :folders, :ignore_folders, :exec_rule, :executor, :exec_existence) do
5
5
  def initialize(*args)
6
- super(*args)
6
+ super(*args)
7
7
  raise LanguageDefinitionException.new "name can't be blank" unless self.name
8
8
  end
9
9
 
10
10
 
11
11
  def files_list(root_path)
12
+ root_path += "/" if root_path.match(/\/$/).nil?
12
13
  main_rule = folders.map{|f| root_path + f + ".\{#{extensions.join(',')}\}"}
13
14
  list = Rake::FileList.new(main_rule) do |fl|
14
- #fl.add(specific_files) if specific_files TODO:fix this
15
15
  fl.exclude(ignore_folders) if ignore_folders
16
16
  end
17
+ all_files = Rake::FileList.new(root_path+'*')
18
+ list += all_files.find_all {|f| f if !File.directory?(f) && !specific_files.nil? && specific_files.include?(File.basename(f)) }
17
19
  list
18
20
  end
19
21
  end
@@ -1,46 +1,73 @@
1
- require "rainbow"
2
1
  module Syntaxer
3
2
 
4
3
  # Print system messages
5
4
 
6
5
  class Printer
7
6
  class << self
7
+ NON_EXISTENT_RULE_MESSAGE = "exec_rule `%s` for language %s not exists. Skip"
8
+
8
9
  @@bar = nil
9
- attr_accessor :quite
10
+ @@not_exists_rules = []
11
+ attr_accessor :quite, :loud, :mode, :count_of_files
10
12
 
11
- # Set count of files for progress bar
12
- #
13
- # @param [Integer] count of files
14
-
15
- def count_of_files count
16
- @@bar = ProgressBar.new(count, :bar, :counter)
13
+ def setup &block
14
+ yield self if block_given?
15
+ if @mode == :hook
16
+ @@bar = Syntaxer::ProgressBar.new
17
+ else
18
+ @@bar = ::ProgressBar.new(@count_of_files, :bar, :counter)
19
+ end
17
20
  end
18
21
 
19
22
  # Show progress
20
23
  #
21
24
  # @param [Boolean] (true|false)
22
25
 
23
- def update status
24
- @@bar.increment! unless @quite
26
+ def update *args #not_exists_rule = nil, file_status = (status=true;)
27
+ args = args.first
28
+ @@not_exists_rules << args[:rule] if args.include?(:rule) && !@@not_exists_rules.include?(args[:rule])
29
+ return if @quite
30
+ if args.include?(:file_status)
31
+ @mode == :hook ? @@bar.increment!(args[:file_status]) : @@bar.increment!
32
+ # @@bar.increment!(args[:file_status]) if @mode == :hook
33
+ # @@bar.increment! unless @mode == :hook
34
+ end
35
+ true
25
36
  end
26
37
 
27
38
  # Print error message for each if file
28
39
  #
29
40
  # @param [Array, #each] files
30
41
 
31
- def print_result files
42
+ def print_result checker
32
43
  return if @quite
33
44
  puts "\n"
34
- puts "Syntax OK".color(:green) if files.empty?
35
- puts "Errors:".color(:red) unless files.empty?
45
+ puts "Syntax OK".color(:green) if checker.error_files.empty?
36
46
 
47
+ @loud ? (files = checker.all_files) : (files = checker.error_files)
37
48
  files.each do |file|
38
- puts file.file_name
39
- file.errors.each do |error|
40
- puts "\t #{error}".color(:red)
49
+ print_message(file)
50
+ end
51
+
52
+ unless @@not_exists_rules.empty?
53
+ puts "\n"
54
+ @@not_exists_rules.each do |rule|
55
+ puts (NON_EXISTENT_RULE_MESSAGE % [rule.executor, rule.name]).color(:yellow)
41
56
  end
42
57
  end
43
58
  end
59
+
60
+ def print_message filestatus
61
+ return if @quite
62
+ puts "\n"
63
+ print filestatus.file_name
64
+ puts " OK".color(:green) if filestatus.status == :ok && @loud
65
+ puts "\nErrors:".color(:red) if filestatus.status == :failed
66
+ filestatus.errors.each do |error|
67
+ puts "\t #{error}".color(:red)
68
+ end
69
+ end
70
+
44
71
  end
45
72
  end
46
73
  end
@@ -0,0 +1,13 @@
1
+ module Syntaxer
2
+ class ProgressBar
3
+
4
+ def increment! status
5
+ if status
6
+ print ".".color(:green)
7
+ else
8
+ print "E".color(:red)
9
+ end
10
+ end
11
+
12
+ end
13
+ end
@@ -9,4 +9,4 @@ module Syntaxer
9
9
  end
10
10
  end
11
11
  end
12
- end
12
+ end
@@ -125,6 +125,8 @@ module Syntaxer
125
125
  end
126
126
 
127
127
  def exec_rule(exec_string)
128
+ current_rule.executor = exec_string.scan(/\w+/).first
129
+ current_rule.exec_existence = system("which #{current_rule.executor} > /dev/null")
128
130
  current_rule.exec_rule = exec_string
129
131
  end
130
132
 
@@ -0,0 +1,9 @@
1
+ namespace :syntaxer do
2
+ desc 'my plugins rake task'
3
+ task :install => :environment do
4
+ system('syntaxer -i -r git --hook --rails')
5
+ FileUtils.cp(File.join(File.dirname(__FILE__),'..','..','syntaxer_rails_rules.dist.rb'),\
6
+ File.join(Rails.root,'config','syntaxer.rb'))
7
+ puts "Syntaxer hook installed. Look to the config/syntaxer.rb to change configuration.".color(:green)
8
+ end
9
+ end
data/rails/init.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'syntaxer/railtie'
2
2
 
3
3
  Syntaxer.configure do |syntaxer|
4
- syntaxer.root = Rails.root
4
+ syntaxer.root_path = Rails.root
5
5
  end
data/spec/checker_spec.rb CHANGED
@@ -6,28 +6,29 @@ describe "Syntaxer::Checker" do
6
6
 
7
7
  before(:each) do
8
8
  reader = mock('Reader')
9
- reader.stub!(:rules).and_return([Syntaxer::LanguageDefinition.new(:ruby, ["rb.example", "rake"], ["Rakefile", "Thorfile"], ["**/*"], nil, "ruby -wc %filename%")])
10
- reader.stub!(:files_count).and_return(2)
9
+ reader.stub!(:rules).and_return([Syntaxer::LanguageDefinition.new(:ruby, ["rb.example", "rake"], ["Rakefile", "Thorfile"], ["**/*"], nil, "ruby -c %filename%", "ruby", true)])
10
+ reader.stub!(:files_count).and_return(3)
11
11
  Syntaxer.should_receive(:reader).any_number_of_times.and_return(reader)
12
12
  Syntaxer.stub!(:root_path).and_return(fixtures_path(:ruby))
13
13
 
14
14
  Syntaxer::Printer.stub!(:print_result)
15
- Syntaxer::Printer.stub!(:print_progress)
15
+ Syntaxer::Printer.stub!(:print_message)
16
+ Syntaxer::Printer.stub!(:update)
16
17
  end
17
18
 
18
19
  subject {Syntaxer::PlainChecker.new(Syntaxer)}
19
20
 
20
21
  it {should respond_to(:error_files)}
21
- it {should respond_to(:fine_files)}
22
+ it {should respond_to(:all_files)}
22
23
 
23
24
  it "should return correct error_files " do
24
25
  subject.process
25
- subject.fine_files.size.should == 1
26
- subject.error_files.size.should == 1
26
+ subject.all_files.size.should == 3
27
+ subject.error_files.size.should == 2
27
28
  end
28
29
 
29
30
  it "should send to FileStatus" do
30
- Syntaxer::FileStatus.should_receive(:build).twice
31
+ Syntaxer::FileStatus.should_receive(:build).exactly(3).times
31
32
  subject.process
32
33
  end
33
34
  end
@@ -40,7 +41,8 @@ describe "Syntaxer::Checker" do
40
41
 
41
42
  before(:all) do
42
43
  Syntaxer::Printer.stub!(:print_result)
43
- Syntaxer::Printer.stub!(:print_progress)
44
+ Syntaxer::Printer.stub!(:print_message)
45
+ Syntaxer::Printer.stub!(:update)
44
46
  end
45
47
 
46
48
  before(:each) do
@@ -51,7 +53,7 @@ describe "Syntaxer::Checker" do
51
53
  make_git_add(@repo_dir)
52
54
 
53
55
  reader = mock('Reader')
54
- reader.stub!(:rules).and_return([Syntaxer::LanguageDefinition.new(:ruby, ["rb.example", "rake"], ["Rakefile", "Thorfile"], ["**/*"], nil, "ruby -wc %filename%")])
56
+ reader.stub!(:rules).and_return([Syntaxer::LanguageDefinition.new(:ruby, ["example", "rake"], ["Rakefile", "Thorfile"], ["**/*"], nil, "ruby -c %filename%", "ruby", true)])
55
57
  Syntaxer.should_receive(:reader).and_return(reader)
56
58
  Syntaxer.stub!(:root_path).and_return(@repo_dir)
57
59
  repo = Syntaxer::Repository.factory(@repo_dir, :git)
@@ -62,7 +64,7 @@ describe "Syntaxer::Checker" do
62
64
 
63
65
  it "should return correct error_files" do
64
66
  subject.process
65
- subject.fine_files.size.should_not eql(0)
67
+ subject.all_files.size.should_not eql(0)
66
68
  subject.error_files.size.should_not eql(0)
67
69
  end
68
70
 
@@ -2,4 +2,8 @@ class A
2
2
  def some_method
3
3
  puts "Do nothing"
4
4
  end
5
- end
5
+ end
6
+
7
+ Method /^I love ruby$/ do
8
+
9
+ end
@@ -0,0 +1,2 @@
1
+ cals A
2
+ end
@@ -1,11 +1,12 @@
1
1
  syntaxer do
2
2
 
3
3
  languages :ruby do
4
- folders 'app/controllers/**/*'
4
+ extensions "example"
5
+ folders '**/*'
5
6
  end
6
7
 
7
8
  languages :haml do
8
- folders 'app/views/**/*'
9
+ folders '**/*'
9
10
  end
10
11
 
11
12
  #ignore_folders "app/models/**" # this folders will be deleted from all languages
@@ -27,7 +27,7 @@ describe "LanguageRules" do
27
27
 
28
28
  context "LanguageDefinition" do
29
29
  it "#file_list should return correct file list based on rules" do
30
- correct_array = Rake::FileList.new(File.dirname(__FILE__) + '/fixtures/ruby/*')
30
+ correct_array = Rake::FileList.new(File.dirname(__FILE__) + '/fixtures/ruby/**/*.example')
31
31
  ld = Syntaxer::LanguageDefinition.new(:ruby, ["rb.example", "rake"], ["Rakefile", "Thorfile"], ["**/*"], nil, "`ruby -wc %filename%`")
32
32
  ld.files_list(File.dirname(__FILE__) + '/fixtures/').should == correct_array
33
33
  end
data/spec/printer_spec.rb CHANGED
@@ -9,9 +9,9 @@ describe "Syntaxer" do
9
9
  subject{Syntaxer::Printer}
10
10
 
11
11
  it "should be quite if passed --quite option" do
12
- ProgressBar.new.should_not_receive(:update)
12
+ ::ProgressBar.new.should_not_receive(:update)
13
13
  subject.quite = true
14
- subject.update true
14
+ subject.update({})
15
15
  subject.print_result ['a','b']
16
16
  end
17
17
  end
data/spec/reader_spec.rb CHANGED
@@ -5,10 +5,9 @@ describe "Syntaxer::Reader::DSLReader" do
5
5
  context "#build" do
6
6
  it "should build from default distr rules files" do
7
7
  @reader = Syntaxer::Reader::DSLReader.build
8
-
9
- @reader.rules.find(:ruby).should == Syntaxer::LanguageDefinition.new(:ruby, ["rb", "rake"], ["Rakefile", "Thorfile"], ["**/*"], nil, "ruby -wc %filename%")
10
- @reader.rules.find(:haml).should == Syntaxer::LanguageDefinition.new(:haml, ["haml"], nil, ["**/*"], nil, "haml -c %filename%")
11
- @reader.rules.find(:sass).should == Syntaxer::LanguageDefinition.new(:sass, ["sass"], nil, ["**/*"], nil, "sass -c %filename%")
8
+ @reader.rules.find(:ruby).should == Syntaxer::LanguageDefinition.new(:ruby, ["rb", "rake"], ["Rakefile", "Thorfile", "Gemfile"], ["**/*"], nil, "ruby -c %filename%", "ruby", true)
9
+ @reader.rules.find(:haml).should == Syntaxer::LanguageDefinition.new(:haml, ["haml"], nil, ["**/*"], nil, "haml -c %filename%", "haml", system("which haml 2>&1 > /dev/null"))
10
+ @reader.rules.find(:sass).should == Syntaxer::LanguageDefinition.new(:sass, ["sass"], nil, ["**/*"], nil, "sass -c %filename%", "sass", system("which haml 2>&1 > /dev/null"))
12
11
 
13
12
  end
14
13
  end
@@ -36,8 +35,8 @@ describe "Syntaxer::Reader::DSLReader" do
36
35
 
37
36
  it "should load from file" do
38
37
  reader = Syntaxer::Reader::DSLReader.load(syntaxer_rules_example_file)
39
- reader.rules.find(:ruby).folders.should == ["app/controllers/**/*"]
40
- reader.rules.find(:haml).folders.should == ["app/views/**/*"]
38
+ reader.rules.find(:ruby).folders.should == ["**/*"]
39
+ reader.rules.find(:haml).folders.should == ["**/*"]
41
40
  end
42
41
 
43
42
  it "should do substitution for the same rules" do
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rubygems'
3
4
  require 'rspec'
4
5
  require 'git'
5
6
  require 'syntaxer'
6
7
  require "tmpdir"
8
+ require 'aruba/api'
7
9
 
8
10
  # Requires supporting files with custom matchers and macros, etc,
9
11
  # in ./support/ and its subdirectories.
@@ -67,7 +69,7 @@ def add_hook(ruby_repo_dir)
67
69
  hook_file = File.join(ruby_repo_dir,'.git/hooks/pre-commit')
68
70
 
69
71
  File.open(hook_file, 'w') do |f|
70
- f.puts "#{bin_file} -c #{syntaxer_rules_example_file('syntaxer_rules_git')} -r git -p #{ruby_repo_dir}"
72
+ f.puts "#{bin_file} -c #{syntaxer_rules_example_file} -r git -p #{ruby_repo_dir} --hook"
71
73
  end
72
74
 
73
75
  File.chmod(0755, hook_file)
@@ -83,3 +85,12 @@ def syntaxer_rules_example_file file = ''
83
85
  File.join(fixtures_path, "#{file.empty? ? 'syntaxer_rules': file}.rb" )
84
86
  end
85
87
 
88
+ class ArubaHelper
89
+ include Aruba::Api
90
+ class << self
91
+ def method_missing method, *args
92
+ ArubaHelper.new.send(method, *args)
93
+ end
94
+ end
95
+ end
96
+
@@ -6,13 +6,19 @@ describe "Syntaxer" do
6
6
  it {should respond_to(:check_syntax)}
7
7
 
8
8
  context "in plain mode" do
9
+ before(:all) do
10
+ Syntaxer::Printer.stub!(:print_result)
11
+ Syntaxer::Printer.stub!(:print_message)
12
+ Syntaxer::Printer.stub!(:update)
13
+ end
14
+
9
15
  it "should exit with error if where is syntax mistake" do
10
16
  lambda{ subject.check_syntax({:root_path => fixtures_path, :config_file => syntaxer_rules_example_file}) }.should raise_exception
11
17
  end
12
18
  end
13
19
 
14
20
  context "checking GIT repo" do
15
-
21
+
16
22
  before(:each) do
17
23
  @repo_dir = create_temp_ruby_project
18
24
  make_initial_commit(@repo_dir)
data/syntaxer.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{syntaxer}
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["artemk"]
12
- s.date = %q{2011-04-18}
12
+ s.date = %q{2011-04-23}
13
13
  s.default_executable = %q{syntaxer}
14
14
  s.description = %q{Syntax checker for ruby and other languages}
15
15
  s.email = %q{kramarenko.artyom@gmail.com}
@@ -27,8 +27,11 @@ Gem::Specification.new do |s|
27
27
  "VERSION",
28
28
  "bin/syntaxer",
29
29
  "features/plain_check.feature",
30
+ "features/printer_check.feature",
31
+ "features/rails_check.feature",
30
32
  "features/repository_check.feature",
31
33
  "features/step_definitions/plain_checker.rb",
34
+ "features/step_definitions/rails_checker.rb",
32
35
  "features/step_definitions/repository_checker.rb",
33
36
  "features/support/env.rb",
34
37
  "features/support/hooks.rb",
@@ -40,6 +43,7 @@ Gem::Specification.new do |s|
40
43
  "lib/syntaxer/file_status.rb",
41
44
  "lib/syntaxer/language_definition.rb",
42
45
  "lib/syntaxer/printer.rb",
46
+ "lib/syntaxer/progress_bar.rb",
43
47
  "lib/syntaxer/railtie.rb",
44
48
  "lib/syntaxer/reader.rb",
45
49
  "lib/syntaxer/repository.rb",
@@ -49,6 +53,7 @@ Gem::Specification.new do |s|
49
53
  "spec/fixtures/haml/correct.html.haml",
50
54
  "spec/fixtures/haml/wrong.html.haml",
51
55
  "spec/fixtures/ruby/correct.rb.example",
56
+ "spec/fixtures/ruby/subfolder/wrong.rb.example",
52
57
  "spec/fixtures/ruby/wrong.rb.example",
53
58
  "spec/fixtures/syntaxer_rules.rb",
54
59
  "spec/fixtures/syntaxer_rules_git.rb",
@@ -59,6 +64,7 @@ Gem::Specification.new do |s|
59
64
  "spec/spec_helper.rb",
60
65
  "spec/syntaxer_spec.rb",
61
66
  "syntaxer.gemspec",
67
+ "syntaxer_rails_rules.dist.rb",
62
68
  "syntaxer_rules.dist.rb"
63
69
  ]
64
70
  s.homepage = %q{http://github.com/artemk/syntaxer}
@@ -0,0 +1,20 @@
1
+ syntaxer do
2
+ languages :ruby do
3
+ folders "app/*", "app/**/*", "lib/*", "lib/**/*"
4
+ extensions "rb", "rake"
5
+ specific_files "Rakefile", "Thorfile", "Gemfile"
6
+ exec_rule "ruby -c %filename%"
7
+ end
8
+
9
+ lang :sass do
10
+ folders "public/stylesheets/**/*"
11
+ extensions "sass"
12
+ exec_rule "sass -c %filename%"
13
+ end
14
+
15
+ lang :haml do
16
+ folders "app/views/**/*", "app/views/*"
17
+ extensions "haml"
18
+ exec_rule "haml -c %filename%"
19
+ end
20
+ end
@@ -2,8 +2,8 @@ syntaxer do
2
2
  languages :ruby do
3
3
  folders "**/*"
4
4
  extensions "rb", "rake"
5
- specific_files "Rakefile", "Thorfile"
6
- exec_rule "ruby -wc %filename%"
5
+ specific_files "Rakefile", "Thorfile", "Gemfile"
6
+ exec_rule "ruby -c %filename%"
7
7
  end
8
8
 
9
9
  lang :sass do
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syntaxer
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
4
  prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 0
10
- version: 0.3.0
5
+ version: 0.4.0
11
6
  platform: ruby
12
7
  authors:
13
8
  - artemk
@@ -15,127 +10,97 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2011-04-18 00:00:00 +03:00
13
+ date: 2011-04-23 00:00:00 +03:00
19
14
  default_executable: syntaxer
20
15
  dependencies:
21
16
  - !ruby/object:Gem::Dependency
22
- type: :runtime
17
+ name: git
23
18
  requirement: &id001 !ruby/object:Gem::Requirement
24
19
  none: false
25
20
  requirements:
26
21
  - - ">="
27
22
  - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
23
  version: "0"
32
- name: git
33
- version_requirements: *id001
24
+ type: :runtime
34
25
  prerelease: false
26
+ version_requirements: *id001
35
27
  - !ruby/object:Gem::Dependency
36
- type: :runtime
28
+ name: rainbow
37
29
  requirement: &id002 !ruby/object:Gem::Requirement
38
30
  none: false
39
31
  requirements:
40
32
  - - ">="
41
33
  - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
34
  version: "0"
46
- name: rainbow
47
- version_requirements: *id002
35
+ type: :runtime
48
36
  prerelease: false
37
+ version_requirements: *id002
49
38
  - !ruby/object:Gem::Dependency
50
- type: :runtime
39
+ name: progress_bar
51
40
  requirement: &id003 !ruby/object:Gem::Requirement
52
41
  none: false
53
42
  requirements:
54
43
  - - ">="
55
44
  - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
45
  version: "0"
60
- name: progress_bar
61
- version_requirements: *id003
46
+ type: :runtime
62
47
  prerelease: false
48
+ version_requirements: *id003
63
49
  - !ruby/object:Gem::Dependency
64
- type: :development
50
+ name: rspec
65
51
  requirement: &id004 !ruby/object:Gem::Requirement
66
52
  none: false
67
53
  requirements:
68
54
  - - ">="
69
55
  - !ruby/object:Gem::Version
70
- hash: 27
71
- segments:
72
- - 2
73
- - 5
74
- - 0
75
56
  version: 2.5.0
76
- name: rspec
77
- version_requirements: *id004
57
+ type: :development
78
58
  prerelease: false
59
+ version_requirements: *id004
79
60
  - !ruby/object:Gem::Dependency
80
- type: :development
61
+ name: yard
81
62
  requirement: &id005 !ruby/object:Gem::Requirement
82
63
  none: false
83
64
  requirements:
84
65
  - - ~>
85
66
  - !ruby/object:Gem::Version
86
- hash: 7
87
- segments:
88
- - 0
89
- - 6
90
- - 0
91
67
  version: 0.6.0
92
- name: yard
93
- version_requirements: *id005
68
+ type: :development
94
69
  prerelease: false
70
+ version_requirements: *id005
95
71
  - !ruby/object:Gem::Dependency
96
- type: :development
72
+ name: jeweler
97
73
  requirement: &id006 !ruby/object:Gem::Requirement
98
74
  none: false
99
75
  requirements:
100
76
  - - ~>
101
77
  - !ruby/object:Gem::Version
102
- hash: 7
103
- segments:
104
- - 1
105
- - 5
106
- - 2
107
78
  version: 1.5.2
108
- name: jeweler
109
- version_requirements: *id006
79
+ type: :development
110
80
  prerelease: false
81
+ version_requirements: *id006
111
82
  - !ruby/object:Gem::Dependency
112
- type: :development
83
+ name: cucumber
113
84
  requirement: &id007 !ruby/object:Gem::Requirement
114
85
  none: false
115
86
  requirements:
116
87
  - - ">="
117
88
  - !ruby/object:Gem::Version
118
- hash: 3
119
- segments:
120
- - 0
121
89
  version: "0"
122
- name: cucumber
123
- version_requirements: *id007
90
+ type: :development
124
91
  prerelease: false
92
+ version_requirements: *id007
125
93
  - !ruby/object:Gem::Dependency
126
- type: :development
94
+ name: aruba
127
95
  requirement: &id008 !ruby/object:Gem::Requirement
128
96
  none: false
129
97
  requirements:
130
98
  - - ">="
131
99
  - !ruby/object:Gem::Version
132
- hash: 3
133
- segments:
134
- - 0
135
100
  version: "0"
136
- name: aruba
137
- version_requirements: *id008
101
+ type: :development
138
102
  prerelease: false
103
+ version_requirements: *id008
139
104
  description: Syntax checker for ruby and other languages
140
105
  email: kramarenko.artyom@gmail.com
141
106
  executables:
@@ -154,8 +119,11 @@ files:
154
119
  - VERSION
155
120
  - bin/syntaxer
156
121
  - features/plain_check.feature
122
+ - features/printer_check.feature
123
+ - features/rails_check.feature
157
124
  - features/repository_check.feature
158
125
  - features/step_definitions/plain_checker.rb
126
+ - features/step_definitions/rails_checker.rb
159
127
  - features/step_definitions/repository_checker.rb
160
128
  - features/support/env.rb
161
129
  - features/support/hooks.rb
@@ -167,6 +135,7 @@ files:
167
135
  - lib/syntaxer/file_status.rb
168
136
  - lib/syntaxer/language_definition.rb
169
137
  - lib/syntaxer/printer.rb
138
+ - lib/syntaxer/progress_bar.rb
170
139
  - lib/syntaxer/railtie.rb
171
140
  - lib/syntaxer/reader.rb
172
141
  - lib/syntaxer/repository.rb
@@ -176,6 +145,7 @@ files:
176
145
  - spec/fixtures/haml/correct.html.haml
177
146
  - spec/fixtures/haml/wrong.html.haml
178
147
  - spec/fixtures/ruby/correct.rb.example
148
+ - spec/fixtures/ruby/subfolder/wrong.rb.example
179
149
  - spec/fixtures/ruby/wrong.rb.example
180
150
  - spec/fixtures/syntaxer_rules.rb
181
151
  - spec/fixtures/syntaxer_rules_git.rb
@@ -186,6 +156,7 @@ files:
186
156
  - spec/spec_helper.rb
187
157
  - spec/syntaxer_spec.rb
188
158
  - syntaxer.gemspec
159
+ - syntaxer_rails_rules.dist.rb
189
160
  - syntaxer_rules.dist.rb
190
161
  has_rdoc: true
191
162
  homepage: http://github.com/artemk/syntaxer
@@ -201,7 +172,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
201
172
  requirements:
202
173
  - - ">="
203
174
  - !ruby/object:Gem::Version
204
- hash: 3
175
+ hash: -199843106065902149
205
176
  segments:
206
177
  - 0
207
178
  version: "0"
@@ -210,9 +181,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
210
181
  requirements:
211
182
  - - ">="
212
183
  - !ruby/object:Gem::Version
213
- hash: 3
214
- segments:
215
- - 0
216
184
  version: "0"
217
185
  requirements: []
218
186