cover_rage 1.1.0 → 1.1.1

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: 2d22a15a12e4376aa1a441dd5f4d21e7a6043390e1cef64e8739da1e6fcb81eb
4
- data.tar.gz: ec07f2d32071bce21d03771e3d3ba3c6dd24e0e1cae745962fe0a36b89bc00ef
3
+ metadata.gz: e35c3c64110ebafa0432d4ac37f2d05b19a552df8505263f751f4fb85a841525
4
+ data.tar.gz: 9cd16923a839fd2ddcd6f5b585d28bfc19ab40a466d810ac8a93378bf5c13b02
5
5
  SHA512:
6
- metadata.gz: 16754fdef9cc29c0f6304e56a6f0c70dd91bc18c294bc944a7d3f927b642b07127acb079ecb9617156c3d0f703ec440536433f97b0f53d9742f6541d7df087cf
7
- data.tar.gz: 94bddf50ab05b0f8227e42743910343b5f7c595c74774994bc60f5ecfc807dc1ec3f4bfcd5227ccb24a5207a2cfad77864077e934a986f91d4c8e254921cf359
6
+ metadata.gz: b1b158a2dc50611a60482aeae2f448c9f4f8ae59f3d1ebb6ecd29bc03fea38a82a934b4b84906a4f331a7b293ccfcb4780ab7d956fe24015c42c54a8d4a52cdc
7
+ data.tar.gz: b06bdca3118bf5d80f7225e4792d258a18ef17a27f9255e0993a0e9523aab81e1aa88051b6c6670241ea688bfd10df10118ce9934e84e1c4379d4fcae02b7282
@@ -26,7 +26,7 @@ module CoverRage
26
26
  interval = Config.interval
27
27
  jitter = 0.15
28
28
  loop do
29
- sleep(interval + rand * interval * jitter)
29
+ sleep(interval + (rand * interval * jitter))
30
30
  save(Coverage.result(stop: false, clear: true))
31
31
  end
32
32
  end
@@ -44,12 +44,17 @@ module CoverRage
44
44
 
45
45
  records << Record.new(
46
46
  path: relative_path,
47
- revision: revision,
48
- source: source,
49
- execution_count: execution_count
47
+ revision:,
48
+ source:,
49
+ execution_count:
50
50
  )
51
51
  end
52
- @store.import(records) if records.any?
52
+ return unless records.any?
53
+
54
+ @store.transaction do
55
+ records_to_save = Record.merge(@store.list, records)
56
+ @store.update(records_to_save)
57
+ end
53
58
  end
54
59
 
55
60
  private
@@ -10,27 +10,42 @@ module CoverRage
10
10
  @store = PStore.new(path, true)
11
11
  end
12
12
 
13
- def import(records)
13
+ def transaction
14
14
  @store.transaction do
15
- persisted_records = @store.keys.map { @store[_1] }
16
- records_to_save = Record.merge(persisted_records, records)
17
- records_to_save.each { @store[_1.path] = _1 }
15
+ @transaction = true
16
+ yield
17
+ ensure
18
+ @transaction = false
18
19
  end
19
20
  end
20
21
 
21
- def find(path)
22
- @store.transaction { @store[path] }
22
+ def update(records)
23
+ if @transaction
24
+ records.each { @store[_1.path] = _1 }
25
+ else
26
+ @store.transaction do
27
+ records.each { @store[_1.path] = _1 }
28
+ end
29
+ end
23
30
  end
24
31
 
25
32
  def list
26
- @store.transaction do
33
+ if @transaction
27
34
  @store.keys.map { @store[_1] }
35
+ else
36
+ @store.transaction do
37
+ @store.keys.map { @store[_1] }
38
+ end
28
39
  end
29
40
  end
30
41
 
31
42
  def clear
32
- @store.transaction do
43
+ if @transaction
33
44
  @store.keys.each { @store.delete(_1) }
45
+ else
46
+ @store.transaction do
47
+ @store.keys.each { @store.delete(_1) }
48
+ end
34
49
  end
35
50
  end
36
51
  end
@@ -12,30 +12,33 @@ module CoverRage
12
12
  def initialize(url)
13
13
  @redis =
14
14
  if url.start_with?('rediss')
15
- ::Redis.new(url: url, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })
15
+ ::Redis.new(url:, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })
16
16
  else
17
- ::Redis.new(url: url)
17
+ ::Redis.new(url:)
18
18
  end
19
19
  end
20
20
 
21
- def import(records)
21
+ def transaction(&)
22
22
  loop do
23
23
  break if @redis.watch(KEY) do
24
- records_to_save = Record.merge(list, records)
25
- arguments = []
26
- records_to_save.each do |record|
27
- arguments.push(record.path, JSON.dump(record.to_h))
24
+ @redis.multi do |multi|
25
+ Thread.current[:redis_multi] = multi
26
+ yield
27
+ ensure
28
+ Thread.current[:redis_multi] = nil
28
29
  end
29
- @redis.multi { _1.hset(KEY, *arguments) }
30
30
  end
31
31
  end
32
32
  end
33
33
 
34
- def find(path)
35
- result = @redis.hget(KEY, path)
36
- return nil if result.nil?
34
+ def update(records)
35
+ arguments = []
36
+ records.each do |record|
37
+ arguments.push(record.path, JSON.dump(record.to_h))
38
+ end
37
39
 
38
- Record.new(**JSON.parse(result))
40
+ client = Thread.current[:redis_multi] || @redis
41
+ client.hset(KEY, *arguments)
39
42
  end
40
43
 
41
44
  def list
@@ -8,6 +8,8 @@ module CoverRage
8
8
  module Stores
9
9
  class Sqlite
10
10
  def initialize(path)
11
+ @mutex = Mutex.new
12
+ @path = path
11
13
  @db = SQLite3::Database.new(path)
12
14
  @db.execute <<-SQL
13
15
  create table if not exists records (
@@ -29,40 +31,27 @@ module CoverRage
29
31
  Process.singleton_class.prepend(process_ext)
30
32
  end
31
33
 
32
- def import(records)
33
- @db.transaction(:exclusive) do
34
- records_to_save = Record.merge(list, records)
35
- @db.execute(
36
- "insert or replace into records (path, revision, source, execution_count) values #{
37
- (['(?,?,?,?)'] * records_to_save.length).join(',')
38
- }",
39
- records_to_save.each_with_object([]) do |record, memo|
40
- memo.push(
41
- record.path,
42
- record.revision,
43
- record.source,
44
- JSON.dump(record.execution_count)
45
- )
46
- end
47
- )
34
+ def transaction(&)
35
+ @mutex.synchronize do
36
+ @db.transaction(:exclusive, &)
37
+ rescue SQLite3::BusyException
38
+ retry
48
39
  end
49
- rescue SQLite3::BusyException
50
- retry
51
40
  end
52
41
 
53
- def find(path)
54
- rows = @db.execute(
55
- 'select revision, source, execution_count from records where path = ? limit 1',
56
- [path]
57
- )
58
- return nil if rows.empty?
59
-
60
- revision, source, execution_count = rows.first
61
- Record.new(
62
- path: path,
63
- revision: revision,
64
- source: source,
65
- execution_count: JSON.parse(execution_count)
42
+ def update(records)
43
+ @db.execute(
44
+ "insert or replace into records (path, revision, source, execution_count) values #{
45
+ (['(?,?,?,?)'] * records.length).join(',')
46
+ }",
47
+ records.each_with_object([]) do |record, memo|
48
+ memo.push(
49
+ record.path,
50
+ record.revision,
51
+ record.source,
52
+ JSON.dump(record.execution_count)
53
+ )
54
+ end
66
55
  )
67
56
  end
68
57
 
@@ -71,9 +60,9 @@ module CoverRage
71
60
  .execute('select path, revision, source, execution_count from records')
72
61
  .map do |(path, revision, source, execution_count)|
73
62
  Record.new(
74
- path: path,
75
- revision: revision,
76
- source: source,
63
+ path:,
64
+ revision:,
65
+ source:,
77
66
  execution_count: JSON.parse(execution_count)
78
67
  )
79
68
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cover_rage
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Weihang Jian
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2024-12-28 00:00:00.000000000 Z
10
+ date: 2024-12-30 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: minitest
@@ -95,7 +95,8 @@ files:
95
95
  homepage: https://github.com/tonytonyjan/cover_rage
96
96
  licenses:
97
97
  - MIT
98
- metadata: {}
98
+ metadata:
99
+ rubygems_mfa_required: 'true'
99
100
  rdoc_options: []
100
101
  require_paths:
101
102
  - lib