RubyExt 0.1.0 → 0.1.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.
Files changed (100) hide show
  1. data/README +846 -0
  2. data/lib/RubyExt/Cache.rb +101 -0
  3. data/lib/RubyExt/Cache.res/multiple_version_with_args.txt +12 -0
  4. data/lib/RubyExt/Cache.res/multiple_version_without_args.txt +11 -0
  5. data/lib/RubyExt/Cache.res/single_version_with_args.txt +11 -0
  6. data/lib/RubyExt/Cache.res/single_version_without_args.txt +10 -0
  7. data/lib/RubyExt/ClassLoader.rb +142 -0
  8. data/lib/RubyExt/Debug.rb +24 -0
  9. data/lib/RubyExt/ExtraBlankSlate.rb +14 -0
  10. data/lib/RubyExt/ImportAll.rb +9 -0
  11. data/lib/RubyExt/Localization/Module.rb +12 -0
  12. data/lib/RubyExt/Localization/Object.rb +19 -0
  13. data/lib/RubyExt/Localization/require.rb +3 -0
  14. data/lib/RubyExt/Localization.rb +28 -0
  15. data/lib/RubyExt/Log.config.sample +57 -0
  16. data/lib/RubyExt/Log.rb +59 -0
  17. data/lib/RubyExt/OpenConstructor.rb +51 -0
  18. data/lib/RubyExt/Path.rb +91 -0
  19. data/lib/RubyExt/Resource/file_system_provider.rb +244 -0
  20. data/lib/RubyExt/StateMashine.rb +176 -0
  21. data/lib/RubyExt/Synchronizer.rb +29 -0
  22. data/lib/RubyExt/array.rb +24 -0
  23. data/lib/RubyExt/assert.rb +111 -0
  24. data/lib/RubyExt/class.rb +0 -0
  25. data/lib/RubyExt/debug.rb +71 -0
  26. data/lib/RubyExt/false_class.rb +5 -0
  27. data/lib/RubyExt/file.rb +23 -0
  28. data/lib/RubyExt/ideas.txt +17 -0
  29. data/lib/RubyExt/kernel.rb +61 -0
  30. data/lib/RubyExt/module.rb +102 -0
  31. data/lib/RubyExt/nil_class.rb +5 -0
  32. data/lib/RubyExt/object.rb +7 -0
  33. data/lib/RubyExt/observable.rb +25 -0
  34. data/lib/RubyExt/require.rb +56 -0
  35. data/lib/RubyExt/require_base.rb +35 -0
  36. data/lib/RubyExt/resource.rb +198 -0
  37. data/lib/RubyExt/string.rb +21 -0
  38. data/lib/RubyExt/symbol.rb +21 -0
  39. data/lib/RubyExt/true_class +0 -0
  40. data/lib/RubyExt/true_class.rb +5 -0
  41. data/rakefile +49 -0
  42. data/spec/RubyExt/ForClassLoader/ClassA.rb +4 -0
  43. data/spec/RubyExt/ForClassLoader/LoadCount.rb +1 -0
  44. data/spec/RubyExt/ForClassLoader/ModuleA/ClassB.rb +3 -0
  45. data/spec/RubyExt/ForClassLoader/ModuleA/ClassInsideAnonymousClass.rb +3 -0
  46. data/spec/RubyExt/ForClassLoader/ModuleA/InfinityLoop.rb +3 -0
  47. data/spec/RubyExt/ForClassLoader/ModuleA/ModuleB/ClassC.rb +3 -0
  48. data/spec/RubyExt/ForClassLoader/ModuleA/SameName/SomeClass.rb +2 -0
  49. data/spec/RubyExt/ForClassLoader/ModuleA/SameName.rb +2 -0
  50. data/spec/RubyExt/ForClassLoader/Scope/ScopeA1.rb +3 -0
  51. data/spec/RubyExt/ForClassLoader/Scope/ScopeB1.rb +5 -0
  52. data/spec/RubyExt/ForKernel/Raise2.rb +5 -0
  53. data/spec/RubyExt/ForKernel/RaiseWithoutSelf.rb +9 -0
  54. data/spec/RubyExt/ForLocalization/NS/A.rb +3 -0
  55. data/spec/RubyExt/ForLocalization/NS/A.ru.localization.yaml +2 -0
  56. data/spec/RubyExt/ForLocalization/NS/B.rb +22 -0
  57. data/spec/RubyExt/ForLocalization/NS/B.ru.localization.yaml +3 -0
  58. data/spec/RubyExt/ForLocalization/NS.ru.localization.yaml +2 -0
  59. data/spec/RubyExt/ForModule/NS1/A.data +1 -0
  60. data/spec/RubyExt/ForModule/NS1/A.rb +1 -0
  61. data/spec/RubyExt/ForModule/NS1/A2.rb +1 -0
  62. data/spec/RubyExt/ForModule/NS1/B.rb +2 -0
  63. data/spec/RubyExt/ForModule/NS1/B2.rb +1 -0
  64. data/spec/RubyExt/ForModule/NS1.data +1 -0
  65. data/spec/RubyExt/ForModule/NS2/A.data +1 -0
  66. data/spec/RubyExt/ForModule/NS2/A.rb +3 -0
  67. data/spec/RubyExt/ForModule/NS2/B.rb +3 -0
  68. data/spec/RubyExt/ForModule/NS2/M.data +1 -0
  69. data/spec/RubyExt/ForModule/NS2/M.rb +3 -0
  70. data/spec/RubyExt/ForResource/ChangedClass.rb +1 -0
  71. data/spec/RubyExt/ForResource/ChangedClass.res/Text.txt +0 -0
  72. data/spec/RubyExt/ForResource/ChangedClass.txt +0 -0
  73. data/spec/RubyExt/ForResource/ProviderChaining/ProviderABaseDir/ChainTest.rb +3 -0
  74. data/spec/RubyExt/ForResource/ProviderChaining/ProviderABaseDir/ChainTest.resource +1 -0
  75. data/spec/RubyExt/ForResource/ProviderChaining/ProviderABaseDir/ClassExistOnlyInProviderA.rb +3 -0
  76. data/spec/RubyExt/ForResource/ProviderChaining/ProviderBBaseDir/ChainTest.rb +3 -0
  77. data/spec/RubyExt/ForResource/ProviderChaining/ProviderBBaseDir/ChainTest.resource +1 -0
  78. data/spec/RubyExt/ForResource/ResourceExtension.rb +1 -0
  79. data/spec/RubyExt/ForResource/ResourceExtension.res/Data.yaml +2 -0
  80. data/spec/RubyExt/ForResource/ResourceTest/Test.rb +1 -0
  81. data/spec/RubyExt/ForResource/ResourceTest/Test.res/Data.txt +1 -0
  82. data/spec/RubyExt/ForResource/ResourceTest/Test.res/txt +1 -0
  83. data/spec/array_spec.rb +27 -0
  84. data/spec/assert_spec.rb +18 -0
  85. data/spec/cache_spec.rb +95 -0
  86. data/spec/class_loader_spec.rb +94 -0
  87. data/spec/import_all_spec.rb +21 -0
  88. data/spec/kernel_spec.rb +38 -0
  89. data/spec/localization_spec.rb +49 -0
  90. data/spec/module_spec.rb +135 -0
  91. data/spec/object_spec.rb +8 -0
  92. data/spec/observable_spec.rb +44 -0
  93. data/spec/open_constructor_spec.rb +38 -0
  94. data/spec/path_spec.rb +169 -0
  95. data/spec/resource_spec.rb +135 -0
  96. data/spec/state_machine_spec.rb +201 -0
  97. data/spec/synchronizer_spec.rb +66 -0
  98. metadata +130 -10
  99. data/lib/RubyExt.rb +0 -1
  100. data/lib/hello_gem.rb +0 -5
@@ -0,0 +1,22 @@
1
+ class B < A
2
+ def message
3
+ to_l("English")
4
+ end
5
+
6
+ def class_hierarchy_message
7
+ to_l("Class Hierarchy English")
8
+ end
9
+
10
+ def namespace_hierarchy_message
11
+ to_l("Namespace Hierarchy English")
12
+ end
13
+
14
+ def substitution
15
+ value = 10
16
+ to_l("English \#{value}", binding)
17
+ end
18
+
19
+ def not_localized
20
+ to_l("English Not Localized")
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ "English": "Russian"
3
+ "English #{value}": "Russian #{value}"
@@ -0,0 +1,2 @@
1
+ ---
2
+ "Namespace Hierarchy English": "Namespace Hierarchy Russian"
@@ -0,0 +1 @@
1
+ A.data
@@ -0,0 +1 @@
1
+ class A; end
@@ -0,0 +1 @@
1
+ class A2; end
@@ -0,0 +1,2 @@
1
+ class B < ForModule::NS1::A
2
+ end
@@ -0,0 +1 @@
1
+ class B2 < ForModule::NS1::A2; end
@@ -0,0 +1 @@
1
+ NS1.data
@@ -0,0 +1 @@
1
+ A.data
@@ -0,0 +1,3 @@
1
+ class A
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class B < ForModule::NS2::A
2
+ include ForModule::NS2::M
3
+ end
@@ -0,0 +1 @@
1
+ M.data
@@ -0,0 +1,3 @@
1
+ module M
2
+
3
+ end
@@ -0,0 +1 @@
1
+ class ChangedClass; end
File without changes
@@ -0,0 +1,3 @@
1
+ class ChainTest;
2
+ # "ProviderA"
3
+ end
@@ -0,0 +1,3 @@
1
+ class ClassExistOnlyInProviderA
2
+ # ClassExistOnlyInProviderA
3
+ end
@@ -0,0 +1,3 @@
1
+ class ChainTest;
2
+ # "ProviderB"
3
+ end
@@ -0,0 +1 @@
1
+ class ResourceExtension; end
@@ -0,0 +1,2 @@
1
+ ---
2
+ :value: true
@@ -0,0 +1 @@
1
+ class Test; end
@@ -0,0 +1 @@
1
+ Test.txt
@@ -0,0 +1,27 @@
1
+ require 'RubyExt/require'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe 'Array' do
6
+ class Respond
7
+ def test; 2 end
8
+ end
9
+
10
+ it "sort_by_weight" do
11
+ a = [:a, :b, :c]
12
+ w = [3, 2, 1]
13
+ a.sort_by_weight(w).should == [:c, :b, :a]
14
+ a.should == [:a, :b, :c]
15
+ a.sort_by_weight! w
16
+ a.should == [:c, :b, :a]
17
+ end
18
+
19
+ it "sort_by_weight (from error)" do
20
+ a = ["Attributes", "Micelaneous", "Containers", "Tools"]
21
+ w = [0, 0, -1, -2]
22
+ a.sort_by_weight! w
23
+ a.should == ["Tools", "Containers", "Attributes", "Micelaneous"]
24
+ w.should == [-2, -1, 0, 0]
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ require 'RubyExt/require'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe 'Assert' do
6
+ it do
7
+ lambda{should! :be_never_called}.should raise_error(/ever/)
8
+ lambda{nil.should_not! :be_nil}.should raise_error(/nil/)
9
+ 1.should_not! :be_nil
10
+ 1.should! :==, 1
11
+ lambda{1.should! :==, 2}.should raise_error(/==/)
12
+ 1.should! :be_in, [1, 2]
13
+ "".should! :be_a, String
14
+ String.should! :be, String
15
+ 1.should! :<, 2
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,95 @@
1
+ require 'RubyExt/require'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe 'Cache' do
6
+ class CachedClass
7
+ attr_accessor :value
8
+ def value_get; @value end
9
+
10
+ attr_accessor :value2
11
+ def value2_get; @value2 end
12
+
13
+ attr_accessor :params
14
+ def params_get param; @params[param] end
15
+ end
16
+
17
+ Cache.cached CachedClass, CachedClass, :value_get
18
+ Cache.cached :cache_version_name, CachedClass, :value2_get
19
+ Cache.cached_with_params CachedClass, CachedClass, :params_get
20
+
21
+ it "Simple Cache" do
22
+ o = CachedClass.new
23
+ o.value = 0
24
+ o.value2 = 0
25
+ o.value_get.should == 0
26
+ o.value2_get.should == 0
27
+ o.value = 1
28
+ o.value2 = 1
29
+ o.value_get.should == 0
30
+ o.value2_get.should == 0
31
+ Cache.update CachedClass
32
+ o.value_get.should == 1
33
+ o.value2_get.should == 0
34
+ Cache.update :cache_version_name
35
+ o.value2_get.should == 1
36
+ Cache.update CachedClass, :cache_version_name
37
+ end
38
+
39
+ it "Cache With Params" do
40
+ o = CachedClass.new
41
+ o.params = {:a => :b}
42
+ o.params_get(:a).should == :b
43
+ o.params = {:a => :c}
44
+ o.params_get(:a).should == :b
45
+ Cache.update CachedClass
46
+ o.params_get(:a).should == :c
47
+ end
48
+
49
+ class CachedClass2
50
+ class << self
51
+ attr_accessor :value
52
+ def value_get; @value end
53
+ end
54
+ end
55
+
56
+ Cache.cached CachedClass2, CachedClass2.singleton_class, :value_get
57
+
58
+ it "Simple Cache" do
59
+ CachedClass2.value = 0
60
+ CachedClass2.value_get.should == 0
61
+ CachedClass2.value = 1
62
+ CachedClass2.value_get.should == 0
63
+ Cache.update CachedClass2
64
+ CachedClass2.value_get.should == 1
65
+ end
66
+
67
+ class MultipleCacheVersions
68
+ attr_accessor :value
69
+ def value_get; @value end
70
+
71
+ attr_accessor :value2
72
+ def value2_get params; @value2 end
73
+ end
74
+
75
+ Cache.cached [:class, :resource_update, :security_update], MultipleCacheVersions, :value_get
76
+ Cache.cached_with_params [:class, :resource_update, :security_update], MultipleCacheVersions, :value2_get
77
+
78
+ it "Multiple cache versions" do
79
+ o = MultipleCacheVersions.new
80
+ o.value, o.value2 = 0, 0
81
+
82
+ o.value_get.should == 0
83
+ o.value = 1
84
+ o.value_get.should == 0
85
+ Cache.update :class
86
+ o.value_get.should == 1
87
+ o.value = 2
88
+ o.value_get.should == 1
89
+ Cache.update :resource_update, :security_update
90
+ o.value_get.should == 2
91
+
92
+ o.value2_get("params").should == 0
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,94 @@
1
+ require 'RubyExt/require_base'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe "PackageManager" do
6
+ it "Should load classes only one time" do
7
+ class CustomObserver
8
+ attr_reader :list
9
+ def initialize
10
+ @list = []
11
+ end
12
+
13
+ def update_class klass
14
+ @list << klass
15
+ end
16
+ end
17
+ obs = CustomObserver.new
18
+ RubyExt::ClassLoader.add_observer obs
19
+ ForClassLoader::LoadCount
20
+ ForClassLoader::LoadCount
21
+ RubyExt::ClassLoader.delete_observers
22
+ obs.list.inject(0){|count, klass| klass == ForClassLoader::LoadCount ? count + 1 : count}.
23
+ should == 1
24
+ end
25
+
26
+ it "Should load classes From Multiple directories" do
27
+
28
+ end
29
+
30
+ it "Class has the same name as package" do
31
+ ForClassLoader::ModuleA::SameName
32
+ RubyExt::ForClassLoader::ModuleA::SameName::SomeClass
33
+ end
34
+
35
+ it "Infinity Loop" do
36
+ lambda{ForClassLoader::ModuleA::InfinityLoop}.
37
+ should raise_error(/Class Name .+ doesn't correspond to File Name/)
38
+ end
39
+
40
+ it "Core" do
41
+ ForClassLoader::ModuleA::ModuleB::ClassC.new
42
+ end
43
+
44
+
45
+ module ForClassLoader::ModuleA
46
+ class << self
47
+ def anonymous
48
+ ClassInsideAnonymousClass
49
+ end
50
+ end
51
+ end
52
+
53
+ it "Should works inside Anonymous Class" do
54
+ ForClassLoader::ModuleA.anonymous
55
+ end
56
+
57
+ it "Should raise exception if class isn't defined in scope" do
58
+ ForClassLoader::Scope::ScopeA1
59
+ RubyExt::ClassLoader.error_on_defined_constant = true
60
+ lambda{ForClassLoader::Scope::ScopeB1}.
61
+ should raise_error(/Class '.+' is not defined in the '.+' Namespace!/)
62
+ end
63
+
64
+ it "Class Reloading" do
65
+ fname = File.join(File.dirname(__FILE__), 'RubyExt/ForClassLoader/ModuleA/ClassReloading.rb')
66
+ File.delete fname if File.exist? fname
67
+ File.open(fname, 'w') do |f|
68
+ f.write %{\
69
+ class ClassReloading
70
+ def test
71
+ 1
72
+ end
73
+ end}
74
+ end
75
+
76
+ test = ForClassLoader::ModuleA::ClassReloading.new
77
+ test.test.should == 1
78
+
79
+ File.open(fname, 'w') do |f|
80
+ f.write %{\
81
+ class ClassReloading
82
+ def test
83
+ 2
84
+ end
85
+ end}
86
+ end
87
+
88
+ RubyExt::ClassLoader.reload_class(ForClassLoader::ModuleA::ClassReloading.name)
89
+ test.test.should == 2
90
+
91
+ File.delete fname if File.exist? fname
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,21 @@
1
+ require 'RubyExt/require_base'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe "ImportAll" do
6
+ class A
7
+ class B; end
8
+ class C; end
9
+ class D; end
10
+ end
11
+
12
+ class E
13
+ extend RubyExt::ImportAll
14
+ import_all A
15
+ end
16
+
17
+ it do
18
+ E::B
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ require 'RubyExt/require'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe 'Kernel' do
6
+ class Respond
7
+ def test; 2 end
8
+ end
9
+
10
+ it "respond_to" do
11
+ r = Respond.new
12
+ r.respond_to(:not_exist).should be_nil
13
+ r.respond_to(:test).should == 2
14
+ end
15
+
16
+ it "raise_without_self" do
17
+ begin
18
+ ForKernel::RaiseWithoutSelf.new.test
19
+ rescue RuntimeError => e
20
+ stack = e.backtrace
21
+ stack.any?{|line| line =~ /RaiseWithoutSelf/}.should be_false
22
+ stack.any?{|line| line =~ /kernel_spec/}.should be_true
23
+ end
24
+ end
25
+
26
+ it "raise_without_self" do
27
+ begin
28
+ t1 = ForKernel::RaiseWithoutSelf.new
29
+ ForKernel::Raise2.new.test t1
30
+ rescue RuntimeError => e
31
+ stack = e.backtrace
32
+ stack.any?{|line| line =~ /RaiseWithoutSelf/}.should be_false
33
+ stack.any?{|line| line =~ /Raise2/}.should be_false
34
+ stack.any?{|line| line =~ /kernel_spec/}.should be_true
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec'
2
+ require 'RubyExt/Localization/require'
3
+
4
+ module RubyExt
5
+ describe "RubyExt::Localization" do
6
+ before :each do
7
+ RubyExt::Localization.default_language = :en
8
+ RubyExt::Localization.language = nil
9
+ end
10
+
11
+ it "Default Language" do
12
+ ForLocalization::NS::B.new.message.should == "English"
13
+ RubyExt::Localization.default_language = :ru
14
+ ForLocalization::NS::B.new.message.should == "Russian"
15
+ end
16
+
17
+ it "Not Localized" do
18
+ RubyExt::Localization.default_language = :ru
19
+ ForLocalization::NS::B.new.not_localized.should == "English Not Localized"
20
+ end
21
+
22
+ it "Language set" do
23
+ ForLocalization::NS::B.new.message.should == "English"
24
+ RubyExt::Localization.language = lambda{:ru}
25
+ ForLocalization::NS::B.new.message.should == "Russian"
26
+ end
27
+
28
+ it "Language not set" do
29
+ RubyExt::Localization.language = lambda{nil}
30
+ ForLocalization::NS::B.new.message.should == "English"
31
+ end
32
+
33
+ it "Class Hierarchy" do
34
+ RubyExt::Localization.language = lambda{:ru}
35
+ ForLocalization::NS::B.new.class_hierarchy_message.should == "Class Hierarchy Russian"
36
+ end
37
+
38
+ it "Namespace Hierarchy" do
39
+ RubyExt::Localization.language = lambda{:ru}
40
+ ForLocalization::NS::B.new.namespace_hierarchy_message.should ==
41
+ "Namespace Hierarchy Russian"
42
+ end
43
+
44
+ it "Substitution" do
45
+ RubyExt::Localization.language = lambda{:ru}
46
+ ForLocalization::NS::B.new.substitution.should == "Russian 10"
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,135 @@
1
+ require 'RubyExt/require_base'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe "Module" do
6
+ class A
7
+ class B
8
+ class C
9
+
10
+ end
11
+ end
12
+ end
13
+
14
+ it "Namespace" do
15
+ File.namespace.should == nil
16
+ A::B::C.namespace.should == RubyExt::A::B
17
+ end
18
+
19
+ class AnonymousClass
20
+ class << self
21
+ def anonymous_name
22
+ self.name
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+ it "name" do
29
+ A::B::C.name.should == "RubyExt::A::B::C"
30
+ end
31
+
32
+ class X; end
33
+ class Y < X; end
34
+ class Z < Y; end
35
+
36
+
37
+ it "each_ancestor" do
38
+ list = []
39
+ Z.each_ancestor{|a| list << a}
40
+ list.should include Y
41
+ list.should include X
42
+ list.should_not include Z
43
+ list.should_not include Object
44
+ list.should_not include Kernel
45
+
46
+ list = []
47
+ Z.each_ancestor(true){|a| list << a}
48
+ list.should include Y
49
+ list.should include X
50
+ list.should_not include Z
51
+ list.should include Object
52
+ list.should include Kernel
53
+ end
54
+
55
+ it "each_namespace" do
56
+ list = []
57
+ A::B::C.each_namespace{|n| list << n}
58
+ list.should == [RubyExt::A::B, RubyExt::A, RubyExt]
59
+ end
60
+
61
+ it "is?" do
62
+ File.is?(IO).should be_true
63
+ end
64
+
65
+ class WrapMethod
66
+ def method_name value
67
+ 10*value
68
+ end
69
+ end
70
+
71
+ it "wrap_method" do
72
+ WrapMethod.wrap_method :method_name do |old, value|
73
+ send(old, value)*value
74
+ end
75
+ WrapMethod.new.method_name(10).should == 1000
76
+ end
77
+
78
+ it "resources" do
79
+ ForModule::NS1::B["data"].should == "A.data"
80
+ ForModule::NS1::B2["data"].should == "NS1.data"
81
+ end
82
+
83
+ it "resources, should aslo inherit resources from included modules" do
84
+ ForModule::NS2::B["data"].should == "M.data"
85
+ end
86
+
87
+ module M
88
+ def m_m; end
89
+ module ClassMethods
90
+ def cm_m; end
91
+ end
92
+ end
93
+
94
+ class C
95
+ inherit M
96
+ end
97
+
98
+ it "inherit" do
99
+ C.respond_to?(:cm_m).should be_true
100
+ C.new.respond_to?(:m_m).should be_true
101
+ end
102
+
103
+ module M2
104
+ include M
105
+
106
+ module ClassMethods
107
+ def cm2_m; end
108
+ end
109
+ end
110
+
111
+ class D
112
+ inherit M2
113
+ end
114
+
115
+ it "should inherit all ancestors class methods" do
116
+ D.respond_to?(:cm_m).should be_true
117
+ D.respond_to?(:cm2_m).should be_true
118
+ D.new.respond_to?(:m_m).should be_true
119
+ end
120
+
121
+ class C2
122
+ inherit M
123
+ end
124
+
125
+ it "Shouldn't redefine ancestors class methods" do
126
+ C2.respond_to?(:cm2_m).should be_false
127
+ end
128
+
129
+ it "inherited_instance_methods" do
130
+ im = Set.instance_methods - Set.inherited_instance_methods
131
+ im.should include("union")
132
+ im.should_not include("object_id")
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,8 @@
1
+ require 'RubyExt/require_base'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe "Object" do
6
+
7
+ end
8
+ end
@@ -0,0 +1,44 @@
1
+ require 'RubyExt/require_base'
2
+ require 'spec'
3
+
4
+ module RubyExt
5
+ describe "Observable" do
6
+ class AnObservable
7
+ include Observable
8
+ end
9
+
10
+ it "Method without Parameters" do
11
+ mock = mock("Observer")
12
+ obs = AnObservable.new
13
+ obs.add_observer mock
14
+ mock.should_receive(:update).with(2)
15
+ obs.notify_observers :update, 2
16
+ end
17
+
18
+ # it "Method without Parameters" do
19
+ # mock = mock("Observer")
20
+ # obs = AnObservable.new
21
+ # obs.add_observer(mock, :method => :custom_update, :filter => lambda{|o| o == 2})
22
+ # mock.should_receive(:custom_update).with(2)
23
+ # obs.notify_observers 2
24
+ # obs.notify_observers 4
25
+ # end
26
+ #
27
+ # it "With Block" do
28
+ # mock = mock("Observer")
29
+ # mock.should_receive(:got)
30
+ # obs = AnObservable.new
31
+ # obs.add_observer{mock.got}
32
+ # obs.notify_observers
33
+ # end
34
+ #
35
+ # it "With Block and Filter" do
36
+ # mock = mock("Observer")
37
+ # obs = AnObservable.new
38
+ # obs.add_observer(:filter => lambda{|o| o == 2}){|o| mock.got o}
39
+ # mock.should_receive(:got).with(2)
40
+ # obs.notify_observers 2
41
+ # obs.notify_observers 4
42
+ # end
43
+ end
44
+ end