dec 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +19 -0
- data/Makefile +19 -0
- data/README.md +35 -0
- data/bench/dec_bench.rb +37 -0
- data/dec.gemspec +15 -0
- data/lib/dec.rb +46 -0
- data/spec/dec_spec.rb +31 -0
- data/spec/spec_helper.rb +2 -0
- metadata +67 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 271c542626215f55dc65de4d5f4630991fde25c4e1b378fba8a50b8553b285ed
|
4
|
+
data.tar.gz: 99251a904321c660876b375f641f0b4208392f32b1d923a9db9974613865b842
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1bf3eb25390a72868b31600ee475fa4beb9fcf2d8ea8075db74aee7bd2b83811567fd3b104d2f05109fec97043edeed0b3c9535ce6c0f66ee4d6d5ecd1964256
|
7
|
+
data.tar.gz: 0cfc3dc4708b6bb6f0b711fcc1064ce12467f232b69aaf36c0aeebc6a58de1e3a171028414f7f6c7635f35464ac8fe571c9180e76f22c2674441cac986ae399d
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/Makefile
ADDED
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# dec
|
2
|
+
_simple method decorator_
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
|
6
|
+
`gem install dec`
|
7
|
+
|
8
|
+
## Example
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
class Something
|
12
|
+
extend Dec
|
13
|
+
|
14
|
+
dec { |r| r + 2 }
|
15
|
+
dec { |r| r + 1 }
|
16
|
+
def one
|
17
|
+
1
|
18
|
+
end
|
19
|
+
|
20
|
+
LOG = -> (r) { puts r.upcase; r }
|
21
|
+
|
22
|
+
dec LOG
|
23
|
+
def two
|
24
|
+
"two"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
s = Something.new
|
29
|
+
s.one
|
30
|
+
# => 4
|
31
|
+
|
32
|
+
s.two
|
33
|
+
TWO
|
34
|
+
# => "two"
|
35
|
+
```
|
data/bench/dec_bench.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "benchmark"
|
3
|
+
require "benchmark/ips"
|
4
|
+
|
5
|
+
describe "Dec Bench" do
|
6
|
+
it do
|
7
|
+
class With
|
8
|
+
extend Dec
|
9
|
+
|
10
|
+
dec { |r| r ** 2 }
|
11
|
+
dec { |r| r ** 3 }
|
12
|
+
def sum(a, b)
|
13
|
+
a + b
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Without
|
18
|
+
def sum(a, b)
|
19
|
+
a + b
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
n = 1_000
|
24
|
+
|
25
|
+
Benchmark.ips do |x|
|
26
|
+
x.report(With) do
|
27
|
+
n.times { With.new.sum(1, 2) }
|
28
|
+
end
|
29
|
+
|
30
|
+
x.report(Without) do
|
31
|
+
n.times { Without.new.sum(1, 2) }
|
32
|
+
end
|
33
|
+
|
34
|
+
x.compare!
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/dec.gemspec
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "dec"
|
5
|
+
s.version = "0.0.1"
|
6
|
+
s.summary = "method decorator"
|
7
|
+
s.authors = ["elcuervo"]
|
8
|
+
s.licenses = %w[MIT]
|
9
|
+
s.email = ["elcuervo@elcuervo.net"]
|
10
|
+
s.homepage = "http://github.com/elcuervo/dec"
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
s.test_files = `git ls-files test`.split("\n")
|
13
|
+
|
14
|
+
s.add_development_dependency("benchmark-ips", "~> 2.8.4")
|
15
|
+
end
|
data/lib/dec.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dec
|
4
|
+
HASH_ARRAY = -> (h, k) { h[k] = [] }
|
5
|
+
NS = "_dec_".freeze
|
6
|
+
|
7
|
+
def _executor
|
8
|
+
@_dec_executor ||= Hash.new(&HASH_ARRAY)
|
9
|
+
end
|
10
|
+
|
11
|
+
def dec_stack
|
12
|
+
@_dec_stack ||= []
|
13
|
+
end
|
14
|
+
|
15
|
+
def dec_calls
|
16
|
+
@_dec_calls ||= []
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_added(method_sym)
|
20
|
+
return if method_sym.to_s.start_with?(NS) || dec_calls.include?(method_sym) || dec_stack.empty?
|
21
|
+
|
22
|
+
dec_calls << method_sym
|
23
|
+
|
24
|
+
alias_method :"#{NS}#{method_sym}", method_sym
|
25
|
+
|
26
|
+
_executor[method_sym] = dec_stack
|
27
|
+
.select { |fn| fn.respond_to?(:call) }
|
28
|
+
.reverse
|
29
|
+
|
30
|
+
dec_stack.clear
|
31
|
+
|
32
|
+
class_eval <<-RB, __FILE__, __LINE__ + 1
|
33
|
+
def #{method_sym}(*args, **kwargs, &block)
|
34
|
+
result = send(:#{NS}#{method_sym}, *args, *kwargs, &block)
|
35
|
+
stack = self.class._executor[:#{method_sym}]
|
36
|
+
|
37
|
+
stack.each { |action| result = action.call(result) }
|
38
|
+
result
|
39
|
+
end
|
40
|
+
RB
|
41
|
+
end
|
42
|
+
|
43
|
+
def dec(*args, &block)
|
44
|
+
@_dec_stack = dec_stack + args << block
|
45
|
+
end
|
46
|
+
end
|
data/spec/dec_spec.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Dec do
|
4
|
+
class Test
|
5
|
+
extend Dec
|
6
|
+
|
7
|
+
square = -> (r) { r ** 2 }
|
8
|
+
cube = -> (r) { r ** 3 }
|
9
|
+
|
10
|
+
dec { |r| r / 2 }
|
11
|
+
dec square
|
12
|
+
dec cube
|
13
|
+
def sum(a, b)
|
14
|
+
a + b
|
15
|
+
end
|
16
|
+
|
17
|
+
def string
|
18
|
+
"potato"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it do
|
23
|
+
t = Test.new
|
24
|
+
|
25
|
+
initial = [1, 2]
|
26
|
+
expected = ((initial.inject(:+) ** 3) ** 2) / 2
|
27
|
+
|
28
|
+
assert_equal expected, t.sum(*initial)
|
29
|
+
assert_equal "potato", t.string
|
30
|
+
end
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dec
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- elcuervo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-03-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: benchmark-ips
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.8.4
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.8.4
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- elcuervo@elcuervo.net
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".gitignore"
|
35
|
+
- Gemfile
|
36
|
+
- Gemfile.lock
|
37
|
+
- Makefile
|
38
|
+
- README.md
|
39
|
+
- bench/dec_bench.rb
|
40
|
+
- dec.gemspec
|
41
|
+
- lib/dec.rb
|
42
|
+
- spec/dec_spec.rb
|
43
|
+
- spec/spec_helper.rb
|
44
|
+
homepage: http://github.com/elcuervo/dec
|
45
|
+
licenses:
|
46
|
+
- MIT
|
47
|
+
metadata: {}
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubygems_version: 3.0.3
|
64
|
+
signing_key:
|
65
|
+
specification_version: 4
|
66
|
+
summary: method decorator
|
67
|
+
test_files: []
|