facade 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/CHANGES +7 -0
  2. data/MANIFEST +9 -0
  3. data/README +39 -0
  4. data/lib/facade.rb +51 -0
  5. data/test/tc_facade.rb +55 -0
  6. metadata +48 -0
data/CHANGES ADDED
@@ -0,0 +1,7 @@
1
+ == 1.0.1 - 8-Jun-2005
2
+ * Moved project to RubyForge.
3
+ * Added a .gemspec file.
4
+ * Added a MANIFEST.
5
+
6
+ == 1.0.0 - 18-May-2005
7
+ * Initial release
@@ -0,0 +1,9 @@
1
+ CHANGES
2
+ MANIFEST
3
+ README
4
+ install.rb
5
+ facade.gemspec
6
+
7
+ lib/facade.rb
8
+
9
+ test/tc_facade.rb
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)
@@ -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
@@ -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
+