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.
@@ -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