composable 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,11 @@
1
+ = Composable
2
+
3
+ Simple implementation of the composite design pattern.
4
+
5
+ == Installation
6
+
7
+ $ sudo gem install composable --source http://gemcutter.org
8
+
9
+ == Usage
10
+
11
+ Still very alpha, documentation will come later.
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require "rake/testtask"
2
+
3
+ begin
4
+ require "hanna/rdoctask"
5
+ rescue LoadError
6
+ require "rake/rdoctask"
7
+ end
8
+
9
+ task :default => [:test]
10
+
11
+ Rake::TestTask.new do |t|
12
+ t.test_files = Dir["test/*_test.rb"]
13
+ end
14
+
15
+ Rake::RDocTask.new do |t|
16
+ t.title = "Composable Documentation"
17
+ t.main = "README.rdoc"
18
+ t.rdoc_files.include("README.rdoc", "lib/**/*.rb")
19
+ t.rdoc_dir = "doc"
20
+ end
data/lib/composable.rb ADDED
@@ -0,0 +1,63 @@
1
+ require 'rubygems'
2
+ require 'kinda-core'
3
+
4
+ module Kinda
5
+ module Composable
6
+ include Core
7
+
8
+ def add_child(child)
9
+ child.parent = self
10
+ child
11
+ end
12
+
13
+ alias_method :<<, :add_child
14
+
15
+ def remove_child(child)
16
+ child.parent = nil
17
+ end
18
+
19
+ def parent(klass=nil)
20
+ result = @parent
21
+ if klass
22
+ until result.nil? || result.kind_of?(klass) do
23
+ result = result.parent
24
+ end
25
+ end
26
+ result
27
+ end
28
+
29
+ def parent=(new_parent)
30
+ if respond_to?(:fire)
31
+ fire(:parent) { __parent_equal__(new_parent) }
32
+ else
33
+ __parent_equal__(new_parent)
34
+ end
35
+ end
36
+
37
+ def __parent_equal__(new_parent)
38
+ if old_parent = @parent
39
+ old_parent.children.delete(self)
40
+ old_parent.try(:child_removed, self)
41
+ end
42
+
43
+ @parent = new_parent
44
+
45
+ if new_parent
46
+ new_parent.children << self
47
+ new_parent.try(:child_added, self)
48
+ end
49
+ end
50
+
51
+ def child(klass=nil)
52
+ children.find { |child| klass.nil? || child.kind_of?(klass) }
53
+ end
54
+
55
+ attr_reader :children do
56
+ @children ||= []
57
+ end
58
+
59
+ def children?
60
+ !children.empty?
61
+ end
62
+ end
63
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), 'composable')
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/ruby19
2
+ # encoding: utf-8
3
+
4
+ require 'test/unit'
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')).uniq!
7
+ require 'kinda-composable'
8
+
9
+ class TestComposable < Test::Unit::TestCase
10
+ def setup
11
+ @grand_parent_class = Class.new do
12
+ include Kinda::Composable
13
+ end
14
+
15
+ @parent_class = Class.new do
16
+ include Kinda::Composable
17
+ end
18
+
19
+ @child_class = Class.new do
20
+ include Kinda::Composable
21
+ end
22
+
23
+ @grand_parent = @grand_parent_class.new
24
+ @parent = @parent_class.new
25
+ @parent2 = @parent_class.new
26
+ @child = @child_class.new
27
+ @child2 = @child_class.new
28
+ end
29
+
30
+ def test_add_child
31
+ @parent.add_child(@child)
32
+ assert @parent.children.size == 1
33
+ assert @parent.children.first == @child
34
+ assert @child.parent == @parent
35
+ end
36
+
37
+ def test_add_children
38
+ @parent.add_child(@child)
39
+ assert @parent.children.size == 1
40
+ @parent.add_child(@child) # same child added twice
41
+ assert @parent.children.size == 1
42
+ @parent.add_child(@child2)
43
+ assert @parent.children.size == 2
44
+ end
45
+
46
+ def test_children?
47
+ assert !@parent.children?
48
+ @parent.add_child(@child)
49
+ assert @parent.children?
50
+ end
51
+
52
+ def test_remove_children
53
+ @parent.add_child(@child)
54
+ @parent.add_child(@child2)
55
+ @parent.remove_child(@child)
56
+ assert @child.parent == nil
57
+ assert @parent.children.first == @child2
58
+ assert @child2.parent == @parent
59
+ @parent.remove_child(@child2)
60
+ assert @child2.parent == nil
61
+ assert !@parent.children?
62
+ end
63
+
64
+ def test_set_parent
65
+ @child.parent = @parent
66
+ assert @child.parent == @parent
67
+ assert @parent.children.size == 1
68
+ assert @parent.children.first == @child
69
+ end
70
+
71
+ def test_reset_parent
72
+ @child.parent = @parent
73
+ assert @child.parent == @parent
74
+ @child.parent = @parent2
75
+ assert !@parent.children?
76
+ assert @child.parent == @parent2
77
+ assert @parent2.children.size == 1
78
+ assert @parent2.children.first == @child
79
+ end
80
+
81
+ def test_parent_search
82
+ @grand_parent.add_child(@parent)
83
+ @parent.add_child(@child)
84
+ assert @child.parent == @parent
85
+ assert @child.parent(@parent_class) == @parent
86
+ assert @child.parent(@grand_parent_class) == @grand_parent
87
+ assert @parent.parent(@child_class) == nil
88
+ assert @grand_parent.parent(Object) == nil
89
+ end
90
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: composable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.9
5
+ platform: ruby
6
+ authors:
7
+ - Manuel Vila
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-12 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: kinda-core
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.1
24
+ version:
25
+ description: Simple implementation of the composite design pattern
26
+ email: mvila@3base.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ files:
34
+ - Rakefile
35
+ - lib/composable.rb
36
+ - lib/kinda-composable.rb
37
+ - README.rdoc
38
+ has_rdoc: true
39
+ homepage: http://github.com/kinda/composable
40
+ licenses: []
41
+
42
+ post_install_message:
43
+ rdoc_options: []
44
+
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 1.9.1
52
+ version:
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ requirements: []
60
+
61
+ rubyforge_project: kinda-composable
62
+ rubygems_version: 1.3.5
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: Simple implementation of the composite design pattern
66
+ test_files:
67
+ - test/composable_test.rb