Entwicklung des perfekten Pypi-Pakets mit Unterstützung für verschiedene Python-Versionen

Dies ist ein kleines Handbuch / eine Geschichte darüber, wie man ein "perfektes" pypi-Paket für Python erstellt, das jeder mit dem geliebten Befehl installieren kann:


pip install my-perfect-package 

Es richtet sich an Anfänger, aber ich fordere Profis auf, ihre Meinung darüber zu äußern, wie das "perfekte" Paket verbessert werden kann. Deshalb bitte ich um Katze.


Was bedeutet ein "ideales" Paket?


Ich gehe von folgenden Voraussetzungen aus:


  • Open Source auf Github;
    Jeder sollte in der Lage sein, zur Entwicklung beizutragen und dem Autor zu danken.
  • Unterstützung für alle aktuellen / beliebten Versionen von Python (2.7, 3.5, 3.6, 3.7, 3.8);
    Pythons sind anders und schreiben irgendwo noch aktiv auf 2.7.
  • 100% ige Abdeckung mit Unit-Tests;
    Unit-Tests verbessern die Architektur und automatisieren Regressionsprüfungen.
    Ein Abzeichen mit einer geschätzten Nummer wirft die FAQ auf und setzt die Messlatte für andere .
  • Verwendung von CI:
    Automatische Prüfungen sind sehr bequem! Und ein paar coole Abzeichen
    • Ausführen von Unit-Tests auf allen Plattformen und auf allen Python-Versionen;
      Glauben Sie nicht denjenigen, die behaupten, dass Python und installierte Pakete plattformübergreifend sind , da Sie immer auf einen Fehler stoßen können.
    • Style Code Check;
      Ein einheitlicher Stil verbessert die Lesbarkeit und verringert die Anzahl leerer Diskussionen in einer Überprüfung.
    • Statischer Code-Analysator;
      Automatische Suche nach Fehlern im Code? Gib mir zwei!
  • Aktuelle Dokumentation;
    Beispiele für die Arbeit mit dem Paket, die Beschreibung von Methoden / Klassen und die Analyse typischer Fehler - dokumentierte Erfahrungen reduzieren die Einstiegsschwelle für Anfänger.
  • Plattformübergreifende Entwicklung;
    Leider ist es schwierig, einen persönlichen Beitrag zu Projekten zu leisten, nur weil der Entwickler die Tools für Unix geschärft hat. Ich habe zum Beispiel Bash-Skripte für die Assemblierung verwendet.
  • Das Paket ist nützlich und macht die Welt zu einem besseren Ort.
    Eine schwierige Anforderung, da nach der Anzahl der Pakete in pypi (~ 210k) Entwickler wilde Altruisten sind und bereits viel geschrieben wurde.

Wo soll ich anfangen?


Da es keine guten Ideen gab, entschied ich mich für ein abgedroschenes und sehr beliebtes Thema - die Arbeit mit Zahlensystemen. Die erste Version sollte in der Lage sein, Zahlen ins Römische und umgekehrt zu übersetzen. Denn das Handbuch ist komplizierter und nicht notwendig. Oh ja, das Wichtigste ist der Name: numsys - als Entschlüsselung von Zahlensystemen. Zahlensystem-py .


Wie teste ich?


Ich nahm python3.7 und schrieb zuerst Tests mit Funktionsstubs (wir sind alle TDDs ) unter Verwendung des Standardmoduls unittests .


Ich mache folgende Projektstruktur:


 src/ numeral-system/ __init__.py roman.py tests __init__.py test_roman.py 

Ich lege keine Tests in das Paket, also trenne ich mich Spreu . Anfangs habe src/ den Ordner " src/ " nicht erstellt, aber die Weiterentwicklung hat gezeigt, dass die Bedienung für mich bequemer ist. Dies ist daher nach Belieben nicht erforderlich.


Ich habe mich für pytest zum Starten entschieden - es kann perfekt mit Tests aus dem Standardmodul arbeiten. Es mag ein bisschen unlogisch aussehen, aber das Standardmodul für Tests ist für mich es scheint schien ein bisschen komfortabler. Jetzt würde ich empfehlen, den pytest-Schreibstil zu verwenden.


Sie sagen jedoch, dass das pytest (wie alle anderen Abhängigkeiten) in pytest keine sehr kluge Idee ist ...


Wie man Abhängigkeiten verwaltet


Es können nur virtualenv und requirements.txt verwendet werden. Sie können progressiv sein und Gedichte verwenden . Vielleicht werde ich tox verwenden - ein Tool zur Vereinfachung der Automatisierung und des Testens, mit dem ich auch Abhängigkeiten verwalten kann.


Ich erstelle eine einfache tox.ini-Konfiguration und installiere pytest :


 [tox] envlist = py37 ;     ,   python3.7 [testenv] ;     deps =  `deps`  ,   . -r requirements.txt ;     -r requirements-test.txt ; commands = pytest ;   

Anfangs habe ich die Abhängigkeiten explizit angegeben, aber die Praxis der Integration mit Diensten von Drittanbietern hat gezeigt, dass es immer noch am besten ist, die Abhängigkeiten in der Datei requirements.txt speichern.


Es entsteht ein sehr subtiler Moment. Fix die aktuelle Version zum Zeitpunkt der Entwicklung oder immer die neueste?


Wenn Sie ein Commit durchführen, kann es während der Installation zu Konflikten zwischen Paketen kommen, da unterschiedliche Versionen der Abhängigkeiten verwendet werden. Wenn Sie kein Commit ausführen, funktioniert das Paket möglicherweise plötzlich nicht mehr. Die letztere Situation ist für die Endprodukte sehr unangenehm, wenn alle Builds in einer Nacht aufgrund einer geringfügigen Aktualisierung der impliziten Abhängigkeit rot werden können. Und laut Murphys Gesetz wird dies am Veröffentlichungstag geschehen.


Deshalb habe ich für mich eine Regel entwickelt:


  1. Korrigieren Sie immer die Version für die Endprodukte, da die Verantwortung für die zu verwendenden Versionen liegt.
  2. Korrigieren Sie nicht die für installierte Pakete verwendete Version. Oder beschränken Sie es auf einen Bereich, wenn die Paketfunktionalität dies erfordert.

Was weiter?


Ich schreibe Tests!


Ich fülle den Funktionsumfang aus, füge Kommentare hinzu und lasse die Tests korrekt laufen.
An diesem Punkt hören die meisten Entwickler normalerweise auf (ich glaube immer noch, dass jeder Tests schreibt =), veröffentlichen das Paket und hacken Bugs. Aber ich gehe weiter und in das Kaninchenloch springen .


Wie arbeite ich mit verschiedenen Versionen von Python?


In der tox Konfiguration spezifiziere tox den Start von Tests für alle interessanten Versionen von Python:


 [tox] envlist = py{27,35,36,37,38} 

Mit pyenv liefere ich mir die erforderlichen Versionen vor Ort, damit tox sie finden und Testumgebungen erstellen kann.


Wo sind die geschätzten 100%?


Ich füge ein Maß für die Abdeckung des Codes hinzu - dafür gibt es ein hervorragendes Abdeckungspaket und nicht weniger eine hervorragende Integration mit pytest - pytest-cov .
requirements-test.txt sieht jetzt so aus:


 six=1.13.0 pytest=4.6.7 pytest-cov=2.8.1 parameterized=0.7.1 

Gemäß der obigen Regel behebe ich Versionen von Paketen, die zum Ausführen von Tests verwendet werden.


Ich ändere den Testlaufbefehl:


 deps = -r requirements.txt -r requirements-test.txt commands = pytest \ --cov=src/ \ --cov-config="{toxinidir}/tox.ini" \ --cov-append 

Ich sammle Abdeckungsstatistiken für den gesamten Code aus dem Ordner " src/ " - dem Paket selbst ( numeral_system / ) und dem Testcode ( tests / ). Ich möchte nicht, dass die Tests selbst nicht ausführbare Teile enthalten.


--cov-append Befehl --cov-append alle gesammelten Statistiken für jeden Aufruf unter einer anderen Python-Version zu einer zusammen, da die Abdeckung für die zweite und dritte Python-Version unterschiedlich sein kann (hi versionsabhängiger Code und Modul 6 !), Aber insgesamt 100 ergeben % Ein einfaches Beispiel:


 if sys.version_info > (3, 0): # Python 3 code in this block else: # Python 2 code in this block 

Fügen Sie eine neue Umgebung hinzu, um einen Abdeckungsbericht zu erstellen.


 [testenv:coverage_report] deps = coverage commands = coverage html ;   ,   coverage report --include="src/*" --fail-under=100 -m ;    100%  

Und ich füge der Liste der Umgebungen hinzu, nachdem ich Tests für alle Versionen von Python ausgeführt habe.


 [tox] envlist = py{27,35,36,37,38} coverage_report 

Nach dem Ausführen des Befehls tox sollte der Ordner tox , der die Datei index.html mit einem schönen Bericht enthält, im Projektstamm tox .


Für das begehrte Abzeichen integriere ich 100% in den Codecov- Dienst, der selbst bereits in github integriert github und es Ihnen ermöglicht, den Verlauf von Änderungen der Codeabdeckung anzuzeigen. Dazu müssen Sie dort natürlich einen Account anlegen.


Die endgültige Startumgebung sieht wie folgt aus:


 [testenv:coverage_report] deps = coverage==5.0.2 codecov==2.0.15 commands = coverage html coverage report --include="src/*" --fail-under=100 -m coverage xml codecov -f coverage.xml --token=2455dcfa-f9fc-4b3a-b94d-9765afe87f0f ;     codecov,    

Jetzt muss nur noch ein Link zum Badge in README.rst :


 |Code Coverage| .. |Code Coverage| image:: https://codecov.io/gh/zifter/numeral-system-py/branch/master/graph/badge.svg :target: https://codecov.io/gh/zifter/numeral-system-py 

Wie formatiere und analysiere ich Code?


Viele Analysegeräte existieren nicht, da sie sich größtenteils ergänzen. Daher werde ich gängige statische Analysegeräte einbinden , die die Einhaltung von PEP8 überprüfen , mögliche Probleme finden und behebe alle Fehler Formatieren Sie den Code einheitlich.


Sie sollten sofort überlegen, wo Sie die Parameter für die Feinabstimmung der Analysegeräte festlegen müssen. Zu diesem tox.ini können Sie die Datei tox.ini , setup.cfg , eine einzelne benutzerdefinierte Datei oder bestimmte Dateien für Analysegeräte verwenden. Ich habe mich für die tox.ini Verwendung von tox.ini entschieden, da Sie tox.ini für zukünftige Projekte kopieren können.


isort


isort ist ein Dienstprogramm zum Formatieren von Importen.


Ich erstelle die folgende Umgebung, um isort im Code-Format-Modus auszuführen.


 [testenv:isort] changedir = {toxinidir}/src deps = isort==4.3.21 commands = isort -y -sp={toxinidir}/tox.ini 

Leider kann isort keinen Ordner zum Formatieren angeben. Daher müssen Sie das Startverzeichnis über changedir und den Pfad zur Datei mit den Einstellungen -sp={toxinidir}/tox.ini . Der Schalter -y wird benötigt, um den interaktiven Modus zu deaktivieren.


Für die Ausführung von Tests benötigen Sie einen Überprüfungsmodus - hierfür gibt es ein --check-only Flag:


 [testenv:isort-check] changedir = {toxinidir}/src deps = isort==4.3.21 commands = isort --check-only -sp={toxinidir}/tox.ini 

schwarz


Als nächstes integriere ich mit dem schwarzen Code-Formatierer. Ich mache es analog zu isort :


 [testenv:black] deps = black==19.10b0 commands = black src/ [testenv:black-check] deps = black==19.10b0 commands = black --check src/ 

Alles funktioniert gut, aber es gibt einen Konflikt mit isort - es gibt einen Unterschied in der Formatierung von Importen .


In einem der Kommentare habe ich eine minimal kompatible isort Einstellung gefunden, die ich verwendet habe:


 [isort] multi_line_output=3 include_trailing_comma=True force_grid_wrap=0 use_parentheses=True line_length=88 

flake8


Als nächstes integriere ich mit Flake8 statischen Analysatoren.


 [testenv:flake8-check] deps = flake8==3.7.9 commands = flake8 --config=tox.ini src/ 

Es gibt wieder Probleme bei der Integration mit black . Wir müssen eine Feinabstimmung hinzufügen, die in der Tat von black selbst empfohlen wird:


 [flake8] max-line-length=88 ignore=E203 

Leider hat es beim ersten Mal nicht funktioniert. Fiel mit Fehler E231 missing whitespace after ',' , musste ich diesen Fehler hinzufügen, um zu ignorieren:


 [flake8] max-line-length=88 ignore=E203,E231 

Pylint


Integration mit statischen Code- Analysatoren von Pylint


 [testenv:pylint-check] deps = {[testenv]deps} # pylint  ,     pylint==2.4.4 commands = pylint --rcfile=tox.ini src/ 

Ich stoße sofort auf merkwürdige Einschränkungen - Funktionsnamen mit 30 Zeichen (ja, ich schreibe sehr lange Namen von Testmethoden) und Warnungen für das Vorhandensein von TODO im Code.
Ich muss ein paar Ausnahmen hinzufügen:


 [MESSAGES CONTROL] disable=fixme,invalid-name 

Der unangenehme Moment ist auch, dass pylint Entwickler pylint bereits vergraben python2.7 und kein Paket mehr dafür entwickeln. Daher sollten die Prüfungen für das aktuelle Paket für python3.7 .
Fügen Sie der Konfiguration die entsprechende Zeile hinzu:


 [tox] envlist = isort-check black-check flake8-check pylint-check py{27,35,36,37,38} coverage_report basepython = python3.7 

Dies ist auch wichtig, um Tests auf verschiedenen Plattformen auszuführen, da die Standardversion von Python in CI-Systemen unterschiedlich ist.


Was ist los mit CI?


Förderer


Integration mit Appveyor - CI für Windows. Die anfängliche Einrichtung ist einfach - alles kann über die Benutzeroberfläche erfolgen. Laden Sie dann die yaml-Datei herunter und übertragen Sie sie in das Repository.


 version: 0.0.{build} install: - cmd: >- C:\\Python37\\python -m pip install --upgrade pip C:\\Python37\\pip install tox build: off test_script: - cmd: C:\\Python37\\tox 

Hier python3.7 ich explizit die Version von python3.7 , da python2.7 verwendet wird (und tox auch diese Version, obwohl ich python3.7 explizit angegeben python3.7 ).
Der Link zum Badge wird wie gewohnt zu README.rst hinzugefügt


 |Build status Appveyor| .. |Build status Appveyor| image:: https://ci.appveyor.com/api/projects/status/github/zifter/numeral-system-py?branch=master&svg=true :target: https://ci.appveyor.com/project/zifter/numeral-system-py 

Travis ci


Danach integriere ich mit Travis CI - CI unter Linux (und unter MacOS mit Windows, aber Python builds are not available on the macOS and Windows environments unter MacOS Python builds are not available on the macOS and Windows environments . Das Setup ist etwas komplizierter, da die Konfigurationsdatei direkt aus dem Repository verwendet wird. Einige Test- und Fehleriterationen - die konfiguration ist fertig, ich quetsche ein schönes commit ein und die zusammenführungsanforderung ist fertig.


 language: python python: 3.8 # dist: xenial # required for Python 3.7 (travis-ci/travis-ci#9069) sudo: required # required for Python 3.7 (travis-ci/travis-ci#9069) addons: apt: sources: - deadsnakes packages: - python3.5 - python3.6 - python3.7 - pypy install: - pip install tox script: - tox 

( Rhetorische Frage: Und warum mögen CI-Projekte das Yaml-Format so sehr? )


Ich python3.8 die Version von python3.8 , da diese über das addon nicht korrekt funktioniert hat und Travis CI erfolgreich virtualenv aus der angegebenen Version erstellt.


Personen, die mit Travis CI vertraut sind, werden sich fragen, warum sie nicht ausdrücklich Python-Versionen auf diese Weise angeben sollten. Schließlich erstellt Travis CI automatisch virtualenv und führt die erforderlichen Befehle darin aus.


Der Grund dafür ist, dass wir Codeabdeckungsdaten aus allen Versionen erfassen müssen. Die Tests werden jedoch in verschiedenen Jobs gleichzeitig ausgeführt, weshalb es nicht möglich ist, einen allgemeinen Abdeckungsbericht zu erstellen.


Natürlich bin ich mir sicher, dass etwas mehr Verständnis und dies behoben werden kann.


Traditionell wird README.rst auch ein Link zu einem Abzeichen hinzugefügt


 |Build Status Travis CI| .. |Build Status Travis CI| image:: https://travis-ci.org/zifter/numeral-system-py.svg?branch=master :target: https://travis-ci.org/zifter/numeral-system-py 

Die Dokumentation


Ich denke, jeder Python-Entwickler hat den Service mindestens einmal genutzt - readthedocs.org . Es scheint mir, dass dies der beste Service für das Hosting seiner Dokumentation ist.
Ich werde das Standardwerkzeug zum Generieren der Sphinx- Dokumentation verwenden. Ich folge den Schritten aus dem Starthandbuch und erhalte die folgende Struktur:


 src/ docs/ build/ #      html  source/ #     _static/ #   , ,  _templates/ #     conf.py #    index.rst #    make.bat Makefile # make     make 

Als Nächstes müssen Sie die Mindestschritte ausführen, um Folgendes zu konfigurieren:


  1. github schlägt standardmäßig vor, eine README.md Datei im Markdown- Format zu erstellen, wenn es standardmäßig als sphinx Verwendung von ReStructuredText vorschlägt .

Daher musste ich es im .rst Format umschreiben. Und wenn ich das Starthandbuch mindestens einmal bis zum Ende durchgelesen hätte, hätte ich gemerkt, dass sphinx das in Markdown kann .
Ich index.rst README.rst Datei in index.rst


 .. include:: ../../README.rst 

  1. Um die Dokumentation automatisch aus den Kommentaren in der Quelle zu generieren, füge ich die Erweiterung sphinx.ext.autodoc hinzu .
  2. Ich conf.py zu conf.py Dadurch kann sphinx unseren Code zur Analyse importieren.
     import os import sys sys.path.insert(0, os.path.abspath('./../../src')) import numeral_system 
  3. Ich füge den Ordner docs/source/api-docs hinzu und lösche dort die Beschreibungsdatei für jedes Modul. Die Dokumentation sollte automatisch aus Kommentaren generiert werden:
     Roman numeral system ========================= .. automodule:: numeral_system.roman :members: 

Danach ist das Projekt bereit, der Welt seine Beschreibung zu offenbaren. Sie müssen ein Konto erstellen (vorzugsweise über ein Konto bei github ) und Ihr Projekt importieren. Die detaillierten Schritte sind in der Anleitung beschrieben .
Aus Tradition schaffe ich eine Umgebung in tox :


 [testenv:gen_docs] deps = -r docs/requirements.txt commands = sphinx-build -b html docs/source/ docs/build/ 

Ich verwende den sphinx-build explizit anstelle von make , da er unter Windows nicht existiert. Und ich möchte nicht gegen das Prinzip der plattformübergreifenden Entwicklung verstoßen.


Sobald die Änderungen eingefroren sind, readthedocs.org automatisch die Dokumentation und veröffentlicht sie.


Aber ... Build failed . Ich habe die sphinx_rtd_theme sphinx und sphinx_rtd_theme nicht sphinx_rtd_theme , und ich habe erwartet, dass readthedocs.org die aktuellen Versionen übernimmt. Aber das ist nicht so. Ich repariere:


 sphinx==2.3.1 sphinx_rtd_theme==0.4.3 

Und ich erstelle eine spezielle Konfigurationsdatei .readthedocs.yml für readthedocs.org , in der ich die Umgebung zum Starten des readthedocs.org beschreibe:


 python: version: 3.7 install: - requirements: docs/requirements.txt - requirements: requirements.txt 

Hier hat sich als nützlich erwiesen, dass sich die Abhängigkeiten in den requirements.txt Dateien befinden. Ich warte auf den Build und die Dokumentation wird verfügbar .


Fügen Sie das Abzeichen erneut hinzu:


 |Docs| .. |Docs| image:: https://readthedocs.org/projects/numeral-system-py/badge/?version=latest&style=flat :target: https://numeral-system-py.readthedocs.io/en/latest/ 

Lizenzierung


Es lohnt sich, eine Lizenz für das Paket zu wählen.
Dies ist ein sehr umfangreiches Thema, daher habe ich diesen Artikel gelesen. Grundsätzlich besteht die Wahl zwischen MIT und Apache 2.0 . Ich mochte die Phrase, die erfolgreich aus dem Kontext genommen wurde:


 MIT       

Ich stimme vollkommen zu, ich werde das tun. Wenn sich die Pläne ändern, können Sie die Lizenz leicht ändern (obwohl frühere Versionen unter der alten Version sein werden).


Fügen Sie erneut ein Abzeichen hinzu Abzeichen Gott :


 |License| .. |License| image:: https://img.shields.io/badge/License-MIT-yellow.svg :target: https://opensource.org/licenses/MIT 

Hier finden Sie Ausweise für alle Lizenzen.


Wie lade ich auf pypi hoch?


Zuerst musst du ein Konto auf pypi.org erstellen . Fahren Sie dann mit der Vorbereitung des Pakets fort.


Ich erstelle setup.cfg


Es ist erforderlich, die Konfiguration für die Installation / Erstellung des Pakets korrekt zu beschreiben. Ich habe die Anweisungen befolgt. Es ist möglich, Daten über setup.py , es gibt jedoch keine Optionen zum setup.py einiger Parameter. Verwenden Sie daher die Datei setup.cfg , in der Sie alle Nuancen angeben können. Es wurde eine kleine Vorlage zum Füllen dieser Datei gefunden. Aus diesem Grund verwende ich sowohl diese als auch diese Datei - es ist praktischer.


Diese Datei kann auch zum Konfigurieren von pylint , flake8 und anderen Einstellungen verwendet werden, was ich jedoch nicht getan habe.


Wie baue ich ein Paket zusammen?


Wieder schreibe ich eine Umgebung, die mir hilft, das notwendige Paket zusammenzustellen:


 [testenv:build_wheel] skip_install = True deps = ;     wheel docutils pygments commands = python -c 'import shutil; (shutil.rmtree(p, ignore_errors=True) for p in ["build", "dist"]);' python setup.py sdist bdist_wheel 

Warum lösche ich Ordner mit Python? Ich möchte die Anforderungen für die plattformübergreifende Entwicklung erfüllen. Unter Windows und Unix gibt es keine bequeme Möglichkeit, dies zu tun.


Ich starte die Testumgebung:


 tox -e build_wheel 

Als Ergebnis erhalte ich im dist Ordner:


 dist/ numeral-system_py-0.1.0.tar.gz numeral_system-py-0.1.0-py2.py3-none-any.whl 

Ich fülle aus!


Nicht wirklich.


Zunächst sollten Sie überprüfen, ob das Paket ordnungsgemäß funktioniert. Ich werde es in das Testpaket-Repository hochladen. Sie müssen daher ein anderes Konto erstellen, das sich jedoch bereits auf test.pypi.org befindet .


Ich benutze dafür das Bindfadenpaket - ein Werkzeug zum Auffüllen von Artefakten in PyPi.


 [testenv:test_upload] skip_install = True deps = twine ;    commands = python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* 

Ursprünglich hieß das Projekt numsys , aber als ich versuchte, es zu füllen, stieß ich auf die Tatsache, dass es bereits ein Paket mit demselben Namen gibt! Und was ist am ärgerlichsten - er weiß auch, wie man in römische Ziffern konvertiert :) Er war nicht sehr verärgert und wurde in numeral-system-py .


Jetzt müssen Sie das Paket aus der Testumgebung installieren. Die Validierung sollte auch automatisiert werden:


 [testenv:test_venv] skip_install = True ;         deps = ;   commands = pip install -i https://test.pypi.org/simple/ numeral-system-py 

Jetzt musst du nur noch laufen:


 tox -e test_venv ... test_venv: commands_succeeded congratulations :) 

Es scheint zu funktionieren :)


Jetzt auf jeden Fall gießen!


Ja


Ich erstelle eine Umgebung zum Hochladen in das Produktions-Repository.


 [testenv:pypi_upload] skip_install = True deps = twine commands = python -m twine upload dist/* 

Und die Umgebung für die Produktionsüberprüfung.


 [testenv:pypi_venv] skip_install = True deps = ;    commands = pip install numeral-system-py 

Funktioniert alles


Ich überprüfe mit einfachen Befehlen:


 > virtualenv venv > source venv/bin/activate (venv) > pip install numeral-system-py (venv) > python >>> import numeral_system >>> numeral_system.roman.encode(7) 'VII' 

Alles in Ordnung ist!


Ich schneide das Release auf Github , sammle das Paket und fülle es in die Propi Pypi.


Bemerkungen


Abhängigkeitsaktualisierungen


Während der Vorbereitung dieses Artikels wurde eine neue Version von pytest veröffentlicht, in der tatsächlich die Unterstützung für Python 3.4 eingestellt wurde ( tatsächlich im colorama- Paket enthalten). Es gab zwei Möglichkeiten:


  1. Commit colorama version kompatibel mit 3.4;
  2. Drop Unterstützung 3.4 :)

Das letzte Argument für die zweite Option war, dass pip die Unterstützung 3.4 in Version 19.1 eingestellt hat.


Es gibt auch feste Abhängigkeiten in Form von Analysatoren, Formatierern und anderen Diensten. Diese Abhängigkeiten können gleichzeitig aktualisiert werden. Wenn Sie Glück haben, steigen Sie nur mit der Upgrade-Version aus, wenn nicht, müssen Sie den Code korrigieren oder sogar die Einstellungen hinzufügen.


TravisCI


Unterstützt kein Python für MacOS und Windows. Es gibt Schwierigkeiten bei der Ausführung von tox für alle Versionen von Python innerhalb eines Jobs.


Paketversion


Die semantische Versionierung muss eingehalten werden , und zwar das Format:


 MAJOR.MINOR.PATCH 

Vervielfältigung von Metainformationen


Die Version des Pakets und einige andere Parameter müssen angegeben werden, um das Paket (in setup.cfg oder setup.py ) und in der Dokumentation zu installieren. Um eine numeral_system/__init__.py zu vermeiden, gab er nur im Paket numeral_system/__init__.py :


 __version__ = '0.2.0' 

Und dann setup.py in setup.py explizit diese Variable


 setup(version=numeral_system.__version__) 

Gleiches gilt für docs/source/conf.py


 release = numeral_system.__version__ 

Das Obige gilt für alle Metainformationen - REAMDE.rst , Projektbeschreibungen, Lizenzen, Autorennamen und mehr.


Dies führt zwar dazu, dass die Verpackung zum Zeitpunkt der Montage importiert wird, was möglicherweise unerwünscht ist.


Abhängigkeitsduplizierung


Am Anfang war ich verwirrt von der Tatsache, dass ich Abhängigkeiten für das Paket in requirements.txt und setup.cfg .
, — setup.cfg .
. , requirements-dev.txt .



, src/ . :


  • ;
  • , , ;

:


  • PyCharm ( ?) — src , .


— .
, :


 Add badge with supported version Support for py38 

:


 Try fix py38 env creating Try fix py38 env creating Try fix py38 env creating Fix check 

, 3 ! Travis CI.


, . — , .


, . CHANGELOG .



, Markdown . , rst .


Abzeichen


— , , , . , .
coverage .


-


, , , . six , , type hint , asyncio — .
python2.7 , . , python3.5+, . , , CI . .


?


, :



Fazit


open source , .
, python github , .
stackoverflow.com issues github .
. . ?..


, , .
, .


github .


Vielen Dank!

Source: https://habr.com/ru/post/de483512/


All Articles