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 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: []