okuribito 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 554a0e1bcd2a985c3f08ec493efad06bf0b58b95
4
- data.tar.gz: 3a419fbe576efd5143466f5b1aecf084378c2a68
3
+ metadata.gz: 3763c8c0fbdd9746f7e5d50595cb3c07d27e2eb5
4
+ data.tar.gz: b16c90b7bc3cee2fa02bf79983fa7b960a0c0f4c
5
5
  SHA512:
6
- metadata.gz: 46165e2cceca9ad323f05fb647fe40c4c717362462ce4dbd1832cd4f7da8cc529a284f193c5ac35908bd32b76a7e566b1682dca2542f78a7e55b1584572d7f2d
7
- data.tar.gz: f62c2bf61de45c6cc502d24d06b1fe8fbad45628200889c9f43a6ea55f5bb449ab275933dc9073cc64b8d1cf48462bbd35219eea8a076ba66cb9eaa30d61ed8e
6
+ metadata.gz: ad61526fedb01ab3b98455ff22bfa06d22c3b2ed7e09496f17df83683915c6b9ee2794a99ee4b26d63702038dd876aabf2d1ebfbe9f027b2aee589846dc6be43
7
+ data.tar.gz: ae050960f27604a7e1a91cda18a808f99db126030e734e39b1738c471fa8c63ca0123a83fc655ec14aedc7461da3a8d1f614c4e6e474377d19c3ee54a890e5be
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/README.md CHANGED
@@ -37,43 +37,95 @@ Edit `application.rb`
37
37
  ```ruby
38
38
  class OkuribitoSetting < Rails::Railtie
39
39
  config.after_initialize do
40
- okuribito = Okuribito::OkuribitoPatch.new(
41
- {
42
- console: "back_trace",
43
- slack: "https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx",
44
- logging: "log/okuribito/method_called.log",
45
- first_prepended: "log/okuribito/first_prepended.log"
46
- }
47
- )
40
+ okuribito = Okuribito::OkuribitoPatch.new do |method_name, obj_name, caller_info|
41
+ # TODO: do something as you like!
42
+ end
48
43
  okuribito.apply("okuribito.yml")
49
44
  end
50
45
  end
51
46
  ```
52
47
 
53
- ### console
54
- Setting for console outout.
55
- - `plain` is the simplest 1 line log.
56
- - `back_trace` shows back trace in detail.
48
+ ## The smallest example
57
49
 
58
- ### slack
59
- Setting for slack notification.
50
+ ```ruby
51
+ require "bundler/setup"
52
+ require "okuribito"
53
+
54
+ class TestTarget
55
+ def self.deprecated_self_method
56
+ end
57
+
58
+ def deprecated_method
59
+ end
60
+ end
61
+
62
+ okuribito = Okuribito::OkuribitoPatch.new do |method_name, obj_name, caller_info|
63
+ puts "#{obj_name} #{method_name} #{caller_info[0]}"
64
+ end
65
+ okuribito.apply("okuribito.yml")
66
+
67
+ TestTarget.deprecated_self_method
68
+ TestTarget.new.deprecated_method
69
+ ```
70
+
71
+ Setting file:
60
72
 
61
- ### logging
62
- Setting for logging.
73
+ ```okuribito.yml
74
+ TestTarget:
75
+ - ".deprecated_self_method"
76
+ - "#deprecated_method"
63
77
 
64
- ### first_prepended
65
- Setting for logging to save when you started to monitor.
78
+ ```
79
+
80
+ Output:
66
81
 
67
- ## Development
82
+ ```output
83
+ TestTarget deprecated_self_method example.rb:17:in `<main>'
84
+ #<TestTarget:0x007fd1e11ce368> deprecated_method example.rb:18:in `<main>'
85
+ ```
68
86
 
69
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
87
+ ## Callback examples
70
88
 
71
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
89
+ ### Full stacktrace
72
90
 
73
- ## Contributing
91
+ ```ruby
92
+ okuribito = Okuribito::OkuribitoPatch.new do |method_name, obj_name, caller_info|
93
+ puts "#############################################################"
94
+ puts "#{obj_name} #{method_name} #{caller_info[0]}"
95
+ puts "#############################################################"
96
+ puts caller_info
97
+ end
98
+ ```
74
99
 
75
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/okuribito. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
100
+ ### Send to slack
101
+
102
+ ```ruby
103
+ okuribito = Okuribito::OkuribitoPatch.new do |method_name, obj_name, caller_info|
104
+ uri = URI.parse("https://hooks.slack.com/services/xxx...")
105
+ params = {
106
+ text: "OKURIBITO detected a method call.",
107
+ username: "OKURIBITO",
108
+ icon_emoji: ":innocent:",
109
+ attachments: [{
110
+ fields: [{
111
+ title: "#{obj_name}::#{method_name}",
112
+ value: "#{caller_info[0]}",
113
+ short: false
114
+ }]
115
+ }]
116
+ }
117
+ http = Net::HTTP.new(uri.host, uri.port)
118
+ http.use_ssl = true
119
+ http.start do
120
+ request = Net::HTTP::Post.new(uri.path)
121
+ request.set_form_data(payload: params.to_json)
122
+ http.request(request)
123
+ end
124
+ end
125
+ ```
76
126
 
127
+ ### Other ideas
128
+ - Send to Fluentd, TreasureData
77
129
 
78
130
  ## License
79
131
 
data/circle.yml ADDED
@@ -0,0 +1,4 @@
1
+ machine:
2
+ timezone: Asia/Tokyo
3
+ ruby:
4
+ version: 2.0.0
data/lib/okuribito.rb CHANGED
@@ -2,66 +2,18 @@ require "okuribito/version"
2
2
  require "yaml"
3
3
  require "active_support"
4
4
  require "active_support/core_ext"
5
- require "net/http"
6
- require "uri"
7
- require "json"
8
- require "logger"
9
5
 
10
6
  module Okuribito
11
7
  class OkuribitoPatch
12
- CLASS_METHOD_SYMBOL = "."
13
- INSTANCE_METHOD_SYMBOL = "#"
8
+ CLASS_METHOD_SYMBOL = ".".freeze
9
+ INSTANCE_METHOD_SYMBOL = "#".freeze
14
10
  PATTERN = /\A(?<symbol>[#{CLASS_METHOD_SYMBOL}#{INSTANCE_METHOD_SYMBOL}])(?<method_name>.+)\z/
15
11
 
16
- def initialize(options = {})
17
- @options = options
12
+ def initialize(&callback)
13
+ @callback = callback
18
14
  end
19
15
 
20
16
  module PatchModule
21
- def disp_console_by_okuribito(method_name, obj_name, caller_info, type)
22
- case type
23
- when "plane"
24
- puts "#{obj_name} : #{method_name} is called."
25
- when "back_trace"
26
- puts "#############################################################"
27
- puts "# #{obj_name} : #{method_name} is called."
28
- puts "#############################################################"
29
- puts caller_info
30
- end
31
- end
32
-
33
- def notificate_slack_by_okuribito(method_name, obj_name, caller_info, url)
34
- uri = URI.parse(url)
35
- params = {
36
- text: "OKURIBITO detected a method call.",
37
- username: "OKURIBITO",
38
- icon_emoji: ":innocent:",
39
- attachments: [{
40
- fields: [{
41
- title: "#{obj_name}::#{method_name}",
42
- value: "#{caller_info[0]}",
43
- short: false
44
- }]
45
- }]
46
- }
47
- http = Net::HTTP.new(uri.host, uri.port)
48
- http.use_ssl = true
49
- http.start do
50
- request = Net::HTTP::Post.new(uri.path)
51
- request.set_form_data(payload: params.to_json)
52
- http.request(request)
53
- end
54
- end
55
-
56
- def logging_by_okuribito(symbol, method_name, obj_name, caller_info, log_path)
57
- logger = Logger.new(log_path)
58
- logger.formatter = proc{|severity, datetime, progname, message|
59
- "#{datetime}, #{message}\n"
60
- }
61
-
62
- logger.info("#{obj_name}#{symbol}#{method_name} : #{caller_info[0]}")
63
- end
64
-
65
17
  def define_okuribito_patch(method_name)
66
18
  define_method(method_name) do |*args|
67
19
  yield(self.to_s, caller) if block_given?
@@ -74,12 +26,11 @@ module Okuribito
74
26
  yaml = YAML.load_file(yaml_path)
75
27
  yaml.each do |class_name, observe_methods|
76
28
  patch_okuribito(class_name, observe_methods)
77
- logging_prepended(class_name, observe_methods, @options[:first_prepended]) unless @options[:first_prepended].nil?
78
29
  end
79
30
  end
80
31
 
81
32
  def patch_okuribito(class_name, observe_methods)
82
- options = @options # スコープを乗り越えるために使用.
33
+ callback = @callback # スコープを乗り越えるために使用.
83
34
  klass = class_name.constantize
84
35
 
85
36
  klass.class_eval do
@@ -97,9 +48,7 @@ module Okuribito
97
48
  next unless klass.instance_methods.include?(method_name)
98
49
  instance_method_patch.module_eval do
99
50
  define_okuribito_patch(method_name) do |obj_name, caller_info|
100
- disp_console_by_okuribito(method_name, obj_name, caller_info, options[:console]) unless options[:console].nil?
101
- notificate_slack_by_okuribito(method_name, obj_name, caller_info, options[:slack]) unless options[:slack].nil?
102
- logging_by_okuribito(symbol, method_name, obj_name, caller_info, options[:logging]) unless options[:logging].nil?
51
+ callback.call(method_name, obj_name, caller_info)
103
52
  end
104
53
  end
105
54
  instance_method_patched += 1
@@ -107,9 +56,7 @@ module Okuribito
107
56
  next unless klass.respond_to?(method_name)
108
57
  class_method_patch.module_eval do
109
58
  define_okuribito_patch(method_name) do |obj_name, caller_info|
110
- disp_console_by_okuribito(method_name, obj_name, caller_info, options[:console]) unless options[:console].nil?
111
- notificate_slack_by_okuribito(method_name, obj_name, caller_info, options[:slack]) unless options[:slack].nil?
112
- logging_by_okuribito(symbol, method_name, obj_name, caller_info, options[:logging]) unless options[:logging].nil?
59
+ callback.call(method_name, obj_name, caller_info)
113
60
  end
114
61
  end
115
62
  class_method_patched += 1
@@ -119,26 +66,5 @@ module Okuribito
119
66
  singleton_class.send(:prepend, class_method_patch) if class_method_patched > 0
120
67
  end
121
68
  end
122
-
123
- def logging_prepended(class_name, observe_methods, log_path)
124
- # ファイル読み出して、クラス名+メソッド名だけを配列に保持する.
125
- methods = []
126
- if File.exist?(log_path)
127
- File.open(log_path) { |f| methods = f.read.split("\n") }
128
- methods.slice!(0)
129
- methods.map! { |m| m.split(",")[1] }
130
- end
131
-
132
- logger = Logger.new(log_path)
133
- logger.formatter = proc{|severity, datetime, progname, message|
134
- "#{datetime},#{message}\n"
135
- }
136
-
137
- observe_methods.each do |observe_method|
138
- method_full_name = "#{class_name}#{observe_method}"
139
- logger.info(method_full_name) unless methods.include?(method_full_name)
140
- end
141
-
142
- end
143
69
  end
144
- end
70
+ end
@@ -1,3 +1,3 @@
1
1
  module Okuribito
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.1"
3
3
  end
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.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - muramurasan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-21 00:00:00.000000000 Z
11
+ date: 2016-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -90,11 +90,11 @@ files:
90
90
  - .gitignore
91
91
  - .rspec
92
92
  - CODE_OF_CONDUCT.md
93
+ - Gemfile
93
94
  - LICENSE.txt
94
95
  - README.md
95
96
  - Rakefile
96
- - bin/console
97
- - bin/setup
97
+ - circle.yml
98
98
  - lib/okuribito.rb
99
99
  - lib/okuribito/version.rb
100
100
  - okuribito.gemspec
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "okuribito"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here