]> granicus.if.org Git - python/commitdiff
Add sys.getandroidapilevel()
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 2 Dec 2016 00:13:46 +0000 (01:13 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 2 Dec 2016 00:13:46 +0000 (01:13 +0100)
Issue #28740: Add sys.getandroidapilevel(): return the build time
API version of Android as an integer.

Function only available on Android.

Doc/library/sys.rst
Lib/test/support/__init__.py
Lib/test/test_sys.py
Misc/NEWS
Python/sysmodule.c

index 2d14a1dd18d5d901f5f815354a924dc10bc8847d..f8ef83a45d88f4e979b04404b27c35859b4df3cb 100644 (file)
@@ -404,6 +404,15 @@ always available.
    .. versionadded:: 3.4
 
 
+.. function:: getandroidapilevel()
+
+   Return the build time API version of Android as an integer.
+
+   Availability: Android.
+
+   .. versionadded:: 3.7
+
+
 .. function:: getcheckinterval()
 
    Return the interpreter's "check interval"; see :func:`setcheckinterval`.
index 52c908e0284bf008253842401ad06fcaf533ae78..eb5a89aaf46987dd4878eb8f7ac8fd73543606dc 100644 (file)
@@ -766,8 +766,13 @@ requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
 
 is_jython = sys.platform.startswith('java')
 
-_ANDROID_API_LEVEL = sysconfig.get_config_var('ANDROID_API_LEVEL')
-is_android = (_ANDROID_API_LEVEL is not None and _ANDROID_API_LEVEL > 0)
+try:
+    # constant used by requires_android_level()
+    _ANDROID_API_LEVEL = sys.getandroidapilevel()
+    is_android = True
+except AttributeError:
+    # sys.getandroidapilevel() is only available on Android
+    is_android = False
 
 if sys.platform != 'win32':
     unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
index df9ebd40859e21991cb04326e45a0dc38208e949..828421c23bc94eeff2c4b46e1e5651537f095b24 100644 (file)
@@ -826,6 +826,13 @@ class SysModuleTest(unittest.TestCase):
         rc, stdout, stderr = assert_python_ok('-c', code)
         self.assertEqual(stdout.rstrip(), b'True')
 
+    @unittest.skipUnless(hasattr(sys, 'getandroidapilevel'),
+                         'need sys.getandroidapilevel()')
+    def test_getandroidapilevel(self):
+        level = sys.getandroidapilevel()
+        self.assertIsInstance(level, int)
+        self.assertGreater(level, 0)
+
 
 @test.support.cpython_only
 class SizeofTest(unittest.TestCase):
index 055bcade9cc6935eabfd1f5e99a3bb2ad025292f..2d5b6bd912981832473a91713489e8af3adb63e6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -160,6 +160,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #28740: Add sys.getandroidapilevel(): return the build time API version
+  of Android as an integer. Function only available on Android.
+
 - Issue #26273: Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and
   :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by
   Omar Sandoval.
index 2a3f36c6ddd6e4d31839f93e1ee9ee3f68d7981b..19a3850a598c009f4e5656f5a303485b97067cef 100644 (file)
@@ -1363,6 +1363,20 @@ PyDoc_STRVAR(is_finalizing_doc,
 Return True if Python is exiting.");
 
 
+#ifdef ANDROID_API_LEVEL
+PyDoc_STRVAR(getandroidapilevel_doc,
+"getandroidapilevel()\n\
+\n\
+Return the build time API version of Android as an integer.");
+
+static PyObject *
+sys_getandroidapilevel(PyObject *self)
+{
+    return PyLong_FromLong(ANDROID_API_LEVEL);
+}
+#endif   /* ANDROID_API_LEVEL */
+
+
 static PyMethodDef sys_methods[] = {
     /* Might as well keep this in alphabetic order */
     {"callstats", (PyCFunction)sys_callstats, METH_NOARGS,
@@ -1447,6 +1461,10 @@ static PyMethodDef sys_methods[] = {
      METH_VARARGS | METH_KEYWORDS, set_asyncgen_hooks_doc},
     {"get_asyncgen_hooks", sys_get_asyncgen_hooks, METH_NOARGS,
      get_asyncgen_hooks_doc},
+#ifdef ANDROID_API_LEVEL
+    {"getandroidapilevel", (PyCFunction)sys_getandroidapilevel, METH_NOARGS,
+     getandroidapilevel_doc},
+#endif
     {NULL,              NULL}           /* sentinel */
 };