retroactive_module_inclusion 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --private
2
+ lib/*.rb
3
+ README.rdoc History.rdoc
data/History.rdoc CHANGED
@@ -1,8 +1,20 @@
1
+ === 1.1.0 / 2011-01-22
2
+
3
+ * 2 minor enhancements
4
+
5
+ * Refactored retroactively_include method from ::Module to
6
+ CoreExt::Module::RetroactiveModuleInclusion, after Ola Bini suggested
7
+ in his post {SAFE(R) MONKEY PATCHING}[http://olabini.com/blog/2011/01/safeer-monkey-patching/]
8
+
9
+ * Finally, managed to make yard document the retroactively_include method:
10
+ * .yardopts had to be created to add the '--private' argument, because
11
+ yard ignores the rdoc document modifiers :doc: and :nodoc:
12
+
1
13
  === 1.0.3 / 2011-01-20
2
14
 
3
15
  * 1 minor enhancement
4
16
 
5
- * more concise Stats implementation, minor gem description and doc improvements
17
+ * More concise Stats implementation, minor gem description and doc improvements
6
18
 
7
19
  === 1.0.1 / 2011-01-20
8
20
 
data/Manifest.txt CHANGED
@@ -1,4 +1,5 @@
1
1
  .autotest
2
+ .yardopts
2
3
  History.rdoc
3
4
  Manifest.txt
4
5
  README.rdoc
data/README.rdoc CHANGED
@@ -55,9 +55,9 @@ The second, more concise and elegant, is to use this gem
55
55
 
56
56
  Enumerable.module_eval { retroactively_include Stats }
57
57
 
58
- == FEATURES/PROBLEMS:
58
+ == FEATURES:
59
59
 
60
- * Tested on all major Ruby interpreters (100% coverage, 0% failures):
60
+ * Tested on all major Ruby interpreters (100% coverage, 0% failure):
61
61
  * ruby-1.9.2-p136
62
62
  * ruby-1.8.7-p330
63
63
  * ree-1.8.7-2010.02
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ require 'hoe'
8
8
  Hoe.spec 'retroactive_module_inclusion' do
9
9
  developer('Adriano Mitre', 'adriano.mitre@gmail.com')
10
10
 
11
- self.version = '1.0.3'
11
+ self.version = '1.1.0'
12
12
 
13
13
  self.readme_file = 'README.rdoc'
14
14
  self.history_file = 'History.rdoc'
@@ -33,3 +33,24 @@ task :tests => [:test] do
33
33
  # aliasing :test with :tests for RVM ('rvm tests')
34
34
  end
35
35
 
36
+ module CoreExt
37
+ module String
38
+ module FromHere
39
+ def from_here
40
+ unless Dir.pwd != File.dirname(File.expand_path(__FILE__))
41
+ self
42
+ else
43
+ File.expand_path("../#{self}", __FILE__)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ String.class_eval { include CoreExt::String::FromHere }
51
+
52
+ task :clean_all => [:clean] do
53
+ %w{ .yardoc }.each do |rel_path|
54
+ rm_r rel_path.from_here if File.exist?(rel_path.from_here)
55
+ end
56
+ end
@@ -1,54 +1,60 @@
1
- class Module
1
+ module CoreExt
2
+ module Module
3
+ module RetroactiveModuleInclusion
2
4
 
3
- private
5
+ private
4
6
 
5
- # Includes +mod+ retroactively, i.e., extending to all classes and modules which
6
- # included +self+ _beforehand_.
7
- #
8
- # Example:
9
- #
10
- # module Stats
11
- # def mean
12
- # n = 1
13
- # inject {|s,k| n += 1 ; s + k }.to_f / count
14
- # end
15
- # end
16
- #
17
- # Enumerable.module_eval { retroactively_include Stats }
18
- #
19
- # (1..2).mean #=> 1.5
20
- #
21
- def retroactively_include(mod) # :doc:
22
- raise TypeError, 'wrong argument type #{mod.class} (expected Module)' unless mod.is_a? Module
7
+ # Includes +mod+ retroactively, i.e., extending to all classes and modules which
8
+ # had included +self+ _beforehand_.
9
+ #
10
+ # Example:
11
+ #
12
+ # module Stats
13
+ # def mean
14
+ # inject(&:+) / count.to_f
15
+ # end
16
+ # end
17
+ #
18
+ # Enumerable.module_eval { retroactively_include Stats }
19
+ #
20
+ # (1..2).mean #=> 1.5
21
+ #
22
+ def retroactively_include(mod) # :doc:
23
+ raise TypeError, "wrong argument type #{mod.class} (expected Module)" unless mod.is_a? ::Module # ::Module would in general be equivalent to Object::Module and simply Module would mean CoreExt::Module in this context
23
24
 
24
- # Although one would expect +A.module_eval("include B")+ to make methods
25
- # from module +B+ available to all classes and modules that had previously
26
- # included module +A+, this is not the case due to a limitation in Ruby's
27
- # object model (see [dynamic module include problem][1]). Thus, one has two
28
- # possible solutions:
29
- # * use Module#include_retroactively instead of Module#include
30
- # * reopen +A+ and define the methods directly inside it
31
- #
32
- # JRuby (at least up to version 1.5.6) has ObjectSpace disabled by default,
33
- # thus it must be enabled manually ([reference][2]).
34
- #
35
- # [1]: http://eigenclass.org/hiki/The+double+inclusion+problem "Dynamic Module Include Problem"
36
- # [2]: http://ola-bini.blogspot.com/2007/07/objectspace-to-have-or-not-to-have.html "ObjectSpace: to have or not to have"
37
- #
38
- prev_jruby_objectspace_state = nil # only for scope reasons
39
- if defined?(RUBY_DESCRIPTION) && RUBY_DESCRIPTION =~ /jruby/i
40
- require 'jruby'
41
- prev_jruby_objectspace_state = JRuby.objectspace
42
- JRuby.objectspace = true
43
- end
44
- ObjectSpace.each_object(Module) do |m|
45
- if m <= self # equiv. to "if m.include?(self) || m == self"
46
- m.module_eval { include mod }
25
+ # Although one would expect +A.module_eval("include B")+ to make methods
26
+ # from module +B+ available to all classes and modules that had previously
27
+ # included module +A+, this is not the case due to a limitation in Ruby's
28
+ # object model (see [dynamic module include problem][1]). Thus, one has two
29
+ # possible solutions:
30
+ # * use Module#include_retroactively instead of Module#include
31
+ # * reopen +A+ and define the methods directly inside it
32
+ #
33
+ # JRuby (at least up to version 1.5.6) has ObjectSpace disabled by default,
34
+ # thus it must be enabled manually ([reference][2]).
35
+ #
36
+ # [1]: http://eigenclass.org/hiki/The+double+inclusion+problem "Dynamic Module Include Problem"
37
+ # [2]: http://ola-bini.blogspot.com/2007/07/objectspace-to-have-or-not-to-have.html "ObjectSpace: to have or not to have"
38
+ #
39
+ prev_jruby_objectspace_state = nil # only for scope reasons
40
+ if defined?(RUBY_DESCRIPTION) && RUBY_DESCRIPTION =~ /jruby/i
41
+ require 'jruby'
42
+ prev_jruby_objectspace_state = JRuby.objectspace
43
+ JRuby.objectspace = true
44
+ end
45
+ ObjectSpace.each_object(::Module) do |m|
46
+ if m <= self # equiv. to "if m.include?(self) || m == self"
47
+ m.module_eval { include mod }
48
+ end
49
+ end
50
+ if defined?(RUBY_DESCRIPTION) && RUBY_DESCRIPTION =~ /jruby/i
51
+ JRuby.objectspace = prev_jruby_objectspace_state
52
+ end
47
53
  end
48
- end
49
- if defined?(RUBY_DESCRIPTION) && RUBY_DESCRIPTION =~ /jruby/i
50
- JRuby.objectspace = prev_jruby_objectspace_state
54
+
55
+ ::Module.class_eval { include CoreExt::Module::RetroactiveModuleInclusion }
56
+
51
57
  end
52
58
  end
53
-
54
59
  end
60
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: retroactive_module_inclusion
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 3
10
- version: 1.0.3
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Adriano Mitre
@@ -36,7 +36,7 @@ cert_chain:
36
36
  9u8N6mQNneIVRh6Xfdko/Q==
37
37
  -----END CERTIFICATE-----
38
38
 
39
- date: 2011-01-21 00:00:00 -02:00
39
+ date: 2011-01-22 00:00:00 -02:00
40
40
  default_executable:
41
41
  dependencies:
42
42
  - !ruby/object:Gem::Dependency
@@ -76,6 +76,7 @@ extra_rdoc_files:
76
76
  - History.rdoc
77
77
  files:
78
78
  - .autotest
79
+ - .yardopts
79
80
  - History.rdoc
80
81
  - Manifest.txt
81
82
  - README.rdoc
metadata.gz.sig CHANGED
Binary file