computable 1.1.1 → 1.1.3

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: ec5682e86b9081039947fc2718c8cdc42d2407af8cb0da30244a41b994d917f5
4
- data.tar.gz: f8471eed0b3144951e4bb834e63013339e1af67842278e1bac7368c82070e76d
3
+ metadata.gz: 36fc11ccdc0bcfd191eae39d35bae6fc896b338b52a63a2b6693b33c865bfeaf
4
+ data.tar.gz: f7db8ba67c28d1983569d73b4ab1ebb269ed82e0476d8aab39b72e5a93d65f13
5
5
  SHA512:
6
- metadata.gz: 9be1797f3865b5ed1f0cbf6b98c3a8ceca6342b689212a801e55e2ad1e3499618a1439746744260d719bda4e9895c0ff080b2a2e43a971414f06f18a60f9cb33
7
- data.tar.gz: b3852ade5823458ff7a5da0e6e89416c3c9edd326fa3466781ad52cdf876aaa8ee032949b98a52b6646f37b8b8d7256a57ff41d1a5c01c041be4b53b88738232
6
+ metadata.gz: b742c59611981f23814e9b88b62c8b2aa1be6d61b8c3584d19724e40615fc5295381ef2d9e8302c6fd5ff24f6837f085582a4cfe02f4ef0a7febf71fb0d86e67
7
+ data.tar.gz: d076c6eb9329ae9848a5779205192be33936d1f2ca149366eb48a7998367d0236de9644e93d032e6cc1ed9015040b4d7b259723ee92eb22ca5125e4320d58559
checksums.yaml.gz.sig CHANGED
Binary file
data/computable.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", ">= 1.4", "< 3.0"
22
+ spec.add_development_dependency "bundler", ">= 1.4", "< 4.0"
23
23
  spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "minitest", "~> 5.6"
25
25
  end
@@ -1,3 +1,3 @@
1
1
  class Computable
2
- VERSION = "1.1.1"
2
+ VERSION = "1.1.3"
3
3
  end
data/lib/computable.rb CHANGED
@@ -27,21 +27,25 @@ class Computable
27
27
  @expired_from = {}
28
28
  @count = 0
29
29
  @value = Unknown
30
+ @value_calced = nil
30
31
  @in_process = false
31
32
  @recalc_error = nil
32
33
  end
33
34
 
34
35
  def inspect
35
36
  has = @recalc_error ? "error!" : "value:#{Unknown!=value}"
36
- "<Variable #{name} used_for:#{used_for.keys} expired_from:#{expired_from.keys} has #{has} value_calced:#{value_calced.inspect}>"
37
+ "<Variable #{name} used_for:#{used_for.keys} expired_from:#{expired_from.keys} has #{has} value_calced:#{case value_calced when NilClass then :no when 1 then :yes when 2 then :exception end}>"
37
38
  end
38
39
 
39
40
  def calc!
40
41
  self.count += 1
41
- self.value_calced = true
42
+ self.value_calced = 1
42
43
  @mutex.unlock
43
44
  begin
44
45
  calc_method.call(self)
46
+ rescue
47
+ self.value_calced = 2
48
+ raise
45
49
  ensure
46
50
  @mutex.lock
47
51
  end
@@ -90,7 +94,7 @@ class Computable
90
94
 
91
95
  puts "recalc #{inspect}" if @comp.computable_debug
92
96
  expired_from.each do |name2, v2|
93
- v2.recalc_value
97
+ v2.recalc_value # Adjust improve_backtrace when moving this line within method recalc_value
94
98
  end
95
99
 
96
100
  unless expired_from.empty?
@@ -162,7 +166,7 @@ class Computable
162
166
  end
163
167
  node.in_process = true
164
168
  node.count += 1
165
- node.value_calced = true
169
+ node.value_calced = 1
166
170
  num_working += 1
167
171
  to_workers.push(node)
168
172
  end
@@ -189,14 +193,14 @@ class Computable
189
193
  used_for.clear
190
194
  self.value = value
191
195
  end
192
- self.value_calced = false
196
+ self.value_calced = nil
193
197
  end
194
198
 
195
199
  def query_value(kaller)
196
200
  if kaller
197
201
  v2 = used_for[kaller.name]
198
202
  if v2
199
- if Unknown==value && Unknown==v2.value && value_calced && v2.value_calced
203
+ if Unknown==value && Unknown==v2.value && value_calced == 1 && v2.value_calced
200
204
  raise RecursionDetected, "#{v2.name} depends on #{name}, but #{name} could not be computed without #{v2.name}"
201
205
  end
202
206
  else
@@ -275,11 +279,15 @@ class Computable
275
279
  end
276
280
 
277
281
  private def improve_backtrace(err, block, text)
282
+ recalc_location_fpath, recalc_location_lineno = Variable.instance_method(:recalc_value).source_location
278
283
  fpath, lineno = block.source_location
279
284
  bt = err.backtrace
280
- myloc = err.backtrace_locations.select.with_index{|loc, i| loc.path == fpath && loc.lineno >= lineno && !bt[i].include?("#") }.min{|a,b| a.lineno <=> b.lineno }
285
+ myloc = err.backtrace_locations.find.with_index do |loc, i|
286
+ (loc.path == recalc_location_fpath && loc.lineno == recalc_location_lineno + 5 && !bt[i].include?(" #")) ||
287
+ (loc.path == fpath && loc.lineno >= lineno && !bt[i].include?(" #") && !bt[i].include?(" #"))
288
+ end
281
289
  idx = err.backtrace_locations.index(myloc)
282
- bt[idx] += " ##{text}"
290
+ bt[idx] += " ##{text}" if idx
283
291
  raise err
284
292
  end
285
293
 
@@ -2,13 +2,22 @@ require_relative 'helper'
2
2
 
3
3
  class TestBacktrace < Minitest::Test
4
4
  class MyBuilder < Computable
5
- calc_value :a do
6
- b
5
+ calc_value :b do
6
+ c
7
7
  end
8
8
 
9
- calc_value :b do
10
- raise "my error"
9
+ def self.make_c
10
+ calc_value :c do
11
+ raise "my error" if enable
12
+ :x
13
+ end
11
14
  end
15
+ make_c
16
+
17
+ calc_value :a do
18
+ b
19
+ end
20
+ input_value :enable
12
21
  end
13
22
 
14
23
  def setup
@@ -20,11 +29,36 @@ class TestBacktrace < Minitest::Test
20
29
  end
21
30
 
22
31
  def test_backtrace_decoration
32
+ @b.enable = true
33
+ err = assert_raises(StandardError){ @b.b }
34
+ bt = err.backtrace.join("\n")
35
+ assert_match(/my error/, err.to_s)
36
+ assert_match(/test_backtrace.rb:11:.* #c$/, bt)
37
+ assert_match(/test_backtrace.rb:6:.* #b$/, bt)
38
+ end
39
+
40
+ def test_recalc_backtrace_decoration
41
+ @b.enable = false
42
+ @b.b
43
+ @b.enable = true
44
+
45
+ err = assert_raises(StandardError){ @b.b }
46
+ bt = err.backtrace.join("\n")
47
+ assert_match(/my error/, err.to_s)
48
+ assert_match(/test_backtrace.rb:11:.* #c$/, bt)
49
+ assert_match(/block in recalc_value' #b$/, bt) unless @b.computable_max_threads
50
+ end
51
+
52
+ def test_recalc_longer_backtrace_decoration
53
+ @b.enable = false
54
+ @b.a
55
+ @b.enable = true
56
+
23
57
  err = assert_raises(StandardError){ @b.a }
24
58
  bt = err.backtrace.join("\n")
25
59
  assert_match(/my error/, err.to_s)
26
- assert_match(/test_backtrace.rb:10:.* #b$/, bt)
27
- assert_match(/test_backtrace.rb:6:.* #a$/, bt)
60
+ assert_match(/test_backtrace.rb:11:.* #c$/, bt)
61
+ assert_match(/block in recalc_value' #b.*block in recalc_value' #a$/m, bt) unless @b.computable_max_threads
28
62
  end
29
63
  end
30
64
 
@@ -17,6 +17,11 @@ class TestInputValue < Minitest::Test
17
17
  # @b.computable_display_dot
18
18
  end
19
19
 
20
+ def test_undefined_input_twice
21
+ assert_raises(Computable::UndefinedValue){ @b.o }
22
+ assert_raises(Computable::UndefinedValue){ @b.o }
23
+ end
24
+
20
25
  def test_undefined_input
21
26
  assert_raises(Computable::UndefinedValue){ @b.i }
22
27
  assert_raises(Computable::UndefinedValue){ @b.o }
data.tar.gz.sig CHANGED
@@ -1,2 +1,3 @@
1
- 9oW�J��%���e��2*x�l� 8Q�f§�J��K����r�'[�@�]pI�BYj��'EJ*��2'���� ��JtV�P�+�+�|Le�N�v�6ʻ�9$�#�K��V�摂�-M�gRU1|֩$�ʵz~G�A�F~ׅ��`���o��x�=n}�匹�����E�K�§?��1�R�$񻏊M4�y��;�N }��x-k�;�od���k�huVKTB5�z�$�ޅ�}y Da N
2
- ֣=��Caj
1
+ D��uG��#��p���r[{tB���[����'CUx��C K���RT��݈����R�ŅҲ�vIݧa����#�B���(o�=�uc��=����a �*w^1��Ti
2
+ n�/C6�`j�8(���w߯�܄ٷ���u���,u��N�0��P6�C�4/��`�f-�TmZ/�E>RlZ�U��
3
+ �{�D�Xn���k��Q��f.��K@��-��ܬ��]�rm���[*�s�d��|�~8�Q��`��s�\ ?S�{�$+ N�Q�k]iі�p�l f�p��vE��p�O��lBpڌ(�i�EQb�Iڽك���� �%U��
metadata CHANGED
@@ -1,35 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: computable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Kanis
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain:
11
10
  - |
12
11
  -----BEGIN CERTIFICATE-----
13
- MIIDLjCCAhagAwIBAgIBCjANBgkqhkiG9w0BAQsFADA9MQ4wDAYDVQQDDAVrYW5p
14
- czEXMBUGCgmSJomT8ixkARkWB2NvbWNhcmQxEjAQBgoJkiaJk/IsZAEZFgJkZTAe
15
- Fw0yMjA0MTExMTMwNTNaFw0yMzA0MTExMTMwNTNaMD0xDjAMBgNVBAMMBWthbmlz
16
- MRcwFQYKCZImiZPyLGQBGRYHY29tY2FyZDESMBAGCgmSJomT8ixkARkWAmRlMIIB
17
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApop+rNmg35bzRugZ21VMGqI6
18
- HGzPLO4VHYncWn/xmgPU/ZMcZdfj6MzIaZJ/czXyt4eHpBk1r8QOV3gBXnRXEjVW
19
- 9xi+EdVOkTV2/AVFKThcbTAQGiF/bT1n2M+B1GTybRzMg6hyhOJeGPqIhLfJEpxn
20
- lJi4+ENAVT4MpqHEAGB8yFoPC0GqiOHQsdHxQV3P3c2OZqG+yJey74QtwA2tLcLn
21
- Q53c63+VLGsOjODl1yPn/2ejyq8qWu6ahfTxiIlSar2UbwtaQGBDFdb2CXgEufXT
22
- L7oaPxlmj+Q2oLOfOnInd2Oxop59HoJCQPsg8f921J43NCQGA8VHK6paxIRDLQID
23
- AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUvgTdT7fe
24
- x17ugO3IOsjEJwW7KP4wDQYJKoZIhvcNAQELBQADggEBAILiaB/unSVBfX5n7uL8
25
- veGGCOHuGYhCGqspb6mYiCx0dmV3RPRiEfGDLfzcXbHNx/3AjygcxH4Slr+pmaxr
26
- 04Xli3WurocnjoANSWqCwpHH3OhSVxFgBNrCa3OMWcIr0xKH+I7PXA80SXe0pzfg
27
- ePjpzTY71j+rcyRJqWiU5/zwdUaCCelBJscxh/0IaNcz67ocCEMRj0n4m5HFEmZL
28
- 9zKkMZFoOjxRQjcL84QU7ZXnnFR5HG8nLw+NqWjo49W6MBQ9HGFda2tk3OpBhyWS
29
- sc3NyOkGUGdfiee5VRG31Sh3LLON3YGED+zZAS+ZF6598y4vhv8MBLa1Oy357byC
30
- tTg=
12
+ MIIEBDCCAmygAwIBAgIBAzANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
13
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yNDEyMjkxOTU2NTZaFw0yNTEy
14
+ MjkxOTU2NTZaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
15
+ PWRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAwum6Y1KznfpzXOT/
16
+ mZgJTBbxZuuZF49Fq3K0WA67YBzNlDv95qzSp7V/7Ek3NCcnT7G+2kSuhNo1FhdN
17
+ eSDO/moYebZNAcu3iqLsuzuULXPLuoU0GsMnVMqV9DZPh7cQHE5EBZ7hlzDBK7k/
18
+ 8nBMvR0mHo77kIkapHc26UzVq/G0nKLfDsIHXVylto3PjzOumjG6GhmFN4r3cP6e
19
+ SDfl1FSeRYVpt4kmQULz/zdSaOH3AjAq7PM2Z91iGwQvoUXMANH2v89OWjQO/NHe
20
+ JMNDFsmHK/6Ji4Kk48Z3TyscHQnipAID5GhS1oD21/WePdj7GhmbF5gBzkV5uepd
21
+ eJQPgWGwrQW/Z2oPjRuJrRofzWfrMWqbOahj9uth6WSxhNexUtbjk6P8emmXOJi5
22
+ chQPnWX+N3Gj+jjYxqTFdwT7Mj3pv1VHa+aNUbqSPpvJeDyxRIuo9hvzDaBHb/Cg
23
+ 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjOTA3MAkG
24
+ A1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQ4h1tIyvdUWtMI739xMzTR
25
+ 7EfMFzANBgkqhkiG9w0BAQsFAAOCAYEAoZZWzNV2XXaoSmvyamSSN+Wt/Ia+DNrU
26
+ 2pc3kMEqykH6l1WiVPszr6HavQ//2I2UcSRSS5AGDdiSXcfyFmHtMBdtJHhTPcn7
27
+ 4DLliB0szpvwG+ltGD8PI8eWkLaTQeFzs+0QCTavgKV+Zw56Q0J5zZvHHUMrLkUD
28
+ qhwKjdTdkrRTn9Sqi0BrIRRZGTUDdrt8qoWm35aES5arKZzytgrRD/kXfFW2LCg0
29
+ FzgTKibR4/3g8ph94kQLg/D2SMlVPkQ3ECi036mZxDC2n8V6u3rDkG5923wmrRZB
30
+ J6cqz475Q8HYORQCB68OPzkWMfC7mBo3vpSsIqRoNs1FE4FJu4FGwZG8fBSrDC4H
31
+ bZe+GtyS3e2SMjgT65zp35gLO9I7MquzYN9P6V2u1iBpTycchk5z9R1ghxzZSBT8
32
+ DrkJ9tVlPQtJB0LqT0tvBap4upnwT1xYq721b5dwH6AF4Pi6iz/dc5vnq1/MH8bV
33
+ 8VbbBzzeE7MsvgkP3sHlLmY8PtuyViJ8
31
34
  -----END CERTIFICATE-----
32
- date: 2022-06-01 00:00:00.000000000 Z
35
+ date: 1980-01-02 00:00:00.000000000 Z
33
36
  dependencies:
34
37
  - !ruby/object:Gem::Dependency
35
38
  name: bundler
@@ -40,7 +43,7 @@ dependencies:
40
43
  version: '1.4'
41
44
  - - "<"
42
45
  - !ruby/object:Gem::Version
43
- version: '3.0'
46
+ version: '4.0'
44
47
  type: :development
45
48
  prerelease: false
46
49
  version_requirements: !ruby/object:Gem::Requirement
@@ -50,7 +53,7 @@ dependencies:
50
53
  version: '1.4'
51
54
  - - "<"
52
55
  - !ruby/object:Gem::Version
53
- version: '3.0'
56
+ version: '4.0'
54
57
  - !ruby/object:Gem::Dependency
55
58
  name: rake
56
59
  requirement: !ruby/object:Gem::Requirement
@@ -112,7 +115,6 @@ homepage: https://github.com/larskanis/computable
112
115
  licenses:
113
116
  - MIT
114
117
  metadata: {}
115
- post_install_message:
116
118
  rdoc_options: []
117
119
  require_paths:
118
120
  - lib
@@ -127,8 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
129
  - !ruby/object:Gem::Version
128
130
  version: '0'
129
131
  requirements: []
130
- rubygems_version: 3.3.7
131
- signing_key:
132
+ rubygems_version: 3.6.9
132
133
  specification_version: 4
133
134
  summary: Define computation tasks with automatic caching and dependency tracking.
134
135
  test_files:
metadata.gz.sig CHANGED
Binary file