oyencov 0.0.8 → 0.0.10

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: 04c350bbf1306fce55e708d2526c3a470fc332e4439c088e7622cd43cdf2cb89
4
- data.tar.gz: 42218942c44d0f82127071bce83c9fa0ef5207d5e1a242b503144b7e5a656378
3
+ metadata.gz: 9a4f51c426c0d097999e548f0ba5920105655e1fbb04b731055573889239fb85
4
+ data.tar.gz: 57eee19f6e39579159c9175ee78faf3b8b7e6e40d8f1adb15fe85d325ee0c652
5
5
  SHA512:
6
- metadata.gz: 1440c17139801da23ee1588134628c544524c2bbc2e1ef4be9584a3673d9618d3a3f69ba76c6bb98d072720281bd02e80032696802b420536c964ae0158ebd34
7
- data.tar.gz: d24dd05b6f3b2a0d2caa0e65a3b0cf1cc803d6fdf6f6df1867cee8c2931751ce4f6ba949b15e2bd518e59ea4bfa35e82d9f959c841ef69effb59a6609b826860
6
+ metadata.gz: cf0d4fd53946d6fe3e43155a3dd9aa3dca94d81054a8b8b0789e29a3241cb26589f25e565fb0b31e4874ae5ec91f8e69c47defc275a4d2272259f4c8823ec7bf
7
+ data.tar.gz: 106e34406d36a110d79f21b536c0deaa304ff3ed927b100c7343917b5a6c4dbe0d05c70a400d84e69d2e97d5a7a918e3d1fa712474ca896a506c13d84f35dc45
@@ -27,7 +27,7 @@ module OyenCov
27
27
  begin
28
28
  response = get("/v1/data_submission_clearance")
29
29
 
30
- if Hash === response.body && response.body["status"] == "ok"
30
+ if Hash === response.body # && response.body["status"] == "ok"
31
31
  response.body
32
32
  else
33
33
  false
@@ -1,6 +1,7 @@
1
1
  require "securerandom"
2
2
  require "singleton"
3
3
  require_relative "api_connection"
4
+ require_relative "controller_tracking"
4
5
  require_relative "coverage_peek_delta"
5
6
  require_relative "logger"
6
7
 
@@ -16,18 +17,29 @@ require_relative "logger"
16
17
  #
17
18
  module OyenCov
18
19
  class Background
20
+ # Added to be more fork-aware. Ruby/Puma can fork a process copy-on-write,
21
+ # but it won't start the threads that are running in the parent process.
22
+ #
23
+ # If the PID > 0 but also not the current process_id, make the thread run.
24
+ @@running_pid = 0
25
+
19
26
  @loop_interval = 60 # seconds, can be set from server
20
- @semaphore = Mutex.new
21
27
  @thread = nil
22
28
  @reporter = nil
23
29
  @api_conn = OyenCov::APIConnection.instance
24
30
  @config = OyenCov.config
25
31
 
26
32
  def self.start
33
+ if @@running_pid == $$
34
+ OyenCov::Logger.log("OyenCov Background thread is already running.")
35
+ return false
36
+ end
37
+
27
38
  OyenCov::Logger.log(<<~TXT)
28
39
  Env: #{@config.mode}
29
- $PROGRAM_NAME: #{$PROGRAM_NAME || "nil"}
30
- @process_type: #{@config.process_type}
40
+ program_name: #{$PROGRAM_NAME || "nil"}
41
+ process_type: #{@config.process_type}
42
+ release/git_commit_sha: #{@config.release}
31
43
  Env vars set: #{ENV.keys.grep(/^OYENCOV_/)}
32
44
  TXT
33
45
 
@@ -43,7 +55,7 @@ module OyenCov
43
55
  clearance = @api_conn.get_data_submission_clearance
44
56
 
45
57
  unless clearance && clearance["status"] == "ok"
46
- OyenCov::Logger.log "Unable to obtain oyencov submission clearance. Stopping OyenCov background thread."
58
+ OyenCov::Logger.log "Unable to obtain oyencov submission clearance. Stopping OyenCov background thread. #{clearance.inspect}"
47
59
  Thread.stop
48
60
  end
49
61
 
@@ -77,6 +89,7 @@ module OyenCov
77
89
  OyenCov::Logger.log "POST runtime_report ok."
78
90
  else
79
91
  OyenCov::Logger.log "POST runtime_report failed. Stopping background thread."
92
+ @@running_pid = 0
80
93
  Thread.stop
81
94
  end
82
95
 
@@ -85,6 +98,8 @@ module OyenCov
85
98
  }
86
99
 
87
100
  @thread.run
101
+ OyenCov::Logger.log("OyenCov Background thread starts.")
102
+ @@running_pid = $$
88
103
 
89
104
  nil
90
105
  end
@@ -93,6 +108,7 @@ module OyenCov
93
108
  # For `test`, persist controller report.
94
109
  def self.stop
95
110
  @thread.stop
111
+ @@running_pid = 0
96
112
  end
97
113
 
98
114
  private_class_method
data/lib/oyencov/cli.rb CHANGED
@@ -82,11 +82,9 @@ module OyenCov
82
82
  "git_commit_sha" => options[:git_commit_sha]
83
83
  })
84
84
 
85
- # puts JSON.pretty_generate(collated_report)
86
-
87
- # Add metadaata
88
-
89
- ENV["OYENCOV_API_KEY"] ||= options[:token]
85
+ if options[:token]
86
+ ENV["OYENCOV_API_KEY"] = options[:token]
87
+ end
90
88
  unless ENV["OYENCOV_API_KEY"]
91
89
  warn "API token not set. Unable to submit."
92
90
  exit(1)
@@ -42,7 +42,7 @@ module OyenCov
42
42
 
43
43
  # Lots of ideas came from sentry-ruby, thanks to nate berkopec.
44
44
  def suggest_release
45
- release = `git rev-parse HEAD ||:`.strip
45
+ release = `git rev-parse HEAD 2>/dev/null || true`.strip
46
46
 
47
47
  if release == "" || release.nil?
48
48
  [".source_version", "REVISION"].each do |version_clue|
@@ -52,7 +52,8 @@ module OyenCov
52
52
  Bundler.root.join(version_clue)
53
53
  elsif defined?(Pathname.pwd) && Pathname.pwd
54
54
  Pathname.pwd.join(version_clue)
55
- else next
55
+ else
56
+ next
56
57
  end
57
58
 
58
59
  if File.exist?(version_clue_path)
@@ -85,10 +86,13 @@ module OyenCov
85
86
  end
86
87
  end
87
88
 
88
- if /^puma/.match?($PROGRAM_NAME)
89
- if defined?(Rails)
90
- return "rails-server"
91
- end
89
+ # If its cluster mode & we are in worker process, puma is at the beginning.
90
+ # If it's `bundle exec puma` then it comes in the end
91
+ #
92
+ # If it's booted up by puma not rails server, `Rails` module wont be defined.
93
+ # We will just assume puma = rails-server
94
+ if /^puma/.match?($0) || sliced_program_name == "puma"
95
+ return "rails-server"
92
96
  end
93
97
 
94
98
  # Rails can be server or rake task
@@ -12,7 +12,7 @@ module OyenCov
12
12
  if Exception === msg
13
13
  msg = msg.inspect
14
14
  end
15
- formatted_msg = msg.split("\n").map { |m| "#{ORANGE_TEXT}[OyenCov] #{m}#{RESET_COLOR}" }.join("\n")
15
+ formatted_msg = msg.split("\n").map { |m| "#{ORANGE_TEXT}[OyenCov] PID##{$$} #{m}#{RESET_COLOR}" }.join("\n")
16
16
 
17
17
  if level == 2
18
18
  warn formatted_msg
@@ -2,15 +2,30 @@ require "puma/plugin"
2
2
  require_relative "../../background"
3
3
  require_relative "../../logger"
4
4
 
5
- Puma::Plugin.create do
5
+ defined?(Puma::Plugin.create) && Puma::Plugin.create do
6
6
  OyenCov::Logger.log("Puma::Plugin.create running...")
7
7
 
8
8
  def config(c)
9
9
  OyenCov::Logger.log("Puma::Plugin.create config(c) running...")
10
10
 
11
+ c.on_booted do
12
+ OyenCov::Logger.log("Puma::Plugin.create config on_booted called")
13
+ OyenCov::Background.start
14
+ if defined?(Rails::Railtie)
15
+ load(File.expand_path("../../railtie.rb", File.dirname(__FILE__)))
16
+ else
17
+ OyenCov::Logger.log("on_booted: Railtie undefined 😭")
18
+ end
19
+ end
20
+
11
21
  c.on_worker_boot do
12
22
  OyenCov::Logger.log("Puma::Plugin.create config on_worker_boot called")
13
23
  OyenCov::Background.start
24
+ if defined?(Rails::Railtie)
25
+ load(File.expand_path("../../railtie.rb", File.dirname(__FILE__)))
26
+ else
27
+ OyenCov::Logger.log("on_worker_boot: Railtie undefined 😭")
28
+ end
14
29
  end
15
30
  end
16
31
  end
@@ -5,6 +5,9 @@ require_relative "logger"
5
5
 
6
6
  module OyenCov
7
7
  class Railtie < Rails::Railtie
8
+ @@controller_tracker_notification = nil
9
+
10
+ # This is only useful when `rails s` is run in lieu of webserver command first.
8
11
  def install_puma_hooks
9
12
  return unless defined?(Puma)
10
13
  OyenCov::Logger.log("Puma defined, installing puma hooks")
@@ -15,7 +18,7 @@ module OyenCov
15
18
  OyenCov::Logger.log("Load errors: #{e}")
16
19
  end
17
20
 
18
- # # Cluster mode
21
+ # Cluster mode
19
22
  if defined?(Puma::Plugin)
20
23
  OyenCov::Logger.log("Puma::Plugin defined, installing hooks for CLUSTER MODE")
21
24
  require_relative "puma/plugin/oyencov"
@@ -25,12 +28,14 @@ module OyenCov
25
28
  initializer "oyencov.configure" do
26
29
  OyenCov::Background.start
27
30
  install_puma_hooks
28
- end
29
31
 
30
- config.after_initialize do
31
- OyenCov::Logger.log("lib/oyencov/railtie.rb config.after_initialize")
32
+ if @@controller_tracker_notification.nil?
33
+ OyenCov::Logger.log "@@controller_tracker_notification is nil"
34
+ else
35
+ OyenCov::Logger.log "@@controller_tracker_notification is already set, Railtie init rerun."
36
+ end
32
37
 
33
- ActiveSupport::Notifications.subscribe("start_processing.action_controller") do |name, start, finish, id, payload|
38
+ @@controller_tracker_notification ||= ActiveSupport::Notifications.subscribe("start_processing.action_controller") do |name, start, finish, id, payload|
34
39
  ControllerTracking.bump("#{payload[:controller]}##{payload[:action]}")
35
40
  OyenCov::Logger.log "ControllerTracking.bump(#{payload[:controller]}##{payload[:action]})"
36
41
  end
@@ -1,3 +1,3 @@
1
1
  module OyenCov
2
- VERSION = "0.0.8".freeze
2
+ VERSION = "0.0.10".freeze
3
3
  end
data/lib/oyencov.rb CHANGED
@@ -3,17 +3,33 @@ require_relative "oyencov/simplecov_resultset_translator"
3
3
  require_relative "oyencov/version"
4
4
  require_relative "oyencov/logger"
5
5
 
6
- # For now, support only Rails. We bootstrap from Railtie.
6
+ # For now, support only Rails. We bootstrap background thread and controller tracking from Railtie.
7
7
  module OyenCov
8
8
  def self.config
9
9
  @config ||= OyenCov::Configuration.new
10
10
  end
11
11
 
12
+ # Sometimes oyencov cant start on their own, maybe when oyencov is loaded
13
+ # before Rails did.
14
+ #
15
+ # For Rails, put `OyenCov.start!` in `config/initializers/oyencov.rb`.
16
+ def self.start!
17
+ require_relative "oyencov/railtie"
18
+ end
19
+
12
20
  OyenCov::Logger.log("Hello! Booting from #{__FILE__}")
13
-
14
- OyenCov::Logger.log("Checking Rails existence")
21
+ OyenCov::Logger.log("Checking/Forcing Rails existence")
22
+
23
+ begin
24
+ require "rails"
25
+ rescue LoadError
26
+ # do nothing
27
+ end
28
+
15
29
  if defined?(Rails::Railtie) # && ENV["OYENCOV_API_KEY"]
16
- OyenCov::Logger.log("Starting Railtie")
30
+ OyenCov::Logger.log("Rails::Railtie already present, starting oyencov/railtie")
17
31
  require_relative "oyencov/railtie"
32
+ else
33
+ OyenCov::Logger.log("Rails::Railtie absent, cannot start tracking & reporting yet.")
18
34
  end
19
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oyencov
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anonoz Chong
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-23 00:00:00.000000000 Z
11
+ date: 2024-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday