roap 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/roap.rb +11 -0
- data/lib/roap/all_extensions.rb +9 -0
- data/lib/roap/attrs/runtime.rb +43 -0
- data/lib/roap/attrs/static.rb +18 -0
- data/lib/roap/exts/digest_extension.rb +39 -0
- data/lib/roap/exts/log_extension.rb +23 -0
- data/lib/roap/loader.rb +7 -0
- data/lib/roap/roap.rb +112 -0
- data/lib/roap/utils.rb +14 -0
- metadata +52 -0
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,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
|
data/lib/roap/loader.rb
ADDED
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
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: []
|