specwrk 0.1.0
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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.standard.yml +3 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +5 -0
- data/README.md +10 -0
- data/Rakefile +10 -0
- data/exe/specwrk +17 -0
- data/lib/specwrk/cli.rb +232 -0
- data/lib/specwrk/cli_reporter.rb +78 -0
- data/lib/specwrk/client.rb +150 -0
- data/lib/specwrk/hookable.rb +50 -0
- data/lib/specwrk/list_examples.rb +53 -0
- data/lib/specwrk/queue.rb +204 -0
- data/lib/specwrk/version.rb +5 -0
- data/lib/specwrk/web/app.rb +77 -0
- data/lib/specwrk/web/auth.rb +31 -0
- data/lib/specwrk/web/endpoints.rb +156 -0
- data/lib/specwrk/web.rb +15 -0
- data/lib/specwrk/worker/completion_formatter.rb +30 -0
- data/lib/specwrk/worker/executor.rb +82 -0
- data/lib/specwrk/worker/null_formatter.rb +18 -0
- data/lib/specwrk/worker/progress_formatter.rb +45 -0
- data/lib/specwrk/worker.rb +86 -0
- data/lib/specwrk.rb +21 -0
- metadata +179 -0
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "stringio"
|
4
|
+
|
5
|
+
require "specwrk/client"
|
6
|
+
require "specwrk/worker/executor"
|
7
|
+
|
8
|
+
module Specwrk
|
9
|
+
class Worker
|
10
|
+
def self.run!
|
11
|
+
new.run
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
Process.setproctitle ENV.fetch("SPECWRK_ID", "specwrk-worker")
|
16
|
+
|
17
|
+
@running = true
|
18
|
+
@client = Client.new
|
19
|
+
@executor = Executor.new
|
20
|
+
@heartbeat_thread ||= Thread.new do
|
21
|
+
thump
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
26
|
+
Client.wait_for_server!
|
27
|
+
|
28
|
+
loop do
|
29
|
+
break if Specwrk.force_quit
|
30
|
+
|
31
|
+
execute
|
32
|
+
rescue CompletedAllExamplesError, NoMoreExamplesError
|
33
|
+
# TODO: Sleep on NoMoreExamplesError to allow for retries
|
34
|
+
break
|
35
|
+
end
|
36
|
+
|
37
|
+
executor.final_output.tap(&:rewind).each_line { |line| $stdout.write line }
|
38
|
+
|
39
|
+
@heartbeat_thread.kill
|
40
|
+
client.close
|
41
|
+
rescue Errno::ECONNREFUSED
|
42
|
+
warn "\nServer at #{ENV.fetch("SPECWRK_SRV_URI", "http://localhost:5138")} is refusing connections, exiting..."
|
43
|
+
rescue Errno::ECONNRESET
|
44
|
+
warn "\nServer at #{ENV.fetch("SPECWRK_SRV_URI", "http://localhost:5138")} stopped responding to connections, exiting..."
|
45
|
+
end
|
46
|
+
|
47
|
+
def execute
|
48
|
+
executor.run client.fetch_examples
|
49
|
+
complete_examples
|
50
|
+
rescue UnhandledResponseError => e
|
51
|
+
# If fetching examples fails we can just try again so warn and return
|
52
|
+
warn e.message
|
53
|
+
end
|
54
|
+
|
55
|
+
def complete_examples
|
56
|
+
client.complete_examples executor.examples
|
57
|
+
rescue UnhandledResponseError => e
|
58
|
+
# I do not think we should so lightly abandon the completion of executed examples
|
59
|
+
# try to complete until successful or terminated
|
60
|
+
warn e.message
|
61
|
+
|
62
|
+
sleep 1
|
63
|
+
retry
|
64
|
+
end
|
65
|
+
|
66
|
+
def thump
|
67
|
+
while running && !Specwrk.force_quit
|
68
|
+
begin
|
69
|
+
client.heartbeat if client.last_request_at.nil? || client.last_request_at < Time.now - 10
|
70
|
+
rescue
|
71
|
+
warn "Heartbeat failed!"
|
72
|
+
end
|
73
|
+
|
74
|
+
sleep 1
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
attr_reader :running, :client, :executor
|
81
|
+
|
82
|
+
def warn(msg)
|
83
|
+
super("#{ENV.fetch("SPECWRK_ID", "specwrk-worker")}: #{msg}")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/specwrk.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "specwrk/version"
|
4
|
+
|
5
|
+
module Specwrk
|
6
|
+
Error = Class.new(StandardError)
|
7
|
+
|
8
|
+
# HTTP Client Errors
|
9
|
+
ClientError = Class.new(Error)
|
10
|
+
UnhandledResponseError = Class.new(ClientError)
|
11
|
+
NoMoreExamplesError = Class.new(ClientError)
|
12
|
+
CompletedAllExamplesError = Class.new(ClientError)
|
13
|
+
|
14
|
+
@force_quit = false
|
15
|
+
@starting_pid = Process.pid
|
16
|
+
|
17
|
+
class << self
|
18
|
+
attr_accessor :force_quit
|
19
|
+
attr_reader :starting_pid
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: specwrk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Daniel Westendorf
|
8
|
+
bindir: exe
|
9
|
+
cert_chain: []
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: dry-cli
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rack
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: webrick
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: rackup
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: rspec-core
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
type: :runtime
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: webmock
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: standard
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rspec
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
type: :development
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
email:
|
125
|
+
- daniel@prowestech.com
|
126
|
+
executables:
|
127
|
+
- specwrk
|
128
|
+
extensions: []
|
129
|
+
extra_rdoc_files: []
|
130
|
+
files:
|
131
|
+
- ".rspec"
|
132
|
+
- ".standard.yml"
|
133
|
+
- CHANGELOG.md
|
134
|
+
- LICENSE.txt
|
135
|
+
- README.md
|
136
|
+
- Rakefile
|
137
|
+
- exe/specwrk
|
138
|
+
- lib/specwrk.rb
|
139
|
+
- lib/specwrk/cli.rb
|
140
|
+
- lib/specwrk/cli_reporter.rb
|
141
|
+
- lib/specwrk/client.rb
|
142
|
+
- lib/specwrk/hookable.rb
|
143
|
+
- lib/specwrk/list_examples.rb
|
144
|
+
- lib/specwrk/queue.rb
|
145
|
+
- lib/specwrk/version.rb
|
146
|
+
- lib/specwrk/web.rb
|
147
|
+
- lib/specwrk/web/app.rb
|
148
|
+
- lib/specwrk/web/auth.rb
|
149
|
+
- lib/specwrk/web/endpoints.rb
|
150
|
+
- lib/specwrk/worker.rb
|
151
|
+
- lib/specwrk/worker/completion_formatter.rb
|
152
|
+
- lib/specwrk/worker/executor.rb
|
153
|
+
- lib/specwrk/worker/null_formatter.rb
|
154
|
+
- lib/specwrk/worker/progress_formatter.rb
|
155
|
+
homepage: https://github.com/danielwestendorf/specwrk
|
156
|
+
licenses:
|
157
|
+
- LGPLv3
|
158
|
+
metadata:
|
159
|
+
homepage_uri: https://github.com/danielwestendorf/specwrk
|
160
|
+
source_code_uri: https://github.com/danielwestendorf/specwrk
|
161
|
+
changelog_uri: https://github.com/danielwestendorf/specwrk/blob/main/CHANGELOG.md
|
162
|
+
rdoc_options: []
|
163
|
+
require_paths:
|
164
|
+
- lib
|
165
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - ">="
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: 3.0.0
|
170
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - ">="
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
requirements: []
|
176
|
+
rubygems_version: 3.6.7
|
177
|
+
specification_version: 4
|
178
|
+
summary: Parallel rspec test runner from a queue of pending jobs.
|
179
|
+
test_files: []
|