fujin-mongrel_runit 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,184 @@
1
+ # Author:: Adam Jacob (<adam@hjksolutions.com>)
2
+ # Copyright:: Copyright (c) 2007 HJK Solutions, LLC
3
+ # License:: GNU General Public License version 2
4
+ #---
5
+ # This program is free software; you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License version 2
7
+ # as published by the Free Software Foundation.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License along
15
+ # with this program; if not, write to the Free Software Foundation, Inc.,
16
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
+ #+++
18
+
19
+ require 'yaml'
20
+ require 'optparse'
21
+ require 'mongrel_runit/base'
22
+
23
+ module MongrelRunit
24
+
25
+ # Takes a YAML config file and a list of command line arguments, and
26
+ # populates itself with the resulting combined configuration.
27
+ #
28
+ # Example:
29
+ #
30
+ # config = MongrelRunit::Config('monkey', '/etc/sv/monkey.yml', ARGV)
31
+ # puts config["application_name"] # monkey
32
+ #
33
+ class Config < Base
34
+ attr_accessor :config, :command, :verbose
35
+
36
+ # Takes an application name, a YAML file, and command line arguments
37
+ # and spits out a working configuration. The YAML file and arguments
38
+ # can optionally be nil.
39
+ #
40
+ # Unless otherwise specified, the following default values are
41
+ # set:
42
+ #
43
+ # environment: ENV["RAILS_ENV"] or development
44
+ # port: 3000
45
+ # servers: 2
46
+ # runit_svdir: /etc/sv
47
+ # runit_service_dir: /var/service
48
+ def initialize(appname, yamlfile, args)
49
+ @config = Hash.new
50
+ load_args(args) if args
51
+ load_yaml(yamlfile) if yamlfile
52
+ @config["environment"] ||= ENV["RAILS_ENV"] || 'development'
53
+ @config["port"] ||= "3000"
54
+ @config["servers"] ||= 2
55
+ @config["application_name"] ||= appname
56
+ @config["runit_svdir"] ||= '/etc/sv'
57
+ @config["runit_service_dir"] ||= '/var/service'
58
+ @config["address"] ||= '127.0.0.1'
59
+
60
+ raise ArgumentError, "Must supply an application_name!" unless @config["application_name"]
61
+
62
+ end
63
+
64
+ # Returns the value from the config hash.
65
+ def [](arg)
66
+ @config[arg]
67
+ end
68
+
69
+ # Load options from a config file alone
70
+ def Config.load_file(yamlfile)
71
+ MongrelRunit::Config.new(nil, yamlfile, nil)
72
+ end
73
+
74
+ # Load options from command line arguments alone
75
+ def Config.load_args(*args)
76
+ MongrelRunit::Config.new(nil, nil, *args)
77
+ end
78
+
79
+ private
80
+
81
+ def load_yaml(yamlfile)
82
+ @config = YAML.load_file(File.expand_path(yamlfile))
83
+ end
84
+
85
+ def load_from_path(path)
86
+ path.strip!
87
+ epath = File.expand_path(path)
88
+ @path = epath
89
+ mr_conf = File.expand_path(File.join(epath, "config", "mongrel_runit.yml"))
90
+ mc_conf = File.expand_path(File.join(epath, "config", "mongrel_cluster.yml"))
91
+ if File.file?(mr_conf)
92
+ load_yaml(mr_conf)
93
+ elsif File.file?(mc_conf)
94
+ load_yaml(mc_conf)
95
+ else
96
+ puts "#{path} must have a ./config/mongrel_runit.yml or ./config/mongrel_cluster.yml"
97
+ return nil
98
+ end
99
+ return true
100
+ end
101
+
102
+ def load_args(args)
103
+
104
+ loaded_config = nil
105
+
106
+ opts = OptionParser.new do |opts|
107
+ opts.banner = "Usage: #{$0} (options) (#{ALLOWEDCOMMANDS.join('|')})"
108
+
109
+ opts.on("-p PATH", "--path PATH", "Path to a Rails app to start") do |p|
110
+ loaded_config = load_from_path(p)
111
+ end
112
+
113
+ opts.on("-a NAME", "--application NAME", "The name of your Application. (Used for the service directories)") do |a|
114
+ @config["application_name"] = a
115
+ end
116
+
117
+ opts.on("-c FILE", "--config FILE", "A mongrel_runit.yml config file") do |c|
118
+ c.strip!
119
+ file = File.expand_path(c)
120
+ if File.file?(file)
121
+ load_yaml(file)
122
+ loaded_config = true
123
+ else
124
+ puts "I could not find config file: #{file}"
125
+ exit 1
126
+ end
127
+ end
128
+
129
+ opts.on_tail("-v", "--verbose", "Be verbose") do
130
+ @verbose = true
131
+ end
132
+
133
+ opts.on_tail("-h", "--help", "Show this message") do
134
+ puts opts
135
+ exit
136
+ end
137
+ end
138
+ opts.parse!(args)
139
+
140
+ unless loaded_config
141
+ path = Dir.getwd
142
+ loaded_config = load_from_path(path)
143
+ end
144
+
145
+ if loaded_config && ! @config["application_name"]
146
+ if @path
147
+ appname = File.basename(@path)
148
+ @config["application_name"] = appname
149
+ else
150
+ puts "You need application_name defined in your config!"
151
+ YAML.dump @config
152
+ exit 1
153
+ end
154
+ end
155
+
156
+ unless loaded_config
157
+ puts "Configuration Dump:\n\n"
158
+ puts YAML.dump(@config)
159
+ puts "I could not find a way to configure myself properly!\n"
160
+ puts opts.help
161
+ exit 1
162
+ end
163
+
164
+ if args.length > 1
165
+ puts "You specified more command line arguments than I can handle:"
166
+ puts args.join(" ")
167
+ puts opts.help
168
+ exit 1
169
+ end
170
+
171
+ if self.has_command?(args[0]) || args[0] == "create"
172
+ @command = args[0]
173
+ else
174
+ if args[0]
175
+ puts "#{args[0]} is not an allowed command"
176
+ else
177
+ puts "You must provide a command!"
178
+ end
179
+ puts opts.help
180
+ exit 1
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,253 @@
1
+ # Created by Adam Jacob on 2007-03-21.
2
+ # Copyright (c) 2007. All rights reserved.
3
+
4
+ require 'mongrel_runit/base'
5
+
6
+ module MongrelRunit
7
+
8
+ # Represents a runit service directory for a particular mongrel.
9
+ #
10
+ # Example:
11
+ #
12
+ # service = MongrelRunit::Service.new(config)
13
+ # service.stop
14
+ # service.start
15
+ # service.create
16
+ #
17
+
18
+ class Service < Base
19
+ attr_reader :runfile, :logrunfile, :logconfig, :checkfile, :svdir, :config
20
+
21
+ # Takes a configuration hash as it's argument, ensures the
22
+ # runit_service_dir exists, and creates the runit_sv_dir.
23
+ def initialize(config)
24
+ @config = config
25
+
26
+ raise ArgumentError, "Must have an application_name!" unless @config.has_key?("application_name")
27
+ raise ArgumentError, "Must have a port!" unless @config.has_key?("port")
28
+ raise ArgumentError, "Must have a runit_sv_dir!" unless @config.has_key?("runit_sv_dir")
29
+ raise ArgumentError, "Must have a runit_service_dir!" unless @config.has_key?("runit_service_dir")
30
+
31
+ check_service_dir
32
+ make_sv_dir
33
+ end
34
+
35
+ # Catch-all for the common service commands. See MongrelRunit::Base for
36
+ # a list.
37
+ def method_missing(status)
38
+ if self.has_command?(status.id2name)
39
+ run(status.id2name)
40
+ else
41
+ Kernel.method_missing
42
+ end
43
+ end
44
+
45
+ # Returns true if the process is running, nil if it's not.
46
+ def is_running?
47
+ output, success = run("status")
48
+ output =~ /^run:/ ? true : nil
49
+ end
50
+
51
+ # Run a given command through sv.
52
+ def run(status)
53
+ cmd = "sv "
54
+ cmd += " -w #{@config['svwait']}" if @config.has_key?('svwait')
55
+ cmd += " #{status} #{@svdir}"
56
+ output = `#{cmd}`
57
+ return output, $?.success?
58
+ end
59
+
60
+ # Create the service directory for this mongrel. This includes the
61
+ # run script, log script, check script, and log config file. This
62
+ # should run any time there is a change to the configruation.
63
+ def create
64
+ make_run
65
+ make_check
66
+ make_log
67
+ make_log_config
68
+ link = make_service_link
69
+ return link, true
70
+ end
71
+
72
+ # Raises an exception if the runit_service_dir does not exist.
73
+ def check_service_dir
74
+ dir_exists = File.directory?(@config["runit_service_dir"])
75
+ raise ArgumentError, "runit_service_dir does not exist: #{@config["runit_service_dir"]}" unless dir_exists
76
+ dir_exists
77
+ end
78
+
79
+ # Creates the symlink between the mongrel's sv directory and the
80
+ # runit_service_dir.
81
+ def make_service_link
82
+ servicename = File.basename(@svdir)
83
+ link = File.expand_path(File.join(@config["runit_service_dir"], servicename))
84
+ unless File.symlink?(link)
85
+ `ln -s #{@svdir} #{@config["runit_service_dir"]}`
86
+ end
87
+ link
88
+ end
89
+
90
+ # Populates the check file, either with the contents of the checkfile
91
+ # configuration option, or:
92
+ #
93
+ # #!/usr/bin/env ruby
94
+ #
95
+ # require 'net/http'
96
+ #
97
+ # http = Net::HTTP.new('#{address}', #{@config["port"].to_i})
98
+ # begin
99
+ # response = http.options('/')
100
+ # if response = Net::HTTPSuccess
101
+ # exit 0
102
+ # else
103
+ # exit 1
104
+ # end
105
+ # rescue Errno::ECONNREFUSED
106
+ # exit 1
107
+ # end
108
+ def make_check
109
+ if @config.has_key?("checkfile")
110
+ @checkfile = interpret_line(@config["checkfile"])
111
+ else
112
+ @checkfile = <<EOH
113
+ #!/usr/bin/env ruby
114
+
115
+ require 'net/http'
116
+
117
+ http = Net::HTTP.new('#{@config['address']}', #{@config["port"].to_i})
118
+ begin
119
+ response = http.options('/')
120
+ if response = Net::HTTPSuccess
121
+ exit 0
122
+ else
123
+ exit 1
124
+ end
125
+ rescue Errno::ECONNREFUSED
126
+ exit 1
127
+ end
128
+ EOH
129
+ end
130
+ path_to_checkfile = File.expand_path(File.join(@svdir, "check"))
131
+ create_or_update_file(path_to_checkfile, @checkfile)
132
+ File.chmod(0755, path_to_checkfile)
133
+ path_to_checkfile
134
+ end
135
+
136
+ # Creates the sv direrectory for this mongrel. (From runit_sv_dir)
137
+ def make_sv_dir
138
+ @svdir = File.expand_path(File.join(
139
+ @config["runit_sv_dir"],
140
+ "mongrel-#{@config["application_name"]}-#{@config["port"]}"
141
+ ))
142
+ @svlogdir = File.expand_path(File.join(
143
+ @svdir, "log"
144
+ ))
145
+ `mkdir -p #{@svlogdir}`
146
+ raise "Cannot create #{@svlogdir}" unless $?.success?
147
+ @svlogdir
148
+ end
149
+
150
+ # If svlogd_config is defined, creates the log config file.
151
+ def make_log_config
152
+ path_to_file = nil
153
+ if @config.has_key?("svlogd_config")
154
+ path_to_file = File.expand_path(File.join(@svlogdir, "config"))
155
+ @logconfig = @config["svlogd_config"]
156
+ create_or_update_file(path_to_file, @logconfig)
157
+ end
158
+ path_to_file
159
+ end
160
+
161
+ # Makes the log run script.
162
+ def make_log
163
+ logdir = File.expand_path(File.join(@svlogdir, "main"))
164
+ if @config.has_key?("base_log_directory")
165
+ logdir = File.expand_path(File.join(
166
+ @config["base_log_directory"],
167
+ "#{@config[application_name]}-#{@config[port]}"
168
+ ))
169
+ end
170
+ `mkdir -p #{logdir}`
171
+ raise "Cannot create #{logdir}" unless $?.success?
172
+ @logrunfile = "#!/bin/sh\n"
173
+ @logrunfile << "exec svlogd -tt #{logdir}"
174
+ path_to_logrunfile = File.expand_path(File.join(@svlogdir, "run"))
175
+ create_or_update_file(path_to_logrunfile, @logrunfile)
176
+ File.chmod(0755, path_to_logrunfile)
177
+ path_to_logrunfile
178
+ end
179
+
180
+ # Makes the run script, which calls mongrel directly. The command
181
+ # line assembly code for mongrel_rails is taken verbatim from mongrel_cluster.
182
+ def make_run
183
+ cmd = if @config["command_line"]
184
+ interpret_line(@config["command_line"])
185
+ else
186
+ argv = [ "mongrel_rails" ]
187
+ argv << "start"
188
+ argv << "-e #{@config["environment"]}" if @config["environment"]
189
+ argv << "-p #{@config["port"]}"
190
+ argv << "-a #{@config["address"]}" if @config["address"]
191
+ argv << "-l #{@config["log_file"]}" if @config["log_file"]
192
+ argv << "-c #{File.expand_path(@config["cwd"])}" if @config["cwd"]
193
+ argv << "-t #{@config["timeout"]}" if @config["timeout"]
194
+ argv << "-m #{@config["mime_map"]}" if @config["mime_map"]
195
+ argv << "-r #{@config["docroot"]}" if @config["docroot"]
196
+ argv << "-n #{@config["num_procs"]}" if @config["num_procs"]
197
+ argv << "-B" if @config["debug"]
198
+ argv << "-S #{@config["config_script"]}" if @config["config_script"]
199
+ argv << "--user #{@config["user"]}" if @config["user"]
200
+ argv << "--group #{@config["group"]}" if @config["group"]
201
+ argv << "--prefix #{@config["prefix"]}" if @config["prefix"]
202
+ argv.join(" ")
203
+ end
204
+ env = nil
205
+ if @config.has_key?("env_vars")
206
+ env = "env"
207
+ @config["env_vars"].each do |key, value|
208
+ env << " #{key.upcase}=#{value}"
209
+ end
210
+ end
211
+ chpst = nil
212
+ if @config.has_key?("chpst")
213
+ chpst_command = `which chpst`.chomp
214
+ chpst = "#{chpst_command} #{@config['chpst']}"
215
+ end
216
+ @runfile = "#!/bin/sh\n"
217
+ @runfile << "exec \\\n"
218
+ @runfile << " #{env} \\\n" if env
219
+ @runfile << " #{chpst} \\\n" if chpst
220
+ @runfile << " #{cmd} 2>&1\n"
221
+
222
+ path_to_runfile = File.expand_path(File.join(@svdir, "run"))
223
+ create_or_update_file(path_to_runfile, @runfile)
224
+ File.chmod(0755, path_to_runfile)
225
+ path_to_runfile
226
+ end
227
+
228
+ private
229
+
230
+ def interpret_line(cmd)
231
+ begin
232
+ eval("\"#{cmd}\"")
233
+ rescue SyntaxError
234
+ puts "You have a syntax error in your string; perhaps you included a double quote without escaping it?"
235
+ raise
236
+ end
237
+ end
238
+
239
+ def create_or_update_file(file, new_contents)
240
+ write = 1
241
+ if File.file?(file)
242
+ current_contents = IO.read(file)
243
+ if current_contents == new_contents
244
+ write = nil
245
+ end
246
+ end
247
+
248
+ File.open(file, "w") do |file|
249
+ file.print(new_contents)
250
+ end if write
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,91 @@
1
+ require 'mongrel_runit/base'
2
+ require 'mongrel_runit/service'
3
+ require 'find'
4
+
5
+ module MongrelRunit
6
+ class ServiceRunner < Base
7
+ include Enumerable
8
+
9
+ def initialize(config)
10
+ @config = config
11
+ @mongrel_services = {}
12
+ @mongrel_names = []
13
+
14
+ raise ArgumentError, "Must have an application_name!" unless @config.has_key?("application_name")
15
+ raise ArgumentError, "Must have a port!" unless @config.has_key?("port")
16
+ raise ArgumentError, "Must have a servers option!" unless @config.has_key?("servers")
17
+
18
+ start_port = @config["port"].to_i
19
+ port_end = start_port + @config["servers"].to_i - 1
20
+ start_port.upto(port_end) do |port|
21
+ local_config = config.dup
22
+ local_config["port"] = port
23
+ @mongrel_services[port] = MongrelRunit::Service.new(local_config)
24
+ @mongrel_names << "mongrel-#{@config["application_name"]}-#{port}"
25
+ end
26
+ end
27
+
28
+ def method_missing(method)
29
+ if self.has_command?(method.id2name) || method.id2name == "create"
30
+ run(method.id2name)
31
+ else
32
+ super
33
+ end
34
+ end
35
+
36
+ def run(method)
37
+ return self.create if method == "create"
38
+ threads = []
39
+ response = {}
40
+ final_status = true
41
+ self.each do |svc|
42
+ threads << Thread.new(svc) do |s|
43
+ output, status = s.send(:run, method)
44
+ response[svc.config["port"]] = [ output, status ]
45
+ final_status = status if status == false
46
+ end
47
+ end
48
+ threads.each { |t| t.join }
49
+ return response, final_status
50
+ end
51
+
52
+ def create
53
+
54
+ response = {}
55
+ final_status = true
56
+ self.each do |svc|
57
+ output, status = svc.create
58
+ response[svc.config["port"]] = [ output, status ]
59
+ final_status = status if status == false
60
+ end
61
+
62
+ service_path = File.expand_path(@config["runit_service_dir"])
63
+ sv_path = File.expand_path(@config["runit_sv_dir"])
64
+ Find.find(sv_path, service_path) do |file|
65
+ if File.directory?(file) || File.symlink?(file)
66
+ if file =~ /mongrel-#{@config["application_name"]}-(\d+)$/
67
+ safe = @mongrel_names.detect { |cm| cm =~ /#{File.basename(file)}$/ }
68
+ if ! safe
69
+ output = `rm -r #{file}`
70
+ raise "Cannot remove stale mongrel config" unless $?.success?
71
+ end
72
+ end
73
+ end
74
+ end
75
+ return response, final_status
76
+ end
77
+
78
+ def [](port)
79
+ @mongrel_services[port]
80
+ end
81
+
82
+ def length
83
+ @mongrel_services.length
84
+ end
85
+
86
+ def each
87
+ @mongrel_services.each_value { |value| yield value }
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,9 @@
1
+ module MongrelRunit #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 2
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,25 @@
1
+ #
2
+ # Mongrel Runit takes a yaml config file and automatically sets up a
3
+ # group of mongrels for you. It is functionally equivilant to
4
+ # mongrel_cluster, but relies on runit for the fairly complex daemon
5
+ # management tasks.
6
+ #
7
+ # Author:: Adam Jacob (<adam@hjksolutions.com>)
8
+ # Copyright:: Copyright (c) 2007 HJK Solutions, LLC
9
+ # License:: GNU General Public License version 2.1
10
+ #
11
+ # This program is free software; you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License version 2
13
+ # as published by the Free Software Foundation.
14
+ #
15
+ # This program is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License along
21
+ # with this program; if not, write to the Free Software Foundation, Inc.,
22
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23
+
24
+
25
+ Dir[File.join(File.dirname(__FILE__), 'mongrel_runit/**/*.rb')].sort.each { |lib| require lib }
@@ -0,0 +1,21 @@
1
+ ---
2
+ port: 3000
3
+ address: 127.0.0.1
4
+ pid_file: log/mongrel.pid
5
+ servers: 2
6
+ log_file: foo.log
7
+ environment: production
8
+ cwd: /Users/adam/src/sandbox/mongrel_runit
9
+ timeout: 100
10
+ mime_map: log/mime.map
11
+ docroot: htdocs
12
+ num_procs: 1024
13
+ debug: true
14
+ config_path: /foo/bar/config
15
+ config_script: /foo/bar/config/yml
16
+ user: www-data
17
+ group: www-data
18
+ prefix: /monkey
19
+ runit_sv_dir: /etc/sv
20
+ runit_service_dir: /var/service
21
+ application_name: monkey
@@ -0,0 +1,12 @@
1
+ ---
2
+ port: 3000
3
+ address: 127.0.0.1
4
+ servers: 2
5
+ environment: production
6
+ docroot: htdocs
7
+ num_procs: 1024
8
+ user: www-data
9
+ group: www-data
10
+ application_name: monkey
11
+ env_vars:
12
+ PATH: "$PATH:/var/lib/gems/1.8/bin"
data/test/tc_config.rb ADDED
@@ -0,0 +1,93 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ require "mongrel_runit/config"
4
+ require "yaml"
5
+
6
+ class TestMongrelRunitConfig < Test::Unit::TestCase
7
+ YAMLFILE = File.dirname(__FILE__) + "/config/mongrel_runit.yml"
8
+ ARGS = " -e PRODUCTION"
9
+ ARGS << " -p 8000"
10
+ ARGS << " -a 127.0.0.1"
11
+ ARGS << " -l log/file.log"
12
+ ARGS << " -P log/file.pid"
13
+ ARGS << " -n 1024"
14
+ ARGS << " -m mime-types.conf"
15
+ ARGS << " -c /tmp"
16
+ ARGS << " -r /tmp"
17
+ ARGS << " --debug"
18
+ ARGS << " -C /conf/path"
19
+ ARGS << " -S /conf/path/script"
20
+ ARGS << " --user www-data"
21
+ ARGS << " --group www-data"
22
+
23
+ def setup
24
+ @file_template = {
25
+ :port => 3000,
26
+ :address => '127.0.0.1',
27
+ :pid_file => 'log/mongrel.pid',
28
+ :servers => 2,
29
+ :log_file => 'foo.log',
30
+ :environment => "production",
31
+ :cwd => "/Users/adam/src/sandbox/mongrel_runit",
32
+ :timeout => 100,
33
+ :mime_map => "log/mime.map",
34
+ :docroot => "htdocs",
35
+ :num_procs => 1024,
36
+ :debug => true,
37
+ :config_path => "/foo/bar/config",
38
+ :config_script => "/foo/bar/config/yml",
39
+ :user => "www-data",
40
+ :group => "www-data",
41
+ :prefix => "/monkey",
42
+ :runit_sv_dir => "/etc/sv",
43
+ :runit_service_dir => "/var/service",
44
+ :application_name => "monkey",
45
+ }
46
+ end
47
+
48
+ def load_file
49
+ @from_file = MongrelRunit::Config.load_file(YAMLFILE)
50
+ end
51
+
52
+ def load_args(args)
53
+ config = MongrelRunit::Config.load_args(args)
54
+ end
55
+
56
+ def test_load_args
57
+ args = [ "-c#{File.expand_path('./config/mongrel_runit.yml')}", "status" ]
58
+ config = load_args(args)
59
+ @file_template.each do |key, value|
60
+ assert_equal(value, config["#{key}"], "#{key} has proper value")
61
+ end
62
+ end
63
+
64
+ def test_load_appname_args
65
+ args = [
66
+ "-c#{File.expand_path('./config/mongrel_runit.yml')}",
67
+ "-amoo",
68
+ "status",
69
+ ]
70
+ config = load_args(args)
71
+ @file_template[:application_name] = "moo"
72
+ @file_template.each do |key, value|
73
+ assert_equal(value, config["#{key}"], "#{key} has proper value")
74
+ end
75
+ assert_equal("status", config.command, "Command is correct")
76
+ end
77
+
78
+ def test_load_nothing
79
+ args = [ "status" ]
80
+ config = load_args(args)
81
+ @file_template.each do |key, value|
82
+ assert_equal(value, config["#{key}"], "#{key} has proper value")
83
+ end
84
+ assert_equal("status", config.command, "Command is correct")
85
+ end
86
+
87
+ def test_load_file
88
+ load_file
89
+ @file_template.each do |key, value|
90
+ assert_equal(value, @from_file["#{key}"], "#{key} has proper value")
91
+ end
92
+ end
93
+ end