okuribito 0.1.7 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc9af19e7f0b78f7d0f21ac0df0a4a26a1c889a9
4
- data.tar.gz: dd829fe91a165a2c5cce1f4fb739159432bcc554
3
+ metadata.gz: 34c97f4c90330748a01b3f2206bd7899019c2e0d
4
+ data.tar.gz: e646d0977a8cb50ef2a194c4c3871499a8c8fa58
5
5
  SHA512:
6
- metadata.gz: 418b2c05bc94edd1c476fc9af80a88c10ef5b50ea4977acc67dd6f3a81534c9c6e0420745a3a44519401d7ed16fbee896922c78a0312d1626ad4002e72584c44
7
- data.tar.gz: 73583471d425c019db1d7c6f95b4b5d838247411ac281cbd810f76bc05de266fbd9468b03fc1459155edda04fc437bf0e167be4af8304d07b3206a833ee29b47
6
+ metadata.gz: 6ca60fd68975a617f691d4acf68d8a3c0c4d14afd55cd22cb00350d26bf5947e1225b5b4d685ead583e23e081fe17d8ee1b145edf3a711052a0d3e125917c270
7
+ data.tar.gz: 69a9c559aac2a8df9fbe3c67ed37ce7a49cbc1cb44d0cecd7eb65f6837d18a3a023ef9aacd889853d46c002fafb3510c955bdafdb8d103cafb25f7145dc932cb
data/.rubocop.yml CHANGED
@@ -23,7 +23,7 @@ Metrics/PerceivedComplexity:
23
23
  Max: 10
24
24
 
25
25
  Metrics/MethodLength:
26
- Max: 35
26
+ Max: 40
27
27
 
28
28
  Metrics/AbcSize:
29
- Max: 32
29
+ Max: 40
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # CHANGELOG
2
+ ## [0.2.0](https://github.com/muramurasan/okuribito_rails/releases/tag/v0.2.0) (January 8, 2017)
3
+ * Correspond to namespace
4
+ ## [0.1.7](https://github.com/muramurasan/okuribito_rails/releases/tag/v0.1.7) (December 7, 2016)
5
+ * The first stable release
data/README.md CHANGED
@@ -10,7 +10,9 @@ https://rubygems.org/gems/okuribito
10
10
 
11
11
  Okuribito is a gem to judge whether methods should be sent to the heaven :innocent:.
12
12
 
13
- In other words, it can be used in order to extract the obsolete method.
13
+ Okuribito monitors the method call with YAML, and exec specified code.
14
+
15
+ In other words, it can be used in order to extract the uncalled method.
14
16
 
15
17
  Okuribito was named after a japanese movie.
16
18
 
@@ -39,6 +41,8 @@ User:
39
41
  - '#feed'
40
42
  Micropost:
41
43
  - '.from_users_followed_by'
44
+ Admin::Manage:
45
+ - '.add_user'
42
46
  ```
43
47
 
44
48
  By writing the following code to start the monitoring of the method.
@@ -135,4 +139,4 @@ okuribito.apply("config/okuribito.yml")
135
139
  ## License
136
140
 
137
141
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
138
-
142
+ Copyright 2016 Yasuhiro Matsumura.
data/lib/okuribito.rb CHANGED
@@ -9,12 +9,9 @@ module Okuribito
9
9
  INSTANCE_METHOD_SYMBOL = "#".freeze
10
10
  PATTERN = /\A(?<symbol>[#{CLASS_METHOD_SYMBOL}#{INSTANCE_METHOD_SYMBOL}])(?<method_name>.+)\z/
11
11
 
12
- def initialize(opt = {}, &callback)
13
- @callback = callback
14
- @opt ||= opt
15
- end
16
-
17
12
  module SimplePatchModule
13
+ private
14
+
18
15
  def define_patch(method_name, _patch, _id, _opt = {})
19
16
  define_method(method_name) do |*args|
20
17
  yield(to_s, caller) if block_given?
@@ -24,18 +21,26 @@ module Okuribito
24
21
  end
25
22
 
26
23
  module FunctionalPatchModule
24
+ private
25
+
27
26
  def define_patch(method_name, patch, id, opt = {})
28
- patch.instance_variable_set("@#{method_name}_#{id}_called", false)
27
+ sn = method_name.to_s.gsub(/\?/, "__q").gsub(/!/, "__e")
28
+ patch.instance_variable_set("@#{sn}_#{id}_called", false)
29
29
  define_method(method_name) do |*args|
30
- if block_given? && !patch.instance_variable_get("@#{method_name}_#{id}_called")
30
+ if block_given? && !patch.instance_variable_get("@#{sn}_#{id}_called")
31
31
  yield(to_s, caller)
32
- patch.instance_variable_set("@#{method_name}_#{id}_called", true) if opt[:once_detect]
32
+ patch.instance_variable_set("@#{sn}_#{id}_called", true) if opt[:once_detect]
33
33
  end
34
34
  super(*args)
35
35
  end
36
36
  end
37
37
  end
38
38
 
39
+ def initialize(opt = {}, &callback)
40
+ @callback = callback
41
+ @opt ||= opt
42
+ end
43
+
39
44
  def apply(yaml_path)
40
45
  yaml = YAML.load_file(yaml_path)
41
46
  yaml.each do |class_name, observe_methods|
@@ -43,26 +48,20 @@ module Okuribito
43
48
  end
44
49
  end
45
50
 
46
- def self.module(opt, patch_name)
47
- if opt.present?
48
- if FunctionalPatchModule.const_defined?(patch_name)
49
- Module.new.extend(FunctionalPatchModule)
50
- else
51
- FunctionalPatchModule.const_set(patch_name, Module.new.extend(FunctionalPatchModule))
52
- end
53
- else
54
- Module.new.extend(SimplePatchModule)
55
- end
56
- end
51
+ private
57
52
 
58
- def patch_okuribito(class_name, observe_methods)
59
- return unless Object.const_defined?(class_name) && Object.const_get(class_name).is_a?(Class)
53
+ def patch_okuribito(full_class_name, observe_methods)
54
+ constants = full_class_name.split("::")
55
+ class_name = constants[-1]
56
+ return unless (namespace = constants_to_namespace(constants))
57
+ return unless defined_class?(namespace, class_name)
58
+ snamespace = namespace.to_s.gsub(/::/, "")
60
59
 
61
60
  callback = @callback
62
61
  opt ||= @opt
63
- klass = class_name.constantize
64
- i_method_patch = Okuribito::OkuribitoPatch.module(opt, "#{class_name}InstancePatch")
65
- c_method_patch = Okuribito::OkuribitoPatch.module(opt, "#{class_name}ClassPatch")
62
+ klass = full_class_name.constantize
63
+ i_method_patch = patch_module(opt, "Ns#{snamespace}Class#{class_name}InstancePatch")
64
+ c_method_patch = patch_module(opt, "Ns#{snamespace}Class#{class_name}ClassPatch")
66
65
  i_method_patched = 0
67
66
  c_method_patched = 0
68
67
 
@@ -77,7 +76,7 @@ module Okuribito
77
76
  next unless klass.instance_methods.include?(method_name)
78
77
  i_method_patch.module_eval do
79
78
  define_patch(method_name, i_method_patch, "i", opt) do |obj_name, caller_info|
80
- callback.call(method_name, obj_name, caller_info, class_name, symbol)
79
+ callback.call(method_name, obj_name, caller_info, full_class_name, symbol)
81
80
  end
82
81
  end
83
82
  i_method_patched += 1
@@ -85,7 +84,7 @@ module Okuribito
85
84
  next unless klass.respond_to?(method_name)
86
85
  c_method_patch.module_eval do
87
86
  define_patch(method_name, c_method_patch, "c", opt) do |obj_name, caller_info|
88
- callback.call(method_name, obj_name, caller_info, class_name, symbol)
87
+ callback.call(method_name, obj_name, caller_info, full_class_name, symbol)
89
88
  end
90
89
  end
91
90
  c_method_patched += 1
@@ -95,5 +94,39 @@ module Okuribito
95
94
  singleton_class.send(:prepend, c_method_patch) if c_method_patched > 0
96
95
  end
97
96
  end
97
+
98
+ def patch_module(opt, patch_name)
99
+ if opt.present?
100
+ if FunctionalPatchModule.const_defined?(patch_name)
101
+ Module.new.extend(FunctionalPatchModule)
102
+ else
103
+ FunctionalPatchModule.const_set(patch_name, Module.new.extend(FunctionalPatchModule))
104
+ end
105
+ else
106
+ Module.new.extend(SimplePatchModule)
107
+ end
108
+ end
109
+
110
+ def defined_namespace?(constants)
111
+ namespace = Object
112
+ constants.each do |constant|
113
+ return false unless namespace.const_defined?(constant)
114
+ namespace = "#{namespace}::#{constant}".constantize
115
+ end
116
+ true
117
+ end
118
+
119
+ def defined_class?(namespace, class_name)
120
+ namespace.const_defined?(class_name) && namespace.const_get(class_name).is_a?(Class)
121
+ end
122
+
123
+ def constants_to_namespace(constants)
124
+ if constants.size == 1
125
+ Object
126
+ else
127
+ return false unless defined_namespace?(constants[0..-2])
128
+ constants[0..-2].join("::").constantize
129
+ end
130
+ end
98
131
  end
99
132
  end
@@ -1,3 +1,3 @@
1
1
  module Okuribito
2
- VERSION = "0.1.7".freeze
2
+ VERSION = "0.2.0".freeze
3
3
  end
data/okuribito.gemspec CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["muramurasan"]
10
10
  spec.email = ["ym.works1985@gmail.com"]
11
11
 
12
- spec.summary = "Monitoring system of the method call"
13
- spec.description = "Okuribito monitors the method call by the yaml."
12
+ spec.summary = "Okuribito monitors the method call, and exec specified code."
13
+ spec.description = "Okuribito monitors the method call, and exec specified code."
14
14
  spec.homepage = "https://github.com/muramurasan/okuribito"
15
15
  spec.license = "MIT"
16
16
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: okuribito
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - muramurasan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-07 00:00:00.000000000 Z
11
+ date: 2017-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -80,7 +80,7 @@ dependencies:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: 1.0.0
83
- description: Okuribito monitors the method call by the yaml.
83
+ description: Okuribito monitors the method call, and exec specified code.
84
84
  email:
85
85
  - ym.works1985@gmail.com
86
86
  executables: []
@@ -90,6 +90,7 @@ files:
90
90
  - .gitignore
91
91
  - .rspec
92
92
  - .rubocop.yml
93
+ - CHANGELOG.md
93
94
  - Gemfile
94
95
  - LICENSE.txt
95
96
  - README.md
@@ -119,8 +120,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  version: '0'
120
121
  requirements: []
121
122
  rubyforge_project:
122
- rubygems_version: 2.0.14.1
123
+ rubygems_version: 2.6.8
123
124
  signing_key:
124
125
  specification_version: 4
125
- summary: Monitoring system of the method call
126
+ summary: Okuribito monitors the method call, and exec specified code.
126
127
  test_files: []