vegas 0.0.4.1 → 0.1.0
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/History.txt +10 -0
- data/README.rdoc +1 -1
- data/lib/vegas.rb +3 -3
- data/lib/vegas/runner.rb +87 -67
- data/test/test_app/test_app.rb +1 -1
- data/test/test_apps.rb +7 -3
- data/test/test_helper.rb +20 -28
- data/test/test_vegas_runner.rb +97 -2
- metadata +9 -19
data/History.txt
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
== 0.1.0 2009-08-30
|
2
|
+
|
3
|
+
* New:
|
4
|
+
* options[:start] = false will keep the app from actually starting (useful for defining your own start/stop commands)
|
5
|
+
* options[:launch_path] Takes a string or an object that responds to call (proc/lambda) that gets the runner as its only argument. This allows you to easily manipulate options or args to launch the app to a specific path. See latest gembox for example.
|
6
|
+
* Changed:
|
7
|
+
* Sinatra is no longer a dependency! Vegas can now run pure Rack apps.
|
8
|
+
* All methods for starting an app are grouped into Runner#start
|
9
|
+
* launch! and start both take an optional path string to launch the app to.
|
10
|
+
|
1
11
|
== 0.0.4 2009-08-09
|
2
12
|
|
3
13
|
* new -L (--skip-launch) option doesn't launch the web browser (thanks bmabey!)
|
data/README.rdoc
CHANGED
@@ -8,7 +8,7 @@ Vegas aims to solve the simple problem of creating executable versions of Sinatr
|
|
8
8
|
|
9
9
|
== FEATURES/PROBLEMS:
|
10
10
|
|
11
|
-
Currently, Vegas just includes a single class Vegas::Runner which wraps your Sinatra app to give it command line options,
|
11
|
+
Currently, Vegas just includes a single class Vegas::Runner which wraps your Sinatra app to give it command line options, daemon-ization, PID/URL tracking, and browser launching.
|
12
12
|
|
13
13
|
Lets say you have a gem with a sinatra application. With Vegas you can create a bin that looks like
|
14
14
|
|
data/lib/vegas.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
begin
|
2
|
-
require '
|
2
|
+
require 'rack'
|
3
3
|
rescue LoadError
|
4
4
|
require 'rubygems'
|
5
|
-
require '
|
5
|
+
require 'rack'
|
6
6
|
end
|
7
7
|
|
8
8
|
$LOAD_PATH.unshift File.dirname(__FILE__)
|
9
9
|
|
10
10
|
module Vegas
|
11
|
-
VERSION = "0.0
|
11
|
+
VERSION = "0.1.0"
|
12
12
|
WINDOWS = !!(RUBY_PLATFORM =~ /(mingw|bccwin|wince|mswin32)/i)
|
13
13
|
|
14
14
|
autoload :Runner, 'vegas/runner'
|
data/lib/vegas/runner.rb
CHANGED
@@ -12,73 +12,82 @@ end
|
|
12
12
|
|
13
13
|
module Vegas
|
14
14
|
class Runner
|
15
|
-
attr_reader :app, :app_name, :rack_handler, :port, :host, :options
|
16
|
-
|
15
|
+
attr_reader :app, :app_name, :rack_handler, :port, :host, :options, :args
|
16
|
+
|
17
17
|
ROOT_DIR = File.expand_path(File.join('~', '.vegas'))
|
18
18
|
PORT = 5678
|
19
19
|
HOST = WINDOWS ? 'localhost' : '0.0.0.0'
|
20
|
-
|
21
|
-
def initialize(app, app_name, set_options = {}, &block)
|
20
|
+
|
21
|
+
def initialize(app, app_name, set_options = {}, runtime_args = ARGV, &block)
|
22
22
|
# initialize
|
23
|
-
@app
|
24
|
-
@app_name
|
25
|
-
@options
|
26
|
-
@
|
23
|
+
@app = app
|
24
|
+
@app_name = app_name
|
25
|
+
@options = set_options || {}
|
26
|
+
@runtime_args = runtime_args
|
27
|
+
self.class.logger.level = options[:debug] ? Logger::DEBUG : Logger::INFO
|
28
|
+
|
29
|
+
@rack_handler = @app.respond_to?(:detect_rack_handler) ?
|
30
|
+
@app.send(:detect_rack_handler) : Rack::Handler.get('thin')
|
27
31
|
# load options from opt parser
|
28
|
-
define_options do |opts|
|
32
|
+
@args = define_options do |opts|
|
29
33
|
if block_given?
|
30
34
|
opts.separator ''
|
31
35
|
opts.separator "#{app_name} options:"
|
32
|
-
yield(opts, app)
|
36
|
+
yield(self, opts, app)
|
33
37
|
end
|
34
38
|
end
|
39
|
+
|
35
40
|
# set app options
|
36
41
|
@host = options[:host] || HOST
|
37
|
-
@app.set
|
42
|
+
@app.set(options) if @app.respond_to?(:set)
|
38
43
|
# initialize app dir
|
39
44
|
FileUtils.mkdir_p(app_dir)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
write_url
|
47
|
-
|
48
|
-
begin
|
49
|
-
launch!
|
50
|
-
daemonize! unless options[:foreground]
|
51
|
-
run!
|
52
|
-
rescue RuntimeError => e
|
53
|
-
logger.warn "There was an error starting #{app_name}: #{e}"
|
54
|
-
exit
|
45
|
+
return if options[:start] === false
|
46
|
+
# evaluate the launch_path
|
47
|
+
path = if options[:launch_path] && options[:launch_path].respond_to?(:call)
|
48
|
+
options[:launch_path].call(self)
|
49
|
+
else
|
50
|
+
options[:launch_path]
|
55
51
|
end
|
52
|
+
start(path)
|
56
53
|
end
|
57
|
-
|
54
|
+
|
58
55
|
def app_dir
|
59
56
|
File.join(ROOT_DIR, app_name)
|
60
57
|
end
|
61
|
-
|
58
|
+
|
62
59
|
def pid_file
|
63
60
|
File.join(app_dir, "#{app_name}.pid")
|
64
61
|
end
|
65
|
-
|
62
|
+
|
66
63
|
def url_file
|
67
64
|
File.join(app_dir, "#{app_name}.url")
|
68
65
|
end
|
69
|
-
|
66
|
+
|
70
67
|
def url
|
71
68
|
"http://#{host}:#{port}"
|
72
69
|
end
|
73
|
-
|
70
|
+
|
74
71
|
def log_file
|
75
72
|
File.join(app_dir, "#{app_name}.log")
|
76
73
|
end
|
77
|
-
|
78
|
-
def
|
79
|
-
|
74
|
+
|
75
|
+
def start(path = nil)
|
76
|
+
logger.info "Running with Windows Settings" if WINDOWS
|
77
|
+
logger.info "Starting #{app_name}"
|
78
|
+
begin
|
79
|
+
check_for_running(path)
|
80
|
+
find_port
|
81
|
+
write_url
|
82
|
+
launch!(url, path)
|
83
|
+
daemonize! unless options[:foreground]
|
84
|
+
run!
|
85
|
+
rescue RuntimeError => e
|
86
|
+
logger.warn "There was an error starting #{app_name}: #{e}"
|
87
|
+
exit
|
88
|
+
end
|
80
89
|
end
|
81
|
-
|
90
|
+
|
82
91
|
def find_port
|
83
92
|
if @port = options[:port]
|
84
93
|
if !port_open?
|
@@ -93,7 +102,7 @@ module Vegas
|
|
93
102
|
end
|
94
103
|
end
|
95
104
|
end
|
96
|
-
|
105
|
+
|
97
106
|
def port_open?(check_url = nil)
|
98
107
|
begin
|
99
108
|
open(check_url || url)
|
@@ -102,22 +111,22 @@ module Vegas
|
|
102
111
|
true
|
103
112
|
end
|
104
113
|
end
|
105
|
-
|
114
|
+
|
106
115
|
def write_url
|
107
116
|
File.open(url_file, 'w') {|f| f << url }
|
108
117
|
end
|
109
|
-
|
110
|
-
def check_for_running
|
118
|
+
|
119
|
+
def check_for_running(path = nil)
|
111
120
|
if File.exists?(pid_file) && File.exists?(url_file)
|
112
121
|
running_url = File.read(url_file)
|
113
122
|
if !port_open?(running_url)
|
114
123
|
logger.warn "#{app_name} is already running at #{running_url}"
|
115
|
-
launch!(running_url)
|
124
|
+
launch!(running_url, path)
|
116
125
|
exit!
|
117
126
|
end
|
118
127
|
end
|
119
128
|
end
|
120
|
-
|
129
|
+
|
121
130
|
def run!
|
122
131
|
rack_handler.run app, :Host => host, :Port => port do |server|
|
123
132
|
trap(kill_command) do
|
@@ -128,7 +137,7 @@ module Vegas
|
|
128
137
|
end
|
129
138
|
end
|
130
139
|
end
|
131
|
-
|
140
|
+
|
132
141
|
# Adapted from Rackup
|
133
142
|
def daemonize!
|
134
143
|
if RUBY_VERSION < "1.9"
|
@@ -149,13 +158,13 @@ module Vegas
|
|
149
158
|
File.open(pid_file, 'w') {|f| f.write("#{Process.pid}") }
|
150
159
|
at_exit { delete_pid! }
|
151
160
|
end
|
152
|
-
|
153
|
-
def launch!(specific_url = nil)
|
161
|
+
|
162
|
+
def launch!(specific_url = nil, path = nil)
|
154
163
|
return if options[:skip_launch]
|
155
|
-
cmd = WINDOWS ? "start" : "
|
156
|
-
system "#{cmd} #{specific_url || url}"
|
164
|
+
cmd = WINDOWS ? "start" : "open"
|
165
|
+
system "#{cmd} #{specific_url || url}#{path}"
|
157
166
|
end
|
158
|
-
|
167
|
+
|
159
168
|
def kill!
|
160
169
|
pid = File.read(pid_file)
|
161
170
|
logger.warn "Sending INT to #{pid.to_i}"
|
@@ -163,7 +172,7 @@ module Vegas
|
|
163
172
|
rescue => e
|
164
173
|
logger.warn "pid not found at #{pid_file} : #{e}"
|
165
174
|
end
|
166
|
-
|
175
|
+
|
167
176
|
def status
|
168
177
|
if File.exists?(pid_file)
|
169
178
|
logger.info "#{app_name} running"
|
@@ -174,26 +183,36 @@ module Vegas
|
|
174
183
|
end
|
175
184
|
end
|
176
185
|
|
177
|
-
def logger
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
186
|
+
def self.logger=(logger)
|
187
|
+
@logger = logger
|
188
|
+
end
|
189
|
+
|
190
|
+
def self.logger
|
191
|
+
@logger ||= LOGGER if defined?(LOGGER)
|
192
|
+
if !@logger
|
193
|
+
@logger = Logger.new(STDOUT)
|
194
|
+
@logger.formatter = Proc.new {|s, t, n, msg| "[#{t}] #{msg}\n"}
|
195
|
+
@logger
|
196
|
+
end
|
182
197
|
@logger
|
183
198
|
end
|
184
|
-
|
199
|
+
|
200
|
+
def logger
|
201
|
+
self.class.logger
|
202
|
+
end
|
203
|
+
|
185
204
|
private
|
186
205
|
def define_options
|
187
|
-
OptionParser.new("", 24, ' ')
|
206
|
+
OptionParser.new("", 24, ' ') do |opts|
|
188
207
|
opts.banner = "Usage: #{app_name} [options]"
|
189
208
|
|
190
209
|
opts.separator ""
|
191
210
|
opts.separator "Vegas options:"
|
192
|
-
|
193
|
-
opts.on("-s", "--server SERVER", "serve using SERVER (
|
211
|
+
|
212
|
+
opts.on("-s", "--server SERVER", "serve using SERVER (thin/mongrel/webrick)") { |s|
|
194
213
|
@rack_handler = Rack::Handler.get(s)
|
195
214
|
}
|
196
|
-
|
215
|
+
|
197
216
|
opts.on("-o", "--host HOST", "listen on HOST (default: #{HOST})") { |host|
|
198
217
|
@options[:host] = host
|
199
218
|
}
|
@@ -218,18 +237,18 @@ module Vegas
|
|
218
237
|
kill!
|
219
238
|
exit
|
220
239
|
}
|
221
|
-
|
240
|
+
|
222
241
|
opts.on('-S', "--status", "display the current running PID and URL then quit") {|s|
|
223
242
|
status
|
224
243
|
exit!
|
225
244
|
}
|
226
|
-
|
245
|
+
|
227
246
|
opts.on('-d', "--debug", "raise the log level to :debug (default: :info)") {|s|
|
228
247
|
@options[:debug] = true
|
229
248
|
}
|
230
|
-
|
249
|
+
|
231
250
|
yield opts if block_given?
|
232
|
-
|
251
|
+
|
233
252
|
opts.separator ""
|
234
253
|
opts.separator "Common options:"
|
235
254
|
|
@@ -242,24 +261,25 @@ module Vegas
|
|
242
261
|
if app.respond_to?(:version)
|
243
262
|
puts "#{app_name} #{app.version}"
|
244
263
|
end
|
245
|
-
puts "
|
264
|
+
puts "rack #{Rack::VERSION.join('.')}"
|
265
|
+
puts "sinatra #{Sinatra::VERSION}" if defined?(Sinatra)
|
246
266
|
puts "vegas #{Vegas::VERSION}"
|
247
267
|
exit
|
248
268
|
end
|
249
269
|
|
250
|
-
|
251
|
-
}
|
270
|
+
end.parse! @runtime_args
|
252
271
|
rescue OptionParser::MissingArgument => e
|
253
272
|
logger.warn "#{e}, run -h for options"
|
254
273
|
exit
|
255
274
|
end
|
256
|
-
|
275
|
+
|
257
276
|
def kill_command
|
258
277
|
WINDOWS ? 1 : :INT
|
259
278
|
end
|
260
|
-
|
279
|
+
|
261
280
|
def delete_pid!
|
262
281
|
File.delete(pid_file) if File.exist?(pid_file)
|
263
282
|
end
|
264
283
|
end
|
284
|
+
|
265
285
|
end
|
data/test/test_app/test_app.rb
CHANGED
data/test/test_apps.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
class TestApp1 < Sinatra::
|
1
|
+
class TestApp1 < Sinatra::Base
|
2
2
|
|
3
3
|
get '/' do
|
4
4
|
'TestApp1 Index'
|
@@ -10,7 +10,7 @@ class TestApp1 < Sinatra::Default
|
|
10
10
|
end
|
11
11
|
|
12
12
|
|
13
|
-
class TestApp2 < Sinatra::
|
13
|
+
class TestApp2 < Sinatra::Base
|
14
14
|
|
15
15
|
get '/' do
|
16
16
|
'TestApp2 Index'
|
@@ -19,4 +19,8 @@ class TestApp2 < Sinatra::Default
|
|
19
19
|
get '/route' do
|
20
20
|
'TestApp2 route'
|
21
21
|
end
|
22
|
-
end
|
22
|
+
end
|
23
|
+
|
24
|
+
RackApp1 = Proc.new {|env|
|
25
|
+
[200, {'Content-Type' => 'text/plain'}, ["This is an app. #{env.inspect}"]]
|
26
|
+
}
|
data/test/test_helper.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
dependencies = %w{
|
2
2
|
bacon
|
3
|
+
mocha/standalone
|
4
|
+
mocha/object
|
3
5
|
sinatra
|
4
|
-
rack/test
|
5
|
-
nokogiri
|
6
6
|
}
|
7
7
|
|
8
8
|
begin
|
@@ -13,10 +13,15 @@ rescue LoadError
|
|
13
13
|
end
|
14
14
|
|
15
15
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'vegas.rb')
|
16
|
+
require File.join(File.dirname(__FILE__), 'test_apps.rb')
|
17
|
+
|
16
18
|
|
17
19
|
module TestHelper
|
18
|
-
|
19
|
-
|
20
|
+
|
21
|
+
def vegas(*args, &block)
|
22
|
+
Vegas::Runner.any_instance.stubs(:daemonize!).once
|
23
|
+
Rack::Handler::Thin.stubs(:run).once
|
24
|
+
@vegas = Vegas::Runner.new(*args, &block)
|
20
25
|
end
|
21
26
|
|
22
27
|
def body
|
@@ -26,6 +31,16 @@ module TestHelper
|
|
26
31
|
def instance_of(klass)
|
27
32
|
lambda {|obj| obj.is_a?(klass) }
|
28
33
|
end
|
34
|
+
|
35
|
+
def exist_as_file
|
36
|
+
lambda {|obj| File.exist?(obj) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def have_matching_file_content(content_regex)
|
40
|
+
lambda {|obj|
|
41
|
+
File.exist?(obj) && File.read(obj).match(content_regex)
|
42
|
+
}
|
43
|
+
end
|
29
44
|
|
30
45
|
def html_body
|
31
46
|
body =~ /^\<html/ ? body : "<html><body>#{body}</body></html>"
|
@@ -33,27 +48,4 @@ module TestHelper
|
|
33
48
|
|
34
49
|
end
|
35
50
|
|
36
|
-
Bacon::Context.send(:include, TestHelper)
|
37
|
-
|
38
|
-
class Should
|
39
|
-
|
40
|
-
def have_element(search, content = nil)
|
41
|
-
satisfy "have element matching #{search}" do
|
42
|
-
doc = Nokogiri.parse(@object.to_s)
|
43
|
-
node_set = doc.search(search)
|
44
|
-
if node_set.empty?
|
45
|
-
false
|
46
|
-
else
|
47
|
-
collected_content = node_set.collect {|t| t.content }.join(' ')
|
48
|
-
case content
|
49
|
-
when Regexp
|
50
|
-
collected_content =~ content
|
51
|
-
when String
|
52
|
-
collected_content.include?(content)
|
53
|
-
when nil
|
54
|
-
true
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
51
|
+
Bacon::Context.send(:include, TestHelper)
|
data/test/test_vegas_runner.rb
CHANGED
@@ -1,8 +1,103 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'test_helper.rb')
|
2
2
|
|
3
|
+
Vegas::Runner::ROOT_DIR = File.join(File.dirname(__FILE__), 'tmp', '.vegas')
|
4
|
+
|
3
5
|
describe 'Vegas::Runner' do
|
4
|
-
|
5
|
-
|
6
|
+
before do
|
7
|
+
FileUtils.rm_rf(File.join(File.dirname(__FILE__), 'tmp'))
|
8
|
+
@log = StringIO.new
|
9
|
+
Vegas::Runner.logger = Logger.new(@log)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.new' do
|
13
|
+
|
14
|
+
describe 'with basic usage' do
|
15
|
+
before do
|
16
|
+
Vegas::Runner.any_instance.expects(:system).once
|
17
|
+
vegas(TestApp1, 'vegas_test_app_1', {:sessions => true}, ["route","--debug"])
|
18
|
+
end
|
19
|
+
|
20
|
+
it "sets app" do
|
21
|
+
@vegas.app.should == TestApp1
|
22
|
+
end
|
23
|
+
|
24
|
+
it "sets app name" do
|
25
|
+
@vegas.app_name.should == 'vegas_test_app_1'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "stores options" do
|
29
|
+
@vegas.options[:sessions].should.be.true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "puts unparsed args into args" do
|
33
|
+
@vegas.args.should == ["route"]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "parses options into @options" do
|
37
|
+
@vegas.options[:debug].should.be.true
|
38
|
+
end
|
39
|
+
|
40
|
+
it "writes the app dir" do
|
41
|
+
@vegas.app_dir.should exist_as_file
|
42
|
+
end
|
43
|
+
|
44
|
+
it "writes a url with the port" do
|
45
|
+
@vegas.url_file.should have_matching_file_content(/0.0.0.0\:#{@vegas.port}/)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'with a sinatra app' do
|
50
|
+
before do
|
51
|
+
TestApp1.expects(:detect_rack_handler).returns(Rack::Handler::Mongrel)
|
52
|
+
Vegas::Runner.any_instance.expects(:system).once
|
53
|
+
Rack::Handler::Mongrel.stubs(:run)
|
54
|
+
vegas(TestApp1, 'vegas_test_app_1', {:skip_launch => true, :sessions => true}, ["route","--debug"])
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'sets the rack handler automaticaly' do
|
58
|
+
@vegas.rack_handler.should == Rack::Handler::Mongrel
|
59
|
+
end
|
60
|
+
|
61
|
+
it "sets options on the app" do
|
62
|
+
@vegas.app.sessions.should.be.true
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'with a simple rack app' do
|
68
|
+
before do
|
69
|
+
vegas(RackApp1, 'rack_app_1', {:skip_launch => true, :sessions => true})
|
70
|
+
end
|
71
|
+
|
72
|
+
it "sets default rack handler to thin" do
|
73
|
+
@vegas.rack_handler.should == Rack::Handler::Thin
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'with a launch path specified as a proc' do
|
78
|
+
it 'evaluates the proc in the context of the runner' do
|
79
|
+
Vegas::Runner.any_instance.expects(:system).once.with {|s| s =~ /\?search\=blah$/ }
|
80
|
+
vegas(TestApp2,
|
81
|
+
'vegas_test_app_2',
|
82
|
+
{:launch_path => Proc.new {|r| "?search=#{r.args.first}" }},
|
83
|
+
["--debug", "blah"])
|
84
|
+
@vegas.options[:launch_path].should.be instance_of(Proc)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'with a launch path specified as string' do
|
89
|
+
it 'launches to the specific path' do
|
90
|
+
Vegas::Runner.any_instance.expects(:system).once.with {|s| s =~ /\?search\=blah$/ }
|
91
|
+
vegas(TestApp2,
|
92
|
+
'vegas_test_app_2',
|
93
|
+
{:launch_path => "?search=blah"},
|
94
|
+
["--debug", "blah"])
|
95
|
+
@vegas.options[:launch_path].should == "?search=blah"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
end
|
6
101
|
|
7
102
|
end
|
8
103
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vegas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Quint
|
@@ -9,48 +9,38 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-08-
|
12
|
+
date: 2009-08-30 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: rack
|
17
17
|
type: :runtime
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
|
-
- - "
|
21
|
+
- - "="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0
|
23
|
+
version: "1.0"
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
type: :development
|
28
|
-
version_requirement:
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.5.1
|
34
|
-
version:
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: nokogiri
|
26
|
+
name: bacon
|
37
27
|
type: :development
|
38
28
|
version_requirement:
|
39
29
|
version_requirements: !ruby/object:Gem::Requirement
|
40
30
|
requirements:
|
41
31
|
- - ">="
|
42
32
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.0
|
33
|
+
version: 1.1.0
|
44
34
|
version:
|
45
35
|
- !ruby/object:Gem::Dependency
|
46
|
-
name:
|
36
|
+
name: mocha
|
47
37
|
type: :development
|
48
38
|
version_requirement:
|
49
39
|
version_requirements: !ruby/object:Gem::Requirement
|
50
40
|
requirements:
|
51
41
|
- - ">="
|
52
42
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
43
|
+
version: 0.9.7
|
54
44
|
version:
|
55
45
|
- !ruby/object:Gem::Dependency
|
56
46
|
name: hoe
|