loris 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/README.rdoc +9 -0
- data/Rakefile +41 -0
- data/TODO +21 -0
- data/VERSION +1 -0
- data/bin/loris +15 -0
- data/cucumber.yml +1 -0
- data/examples/self_test/jsl.conf +1 -0
- data/examples/self_test/spec/spec.rhino.js +6 -0
- data/features/javascript_lint.feature +34 -0
- data/features/run.feature +36 -0
- data/features/step_definitons/all.rb +69 -0
- data/features/support/env.rb +145 -0
- data/lib/always_continuer.rb +7 -0
- data/lib/browser_finder.rb +23 -0
- data/lib/file_actioner.rb +16 -0
- data/lib/file_finder.rb +31 -0
- data/lib/filters/ends_with_filter.rb +17 -0
- data/lib/filters/extension_filter.rb +20 -0
- data/lib/filters/file_filter.rb +14 -0
- data/lib/filters/modified_filter.rb +21 -0
- data/lib/icons/error.png +0 -0
- data/lib/icons/failure.png +0 -0
- data/lib/icons/info.png +0 -0
- data/lib/icons/success.png +0 -0
- data/lib/icons/warning.png +0 -0
- data/lib/js-test-driver/JsTestDriver-1.1.jar +0 -0
- data/lib/js-test-driver/plugins/coverage-1.1.jar +0 -0
- data/lib/loris.rb +170 -0
- data/lib/outputs/growl_output.rb +26 -0
- data/lib/outputs/output_collection.rb +23 -0
- data/lib/outputs/shell_output.rb +17 -0
- data/lib/outputs/unix_console_clearing_output.rb +13 -0
- data/lib/outputs/windows_console_clearing_output.rb +13 -0
- data/lib/pinger.rb +23 -0
- data/lib/poller.rb +16 -0
- data/lib/sleep_waiter.rb +11 -0
- data/lib/task_manager.rb +45 -0
- data/lib/tasks/command_line_task.rb +28 -0
- data/lib/tasks/javascript_lint/javascript_lint_parser.rb +45 -0
- data/lib/tasks/javascript_lint/javascript_lint_runner.rb +25 -0
- data/lib/tasks/js_test_driver/js_test_driver_config.rb +22 -0
- data/lib/tasks/js_test_driver/js_test_driver_parser.rb +28 -0
- data/lib/tasks/js_test_driver/js_test_driver_runner.rb +28 -0
- data/lib/tasks/js_test_driver/js_test_driver_server.rb +38 -0
- data/lib/tasks/jspec/jspec_parser.rb +30 -0
- data/lib/tasks/jspec/jspec_runner.rb +25 -0
- data/lib/tasks/list_task.rb +34 -0
- data/lib/tasks/rspec/rspec_parser.rb +25 -0
- data/lib/tasks/rspec/rspec_runner.rb +25 -0
- data/lib/unix_process.rb +7 -0
- data/lib/windows_process.rb +12 -0
- data/loris.gemspec +133 -0
- data/loris.tmproj +232 -0
- data/spec/file_actioner_spec.rb +41 -0
- data/spec/file_finder_spec.rb +73 -0
- data/spec/filters/ends_with_filter_spec.rb +26 -0
- data/spec/filters/file_filter_spec.rb +28 -0
- data/spec/filters/modified_filter_spec.rb +47 -0
- data/spec/growl_output_spec.rb +33 -0
- data/spec/list_task_spec.rb +58 -0
- data/spec/poller_spec.rb +28 -0
- data/spec/shell_output_spec.rb +25 -0
- data/spec/task_manager_spec.rb +64 -0
- data/spec/tasks/javascript_lint/javascript_lint_runner_spec.rb +90 -0
- data/spec/tasks/js_test_driver/js_test_driver_runner_spec.rb +92 -0
- data/spec/tasks/jspec/jspec_parser_spec.rb +28 -0
- data/spec/tasks/jspec/jspec_runner_spec.rb +78 -0
- metadata +174 -0
data/lib/loris.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bind'
|
6
|
+
require 'rbconfig'
|
7
|
+
require 'find'
|
8
|
+
require 'Growl'
|
9
|
+
require 'yaml'
|
10
|
+
require 'uri'
|
11
|
+
|
12
|
+
|
13
|
+
require 'file_finder'
|
14
|
+
require 'poller'
|
15
|
+
require 'sleep_waiter'
|
16
|
+
require 'always_continuer'
|
17
|
+
require 'file_actioner'
|
18
|
+
require 'task_manager'
|
19
|
+
require 'pinger'
|
20
|
+
|
21
|
+
require 'filters/extension_filter'
|
22
|
+
require 'filters/modified_filter'
|
23
|
+
require 'filters/file_filter'
|
24
|
+
require 'filters/ends_with_filter'
|
25
|
+
|
26
|
+
require 'outputs/output_collection'
|
27
|
+
require 'outputs/shell_output'
|
28
|
+
require 'outputs/windows_console_clearing_output'
|
29
|
+
require 'outputs/unix_console_clearing_output'
|
30
|
+
require 'outputs/growl_output'
|
31
|
+
|
32
|
+
require 'tasks/list_task'
|
33
|
+
require 'tasks/command_line_task'
|
34
|
+
require 'tasks/jspec/jspec_runner'
|
35
|
+
require 'tasks/jspec/jspec_parser'
|
36
|
+
require 'tasks/javascript_lint/javascript_lint_runner'
|
37
|
+
require 'tasks/javascript_lint/javascript_lint_parser'
|
38
|
+
require 'tasks/rspec/rspec_runner'
|
39
|
+
require 'tasks/rspec/rspec_parser'
|
40
|
+
|
41
|
+
|
42
|
+
include Config
|
43
|
+
|
44
|
+
class DebugObserver
|
45
|
+
def update
|
46
|
+
puts '[Poll complete]'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
module Loris
|
52
|
+
BINARY = File.expand_path(File.dirname(__FILE__) + '/../bin/loris')
|
53
|
+
LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../lib')
|
54
|
+
RUBY_BINARY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
|
55
|
+
|
56
|
+
module CLI
|
57
|
+
|
58
|
+
class Main
|
59
|
+
|
60
|
+
class DummyActioner
|
61
|
+
|
62
|
+
def initialize(actioner, stream)
|
63
|
+
@actioner = actioner
|
64
|
+
@stream = stream
|
65
|
+
end
|
66
|
+
|
67
|
+
def run
|
68
|
+
@actioner.run
|
69
|
+
@stream.puts '[Poll complete]'
|
70
|
+
@stream.flush
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
class << self
|
76
|
+
def execute(args)
|
77
|
+
|
78
|
+
# Get config variables
|
79
|
+
debug = args.length > 0
|
80
|
+
is_windows = RUBY_PLATFORM =~ /mswin32/
|
81
|
+
dir = Dir.pwd
|
82
|
+
sleep_duration = 1
|
83
|
+
browser = is_windows ? 'C:/Program Files/Internet Explorer/iexplore.exe' : 'open'
|
84
|
+
|
85
|
+
# Create object graph
|
86
|
+
w = SleepWaiter.new(sleep_duration)
|
87
|
+
c = AlwaysContinuer.new
|
88
|
+
ff = FileFinder.new(Find, dir)
|
89
|
+
ff.add_filter(FileFilter.new(File))
|
90
|
+
ff.add_filter(ModifiedFilter.new(File))
|
91
|
+
|
92
|
+
cco = is_windows ? WindowsConsoleClearingOutput.new : UnixConsoleClearingOutput.new
|
93
|
+
|
94
|
+
oc = OutputCollection.new
|
95
|
+
oc.add(ShellOutput.new($stdout))
|
96
|
+
oc.add(cco) unless debug
|
97
|
+
oc.add(GrowlOutput.new(Growl)) unless debug
|
98
|
+
|
99
|
+
tm = TaskManager.new(oc)
|
100
|
+
tm.add(ListTask.new) if debug
|
101
|
+
tm.add(CommandLineTask.new(JavascriptLintRunner.new(dir, ExtensionFilter.new(File, 'js')), JavascriptLintParser.new(dir)))
|
102
|
+
tm.add(CommandLineTask.new(JSpecRunner.new(dir, ExtensionFilter.new(File, 'js')), JSpecParser.new)) unless is_windows
|
103
|
+
tm.add(jsTestDriverTask(dir))
|
104
|
+
tm.add(CommandLineTask.new(RSpecRunner.new(dir, ExtensionFilter.new(File, 'rb'), EndsWithFilter.new('_spec.rb')), RSpecParser.new))
|
105
|
+
|
106
|
+
a = FileActioner.new(ff, tm)
|
107
|
+
|
108
|
+
da = DummyActioner.new(a, $stdout)
|
109
|
+
|
110
|
+
p = Poller.new(w, c, debug ? da : a)
|
111
|
+
|
112
|
+
# Start!
|
113
|
+
p.start
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
# Will need to be refactored into a factory
|
118
|
+
def jsTestDriverTask(dir)
|
119
|
+
require 'tasks/js_test_driver/js_test_driver_runner'
|
120
|
+
require 'tasks/js_test_driver/js_test_driver_parser'
|
121
|
+
require 'tasks/js_test_driver/js_test_driver_config'
|
122
|
+
require 'tasks/js_test_driver/js_test_driver_server'
|
123
|
+
|
124
|
+
jar = File.join(LIBDIR, 'js-test-driver/JsTestDriver-1.1.jar')
|
125
|
+
is_windows = RUBY_PLATFORM =~ /mswin32/
|
126
|
+
|
127
|
+
if is_windows
|
128
|
+
require 'browser_finder'
|
129
|
+
browser = BrowserFinder.new.getDefault
|
130
|
+
else
|
131
|
+
browser = 'open "%1"'
|
132
|
+
end
|
133
|
+
|
134
|
+
sleep_time = is_windows ? 3 : 2
|
135
|
+
|
136
|
+
if is_windows
|
137
|
+
require 'windows_process'
|
138
|
+
else
|
139
|
+
require 'unix_process'
|
140
|
+
end
|
141
|
+
|
142
|
+
return CommandLineTask.new(
|
143
|
+
JsTestDriverRunner.new(
|
144
|
+
dir,
|
145
|
+
jar,
|
146
|
+
ExtensionFilter.new(File, 'js'),
|
147
|
+
JsTestDriverServer.new(
|
148
|
+
JsTestDriverConfig.new(
|
149
|
+
dir,
|
150
|
+
YAML,
|
151
|
+
URI
|
152
|
+
),
|
153
|
+
Pinger.new,
|
154
|
+
is_windows ? WindowsProcess.new : UnixProcess.new,
|
155
|
+
jar,
|
156
|
+
browser,
|
157
|
+
sleep_time
|
158
|
+
)
|
159
|
+
),
|
160
|
+
JsTestDriverParser.new
|
161
|
+
)
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class GrowlOutput
|
2
|
+
|
3
|
+
def initialize(growler)
|
4
|
+
@growler = growler
|
5
|
+
end
|
6
|
+
|
7
|
+
def start_run
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_result(result)
|
11
|
+
icon = get_icon(result[:state])
|
12
|
+
|
13
|
+
if @growler.installed?
|
14
|
+
@growler.notify {
|
15
|
+
self.title = result[:title] + (result[:summary].nil? ? '' : ' - ' + result[:summary])
|
16
|
+
self.message = result[:first]
|
17
|
+
self.image = icon
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_icon(state)
|
23
|
+
return File.join(File.expand_path(File.dirname(__FILE__)), '..', 'icons', "#{state.to_s}.png")
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class OutputCollection
|
2
|
+
|
3
|
+
def initialize
|
4
|
+
@outputs = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def start_run
|
8
|
+
@outputs.each do |output|
|
9
|
+
output.start_run
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(output)
|
14
|
+
@outputs << output
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_result(result)
|
18
|
+
@outputs.each do |output|
|
19
|
+
output.add_result(result)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class ShellOutput
|
2
|
+
|
3
|
+
def initialize(output)
|
4
|
+
@output = output
|
5
|
+
end
|
6
|
+
|
7
|
+
def start_run
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_result(result)
|
11
|
+
@output.puts result[:title]
|
12
|
+
@output.puts result[:state]
|
13
|
+
@output.puts result[:summary]
|
14
|
+
@output.puts result[:detail]
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/pinger.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
class Pinger
|
5
|
+
|
6
|
+
def is_port_open?(ip, port)
|
7
|
+
begin
|
8
|
+
Timeout::timeout(1) do
|
9
|
+
begin
|
10
|
+
s = TCPSocket.new(ip, port)
|
11
|
+
s.close
|
12
|
+
return true
|
13
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
14
|
+
return false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
rescue Timeout::Error
|
18
|
+
end
|
19
|
+
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/poller.rb
ADDED
data/lib/sleep_waiter.rb
ADDED
data/lib/task_manager.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
class TaskManager
|
2
|
+
|
3
|
+
def initialize(output)
|
4
|
+
@output = output
|
5
|
+
@tasks = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def add(task)
|
9
|
+
@tasks << task
|
10
|
+
end
|
11
|
+
|
12
|
+
def run(files)
|
13
|
+
@output.start_run;
|
14
|
+
|
15
|
+
@tasks.each do |task|
|
16
|
+
|
17
|
+
begin
|
18
|
+
break if !run_task(files, task)
|
19
|
+
rescue Exception => ex
|
20
|
+
output_exception(ex)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def run_task(files, task)
|
28
|
+
result = task.run(files)
|
29
|
+
return true if result.nil?
|
30
|
+
|
31
|
+
@output.add_result(result)
|
32
|
+
return !([:error, :failure].include? result[:state])
|
33
|
+
end
|
34
|
+
|
35
|
+
def output_exception(ex)
|
36
|
+
@output.add_result({
|
37
|
+
:state => :error,
|
38
|
+
:title => 'Task',
|
39
|
+
:summary => 'Exception',
|
40
|
+
:first => ex.message,
|
41
|
+
:detail => ex.backtrace
|
42
|
+
})
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class CommandLineTask
|
2
|
+
|
3
|
+
def initialize(runner, parser)
|
4
|
+
@runner = runner
|
5
|
+
@parser = parser
|
6
|
+
end
|
7
|
+
|
8
|
+
def run(files)
|
9
|
+
all_files = files[:all]
|
10
|
+
modified_files = files[:filtered]
|
11
|
+
|
12
|
+
return nil if (!@runner.is_configured? all_files)
|
13
|
+
return nil if (!@runner.should_run? modified_files)
|
14
|
+
|
15
|
+
detail = @runner.execute
|
16
|
+
|
17
|
+
state, summary, first = @parser.parse_result(detail)
|
18
|
+
|
19
|
+
return {
|
20
|
+
:state => state,
|
21
|
+
:title => @runner.name,
|
22
|
+
:summary => summary,
|
23
|
+
:first => first,
|
24
|
+
:detail => detail
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class JavascriptLintParser
|
2
|
+
|
3
|
+
def initialize(dir)
|
4
|
+
@dir = dir
|
5
|
+
|
6
|
+
# TODO: Tidy!
|
7
|
+
if (RUBY_PLATFORM =~ /mswin32/)
|
8
|
+
@dir = @dir.gsub('/', '\\')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse_result(detail)
|
13
|
+
summary_line = detail.grep( /\d+\s+error.*,\s+\d+\s+warning.*/ )[0]
|
14
|
+
|
15
|
+
if summary_line.nil?
|
16
|
+
# error
|
17
|
+
error_info = (detail + "\nUnknown Error!").to_a[0].strip
|
18
|
+
return :error, 'Error', error_info
|
19
|
+
end
|
20
|
+
|
21
|
+
if summary_line =~ /([1-9]+)\d*\s+error/
|
22
|
+
num_failures = $1
|
23
|
+
error_info = detail.grep(/\([0-9]+\):([^:]*)Error:/)[0].strip
|
24
|
+
return :failure, num_failures + ' Errors', strip_dir(error_info)
|
25
|
+
end
|
26
|
+
|
27
|
+
if summary_line =~ /([1-9]+)\d*\s+warning/
|
28
|
+
num_failures = $1
|
29
|
+
error_info = detail.grep(/\([0-9]+\)/)[0].strip
|
30
|
+
return :warning, num_failures + ' Warnings', strip_dir(error_info)
|
31
|
+
end
|
32
|
+
|
33
|
+
return :success, 'All files are clean', ''
|
34
|
+
end
|
35
|
+
|
36
|
+
def strip_dir(text)
|
37
|
+
|
38
|
+
# Move to function/class w/ win32 related code
|
39
|
+
if (text[0, @dir.length] == @dir)
|
40
|
+
text = text[(@dir.length + 1)..-1]
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class JavascriptLintRunner
|
2
|
+
|
3
|
+
def initialize(dir, filter)
|
4
|
+
@config = dir + '/jsl.conf'
|
5
|
+
@dir = dir
|
6
|
+
@filter = filter
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
return 'Javascript Lint'
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
return `jsl -conf "#{@config}" -nologo -nofilelisting 2>&1`
|
15
|
+
end
|
16
|
+
|
17
|
+
def is_configured?(all_files)
|
18
|
+
return all_files.include?(@config)
|
19
|
+
end
|
20
|
+
|
21
|
+
def should_run?(modified_files)
|
22
|
+
return !(modified_files.detect { |file| @filter.filter(file) }).nil? || modified_files.include?(@config)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class JsTestDriverConfig
|
2
|
+
|
3
|
+
def initialize(dir, yaml, uri)
|
4
|
+
@config_file = dir + '/jsTestDriver.conf'
|
5
|
+
@yaml = yaml
|
6
|
+
@uri = uri
|
7
|
+
end
|
8
|
+
|
9
|
+
def reload
|
10
|
+
@conf = @yaml.load_file(@config_file)
|
11
|
+
@server = @uri.parse(@conf['server'])
|
12
|
+
end
|
13
|
+
|
14
|
+
def host
|
15
|
+
return @server.host
|
16
|
+
end
|
17
|
+
|
18
|
+
def port
|
19
|
+
return @server.port
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class JsTestDriverParser
|
2
|
+
|
3
|
+
def parse_result(detail)
|
4
|
+
summary_line = detail.grep( /Total \d+ tests/ )[0]
|
5
|
+
|
6
|
+
if summary_line.nil?
|
7
|
+
# error
|
8
|
+
error_info = (detail + "\nUnknown Error!").to_a[0].strip
|
9
|
+
return :error, 'Error', error_info
|
10
|
+
end
|
11
|
+
|
12
|
+
if summary_line =~ /Errors: ([1-9]+)/
|
13
|
+
num_errors = $1
|
14
|
+
error_info = detail.grep(/error \([0-9]+.[0-9]+ ms\)/)[0].strip
|
15
|
+
return :failure, num_errors + ' Errors', error_info
|
16
|
+
end
|
17
|
+
|
18
|
+
if summary_line =~ /Fails: ([1-9]+)/
|
19
|
+
num_failures = $1
|
20
|
+
error_info = detail.grep(/failed \([0-9]+.[0-9]+ ms\)/)[0].strip
|
21
|
+
return :failure, num_failures + ' Failures', error_info
|
22
|
+
end
|
23
|
+
|
24
|
+
return :success, 'All tests pass', ''
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class JsTestDriverRunner
|
2
|
+
|
3
|
+
def initialize(dir, jar, filter, server)
|
4
|
+
@config = dir + '/jsTestDriver.conf'
|
5
|
+
@dir = dir
|
6
|
+
@jar = jar
|
7
|
+
@filter = filter
|
8
|
+
@server = server
|
9
|
+
end
|
10
|
+
|
11
|
+
def name
|
12
|
+
return 'JS Test Driver'
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute
|
16
|
+
@server.start_if_required
|
17
|
+
return `java -jar "#{@jar}" --config "#{@config}" --tests all --verbose 2>&1`
|
18
|
+
end
|
19
|
+
|
20
|
+
def is_configured?(all_files)
|
21
|
+
return all_files.include?(@dir + '/jsTestDriver.conf')
|
22
|
+
end
|
23
|
+
|
24
|
+
def should_run?(modified_files)
|
25
|
+
return !(modified_files.detect { |file| @filter.filter(file) }).nil? || modified_files.include?(@config)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class JsTestDriverServer
|
2
|
+
|
3
|
+
def initialize(config, pinger, process, jar, browser, sleep_time)
|
4
|
+
@config = config
|
5
|
+
@pinger = pinger
|
6
|
+
@process = process
|
7
|
+
@jar = jar
|
8
|
+
@browser = browser
|
9
|
+
@sleep_time = sleep_time
|
10
|
+
end
|
11
|
+
|
12
|
+
def start_if_required
|
13
|
+
@config.reload
|
14
|
+
|
15
|
+
if @config.host == 'localhost' && server_not_running
|
16
|
+
start_server(@config.port)
|
17
|
+
start_and_capture_browser(@config.port)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def server_not_running
|
22
|
+
return !@pinger.is_port_open?('127.0.0.1', @config.port)
|
23
|
+
end
|
24
|
+
|
25
|
+
def start_server(port)
|
26
|
+
command = "java -jar \"#{@jar}\" --port #{port}" #" --browser \"#{@browser}\" "
|
27
|
+
@process.create(command)
|
28
|
+
sleep @sleep_time
|
29
|
+
end
|
30
|
+
|
31
|
+
def start_and_capture_browser(port)
|
32
|
+
capture_url = "http://localhost:#{port}/capture"
|
33
|
+
command = @browser.gsub('%1', capture_url)
|
34
|
+
@process.create(command)
|
35
|
+
sleep @sleep_time
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class JSpecParser
|
2
|
+
|
3
|
+
def parse_result(detail)
|
4
|
+
summary_line = detail.grep( /Passes:/ )[0]
|
5
|
+
|
6
|
+
if summary_line.nil?
|
7
|
+
# error
|
8
|
+
error_info = (detail + "\nUnknown Error!").to_a[0]
|
9
|
+
return :error, 'Error', error_info
|
10
|
+
end
|
11
|
+
|
12
|
+
# remove console colour information and trim start and end white space
|
13
|
+
summary_line = remove_colour(summary_line).strip
|
14
|
+
|
15
|
+
if summary_line =~ /Failures:\s+([1-9]+)\d*/
|
16
|
+
num_failures = $1
|
17
|
+
error_line = detail.grep(/\[31m/)[1] || ''
|
18
|
+
error_info = remove_colour(error_line).strip
|
19
|
+
return :failure, num_failures + ' Failures', error_info
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
return :success, 'All Passed', summary_line
|
24
|
+
end
|
25
|
+
|
26
|
+
def remove_colour(string)
|
27
|
+
return string.gsub(/\e\[[0-9]+m?/, '')
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class JSpecRunner
|
2
|
+
|
3
|
+
def initialize(dir, filter)
|
4
|
+
@config = dir + '/spec/spec.rhino.js'
|
5
|
+
@dir = dir
|
6
|
+
@filter = filter
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
return 'JSpec'
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
return `jspec run --rhino --trace 2>&1`
|
15
|
+
end
|
16
|
+
|
17
|
+
def is_configured?(all_files)
|
18
|
+
return all_files.include?(@config)
|
19
|
+
end
|
20
|
+
|
21
|
+
def should_run?(modified_files)
|
22
|
+
return !(modified_files.detect { |file| @filter.filter(file) }).nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class ListTask
|
2
|
+
|
3
|
+
def initialize(format_string = "%s")
|
4
|
+
@format_string = format_string
|
5
|
+
end
|
6
|
+
|
7
|
+
def run(files)
|
8
|
+
all_files = files[:all]
|
9
|
+
mofified_files = files[:filtered]
|
10
|
+
|
11
|
+
return {
|
12
|
+
:state => :success,
|
13
|
+
:title => 'List',
|
14
|
+
:first => mofified_files.length == 1 ? mofified_files[0] : '%s files.' % mofified_files.length,
|
15
|
+
:detail => get_detail(mofified_files)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_detail(paths)
|
20
|
+
detail = ""
|
21
|
+
limit = [paths.length - 1, 14].min
|
22
|
+
(0..limit).each do |i|
|
23
|
+
path = paths[i]
|
24
|
+
detail += (@format_string % path)
|
25
|
+
detail += "\n"
|
26
|
+
end
|
27
|
+
if limit < paths.length - 1
|
28
|
+
detail += " - Plus #{(paths.length - 1) - limit} more files."
|
29
|
+
end
|
30
|
+
|
31
|
+
return detail
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|