plugg 0.0.5 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +5 -5
  2. data/lib/plugg.rb +82 -36
  3. metadata +9 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2166868234da45a8933c515af1e93bde8963d47a
4
- data.tar.gz: 970f8abd1ed3e35f4182514122704f8d12341c0f
2
+ SHA256:
3
+ metadata.gz: 7b0bf38d3e6aaddc835e122ca4186a378ed7a02bd32e13317dfa94165f39bd99
4
+ data.tar.gz: bcea21911dc7bce085bb53788c027f6ac95d7233985dc19626316bfec316931f
5
5
  SHA512:
6
- metadata.gz: e4e566793a997bfc4c8726b680e2831d02e6361c2e1590301745bc5bc4612421efecf55565bf63d086bdfdefa9cfbc3f824dc523d3c2ceb263cf6c41091a34c0
7
- data.tar.gz: cf9de28d3d51a77bd671e9bc187e6a451c6f9683d9ab2b23d764daf3f82111799b0c60983d775ed5481693929b99a22cf04893ba5539d25f49393d5f9c836081
6
+ metadata.gz: a9052c09eb89ea8314d619d1eb377e11f26ebd533e7bdcbee931caeac7638a54cca6039cbe4a38efe445186ceb249915a34a8a6fd442e02ee4b38be745dd54da
7
+ data.tar.gz: 6ca5ca8dc2bfb25ab6bdcbc98b0e6efd2570976da0c3912d90ed98b2fb551a7fd5cfc7dbbae3512462b0e05f2e4bb3c09f582f2b04eada3ae6fd27e6dc859d85
@@ -1,9 +1,10 @@
1
1
  require 'singleton'
2
2
  require 'timeout'
3
+ require 'ostruct'
3
4
 
4
5
  module Plugg
5
6
  ##
6
- # Set the source directory to load the plugins from
7
+ # Set the source directory to load the plugins & dependencies from
7
8
  #
8
9
  # @param hash params
9
10
  # @param mixed path
@@ -24,7 +25,7 @@ module Plugg
24
25
  end
25
26
 
26
27
  if load_path.empty?
27
- raise 'Unable to locate plugins in the provided load path'
28
+ raise 'Unable to locate plugins in the provided load paths'
28
29
  end
29
30
 
30
31
  Dispatcher.instance.start(load_path, params)
@@ -58,6 +59,58 @@ module Plugg
58
59
 
59
60
  private
60
61
 
62
+ class DispatchResponder
63
+ attr_reader :plugin
64
+ attr_reader :meta
65
+
66
+ def initialize(plugin = nil)
67
+ @meta = OpenStruct.new
68
+
69
+ @meta.start_time = Time.now
70
+ @meta.plugin = plugin
71
+ @meta.response = nil
72
+ @meta.runtime = nil
73
+ @meta.error = nil
74
+ end
75
+
76
+ def trap(timeout = 5)
77
+ Timeout::timeout(timeout) {
78
+ begin
79
+ @meta.response = yield
80
+ rescue Exception => e
81
+ @meta.error = e
82
+ end
83
+ }
84
+
85
+ @meta.runtime = (Time.now - @start_time) * 1000
86
+ end
87
+
88
+ def finalize
89
+ if @meta.plugin.respond_to?(:after)
90
+ @meta.plugin.send(:after)
91
+ end
92
+ end
93
+
94
+ def ok?
95
+ @meta.error.nil?
96
+ end
97
+
98
+ def error
99
+ @meta.error
100
+ end
101
+
102
+ def to_h
103
+ defaults = {
104
+ plugin: @meta.plugin.to_s,
105
+ runtime: @meta.runtime,
106
+ response: @meta.error,
107
+ success: ok?
108
+ }
109
+
110
+ defaults
111
+ end
112
+ end
113
+
61
114
  class Dispatcher
62
115
  include Singleton
63
116
 
@@ -85,13 +138,18 @@ module Plugg
85
138
  begin
86
139
  instance = Object.const_get(File.basename(f, '.rb')).new
87
140
 
141
+ # `before` event callback
142
+ if instance.respond_to?(:before)
143
+ instance.send(:before)
144
+ end
145
+
146
+ # `setup` method
88
147
  if instance.respond_to?(:setup)
89
148
  instance.send(:setup, params)
90
149
  end
91
150
 
92
- @registry.push(instance)
93
-
94
- instance = nil
151
+ @registry.push(instance)
152
+
95
153
  rescue Exception => e
96
154
  puts "#{f} Plugg Initialization Exception: #{e}"
97
155
  end
@@ -109,11 +167,11 @@ module Plugg
109
167
  end
110
168
 
111
169
  ##
112
- # Initialize the dispatcher instance
170
+ # Initialize the dispatcher instance with a default timeout of 5s
113
171
  #
114
172
  # @return void
115
173
  def initialize
116
- @timeout = 30
174
+ @timeout = 5
117
175
  end
118
176
 
119
177
  ##
@@ -122,42 +180,30 @@ module Plugg
122
180
  # @param string method
123
181
  # @return void
124
182
  def on(method, *args, &block)
125
- buffer = []
126
183
 
127
- if [:initialize, :setup].include? method
184
+ if [:initialize, :before, :setup, :after].include? method
128
185
  raise "#{method} should not be called directly"
129
186
  end
130
187
 
131
- threads = []
188
+ buffer = [] # Container for the response buffer
189
+ threads = [] # Container for the execution threads
132
190
 
133
191
  @registry.each do |s|
134
- if s.respond_to?(method.to_sym, false)
192
+ if s.respond_to?(method.to_sym, false)
193
+ threads << Thread.new do
194
+ responder = DispatchResponder.new(s)
195
+
196
+ responder.trap(@timeout) do
197
+ if s.method(method.to_sym).arity == 0
198
+ s.send(method, &block)
199
+ else
200
+ s.send(method, *args, &block)
201
+ end
202
+ end
135
203
 
136
- start_time = Time.now
204
+ responder.finalize
137
205
 
138
- begin
139
- threads << Thread.new do
140
- status = true
141
- response = nil
142
-
143
- Timeout::timeout(@timeout) {
144
- if s.method(method.to_sym).arity == 0
145
- response = s.send(method, &block)
146
- else
147
- response = s.send(method, *args, &block)
148
- end
149
- }
150
-
151
- buffer << {
152
- plugin: s.to_s,
153
- return: response,
154
- timing: (Time.now - start_time) * 1000,
155
- success: status
156
- }
157
- end
158
- rescue Exception => e
159
- response = e
160
- status = false
206
+ buffer << responder.to_h
161
207
  end
162
208
  end
163
209
  end
@@ -167,4 +213,4 @@ module Plugg
167
213
  buffer
168
214
  end
169
215
  end
170
- end
216
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plugg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Nieuwoudt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-27 00:00:00.000000000 Z
11
+ date: 2020-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -36,29 +36,23 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '10.4'
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 10.4.2
39
+ version: '13.0'
43
40
  type: :development
44
41
  prerelease: false
45
42
  version_requirements: !ruby/object:Gem::Requirement
46
43
  requirements:
47
44
  - - "~>"
48
45
  - !ruby/object:Gem::Version
49
- version: '10.4'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 10.4.2
46
+ version: '13.0'
53
47
  description: Plugg allows you to easily extend your application by providing you with
54
- a bolt-on plugin framework
55
- email: sean@wixelhq.com
48
+ a plug and play plugin framework
49
+ email: sean@isean.co.za
56
50
  executables: []
57
51
  extensions: []
58
52
  extra_rdoc_files: []
59
53
  files:
60
54
  - lib/plugg.rb
61
- homepage: https://wixelhq.com
55
+ homepage: https://github.com/sn/plugg
62
56
  licenses:
63
57
  - GPL-2.0
64
58
  metadata: {}
@@ -77,9 +71,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
71
  - !ruby/object:Gem::Version
78
72
  version: '0'
79
73
  requirements: []
80
- rubyforge_project:
81
- rubygems_version: 2.6.11
74
+ rubygems_version: 3.1.4
82
75
  signing_key:
83
76
  specification_version: 4
84
- summary: Plugg is an independent plugin creation framework and DSL
77
+ summary: Plugg is a an asynchronous DSL for creating performant plugins
85
78
  test_files: []