oyencov 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9619610f6cb878e1b7cd8729db4fe34785fce3e467b286bef49856715ca45cf5
4
- data.tar.gz: 35ca4fc3632905729f2be3d828f5ee9430b0a5d8c78ef5cc33564a4ebb11674a
3
+ metadata.gz: c88552b88f48f6474413438e3b4043802ead52f3db1b9d26642468f361dc15cc
4
+ data.tar.gz: 9e5244ef06ef4d24911ac0e86d58986bb36de6b2f660b0412e93f3e8a08f9014
5
5
  SHA512:
6
- metadata.gz: 683e8bade439c6f5a20e635a64cbd28c9f3655bc952c3001706567c01f7f0a97cfdd8427e3a3141869e743cd0313ce7731d41c204b88624368b18f557fdac12e
7
- data.tar.gz: 99abe33fd7b0e80bc0674e1fbe8c53c19af45a3951ac7cbcceb99b1c0fca1d5576adb176f30d156fee9974f9627609854930a30f0ee59b1e7a5a05127c994599
6
+ metadata.gz: 8a50ad8ce049257eb6f6c93f3316cc59efaefcf1f2fcace72bd5d072d4e3c123bc4dafd2c1f8e974bc72d1ecf0786dda47ef2aa144d9ee446e8e6832721ba049
7
+ data.tar.gz: a95d62de2c84555c2935f826271f09473ebf85f77c041f32823724d091b7b149035976f5ca3a4c5f451950d81b79ea74d626c2185d6fdf08de403ce51f67ed71
checksums.yaml.gz.sig CHANGED
Binary file
@@ -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
  #
@@ -63,17 +64,17 @@ module OyenCov
63
64
 
64
65
  desc "submit tmp/coverage-jsons-*/oyencov-resultset.json",
65
66
  "submits the oyencov resultsets data"
66
- option :files, type: :array, required: true
67
+ option :files, type: :array, default: ["coverage/oyencov-resultset.json"]
67
68
  option :git_commit_sha, required: true
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.2".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.2
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-11-10 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