roap 1.0.0

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
+ SHA1:
3
+ metadata.gz: f5fb0d6f594fc70c87fd637f152a8fb6c720e4b3
4
+ data.tar.gz: 1c88e8c07618d98bc73dd676340566c0d0b27538
5
+ SHA512:
6
+ metadata.gz: 6bcda50fa72ebe2dda7b87ce46554ef18bd1183aae952fb52c29bc0ef06705209382df42b0d2bf60c870ecde9ca78f067c813aae0f5ec37991455792499edcfb
7
+ data.tar.gz: fd00382d47c1bd9a3873227340621f2f6b420c0739190a4dd4f25d0fd6bfade5b90c5805d9862d6a3957bba0713e2b966a35d737da96e42574c3958e4d3cd972
data/lib/roap.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'method_source'
2
+
3
+ require_relative 'roap/roap'
4
+ require_relative 'roap/loader'
5
+ require_relative 'roap/utils'
6
+ require_relative 'roap/all_extensions'
7
+
8
+ require_relative 'roap/attrs/runtime'
9
+ require_relative 'roap/attrs/static'
10
+
11
+ Roap::require_all __dir__, 'roap/exts'
@@ -0,0 +1,9 @@
1
+ module Roap
2
+ module AllExtensions
3
+ def self.included base
4
+ Roap::extensions.each do |ext|
5
+ base.include ext
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+ require 'binding_of_caller'
2
+
3
+ module Roap
4
+ attr /runtime/ do |base, method, md, rule|
5
+ if method.class == UnboundMethod
6
+ target = :define_method
7
+ elsif method.class == Method
8
+ target = :define_singleton_method
9
+ end
10
+
11
+ base.__send__ target, method.name do |*p|
12
+ begin
13
+ if method.class == UnboundMethod
14
+ unbound = method
15
+ method = unbound.bind self
16
+ method.define_singleton_method :pure do
17
+ unbound.pure
18
+ end
19
+ method.define_singleton_method :attrs do
20
+ unbound.attrs
21
+ end
22
+ end
23
+
24
+ define_singleton_method :__comments__ do
25
+ return method.pure.comment
26
+ end
27
+ method.attrs.each do |attr|
28
+ define_singleton_method "__#{attr[:key]}__".to_sym do
29
+ attr[:value]
30
+ end
31
+ end
32
+
33
+ instance_exec method, md, *p, &rule[:block]
34
+ rescue Exception=>e
35
+ puts e.backtrace[1][/`.*'/][1..-2]
36
+ puts "on #{rule[:expr].inspect}"
37
+ puts "class #{base.to_s}"
38
+ puts "method #{method}"
39
+ raise e
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,18 @@
1
+ module Roap
2
+ attr /static/ do |base, method, md, rule|
3
+ begin
4
+ define_singleton_method :__comments__ do
5
+ return method.pure.comment
6
+ end
7
+ method.attrs.each do |attr|
8
+ define_singleton_method "__#{attr[:key]}__".to_sym do
9
+ attr[:value]
10
+ end
11
+ end
12
+
13
+ instance_exec base, method, md, &rule[:block]
14
+ rescue Exception=>e
15
+ raise e
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,39 @@
1
+ require 'digest'
2
+
3
+ module Roap
4
+ module DigestExtension
5
+ extend Roap::AttributeBase
6
+
7
+ def get_param_index method, name
8
+ idx = method.pure.parameters.index [:req, name.to_sym]
9
+
10
+ if idx == nil
11
+ raise ArgumentError, "parameter '#{md[:key]}' not found"
12
+ end
13
+
14
+ idx
15
+ end
16
+
17
+ on /sha1-digested (?<key>.*)/ do |_super, md, *args|
18
+ idx = get_param_index _super, md[:key]
19
+
20
+ args[idx] = Digest::SHA1.hexdigest args[idx]
21
+
22
+ _super.call *args
23
+ end
24
+ on /sha256-digested (?<key>.*)/ do |_super, md, *args|
25
+ idx = get_param_index _super, md[:key]
26
+
27
+ args[idx] = Digest::SHA256.hexdigest args[idx]
28
+
29
+ _super.call *args
30
+ end
31
+ on /md5-digested (?<key>.*)/ do |_super, md, *args|
32
+ idx = get_param_index _super, md[:key]
33
+
34
+ args[idx] = Digest::MD5.hexdigest args[idx]
35
+
36
+ _super.call *args
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,23 @@
1
+ module Roap
2
+ module LogExtension
3
+ extend Roap::AttributeBase
4
+
5
+ on /log-before (?<format>.*)/ do |_super, md, *args|
6
+ puts md[:format] % {
7
+ :name => _super.pure.name,
8
+ :location => _super.pure.source_location }
9
+
10
+ _super.call *args
11
+ end
12
+
13
+ on /log-after (?<format>.*)/ do |_super, md, *args|
14
+ result = _super.call *args
15
+
16
+ puts md[:format] % {
17
+ :name => _super.pure.name,
18
+ :location => _super.pure.source_location }
19
+
20
+ result
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ module Roap
2
+ def self.require_all cwd, path
3
+ Dir["#{cwd}/#{path}/*.rb"].each do |file|
4
+ require file
5
+ end
6
+ end
7
+ end
data/lib/roap/roap.rb ADDED
@@ -0,0 +1,112 @@
1
+ module Roap
2
+ @@rules = []
3
+
4
+ def self.attr expr, &block
5
+ @@rules.push({
6
+ :expr => expr,
7
+ :block => block })
8
+ end
9
+ end
10
+
11
+ module Roap
12
+ @@extensions = []
13
+ def self.extensions
14
+ @@extensions
15
+ end
16
+
17
+ module AttributeBase
18
+ @@original_methods = {}
19
+
20
+ def on expr, &block
21
+ attrs = block.comment.empty? ?
22
+ "runtime" : block.comment
23
+
24
+ rules.push({
25
+ :expr => expr,
26
+ :block => block,
27
+ :attrs => attrs})
28
+ end
29
+ def attr attr_name, &block
30
+
31
+ end
32
+
33
+ def get_pure base, method_name
34
+ @@original_methods["#{base}::#{method_name}"]
35
+ end
36
+
37
+ def self.extended base
38
+ local_rules = []
39
+
40
+ base.__send__ :define_singleton_method, :rules do
41
+ local_rules
42
+ end
43
+
44
+ Roap::extensions.push base
45
+ end
46
+ def included base
47
+ targets = []
48
+
49
+ base.singleton_methods(false).each do |method_name|
50
+ method = get_pure base, method_name
51
+ method ||= base.singleton_method(method_name)
52
+
53
+ targets.push({
54
+ :type => :singleton_method,
55
+ :name => method_name,
56
+ :pure => method })
57
+ end
58
+ base.instance_methods(false).each do |method_name|
59
+ method = get_pure base, method_name
60
+ method ||= base.instance_method(method_name)
61
+
62
+ targets.push({
63
+ :type => :instance_method,
64
+ :name => method_name,
65
+ :pure => method })
66
+ end
67
+
68
+ targets.each do |target|
69
+ pure = target[:pure]
70
+ method_name = target[:name]
71
+ type = target[:type]
72
+ attr = target[:pure].comment
73
+ attrs = []
74
+
75
+ body = Roap::Utils::decomment pure.comment
76
+ mds = body.scan /(@([^\n]+)\n((\s\s+[^\n]*\n?)*))/m
77
+ mds.each do |match, key, value|
78
+ attrs.push({:key=>key, :value=>value})
79
+ end
80
+
81
+ rules.each do |rule|
82
+ mds = Roap::Utils::scanex attr, rule[:expr]
83
+
84
+ mds.each do |md|
85
+ on_rules = Roap.class_variable_get :@@rules
86
+
87
+ on_rules.each do |on_rule|
88
+ on_md = rule[:attrs].match on_rule[:expr]
89
+ if on_md != nil
90
+ # refresh method
91
+ method = base.__send__ type, method_name
92
+ @@original_methods["#{base}::#{method.name}"] ||= method
93
+
94
+ method.define_singleton_method :pure do
95
+ @@original_methods["#{base}::#{method.name}"]
96
+ end
97
+ method.define_singleton_method :attrs do
98
+ attrs
99
+ end
100
+
101
+ on_rule[:block].call base, method, md, rule
102
+ end
103
+ end
104
+
105
+ break if rule[:attrs].match /^#\s*once/
106
+ end
107
+ end
108
+ end
109
+
110
+ end
111
+ end
112
+ end
data/lib/roap/utils.rb ADDED
@@ -0,0 +1,14 @@
1
+ module Roap
2
+ module Utils
3
+ def self.decomment src
4
+ src.gsub! /^#*/, ""
5
+ end
6
+
7
+ def self.scanex str, regexp
8
+ names = regexp.names.map! {|x| x.to_sym}
9
+ str.scan(regexp).collect do |match|
10
+ Hash[names.zip(match)]
11
+ end
12
+ end
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: roap
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - pjc0247
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-27 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: aop for ruby
14
+ email:
15
+ - pjc0247@naver.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/roap.rb
21
+ - lib/roap/all_extensions.rb
22
+ - lib/roap/attrs/runtime.rb
23
+ - lib/roap/attrs/static.rb
24
+ - lib/roap/exts/digest_extension.rb
25
+ - lib/roap/exts/log_extension.rb
26
+ - lib/roap/loader.rb
27
+ - lib/roap/roap.rb
28
+ - lib/roap/utils.rb
29
+ homepage: http://github.com/pjc0247/roap
30
+ licenses: []
31
+ metadata: {}
32
+ post_install_message:
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project: roap
48
+ rubygems_version: 2.4.5
49
+ signing_key:
50
+ specification_version: 4
51
+ summary: aop for ruby
52
+ test_files: []