Skip to content

Commit c92e873

Browse files
slarosanyalldawson
authored andcommittedSep 26, 2020
[pyqgis-console] using gist to share snippets instead of codepad
1 parent df564fd commit c92e873

File tree

3 files changed

+175
-152
lines changed

3 files changed

+175
-152
lines changed
 

‎python/console/console_editor.py

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import codecs
3737
import re
3838
import importlib
39+
from functools import partial
3940

4041

4142
class KeyFilter(QObject):
@@ -270,9 +271,13 @@ def contextMenuEvent(self, e):
270271
QCoreApplication.translate("PythonConsole", "Uncomment"),
271272
self.parent.pc.uncommentCode, 'Shift+Ctrl+3')
272273
menu.addSeparator()
273-
codePadAction = menu.addAction(self.iconCodePad,
274-
QCoreApplication.translate("PythonConsole", "Share on Codepad"),
275-
self.codepad)
274+
gist_menu = QMenu(self)
275+
gist_menu.setTitle(QCoreApplication.translate("PythonConsole", "Share on GitHub"))
276+
gist_menu.setIcon(self.iconCodePad)
277+
gist_menu.addAction(QCoreApplication.translate("PythonConsole", "Secret Gist"),
278+
partial(self.shareOnGist, False))
279+
gist_menu.addAction(QCoreApplication.translate("PythonConsole", "Public Gist"),
280+
partial(self.shareOnGist, True))
276281
showCodeInspection = menu.addAction(self.iconObjInsp,
277282
QCoreApplication.translate("PythonConsole", "Hide/Show Object Inspector"),
278283
self.objectListEditor)
@@ -283,7 +288,7 @@ def contextMenuEvent(self, e):
283288
syntaxCheck.setEnabled(False)
284289
pasteAction.setEnabled(False)
285290
pyQGISHelpAction.setEnabled(False)
286-
codePadAction.setEnabled(False)
291+
gist_menu.setEnabled(False)
287292
cutAction.setEnabled(False)
288293
runSelected.setEnabled(False) # spellok
289294
copyAction.setEnabled(False)
@@ -295,7 +300,8 @@ def contextMenuEvent(self, e):
295300
runSelected.setEnabled(True) # spellok
296301
copyAction.setEnabled(True)
297302
cutAction.setEnabled(True)
298-
codePadAction.setEnabled(True)
303+
if self.settings.value("pythonConsole/accessTokenGithub", ''):
304+
gist_menu.setEnabled(True)
299305
pyQGISHelpAction.setEnabled(True)
300306
if not self.text() == '':
301307
selectAllAction.setEnabled(True)
@@ -358,36 +364,34 @@ def objectListEditor(self):
358364
listObj.show()
359365
self.parent.pc.objectListButton.setChecked(True)
360366

361-
def codepad(self):
362-
import urllib.request
363-
import urllib.parse
364-
import urllib.error
365-
listText = self.selectedText().split('\n')
366-
getCmd = []
367-
for strLine in listText:
368-
getCmd.append(strLine)
369-
pasteText = "\n".join(getCmd)
370-
url = 'http://codepad.org'
371-
values = {'lang': 'Python',
372-
'code': pasteText,
373-
'submit': 'Submit'}
367+
def shareOnGist(self, is_public):
368+
import requests
369+
import json
370+
371+
ACCESS_TOKEN = self.settings.value("pythonConsole/accessTokenGithub", '')
372+
URL = "https://api.github.com/gists"
373+
374+
headers = {'Authorization': 'token %s' % ACCESS_TOKEN}
375+
params = {'scope': 'gist'}
376+
377+
path = self.parent.tw.currentWidget().path
378+
filename = os.path.basename(path) if path else None
379+
filename = filename if filename else "pyqgis_snippet.py"
380+
381+
selected_text = self.selectedText()
382+
data = {"description": "Gist created by PyQGIS Console",
383+
"public": is_public,
384+
"files": {filename: {"content": selected_text}}}
374385
try:
375-
response = urllib.request.urlopen(url, urllib.parse.urlencode(values))
376-
url = response.read()
377-
for href in url.split("</a>"):
378-
if "Link:" in href:
379-
ind = href.index('Link:')
380-
found = href[ind + 5:]
381-
for i in found.split('">'):
382-
if '<a href=' in i:
383-
link = i.replace('<a href="', "").strip()
384-
if link:
385-
QApplication.clipboard().setText(link)
386-
msgText = QCoreApplication.translate('PythonConsole', 'URL copied to clipboard.')
387-
self.parent.pc.callWidgetMessageBarEditor(msgText, 0, True)
388-
except urllib.error.URLError as e:
389-
msgText = QCoreApplication.translate('PythonConsole', 'Connection error: ')
390-
self.parent.pc.callWidgetMessageBarEditor(msgText + repr(e.args), 0, True)
386+
res = requests.post(URL, headers=headers, params=params, data=json.dumps(data)).json()
387+
print(res)
388+
if res['html_url']:
389+
QApplication.clipboard().setText(res['html_url'])
390+
msg = QCoreApplication.translate('PythonConsole', 'URL copied to clipboard.')
391+
self.parent.pc.callWidgetMessageBarEditor(msg, 0, True)
392+
except requests.ConnectionError as e:
393+
msg = QCoreApplication.translate('PythonConsole', 'Connection error: ')
394+
self.parent.pc.callWidgetMessageBarEditor(msg + repr(e.args), 0, True)
391395

392396
def hideEditor(self):
393397
self.parent.pc.splitterObj.hide()

‎python/console/console_settings.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ def saveSettings(self):
145145
settings.setValue("pythonConsole/preloadAPI", self.preloadAPI.isChecked())
146146
settings.setValue("pythonConsole/autoSaveScript", self.autoSaveScript.isChecked())
147147

148+
settings.setValue("pythonConsole/accessTokenGithub", self.tokenGhLineEdit.text())
149+
148150
fontFamilyText = self.fontComboBox.currentText()
149151
settings.setValue("pythonConsole/fontfamilytext", fontFamilyText)
150152

@@ -207,6 +209,7 @@ def restoreSettings(self):
207209
font.family())))
208210
self.preloadAPI.setChecked(settings.value("pythonConsole/preloadAPI", True, type=bool))
209211
self.lineEdit.setText(settings.value("pythonConsole/preparedAPIFile", "", type=str))
212+
self.tokenGhLineEdit.setText(settings.value("pythonConsole/accessTokenGithub", "", type=str))
210213
itemTable = settings.value("pythonConsole/userAPI", [])
211214
if itemTable:
212215
self.tableWidget.setRowCount(0)

‎python/console/console_settings.ui

Lines changed: 134 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,135 @@
7070
<rect>
7171
<x>0</x>
7272
<y>0</y>
73-
<width>887</width>
74-
<height>658</height>
73+
<width>881</width>
74+
<height>722</height>
7575
</rect>
7676
</property>
77-
<layout class="QGridLayout" name="gridLayout_9">
78-
<item row="0" column="0">
77+
<layout class="QGridLayout" name="gridLayout_4">
78+
<item row="3" column="0">
79+
<widget class="QgsCollapsibleGroupBox" name="groupBoxRunDebugEditor">
80+
<property name="sizePolicy">
81+
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
82+
<horstretch>0</horstretch>
83+
<verstretch>0</verstretch>
84+
</sizepolicy>
85+
</property>
86+
<property name="title">
87+
<string>Run and Debug</string>
88+
</property>
89+
<property name="collapsed" stdset="0">
90+
<bool>false</bool>
91+
</property>
92+
<property name="saveCollapsedState" stdset="0">
93+
<bool>true</bool>
94+
</property>
95+
<layout class="QGridLayout" name="gridLayout_21">
96+
<item row="0" column="0">
97+
<widget class="QCheckBox" name="enableObjectInspector">
98+
<property name="text">
99+
<string>Enable Object Inspector (switching between tabs may be slow)</string>
100+
</property>
101+
<property name="checked">
102+
<bool>false</bool>
103+
</property>
104+
</widget>
105+
</item>
106+
<item row="1" column="0">
107+
<widget class="QCheckBox" name="autoSaveScript">
108+
<property name="text">
109+
<string>Auto-save script before running</string>
110+
</property>
111+
</widget>
112+
</item>
113+
</layout>
114+
</widget>
115+
</item>
116+
<item row="1" column="0">
117+
<widget class="QgsCollapsibleGroupBox" name="groupBoxAutoCompletion">
118+
<property name="title">
119+
<string>Autocompletion</string>
120+
</property>
121+
<property name="checkable">
122+
<bool>true</bool>
123+
</property>
124+
<property name="checked">
125+
<bool>true</bool>
126+
</property>
127+
<property name="collapsed" stdset="0">
128+
<bool>false</bool>
129+
</property>
130+
<property name="saveCheckedState" stdset="0">
131+
<bool>true</bool>
132+
</property>
133+
<property name="saveCollapsedState" stdset="0">
134+
<bool>true</bool>
135+
</property>
136+
<layout class="QGridLayout" name="gridLayout_5">
137+
<item row="1" column="0" colspan="3">
138+
<layout class="QGridLayout" name="layoutRadioButton">
139+
<item row="0" column="2">
140+
<widget class="QRadioButton" name="autoCompFromDocAPI">
141+
<property name="toolTip">
142+
<string>Get autocompletion from current document and installed APIs</string>
143+
</property>
144+
<property name="text">
145+
<string>From doc and APIs</string>
146+
</property>
147+
</widget>
148+
</item>
149+
<item row="0" column="1">
150+
<widget class="QRadioButton" name="autoCompFromAPI">
151+
<property name="toolTip">
152+
<string>Get autocompletion from installed APIs</string>
153+
</property>
154+
<property name="text">
155+
<string>From API files</string>
156+
</property>
157+
<property name="checked">
158+
<bool>true</bool>
159+
</property>
160+
</widget>
161+
</item>
162+
<item row="0" column="0">
163+
<widget class="QRadioButton" name="autoCompFromDoc">
164+
<property name="toolTip">
165+
<string>Get autocompletion from current document</string>
166+
</property>
167+
<property name="text">
168+
<string>From document</string>
169+
</property>
170+
</widget>
171+
</item>
172+
</layout>
173+
</item>
174+
<item row="0" column="2">
175+
<widget class="QLabel" name="label_36">
176+
<property name="text">
177+
<string>characters</string>
178+
</property>
179+
</widget>
180+
</item>
181+
<item row="0" column="0">
182+
<widget class="QLabel" name="label_6">
183+
<property name="text">
184+
<string>Autocompletion threshold</string>
185+
</property>
186+
</widget>
187+
</item>
188+
<item row="0" column="1">
189+
<widget class="QSpinBox" name="autoCompThreshold">
190+
<property name="maximum">
191+
<number>10</number>
192+
</property>
193+
<property name="value">
194+
<number>2</number>
195+
</property>
196+
</widget>
197+
</item>
198+
</layout>
199+
</widget>
200+
</item>
201+
<item row="0" column="0" colspan="2">
79202
<widget class="QgsCollapsibleGroupBox" name="groupBoxFontColor">
80203
<property name="sizePolicy">
81204
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
@@ -522,91 +645,6 @@
522645
</layout>
523646
</widget>
524647
</item>
525-
<item row="1" column="0">
526-
<widget class="QgsCollapsibleGroupBox" name="groupBoxAutoCompletion">
527-
<property name="title">
528-
<string>Autocompletion</string>
529-
</property>
530-
<property name="checkable">
531-
<bool>true</bool>
532-
</property>
533-
<property name="checked">
534-
<bool>true</bool>
535-
</property>
536-
<property name="collapsed" stdset="0">
537-
<bool>false</bool>
538-
</property>
539-
<property name="saveCheckedState" stdset="0">
540-
<bool>true</bool>
541-
</property>
542-
<property name="saveCollapsedState" stdset="0">
543-
<bool>true</bool>
544-
</property>
545-
<layout class="QGridLayout" name="gridLayout_5">
546-
<item row="0" column="0">
547-
<widget class="QLabel" name="label_6">
548-
<property name="text">
549-
<string>Autocompletion threshold</string>
550-
</property>
551-
</widget>
552-
</item>
553-
<item row="0" column="1">
554-
<widget class="QSpinBox" name="autoCompThreshold">
555-
<property name="maximum">
556-
<number>10</number>
557-
</property>
558-
<property name="value">
559-
<number>2</number>
560-
</property>
561-
</widget>
562-
</item>
563-
<item row="0" column="2">
564-
<widget class="QLabel" name="label_36">
565-
<property name="text">
566-
<string>characters</string>
567-
</property>
568-
</widget>
569-
</item>
570-
<item row="1" column="0" colspan="3">
571-
<layout class="QGridLayout" name="layoutRadioButton">
572-
<item row="0" column="2">
573-
<widget class="QRadioButton" name="autoCompFromDocAPI">
574-
<property name="toolTip">
575-
<string>Get autocompletion from current document and installed APIs</string>
576-
</property>
577-
<property name="text">
578-
<string>From doc and APIs</string>
579-
</property>
580-
</widget>
581-
</item>
582-
<item row="0" column="1">
583-
<widget class="QRadioButton" name="autoCompFromAPI">
584-
<property name="toolTip">
585-
<string>Get autocompletion from installed APIs</string>
586-
</property>
587-
<property name="text">
588-
<string>From API files</string>
589-
</property>
590-
<property name="checked">
591-
<bool>true</bool>
592-
</property>
593-
</widget>
594-
</item>
595-
<item row="0" column="0">
596-
<widget class="QRadioButton" name="autoCompFromDoc">
597-
<property name="toolTip">
598-
<string>Get autocompletion from current document</string>
599-
</property>
600-
<property name="text">
601-
<string>From document</string>
602-
</property>
603-
</widget>
604-
</item>
605-
</layout>
606-
</item>
607-
</layout>
608-
</widget>
609-
</item>
610648
<item row="2" column="0">
611649
<widget class="QgsCollapsibleGroupBox" name="groupBox_4">
612650
<property name="title">
@@ -640,38 +678,16 @@
640678
</layout>
641679
</widget>
642680
</item>
643-
<item row="3" column="0">
644-
<widget class="QgsCollapsibleGroupBox" name="groupBoxRunDebugEditor">
645-
<property name="sizePolicy">
646-
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
647-
<horstretch>0</horstretch>
648-
<verstretch>0</verstretch>
649-
</sizepolicy>
650-
</property>
681+
<item row="4" column="0">
682+
<widget class="QGroupBox" name="groupBox">
651683
<property name="title">
652-
<string>Run and Debug</string>
653-
</property>
654-
<property name="collapsed" stdset="0">
655-
<bool>false</bool>
656-
</property>
657-
<property name="saveCollapsedState" stdset="0">
658-
<bool>true</bool>
684+
<string>GitHub Access Token</string>
659685
</property>
660-
<layout class="QGridLayout" name="gridLayout_21">
686+
<layout class="QGridLayout" name="gridLayout_6">
661687
<item row="0" column="0">
662-
<widget class="QCheckBox" name="enableObjectInspector">
663-
<property name="text">
664-
<string>Enable Object Inspector (switching between tabs may be slow)</string>
665-
</property>
666-
<property name="checked">
667-
<bool>false</bool>
668-
</property>
669-
</widget>
670-
</item>
671-
<item row="1" column="0">
672-
<widget class="QCheckBox" name="autoSaveScript">
673-
<property name="text">
674-
<string>Auto-save script before running</string>
688+
<widget class="QLineEdit" name="tokenGhLineEdit">
689+
<property name="placeholderText">
690+
<string>&lt;ACCESS_TOKEN&gt;</string>
675691
</property>
676692
</widget>
677693
</item>

0 commit comments

Comments
 (0)
Please sign in to comment.