eric6/QScintilla/DocstringGenerator/EricdocGenerator.py

Fri, 22 Jan 2021 16:48:43 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 22 Jan 2021 16:48:43 +0100
changeset 7998
cd41c844862f
child 8000
47b15df088e4
permissions
-rw-r--r--

Editor
- added functionality to insert docstring templates via the context menu (cursor placed on first line of function definition) or after entering the docstring start string (e.g. """ for Python)

7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing the docstring generator for the 'ericdoc' style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 def generateEricDoc(functionInfo):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 Function to generate the docstring line list iaw. eric documentation style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 Note: Partial English text is created with DESCRIPTION placeholders
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 for descriptions and TYPE placeholders for type information
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 @param functionInfo object containing the function information to base
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 the docstring on
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 @type FunctionInfo
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 @return list of docstring lines
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 @rtype str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 lines = []
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 # create a basic/partial function description
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 descrComplete = False
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 if functionInfo.functionType == "classmethod":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 descr = "Class method "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 elif functionInfo.functionType == "staticmethod":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 descr = "Static method "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 elif functionInfo.functionType == "constructor":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 descr = "Constructor"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 descrComplete = True
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 if functionInfo.visibility == "public":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 descr = "Public "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 elif functionInfo.visibility == "protected":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 descr = "Protected "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 elif functionInfo.visibility == "private":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 descr = "Private "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 elif functionInfo.visibility == "special":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 descr = "Special "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 descr = ""
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 if (
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 len(functionInfo.argumentsList) > 0 and
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 functionInfo.argumentsList[0][0] in ("self", "cls", "this")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 ):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 if functionInfo.isAsync:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 descr += "coroutine "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 elif functionInfo.functionType == "qtslot":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 descr += "slot "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 descr += "method "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 if functionInfo.isAsync:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 descr = "Coroutine "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 elif functionInfo.functionType == "qtslot":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 descr = "Slot "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 descr = "Function "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 if not descrComplete:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 descr += "DESCRIPTION"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 lines.append(descr)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 # remove 'self', 'this' or 'cls' from arguments list
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 if (
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 len(functionInfo.argumentsList) > 0 and
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 functionInfo.argumentsList[0][0] in ("self", "cls", "this")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 ):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 del functionInfo.argumentsList[0]
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 # add an empty line if there is one of the other sections
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 if (
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 functionInfo.argumentsList or
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 functionInfo.hasYield or
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 functionInfo.returnTypeAnnotated or
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 functionInfo.returnValueInBody or
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 functionInfo.raiseList
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 ):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 lines.append("")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 # add the parameters section
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 tag = "@param"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 for argName, argType, argValue in functionInfo.argumentsList:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 if argName == "*":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 tag = "@keyparam"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 continue
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 argLine = "{0} {1} DESCRIPTION".format(tag, argName)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 if argValue:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 argLine += " (defaults to {0})".format(argValue)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 lines.append(argLine)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 if argType is None:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 argType = "TYPE"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 argLine = "@type {0}".format(argType)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 if argValue:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 argLine += " (optional)"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 lines.append(argLine)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 # add return section
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 if functionInfo.hasYield or functionInfo.returnValueInBody:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 if functionInfo.hasYield:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 lines.append("@yield DESCRIPTION")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 rType = "@ytype"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 lines.append("@return DESCRIPTION")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 rType = "@rtype"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 if functionInfo.returnTypeAnnotated:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 lines.append("{0} {1}".format(
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 rType, functionInfo.returnTypeAnnotated))
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 lines.append("{0} TYPE".format(rType))
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 # add an exceptions section, if function raises something
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 if functionInfo.raiseList:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 for exc in sorted(functionInfo.raiseList):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 lines.append("@exception {0} DESCRIPTION".format(exc))
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 return lines

eric ide

mercurial