flay 2.13.3 → 2.14.4

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: f398ea8e7f796a1871faedb32dbee7d7377d30abcc91edd075f2015a6be95c74
4
- data.tar.gz: cdb49c908285be2c5c40118a33e7d0227e4a32a4b31736b374aaf31a43e58ac6
3
+ metadata.gz: be4e30464c63609fc7e169633d341a4479794effbeab1cddae17ec61b7aa99c1
4
+ data.tar.gz: a5d0d7e99cba3df3c022c8524d215509f2fc7ccbec9c547332ef4a67d7473aaf
5
5
  SHA512:
6
- metadata.gz: 9c7f5b54202e563702d21ee8006d24124dd7810bb3518ae307a1eba17966a042864af2c0b772df9deab11517a8a6268159e5503d6fe70845722ef3544b7b84a9
7
- data.tar.gz: 301d1e56ecfd1c12e8d41e826e56c44899598712aec55daac4ba55f74df547e5421250c3ea8dace955edaeacacd0a513c4a3e888f83aa47fddcfe340fb49c9b2
6
+ metadata.gz: 2686fd16226e533a3c6689025c14839ac7f446c12d572ab74799ad5db0a1c57fdf6d7674eb496e71ed3fbfcad3cc61b656db5bf7dde46fbfbb695babfcdbece5
7
+ data.tar.gz: 535c3aa7a9db9a4b98d1610e9c26dfea88a2afdc0782c030558e935f13f12442ec886df01c29afe723d70f44840a416b99f059947ee9e43a1a7f534e96c26293
checksums.yaml.gz.sig CHANGED
Binary file
data/History.rdoc CHANGED
@@ -1,3 +1,38 @@
1
+ === 2.14.4 / 2026-04-14
2
+
3
+ * 2 bug fixes:
4
+
5
+ * Fix Sexp#[] to return empty sexp if indicies run off the end. (slbug)
6
+ * Loosened dependency on ruby2ruby to catch up and drop ruby_parser.
7
+
8
+ === 2.14.3 / 2026-03-23
9
+
10
+ * 2 bug fixes:
11
+
12
+ * Fix Sexp#[] to return a Sexp to ensure process_fuzzy can sort sub-sexps.
13
+ * Make Sexp#[] return a single element if integer is used.
14
+
15
+ === 2.14.2 / 2026-01-06
16
+
17
+ * 1 bug fix:
18
+
19
+ * Namespace NotRubyParser to avoid problems with bundler's horrid eager loading. (nateberkopec)
20
+
21
+ === 2.14.1 / 2025-12-20
22
+
23
+ * 3 bug fixes:
24
+
25
+ * Bumped dependency to prism to get some upstreamed fixes.
26
+ * Loosened the minitest dependency to include MT6.
27
+ * Removed local copy of the upstreamed fixes.
28
+
29
+ === 2.14.0 / 2025-12-11
30
+
31
+ * 2 minor enhancements:
32
+
33
+ * Bumped path_expander to 2.0.0.
34
+ * Switched to prism for ruby parsing. Use --legacy for RubyParser.
35
+
1
36
  === 2.13.3 / 2024-05-21
2
37
 
3
38
  * 2 bug fixes:
data/Rakefile CHANGED
@@ -4,14 +4,13 @@ require "rubygems"
4
4
  require "hoe"
5
5
 
6
6
  Hoe::add_include_dirs("../../sexp_processor/dev/lib",
7
- "../../ruby_parser/dev/lib",
8
7
  "../../ruby2ruby/dev/lib",
9
8
  "../../ZenTest/dev/lib",
10
9
  "../../path_expander/dev/lib",
11
10
  "lib")
12
11
 
13
12
  Hoe.plugin :seattlerb
14
- Hoe.plugin :isolate
13
+ Hoe.plugin :isolate_binaries
15
14
  Hoe.plugin :rdoc
16
15
  Hoe.plugin :bundler
17
16
 
@@ -20,12 +19,12 @@ Hoe.spec "flay" do
20
19
  license "MIT"
21
20
 
22
21
  dependency "sexp_processor", "~> 4.0"
23
- dependency "ruby_parser", "~> 3.0"
22
+ dependency "prism", "~> 1.7"
24
23
  dependency "erubi", "~> 1.10"
25
- dependency "path_expander", "~> 1.0"
24
+ dependency "path_expander", "~> 2.0"
26
25
 
27
- dependency "minitest", "~> 5.8.0", :dev
28
- dependency "ruby2ruby", "~> 2.2.0", :dev
26
+ dependency "minitest", "> 5.8", :dev
27
+ dependency "ruby2ruby", "~> 2.2", :dev
29
28
 
30
29
  self.flay_threshold = 250
31
30
  end
data/lib/flay.rb CHANGED
@@ -2,13 +2,16 @@
2
2
 
3
3
  require "optparse"
4
4
  require "sexp_processor"
5
- require "ruby_parser"
6
5
  require "path_expander"
7
6
  require "timeout"
8
7
  require "zlib"
8
+ require "prism"
9
+ require "prism/translation/ruby_parser"
9
10
 
10
11
  class Flay
11
- VERSION = "2.13.3" # :nodoc:
12
+ VERSION = "2.14.4" # :nodoc:
13
+
14
+ NotRubyParser = Class.new Prism::Translation::RubyParser # compatibility layer :nodoc:
12
15
 
13
16
  class Item < Struct.new(:structural_hash, :name, :bonus, :mass, :locations)
14
17
  alias identical? bonus
@@ -45,6 +48,7 @@ class Flay
45
48
  :fuzzy => false,
46
49
  :only => nil,
47
50
  :filters => [],
51
+ :parser => NotRubyParser,
48
52
  }
49
53
  end
50
54
 
@@ -106,6 +110,11 @@ class Flay
106
110
  options[:timeout] = t.to_i
107
111
  end
108
112
 
113
+ opts.on("-t", "--legacy", "Use RubyParser to parse.") do
114
+ require "ruby_parser"
115
+ options[:parser] = RubyParser
116
+ end
117
+
109
118
  extensions = ["rb"] + Flay.load_plugins
110
119
 
111
120
  opts.separator ""
@@ -266,7 +275,8 @@ class Flay
266
275
 
267
276
  def process_rb file
268
277
  begin
269
- RubyParser.new.process(File.binread(file), file, option[:timeout])
278
+ parser = option[:parser].new
279
+ parser.process(File.binread(file), file, option[:timeout])
270
280
  rescue Timeout::Error
271
281
  warn "TIMEOUT parsing #{file}. Skipping."
272
282
  end
@@ -445,7 +455,7 @@ class Flay
445
455
  end
446
456
 
447
457
  def collapse_and_label ary # :nodoc:
448
- ary[0].zip(*ary[1..-1]).map { |lines|
458
+ ary.first.zip(*ary.drop(1)).map { |lines|
449
459
  if lines.uniq.size == 1 then
450
460
  " #{lines.first}"
451
461
  else
@@ -574,14 +584,8 @@ class Sexp
574
584
  alias :[] :[] # needed for STRICT_SEXP
575
585
 
576
586
  def [] a # :nodoc:
577
- # TODO: figure out a way to make this STRICT_SEXP happy
578
- s = super
579
- if Sexp === s then
580
- s.file = self.file
581
- s.line = self.line
582
- s.modified = self.modified
583
- end
584
- s
587
+ return super if Integer === a
588
+ self.new._concat super || []
585
589
  end
586
590
 
587
591
  def + o # :nodoc:
data/lib/flay_erb.rb CHANGED
@@ -13,7 +13,8 @@ class Flay
13
13
  ruby = Erubi.new(erb).src
14
14
 
15
15
  begin
16
- RubyParser.new.process(ruby, file)
16
+ parser = option[:parser].new
17
+ parser.process(ruby, file, option[:timeout])
17
18
  rescue => e
18
19
  warn ruby if option[:verbose]
19
20
  raise e
data/test/test_flay.rb CHANGED
@@ -4,11 +4,8 @@ require "minitest/autorun"
4
4
  require "flay"
5
5
  require "tmpdir"
6
6
 
7
- $: << "../../sexp_processor/dev/lib"
8
-
9
7
  class TestSexp < Minitest::Test
10
8
  OPTS = Flay.parse_options %w[--mass=1 -v]
11
- DEF_OPTS = {:diff=>false, :mass=>16, :summary=>false, :verbose=>false, :number=>true, :timeout=>10, :liberal=>false, :fuzzy=>false, :only=>nil}
12
9
 
13
10
  def setup
14
11
  # a(1) { |c| d }
@@ -65,7 +62,9 @@ class TestSexp < Minitest::Test
65
62
  assert_equal expected, x.sort.uniq
66
63
  end
67
64
 
68
- DOG_AND_CAT = RubyParser.new.process <<-RUBY
65
+ NotRubyParser = Flay::NotRubyParser
66
+
67
+ DOG_AND_CAT = NotRubyParser.new.process <<~RUBY
69
68
  ##
70
69
  # I am a dog.
71
70
 
@@ -88,7 +87,7 @@ class TestSexp < Minitest::Test
88
87
  end
89
88
  RUBY
90
89
 
91
- ROUND = RubyParser.new.process <<-RUBY
90
+ ROUND = NotRubyParser.new.process <<~RUBY
92
91
  def x(n)
93
92
  if n % 2 == 0
94
93
  return n
@@ -106,7 +105,7 @@ class TestSexp < Minitest::Test
106
105
  flay.process_sexp s(:outer,contained)
107
106
  2.times { flay.process_sexp s(:outer,container) }
108
107
 
109
- exp = eval <<-EOM # just to prevent emacs from reindenting it
108
+ exp = eval <<~EOM # just to prevent emacs from reindenting it
110
109
  [
111
110
  [ s(:a, s(:b, s(:c)), s(:d, s(:e))),
112
111
  s(:a, s(:b, s(:c)), s(:d, s(:e))),
@@ -142,7 +141,7 @@ class TestSexp < Minitest::Test
142
141
  flay.process_sexp s(:outer,contained)
143
142
  2.times { flay.process_sexp s(:outer,container) }
144
143
 
145
- exp = eval <<-EOM # just to prevent emacs from reindenting it
144
+ exp = eval <<~EOM # just to prevent emacs from reindenting it
146
145
  [
147
146
  [ s(:a, s(:b, s(:c)), s(:d, s(:e))),
148
147
  s(:a, s(:b, s(:c)), s(:d, s(:e))),
@@ -218,7 +217,7 @@ class TestSexp < Minitest::Test
218
217
  flay.report
219
218
  end
220
219
 
221
- exp = <<-END.gsub(/\d+/, "N").gsub(/^ {6}/, "")
220
+ exp = <<~END
222
221
  Total score (lower is better) = 16
223
222
 
224
223
  1) Similar code found in :class (mass = 16)
@@ -227,7 +226,94 @@ class TestSexp < Minitest::Test
227
226
  END
228
227
 
229
228
  assert_equal "", err
230
- assert_equal exp, out.gsub(/\d+/, "N")
229
+ assert_equal exp.gsub(/\d+/, "N"), out.gsub(/\d+/, "N")
230
+ end
231
+
232
+ def test_sexp_idx
233
+ # sexp = NotRubyParser.new.parse "def x(n); n + 1; end"
234
+ sexp = s(:defn, :x, s(:args, :n),
235
+ s(:call, s(:lvar, :n), :+, s(:lit, 1)))
236
+
237
+ assert_equal :defn, sexp[0]
238
+ assert_equal s(:defn), sexp[0..0]
239
+ assert_equal s(:defn, :x), sexp[0..1]
240
+ end
241
+
242
+ def test_sexp_idx__off
243
+ # sexp = NotRubyParser.new.parse "->(something) { something.to_s }"
244
+ sexp = s(:iter,
245
+ s(:lambda),
246
+ s(:args, :something),
247
+ s(:call, s(:lvar, :something), :to_s))
248
+
249
+ # def arguments_element
250
+ # call_element.sexp_body(3) || []
251
+ call_element = sexp[1] # s(:lambda) = this is just wrong
252
+
253
+ assert_equal s(), call_element[3..-1]
254
+ assert_equal s(), call_element.sexp_body(3)
255
+ end
256
+
257
+ def test__fuzzy__split_at
258
+ # def x(n); n + 1; end
259
+ sexp = s(:defn, :x, s(:args, :n), s(:call, s(:lvar, :n), :+, s(:lit, 1)))
260
+ # sexp = NotRubyParser.new.parse "def x(n); n + 1; end"
261
+
262
+ a, b = sexp.split_at 2
263
+
264
+ assert_equal s(:defn, :x, s(:args, :n)), a
265
+ assert_equal s(s(:call, s(:lvar, :n), :+, s(:lit, 1))), b
266
+ end
267
+
268
+ def test__fuzzy__split_code
269
+ # def x(n); n + 1; end
270
+ sexp = s(:defn, :x, s(:args, :n), s(:call, s(:lvar, :n), :+, s(:lit, 1)))
271
+ # sexp = NotRubyParser.new.parse "def x(n); n + 1; end"
272
+
273
+ a, b = sexp.split_code
274
+
275
+ assert_equal s(:defn, :x, s(:args, :n)), a
276
+ assert_equal s(s(:call, s(:lvar, :n), :+, s(:lit, 1))), b
277
+ end
278
+
279
+ FUZZY_CODE = NotRubyParser.new.process <<-RUBY
280
+ def a
281
+ f1; f2; f3; f4; f5; f6
282
+ end
283
+
284
+ def b
285
+ f2; f3; f4; f5; f6
286
+ end
287
+
288
+ def c
289
+ f2; f3; f4; f5; f6; f7
290
+ end
291
+ RUBY
292
+
293
+ def test_report__fuzzy
294
+ flay = Flay.new OPTS.merge(fuzzy: 1, mass: 5)
295
+
296
+ flay.process_sexp FUZZY_CODE.deep_clone
297
+
298
+ out, err = capture_io do
299
+ flay.report
300
+ end
301
+
302
+ exp = <<~END
303
+ Total score (lower is better) = 37
304
+
305
+ 1) Similar code found in :defn (mass = 21)
306
+ (string):1 (FUZZY)
307
+ (string):5
308
+ (string):9 (FUZZY)
309
+
310
+ 2) Similar code found in :defn (mass = 16)
311
+ (string):1
312
+ (string):9
313
+ END
314
+
315
+ assert_equal "", err
316
+ assert_equal exp.gsub(/\d+/, "N"), out.gsub(/\d+/, "N")
231
317
  end
232
318
 
233
319
  def test_report_io
@@ -238,7 +324,7 @@ class TestSexp < Minitest::Test
238
324
  flay.analyze
239
325
  flay.report out
240
326
 
241
- exp = <<-END.gsub(/\d+/, "N").gsub(/^ {6}/, "")
327
+ exp = <<~END
242
328
  Total score (lower is better) = 16
243
329
 
244
330
  1) Similar code found in :class (mass = 16)
@@ -246,7 +332,7 @@ class TestSexp < Minitest::Test
246
332
  (string):6
247
333
  END
248
334
 
249
- assert_equal exp, out.string.gsub(/\d+/, "N")
335
+ assert_equal exp.gsub(/\d+/, "N"), out.string.gsub(/\d+/, "N")
250
336
  end
251
337
 
252
338
  def test_report_diff
@@ -259,7 +345,7 @@ class TestSexp < Minitest::Test
259
345
  flay.report
260
346
  end
261
347
 
262
- exp = <<-END.gsub(/\d+/, "N").gsub(/^ {6}/, "")
348
+ exp = <<~END.gsub(/_NL_/, "")
263
349
  Total score (lower is better) = 16
264
350
 
265
351
  1) Similar code found in :class (mass = 16)
@@ -272,7 +358,7 @@ class TestSexp < Minitest::Test
272
358
  B: # am
273
359
  B: # a
274
360
  B: # cat.
275
-
361
+ _NL_
276
362
  A: class Dog
277
363
  B: class Cat
278
364
  A: def x
@@ -283,7 +369,7 @@ class TestSexp < Minitest::Test
283
369
  END
284
370
 
285
371
  assert_equal "", err
286
- assert_equal exp, out.gsub(/\d+/, "N").gsub(/^ {3}$/, "")
372
+ assert_equal exp.gsub(/\d+/, "N"), out.gsub(/\d+/, "N")
287
373
  end
288
374
 
289
375
  def test_report_diff_plugin_converter
@@ -301,7 +387,7 @@ class TestSexp < Minitest::Test
301
387
 
302
388
  Flay.send(:remove_method, :sexp_to_)
303
389
 
304
- exp = <<-END.gsub(/\d+/, "N").gsub(/^ {6}/, "")
390
+ exp = <<~END
305
391
  Total score (lower is better) = 16
306
392
 
307
393
  1) Similar code found in :class (mass = 16)
@@ -313,7 +399,7 @@ class TestSexp < Minitest::Test
313
399
  END
314
400
 
315
401
  assert_equal "", err
316
- assert_equal exp, out.gsub(/\d+/, "N").gsub(/^ {3}$/, "")
402
+ assert_equal exp.gsub(/\d+/, "N"), out.gsub(/\d+/, "N")
317
403
  end
318
404
 
319
405
  def test_n_way_diff
@@ -322,7 +408,7 @@ class TestSexp < Minitest::Test
322
408
 
323
409
  flay = Flay.new
324
410
 
325
- exp = <<-EOM.gsub(/\d+/, "N").gsub(/^ {6}/, "").chomp
411
+ exp = <<~EOM.chomp
326
412
  ##
327
413
  A: # I am a dog.
328
414
  B: # I
@@ -349,7 +435,7 @@ class TestSexp < Minitest::Test
349
435
 
350
436
  flay = Flay.new
351
437
 
352
- exp = <<-EOM.gsub(/\d+/, "N").gsub(/^ {6}/, "").chomp
438
+ exp = <<~EOM.gsub(/\d+/, "N").chomp
353
439
  A: class Dog
354
440
  B: class Cat
355
441
  A: def x
@@ -359,7 +445,7 @@ class TestSexp < Minitest::Test
359
445
  end
360
446
  EOM
361
447
 
362
- assert_equal exp, flay.n_way_diff(*dog_and_cat).gsub(/^ {3}$/, "")
448
+ assert_equal exp, flay.n_way_diff(*dog_and_cat)
363
449
  end
364
450
 
365
451
  def test_split_and_group
@@ -393,10 +479,12 @@ class TestSexp < Minitest::Test
393
479
  def test_collapse_and_label
394
480
  flay = Flay.new
395
481
 
396
- a = %w(a b c).map { |s| s.group = "A"; s }
397
- b = %w(d b f).map { |s| s.group = "B"; s }
482
+ a = %w(a b c).map(&:dup).map { |s| s.group = "A"; s }
483
+ b = %w(d b f).map(&:dup).map { |s| s.group = "B"; s }
398
484
 
399
- exp = [["A: a", "B: d"], " b", ["A: c", "B: f"]]
485
+ exp = [["A: a", "B: d"],
486
+ " b",
487
+ ["A: c", "B: f"]]
400
488
 
401
489
  assert_equal exp, flay.collapse_and_label([a, b])
402
490
  end
@@ -404,8 +492,8 @@ class TestSexp < Minitest::Test
404
492
  def test_collapse_and_label_same
405
493
  flay = Flay.new
406
494
 
407
- a = %w(a b c).map { |s| s.group = "A"; s }
408
- b = %w(a b c).map { |s| s.group = "B"; s }
495
+ a = %w(a b c).map(&:dup).map { |s| s.group = "A"; s }
496
+ b = %w(a b c).map(&:dup).map { |s| s.group = "B"; s }
409
497
 
410
498
  exp = [" a", " b", " c"]
411
499
 
@@ -416,9 +504,9 @@ class TestSexp < Minitest::Test
416
504
  dog_and_cat = ["##\n# I am a dog.\n\ndef x\n return \"Hello\"\nend",
417
505
  "##\n# I\n#\n# am\n# a\n# cat.\n\ndef y\n return \"Hello\"\nend"]
418
506
 
419
- flay = Flay.new DEF_OPTS
507
+ flay = Flay.new Flay.default_options
420
508
 
421
- exp = <<-EOM.gsub(/\d+/, "N").gsub(/^ {6}/, "").chomp
509
+ exp = <<~EOM.gsub(/\d+/, "N").gsub(/_NL_/, "").chomp
422
510
  ##
423
511
  A: # I am a dog.
424
512
  B: # I
@@ -426,14 +514,14 @@ class TestSexp < Minitest::Test
426
514
  B: # am
427
515
  B: # a
428
516
  B: # cat.
429
-
517
+ _NL_
430
518
  A: def x
431
519
  B: def y
432
520
  return \"Hello\"
433
521
  end
434
522
  EOM
435
523
 
436
- assert_equal exp, flay.n_way_diff(*dog_and_cat).gsub(/^ {3}$/, "")
524
+ assert_equal exp, flay.n_way_diff(*dog_and_cat)
437
525
  end
438
526
 
439
527
  attr_accessor :flay
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,18 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flay
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.13.3
4
+ version: 2.14.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Davis
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain:
11
10
  - |
12
11
  -----BEGIN CERTIFICATE-----
13
- MIIDPjCCAiagAwIBAgIBCDANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
12
+ MIIDPjCCAiagAwIBAgIBCjANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
14
13
  ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
15
- GRYDY29tMB4XDTI0MDEwMjIxMjEyM1oXDTI1MDEwMTIxMjEyM1owRTETMBEGA1UE
14
+ GRYDY29tMB4XDTI2MDEwNzAxMDkxNFoXDTI3MDEwNzAxMDkxNFowRTETMBEGA1UE
16
15
  AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
17
16
  JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
18
17
  b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
@@ -22,14 +21,14 @@ cert_chain:
22
21
  qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
23
22
  gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
24
23
  HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB
25
- AQCygvpmncmkiSs9r/Kceo4bBPDszhTv6iBi4LwMReqnFrpNLMOWJw7xi8x+3eL2
26
- XS09ZPNOt2zm70KmFouBMgOysnDY4k2dE8uF6B8JbZOO8QfalW+CoNBliefOTcn2
27
- bg5IOP7UoGM5lC174/cbDJrJnRG9bzig5FAP0mvsgA8zgTRXQzIUAZEo92D5K7p4
28
- B4/O998ho6BSOgYBI9Yk1ttdCtti6Y+8N9+fZESsjtWMykA+WXWeGUScHqiU+gH8
29
- S7043fq9EbQdBr2AXdj92+CDwuTfHI6/Hj5FVBDULufrJaan4xUgL70Hvc6pTTeW
30
- deKfBjgVAq7EYHu1AczzlUly
24
+ AQA/X8/PKTTc/IkYQEUL6XWtfK8fAfbuLJzmLcz6f2ZWrtBvPsYvqRuwI1bWUtil
25
+ 2ibJEfIuSIHX6BsUTX18+hlaIussf6EWq/YkE7e2BKmgQE42vSOZMce0kCEAPbx0
26
+ rQtqonfWTHQ8UbQ7GqCL3gDQ0QDD2B+HUlb4uaCZ2icxqa/eOtxMvHC2tj+h0xKY
27
+ xL84ipM5kr0bHGf9/MRZJWcw51urueNycBXu1Xh+pEN8qBmYsFRR4SIODLClybAO
28
+ 6cbm2PyPQgKNiqE4H+IQrDVHd9bJs1XgLElk3qoaJBWXc/5fy0J1imYb25UqmiHG
29
+ snGe1hrppvBRdcyEzvhfIPjI
31
30
  -----END CERTIFICATE-----
32
- date: 2024-05-22 00:00:00.000000000 Z
31
+ date: 1980-01-02 00:00:00.000000000 Z
33
32
  dependencies:
34
33
  - !ruby/object:Gem::Dependency
35
34
  name: sexp_processor
@@ -46,19 +45,19 @@ dependencies:
46
45
  - !ruby/object:Gem::Version
47
46
  version: '4.0'
48
47
  - !ruby/object:Gem::Dependency
49
- name: ruby_parser
48
+ name: prism
50
49
  requirement: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
- version: '3.0'
53
+ version: '1.7'
55
54
  type: :runtime
56
55
  prerelease: false
57
56
  version_requirements: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - "~>"
60
59
  - !ruby/object:Gem::Version
61
- version: '3.0'
60
+ version: '1.7'
62
61
  - !ruby/object:Gem::Dependency
63
62
  name: erubi
64
63
  requirement: !ruby/object:Gem::Requirement
@@ -79,80 +78,102 @@ dependencies:
79
78
  requirements:
80
79
  - - "~>"
81
80
  - !ruby/object:Gem::Version
82
- version: '1.0'
81
+ version: '2.0'
83
82
  type: :runtime
84
83
  prerelease: false
85
84
  version_requirements: !ruby/object:Gem::Requirement
86
85
  requirements:
87
86
  - - "~>"
88
87
  - !ruby/object:Gem::Version
89
- version: '1.0'
88
+ version: '2.0'
90
89
  - !ruby/object:Gem::Dependency
91
90
  name: minitest
92
91
  requirement: !ruby/object:Gem::Requirement
93
92
  requirements:
94
- - - "~>"
93
+ - - ">"
95
94
  - !ruby/object:Gem::Version
96
- version: 5.8.0
95
+ version: '5.8'
97
96
  type: :development
98
97
  prerelease: false
99
98
  version_requirements: !ruby/object:Gem::Requirement
100
99
  requirements:
101
- - - "~>"
100
+ - - ">"
102
101
  - !ruby/object:Gem::Version
103
- version: 5.8.0
102
+ version: '5.8'
104
103
  - !ruby/object:Gem::Dependency
105
104
  name: ruby2ruby
106
105
  requirement: !ruby/object:Gem::Requirement
107
106
  requirements:
108
107
  - - "~>"
109
108
  - !ruby/object:Gem::Version
110
- version: 2.2.0
109
+ version: '2.2'
111
110
  type: :development
112
111
  prerelease: false
113
112
  version_requirements: !ruby/object:Gem::Requirement
114
113
  requirements:
115
114
  - - "~>"
116
115
  - !ruby/object:Gem::Version
117
- version: 2.2.0
116
+ version: '2.2'
118
117
  - !ruby/object:Gem::Dependency
119
118
  name: rdoc
120
119
  requirement: !ruby/object:Gem::Requirement
121
120
  requirements:
122
121
  - - ">="
123
122
  - !ruby/object:Gem::Version
124
- version: '4.0'
123
+ version: '6.0'
125
124
  - - "<"
126
125
  - !ruby/object:Gem::Version
127
- version: '7'
126
+ version: '8'
128
127
  type: :development
129
128
  prerelease: false
130
129
  version_requirements: !ruby/object:Gem::Requirement
131
130
  requirements:
132
131
  - - ">="
133
132
  - !ruby/object:Gem::Version
134
- version: '4.0'
133
+ version: '6.0'
135
134
  - - "<"
136
135
  - !ruby/object:Gem::Version
137
- version: '7'
136
+ version: '8'
138
137
  - !ruby/object:Gem::Dependency
139
138
  name: hoe
140
139
  requirement: !ruby/object:Gem::Requirement
141
140
  requirements:
142
141
  - - "~>"
143
142
  - !ruby/object:Gem::Version
144
- version: '4.2'
143
+ version: '4.6'
145
144
  type: :development
146
145
  prerelease: false
147
146
  version_requirements: !ruby/object:Gem::Requirement
148
147
  requirements:
149
148
  - - "~>"
150
149
  - !ruby/object:Gem::Version
151
- version: '4.2'
150
+ version: '4.6'
152
151
  description: |-
153
152
  Flay analyzes code for structural similarities. Differences in literal
154
153
  values, variable, class, method names, whitespace, programming style,
155
154
  braces vs do/end, etc are all ignored. Making this totally rad.
155
+
156
+ == Features/Problems:
157
+
158
+ * Reports differences at any level of code.
159
+ * Adds a score multiplier to identical nodes.
160
+ * Differences in literal values, variable, class, and method names are ignored.
161
+ * Differences in whitespace, programming style, braces vs do/end, etc are ignored.
162
+ * Works across files.
163
+ * Add the flay-persistent plugin to work across large/many projects.
164
+ * Run --diff to see an N-way diff of the code.
165
+ * Provides conservative (default) and --liberal pruning options.
166
+ * Provides --fuzzy duplication detection.
167
+ * Language independent: Plugin system allows other languages to be flayed.
168
+ * Ships with .rb and .erb.
169
+ * javascript and others will be available separately.
170
+ * Includes FlayTask for Rakefiles.
171
+ * Uses path_expander, so you can use:
172
+ * dir_arg -- expand a directory automatically
173
+ * @file_of_args -- persist arguments in a file
174
+ * -path_to_subtract -- ignore intersecting subsets of files/directories
175
+ * Skips files matched via patterns in .flayignore (subset format of .gitignore).
176
+ * Totally rad.
156
177
  email:
157
178
  - ryand-ruby@zenspider.com
158
179
  executables:
@@ -179,7 +200,7 @@ licenses:
179
200
  metadata:
180
201
  homepage_uri: http://ruby.sadi.st/
181
202
  source_code_uri: https://github.com/seattlerb/flay
182
- post_install_message:
203
+ documentation_uri: http://docs.seattlerb.org/flay/
183
204
  rdoc_options:
184
205
  - "--main"
185
206
  - README.rdoc
@@ -196,8 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
217
  - !ruby/object:Gem::Version
197
218
  version: '0'
198
219
  requirements: []
199
- rubygems_version: 3.5.3
200
- signing_key:
220
+ rubygems_version: 3.7.2
201
221
  specification_version: 4
202
222
  summary: Flay analyzes code for structural similarities
203
223
  test_files: []
metadata.gz.sig CHANGED
Binary file