roap 1.0.0
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/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: []
|