44import html
55import os
66import sys
7+ import itertools
8+ import subprocess
9+ import site
710
811from PyQt6 .QtCore import Qt , pyqtSignal
912from PyQt6 .QtWidgets import QDialog , QMessageBox , QTableWidgetItem , QInputDialog
1013
1114from plover .gui_qt .tool import Tool
12-
13- from plover .plugins_manager .gui_qt .info_browser import InfoBrowser
14- from plover .plugins_manager .gui_qt .manager_ui import Ui_PluginsManager
15- from plover .plugins_manager .gui_qt .run_dialog import RunDialog
15+ from plover .gui_qt .info_browser import InfoBrowser
16+ from plover .gui_qt .plugins_manager_ui import Ui_PluginsManager
17+ from plover .gui_qt .run_dialog import RunDialog
1618from plover .plugins_manager .registry import Registry
1719from plover .plugins_manager .utils import description_to_html
18- from plover .plugins_manager .__main__ import pip
20+ from plover .plugins_manager import local_registry , global_registry
21+ from plover .plugins_manager .utils import running_under_virtualenv
22+
23+
24+ def list_plugins (freeze = False ):
25+ installed_plugins = local_registry .list_plugins ()
26+ if freeze :
27+ available_plugins = {}
28+ else :
29+ available_plugins = global_registry .list_plugins ()
30+ for name , installed , available in sorted (
31+ (name ,
32+ installed_plugins .get (name , []),
33+ available_plugins .get (name , []))
34+ for name in set (itertools .chain (installed_plugins ,
35+ available_plugins ))
36+ ):
37+ latest = available [- 1 ] if available else None
38+ current = installed [- 1 ] if installed else None
39+ info = latest or current
40+ if freeze :
41+ if current :
42+ print ('%s==%s' % (current .name , current .version ))
43+ continue
44+ print ('%s (%s) - %s' % (info .name , info .version , info .summary ))
45+ if current :
46+ print (' INSTALLED: %s' % current .version )
47+ if latest :
48+ print (' LATEST: %s' % latest .version )
1949
2050
51+ def pip (args , stdin = None , stdout = None , stderr = None , ** kwargs ):
52+ cmd = [sys .executable , '-m' ,
53+ 'plover.plugins_manager.pip_wrapper' ,
54+ '--disable-pip-version-check' ]
55+ env = dict (os .environ )
56+ # Make sure user plugins are handled
57+ # even if user site is not enabled.
58+ if not running_under_virtualenv () and not site .ENABLE_USER_SITE :
59+ pypath = env .get ('PYTHONPATH' )
60+ if pypath is None :
61+ pypath = []
62+ else :
63+ pypath = pypath .split (os .pathsep )
64+ pypath .insert (0 , site .USER_SITE )
65+ env ['PYTHONPATH' ] = os .pathsep .join (pypath )
66+ command = args .pop (0 )
67+ if command == 'check' :
68+ cmd .append ('check' )
69+ elif command == 'install' :
70+ cmd .extend ((
71+ 'install' ,
72+ '--upgrade-strategy=only-if-needed' ,
73+ ))
74+ if not running_under_virtualenv ():
75+ cmd .append ('--user' )
76+ elif command == 'uninstall' :
77+ cmd .append ('uninstall' )
78+ elif command == 'list' :
79+ cmd .extend ((
80+ 'list' ,
81+ '--format=columns' ,
82+ ))
83+ else :
84+ raise ValueError ('invalid command: %s' % command )
85+ cmd .extend (args )
86+ return subprocess .Popen (cmd , env = env , stdin = stdin ,
87+ stdout = stdout , stderr = stderr ,
88+ ** kwargs )
89+
2190class PluginsManager (Tool , Ui_PluginsManager ):
2291
2392 TITLE = 'Plugins Manager'
2493 ROLE = 'plugins_manager'
25- ICON = ('plover.plugins_manager.gui_qt.resources' , ':/icon .svg' )
94+ ICON = (':/plugins_manager .svg' )
2695
2796 # We use a class instance so the state is persistent
2897 # accross different executions of the dialog when
@@ -42,6 +111,7 @@ def __init__(self, engine):
42111 self ._packages_updated .connect (self ._on_packages_updated )
43112 if self ._packages is None :
44113 PluginsManager ._packages = Registry ()
114+ print (PluginsManager ._packages )
45115 self ._on_packages_updated ()
46116 self .on_refresh ()
47117
0 commit comments