stenotype 0.1.0 → 0.1.6
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/.gitignore +3 -0
- data/.rubocop.yml +3 -2
- data/CHANGELOG.md +43 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +111 -60
- data/README.md +48 -17
- 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 +82 -0
- data/lib/stenotype.rb +24 -85
- data/lib/stenotype/adapters.rb +3 -3
- data/lib/stenotype/adapters/base.rb +25 -2
- data/lib/stenotype/adapters/google_cloud.rb +70 -22
- data/lib/stenotype/adapters/stdout_adapter.rb +36 -2
- data/lib/stenotype/at_exit.rb +8 -0
- data/lib/stenotype/configuration.rb +127 -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 +166 -0
- data/lib/stenotype/event.rb +48 -25
- data/lib/stenotype/event_serializer.rb +31 -11
- data/lib/stenotype/frameworks/rails/action_controller.rb +44 -21
- 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 +70 -19
- data/lib/stenotype/exceptions.rb +0 -31
- data/lib/stenotype/frameworks/object_ext.rb +0 -145
@@ -29,16 +29,15 @@ module Stenotype
|
|
29
29
|
# end
|
30
30
|
# end
|
31
31
|
#
|
32
|
-
# rubocop:disable Metrics/MethodLength
|
33
32
|
#
|
34
33
|
def trackable_job!
|
35
34
|
proxy = const_get(:JobExt)
|
36
35
|
proxy.module_eval do
|
37
36
|
define_method(:perform) do |*args, **rest_args, &block|
|
38
37
|
Stenotype::Event.emit!(
|
38
|
+
"active_job_#{self.class.name}",
|
39
39
|
{ type: "active_job" },
|
40
|
-
|
41
|
-
eval_context: { active_job: self }
|
40
|
+
{ eval_context: { active_job: self }},
|
42
41
|
)
|
43
42
|
super(*args, **rest_args, &block)
|
44
43
|
end
|
@@ -48,9 +47,8 @@ module Stenotype
|
|
48
47
|
# super() can be chained down the ancestors
|
49
48
|
# without changing existing ActiveJob interface
|
50
49
|
#
|
51
|
-
|
50
|
+
public_send(:prepend, proxy)
|
52
51
|
end
|
53
|
-
# rubocop:enable Metrics/MethodLength
|
54
52
|
end
|
55
53
|
end
|
56
54
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "stenotype/frameworks/rails/action_controller"
|
4
|
+
require "stenotype/frameworks/rails/active_job"
|
5
|
+
|
6
|
+
module Stenotype
|
7
|
+
#
|
8
|
+
# A Railtie allowing to extend Rails component with
|
9
|
+
# Stenotype extensions for emitting event in various Rails components.
|
10
|
+
#
|
11
|
+
class Railtie < ::Rails::Railtie
|
12
|
+
Stenotype.configure do |config|
|
13
|
+
config.rails do |rails_config|
|
14
|
+
rails_config.enable_action_controller_ext = true
|
15
|
+
rails_config.enable_active_job_ext = true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
config.stenotype = Stenotype.config
|
20
|
+
|
21
|
+
if config.stenotype.rails.enable_action_controller_ext
|
22
|
+
ActiveSupport.on_load(:action_controller) do
|
23
|
+
Stenotype::ContextHandlers.register Stenotype::ContextHandlers::Rails::Controller
|
24
|
+
include Stenotype::Frameworks::Rails::ActionControllerExtension
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# @todo: consider using `::ActiveJob::Base.around_perform`
|
29
|
+
# or `::ActiveJob::Base.around_enqueue`
|
30
|
+
if config.stenotype.rails.enable_active_job_ext
|
31
|
+
ActiveSupport.on_load(:active_job) do
|
32
|
+
Stenotype::ContextHandlers.register Stenotype::ContextHandlers::Rails::ActiveJob
|
33
|
+
extend Stenotype::Frameworks::Rails::ActiveJobExtension
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/stenotype/version.rb
CHANGED
data/stenotype.gemspec
CHANGED
@@ -6,42 +6,46 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
6
6
|
require "stenotype/version"
|
7
7
|
|
8
8
|
Gem::Specification.new do |spec|
|
9
|
-
spec.name =
|
9
|
+
spec.name = "stenotype"
|
10
10
|
spec.version = Stenotype::VERSION
|
11
11
|
spec.authors = ["Roman Kapitonov"]
|
12
12
|
spec.email = ["roman.kapitonov@freshly.com"]
|
13
13
|
|
14
|
-
spec.summary =
|
15
|
-
spec.description =
|
16
|
-
spec.homepage =
|
17
|
-
spec.license =
|
14
|
+
spec.summary = "Gem for emitting events and sending them to an external system."
|
15
|
+
spec.description = "Pretty much it"
|
16
|
+
spec.homepage = "https://github.com/Freshly/stenotype"
|
17
|
+
spec.license = "MIT"
|
18
18
|
|
19
|
-
spec.metadata[
|
20
|
-
spec.metadata[
|
21
|
-
spec.metadata[
|
19
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
20
|
+
spec.metadata["source_code_uri"] = "https://github.com/Freshly/stenotype"
|
21
|
+
spec.metadata["changelog_uri"] = "https://github.com/Freshly/stenotype/CHANGELOG.md"
|
22
22
|
|
23
23
|
# Specify which files should be added to the gem when it is released.
|
24
24
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
25
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
26
26
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
27
27
|
end
|
28
|
-
spec.bindir =
|
28
|
+
spec.bindir = "exe"
|
29
29
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
|
-
spec.require_paths = [
|
31
|
-
|
32
|
-
spec.add_dependency
|
33
|
-
spec.add_dependency
|
34
|
-
|
35
|
-
spec.
|
36
|
-
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
|
41
|
-
spec.add_development_dependency
|
42
|
-
|
43
|
-
spec.add_development_dependency
|
44
|
-
spec.add_development_dependency
|
45
|
-
|
46
|
-
spec.add_development_dependency
|
30
|
+
spec.require_paths = ["lib"]
|
31
|
+
|
32
|
+
spec.add_dependency "activesupport", ">= 5.0.0"
|
33
|
+
spec.add_dependency "google-cloud-pubsub", "~> 1.0.0"
|
34
|
+
|
35
|
+
spec.add_runtime_dependency "spicery", ">= 0.19.0", "< 1.0"
|
36
|
+
|
37
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
38
|
+
spec.add_development_dependency "github-markup", "~> 3.0"
|
39
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
40
|
+
spec.add_development_dependency "redcarpet", "~> 3.5"
|
41
|
+
spec.add_development_dependency "yard", "~> 0.9"
|
42
|
+
|
43
|
+
spec.add_development_dependency "rspice", ">= 0.19.0", "< 1.0"
|
44
|
+
spec.add_development_dependency "spicerack-styleguide", ">= 0.19.0", "< 1.0"
|
45
|
+
|
46
|
+
spec.add_development_dependency "pry", "~> 0.12"
|
47
|
+
spec.add_development_dependency "rails", "~> 5.2.3"
|
48
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
49
|
+
spec.add_development_dependency "simplecov", "~> 0.17"
|
50
|
+
spec.add_development_dependency "timecop", "~> 0.9"
|
47
51
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stenotype
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Kapitonov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -38,6 +38,26 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: spicery
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.19.0
|
48
|
+
- - "<"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '1.0'
|
51
|
+
type: :runtime
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 0.19.0
|
58
|
+
- - "<"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.0'
|
41
61
|
- !ruby/object:Gem::Dependency
|
42
62
|
name: bundler
|
43
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,61 +129,87 @@ dependencies:
|
|
109
129
|
- !ruby/object:Gem::Version
|
110
130
|
version: '0.9'
|
111
131
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
132
|
+
name: rspice
|
113
133
|
requirement: !ruby/object:Gem::Requirement
|
114
134
|
requirements:
|
115
|
-
- - "
|
135
|
+
- - ">="
|
116
136
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
137
|
+
version: 0.19.0
|
138
|
+
- - "<"
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '1.0'
|
118
141
|
type: :development
|
119
142
|
prerelease: false
|
120
143
|
version_requirements: !ruby/object:Gem::Requirement
|
121
144
|
requirements:
|
122
|
-
- - "
|
145
|
+
- - ">="
|
123
146
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
147
|
+
version: 0.19.0
|
148
|
+
- - "<"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '1.0'
|
125
151
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
152
|
+
name: spicerack-styleguide
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.19.0
|
158
|
+
- - "<"
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '1.0'
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ">="
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: 0.19.0
|
168
|
+
- - "<"
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '1.0'
|
171
|
+
- !ruby/object:Gem::Dependency
|
172
|
+
name: pry
|
127
173
|
requirement: !ruby/object:Gem::Requirement
|
128
174
|
requirements:
|
129
175
|
- - "~>"
|
130
176
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
177
|
+
version: '0.12'
|
132
178
|
type: :development
|
133
179
|
prerelease: false
|
134
180
|
version_requirements: !ruby/object:Gem::Requirement
|
135
181
|
requirements:
|
136
182
|
- - "~>"
|
137
183
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
184
|
+
version: '0.12'
|
139
185
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
186
|
+
name: rails
|
141
187
|
requirement: !ruby/object:Gem::Requirement
|
142
188
|
requirements:
|
143
189
|
- - "~>"
|
144
190
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
191
|
+
version: 5.2.3
|
146
192
|
type: :development
|
147
193
|
prerelease: false
|
148
194
|
version_requirements: !ruby/object:Gem::Requirement
|
149
195
|
requirements:
|
150
196
|
- - "~>"
|
151
197
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
198
|
+
version: 5.2.3
|
153
199
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
200
|
+
name: rspec
|
155
201
|
requirement: !ruby/object:Gem::Requirement
|
156
202
|
requirements:
|
157
203
|
- - "~>"
|
158
204
|
- !ruby/object:Gem::Version
|
159
|
-
version: '0
|
205
|
+
version: '3.0'
|
160
206
|
type: :development
|
161
207
|
prerelease: false
|
162
208
|
version_requirements: !ruby/object:Gem::Requirement
|
163
209
|
requirements:
|
164
210
|
- - "~>"
|
165
211
|
- !ruby/object:Gem::Version
|
166
|
-
version: '0
|
212
|
+
version: '3.0'
|
167
213
|
- !ruby/object:Gem::Dependency
|
168
214
|
name: simplecov
|
169
215
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,6 +250,7 @@ files:
|
|
204
250
|
- ".rubocop.yml"
|
205
251
|
- ".travis.yml"
|
206
252
|
- ".yardopts"
|
253
|
+
- CHANGELOG.md
|
207
254
|
- Gemfile
|
208
255
|
- Gemfile.lock
|
209
256
|
- LICENSE.txt
|
@@ -212,11 +259,15 @@ files:
|
|
212
259
|
- TODO.md
|
213
260
|
- bin/console
|
214
261
|
- bin/setup
|
262
|
+
- lib/generators/USAGE
|
263
|
+
- lib/generators/stenotype/initializer/initializer_generator.rb
|
264
|
+
- lib/generators/stenotype/initializer/templates/initializer.rb.erb
|
215
265
|
- lib/stenotype.rb
|
216
266
|
- lib/stenotype/adapters.rb
|
217
267
|
- lib/stenotype/adapters/base.rb
|
218
268
|
- lib/stenotype/adapters/google_cloud.rb
|
219
269
|
- lib/stenotype/adapters/stdout_adapter.rb
|
270
|
+
- lib/stenotype/at_exit.rb
|
220
271
|
- lib/stenotype/configuration.rb
|
221
272
|
- lib/stenotype/context_handlers.rb
|
222
273
|
- lib/stenotype/context_handlers/base.rb
|
@@ -225,12 +276,12 @@ files:
|
|
225
276
|
- lib/stenotype/context_handlers/rails/active_job.rb
|
226
277
|
- lib/stenotype/context_handlers/rails/controller.rb
|
227
278
|
- lib/stenotype/dispatcher.rb
|
279
|
+
- lib/stenotype/emitter.rb
|
228
280
|
- lib/stenotype/event.rb
|
229
281
|
- lib/stenotype/event_serializer.rb
|
230
|
-
- lib/stenotype/exceptions.rb
|
231
|
-
- lib/stenotype/frameworks/object_ext.rb
|
232
282
|
- lib/stenotype/frameworks/rails/action_controller.rb
|
233
283
|
- lib/stenotype/frameworks/rails/active_job.rb
|
284
|
+
- lib/stenotype/railtie.rb
|
234
285
|
- lib/stenotype/version.rb
|
235
286
|
- stenotype.gemspec
|
236
287
|
homepage: https://github.com/Freshly/stenotype
|
@@ -255,7 +306,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
255
306
|
- !ruby/object:Gem::Version
|
256
307
|
version: '0'
|
257
308
|
requirements: []
|
258
|
-
rubygems_version: 3.0.
|
309
|
+
rubygems_version: 3.0.3
|
259
310
|
signing_key:
|
260
311
|
specification_version: 4
|
261
312
|
summary: Gem for emitting events and sending them to an external system.
|
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
|