ultravisor 0.0.0.3.g8cf10dc

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,16 @@
1
+ class Ultravisor::Child::Call
2
+ attr_reader :method_name
3
+
4
+ def initialize(method_name, args, blk, rv_q, rv_fail)
5
+ @method_name, @args, @blk, @rv_q, @rv_fail = method_name, args, blk, rv_q, rv_fail
6
+ end
7
+
8
+ def go!(receiver)
9
+ @rv_q << receiver.__send__(@method_name, *@args, &@blk)
10
+ @rv_q.close
11
+ end
12
+
13
+ def child_restarted!
14
+ @rv_q << @rv_fail
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ class Ultravisor::Child::CallReceiver < BasicObject
2
+ def initialize(&blk)
3
+ @blk = blk
4
+ end
5
+
6
+ def method_missing(name, *args, &blk)
7
+ rv_q = ::Queue.new
8
+ rv_fail = ::Object.new
9
+ callback = ::Ultravisor::Child::Call.new(name, args, blk, rv_q, rv_fail)
10
+ @blk.call(callback)
11
+ rv_q.pop.tap { |rv| ::Kernel.raise ::Ultravisor::ChildRestartedError.new if rv == rv_fail }
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ class Ultravisor::Child::Cast
2
+ attr_reader :method_name
3
+
4
+ def initialize(method_name, args, blk)
5
+ @method_name, @args, @blk = method_name, args, blk
6
+ end
7
+
8
+ def go!(receiver)
9
+ receiver.__send__(@method_name, *@args, &@blk)
10
+ end
11
+
12
+ def child_restarted!
13
+ # Meh
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ class Ultravisor::Child::CastReceiver < BasicObject
2
+ def initialize(&blk)
3
+ @blk = blk
4
+ end
5
+
6
+ def method_missing(name, *args, &blk)
7
+ castback = ::Ultravisor::Child::Cast.new(name, args, blk)
8
+ @blk.call(castback)
9
+ end
10
+ end
@@ -0,0 +1,38 @@
1
+ module Ultravisor::Child::ProcessCastCall
2
+ private
3
+
4
+ def process_castcall
5
+ begin
6
+ loop do
7
+ item = @ultravisor_child_castcall_queue.pop(true)
8
+
9
+ # Queue has been closed, which is a polite way of saying "we're done here"
10
+ return if item.nil?
11
+
12
+ item.go!(self)
13
+
14
+ castcall_fd.getc
15
+ end
16
+ rescue ThreadError => ex
17
+ if ex.message != "queue empty"
18
+ #:nocov:
19
+ raise
20
+ #:nocov:
21
+ end
22
+ end
23
+ end
24
+
25
+ def castcall_fd
26
+ @ultravisor_child_castcall_fd
27
+ end
28
+
29
+ def process_castcall_loop
30
+ #:nocov:
31
+ loop do
32
+ IO.select([castcall_fd], nil, nil)
33
+
34
+ process_castcall
35
+ end
36
+ #:nocov:
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ class Ultravisor
2
+ # Base class of all Ultravisor-specific errors
3
+ class Error < StandardError; end
4
+
5
+ # Tried to register a child with an ID of a child that already exists
6
+ class DuplicateChildError < Error; end
7
+
8
+ # Tried to call `#run` on an ultravisor that is already running
9
+ class AlreadyRunningError < Error; end
10
+
11
+ # A `child.call.<method>` was interrupted by the child instance runner terminating
12
+ class ChildRestartedError < Error; end
13
+
14
+ # Something was wrong with the Klass/Args/Method (KAM) passed
15
+ class InvalidKAMError < Error; end
16
+
17
+ # A child's restart policy was exceeded, and the Ultravisor should
18
+ # terminate
19
+ class BlownRestartPolicyError < Error; end
20
+
21
+ # An internal programming error (aka "a bug") caused a violation of thread safety
22
+ # requirements
23
+ class ThreadSafetyError < Error; end
24
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Ultravisor
4
+ module LoggingHelpers
5
+ private
6
+
7
+ attr_reader :logger
8
+
9
+ def log_exception(ex, progname = nil)
10
+ #:nocov:
11
+ progname ||= "#{self.class.to_s}##{caller_locations(2, 1).first.label}"
12
+
13
+ logger.error(progname) do
14
+ explanation = if block_given?
15
+ yield
16
+ else
17
+ false
18
+ end
19
+
20
+ (["#{explanation}#{explanation ? ": " : ""}#{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ")
21
+ end
22
+ #:nocov:
23
+ end
24
+
25
+ def logloc
26
+ #:nocov:
27
+ loc = caller_locations.first
28
+ "#{self.class}##{loc.label}"
29
+ #:nocov:
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,36 @@
1
+ begin
2
+ require "git-version-bump"
3
+ rescue LoadError
4
+ nil
5
+ end
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "ultravisor"
9
+
10
+ s.version = GVB.version rescue "0.0.0.1.NOGVB"
11
+ s.date = GVB.date rescue Time.now.strftime("%Y-%m-%d")
12
+
13
+ s.platform = Gem::Platform::RUBY
14
+
15
+ s.summary = "A template gem"
16
+
17
+ s.authors = ["Matt Palmer"]
18
+ s.email = ["theshed+ultravisor@hezmatt.org"]
19
+ s.homepage = "https://github.com/mpalmer/ultravisor"
20
+
21
+ s.files = `git ls-files -z`.split("\0").reject { |f| f =~ /^(G|spec|Rakefile)/ }
22
+
23
+ s.required_ruby_version = ">= 2.3.0"
24
+
25
+
26
+ s.add_development_dependency "bundler"
27
+ s.add_development_dependency "github-release"
28
+ s.add_development_dependency "guard-rspec"
29
+ s.add_development_dependency "rake", "~> 10.4", ">= 10.4.2"
30
+ # Needed for guard
31
+ s.add_development_dependency "rb-inotify", "~> 0.9"
32
+ s.add_development_dependency "redcarpet"
33
+ s.add_development_dependency "rspec"
34
+ s.add_development_dependency "simplecov"
35
+ s.add_development_dependency "yard"
36
+ end
metadata ADDED
@@ -0,0 +1,188 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ultravisor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0.3.g8cf10dc
5
+ platform: ruby
6
+ authors:
7
+ - Matt Palmer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: github-release
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: guard-rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.4'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 10.4.2
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '10.4'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 10.4.2
75
+ - !ruby/object:Gem::Dependency
76
+ name: rb-inotify
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.9'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.9'
89
+ - !ruby/object:Gem::Dependency
90
+ name: redcarpet
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: simplecov
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: yard
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ description:
146
+ email:
147
+ - theshed+ultravisor@hezmatt.org
148
+ executables: []
149
+ extensions: []
150
+ extra_rdoc_files: []
151
+ files:
152
+ - ".gitignore"
153
+ - ".yardopts"
154
+ - LICENCE
155
+ - README.md
156
+ - lib/ultravisor.rb
157
+ - lib/ultravisor/child.rb
158
+ - lib/ultravisor/child/call.rb
159
+ - lib/ultravisor/child/call_receiver.rb
160
+ - lib/ultravisor/child/cast.rb
161
+ - lib/ultravisor/child/cast_receiver.rb
162
+ - lib/ultravisor/child/process_cast_call.rb
163
+ - lib/ultravisor/error.rb
164
+ - lib/ultravisor/logging_helpers.rb
165
+ - ultravisor.gemspec
166
+ homepage: https://github.com/mpalmer/ultravisor
167
+ licenses: []
168
+ metadata: {}
169
+ post_install_message:
170
+ rdoc_options: []
171
+ require_paths:
172
+ - lib
173
+ required_ruby_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: 2.3.0
178
+ required_rubygems_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">"
181
+ - !ruby/object:Gem::Version
182
+ version: 1.3.1
183
+ requirements: []
184
+ rubygems_version: 3.0.3
185
+ signing_key:
186
+ specification_version: 4
187
+ summary: A template gem
188
+ test_files: []