realweb 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 geemus (Wesley Beary)
1
+ Copyright (c) 2012 Engine Yard
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,9 +1,10 @@
1
- require 'rack'
2
- require 'stringio'
3
- require 'logger'
4
- require 'open-uri'
1
+ require 'realweb/server'
2
+ require 'realweb/thread_server'
3
+ require 'realweb/forking_server'
5
4
 
6
5
  module RealWeb
6
+ ServerUnreachable = Class.new(RuntimeError)
7
+
7
8
  class << self
8
9
  def start_server_in_thread(*args)
9
10
  ThreadServer.new(*args) { |server| server.start }
@@ -24,7 +25,3 @@ module RealWeb
24
25
  alias with_server with_server_in_fork
25
26
  end
26
27
  end
27
-
28
- require 'realweb/server'
29
- require 'realweb/thread_server'
30
- require 'realweb/forking_server'
@@ -1,3 +1,5 @@
1
+ require 'realweb/server'
2
+
1
3
  module RealWeb
2
4
  class ForkingServer < Server
3
5
 
@@ -1,3 +1,10 @@
1
+ require 'rack'
2
+ require 'timeout'
3
+ require 'logger'
4
+ require 'uri'
5
+ require 'open-uri'
6
+ require 'stringio'
7
+
1
8
  module RealWeb
2
9
  class Server
3
10
  attr_reader :host, :rack_server
@@ -5,6 +12,17 @@ module RealWeb
5
12
  DEFAULT_PORT_RANGE = 8000..10000
6
13
  DEFAULT_HOST = '127.0.0.1'
7
14
  DEFAULT_LOGGER = Logger.new(StringIO.new)
15
+ DEFAULT_TIMEOUT = 2 # seconds
16
+
17
+ # return true if available, false if still waiting
18
+ def self.server_ready?(server)
19
+ open(server.base_uri)
20
+ true
21
+ rescue OpenURI::HTTPError
22
+ true
23
+ rescue Errno::ECONNREFUSED => e
24
+ false
25
+ end
8
26
 
9
27
  def self.with_rackup(*args)
10
28
  new(*args) do |server|
@@ -14,6 +32,21 @@ module RealWeb
14
32
  end
15
33
  end
16
34
 
35
+ # Create a RealWeb::Server object, either a RealWeb::ForkingServer or
36
+ # a RealWeb::ThreadServer.
37
+ #
38
+ # :port_range - Range specifying acceptable tcp ports to boot on.
39
+ # :logger - An instance of Logger.
40
+ # :host - Alternative host. Default is 127.0.0.1.
41
+ # :verbose - Print server logs and errors to stdout/err
42
+ # :timeout - Timout in seconds to wait for the server to boot.
43
+ # :ready - A Proc that returns true when the server is ready, or false
44
+ # if it is not ready yet. This proc will be called every 100ms with the
45
+ # server as an argument. If blank, an open-uri based check will be used.
46
+ # :pre_spawn_callback - a lambda to be called with the server object before
47
+ # spawning the server.
48
+ #
49
+ # Any remaining options will be passed to Rack::Server on boot.
17
50
  def initialize(config_ru, options = {})
18
51
  @config_ru = config_ru
19
52
  @running = false
@@ -22,6 +55,8 @@ module RealWeb
22
55
  @logger = options.delete(:logger) || DEFAULT_LOGGER
23
56
  @host = options.delete(:host) || DEFAULT_HOST
24
57
  @verbose = options.delete(:verbose) || false
58
+ @timeout = options.delete(:timeout) || DEFAULT_TIMEOUT
59
+ @ready = options.delete(:ready) || self.class.method(:server_ready?)
25
60
 
26
61
  @pre_spawn_callback = options.delete(:pre_spawn_callback)
27
62
  @rack_options = options
@@ -85,17 +120,16 @@ module RealWeb
85
120
  end
86
121
 
87
122
  def wait_for_server
88
- 20.times do
123
+ Timeout.timeout(@timeout) do
89
124
  begin
90
125
  sleep 0.1
91
- open(base_uri)
92
- return
93
- rescue OpenURI::HTTPError
94
- return
95
- rescue Errno::ECONNREFUSED => e
96
- end
126
+ end until @ready.call(self)
97
127
  end
98
- abort "Unable to reach RealWeb server: Problem booting #{@config_ru}"
128
+ rescue Timeout::Error
129
+ raise RealWeb::ServerUnreachable, <<-ERROR
130
+ Unable to reach RealWeb server after #{@timeout}s: #{@config_ru}.#{@verbose || "\nBoot RealWeb with {verbose: true} to print errrors."}
131
+ ERROR
99
132
  end
133
+
100
134
  end
101
135
  end
@@ -1,3 +1,5 @@
1
+ require 'realweb/server'
2
+
1
3
  module RealWeb
2
4
  class ThreadServer < Server
3
5
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: realweb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-11-10 00:00:00.000000000 Z
14
+ date: 2012-12-06 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rack
@@ -77,6 +77,22 @@ dependencies:
77
77
  - - ! '>='
78
78
  - !ruby/object:Gem::Version
79
79
  version: '0'
80
+ - !ruby/object:Gem::Dependency
81
+ name: simplecov
82
+ requirement: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
80
96
  description: Easily runs a rack app for tests that hit web APIs
81
97
  email: cloud-engineering@engineyard.com
82
98
  executables: []
@@ -103,18 +119,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
103
119
  - - ! '>='
104
120
  - !ruby/object:Gem::Version
105
121
  version: '0'
106
- segments:
107
- - 0
108
- hash: -1675846270648618555
109
122
  required_rubygems_version: !ruby/object:Gem::Requirement
110
123
  none: false
111
124
  requirements:
112
125
  - - ! '>='
113
126
  - !ruby/object:Gem::Version
114
127
  version: '0'
115
- segments:
116
- - 0
117
- hash: -1675846270648618555
118
128
  requirements: []
119
129
  rubyforge_project:
120
130
  rubygems_version: 1.8.24
@@ -122,3 +132,4 @@ signing_key:
122
132
  specification_version: 3
123
133
  summary: Easily runs a rack app for tests that hit web APIs
124
134
  test_files: []
135
+ has_rdoc: false