akainaa 0.1.2 → 0.1.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 +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +28 -2
- data/lib/akainaa/util.rb +1 -0
- data/lib/akainaa/version.rb +1 -1
- data/lib/akainaa.rb +74 -5
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6602589d81aa7812d340812b17c6cc253356605aaf40fc3746aa1ab409b0d94
|
4
|
+
data.tar.gz: f4c7d56da714844abb1dc8f8a9977b3cb14065d2eec7c852e9b1aa902f212cff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21b88780fb3299dc630d3aa83dc0a7fa8cc94d486e908c54c3681c87d3ac619eef2cdf71c646f6aa71d01016b64573de338cbc09f8a8b3367f836902a74571b8
|
7
|
+
data.tar.gz: 7239bd4af6b74ee056ac78959b8220a2bebddadcc4b0bc6a21f58ad7bb5471c44f51810032b56912e3c3c4743baadaf530235b11f10930915fcdeed7bd27dc83
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.1.5] - 2024-09-10
|
4
|
+
|
5
|
+
- Bug fix: nested method call won't handled
|
6
|
+
- Bug fix: Empty 302 response body on /akainaa/reset
|
7
|
+
- Feature: Add `ignore_glob_patterns` option to `Akainaa.start` method
|
8
|
+
- Feature: Add `hide_not_executed_files` option to `Akainaa.start` method
|
9
|
+
- Feature: Add `online_emit` option to `Akainaa.start` method
|
10
|
+
|
3
11
|
## [0.1.2] - 2024-05-06
|
4
12
|
|
5
13
|
- Coloring all line of the method which located on multiple lines
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Akainaa (
|
1
|
+
# Akainaa (赤いなぁ、 It's red...)
|
2
2
|
|
3
3
|

|
4
4
|
|
@@ -28,7 +28,13 @@ Here is example:
|
|
28
28
|
```ruby
|
29
29
|
require 'akainaa'
|
30
30
|
|
31
|
-
Akainaa.start(
|
31
|
+
Akainaa.start(
|
32
|
+
project_dir: File.expand_path(__dir__),
|
33
|
+
ignore_glob_patterns: %w[
|
34
|
+
config/application.rb
|
35
|
+
config/initializers/*_initializer.rb
|
36
|
+
],
|
37
|
+
)
|
32
38
|
|
33
39
|
require_relative 'app'
|
34
40
|
|
@@ -39,6 +45,26 @@ run App
|
|
39
45
|
Boot up application, do something, and access `/akainaa`.
|
40
46
|
It will show Web UI what and how many executed.
|
41
47
|
|
48
|
+
### Enable online emit mode
|
49
|
+
|
50
|
+
Akainaa can emit coverage data which recorded in interval to the file.
|
51
|
+
This feature is intended to be used with vscode-akainaa extension.
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
Akainaa.start(
|
55
|
+
project_dir: File.expand_path(__dir__),
|
56
|
+
ignore_glob_patterns: %w[
|
57
|
+
config/application.rb
|
58
|
+
config/initializers/*_initializer.rb
|
59
|
+
],
|
60
|
+
online_emit: {
|
61
|
+
mode: :file,
|
62
|
+
interval: 1, # seconds
|
63
|
+
output_path: '/tmp/akainaa.json',
|
64
|
+
},
|
65
|
+
)
|
66
|
+
```
|
67
|
+
|
42
68
|
## Development
|
43
69
|
|
44
70
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/akainaa/util.rb
CHANGED
data/lib/akainaa/version.rb
CHANGED
data/lib/akainaa.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'coverage'
|
4
|
+
require 'fileutils'
|
4
5
|
|
5
6
|
require_relative 'akainaa/version'
|
6
7
|
require_relative 'akainaa/call_node_visitor'
|
@@ -10,24 +11,90 @@ module Akainaa
|
|
10
11
|
class Error < StandardError; end
|
11
12
|
|
12
13
|
class << self
|
13
|
-
attr_accessor :project_dir
|
14
|
-
|
15
|
-
def start(
|
14
|
+
attr_accessor :project_dir, :ignore_files, :hide_not_executed_files
|
15
|
+
|
16
|
+
def start(
|
17
|
+
project_dir:,
|
18
|
+
ignore_glob_patterns: [],
|
19
|
+
hide_not_executed_files: false,
|
20
|
+
online_emit: nil
|
21
|
+
)
|
16
22
|
@project_dir = project_dir
|
17
23
|
@project_dir += '/' unless @project_dir.end_with?('/')
|
24
|
+
ignore_files = ignore_glob_patterns.flat_map do |pattern|
|
25
|
+
Dir["#{@project_dir}#{pattern}"].to_a
|
26
|
+
end
|
27
|
+
@ignore_files = Set.new(ignore_files)
|
28
|
+
@hide_not_executed_files = hide_not_executed_files
|
29
|
+
@monitor = Monitor.new
|
18
30
|
|
19
31
|
Coverage.start(lines: true)
|
32
|
+
|
33
|
+
if online_emit.is_a?(Hash)
|
34
|
+
option = default_online_emit.merge(online_emit)
|
35
|
+
FileUtils.mkdir_p(File.dirname(option[:path]))
|
36
|
+
start_multipart_emit(option)
|
37
|
+
end
|
20
38
|
end
|
21
39
|
|
22
40
|
def peek_result
|
23
41
|
Coverage
|
24
42
|
.peek_result
|
25
43
|
.select { |k, _v| k.start_with?(project_dir) }
|
44
|
+
.reject { |k, _v| ignore_files.member?(k) }
|
26
45
|
.transform_keys { |k| k.sub(project_dir, '') }
|
27
46
|
end
|
28
47
|
|
29
48
|
def reset
|
30
|
-
|
49
|
+
@monitor.synchronize do
|
50
|
+
Coverage.result(stop: false, clear: true)
|
51
|
+
@previous_result = {}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private def default_online_emit
|
56
|
+
{
|
57
|
+
mode: :file,
|
58
|
+
interval: 1,
|
59
|
+
path: 'tmp/coverage.json',
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
private def start_multipart_emit(option)
|
64
|
+
Thread.new do
|
65
|
+
@monitor.synchronize do
|
66
|
+
@previous_result = {}
|
67
|
+
end
|
68
|
+
|
69
|
+
loop do
|
70
|
+
sleep option[:interval]
|
71
|
+
current_result = peek_result
|
72
|
+
|
73
|
+
diff = {}
|
74
|
+
current_result.each do |path, path_coverage|
|
75
|
+
previous_path_coverage = @previous_result[path]
|
76
|
+
|
77
|
+
if previous_path_coverage.nil?
|
78
|
+
diff[path] = path_coverage
|
79
|
+
elsif previous_path_coverage[:lines].size != path_coverage[:lines].size
|
80
|
+
diff[path] = path_coverage
|
81
|
+
else
|
82
|
+
diff[path] = { lines: [] }
|
83
|
+
|
84
|
+
path_coverage[:lines].each_with_index do |count, index|
|
85
|
+
val = count ? count - previous_path_coverage[:lines][index] : nil
|
86
|
+
|
87
|
+
diff[path][:lines] << val
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
@monitor.synchronize do
|
93
|
+
@previous_result = current_result
|
94
|
+
end
|
95
|
+
File.write(option[:path], diff.to_json)
|
96
|
+
end
|
97
|
+
end
|
31
98
|
end
|
32
99
|
end
|
33
100
|
|
@@ -48,7 +115,7 @@ module Akainaa
|
|
48
115
|
path = extract_path_from_query(env)
|
49
116
|
Akainaa.reset
|
50
117
|
|
51
|
-
[302, { 'Location' => "/akainaa?path=#{path}" }, [
|
118
|
+
[302, { 'Location' => "/akainaa?path=#{path}" }, []]
|
52
119
|
else
|
53
120
|
@app.call(env)
|
54
121
|
end
|
@@ -83,6 +150,8 @@ module Akainaa
|
|
83
150
|
|
84
151
|
li_elements = files.sort.map do |file|
|
85
152
|
total_count_on_file = coverage_result[file][:lines].reject(&:nil?).sum
|
153
|
+
next '' if Akainaa.hide_not_executed_files && total_count_on_file == 0
|
154
|
+
|
86
155
|
count_top = (total_count_on_file * 10 / max_count_on_proj).to_i * 10
|
87
156
|
|
88
157
|
class_suffix = file == current_path ? ' current' : ''
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: akainaa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shia
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Minimum rack middleware for coverage
|
14
14
|
email:
|
@@ -47,7 +47,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
requirements: []
|
50
|
-
rubygems_version: 3.
|
50
|
+
rubygems_version: 3.5.11
|
51
51
|
signing_key:
|
52
52
|
specification_version: 4
|
53
53
|
summary: Minimum rack middleware for coverage
|