jasmine-headless-webkit-firstbanco 0.9.0.rc.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +89 -0
  5. data/Gemfile +30 -0
  6. data/Guardfile +41 -0
  7. data/README.md +44 -0
  8. data/Rakefile +65 -0
  9. data/bin/jasmine-headless-webkit +11 -0
  10. data/config/cucumber.yml +2 -0
  11. data/ext/jasmine-webkit-specrunner/Info.plist +22 -0
  12. data/ext/jasmine-webkit-specrunner/Makefile.dummy +5 -0
  13. data/ext/jasmine-webkit-specrunner/Page.cpp +15 -0
  14. data/ext/jasmine-webkit-specrunner/Page.h +20 -0
  15. data/ext/jasmine-webkit-specrunner/Runner.cpp +208 -0
  16. data/ext/jasmine-webkit-specrunner/Runner.h +73 -0
  17. data/ext/jasmine-webkit-specrunner/common.pri +8 -0
  18. data/ext/jasmine-webkit-specrunner/extconf.rb +10 -0
  19. data/ext/jasmine-webkit-specrunner/specrunner.cpp +79 -0
  20. data/ext/jasmine-webkit-specrunner/specrunner.pro +5 -0
  21. data/features/bin/failure.feature +7 -0
  22. data/features/bin/files.feature +7 -0
  23. data/features/bin/filtered_run/both_runs.feature +18 -0
  24. data/features/bin/filtered_run/no_full_run.feature +14 -0
  25. data/features/bin/help.feature +7 -0
  26. data/features/bin/quiet_messages.feature +8 -0
  27. data/features/bin/runner_out.feature +8 -0
  28. data/features/bin/spec_files_with_same_basename.feature +7 -0
  29. data/features/bin/success.feature +20 -0
  30. data/features/bin/success_with_js_error.feature +5 -0
  31. data/features/bin/tries_to_leave_page.feature +7 -0
  32. data/features/bin/try_to_click_a_button.feature +7 -0
  33. data/features/bin/two_files_from_src_files.feature +11 -0
  34. data/features/bin/with_coffeescript_error.feature +7 -0
  35. data/features/bin/with_console_log.feature +7 -0
  36. data/features/bin/with_server.feature +7 -0
  37. data/features/bin/with_window_prompt.feature +7 -0
  38. data/features/reporters.feature +24 -0
  39. data/features/runner.feature +34 -0
  40. data/features/steps/given/i_have_test_suite.rb +2 -0
  41. data/features/steps/given/no_existing_file.rb +4 -0
  42. data/features/steps/given/options/i_have_defaults.rb +4 -0
  43. data/features/steps/given/options/i_have_reporters.rb +10 -0
  44. data/features/steps/given/options/i_have_runner_options.rb +3 -0
  45. data/features/steps/then/bin/exit_status_should_be.rb +3 -0
  46. data/features/steps/then/bin/file_should_contain_runner.rb +4 -0
  47. data/features/steps/then/bin/following_files_loaded_in_order.rb +10 -0
  48. data/features/steps/then/bin/i_should_get_help_output.rb +4 -0
  49. data/features/steps/then/bin/output_should_include.rb +3 -0
  50. data/features/steps/then/bin/output_should_not_include.rb +4 -0
  51. data/features/steps/then/reporting/report_does_not_exist.rb +4 -0
  52. data/features/steps/then/reporting/report_should_exist.rb +3 -0
  53. data/features/steps/then/reporting/report_should_have.rb +7 -0
  54. data/features/steps/then/reporting/report_should_have_seed.rb +4 -0
  55. data/features/steps/then/runner/it_should_have_exit_status.rb +3 -0
  56. data/features/steps/then/runner/it_should_include_report_file.rb +4 -0
  57. data/features/steps/then/runner/it_should_not_include_report_file.rb +3 -0
  58. data/features/steps/then/templates/it_should_use_reporter.rb +6 -0
  59. data/features/steps/when/i_delete_file.rb +3 -0
  60. data/features/steps/when/i_get_runner.rb +4 -0
  61. data/features/steps/when/i_get_template_writer.rb +4 -0
  62. data/features/steps/when/i_run_executable.rb +4 -0
  63. data/features/steps/when/i_run_runner.rb +4 -0
  64. data/features/support/env.rb +7 -0
  65. data/jasmine-headless-webkit-firstbanco.gemspec +30 -0
  66. data/lib/autotest/discover.rb +1 -0
  67. data/lib/autotest/jasmine.rb +7 -0
  68. data/lib/autotest/jasmine_mixin.rb +111 -0
  69. data/lib/autotest/jasmine_rspec2.rb +7 -0
  70. data/lib/jasmine-headless-webkit.rb +3 -0
  71. data/lib/jasmine/headless.rb +61 -0
  72. data/lib/jasmine/headless/cacheable_action.rb +85 -0
  73. data/lib/jasmine/headless/coffee_script_cache.rb +20 -0
  74. data/lib/jasmine/headless/coffee_template.rb +36 -0
  75. data/lib/jasmine/headless/command_line.rb +31 -0
  76. data/lib/jasmine/headless/css_template.rb +19 -0
  77. data/lib/jasmine/headless/errors.rb +16 -0
  78. data/lib/jasmine/headless/file_checker.rb +25 -0
  79. data/lib/jasmine/headless/files_list.rb +332 -0
  80. data/lib/jasmine/headless/js_template.rb +23 -0
  81. data/lib/jasmine/headless/jst_template.rb +15 -0
  82. data/lib/jasmine/headless/nil_template.rb +14 -0
  83. data/lib/jasmine/headless/options.rb +206 -0
  84. data/lib/jasmine/headless/railtie.rb +12 -0
  85. data/lib/jasmine/headless/report.rb +81 -0
  86. data/lib/jasmine/headless/report_message.rb +12 -0
  87. data/lib/jasmine/headless/report_message/console.rb +18 -0
  88. data/lib/jasmine/headless/report_message/error.rb +20 -0
  89. data/lib/jasmine/headless/report_message/fail.rb +5 -0
  90. data/lib/jasmine/headless/report_message/pass.rb +5 -0
  91. data/lib/jasmine/headless/report_message/seed.rb +14 -0
  92. data/lib/jasmine/headless/report_message/spec.rb +28 -0
  93. data/lib/jasmine/headless/report_message/total.rb +31 -0
  94. data/lib/jasmine/headless/runner.rb +264 -0
  95. data/lib/jasmine/headless/spec_file_analyzer.rb +44 -0
  96. data/lib/jasmine/headless/task.rb +39 -0
  97. data/lib/jasmine/headless/template_writer.rb +65 -0
  98. data/lib/jasmine/headless/unique_asset_list.rb +16 -0
  99. data/lib/jasmine/headless/version.rb +5 -0
  100. data/lib/qt/qmake.rb +155 -0
  101. data/script/gemfile +11 -0
  102. data/script/hooks/post-commit +4 -0
  103. data/script/hooks/pre-commit +15 -0
  104. data/script/initialize-environment +35 -0
  105. data/script/install-git-hooks +6 -0
  106. data/skel/template.html.erb +77 -0
  107. data/spec/files/UTF-8-test.txt +0 -0
  108. data/spec/integration/randomization_spec.rb +13 -0
  109. data/spec/integration/specify_runner_file_spec.rb +22 -0
  110. data/spec/integration/sprockets_spec.rb +23 -0
  111. data/spec/jasmine/click_button/click_button.js +5 -0
  112. data/spec/jasmine/click_button/click_button.yml +12 -0
  113. data/spec/jasmine/click_button/click_button_spec.js +11 -0
  114. data/spec/jasmine/coffeescript_error/coffeescript_error.yml +10 -0
  115. data/spec/jasmine/coffeescript_error/spec.coffee +2 -0
  116. data/spec/jasmine/coffeescript_error/src.coffee +2 -0
  117. data/spec/jasmine/console_log/console_log.js +1 -0
  118. data/spec/jasmine/console_log/console_log.yml +10 -0
  119. data/spec/jasmine/console_log/console_log_spec.js +7 -0
  120. data/spec/jasmine/failure/failure.js +1 -0
  121. data/spec/jasmine/failure/failure.yml +9 -0
  122. data/spec/jasmine/failure/failure_spec.js +6 -0
  123. data/spec/jasmine/filtered_failure/failure_spec.js +6 -0
  124. data/spec/jasmine/filtered_failure/filtered_failure.yml +10 -0
  125. data/spec/jasmine/filtered_failure/src.js +0 -0
  126. data/spec/jasmine/filtered_failure/success_spec.js +6 -0
  127. data/spec/jasmine/filtered_success/filtered_success.yml +10 -0
  128. data/spec/jasmine/filtered_success/src.js +0 -0
  129. data/spec/jasmine/filtered_success/success_one_spec.js +6 -0
  130. data/spec/jasmine/filtered_success/success_other_file.js +7 -0
  131. data/spec/jasmine/filtered_success/success_two_spec.js +6 -0
  132. data/spec/jasmine/filtered_success_with_console/filtered_success.yml +10 -0
  133. data/spec/jasmine/filtered_success_with_console/src.js +0 -0
  134. data/spec/jasmine/filtered_success_with_console/success_one_spec.js +7 -0
  135. data/spec/jasmine/filtered_success_with_console/success_two_spec.js +6 -0
  136. data/spec/jasmine/leave_page/leave_page.js +4 -0
  137. data/spec/jasmine/leave_page/leave_page.yml +9 -0
  138. data/spec/jasmine/leave_page/leave_page_spec.js +11 -0
  139. data/spec/jasmine/noisy/file.js.erb +0 -0
  140. data/spec/jasmine/noisy/noisy.yml +8 -0
  141. data/spec/jasmine/noisy/other_file.js +2 -0
  142. data/spec/jasmine/runner_out_in_jasmine_yml/jasmine.yml +11 -0
  143. data/spec/jasmine/runner_out_in_jasmine_yml/test.js +2 -0
  144. data/spec/jasmine/runner_out_in_jasmine_yml/test_spec.coffee +4 -0
  145. data/spec/jasmine/success/success.js +1 -0
  146. data/spec/jasmine/success/success.yml +9 -0
  147. data/spec/jasmine/success/success_spec.js +6 -0
  148. data/spec/jasmine/success_with_error/success_with_error.js +3 -0
  149. data/spec/jasmine/success_with_error/success_with_error.yml +9 -0
  150. data/spec/jasmine/success_with_error/success_with_error_spec.js +6 -0
  151. data/spec/jasmine/two_files_from_src_files/app/app-file.js +0 -0
  152. data/spec/jasmine/two_files_from_src_files/app/app.js +2 -0
  153. data/spec/jasmine/two_files_from_src_files/jasmine.yml +7 -0
  154. data/spec/jasmine/two_files_from_src_files/vendor/vendor-file.js +0 -0
  155. data/spec/jasmine/two_files_from_src_files/vendor/vendor.js +2 -0
  156. data/spec/jasmine/two_spec_files_same_basename/jasmine.yml +6 -0
  157. data/spec/jasmine/two_spec_files_same_basename/spec.coffee +4 -0
  158. data/spec/jasmine/two_spec_files_same_basename/spec.js +6 -0
  159. data/spec/jasmine/window_prompt/source.js +2 -0
  160. data/spec/jasmine/window_prompt/window_prompt.yml +4 -0
  161. data/spec/jasmine/with_sprockets_includes/assets/application.js.erb +2 -0
  162. data/spec/jasmine/with_sprockets_includes/assets/things/code.js +6 -0
  163. data/spec/jasmine/with_sprockets_includes/assets/things/jquery.string.js +0 -0
  164. data/spec/jasmine/with_sprockets_includes/assets/things/required.js +3 -0
  165. data/spec/jasmine/with_sprockets_includes/assets/things/subcode/more_code.js +2 -0
  166. data/spec/jasmine/with_sprockets_includes/assets/things/templates/that.jst.ejs +1 -0
  167. data/spec/jasmine/with_sprockets_includes/assets/things/templates/this.jst +2 -0
  168. data/spec/jasmine/with_sprockets_includes/spec/spec_helper.js +1 -0
  169. data/spec/jasmine/with_sprockets_includes/spec/things/code_spec.js +9 -0
  170. data/spec/jasmine/with_sprockets_includes/with_sprockets_includes.yml +12 -0
  171. data/spec/javascripts/console.log_spec.coffee +15 -0
  172. data/spec/javascripts/headless_reporter_result_spec.coffee +30 -0
  173. data/spec/javascripts/helpers/spec_helper.coffee +2 -0
  174. data/spec/javascripts/jasmine-extensions_spec.coffee +80 -0
  175. data/spec/javascripts/jasmine.HeadlessReporter.ConsoleBase_spec.coffee +35 -0
  176. data/spec/javascripts/jasmine.HeadlessReporter.Console_spec.coffee +3 -0
  177. data/spec/javascripts/jasmine.HeadlessReporter.Tap_spec.coffee +19 -0
  178. data/spec/javascripts/jasmine.HeadlessReporter_spec.coffee +27 -0
  179. data/spec/javascripts/support/jasmine.yml +9 -0
  180. data/spec/lib/jasmine/headless/cacheable_action_spec.rb +122 -0
  181. data/spec/lib/jasmine/headless/coffee_script_cache_spec.rb +21 -0
  182. data/spec/lib/jasmine/headless/coffee_template_spec.rb +55 -0
  183. data/spec/lib/jasmine/headless/css_template_spec.rb +25 -0
  184. data/spec/lib/jasmine/headless/file_checker_spec.rb +41 -0
  185. data/spec/lib/jasmine/headless/files_list_spec.rb +194 -0
  186. data/spec/lib/jasmine/headless/js_template_spec.rb +31 -0
  187. data/spec/lib/jasmine/headless/jst_template_spec.rb +21 -0
  188. data/spec/lib/jasmine/headless/nil_template_spec.rb +31 -0
  189. data/spec/lib/jasmine/headless/options_spec.rb +194 -0
  190. data/spec/lib/jasmine/headless/report_message/seed_spec.rb +18 -0
  191. data/spec/lib/jasmine/headless/report_message/spec_spec.rb +20 -0
  192. data/spec/lib/jasmine/headless/report_spec.rb +95 -0
  193. data/spec/lib/jasmine/headless/runner_spec.rb +247 -0
  194. data/spec/lib/jasmine/headless/spec_file_analyzer_spec.rb +68 -0
  195. data/spec/lib/jasmine/headless/task_spec.rb +92 -0
  196. data/spec/lib/jasmine/headless/template_writer_spec.rb +92 -0
  197. data/spec/lib/jasmine/headless/unique_asset_list_spec.rb +22 -0
  198. data/spec/lib/jasmine/headless_spec.rb +38 -0
  199. data/spec/lib/qt/qmake_spec.rb +142 -0
  200. data/spec/skel/template.html.erb_spec.rb +8 -0
  201. data/spec/spec_helper.rb +113 -0
  202. data/vendor/assets/coffeescripts/headless_reporter_result.coffee +49 -0
  203. data/vendor/assets/coffeescripts/prolog.coffee +100 -0
  204. data/vendor/assets/javascripts/beautify-html.js +463 -0
  205. data/vendor/assets/javascripts/headless_reporter_result.js +79 -0
  206. data/vendor/assets/javascripts/intense.coffee +28 -0
  207. data/vendor/assets/javascripts/jasmine-extensions.coffee +97 -0
  208. data/vendor/assets/javascripts/jasmine.HeadlessReporter.Console.coffee +8 -0
  209. data/vendor/assets/javascripts/jasmine.HeadlessReporter.ConsoleBase.coffee +92 -0
  210. data/vendor/assets/javascripts/jasmine.HeadlessReporter.File.coffee +24 -0
  211. data/vendor/assets/javascripts/jasmine.HeadlessReporter.Tap.coffee +28 -0
  212. data/vendor/assets/javascripts/jasmine.HeadlessReporter.Verbose.coffee +64 -0
  213. data/vendor/assets/javascripts/jasmine.HeadlessReporter.coffee +58 -0
  214. data/vendor/assets/javascripts/jsDump.js +209 -0
  215. data/vendor/assets/javascripts/prolog.js +108 -0
  216. metadata +347 -0
@@ -0,0 +1,31 @@
1
+ module Jasmine::Headless::ReportMessage
2
+ class Total
3
+ class << self
4
+ def new_from_parts(parts)
5
+ new(*parts)
6
+ end
7
+ end
8
+
9
+ attr_reader :total, :failed, :time, :has_js_error
10
+
11
+ def initialize(total, failed, time, has_js_error)
12
+ @total, @failed, @time = total.to_i, failed.to_i, time.to_f
13
+
14
+ @has_js_error = case has_js_error
15
+ when String
16
+ has_js_error == "T"
17
+ else
18
+ has_js_error
19
+ end
20
+ end
21
+
22
+ def ==(other)
23
+ other &&
24
+ self.total == other.total &&
25
+ self.failed == other.failed &&
26
+ self.time == other.time &&
27
+ self.has_js_error == other.has_js_error
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,264 @@
1
+ require 'fileutils'
2
+
3
+ require 'coffee-script'
4
+ require 'rainbow'
5
+
6
+ require 'yaml'
7
+ require 'erb'
8
+ require 'sprockets'
9
+
10
+ module Jasmine
11
+ module Headless
12
+ class IndexHandler
13
+ class << self
14
+ attr_accessor :index
15
+ end
16
+
17
+ def initialize(app)
18
+ @app = app
19
+ end
20
+
21
+ def call(env)
22
+ if env['PATH_INFO'] == '/'
23
+ return [ 302, { 'Location' => self.class.index }, [ 'Redirecting...' ] ]
24
+ end
25
+
26
+ @app.call(env)
27
+ end
28
+ end
29
+
30
+ class Runner
31
+ JASMINE_DEFAULTS = {
32
+ 'spec_files' => [ '**/*[sS]pec.js' ],
33
+ 'helpers' => [ 'helpers/**/*.js' ],
34
+ 'spec_dir' => 'spec/javascripts',
35
+ 'src_dir' => nil,
36
+ 'stylesheets' => [],
37
+ 'src_files' => [],
38
+ 'backtrace' => []
39
+ }
40
+
41
+ RUNNER_DIR = File.expand_path('../../../../ext/jasmine-webkit-specrunner', __FILE__)
42
+ RUNNER = File.join(RUNNER_DIR, 'jasmine-webkit-specrunner')
43
+
44
+ attr_reader :options
45
+
46
+ def self.run(options = {})
47
+ new(options).run
48
+ end
49
+
50
+ def self.server_port
51
+ return @server_port if @server_port
52
+
53
+ require 'socket'
54
+
55
+ count = 100
56
+ begin
57
+ port = select_server_port
58
+
59
+ socket = TCPSocket.new(server_interface, port)
60
+ socket.close
61
+
62
+ count -= 1
63
+
64
+ raise "Could not create server port after 100 attempts!" if count == 0
65
+ rescue Errno::ECONNREFUSED
66
+ @server_port = port
67
+
68
+ break
69
+ ensure
70
+ begin
71
+ socket.close if socket
72
+ rescue IOError
73
+ end
74
+ end while true
75
+
76
+ @server_port
77
+ end
78
+
79
+ def self.server_port=(port)
80
+ @server_port = port
81
+ end
82
+
83
+ def self.select_server_port
84
+ 21000 + rand(10000)
85
+ end
86
+
87
+ def self.server_interface
88
+ '127.0.0.1'
89
+ end
90
+
91
+ def self.server_uri
92
+ "http://#{server_interface}:#{server_port}"
93
+ end
94
+
95
+ def self.server_spec_path
96
+ self.server_uri + '/__JHW__/'
97
+ end
98
+
99
+ def self.ensure_server(options)
100
+ return if @server
101
+
102
+ require 'webrick'
103
+ require 'thread'
104
+ require 'rack'
105
+ require 'net/http'
106
+
107
+ port = server_port
108
+
109
+ @server = Thread.new do
110
+ Jasmine::Headless.warn "Powering up!"
111
+
112
+ app = Rack::Builder.new do
113
+ use IndexHandler
114
+
115
+ map '/__JHW__' do
116
+ run Rack::File.new(Dir.pwd)
117
+ end
118
+
119
+ map '/' do
120
+ run Rack::File.new('/')
121
+ end
122
+ end
123
+
124
+ Rack::Handler::WEBrick.run(
125
+ app,
126
+ :Port => port,
127
+ :Logger => Logger.new(StringIO.new),
128
+ :AccessLog => [
129
+ [ StringIO.new, WEBrick::AccessLog::COMMON_LOG_FORMAT ],
130
+ [ StringIO.new, WEBrick::AccessLog::REFERER_LOG_FORMAT ]
131
+ ]
132
+ )
133
+ end
134
+
135
+ while true do
136
+ begin
137
+ Net::HTTP.get(URI(server_uri))
138
+ break
139
+ rescue Errno::ECONNREFUSED => e
140
+ end
141
+
142
+ sleep 0.1
143
+ end
144
+ end
145
+
146
+ def initialize(options)
147
+ options = Options.new(options) if !options.kind_of?(Options)
148
+
149
+ @options = options
150
+ end
151
+
152
+ def template_writer
153
+ @template_writer ||= TemplateWriter.new(self)
154
+ end
155
+
156
+ def jasmine_config
157
+ return @jasmine_config if @jasmine_config
158
+
159
+ @jasmine_config = JASMINE_DEFAULTS.dup
160
+ jasmine_config_data.each do |key, value|
161
+ @jasmine_config[key] = value if value
162
+ end
163
+ @jasmine_config
164
+ end
165
+
166
+ def computed_jasmine_command
167
+ Jasmine::Headless::CacheableAction.enabled = @options[:enable_cache]
168
+ Jasmine::Headless.show_warnings = !@options[:quiet]
169
+ FilesList.reset!
170
+
171
+ self.class.server_port = options[:server_port]
172
+
173
+ @_targets = template_writer.write
174
+
175
+ run_targets = absolute_run_targets(@_targets.dup)
176
+
177
+ if run_targets.length == 2
178
+ if (!@options[:full_run] && files_list.filtered?) || files_list.has_spec_outside_scope?
179
+ run_targets.pop
180
+ end
181
+ end
182
+ jasmine_command(run_targets)
183
+ end
184
+
185
+ def jasmine_command(*targets)
186
+ command = [ RUNNER ]
187
+
188
+ command << "-s #{options[:seed]}"
189
+ command << '-c' if options[:colors]
190
+ command << '-q' if options[:quiet]
191
+
192
+ options.file_reporters.each do |reporter, identifier, file|
193
+ command << "-r #{file}"
194
+ end
195
+
196
+ command += targets
197
+ command.compact.join(' ')
198
+ end
199
+
200
+ def run
201
+ runner = lambda { system computed_jasmine_command }
202
+
203
+ if options[:use_server]
204
+ wrap_in_server(run_targets, &runner)
205
+ else
206
+ runner.call
207
+ end
208
+
209
+ @_status = $?.exitstatus
210
+ ensure
211
+ if @_targets && !runner_filename && (@options[:remove_html_file] || (@_status == 0))
212
+ @_targets.each { |target| FileUtils.rm_f target }
213
+ end
214
+ end
215
+
216
+ def absolute_run_targets(targets)
217
+ targets.flatten.collect do |target|
218
+ if options[:use_server]
219
+ target = self.class.server_spec_path + target
220
+ else
221
+ target = "file://" + File.expand_path(target)
222
+ end
223
+ target
224
+ end
225
+ end
226
+
227
+ def runner_filename
228
+ options[:runner_output_filename] || begin
229
+ if (runner_output = jasmine_config['runner_output']) && !runner_output.empty?
230
+ runner_output
231
+ else
232
+ false
233
+ end
234
+ end
235
+ end
236
+
237
+ def files_list
238
+ @files_list ||= Jasmine::Headless::FilesList.new(
239
+ :config => jasmine_config,
240
+ :only => options[:files],
241
+ :seed => options[:seed],
242
+ :reporters => options.reporters
243
+ )
244
+ end
245
+
246
+ def wrap_in_server(run_targets)
247
+ self.class.ensure_server(options)
248
+ IndexHandler.index = run_targets.last
249
+
250
+ Jasmine::Headless.warn "HTTP powered specs! Located at #{run_targets.join(' ')}"
251
+
252
+ yield
253
+ end
254
+
255
+ private
256
+ def jasmine_config_data
257
+ raise JasmineConfigNotFound.new("Jasmine config not found. I tried #{@options[:jasmine_config]}.") if !File.file?(@options[:jasmine_config])
258
+
259
+ YAML.load(ERB.new(File.read(@options[:jasmine_config])).result(binding))
260
+ end
261
+ end
262
+ end
263
+ end
264
+
@@ -0,0 +1,44 @@
1
+ require 'multi_json'
2
+
3
+ module Jasmine::Headless
4
+ class SpecFileAnalyzer < CacheableAction
5
+ class << self
6
+ def cache_type
7
+ "spec_file_analysis"
8
+ end
9
+ end
10
+
11
+ def action
12
+ line_numbers = {}
13
+
14
+ data = File.read(file)
15
+
16
+ if data.respond_to?(:encode)
17
+ data.encode!('US-ASCII', 'UTF-8', :invalid => :replace, :undef => :replace)
18
+ else
19
+ require 'iconv'
20
+ ic = Iconv.new('UTF-8//IGNORE', 'US-ASCII')
21
+ data = ic.iconv(File.read(file) + ' ')[0..-2]
22
+ end
23
+
24
+ data.force_encoding('US-ASCII') if data.respond_to?(:force_encoding)
25
+
26
+ data.lines.each_with_index.each { |line, index|
27
+ if description = line[%r{(describe|context|it)[( ]*(["'])(.*)\2}, 3]
28
+ (line_numbers[description] ||= []) << (index + 1)
29
+ end
30
+ }
31
+
32
+ line_numbers
33
+ end
34
+
35
+ def serialize(data)
36
+ MultiJson.dump(data)
37
+ end
38
+
39
+ def unserialize(data)
40
+ MultiJson.load(data)
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,39 @@
1
+ module Jasmine
2
+ module Headless
3
+ class Task
4
+ include Rake::DSL if defined?(Rake::DSL)
5
+
6
+ attr_accessor :colors, :keep_on_error, :jasmine_config, :error_on_console_log
7
+
8
+ def initialize(name = 'jasmine:headless')
9
+ @colors = false
10
+ @keep_on_error = false
11
+ @error_on_console_log = true
12
+ @jasmine_config = nil
13
+
14
+ yield self if block_given?
15
+
16
+ desc 'Run Jasmine specs headlessly'
17
+ task(name) { run_rake_task }
18
+ end
19
+
20
+ private
21
+ def run_rake_task
22
+ result = Jasmine::Headless::Runner.run(
23
+ :colors => colors,
24
+ :remove_html_file => !@keep_on_error,
25
+ :jasmine_config => @jasmine_config
26
+ )
27
+ case result
28
+ when 1
29
+ raise Jasmine::Headless::TestFailure
30
+ when 2
31
+ raise Jasmine::Headless::ConsoleLogUsage if @error_on_console_log
32
+ else
33
+ p "Unexpected Jasmine::Headless error code #{result}. If 127, check native extensions have been compiled."
34
+ raise Jasmine::Headless::TestFailure
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,65 @@
1
+ require 'multi_json'
2
+ require 'erb'
3
+ require 'tempfile'
4
+ require 'forwardable'
5
+
6
+ module Jasmine::Headless
7
+ class TemplateWriter
8
+ attr_reader :runner
9
+
10
+ extend Forwardable
11
+
12
+ def_delegators :runner, :files_list, :options
13
+ def_delegators :options, :reporters
14
+
15
+ def initialize(runner)
16
+ @runner = runner
17
+ end
18
+
19
+ def write
20
+ output = [
21
+ [ all_tests_filename, files_list.files_to_html ]
22
+ ]
23
+
24
+ output.unshift([filtered_tests_filename, files_list.filtered_files_to_html ]) if files_list.filtered?
25
+
26
+ output.each do |name, files|
27
+ template = template_for(files)
28
+
29
+ File.open(name, 'wb') { |fh| fh.print template }
30
+ end
31
+
32
+ output.collect(&:first)
33
+ end
34
+
35
+ def all_tests_filename
36
+ runner.runner_filename || "jhw.#{$$}.html"
37
+ end
38
+
39
+ def filtered_tests_filename
40
+ all_tests_filename.gsub(%r{\.html$}, '.filter.html')
41
+ end
42
+
43
+ def render
44
+ template_for(all_files)
45
+ end
46
+
47
+ def all_files
48
+ files_list.files_to_html
49
+ end
50
+
51
+ def jhw_reporters
52
+ reporters.collect do |reporter, output|
53
+ %{jasmine.getEnv().addReporter(new jasmine.HeadlessReporter.#{reporter}("#{output}"));}
54
+ end.join("\n")
55
+ end
56
+
57
+ private
58
+ def template_for(files)
59
+ spec_lines = files_list.spec_file_line_numbers
60
+
61
+ ERB.new(Jasmine::Headless.root.join('skel/template.html.erb').read).result(binding)
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,16 @@
1
+ module Jasmine::Headless
2
+ class UniqueAssetList < ::Array
3
+ def <<(asset)
4
+ raise InvalidUniqueAsset.new("Not an asset: #{asset.inspect}") if !asset.respond_to?(:logical_path)
5
+
6
+ super if !self.any? { |other| asset.pathname == other.pathname }
7
+ end
8
+
9
+ def flatten
10
+ self.collect(&:to_a).flatten
11
+ end
12
+ end
13
+
14
+ class InvalidUniqueAsset < StandardError ; end
15
+ end
16
+