--- a/setup.py Tue Jul 05 16:34:43 2022 +0200 +++ b/setup.py Thu Jul 07 11:23:56 2022 +0200 @@ -1,385 +1,13 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright (c) 2019 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> +# Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de> # """ -Module to prepare a distribution package for uploading to PyPI. +Minimum module to allow 'pip' to perform editable installs. """ -import os -import sys -import subprocess # secok -import shutil -import fnmatch -import datetime -import json -import contextlib - -from setuptools import setup, find_packages - -installInfoName = "eric7installpip.json" - -###################################################################### -## some helper functions below -###################################################################### - - -def getVersion(): - """ - Function to get the version from file. - - @return string containing the version - @rtype str - """ - version = "<unknown>" - if sys.argv[-1].startswith(("1", "2")): - # assume it is a version info starting with year - version = sys.argv[-1] - del sys.argv[-1] - else: - # calculate according our version scheme (year.month) - today = datetime.date.today() - version = "{0}.{1}".format(today.year - 2000, today.month) - return version - - -def getPackageData(package, extensions): - """ - Function to return data files of a package with given extensions. - - @param package name of the package directory - @type str - @param extensions list of extensions to test for - @type list of str - @return list of package data files - @rtype list of str - """ - filesList = [] - for dirpath, _dirnames, filenames in os.walk(package): - for fname in filenames: - if ( - not fname.startswith('.') and - os.path.splitext(fname)[1] in extensions - ): - filesList.append( - os.path.relpath(os.path.join(dirpath, fname), package)) - return filesList - - -def getLongDescription(): - """ - Function to get the long description via the README file. - - @return long description - @rtype str - """ - with open(os.path.join(os.path.dirname(__file__), "docs", "README.rst"), - "r") as f: - longDescription = f.read() - - if not longDescription: - longDescription = ( - "eric is an integrated development environment for the Python" - " programming language. It uses the PyQt6 bindings and the" - " QScintilla2 editor widget. See" - " https://eric-ide.python-projects.org for more details." - ) - - return longDescription - -###################################################################### -## functions to prepare the sources for building -###################################################################### - - -def prepareInfoFile(fileName, version): - """ - Function to prepare an Info.py file. - - @param fileName name of the Python file containing the info (string) - @param version version string for the package (string) - """ - if not fileName: - return - - with contextlib.suppress(OSError): - os.rename(fileName, fileName + ".orig") - try: - hgOut = subprocess.run( # secok - ["hg", "identify", "-i"], check=True, - capture_output=True, text=True - ).stdout - except (OSError, subprocess.CalledProcessError): - hgOut = "" - if hgOut: - hgOut = hgOut.strip() - if hgOut.endswith("+"): - hgOut = hgOut[:-1] - with open(fileName + ".orig", "r", encoding="utf-8") as f: - text = f.read() - text = ( - text.replace("@@REVISION@@", hgOut) - .replace("@@VERSION@@", version) - ) - with open(fileName, "w") as f: - f.write(text) - else: - shutil.copy(fileName + ".orig", fileName) - - -def prepareAppdataFile(fileName, version): - """ - Function to prepare a .appdata.xml file. - - @param fileName name of the .appdata.xml file (string) - @param version version string for the package (string) - """ - if not fileName: - return - - with contextlib.suppress(OSError): - os.rename(fileName, fileName + ".orig") - with open(fileName + ".orig", "r", encoding="utf-8") as f: - text = f.read() - text = ( - text.replace("@VERSION@", version) - .replace("@DATE@", datetime.date.today().isoformat()) - ) - with open(fileName, "w") as f: - f.write(text) - - -def cleanupSource(dirName): - """ - Cleanup the sources directory to get rid of leftover files - and directories. - - @param dirName name of the directory to prune (string) - """ - # step 1: delete all Ui_*.py files without a corresponding - # *.ui file - dirListing = os.listdir(dirName) - for formName, sourceName in [ - (f.replace('Ui_', "").replace(".py", ".ui"), f) - for f in dirListing if fnmatch.fnmatch(f, "Ui_*.py")]: - if not os.path.exists(os.path.join(dirName, formName)): - os.remove(os.path.join(dirName, sourceName)) - if os.path.exists(os.path.join(dirName, sourceName + "c")): - os.remove(os.path.join(dirName, sourceName + "c")) - - # step 2: delete the __pycache__ directory and all remaining *.pyc files - if os.path.exists(os.path.join(dirName, "__pycache__")): - shutil.rmtree(os.path.join(dirName, "__pycache__")) - for name in [f for f in os.listdir(dirName) - if fnmatch.fnmatch(f, "*.pyc")]: - os.remove(os.path.join(dirName, name)) - - # step 3: delete *.orig files - for name in [f for f in os.listdir(dirName) - if fnmatch.fnmatch(f, "*.orig")]: - os.remove(os.path.join(dirName, name)) - - # step 4: descent into subdirectories and delete them if empty - for name in os.listdir(dirName): - name = os.path.join(dirName, name) - if os.path.isdir(name): - cleanupSource(name) - if len(os.listdir(name)) == 0: - os.rmdir(name) - +from setuptools import setup -def __pyName(py_dir, py_file): - """ - Local function to create the Python source file name for the compiled - .ui file. - - @param py_dir suggested name of the directory (string) - @param py_file suggested name for the compile source file (string) - @return tuple of directory name (string) and source file name (string) - """ - return py_dir, "Ui_{0}".format(py_file) - - -def compileUiFiles(dirName): - """ - Compile the .ui files to Python sources. - - @param dirName name of the directory to compile UI files for (string) - """ - from PyQt6.uic import compileUiDir - compileUiDir(dirName, True, __pyName) - - -def createInstallInfoFile(dirName): - """ - Create a file containing some rudimentary install information. - - @param dirName name of the directory to compile UI files for - @type str - """ - global installInfoName - - installInfo = { - "sudo": False, - "user": "", - "exe": "", - "argv": "", - "install_cwd": "", - "eric": "", - "virtualenv": False, - "installed": False, - "installed_on": "", - "guessed": False, - "edited": False, - "pip": True, - "remarks": "", - "install_cwd_edited": False, - "exe_edited": False, - "argv_edited": False, - "eric_edited": False, - } - with open(os.path.join(dirName, installInfoName), "w") as infoFile: - json.dump(installInfo, infoFile, indent=2) - -###################################################################### -## setup() below -###################################################################### - -Version = getVersion() -sourceDir = os.path.join(os.path.dirname(__file__), "eric7") -infoFileName = os.path.join(sourceDir, "UI", "Info.py") -appdataFileName = os.path.join(os.path.dirname(__file__), "linux", - "eric7.appdata.xml") -if sys.argv[1].startswith("bdist"): - # prepare the sources under "eric7" for building the wheel file - print("preparing the sources...") # __IGNORE_WARNING_M801__ - cleanupSource(sourceDir) - compileUiFiles(sourceDir) - prepareInfoFile(infoFileName, Version) - prepareAppdataFile(appdataFileName, Version) - createInstallInfoFile(sourceDir) - print("Preparation finished") # __IGNORE_WARNING_M801__ - -setup( - name="eric-ide", - version=Version, - description="eric-ide is an integrated development environment for the" - " Python language.", - long_description=getLongDescription(), - long_description_content_type="text/x-rst", - author="Detlev Offenbach", - author_email="detlev@die-offenbachs.de", - url="https://eric-ide.python-projects.org", - project_urls={ - "Source Code": "https://hg.die-offenbachs.homelinux.org/eric/", - "Issues Tracker": "https://tracker.die-offenbachs.homelinux.org/", - "Funding": "https://www.paypal.com/donate/?hosted_button_id=XG3RSPKE3YAJ2", - }, - platforms=["Linux", "Windows", "macOS"], - license="GPLv3+", - classifiers=[ - "License :: OSI Approved ::" - " GNU General Public License v3 or later (GPLv3+)", - "Environment :: MacOS X", - "Environment :: Win32 (MS Windows)", - "Environment :: X11 Applications", - "Environment :: X11 Applications :: Qt", - "Intended Audience :: Developers", - "Intended Audience :: End Users/Desktop", - "Natural Language :: English", - "Natural Language :: German", - "Natural Language :: Russian", - "Natural Language :: Spanish", - "Operating System :: MacOS :: MacOS X", - "Operating System :: Microsoft :: Windows :: Windows 10", - "Operating System :: POSIX :: Linux", - "Programming Language :: Python", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: Implementation :: CPython", - "Topic :: Software Development", - "Topic :: Text Editors :: Integrated Development Environments (IDE)" - ], - keywords="Development PyQt6 IDE Python3", - python_requires=">=3.7, <3.12", - install_requires=[ - "pip>=21.1", - "wheel", - "PyQt6>=6.2.0", - "PyQt6-Charts>=6.2.0", - "PyQt6-WebEngine>=6.2.0", - "PyQt6-QScintilla>=2.13.0", - "docutils", - "Markdown", - "pyyaml", - "tomlkit", - "chardet", - "asttokens", - "EditorConfig", - "Send2Trash", - "Pygments", - "parso", - "jedi", - "packaging", - "pipdeptree", - "cyclonedx-python-lib", - "cyclonedx-bom", - "trove-classifiers", - "pywin32>=1.0;platform_system=='Windows'", - ], - packages=find_packages(), - zip_safe=False, - package_data={ - "": getPackageData( - "eric7", - [".png", ".svg", ".svgz", ".xpm", ".ico", ".gif", ".icns", ".txt", - ".md", ".rst", ".tmpl", ".html", ".qch", ".css", ".scss", ".qss", - ".ehj", ".ethj", ".api", ".bas", ".dat", ".xbel", ".xml", ".js"] - ) + ["i18n/eric7_de.qm", "i18n/eric7_en.qm", "i18n/eric7_es.qm", - "i18n/eric7_ru.qm", - installInfoName, - ] - }, - entry_points={ - "gui_scripts": [ - "eric7 = eric7.eric7:main", - "eric7_browser = eric7.eric7_browser:main", - "eric7_compare = eric7.eric7_compare:main", - "eric7_configure = eric7.eric7_configure:main", - "eric7_diff = eric7.eric7_diff:main", - "eric7_editor = eric7.eric7_editor:main", - "eric7_hexeditor = eric7.eric7_hexeditor:main", - "eric7_iconeditor = eric7.eric7_iconeditor:main", - "eric7_plugininstall = eric7.eric7_plugininstall:main", - "eric7_pluginrepository = eric7.eric7_pluginrepository:main", - "eric7_pluginuninstall = eric7.eric7_pluginuninstall:main", - "eric7_qregularexpression = eric7.eric7_qregularexpression:main", - "eric7_re = eric7.eric7_re:main", - "eric7_shell = eric7.eric7_shell:main", - "eric7_snap = eric7.eric7_snap:main", - "eric7_sqlbrowser = eric7.eric7_sqlbrowser:main", - "eric7_testing = eric7.eric7_testing:main", - "eric7_tray = eric7.eric7_tray:main", - "eric7_trpreviewer = eric7.eric7_trpreviewer:main", - "eric7_uipreviewer = eric7.eric7_uipreviewer:main", - "eric7_virtualenv = eric7.eric7_virtualenv:main", - ], - "console_scripts": [ - "eric7_api = eric7.eric7_api:main", - "eric7_doc = eric7.eric7_doc:main", - "eric7_post_install = eric7.eric7_post_install:main", - ], - }, -) - -# cleanup -for fileName in [infoFileName, appdataFileName]: - if os.path.exists(fileName + ".orig"): - with contextlib.suppress(OSError): - os.remove(fileName) - os.rename(fileName + ".orig", fileName) +setup()