From 6a0e7cf50c4453f249d820e2ea1413cf6537b7c0 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Sat, 7 May 2016 17:34:05 -0700 Subject: [PATCH] Generate interface files for PyCharm too. Currently they are just copies of what we were already doing for WingIDE, but we can add more advanced things like type-hinting later... --- .gitignore | 1 + etgtools/pi_generator.py | 74 +++++++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 0f2838f8..61d7cad0 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ /wx/*.py /wx/*.pyc /wx/*.pi +/wx/*.pyi /wx/*.so /wx/*.pyd /wx/*.dylib diff --git a/etgtools/pi_generator.py b/etgtools/pi_generator.py index ca1f124a..03aa6968 100644 --- a/etgtools/pi_generator.py +++ b/etgtools/pi_generator.py @@ -3,17 +3,22 @@ # Author: Robin Dunn # # Created: 18-Oct-2011 -# Copyright: (c) 2013 by Total Control Software +# Copyright: (c) 2011-2016 by Total Control Software # License: wxWindows License #--------------------------------------------------------------------------- """ This generator will create "Python Interface" files, which define a skeleton -verison of the classes, functions, attributes, docstrings, etc. as Python -code. This is useful for enabling some introspcetion of things located in +version of the classes, functions, attributes, docstrings, etc. as Python +code. This is useful for enabling some introspection of things located in extension modules where there is less information available for introspection. The .pi files are used by WingIDE for assisting with code completion, displaying docstrings in the source assistant panel, etc. + +NOTE: PyCharm has a similar feature but the file extension is .pyi in that +case. For now we'll just make a copy of the .pi file, but PyCharm also +supports Python 3.5 style type annotations in the interface files so we may +want to add some type info to that version of the file eventually... """ import sys, os, re @@ -26,21 +31,44 @@ from etgtools.tweaker_tools import FixWxPrefix, magicMethods, \ phoenixRoot = os.path.abspath(os.path.split(__file__)[0]+'/..') -header = """\ +header_pi = """\ # -*- coding: utf-8 -*- #--------------------------------------------------------------------------- # This file is generated by wxPython's PI generator. Do not edit by hand. # -# (The *.pi files are used by WingIDE to provide more information than it is -# able to glean from introspection of extension types and methods.) +# The *.pi files are used by WingIDE to provide more information than it is +# able to glean from introspection of extension types and methods. They are +# not intended to be imported, executed or used for any other purpose other +# than providing info to the IDE. If you don't use WingIDE you can safely +# ignore this file. # -# Copyright: (c) 2013 by Total Control Software +# See: https://wingware.com/doc/edit/helping-wing-analyze-code +# +# Copyright: (c) 2011-2016 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + +""" + +header_pyi = """\ +# -*- coding: utf-8 -*- +#--------------------------------------------------------------------------- +# This file is generated by wxPython's PI generator. Do not edit by hand. +# +# The *.pyi files are used by PyCharm to provide more information than it is +# able to glean from introspection of extension types and methods. They are +# not intended to be imported, executed or used for any other purpose other +# than providing info to the IDE. If you don't use PyCharm you can safely +# ignore this file. +# +# See: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html +# +# Copyright: (c) 2011-2016 by Total Control Software # License: wxWindows License #--------------------------------------------------------------------------- """ - #--------------------------------------------------------------------------- class PiWrapperGenerator(generators.WrapperGeneratorBase, FixWxPrefix): @@ -53,20 +81,28 @@ class PiWrapperGenerator(generators.WrapperGeneratorBase, FixWxPrefix): # Write the contents of the stream to the destination file if not destFile: - name = module.module + '.pi' + name = module.module if name.startswith('_'): name = name[1:] destFile = os.path.join(phoenixRoot, 'wx', name) - - if not os.path.exists(destFile): - # create the file and write the header - f = textfile_open(destFile, 'wt') - f.write(header) - f.close() - - self.writeSection(destFile, module.name, stream.getvalue()) - - + + destFile_pi = destFile + '.pi' + destFile_pyi = destFile + '.pyi' + + def _checkAndWriteHeader(destFile, header): + if not os.path.exists(destFile): + # create the file and write the header + f = textfile_open(destFile, 'wt') + f.write(header) + f.close() + + _checkAndWriteHeader(destFile_pi, header_pi) + _checkAndWriteHeader(destFile_pyi, header_pyi) + + self.writeSection(destFile_pi, module.name, stream.getvalue()) + self.writeSection(destFile_pyi, module.name, stream.getvalue()) + + def writeSection(self, destFile, sectionName, sectionText): """ Read all the lines from destFile, remove those currently between