devserver 0.0.1
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/bin/devserver +24 -0
- data/devserver.gemspec +21 -0
- data/lib/devserver/cli.rb +167 -0
- data/lib/devserver/command_manager.rb +130 -0
- data/lib/devserver/version.rb +3 -0
- data/lib/devserver.rb +9 -0
- metadata +91 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/bin/devserver
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# devserver - devserver.outfielding.net
|
3
|
+
# Copyright 2010 Jason Adam Young
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
source_root = File.expand_path(File.dirname(__FILE__) + "/..")
|
18
|
+
$LOAD_PATH.unshift("#{source_root}/lib")
|
19
|
+
|
20
|
+
require 'rubygems' rescue nil
|
21
|
+
require 'devserver'
|
22
|
+
require 'devserver/cli'
|
23
|
+
Devserver::CLI.start
|
24
|
+
|
data/devserver.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "devserver/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "devserver"
|
7
|
+
s.version = Devserver::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Jason Adam Young"]
|
10
|
+
s.email = ["jay@outfielding.net"]
|
11
|
+
s.homepage = "http://devserver.outfielding.net"
|
12
|
+
s.summary = %q{Provides a wrapper around thin, similar to passenger standalone, for local ruby on rails development.}
|
13
|
+
s.description = %q{Provides a wrapper around thin, similar to passenger standalone, for local ruby on rails development.}
|
14
|
+
s.license = 'Apache-v2'
|
15
|
+
s.rubyforge_project = "devserver"
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.add_dependency('thor', '>= 0.14.6')
|
21
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Devserver
|
5
|
+
class CLI < Thor
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
# defaults
|
9
|
+
@@default_settings = {}
|
10
|
+
@@default_settings_source = {}
|
11
|
+
@@is_rails_dir = true
|
12
|
+
|
13
|
+
# sets defaults for the class
|
14
|
+
def self.set_defaults
|
15
|
+
if(!(@@app_root = self.determine_app_root))
|
16
|
+
@@is_rails_dir = false
|
17
|
+
@@default_settings[:app_root] = '.'
|
18
|
+
end
|
19
|
+
@@default_settings[:port] = 3000
|
20
|
+
@@default_settings[:environment] = 'development'
|
21
|
+
@@default_settings[:log_file] = "#{@@default_settings[:app_root]}/log/devserver.log"
|
22
|
+
@@default_settings[:pid_file] = "#{@@default_settings[:app_root]}/tmp/pids/devserver.pid"
|
23
|
+
@@default_settings[:mode] = 'start'
|
24
|
+
@@default_settings[:server] = 'thin'
|
25
|
+
self.load_defaults_from_yaml
|
26
|
+
end
|
27
|
+
|
28
|
+
# Pretend that we are checking for rails by checking for config/boot.rb
|
29
|
+
# we'll even do something smart for ourselves by chdir .. if ../config/boot.rb
|
30
|
+
# exists. "smart for ourselves" is the operative phrase
|
31
|
+
#
|
32
|
+
# @return [String] the current app root path if we think this is a rails dir, else nil
|
33
|
+
def self.determine_app_root
|
34
|
+
if(File.exist?('config/boot.rb'))
|
35
|
+
return Dir.pwd
|
36
|
+
elsif(File.exist?('../config/boot.rb'))
|
37
|
+
Dir.chdir('..')
|
38
|
+
return Dir.pwd
|
39
|
+
else
|
40
|
+
return nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Load defaults from a devserver.yaml file located in config/
|
45
|
+
def self.load_defaults_from_yaml
|
46
|
+
configfile ="#{@@default_settings[:app_root]}/config/devserver.yml"
|
47
|
+
if File.exists?(configfile) then
|
48
|
+
@@default_settings[:configfile] = configfile
|
49
|
+
temp = YAML.load_file(configfile)
|
50
|
+
if temp.class == Hash
|
51
|
+
temp.each do |key,value|
|
52
|
+
@@default_settings[key.to_sym] = value
|
53
|
+
@@default_settings_source[key.to_sym] = configfile
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# set defaults on class load
|
60
|
+
self.set_defaults
|
61
|
+
|
62
|
+
# these are not the tasks that you seek
|
63
|
+
no_tasks do
|
64
|
+
# prints out a warning message if current dir does not appear to be a rails dir
|
65
|
+
def rails_warning
|
66
|
+
if(!@@is_rails_dir)
|
67
|
+
puts "WARNING: #{Dir.pwd} does not appear to be a rails application directory"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# exits with error if current dir does not appear to be a rails dir
|
72
|
+
def rails_error
|
73
|
+
if(!@@is_rails_dir)
|
74
|
+
puts "ERROR: #{Dir.pwd} does not appear to be a rails application directory"
|
75
|
+
exit(1)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def print_defaults
|
80
|
+
puts "default_settings:\n"
|
81
|
+
config_keys = @@default_settings.keys.map{|k|k.to_s}
|
82
|
+
config_keys.sort.each do |key|
|
83
|
+
puts " #{key} => #{@@default_settings[key.to_sym]} (#{@@default_settings_source[key.to_sym] || 'code'})\n"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
desc "about", "about devserver"
|
90
|
+
def about
|
91
|
+
rails_warning
|
92
|
+
puts "Devserver Version #{VERSION}: Provides a wrapper around passenger, thin or mongrel for local ruby on rails development."
|
93
|
+
end
|
94
|
+
|
95
|
+
desc "defaults", "devserver configuration defaults"
|
96
|
+
def defaults
|
97
|
+
rails_warning
|
98
|
+
print_defaults
|
99
|
+
end
|
100
|
+
|
101
|
+
desc "start", "start devserver"
|
102
|
+
method_option :environment,:default => @@default_settings[:environment], :aliases => "-e", :desc => "Rails environment to start"
|
103
|
+
method_option :pid_file,:default => @@default_settings[:pid_file], :aliases => "-P", :desc => "Web server pid file"
|
104
|
+
method_option :log_file,:default => @@default_settings[:log_file], :aliases => "-l", :desc => "Web server log file"
|
105
|
+
method_option :port,:default => @@default_settings[:port], :aliases => "-p", :desc => "Run the web server on this port"
|
106
|
+
method_option :server,:default => @@default_settings[:server], :aliases => "-s", :desc => "Web server to use (e.g. passenger, thin, mongrel)"
|
107
|
+
def start
|
108
|
+
rails_error
|
109
|
+
the_server = Devserver::CommandManager.new(options)
|
110
|
+
if(the_server.is_port_open?)
|
111
|
+
puts "Another process is running on Port: #{the_server.port}"
|
112
|
+
puts "Running stop command: #{the_server.command(stop)}"
|
113
|
+
the_server.stop_devserver
|
114
|
+
end
|
115
|
+
the_server.start_devserver
|
116
|
+
end
|
117
|
+
|
118
|
+
desc "debug", "start devserver in debug mode"
|
119
|
+
method_option :environment,:default => @@default_settings[:environment], :aliases => "-e", :desc => "Rails environment to start"
|
120
|
+
method_option :pid_file,:default => @@default_settings[:pid_file], :aliases => "-P", :desc => "Web server pid file"
|
121
|
+
method_option :log_file,:default => @@default_settings[:log_file], :aliases => "-l", :desc => "Web server log file"
|
122
|
+
method_option :port,:default => @@default_settings[:port], :aliases => "-p", :desc => "Run the web server on this port"
|
123
|
+
method_option :server,:default => @@default_settings[:server], :aliases => "-s", :desc => "Web server to use (e.g. passenger, thin, mongrel)"
|
124
|
+
def debug
|
125
|
+
rails_error
|
126
|
+
the_server = Devserver::CommandManager.new(options)
|
127
|
+
if(the_server.is_port_open?)
|
128
|
+
puts "Another process is running on Port: #{the_server.port}"
|
129
|
+
puts "Running stop command: #{the_server.command(stop)}"
|
130
|
+
the_server.stop_devserver
|
131
|
+
end
|
132
|
+
the_server.start_devserver('debug')
|
133
|
+
end
|
134
|
+
|
135
|
+
desc "stop", "stop devserver"
|
136
|
+
method_option :pid_file,:default => @@default_settings[:pid_file], :aliases => "-P", :desc => "Web server pid file"
|
137
|
+
def stop
|
138
|
+
rails_error
|
139
|
+
the_server = Devserver::CommandManager.new(options)
|
140
|
+
the_server.stop_devserver
|
141
|
+
end
|
142
|
+
|
143
|
+
desc "command", "show devserver command"
|
144
|
+
method_option :environment,:default => @@default_settings[:environment], :aliases => "-e", :desc => "Rails environment to start"
|
145
|
+
method_option :pid_file,:default => @@default_settings[:pid_file], :aliases => "-P", :desc => "Web server pid file"
|
146
|
+
method_option :log_file,:default => @@default_settings[:log_file], :aliases => "-l", :desc => "Web server log file"
|
147
|
+
method_option :port,:default => @@default_settings[:port], :aliases => "-p", :desc => "Run the web server on this port"
|
148
|
+
method_option :server,:default => @@default_settings[:server], :aliases => "-s", :desc => "Web server to use (e.g. passenger, thin, mongrel)"
|
149
|
+
method_option :start,:default => true, :desc => "Show command used for server start"
|
150
|
+
method_option :stop,:default => true, :desc => "Show command used for server stop"
|
151
|
+
method_option :debug,:default => true, :desc => "Show command used for server start with debugging"
|
152
|
+
def command
|
153
|
+
rails_warning
|
154
|
+
the_server = Devserver::CommandManager.new(options)
|
155
|
+
if(options[:start])
|
156
|
+
puts "start command: #{the_server.command('start')}"
|
157
|
+
end
|
158
|
+
if(options[:stop])
|
159
|
+
puts "stop command: #{the_server.command('stop')}"
|
160
|
+
end
|
161
|
+
if(options[:debug])
|
162
|
+
puts "debug command: #{the_server.command('debug')}"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
module Devserver
|
5
|
+
class CommandManager
|
6
|
+
attr_accessor :port, :environment, :log_file, :pid_file, :mode, :server
|
7
|
+
|
8
|
+
# raises DevserverError if it doesn't appear we are in or one level down of a rails directory
|
9
|
+
#
|
10
|
+
def initialize(options = {})
|
11
|
+
options.keys.each do |key|
|
12
|
+
self.instance_variable_set("@#{key.to_s}",options[key])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Pretend that we are checking for rails by checking for config/boot.rb
|
17
|
+
# we'll even do something smart for ourselves by chdir .. if ../config/boot.rb
|
18
|
+
# exists. "smart for ourselves" is the operative phrase
|
19
|
+
#
|
20
|
+
# @return [String] the current app root path if we think this is a rails dir, else nil
|
21
|
+
def determine_app_root
|
22
|
+
if(File.exist?('config/boot.rb'))
|
23
|
+
return Dir.pwd
|
24
|
+
elsif(File.exist?('../config/boot.rb'))
|
25
|
+
Dir.chdir('..')
|
26
|
+
return Dir.pwd
|
27
|
+
else
|
28
|
+
return nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# builds the command options with regard to the specified server
|
33
|
+
#
|
34
|
+
# @param [Boolean] mode mode to start in, either debug or start
|
35
|
+
# @return [String] command options
|
36
|
+
def start_options(mode = self.mode)
|
37
|
+
common_options = "--port #{self.port} --environment #{self.environment}"
|
38
|
+
if(mode == 'debug')
|
39
|
+
common_options += " --debug"
|
40
|
+
end
|
41
|
+
case self.server
|
42
|
+
when 'passenger'
|
43
|
+
"#{common_options} --log-file #{self.log_file} --pid-file #{self.pid_file}"
|
44
|
+
when 'thin'
|
45
|
+
"#{common_options} --log #{self.log_file} --pid #{self.pid_file}"
|
46
|
+
when 'mongrel'
|
47
|
+
"#{common_options} --log #{self.log_file} --pid #{self.pid_file}"
|
48
|
+
else
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# builds the start command for @server
|
54
|
+
#
|
55
|
+
# @param [Boolean] mode mode to start in, either debug or start
|
56
|
+
# @return [String] start command
|
57
|
+
def start_command(mode = self.mode)
|
58
|
+
case self.server
|
59
|
+
when 'passenger'
|
60
|
+
"passenger start #{self.start_options(mode)}"
|
61
|
+
when 'thin'
|
62
|
+
"thin #{self.start_options(mode)} start"
|
63
|
+
when 'mongrel'
|
64
|
+
"mongrel_rails start #{self.start_options(mode)}"
|
65
|
+
else
|
66
|
+
raise DevserverError, "Unrecognized web server: #{self.server}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# builds the stop command for @server
|
71
|
+
#
|
72
|
+
# @return [String] stop command
|
73
|
+
def stop_command
|
74
|
+
case self.server
|
75
|
+
when 'passenger'
|
76
|
+
"passenger stop --pid-file #{self.pid_file}"
|
77
|
+
when 'thin'
|
78
|
+
"thin --pid #{self.pid_file} stop"
|
79
|
+
when 'mongrel'
|
80
|
+
"mongrel_rails stop --pid #{self.pid_file}"
|
81
|
+
else
|
82
|
+
raise DevserverError, "Unrecognized web server: #{self.server}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# returns command for @server and @mode (start, stop, debug)
|
87
|
+
#
|
88
|
+
# @return [String] command for @server and @mode
|
89
|
+
def command(mode = self.mode)
|
90
|
+
case mode
|
91
|
+
when 'start'
|
92
|
+
self.start_command(mode)
|
93
|
+
when 'debug'
|
94
|
+
self.start_command(mode)
|
95
|
+
when 'stop'
|
96
|
+
self.stop_command
|
97
|
+
else
|
98
|
+
raise DevserverError, "Unrecognized mode: #{mode}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# check to see if anything is still running on @port
|
103
|
+
#
|
104
|
+
# @return [Boolean] whether port responds or not
|
105
|
+
def is_port_open?
|
106
|
+
begin
|
107
|
+
Timeout::timeout(1) do
|
108
|
+
begin
|
109
|
+
s = TCPSocket.new('127.0.0.1', self.port)
|
110
|
+
s.close
|
111
|
+
return true
|
112
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
113
|
+
return false
|
114
|
+
end
|
115
|
+
end
|
116
|
+
rescue Timeout::Error
|
117
|
+
end
|
118
|
+
return false
|
119
|
+
end
|
120
|
+
|
121
|
+
def start_devserver(mode = self.mode)
|
122
|
+
system("#{self.start_command(mode)}")
|
123
|
+
end
|
124
|
+
|
125
|
+
def stop_devserver
|
126
|
+
system("#{self.stop_command}")
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
data/lib/devserver.rb
ADDED
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devserver
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jason Adam Young
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-07 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: thor
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 43
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 14
|
33
|
+
- 6
|
34
|
+
version: 0.14.6
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
description: Provides a wrapper around thin, similar to passenger standalone, for local ruby on rails development.
|
38
|
+
email:
|
39
|
+
- jay@outfielding.net
|
40
|
+
executables:
|
41
|
+
- devserver
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files: []
|
45
|
+
|
46
|
+
files:
|
47
|
+
- .gitignore
|
48
|
+
- Gemfile
|
49
|
+
- Rakefile
|
50
|
+
- bin/devserver
|
51
|
+
- devserver.gemspec
|
52
|
+
- lib/devserver.rb
|
53
|
+
- lib/devserver/cli.rb
|
54
|
+
- lib/devserver/command_manager.rb
|
55
|
+
- lib/devserver/version.rb
|
56
|
+
has_rdoc: true
|
57
|
+
homepage: http://devserver.outfielding.net
|
58
|
+
licenses:
|
59
|
+
- Apache-v2
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 3
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
requirements: []
|
84
|
+
|
85
|
+
rubyforge_project: devserver
|
86
|
+
rubygems_version: 1.3.7
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Provides a wrapper around thin, similar to passenger standalone, for local ruby on rails development.
|
90
|
+
test_files: []
|
91
|
+
|