metaprogrammer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2a381d9508c34f1f4f2bc6a369bd5e4fb1cdd46a4fa41396d639dacd988e7ebd
4
+ data.tar.gz: f0786bd8310cfea0f8489cc996bc6de537fcf36ec35dd3b38a80a48dafcc577d
5
+ SHA512:
6
+ metadata.gz: a2d5d43631cd5a3d4bd341ca06ed8aef4d8f7c5042a54656cb1b156a1c20821cc6db3906f4b6527675809e9f9fdcb8916ea423537579a7c5736cf64780dcb850
7
+ data.tar.gz: fc6101bc1fb32dda0136cedd3d2ccb86002d22935401cf8cf5a02c4e8ea480c80f4604428f04fc988433653a428c60bf91b2d2f6e9901ffaed35c1b43c0dc487
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require 'metaprogrammer'
3
+ class Metaprogrammer::CLI < Thor
4
+ desc "test", "run tests"
5
+ def test
6
+ puts "No tests have been wrritten"
7
+ exit
8
+ end
9
+ end
10
+ Metaprogrammer::CLI.start ARGV
@@ -0,0 +1,63 @@
1
+ require 'pry'
2
+ module Metaprogrammer
3
+
4
+ module Core
5
+
6
+ def patch_all_methods(klass: self, **opts, &blk)
7
+ patch_class_methods(klass: klass, **opts, &blk)
8
+ patch_instance_methods(klass: klass, **opts, &blk)
9
+ end
10
+
11
+ def patch_class_methods(klass: self, **opts, &blk)
12
+ all_fns = (
13
+ [klass] | (klass.ancestors - Object.ancestors)
14
+ ).flat_map do |klass_x|
15
+ klass_x.methods(false)
16
+ end
17
+ fns = Metaprogrammer.filter_methods all_fns, **opts
18
+ fns.each do |fn_name|
19
+ orig_method = klass.method fn_name
20
+ klass.singleton_class.send(:define_method, fn_name) do |*args, &caller_blk|
21
+ blk.call orig_method, *args, &caller_blk
22
+ end
23
+ end
24
+ end
25
+
26
+ def patch_instance_methods(klass: self, **opts, &blk)
27
+ all_fns = (
28
+ [klass] | (klass.ancestors - Object.ancestors)
29
+ ).flat_map do |klass_x|
30
+ klass_x.instance_methods(false)
31
+ end
32
+ fns = Metaprogrammer.filter_methods all_fns, **opts
33
+ fns.each do |fn_name|
34
+ orig_method = klass.instance_method fn_name
35
+ klass.send(:define_method, fn_name) do |*args, &caller_blk|
36
+ blk.call orig_method.bind(self), *args, &caller_blk
37
+ end
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ include Core
44
+
45
+ require_relative 'metaprogrammer/usages'
46
+
47
+ include Usages
48
+
49
+ def self.filter_methods(fns, only: nil, except: nil)
50
+ if only
51
+ only = Set.new(only)
52
+ fns = fns.select(&only.method(:member?))
53
+ end
54
+ if except
55
+ except = Set.new(except)
56
+ fns = fns.reject(&except.method(:member?))
57
+ end
58
+ fns
59
+ end
60
+
61
+ extend Metaprogrammer
62
+
63
+ end
@@ -0,0 +1,23 @@
1
+ module Metaprogrammer
2
+ module Usages
3
+
4
+ def rescue_all_methods(*exceptions, klass: self, **opts, &blk)
5
+ patch_all_methods(klass: klass, **opts) do |orig_method, *args, &caller_blk|
6
+ begin
7
+ orig_method.call *args, &caller_blk
8
+ rescue *exceptions => e
9
+ blk.call(e)
10
+ end
11
+ end
12
+ end
13
+
14
+ def memoize(klass: self, **opts, &blk)
15
+ patch_all_methods(klass: klass, **opts) do |orig_method, *args, &caller_blk|
16
+ memos = @_memoized_methods ||= {}
17
+ method_memos = @_memoized_methods[orig_method] ||= {}
18
+ method_memos[args] ||= orig_method.call *args, &caller_blk
19
+ end
20
+ end
21
+
22
+ end
23
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Metaprogrammer
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: metaprogrammer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - max pleaner
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-04-21 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ''
14
+ email: maxpleaner@gmail.com
15
+ executables:
16
+ - metaprogrammer
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/metaprogrammer
21
+ - lib/metaprogrammer.rb
22
+ - lib/metaprogrammer/usages.rb
23
+ - lib/version.rb
24
+ homepage: http://github.com/maxp-edcast/metaprogrammer
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - "~>"
35
+ - !ruby/object:Gem::Version
36
+ version: '2.3'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 2.7.3
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.7.3
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: metaprogramming helpers and common constructs
48
+ test_files: []