js_spec 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/CHANGES +12 -0
  2. data/README +2 -1
  3. data/Rakefile +2 -3
  4. data/core/JSSpecExtensions.js +18 -16
  5. data/lib/js_spec/resources/{spec_runner.rb → spec.rb} +4 -8
  6. data/lib/js_spec/resources.rb +1 -10
  7. data/lib/js_spec.rb +19 -20
  8. data/spec/integration/integration_spec.rb +14 -3
  9. data/spec/integration/integration_spec_helper.rb +1 -2
  10. data/spec/unit/js_test_core/resources/spec_dir_spec.rb +35 -0
  11. data/spec/unit/js_test_core/resources/spec_file_spec.rb +33 -0
  12. data/spec/unit/unit_spec_helper.rb +9 -9
  13. metadata +7 -46
  14. data/core/jquery.js +0 -2992
  15. data/lib/js_spec/client.rb +0 -50
  16. data/lib/js_spec/guid.rb +0 -153
  17. data/lib/js_spec/rack/commonlogger.rb +0 -5
  18. data/lib/js_spec/rack.rb +0 -2
  19. data/lib/js_spec/rails_server.rb +0 -22
  20. data/lib/js_spec/resources/dir.rb +0 -60
  21. data/lib/js_spec/resources/file.rb +0 -32
  22. data/lib/js_spec/resources/runners/firefox_runner.rb +0 -71
  23. data/lib/js_spec/resources/runners.rb +0 -15
  24. data/lib/js_spec/resources/spec_dir_runner.rb +0 -15
  25. data/lib/js_spec/resources/spec_file_runner.rb +0 -15
  26. data/lib/js_spec/resources/suite.rb +0 -24
  27. data/lib/js_spec/resources/suite_finish.rb +0 -20
  28. data/lib/js_spec/resources/web_root.rb +0 -34
  29. data/lib/js_spec/server.rb +0 -98
  30. data/lib/js_spec/thin/backends/js_spec_server.rb +0 -9
  31. data/lib/js_spec/thin/js_spec_connection.rb +0 -42
  32. data/lib/js_spec/thin.rb +0 -3
  33. data/spec/unit/js_spec/client_spec.rb +0 -137
  34. data/spec/unit/js_spec/rails_server_spec.rb +0 -45
  35. data/spec/unit/js_spec/resources/dir_spec.rb +0 -84
  36. data/spec/unit/js_spec/resources/file_spec.rb +0 -87
  37. data/spec/unit/js_spec/resources/runner_spec.rb +0 -24
  38. data/spec/unit/js_spec/resources/runners/firefox_runner_spec.rb +0 -152
  39. data/spec/unit/js_spec/resources/spec_dir_runner_spec.rb +0 -48
  40. data/spec/unit/js_spec/resources/spec_file_runner_spec.rb +0 -20
  41. data/spec/unit/js_spec/resources/suite_finish_spec.rb +0 -42
  42. data/spec/unit/js_spec/resources/suite_spec.rb +0 -44
  43. data/spec/unit/js_spec/resources/web_root_spec.rb +0 -55
  44. data/spec/unit/js_spec/server_spec.rb +0 -154
  45. data/spec/unit/thin/js_spec_connection_spec.rb +0 -64
@@ -1,50 +0,0 @@
1
- module JsSpec
2
- class Client
3
- class << self
4
- def run(params={})
5
- data = []
6
- data << "selenium_host=#{CGI.escape(params[:selenium_host] || 'localhost')}"
7
- data << "selenium_port=#{CGI.escape((params[:selenium_port] || 4444).to_s)}"
8
- data << "spec_url=#{CGI.escape(params[:spec_url])}" if params[:spec_url]
9
- response = Net::HTTP.start(DEFAULT_HOST, DEFAULT_PORT) do |http|
10
- http.post('/runners/firefox', data.join("&"))
11
- end
12
-
13
- body = response.body
14
- if body.empty?
15
- puts "SUCCESS"
16
- return true
17
- else
18
- puts "FAILURE"
19
- puts body
20
- return false
21
- end
22
- end
23
-
24
- def run_argv(argv)
25
- params = {}
26
- parser = OptionParser.new do |o|
27
- o.banner = "JsSpec Runner"
28
- o.banner << "\nUsage: #{$0} [options] [-- untouched arguments]"
29
-
30
- o.on
31
- o.on('-h', '--selenium_host=SELENIUM_HOST', "The host name of the Selenium Server relative to where this file is executed") do |host|
32
- params[:selenium_host] = host
33
- end
34
-
35
- o.on('-p', '--selenium_port=SELENIUM_PORT', "The port of the Selenium Server relative to where this file is executed") do |port|
36
- params[:selenium_port] = port
37
- end
38
-
39
- o.on('-u', '--spec_url=SPEC_URL', "The url of the js spec server, relative to the browsers running via the Selenium Server") do |spec_url|
40
- params[:spec_url] = spec_url
41
- end
42
-
43
- o.on_tail
44
- end
45
- parser.order!(argv)
46
- run params
47
- end
48
- end
49
- end
50
- end
data/lib/js_spec/guid.rb DELETED
@@ -1,153 +0,0 @@
1
- #
2
- # Guid - Ruby library for portable GUID/UUID generation.
3
- #
4
- # Copyright (c) 2004 David Garamond <davegaramond at icqmail com>
5
- #
6
- # This library is free software; you can redistribute it and/or modify it
7
- # under the same terms as Ruby itself.
8
- #
9
-
10
- if RUBY_PLATFORM =~ /[^r]win/i &&
11
- module Guid_Win32_
12
- require 'Win32API'
13
-
14
- PROV_RSA_FULL = 1
15
- CRYPT_VERIFYCONTEXT = 0xF0000000
16
- FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200
17
- FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
18
-
19
- CryptAcquireContext = Win32API.new("advapi32", "CryptAcquireContext",
20
- 'PPPII', 'L')
21
- CryptGenRandom = Win32API.new("advapi32", "CryptGenRandom",
22
- 'LIP', 'L')
23
- CryptReleaseContext = Win32API.new("advapi32", "CryptReleaseContext",
24
- 'LI', 'L')
25
- GetLastError = Win32API.new("kernel32", "GetLastError", '', 'L')
26
- FormatMessageA = Win32API.new("kernel32", "FormatMessageA",
27
- 'LPLLPLPPPPPPPP', 'L')
28
-
29
- def lastErrorMessage
30
- code = GetLastError.call
31
- msg = "\0" * 1024
32
- len = FormatMessageA.call(FORMAT_MESSAGE_IGNORE_INSERTS +
33
- FORMAT_MESSAGE_FROM_SYSTEM, 0,
34
- code, 0, msg, 1024, nil, nil,
35
- nil, nil, nil, nil, nil, nil)
36
- msg[0, len].tr("\r", '').chomp
37
- end
38
-
39
- def initialize
40
- hProvStr = " " * 4
41
- if CryptAcquireContext.call(hProvStr, nil, nil, PROV_RSA_FULL,
42
- CRYPT_VERIFYCONTEXT) == 0
43
- raise SystemCallError, "CryptAcquireContext failed: #{lastErrorMessage}"
44
- end
45
- hProv, = hProvStr.unpack('L')
46
- @bytes = " " * 16
47
- if CryptGenRandom.call(hProv, 16, @bytes) == 0
48
- raise SystemCallError, "CryptGenRandom failed: #{lastErrorMessage}"
49
- end
50
- if CryptReleaseContext.call(hProv, 0) == 0
51
- raise SystemCallError, "CryptReleaseContext failed: #{lastErrorMessage}"
52
- end
53
- end
54
- end
55
- end
56
-
57
- module Guid_Unix_
58
- @@random_device = nil
59
-
60
- def initialize
61
- if !@@random_device
62
- if File.exists? "/dev/urandom"
63
- @@random_device = File.open "/dev/urandom", "r"
64
- elsif File.exists? "/dev/random"
65
- @@random_device = File.open "/dev/random", "r"
66
- else
67
- raise RuntimeError, "Can't find random device"
68
- end
69
- end
70
-
71
- @bytes = @@random_device.read(16)
72
- end
73
- end
74
-
75
- class Guid
76
- if RUBY_PLATFORM =~ /[^r]win/
77
- include Guid_Win32_
78
- else
79
- include Guid_Unix_
80
- end
81
-
82
- def hexdigest
83
- @bytes.unpack("h*")[0]
84
- end
85
-
86
- def to_s
87
- @bytes.unpack("h8 h4 h4 h4 h12").join "-"
88
- end
89
-
90
- def inspect
91
- to_s
92
- end
93
-
94
- def raw
95
- @bytes
96
- end
97
-
98
- def self.from_s(s)
99
- raise ArgumentError, "Invalid GUID hexstring" unless
100
- s =~ /\A[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}\z/i
101
- guid = Guid.allocate
102
- guid.instance_eval { @bytes = [s.gsub(/[^0-9a-f]+/i, '')].pack "h*" }
103
- guid
104
- end
105
-
106
- def self.from_raw(bytes)
107
- raise ArgumentError, "Invalid GUID raw bytes, length must be 16 bytes" unless
108
- bytes.length == 16
109
- guid = Guid.allocate
110
- guid.instance_eval { @bytes = bytes }
111
- guid
112
- end
113
-
114
- def ==(other)
115
- @bytes == other.raw
116
- end
117
- end
118
-
119
- if __FILE__ == $0
120
- require 'test/unit'
121
-
122
- class GuidTest < Test::Unit::TestCase
123
- def test_new
124
- g = Guid.new
125
-
126
- # different representations of guid: hexdigest, hex+dashes, raw bytes
127
- assert_equal(0, g.to_s =~ /\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/)
128
- assert_equal(16, g.raw.length)
129
- assert_equal(0, g.hexdigest =~ /\A[0-9a-f]{32}\z/)
130
- assert_equal(g.hexdigest, g.to_s.gsub(/-/, ''))
131
-
132
- # must be different each time we produce (this is just a simple test)
133
- g2 = Guid.new
134
- assert_equal(true, g != g2)
135
- assert_equal(true, g.to_s != g2.to_s)
136
- assert_equal(true, g.raw != g2.raw)
137
- assert_equal(true, g.hexdigest != g2.hexdigest)
138
- assert_equal(1000, (1..1000).select { |i| g != Guid.new }.length)
139
- end
140
-
141
- def test_from_s
142
- g = Guid.new
143
- g2 = Guid.from_s(g.to_s)
144
- assert_equal(g, g2)
145
- end
146
-
147
- def test_from_raw
148
- g = Guid.new
149
- g2 = Guid.from_raw(g.raw)
150
- assert_equal(g, g2)
151
- end
152
- end
153
- end
@@ -1,5 +0,0 @@
1
- Rack::CommonLogger.class_eval do
2
- def empty?
3
- @body.empty?
4
- end
5
- end
data/lib/js_spec/rack.rb DELETED
@@ -1,2 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/rack/commonlogger"
@@ -1,22 +0,0 @@
1
- module JsSpec
2
- class RailsServer < Server
3
- class << self
4
- def run(rails_root, server_options = {})
5
- server_options[:Host] ||= DEFAULT_HOST
6
- server_options[:Port] ||= DEFAULT_PORT
7
- Server.instance = new(rails_root, server_options[:Host], server_options[:Port])
8
- Server.instance.run server_options
9
- end
10
- end
11
-
12
- def initialize(rails_root, host=DEFAULT_HOST, port=DEFAULT_PORT)
13
- super(
14
- "#{rails_root}/spec/javascripts",
15
- "#{rails_root}/public/javascripts",
16
- "#{rails_root}/public",
17
- host,
18
- port
19
- )
20
- end
21
- end
22
- end
@@ -1,60 +0,0 @@
1
- module JsSpec
2
- module Resources
3
- class Dir < File
4
- def locate(name)
5
- if file = file(name)
6
- file
7
- else
8
- locate_spec_runner(name)
9
- end
10
- end
11
-
12
- def get(request, response)
13
- SpecDirRunner.new(self).get(request, response)
14
- end
15
-
16
- def glob(pattern)
17
- expanded_pattern = absolute_path + pattern
18
- ::Dir.glob(expanded_pattern).map do |absolute_globbed_path|
19
- relative_globbed_path = absolute_globbed_path.gsub(absolute_path, relative_path)
20
- File.new(absolute_globbed_path, relative_globbed_path)
21
- end
22
- end
23
-
24
- protected
25
- def determine_child_paths(name)
26
- absolute_child_path = "#{absolute_path}/#{name}"
27
- relative_child_path = "#{relative_path}/#{name}"
28
- [absolute_child_path, relative_child_path]
29
- end
30
-
31
- def locate_spec_runner(name)
32
- if subdir = subdir(name)
33
- subdir
34
- elsif file = file(name + '.js')
35
- SpecFileRunner.new(file)
36
- else
37
- raise "No specs found at #{relative_path}/#{name}."
38
- end
39
- end
40
-
41
- def file(name)
42
- absolute_file_path, relative_file_path = determine_child_paths(name)
43
- if ::File.exists?(absolute_file_path) && !::File.directory?(absolute_file_path)
44
- Resources::File.new(absolute_file_path, relative_file_path)
45
- else
46
- nil
47
- end
48
- end
49
-
50
- def subdir(name)
51
- absolute_dir_path, relative_dir_path = determine_child_paths(name)
52
- if ::File.directory?(absolute_dir_path)
53
- Resources::Dir.new(absolute_dir_path, relative_dir_path)
54
- else
55
- nil
56
- end
57
- end
58
- end
59
- end
60
- end
@@ -1,32 +0,0 @@
1
- module JsSpec
2
- module Resources
3
- class File
4
- MIME_TYPES = {
5
- '.js' => 'text/javascript',
6
- '.css' => 'text/css',
7
- '.png' => 'image/png',
8
- '.jpg' => 'image/jpeg',
9
- '.jpeg' => 'image/jpeg',
10
- '.gif' => 'image/gif',
11
- }
12
-
13
- attr_reader :absolute_path, :relative_path
14
-
15
- def initialize(absolute_path, relative_path)
16
- @absolute_path = absolute_path
17
- @relative_path = relative_path
18
- end
19
-
20
- def get(request, response)
21
- extension = ::File.extname(absolute_path)
22
- response.headers['Content-Type'] = MIME_TYPES[extension] || 'text/html'
23
- response.body = ::File.read(absolute_path)
24
- end
25
-
26
- def ==(other)
27
- return false unless other.class == self.class
28
- absolute_path == other.absolute_path && relative_path == other.relative_path
29
- end
30
- end
31
- end
32
- end
@@ -1,71 +0,0 @@
1
- module JsSpec
2
- module Resources
3
- class Runners
4
- class FirefoxRunner
5
- class << self
6
- def resume(guid, text)
7
- runner = instances.delete(guid)
8
- runner.finalize(text)
9
- end
10
-
11
- def register_instance(runner)
12
- instances[runner.guid] = runner
13
- end
14
-
15
- protected
16
- def instances
17
- @instances ||= {}
18
- end
19
- end
20
-
21
- include FileUtils
22
- attr_reader :guid, :profile_dir, :request, :response, :connection, :driver
23
-
24
- def initialize(request, response)
25
- profile_base = "#{::Dir.tmpdir}/js_spec/firefox"
26
- mkdir_p profile_base
27
- @profile_dir = "#{profile_base}/#{Time.now.to_i}"
28
- @guid = Guid.new.to_s
29
- @request = request
30
- @response = response
31
- @connection = Server.connection
32
- end
33
-
34
- def post(request, response)
35
- FirefoxRunner.register_instance self
36
- spec_url = (request && request['spec_url']) ? request['spec_url'] : spec_suite_url
37
- parsed_spec_url = URI.parse(spec_url)
38
- selenium_port = (request['selenium_port'] || 4444).to_i
39
- @driver = Selenium::SeleniumDriver.new(
40
- request['selenium_host'] || 'localhost',
41
- selenium_port,
42
- '*firefox',
43
- "#{parsed_spec_url.scheme}://#{parsed_spec_url.host}:#{parsed_spec_url.port}"
44
- )
45
- begin
46
- driver.start
47
- rescue Errno::ECONNREFUSED => e
48
- raise Errno::ECONNREFUSED, "Cannot connect to Selenium Server on port #{selenium_port}. To start the selenium server, run `selenium`."
49
- end
50
- Thread.start do
51
- url = "#{spec_url}?guid=#{guid}"
52
- driver.open(url)
53
- end
54
- response.status = 200
55
- end
56
-
57
- def finalize(text)
58
- driver.stop
59
- response.body = text
60
- connection.send_body(response)
61
- end
62
-
63
- protected
64
-
65
- def spec_suite_url
66
- "#{Server.root_url}/specs"
67
- end
68
- end
69
- end
70
- end
71
- end
@@ -1,15 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
-
3
- module JsSpec
4
- module Resources
5
- class Runners
6
- def locate(name)
7
- if name == 'firefox'
8
- FirefoxRunner.new(Server.request, Server.response)
9
- else
10
- raise "Invalid path #{name}"
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- module JsSpec
2
- module Resources
3
- class SpecDirRunner < SpecRunner
4
- attr_reader :dir
5
-
6
- def initialize(dir)
7
- @dir = dir
8
- end
9
-
10
- def spec_files
11
- dir.glob("/**/*_spec.js")
12
- end
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- module JsSpec
2
- module Resources
3
- class SpecFileRunner < SpecRunner
4
- attr_reader :file
5
-
6
- def initialize(file)
7
- @file = file
8
- end
9
-
10
- def spec_files
11
- [file]
12
- end
13
- end
14
- end
15
- end
@@ -1,24 +0,0 @@
1
- module JsSpec
2
- module Resources
3
- class Suite
4
- class << self
5
- def locate(id)
6
- new id
7
- end
8
- end
9
-
10
- attr_reader :id
11
- def initialize(id)
12
- @id = id
13
- end
14
-
15
- def locate(name)
16
- if name == 'finish'
17
- SuiteFinish.new self
18
- else
19
- raise ArgumentError, "Invalid path: #{name}"
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,20 +0,0 @@
1
- module JsSpec
2
- module Resources
3
- class SuiteFinish
4
- attr_reader :suite
5
- def initialize(suite)
6
- @suite = suite
7
- end
8
-
9
- def post(request, response)
10
- guid = request['guid']
11
- if guid
12
- Runners::FirefoxRunner.resume(guid, request['text'])
13
- else
14
- STDOUT.puts request['text']
15
- end
16
- ""
17
- end
18
- end
19
- end
20
- end
@@ -1,34 +0,0 @@
1
- module JsSpec
2
- module Resources
3
- class WebRoot
4
- attr_reader :public_path
5
- def initialize(public_path)
6
- @public_path = ::File.expand_path(public_path)
7
- end
8
-
9
- def locate(name)
10
- case name
11
- when 'specs'
12
- Resources::Dir.new(JsSpec::Server.spec_root_path, "/specs")
13
- when 'core'
14
- Resources::Dir.new(JsSpec::Server.core_path, "/core")
15
- when 'implementations'
16
- Resources::Dir.new(JsSpec::Server.implementation_root_path, "/implementations")
17
- when 'suites'
18
- Resources::Suite
19
- when 'runners'
20
- Resources::Runners.new
21
- else
22
- potential_file_in_public_path = "#{public_path}/#{name}"
23
- if ::File.directory?(potential_file_in_public_path)
24
- Resources::Dir.new(potential_file_in_public_path, "/#{name}")
25
- elsif ::File.exists?(potential_file_in_public_path)
26
- Resources::File.new(potential_file_in_public_path, "/#{name}")
27
- else
28
- raise "Invalid path: #{name}"
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,98 +0,0 @@
1
- module JsSpec
2
- class Server
3
- class << self
4
- attr_accessor :instance
5
-
6
- def run(spec_root_path, implementation_root_path, public_path, server_options = {})
7
- server_options[:Host] ||= DEFAULT_HOST
8
- server_options[:Port] ||= DEFAULT_PORT
9
- @instance = new(spec_root_path, implementation_root_path, public_path, server_options[:Host], server_options[:Port])
10
- instance.run server_options
11
- end
12
-
13
- def spec_root_path; instance.spec_root_path; end
14
- def implementation_root_path; instance.implementation_root_path; end
15
- def public_path; instance.public_path; end
16
- def core_path; instance.core_path; end
17
- def connection; instance.connection; end
18
- def request; instance.request; end
19
- def response; instance.response; end
20
- def root_url; instance.root_url; end
21
- end
22
-
23
- attr_reader :host, :port, :spec_root_path, :implementation_root_path, :core_path, :public_path
24
-
25
- def initialize(spec_root_path, implementation_root_path, public_path, host=DEFAULT_HOST, port=DEFAULT_PORT)
26
- dir = ::File.dirname(__FILE__)
27
- @core_path = ::File.expand_path("#{dir}/../../core")
28
- @spec_root_path = ::File.expand_path(spec_root_path)
29
- @implementation_root_path = ::File.expand_path(implementation_root_path)
30
- @public_path = ::File.expand_path(public_path)
31
- @host = host
32
- @port = port
33
- end
34
-
35
- def run(options)
36
- server = ::Thin::Server.new(options[:Host], options[:Port], self)
37
- server.backend = ::Thin::Backends::JsSpecServer.new(options[:Host], options[:Port])
38
- server.backend.server = server
39
- server.start!
40
- end
41
-
42
- def call(env)
43
- self.connection = env['js_spec.connection']
44
- self.request = Rack::Request.new(env)
45
- self.response = Rack::Response.new
46
- method = request.request_method.downcase.to_sym
47
- get_resource(request).send(method, request, response)
48
- response.finish
49
- ensure
50
- self.connection = nil
51
- self.request = nil
52
- self.response = nil
53
- end
54
-
55
- def connection
56
- Thread.current[:connection]
57
- end
58
-
59
- def request
60
- Thread.current[:request]
61
- end
62
-
63
- def response
64
- Thread.current[:response]
65
- end
66
-
67
- def root_url
68
- "http://#{host}:#{port}"
69
- end
70
-
71
- protected
72
- def connection=(connection)
73
- Thread.current[:connection] = connection
74
- end
75
-
76
- def request=(request)
77
- Thread.current[:request] = request
78
- end
79
-
80
- def response=(response)
81
- Thread.current[:response] = response
82
- end
83
-
84
- def path_parts(req)
85
- request.path_info.split('/').reject { |part| part == "" }
86
- end
87
-
88
- def get_resource(request)
89
- path_parts(request).inject(Resources::WebRoot.new(public_path)) do |resource, child_resource_name|
90
- resource.locate(child_resource_name)
91
- end
92
- rescue Exception => e
93
- detailed_exception = Exception.new("Error handling path #{request.path_info}\n#{e.message}")
94
- detailed_exception.set_backtrace(e.backtrace)
95
- raise detailed_exception
96
- end
97
- end
98
- end
@@ -1,9 +0,0 @@
1
- module Thin
2
- module Backends
3
- class JsSpecServer < TcpServer
4
- def connect
5
- @signature = EventMachine.start_server(@host, @port, JsSpecConnection, &method(:initialize_connection))
6
- end
7
- end
8
- end
9
- end
@@ -1,42 +0,0 @@
1
- module Thin
2
- class JsSpecConnection < Connection
3
- def process
4
- # Add client info to the request env
5
- @request.remote_address = remote_address
6
-
7
- env = @request.env
8
- env['js_spec.connection'] = self
9
- @response.status, @response.headers, @response.body = @app.call(env)
10
- send_data @response.head
11
- unless @response.body.empty?
12
- send_body @response.body
13
- end
14
- rescue Exception => e
15
- handle_error e
16
- end
17
-
18
- def send_body(rack_response)
19
- rack_response.each do |chunk|
20
- send_data chunk
21
- end
22
- # If no more request on that same connection, we close it.
23
- close_connection_after_writing unless persistent?
24
- rescue Exception => e
25
- handle_error e
26
- ensure
27
- @request.close rescue nil
28
- @response.close rescue nil
29
-
30
- # Prepare the connection for another request if the client
31
- # supports HTTP pipelining (persistent connection).
32
- post_init if persistent?
33
- end
34
-
35
- def handle_error(error)
36
- log "!! Unexpected error while processing request: #{error.message}"
37
- log error.backtrace
38
- log_error
39
- close_connection rescue nil
40
- end
41
- end
42
- end
data/lib/js_spec/thin.rb DELETED
@@ -1,3 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/thin/js_spec_connection"
3
- require "#{dir}/thin/backends/js_spec_server"