davemds pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f3dedfe395225f9710a04fd4529920408972df43

commit f3dedfe395225f9710a04fd4529920408972df43
Author: Dave Andreoli <[email protected]>
Date:   Thu Oct 10 11:06:47 2019 +0200

    Pyolian: improve api coverage script
    
    it now also check for enums and is smarter with code comments
---
 src/scripts/pyolian/eolian.py | 77 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 58 insertions(+), 19 deletions(-)

diff --git a/src/scripts/pyolian/eolian.py b/src/scripts/pyolian/eolian.py
index 3d27fa481e..abb8e17a94 100644
--- a/src/scripts/pyolian/eolian.py
+++ b/src/scripts/pyolian/eolian.py
@@ -1549,34 +1549,57 @@ if __name__ == '__main__':
 
     # prepare the two regexp
     flags = re.S | re.M
-    DEFINED_RE = re.compile('^EAPI[\w\n *]*(eolian_\w*)\([\w *,]*\);', flags)
-    USED_RE = re.compile('lib\.(eolian_[\w]*)\(', flags)
+    FUNC_DEFINED_RE = 
re.compile(r'^\s*EAPI[\w\s*]*(eolian_\w*)\s*\([\w\s*,]*\);', flags)
+    FUNC_USED_RE = re.compile(r'^[^\n#]*lib\.(eolian_[\w]*)\s*\(', flags)
 
-    # extract all EAPI functions from Eolian.h
+    ENUM_DEFINED_RE = re.compile(r'typedef 
enum\s*{([^}]*)}\s*(Eolian_[\w]*);', flags)
+    ENUM_USED_RE = re.compile(r'^class\s([\w]*)\(IntEnum\):', flags)
+
+    # ignore some know cases (function or enum)
+    IGNORED = {
+        'eolian_implement_documentation_get',  # we are using 
eolian_aux_implement_documentation_get
+        'eolian_documentation_string_split',  # not needed in python
+    }
+
+    # extract functions and enums from Eolian.h
     defined_funcs = []
+    defined_enums = []
     with open(eolian_header, 'r') as fh:
         header = fh.read()
-        for match in re.finditer(DEFINED_RE, header):
-            func_name = match.group(1)
+    for match in re.finditer(FUNC_DEFINED_RE, header):
+        func_name = match.group(1)
+        if func_name not in IGNORED:
             defined_funcs.append(func_name)
+    for match in re.finditer(ENUM_DEFINED_RE, header):
+        enum_name = match.group(2)
+        if enum_name not in IGNORED:
+            defined_enums.append(enum_name)
     defined_funcs = set(defined_funcs)
+    defined_enums = set(defined_enums)
 
-    # extract all called functions in eolian.py (this file)
+    # extract functions and enums from eolian.py (this file)
     used_funcs = []
+    used_enums = []
     with open(__file__, 'r') as fh:
         source = fh.read()
-        for match in re.finditer(USED_RE, source):
-            func_name = match.group(1)
-            used_funcs.append(func_name)
+    for match in re.finditer(FUNC_USED_RE, source):
+        func_name = match.group(1)
+        used_funcs.append(func_name)
+    for match in re.finditer(ENUM_USED_RE, source):
+        enum_name = match.group(1)
+        used_enums.append(enum_name)
     used_funcs = set(used_funcs)
+    used_enums = set(used_enums)
 
     # show general info
-    num_def = len(defined_funcs)
-    num_usd = len(used_funcs)
+    num_def, num_usd = len(defined_funcs), len(used_funcs)
+    num_enum_def, num_enum_usd = len(defined_enums), len(used_enums)
     print('Pyolian coverage results')
     print('========================')
     print('Found %d functions defined in Eolian.h (%s)' % (num_def, 
eolian_header))
-    print('Found %d functions used in eolian.py (hopefully not commented out)' 
% num_usd)
+    print('Found %d functions used in eolian.py (hopefully not 
multiline-commented)' % num_usd)
+    print('Found %d enums defined in Eolian.h' % num_enum_def)
+    print('Found %d enums defined in eolian.py' % num_enum_usd)
     print('Total API coverage %.1f%%' % (num_usd / num_def * 100))
     print()
 
@@ -1588,15 +1611,31 @@ if __name__ == '__main__':
         print('{:02d}. {}'.format(i, func_name))
     print()
 
-    # List all functions found in Eolian.h  (--all option)
-    if '--all' in sys.argv:
-        print('{} functions found in Eolian.h'.format(num_def))
-        print('===============================')
-        for i, func_name in enumerate(sorted(defined_funcs), 1):
-            print('{:03d}. {}'.format(i, func_name))
+    # list all missing enums
+    missing = defined_enums - used_enums
+    if len(missing) > 0:
+        print('{} Missing enums in eolian.py'.format(len(missing)))
+        print('=================================')
+        for i, enum_name in enumerate(sorted(missing), 1):
+            print('{:02d}. {}'.format(i, enum_name))
         print()
+
+    # List all functions found in C and Py (--all option)
+    if '--all' in sys.argv:
+        to_list = (
+            (defined_funcs, '{} EAPI functions defined in Eolian.h'),
+            (used_funcs, '{} functions called in eolian.py'),
+            (defined_enums, '{} Enums defined in Eolian.h'),
+            (used_enums, '{} Enums defined in eolian.py'),
+        )
+        for bag, label in to_list:
+            print(label.format(len(bag)))
+            print('==============================')
+            for i, obj_name in enumerate(sorted(bag), 1):
+                print('{:03d}. {}'.format(i, obj_name))
+            print()
     else:
         print('Additional arguments')
         print('====================')
-        print(' --all   To list all functions found in Eolian.h')
+        print(' --all   To list all functions and enums found')
         print()

-- 


Reply via email to