facade 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +7 -0
- data/MANIFEST +9 -0
- data/README +39 -0
- data/lib/facade.rb +51 -0
- data/test/tc_facade.rb +55 -0
- metadata +48 -0
data/CHANGES
ADDED
data/MANIFEST
ADDED
data/README
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
== Synopsis
|
2
|
+
An easy way to implement the facade pattern in your classes.
|
3
|
+
|
4
|
+
== Prerequisites
|
5
|
+
Ruby 1.8.0 or later
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
ruby test/tc_facade.rb (optional)
|
9
|
+
ruby install.rb
|
10
|
+
|
11
|
+
== Usage
|
12
|
+
require "facade"
|
13
|
+
class Foo < String
|
14
|
+
extend Facade
|
15
|
+
facade File, :dirname, :basename
|
16
|
+
facade Dir
|
17
|
+
end
|
18
|
+
|
19
|
+
f = Foo.new("/home/djberge")
|
20
|
+
puts f.basename # 'djberge'
|
21
|
+
puts f.dirname # '/home'
|
22
|
+
|
23
|
+
== Acknowledgements
|
24
|
+
Eero Saynatkari, Eric Hodel and Michael Granger for ideas and code which I
|
25
|
+
shamelessly plagiarized.
|
26
|
+
|
27
|
+
== Copyright
|
28
|
+
Copyright (c) 2005 Daniel J. Berger
|
29
|
+
Licensed under the same terms as Ruby itself.
|
30
|
+
|
31
|
+
== Warranty
|
32
|
+
This package is provided "as is" and without any express or
|
33
|
+
implied warranties, including, without limitation, the implied
|
34
|
+
warranties of merchantability and fitness for a particular purpose
|
35
|
+
|
36
|
+
== Author
|
37
|
+
Daniel J. Berger
|
38
|
+
djberg96 at yahoo dot com
|
39
|
+
imperator on IRC (freenode)
|
data/lib/facade.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# == Synopsis
|
2
|
+
# An easy way to implement the facade pattern for your Ruby classes
|
3
|
+
#
|
4
|
+
# == Usage
|
5
|
+
# require "facade"
|
6
|
+
# class Foo < String
|
7
|
+
# extend Facade
|
8
|
+
# facade File, :dirname, :basename
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# f = Foo.new("/home/djberge")
|
12
|
+
# puts f.basename # 'djberge'
|
13
|
+
# puts f.dirname # '/home'
|
14
|
+
#
|
15
|
+
# == Author
|
16
|
+
# Daniel J. Berger
|
17
|
+
# djberg96 at yahoo dot com
|
18
|
+
# imperator on IRC (freenode)
|
19
|
+
#
|
20
|
+
# == Copyright
|
21
|
+
# Copyright (c) 2005 Daniel J. Berger
|
22
|
+
# Licensed under the same terms as Ruby itself.
|
23
|
+
|
24
|
+
module Facade
|
25
|
+
FACADE_VERSION = "1.0.1"
|
26
|
+
|
27
|
+
# Forward a class method as an instance method of the including class
|
28
|
+
#
|
29
|
+
# call-seq:
|
30
|
+
# forward +Klass+, :method
|
31
|
+
# forward +Klass+, :method1, :method2, ...
|
32
|
+
#
|
33
|
+
# This will not override the class' existing methods.
|
34
|
+
def facade(klass, *methods)
|
35
|
+
methods.flatten!
|
36
|
+
methods = klass.methods(false) if methods.empty? # Default to all methods
|
37
|
+
methods.collect!{|m| m.to_s} # Symbols or strings
|
38
|
+
methods -= self.instance_methods # No clobber
|
39
|
+
|
40
|
+
methods.each do |methname|
|
41
|
+
define_method(methname){ ||
|
42
|
+
meth = klass.method(methname)
|
43
|
+
if meth.arity.zero? # Zero or one argument
|
44
|
+
meth.call
|
45
|
+
else
|
46
|
+
meth.call( self )
|
47
|
+
end
|
48
|
+
}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/test/tc_facade.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#####################################
|
2
|
+
# tc_facade.rb
|
3
|
+
#
|
4
|
+
# Test suite for the Facade module.
|
5
|
+
#####################################
|
6
|
+
base = File.basename(Dir.pwd)
|
7
|
+
if base == "test" || base =~ /facade.*/
|
8
|
+
Dir.chdir("..") if base == "test"
|
9
|
+
$LOAD_PATH.unshift(Dir.pwd)
|
10
|
+
$LOAD_PATH.unshift(Dir.pwd + "/lib")
|
11
|
+
end
|
12
|
+
|
13
|
+
require "test/unit"
|
14
|
+
require "facade"
|
15
|
+
|
16
|
+
class Foo < String
|
17
|
+
extend Facade
|
18
|
+
facade File, :basename, "dirname"
|
19
|
+
facade Dir
|
20
|
+
def blockdev?
|
21
|
+
"test"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class TC_Facade < Test::Unit::TestCase
|
26
|
+
def setup
|
27
|
+
@f = Foo.new("/home/djberge")
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_file_methods
|
31
|
+
assert_respond_to(@f, :basename)
|
32
|
+
assert_respond_to(@f, :dirname)
|
33
|
+
assert_raises(NoMethodError){ @f.exists? }
|
34
|
+
assert_raises(NoMethodError){ @f.chardev? }
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_file_method_return_values
|
38
|
+
assert_equal("djberge", @f.basename)
|
39
|
+
assert_equal("/home", @f.dirname)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_dir_methods
|
43
|
+
assert_respond_to(@f, :pwd)
|
44
|
+
assert_respond_to(@f, :entries)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_no_clobber
|
48
|
+
assert_respond_to(@f, :blockdev?)
|
49
|
+
assert_equal("test", @f.blockdev?)
|
50
|
+
end
|
51
|
+
|
52
|
+
def teardown
|
53
|
+
@f = nil
|
54
|
+
end
|
55
|
+
end
|
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.10
|
3
|
+
specification_version: 1
|
4
|
+
name: facade
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.0.1
|
7
|
+
date: 2005-06-09
|
8
|
+
summary: An easy way to implement the facade pattern in your class
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: djberg96@gmail.com
|
12
|
+
homepage: http://www.rubyforge.org/projects/shards
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
authors:
|
27
|
+
- Daniel J. Berger
|
28
|
+
files:
|
29
|
+
- lib/facade.rb
|
30
|
+
- CHANGES
|
31
|
+
- MANIFEST
|
32
|
+
- README
|
33
|
+
- test/tc_facade.rb
|
34
|
+
test_files:
|
35
|
+
- test/tc_facade.rb
|
36
|
+
rdoc_options: []
|
37
|
+
|
38
|
+
extra_rdoc_files:
|
39
|
+
- README
|
40
|
+
- CHANGES
|
41
|
+
executables: []
|
42
|
+
|
43
|
+
extensions: []
|
44
|
+
|
45
|
+
requirements: []
|
46
|
+
|
47
|
+
dependencies: []
|
48
|
+
|