Hello community,
here is the log from the commit of package rubygem-sexp_processor for
openSUSE:Factory checked in at 2017-04-20 20:58:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-sexp_processor (Old)
and /work/SRC/openSUSE:Factory/.rubygem-sexp_processor.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-sexp_processor"
Thu Apr 20 20:58:19 2017 rev:26 rq:489039 version:4.9.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/rubygem-sexp_processor/rubygem-sexp_processor.changes
2017-04-11 09:31:43.526975264 +0200
+++
/work/SRC/openSUSE:Factory/.rubygem-sexp_processor.new/rubygem-sexp_processor.changes
2017-04-20 20:58:21.497107670 +0200
@@ -1,0 +2,20 @@
+Fri Apr 14 04:36:15 UTC 2017 - [email protected]
+
+- updated to version 4.9.0
+ see installed History.txt
+
+ === 4.9.0 / 2017-04-13
+
+ * 9 minor enhancements:
+
+ * Added Sexp.depth
+ * Added Sexp.sexp_type=
+ * Cache Sexp.line_max. Massively speeds up large flay runs.
+ * Cleaned up SexpProcessor.process handling of result node type.
+ * Extend pt_testcase for ruby 2.4 tests.
+ * Extended Sexp.method_missing to only print on every invocation if
$VERBOSE=1
+ * Extended Sexp.method_missing to warn if the expected sub-sexp is not
found.
+ * Rewrote Sexp.mass to be MUCH faster. Helps tremendously with flay on
large files.
+ * Warn that Sexp#method_missing was tripped if $DEBUG.
+
+-------------------------------------------------------------------
Old:
----
sexp_processor-4.8.0.gem
New:
----
sexp_processor-4.9.0.gem
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rubygem-sexp_processor.spec ++++++
--- /var/tmp/diff_new_pack.Q1SB3T/_old 2017-04-20 20:58:22.732932898 +0200
+++ /var/tmp/diff_new_pack.Q1SB3T/_new 2017-04-20 20:58:22.736932332 +0200
@@ -24,7 +24,7 @@
#
Name: rubygem-sexp_processor
-Version: 4.8.0
+Version: 4.9.0
Release: 0
%define mod_name sexp_processor
%define mod_full_name %{mod_name}-%{version}
++++++ sexp_processor-4.8.0.gem -> sexp_processor-4.9.0.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/History.txt new/History.txt
--- old/History.txt 2017-02-01 21:04:33.000000000 +0100
+++ new/History.txt 2017-04-14 01:56:57.000000000 +0200
@@ -1,3 +1,17 @@
+=== 4.9.0 / 2017-04-13
+
+* 9 minor enhancements:
+
+ * Added Sexp.depth
+ * Added Sexp.sexp_type=
+ * Cache Sexp.line_max. Massively speeds up large flay runs.
+ * Cleaned up SexpProcessor.process handling of result node type.
+ * Extend pt_testcase for ruby 2.4 tests.
+ * Extended Sexp.method_missing to only print on every invocation if
$VERBOSE=1
+ * Extended Sexp.method_missing to warn if the expected sub-sexp is not found.
+ * Rewrote Sexp.mass to be MUCH faster. Helps tremendously with flay on large
files.
+ * Warn that Sexp#method_missing was tripped if $DEBUG.
+
=== 4.8.0 / 2017-02-01
* 2 minor enhancements:
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
Binary files old/checksums.yaml.gz.sig and new/checksums.yaml.gz.sig differ
Binary files old/data.tar.gz.sig and new/data.tar.gz.sig differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/pt_testcase.rb new/lib/pt_testcase.rb
--- old/lib/pt_testcase.rb 2017-02-01 21:04:33.000000000 +0100
+++ new/lib/pt_testcase.rb 2017-04-14 01:56:57.000000000 +0200
@@ -76,7 +76,7 @@
end
def self.add_19tests name, hash
- add_tests "#{name}__19_20_21_22_23", hash # HACK?
+ add_tests "#{name}__19_20_21_22_23_24", hash # HACK?
end
def self.add_19edgecases ruby, sexp, cases
@@ -101,7 +101,7 @@
testcases[verbose][klass] = testcases[nonverbose][klass]
end
- VER_RE = "(1[89]|2[0123])"
+ VER_RE = "(1[89]|2[01234])"
def self.generate_test klass, node, data, input_name, output_name
klass.send :define_method, "test_#{node}" do
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/sexp.rb new/lib/sexp.rb
--- old/lib/sexp.rb 2017-02-01 21:04:33.000000000 +0100
+++ new/lib/sexp.rb 2017-04-14 01:56:57.000000000 +0200
@@ -95,6 +95,10 @@
end
end
+ def depth
+ 1 + (each_sexp.map(&:depth).max || 0)
+ end
+
##
# Enumeratates the sexp yielding to +b+ when the node_type == +t+.
@@ -203,21 +207,36 @@
# Returns the maximum line number of the children of self.
def line_max
- self.deep_each.map(&:line).max
+ @line_max ||= self.deep_each.map(&:line).max
end
##
# Returns the size of the sexp, flattened.
def mass
- @mass ||= self.structure.flatten.size
+ @mass ||=
+ inject(1) { |t, s|
+ if Sexp === s then
+ t + s.mass
+ else
+ t
+ end
+ }
end
##
# Returns the node named +node+, deleting it if +delete+ is true.
def method_missing meth, delete = false
- find_node meth, delete
+ r = find_node meth, delete
+ if ENV["DEBUG"] then
+ if r.nil? then
+ warn "%p.method_missing(%p) => nil from %s" % [self, meth,
caller.first]
+ elsif ENV["VERBOSE"]
+ warn "%p.method_missing(%p) from %s" % [self, meth, caller.first]
+ end
+ end
+ r
end
def respond_to? msg, private = false # :nodoc:
@@ -242,6 +261,13 @@
end
##
+ # Sets the node type of the Sexp.
+
+ def sexp_type= v
+ self[0] = v
+ end
+
+ ##
# Returns the Sexp body, ie the values without the node type.
def sexp_body
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/sexp_processor.rb new/lib/sexp_processor.rb
--- old/lib/sexp_processor.rb 2017-02-01 21:04:33.000000000 +0100
+++ new/lib/sexp_processor.rb 2017-04-14 01:56:57.000000000 +0200
@@ -33,7 +33,7 @@
class SexpProcessor
- VERSION = "4.8.0"
+ VERSION = "4.9.0"
##
# Automatically shifts off the Sexp type before handing the
@@ -278,12 +278,7 @@
# NOTE: this is costly, but we are in the generic processor
# so we shouldn't hit it too much with RubyToC stuff at least.
- #if Sexp === exp and not exp.sexp_type.nil? then
- begin
- result.sexp_type = exp.sexp_type
- rescue Exception
- # nothing to do, on purpose
- end
+ result.sexp_type = exp.sexp_type if Sexp === exp and exp.sexp_type
else
msg = "Bug! Unknown node-type #{type.inspect} to #{self.class}"
msg += " in #{exp_orig.inspect} from #{caller.inspect}" if $DEBUG
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata 2017-02-01 21:04:33.000000000 +0100
+++ new/metadata 2017-04-14 01:56:57.000000000 +0200
@@ -1,7 +1,7 @@
--- !ruby/object:Gem::Specification
name: sexp_processor
version: !ruby/object:Gem::Version
- version: 4.8.0
+ version: 4.9.0
platform: ruby
authors:
- Ryan Davis
@@ -30,7 +30,7 @@
E4oJcnPkJAr0rw504JGtlZtONZQblwmRJOIdXzolaE3NRGUzGVOUSptZppAKiavY
fO6tdKQc/5RfA8oQEkg8hrxA5PQSz4TOFJGLpFvIapEk6tMruQ0bHgkhr9auXg==
-----END CERTIFICATE-----
-date: 2017-02-01 00:00:00.000000000 Z
+date: 2017-04-13 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
name: rdoc
Binary files old/metadata.gz.sig and new/metadata.gz.sig differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/test/test_sexp.rb new/test/test_sexp.rb
--- old/test/test_sexp.rb 2017-02-01 21:04:33.000000000 +0100
+++ new/test/test_sexp.rb 2017-04-14 01:56:57.000000000 +0200
@@ -1,10 +1,24 @@
$TESTING = true
require 'minitest/autorun'
+require "minitest/benchmark" if ENV["BENCH"]
require 'sexp_processor'
require 'stringio'
require 'pp'
+def pyramid_sexp max
+ # s(:array,
+ # s(:array, s(:s, 1)),
+ # s(:array, s(:s, 1), s(:s, 2)),
+ # ...
+ # s(:array, s(:s, 1), s(:s, 2), ... s(:s, max-1)))
+
+ s(:array,
+ *(1...max).map { |n|
+ s(:array, *(1..n).map { |m|
+ s(:s, m) })})
+end
+
class SexpTestCase < Minitest::Test
# KEY for regex tests
# :a == no change
@@ -235,6 +249,15 @@
assert_equal 7, s.mass
end
+ def test_mass_huge
+ max = 100
+ sexp = pyramid_sexp max
+
+ exp = (max*max + max)/2 # pyramid number 1+2+3+...+m
+
+ assert_equal exp, sexp.mass
+ end
+
def test_method_missing
assert_nil @sexp.not_there
assert_equal s(:lit, 42), @basic_sexp.lit
@@ -342,6 +365,13 @@
assert_equal [42], @basic_sexp.each_sexp.map { |_, n| n }
end
+ def test_depth
+ assert_equal 1, s(:a).depth
+ assert_equal 2, s(:a, s(:b)).depth
+ assert_equal 3, s(:a, s(:b1, s(:c)), s(:b2)).depth
+ assert_equal 5, s(:a, s(:b, s(:c, s(:d, s(:e))))).depth
+ end
+
def test_deep_each
result = []
@complex_sexp.deep_each { |s| result << s if s.first == :if }
@@ -373,3 +403,30 @@
end
end
+
+class BenchSexp < Minitest::Benchmark
+ def run
+ GC.disable
+ super
+ ensure
+ GC.enable
+ end
+
+ def self.bench_range
+ bench_linear 100, 500, 50
+ end
+
+ @@data = Hash[bench_range.map { |n| [n, pyramid_sexp(n)] }]
+
+ def bench_pyramid
+ assert_performance_power do |max|
+ pyramid_sexp max
+ end
+ end
+
+ def bench_mass
+ assert_performance_power do |max|
+ @@data[max].mass
+ end
+ end
+end if ENV["BENCH"]