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.
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