monkey-lib 0.1.6 → 0.2.1
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/README.rdoc +0 -51
- data/Rakefile +1 -1
- data/lib/monkey-lib.rb +2 -1
- data/lib/monkey.rb +6 -4
- data/lib/monkey/autoloader.rb +21 -0
- data/lib/monkey/backend.rb +45 -0
- data/lib/monkey/backend/active_support.rb +17 -0
- data/lib/monkey/backend/backports.rb +17 -0
- data/lib/monkey/backend/common/extract_options.rb +12 -0
- data/lib/monkey/backend/common/metaclass.rb +14 -0
- data/lib/monkey/backend/common/parent.rb +14 -0
- data/lib/monkey/backend/common/tap.rb +13 -0
- data/lib/monkey/backend/extlib.rb +22 -0
- data/lib/monkey/backend/facets.rb +22 -0
- data/lib/monkey/engine.rb +48 -47
- data/lib/monkey/ext.rb +35 -0
- data/lib/monkey/ext/array.rb +8 -0
- data/lib/monkey/ext/module.rb +24 -0
- data/lib/monkey/ext/object.rb +38 -0
- data/lib/monkey/ext/string.rb +8 -0
- data/lib/monkey/watcher.rb +139 -0
- metadata +34 -14
- data/lib/monkey/hash.rb +0 -4
- data/lib/monkey/hash/sub_hash.rb +0 -23
- data/lib/monkey/object.rb +0 -2
- data/lib/monkey/object/backports.rb +0 -24
- data/lib/monkey/object/instance_yield.rb +0 -38
- data/lib/monkey/string.rb +0 -2
data/README.rdoc
CHANGED
@@ -1,51 +0,0 @@
|
|
1
|
-
Sort of my own ruby extlib. There is a spec for everything and it is very clean.
|
2
|
-
It does avoid monkey patching and relies on modules.
|
3
|
-
|
4
|
-
= Template for extentiones
|
5
|
-
|
6
|
-
Say we want to extend Object by adding some methods dealing with magic.
|
7
|
-
This would go to the file lib/monkey/object/magic_stuff.rb:
|
8
|
-
|
9
|
-
module Monkey
|
10
|
-
module Object
|
11
|
-
|
12
|
-
# It's magic!
|
13
|
-
module MagicStuff
|
14
|
-
|
15
|
-
::Object.send :include, self
|
16
|
-
|
17
|
-
def hokus_pokus
|
18
|
-
Spell.perform(self)
|
19
|
-
end
|
20
|
-
|
21
|
-
def vanish_in_thin_air
|
22
|
-
class << self
|
23
|
-
instance_methods.each { |m| undef_method(m) }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
Add to lib/monkey/object.rb:
|
33
|
-
|
34
|
-
require "monkey/object/magic_stuff"
|
35
|
-
|
36
|
-
If that file didn't exist before, add to lib/monkey.rb:
|
37
|
-
|
38
|
-
require "monkey/object"
|
39
|
-
|
40
|
-
Write a spec in spec/monkey/object/magic_stuff_spec.rb:
|
41
|
-
|
42
|
-
require __FILE__.sub("monkey/object/magic_stuff_spec.rb", "spec_helper")
|
43
|
-
require "monkey/object/magic_stuff"
|
44
|
-
|
45
|
-
describe Monkey::Object::MagicStuff do
|
46
|
-
|
47
|
-
it "performs magic" do
|
48
|
-
# ...
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
data/Rakefile
CHANGED
data/lib/monkey-lib.rb
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
require "monkey"
|
1
|
+
require "monkey"
|
2
|
+
MonkeyLib = Monkey
|
data/lib/monkey.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require "monkey
|
1
|
+
module Monkey
|
2
|
+
Dir[File.dirname(__FILE__) + "/monkey/*.rb"].sort.each do |path|
|
3
|
+
filename = File.basename(path, '.rb')
|
4
|
+
require "monkey/#{filename}"
|
5
|
+
end
|
6
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Monkey
|
2
|
+
module Autoloader
|
3
|
+
def const_missing(const_name)
|
4
|
+
const_name = const_name.to_s
|
5
|
+
file = File.join(const_name.to_const_path, self.name.to_const_path)
|
6
|
+
begin
|
7
|
+
require file
|
8
|
+
if const_defined? const_name
|
9
|
+
const = const_get const_get
|
10
|
+
const.extend Monkey::Autoloader
|
11
|
+
const
|
12
|
+
else
|
13
|
+
warn "expected #{file} to define #{name}::#{const_name}"
|
14
|
+
raise LoadError
|
15
|
+
end
|
16
|
+
rescue LoadError
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "set"
|
2
|
+
|
3
|
+
module Monkey
|
4
|
+
module Backend
|
5
|
+
|
6
|
+
autoload :ActiveSupport, "monkey/backend/active_support"
|
7
|
+
autoload :BackendDsl, "monkey/backend/backend_dsl"
|
8
|
+
autoload :Backports, "monkey/backend/backports"
|
9
|
+
autoload :Extlib, "monkey/backend/extlib"
|
10
|
+
|
11
|
+
def self.register(definition, expected_name, backend_name = nil)
|
12
|
+
klass = definition.core_klass
|
13
|
+
add_hook klass, expected_name
|
14
|
+
add_hook klass, backend_name if backend_name
|
15
|
+
backend_name ||= expected_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def preferred_backend
|
19
|
+
available_backends.detect { |b| eval "defined? ::#{b}" }
|
20
|
+
end
|
21
|
+
|
22
|
+
def available_backends
|
23
|
+
@available_backends ||= Set[:ActiveSupport, :Extlib, :Backports]
|
24
|
+
end
|
25
|
+
|
26
|
+
def backend
|
27
|
+
@backend || preferred_backend || available_backends.first
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def self.add_hook(klass, name)
|
33
|
+
mod = module_for klass
|
34
|
+
mod.class_eval "def #{name}(*a, &b); Monkey::Backend.call(#{klass.name}, #{name}, *a, &b); end"
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.module_for(klass, &block)
|
38
|
+
mod = eval "module Monkey::Ext; module #{klass.name}; self; end; end"
|
39
|
+
klass.send :include, mod
|
40
|
+
mod.class_eval(&block) if block
|
41
|
+
mod
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Monkey
|
2
|
+
module Backend
|
3
|
+
module ActiveSupport
|
4
|
+
def self.setup
|
5
|
+
require "active_support/core_ext/array/extract_options"
|
6
|
+
require "active_support/core_ext/object/metaclass"
|
7
|
+
require "active_support/core_ext/object/misc"
|
8
|
+
require "active_support/core_ext/string/inflection"
|
9
|
+
require "active_support/core_ext/module/introspection"
|
10
|
+
::String.class_eval do
|
11
|
+
alias to_const_string camelcase
|
12
|
+
alias to_const_path underscore
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Monkey
|
2
|
+
module Backend
|
3
|
+
module Backports
|
4
|
+
def setup
|
5
|
+
require "backports/1.8.7/kernel"
|
6
|
+
require "backports/rails/array"
|
7
|
+
require "backports/rails/string"
|
8
|
+
require "monkey/backend/common/parent"
|
9
|
+
require "monkey/backend/common/metaclass"
|
10
|
+
::String.class_eval do
|
11
|
+
alias to_const_string camelcase
|
12
|
+
alias to_const_path underscore
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Monkey
|
2
|
+
module Backend
|
3
|
+
module Extlib
|
4
|
+
def setup
|
5
|
+
require "extlib/object"
|
6
|
+
require "extlib/string"
|
7
|
+
require "extlib/constantize"
|
8
|
+
require "monkey/backend/common/parent"
|
9
|
+
require "monkey/backend/common/extract_options"
|
10
|
+
require "monkey/backend/common/tap"
|
11
|
+
::Object.class_eval { alias metaclass meta_class }
|
12
|
+
::String.class_eval do
|
13
|
+
alias camelcase to_const_string
|
14
|
+
alias underscore to_const_path
|
15
|
+
def constantize
|
16
|
+
Extlib::Inflection.constantize(self)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Monkey
|
2
|
+
module Backend
|
3
|
+
module Facets
|
4
|
+
def setup
|
5
|
+
# Actually, facets has Kernel#tap, but it behaves different if the block takes no argument.
|
6
|
+
require "monkey/backend/common/tap"
|
7
|
+
require "monkey/backend/common/extract_options"
|
8
|
+
require "monkey/backend/common/parent"
|
9
|
+
require "core/facets/kernel/meta_class"
|
10
|
+
require "core/facets/kernel/constant"
|
11
|
+
::String.class_eval do
|
12
|
+
def constantize
|
13
|
+
constant modulize
|
14
|
+
end
|
15
|
+
alias to_const_string camelcase
|
16
|
+
alias to_const_path snakecase
|
17
|
+
alias underscore snakecase
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/monkey/engine.rb
CHANGED
@@ -1,17 +1,45 @@
|
|
1
1
|
module Monkey
|
2
|
-
|
2
|
+
|
3
3
|
# Makes sure we always have RUBY_ENGINE, RUBY_ENGINE_VERSION and RUBY_DESCRIPTION
|
4
|
+
# TODO: Check IronRuby version detection.
|
4
5
|
module Engine
|
5
6
|
|
7
|
+
def jruby?; RUBY_ENGINE == "jruby"; end
|
8
|
+
def mri?; RUBY_ENGINE == "ruby"; end
|
9
|
+
def rbx?; RUBY_ENGINE == "rbx"; end
|
10
|
+
def ironruby?; RUBY_ENGINE == "ironruby"; end
|
11
|
+
def macruby?; RUBY_ENGINE == "macruby"; end
|
12
|
+
def maglev?; RUBY_ENGINE == "maglev"; end
|
13
|
+
|
14
|
+
alias rubinius? rbx?
|
15
|
+
|
16
|
+
def ree?
|
17
|
+
RUBY_DESCRIPTION =~ /Ruby Enterprise Edition/
|
18
|
+
end
|
19
|
+
|
20
|
+
module_function :jruby?
|
21
|
+
module_function :mri?
|
22
|
+
module_function :rbx?
|
23
|
+
module_function :rubinius?
|
24
|
+
module_function :ironruby?
|
25
|
+
module_function :macruby?
|
26
|
+
module_function :maglev?
|
27
|
+
module_function :ree?
|
28
|
+
|
29
|
+
def ruby_core?
|
30
|
+
maglev? or rubinius?
|
31
|
+
end
|
32
|
+
|
33
|
+
module_function :ruby_core?
|
34
|
+
|
6
35
|
include Rubinius if defined? Rubinius
|
7
36
|
|
8
37
|
unless defined? RUBY_ENGINE
|
9
|
-
if
|
10
|
-
|
11
|
-
elsif defined?
|
12
|
-
::
|
13
|
-
else
|
14
|
-
::RUBY_ENGINE = "ruby"
|
38
|
+
if defined? JRUBY_VERSION then ::RUBY_ENGINE = "jruby"
|
39
|
+
elsif defined? Rubinius then ::RUBY_ENGINE = "rbx"
|
40
|
+
elsif defined? NSObject then ::RUBY_ENINGE = "macruby"
|
41
|
+
elsif defined? Maglev then ::RUBY_ENINGE = "maglev"
|
42
|
+
else ::RUBY_ENGINE = "ruby"
|
15
43
|
end
|
16
44
|
end
|
17
45
|
|
@@ -21,7 +49,15 @@ module Monkey
|
|
21
49
|
RUBY_ENGINE.freeze
|
22
50
|
end
|
23
51
|
|
24
|
-
|
52
|
+
unless defined? RUBY_ENGINE_VERSION
|
53
|
+
begin
|
54
|
+
# ruby, jruby, macruby, some rubinius versions
|
55
|
+
::RUBY_ENGINE_VERSION = const_get("#{RUBY_ENGINE.upcase}_VERSION")
|
56
|
+
rescue NameError
|
57
|
+
# maglev, some rubinius versions
|
58
|
+
::RUBY_ENGINE_VERSION = const_get("VERSION")
|
59
|
+
end
|
60
|
+
end
|
25
61
|
|
26
62
|
unless defined? RUBY_DESCRIPTION
|
27
63
|
::RUBY_DESCRIPTION = "#{RUBY_ENGINE} #{RUBY_ENGINE_VERSION} "
|
@@ -38,52 +74,17 @@ module Monkey
|
|
38
74
|
::RUBY_DESCRIPTION << "[#{RUBY_PLATFORM}]"
|
39
75
|
end
|
40
76
|
|
41
|
-
def jruby?
|
42
|
-
RUBY_ENGINE == "jruby"
|
43
|
-
end
|
44
|
-
|
45
|
-
module_function :jruby?
|
46
|
-
|
47
|
-
def mri?
|
48
|
-
RUBY_ENGINE == "ruby"
|
49
|
-
end
|
50
|
-
|
51
|
-
module_function :mri?
|
52
|
-
|
53
|
-
def rbx?
|
54
|
-
RUBY_ENGINE == "rbx"
|
55
|
-
end
|
56
|
-
|
57
|
-
alias rubinius? rbx?
|
58
|
-
module_function :rbx?
|
59
|
-
module_function :rubinius?
|
60
|
-
|
61
|
-
def ironruby?
|
62
|
-
RUBY_ENGINE == "ironruby"
|
63
|
-
end
|
64
|
-
|
65
|
-
module_function :ironruby?
|
66
|
-
|
67
|
-
def macruby?
|
68
|
-
RUBY_ENGINE == "macruby"
|
69
|
-
end
|
70
|
-
|
71
|
-
module_function :macruby?
|
72
|
-
|
73
77
|
def ruby_engine(pretty = true)
|
74
78
|
return RUBY_ENGINE unless pretty
|
75
79
|
case RUBY_ENGINE
|
76
|
-
when "ruby"
|
77
|
-
when "rbx"
|
78
|
-
when
|
80
|
+
when "ruby" then "MatzRuby"
|
81
|
+
when "rbx" then "Rubinius"
|
82
|
+
when "maglev" then "MagLev"
|
83
|
+
else RUBY_ENGINE.capitalize.gsub("ruby", "Ruby")
|
79
84
|
end
|
80
85
|
end
|
81
86
|
|
82
87
|
module_function :ruby_engine
|
83
88
|
|
84
89
|
end
|
85
|
-
|
86
|
-
extend Engine
|
87
|
-
include Engine
|
88
|
-
|
89
90
|
end
|
data/lib/monkey/ext.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Monkey
|
2
|
+
module Ext
|
3
|
+
|
4
|
+
module ExtDSL
|
5
|
+
|
6
|
+
def core_class(klass = nil)
|
7
|
+
if klass
|
8
|
+
@core_class = klass
|
9
|
+
klass.send :include, self
|
10
|
+
end
|
11
|
+
return @core_class
|
12
|
+
end
|
13
|
+
|
14
|
+
def expects(*list)
|
15
|
+
list.each do |name|
|
16
|
+
unless instance_method name
|
17
|
+
# Note: Ruby < 1.8.7 does not support { |*a, &b| } syntax.
|
18
|
+
class_eval "def #{name}(*a, &b); Monkey::Backend.call(#{core_class.inspect}, #{name.to_s.inspect}, *a, &b); end"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
Dir[File.dirname(__FILE__) + "/ext/*.rb"].sort.each do |path|
|
26
|
+
filename = File.basename(path, '.rb')
|
27
|
+
class_name = filename.capitalize
|
28
|
+
extension = class_eval "module #{class_name}; self; end"
|
29
|
+
extension.extend ExtDSL
|
30
|
+
extension.core_class = Object.const_get class_name
|
31
|
+
require "ext/monkey/#{filename}"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Monkey
|
2
|
+
module Ext
|
3
|
+
module Module
|
4
|
+
|
5
|
+
# Defined by backend.
|
6
|
+
expects :parent
|
7
|
+
|
8
|
+
def nested_method_missing(mod, meth, *args, &block)
|
9
|
+
# Triggers method_missing chain inside mod.
|
10
|
+
raise Monkey::Watcher::NestedMethodMissingNotHandled
|
11
|
+
end
|
12
|
+
|
13
|
+
def class_added(klass)
|
14
|
+
end
|
15
|
+
|
16
|
+
def module_added(mod)
|
17
|
+
return if self == parent
|
18
|
+
class_added mod if mod.is_a? Class
|
19
|
+
parent.module_added mod
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Monkey
|
2
|
+
module Ext
|
3
|
+
module Object
|
4
|
+
|
5
|
+
# Defined by backend.
|
6
|
+
expects :metaclass, :tap
|
7
|
+
|
8
|
+
# Behaves like instance_eval or yield depending on whether a block takes an argument or not.
|
9
|
+
#
|
10
|
+
# class Foo
|
11
|
+
# define_method(:foo) { 42 }
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# Foo.new.instance_yield { foo } # => 42
|
15
|
+
# Foo.new.instance_yield { |c| c.foo } # => 42
|
16
|
+
#
|
17
|
+
# Also, you can pass a proc directly:
|
18
|
+
#
|
19
|
+
# block = proc { }
|
20
|
+
# instance_yield(block)
|
21
|
+
def instance_yield(block = nil, &alternate_block)
|
22
|
+
raise ArgumentError, "too many blocks given" if block && alternate_block
|
23
|
+
block ||= alternate_block
|
24
|
+
raise LocalJumpError, "no block given (yield)" unless block
|
25
|
+
block.arity > 0 ? yield(self) : instance_eval(&block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def metaclass_eval(str = nil, &block)
|
29
|
+
metaclass.class_eval(str, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def define_singleton_method(name, &block)
|
33
|
+
metaclass_eval { define_method(name, &block) }
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
module Monkey
|
2
|
+
# NOTE: Not thread-safe!
|
3
|
+
module Watcher
|
4
|
+
|
5
|
+
IDENTIFIER = "@__module_detected__"
|
6
|
+
|
7
|
+
class NestedMethodMissingNotHandled < ScriptError
|
8
|
+
end
|
9
|
+
|
10
|
+
module ObjectWatcher
|
11
|
+
::Object.extend self
|
12
|
+
|
13
|
+
def inherited(klass)
|
14
|
+
Monkey::Watcher.module_defined(klass)
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
module MethodWatcher
|
21
|
+
::Module.send :include, self
|
22
|
+
|
23
|
+
def method_added(name)
|
24
|
+
Monkey::Watcher.method_defined(self, name)
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_missing(name, *args, &block)
|
29
|
+
if Monkey::Watcher.detected? self
|
30
|
+
begin
|
31
|
+
Monkey::Watcher.module_method_missing(self, *args, &block)
|
32
|
+
rescue Monkey::Watcher::NestedMethodMissingNotHandled
|
33
|
+
super
|
34
|
+
end
|
35
|
+
else
|
36
|
+
Monkey::Watcher.module_defined self
|
37
|
+
if Monkey::Watcher.detected? self
|
38
|
+
__send__(name, *args, &block)
|
39
|
+
else
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
module ModuleWatcher
|
48
|
+
::Module.extend self
|
49
|
+
|
50
|
+
def new(*what, &ever)
|
51
|
+
super.tap { |k| Monkey::Watcher.module_defined(klass) }
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
module NamelessModuleWatcher
|
57
|
+
|
58
|
+
def __watcher_initialize__
|
59
|
+
@__original_methods__ = {}
|
60
|
+
if respond_to? :set_name_if_necessary
|
61
|
+
__watcher_wrap_method__ "set_name_if_necessary"
|
62
|
+
else
|
63
|
+
methods.each do |name|
|
64
|
+
name = name.to_s
|
65
|
+
next if name =~ /^__/
|
66
|
+
__watcher_wrap_method__ name
|
67
|
+
end
|
68
|
+
end
|
69
|
+
define_singleton_method("method_addded") do |name|
|
70
|
+
__watcher_wrap_method__ name unless Monkey::Watcher.detected? self
|
71
|
+
super
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def __watcher_wrap_method__(name)
|
76
|
+
@__original_methods__[name] = method(name)
|
77
|
+
eval "def self.#{name}(*a, &b); __watcher_wrap_call__(#{name.inspect}, *a, &b); end"
|
78
|
+
end
|
79
|
+
|
80
|
+
def __watcher_wrap_call__(meth, *args, &block)
|
81
|
+
Monkey::Watcher.module_defined(klass)
|
82
|
+
@__original_methods__[meth].call(*args, &block).tap do
|
83
|
+
next if name.blank?
|
84
|
+
Monkey::Watcher.module_defined(klass)
|
85
|
+
methods_names = @__original_methods__.keys
|
86
|
+
methods_names.each { |m| define_singleton_method(m, &@__original_methods__.delete(m)) }
|
87
|
+
undef __watcher_initialize__
|
88
|
+
undef __watcher_wrap_method__
|
89
|
+
undef __watcher_wrap_call__
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.extended(klass)
|
94
|
+
klass.__watcher_initialize__
|
95
|
+
super
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.module_defined(klass)
|
101
|
+
return if detected? klass
|
102
|
+
return nameless_module_defined(klass) unless klass.name
|
103
|
+
klass.instance_variable_set IDENTIFIER, true
|
104
|
+
klass.parent.module_added(klass)
|
105
|
+
klass.constants.each do |name|
|
106
|
+
mod = klass.const_get name
|
107
|
+
module_defined mod if mod.is_a? Module
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.nameless_module_defined(klass)
|
112
|
+
return if hooked? klass
|
113
|
+
klass.instance_variable_set IDENTIFIER, false
|
114
|
+
klass.extend NamelessModuleWatcher
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.method_defined(klass, name)
|
118
|
+
module_defined(klass)
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.hooked?(klass)
|
122
|
+
klass.instance_variable_defined? IDENTIFIER
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.detected?(klass)
|
126
|
+
!!klass.instance_variable_get IDENTIFIER
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.setup
|
130
|
+
begin
|
131
|
+
ObjectSpace.each_object(Module) { |klass| module_defined(klass) }
|
132
|
+
rescue Exception
|
133
|
+
# Thus we meet at last, JRuby!
|
134
|
+
module_defined Object
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monkey-lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Konstantin Haase
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-11 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -31,28 +31,48 @@ extensions: []
|
|
31
31
|
extra_rdoc_files:
|
32
32
|
- README.rdoc
|
33
33
|
- LICENSE
|
34
|
+
- lib/monkey/autoloader.rb
|
35
|
+
- lib/monkey/backend/active_support.rb
|
36
|
+
- lib/monkey/backend/backports.rb
|
37
|
+
- lib/monkey/backend/common/extract_options.rb
|
38
|
+
- lib/monkey/backend/common/metaclass.rb
|
39
|
+
- lib/monkey/backend/common/parent.rb
|
40
|
+
- lib/monkey/backend/common/tap.rb
|
41
|
+
- lib/monkey/backend/extlib.rb
|
42
|
+
- lib/monkey/backend/facets.rb
|
43
|
+
- lib/monkey/backend.rb
|
34
44
|
- lib/monkey/engine.rb
|
35
|
-
- lib/monkey/
|
36
|
-
- lib/monkey/
|
37
|
-
- lib/monkey/object
|
38
|
-
- lib/monkey/
|
39
|
-
- lib/monkey/
|
45
|
+
- lib/monkey/ext/array.rb
|
46
|
+
- lib/monkey/ext/module.rb
|
47
|
+
- lib/monkey/ext/object.rb
|
48
|
+
- lib/monkey/ext/string.rb
|
49
|
+
- lib/monkey/ext.rb
|
40
50
|
- lib/monkey/string/like_pathname.rb
|
41
|
-
- lib/monkey/
|
51
|
+
- lib/monkey/watcher.rb
|
42
52
|
- lib/monkey-lib.rb
|
43
53
|
- lib/monkey.rb
|
44
54
|
files:
|
45
55
|
- LICENSE
|
46
56
|
- Rakefile
|
47
57
|
- README.rdoc
|
58
|
+
- lib/monkey/autoloader.rb
|
59
|
+
- lib/monkey/backend/active_support.rb
|
60
|
+
- lib/monkey/backend/backports.rb
|
61
|
+
- lib/monkey/backend/common/extract_options.rb
|
62
|
+
- lib/monkey/backend/common/metaclass.rb
|
63
|
+
- lib/monkey/backend/common/parent.rb
|
64
|
+
- lib/monkey/backend/common/tap.rb
|
65
|
+
- lib/monkey/backend/extlib.rb
|
66
|
+
- lib/monkey/backend/facets.rb
|
67
|
+
- lib/monkey/backend.rb
|
48
68
|
- lib/monkey/engine.rb
|
49
|
-
- lib/monkey/
|
50
|
-
- lib/monkey/
|
51
|
-
- lib/monkey/object
|
52
|
-
- lib/monkey/
|
53
|
-
- lib/monkey/
|
69
|
+
- lib/monkey/ext/array.rb
|
70
|
+
- lib/monkey/ext/module.rb
|
71
|
+
- lib/monkey/ext/object.rb
|
72
|
+
- lib/monkey/ext/string.rb
|
73
|
+
- lib/monkey/ext.rb
|
54
74
|
- lib/monkey/string/like_pathname.rb
|
55
|
-
- lib/monkey/
|
75
|
+
- lib/monkey/watcher.rb
|
56
76
|
- lib/monkey-lib.rb
|
57
77
|
- lib/monkey.rb
|
58
78
|
- spec/monkey/engine_spec.rb
|
data/lib/monkey/hash.rb
DELETED
data/lib/monkey/hash/sub_hash.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Monkey
|
2
|
-
module Hash
|
3
|
-
|
4
|
-
# Adds sub hash ablilty (like Hash#[], but returning a hash rather than an array).
|
5
|
-
module SubHash
|
6
|
-
|
7
|
-
::Hash.send :include, self
|
8
|
-
|
9
|
-
# Example:
|
10
|
-
# {:a => 42, :b => 23, :c => 1337}.sub_hash :a, :b, :d
|
11
|
-
# # => {:a => 42, :b => 23}
|
12
|
-
def sub_hash(*keys)
|
13
|
-
keys.inject({}) do |hash, key|
|
14
|
-
hash.merge! key => self[key] if include? key
|
15
|
-
hash
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
alias subhash sub_hash
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/monkey/object.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Monkey
|
2
|
-
module Object
|
3
|
-
|
4
|
-
# Backports from newer / alternate ruby implementations.
|
5
|
-
module Backports
|
6
|
-
|
7
|
-
::Object.send :include, self
|
8
|
-
|
9
|
-
# From Ruby >= 1.8.7
|
10
|
-
def tap
|
11
|
-
yield self
|
12
|
-
self
|
13
|
-
end
|
14
|
-
|
15
|
-
# From Rubinius
|
16
|
-
def metaclass
|
17
|
-
class << self
|
18
|
-
self
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module Monkey
|
2
|
-
module Object
|
3
|
-
|
4
|
-
# Adds the private method instance_eval which is like instance_eval
|
5
|
-
# and yield depending on whether a block takes an argument or not.
|
6
|
-
#
|
7
|
-
# class Foo
|
8
|
-
#
|
9
|
-
# def foo
|
10
|
-
# 42
|
11
|
-
# end
|
12
|
-
#
|
13
|
-
# def bar(&block)
|
14
|
-
# instance_yield block
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# end
|
18
|
-
#
|
19
|
-
# conf = Foo.new
|
20
|
-
# conf.bar { foo }
|
21
|
-
# conf.bar { |c| c.foo }
|
22
|
-
module InstanceYield
|
23
|
-
|
24
|
-
::Object.send :include, self
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
# See InstanceYield description.
|
29
|
-
def instance_yield(block = nil, &alternate_block)
|
30
|
-
raise ArgumentError, "too many blocks given" if block && alternate_block
|
31
|
-
block ||= alternate_block
|
32
|
-
raise LocalJumpError, "no block given (yield)" unless block
|
33
|
-
block.arity > 0 ? yield(self) : instance_eval(&block)
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/monkey/string.rb
DELETED