flog 4.6.3 → 4.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +28 -0
- data/Rakefile +8 -2
- data/lib/flog.rb +31 -19
- data/test/test_flog.rb +67 -16
- data/test/test_flog_cli.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +39 -23
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6889c4ee131417e7461cd689e54af4a037d36ee3a854e037c9e453e7a19dee0
|
4
|
+
data.tar.gz: ee5fc40d4423a82b4b48db87b9bd02fac8006f4b5ac6e6f4701005a82412b451
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6b0a38246e5869182caf800b6e1bacb4bd442c06746d8aac8c4223528d58bf8c588909689f5424f05de6cfbe1ed97f12d89025fe2d3a2b195ea6508326d8691
|
7
|
+
data.tar.gz: 485e289aec33bf39a30b8361d42eaec662de13bbca5c72b3058a9f0e31375ce1b55cacb270b00551b671e59f031f9b861af50b03abeb155af4d079d0f325dbbf
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
@@ -1,3 +1,31 @@
|
|
1
|
+
=== 4.6.6 / 2022-07-03
|
2
|
+
|
3
|
+
* 1 minor enhancement:
|
4
|
+
|
5
|
+
* Added support for to_proc w/ hash(?!?). (t-kinoshita)
|
6
|
+
|
7
|
+
* 2 bug fixes:
|
8
|
+
|
9
|
+
* Removed to_proc_normal (eg &:sym/call) as benchmarks are much better.
|
10
|
+
* ruby3: Fixed anonymous block pass. (prtngn)
|
11
|
+
|
12
|
+
=== 4.6.5 / 2022-04-09
|
13
|
+
|
14
|
+
* 1 minor enhancement:
|
15
|
+
|
16
|
+
* Changed :iter scoring from branch to block_call (same score).
|
17
|
+
|
18
|
+
* 1 bug fix:
|
19
|
+
|
20
|
+
* Fixed support for ruby 3 (only affected block_pass / to_proc_normal).
|
21
|
+
|
22
|
+
=== 4.6.4 / 2019-12-14
|
23
|
+
|
24
|
+
* 2 minor enhancements:
|
25
|
+
|
26
|
+
* Added basic support for safe_call (nic-potter).
|
27
|
+
* Added extra complexity penalty to safe_call processing.
|
28
|
+
|
1
29
|
=== 4.6.3 / 2019-09-14
|
2
30
|
|
3
31
|
* 1 minor enhancement:
|
data/Rakefile
CHANGED
@@ -7,12 +7,13 @@ Hoe.add_include_dirs("../../ruby_parser/dev/lib",
|
|
7
7
|
"../../RubyInline/dev/lib",
|
8
8
|
"../../sexp_processor/dev/lib",
|
9
9
|
"../../ZenTest/dev/lib",
|
10
|
-
"../../minitest/dev/lib",
|
11
10
|
"../../path_expander/dev/lib",
|
12
11
|
"lib")
|
13
12
|
|
14
13
|
Hoe.plugin :seattlerb
|
14
|
+
Hoe.plugin :isolate
|
15
15
|
Hoe.plugin :rdoc
|
16
|
+
Hoe.plugin :bundler
|
16
17
|
|
17
18
|
Hoe.spec 'flog' do
|
18
19
|
developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
|
@@ -25,6 +26,8 @@ Hoe.spec 'flog' do
|
|
25
26
|
dependency "sexp_processor", "~> 4.8"
|
26
27
|
dependency "ruby_parser", ["~> 3.1", "> 3.1.0"]
|
27
28
|
dependency "path_expander", "~> 1.0"
|
29
|
+
|
30
|
+
dependency "minitest", "~> 5.0", :dev
|
28
31
|
end
|
29
32
|
|
30
33
|
task :debug do
|
@@ -51,9 +54,12 @@ task :debug do
|
|
51
54
|
exit 0
|
52
55
|
end
|
53
56
|
flog.flog file
|
54
|
-
|
57
|
+
elsif ruby
|
55
58
|
flog.flog_ruby ruby, "-"
|
56
59
|
flog.calculate_total_scores
|
60
|
+
else
|
61
|
+
flog.flog
|
62
|
+
flog.calculate_total_scores
|
57
63
|
end
|
58
64
|
|
59
65
|
flog.report
|
data/lib/flog.rb
CHANGED
@@ -11,7 +11,7 @@ class File
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class Flog < MethodBasedSexpProcessor
|
14
|
-
VERSION = "4.6.
|
14
|
+
VERSION = "4.6.6" # :nodoc:
|
15
15
|
|
16
16
|
##
|
17
17
|
# Cut off point where the report should stop unless --all given.
|
@@ -38,22 +38,13 @@ class Flog < MethodBasedSexpProcessor
|
|
38
38
|
:assignment => 1,
|
39
39
|
:block => 1,
|
40
40
|
:block_pass => 1,
|
41
|
+
:block_call => 1,
|
41
42
|
:branch => 1,
|
42
43
|
:lit_fixnum => 0.25,
|
43
44
|
:sclass => 5,
|
44
45
|
:super => 1,
|
45
46
|
:to_proc_icky! => 10,
|
46
47
|
:to_proc_lasgn => 15,
|
47
|
-
:to_proc_normal => case RUBY_VERSION
|
48
|
-
when /^1\.8\.7/ then
|
49
|
-
2
|
50
|
-
when /^1\.9/ then
|
51
|
-
1.5
|
52
|
-
when /^2\./ then
|
53
|
-
1
|
54
|
-
else
|
55
|
-
5
|
56
|
-
end,
|
57
48
|
:yield => 1,
|
58
49
|
}
|
59
50
|
|
@@ -175,9 +166,9 @@ class Flog < MethodBasedSexpProcessor
|
|
175
166
|
|
176
167
|
def flog(*files)
|
177
168
|
files.each do |file|
|
178
|
-
next unless file ==
|
169
|
+
next unless file == "-" or File.readable? file
|
179
170
|
|
180
|
-
ruby = file ==
|
171
|
+
ruby = file == "-" ? $stdin.read : File.binread(file)
|
181
172
|
|
182
173
|
flog_ruby ruby, file
|
183
174
|
end
|
@@ -198,7 +189,7 @@ class Flog < MethodBasedSexpProcessor
|
|
198
189
|
q = option[:quiet]
|
199
190
|
if e.inspect =~ /<\%|%\>/ or ruby =~ /<\%|%\>/ then
|
200
191
|
return if q
|
201
|
-
warn "#{e.inspect} at #{e.backtrace.first(5).join(
|
192
|
+
warn "#{e.inspect} at #{e.backtrace.first(5).join(", ")}"
|
202
193
|
warn "\n...stupid lemmings and their bad erb templates... skipping"
|
203
194
|
else
|
204
195
|
warn "ERROR: parsing ruby file #{file}" unless q
|
@@ -288,7 +279,7 @@ class Flog < MethodBasedSexpProcessor
|
|
288
279
|
tally.each do |cat, score|
|
289
280
|
case cat
|
290
281
|
when :assignment then a += score
|
291
|
-
when :branch
|
282
|
+
when :branch, :block_call then b += score
|
292
283
|
else c += score
|
293
284
|
end
|
294
285
|
end
|
@@ -364,18 +355,23 @@ class Flog < MethodBasedSexpProcessor
|
|
364
355
|
|
365
356
|
add_to_score :block_pass
|
366
357
|
|
358
|
+
return s() unless arg
|
359
|
+
|
367
360
|
case arg.sexp_type
|
368
361
|
when :lvar, :dvar, :ivar, :cvar, :self, :const, :colon2, :nil then # f(&b)
|
369
362
|
# do nothing
|
370
|
-
when :lit
|
371
|
-
|
363
|
+
when :lit then # f(&:b)
|
364
|
+
# do nothing -- this now costs about the same as a block
|
365
|
+
when :call then # f(&x.b)
|
366
|
+
# do nothing -- I don't like the indirection, but that's already scored
|
372
367
|
when :lasgn then # f(&l=b)
|
373
368
|
add_to_score :to_proc_lasgn
|
374
|
-
when :iter, :dsym, :dstr, *BRANCHING then
|
369
|
+
when :iter, :dsym, :dstr, :hash, *BRANCHING then # below
|
375
370
|
# f(&proc { ... })
|
376
371
|
# f(&"#{...}")
|
377
372
|
# f(&:"#{...}")
|
378
373
|
# f(&if ... then ... end") and all other branching forms
|
374
|
+
# f(&{ a: 42 }) WHY?!?
|
379
375
|
add_to_score :to_proc_icky!
|
380
376
|
else
|
381
377
|
raise({:block_pass_even_ickier! => arg}.inspect)
|
@@ -402,6 +398,22 @@ class Flog < MethodBasedSexpProcessor
|
|
402
398
|
s()
|
403
399
|
end
|
404
400
|
|
401
|
+
def process_safe_call(exp)
|
402
|
+
penalize_by 0.3 do
|
403
|
+
process exp.shift # recv
|
404
|
+
end
|
405
|
+
|
406
|
+
name = exp.shift
|
407
|
+
|
408
|
+
penalize_by 0.2 do
|
409
|
+
process_until_empty exp
|
410
|
+
end
|
411
|
+
|
412
|
+
add_to_score name, SCORES[name]
|
413
|
+
|
414
|
+
s()
|
415
|
+
end
|
416
|
+
|
405
417
|
def process_case(exp)
|
406
418
|
add_to_score :branch
|
407
419
|
process exp.shift # recv
|
@@ -477,7 +489,7 @@ class Flog < MethodBasedSexpProcessor
|
|
477
489
|
end
|
478
490
|
end
|
479
491
|
|
480
|
-
add_to_score :
|
492
|
+
add_to_score :block_call
|
481
493
|
|
482
494
|
process exp.shift # no penalty for LHS
|
483
495
|
|
data/test/test_flog.rb
CHANGED
@@ -127,25 +127,24 @@ class TestFlog < FlogTest
|
|
127
127
|
assert_process sexp, 1.1, :branch => 1.1 # 10% penalty over process_and
|
128
128
|
end
|
129
129
|
|
130
|
-
def
|
130
|
+
def test_process_block_pass__call
|
131
131
|
sexp = s(:call, nil, :a,
|
132
132
|
s(:block_pass,
|
133
133
|
s(:call, nil, :b)))
|
134
134
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
end
|
135
|
+
assert_process(sexp, 3.4,
|
136
|
+
:a => 1.0,
|
137
|
+
:block_pass => 1.2,
|
138
|
+
:b => 1.2)
|
139
|
+
end
|
141
140
|
|
142
|
-
|
141
|
+
def test_process_block_pass__to_proc
|
142
|
+
sexp = s(:call, nil, :a,
|
143
|
+
s(:block_pass, s(:lit, :to_i)))
|
143
144
|
|
144
|
-
assert_process(sexp,
|
145
|
+
assert_process(sexp, 2.2,
|
145
146
|
:a => 1.0,
|
146
|
-
:block_pass => 1.2
|
147
|
-
:b => 1.2,
|
148
|
-
:to_proc_normal => 0.0 + bonus)
|
147
|
+
:block_pass => 1.2)
|
149
148
|
end
|
150
149
|
|
151
150
|
def test_process_block_pass_colon2
|
@@ -158,6 +157,17 @@ class TestFlog < FlogTest
|
|
158
157
|
:block_pass => 1.2)
|
159
158
|
end
|
160
159
|
|
160
|
+
def test_process_block_pass__hash_wtf
|
161
|
+
sexp = s(:call, nil, :a,
|
162
|
+
s(:block_pass,
|
163
|
+
s(:hash, s(:lit, :a), s(:lit, :b))))
|
164
|
+
|
165
|
+
assert_process(sexp, 14.2,
|
166
|
+
:a => 1.0,
|
167
|
+
:block_pass => 1.2,
|
168
|
+
:to_proc_icky! => 12.0)
|
169
|
+
end
|
170
|
+
|
161
171
|
def test_process_block_pass_iter
|
162
172
|
sexp = s(:block_pass,
|
163
173
|
s(:iter, s(:call, nil, :lambda), nil, s(:lit, 1)))
|
@@ -166,7 +176,7 @@ class TestFlog < FlogTest
|
|
166
176
|
:lit_fixnum => 0.275,
|
167
177
|
:block_pass => 1.0,
|
168
178
|
:lambda => 1.0,
|
169
|
-
:
|
179
|
+
:block_call => 1.0,
|
170
180
|
:to_proc_icky! => 10.0)
|
171
181
|
end
|
172
182
|
|
@@ -181,15 +191,43 @@ class TestFlog < FlogTest
|
|
181
191
|
:block_pass => 1.0,
|
182
192
|
:lambda => 1.0,
|
183
193
|
:assignment => 1.0,
|
184
|
-
:
|
194
|
+
:block_call => 1.0,
|
185
195
|
:to_proc_lasgn => 15.0)
|
186
196
|
end
|
187
197
|
|
198
|
+
def test_process_block_pass__nil
|
199
|
+
sexp = s(:block_pass)
|
200
|
+
|
201
|
+
assert_process(sexp, 1.0,
|
202
|
+
:block_pass => 1.0)
|
203
|
+
end
|
204
|
+
|
188
205
|
def test_process_call
|
189
|
-
sexp = s(:call, nil, :a)
|
206
|
+
sexp = s(:call, nil, :a) # a
|
190
207
|
assert_process sexp, 1.0, :a => 1.0
|
191
208
|
end
|
192
209
|
|
210
|
+
def test_process_call2
|
211
|
+
sexp = s(:call, s(:call, nil, :a), :b) # a.b
|
212
|
+
assert_process sexp, 2.2, :a => 1.2, :b => 1.0
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_process_call3
|
216
|
+
sexp = s(:call, s(:call, s(:call, nil, :a), :b), :c) # a.b.c
|
217
|
+
assert_process sexp, 3.6, :a => 1.4, :b => 1.2, :c => 1.0
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_process_safe_call2
|
221
|
+
sexp = s(:safe_call, s(:call, nil, :a), :b) # a&.b
|
222
|
+
assert_process sexp, 2.3, :a => 1.3, :b => 1.0
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_process_safe_call3
|
226
|
+
sexp = s(:safe_call, s(:safe_call, s(:call, nil, :a), :b), :c) # a&.b&.c
|
227
|
+
|
228
|
+
assert_process sexp, 3.9, :a => 1.6, :b => 1.3, :c => 1.0
|
229
|
+
end
|
230
|
+
|
193
231
|
def test_process_case
|
194
232
|
case :a
|
195
233
|
when :a
|
@@ -303,7 +341,7 @@ class TestFlog < FlogTest
|
|
303
341
|
s(:call, nil, :loop), nil,
|
304
342
|
s(:if, s(:true), s(:break), nil))
|
305
343
|
|
306
|
-
assert_process sexp, 2.326, :loop => 1.0, :branch =>
|
344
|
+
assert_process sexp, 2.326, :loop => 1.0, :branch => 1.1, :block_call => 1
|
307
345
|
end
|
308
346
|
|
309
347
|
def test_process_iter_dsl
|
@@ -351,6 +389,19 @@ class TestFlog < FlogTest
|
|
351
389
|
assert_process sexp, 2.3, :something => 1.0, :task => 1.0, :lit_fixnum => 0.3
|
352
390
|
end
|
353
391
|
|
392
|
+
def test_process_iter_dsl_hash_when_hash_empty
|
393
|
+
# task({}) do
|
394
|
+
# something
|
395
|
+
# end
|
396
|
+
|
397
|
+
sexp = s(:iter,
|
398
|
+
s(:call, nil, :task, s(:hash)),
|
399
|
+
nil,
|
400
|
+
s(:call, nil, :something))
|
401
|
+
|
402
|
+
assert_process sexp, 2.326, :something => 1.1, :task => 1.0, :block_call => 1
|
403
|
+
end
|
404
|
+
|
354
405
|
def test_process_iter_dsl_namespaced
|
355
406
|
# namespace :blah do
|
356
407
|
# task :woot => 42 do
|
data/test/test_flog_cli.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.6.
|
4
|
+
version: 4.6.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
13
|
+
MIIDPjCCAiagAwIBAgIBBjANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
|
14
14
|
ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
|
15
|
-
|
15
|
+
GRYDY29tMB4XDTIxMTIyMzIzMTkwNFoXDTIyMTIyMzIzMTkwNFowRTETMBEGA1UE
|
16
16
|
AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
|
17
17
|
JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
|
18
18
|
b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
|
@@ -22,14 +22,14 @@ cert_chain:
|
|
22
22
|
qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
|
23
23
|
gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
|
24
24
|
HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
AQCKB5jfsuSnKb+t/Wrh3UpdkmX7TrEsjVmERC0pPqzQ5GQJgmEXDD7oMgaKXaAq
|
26
|
+
x2m+KSZDrqk7c8uho5OX6YMqg4KdxehfSLqqTZGoeV78qwf/jpPQZKTf+W9gUSJh
|
27
|
+
zsWpo4K50MP+QtdSbKXZwjAafpQ8hK0MnnZ/aeCsW9ov5vdXpYbf3dpg6ADXRGE7
|
28
|
+
lQY2y1tJ5/chqu6h7dQmnm2ABUqx9O+JcN9hbCYoA5i/EeubUEtFIh2w3SpO6YfB
|
29
|
+
JFmxn4h9YO/pVdB962BdBNNDia0kgIjI3ENnkLq0dKpYU3+F3KhEuTksLO0L6X/V
|
30
|
+
YsuyUzsMz6GQA4khyaMgKNSD
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date:
|
32
|
+
date: 2022-07-04 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: sexp_processor
|
@@ -49,22 +49,22 @@ dependencies:
|
|
49
49
|
name: ruby_parser
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ">"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 3.1.0
|
55
52
|
- - "~>"
|
56
53
|
- !ruby/object:Gem::Version
|
57
54
|
version: '3.1'
|
55
|
+
- - ">"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 3.1.0
|
58
58
|
type: :runtime
|
59
59
|
prerelease: false
|
60
60
|
version_requirements: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
|
-
- - ">"
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: 3.1.0
|
65
62
|
- - "~>"
|
66
63
|
- !ruby/object:Gem::Version
|
67
64
|
version: '3.1'
|
65
|
+
- - ">"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 3.1.0
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
69
|
name: path_expander
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
@@ -79,6 +79,20 @@ dependencies:
|
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
81
|
version: '1.0'
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: minitest
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '5.0'
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '5.0'
|
82
96
|
- !ruby/object:Gem::Dependency
|
83
97
|
name: rdoc
|
84
98
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,14 +119,14 @@ dependencies:
|
|
105
119
|
requirements:
|
106
120
|
- - "~>"
|
107
121
|
- !ruby/object:Gem::Version
|
108
|
-
version: '3.
|
122
|
+
version: '3.24'
|
109
123
|
type: :development
|
110
124
|
prerelease: false
|
111
125
|
version_requirements: !ruby/object:Gem::Requirement
|
112
126
|
requirements:
|
113
127
|
- - "~>"
|
114
128
|
- !ruby/object:Gem::Version
|
115
|
-
version: '3.
|
129
|
+
version: '3.24'
|
116
130
|
description: |-
|
117
131
|
Flog reports the most tortured code in an easy to read pain
|
118
132
|
report. The higher the score, the more pain the code is in.
|
@@ -141,8 +155,10 @@ files:
|
|
141
155
|
homepage: http://ruby.sadi.st/
|
142
156
|
licenses:
|
143
157
|
- MIT
|
144
|
-
metadata:
|
145
|
-
|
158
|
+
metadata:
|
159
|
+
homepage_uri: http://ruby.sadi.st/
|
160
|
+
source_code_uri: https://github.com/seattlerb/flog
|
161
|
+
post_install_message:
|
146
162
|
rdoc_options:
|
147
163
|
- "--main"
|
148
164
|
- README.rdoc
|
@@ -159,8 +175,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
175
|
- !ruby/object:Gem::Version
|
160
176
|
version: '0'
|
161
177
|
requirements: []
|
162
|
-
rubygems_version: 3.
|
163
|
-
signing_key:
|
178
|
+
rubygems_version: 3.3.12
|
179
|
+
signing_key:
|
164
180
|
specification_version: 4
|
165
181
|
summary: Flog reports the most tortured code in an easy to read pain report
|
166
182
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|