oop_rails_server 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -7
- data/CHANGES.md +11 -0
- data/README.md +23 -1
- data/lib/oop_rails_server/helpers.rb +0 -7
- data/lib/oop_rails_server/rails_server.rb +152 -31
- data/lib/oop_rails_server/version.rb +1 -1
- data/oop_rails_server.gemspec +1 -0
- data/templates/oop_rails_server_base/app/controllers/working_controller.rb +1 -1
- metadata +72 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
5
|
-
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 26ef5c7bd3dcc6dc6bf29ad377c4397b510193d6
|
4
|
+
data.tar.gz: 230c9d20af081ce7885dc1300d6056ccbff7fba2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 05c44883c4416fed68f128d239059d28e05b2ccc596ab3b1364a6220144cbe1c62af9f4c5754b565baddabb6a52fba75a0297ce2a1ef6b15624b4d68c37c8577
|
7
|
+
data.tar.gz: 178c4199b58ea6e0eebb41f850be0716ecfea1df09e212785bd7adbc1650bd1c904155bd4b8c7ae13187666a0af6d1d5a2957a3dab81145eb47a4018dbf4dd77
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# `oop_rails_server` Releases
|
2
2
|
|
3
|
+
## 0.0.8, 3 April 2015
|
4
|
+
|
5
|
+
* Much better error reporting if the server fails to start up.
|
6
|
+
* Add `OopRailsServer::RailsServer#setup!`, which configures everything properly but does not actually start
|
7
|
+
the out-of-process Rails server yet.
|
8
|
+
* Allow passing paths or full URIs into `OopRailsServer::RailsServer#get`, as well as passing a separate Hash
|
9
|
+
of query values.
|
10
|
+
* Move question of which templates to use out of `OopRailsServer::Helpers` and into `OopRailsServer::RailsServer`.
|
11
|
+
* Save away the actual exact versions of Rails and Ruby being used, as well as the `RUBY_ENGINE`, and allow callers
|
12
|
+
to access them easily.
|
13
|
+
|
3
14
|
## 0.0.7, 21 January 2015
|
4
15
|
|
5
16
|
* Further fixes for the `i18n` gem version `0.7.0`.
|
data/README.md
CHANGED
@@ -1,6 +1,28 @@
|
|
1
1
|
# OopRailsServer
|
2
2
|
|
3
|
-
|
3
|
+
Rails makes it easy enough to write test code or RSpec that runs _within_ Rails. However, what’s much, much harder
|
4
|
+
is testing code (like a RubyGem) that augments Rails itself, particularly if you want that code to be compatible
|
5
|
+
with multiple versions of Rails. Often people will simply check in a full Rails tree (_i.e._, that which is generated
|
6
|
+
by `rails new`), but that fixes you to an exact version of Rails and is difficult to upgrade or manipulate.
|
7
|
+
|
8
|
+
`OopRailsServer` provides a completely different, much cleaner solution: it provides an object,
|
9
|
+
`OopRailsServer::RailsServer`. This object knows how to:
|
10
|
+
|
11
|
+
* Install any version of Rails from scratch, completely cleanly (_i.e._, the equivalent of `gem install rails -v=4.2.0`);
|
12
|
+
* Use that version of Rails to create a new Rails installation (_i.e._, `rails _4.2.0_ new`);
|
13
|
+
* Add any lines you want to the resulting Rails Gemfile, and run `bundle install` (so that any gems you want —
|
14
|
+
for example, the gem you’re testing — are available to that Rails installation);
|
15
|
+
* Populate that installation by using one or more "template directories" that you provide — each template directory
|
16
|
+
is laid out exactly like a standard Rails tree (but need contain only files you actually want to provide), and will
|
17
|
+
overwrite the corresponding files in the Rails tree
|
18
|
+
* Spin up a new Rails server, running on a randomly-assigned port, in that Rails installation;
|
19
|
+
* Fetch arbitrary URLs from that Rails server on your command;
|
20
|
+
* When it’s all done, safely (and reliably) terminate that server.
|
21
|
+
|
22
|
+
As of this writing, this gem is not fully productized: while it works reliably, there is insufficient documentation
|
23
|
+
to easily use it yourself. It is, however, very reliable: it is used as the backbone of the test suites for
|
24
|
+
[`fortitude`](https://github.com/ageweke/fortitude), [`parcels`](https://github.com/ageweke/parcels), and the
|
25
|
+
backbone of the real work in [`rails_view_benchmarks`](https://github.com/ageweke/rails_view_benchmarks).
|
4
26
|
|
5
27
|
## Installation
|
6
28
|
|
@@ -152,12 +152,6 @@ it should return the fully-qualified path to the root of your project (gem, appl
|
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
155
|
-
def oop_rails_server_base_templates
|
156
|
-
[
|
157
|
-
File.expand_path(File.join(File.dirname(__FILE__), '../../templates/oop_rails_server_base'))
|
158
|
-
]
|
159
|
-
end
|
160
|
-
|
161
155
|
def rails_server_implicit_template_paths
|
162
156
|
[ ]
|
163
157
|
end
|
@@ -185,7 +179,6 @@ it should return the fully-qualified path to the root of your project (gem, appl
|
|
185
179
|
server = rails_servers[name]
|
186
180
|
server ||= begin
|
187
181
|
templates =
|
188
|
-
oop_rails_server_base_templates +
|
189
182
|
rails_server_implicit_template_paths +
|
190
183
|
templates
|
191
184
|
|
@@ -2,21 +2,24 @@ require 'fileutils'
|
|
2
2
|
require 'find'
|
3
3
|
require 'net/http'
|
4
4
|
require 'uri'
|
5
|
+
require 'file/tail'
|
5
6
|
|
6
7
|
module OopRailsServer
|
7
8
|
class RailsServer
|
8
|
-
attr_reader :rails_root, :rails_version, :name
|
9
|
+
attr_reader :rails_root, :rails_version, :name, :actual_rails_version, :actual_ruby_version, :actual_ruby_engine
|
9
10
|
|
10
11
|
def initialize(options)
|
11
12
|
options.assert_valid_keys(
|
12
13
|
:name, :template_paths, :runtime_base_directory,
|
13
|
-
:rails_version, :rails_env, :additional_gemfile_lines
|
14
|
+
:rails_version, :rails_env, :additional_gemfile_lines,
|
15
|
+
:log, :verbose
|
14
16
|
)
|
15
17
|
|
16
18
|
@name = options[:name] || raise(ArgumentError, "You must specify a name for the Rails server")
|
17
19
|
|
18
20
|
@template_paths = options[:template_paths] || raise(ArgumentError, "You must specify one or more template paths")
|
19
21
|
@template_paths = Array(@template_paths).map { |t| File.expand_path(t) }
|
22
|
+
@template_paths = base_template_directories + @template_paths
|
20
23
|
|
21
24
|
@runtime_base_directory = options[:runtime_base_directory] || raise(ArgumentError, "You must specify a runtime_base_directory")
|
22
25
|
@runtime_base_directory = File.expand_path(@runtime_base_directory)
|
@@ -24,6 +27,9 @@ module OopRailsServer
|
|
24
27
|
@rails_version = options[:rails_version] || :default
|
25
28
|
@rails_env = (options[:rails_env] || 'production').to_s
|
26
29
|
|
30
|
+
@log = options[:log] || $stderr
|
31
|
+
@verbose = options.fetch(:verbose, true)
|
32
|
+
|
27
33
|
@additional_gemfile_lines = Array(options[:additional_gemfile_lines] || [ ])
|
28
34
|
|
29
35
|
|
@@ -36,22 +42,61 @@ module OopRailsServer
|
|
36
42
|
do_start! unless server_pid
|
37
43
|
end
|
38
44
|
|
45
|
+
def setup!
|
46
|
+
@set_up ||= begin
|
47
|
+
Bundler.with_clean_env do
|
48
|
+
with_rails_env do
|
49
|
+
setup_directories!
|
50
|
+
|
51
|
+
in_rails_root_parent do
|
52
|
+
splat_bootstrap_gemfile!
|
53
|
+
rails_new!
|
54
|
+
update_gemfile!
|
55
|
+
end
|
56
|
+
|
57
|
+
in_rails_root do
|
58
|
+
run_bundle_install!(:primary)
|
59
|
+
splat_template_files!
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
true
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
39
68
|
def stop!
|
40
69
|
stop_server! if server_pid
|
41
70
|
end
|
42
71
|
|
43
|
-
def get(
|
44
|
-
out = get_response(
|
72
|
+
def get(path_or_uri, options = { })
|
73
|
+
out = get_response(path_or_uri, options)
|
45
74
|
out.body.strip if out
|
46
75
|
end
|
47
76
|
|
48
|
-
def uri_for(
|
49
|
-
|
50
|
-
|
77
|
+
def uri_for(path_or_uri, query_values = nil)
|
78
|
+
query_values ||= { }
|
79
|
+
|
80
|
+
if path_or_uri.kind_of?(::URI)
|
81
|
+
path_or_uri
|
82
|
+
else
|
83
|
+
uri_string = "http://#{localhost_name}:#{@port}/#{path_or_uri}"
|
84
|
+
if query_values.length > 0
|
85
|
+
uri_string += ("?" + query_values.map { |k,v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" }.join("&"))
|
86
|
+
end
|
87
|
+
URI.parse(uri_string)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def localhost_name
|
92
|
+
"127.0.0.1"
|
51
93
|
end
|
52
94
|
|
53
|
-
def get_response(
|
54
|
-
|
95
|
+
def get_response(path_or_uri, options = { })
|
96
|
+
options.assert_valid_keys(:ignore_status_code, :nil_on_not_found, :query, :no_layout)
|
97
|
+
|
98
|
+
uri = uri_for(path_or_uri, options[:query])
|
99
|
+
# say "[fetch '#{uri}']"
|
55
100
|
data = Net::HTTP.get_response(uri)
|
56
101
|
|
57
102
|
if (data.code.to_s != '200')
|
@@ -79,22 +124,20 @@ module OopRailsServer
|
|
79
124
|
private
|
80
125
|
attr_reader :template_paths, :runtime_base_directory, :rails_env, :additional_gemfile_lines, :port, :server_pid
|
81
126
|
|
127
|
+
def base_template_directories
|
128
|
+
[
|
129
|
+
File.expand_path(File.join(File.dirname(__FILE__), '../../templates/oop_rails_server_base'))
|
130
|
+
]
|
131
|
+
end
|
132
|
+
|
82
133
|
def do_start!
|
134
|
+
setup!
|
135
|
+
|
83
136
|
Bundler.with_clean_env do
|
84
137
|
with_rails_env do
|
85
|
-
setup_directories!
|
86
|
-
|
87
|
-
in_rails_root_parent do
|
88
|
-
splat_bootstrap_gemfile!
|
89
|
-
rails_new!
|
90
|
-
update_gemfile!
|
91
|
-
end
|
92
|
-
|
93
138
|
in_rails_root do
|
94
|
-
run_bundle_install!(:primary)
|
95
|
-
splat_template_files!
|
96
139
|
start_server!
|
97
|
-
|
140
|
+
verify_server_and_shut_down_if_fails!
|
98
141
|
end
|
99
142
|
end
|
100
143
|
end
|
@@ -174,6 +217,7 @@ EOS
|
|
174
217
|
gemfile_contents << "\ngem 'execjs', '~> 2.0.0'\n" if RUBY_VERSION =~ /^1\.8\./
|
175
218
|
|
176
219
|
gemfile_contents << additional_gemfile_lines.join("\n")
|
220
|
+
gemfile_contents << "\n"
|
177
221
|
|
178
222
|
File.open(gemfile, 'w') { |f| f << gemfile_contents }
|
179
223
|
end
|
@@ -218,8 +262,12 @@ EOS
|
|
218
262
|
end
|
219
263
|
end
|
220
264
|
|
265
|
+
def server_output_file
|
266
|
+
@server_output_file ||= File.join(rails_root, 'log', 'rails-server.out')
|
267
|
+
end
|
268
|
+
|
221
269
|
def start_server!
|
222
|
-
output =
|
270
|
+
output = server_output_file
|
223
271
|
cmd = "rails server -p #{port} > '#{output}' 2>&1"
|
224
272
|
safe_system(cmd, "starting 'rails server' on port #{port}", :background => true)
|
225
273
|
|
@@ -238,8 +286,58 @@ EOS
|
|
238
286
|
end
|
239
287
|
end
|
240
288
|
|
289
|
+
def verify_server_and_shut_down_if_fails!
|
290
|
+
begin
|
291
|
+
verify_server!
|
292
|
+
rescue Exception => e
|
293
|
+
begin
|
294
|
+
stop_server!
|
295
|
+
rescue Exception => e
|
296
|
+
say "WARNING: Verification of server failed, so we tried to stop it, but we couldn't do that. Proceeding, but you may have a Rails server left around anyway..."
|
297
|
+
end
|
298
|
+
|
299
|
+
raise
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
class FailedStartupError < StandardError
|
304
|
+
attr_reader :timeout, :verify_exception, :server_logfile, :last_lines
|
305
|
+
|
306
|
+
def initialize(timeout, verify_exception, server_logfile, last_lines)
|
307
|
+
message = %{The out-of-process Rails server failed to start up properly and start responding to requests,
|
308
|
+
even after #{timeout.round} seconds. This typically means you've added code that prevents it from
|
309
|
+
even starting up -- most likely, a syntax error in a class or other error that stops it
|
310
|
+
dead in its tracks. (oop_rails_server starts up Rails servers in the production environment
|
311
|
+
by default, and, in production, Rails eagerly loads all classes at startup time.)}
|
312
|
+
|
313
|
+
if server_logfile
|
314
|
+
message << %{
|
315
|
+
|
316
|
+
Any errors will be located in the stdout/stderr of the Rails process, which is at:
|
317
|
+
'#{server_logfile}'}
|
318
|
+
end
|
319
|
+
|
320
|
+
if last_lines
|
321
|
+
message << %{
|
322
|
+
|
323
|
+
The last #{last_lines.length} lines of this log are:
|
324
|
+
|
325
|
+
#{last_lines.join("\n")}}
|
326
|
+
end
|
327
|
+
|
328
|
+
super(message)
|
329
|
+
|
330
|
+
@timeout = timeout
|
331
|
+
@verify_exception = verify_exception
|
332
|
+
@server_logfile = server_logfile
|
333
|
+
@last_lines = last_lines
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
SERVER_VERIFY_TIMEOUT = 5
|
338
|
+
|
241
339
|
def verify_server!
|
242
|
-
server_verify_url = "http
|
340
|
+
server_verify_url = "http://#{localhost_name}:#{port}/working/rails_is_working"
|
243
341
|
uri = URI.parse(server_verify_url)
|
244
342
|
|
245
343
|
data = nil
|
@@ -247,8 +345,24 @@ EOS
|
|
247
345
|
while (! data)
|
248
346
|
begin
|
249
347
|
data = Net::HTTP.get_response(uri)
|
250
|
-
rescue Errno::ECONNREFUSED, EOFError
|
251
|
-
|
348
|
+
rescue Errno::ECONNREFUSED, EOFError => e
|
349
|
+
if Time.now > (start_time + SERVER_VERIFY_TIMEOUT)
|
350
|
+
last_lines = server_logfile = nil
|
351
|
+
if File.exist?(server_output_file) && File.readable?(server_output_file)
|
352
|
+
server_logfile = server_output_file
|
353
|
+
File::Tail::Logfile.open(server_output_file, :break_if_eof => true) do |f|
|
354
|
+
f.extend(File::Tail)
|
355
|
+
last_lines ||= [ ]
|
356
|
+
begin
|
357
|
+
f.tail(100) { |l| last_lines << l }
|
358
|
+
rescue File::Tail::BreakException
|
359
|
+
# ok
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
raise FailedStartupError.new(Time.now - start_time, e, server_logfile, last_lines)
|
365
|
+
end
|
252
366
|
# keep waiting
|
253
367
|
sleep 0.1
|
254
368
|
end
|
@@ -259,17 +373,22 @@ EOS
|
|
259
373
|
end
|
260
374
|
result = data.body.strip
|
261
375
|
|
262
|
-
unless result =~ /^Rails\s+version\s*:\s*(\d+\.\d+\.\d+)\n
|
376
|
+
unless result =~ /^Rails\s+version\s*:\s*(\d+\.\d+\.\d+)\s*\n+\s*Ruby\s+version\s*:\s*(\d+\..*?)\s*\n+\s*Ruby\s+engine:\s*(.*?)\s*\n?$/mi
|
263
377
|
raise "'#{server_verify_url}' returned: #{result.inspect}"
|
264
378
|
end
|
265
379
|
actual_version = $1
|
266
380
|
ruby_version = $2
|
381
|
+
ruby_engine = $3
|
267
382
|
|
268
383
|
if rails_version != :default && (actual_version != rails_version)
|
269
384
|
raise "We seem to have spawned the wrong version of Rails; wanted: #{rails_version.inspect} but got: #{actual_version.inspect}"
|
270
385
|
end
|
271
386
|
|
272
|
-
|
387
|
+
@actual_rails_version = actual_version
|
388
|
+
@actual_ruby_version = ruby_version
|
389
|
+
@actual_ruby_engine = ruby_engine
|
390
|
+
|
391
|
+
say "Successfully spawned a server running Rails #{actual_version} (Ruby #{ruby_version}, engine #{ruby_engine.inspect}) on port #{port}."
|
273
392
|
end
|
274
393
|
|
275
394
|
def is_alive?(pid)
|
@@ -379,12 +498,14 @@ and output:
|
|
379
498
|
end
|
380
499
|
|
381
500
|
def say(s, newline = true)
|
382
|
-
if
|
383
|
-
|
384
|
-
|
385
|
-
|
501
|
+
if @verbose
|
502
|
+
if newline
|
503
|
+
@log.puts s
|
504
|
+
else
|
505
|
+
@log << s
|
506
|
+
end
|
507
|
+
@log.flush
|
386
508
|
end
|
387
|
-
$stdout.flush
|
388
509
|
end
|
389
510
|
|
390
511
|
def safe_system(cmd, notice = nil, options = { })
|
data/oop_rails_server.gemspec
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class WorkingController < ApplicationController
|
2
2
|
def rails_is_working
|
3
|
-
render :text => "Rails version: #{Rails.version}\nRuby version: #{RUBY_VERSION}"
|
3
|
+
render :text => "Rails version: #{Rails.version}\nRuby version: #{RUBY_VERSION}\nRuby engine: #{RUBY_ENGINE}\n"
|
4
4
|
end
|
5
5
|
end
|
metadata
CHANGED
@@ -1,58 +1,79 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: oop_rails_server
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Andrew Geweke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2015-04-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
15
14
|
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
16
21
|
prerelease: false
|
17
|
-
|
18
|
-
requirements:
|
19
|
-
-
|
20
|
-
-
|
21
|
-
|
22
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: file-tail
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
23
34
|
type: :runtime
|
24
|
-
version_requirements: *id001
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: bundler
|
27
35
|
prerelease: false
|
28
|
-
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.6'
|
33
48
|
type: :development
|
34
|
-
version_requirements: *id002
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: rake
|
37
49
|
prerelease: false
|
38
|
-
|
39
|
-
requirements:
|
40
|
-
- - ~>
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.6'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10.0'
|
43
62
|
type: :development
|
44
|
-
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '10.0'
|
45
69
|
description:
|
46
|
-
email:
|
70
|
+
email:
|
47
71
|
- andrew@geweke.org
|
48
72
|
executables: []
|
49
|
-
|
50
73
|
extensions: []
|
51
|
-
|
52
74
|
extra_rdoc_files: []
|
53
|
-
|
54
|
-
|
55
|
-
- .gitignore
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
56
77
|
- CHANGES.md
|
57
78
|
- Gemfile
|
58
79
|
- LICENSE.txt
|
@@ -69,27 +90,28 @@ files:
|
|
69
90
|
- templates/oop_rails_server_base/config/routes.rb
|
70
91
|
- templates/oop_rails_server_base/config/secrets.yml
|
71
92
|
homepage: https://github.com/ageweke/oop_rails_server
|
72
|
-
licenses:
|
93
|
+
licenses:
|
73
94
|
- MIT
|
74
95
|
metadata: {}
|
75
|
-
|
76
96
|
post_install_message:
|
77
97
|
rdoc_options: []
|
78
|
-
|
79
|
-
require_paths:
|
98
|
+
require_paths:
|
80
99
|
- lib
|
81
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
-
requirements:
|
83
|
-
-
|
84
|
-
|
85
|
-
|
86
|
-
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
87
110
|
requirements: []
|
88
|
-
|
89
111
|
rubyforge_project:
|
90
112
|
rubygems_version: 2.4.5
|
91
113
|
signing_key:
|
92
114
|
specification_version: 4
|
93
|
-
summary: Reliably runs a Rails server in a separate process, for use in tests, utilities,
|
115
|
+
summary: Reliably runs a Rails server in a separate process, for use in tests, utilities,
|
116
|
+
etc.
|
94
117
|
test_files: []
|
95
|
-
|