quality_extensions 0.1.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/Readme +54 -0
- data/lib/qualitysmith_extensions/all.rb +4 -0
- data/lib/qualitysmith_extensions/array/all.rb +2 -0
- data/lib/qualitysmith_extensions/array/average.rb +44 -0
- data/lib/qualitysmith_extensions/array/classify.rb +97 -0
- data/lib/qualitysmith_extensions/array/expand_ranges.rb +52 -0
- data/lib/qualitysmith_extensions/array/group_by.rb +134 -0
- data/lib/qualitysmith_extensions/array/sequence.rb +66 -0
- data/lib/qualitysmith_extensions/array/shell_escape.rb +36 -0
- data/lib/qualitysmith_extensions/array/to_a_recursive.rb +41 -0
- data/lib/qualitysmith_extensions/array/to_query_string.rb +96 -0
- data/lib/qualitysmith_extensions/collection_extensions_for_cgi.rb +2 -0
- data/lib/qualitysmith_extensions/colored/toggleability.rb +62 -0
- data/lib/qualitysmith_extensions/console/command.facets.1.8.51.rb +749 -0
- data/lib/qualitysmith_extensions/console/command.facets.1.8.54.rb +748 -0
- data/lib/qualitysmith_extensions/console/command.rb +944 -0
- data/lib/qualitysmith_extensions/date/all.rb +2 -0
- data/lib/qualitysmith_extensions/date/deprecated.rb +40 -0
- data/lib/qualitysmith_extensions/date/iso8601.rb +31 -0
- data/lib/qualitysmith_extensions/date/month_ranges.rb +122 -0
- data/lib/qualitysmith_extensions/dir/each_child.rb +58 -0
- data/lib/qualitysmith_extensions/enumerable/enum.rb +69 -0
- data/lib/qualitysmith_extensions/enumerable/select_until.rb +4 -0
- data/lib/qualitysmith_extensions/enumerable/select_while.rb +109 -0
- data/lib/qualitysmith_extensions/exception/inspect_with_backtrace.rb +65 -0
- data/lib/qualitysmith_extensions/file/exact_match_regexp.rb +34 -0
- data/lib/qualitysmith_extensions/file_test/binary_file.rb +110 -0
- data/lib/qualitysmith_extensions/find/select.rb +68 -0
- data/lib/qualitysmith_extensions/global_variable_set.rb +153 -0
- data/lib/qualitysmith_extensions/hash/all.rb +2 -0
- data/lib/qualitysmith_extensions/hash/to_date.rb +34 -0
- data/lib/qualitysmith_extensions/hash/to_query_string.rb +121 -0
- data/lib/qualitysmith_extensions/kernel/all.rb +2 -0
- data/lib/qualitysmith_extensions/kernel/autoreload.rb +128 -0
- data/lib/qualitysmith_extensions/kernel/backtrace.rb +71 -0
- data/lib/qualitysmith_extensions/kernel/capture_output.rb +115 -0
- data/lib/qualitysmith_extensions/kernel/die.rb +49 -0
- data/lib/qualitysmith_extensions/kernel/example_printer.rb +81 -0
- data/lib/qualitysmith_extensions/kernel/filter_output.rb +108 -0
- data/lib/qualitysmith_extensions/kernel/remove_const.rb +178 -0
- data/lib/qualitysmith_extensions/kernel/remove_module.rb +127 -0
- data/lib/qualitysmith_extensions/kernel/require_all.rb +186 -0
- data/lib/qualitysmith_extensions/kernel/require_local_all.rb +4 -0
- data/lib/qualitysmith_extensions/kernel/require_once.rb +18 -0
- data/lib/qualitysmith_extensions/kernel/simulate_input.rb +52 -0
- data/lib/qualitysmith_extensions/kernel/trap_chain.rb +61 -0
- data/lib/qualitysmith_extensions/kernel/windows_platform.rb +46 -0
- data/lib/qualitysmith_extensions/module/alias_method.rb +6 -0
- data/lib/qualitysmith_extensions/module/alias_method_chain.rb +165 -0
- data/lib/qualitysmith_extensions/module/ancestry_of_instance_method.rb +43 -0
- data/lib/qualitysmith_extensions/module/attribute_accessors.rb +49 -0
- data/lib/qualitysmith_extensions/module/basename.rb +76 -0
- data/lib/qualitysmith_extensions/module/bool_attr_accessor.rb +497 -0
- data/lib/qualitysmith_extensions/module/class_methods.rb +87 -0
- data/lib/qualitysmith_extensions/module/create.rb +315 -0
- data/lib/qualitysmith_extensions/module/create_setter.rb +9 -0
- data/lib/qualitysmith_extensions/module/dirname.rb +4 -0
- data/lib/qualitysmith_extensions/module/guard_method.rb +312 -0
- data/lib/qualitysmith_extensions/module/includable_once.rb +10 -0
- data/lib/qualitysmith_extensions/module/join.rb +66 -0
- data/lib/qualitysmith_extensions/module/malias_method_chain.rb +92 -0
- data/lib/qualitysmith_extensions/module/module_methods.rb +4 -0
- data/lib/qualitysmith_extensions/module/namespace.rb +112 -0
- data/lib/qualitysmith_extensions/module/parents.rb +61 -0
- data/lib/qualitysmith_extensions/module/remove_const.rb +117 -0
- data/lib/qualitysmith_extensions/module/split.rb +55 -0
- data/lib/qualitysmith_extensions/month.rb +66 -0
- data/lib/qualitysmith_extensions/mutex/if_available.rb +75 -0
- data/lib/qualitysmith_extensions/object/ancestry_of_method.rb +257 -0
- data/lib/qualitysmith_extensions/object/default.rb +69 -0
- data/lib/qualitysmith_extensions/object/if_else.rb +157 -0
- data/lib/qualitysmith_extensions/object/ignore_access.rb +84 -0
- data/lib/qualitysmith_extensions/object/mcall.rb +92 -0
- data/lib/qualitysmith_extensions/object/methods.rb +63 -0
- data/lib/qualitysmith_extensions/object/send_if.rb +151 -0
- data/lib/qualitysmith_extensions/object/send_if_not_nil.rb +35 -0
- data/lib/qualitysmith_extensions/object/singleton_send.rb +129 -0
- data/lib/qualitysmith_extensions/regexp/join.rb +111 -0
- data/lib/qualitysmith_extensions/string/all.rb +2 -0
- data/lib/qualitysmith_extensions/string/constantize.rb +4 -0
- data/lib/qualitysmith_extensions/string/digits_only.rb +27 -0
- data/lib/qualitysmith_extensions/string/each_char_with_index.rb +41 -0
- data/lib/qualitysmith_extensions/string/md5.rb +29 -0
- data/lib/qualitysmith_extensions/string/shell_escape.rb +43 -0
- data/lib/qualitysmith_extensions/string/to_underscored_label.rb +37 -0
- data/lib/qualitysmith_extensions/string/with_knowledge_of_color.rb +64 -0
- data/lib/qualitysmith_extensions/symbol/constantize.rb +69 -0
- data/lib/qualitysmith_extensions/symbol/match.rb +157 -0
- data/lib/qualitysmith_extensions/template.rb +33 -0
- data/lib/qualitysmith_extensions/test/all.rb +2 -0
- data/lib/qualitysmith_extensions/test/assert_anything.rb +93 -0
- data/lib/qualitysmith_extensions/test/assert_changed.rb +66 -0
- data/lib/qualitysmith_extensions/test/assert_exception.rb +66 -0
- data/lib/qualitysmith_extensions/test/assert_includes.rb +36 -0
- data/lib/qualitysmith_extensions/test/assert_user_error.rb +37 -0
- data/lib/qualitysmith_extensions/test/difference_highlighting.rb +323 -0
- data/lib/qualitysmith_extensions/time/all.rb +2 -0
- data/lib/qualitysmith_extensions/time/deprecated.rb +31 -0
- data/test/all.rb +16 -0
- metadata +148 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Tyler Rick
|
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
|
4
|
+
# License:: Ruby License
|
|
5
|
+
# Submit to Facets?:: Yes
|
|
6
|
+
# Developer notes::
|
|
7
|
+
# * Add depth argument to inspect()?
|
|
8
|
+
#++
|
|
9
|
+
|
|
10
|
+
require 'rubygems'
|
|
11
|
+
require 'facets/core/module/alias_method_chain'
|
|
12
|
+
|
|
13
|
+
class Exception
|
|
14
|
+
# Use this if you want to output an exception with all the details that you'd *normally* see if the exception went unrescued
|
|
15
|
+
# (since exception.inspect/p exception doesn't provide a backtrace!)
|
|
16
|
+
#
|
|
17
|
+
# This is mostly useful if you rescue an exception, want to print or log it and then re-raise it...
|
|
18
|
+
#
|
|
19
|
+
# Use inspect_without_backtrace if you want to access the previous behavior (<tt>#<MissingSourceFile: no such file to load -- whatever></tt>).
|
|
20
|
+
#
|
|
21
|
+
def inspect_with_backtrace
|
|
22
|
+
exception.class.name + ": " + exception.message + "\n" +
|
|
23
|
+
exception.backtrace.map {|v| ' ' + v}.join( "\n" )
|
|
24
|
+
end
|
|
25
|
+
alias_method_chain :inspect, :backtrace
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# _____ _
|
|
30
|
+
# |_ _|__ ___| |_
|
|
31
|
+
# | |/ _ \/ __| __|
|
|
32
|
+
# | | __/\__ \ |_
|
|
33
|
+
# |_|\___||___/\__|
|
|
34
|
+
#
|
|
35
|
+
=begin test
|
|
36
|
+
require 'rubygems'
|
|
37
|
+
require 'facets/core/string/lines'
|
|
38
|
+
|
|
39
|
+
class TheTest < Test::Unit::TestCase
|
|
40
|
+
def raise_an_error(arg = nil)
|
|
41
|
+
raise ArgumentError, "You passed in the wrong argument!"
|
|
42
|
+
end
|
|
43
|
+
def test_1
|
|
44
|
+
begin
|
|
45
|
+
raise_an_error
|
|
46
|
+
rescue ArgumentError => exception
|
|
47
|
+
#puts exception.inspect
|
|
48
|
+
assert_equal 'ArgumentError: You passed in the wrong argument!', exception.inspect.lines[0]
|
|
49
|
+
assert_match /[^:]+:\d+:in `raise_an_error'/, exception.inspect.lines[1]
|
|
50
|
+
assert exception.inspect.lines.size > 3
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
=end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
=begin
|
|
59
|
+
Sightings of other exception -> string formatters
|
|
60
|
+
|
|
61
|
+
log4r/formatter/formatter.rb
|
|
62
|
+
return "Caught #{obj.class}: #{obj.message}\n\t" +\
|
|
63
|
+
obj.backtrace[0...@depth].join("\n\t")
|
|
64
|
+
|
|
65
|
+
=end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Tyler Rick
|
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
|
4
|
+
# License:: Ruby License
|
|
5
|
+
# Submit to Facets?:: Yes
|
|
6
|
+
#++
|
|
7
|
+
|
|
8
|
+
# To do:
|
|
9
|
+
# * Is there a more object-oriented way to do this? Instance method instead of class method?
|
|
10
|
+
|
|
11
|
+
class File
|
|
12
|
+
def self.exact_match_regexp(filename)
|
|
13
|
+
/(^|\/)#{Regexp.escape(filename)}$/
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# _____ _
|
|
18
|
+
# |_ _|__ ___| |_
|
|
19
|
+
# | |/ _ \/ __| __|
|
|
20
|
+
# | | __/\__ \ |_
|
|
21
|
+
# |_|\___||___/\__|
|
|
22
|
+
#
|
|
23
|
+
=begin test
|
|
24
|
+
|
|
25
|
+
class TheTest < Test::Unit::TestCase
|
|
26
|
+
def test_1
|
|
27
|
+
assert 'bar.rb' =~ File.exact_match_regexp('bar.rb')
|
|
28
|
+
assert '/path/to/bar.rb' =~ File.exact_match_regexp('bar.rb')
|
|
29
|
+
# But:
|
|
30
|
+
assert 'foobar.rb' !~ File.exact_match_regexp('bar.rb')
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
=end
|
|
34
|
+
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Lloyd Zusman, Tyler Rick
|
|
3
|
+
# Copyright:: Copyright (c) 2002-2007 Lloyd Zusman
|
|
4
|
+
# License:: Ruby License
|
|
5
|
+
# History::
|
|
6
|
+
# * 2002-10-05: Based on code posted by Lloyd Zusman on ruby-talk on 2002-10-05 (http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/52548)
|
|
7
|
+
# * 2007-03-15: Cleaned up a bit and wrote tests.
|
|
8
|
+
# Submit to Facets?:: Yes
|
|
9
|
+
#++
|
|
10
|
+
|
|
11
|
+
module FileTest
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
def self.is_text?(block)
|
|
15
|
+
return (block.count("^ -~", "^\b\f\t\r\n") < (block.size / 3.0) &&
|
|
16
|
+
block.count("\x00") < 1)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
public
|
|
20
|
+
# The text_file? and binary_file? methods are not inverses of each other. Both return false if the item is not a file, or if it
|
|
21
|
+
# is a zero-length file. The "textness" or "binariness" of a file can only be determined if it's a file that contains at least
|
|
22
|
+
# one byte.
|
|
23
|
+
|
|
24
|
+
def self._binary_file?(filename)
|
|
25
|
+
size = self.size(filename)
|
|
26
|
+
blksize = File.stat(filename).blksize
|
|
27
|
+
return nil if !File.file?(filename) || size < 1
|
|
28
|
+
size = [size, blksize].min
|
|
29
|
+
begin
|
|
30
|
+
open(filename) {
|
|
31
|
+
|file|
|
|
32
|
+
block = file.read(size)
|
|
33
|
+
return !self.is_text?(block)
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.binary_file?(filename)
|
|
39
|
+
self._binary_file?(filename)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def self.text_file?(filename)
|
|
43
|
+
return_value = self._binary_file?(filename)
|
|
44
|
+
if return_value.nil?
|
|
45
|
+
return_value
|
|
46
|
+
else
|
|
47
|
+
!return_value
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# _____ _
|
|
53
|
+
# |_ _|__ ___| |_
|
|
54
|
+
# | |/ _ \/ __| __|
|
|
55
|
+
# | | __/\__ \ |_
|
|
56
|
+
# |_|\___||___/\__|
|
|
57
|
+
#
|
|
58
|
+
=begin test
|
|
59
|
+
require 'test/unit'
|
|
60
|
+
require 'fileutils'
|
|
61
|
+
|
|
62
|
+
class TheTest < Test::Unit::TestCase
|
|
63
|
+
def empty_file
|
|
64
|
+
File.open(filename = 'test_file', 'w') do |file|
|
|
65
|
+
end
|
|
66
|
+
yield filename
|
|
67
|
+
ensure
|
|
68
|
+
FileUtils.rm filename
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def binary_file
|
|
72
|
+
File.open(filename = 'test_file', 'wb') do |file|
|
|
73
|
+
bin_data = [0].pack('c')*(1024)
|
|
74
|
+
file.write(bin_data)
|
|
75
|
+
end
|
|
76
|
+
yield filename
|
|
77
|
+
ensure
|
|
78
|
+
FileUtils.rm filename
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def text_file
|
|
82
|
+
File.open(filename = 'test_file', 'w') do |file|
|
|
83
|
+
file.puts('Guten Tag!')
|
|
84
|
+
end
|
|
85
|
+
yield filename
|
|
86
|
+
ensure
|
|
87
|
+
FileUtils.rm filename
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_empty
|
|
91
|
+
empty_file do |filename|
|
|
92
|
+
assert !FileTest.binary_file?(filename)
|
|
93
|
+
assert !FileTest.text_file?(filename)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
def test_binary
|
|
97
|
+
binary_file do |filename|
|
|
98
|
+
assert FileTest.binary_file?(filename)
|
|
99
|
+
assert !FileTest.text_file?(filename)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
def test_text
|
|
103
|
+
text_file do |filename|
|
|
104
|
+
assert !FileTest.binary_file?(filename)
|
|
105
|
+
assert FileTest.text_file?(filename)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
=end
|
|
110
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Tyler Rick
|
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
|
4
|
+
# License:: Ruby License
|
|
5
|
+
# Submit to Facets?::
|
|
6
|
+
# Developer notes::
|
|
7
|
+
# Changes::
|
|
8
|
+
#++
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
require 'find'
|
|
12
|
+
require 'enumerator'
|
|
13
|
+
|
|
14
|
+
module Find
|
|
15
|
+
# Identical to +find+ except +select+ returns the matching files as an _array_. (+find+ returns nil, which is not very useful if you actually wanted an array.)
|
|
16
|
+
#
|
|
17
|
+
# Calls the associated block with the name of every file and directory listed as arguments, then recursively on their subdirectories, and so on.
|
|
18
|
+
#
|
|
19
|
+
# Return a true (non-false) value from the block for every path that you want to be returned in the resulting array.
|
|
20
|
+
#
|
|
21
|
+
# You can still use <tt>Find.prune</tt>.
|
|
22
|
+
#
|
|
23
|
+
def self.select(*paths, &block)
|
|
24
|
+
Enumerable::Enumerator.new(self, :find, *paths).select{|value| yield value}
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# _____ _
|
|
34
|
+
# |_ _|__ ___| |_
|
|
35
|
+
# | |/ _ \/ __| __|
|
|
36
|
+
# | | __/\__ \ |_
|
|
37
|
+
# |_|\___||___/\__|
|
|
38
|
+
#
|
|
39
|
+
=begin test
|
|
40
|
+
require 'test/unit'
|
|
41
|
+
|
|
42
|
+
class TheTest < Test::Unit::TestCase
|
|
43
|
+
# to do: would probably be safer if we *created* our own files/directories during setup, rather than expecting there to be some for us to use in cwd
|
|
44
|
+
|
|
45
|
+
def test_true
|
|
46
|
+
dir = '.'
|
|
47
|
+
files_expected = []
|
|
48
|
+
Find.find(dir) { |path| files_expected << path }
|
|
49
|
+
|
|
50
|
+
files = Find.select(dir) { |path| true }
|
|
51
|
+
assert_equal files_expected, files
|
|
52
|
+
|
|
53
|
+
# Doesn't have to be true necessarily -- can be a string
|
|
54
|
+
files = Find.select(dir) { |path| path }
|
|
55
|
+
assert_equal files_expected, files
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_false
|
|
59
|
+
dir = '.'
|
|
60
|
+
files = Find.select(dir) { |path| false }
|
|
61
|
+
|
|
62
|
+
assert_equal [], files
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
=end
|
|
67
|
+
|
|
68
|
+
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Tyler Rick
|
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
|
4
|
+
# License:: Ruby License
|
|
5
|
+
# Submit to Facets?:: No, too ugly and unreliable.
|
|
6
|
+
#++
|
|
7
|
+
|
|
8
|
+
module Kernel
|
|
9
|
+
# Gets the global variable +var+, which can either be a symbol or an actual global variable (use +:match_object+).
|
|
10
|
+
# global_variable_get(:$a)
|
|
11
|
+
# global_variable_get($a, :match_object => true)
|
|
12
|
+
def global_variable_get(var, options = {})
|
|
13
|
+
if options.delete(:match_object)
|
|
14
|
+
return global_variable_get(global_variable_name(var), options)
|
|
15
|
+
else
|
|
16
|
+
if var.is_a? Symbol
|
|
17
|
+
raise NameError.new("#{var} is not a valid global variable name") unless var.to_s[0..0] == '$'
|
|
18
|
+
return eval("#{var}")
|
|
19
|
+
else
|
|
20
|
+
raise ArgumentError.new("var must be a symbol unless :match_object => true")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Looks up the name of global variable +var+, which must be an actual global variable.
|
|
26
|
+
# global_variable_name($a)
|
|
27
|
+
def global_variable_name(var)
|
|
28
|
+
global_variables.each do |test_var|
|
|
29
|
+
#if eval(test_var).eql?(var)
|
|
30
|
+
if eval(test_var).object_id == var.object_id
|
|
31
|
+
#$stderr.puts "Checking #{test_var}. #{eval(test_var).inspect}"
|
|
32
|
+
#$stderr.puts " #{$stdout.inspect}"
|
|
33
|
+
return test_var.to_sym
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
raise ArgumentError.new("The given object (#{var.inspect}) (#{var.object_id}) is not a valid global variable")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Sets the global variable +var+, which can either be a symbol or an actual global variable (use +:match_object+).
|
|
40
|
+
# global_variable_set(:$a, 'new')
|
|
41
|
+
# global_variable_set($a, 'new', :match_object => true)
|
|
42
|
+
# global_variable_set(:$a, "StringIO.new", :eval_string => true)
|
|
43
|
+
def global_variable_set(var, value, options = {})
|
|
44
|
+
#puts "global_variable_set(#{var}, #{value.inspect}, #{options.inspect}"
|
|
45
|
+
if options.delete(:match_object)
|
|
46
|
+
return global_variable_set(global_variable_name(var), value, options)
|
|
47
|
+
else
|
|
48
|
+
if var.is_a? Symbol
|
|
49
|
+
raise NameError.new("#{var} is not a valid global variable name") unless var.to_s[0..0] == '$'
|
|
50
|
+
if options.delete(:eval_string)
|
|
51
|
+
#puts("About to eval: #{var} = #{value}")
|
|
52
|
+
eval("#{var} = #{value}")
|
|
53
|
+
else
|
|
54
|
+
marshalled_data = Marshal.dump(value)
|
|
55
|
+
eval("#{var} = Marshal.load(%Q<#{marshalled_data}>)")
|
|
56
|
+
end
|
|
57
|
+
return var
|
|
58
|
+
else
|
|
59
|
+
raise ArgumentError.new("var must be a symbol unless :match_object => true")
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# _____ _
|
|
66
|
+
# |_ _|__ ___| |_
|
|
67
|
+
# | |/ _ \/ __| __|
|
|
68
|
+
# | | __/\__ \ |_
|
|
69
|
+
# |_|\___||___/\__|
|
|
70
|
+
#
|
|
71
|
+
=begin test
|
|
72
|
+
require 'test/unit'
|
|
73
|
+
require 'stringio'
|
|
74
|
+
|
|
75
|
+
class MyClass
|
|
76
|
+
attr_reader :data
|
|
77
|
+
@data = [:foo]
|
|
78
|
+
def ==(other)
|
|
79
|
+
self.data == other.data
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class GlobalVariableGetTest < Test::Unit::TestCase
|
|
84
|
+
def test_simple
|
|
85
|
+
$a = 'old'
|
|
86
|
+
assert_equal 'old', global_variable_get(:$a)
|
|
87
|
+
assert_equal :$a, global_variable_name($a)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_can_pass_variable_instead_of_symbol
|
|
91
|
+
$a = 'old'
|
|
92
|
+
assert_equal 'old', global_variable_get($a, :match_object => true)
|
|
93
|
+
|
|
94
|
+
$a = :already_a_symbol
|
|
95
|
+
assert_raise(NameError) { global_variable_get($a) } # If the global ($a) contains a symbol, it will assume we want to get the global variable *named* :$already_a_symbol . Wrong! That's why the :match_object option was introduced.
|
|
96
|
+
assert_nothing_raised { global_variable_get($a, :match_object => true) }
|
|
97
|
+
assert_equal :already_a_symbol, global_variable_get($a, :match_object => true)
|
|
98
|
+
assert_equal :$a, global_variable_name($a)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_error
|
|
102
|
+
assert_raise(NameError) { global_variable_get(:a) } # Must be :$a, not :a
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
class GlobalVariableSetTest < Test::Unit::TestCase
|
|
107
|
+
def test_simple
|
|
108
|
+
$a = 'old'
|
|
109
|
+
global_variable_set(:$a, 'new')
|
|
110
|
+
assert_equal('new', $a)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_can_pass_variable_instead_of_symbol
|
|
114
|
+
$a = 'old'
|
|
115
|
+
global_variable_set($a, 'new', :match_object => true)
|
|
116
|
+
assert_equal('new', $a)
|
|
117
|
+
|
|
118
|
+
$a = :already_a_symbol
|
|
119
|
+
assert_raise(NameError) { global_variable_set($a, expected = :a_symbol) } # If the global ($a) contains a symbol, it will assume we want to set the global variable *named* :$already_a_symbol . Wrong! That's why the :match_object option was introduced.
|
|
120
|
+
assert_nothing_raised { global_variable_set($a, expected = :a_symbol, :match_object => true) }
|
|
121
|
+
global_variable_set(:$a, expected = :a_symbol)
|
|
122
|
+
assert_equal(expected, $a)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_returns_name_of_variable
|
|
126
|
+
$a = 'old'
|
|
127
|
+
assert_equal(:$a, global_variable_set(:$a, 'new'))
|
|
128
|
+
|
|
129
|
+
$a = 'old'
|
|
130
|
+
assert_equal(:$a, global_variable_set($a, 'new', :match_object => true))
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_works_for_complex_data_types
|
|
134
|
+
$a = 'old'
|
|
135
|
+
global_variable_set(:$a, expected = {:a => 'a', :b => ['1', 2]})
|
|
136
|
+
assert_equal(expected, $a)
|
|
137
|
+
|
|
138
|
+
global_variable_set(:$a, expected = MyClass.new)
|
|
139
|
+
assert !expected.eql?( $a ) # :bug: The way we do it currently, they'll have different object_id's
|
|
140
|
+
assert_equal(expected, $a)
|
|
141
|
+
|
|
142
|
+
assert_raise(TypeError) { global_variable_set(:$a, expected = $stdout) } # "can't dump IO".
|
|
143
|
+
assert_raise(TypeError) { global_variable_set(:$a, expected = StringIO.new) } # "no marshal_dump is defined for class StringIO". That's why the :eval_string option was introduced.
|
|
144
|
+
assert_nothing_raised { global_variable_set(:$a, expected = "StringIO.new", :eval_string => true) }
|
|
145
|
+
assert $a.is_a?(StringIO)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_error
|
|
149
|
+
assert_raise(NameError) { global_variable_set(:a, 'new') } # Must be :$a, not :a
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
=end
|
|
153
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Tyler Rick
|
|
3
|
+
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
|
4
|
+
# License:: Ruby License
|
|
5
|
+
# Submit to Facets?:: Yes. Unless it is deemed not generally reusable enough. Also, only if we can get a Date.new(y,m,d) added to Facets.
|
|
6
|
+
#++
|
|
7
|
+
|
|
8
|
+
require "rubygems"
|
|
9
|
+
require "active_support"
|
|
10
|
+
|
|
11
|
+
class Hash
|
|
12
|
+
# Converts a <tt>{:year => ..., :month => ..., :day => ...}</tt> hash into an actual Date object.
|
|
13
|
+
# Useful for when you have a date element in your <tt>params</tt> hash.
|
|
14
|
+
def to_date
|
|
15
|
+
Date.new(fetch(:year).to_i, fetch(:month).to_i, fetch(:day).to_i)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# _____ _
|
|
20
|
+
# |_ _|__ ___| |_
|
|
21
|
+
# | |/ _ \/ __| __|
|
|
22
|
+
# | | __/\__ \ |_
|
|
23
|
+
# |_|\___||___/\__|
|
|
24
|
+
#
|
|
25
|
+
=begin test
|
|
26
|
+
class TheTest < Test::Unit::TestCase
|
|
27
|
+
def test_Hash_to_date
|
|
28
|
+
assert_equal Date.new(2007, 1, 22), {:year => "2007", :month => "01", :day => 22}.to_date
|
|
29
|
+
end
|
|
30
|
+
def test_HashWithIndifferentAccess_to_date
|
|
31
|
+
assert_equal Date.new(2007, 1, 22), HashWithIndifferentAccess.new({:year => "2007", 'month' => 01, :day => 22}).to_date
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
=end
|