devserver 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ Gemfile.lock
2
+ pkg/*
3
+ *.gem
4
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in devserver.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
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
@@ -0,0 +1,3 @@
1
+ module Devserver
2
+ VERSION = "0.0.1"
3
+ end
data/lib/devserver.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'devserver/version'
2
+
3
+ module Devserver
4
+ autoload :CommandManager, 'devserver/command_manager'
5
+
6
+ class DevserverError < StandardError
7
+ end
8
+
9
+ end
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
+