everyday-cli-utils 1.7.4 → 1.8.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.
- checksums.yaml +4 -4
- data/everyday-cli-utils.gemspec +1 -1
- data/lib/everyday-cli-utils/override.rb +102 -0
- data/lib/everyday-cli-utils/version.rb +1 -1
- data/lib/everyday-cli-utils.rb +3 -2
- data/spec/everyday-cli-utils/maputil_spec.rb +1 -1
- data/spec/everyday-cli-utils/override_spec.rb +48 -0
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9ee0af3e7bd0801b0f8d10fba5065ce4460c372
|
4
|
+
data.tar.gz: fd9cd12f7942c1cdca57a2b7f14e3ab3c742e415
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f49ed1abee59229a42e4579398985a661c4010a0af531ccac75255bfdd9807f32104f9478823b696e4c87df4eaaa3575f40f07544b6e53b4535308c12612de8c
|
7
|
+
data.tar.gz: 2271b2e4218baef1c5c43e4aa1e2e40d212725c1c8acf7bd3d4fc944702432c246c8994bd1b26dc9ce3f53693f3f608d518214f8438ac2e52c2cce6d03100dd5
|
data/everyday-cli-utils.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.required_ruby_version = '>= 1.9.3'
|
22
22
|
|
23
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
24
24
|
spec.add_development_dependency 'rake', '~> 10.0'
|
25
25
|
spec.add_development_dependency 'simplecov', '>= 0.8.2'
|
26
26
|
spec.add_development_dependency 'coveralls', '>= 0.7.0'
|
@@ -0,0 +1,102 @@
|
|
1
|
+
class MethodOverrides
|
2
|
+
def initialize
|
3
|
+
@overrides = {}
|
4
|
+
end
|
5
|
+
|
6
|
+
def empty?(method_name)
|
7
|
+
@overrides[method_name].nil? || @overrides[method_name].empty?
|
8
|
+
end
|
9
|
+
|
10
|
+
def store_override(method_name, method)
|
11
|
+
@overrides[method_name] ||= []
|
12
|
+
@overrides[method_name] << method
|
13
|
+
end
|
14
|
+
|
15
|
+
def get(obj)
|
16
|
+
OverridesInstance.new(@overrides, obj)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class OverridesInstance
|
21
|
+
def initialize(overrides, obj, ind = 0)
|
22
|
+
@overrides = overrides
|
23
|
+
@obj = obj
|
24
|
+
@ind = ind
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](ind)
|
28
|
+
OverridesInstance.new(@overrides, @obj, @ind - ind)
|
29
|
+
end
|
30
|
+
|
31
|
+
def call_override(method_symbol, *args, &block)
|
32
|
+
if @overrides.has_key?(method_symbol.to_sym)
|
33
|
+
overrides = @overrides[method_symbol.to_sym]
|
34
|
+
ind = overrides.count + (@ind - 1)
|
35
|
+
ovin = Thread.current["overrides_ind_#{@obj.__id__}"] || 0
|
36
|
+
ind += ovin
|
37
|
+
Thread.current["overrides_ind_#{@obj.__id__}"] = @ind + ovin - 1
|
38
|
+
rv = overrides[ind].bind(@obj).call(*args, &block)
|
39
|
+
Thread.current["overrides_ind_#{@obj.__id__}"] = ovin
|
40
|
+
rv
|
41
|
+
else
|
42
|
+
@obj.send(method_symbol.to_sym, *args, &block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def method_missing(symbol, *args, &block)
|
47
|
+
call_override(symbol, *args, &block)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class Object
|
52
|
+
def create_method(name, &block)
|
53
|
+
self.send(:define_method, name, &block)
|
54
|
+
end
|
55
|
+
|
56
|
+
def overrides
|
57
|
+
(@overrides && @overrides.get(self)) || self.class.overrides(self)
|
58
|
+
end
|
59
|
+
|
60
|
+
def true_overrides
|
61
|
+
@overrides
|
62
|
+
end
|
63
|
+
|
64
|
+
def true_overrides=(overrides)
|
65
|
+
@overrides = overrides
|
66
|
+
end
|
67
|
+
|
68
|
+
def override(method_name, &block)
|
69
|
+
s2 = self
|
70
|
+
class << self
|
71
|
+
self
|
72
|
+
end.class_eval {
|
73
|
+
original_method = instance_method(method_name.to_sym)
|
74
|
+
s2.true_overrides ||= MethodOverrides.new
|
75
|
+
s2.true_overrides.store_override(method_name.to_sym, original_method)
|
76
|
+
self.create_method(method_name.to_sym, &block)
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
class << self
|
81
|
+
def overrides(s)
|
82
|
+
@overrides && @overrides.get(s)
|
83
|
+
end
|
84
|
+
|
85
|
+
def true_overrides
|
86
|
+
@overrides
|
87
|
+
end
|
88
|
+
|
89
|
+
def true_overrides=(overrides)
|
90
|
+
@overrides = overrides
|
91
|
+
end
|
92
|
+
|
93
|
+
def override(method_name, &block)
|
94
|
+
self.class_eval {
|
95
|
+
original_method = instance_method(method_name.to_sym)
|
96
|
+
self.true_overrides ||= MethodOverrides.new
|
97
|
+
self.true_overrides.store_override(method_name.to_sym, original_method)
|
98
|
+
self.create_method(method_name.to_sym, &block)
|
99
|
+
}
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/lib/everyday-cli-utils.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'everyday-cli-utils/version'
|
2
2
|
|
3
3
|
module EverydayCliUtils
|
4
|
-
AVAILABLE_MODULES = [:ask, :format, :format_safe, :histogram, :histogram_safe, :kmeans, :kmeans_safe, :maputil, :maputil_safe, :option]
|
4
|
+
AVAILABLE_MODULES = [:ask, :format, :format_safe, :histogram, :histogram_safe, :kmeans, :kmeans_safe, :maputil, :maputil_safe, :option, :override]
|
5
5
|
MODULE_TO_RELATIVE = {
|
6
6
|
ask: 'everyday-cli-utils/ask',
|
7
7
|
format: 'everyday-cli-utils/format',
|
@@ -12,7 +12,8 @@ module EverydayCliUtils
|
|
12
12
|
kmeans_safe: 'everyday-cli-utils/safe/kmeans',
|
13
13
|
maputil: 'everyday-cli-utils/maputil',
|
14
14
|
maputil_safe: 'everyday-cli-utils/safe/maputil',
|
15
|
-
option: 'everyday-cli-utils/option'
|
15
|
+
option: 'everyday-cli-utils/option',
|
16
|
+
override: 'everyday-cli-utils/override',
|
16
17
|
}
|
17
18
|
|
18
19
|
def import(*names)
|
@@ -77,7 +77,7 @@ describe 'maputil' do
|
|
77
77
|
|
78
78
|
it 'provides a means of using map with a hash' do
|
79
79
|
hash = { a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 }
|
80
|
-
mapped = hash.
|
80
|
+
mapped = hash.hashmap { |v| v[1] + ((v[0] == :a || v[0] == :c || v[0] == :e) ? 1 : -1) }
|
81
81
|
expected = { a: 2, b: 1, c: 4, d: 3, e: 6, f: 5}
|
82
82
|
mapped.should eq expected
|
83
83
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative '../../lib/everyday-cli-utils'
|
2
|
+
include EverydayCliUtils
|
3
|
+
import :override
|
4
|
+
|
5
|
+
class TestClass
|
6
|
+
def test(t)
|
7
|
+
"Hi #{t}!"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'override' do
|
12
|
+
it 'supports overriding methods' do
|
13
|
+
arr = [1, 2, 3]
|
14
|
+
arr.override(:first) { "Boo! #{self.overrides.first}"}
|
15
|
+
arr.first.should eq 'Boo! 1'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'supports overriding methods multiple times' do
|
19
|
+
arr = [1, 2, 3]
|
20
|
+
arr.override(:first) { "Boo! #{self.overrides.first}" }
|
21
|
+
arr.override(:first) { "Boo Again! #{self.overrides[1].first}" }
|
22
|
+
arr.override(:first) { "Boo Again Again! #{self.overrides[1].first} | #{self.overrides.first}" }
|
23
|
+
arr.first.should eq 'Boo Again Again! Boo! 1 | Boo Again! 1'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'supports overriding methods multiple times on a class' do
|
27
|
+
TestClass.override(:test) { |t| "Boo! #{self.overrides.test("-#{t}-")}" }
|
28
|
+
TestClass.override(:test) { |t| "Boo Again! #{self.overrides[1].test("+#{t}+")}" }
|
29
|
+
TestClass.override(:test) { |t| "Boo Again Again! #{self.overrides[1].test("!#{t}!")} | #{self.overrides.test("~#{t}~")}" }
|
30
|
+
TestClass.new.test('Eric').should eq 'Boo Again Again! Boo! Hi -!Eric!-! | Boo Again! Hi +~Eric~+!'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'supports calling methods defined by Object that do not trigger method_missing' do
|
34
|
+
arr = [1, 2, 3]
|
35
|
+
arr.override(:inspect) { "Boo! #{self.overrides.call_override :inspect}" }
|
36
|
+
arr.override(:inspect) { "Boo Again! #{self.overrides[1].call_override :inspect}" }
|
37
|
+
arr.override(:inspect) { "Boo Again Again! #{self.overrides[1].call_override :inspect} | #{self.overrides.call_override :inspect}" }
|
38
|
+
arr.inspect.should eq 'Boo Again Again! Boo! [1, 2, 3] | Boo Again! [1, 2, 3]'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'supports calling methods on the overrides object that were not overridden' do
|
42
|
+
arr = [1, 2, 3]
|
43
|
+
arr.override(:first) { "Boo! #{self.overrides.first}" }
|
44
|
+
arr.override(:first) { "Boo Again! #{self.overrides[1].first}" }
|
45
|
+
arr.override(:first) { "Boo Again Again! #{self.overrides[1].first} | #{self.overrides.first} || #{self.overrides.last}" }
|
46
|
+
arr.first.should eq 'Boo Again Again! Boo! 1 | Boo Again! 1 || 3'
|
47
|
+
end
|
48
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: everyday-cli-utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Henderson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.6'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,6 +107,7 @@ files:
|
|
107
107
|
- lib/everyday-cli-utils/kmeans.rb
|
108
108
|
- lib/everyday-cli-utils/maputil.rb
|
109
109
|
- lib/everyday-cli-utils/option.rb
|
110
|
+
- lib/everyday-cli-utils/override.rb
|
110
111
|
- lib/everyday-cli-utils/safe/format.rb
|
111
112
|
- lib/everyday-cli-utils/safe/histogram.rb
|
112
113
|
- lib/everyday-cli-utils/safe/kmeans.rb
|
@@ -116,6 +117,7 @@ files:
|
|
116
117
|
- spec/everyday-cli-utils/kmeans_spec.rb
|
117
118
|
- spec/everyday-cli-utils/maputil_spec.rb
|
118
119
|
- spec/everyday-cli-utils/option_spec.rb
|
120
|
+
- spec/everyday-cli-utils/override_spec.rb
|
119
121
|
- spec/spec_helper.rb
|
120
122
|
homepage: https://github.com/henderea/everyday-cli-utils
|
121
123
|
licenses:
|
@@ -146,5 +148,6 @@ test_files:
|
|
146
148
|
- spec/everyday-cli-utils/kmeans_spec.rb
|
147
149
|
- spec/everyday-cli-utils/maputil_spec.rb
|
148
150
|
- spec/everyday-cli-utils/option_spec.rb
|
151
|
+
- spec/everyday-cli-utils/override_spec.rb
|
149
152
|
- spec/spec_helper.rb
|
150
153
|
has_rdoc:
|