oyencov 0.0.3 → 0.0.4

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: c102e275b55a04670f66472c988915b439ffff0bb1244bf030ced28a91f41d2f
4
- data.tar.gz: 5eca0a2836563c253c2a4d6d632847f54e2947e146a927e53d2e9f87889ecc17
3
+ metadata.gz: c88552b88f48f6474413438e3b4043802ead52f3db1b9d26642468f361dc15cc
4
+ data.tar.gz: 9e5244ef06ef4d24911ac0e86d58986bb36de6b2f660b0412e93f3e8a08f9014
5
5
  SHA512:
6
- metadata.gz: d7096ed5ab32b52780d50003774e747fcd5790133e5f31060ab25081d3f620608690c58d9aa548e9cd8f2898c2124799e21277555ac2941205c0530ada877876
7
- data.tar.gz: ce29ca45cdd0a10c8fa03fe31dfa3959ece15af843deb5962775094d93e3e58682ab7ca187980f3afdef191495264a7bc3c029a2f26d013cb282e7d34c8e20a4
6
+ metadata.gz: 8a50ad8ce049257eb6f6c93f3316cc59efaefcf1f2fcace72bd5d072d4e3c123bc4dafd2c1f8e974bc72d1ecf0786dda47ef2aa144d9ee446e8e6832721ba049
7
+ data.tar.gz: a95d62de2c84555c2935f826271f09473ebf85f77c041f32823724d091b7b149035976f5ca3a4c5f451950d81b79ea74d626c2185d6fdf08de403ce51f67ed71
checksums.yaml.gz.sig CHANGED
@@ -1 +1 @@
1
- ���S����e)�Ȃ��!����v6P�B���Ϻ���<�g4�<��[j�����K��u-+���~Y���]X5��q
1
+ dzw�@�_<m�] �b+S h�T-%$A���C$�/�$(<��ָ28�'���J�� :\���@GnW�̠�Ud�M����9���0���g�d��ミ:r*|*�
@@ -1,6 +1,7 @@
1
1
  require "faraday"
2
2
  require "singleton"
3
3
  require_relative "version"
4
+ require_relative "logger"
4
5
 
5
6
  module OyenCov
6
7
  class APIConnection < Faraday::Connection
@@ -26,9 +27,7 @@ module OyenCov
26
27
  begin
27
28
  response = get("/v1/data_submission_clearance")
28
29
  rescue Faraday::Error => e
29
- if ENV["OYENCOV_DEBUG"]
30
- warn(e)
31
- end
30
+ OyenCov::Logger.log(e, 2)
32
31
 
33
32
  if attempts > 0
34
33
  attempts -= 1
@@ -2,6 +2,7 @@ require "securerandom"
2
2
  require "singleton"
3
3
  require_relative "api_connection"
4
4
  require_relative "coverage_peek_delta"
5
+ require_relative "logger"
5
6
 
6
7
  # Bootstrap the thread that starts Coverage module data collection.
7
8
  #
@@ -23,11 +24,12 @@ module OyenCov
23
24
  @config = OyenCov.config
24
25
 
25
26
  def self.start
26
- if ENV["OYENCOV_DEBUG"]
27
- puts "[OyenCov] Env: #{Rails.env}"
28
- puts "[OyenCov] $PROGRAM_NAME: #{$PROGRAM_NAME || "nil"}"
29
- puts "[OyenCov] @process_type: #{@config.process_type}"
30
- end
27
+ OyenCov::Logger.log(<<~TXT)
28
+ Env: #{@config.mode}
29
+ $PROGRAM_NAME: #{$PROGRAM_NAME || "nil"}
30
+ @process_type: #{@config.process_type}
31
+ Env vars set: #{ENV.keys.grep(/^OYENCOV_/)}
32
+ TXT
31
33
 
32
34
  # Start `Coverage` as soon as possible before other codes are loaded
33
35
  CoveragePeekDelta.start
@@ -41,35 +43,41 @@ module OyenCov
41
43
  clearance = @api_conn.get_data_submission_clearance
42
44
 
43
45
  if clearance.nil?
44
- puts "[OyenCov] Unable to obtain oyencov submission clearance. Stopping OyenCov background thread."
46
+ OyenCov::Logger.log "Unable to obtain oyencov submission clearance. Stopping OyenCov background thread."
45
47
  Thread.stop
46
48
  end
47
49
 
48
- if ENV["OYENCOV_DEBUG"]
49
- puts(clearance.body)
50
- end
50
+ # OyenCov::Logger.log("clearance.body:-\n" + clearance.body)
51
51
  end
52
52
 
53
53
  @config.mode == "production" && loop do
54
54
  sleep(@loop_interval + 3 - rand(6))
55
55
  new_method_hits = CoveragePeekDelta.snapshot_delta
56
+ OyenCov::Logger.log "ControllerTracking.hits = #{ControllerTracking.hits}"
56
57
  new_controller_hits = ControllerTracking.snapshot_and_reset!
57
58
 
58
- puts new_method_hits
59
-
60
59
  runtime_report = {
61
- git_commit_sha: @config.release,
62
60
  controller_action_hits: new_controller_hits,
63
61
  method_hits: new_method_hits
64
62
  }
63
+
64
+ unless runtime_report.values.any?(&:any?)
65
+ OyenCov::Logger.log("All #{runtime_report.keys.join(", ")} are empty. Skipping submission.")
66
+ next
67
+ end
68
+
69
+ runtime_report[:git_commit_sha] = @config.release
70
+
65
71
  response = @api_conn.post_runtime_report(runtime_report)
66
72
 
67
73
  if response && response.body["status"] == "ok"
68
- puts "[OyenCov] POST runtime_report ok."
74
+ OyenCov::Logger.log "POST runtime_report ok."
69
75
  else
70
- warn "[OyenCov] POST runtime_report failed. Stopping background thread."
76
+ OyenCov::Logger.log "POST runtime_report failed. Stopping background thread."
71
77
  Thread.stop
72
78
  end
79
+
80
+ # TODO: Set new interval & wiggle.
73
81
  end # loop
74
82
  }
75
83
 
data/lib/oyencov/cli.rb CHANGED
@@ -2,6 +2,7 @@ require "thor"
2
2
  require_relative "api_connection"
3
3
  require_relative "test_report_merger"
4
4
  require_relative "simplecov_resultset_translator"
5
+ require_relative "logger"
5
6
 
6
7
  # Bootstrapped from `bin/oyencov`
7
8
  #
@@ -68,12 +69,12 @@ module OyenCov
68
69
  option :token
69
70
  def submit
70
71
  resultset_files = options[:files]
71
- ENV["OYENCOV_DEBUG"] && if resultset_files.any?
72
- puts "Found #{resultset_files.join(", ")}"
73
- else
74
- puts "No resultset files found"
75
- exit 1
76
- end
72
+ if resultset_files.any?
73
+ OyenCov::Logger.log "Found #{resultset_files.join(", ")}"
74
+ else
75
+ puts "No resultset files found"
76
+ exit 1
77
+ end
77
78
 
78
79
  collated_report = OyenCov::TestReportMerger
79
80
  .collate_job_reports(options[:files])
@@ -13,7 +13,7 @@ module OyenCov
13
13
  PROGRAM_NAME
14
14
  ]
15
15
 
16
- attr :api_key, :api_url, :mode, :including_file_paths, :excluding_file_paths, :release, :test_reporting_dir, :test_resultset_path, :program_name, :process_type
16
+ attr_reader :api_key, :api_url, :mode, :including_file_paths, :excluding_file_paths, :release, :test_reporting_dir, :test_resultset_path, :program_name, :process_type
17
17
 
18
18
  def initialize
19
19
  reset_to_defaults
@@ -60,7 +60,6 @@ module OyenCov
60
60
  #
61
61
  # Method 1: $PROGRAM_NAME.split("/")[-1]
62
62
  def suggest_process_type
63
- answer = nil
64
63
  sliced_program_name = File.basename($PROGRAM_NAME)
65
64
 
66
65
  if %w[sidekiq resque].include?(sliced_program_name)
@@ -1,21 +1,33 @@
1
+ require_relative "logger"
2
+
1
3
  # This module is merely the container data structure.
2
4
  #
3
5
  # The ACTUAL code that tracks controller is in `railtie.rb`
4
6
  module OyenCov
5
7
  module ControllerTracking
6
- @hits = {}
8
+ @@hits = {}
9
+
10
+ def self.hits
11
+ @@hits
12
+ end
7
13
 
8
14
  def self.bump(controller_action_name)
9
- if @hits[controller_action_name]
10
- @hits[controller_action_name] += 1
15
+ if @@hits[controller_action_name]
16
+ @@hits[controller_action_name] += 1
11
17
  else
12
- @hits[controller_action_name] = 1
18
+ @@hits[controller_action_name] = 1
13
19
  end
20
+
21
+ OyenCov::Logger.log "ControllerTracking.bump self.object_id = #{object_id}"
22
+ OyenCov::Logger.log "ControllerTracking.bump @@hits[#{controller_action_name}] = #{@@hits[controller_action_name]}"
14
23
  end
15
24
 
16
25
  def self.snapshot_and_reset!
17
- current_hits = @hits
18
- @hits = {}
26
+ OyenCov::Logger.log "ControllerTracking.snapshot_and_reset! self.object_id = #{object_id}"
27
+ OyenCov::Logger.log "ControllerTracking.snapshot_and_reset! @@hits = #{@@hits}"
28
+
29
+ current_hits = @@hits.dup
30
+ @@hits = {}
19
31
  current_hits
20
32
  end
21
33
  end
@@ -1,5 +1,6 @@
1
1
  require "coverage"
2
2
  require_relative "method_range_parser"
3
+ require_relative "logger"
3
4
 
4
5
  # `CoveragePeekDelta` utility is meant to take...
5
6
  #
@@ -28,9 +29,7 @@ module OyenCov
28
29
  def self.snapshot_delta
29
30
  current_peek = Coverage.peek_result
30
31
 
31
- if ENV["OYENCOV_DEBUG"]
32
- $stdout.puts "current_peek size = #{current_peek.size}, keys like: #{current_peek.keys[0, 3]}"
33
- end
32
+ # OyenCov::Logger.log "1st current_peek size = #{current_peek.size}, keys like: #{current_peek.keys[0, 3]}"
34
33
 
35
34
  # Filter into project
36
35
  filtered = current_peek.select do |k, _|
@@ -39,18 +38,14 @@ module OyenCov
39
38
  k.gsub(/#{PWD}\//o, "")
40
39
  end
41
40
 
42
- if ENV["OYENCOV_DEBUG"]
43
- $stdout.puts "filtered size = #{filtered.size}, keys like: #{filtered.keys[0, 3]}"
44
- end
41
+ # OyenCov::Logger.log "2nd filtered size = #{filtered.size}, keys like: #{filtered.keys[0, 3]}"
45
42
 
46
43
  # Filter inside project to just the paths
47
44
  filtered = filtered.select do |k, _|
48
45
  /^(app|lib)/.match?(k)
49
46
  end
50
47
 
51
- if ENV["OYENCOV_DEBUG"]
52
- $stdout.puts "filtered size = #{filtered.size}, keys like: #{filtered.keys[0, 3]}"
53
- end
48
+ # OyenCov::Logger.log "3rd filtered size = #{filtered.size}, keys like: #{filtered.keys[0, 3]}"
54
49
 
55
50
  # Find the method ranges, set
56
51
  current_method_hits = {}
@@ -0,0 +1,24 @@
1
+ module OyenCov
2
+ module Logger
3
+ # ANSI escape code for orange text
4
+ ORANGE_TEXT = "\e[38;5;214m"
5
+ RESET_COLOR = "\e[0m"
6
+
7
+ # Level 0 = stdout for common users
8
+ # Level 1 = debug stdout
9
+ # Level 2 = debug stderr
10
+ def self.log(msg, level = 1)
11
+ return unless ENV["OYENCOV_DEBUG"] || level == 0
12
+ if Exception === msg
13
+ msg = msg.inspect
14
+ end
15
+ formatted_msg = msg.split("\n").map { |m| "#{ORANGE_TEXT}[OyenCov] #{m}#{RESET_COLOR}" }.join("\n")
16
+
17
+ if level == 2
18
+ warn formatted_msg
19
+ else
20
+ puts formatted_msg
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ require "puma/plugin"
2
+ require_relative "../../background"
3
+ require_relative "../../logger"
4
+
5
+ Puma::Plugin.create do
6
+ OyenCov::Logger.log("Puma::Plugin.create running...")
7
+
8
+ def config(c)
9
+ OyenCov::Logger.log("Puma::Plugin.create config(c) running...")
10
+
11
+ c.on_worker_boot do
12
+ OyenCov::Logger.log("Puma::Plugin.create config on_worker_boot called")
13
+ OyenCov::Background.start
14
+ end
15
+ end
16
+ end
@@ -1,24 +1,43 @@
1
1
  require_relative "background"
2
2
  require_relative "controller_tracking"
3
3
  require_relative "test_reporting"
4
+ require_relative "logger"
4
5
 
5
6
  module OyenCov
6
7
  class Railtie < Rails::Railtie
8
+ def install_puma_hooks
9
+ return unless defined?(Puma)
10
+ OyenCov::Logger.log("Puma defined, installing puma hooks")
11
+
12
+ begin
13
+ require "puma/plugin"
14
+ rescue LoadError => e
15
+ OyenCov::Logger.log("Load errors: #{e}")
16
+ end
17
+
18
+ # # Cluster mode
19
+ if defined?(Puma::Plugin)
20
+ OyenCov::Logger.log("Puma::Plugin defined, installing hooks for CLUSTER MODE")
21
+ require_relative "puma/plugin/oyencov"
22
+ end
23
+ end
24
+
7
25
  initializer "oyencov.configure" do
8
- # puts "lib/oyencov/railtie.rb initializer oyencov.configure"
9
26
  OyenCov::Background.start
27
+ install_puma_hooks
10
28
  end
11
29
 
12
30
  config.after_initialize do
13
- !!ENV["OYENCOV_DEBUG"] && puts("lib/oyencov/railtie.rb config.after_initialize")
31
+ OyenCov::Logger.log("lib/oyencov/railtie.rb config.after_initialize")
32
+
14
33
  ActiveSupport::Notifications.subscribe("start_processing.action_controller") do |name, start, finish, id, payload|
15
- # puts(payload)
16
34
  ControllerTracking.bump("#{payload[:controller]}##{payload[:action]}")
35
+ OyenCov::Logger.log "ControllerTracking.bump(#{payload[:controller]}##{payload[:action]})"
17
36
  end
18
37
 
19
38
  if OyenCov.config.mode == "test"
20
39
  at_exit do
21
- !!ENV["OYENCOV_DEBUG"] && puts("[OyenCov] Testing mode, persisting rails controller action data.")
40
+ OyenCov::Logger.log("Testing mode, persisting rails controller action data.")
22
41
  OyenCov::TestReporting.persist_controller_actions!
23
42
  end
24
43
  end
@@ -36,7 +36,7 @@ module OyenCov
36
36
  all_methods_hits = resultset[resultset.keys[0]]["coverage"].each_pair.map do |file_path, file_attr|
37
37
  # file_path = file_path.gsub(/#{PWD}\//o, "")
38
38
  line_hits = file_attr["lines"]
39
- methods_hits = MethodRangeParser[file_path]&.each_pair&.map do |method_name, line_num|
39
+ MethodRangeParser[file_path]&.each_pair&.map do |method_name, line_num|
40
40
  next if line_num.nil? || line_hits[line_num].nil?
41
41
  [method_name, line_hits[line_num]]
42
42
  end&.compact.to_h
@@ -1,3 +1,3 @@
1
1
  module OyenCov
2
- VERSION = "0.0.3".freeze
2
+ VERSION = "0.0.4".freeze
3
3
  end
data/lib/oyencov.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require_relative "oyencov/configuration"
2
2
  require_relative "oyencov/simplecov_resultset_translator"
3
3
  require_relative "oyencov/version"
4
+ require_relative "oyencov/logger"
4
5
 
5
6
  # For now, support only Rails. We bootstrap from Railtie.
6
7
  module OyenCov
@@ -8,9 +9,9 @@ module OyenCov
8
9
  @config ||= OyenCov::Configuration.new
9
10
  end
10
11
 
11
- !!ENV["OYENCOV_DEBUG"] && puts("[OyenCov] Checking Rails existence")
12
+ OyenCov::Logger.log("Checking Rails existence")
12
13
  if defined?(Rails::Railtie) # && ENV["OYENCOV_API_KEY"]
13
- puts "[OyenCov] Starting Railtie"
14
+ OyenCov::Logger.log("Starting Railtie")
14
15
  require_relative "oyencov/railtie"
15
16
  end
16
17
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oyencov
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anonoz Chong
@@ -35,78 +35,84 @@ cert_chain:
35
35
  K18ySnv/ePkrL7AJhCgkP4tlJvrBvWnt30OuFfFf4K64ja+Hgqren8UabRQGIzn+
36
36
  JcaIEQ0pXyjnNFwGBhHBjPXKHvRYuw/LNUPXBmP/k1a0WY6H
37
37
  -----END CERTIFICATE-----
38
- date: 2023-12-05 00:00:00.000000000 Z
38
+ date: 2024-01-04 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: rake
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '0'
46
+ version: '13.1'
47
47
  type: :development
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: '13.1'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: minitest
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '0'
60
+ version: '5.20'
61
61
  type: :development
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '0'
67
+ version: '5.20'
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: mocha
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '0'
74
+ version: '2.1'
75
75
  type: :development
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - ">="
79
+ - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '0'
81
+ version: '2.1'
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: standard
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - ">="
86
+ - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '0'
88
+ version: '1.33'
89
89
  type: :development
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - ">="
93
+ - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '0'
95
+ version: '1.33'
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: faraday
98
98
  requirement: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: '0'
102
+ version: '1.0'
103
+ - - "<"
104
+ - !ruby/object:Gem::Version
105
+ version: '3.0'
103
106
  type: :runtime
104
107
  prerelease: false
105
108
  version_requirements: !ruby/object:Gem::Requirement
106
109
  requirements:
107
110
  - - ">="
108
111
  - !ruby/object:Gem::Version
109
- version: '0'
112
+ version: '1.0'
113
+ - - "<"
114
+ - !ruby/object:Gem::Version
115
+ version: '3.0'
110
116
  - !ruby/object:Gem::Dependency
111
117
  name: parser
112
118
  requirement: !ruby/object:Gem::Requirement
@@ -133,15 +139,23 @@ dependencies:
133
139
  requirements:
134
140
  - - ">="
135
141
  - !ruby/object:Gem::Version
136
- version: '0'
142
+ version: '1.0'
143
+ - - "<"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.0'
137
146
  type: :runtime
138
147
  prerelease: false
139
148
  version_requirements: !ruby/object:Gem::Requirement
140
149
  requirements:
141
150
  - - ">="
142
151
  - !ruby/object:Gem::Version
143
- version: '0'
144
- description: Runtime and test reporters.
152
+ version: '1.0'
153
+ - - "<"
154
+ - !ruby/object:Gem::Version
155
+ version: '2.0'
156
+ description: |2
157
+ OyenCov is a service that measures usage-weighted test coverage by
158
+ profiling the codebase line executions in production runtime.
145
159
  email: anonoz@oyencov.com
146
160
  executables:
147
161
  - oyencov
@@ -156,7 +170,9 @@ files:
156
170
  - lib/oyencov/configuration.rb
157
171
  - lib/oyencov/controller_tracking.rb
158
172
  - lib/oyencov/coverage_peek_delta.rb
173
+ - lib/oyencov/logger.rb
159
174
  - lib/oyencov/method_range_parser.rb
175
+ - lib/oyencov/puma/plugin/oyencov.rb
160
176
  - lib/oyencov/railtie.rb
161
177
  - lib/oyencov/simplecov_resultset_translator.rb
162
178
  - lib/oyencov/test_report_merger.rb
@@ -164,9 +180,13 @@ files:
164
180
  - lib/oyencov/version.rb
165
181
  homepage: https://www.oyencov.com
166
182
  licenses:
167
- - MIT
183
+ - Nonstandard
168
184
  metadata:
185
+ homepage_uri: https://www.oyencov.com
169
186
  source_code_uri: https://github.com/oyencov/sdk-ruby
187
+ documentation_uri: https://docs.oyencov.com/category/ruby-on-rails
188
+ changelog_uri: https://github.com/oyencov/sdk-ruby/blob/main/CHANGELOG.md
189
+ bug_tracker_uri: https://github.com/oyencov/sdk-ruby/issues
170
190
  post_install_message:
171
191
  rdoc_options: []
172
192
  require_paths:
metadata.gz.sig CHANGED
Binary file