eric7/Plugins/PluginEricapi.py

branch
eric7
changeset 8312
800c432b34c8
parent 8222
5994b80b8760
child 8314
e3642a6a1e71
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2007 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the Ericapi plugin.
8 """
9
10 import os
11
12 from PyQt5.QtCore import QObject, QCoreApplication
13 from PyQt5.QtWidgets import QDialog
14
15 from E5Gui.E5Application import e5App
16
17 from E5Gui.E5Action import E5Action
18
19 import Utilities
20 import UI.Info
21
22 from eric6config import getConfig
23
24 # Start-Of-Header
25 name = "Ericapi Plugin"
26 author = "Detlev Offenbach <detlev@die-offenbachs.de>"
27 autoactivate = True
28 deactivateable = True
29 version = UI.Info.VersionOnly
30 className = "EricapiPlugin"
31 packageName = "__core__"
32 shortDescription = "Show the Ericapi dialogs."
33 longDescription = (
34 """This plugin implements the Ericapi dialogs."""
35 """ Ericapi is used to generate a QScintilla API file for Python and"""
36 """ Ruby projects."""
37 )
38 pyqtApi = 2
39 # End-Of-Header
40
41 error = ""
42
43
44 def exeDisplayData():
45 """
46 Public method to support the display of some executable info.
47
48 @return dictionary containing the data to query the presence of
49 the executable
50 """
51 exe = 'eric6_api'
52 if Utilities.isWindowsPlatform():
53 exe = os.path.join(getConfig("bindir"), exe + '.cmd')
54 if not os.path.exists(exe):
55 exe = os.path.join(getConfig("bindir"), exe + '.bat')
56 else:
57 exe = os.path.join(getConfig("bindir"), exe)
58
59 data = {
60 "programEntry": True,
61 "header": QCoreApplication.translate(
62 "EricapiPlugin", "eric API File Generator"),
63 "exe": exe,
64 "versionCommand": '--version',
65 "versionStartsWith": 'eric6_',
66 "versionPosition": -3,
67 "version": "",
68 "versionCleanup": None,
69 }
70
71 return data
72
73
74 class EricapiPlugin(QObject):
75 """
76 Class implementing the Ericapi plugin.
77 """
78 def __init__(self, ui):
79 """
80 Constructor
81
82 @param ui reference to the user interface object (UI.UserInterface)
83 """
84 super().__init__(ui)
85 self.__ui = ui
86 self.__initialize()
87
88 def __initialize(self):
89 """
90 Private slot to (re)initialize the plugin.
91 """
92 self.__projectAct = None
93
94 def activate(self):
95 """
96 Public method to activate this plugin.
97
98 @return tuple of None and activation status (boolean)
99 """
100 menu = e5App().getObject("Project").getMenu("Apidoc")
101 if menu:
102 self.__projectAct = E5Action(
103 self.tr('Generate API file (eric6_api)'),
104 self.tr('Generate &API file (eric6_api)'), 0, 0,
105 self, 'doc_eric6_api')
106 self.__projectAct.setStatusTip(self.tr(
107 'Generate an API file using eric6_api'))
108 self.__projectAct.setWhatsThis(self.tr(
109 """<b>Generate API file</b>"""
110 """<p>Generate an API file using eric6_api.</p>"""
111 ))
112 self.__projectAct.triggered.connect(self.__doEricapi)
113 e5App().getObject("Project").addE5Actions([self.__projectAct])
114 menu.addAction(self.__projectAct)
115
116 e5App().getObject("Project").showMenu.connect(self.__projectShowMenu)
117
118 return None, True
119
120 def deactivate(self):
121 """
122 Public method to deactivate this plugin.
123 """
124 e5App().getObject("Project").showMenu.disconnect(
125 self.__projectShowMenu)
126
127 menu = e5App().getObject("Project").getMenu("Apidoc")
128 if menu:
129 menu.removeAction(self.__projectAct)
130 e5App().getObject("Project").removeE5Actions([self.__projectAct])
131 self.__initialize()
132
133 def __projectShowMenu(self, menuName, menu):
134 """
135 Private slot called, when the the project menu or a submenu is
136 about to be shown.
137
138 @param menuName name of the menu to be shown (string)
139 @param menu reference to the menu (QMenu)
140 """
141 if menuName == "Apidoc" and self.__projectAct is not None:
142 self.__projectAct.setEnabled(
143 e5App().getObject("Project").getProjectLanguage() in
144 ["Python", "Python3", "Ruby", "MicroPython"])
145
146 def __doEricapi(self):
147 """
148 Private slot to perform the eric6_api api generation.
149 """
150 from DocumentationPlugins.Ericapi.EricapiConfigDialog import (
151 EricapiConfigDialog
152 )
153 eolTranslation = {
154 '\r': 'cr',
155 '\n': 'lf',
156 '\r\n': 'crlf',
157 }
158 project = e5App().getObject("Project")
159 parms = project.getData('DOCUMENTATIONPARMS', "ERIC4API")
160 dlg = EricapiConfigDialog(project, parms)
161 if dlg.exec() == QDialog.DialogCode.Accepted:
162 args, parms = dlg.generateParameters()
163 project.setData('DOCUMENTATIONPARMS', "ERIC4API", parms)
164
165 # add parameter for the eol setting
166 if not project.useSystemEol():
167 args.append(
168 "--eol={0}".format(eolTranslation[project.getEolString()]))
169
170 # now do the call
171 from DocumentationPlugins.Ericapi.EricapiExecDialog import (
172 EricapiExecDialog
173 )
174 dia = EricapiExecDialog("Ericapi")
175 res = dia.start(args, project.ppath)
176 if res:
177 dia.exec()
178
179 outputFileName = Utilities.toNativeSeparators(parms['outputFile'])
180
181 # add output files to the project data, if they aren't in already
182 for progLanguage in parms['languages']:
183 if "%L" in outputFileName:
184 outfile = outputFileName.replace("%L", progLanguage)
185 else:
186 if len(parms['languages']) == 1:
187 outfile = outputFileName
188 else:
189 root, ext = os.path.splitext(outputFileName)
190 outfile = "{0}-{1}{2}".format(
191 root, progLanguage.lower(), ext)
192
193 outfile = project.getRelativePath(outfile)
194 if outfile not in project.pdata['OTHERS']:
195 project.pdata['OTHERS'].append(outfile)
196 project.setDirty(True)
197 project.othersAdded(outfile)

eric ide

mercurial