nexaas-async-collector 1.2.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -1
- data/app/helpers/nexaas/async/collector/application_helper.rb +18 -5
- data/app/views/nexaas/async/collector/async_resource/_show.html.erb +1 -1
- data/app/workers/nexaas/async/collector/async_resource_job.rb +38 -7
- data/lib/nexaas/async/collector/persist.rb +4 -4
- data/lib/nexaas/async/collector/result.rb +7 -8
- data/lib/nexaas/async/collector/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '095b630a7a47dcb39b779d55d8a9adec7cec81c3'
|
4
|
+
data.tar.gz: 3aeadb92991d1884a3bda6b36ac4a49a3a67071d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 003da333f56ca3122b2221fd4ca14e54cdd6dcefee8ffc1c5b15189d56104df61b572cff3d9624afd5ece531c9cb9719fdfea804aecdb134b4c64c84c7b0562e
|
7
|
+
data.tar.gz: 7831048e2329a696533c56b731c2e95730b8c1a17f590c063265492c27bc2319f0cff83e803d0afa998af4aaf8a8fbc94ab29a71a3ebcf7e951e8219edc2899e
|
data/README.md
CHANGED
@@ -69,7 +69,13 @@ end
|
|
69
69
|
3) Use the view helper to do all the process:
|
70
70
|
|
71
71
|
```ruby
|
72
|
-
<%= nexaas_async_collect(
|
72
|
+
<%= nexaas_async_collect({
|
73
|
+
scoped_id: scope.id, # (required) the ID of the scope. It ensures only the scope who requested the data will be able to fetch it
|
74
|
+
class_name: ModelService, # (required) name of the class
|
75
|
+
class_method: :model_method, # (required) name of the class method responsible to generate data
|
76
|
+
args: [arg1, arg2], # (optional) arguments to be passed to class method
|
77
|
+
instrumentation_context: 'my.custom.instrumentation' # (optional) context of the instrumentation name. It will generate two instrumentation: 'my.custom.instrumentation.start' and 'my.custom.instrumentation.finish'
|
78
|
+
}) %>
|
73
79
|
```
|
74
80
|
|
75
81
|
## Contributing
|
@@ -4,7 +4,7 @@ module Nexaas
|
|
4
4
|
module ApplicationHelper
|
5
5
|
#
|
6
6
|
# Helper to enqueue AsyncResourceJob and include the JavaScript code to request the result
|
7
|
-
# -
|
7
|
+
# - scoped_id: an ID that is unique (maybe user.id, account.id, organization.id, etc)
|
8
8
|
# - klass_name: The name of the class responsible for generate the content to be stored in the memory
|
9
9
|
# - klass_method: The name of the class method to be called
|
10
10
|
# - args: The arguments to be passed in the call of the class method
|
@@ -12,8 +12,10 @@ module Nexaas
|
|
12
12
|
# Example:
|
13
13
|
# <%= nexaas_async_collect(current_user.id, ReportGenerator, :generate, []) %>
|
14
14
|
#
|
15
|
-
def nexaas_async_collect(
|
16
|
-
|
15
|
+
def nexaas_async_collect(opts={})
|
16
|
+
validate_options(opts)
|
17
|
+
opts.merge!({ collect_id: collect_id })
|
18
|
+
AsyncResourceJob.perform_async(opts)
|
17
19
|
render(partial: 'nexaas/async/collector/async_resource/show')
|
18
20
|
end
|
19
21
|
|
@@ -25,8 +27,19 @@ module Nexaas
|
|
25
27
|
|
26
28
|
private
|
27
29
|
|
28
|
-
def
|
29
|
-
|
30
|
+
def validate_options(opts={})
|
31
|
+
missing_keys = required_collect_opts - opts.keys.map(&:to_s)
|
32
|
+
if missing_keys.any?
|
33
|
+
raise "Nexaas::Async::Collector: Required parameter missing: #{missing_keys.join(', ')}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def collect_id
|
38
|
+
@collect_id ||= SecureRandom.hex(15)
|
39
|
+
end
|
40
|
+
|
41
|
+
def required_collect_opts
|
42
|
+
['scope_id', 'class_name', 'class_method']
|
30
43
|
end
|
31
44
|
|
32
45
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<script type="text/javascript" id="js-nexaas-async-collector">
|
2
2
|
var requestContent = function() {
|
3
3
|
$.ajax({
|
4
|
-
url: '<%= nexaas_async_collector.async_resource_path(@
|
4
|
+
url: '<%= nexaas_async_collector.async_resource_path(@collect_id) %>',
|
5
5
|
dataType: 'script'
|
6
6
|
})
|
7
7
|
}
|
@@ -6,20 +6,51 @@ module Nexaas
|
|
6
6
|
include Sidekiq::Worker
|
7
7
|
sidekiq_options queue: Nexaas::Async::Collector.queue_name
|
8
8
|
|
9
|
-
def perform(
|
10
|
-
|
11
|
-
|
9
|
+
def perform(opts={})
|
10
|
+
initialize_options(opts)
|
11
|
+
start_time = Time.current.to_i
|
12
|
+
instrument_start(start_time)
|
13
|
+
Persist.save(@scoped_id, @collect_id, generate_content)
|
14
|
+
instrument_finish(start_time)
|
12
15
|
end
|
13
16
|
|
14
17
|
private
|
15
18
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
+
def initialize_options(opts)
|
20
|
+
opts.each do |k, v|
|
21
|
+
instance_variable_set("@#{k}", v)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate_content
|
26
|
+
if @args && @args.any?
|
27
|
+
@class_name.to_s.constantize.send(@class_method, *@args)
|
19
28
|
else
|
20
|
-
|
29
|
+
@class_name.to_s.constantize.send(@class_method)
|
21
30
|
end
|
22
31
|
end
|
32
|
+
|
33
|
+
def instrument_start(start_time)
|
34
|
+
ActiveSupport::Notifications.instrument("#{instrumentation_context}.start", {
|
35
|
+
collect_id: @collect_id, scoped_id: @scoped_id,
|
36
|
+
class_name: @class_name, class_method: @class_method,
|
37
|
+
start: start_time
|
38
|
+
})
|
39
|
+
end
|
40
|
+
|
41
|
+
def instrument_finish(start_time)
|
42
|
+
finish = Time.current.to_i
|
43
|
+
duration = (finish - start_time)
|
44
|
+
ActiveSupport::Notifications.instrument("#{instrumentation_context}.finish", {
|
45
|
+
collect_id: @collect_id, scoped_id: @scoped_id,
|
46
|
+
class_name: @class_name, class_method: @class_method,
|
47
|
+
finish: finish, duration: duration
|
48
|
+
})
|
49
|
+
end
|
50
|
+
|
51
|
+
def instrumentation_context
|
52
|
+
@instrumentation_context || 'nexaas-async-collector'
|
53
|
+
end
|
23
54
|
end
|
24
55
|
end
|
25
56
|
end
|
@@ -3,13 +3,13 @@ module Nexaas
|
|
3
3
|
module Collector
|
4
4
|
class Persist
|
5
5
|
class << self
|
6
|
-
def save(
|
7
|
-
storage.set(key, content(
|
6
|
+
def save(scope_id, key, value)
|
7
|
+
storage.set(key, content(scope_id, value))
|
8
8
|
end
|
9
9
|
|
10
|
-
def content(
|
10
|
+
def content(scope_id, value)
|
11
11
|
{
|
12
|
-
'
|
12
|
+
'scope_id' => scope_id,
|
13
13
|
'content' => value
|
14
14
|
}.to_json
|
15
15
|
end
|
@@ -1,21 +1,20 @@
|
|
1
1
|
# Content is stored in the database as the following JSON:
|
2
2
|
# {
|
3
|
-
# '
|
3
|
+
# 'scope_id' => 'scope_id',
|
4
4
|
# 'content' => 'generated content'
|
5
5
|
# }
|
6
|
-
# The content is scoped by
|
7
|
-
# to access only. Only the
|
8
|
-
# Maybe leave this more generic?
|
6
|
+
# The content is scoped by scope, so any other scope who discover the key (id) of the content, will not be able
|
7
|
+
# to access only. Only the scope who created it.
|
9
8
|
|
10
9
|
module Nexaas
|
11
10
|
module Async
|
12
11
|
module Collector
|
13
12
|
class Result
|
14
13
|
|
15
|
-
attr_reader :
|
14
|
+
attr_reader :scope_id, :id, :content
|
16
15
|
|
17
|
-
def initialize(
|
18
|
-
@
|
16
|
+
def initialize(scope_id, id)
|
17
|
+
@scope_id = scope_id
|
19
18
|
@id = id
|
20
19
|
end
|
21
20
|
|
@@ -24,7 +23,7 @@ module Nexaas
|
|
24
23
|
end
|
25
24
|
|
26
25
|
def content_is_ready?
|
27
|
-
_content && _content['
|
26
|
+
_content && _content['scope_id'] == scope_id && _content['content']
|
28
27
|
end
|
29
28
|
|
30
29
|
private
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexaas-async-collector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo Hertz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - '='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 9.0.6
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: timecop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
description: Agnostic collector and generator of async content for Rails apps.
|
112
126
|
email:
|
113
127
|
- eduardohertz@gmail.com
|