facade 1.0.4 → 1.0.5
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 +3 -0
- data/README +22 -22
- data/Rakefile +19 -16
- data/facade.gemspec +18 -20
- data/lib/facade.rb +47 -47
- data/test/test_facade.rb +41 -41
- metadata +22 -10
data/CHANGES
CHANGED
data/README
CHANGED
@@ -1,40 +1,40 @@
|
|
1
1
|
== Synopsis
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
An easy way to implement the facade pattern in your classes. In short,
|
3
|
+
this library wraps singleton methods from another class as instance
|
4
|
+
methods of the current class.
|
5
5
|
|
6
6
|
== Prerequisites
|
7
|
-
|
7
|
+
Ruby 1.8.2 or later
|
8
8
|
|
9
9
|
== Installation
|
10
|
-
|
11
|
-
rake install (non-gem) or rake install_gem (gem)
|
10
|
+
gem install facade
|
12
11
|
|
13
12
|
== Usage
|
14
|
-
|
15
|
-
class MyString < String
|
16
|
-
extend Facade
|
17
|
-
facade File, :dirname, :basename
|
18
|
-
end
|
13
|
+
require 'facade'
|
19
14
|
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
class MyString < String
|
16
|
+
extend Facade
|
17
|
+
facade File, :dirname, :basename
|
18
|
+
end
|
19
|
+
|
20
|
+
f = MyString.new('/home/djberge')
|
21
|
+
puts f.basename # 'djberge'
|
22
|
+
puts f.dirname # '/home'
|
23
23
|
|
24
24
|
== Acknowledgements
|
25
|
-
|
26
|
-
|
25
|
+
Eero Saynatkari, Eric Hodel and Michael Granger for ideas and code which I
|
26
|
+
shamelessly plagiarized.
|
27
27
|
|
28
28
|
== Copyright
|
29
|
-
|
29
|
+
Copyright (c) 2005-2010 Daniel J. Berger
|
30
30
|
|
31
31
|
== License
|
32
|
-
|
32
|
+
Artistic 2.0
|
33
33
|
|
34
34
|
== Warranty
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
This package is provided "as is" and without any express or
|
36
|
+
implied warranties, including, without limitation, the implied
|
37
|
+
warranties of merchantability and fitness for a particular purpose
|
38
38
|
|
39
39
|
== Author
|
40
|
-
|
40
|
+
Daniel J. Berger
|
data/Rakefile
CHANGED
@@ -1,24 +1,27 @@
|
|
1
1
|
require 'rake'
|
2
|
+
require 'rake/clean'
|
2
3
|
require 'rake/testtask'
|
3
|
-
require 'rbconfig'
|
4
|
-
include Config
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
CLEAN.include("**/*.gem", "**/*.rbc")
|
6
|
+
|
7
|
+
namespace :gem do
|
8
|
+
desc 'Create the facade gem'
|
9
|
+
task :create => [:clean] do
|
10
|
+
spec = eval(IO.read('facade.gemspec'))
|
11
|
+
Gem::Builder.new(spec).build
|
12
|
+
end
|
12
13
|
|
13
|
-
desc 'Install the facade
|
14
|
-
task :
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
desc 'Install the facade gem'
|
15
|
+
task :install => [:create] do
|
16
|
+
file = Dir["*.gem"].first
|
17
|
+
sh "gem install #{file}"
|
18
|
+
end
|
18
19
|
end
|
19
20
|
|
20
21
|
Rake::TestTask.new do |t|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
t.libs << 'test'
|
23
|
+
t.verbose = true
|
24
|
+
t.warning = true
|
24
25
|
end
|
26
|
+
|
27
|
+
task :default => :test
|
data/facade.gemspec
CHANGED
@@ -1,25 +1,23 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'facade'
|
5
|
+
spec.version = '1.0.5'
|
6
|
+
spec.author = 'Daniel J. Berger'
|
7
|
+
spec.license = 'Artistic 2.0'
|
8
|
+
spec.email = 'djberg96@gmail.com'
|
9
|
+
spec.homepage = 'http://www.rubyforge.org/projects/shards'
|
10
|
+
spec.platform = Gem::Platform::RUBY
|
11
|
+
spec.summary = 'An easy way to implement the facade pattern in your class'
|
12
|
+
spec.test_file = 'test/test_facade.rb'
|
13
|
+
spec.has_rdoc = true
|
14
|
+
spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
15
15
|
|
16
|
-
|
17
|
-
|
16
|
+
spec.rubyforge_project = 'shards'
|
17
|
+
spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
spec.description = <<-EOF
|
20
|
+
The facade library allows you to mixin singleton methods from classes
|
21
|
+
or modules as instance methods of the extending class.
|
22
|
+
EOF
|
23
23
|
end
|
24
|
-
|
25
|
-
Gem::Builder.new(spec).build
|
data/lib/facade.rb
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
module Facade
|
2
|
-
|
3
|
-
|
2
|
+
# The version of the facade library
|
3
|
+
FACADE_VERSION = '1.0.5'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
5
|
+
# The facade method will forward a singleton method as an instance
|
6
|
+
# method of the extending class. If no arguments are provided, then all
|
7
|
+
# singleton methods of the class or module become instance methods.
|
8
|
+
#
|
9
|
+
# Existing instance methods are NOT overridden, but are instead ignored.
|
10
|
+
#
|
11
|
+
# Example:
|
12
|
+
#
|
13
|
+
# require 'facade'
|
14
|
+
#
|
15
|
+
# class MyString < String
|
16
|
+
# extend Facade
|
17
|
+
# facade File, :dirname, :basename
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# s = MyString.new('/home/djberge')
|
21
|
+
# s.basename # => 'djberge'
|
22
|
+
# s.dirname # => '/home'
|
23
|
+
#
|
24
|
+
def facade(klass, *methods)
|
25
|
+
methods = methods.flatten
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
27
|
+
if methods.empty? # Default to all methods
|
28
|
+
if klass.kind_of?(Class)
|
29
|
+
methods = klass.methods(false)
|
30
|
+
else
|
31
|
+
methods = klass.public_instance_methods(false)
|
33
32
|
end
|
33
|
+
end
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
# Convert all strings to symbols to stay sane between 1.8.x and 1.9.x
|
36
|
+
methods = methods.map{ |m| m.to_sym }
|
37
|
+
methods -= self.instance_methods.map{ |m| m.to_sym } # No clobber
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
39
|
+
methods.each do |methname|
|
40
|
+
define_method(methname){
|
41
|
+
if klass.kind_of?(Class)
|
42
|
+
meth = klass.method(methname)
|
43
|
+
else
|
44
|
+
meth = Object.new.extend(klass).method(methname)
|
45
|
+
end
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
47
|
+
if meth.arity.zero? # Zero or one argument
|
48
|
+
meth.call
|
49
|
+
else
|
50
|
+
meth.call(self)
|
51
|
+
end
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
55
|
end
|
data/test/test_facade.rb
CHANGED
@@ -8,59 +8,59 @@ require 'test/unit'
|
|
8
8
|
require 'facade'
|
9
9
|
|
10
10
|
module Baz
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def testme(str)
|
12
|
+
str
|
13
|
+
end
|
14
14
|
end
|
15
15
|
|
16
16
|
class FooString < String
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
extend Facade
|
18
|
+
facade File, :basename, 'dirname'
|
19
|
+
facade Dir
|
20
|
+
facade Baz
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
def blockdev?
|
23
|
+
'test'
|
24
|
+
end
|
25
25
|
end
|
26
26
|
|
27
27
|
class TC_Facade < Test::Unit::TestCase
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
def setup
|
29
|
+
@str = FooString.new('/home/djberge')
|
30
|
+
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
def test_facade_version
|
33
|
+
assert_equal('1.0.5', Facade::FACADE_VERSION)
|
34
|
+
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
36
|
+
def test_file_methods
|
37
|
+
assert_respond_to(@str, :basename)
|
38
|
+
assert_respond_to(@str, :dirname)
|
39
|
+
assert_raises(NoMethodError){ @str.executable? }
|
40
|
+
assert_raises(NoMethodError){ @str.chardev? }
|
41
|
+
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
def test_file_method_return_values
|
44
|
+
assert_equal('djberge', @str.basename)
|
45
|
+
assert_equal('/home', @str.dirname)
|
46
|
+
end
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
def test_dir_methods
|
49
|
+
assert_respond_to(@str, :pwd)
|
50
|
+
assert_respond_to(@str, :entries)
|
51
|
+
end
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
def test_no_clobber
|
54
|
+
assert_respond_to(@str, :blockdev?)
|
55
|
+
assert_equal('test', @str.blockdev?)
|
56
|
+
end
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
def test_module_methods
|
59
|
+
assert_respond_to(@str, :testme)
|
60
|
+
assert_equal('/home/djberge', @str.testme)
|
61
|
+
end
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
def teardown
|
64
|
+
@str = nil
|
65
|
+
end
|
66
66
|
end
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: facade
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 5
|
10
|
+
version: 1.0.5
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Daniel J. Berger
|
@@ -9,11 +15,11 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2010-11-10 00:00:00 -07:00
|
13
19
|
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
16
|
-
description: "
|
22
|
+
description: " The facade library allows you to mixin singleton methods from classes\n or modules as instance methods of the extending class.\n"
|
17
23
|
email: djberg96@gmail.com
|
18
24
|
executables: []
|
19
25
|
|
@@ -24,13 +30,13 @@ extra_rdoc_files:
|
|
24
30
|
- CHANGES
|
25
31
|
- MANIFEST
|
26
32
|
files:
|
27
|
-
- CHANGES
|
28
|
-
- facade.gemspec
|
29
|
-
- lib/facade.rb
|
30
|
-
- MANIFEST
|
31
33
|
- Rakefile
|
32
34
|
- README
|
35
|
+
- facade.gemspec
|
36
|
+
- lib/facade.rb
|
37
|
+
- CHANGES
|
33
38
|
- test/test_facade.rb
|
39
|
+
- MANIFEST
|
34
40
|
has_rdoc: true
|
35
41
|
homepage: http://www.rubyforge.org/projects/shards
|
36
42
|
licenses:
|
@@ -41,21 +47,27 @@ rdoc_options: []
|
|
41
47
|
require_paths:
|
42
48
|
- lib
|
43
49
|
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
44
51
|
requirements:
|
45
52
|
- - ">="
|
46
53
|
- !ruby/object:Gem::Version
|
54
|
+
hash: 3
|
55
|
+
segments:
|
56
|
+
- 0
|
47
57
|
version: "0"
|
48
|
-
version:
|
49
58
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
50
60
|
requirements:
|
51
61
|
- - ">="
|
52
62
|
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
53
66
|
version: "0"
|
54
|
-
version:
|
55
67
|
requirements: []
|
56
68
|
|
57
69
|
rubyforge_project: shards
|
58
|
-
rubygems_version: 1.3.
|
70
|
+
rubygems_version: 1.3.7
|
59
71
|
signing_key:
|
60
72
|
specification_version: 3
|
61
73
|
summary: An easy way to implement the facade pattern in your class
|