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.
@@ -1,3 +1,8 @@
1
+ 2014-05-19 Version 0.0.3
2
+
3
+ Documentation clarification. Fix double-reverse for included class
4
+ methods. Don't depend on multiple include or extend order at all.
5
+
1
6
  2014-04-18 Version 0.0.2
2
7
 
3
8
  Code clean-up (Module#include_class_methods no longer calls
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "extended_include"
3
- s.version = "0.0.2"
4
- s.date = "2014-04-18"
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"
@@ -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.2, 2014-04-18
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.2"
20
+ VERSION = "0.0.3"
21
21
 
22
22
  # The extended_include list, by module
23
23
  @include_list = {}
24
24
 
25
- # The class methods list, by module
25
+ # The class-methods-module list, by module
26
26
  @class_methods = {}
27
27
 
28
- # Include additional modules.
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
- # Note that we reverse here to counter ::include's
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].reverse
40
+ @class_methods[base]
44
41
  end
45
42
 
46
- # Include a module's class methods when included.
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
- # The #included method extended to other modules' ::included method.
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 { extend *sources.reverse } unless sources.empty?
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
@@ -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
- - 2
9
- version: 0.0.2
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-04-18 00:00:00 -05:00
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