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 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
+