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 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
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,19 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dec (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ benchmark-ips (2.8.4)
10
+
11
+ PLATFORMS
12
+ x86_64-linux
13
+
14
+ DEPENDENCIES
15
+ benchmark-ips (~> 2.8.4)
16
+ dec!
17
+
18
+ BUNDLED WITH
19
+ 2.2.14
data/Makefile ADDED
@@ -0,0 +1,19 @@
1
+ .PHONY: *
2
+
3
+ default: test
4
+
5
+ build:
6
+ rm -f *.gem
7
+ gem build dec.gemspec
8
+
9
+ publish: build
10
+ gem push *.gem
11
+
12
+ irb:
13
+ irb -Ilib -rdec
14
+
15
+ test:
16
+ ruby -Ilib:spec spec/*_spec.rb
17
+
18
+ bench:
19
+ ruby -Ilib:spec bench/*_bench.rb
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
+ ```
@@ -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
@@ -0,0 +1,2 @@
1
+ require "minitest/autorun"
2
+ require "dec"
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: []