src/eric7/PipInterface/PipLicensesDialog.py

branch
eric7-maintenance
changeset 9940
a57c188857e9
parent 9654
7328efba128b
parent 9851
ec12090e9cd9
child 10460
3b34efa2857c
equal deleted inserted replaced
9833:9308099b7d38 9940:a57c188857e9
8 """ 8 """
9 9
10 import csv 10 import csv
11 import os 11 import os
12 import re 12 import re
13
14 from collections import Counter
13 15
14 from PyQt6.QtCore import Qt, pyqtSlot 16 from PyQt6.QtCore import Qt, pyqtSlot
15 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem 17 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem
16 18
17 from eric7.EricGui.EricOverrideCursor import EricOverrideCursor 19 from eric7.EricGui.EricOverrideCursor import EricOverrideCursor
30 LicensesLicenseColumn = 2 32 LicensesLicenseColumn = 2
31 33
32 SummaryCountColumn = 0 34 SummaryCountColumn = 0
33 SummaryLicenseColumn = 1 35 SummaryLicenseColumn = 1
34 36
35 def __init__( 37 def __init__(self, pip, environment, packages=None, parent=None):
36 self, pip, environment, localPackages=True, usersite=False, parent=None
37 ):
38 """ 38 """
39 Constructor 39 Constructor
40 40
41 @param pip reference to the pip interface object 41 @param pip reference to the pip interface object
42 @type Pip 42 @type Pip
43 @param environment name of the environment to show the licenses for 43 @param environment name of the environment to show the licenses for
44 @type str 44 @type str
45 @param localPackages flag indicating to show the licenses for local 45 @param packages list of packages to show licenses for (or None to show all
46 packages only 46 licenses (defaults to None)
47 @type bool 47 @type list (optional)
48 @param usersite flag indicating to show the licenses for packages
49 installed in user-site directory only
50 @type bool
51 @param parent reference to the parent widget (defaults to None) 48 @param parent reference to the parent widget (defaults to None)
52 @type QWidget (optional) 49 @type QWidget (optional)
53 """ 50 """
54 super().__init__(parent) 51 super().__init__(parent)
55 self.setupUi(self) 52 self.setupUi(self)
56 53
57 self.__pip = pip 54 self.__pip = pip
58 self.__environment = environment 55 self.__environment = environment
56 self.__packages = packages[:] if packages is not None else None
59 57
60 self.__allFilter = self.tr("<All>") 58 self.__allFilter = self.tr("<All>")
61 59
62 self.__saveCSVButton = self.buttonBox.addButton( 60 self.__saveCSVButton = self.buttonBox.addButton(
63 self.tr("Save as CSV..."), QDialogButtonBox.ButtonRole.ActionRole 61 self.tr("Save as CSV..."), QDialogButtonBox.ButtonRole.ActionRole
64 ) 62 )
65 self.__saveCSVButton.clicked.connect(self.__saveAsCSV) 63 self.__saveCSVButton.clicked.connect(self.__saveAsCSV)
66 64
67 self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True) 65 self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
68 66
69 self.localCheckBox.setChecked(localPackages)
70 self.userCheckBox.setChecked(usersite)
71
72 self.localCheckBox.toggled.connect(self.__refreshLicenses)
73 self.userCheckBox.toggled.connect(self.__refreshLicenses)
74
75 if environment: 67 if environment:
76 self.environmentLabel.setText( 68 self.environmentLabel.setText(
77 "<b>{0}</b>".format(self.tr('Licenses of "{0}"').format(environment)) 69 "<b>{0}</b>".format(self.tr('Licenses of "{0}"').format(environment))
78 ) 70 )
79 else: 71 else:
82 74
83 self.licenseFilterComboBox.currentTextChanged.connect( 75 self.licenseFilterComboBox.currentTextChanged.connect(
84 self.__filterPackagesByLicense 76 self.__filterPackagesByLicense
85 ) 77 )
86 78
87 self.__refreshLicenses() 79 self.__populateLicenses()
88 80
89 @pyqtSlot() 81 @pyqtSlot()
90 def __refreshLicenses(self): 82 def __populateLicenses(self):
91 """ 83 """
92 Private slot to refresh the license lists. 84 Private slot to populate the license lists.
93 """ 85 """
94 with EricOverrideCursor(): 86 with EricOverrideCursor():
95 self.licensesList.clear() 87 self.licensesList.clear()
96 self.summaryList.clear() 88 self.summaryList.clear()
97 self.licenseFilterComboBox.clear() 89 self.licenseFilterComboBox.clear()
98 90
99 licensesForFilter = set() 91 licensesForFilter = set()
92 licenseSummaryList = []
100 93
101 # step 1: show the licenses per package 94 # step 1: show the licenses per package
102 self.licensesList.setUpdatesEnabled(False) 95 self.licensesList.setUpdatesEnabled(False)
103 licenses = self.__pip.getLicenses( 96 licenses = self.__pip.getLicenses(self.__environment)
104 self.__environment,
105 localPackages=self.localCheckBox.isChecked(),
106 usersite=self.userCheckBox.isChecked(),
107 )
108 for lic in licenses: 97 for lic in licenses:
109 QTreeWidgetItem( 98 if self.__packages is None or lic["Name"] in self.__packages:
110 self.licensesList, 99 QTreeWidgetItem(
111 [ 100 self.licensesList,
112 lic["Name"], 101 [
113 lic["Version"], 102 lic["Name"],
114 lic["License"].replace("; ", "\n"), 103 lic["Version"],
115 ], 104 lic["License"].replace("; ", "\n"),
116 ) 105 ],
106 )
107 licenseSummaryList.extend(
108 x.strip() for x in lic["License"].split("; ")
109 )
117 110
118 self.licensesList.sortItems( 111 self.licensesList.sortItems(
119 PipLicensesDialog.LicensesPackageColumn, Qt.SortOrder.AscendingOrder 112 PipLicensesDialog.LicensesPackageColumn, Qt.SortOrder.AscendingOrder
120 ) 113 )
121 for col in range(self.licensesList.columnCount()): 114 for col in range(self.licensesList.columnCount()):
122 self.licensesList.resizeColumnToContents(col) 115 self.licensesList.resizeColumnToContents(col)
123 self.licensesList.setUpdatesEnabled(True) 116 self.licensesList.setUpdatesEnabled(True)
124 117
125 # step 2: show the licenses summary 118 # step 2: show the licenses summary
126 self.summaryList.setUpdatesEnabled(False) 119 self.summaryList.setUpdatesEnabled(False)
127 licenses = self.__pip.getLicensesSummary( 120 licenseCounter = Counter(licenseSummaryList)
128 self.__environment, 121 for lic in licenseCounter:
129 localPackages=self.localCheckBox.isChecked(),
130 usersite=self.userCheckBox.isChecked(),
131 )
132 for lic in licenses:
133 QTreeWidgetItem( 122 QTreeWidgetItem(
134 self.summaryList, 123 self.summaryList,
135 [ 124 [
136 "{0:4d}".format(lic["Count"]), 125 "{0:4d}".format(licenseCounter[lic]),
137 lic["License"].replace("; ", "\n"), 126 lic,
138 ], 127 ],
139 ) 128 )
140 licensesForFilter |= set(lic["License"].split("; ")) 129 licensesForFilter.add(lic)
141 130
142 self.summaryList.sortItems( 131 self.summaryList.sortItems(
143 PipLicensesDialog.SummaryLicenseColumn, Qt.SortOrder.AscendingOrder 132 PipLicensesDialog.SummaryLicenseColumn, Qt.SortOrder.AscendingOrder
144 ) 133 )
145 for col in range(self.summaryList.columnCount()): 134 for col in range(self.summaryList.columnCount()):

eric ide

mercurial