rcl 0.0.2 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README +4 -2
- data/lib/rcl.rb +3 -1
- data/lib/rcl/ext/ansicolour.rb +126 -0
- data/lib/rcl/ext/dir.rb +14 -0
- data/lib/rcl/ext/yaml_helper.rb +97 -0
- data/lib/rcl/http.rb +45 -0
- data/lib/rcl/smtp.rb +44 -0
- data/lib/rcl/timestamp.rb +35 -0
- metadata +7 -2
data/README
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
== What
|
2
|
-
Ramsey's Common Library version 0.0.
|
2
|
+
Ramsey's Common Library version 0.0.5
|
3
3
|
|
4
4
|
This is simply a collection of Ruby modules that perform useful tasks. There
|
5
5
|
are methods that do simple things like check permissions on files and
|
@@ -34,6 +34,8 @@ Shell#unregister
|
|
34
34
|
Shell#run
|
35
35
|
Shell#history
|
36
36
|
|
37
|
+
SMTP#send
|
38
|
+
|
37
39
|
Timestamp#new
|
38
40
|
Timestamp#create
|
39
41
|
Timestamp#modify
|
@@ -72,7 +74,7 @@ I added a Rakefile and a gem spec. To build the gem, just type:
|
|
72
74
|
|
73
75
|
To install the gem, just type:
|
74
76
|
|
75
|
-
sudo gem install rcl-0.0.
|
77
|
+
sudo gem install rcl-0.0.5.gem
|
76
78
|
|
77
79
|
== Notes
|
78
80
|
I haven't tested this code with YARV, so YMMV.
|
data/lib/rcl.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
module RCL
|
7
7
|
RCL::NAME = 'rcl'
|
8
|
-
RCL::VERSION = '0.0.
|
8
|
+
RCL::VERSION = '0.0.5'
|
9
9
|
RCL::COPYRIGHT = 'Copyright (c) 2008 Ramsey Dow'
|
10
10
|
def self.copyright() RCL::COPYRIGHT end
|
11
11
|
def self.version() RCL::VERSION end
|
@@ -21,8 +21,10 @@ require 'yaml_helper'
|
|
21
21
|
$LOAD_PATH.unshift(File.dirname(__FILE__)+'/rcl')
|
22
22
|
|
23
23
|
require 'base'
|
24
|
+
require 'http'
|
24
25
|
require 'perms'
|
25
26
|
require 'shell'
|
27
|
+
require 'smtp'
|
26
28
|
require 'timestamp'
|
27
29
|
require 'token'
|
28
30
|
require 'url'
|
@@ -0,0 +1,126 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
= Name
|
4
|
+
Term::ANSIColour v0.01 (unstable)
|
5
|
+
|
6
|
+
= Synopsis
|
7
|
+
require 'term/ansicolour'
|
8
|
+
|
9
|
+
print "Some ordinary text\n"
|
10
|
+
Term::ANSIColour.colour = ('red')
|
11
|
+
print "some red text..\n"
|
12
|
+
print "some more red text..\n"
|
13
|
+
Term::ANSIColour.colour = ('green')
|
14
|
+
print "some green text..\n"
|
15
|
+
Term::ANSIColour.colour = ('default')
|
16
|
+
puts "some ordinary text.."
|
17
|
+
puts "some magenta text".colour("magenta")
|
18
|
+
puts "some funky text".colour("cyan", "bold", "on_white", "blink")
|
19
|
+
puts "more ordinary text"
|
20
|
+
|
21
|
+
= Description
|
22
|
+
prints out text in funny colours
|
23
|
+
|
24
|
+
= Class Methods
|
25
|
+
--- Term::ANSIColour.colour
|
26
|
+
Gets and sets the default output text colour (none by default)
|
27
|
+
|
28
|
+
= Overridden Methods
|
29
|
+
--- print
|
30
|
+
output text in the colour specified by Term::ANSIColour.colour
|
31
|
+
--- String.colour( colour )
|
32
|
+
returns a string of the colour given in the argument (overriding Term::ANSIColour.colour).
|
33
|
+
|
34
|
+
= To Do
|
35
|
+
--- Get puts, printf, putc and write to output coloured text.
|
36
|
+
--- Write some proper documentation.
|
37
|
+
--- Make the interface a bit cleaner.
|
38
|
+
--- Allow people to use string modifiers, constants, or overridden output
|
39
|
+
methods depending on their taste.
|
40
|
+
--- Plug in a few enhancements such as regexp colouring, syntax highlighting
|
41
|
+
and the like.
|
42
|
+
--- Alias @@colour to @color
|
43
|
+
--- Learn how to code ruby before I break something.
|
44
|
+
|
45
|
+
= Credits
|
46
|
+
First version by Robert Ryan (rjr@rollmop.org) borrowing extensively from
|
47
|
+
the perl version by Russ Allbery and Zenin. Additional input by Mark Hulme-Jones.
|
48
|
+
|
49
|
+
= Copyright
|
50
|
+
|
51
|
+
Copyright 2002
|
52
|
+
|
53
|
+
This program is free software. You can redistribute it and/or modify
|
54
|
+
it under the same terms as Ruby itself.
|
55
|
+
|
56
|
+
=cut
|
57
|
+
|
58
|
+
=end
|
59
|
+
|
60
|
+
module Term
|
61
|
+
module ANSIColour
|
62
|
+
# XXX - why don't attr_reader and attr_writer work?
|
63
|
+
@@colour = ['reset']
|
64
|
+
|
65
|
+
def ANSIColour.colour
|
66
|
+
@@colour
|
67
|
+
end
|
68
|
+
|
69
|
+
def ANSIColour.colour=(*string)
|
70
|
+
# why does this seem to work?
|
71
|
+
@@colour = string[0]
|
72
|
+
|
73
|
+
# why won't his work?
|
74
|
+
# @@colour = string
|
75
|
+
|
76
|
+
return @@colour
|
77
|
+
end
|
78
|
+
|
79
|
+
def ANSIColour.attributes
|
80
|
+
{ 'default' => '0',
|
81
|
+
'clear' => '0',
|
82
|
+
'reset' => '0',
|
83
|
+
'bold' => '1',
|
84
|
+
'dark' => '2',
|
85
|
+
'underline' => '4',
|
86
|
+
'blink' => '5',
|
87
|
+
'reverse' => '7',
|
88
|
+
'concealed' => '8',
|
89
|
+
|
90
|
+
'black' => '30', 'on_black' => '40',
|
91
|
+
'red' => '31', 'on_red' => '41',
|
92
|
+
'green' => '32', 'on_green' => '42',
|
93
|
+
'yellow' => '33', 'on_yellow' => '43',
|
94
|
+
'blue' => '34', 'on_blue' => '44',
|
95
|
+
'magenta' => '35', 'on_magenta' => '45',
|
96
|
+
'cyan' => '36', 'on_cyan' => '46',
|
97
|
+
'white' => '37', 'on_white' => '47'
|
98
|
+
}
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class String
|
104
|
+
def colour(newcolour, *colours)
|
105
|
+
attr = Term::ANSIColour.attributes
|
106
|
+
[newcolour, colours].flatten.map {|c| "\e\[#{attr[c]}m"}.join + self.to_s + "\e\[#{attr['reset']}m"
|
107
|
+
end
|
108
|
+
|
109
|
+
alias color colour
|
110
|
+
end
|
111
|
+
|
112
|
+
module Kernel
|
113
|
+
include Term::ANSIColour
|
114
|
+
|
115
|
+
alias_method :orig_print, :print
|
116
|
+
#alias_method :orig_puts, :puts # XXX - still has issues passing a list
|
117
|
+
|
118
|
+
def print(str)
|
119
|
+
colours = Term::ANSIColour.colour
|
120
|
+
attr = Term::ANSIColour.attributes
|
121
|
+
orig_print ( attr[colours[0]] == 0 ? str :
|
122
|
+
colours.map{|c| "\e\[#{attr[c]}m"}.join + str + "\e\[#{attr['reset']}m"
|
123
|
+
)
|
124
|
+
end
|
125
|
+
# XXX - todo - get puts, printf and putc to ouput in colour.
|
126
|
+
end
|
data/lib/rcl/ext/dir.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# dir.rb
|
2
|
+
# ara.t.howard@noaa.gov
|
3
|
+
|
4
|
+
class Dir
|
5
|
+
def self.ls dir, glob = File.join('**','**'), &block
|
6
|
+
ret = [] unless block
|
7
|
+
Dir.glob(File.join(dir, glob)) do |entry|
|
8
|
+
block ? block.call(entry) : ret.push(entry)
|
9
|
+
end
|
10
|
+
ret
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
raise RuntimeError, 'This library is for require only' if $0 == __FILE__
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
class Class
|
5
|
+
def persist
|
6
|
+
@persist = [] if !@persist
|
7
|
+
@persist
|
8
|
+
end
|
9
|
+
|
10
|
+
def persist= p
|
11
|
+
@persist = p if p.kind_of?(Array)
|
12
|
+
end
|
13
|
+
|
14
|
+
def persist_with_parent
|
15
|
+
p = []
|
16
|
+
klass = self;
|
17
|
+
while klass
|
18
|
+
p.concat(klass.persist)
|
19
|
+
klass = klass.superclass
|
20
|
+
end
|
21
|
+
p.uniq
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Object
|
26
|
+
def self.persistent *var
|
27
|
+
for i in (0..var.length-1)
|
28
|
+
var[i] = var[i].to_s
|
29
|
+
end
|
30
|
+
self.persist.concat(var)
|
31
|
+
self.persist.uniq!
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method :old_to_yaml, :to_yaml
|
35
|
+
|
36
|
+
def to_yaml ( opts = {} )
|
37
|
+
p = self.class.persist_with_parent
|
38
|
+
|
39
|
+
if p && p.size > 0
|
40
|
+
yaml_emit opts do |map|
|
41
|
+
p.each do |m|
|
42
|
+
map.add( m, instance_variable_get( '@' + m ) )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
else
|
46
|
+
old_to_yaml opts
|
47
|
+
end
|
48
|
+
end
|
49
|
+
private
|
50
|
+
def yaml_emit opts
|
51
|
+
YAML::quick_emit( object_id, opts ) do |out|
|
52
|
+
out.map( taguri, to_yaml_style ) do |map|
|
53
|
+
yield map
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
module RHNH
|
60
|
+
module EnumerablePostDeserializeHelper
|
61
|
+
def post_deserialize
|
62
|
+
self.each do |e|
|
63
|
+
YAML.call_post_deserialize(e) if e
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class Array
|
70
|
+
include RHNH::EnumerablePostDeserializeHelper
|
71
|
+
end
|
72
|
+
|
73
|
+
class Hash
|
74
|
+
include RHNH::EnumerablePostDeserializeHelper
|
75
|
+
end
|
76
|
+
|
77
|
+
module YAML
|
78
|
+
def YAML.call_post_deserialize obj, object_map = ::Set.new
|
79
|
+
if !object_map.include?(obj.object_id)
|
80
|
+
object_map.add(obj.object_id)
|
81
|
+
|
82
|
+
obj.instance_variables.each do |v|
|
83
|
+
call_post_deserialize obj.instance_variable_get(v), object_map
|
84
|
+
end
|
85
|
+
|
86
|
+
obj.post_deserialize if obj.respond_to?('post_deserialize')
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def YAML.load( io )
|
91
|
+
yp = parser.load( io )
|
92
|
+
call_post_deserialize yp
|
93
|
+
yp
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
raise RuntimeError, 'This library is for require only' if $0 == __FILE__
|
data/lib/rcl/http.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# http.rb
|
4
|
+
# yesmar@speakeasy.net
|
5
|
+
|
6
|
+
require 'net/http'
|
7
|
+
|
8
|
+
module RCL
|
9
|
+
module HTTP
|
10
|
+
def self.fetch_uri(uri, max_redirects=10)
|
11
|
+
raise ArgumentError, 'nil uri' if uri.nil?
|
12
|
+
raise ArgumentError, 'invalid uri class' if uri.class != String
|
13
|
+
raise ArgumentError, 'empty uri' if uri.empty?
|
14
|
+
raise ArgumentError, 'nil max_redirects' if max_redirects.nil?
|
15
|
+
raise ArgumentError, 'max_redirects too deep' if max_redirects == 0
|
16
|
+
|
17
|
+
url = URI.parse(uri)
|
18
|
+
count = -1
|
19
|
+
found = false
|
20
|
+
|
21
|
+
until found
|
22
|
+
host, port = url.host, url.port if url.host && url.port
|
23
|
+
req = Net::HTTP::Get.new(url.path)
|
24
|
+
res = Net::HTTP.start(host, port) { |http| http.request(req) }
|
25
|
+
res.header['location'] \
|
26
|
+
? url = URI.parse(res.header['location']) : found = true
|
27
|
+
count += 1
|
28
|
+
raise 'too many redirects' if count >= max_redirects
|
29
|
+
end
|
30
|
+
|
31
|
+
return res, count
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.status_message(res, count=0)
|
35
|
+
raise ArgumentError, 'nil res' if res.nil?
|
36
|
+
|
37
|
+
status = []
|
38
|
+
|
39
|
+
status << "HTTP/#{res.http_version} #{res.code} #{res.message}"
|
40
|
+
status << " [#{count} redirec#{count!= 1 ? "ts" : "t"}]" if count > 0
|
41
|
+
|
42
|
+
status.join
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/rcl/smtp.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# smtp.rb
|
4
|
+
# yesmar@speakeasy.net
|
5
|
+
|
6
|
+
module RCL
|
7
|
+
module SMTP
|
8
|
+
def self.send(mta, from, from_alias, to, to_alias, subject, message)
|
9
|
+
raise ArgumentError, 'nil mta' if mta.nil?
|
10
|
+
raise ArgumentError, 'invalid mta class' if mta.class != String
|
11
|
+
raise ArgumentError, 'empty mta' if mta.empty?
|
12
|
+
raise ArgumentError, 'nil from' if from.nil?
|
13
|
+
raise ArgumentError, 'invalid from class' if from.class != String
|
14
|
+
raise ArgumentError, 'empty from' if from.empty?
|
15
|
+
raise ArgumentError, 'nil from_alias' if from_alias.nil?
|
16
|
+
raise ArgumentError, 'invalid from_alias class' if from_alias.class \
|
17
|
+
!= String
|
18
|
+
raise ArgumentError, 'empty from' if from_alias.empty?
|
19
|
+
raise ArgumentError, 'nil to' if to.nil?
|
20
|
+
raise ArgumentError, 'invalid to class' if to.class != String
|
21
|
+
raise ArgumentError, 'empty from' if to.empty?
|
22
|
+
raise ArgumentError, 'nil to_alias' if to_alias.nil?
|
23
|
+
raise ArgumentError, 'invalid to_alias class' if to_alias.class != \
|
24
|
+
String
|
25
|
+
raise ArgumentError, 'empty from' if to_alias.empty?
|
26
|
+
raise ArgumentError, 'nil subject' if subject.nil?
|
27
|
+
raise ArgumentError, 'invalid subject class' if subject.class != String
|
28
|
+
raise ArgumentError, 'nil message' if message.nil?
|
29
|
+
raise ArgumentError, 'invalid message class' if message.class != String
|
30
|
+
|
31
|
+
msg = <<EOM
|
32
|
+
From: #{from} <#{from_alias}>
|
33
|
+
To: #{to_alias} <#{to}>
|
34
|
+
Subject: #{subject}
|
35
|
+
|
36
|
+
#{message}
|
37
|
+
EOM
|
38
|
+
|
39
|
+
Net::SMTP.start(mta) do |smtp|
|
40
|
+
smtp.send_message(msg, from, to)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/rcl/timestamp.rb
CHANGED
@@ -87,6 +87,41 @@ module RCL
|
|
87
87
|
return str.join
|
88
88
|
|
89
89
|
end
|
90
|
+
|
91
|
+
def self.datestamp(ts)
|
92
|
+
raise ArgumentError, 'nil ts' if ts.nil?
|
93
|
+
raise ArgumentError, 'invalid ts class' if ts.class != Time
|
94
|
+
|
95
|
+
str = []
|
96
|
+
|
97
|
+
str << ts.year
|
98
|
+
str << '0' if ts.month < 10
|
99
|
+
str << ts.month
|
100
|
+
str << '0' if ts.day < 10
|
101
|
+
str << ts.day
|
102
|
+
|
103
|
+
str.join
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.timestamp(ts)
|
107
|
+
raise ArgumentError, 'nil ts' if ts.nil?
|
108
|
+
raise ArgumentError, 'invalid ts class' if ts.class != Time
|
109
|
+
|
110
|
+
str = []
|
111
|
+
|
112
|
+
str << '0' if ts.hour < 10
|
113
|
+
str << ts.hour
|
114
|
+
str << '0' if ts.min < 10
|
115
|
+
str << ts.min
|
116
|
+
str << '0' if ts.sec < 10
|
117
|
+
str << ts.sec
|
118
|
+
|
119
|
+
str.join
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.datetimestamp(ts)
|
123
|
+
"#{datestamp(ts)}T#{timestamp(ts)}"
|
124
|
+
end
|
90
125
|
end
|
91
126
|
|
92
127
|
raise RuntimeError, 'This library is for require only' if $0 == __FILE__
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rcl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ramsey Dow
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-02-
|
12
|
+
date: 2008-02-28 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -24,12 +24,17 @@ extra_rdoc_files:
|
|
24
24
|
files:
|
25
25
|
- lib/rcl.rb
|
26
26
|
- lib/rcl/base.rb
|
27
|
+
- lib/rcl/http.rb
|
27
28
|
- lib/rcl/perms.rb
|
28
29
|
- lib/rcl/shell.rb
|
30
|
+
- lib/rcl/smtp.rb
|
29
31
|
- lib/rcl/timestamp.rb
|
30
32
|
- lib/rcl/token.rb
|
31
33
|
- lib/rcl/url.rb
|
32
34
|
- lib/rcl/xml.rb
|
35
|
+
- lib/rcl/ext/ansicolour.rb
|
36
|
+
- lib/rcl/ext/dir.rb
|
37
|
+
- lib/rcl/ext/yaml_helper.rb
|
33
38
|
- README
|
34
39
|
has_rdoc: true
|
35
40
|
homepage: http://rcl.rubyforge.org/
|