facade 1.0.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/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
|
+
|