stella 0.5.3 → 0.5.4

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.
Files changed (88) hide show
  1. data/{README.txt → README.textile} +63 -40
  2. data/Rakefile +7 -5
  3. data/bin/stella +1 -1
  4. data/bin/stella.bat +12 -0
  5. data/lib/pcaplet.rb +180 -0
  6. data/lib/stella/adapter/ab.rb +57 -33
  7. data/lib/stella/adapter/base.rb +11 -1
  8. data/lib/stella/adapter/httperf.rb +13 -10
  9. data/lib/stella/adapter/pcap_watcher.rb +221 -0
  10. data/lib/stella/adapter/proxy_watcher.rb +76 -0
  11. data/lib/stella/adapter/siege.rb +28 -11
  12. data/lib/stella/cli/agents.rb +2 -2
  13. data/lib/stella/cli/base.rb +37 -1
  14. data/lib/stella/cli/localtest.rb +1 -2
  15. data/lib/stella/cli/sysinfo.rb +17 -0
  16. data/lib/stella/cli/watch.rb +278 -0
  17. data/lib/stella/cli.rb +23 -11
  18. data/lib/stella/command/base.rb +1 -10
  19. data/lib/stella/command/localtest.rb +43 -23
  20. data/lib/stella/data/domain.rb +75 -0
  21. data/lib/stella/data/http.rb +124 -0
  22. data/lib/stella/logger.rb +16 -5
  23. data/lib/stella/storable.rb +4 -2
  24. data/lib/stella/support.rb +71 -0
  25. data/lib/stella/sysinfo.rb +247 -0
  26. data/lib/stella/test/base.rb +5 -1
  27. data/lib/stella/test/definition.rb +1 -1
  28. data/lib/stella/test/run/summary.rb +14 -4
  29. data/lib/stella/text/resource.rb +0 -1
  30. data/lib/stella.rb +28 -10
  31. data/lib/utils/domainutil.rb +47 -0
  32. data/lib/utils/fileutil.rb +22 -3
  33. data/lib/utils/httputil.rb +184 -128
  34. data/lib/utils/mathutil.rb +20 -7
  35. data/lib/win32/Console/ANSI.rb +305 -0
  36. data/lib/win32/Console.rb +970 -0
  37. data/spec/show-agents_spec.rb +0 -0
  38. data/support/kvm.h +91 -0
  39. data/support/ruby-pcap-takuma-notes.txt +19 -0
  40. data/support/ruby-pcap-takuma-patch.txt +30 -0
  41. data/support/text/en.yaml +26 -3
  42. data/vendor/frylock/README.textile +72 -0
  43. data/vendor/frylock/bin/example +170 -0
  44. data/vendor/frylock/frylock.gemspec +18 -0
  45. data/vendor/frylock/lib/frylock/exceptions.rb +24 -0
  46. data/vendor/frylock/lib/frylock.rb +232 -0
  47. data/vendor/frylock/test/command_test.rb +33 -0
  48. data/vendor/hitimes-0.4.0/HISTORY +28 -0
  49. data/vendor/hitimes-0.4.0/LICENSE.txt +19 -0
  50. data/vendor/hitimes-0.4.0/README +80 -0
  51. data/vendor/hitimes-0.4.0/Rakefile +63 -0
  52. data/vendor/hitimes-0.4.0/examples/benchmarks.rb +86 -0
  53. data/vendor/hitimes-0.4.0/examples/stats.rb +29 -0
  54. data/vendor/hitimes-0.4.0/ext/extconf.rb +15 -0
  55. data/vendor/hitimes-0.4.0/ext/hitimes_ext.c +21 -0
  56. data/vendor/hitimes-0.4.0/ext/hitimes_instant_clock_gettime.c +20 -0
  57. data/vendor/hitimes-0.4.0/ext/hitimes_instant_osx.c +16 -0
  58. data/vendor/hitimes-0.4.0/ext/hitimes_instant_windows.c +27 -0
  59. data/vendor/hitimes-0.4.0/ext/hitimes_interval.c +340 -0
  60. data/vendor/hitimes-0.4.0/ext/hitimes_interval.h +73 -0
  61. data/vendor/hitimes-0.4.0/ext/hitimes_stats.c +242 -0
  62. data/vendor/hitimes-0.4.0/ext/hitimes_stats.h +30 -0
  63. data/vendor/hitimes-0.4.0/ext/rbconfig-mingw.rb +178 -0
  64. data/vendor/hitimes-0.4.0/ext/rbconfig.rb +178 -0
  65. data/vendor/hitimes-0.4.0/gemspec.rb +54 -0
  66. data/vendor/hitimes-0.4.0/lib/hitimes/mutexed_stats.rb +23 -0
  67. data/vendor/hitimes-0.4.0/lib/hitimes/paths.rb +54 -0
  68. data/vendor/hitimes-0.4.0/lib/hitimes/stats.rb +29 -0
  69. data/vendor/hitimes-0.4.0/lib/hitimes/timer.rb +223 -0
  70. data/vendor/hitimes-0.4.0/lib/hitimes/version.rb +42 -0
  71. data/vendor/hitimes-0.4.0/lib/hitimes.rb +24 -0
  72. data/vendor/hitimes-0.4.0/spec/interval_spec.rb +115 -0
  73. data/vendor/hitimes-0.4.0/spec/mutex_stats_spec.rb +34 -0
  74. data/vendor/hitimes-0.4.0/spec/paths_spec.rb +14 -0
  75. data/vendor/hitimes-0.4.0/spec/spec_helper.rb +6 -0
  76. data/vendor/hitimes-0.4.0/spec/stats_spec.rb +72 -0
  77. data/vendor/hitimes-0.4.0/spec/timer_spec.rb +105 -0
  78. data/vendor/hitimes-0.4.0/spec/version_spec.rb +27 -0
  79. data/vendor/hitimes-0.4.0/tasks/announce.rake +39 -0
  80. data/vendor/hitimes-0.4.0/tasks/config.rb +107 -0
  81. data/vendor/hitimes-0.4.0/tasks/distribution.rake +53 -0
  82. data/vendor/hitimes-0.4.0/tasks/documentation.rake +33 -0
  83. data/vendor/hitimes-0.4.0/tasks/extension.rake +64 -0
  84. data/vendor/hitimes-0.4.0/tasks/rspec.rake +31 -0
  85. data/vendor/hitimes-0.4.0/tasks/rubyforge.rake +52 -0
  86. data/vendor/hitimes-0.4.0/tasks/utils.rb +80 -0
  87. data/vendor/useragent/lib/user_agent.rb +1 -1
  88. metadata +87 -8
File without changes
data/support/kvm.h ADDED
@@ -0,0 +1,91 @@
1
+ /*
2
+ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3
+ *
4
+ * @APPLE_LICENSE_HEADER_START@
5
+ *
6
+ * This file contains Original Code and/or Modifications of Original Code
7
+ * as defined in and that are subject to the Apple Public Source License
8
+ * Version 2.0 (the 'License'). You may not use this file except in
9
+ * compliance with the License. Please obtain a copy of the License at
10
+ * http://www.opensource.apple.com/apsl/ and read it before using this
11
+ * file.
12
+ *
13
+ * The Original Code and all software distributed under the License are
14
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18
+ * Please see the License for the specific language governing rights and
19
+ * limitations under the License.
20
+ *
21
+ * @APPLE_LICENSE_HEADER_END@
22
+ */
23
+ /*-
24
+ * Copyright (c) 1989, 1993
25
+ * The Regents of the University of California. All rights reserved.
26
+ *
27
+ * Redistribution and use in source and binary forms, with or without
28
+ * modification, are permitted provided that the following conditions
29
+ * are met:
30
+ * 1. Redistributions of source code must retain the above copyright
31
+ * notice, this list of conditions and the following disclaimer.
32
+ * 2. Redistributions in binary form must reproduce the above copyright
33
+ * notice, this list of conditions and the following disclaimer in the
34
+ * documentation and/or other materials provided with the distribution.
35
+ * 3. All advertising materials mentioning features or use of this software
36
+ * must display the following acknowledgement:
37
+ * This product includes software developed by the University of
38
+ * California, Berkeley and its contributors.
39
+ * 4. Neither the name of the University nor the names of its contributors
40
+ * may be used to endorse or promote products derived from this software
41
+ * without specific prior written permission.
42
+ *
43
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
44
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
47
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53
+ * SUCH DAMAGE.
54
+ *
55
+ * @(#)kvm.h 8.1 (Berkeley) 6/2/93
56
+ */
57
+
58
+ #ifndef _KVM_H_
59
+ #define _KVM_H_
60
+
61
+ /* Default version symbol. */
62
+ #define VRS_SYM "_version"
63
+ #define VRS_KEY "VERSION"
64
+
65
+ #include <nlist.h>
66
+ #include <sys/cdefs.h>
67
+
68
+ __BEGIN_DECLS
69
+
70
+ typedef struct __kvm kvm_t;
71
+
72
+ struct kinfo_proc;
73
+ int kvm_close(kvm_t *);
74
+ char **kvm_getargv(kvm_t *, const struct kinfo_proc *, int);
75
+ char **kvm_getenvv(kvm_t *, const struct kinfo_proc *, int);
76
+ char *kvm_geterr(kvm_t *);
77
+ int kvm_getloadavg(kvm_t *, double [], int);
78
+ char *kvm_getfiles(kvm_t *, int, int, int *);
79
+ struct kinfo_proc *
80
+ kvm_getprocs(kvm_t *, int, int, int *);
81
+ int kvm_nlist(kvm_t *, struct nlist *);
82
+ kvm_t *kvm_open
83
+ (const char *, const char *, const char *, int, const char *);
84
+ kvm_t *kvm_openfiles
85
+ (const char *, const char *, const char *, int, char *);
86
+ int kvm_read(kvm_t *, unsigned long, void *, unsigned int);
87
+ int kvm_write(kvm_t *, unsigned long, const void *, unsigned int);
88
+
89
+ __END_DECLS
90
+
91
+ #endif /* !_KVM_H_ */
@@ -0,0 +1,19 @@
1
+ Ruby-Pcap Patch (2008-02-10)
2
+ -------------------------------------------------------
3
+
4
+ "pcap.bundle: warning: do not use Fixnums as Symbols"
5
+
6
+ Ruby-Pcap is a libpcap binding for Ruby. On Ruby 1.8.6,
7
+ the latest release (0.6) produces the warning above on
8
+ OS X. ruby-pcap-takuma-patch.txt is a patch from here:
9
+ http://d.hatena.ne.jp/takuma104/20080210/1202638583
10
+
11
+ You can get Ruby-Pcap from here:
12
+ http://www.goto.info.waseda.ac.jp/~fukusima/ruby/pcap-e.html
13
+
14
+ $ tar -zxf ruby-pcap-0.6.tar.gz
15
+ $ cd pcap
16
+ $ patch -p1 < ruby-pcap-takuma-patch.txt
17
+ $ make
18
+ $ make install
19
+
@@ -0,0 +1,30 @@
1
+ diff -ur pcap-0.6/Pcap.c pcap-working/Pcap.c
2
+ --- pcap-0.6/Pcap.c 2008-02-10 19:10:30.000000000 +0900
3
+ +++ pcap-working/Pcap.c 2008-02-10 18:58:49.000000000 +0900
4
+ @@ -782,9 +782,9 @@
5
+ /* define class PcapStat */
6
+ cPcapStat = rb_funcall(rb_cStruct, rb_intern("new"), 4,
7
+ Qnil,
8
+ - INT2NUM(rb_intern("recv")),
9
+ - INT2NUM(rb_intern("drop")),
10
+ - INT2NUM(rb_intern("ifdrop")));
11
+ + ID2SYM(rb_intern("recv")),
12
+ + ID2SYM(rb_intern("drop")),
13
+ + ID2SYM(rb_intern("ifdrop")));
14
+ rb_define_const(mPcap, "Stat", cPcapStat);
15
+
16
+ /* define exception classes */
17
+ diff -ur pcap-0.6/packet.c pcap-working/packet.c
18
+ --- pcap-0.6/packet.c 2008-02-10 19:10:30.000000000 +0900
19
+ +++ pcap-working/packet.c 2008-02-10 18:55:13.000000000 +0900
20
+ @@ -17,8 +17,8 @@
21
+
22
+ VALUE cPacket;
23
+ static VALUE mMarshal;
24
+ -int id_load;
25
+ -int id_dump;
26
+ +ID id_load;
27
+ +ID id_dump;
28
+
29
+ /* called from GC */
30
+ static void
data/support/text/en.yaml CHANGED
@@ -30,16 +30,28 @@
30
30
  Examples:
31
31
 
32
32
  # Run Apache Bench with 50 users, 20 requests each. Repeat 5 times.
33
- $ stella -t 5 ab -n 1000 -c 50 http://stellaaahhhh.com/
33
+ $ stella -x 5 -w 0.5 ab -n 1000 -c 50 http://stellaaahhhh.com/
34
34
 
35
35
  # Run Siege with 100 users, 10 requests each with a Linux FireFox 3 user agent
36
- $ stella -a firefox-3-linux siege -c 100 -r 10 http://stellaaahhhh.com/
37
-
36
+ $ stella --rampup=25,200 --agent=firefox-3-linux siege -c 100 -r 10 http://stellaaahhhh.com/
37
+
38
+ # Display available user agent strings
39
+ $ stella agents -l
40
+
41
+ # Launch a proxy to monitor HTTP traffic. Record requests to a flatfile.
42
+ $ stella -vv watch -W -p 3114 -r uri.txt
43
+
44
+ # Monitor network traffic with packet sniffer (requires unix and root access)
45
+ $ stella watch -P dns
46
+ $ stella watch -P -p 9000 http
47
+
48
+
38
49
  User-Agent Examples (--agent):
39
50
  ff-3-linux, ie-7-win, opera-10, chrome-0.2-osx
40
51
 
41
52
  :option_help_message: A short note about the test (i.e. 'new cache enabled')
42
53
  :option_help_format: "Output file format. One of: csv [default], yaml, tsv, json"
54
+ :option_help_force: "Force the command to ignore non-fatal errors. CAREFUL!"
43
55
  :option_help_version: Display the version, then exit
44
56
  :option_help_sleep: Number of seconds to sleep between runs
45
57
  :option_help_agent: Specify a User-Agent. Can be a short string or complete agent string. Defaults to 'random'.
@@ -50,5 +62,16 @@
50
62
  :error_class_must_override: "You must override the method: %s"
51
63
  :error_class_unknown_argument: "Ignoring unknown argument: %s"
52
64
  :error_adapter_command_not_ready: "Incomplete options or arguments for %s"
65
+ :error_adapter_runtime: "%s had a problem: %s"
66
+ :error_watch_proxy: "The proxy has a problem: %s"
67
+
53
68
  :error_invalid_argument: "%s is not a valid argument"
54
69
  :error_unknown_value: "I don't know what to do with %s"
70
+ :error_missing_dependency: "%s is not available: %s"
71
+ :error_generic: "Oops, there was an unidentified problem (consider reporting it as a bug)"
72
+
73
+ :error_sysinfo_notunix: "Sorry, Unix only"
74
+ :error_sysinfo_notwindows: "Sorry, Windows only"
75
+ :error_sysinfo_notroot: "You need to be root to do that"
76
+
77
+ :error_watch_norubypcap: "Ruby-Pcap not installed (http://www.goto.info.waseda.ac.jp/~fukusima/ruby/pcap-e.html)"
@@ -0,0 +1,72 @@
1
+ h1. Frylock - Easy Command line apps
2
+
3
+ Inspired by "github-gem":http://github.com/defunkt/github-gem
4
+
5
+ *Install:*
6
+
7
+ gem install bmizerany-sinatra
8
+
9
+ *Example:*
10
+
11
+ Let's say we want to run our app like this:
12
+
13
+ <pre><code>ruby script.rb hello</pre></code>
14
+
15
+ Then we write this:
16
+
17
+ <pre><code>require 'rubygems'
18
+ require 'bmizerany-frylock'
19
+
20
+ command :hello do
21
+ puts "Hello!"
22
+ end</pre></code>
23
+
24
+ If we want and optional name:
25
+
26
+ <pre><code>ruby script.rb hello Blake</pre></code>
27
+
28
+ Add a command with proc that has an arity of 1 and it will be matched instead of the first command
29
+
30
+ <pre><code>require 'rubygems'
31
+ require 'bmizerany-frylock'
32
+
33
+ command :hello do
34
+ puts "Hello!"
35
+ end
36
+
37
+ command :hello do |name|
38
+ puts "Hello #{name}!"
39
+ end</pre></code>
40
+
41
+
42
+ For further examples see: bin/example
43
+
44
+
45
+ *Contribute:*
46
+
47
+ I'm very open to patches! Please fork and send a pull request.
48
+
49
+ *LICENSE*
50
+
51
+ Copyright (c) 2008 Blake Mizerany
52
+
53
+ Permission is hereby granted, free of charge, to any person
54
+ obtaining a copy of this software and associated documentation
55
+ files (the "Software"), to deal in the Software without
56
+ restriction, including without limitation the rights to use,
57
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
58
+ copies of the Software, and to permit persons to whom the
59
+ Software is furnished to do so, subject to the following
60
+ conditions:
61
+
62
+ The above copyright notice and this permission notice shall be
63
+ included in all copies or substantial portions of the Software.
64
+
65
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
66
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
67
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
68
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
69
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
70
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
71
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
72
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,170 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ FRYLOCK_HOME = File.expand_path(File.join(File.dirname(__FILE__), '..'))
4
+ $: << File.join(FRYLOCK_HOME, 'lib')
5
+
6
+ require 'rubygems'
7
+ require 'frylock'
8
+
9
+ default :commands
10
+
11
+
12
+ before do
13
+ # You can execute a block before the requests command is executed. You
14
+ # can use it to define instance variables here and use them in the commands
15
+ end
16
+
17
+
18
+ command :commands do
19
+ # Example: ruby bin/example welcome
20
+
21
+ puts "Meatwad: Science is a mystery to man, isn't it Frylock?"
22
+ print "Frylock: At least we have some commands: "
23
+
24
+ # The commands method returns a hash of Frylock::Command objects
25
+ puts commands.keys.inject([]) { |list, command| list << command.to_s }.sort.join(', ')
26
+ end
27
+
28
+
29
+ option :f, :found, "A boolean value. Did you find the car?"
30
+ command :findcar do |options|
31
+ # +options+ is a hash containing the options defined above
32
+ # Example: ruby bin/example -f findcar
33
+
34
+ puts "Frylock: So, did they ever find your car?"
35
+
36
+ # The keys to the hash are the long string from the option definition.
37
+ # If only the short string is provided, those will be used instead (i.e. :f).
38
+ puts (!options[:found]) ? "Carl: No" :
39
+ "Carl: Oh, they found part of it, hangin' from a trestle near the turnpike."
40
+ end
41
+
42
+
43
+
44
+ global_usage "USAGE: #{File.basename($0)} [global options] command [command options]"
45
+ global_option :s, :seconds, "Display values in seconds"
46
+ global_option :v, :verbose, "Verbosity level (i.e. -vvv is greater than -v)" do |v|
47
+ # Use instance variables to maintain values between option blocks.
48
+ # This will increment for every -v found (i.e. -vvv)
49
+ @val ||= 0
50
+ @val += 1
51
+ end
52
+
53
+
54
+ usage "ruby bin/example [--seconds] [-vv] time"
55
+ command :date do |options, argv, global_options|
56
+ # +argv+ contains the unnamed arguments
57
+ # +global_options+ contains hash of the options defined with global_options
58
+
59
+ require 'time'
60
+ now = Time.now
61
+ puts "More verbosely, the date is now: " if (global_options[:verbose] || 0) >= 2
62
+ puts (global_options[:seconds]) ? now.to_i : now.to_s
63
+ end
64
+
65
+
66
+ option :c, :check, "Check response codes for each URI"
67
+ option :d, :delim, String, "Output delimiter"
68
+ option :t, :timeout, Float, "Timeout value for HTTP request" do |v|
69
+ # You can provide an block to process the option value.
70
+ # This block must return the final value.
71
+ v = 10 if (v > 10)
72
+ v
73
+ end
74
+
75
+ usage 'echo "http://github.com/" | ruby bin/example process -c -d " " -t 15 http://solutious.com/'
76
+ command :processuris do |options, argv, global_options, stdin, cmd|
77
+ # +stdin+ is either an IO object or a custom object defined with a stdin block (see below)
78
+ # +cmd+ is the string used to evoke this command. Useful with alias_command (see below).
79
+
80
+ require 'net/http'
81
+ require 'uri'
82
+ require 'timeout'
83
+
84
+ uris = [stdin, argv].flatten # Combine the argv and stdin arrays
85
+ delim = options[:delim] || ','
86
+ timeout = options[:timeout] || 5
87
+ code = :notchecked # The default code when :check is false
88
+
89
+ if uris.empty?
90
+ puts "Frylock: You didn't provide any URIs. "
91
+ puts "Master Shake: Ya, see #{$0} #{cmd} -h"
92
+ exit 0
93
+ end
94
+
95
+ uris.each_with_index do |uri, index|
96
+ code = response_code(uri, timeout) if (options[:check])
97
+ puts [index+1, uri, code].join(delim)
98
+ end
99
+ end
100
+ alias_command :process, :processuris
101
+
102
+
103
+
104
+
105
+ stdin do |stdin, output|
106
+ # Pre-process STDIN for all commands. This example returns an array of lines.
107
+ # The command processuris uses this array.
108
+
109
+ # We only want piped data. If this is not included
110
+ # execution will wait for input from the user.
111
+ unless stdin.tty?
112
+
113
+ while !stdin.eof? do
114
+ line = stdin.readline
115
+ line.chomp!
116
+ (output ||= []) << line
117
+ end
118
+
119
+ end
120
+ output
121
+ end
122
+
123
+
124
+
125
+ # response_code
126
+ #
127
+ # return the HTTP response code for the given URI
128
+ # +uri+ A valid HTTP URI
129
+ # +duration+ The timeout threshold (in seconds) for the request.
130
+ def response_code(uri_str, duration=5)
131
+ response = :unavailable
132
+ begin
133
+ uri = (uri_str.kind_of? URI::HTTP) ? uri_str : URI.parse(uri_str)
134
+ timeout(duration) do
135
+ response = Net::HTTP.get_response(uri).code
136
+ end
137
+ rescue Exception => ex
138
+ end
139
+ response
140
+ end
141
+
142
+
143
+ at_exit do
144
+ # This is an example of how to call Frylock in your script.
145
+ begin
146
+ Frylock.run!(ARGV, STDIN)
147
+
148
+ rescue Frylock::UnknownCommand => ex
149
+ STDERR.puts "Frylock: I don't know what the #{ex.name} command is. #{$/}"
150
+ STDERR.puts "Master Shake: I'll tell you what it is, friends... it's shut up and let me eat it."
151
+
152
+ rescue Frylock::NoCommandsDefined => ex
153
+ STDERR.puts "Frylock: Carl, I don't want it. And I'd appreciate it if you'd define at least one command. #{$/}"
154
+ STDERR.puts "Carl: Fryman, don't be that way! This sorta thing happens every day! People just don't... you know, talk about it this loud."
155
+
156
+ rescue Frylock::InvalidArgument => ex
157
+ STDERR.puts "Frylock: Shake, how many arguments have you not provided a value for this year? #{$/}"
158
+ STDERR.puts "Master Shake: A *lot* more than *you* have! (#{@args.join(', ')})"
159
+
160
+ rescue Frylock::MissingArgument => ex
161
+ STDERR.puts "Frylock: I don't know what #{ex.args.join(', ')} is. #{$/}"
162
+ STDERR.puts "Master Shake: I'll tell you what it is, friends... it's shut up and let me eat it."
163
+
164
+ rescue => ex
165
+ STDERR.puts "Master Shake: Okay, but when we go in, watch your step. "
166
+ STDERR.puts "Frylock: Why?"
167
+ STDERR.puts "Meatwad: [explosion] #{ex.message}"
168
+ STDERR.puts ex.backtrace
169
+ end
170
+ end
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{frylock}
3
+ s.version = "0.1.0"
4
+
5
+ s.specification_version = 1 if s.respond_to? :specification_version=
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Blake Mizerany"]
9
+ s.date = %q{2008-08-17}
10
+ s.description = %q{Command line apps made easy}
11
+ s.email = %q{blake.mizerany@gmail.com}
12
+ s.files = Dir["lib/*.rb"]
13
+ s.has_rdoc = false
14
+ s.homepage = %q{http://github.com/bmizerany/frylock}
15
+ s.require_paths = ["lib"]
16
+ s.rubygems_version = %q{1.1.1}
17
+ s.summary = %q{Command line apps made easy}
18
+ end
@@ -0,0 +1,24 @@
1
+ module Frylock
2
+
3
+ class UnknownCommand < RuntimeError
4
+ attr_reader :name
5
+ def initialize(name)
6
+ @name = name || :unknown
7
+ end
8
+ end
9
+
10
+ class NoCommandsDefined < RuntimeError
11
+ end
12
+
13
+ class InvalidArgument < RuntimeError
14
+ attr_accessor :args
15
+ def initialize(args)
16
+ # We grab just the name of the argument
17
+ @args = args || []
18
+ end
19
+ end
20
+
21
+ class MissingArgument < InvalidArgument
22
+ end
23
+
24
+ end