stenotype 0.1.0 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +3 -2
  4. data/CHANGELOG.md +43 -0
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +111 -60
  7. data/README.md +48 -17
  8. data/Rakefile +2 -2
  9. data/TODO.md +18 -0
  10. data/bin/console +3 -3
  11. data/lib/generators/USAGE +8 -0
  12. data/lib/generators/stenotype/initializer/initializer_generator.rb +23 -0
  13. data/lib/generators/stenotype/initializer/templates/initializer.rb.erb +82 -0
  14. data/lib/stenotype.rb +24 -85
  15. data/lib/stenotype/adapters.rb +3 -3
  16. data/lib/stenotype/adapters/base.rb +25 -2
  17. data/lib/stenotype/adapters/google_cloud.rb +70 -22
  18. data/lib/stenotype/adapters/stdout_adapter.rb +36 -2
  19. data/lib/stenotype/at_exit.rb +8 -0
  20. data/lib/stenotype/configuration.rb +127 -36
  21. data/lib/stenotype/context_handlers.rb +6 -8
  22. data/lib/stenotype/context_handlers/base.rb +14 -3
  23. data/lib/stenotype/context_handlers/collection.rb +78 -34
  24. data/lib/stenotype/context_handlers/rails/active_job.rb +3 -11
  25. data/lib/stenotype/context_handlers/rails/controller.rb +10 -11
  26. data/lib/stenotype/dispatcher.rb +1 -2
  27. data/lib/stenotype/emitter.rb +166 -0
  28. data/lib/stenotype/event.rb +48 -25
  29. data/lib/stenotype/event_serializer.rb +31 -11
  30. data/lib/stenotype/frameworks/rails/action_controller.rb +44 -21
  31. data/lib/stenotype/frameworks/rails/active_job.rb +3 -5
  32. data/lib/stenotype/railtie.rb +37 -0
  33. data/lib/stenotype/version.rb +1 -1
  34. data/stenotype.gemspec +30 -26
  35. metadata +70 -19
  36. data/lib/stenotype/exceptions.rb +0 -31
  37. 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
- options: {},
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
- send(:prepend, proxy)
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Stenotype
4
4
  # :nodoc:
5
- VERSION = '0.1.0'
5
+ VERSION = "0.1.6"
6
6
  # :nodoc:
7
7
  end
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 = 'stenotype'
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 = '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'
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['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'
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 = 'exe'
28
+ spec.bindir = "exe"
29
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
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_development_dependency 'bundler', '~> 2.0'
36
- spec.add_development_dependency 'github-markup', '~> 3.0'
37
- spec.add_development_dependency 'rake', '~> 10.0'
38
- spec.add_development_dependency 'redcarpet', '~> 3.5'
39
- spec.add_development_dependency 'yard', '~> 0.9'
40
-
41
- spec.add_development_dependency 'pry', '~> 0.12'
42
- spec.add_development_dependency 'rails', '~> 5.2.3'
43
- spec.add_development_dependency 'rspec', '~> 3.0'
44
- spec.add_development_dependency 'rubocop', '~> 0.76'
45
- spec.add_development_dependency 'simplecov', '~> 0.17'
46
- spec.add_development_dependency 'timecop', '~> 0.9'
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.0
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: 2019-11-21 00:00:00.000000000 Z
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: pry
132
+ name: rspice
113
133
  requirement: !ruby/object:Gem::Requirement
114
134
  requirements:
115
- - - "~>"
135
+ - - ">="
116
136
  - !ruby/object:Gem::Version
117
- version: '0.12'
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: '0.12'
147
+ version: 0.19.0
148
+ - - "<"
149
+ - !ruby/object:Gem::Version
150
+ version: '1.0'
125
151
  - !ruby/object:Gem::Dependency
126
- name: rails
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: 5.2.3
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: 5.2.3
184
+ version: '0.12'
139
185
  - !ruby/object:Gem::Dependency
140
- name: rspec
186
+ name: rails
141
187
  requirement: !ruby/object:Gem::Requirement
142
188
  requirements:
143
189
  - - "~>"
144
190
  - !ruby/object:Gem::Version
145
- version: '3.0'
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: '3.0'
198
+ version: 5.2.3
153
199
  - !ruby/object:Gem::Dependency
154
- name: rubocop
200
+ name: rspec
155
201
  requirement: !ruby/object:Gem::Requirement
156
202
  requirements:
157
203
  - - "~>"
158
204
  - !ruby/object:Gem::Version
159
- version: '0.76'
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.76'
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.4
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.
@@ -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