method_repository 0.0.4 → 0.0.5
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.
- checksums.yaml +7 -0
- data/README.md +38 -1
- data/lib/method_repository.rb +24 -2
- data/lib/method_repository/version.rb +1 -1
- data/spec/lib/method_repository_spec.rb +64 -0
- metadata +9 -16
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7d0710a19c282ef8e641f042d15563f5498602bc
|
4
|
+
data.tar.gz: c9a9f0bc218b5f5fc95feb03aa5b37045f5e718b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 78d801a95aee6810a5f18836587fe6d4a5b77d11e5c599fd429e6a2be16841a5a2e3d2a57e0d5df4084aa4dbe690c47f64310e3de0e9e6136b22f34f29fa2d2c
|
7
|
+
data.tar.gz: d9ba6041bfafbb1315a028dfdd2ccb5dbbe5d6ab14373eb14de5cc9b97248887210bdc7fff4667842c24a7be37dfdaa12fa2174d4199a73926fe17cb69ce03c9
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@ To extract redundant codes into a method to commonalize them is a usual strategy
|
|
8
8
|
|
9
9
|
I don't like when highly commonalized OOP structure disturbes me from quick tracing where such methods are defined. It's OOP's natural defect, I think. Once classes/modules are defined, it's inevitable that the classes/modules are inherited/included at anywhere we don't know.
|
10
10
|
|
11
|
-
In that way, inheritance/inclusion-based OOP resembles `goto` programming; There's no clear reason why some classes/modules are inherited/included by another classes/modules. Even though there's some structural thought in your classes/modules design, such an excessively free inheritance/inclusion
|
11
|
+
In that way, inheritance/inclusion-based OOP resembles `goto` programming; There's no clear reason why some classes/modules are inherited/included by another classes/modules. Even though there's some structural thought in your classes/modules design, such an excessively free inheritance/inclusion prevents us from grasping the whole code quickily.
|
12
12
|
|
13
13
|
## Solution
|
14
14
|
|
@@ -38,6 +38,43 @@ class Qux; end
|
|
38
38
|
* `method2` is declared it can be inserted in only `Baz`
|
39
39
|
* No method is declared it can be inserted in `Qux`
|
40
40
|
|
41
|
+
### Limit Extending/Including in a Lump
|
42
|
+
|
43
|
+
You can also limit extending/including in a lump, not designating classes using `insert` method at method definitions, like below:
|
44
|
+
|
45
|
+
```
|
46
|
+
module Extendable
|
47
|
+
include MethodRepository
|
48
|
+
|
49
|
+
extendable_by 'Hoge'
|
50
|
+
end
|
51
|
+
|
52
|
+
module Includable
|
53
|
+
include MethodRepository
|
54
|
+
|
55
|
+
includable_by 'Hoge'
|
56
|
+
end
|
57
|
+
|
58
|
+
class Hoge; end
|
59
|
+
class Fuga; end
|
60
|
+
```
|
61
|
+
|
62
|
+
In this way:
|
63
|
+
|
64
|
+
```
|
65
|
+
Hoge.extend(Extendable)
|
66
|
+
Hoge.send(:include, Includable)
|
67
|
+
```
|
68
|
+
|
69
|
+
works as you see, however:
|
70
|
+
|
71
|
+
```
|
72
|
+
Fuga.extend(Extendable)
|
73
|
+
Fuga.send(:include, Includable)
|
74
|
+
```
|
75
|
+
|
76
|
+
raises `MethodRepository::NotPermittedError`.
|
77
|
+
|
41
78
|
### Extending
|
42
79
|
|
43
80
|
When the classes/objects are extended by `Repository` module:
|
data/lib/method_repository.rb
CHANGED
@@ -2,14 +2,22 @@ require_relative "method_repository/version"
|
|
2
2
|
|
3
3
|
module MethodRepository
|
4
4
|
def self.included(base)
|
5
|
-
base.instance_variable_set(:@targets,
|
5
|
+
base.instance_variable_set(:@targets, {})
|
6
|
+
base.instance_variable_set(:@extendable, [])
|
7
|
+
base.instance_variable_set(:@includable, [])
|
6
8
|
base.extend(ModuleMethods)
|
7
9
|
end
|
8
10
|
|
11
|
+
class NotPermittedError < RuntimeError; end
|
12
|
+
|
9
13
|
module ModuleMethods
|
10
14
|
def extended(base)
|
11
15
|
klass_name = base.class.to_s == 'Class' ? base.to_s : base.class.to_s
|
12
16
|
|
17
|
+
if !@extendable.empty? && !@extendable.include?(klass_name)
|
18
|
+
raise MethodRepository::NotPermittedError.new("Extending #{klass_name} by this module is not permitted")
|
19
|
+
end
|
20
|
+
|
13
21
|
if (methods = @targets[klass_name])
|
14
22
|
base.singleton_class.class_eval do
|
15
23
|
methods.each do |method|
|
@@ -20,7 +28,13 @@ module MethodRepository
|
|
20
28
|
end
|
21
29
|
|
22
30
|
def included(base)
|
23
|
-
|
31
|
+
klass_name = base.to_s
|
32
|
+
|
33
|
+
if !@includable.empty? && !@includable.include?(klass_name)
|
34
|
+
raise MethodRepository::NotPermittedError.new("Including #{klass_name} by this module is not permitted")
|
35
|
+
end
|
36
|
+
|
37
|
+
if (methods = @targets[klass_name])
|
24
38
|
base.class_eval do
|
25
39
|
methods.each do |method|
|
26
40
|
define_method method[:name], method[:block]
|
@@ -29,6 +43,14 @@ module MethodRepository
|
|
29
43
|
end
|
30
44
|
end
|
31
45
|
|
46
|
+
def extendable_by(*klasses)
|
47
|
+
@extendable.push(*klasses)
|
48
|
+
end
|
49
|
+
|
50
|
+
def includable_by(*klasses)
|
51
|
+
@includable.push(*klasses)
|
52
|
+
end
|
53
|
+
|
32
54
|
def insert(name, klasses = {}, &block)
|
33
55
|
if !klasses[:in]
|
34
56
|
raise ArgumentError.new("`:in' parameter is required")
|
@@ -1,6 +1,18 @@
|
|
1
1
|
require_relative '../spec_helper'
|
2
2
|
|
3
3
|
describe MethodRepository do
|
4
|
+
module Extendable
|
5
|
+
include MethodRepository
|
6
|
+
|
7
|
+
extendable_by 'Hoge', 'Piyo'
|
8
|
+
end
|
9
|
+
|
10
|
+
module Includable
|
11
|
+
include MethodRepository
|
12
|
+
|
13
|
+
includable_by 'Hoge', 'Piyo'
|
14
|
+
end
|
15
|
+
|
4
16
|
module Repository
|
5
17
|
include MethodRepository
|
6
18
|
|
@@ -8,11 +20,59 @@ describe MethodRepository do
|
|
8
20
|
insert :method2, in: %w[Baz] do; end
|
9
21
|
end
|
10
22
|
|
23
|
+
class Hoge; end
|
24
|
+
class Fuga; end
|
25
|
+
class Piyo; end
|
26
|
+
|
11
27
|
class Foo; end
|
12
28
|
class Bar; end
|
13
29
|
class Baz; end
|
14
30
|
class Qux; end
|
15
31
|
|
32
|
+
describe '.extendable_by' do
|
33
|
+
context 'when classes are permitted as extendable' do
|
34
|
+
before {
|
35
|
+
Hoge.extend(Extendable)
|
36
|
+
Piyo.extend(Extendable)
|
37
|
+
}
|
38
|
+
|
39
|
+
it {
|
40
|
+
expect(Hoge).to be_a_kind_of Extendable
|
41
|
+
expect(Piyo).to be_a_kind_of Extendable
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when classes are not permitted as extendable' do
|
46
|
+
it {
|
47
|
+
expect {
|
48
|
+
Fuga.extend(Extendable)
|
49
|
+
}.to raise_error(MethodRepository::NotPermittedError)
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.includable_by' do
|
55
|
+
context 'when classes are permitted as includable' do
|
56
|
+
before {
|
57
|
+
Hoge.send(:include, Includable)
|
58
|
+
Piyo.send(:include, Includable)
|
59
|
+
}
|
60
|
+
|
61
|
+
it {
|
62
|
+
expect(Hoge.new).to be_a_kind_of Includable
|
63
|
+
expect(Piyo.new).to be_a_kind_of Includable
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when classes are not permitted as includable' do
|
68
|
+
it {
|
69
|
+
expect {
|
70
|
+
Fuga.send(:include, Includable)
|
71
|
+
}.to raise_error(MethodRepository::NotPermittedError)
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
16
76
|
describe '.insert' do
|
17
77
|
it {
|
18
78
|
expect {
|
@@ -95,4 +155,8 @@ describe MethodRepository do
|
|
95
155
|
expect(Qux.new.respond_to?(:method2)).to be false
|
96
156
|
}
|
97
157
|
end
|
158
|
+
|
159
|
+
describe '.includable_by' do
|
160
|
+
context 'when classes'
|
161
|
+
end
|
98
162
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: method_repository
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Kentaro Kuribayashi
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-03-08 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,17 +27,15 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
description: Extracting redundant code and commonalizing it in a different way.
|
@@ -63,29 +58,27 @@ files:
|
|
63
58
|
- spec/spec_helper.rb
|
64
59
|
homepage: https://github.com/kentaro/method_repository
|
65
60
|
licenses: []
|
61
|
+
metadata: {}
|
66
62
|
post_install_message:
|
67
63
|
rdoc_options: []
|
68
64
|
require_paths:
|
69
65
|
- lib
|
70
66
|
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
-
none: false
|
72
67
|
requirements:
|
73
|
-
- -
|
68
|
+
- - '>='
|
74
69
|
- !ruby/object:Gem::Version
|
75
70
|
version: 1.9.2
|
76
71
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
-
none: false
|
78
72
|
requirements:
|
79
|
-
- -
|
73
|
+
- - '>='
|
80
74
|
- !ruby/object:Gem::Version
|
81
75
|
version: '0'
|
82
76
|
requirements: []
|
83
77
|
rubyforge_project:
|
84
|
-
rubygems_version:
|
78
|
+
rubygems_version: 2.0.0
|
85
79
|
signing_key:
|
86
|
-
specification_version:
|
80
|
+
specification_version: 4
|
87
81
|
summary: Extracting redundant code and commonalizing it in a different way
|
88
82
|
test_files:
|
89
83
|
- spec/lib/method_repository_spec.rb
|
90
84
|
- spec/spec_helper.rb
|
91
|
-
has_rdoc:
|