bystander 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/.ruby-version +1 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +18 -0
- data/README.md +84 -0
- data/Rakefile +8 -0
- data/bystander.gemspec +20 -0
- data/lib/bystander.rb +20 -0
- data/lib/bystander/class_methods.rb +53 -0
- data/lib/bystander/notifier.rb +13 -0
- data/lib/bystander/transports/dev_null.rb +14 -0
- data/lib/bystander/transports/slack.rb +32 -0
- data/lib/bystander/util/testing.rb +7 -0
- data/lib/bystander/version.rb +3 -0
- data/screenshot.png +0 -0
- data/test/bystander_test.rb +40 -0
- data/test/test_helper.rb +7 -0
- data/test/transports/slack_test.rb +13 -0
- metadata +121 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ab91cc6152250993e6eddd5e7aa68d7ebf0928d8
|
4
|
+
data.tar.gz: 10d52f786b8856f329a4c03119095127096ab673
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 796472da0f45288fa328c7ad406cdb815613e0f54a61d92ddfebf9a8b387d976740c323284f48186f2ec098f63a81e4425a0952ac152c3e218bc2b95489f036d
|
7
|
+
data.tar.gz: 83453d0e50711c9ded9b60048253949c390b66b4f8da979a11716e905352dca0668d0b063b7a550fdf339d2eda0f4f9368a8ffd15cca603870967cc67d330dad
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.2
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
metaclass (0.0.4)
|
5
|
+
minitest (5.3.2)
|
6
|
+
mocha (1.1.0)
|
7
|
+
metaclass (~> 0.0.1)
|
8
|
+
rake (10.3.2)
|
9
|
+
slack-notifier (0.6.0)
|
10
|
+
|
11
|
+
PLATFORMS
|
12
|
+
ruby
|
13
|
+
|
14
|
+
DEPENDENCIES
|
15
|
+
minitest
|
16
|
+
mocha
|
17
|
+
rake
|
18
|
+
slack-notifier
|
data/README.md
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
# Bystander
|
2
|
+
|
3
|
+
A Ruby Gem that makes it easy to log your application's Critical Paths™ without
|
4
|
+
having to touch the behaviour of your code.
|
5
|
+
|
6
|
+

|
7
|
+
|
8
|
+
## Getting started
|
9
|
+
|
10
|
+
### How does it work?
|
11
|
+
|
12
|
+
With some basic configuration, Bystander hooks in to your Ruby classes
|
13
|
+
and creates a log entry every time one of the methods you specify is
|
14
|
+
called, and when the method returns.
|
15
|
+
|
16
|
+
### Where does it log to?
|
17
|
+
|
18
|
+
Anywhere! Well, if you want it to. Currently it defaults to logging to a
|
19
|
+
[Slack](https://slack.com) channel, but is designed to work with any
|
20
|
+
transport method (warning: you're gonna have to write some code).
|
21
|
+
|
22
|
+
### Usage
|
23
|
+
|
24
|
+
#### Automatic Logging
|
25
|
+
|
26
|
+
At the top of the class containing the methods you want to log, include
|
27
|
+
the `Bystander` module and tell it what methods you're interested in.
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
class MaintenanceHandler
|
31
|
+
include Bystander
|
32
|
+
notify [:under_maintenance]
|
33
|
+
|
34
|
+
def under_maintenance
|
35
|
+
#...
|
36
|
+
end
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
Whenever this method is called, Bystander will log the call and the
|
41
|
+
return:
|
42
|
+
|
43
|
+
```
|
44
|
+
Calling: MaintenanceHandler::under_maintenance([])
|
45
|
+
Finished: MaintenanceHandler::under_maintenance([])
|
46
|
+
```
|
47
|
+
|
48
|
+
#### Manual Logging
|
49
|
+
|
50
|
+
Bystander has a basic capability to log custom messages, inline in your
|
51
|
+
code, like a normal logger.
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
Bystander.log("I've made a huge mistake")
|
55
|
+
```
|
56
|
+
|
57
|
+
### Configuration
|
58
|
+
|
59
|
+
#### Slack
|
60
|
+
|
61
|
+
Before you use Bystander, ensure you run the following configuration
|
62
|
+
block (e.g., in a Rails initializer):
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
Bystander::Transports::Slack.configure do |slack|
|
66
|
+
slack.domain 'wcmc'
|
67
|
+
slack.username 'Bystander'
|
68
|
+
slack.auth_token ENV['SLACK_AUTH_TOKEN']
|
69
|
+
slack.channel '#bystander'
|
70
|
+
|
71
|
+
# Prepend all messages with this string. Useful for env info, etc.
|
72
|
+
slack.prepend "#{ENV['RAILS_ENV']} - (##{Process.pid}):"
|
73
|
+
end
|
74
|
+
```
|
75
|
+
|
76
|
+
## Using Bystander in Tests
|
77
|
+
|
78
|
+
Most of the time you won't want Bystander running during tests. To
|
79
|
+
disable Bystander, preface your test code (for example, in your
|
80
|
+
`test_helper.rb`) with:
|
81
|
+
|
82
|
+
```
|
83
|
+
Bystander.enable_testing!
|
84
|
+
```
|
data/Rakefile
ADDED
data/bystander.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path('../lib/bystander/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.authors = ["Adam Mulligan", "Andrea Rossi"]
|
5
|
+
gem.email = ["adam.mulligan@unep-wcmc.org", "andrea.rossi@unep-wcmc.org"]
|
6
|
+
gem.description = gem.summary = "Log your application flow without any ugly loggers"
|
7
|
+
|
8
|
+
gem.files = `git ls-files`.split("\n")
|
9
|
+
gem.test_files = `git ls-files -- test/*`.split("\n")
|
10
|
+
gem.name = "bystander"
|
11
|
+
gem.require_paths = ["lib"]
|
12
|
+
gem.version = Bystander::VERSION
|
13
|
+
|
14
|
+
gem.add_development_dependency 'rake'
|
15
|
+
gem.add_development_dependency 'minitest'
|
16
|
+
gem.add_development_dependency 'mocha'
|
17
|
+
|
18
|
+
gem.add_dependency 'slack-notifier', '~> 0.6.0'
|
19
|
+
end
|
20
|
+
|
data/lib/bystander.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bystander/transports/slack'
|
2
|
+
require 'bystander/class_methods'
|
3
|
+
|
4
|
+
module Bystander
|
5
|
+
def self.included base
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.log message
|
10
|
+
transport.notify message
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.transport
|
14
|
+
@transport ||= Bystander::Transports::Slack
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.transport= transport
|
18
|
+
@transport = transport
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'bystander/notifier'
|
2
|
+
require 'bystander/util/testing'
|
3
|
+
|
4
|
+
module Bystander
|
5
|
+
module ClassMethods
|
6
|
+
@@methods_to_notify = []
|
7
|
+
@@redefined_methods = []
|
8
|
+
|
9
|
+
def notify methods
|
10
|
+
@@methods_to_notify = methods
|
11
|
+
end
|
12
|
+
|
13
|
+
def method_added method
|
14
|
+
if notify?(method) && !redefined?(method)
|
15
|
+
@@redefined_methods << method
|
16
|
+
wrap_instance_method instance_method(method)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def singleton_method_added method
|
21
|
+
if notify?(method) && !redefined?(method)
|
22
|
+
@@redefined_methods << method
|
23
|
+
wrap_class_method method(method)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def notify? method
|
30
|
+
@@methods_to_notify.include? method
|
31
|
+
end
|
32
|
+
|
33
|
+
def redefined? method
|
34
|
+
@@redefined_methods.include? method
|
35
|
+
end
|
36
|
+
|
37
|
+
def wrap_instance_method method
|
38
|
+
define_method(method.name) do |*args, &block|
|
39
|
+
Bystander::Notifier.wrap("#{self.class.to_s}##{method.name}(#{args.join(', ')})") do
|
40
|
+
method.bind(self).call(*args, &block)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def wrap_class_method method
|
46
|
+
define_singleton_method(method.name) do |*args, &block|
|
47
|
+
Bystander::Notifier.wrap("#{self.to_s}::#{method.name}(#{args.join(', ')})") do
|
48
|
+
method.call(*args, &block)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'slack-notifier'
|
2
|
+
|
3
|
+
module Bystander
|
4
|
+
module Transports
|
5
|
+
module Slack
|
6
|
+
SETTINGS = [:domain, :username, :auth_token, :channel, :prepend]
|
7
|
+
|
8
|
+
SETTINGS.each do |setting|
|
9
|
+
define_singleton_method(setting) do |*args|
|
10
|
+
return instance_variable_get(:"@#{setting}") if args.length == 0
|
11
|
+
instance_variable_set(:"@#{setting}", args[0])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.slack
|
16
|
+
@slack ||= ::Slack::Notifier.new(domain, auth_token).tap { |slack|
|
17
|
+
slack.channel = channel
|
18
|
+
slack.username = username
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.notify message
|
23
|
+
slack.ping "_#{prepend}_ `#{message}`"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.configure
|
27
|
+
yield self
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/screenshot.png
ADDED
Binary file
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestObject < Object; end;
|
4
|
+
|
5
|
+
class BystanderTest < MiniTest::Test
|
6
|
+
def test_notify_notifies_before_and_after_method
|
7
|
+
TestObject.class_eval do
|
8
|
+
include Bystander
|
9
|
+
notify [:manbonify]
|
10
|
+
define_method(:manbonify) {|an_arg| "fake return value" }
|
11
|
+
end
|
12
|
+
|
13
|
+
object = TestObject.new
|
14
|
+
|
15
|
+
Bystander.transport.expects(:notify).with("Calling: TestObject#manbonify(yo)")
|
16
|
+
Bystander.transport.expects(:notify).with("Finished: TestObject#manbonify(yo)")
|
17
|
+
|
18
|
+
return_value = object.manbonify "yo"
|
19
|
+
assert_equal "fake return value", return_value
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_notify_notifies_before_and_after_class_method
|
23
|
+
TestObject.class_eval do
|
24
|
+
include Bystander
|
25
|
+
notify [:classest_of_methods]
|
26
|
+
define_singleton_method(:classest_of_methods){}
|
27
|
+
end
|
28
|
+
|
29
|
+
Bystander.transport.expects(:notify).with("Calling: TestObject::classest_of_methods()")
|
30
|
+
Bystander.transport.expects(:notify).with("Finished: TestObject::classest_of_methods()")
|
31
|
+
TestObject.classest_of_methods
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_log_notifies_the_transport_with_given_message
|
35
|
+
message = 'I just logged something'
|
36
|
+
Bystander.transport.expects(:notify).with(message)
|
37
|
+
|
38
|
+
Bystander.log message
|
39
|
+
end
|
40
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TransportsSlackTest < Minitest::Test
|
4
|
+
def test_notify_pings_slack
|
5
|
+
message = 'a message'
|
6
|
+
|
7
|
+
slack_mock = mock()
|
8
|
+
slack_mock.expects(:ping).with("__ `#{message}`")
|
9
|
+
Bystander::Transports::Slack.stubs(:slack).returns(slack_mock)
|
10
|
+
|
11
|
+
Bystander::Transports::Slack.notify message
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bystander
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Mulligan
|
8
|
+
- Andrea Rossi
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-10-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: minitest
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: mocha
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: slack-notifier
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.6.0
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.6.0
|
70
|
+
description: Log your application flow without any ugly loggers
|
71
|
+
email:
|
72
|
+
- adam.mulligan@unep-wcmc.org
|
73
|
+
- andrea.rossi@unep-wcmc.org
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- ".ruby-version"
|
79
|
+
- Gemfile
|
80
|
+
- Gemfile.lock
|
81
|
+
- README.md
|
82
|
+
- Rakefile
|
83
|
+
- bystander.gemspec
|
84
|
+
- lib/bystander.rb
|
85
|
+
- lib/bystander/class_methods.rb
|
86
|
+
- lib/bystander/notifier.rb
|
87
|
+
- lib/bystander/transports/dev_null.rb
|
88
|
+
- lib/bystander/transports/slack.rb
|
89
|
+
- lib/bystander/util/testing.rb
|
90
|
+
- lib/bystander/version.rb
|
91
|
+
- screenshot.png
|
92
|
+
- test/bystander_test.rb
|
93
|
+
- test/test_helper.rb
|
94
|
+
- test/transports/slack_test.rb
|
95
|
+
homepage:
|
96
|
+
licenses: []
|
97
|
+
metadata: {}
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project:
|
114
|
+
rubygems_version: 2.2.2
|
115
|
+
signing_key:
|
116
|
+
specification_version: 4
|
117
|
+
summary: Log your application flow without any ugly loggers
|
118
|
+
test_files:
|
119
|
+
- test/bystander_test.rb
|
120
|
+
- test/test_helper.rb
|
121
|
+
- test/transports/slack_test.rb
|