fast_ci 1.0.4 → 1.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 100456fb3e49ce9d12c4b8b12946e6e061e49e288bc304799d2c3d67d087c9d6
4
- data.tar.gz: 5ce5a82834b0b7e0b832cf42f380de6d957c37608833feae45f3832f10434fec
3
+ metadata.gz: 5d1b77a32be5c6217b8638a34cb4b56e71f70264772fb4ff3bb80a950a5e5f30
4
+ data.tar.gz: e2c37846aa46613428f39f27de80a0b9396aac514231ee2b1d6818d74ed0e2be
5
5
  SHA512:
6
- metadata.gz: 0617d4163115c25dbe16561982bc145ee867354643070aa7cc40925f1bbaf5b7638464691125d418a5c77660bfd4d486a9cc29c8eebe7b0125c678c1e443ee93
7
- data.tar.gz: 95c554a2fff6a99e11820c5cdc83c87d27fed0731847725f99e9176cb5907a5a269d19558e4ba40f0bce3db4db56ec02877dca19a5f6132b43acd0aa8ff29b3a
6
+ metadata.gz: 9747a1992088ae124fdee45dac860f31e5bfdafb7bd3d53ee32b5470116db2596774d439d89684487951bc01f3cea3d68e2682fba4b738f3882e3294e045596e
7
+ data.tar.gz: 2db8c9d842cf3c3d7ab4fe4992de6153d3ba5d709d5d7690bb1cef1d25040213b69e9bd092457aa50d1945daa13dfce48bf8c7ea4946866348b92d5741dd4d69
data/fast_ci.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = "Ruby wrapper for creating FastCI integrations"
13
13
  spec.homepage = "https://github.com/RubyCI/fast_ci_gem"
14
14
  spec.license = "MIT"
15
- spec.required_ruby_version = ">= 2.4.0"
15
+ spec.required_ruby_version = ">= 2.6.0"
16
16
 
17
17
  spec.metadata["homepage_uri"] = spec.homepage
18
18
  spec.metadata["source_code_uri"] = spec.homepage
@@ -26,10 +26,12 @@ Gem::Specification.new do |spec|
26
26
  spec.executables = ["fastci_rubycritic", "fastci_brakeman", "fastci_bundle_audit"]
27
27
  spec.require_paths = ["lib"]
28
28
 
29
- spec.add_dependency "console", "~> 1.21.0"
29
+ spec.add_dependency "console", ">= 1.10.0"
30
30
  spec.add_dependency "async-websocket", '<= 0.20.0'
31
+ spec.add_dependency "rspec-core", ">= 3.6.0"
32
+ spec.add_dependency "simplecov", ">= 0.22.0"
31
33
  spec.add_dependency "rubycritic", ">= 4.1.0"
32
34
  spec.add_dependency "brakeman", ">= 5.4.1"
33
- spec.add_dependency "minitest-rails", ">= 5.1"
35
+ spec.add_dependency "minitest-rails", ">= 2.2.1"
34
36
  spec.add_development_dependency "pry"
35
37
  end
@@ -4,57 +4,9 @@ module FastCI
4
4
  class RspecFormatter
5
5
  attr_reader :current_test_key
6
6
 
7
- def initialize(output)
8
- @output = output
9
- @event_output = {}
7
+ def initialize
8
+ @output = {}
10
9
  @is_failed = false
11
- @current_path = []
12
- @current_path_started_at = []
13
- @max_heap_live_num = 0
14
- @dup_stdout = STDOUT.clone
15
- @events = []
16
-
17
- $stdout = StringIO.new()
18
-
19
- @log_thread = Thread.new do
20
- loop do
21
- sleep 10
22
- check_heap_live_num
23
- @should_send_events = true
24
- end
25
- end
26
- end
27
-
28
- def time_now
29
- time_frozen? ? Timecop.return { Time.now } : Time.now
30
- end
31
-
32
- def time_frozen?
33
- return unless defined?(Timecop)
34
- Timecop.frozen?
35
- end
36
-
37
- def rspec_runner_index
38
- ENV["TEST_ENV_NUMBER"]
39
- end
40
-
41
- def send_events
42
- @should_send_events = false
43
-
44
- if @events.length > 0
45
- json_events = {
46
- build_id: FastCI.configuration.orig_build_id,
47
- compressed_data: Base64.strict_encode64(Zlib::Deflate.deflate(JSON.fast_generate(@events), 9)),
48
- }
49
-
50
- FastCI.send_events(json_events)
51
-
52
- @events = []
53
- end
54
- end
55
-
56
- def check_heap_live_num
57
- @max_heap_live_num = [@max_heap_live_num, GC.stat[:heap_live_slots] || GC.stat[:heap_live_num]].max
58
10
  end
59
11
 
60
12
  def passed?
@@ -65,100 +17,13 @@ module FastCI
65
17
  @current_test_key = value
66
18
  end
67
19
 
68
- def start(start_notification)
69
- # $stderr = $stdout
70
-
71
- data = {
72
- load_time: start_notification.load_time,
73
- example_count: start_notification.count,
74
- started_at: time_now.to_s
75
- }
76
-
77
- return if running_only_failed? ||
78
- running_gem_or_engine? ||
79
- ENV["EXTRA_SLOWER_RUN"]
80
-
81
- msg(:start, data)
82
- end
83
-
84
- def close(null_notification)
85
- # check_heap_live_num
86
- msg(:gc_stat, GC.stat.merge(max_heap_live_num: @max_heap_live_num))
87
- unless running_only_failed? || ENV["EXTRA_SLOWER_RUN"] || running_gem_or_engine?
88
- msg(:close, {final_output: get_output})
89
- end
90
- send_events
91
- $stdout = @dup_stdout
92
- end
93
-
94
- def example_group_started(group_notification)
95
- metadata = group_notification.group.metadata
96
- @current_path_started_at << time_now
97
-
98
- if @current_path.size == 0
99
- @example_failed_index = 0
100
- file_path = metadata[:file_path].gsub("./".freeze, "".freeze)
101
- file_path = [ENV["DIR_PREFIX"], file_path].join("/") if ENV["DIR_PREFIX"]
102
- @current_path << file_path
103
- end
104
-
105
- @current_path << id(metadata)
106
-
107
- msg(:group_started, [
108
- path_with_file(group_notification.group),
109
- {
110
- line_number: metadata[:line_number],
111
- description: metadata[:description],
112
- }
113
- ])
114
- end
115
-
116
- def example_started(example_notification)
117
- @output_before = get_output
118
- end
119
-
120
- def example_passed(example_notification)
121
- metadata = example_notification.example.metadata
122
- broadcast_example_finished(serialize_example(metadata, "passed".freeze), example_notification.example)
123
- end
124
-
125
- def example_failed(example_notification)
126
- @example_failed_index += 1
127
- metadata = example_notification.example.metadata
128
- fully_formatted = example_notification.fully_formatted(@example_failed_index, ::RSpec::Core::Formatters::ConsoleCodes)
129
-
130
- broadcast_example_finished(
131
- serialize_example(metadata, "failed".freeze, fully_formatted),
132
- example_notification.example
133
- )
134
- end
135
-
136
- def example_pending(example_notification)
137
- metadata = example_notification.example.metadata
138
- broadcast_example_finished(
139
- serialize_example(metadata, "pending".freeze),
140
- example_notification.example
141
- )
142
- end
143
-
144
- def example_group_finished(group_notification)
145
- run_time = time_now - @current_path_started_at.pop
146
- if (run_time < 0) || (run_time > 2400)
147
- run_time = 0.525
148
- end
149
- msg(:group_finished, [path_with_file(group_notification.group), {run_time: run_time}])
150
- # msg(:group_finished, [@current_path.map(&:to_s), {run_time: run_time}])
151
- @current_path.pop
152
- @current_path.pop if @current_path.size == 1 # Remove the file_path at the beggining
153
- end
154
-
155
20
  def example_finished(notification)
156
21
  example = notification.example
157
22
  metadata = example.metadata
158
23
 
159
24
  *example_group_ids, example_id = metadata[:scoped_id].split(":")
160
25
 
161
- file_output = @event_output[current_test_key] ||= {}
26
+ file_output = @output[current_test_key] ||= {}
162
27
 
163
28
  example_group = example_group_ids.reduce(file_output) do |output, scope_id|
164
29
  output[scope_id] ||= {}
@@ -184,91 +49,9 @@ module FastCI
184
49
  end
185
50
 
186
51
  def dump_and_reset
187
- event_output = @event_output
188
- @event_output = {}
189
- event_output
190
- end
191
-
192
- def path_with_file(group)
193
- file_path = group.parent_groups.last.file_path.gsub("./".freeze, "".freeze)
194
-
195
- group.metadata[:scoped_id].split(":").unshift(file_path)
196
- end
197
-
198
- private
199
-
200
- def running_gem_or_engine?
201
- !!ENV["DIR_PREFIX"]
202
- end
203
-
204
- def running_only_failed?
205
- !!ENV["RERUN_FAILED_FILES"]
206
- end
207
-
208
- def serialize_example(metadata, status, fully_formatted = nil)
209
- run_time = metadata[:execution_result].run_time
210
- if (run_time < 0) || (run_time > 2400)
211
- run_time = 0.525
212
- end
213
-
214
- result = {
215
- id: id(metadata),
216
- status: status,
217
- line_number: metadata[:line_number].to_s,
218
- description: metadata[:description],
219
- run_time: run_time,
220
- fully_formatted: fully_formatted,
221
- scoped_id: metadata[:scoped_id],
222
- }.compact
223
-
224
- result[:gem_or_engine] = true if running_gem_or_engine?
225
-
226
- if running_only_failed?
227
- result[:reruned] = true
228
- elsif status == "failed" && !running_gem_or_engine?
229
- File.write('tmp/rspec_failures', "#{@current_path.first}[#{metadata[:scoped_id]}]", mode: 'a+')
230
- end
231
-
232
- if status == "failed"
233
- img_path = metadata.dig(:screenshot, :image) ||
234
- fully_formatted&.scan(/\[Screenshot Image\]: (.*)$/).flatten.first&.strip&.chomp ||
235
- fully_formatted&.scan(/\[Screenshot\]: (.*)$/).flatten.first&.strip&.chomp
236
-
237
- if img_path && File.exist?(img_path)
238
- STDOUT.puts "SCREENSHOT!"
239
- result[:screenshots_base64] ||= []
240
- result[:screenshots_base64] << Base64.strict_encode64(File.read(img_path))
241
- end
242
- end
243
- @last_example_finished_at = time_now
244
- # TODO annalyze this: run_time: metadata[:execution_result].run_time,
245
- result
246
- end
247
-
248
- def msg(event, data)
249
- @events << ["rspec_#{event}".upcase, [rspec_runner_index, data]]
250
- end
251
-
252
- def id(metadata)
253
- metadata[:scoped_id].split(":").last || raise("No scoped id")
254
- end
255
-
256
- def broadcast_example_finished(data, example)
257
- msg(:example_finished, [
258
- path_with_file(example.example_group),
259
- data.merge(output_inside: get_output, output_before: @output_before)
260
- ])
261
-
262
- send_events if @should_send_events
263
- end
264
-
265
- def get_output
266
- return if $stdout.pos == 0
267
- $stdout.rewind
268
- res = $stdout.read
269
- $stdout.flush
270
- $stdout.rewind
271
- res
52
+ output = @output
53
+ @output = {}
54
+ output
272
55
  end
273
56
  end
274
57
  end
@@ -6,11 +6,13 @@ module FastCI
6
6
  module RunnerPrepend
7
7
  def run_specs(example_groups)
8
8
  @rspec_started_at = Time.now
9
- json_events = {
10
- build_id: FastCI.configuration.orig_build_id,
11
- compressed_data: Base64.strict_encode64(Zlib::Deflate.deflate(JSON.fast_generate([['RSPEC_RUN', { started_at: @rspec_started_at, test_env_number: ENV["TEST_ENV_NUMBER"] }]]), 9)),
12
- }
13
- FastCI.send_events(json_events)
9
+ if ENV['FSCI_REMOTE_TESTS'] == 'true'
10
+ json_events = {
11
+ build_id: FastCI.configuration.orig_build_id,
12
+ compressed_data: Base64.strict_encode64(Zlib::Deflate.deflate(JSON.fast_generate([['RSPEC_RUN', { started_at: @rspec_started_at, test_env_number: ENV["TEST_ENV_NUMBER"] }]]), 9)),
13
+ }
14
+ FastCI.send_events(json_events)
15
+ end
14
16
 
15
17
  examples_count = @world.example_count(example_groups)
16
18
 
@@ -50,19 +52,9 @@ module FastCI
50
52
  return @configuration.failure_exit_code
51
53
  end
52
54
 
53
- formatter = FastCI::RspecFormatter.new(STDOUT)
55
+ formatter = FastCI::RspecFormatter.new
54
56
 
55
57
  reporter.register_listener(formatter, :example_finished)
56
- if ENV['FSCI_REMOTE_TESTS'] == 'true'
57
- reporter.register_listener(formatter, :start)
58
- reporter.register_listener(formatter, :example_group_started)
59
- reporter.register_listener(formatter, :example_started)
60
- reporter.register_listener(formatter, :example_passed)
61
- reporter.register_listener(formatter, :example_failed)
62
- reporter.register_listener(formatter, :example_pending)
63
- reporter.register_listener(formatter, :example_group_finished)
64
- reporter.register_listener(formatter, :close)
65
- end
66
58
 
67
59
  FastCI.rspec_ws.on(:deq) do |tests|
68
60
  tests.each do |test|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FastCI
4
- VERSION = "1.0.4"
4
+ VERSION = "1.0.5"
5
5
  end
data/lib/fast_ci.rb CHANGED
@@ -55,7 +55,7 @@ module FastCI
55
55
  end
56
56
 
57
57
  def debug(msg)
58
- puts "\n\e[36mDEBUG: \e[0m #{msg}\n" if ENV["fast_ci_DEBUG"]
58
+ puts "\n\e[36mDEBUG: \e[0m #{msg}\n" if ENV["FAST_CI_DEBUG"]
59
59
  end
60
60
 
61
61
  def report_options(run_key, content)
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nesha Zoric
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-08 00:00:00.000000000 Z
11
+ date: 2024-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: console
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.21.0
19
+ version: 1.10.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.21.0
26
+ version: 1.10.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: async-websocket
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - "<="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.20.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-core
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 3.6.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 3.6.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.22.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.22.0
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rubycritic
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +100,14 @@ dependencies:
72
100
  requirements:
73
101
  - - ">="
74
102
  - !ruby/object:Gem::Version
75
- version: '5.1'
103
+ version: 2.2.1
76
104
  type: :runtime
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
108
  - - ">="
81
109
  - !ruby/object:Gem::Version
82
- version: '5.1'
110
+ version: 2.2.1
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: pry
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -152,7 +180,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
180
  requirements:
153
181
  - - ">="
154
182
  - !ruby/object:Gem::Version
155
- version: 2.4.0
183
+ version: 2.6.0
156
184
  required_rubygems_version: !ruby/object:Gem::Requirement
157
185
  requirements:
158
186
  - - ">="