cover_rage 1.1.0 → 1.1.1

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: 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