extended_include 0.0.2 → 0.0.3
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/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
|