17 from PyQt6.QtNetwork import QNetworkRequest, QNetworkReply |
17 from PyQt6.QtNetwork import QNetworkRequest, QNetworkReply |
18 |
18 |
19 from EricWidgets.EricApplication import ericApp |
19 from EricWidgets.EricApplication import ericApp |
20 from EricWidgets import EricMessageBox, EricFileDialog |
20 from EricWidgets import EricMessageBox, EricFileDialog |
21 from EricWidgets.EricCompleters import EricDirCompleter |
21 from EricWidgets.EricCompleters import EricDirCompleter |
22 from EricGui.EricOverrideCursor import EricOverrideCursor |
|
23 |
22 |
24 from .Ui_SetupWizardDialog import Ui_SetupWizardDialog |
23 from .Ui_SetupWizardDialog import Ui_SetupWizardDialog |
25 |
24 |
26 import UI.PixmapCache |
25 import UI.PixmapCache |
27 import Utilities |
26 import Utilities |
55 self.__sourceDirCompleter = EricDirCompleter(self.sourceDirectoryEdit) |
54 self.__sourceDirCompleter = EricDirCompleter(self.sourceDirectoryEdit) |
56 |
55 |
57 self.packageRootDirButton.setIcon(UI.PixmapCache.getIcon("open")) |
56 self.packageRootDirButton.setIcon(UI.PixmapCache.getIcon("open")) |
58 self.packageDirButton.setIcon(UI.PixmapCache.getIcon("open")) |
57 self.packageDirButton.setIcon(UI.PixmapCache.getIcon("open")) |
59 self.sourceDirectoryButton.setIcon(UI.PixmapCache.getIcon("open")) |
58 self.sourceDirectoryButton.setIcon(UI.PixmapCache.getIcon("open")) |
60 |
|
61 self.variantComboBox.addItem(self.tr("distutils"), "distutils.core") |
|
62 self.variantComboBox.addItem(self.tr("setuptools"), "setuptools") |
|
63 self.variantComboBox.setCurrentIndex(1) |
|
64 |
59 |
65 self.__mandatoryStyleSheet = "QLineEdit {border: 2px solid;}" |
60 self.__mandatoryStyleSheet = "QLineEdit {border: 2px solid;}" |
66 for lineEdit in [self.nameEdit, self.versionEdit, |
61 for lineEdit in [self.nameEdit, self.versionEdit, |
67 self.homePageUrlEdit, self.authorEdit, |
62 self.homePageUrlEdit, self.authorEdit, |
68 self.authorEmailEdit, self.maintainerEdit, |
63 self.authorEmailEdit, self.maintainerEdit, |
286 code += '__prj__ = "{0}"{1}'.format( |
281 code += '__prj__ = "{0}"{1}'.format( |
287 self.nameEdit.text(), os.linesep) |
282 self.nameEdit.text(), os.linesep) |
288 code += os.linesep |
283 code += os.linesep |
289 |
284 |
290 if self.importCheckBox.isChecked(): |
285 if self.importCheckBox.isChecked(): |
291 variant = self.variantComboBox.itemData( |
286 additionalImport = ", find_packages" |
292 self.variantComboBox.currentIndex()) |
287 code += "from setuptools import setup{0}{1}".format( |
293 if variant == "setuptools": |
288 additionalImport, os.linesep) |
294 additionalImport = ", find_packages" |
|
295 else: |
|
296 additionalImport = "" |
|
297 code += "from {0} import setup{1}{2}".format( |
|
298 variant, additionalImport, os.linesep) |
|
299 if code: |
289 if code: |
300 code += "{0}{0}".format(os.linesep) |
290 code += "{0}{0}".format(os.linesep) |
301 |
291 |
302 if self.descriptionFromFilesCheckBox.isChecked(): |
292 if self.descriptionFromFilesCheckBox.isChecked(): |
303 code += 'def get_long_description():{0}'.format(os.linesep) |
293 code += 'def get_long_description():{0}'.format(os.linesep) |
392 |
382 |
393 if self.keywordsEdit.text(): |
383 if self.keywordsEdit.text(): |
394 code += '{0}keywords="{1}",{2}'.format( |
384 code += '{0}keywords="{1}",{2}'.format( |
395 istring, self.keywordsEdit.text(), os.linesep) |
385 istring, self.keywordsEdit.text(), os.linesep) |
396 |
386 |
397 if self.variantComboBox.currentIndex() == 0: |
387 code += '{0}packages=find_packages('.format(istring) |
398 # distutils |
388 src = Utilities.fromNativeSeparators( |
399 packages = [] |
389 self.sourceDirectoryEdit.text()) |
400 for row in range(self.packagesList.count()): |
390 excludePatterns = [] |
401 packages.append(self.packagesList.item(row).text()) |
391 for row in range(self.excludePatternList.count()): |
402 if packages: |
392 excludePatterns.append( |
403 code += '{0}packages=[{1}'.format(istring, os.linesep) |
393 self.excludePatternList.item(row).text()) |
404 code += '{0}"{1}"{2}'.format( |
394 if src: |
405 i1string, |
395 code += '{0}{1}"{2}"'.format(os.linesep, i1string, src) |
406 '",{0}{1}"'.format(os.linesep, i1string).join(packages), |
|
407 os.linesep) |
|
408 code += '{0}],{1}'.format(istring, os.linesep) |
|
409 del packages |
|
410 elif self.variantComboBox.currentIndex() == 1: |
|
411 # setuptools |
|
412 code += '{0}packages=find_packages('.format(istring) |
|
413 src = Utilities.fromNativeSeparators( |
|
414 self.sourceDirectoryEdit.text()) |
|
415 excludePatterns = [] |
|
416 for row in range(self.excludePatternList.count()): |
|
417 excludePatterns.append( |
|
418 self.excludePatternList.item(row).text()) |
|
419 if src: |
|
420 code += '{0}{1}"{2}"'.format(os.linesep, i1string, src) |
|
421 if excludePatterns: |
|
422 code += ',' |
|
423 else: |
|
424 code += '{0}{1}'.format(os.linesep, istring) |
|
425 if excludePatterns: |
396 if excludePatterns: |
426 code += '{0}{1}exclude=[{0}'.format(os.linesep, i1string) |
397 code += ',' |
427 code += '{0}"{1}"{2}'.format( |
398 else: |
428 i2string, |
399 code += '{0}{1}'.format(os.linesep, istring) |
429 '",{0}{1}"'.format(os.linesep, i2string) |
400 if excludePatterns: |
430 .join(excludePatterns), |
401 code += '{0}{1}exclude=[{0}'.format(os.linesep, i1string) |
431 os.linesep) |
402 code += '{0}"{1}"{2}'.format( |
432 code += '{0}]{1}{2}'.format(i1string, os.linesep, istring) |
403 i2string, |
433 code += '),{0}'.format(os.linesep) |
404 '",{0}{1}"'.format(os.linesep, i2string) |
434 |
405 .join(excludePatterns), |
435 if self.includePackageDataCheckBox.isChecked(): |
406 os.linesep) |
436 code += '{0}include_package_data = True,{1}'.format( |
407 code += '{0}]{1}{2}'.format(i1string, os.linesep, istring) |
437 istring, os.linesep) |
408 code += '),{0}'.format(os.linesep) |
|
409 |
|
410 if self.includePackageDataCheckBox.isChecked(): |
|
411 code += '{0}include_package_data = True,{1}'.format( |
|
412 istring, os.linesep) |
438 |
413 |
439 modules = [] |
414 modules = [] |
440 for row in range(self.modulesList.count()): |
415 for row in range(self.modulesList.count()): |
441 modules.append(self.modulesList.item(row).text()) |
416 modules.append(self.modulesList.item(row).text()) |
442 if modules: |
417 if modules: |
494 |
469 |
495 # prevent overwriting of entries by disabling the button |
470 # prevent overwriting of entries by disabling the button |
496 self.projectButton.setEnabled(False) |
471 self.projectButton.setEnabled(False) |
497 |
472 |
498 @pyqtSlot() |
473 @pyqtSlot() |
499 def on_packagesList_itemSelectionChanged(self): |
|
500 """ |
|
501 Private slot to handle a change of selected items of the |
|
502 packages list. |
|
503 """ |
|
504 self.deletePackageButton.setEnabled( |
|
505 len(self.packagesList.selectedItems()) > 0) |
|
506 |
|
507 @pyqtSlot() |
|
508 def on_deletePackageButton_clicked(self): |
|
509 """ |
|
510 Private slot to delete the selected package items. |
|
511 """ |
|
512 for itm in self.packagesList.selectedItems(): |
|
513 self.packagesList.takeItem( |
|
514 self.packagesList.row(itm)) |
|
515 del itm |
|
516 |
|
517 @pyqtSlot() |
|
518 def on_addPackageButton_clicked(self): |
|
519 """ |
|
520 Private slot to add a package to the list. |
|
521 """ |
|
522 pkg = Utilities.toNativeSeparators(self.packageEdit.text()) |
|
523 self.__addPackage(pkg) |
|
524 |
|
525 @pyqtSlot() |
|
526 def on_packageEdit_returnPressed(self): |
|
527 """ |
|
528 Private slot handling a press of the return button of the |
|
529 package edit. |
|
530 """ |
|
531 self.on_addPackageButton_clicked() |
|
532 |
|
533 @pyqtSlot(str) |
|
534 def on_packageEdit_textChanged(self, txt): |
|
535 """ |
|
536 Private slot to handle a change of the package text. |
|
537 |
|
538 @param txt text of the line edit (string) |
|
539 """ |
|
540 self.addPackageButton.setEnabled(bool(txt)) |
|
541 |
|
542 @pyqtSlot() |
|
543 def on_packageDirButton_clicked(self): |
|
544 """ |
|
545 Private slot to select a package directory via a directory |
|
546 selection dialog. |
|
547 """ |
|
548 startDir = self.packageEdit.text() |
|
549 if not startDir: |
|
550 startDir = self.packageRootEdit.text() or self.__getStartDir() |
|
551 packageDir = EricFileDialog.getExistingDirectory( |
|
552 self, |
|
553 self.tr("Package Directory"), |
|
554 Utilities.fromNativeSeparators(startDir)) |
|
555 if packageDir: |
|
556 self.packageEdit.setText( |
|
557 Utilities.toNativeSeparators(packageDir)) |
|
558 |
|
559 @pyqtSlot() |
|
560 def on_autodiscoverPackagesButton_clicked(self): |
|
561 """ |
|
562 Private slot to discover packages automatically. |
|
563 """ |
|
564 with EricOverrideCursor(): |
|
565 self.autodiscoverPackagesButton.setEnabled(False) |
|
566 startDir = self.packageRootEdit.text() or self.__getStartDir() |
|
567 if startDir: |
|
568 self.packagesList.clear() |
|
569 for dirpath, _dirnames, filenames in os.walk(startDir): |
|
570 if "__init__.py" in filenames: |
|
571 self.__addPackage(dirpath) |
|
572 self.autodiscoverPackagesButton.setEnabled(True) |
|
573 |
|
574 @pyqtSlot() |
|
575 def on_packageRootDirButton_clicked(self): |
474 def on_packageRootDirButton_clicked(self): |
576 """ |
475 """ |
577 Private slot to select the packages root directory via a |
476 Private slot to select the packages root directory via a |
578 directory selection dialog. |
477 directory selection dialog. |
579 """ |
478 """ |
598 """ |
497 """ |
599 projectOpen = ericApp().getObject("Project").isOpen() |
498 projectOpen = ericApp().getObject("Project").isOpen() |
600 validPackagesRoot = bool(txt) and os.path.exists(txt) |
499 validPackagesRoot = bool(txt) and os.path.exists(txt) |
601 self.autodiscoverPackagesButton.setEnabled( |
500 self.autodiscoverPackagesButton.setEnabled( |
602 projectOpen or validPackagesRoot) |
501 projectOpen or validPackagesRoot) |
603 |
|
604 def __addPackage(self, pkgDir): |
|
605 """ |
|
606 Private method to add a package to the list. |
|
607 |
|
608 @param pkgDir name of the package directory (string) |
|
609 """ |
|
610 if pkgDir: |
|
611 if "\\" in pkgDir or "/" in pkgDir: |
|
612 # It is a directory. Check for an __init__.py file. |
|
613 if os.path.isabs(pkgDir): |
|
614 prefix = "" |
|
615 else: |
|
616 prefix = self.packageRootEdit.text() |
|
617 initName = os.path.join( |
|
618 prefix, |
|
619 Utilities.toNativeSeparators(pkgDir), |
|
620 "__init__.py") |
|
621 if not os.path.exists(initName): |
|
622 res = EricMessageBox.information( |
|
623 self, |
|
624 self.tr("Add Package"), |
|
625 self.tr("""<p>The directory <b>{0}</b> is not""" |
|
626 """ a Python package.</p>""") |
|
627 .format(pkgDir), |
|
628 EricMessageBox.Ignore | EricMessageBox.Ok) |
|
629 if res == EricMessageBox.Ok: |
|
630 return |
|
631 |
|
632 pkg = pkgDir.replace( |
|
633 Utilities.toNativeSeparators(self.packageRootEdit.text()), "") |
|
634 if pkg.startswith(("\\", "/")): |
|
635 pkg = pkg[1:] |
|
636 if pkg: |
|
637 QListWidgetItem( |
|
638 pkg.replace("\\", ".").replace("/", "."), |
|
639 self.packagesList) |
|
640 self.packageEdit.clear() |
|
641 |
502 |
642 def __getStartDir(self): |
503 def __getStartDir(self): |
643 """ |
504 """ |
644 Private method to get the start directory for selection dialogs. |
505 Private method to get the start directory for selection dialogs. |
645 |
506 |
725 if module: |
586 if module: |
726 QListWidgetItem(os.path.splitext(module)[0] |
587 QListWidgetItem(os.path.splitext(module)[0] |
727 .replace("\\", ".").replace("/", "."), |
588 .replace("\\", ".").replace("/", "."), |
728 self.modulesList) |
589 self.modulesList) |
729 |
590 |
730 @pyqtSlot(int) |
|
731 def on_variantComboBox_currentIndexChanged(self, index): |
|
732 """ |
|
733 Private slot handling a change of the setup variant. |
|
734 |
|
735 @param index index of the selected entry (integer) |
|
736 """ |
|
737 self.packagesStackedWidget.setCurrentIndex(index) |
|
738 |
|
739 @pyqtSlot() |
591 @pyqtSlot() |
740 def on_excludePatternList_itemSelectionChanged(self): |
592 def on_excludePatternList_itemSelectionChanged(self): |
741 """ |
593 """ |
742 Private slot to handle a change of selected items of the |
594 Private slot to handle a change of selected items of the |
743 exclude pattern list. |
595 exclude pattern list. |