extended_include 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.txt +5 -0
- data/extended_include.gemspec +2 -2
- data/lib/extended_include.rb +14 -16
- data/test/00ei.rb +33 -0
- metadata +6 -5
data/HISTORY.txt
CHANGED
data/extended_include.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "extended_include"
|
3
|
-
s.version = "0.0.
|
4
|
-
s.date = "2014-
|
3
|
+
s.version = "0.0.3"
|
4
|
+
s.date = "2014-05-19"
|
5
5
|
s.authors = ["Brian Katzung"]
|
6
6
|
s.email = ["briank@kappacs.com"]
|
7
7
|
s.homepage = "http://rubygems.org/gems/extended_include"
|
data/lib/extended_include.rb
CHANGED
@@ -10,29 +10,26 @@
|
|
10
10
|
# The Extended_Include module is a back-end support module. See the Module
|
11
11
|
# module extensions for the user interface.
|
12
12
|
#
|
13
|
-
# Version 0.0.
|
13
|
+
# Version 0.0.3, 2014-05-19
|
14
14
|
#
|
15
15
|
# @author Brian Katzung (briank@kappacs.com), Kappa Computer Solutions, LLC
|
16
16
|
# @license Public Domain
|
17
17
|
|
18
18
|
module Extended_Include
|
19
19
|
|
20
|
-
VERSION = "0.0.
|
20
|
+
VERSION = "0.0.3"
|
21
21
|
|
22
22
|
# The extended_include list, by module
|
23
23
|
@include_list = {}
|
24
24
|
|
25
|
-
# The class
|
25
|
+
# The class-methods-module list, by module
|
26
26
|
@class_methods = {}
|
27
27
|
|
28
|
-
#
|
28
|
+
# Backend for {Module#extended_include}.
|
29
29
|
def self.add_includes (base, *modules)
|
30
30
|
(@include_list[base] ||= []).concat modules
|
31
31
|
base.class_exec do
|
32
|
-
|
33
|
-
# last-to-first behavior in order to achieve first-to-last
|
34
|
-
# behavior.
|
35
|
-
include *modules.reverse
|
32
|
+
modules.each { |mod| include mod }
|
36
33
|
extend Extended_Include
|
37
34
|
end
|
38
35
|
end
|
@@ -40,10 +37,10 @@ module Extended_Include
|
|
40
37
|
# Return a module's class method list.
|
41
38
|
def self.class_methods_for (base)
|
42
39
|
(@class_methods[base] ||= []).uniq!
|
43
|
-
@class_methods[base]
|
40
|
+
@class_methods[base]
|
44
41
|
end
|
45
42
|
|
46
|
-
#
|
43
|
+
# Backend for {Module#include_class_methods}.
|
47
44
|
def self.include_class_methods (base, *modules, &block)
|
48
45
|
(@class_methods[base] ||= []).concat modules
|
49
46
|
@class_methods[base].push Module.new(&block) if block
|
@@ -56,21 +53,22 @@ module Extended_Include
|
|
56
53
|
@include_list[base]
|
57
54
|
end
|
58
55
|
|
59
|
-
#
|
56
|
+
# This method is automatically invoked whenever a module that uses
|
57
|
+
# #extended_include or #include_class_methods is included in another
|
58
|
+
# module.
|
60
59
|
def included (base)
|
60
|
+
# self is the included module; base is the including module
|
61
61
|
Extended_Include.includes_for(self).each do |mod|
|
62
62
|
mod.included base if mod.respond_to?(:included) &&
|
63
63
|
(!base.respond_to?(:superclass) ||
|
64
64
|
!base.superclass.include?(mod))
|
65
65
|
end
|
66
66
|
|
67
|
-
# Note that we reverse here to counter ::extend's
|
68
|
-
# last-to-first behavior in order to achieve first-to-last
|
69
|
-
# behavior.
|
70
67
|
sources = Extended_Include.class_methods_for self
|
71
|
-
base.class_exec {
|
68
|
+
base.class_exec { sources.each { |mod| extend mod } } unless
|
69
|
+
sources.empty?
|
72
70
|
|
73
|
-
super base rescue nil
|
71
|
+
super base rescue nil # chain any other #included methods
|
74
72
|
end
|
75
73
|
|
76
74
|
end
|
data/test/00ei.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'extended_include'
|
3
|
+
|
4
|
+
module M1
|
5
|
+
module ClassMethods
|
6
|
+
def cm; $log << 'M1 cm'; super rescue nil; end
|
7
|
+
end
|
8
|
+
include_class_methods
|
9
|
+
end
|
10
|
+
|
11
|
+
module M2
|
12
|
+
extended_include M1;
|
13
|
+
module MyClassMethods
|
14
|
+
def cm; $log << 'M2 MCM cm'; super rescue nil; end
|
15
|
+
end
|
16
|
+
include_class_methods(MyClassMethods) do
|
17
|
+
def cm; $log << 'M2 anon cm'; super rescue nil; end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module M3; extended_include M2; end
|
22
|
+
|
23
|
+
class TestExtInc_00 < MiniTest::Unit::TestCase
|
24
|
+
|
25
|
+
def test1
|
26
|
+
$log = []
|
27
|
+
M3.cm
|
28
|
+
assert_equal [ 'M2 anon cm', 'M2 MCM cm', 'M1 cm' ], $log
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
# END
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Brian Katzung
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2014-
|
17
|
+
date: 2014-05-19 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- extended_include.gemspec
|
33
33
|
- .yardopts
|
34
34
|
- HISTORY.txt
|
35
|
+
- test/00ei.rb
|
35
36
|
has_rdoc: true
|
36
37
|
homepage: http://rubygems.org/gems/extended_include
|
37
38
|
licenses:
|
@@ -64,5 +65,5 @@ rubygems_version: 1.3.7
|
|
64
65
|
signing_key:
|
65
66
|
specification_version: 3
|
66
67
|
summary: Include both class and instance methods on module include
|
67
|
-
test_files:
|
68
|
-
|
68
|
+
test_files:
|
69
|
+
- test/00ei.rb
|