PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/module/sys/version.py

https://bitbucket.org/pypy/pypy/
Python | 109 lines | 108 code | 0 blank | 1 comment | 0 complexity | 06f985e739184e109ec84359fb809e41 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. """
  2. Version numbers exposed by PyPy through the 'sys' module.
  3. """
  4. import os
  5. from rpython.rlib import compilerinfo
  6. from pypy.interpreter import gateway
  7. #XXX # the release serial 42 is not in range(16)
  8. CPYTHON_VERSION = (2, 7, 10, "final", 42)
  9. #XXX # sync CPYTHON_VERSION with patchlevel.h, package.py
  10. CPYTHON_API_VERSION = 1013 #XXX # sync with include/modsupport.h
  11. PYPY_VERSION = (5, 3, 2, "alpha", 0) #XXX # sync patchlevel.h
  12. import pypy
  13. pypydir = pypy.pypydir
  14. pypyroot = os.path.dirname(pypydir)
  15. del pypy
  16. from rpython.tool.version import get_repo_version_info
  17. import time as t
  18. gmtime = t.gmtime()
  19. date = t.strftime("%b %d %Y", gmtime)
  20. time = t.strftime("%H:%M:%S", gmtime)
  21. del t
  22. # ____________________________________________________________
  23. app = gateway.applevel('''
  24. "NOT_RPYTHON"
  25. from _structseq import structseqtype, structseqfield
  26. class version_info:
  27. __metaclass__ = structseqtype
  28. major = structseqfield(0, "Major release number")
  29. minor = structseqfield(1, "Minor release number")
  30. micro = structseqfield(2, "Patch release number")
  31. releaselevel = structseqfield(3,
  32. "'alpha', 'beta', 'candidate', or 'release'")
  33. serial = structseqfield(4, "Serial release number")
  34. ''')
  35. def get_api_version(space):
  36. return space.wrap(CPYTHON_API_VERSION)
  37. def get_version_info(space):
  38. w_version_info = app.wget(space, "version_info")
  39. return space.call_function(w_version_info, space.wrap(CPYTHON_VERSION))
  40. def _make_version_template(PYPY_VERSION=PYPY_VERSION):
  41. ver = "%d.%d.%d" % (PYPY_VERSION[0], PYPY_VERSION[1], PYPY_VERSION[2])
  42. if PYPY_VERSION[3] != "final":
  43. ver = ver + "-%s%d" %(PYPY_VERSION[3], PYPY_VERSION[4])
  44. template = "%d.%d.%d (%s, %s, %s)\n[PyPy %s with %%s]" % (
  45. CPYTHON_VERSION[0],
  46. CPYTHON_VERSION[1],
  47. CPYTHON_VERSION[2],
  48. get_repo_version_info(root=pypyroot)[1],
  49. date,
  50. time,
  51. ver)
  52. assert template.count('%') == 1 # only for the "%s" near the end
  53. return template
  54. _VERSION_TEMPLATE = _make_version_template()
  55. def get_version(space):
  56. return space.wrap(_VERSION_TEMPLATE % compilerinfo.get_compiler_info())
  57. def get_winver(space):
  58. return space.wrap("%d.%d" % (
  59. CPYTHON_VERSION[0],
  60. CPYTHON_VERSION[1]))
  61. def get_hexversion(space):
  62. return space.wrap(tuple2hex(CPYTHON_VERSION))
  63. def get_pypy_version_info(space):
  64. ver = PYPY_VERSION
  65. w_version_info = app.wget(space, "version_info")
  66. return space.call_function(w_version_info, space.wrap(ver))
  67. def get_subversion_info(space):
  68. return space.wrap(('PyPy', '', ''))
  69. def get_repo_info(space):
  70. info = get_repo_version_info(root=pypyroot)
  71. if info:
  72. repo_tag, repo_version = info
  73. return space.newtuple([space.wrap('PyPy'),
  74. space.wrap(repo_tag),
  75. space.wrap(repo_version)])
  76. else:
  77. return space.w_None
  78. def tuple2hex(ver):
  79. d = {'alpha': 0xA,
  80. 'beta': 0xB,
  81. 'candidate': 0xC,
  82. 'final': 0xF,
  83. }
  84. subver = ver[4]
  85. if not (0 <= subver <= 9):
  86. subver = 0
  87. return (ver[0] << 24 |
  88. ver[1] << 16 |
  89. ver[2] << 8 |
  90. d[ver[3]] << 4 |
  91. subver)