test_bench-parallel 0.0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5073d58e8db74392df639212009500be3125c22480ec93e952b95134d09d91cd
4
+ data.tar.gz: df087d665f30b6bdd75806661d7ef18974daac9664f061877f00cc2180486dbc
5
+ SHA512:
6
+ metadata.gz: ab1c248d3433219d90773a9451a69ecb2eaaa1ce04b67eea7e67898c2c0b7ab902d69b92ba47bac269e56f5bbacd5b9f833035c1d07a0679f085a41f62d190ab
7
+ data.tar.gz: 1e5f90dec29303652be615504cd48f8197ba49ace51dd6d6b395b0143dbb0daf62d388cb2f86f76274dba01c40e143f07640435d63b9d02a14dc40837b436bbf
File without changes
@@ -0,0 +1,11 @@
1
+ module TestBench
2
+ module Parallel
3
+ module Run
4
+ def self.call(path, exclude: nil)
5
+ parallel_session = Session.build
6
+
7
+ TestBench::Run.(path, exclude:, session: parallel_session)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,143 @@
1
+ module TestBench
2
+ module Parallel
3
+ class Session
4
+ attr_reader :session
5
+ attr_reader :processes
6
+
7
+ attr_accessor :threads
8
+ attr_accessor :file_path_queue
9
+ attr_accessor :telemetry_queue
10
+
11
+ def pending_file_count
12
+ @pending_file_count ||= 0
13
+ end
14
+ attr_writer :pending_file_count
15
+
16
+ def initialize(session, processes)
17
+ @session = session
18
+ @processes = processes
19
+ end
20
+
21
+ def self.build(processes: nil)
22
+ processes ||= Defaults.processes
23
+
24
+ session = self.establish_session
25
+
26
+ new(session, processes)
27
+ end
28
+
29
+ def self.establish_session
30
+ TestBench::Run.establish_session
31
+ end
32
+
33
+ def register_telemetry_sink(...)
34
+ session.register_telemetry_sink(...)
35
+ end
36
+
37
+ def result(...)
38
+ session.result(...)
39
+ end
40
+
41
+ def execute(file_path)
42
+ start if not started?
43
+
44
+ file_path_queue.push(file_path)
45
+
46
+ self.pending_file_count += 1
47
+
48
+ until pending_file_count <= threads.count
49
+ update
50
+ end
51
+ end
52
+
53
+ def close
54
+ file_path_queue.close
55
+
56
+ until threads.empty?
57
+ update
58
+
59
+ threads.delete_if do |thread|
60
+ !thread.alive?
61
+ end
62
+ end
63
+ end
64
+
65
+ def update
66
+ timeout_milliseconds = 100
67
+ timeout_seconds = Rational(timeout_milliseconds, 1_000)
68
+
69
+ while event_data_batch = telemetry_queue.pop(timeout: timeout_seconds)
70
+ event_data_batch.each do |event_data|
71
+ session.record_event(event_data)
72
+
73
+ case event_data
74
+ when TestBench::Session::Events::FileExecuted
75
+ self.pending_file_count -= 1
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def started?
82
+ !threads.nil?
83
+ end
84
+
85
+ def start
86
+ self.file_path_queue = Queue.new
87
+ self.telemetry_queue = Queue.new
88
+
89
+ self.threads = processes.times.map do |process|
90
+ Thread.new do
91
+ session = TestBench::Session.build
92
+
93
+ telemetry_sink = TelemetrySink.new(telemetry_queue)
94
+ session.register_telemetry_sink(telemetry_sink)
95
+
96
+ while file_path = file_path_queue.pop
97
+ session.execute(file_path)
98
+
99
+ telemetry_sink.flush
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ class TelemetrySink
106
+ include Telemetry::Sink
107
+
108
+ def event_data_batch
109
+ @event_data_batch ||= []
110
+ end
111
+ attr_writer :event_data_batch
112
+
113
+ attr_reader :queue
114
+
115
+ def initialize(queue)
116
+ @queue = queue
117
+ end
118
+
119
+ def receive(event_data)
120
+ event_data_batch.push(event_data)
121
+ end
122
+
123
+ def flush
124
+ queue.push(event_data_batch)
125
+
126
+ self.event_data_batch = nil
127
+ end
128
+ end
129
+
130
+ module Defaults
131
+ def self.processes
132
+ env_processes = ENV['TEST_BENCH_PARALLEL_PROCESSES']
133
+
134
+ if not env_processes.nil?
135
+ env_processes.to_i
136
+ else
137
+ Etc.nprocessors
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,6 @@
1
+ require 'etc'
2
+
3
+ require 'test_bench/run'
4
+
5
+ require 'test_bench/parallel/session'
6
+ require 'test_bench/parallel/run'
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: test_bench-parallel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brightworks Digital
8
+ bindir: bin
9
+ cert_chain: []
10
+ dependencies:
11
+ - !ruby/object:Gem::Dependency
12
+ name: test_bench-run
13
+ requirement: !ruby/object:Gem::Requirement
14
+ requirements:
15
+ - - ">="
16
+ - !ruby/object:Gem::Version
17
+ version: '0'
18
+ type: :runtime
19
+ prerelease: false
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ - !ruby/object:Gem::Dependency
26
+ name: test_bench
27
+ requirement: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
32
+ type: :development
33
+ prerelease: false
34
+ version_requirements: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ description: Parallel runner for projects that use TestBench
40
+ email: development@bright.works
41
+ executables: []
42
+ extensions: []
43
+ extra_rdoc_files: []
44
+ files:
45
+ - lib/test_bench
46
+ - lib/test_bench/parallel
47
+ - lib/test_bench/parallel/controls.rb
48
+ - lib/test_bench/parallel/run.rb
49
+ - lib/test_bench/parallel/session.rb
50
+ - lib/test_bench/parallel.rb
51
+ homepage: http://test-bench.software
52
+ licenses:
53
+ - MIT
54
+ metadata:
55
+ homepage_uri: http://test-bench.software
56
+ source_code_uri: https://github.com/test-bench/test-bench-parallel
57
+ allowed_push_host: https://rubygems.org
58
+ namespace: TestBench::Parallel
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubygems_version: 3.6.9
74
+ specification_version: 4
75
+ summary: Parallel runner for projects that use TestBench
76
+ test_files: []