jasmine-headless-webkit 0.7.3.2 → 0.8.0.alpha.1
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/.gitignore +1 -0
- data/Gemfile +6 -0
- data/Rakefile +19 -0
- data/bin/jasmine-headless-webkit +2 -22
- data/jasmine-headless-webkit.gemspec +5 -4
- data/lib/digest/jasmine_test.rb +20 -0
- data/lib/jasmine/headless/cacheable_action.rb +1 -3
- data/lib/jasmine/headless/coffee_template.rb +30 -0
- data/lib/jasmine/headless/command_line.rb +31 -0
- data/lib/jasmine/headless/css_template.rb +14 -0
- data/lib/jasmine/headless/files_list.rb +251 -0
- data/lib/jasmine/headless/js_template.rb +18 -0
- data/lib/jasmine/headless/jst_template.rb +10 -0
- data/lib/jasmine/headless/options.rb +6 -1
- data/lib/jasmine/headless/runner.rb +14 -5
- data/lib/jasmine/headless/task.rb +2 -21
- data/lib/jasmine/headless/unique_asset_list.rb +14 -0
- data/lib/jasmine/headless/version.rb +1 -1
- data/lib/jasmine/headless.rb +11 -0
- data/lib/jasmine-headless-webkit.rb +4 -4
- data/skel/template.html.erb +13 -3
- data/spec/integration/randomization_spec.rb +13 -0
- data/spec/integration/specify_runner_file_spec.rb +22 -0
- data/spec/integration/sprockets_spec.rb +19 -0
- data/spec/jasmine/console_log/console_log.yml +1 -1
- data/spec/jasmine/runner_out_in_jasmine_yml/jasmine.yml +11 -0
- data/spec/jasmine/runner_out_in_jasmine_yml/test.js +2 -0
- data/spec/jasmine/runner_out_in_jasmine_yml/test_spec.coffee +4 -0
- data/spec/jasmine/with_sprockets_includes/assets/application.js.erb +2 -0
- data/spec/jasmine/with_sprockets_includes/assets/things/code.js +6 -0
- data/spec/jasmine/with_sprockets_includes/assets/things/required.js +2 -0
- data/spec/jasmine/with_sprockets_includes/assets/things/subcode/more_code.js +2 -0
- data/spec/jasmine/with_sprockets_includes/assets/things/templates/that.jst.ejs +1 -0
- data/spec/jasmine/with_sprockets_includes/assets/things/templates/this.jst +2 -0
- data/spec/jasmine/with_sprockets_includes/spec/spec_helper.js +1 -0
- data/spec/jasmine/with_sprockets_includes/spec/things/code_spec.js +9 -0
- data/spec/jasmine/with_sprockets_includes/with_sprockets_includes.yml +12 -0
- data/spec/javascripts/console.log_spec.coffee +15 -0
- data/spec/javascripts/support/jasmine.yml +4 -1
- data/spec/lib/jasmine/headless/cacheable_action_spec.rb +6 -3
- data/spec/lib/jasmine/headless/coffee_template_spec.rb +55 -0
- data/spec/lib/jasmine/headless/css_template_spec.rb +25 -0
- data/spec/lib/jasmine/headless/files_list_spec.rb +203 -0
- data/spec/lib/jasmine/headless/js_template_spec.rb +31 -0
- data/spec/lib/jasmine/headless/jst_template_spec.rb +21 -0
- data/spec/lib/jasmine/headless/options_spec.rb +18 -0
- data/spec/lib/jasmine/headless/template_writer_spec.rb +8 -4
- data/spec/lib/jasmine/headless/unique_asset_list_spec.rb +22 -0
- data/spec/lib/jasmine/headless_spec.rb +2 -0
- data/spec/spec_helper.rb +59 -0
- data/vendor/assets/coffeescripts/headless_reporter_result.coffee +10 -7
- data/vendor/assets/coffeescripts/intense.coffee +1 -0
- data/vendor/assets/coffeescripts/jasmine-extensions.coffee +13 -0
- data/vendor/assets/coffeescripts/jasmine.HeadlessConsoleReporter.coffee +34 -2
- data/vendor/assets/coffeescripts/prolog.coffee +1 -1
- data/vendor/assets/javascripts/headless_reporter_result.js +19 -15
- data/vendor/assets/javascripts/intense.js +8 -1
- data/vendor/assets/javascripts/jasmine-extensions.js +29 -1
- data/vendor/assets/javascripts/jasmine.HeadlessConsoleReporter.js +53 -13
- data/vendor/assets/javascripts/prolog.js +6 -4
- metadata +83 -20
- data/lib/jasmine/files_list.rb +0 -176
- data/spec/javascripts/support/jquery-1.6.2.min.js +0 -18
- data/spec/lib/jasmine/files_list_spec.rb +0 -248
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -43,3 +43,22 @@ task :build_runner do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
desc "Generate vendored JS"
|
47
|
+
task :generate_js do
|
48
|
+
require 'sprockets'
|
49
|
+
|
50
|
+
source = 'vendor/assets/coffeescripts'
|
51
|
+
target = 'vendor/assets/javascripts'
|
52
|
+
|
53
|
+
env = Sprockets::Environment.new { |s| s.append_path 'vendor/assets/coffeescripts' }
|
54
|
+
|
55
|
+
Dir[File.join(File.expand_path(source), '*.coffee')].each do |file|
|
56
|
+
file_target = file.gsub(source, target).gsub('.coffee', '.js')
|
57
|
+
puts "#{file} => #{file_target}"
|
58
|
+
|
59
|
+
File.open(file_target, 'wb') do |fh|
|
60
|
+
fh.print env.find_asset(File.expand_path(file)).to_s
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/bin/jasmine-headless-webkit
CHANGED
@@ -1,31 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
-
require 'rainbow'
|
5
4
|
|
6
|
-
|
7
|
-
File.expand_path('../..', __FILE__)
|
8
|
-
end
|
5
|
+
$: << File.expand_path('../../lib', __FILE__)
|
9
6
|
|
10
|
-
$:.unshift(File.join(gem_dir, 'lib'))
|
11
7
|
require 'jasmine-headless-webkit'
|
12
8
|
require 'coffee-script'
|
13
9
|
|
14
|
-
|
15
|
-
options = Jasmine::Headless::Options.from_command_line
|
16
|
-
runner = Jasmine::Headless::Runner.new(options)
|
17
|
-
|
18
|
-
if options[:do_list]
|
19
|
-
files_list = Jasmine::FilesList.new(:config => runner.jasmine_config)
|
20
|
-
files_list.files.each { |file| puts file }
|
21
|
-
else
|
22
|
-
exit runner.run
|
23
|
-
end
|
24
|
-
rescue CoffeeScript::CompilationError
|
25
|
-
exit 1
|
26
|
-
rescue StandardError => e
|
27
|
-
$stderr.puts "[%s] %s (%s)" % [ "jasmine-headless-webkit".color(:red), e.message.color(:white), e.class.name.color(:yellow) ]
|
28
|
-
$stderr.puts e.backtrace.collect { |line| " #{line}" }.join("\n")
|
29
|
-
exit 1
|
30
|
-
end
|
10
|
+
Jasmine::Headless::CommandLine.run!
|
31
11
|
|
@@ -20,8 +20,9 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
21
|
s.require_paths = ["lib"]
|
22
22
|
|
23
|
-
s.
|
24
|
-
s.
|
25
|
-
s.
|
26
|
-
s.
|
23
|
+
s.add_runtime_dependency 'jasmine-core', '~> 1.1'
|
24
|
+
s.add_runtime_dependency 'coffee-script'
|
25
|
+
s.add_runtime_dependency 'rainbow'
|
26
|
+
s.add_runtime_dependency 'multi_json'
|
27
|
+
s.add_runtime_dependency 'sprockets', '~> 2'
|
27
28
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'digest/sha1'
|
2
|
-
|
3
1
|
module Jasmine::Headless
|
4
2
|
class CacheableAction
|
5
3
|
class << self
|
@@ -56,7 +54,7 @@ module Jasmine::Headless
|
|
56
54
|
end
|
57
55
|
|
58
56
|
def cache_file
|
59
|
-
@cache_file ||= File.join(self.class.cache_dir, self.class.cache_type,
|
57
|
+
@cache_file ||= File.expand_path(File.join(self.class.cache_dir, self.class.cache_type, file)) + '.js'
|
60
58
|
end
|
61
59
|
|
62
60
|
def fresh?
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'tilt/template'
|
2
|
+
require 'rainbow'
|
3
|
+
|
4
|
+
module Jasmine::Headless
|
5
|
+
class CoffeeTemplate < Tilt::Template
|
6
|
+
self.default_mime_type = 'application/javascript'
|
7
|
+
|
8
|
+
def prepare ; end
|
9
|
+
|
10
|
+
def evaluate(scope, locals, &block)
|
11
|
+
begin
|
12
|
+
cache = Jasmine::Headless::CoffeeScriptCache.new(file)
|
13
|
+
source = cache.handle
|
14
|
+
if cache.cached?
|
15
|
+
%{<script type="text/javascript" src="#{cache.cache_file}"></script>
|
16
|
+
<script type="text/javascript">window.CSTF['#{File.split(cache.cache_file).last}'] = '#{file}';</script>}
|
17
|
+
else
|
18
|
+
%{<script type="text/javascript">#{source}</script>}
|
19
|
+
end
|
20
|
+
rescue CoffeeScript::CompilationError => ne
|
21
|
+
puts "[%s] %s: %s" % [ 'coffeescript'.color(:red), file.color(:yellow), "#{ne.message}".color(:white) ]
|
22
|
+
raise ne
|
23
|
+
rescue StandardError => e
|
24
|
+
puts "[%s] Error in compiling file: %s" % [ 'coffeescript'.color(:red), file.color(:yellow) ]
|
25
|
+
raise e
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Jasmine::Headless
|
2
|
+
class CommandLine
|
3
|
+
class << self
|
4
|
+
def run!
|
5
|
+
require 'coffee-script'
|
6
|
+
require 'rainbow'
|
7
|
+
|
8
|
+
begin
|
9
|
+
options = Options.from_command_line
|
10
|
+
runner = Runner.new(options)
|
11
|
+
|
12
|
+
if options[:do_list]
|
13
|
+
FilesList.reset!
|
14
|
+
|
15
|
+
files_list = FilesList.new(:config => runner.jasmine_config)
|
16
|
+
files_list.files.each { |file| puts file }
|
17
|
+
else
|
18
|
+
exit runner.run
|
19
|
+
end
|
20
|
+
rescue CoffeeScript::CompilationError
|
21
|
+
exit 1
|
22
|
+
rescue StandardError => e
|
23
|
+
$stderr.puts "[%s] %s (%s)" % [ "jasmine-headless-webkit".color(:red), e.message.color(:white), e.class.name.color(:yellow) ]
|
24
|
+
$stderr.puts e.backtrace.collect { |line| " #{line}" }.join("\n")
|
25
|
+
exit 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'tilt/template'
|
2
|
+
|
3
|
+
module Jasmine::Headless
|
4
|
+
class CSSTemplate < Tilt::Template
|
5
|
+
self.default_mime_type = 'text/css'
|
6
|
+
|
7
|
+
def prepare ; end
|
8
|
+
|
9
|
+
def evaluate(scope, locals, &block)
|
10
|
+
file ? %{<link rel="stylesheet" href="#{file}" type="text/css" />} : data
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,251 @@
|
|
1
|
+
require 'jasmine-core'
|
2
|
+
require 'time'
|
3
|
+
require 'multi_json'
|
4
|
+
require 'set'
|
5
|
+
require 'sprockets'
|
6
|
+
require 'sprockets/engines'
|
7
|
+
|
8
|
+
module Jasmine::Headless
|
9
|
+
class FilesList
|
10
|
+
class << self
|
11
|
+
def vendor_asset_paths
|
12
|
+
return @vendor_asset_paths if @vendor_asset_paths
|
13
|
+
|
14
|
+
require 'rubygems'
|
15
|
+
|
16
|
+
raise StandardError.new("A newer version of Rubygems is required to use vendored assets. Please upgrade.") if !Gem::Specification.respond_to?(:each)
|
17
|
+
|
18
|
+
@vendor_asset_paths = []
|
19
|
+
|
20
|
+
Gem::Specification.each do |spec|
|
21
|
+
path = File.join(spec.gem_dir, 'vendor/assets/javascripts')
|
22
|
+
|
23
|
+
@vendor_asset_paths << path if File.directory?(path)
|
24
|
+
end
|
25
|
+
|
26
|
+
@vendor_asset_paths
|
27
|
+
end
|
28
|
+
|
29
|
+
def reset!
|
30
|
+
@vendor_asset_paths = nil
|
31
|
+
|
32
|
+
# register haml-sprockets if it's available...
|
33
|
+
%w{haml-sprockets}.each do |library|
|
34
|
+
begin
|
35
|
+
require library
|
36
|
+
rescue LoadError
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# ...and unregister ones we don't want/need
|
41
|
+
Sprockets.instance_eval do
|
42
|
+
%w{less sass scss erb str}.each do |extension|
|
43
|
+
@engines.delete(".#{extension}")
|
44
|
+
end
|
45
|
+
|
46
|
+
register_engine '.coffee', Jasmine::Headless::CoffeeTemplate
|
47
|
+
register_engine '.js', Jasmine::Headless::JSTemplate
|
48
|
+
register_engine '.css', Jasmine::Headless::CSSTemplate
|
49
|
+
register_engine '.jst', Jasmine::Headless::JSTTemplate
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def default_files
|
54
|
+
%w{jasmine.js jasmine-html jasmine.css jasmine-extensions intense headless_reporter_result jasmine.HeadlessConsoleReporter jsDump beautify-html}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
PLEASE_WAIT_IM_WORKING_TIME = 2
|
59
|
+
|
60
|
+
attr_reader :required_files, :potential_files_to_filter
|
61
|
+
|
62
|
+
def initialize(options = {})
|
63
|
+
@options = options
|
64
|
+
|
65
|
+
Kernel.srand(@options[:seed]) if @options[:seed]
|
66
|
+
|
67
|
+
@required_files = UniqueAssetList.new
|
68
|
+
@potential_files_to_filter = []
|
69
|
+
|
70
|
+
self.class.default_files.each do |file|
|
71
|
+
@required_files << sprockets_environment.find_asset(file, :bundle => false)
|
72
|
+
end
|
73
|
+
|
74
|
+
use_config! if config?
|
75
|
+
end
|
76
|
+
|
77
|
+
def files
|
78
|
+
required_files.flatten.collect { |asset| asset.pathname.to_s }.uniq
|
79
|
+
end
|
80
|
+
|
81
|
+
def spec_files
|
82
|
+
filter_for_requested_specs(
|
83
|
+
files.find_all { |file| spec_dir.any? { |dir| file[dir] } }
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
def filtered_files
|
88
|
+
filter_for_requested_specs(files)
|
89
|
+
end
|
90
|
+
|
91
|
+
def search_paths
|
92
|
+
return @search_paths if @search_paths
|
93
|
+
|
94
|
+
@search_paths = [ Jasmine::Core.path ]
|
95
|
+
@search_paths += self.class.vendor_asset_paths
|
96
|
+
@search_paths += src_dir.collect { |dir| File.expand_path(dir) }
|
97
|
+
@search_paths += spec_dir.collect { |dir| File.expand_path(dir) }
|
98
|
+
|
99
|
+
@search_paths
|
100
|
+
end
|
101
|
+
|
102
|
+
def sprockets_environment
|
103
|
+
return @sprockets_environment if @sprockets_environment
|
104
|
+
|
105
|
+
@sprockets_environment = Sprockets::Environment.new
|
106
|
+
search_paths.each { |path| @sprockets_environment.append_path(path) }
|
107
|
+
|
108
|
+
@sprockets_environment.unregister_postprocessor('application/javascript', Sprockets::SafetyColons)
|
109
|
+
@sprockets_environment
|
110
|
+
end
|
111
|
+
|
112
|
+
def has_spec_outside_scope?
|
113
|
+
if is_outside_scope = !spec_filter.empty?
|
114
|
+
is_outside_scope = spec_dir.any? do |dir|
|
115
|
+
spec_file_searches.any? do |search|
|
116
|
+
!spec_files.any? { |file| File.fnmatch?(File.join(dir, search), file) }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
is_outside_scope
|
122
|
+
end
|
123
|
+
|
124
|
+
def filtered?
|
125
|
+
files != filtered_files
|
126
|
+
end
|
127
|
+
|
128
|
+
def files_to_html
|
129
|
+
to_html(files)
|
130
|
+
end
|
131
|
+
|
132
|
+
def filtered_files_to_html
|
133
|
+
to_html(filtered_files)
|
134
|
+
end
|
135
|
+
|
136
|
+
def spec_file_line_numbers
|
137
|
+
@spec_file_line_numbers ||= Hash[spec_files.collect { |file|
|
138
|
+
if File.exist?(file)
|
139
|
+
if !(lines = Jasmine::Headless::SpecFileAnalyzer.for(file)).empty?
|
140
|
+
[ file, lines ]
|
141
|
+
end
|
142
|
+
else
|
143
|
+
nil
|
144
|
+
end
|
145
|
+
}.compact]
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
def to_html(files)
|
150
|
+
alert_time = Time.now + PLEASE_WAIT_IM_WORKING_TIME
|
151
|
+
|
152
|
+
files.collect do |file|
|
153
|
+
if alert_time && alert_time < Time.now
|
154
|
+
puts "Rebuilding cache, please wait..."
|
155
|
+
alert_time = nil
|
156
|
+
end
|
157
|
+
|
158
|
+
sprockets_environment.find_asset(file, :bundle => false).body
|
159
|
+
end.compact.reject(&:empty?)
|
160
|
+
end
|
161
|
+
|
162
|
+
def spec_filter
|
163
|
+
@spec_filter ||= (@options[:only] && @options[:only].collect { |path| expanded_dir(path) }.flatten) || []
|
164
|
+
end
|
165
|
+
|
166
|
+
SEARCH_ROOTS = {
|
167
|
+
'src_files' => 'src_dir',
|
168
|
+
'stylesheets' => 'src_dir',
|
169
|
+
'helpers' => 'spec_dir',
|
170
|
+
'spec_files' => 'spec_dir'
|
171
|
+
}
|
172
|
+
|
173
|
+
def use_config!
|
174
|
+
@config = @options[:config].dup
|
175
|
+
@searches = {}
|
176
|
+
@potential_files_to_filter = []
|
177
|
+
|
178
|
+
%w{src_files stylesheets helpers spec_files}.each do |type|
|
179
|
+
if data = @config[type]
|
180
|
+
add_files(@searches[type] = data.flatten, type, send(SEARCH_ROOTS[type]))
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def add_files(patterns, type, dirs)
|
186
|
+
dirs.product(patterns).each do |search|
|
187
|
+
files = Dir[File.join(*search)].find_all { |file| file[extension_filter] }
|
188
|
+
|
189
|
+
files.sort! { |a, b| Kernel.rand(3) - 1 } if type == 'spec_files'
|
190
|
+
|
191
|
+
files.each do |path|
|
192
|
+
add_path(path, type) if File.file?(path)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
if type == 'spec_files'
|
197
|
+
spec_filter.each { |path| add_path(path, type) }
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def config?
|
202
|
+
@options[:config]
|
203
|
+
end
|
204
|
+
|
205
|
+
def expanded_dir(path)
|
206
|
+
Dir[path].find_all { |file| file[extension_filter] }.collect { |file| File.expand_path(file) }.find_all { |path| File.file?(path) }
|
207
|
+
end
|
208
|
+
|
209
|
+
def extension_filter
|
210
|
+
%r{(#{(%w{.js .css} + Sprockets.engine_extensions).join('|')})$}
|
211
|
+
end
|
212
|
+
|
213
|
+
def add_path(path, type)
|
214
|
+
asset = sprockets_environment.find_asset(path)
|
215
|
+
|
216
|
+
@required_files << asset
|
217
|
+
|
218
|
+
if type == 'spec_files'
|
219
|
+
@potential_files_to_filter << path
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def src_dir
|
224
|
+
@src_dir ||= config_dir_or_pwd('src_dir')
|
225
|
+
end
|
226
|
+
|
227
|
+
def spec_dir
|
228
|
+
@spec_dir ||= config_dir_or_pwd('spec_dir')
|
229
|
+
end
|
230
|
+
|
231
|
+
def spec_file_searches
|
232
|
+
@searches['spec_files']
|
233
|
+
end
|
234
|
+
|
235
|
+
def config_dir_or_pwd(dir)
|
236
|
+
found_dir = (@options[:config] && @options[:config][dir]) || Dir.pwd
|
237
|
+
|
238
|
+
[ found_dir ].flatten.collect { |dir| File.expand_path(dir) }
|
239
|
+
end
|
240
|
+
|
241
|
+
def filter_for_requested_specs(files)
|
242
|
+
files.find_all do |file|
|
243
|
+
if potential_files_to_filter.include?(file)
|
244
|
+
spec_filter.empty? || spec_filter.any? { |pattern| File.fnmatch?(pattern, file) }
|
245
|
+
else
|
246
|
+
true
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'tilt/template'
|
2
|
+
|
3
|
+
module Jasmine::Headless
|
4
|
+
class JSTemplate < Tilt::Template
|
5
|
+
self.default_mime_type = 'application/javascript'
|
6
|
+
|
7
|
+
def prepare ; end
|
8
|
+
|
9
|
+
def evaluate(scope, locals, &block)
|
10
|
+
if data[%r{^<script type="text/javascript"}]
|
11
|
+
data
|
12
|
+
else
|
13
|
+
file ? %{<script type="text/javascript" src="#{file}"></script>} : data
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -32,6 +32,8 @@ module Jasmine
|
|
32
32
|
|
33
33
|
def initialize(opts = {})
|
34
34
|
@options = DEFAULT_OPTIONS.dup
|
35
|
+
srand
|
36
|
+
@options[:seed] = rand(10000)
|
35
37
|
read_defaults_files
|
36
38
|
opts.each { |k, v| @options[k] = v if v }
|
37
39
|
end
|
@@ -60,6 +62,8 @@ module Jasmine
|
|
60
62
|
@options[:full_run] = false
|
61
63
|
when '--list', '-l'
|
62
64
|
@options[:do_list] = true
|
65
|
+
when '--seed'
|
66
|
+
@options[:seed] = arg.to_i
|
63
67
|
end
|
64
68
|
end
|
65
69
|
|
@@ -82,7 +86,8 @@ module Jasmine
|
|
82
86
|
[ '--report', GetoptLong::REQUIRED_ARGUMENT ],
|
83
87
|
[ '--jasmine-config', '-j', GetoptLong::REQUIRED_ARGUMENT ],
|
84
88
|
[ '--no-full-run', GetoptLong::NO_ARGUMENT ],
|
85
|
-
[ '--list', '-l', GetoptLong::NO_ARGUMENT ]
|
89
|
+
[ '--list', '-l', GetoptLong::NO_ARGUMENT ],
|
90
|
+
[ '--seed', GetoptLong::REQUIRED_ARGUMENT ]
|
86
91
|
)
|
87
92
|
|
88
93
|
command_line_args.each { |*args| process_option(*args) }
|
@@ -4,6 +4,8 @@ require 'coffee-script'
|
|
4
4
|
require 'rainbow'
|
5
5
|
|
6
6
|
require 'yaml'
|
7
|
+
require 'sprockets'
|
8
|
+
|
7
9
|
|
8
10
|
module Jasmine
|
9
11
|
module Headless
|
@@ -23,9 +25,11 @@ module Jasmine
|
|
23
25
|
|
24
26
|
attr_reader :options
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
28
|
+
class << self
|
29
|
+
def run(options = {})
|
30
|
+
options = Options.new(options) if !options.kind_of?(Options)
|
31
|
+
new(options).run
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
def initialize(options)
|
@@ -65,10 +69,12 @@ module Jasmine
|
|
65
69
|
|
66
70
|
def run
|
67
71
|
Jasmine::Headless::CacheableAction.enabled = @options[:enable_cache]
|
72
|
+
FilesList.reset!
|
68
73
|
|
69
|
-
files_list = Jasmine::FilesList.new(
|
74
|
+
files_list = Jasmine::Headless::FilesList.new(
|
70
75
|
:config => jasmine_config,
|
71
|
-
:only => @options[:files]
|
76
|
+
:only => @options[:files],
|
77
|
+
:seed => @options[:seed]
|
72
78
|
)
|
73
79
|
|
74
80
|
@_targets = template_writer.write!(files_list)
|
@@ -76,6 +82,9 @@ module Jasmine
|
|
76
82
|
run_targets.pop if (!@options[:full_run] && files_list.filtered?) || files_list.has_spec_outside_scope?
|
77
83
|
|
78
84
|
system jasmine_command(run_targets)
|
85
|
+
|
86
|
+
puts "\nTest ordering seed: --seed #{@options[:seed]}"
|
87
|
+
|
79
88
|
@_status = $?.exitstatus
|
80
89
|
ensure
|
81
90
|
if @_targets && !runner_filename && (@options[:remove_html_file] || (@_status == 0))
|
@@ -1,23 +1,3 @@
|
|
1
|
-
module Digest
|
2
|
-
class JasmineTest
|
3
|
-
def self.file(file)
|
4
|
-
new
|
5
|
-
end
|
6
|
-
|
7
|
-
def file(file)
|
8
|
-
self
|
9
|
-
end
|
10
|
-
|
11
|
-
def hexdigest
|
12
|
-
'test'
|
13
|
-
end
|
14
|
-
|
15
|
-
def update(prefix)
|
16
|
-
self
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
1
|
module Jasmine
|
22
2
|
module Headless
|
23
3
|
class Task
|
@@ -41,8 +21,9 @@ module Jasmine
|
|
41
21
|
private
|
42
22
|
def create_rails_compliant_task
|
43
23
|
if Rails.respond_to?(:version) && Rails.version >= "3.1.0"
|
44
|
-
desc 'Force generate static assets without an MD5 hash, all assets end with -test.<ext>'
|
45
24
|
task 'assets:precompile:for_testing' => :environment do
|
25
|
+
$stderr.puts "This task is deprecated and will be removed after 2012-01-01"
|
26
|
+
|
46
27
|
Rails.application.assets.digest_class = Digest::JasmineTest
|
47
28
|
|
48
29
|
Rake::Task['assets:precompile'].invoke
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Jasmine::Headless
|
2
|
+
class UniqueAssetList < ::Array
|
3
|
+
def <<(asset)
|
4
|
+
raise StandardError.new("Not an asset") if !asset.respond_to?(:logical_path)
|
5
|
+
|
6
|
+
super if !self.any? { |other| asset.logical_path == other.logical_path }
|
7
|
+
end
|
8
|
+
|
9
|
+
def flatten
|
10
|
+
self.collect(&:to_a).flatten
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
data/lib/jasmine/headless.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
|
3
3
|
module Jasmine::Headless
|
4
|
+
autoload :CommandLine, 'jasmine/headless/command_line'
|
5
|
+
|
4
6
|
autoload :CoffeeScriptCache, 'jasmine/headless/coffee_script_cache'
|
5
7
|
autoload :SpecFileAnalyzer, 'jasmine/headless/spec_file_analyzer'
|
6
8
|
autoload :CacheableAction, 'jasmine/headless/cacheable_action'
|
@@ -9,8 +11,16 @@ module Jasmine::Headless
|
|
9
11
|
autoload :Options, 'jasmine/headless/options'
|
10
12
|
autoload :Task, 'jasmine/headless/task'
|
11
13
|
|
14
|
+
autoload :FilesList, 'jasmine/headless/files_list'
|
15
|
+
autoload :UniqueAssetList, 'jasmine/headless/unique_asset_list'
|
16
|
+
|
12
17
|
autoload :TemplateWriter, 'jasmine/headless/template_writer'
|
13
18
|
|
19
|
+
autoload :CoffeeTemplate, 'jasmine/headless/coffee_template'
|
20
|
+
autoload :JSTemplate, 'jasmine/headless/js_template'
|
21
|
+
autoload :JSTTemplate, 'jasmine/headless/jst_template'
|
22
|
+
autoload :CSSTemplate, 'jasmine/headless/css_template'
|
23
|
+
|
14
24
|
autoload :Report, 'jasmine/headless/report'
|
15
25
|
autoload :ReportMessage, 'jasmine/headless/report_message'
|
16
26
|
|
@@ -22,3 +32,4 @@ module Jasmine::Headless
|
|
22
32
|
end
|
23
33
|
|
24
34
|
require 'jasmine/headless/errors'
|
35
|
+
|