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.
@@ -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: []