Bug#890620: ply: please make the output reproducible

Chris Lamb lamby at debian.org
Fri Feb 16 20:24:25 UTC 2018


Source: ply
Version: 3.9-1
Severity: wishlist
Tags: patch
User: reproducible-builds at lists.alioth.debian.org
Usertags: toolchain randomness
X-Debbugs-Cc: reproducible-bugs at lists.alioth.debian.org

Hi,

Whilst working on the Reproducible Builds effort [0], we noticed
that ply generates non-determinstic output.

This is affecting the reproducibility of other packages such as
astropy:

  --- a/python3-astropy_3.0-1_amd64.deb/usr/lib/python3/dist-packages/astropy/units/format/generic_lextab.py	2018-02-13 13:36:43.000000000 +0000
  +++ b/python3-astropy_3.0-1_amd64.deb/usr/lib/python3/dist-packages/astropy/units/format/generic_lextab.py	2018-02-13 13:36:43.000000000 +0000
  @@ -11,7 +11,7 @@
   
   # generic_lextab.py. This file automatically created by PLY (version 3.9). Don't edit!
   _tabversion   = '3.8'
  -_lextokens    = set(('UFLOAT', 'DOUBLE_STAR', 'STAR', 'FUNCNAME', 'UNIT', 'PERIOD', 'SOLIDUS', 'CLOSE_PAREN', 'OPEN_PAREN', 'SIGN', 'UINT', 'CARET'))
  +_lextokens    = set(('UNIT', 'PERIOD', 'DOUBLE_STAR', 'CARET', 'UINT', 'SIGN', 'STAR', 'SOLIDUS', 'FUNCNAME', 'OPEN_PAREN', 'UFLOAT', 'CLOSE_PAREN'))
   _lexreflags   = 32
   _lexliterals  = ''
   _lexstateinfo = {'INITIAL': 'inclusive'}

Patch attached.

 [0] https://reproducible-builds.org/


Regards,

-- 
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      lamby at debian.org / chris-lamb.co.uk
       `-
-------------- next part --------------
diff --git a/ply/lex.py b/ply/lex.py
index 0f3e464..8cf6b6b 100644
--- a/ply/lex.py
+++ b/ply/lex.py
@@ -179,7 +179,7 @@ class Lexer:
         with open(filename, 'w') as tf:
             tf.write('# %s.py. This file automatically created by PLY (version %s). Don\'t edit!\n' % (basetabmodule, __version__))
             tf.write('_tabversion   = %s\n' % repr(__tabversion__))
-            tf.write('_lextokens    = set(%s)\n' % repr(tuple(self.lextokens)))
+            tf.write('_lextokens    = set(%s)\n' % repr(sorted(tuple(self.lextokens))))
             tf.write('_lexreflags   = %s\n' % repr(self.lexreflags))
             tf.write('_lexliterals  = %s\n' % repr(self.lexliterals))
             tf.write('_lexstateinfo = %s\n' % repr(self.lexstateinfo))


More information about the Reproducible-bugs mailing list