stenotype 0.1.0 → 0.1.1
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 +4 -4
- data/.rubocop.yml +3 -2
- data/CHANGELOG.md +26 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +111 -60
- data/README.md +5 -5
- data/Rakefile +2 -2
- data/TODO.md +18 -0
- data/bin/console +3 -3
- data/lib/generators/USAGE +8 -0
- data/lib/generators/stenotype/initializer/initializer_generator.rb +23 -0
- data/lib/generators/stenotype/initializer/templates/initializer.rb.erb +65 -0
- data/lib/stenotype.rb +24 -85
- data/lib/stenotype/adapters.rb +3 -3
- data/lib/stenotype/adapters/base.rb +10 -0
- data/lib/stenotype/adapters/google_cloud.rb +53 -21
- data/lib/stenotype/adapters/stdout_adapter.rb +23 -1
- data/lib/stenotype/configuration.rb +91 -36
- data/lib/stenotype/context_handlers.rb +6 -8
- data/lib/stenotype/context_handlers/base.rb +14 -3
- data/lib/stenotype/context_handlers/collection.rb +78 -34
- data/lib/stenotype/context_handlers/rails/active_job.rb +3 -11
- data/lib/stenotype/context_handlers/rails/controller.rb +10 -11
- data/lib/stenotype/dispatcher.rb +1 -2
- data/lib/stenotype/emitter.rb +162 -0
- data/lib/stenotype/event.rb +8 -9
- data/lib/stenotype/event_serializer.rb +25 -5
- data/lib/stenotype/frameworks/rails/action_controller.rb +41 -19
- data/lib/stenotype/frameworks/rails/active_job.rb +3 -5
- data/lib/stenotype/railtie.rb +37 -0
- data/lib/stenotype/version.rb +1 -1
- data/stenotype.gemspec +30 -26
- metadata +69 -19
- data/lib/stenotype/exceptions.rb +0 -31
- data/lib/stenotype/frameworks/object_ext.rb +0 -145
data/lib/stenotype/exceptions.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Stenotype
|
4
|
-
#
|
5
|
-
# A namespace for holding library-level exceptions.
|
6
|
-
#
|
7
|
-
module Exceptions
|
8
|
-
#
|
9
|
-
# This exception is being raised in case an unsupported mode
|
10
|
-
# for Google Cloud is specified.
|
11
|
-
#
|
12
|
-
class GoogleCloudUnsupportedMode < StandardError; end
|
13
|
-
|
14
|
-
#
|
15
|
-
# This exception is being raised upon unsuccessful publishing of an event.
|
16
|
-
#
|
17
|
-
class MessageNotPublished < StandardError; end
|
18
|
-
|
19
|
-
#
|
20
|
-
# This exception is being raised in case no targets are
|
21
|
-
# specified {Stenotype::Configuration}.
|
22
|
-
#
|
23
|
-
class NoTargetsSpecified < StandardError; end
|
24
|
-
|
25
|
-
#
|
26
|
-
# This exception is being raised upon using a context handler which
|
27
|
-
# has never been registered in known handlers in {Stenotype::ContextHandlers::Collection}.
|
28
|
-
#
|
29
|
-
class UnknownHandler < StandardError; end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,145 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Stenotype
|
4
|
-
#
|
5
|
-
# A namespace containing extensions of various frameworks.
|
6
|
-
# For example Rails components could be extended
|
7
|
-
#
|
8
|
-
module Frameworks
|
9
|
-
#
|
10
|
-
# An extension for a plain Ruby class in order to track invocation of
|
11
|
-
# instance methods.
|
12
|
-
#
|
13
|
-
module ObjectExt
|
14
|
-
#
|
15
|
-
# Class methods for `Object` to be extended by
|
16
|
-
#
|
17
|
-
ClassMethodsExtension = Class.new(Module)
|
18
|
-
#
|
19
|
-
# Instance methods to be included into `Object` ancestors chain
|
20
|
-
#
|
21
|
-
InstanceMethodsExtension = Class.new(Module)
|
22
|
-
|
23
|
-
attr_reader :instance_mod,
|
24
|
-
:class_mod
|
25
|
-
|
26
|
-
# @!visibility private
|
27
|
-
def self.included(klass)
|
28
|
-
@instance_mod = InstanceMethodsExtension.new
|
29
|
-
@class_mod = ClassMethodsExtension.new
|
30
|
-
|
31
|
-
build_instance_methods
|
32
|
-
build_class_methods
|
33
|
-
|
34
|
-
klass.const_set(:InstanceProxy, Module.new)
|
35
|
-
klass.const_set(:ClassProxy, Module.new)
|
36
|
-
|
37
|
-
klass.send(:include, instance_mod)
|
38
|
-
klass.extend(class_mod)
|
39
|
-
|
40
|
-
super
|
41
|
-
end
|
42
|
-
|
43
|
-
#
|
44
|
-
# @!method emit_event(data = {}, method: caller_locations.first.label, eval_context: nil)
|
45
|
-
# A method injected into all instances of Object
|
46
|
-
# @!scope instance
|
47
|
-
# @param data {Hash} Data to be sent to the targets
|
48
|
-
# @param method {String} An optional method name
|
49
|
-
# @param eval_context {Hash} A hash linking object to context handler
|
50
|
-
# @return {Stenotype::Event} An instance of emitted event
|
51
|
-
#
|
52
|
-
|
53
|
-
#
|
54
|
-
# @!method emit_event_before(*methods)
|
55
|
-
# A method injected into all instances of Object
|
56
|
-
# @!scope instance
|
57
|
-
# @param methods {Array<Symbol>} A list of method before which an event will be emitted
|
58
|
-
#
|
59
|
-
|
60
|
-
#
|
61
|
-
# @!method emit_klass_event_before(*class_methods)
|
62
|
-
# A class method injected into all subclasses of [Object]
|
63
|
-
# @!scope class
|
64
|
-
# @param class_method {Array<Symbol>} A list of class method before which
|
65
|
-
# an event will be emitted
|
66
|
-
#
|
67
|
-
|
68
|
-
#
|
69
|
-
# rubocop:disable Metrics/MethodLength
|
70
|
-
# Adds two methods: [#emit_event] and [#emit_event_before] to every object
|
71
|
-
# inherited from [Object]
|
72
|
-
#
|
73
|
-
def build_instance_methods
|
74
|
-
instance_mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
75
|
-
def emit_event(data = {}, method: caller_locations.first.label, eval_context: nil)
|
76
|
-
Stenotype::Event.emit!(
|
77
|
-
{
|
78
|
-
type: 'class_instance',
|
79
|
-
**data,
|
80
|
-
},
|
81
|
-
options: {
|
82
|
-
class: self.class.name,
|
83
|
-
method: method.to_sym
|
84
|
-
},
|
85
|
-
eval_context: (eval_context || { klass: self })
|
86
|
-
)
|
87
|
-
end
|
88
|
-
|
89
|
-
def emit_event_before(*methods)
|
90
|
-
proxy = const_get(:InstanceProxy)
|
91
|
-
|
92
|
-
methods.each do |method|
|
93
|
-
proxy.module_eval do
|
94
|
-
define_method(method) do |*args, **rest_args, &block|
|
95
|
-
Stenotype::Event.emit!(
|
96
|
-
{ type: 'class_instance' },
|
97
|
-
options: {
|
98
|
-
class: self.class.name,
|
99
|
-
method: __method__
|
100
|
-
},
|
101
|
-
eval_context: { klass: self }
|
102
|
-
)
|
103
|
-
super(*args, **rest_args, &block)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
send(:prepend, proxy)
|
109
|
-
end
|
110
|
-
RUBY
|
111
|
-
end
|
112
|
-
|
113
|
-
#
|
114
|
-
# Adds class method [#emit_klass_event_before] to every class
|
115
|
-
# inherited from [Object]
|
116
|
-
#
|
117
|
-
def build_class_methods
|
118
|
-
class_mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
119
|
-
def emit_klass_event_before(*class_methods)
|
120
|
-
proxy = const_get(:ClassProxy)
|
121
|
-
|
122
|
-
class_methods.each do |method|
|
123
|
-
proxy.module_eval do
|
124
|
-
define_method(method) do |*args, **rest_args, &block|
|
125
|
-
Stenotype::Event.emit!(
|
126
|
-
{ type: 'class' },
|
127
|
-
options: {
|
128
|
-
class: self.name,
|
129
|
-
method: __method__
|
130
|
-
},
|
131
|
-
eval_context: { klass: self }
|
132
|
-
)
|
133
|
-
super(*args, **rest_args, &block)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
singleton_class.send(:prepend, proxy)
|
138
|
-
end
|
139
|
-
end
|
140
|
-
RUBY
|
141
|
-
end
|
142
|
-
# rubocop:enable Metrics/MethodLength
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|