including 0.1.1 → 0.2.0
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 +4 -4
- data/VERSION +1 -1
- data/including.gemspec +11 -16
- data/lib/including.rb +16 -6
- data/spec/including_spec.rb +94 -34
- metadata +41 -45
data/README.rdoc
CHANGED
@@ -35,13 +35,13 @@ That's basically it. You can pass an array of `only` the methods you'd
|
|
35
35
|
like to mix in, or an array of exceptions, via `except`.
|
36
36
|
|
37
37
|
class Quux
|
38
|
-
including Foo,
|
38
|
+
including Foo, only: [:foo, :baz]
|
39
39
|
end
|
40
40
|
|
41
41
|
quux = Quux.new
|
42
|
-
quux.
|
43
|
-
quux.
|
44
|
-
quux.baz #
|
42
|
+
quux.foo # "foo"
|
43
|
+
quux.bar # NoMethodError
|
44
|
+
quux.baz # "baz"
|
45
45
|
|
46
46
|
= Installation
|
47
47
|
gem install including
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/including.gemspec
CHANGED
@@ -4,19 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "including"
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
|
15
|
-
desired methods and functions from module code.
|
16
|
-
|
17
|
-
An experiment: How might this be done in Ruby?
|
18
|
-
}
|
19
|
-
s.email = %q{bryanwoods4e@gmail.com}
|
11
|
+
s.authors = ["Bryan Woods"]
|
12
|
+
s.date = "2012-04-05"
|
13
|
+
s.description = "\n An observation: Other languages allow for more granular loading of only \n desired methods and functions from module code.\n\n An experiment: How might this be done in Ruby?\n "
|
14
|
+
s.email = "bryanwoods4e@gmail.com"
|
20
15
|
s.extra_rdoc_files = [
|
21
16
|
"LICENSE.txt",
|
22
17
|
"README.rdoc"
|
@@ -35,11 +30,11 @@ Gem::Specification.new do |s|
|
|
35
30
|
"spec/including_spec.rb",
|
36
31
|
"spec/spec_helper.rb"
|
37
32
|
]
|
38
|
-
s.homepage =
|
39
|
-
s.licenses = [
|
40
|
-
s.require_paths = [
|
41
|
-
s.rubygems_version =
|
42
|
-
s.summary =
|
33
|
+
s.homepage = "http://github.com/bryanwoods/including"
|
34
|
+
s.licenses = ["MIT"]
|
35
|
+
s.require_paths = ["lib"]
|
36
|
+
s.rubygems_version = "1.8.16"
|
37
|
+
s.summary = "Including mixes in only what you want"
|
43
38
|
|
44
39
|
if s.respond_to? :specification_version then
|
45
40
|
s.specification_version = 3
|
data/lib/including.rb
CHANGED
@@ -1,15 +1,25 @@
|
|
1
|
-
class
|
1
|
+
class Module
|
2
2
|
def including(mixin, options = {})
|
3
3
|
include mixin and return unless options[:only] || options[:except]
|
4
4
|
included_module = mixin.dup
|
5
5
|
|
6
|
-
|
7
|
-
options[:except]
|
8
|
-
included_module.instance_methods(false) - options[:only]
|
9
|
-
).map(&:to_sym)
|
6
|
+
if options[:except]
|
7
|
+
excluded_methods = options[:except]
|
10
8
|
|
9
|
+
undefine(included_module, excluded_methods) and return
|
10
|
+
else
|
11
|
+
included_methods = included_module.instance_methods(false)
|
12
|
+
excluded_methods = Array(options[:only]).map(&:to_sym)
|
13
|
+
|
14
|
+
undefine(included_module, included_methods - excluded_methods)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def undefine(included_module, excluded_methods)
|
11
21
|
(include included_module).tap do
|
12
|
-
excluded_methods.each do |meth|
|
22
|
+
Array(excluded_methods).flatten.each do |meth|
|
13
23
|
included_module.send(:undef_method, meth)
|
14
24
|
end
|
15
25
|
end
|
data/spec/including_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe Module do
|
4
4
|
before do
|
5
5
|
module Foo
|
6
6
|
def foo; "foo"; end
|
@@ -12,15 +12,15 @@ describe "Object" do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "#including" do
|
15
|
-
context "
|
16
|
-
context "
|
15
|
+
context "given no options arguments" do
|
16
|
+
context "given a valid module" do
|
17
17
|
before do
|
18
18
|
Bar.class_eval do
|
19
19
|
including Foo
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
it "mixes in the
|
23
|
+
it "mixes in the given module" do
|
24
24
|
bar = Bar.new
|
25
25
|
|
26
26
|
bar.foo.should == "foo"
|
@@ -29,7 +29,7 @@ describe "Object" do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
context "
|
32
|
+
context "given an invalid module" do
|
33
33
|
it "raises an exception" do
|
34
34
|
expect do
|
35
35
|
Bar.class_eval { including NotAModule }
|
@@ -37,51 +37,111 @@ describe "Object" do
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
|
-
end
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
context "given an 'only' options argument" do
|
42
|
+
context "given an array" do
|
43
|
+
before do
|
44
|
+
Bar.class_eval { including Foo, only: [:foo, :bar] }
|
45
|
+
end
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
it "undefines all methods not listed in the 'only' array" do
|
48
|
+
bar = Bar.new
|
49
49
|
|
50
|
-
|
51
|
-
|
50
|
+
bar.foo.should == "foo"
|
51
|
+
bar.bar.should == "bar"
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
expect { bar.baz }.to raise_error(NoMethodError)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "given a symbol" do
|
58
|
+
before do
|
59
|
+
Bar.class_eval { including Foo, only: :bar }
|
60
|
+
end
|
61
|
+
|
62
|
+
it "undefines all other methods" do
|
63
|
+
bar = Bar.new
|
56
64
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
65
|
+
bar.bar.should == "bar"
|
66
|
+
|
67
|
+
expect { bar.foo }.to raise_error(NoMethodError)
|
68
|
+
end
|
61
69
|
end
|
62
70
|
|
63
|
-
|
64
|
-
|
71
|
+
context "given a string" do
|
72
|
+
before do
|
73
|
+
Bar.class_eval { including Foo, only: "bar" }
|
74
|
+
end
|
75
|
+
|
76
|
+
it "undefines all other methods" do
|
77
|
+
bar = Bar.new
|
65
78
|
|
66
|
-
|
79
|
+
bar.bar.should == "bar"
|
67
80
|
|
68
|
-
|
69
|
-
|
81
|
+
expect { bar.foo }.to raise_error(NoMethodError)
|
82
|
+
end
|
70
83
|
end
|
71
84
|
end
|
72
85
|
|
73
|
-
context "given an
|
74
|
-
|
75
|
-
|
86
|
+
context "given an 'except' options argumenmt" do
|
87
|
+
context "given an array of symbols" do
|
88
|
+
before do
|
89
|
+
Bar.class_eval { including Foo, except: [:foo] }
|
90
|
+
end
|
91
|
+
|
92
|
+
it "undefines all methods listed in the 'except' array" do
|
93
|
+
bar = Bar.new
|
94
|
+
|
95
|
+
expect { bar.foo }.to raise_error(NoMethodError)
|
96
|
+
|
97
|
+
bar.bar.should == "bar"
|
98
|
+
bar.baz.should == "baz"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "given an array with at least one string" do
|
103
|
+
before do
|
104
|
+
Bar.class_eval { including Foo, except: ["foo"] }
|
105
|
+
end
|
106
|
+
|
107
|
+
it "undefines all methods listed in the 'except' array" do
|
108
|
+
bar = Bar.new
|
109
|
+
|
110
|
+
expect { bar.foo }.to raise_error(NoMethodError)
|
111
|
+
|
112
|
+
bar.bar.should == "bar"
|
113
|
+
bar.baz.should == "baz"
|
114
|
+
end
|
76
115
|
end
|
77
116
|
|
78
|
-
|
79
|
-
|
117
|
+
context "given a symbol" do
|
118
|
+
before do
|
119
|
+
Bar.class_eval { including Foo, except: :foo }
|
120
|
+
end
|
80
121
|
|
81
|
-
|
122
|
+
it "undefines the given method" do
|
123
|
+
bar = Bar.new
|
82
124
|
|
83
|
-
|
84
|
-
|
125
|
+
expect { bar.foo }.to raise_error(NoMethodError)
|
126
|
+
|
127
|
+
bar.bar.should == "bar"
|
128
|
+
bar.baz.should == "baz"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "given a string" do
|
133
|
+
before do
|
134
|
+
Bar.class_eval { including Foo, except: "foo" }
|
135
|
+
end
|
136
|
+
|
137
|
+
it "undefines the given method" do
|
138
|
+
bar = Bar.new
|
139
|
+
|
140
|
+
expect { bar.foo }.to raise_error(NoMethodError)
|
141
|
+
|
142
|
+
bar.bar.should == "bar"
|
143
|
+
bar.baz.should == "baz"
|
144
|
+
end
|
85
145
|
end
|
86
146
|
end
|
87
147
|
end
|
metadata
CHANGED
@@ -1,60 +1,59 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: including
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Bryan Woods
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-04-05 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: rspec
|
17
|
-
requirement: &
|
16
|
+
requirement: &70158534189880 !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
|
-
requirements:
|
18
|
+
requirements:
|
20
19
|
- - ~>
|
21
|
-
- !ruby/object:Gem::Version
|
20
|
+
- !ruby/object:Gem::Version
|
22
21
|
version: 2.8.0
|
23
22
|
type: :development
|
24
23
|
prerelease: false
|
25
|
-
version_requirements: *
|
26
|
-
- !ruby/object:Gem::Dependency
|
24
|
+
version_requirements: *70158534189880
|
25
|
+
- !ruby/object:Gem::Dependency
|
27
26
|
name: bundler
|
28
|
-
requirement: &
|
27
|
+
requirement: &70158534189280 !ruby/object:Gem::Requirement
|
29
28
|
none: false
|
30
|
-
requirements:
|
29
|
+
requirements:
|
31
30
|
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
31
|
+
- !ruby/object:Gem::Version
|
33
32
|
version: 1.0.0
|
34
33
|
type: :development
|
35
34
|
prerelease: false
|
36
|
-
version_requirements: *
|
37
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: *70158534189280
|
36
|
+
- !ruby/object:Gem::Dependency
|
38
37
|
name: jeweler
|
39
|
-
requirement: &
|
38
|
+
requirement: &70158534188360 !ruby/object:Gem::Requirement
|
40
39
|
none: false
|
41
|
-
requirements:
|
40
|
+
requirements:
|
42
41
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
42
|
+
- !ruby/object:Gem::Version
|
44
43
|
version: 1.8.3
|
45
44
|
type: :development
|
46
45
|
prerelease: false
|
47
|
-
version_requirements: *
|
48
|
-
description: "\n An observation: Other languages allow for more granular loading
|
46
|
+
version_requirements: *70158534188360
|
47
|
+
description: ! "\n An observation: Other languages allow for more granular loading
|
48
|
+
of only \n desired methods and functions from module code.\n\n An experiment:
|
49
|
+
How might this be done in Ruby?\n "
|
49
50
|
email: bryanwoods4e@gmail.com
|
50
51
|
executables: []
|
51
|
-
|
52
52
|
extensions: []
|
53
|
-
|
54
|
-
extra_rdoc_files:
|
53
|
+
extra_rdoc_files:
|
55
54
|
- LICENSE.txt
|
56
55
|
- README.rdoc
|
57
|
-
files:
|
56
|
+
files:
|
58
57
|
- .document
|
59
58
|
- .rspec
|
60
59
|
- Gemfile
|
@@ -68,34 +67,31 @@ files:
|
|
68
67
|
- spec/including_spec.rb
|
69
68
|
- spec/spec_helper.rb
|
70
69
|
homepage: http://github.com/bryanwoods/including
|
71
|
-
licenses:
|
70
|
+
licenses:
|
72
71
|
- MIT
|
73
72
|
post_install_message:
|
74
73
|
rdoc_options: []
|
75
|
-
|
76
|
-
require_paths:
|
74
|
+
require_paths:
|
77
75
|
- lib
|
78
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
77
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
84
|
-
segments:
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
segments:
|
85
83
|
- 0
|
86
|
-
|
87
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
hash: 260768192517672204
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
86
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
version:
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
93
91
|
requirements: []
|
94
|
-
|
95
92
|
rubyforge_project:
|
96
|
-
rubygems_version: 1.8.
|
93
|
+
rubygems_version: 1.8.16
|
97
94
|
signing_key:
|
98
95
|
specification_version: 3
|
99
96
|
summary: Including mixes in only what you want
|
100
97
|
test_files: []
|
101
|
-
|