flay 2.11.0 → 2.13.0

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: 8ba894eeca0c7966356ccb85f9252f47cf27e2ee34252288502cc70c50aa4d64
4
- data.tar.gz: eb4552d71f43350ec698c3ef36a17d0b18b93c65e54666240af786952ed8e512
3
+ metadata.gz: ae1c2d1ab38f3aa6a03b5d110f00f5548d661de7380373ae9d61265f682b6976
4
+ data.tar.gz: bf0dd5d5f85d35c4eb953e634071c5499e622c17ca11e9fa4089d2a7bc9f3964
5
5
  SHA512:
6
- metadata.gz: 921301e4deb3c56b8eaf8fa1078ddb20f5bb9a3bf298ecea377df3440b8fc6e17f2475fbc31a1009b66042876289082bf61139bc982293c5530a51975966f793
7
- data.tar.gz: 25e52c615125a7d06f59b41d1191dfca7c56a861d1c4a968f188dedd231b9d64fe84ab6c223526af10785e70b488600be4a4840754291b5408056cd9e11f7a82
6
+ metadata.gz: 81c6471ba30b5d57ff3d1698d4920d3b94fa3161e4f36d2ce8ca22c42ab8476bb02a23a9884261e742c2d3e1efa8380c4f3995bd2c216634de695338848f79ef
7
+ data.tar.gz: 8daaba1c53636b86d1682606750bfd07b27590c34eb19799f267d6c76a0dd8dfff53ecbe14e3211a3b094751e25df44ffb3de4bf518d0970272edd53ad6f97df
checksums.yaml.gz.sig CHANGED
Binary file
data/History.rdoc CHANGED
@@ -1,3 +1,25 @@
1
+ === 2.13.0 / 2022-04-09
2
+
3
+ * 1 minor enhancement:
4
+
5
+ * Switched from erubis to erubi for erb processing. (clive-devops)
6
+
7
+ * 1 bug fix:
8
+
9
+ * Minor cleanup and top-level error handling changes.
10
+
11
+ === 2.12.1 / 2019-10-08
12
+
13
+ * 1 bug fix:
14
+
15
+ * Fixed some sexp access under STRICT_SEXP=1.
16
+
17
+ === 2.12.0 / 2018-04-29
18
+
19
+ * 1 minor enhancement:
20
+
21
+ * Switched node filtering to happen before processing to avoid subtrees getting processed. Thanks to codeclimate.com for funding this effort!
22
+
1
23
  === 2.11.0 / 2018-04-05
2
24
 
3
25
  * 2 minor enhancements:
data/Rakefile CHANGED
@@ -21,7 +21,7 @@ Hoe.spec "flay" do
21
21
 
22
22
  dependency "sexp_processor", "~> 4.0"
23
23
  dependency "ruby_parser", "~> 3.0"
24
- dependency "erubis", "~> 2.7.0"
24
+ dependency "erubi", "~> 1.10"
25
25
  dependency "path_expander", "~> 1.0"
26
26
 
27
27
  dependency "minitest", "~> 5.8.0", :dev
data/lib/flay.rb CHANGED
@@ -1,23 +1,14 @@
1
1
  #!/usr/bin/env ruby -w
2
2
 
3
3
  require "optparse"
4
- require "rubygems"
5
4
  require "sexp_processor"
6
5
  require "ruby_parser"
7
6
  require "path_expander"
8
7
  require "timeout"
9
8
  require "zlib"
10
9
 
11
- class File
12
- RUBY19 = "<3".respond_to? :encoding unless defined? RUBY19 # :nodoc:
13
-
14
- class << self
15
- alias :binread :read unless RUBY19
16
- end
17
- end
18
-
19
10
  class Flay
20
- VERSION = "2.11.0" # :nodoc:
11
+ VERSION = "2.13.0" # :nodoc:
21
12
 
22
13
  class Item < Struct.new(:structural_hash, :name, :bonus, :mass, :locations)
23
14
  alias identical? bonus
@@ -159,8 +150,8 @@ class Flay
159
150
  end
160
151
  end
161
152
  @@plugins
162
- rescue
163
- # ignore
153
+ rescue => e
154
+ warn "Error loading plugins: #{e}" if option[:verbose]
164
155
  end
165
156
 
166
157
  # :stopdoc:
@@ -228,10 +219,11 @@ class Flay
228
219
  update_masses
229
220
 
230
221
  sorted = masses.sort_by { |h,m|
222
+ exp = hashes[h].first
231
223
  [-m,
232
- hashes[h].first.file,
233
- hashes[h].first.line,
234
- hashes[h].first.first.to_s]
224
+ exp.file,
225
+ exp.line,
226
+ exp.sexp_type.to_s]
235
227
  }
236
228
 
237
229
  sorted.map { |hash, mass|
@@ -249,7 +241,7 @@ class Flay
249
241
  Location[x.file, x.line, extra]
250
242
  }
251
243
 
252
- Item[hash, node.first, bonus, mass, locs]
244
+ Item[hash, node.sexp_type, bonus, mass, locs]
253
245
  }.compact
254
246
  end
255
247
 
@@ -280,14 +272,26 @@ class Flay
280
272
  end
281
273
  end
282
274
 
275
+ ##
276
+ # Before processing, filter any sexp's that match against filters
277
+ # specified in +option[:filters]+. This changes the sexp itself.
278
+
279
+ def filter_sexp exp
280
+ exp.delete_if { |sexp|
281
+ if Sexp === sexp then
282
+ del = option[:filters].any? { |pattern| pattern.satisfy? sexp }
283
+ del or (filter_sexp(sexp); false)
284
+ end
285
+ }
286
+ end
287
+
283
288
  ##
284
289
  # Process a sexp +pt+.
285
290
 
286
291
  def process_sexp pt
287
- pt.deep_each do |node|
292
+ filter_sexp(pt).deep_each do |node|
288
293
  next :skip if node.none? { |sub| Sexp === sub }
289
294
  next :skip if node.mass < self.mass_threshold
290
- next :skip if option[:filters].any? { |pattern| pattern.satisfy? node }
291
295
 
292
296
  self.hashes[node.structural_hash] << node
293
297
 
@@ -330,22 +334,6 @@ class Flay
330
334
  end
331
335
  end
332
336
 
333
- ##
334
- # Given an array of sexp patterns (see sexp_processor), delete any
335
- # buckets whose members match any of the patterns.
336
-
337
- def filter *patterns
338
- return if patterns.empty?
339
-
340
- self.hashes.delete_if { |_, sexps|
341
- sexps.any? { |sexp|
342
- patterns.any? { |pattern|
343
- pattern =~ sexp
344
- }
345
- }
346
- }
347
- end
348
-
349
337
  ##
350
338
  # Prunes nodes that aren't relevant to analysis or are already
351
339
  # covered by another node. Also deletes nodes based on the
@@ -361,8 +349,6 @@ class Flay
361
349
  else
362
350
  prune_conservatively
363
351
  end
364
-
365
- self.filter(*option[:filters])
366
352
  end
367
353
 
368
354
  ##
@@ -585,7 +571,10 @@ class Sexp
585
571
  s
586
572
  end
587
573
 
574
+ alias :[] :[] # needed for STRICT_SEXP
575
+
588
576
  def [] a # :nodoc:
577
+ # TODO: figure out a way to make this STRICT_SEXP happy
589
578
  s = super
590
579
  if Sexp === s then
591
580
  s.file = self.file
@@ -642,7 +631,7 @@ class Sexp # straight from flay-persistent
642
631
  def pure_ruby_hash # :nodoc: see above
643
632
  hash = 0
644
633
 
645
- n = NODE_NAMES[first]
634
+ n = NODE_NAMES[sexp_type]
646
635
 
647
636
  raise "Bad lookup: #{first} in #{sexp.inspect}" unless n
648
637
 
data/lib/flay_erb.rb CHANGED
@@ -1,8 +1,5 @@
1
- #!/usr/bin/ruby
2
-
3
- require "rubygems"
4
1
  require "flay"
5
- require "erubis"
2
+ require "erubi"
6
3
 
7
4
  class Flay
8
5
 
@@ -13,7 +10,7 @@ class Flay
13
10
  def process_erb file
14
11
  erb = File.read file
15
12
 
16
- ruby = Erubis.new(erb).src
13
+ ruby = Erubi::Engine.new(erb).src
17
14
  begin
18
15
  RubyParser.new.process(ruby, file)
19
16
  rescue => e
@@ -21,24 +18,4 @@ class Flay
21
18
  raise e
22
19
  end
23
20
  end
24
-
25
- class Erubis < ::Erubis::Eruby # :nodoc:
26
- BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/
27
-
28
- def add_expr_literal(src, code)
29
- if code =~ BLOCK_EXPR
30
- src << '@output_buffer.append= ' << code
31
- else
32
- src << '@output_buffer.append=(' << code << ');'
33
- end
34
- end
35
-
36
- def add_expr_escaped(src, code)
37
- if code =~ BLOCK_EXPR
38
- src << "@output_buffer.safe_append= " << code
39
- else
40
- src << "@output_buffer.safe_append=(" << code << ");"
41
- end
42
- end
43
- end
44
21
  end
data/test/test_flay.rb CHANGED
@@ -65,7 +65,7 @@ class TestSexp < Minitest::Test
65
65
  assert_equal expected, x.sort.uniq
66
66
  end
67
67
 
68
- DOG_AND_CAT = Ruby18Parser.new.process <<-RUBY
68
+ DOG_AND_CAT = RubyParser.new.process <<-RUBY
69
69
  ##
70
70
  # I am a dog.
71
71
 
@@ -88,7 +88,7 @@ class TestSexp < Minitest::Test
88
88
  end
89
89
  RUBY
90
90
 
91
- ROUND = Ruby18Parser.new.process <<-RUBY
91
+ ROUND = RubyParser.new.process <<-RUBY
92
92
  def x(n)
93
93
  if n % 2 == 0
94
94
  return n
@@ -196,7 +196,7 @@ class TestSexp < Minitest::Test
196
196
 
197
197
  flay.process_sexp ROUND.deep_clone
198
198
 
199
- actual = flay.hashes.values.map { |sexps| sexps.map { |sexp| sexp.first } }
199
+ actual = flay.hashes.values.map { |sexps| sexps.map(&:sexp_type) }
200
200
 
201
201
  assert_equal expected, actual.sort_by { |a| a.inspect }
202
202
  end
@@ -450,13 +450,12 @@ class TestSexp < Minitest::Test
450
450
  exp_foo = s(:begin,
451
451
  s(:begin,
452
452
  s(:filter_me,
453
- s(:a, s(:b)))))
453
+ s(:a, s(:b, s(:c, s(:d)))))))
454
454
 
455
455
  exp_bar = s(:begin,
456
456
  s(:begin,
457
457
  s(:filter_me,
458
- s(:a, s(:b)),
459
- s(:c))))
458
+ s(:a, s(:b, s(:c, s(:d)))))))
460
459
 
461
460
  filter = Sexp::Matcher.parse("(filter_me ___)")
462
461
  options = Flay.default_options.merge(mass: 0, filters: [filter])
@@ -467,8 +466,6 @@ class TestSexp < Minitest::Test
467
466
 
468
467
  refute_nodes :filter_me
469
468
 
470
- flay.prune
471
-
472
469
  assert_empty flay.hashes
473
470
  end
474
471
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flay
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.0
4
+ version: 2.13.0
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
- MIIDPjCCAiagAwIBAgIBAjANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
13
+ MIIDPjCCAiagAwIBAgIBBjANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
14
14
  ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
15
- GRYDY29tMB4XDTE3MTEyMTIxMTExMFoXDTE4MTEyMTIxMTExMFowRTETMBEGA1UE
15
+ GRYDY29tMB4XDTIxMTIyMzIzMTkwNFoXDTIyMTIyMzIzMTkwNFowRTETMBEGA1UE
16
16
  AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
17
17
  JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
18
18
  b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
@@ -21,15 +21,15 @@ cert_chain:
21
21
  GiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt
22
22
  qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
23
23
  gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
24
- HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBBQUAA4IB
25
- AQAfAXSQpsW7YSxd1csRtA/M4Zt0AMXFMd76GJ8Lgtg8G0+VFbdChRyDuDb0kPlW
26
- h9QQX/YABfCW8vxmssbMGrP+VGBAn7BbdTcfTlgCWrvMX1uL5aRL74nA4urKXqdW
27
- a0nP70K4958P3GffBdtE3KGkU5xstFnXGajxuBRnL66E15KU0BNehVxdG258bdPu
28
- EKN6MqBPftFiev3tuwqDV11r2GquDpniYcT+Mi8/PgeAgVT/afBeVgbB3KaZeTRR
29
- AhXhF6Wi2GTMezlj5jlI5XV7WsJUSwTp/YiVvcmT74ZaCRvexm6EnNhkrvJJ1Xeu
30
- V+HB+LYYhXWitInO/eXxDrFB
24
+ HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB
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: 2018-04-05 00:00:00.000000000 Z
32
+ date: 2022-04-09 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: sexp_processor
@@ -60,19 +60,19 @@ dependencies:
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.0'
62
62
  - !ruby/object:Gem::Dependency
63
- name: erubis
63
+ name: erubi
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 2.7.0
68
+ version: '1.10'
69
69
  type: :runtime
70
70
  prerelease: false
71
71
  version_requirements: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 2.7.0
75
+ version: '1.10'
76
76
  - !ruby/object:Gem::Dependency
77
77
  name: path_expander
78
78
  requirement: !ruby/object:Gem::Requirement
@@ -119,30 +119,36 @@ dependencies:
119
119
  name: rdoc
120
120
  requirement: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '4.0'
125
+ - - "<"
126
+ - !ruby/object:Gem::Version
127
+ version: '7'
125
128
  type: :development
126
129
  prerelease: false
127
130
  version_requirements: !ruby/object:Gem::Requirement
128
131
  requirements:
129
- - - "~>"
132
+ - - ">="
130
133
  - !ruby/object:Gem::Version
131
134
  version: '4.0'
135
+ - - "<"
136
+ - !ruby/object:Gem::Version
137
+ version: '7'
132
138
  - !ruby/object:Gem::Dependency
133
139
  name: hoe
134
140
  requirement: !ruby/object:Gem::Requirement
135
141
  requirements:
136
142
  - - "~>"
137
143
  - !ruby/object:Gem::Version
138
- version: '3.16'
144
+ version: '3.23'
139
145
  type: :development
140
146
  prerelease: false
141
147
  version_requirements: !ruby/object:Gem::Requirement
142
148
  requirements:
143
149
  - - "~>"
144
150
  - !ruby/object:Gem::Version
145
- version: '3.16'
151
+ version: '3.23'
146
152
  description: |-
147
153
  Flay analyzes code for structural similarities. Differences in literal
148
154
  values, variable, class, method names, whitespace, programming style,
@@ -170,8 +176,10 @@ files:
170
176
  homepage: http://ruby.sadi.st/
171
177
  licenses:
172
178
  - MIT
173
- metadata: {}
174
- post_install_message:
179
+ metadata:
180
+ homepage_uri: http://ruby.sadi.st/
181
+ source_code_uri: https://github.com/seattlerb/flay
182
+ post_install_message:
175
183
  rdoc_options:
176
184
  - "--main"
177
185
  - README.rdoc
@@ -188,9 +196,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
196
  - !ruby/object:Gem::Version
189
197
  version: '0'
190
198
  requirements: []
191
- rubyforge_project:
192
- rubygems_version: 2.7.3
193
- signing_key:
199
+ rubygems_version: 3.3.3
200
+ signing_key:
194
201
  specification_version: 4
195
202
  summary: Flay analyzes code for structural similarities
196
203
  test_files: []
metadata.gz.sig CHANGED
Binary file