diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..e25d314 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,22 @@ +name: Lint + +on: [push, pull_request, workflow_dispatch] + +permissions: {} + +env: + FORCE_COLOR: 1 + RUFF_OUTPUT_FORMAT: github + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + - uses: tox-dev/action-pre-commit-uv@v1 diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml new file mode 100644 index 0000000..9e7403a --- /dev/null +++ b/.github/workflows/publish-docker.yml @@ -0,0 +1,69 @@ +name: Publish +on: + push: + branches: + - 'main' +permissions: + contents: write + packages: write +jobs: + release-to-ghcr: + concurrency: + group: release-to-ghcr + cancel-in-progress: false + runs-on: ${{ matrix.config.os }} + strategy: + matrix: + config: + - { os: ubuntu-24.04, arch: amd64 } + - { os: ubuntu-24.04-arm, arch: arm64 } + steps: + # Checkout push-to-registry action github repository + - name: Checkout Push to Registry action + uses: actions/checkout@v4 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login To GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + file: Dockerfile.deploy + push: true + tags: | + ghcr.io/python/planetpython:${{ github.sha }}-${{ matrix.config.arch }} + ghcr.io/python/planetpython:latest-${{ matrix.config.arch }} + + create-manifests: + runs-on: ubuntu-24.04-arm + needs: [release-to-ghcr] + + steps: + - name: Checkout Push to Registry action + uses: actions/checkout@v4 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login To GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Create SHA image and push + run: | + docker buildx imagetools create \ + --tag ghcr.io/python/planetpython:${{ github.sha }} \ + ghcr.io/python/planetpython:${{ github.sha }}-amd64 \ + ghcr.io/python/planetpython:${{ github.sha }}-arm64 + + - name: Create latest manifest and push + run: | + docker buildx imagetools create \ + --tag ghcr.io/python/planetpython:latest \ + ghcr.io/python/planetpython:latest-amd64 \ + ghcr.io/python/planetpython:latest-arm64 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..bf03426 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: local + hooks: + - id: sort-ini + name: Sort config.ini + entry: python3 config/sort-ini.py config/config.ini + language: python + pass_filenames: false + files: ^config/config.ini$ diff --git a/Dockerfile.deploy b/Dockerfile.deploy new file mode 100644 index 0000000..e6ca0bb --- /dev/null +++ b/Dockerfile.deploy @@ -0,0 +1,13 @@ +FROM python:2.7.18 + +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 + +RUN mkdir /planet +WORKDIR /planet + +COPY code /planet/code +COPY config /planet/config +COPY static /planet/static + + diff --git a/config/config.ini b/config/config.ini index 9e2bd6c..26c0772 100644 --- a/config/config.ini +++ b/config/config.ini @@ -36,6 +36,9 @@ name = Abu Ashraf Masnun [http://techarttiki.blogspot.com/feeds/posts/default/-/python] name = Adam Pletcher +[https://blog.adarshd.dev/feed.xml] +name = Adrarsh Divakaran + [http://agendaless.com/blog/index.atom?category=python] name = Agendaless Consulting @@ -69,7 +72,7 @@ name = Alexey Evseev [http://akaptur.github.io/blog/categories/python/atom.xml] name = Allison Kaptur -[http://blog.amjith.com/posts.atom?tag=python] +[https://amjith.com/tags/python/index.xml] name = Amjith Ramanujam [http://blog.amvtek.com/feeds/tags/python.atom.xml] @@ -111,9 +114,15 @@ name = Anton Belyaev [http://bobrochel.blogspot.com/feeds/posts/default/-/python] name = Anton Bobrov +[https://antocuni.eu/feed_rss_updated.xml] +name = Antonio Cuni + [https://anweshadas.in/tag/python/rss/] name = Anwesha Das +[https://arilamstein.com/tag/Python/feed/] +name = Ari Lamstein + [http://lucumr.pocoo.org/feed.atom] name = Armin Ronacher @@ -195,6 +204,9 @@ name = Brian Okken [http://nicoddemus.github.io/tag/python/atom.xml] name = Bruno Oliveira +[https://www.codingthepast.com/feed_python_planet.xml] +name = Bruno Ponne / Coding The Past + [http://brunorocha.org/tag/pythonplanet.atom] name = Bruno Rocha @@ -240,7 +252,7 @@ name = Chris Mitchell [http://pbpython.com/feeds/all.atom.xml] name = Chris Moffitt -[http://ideas.offby1.net/feeds/tag-python.atom.xml] +[http://offby1.website/feeds/tag-python.atom.xml] name = Chris Rose [http://feeds.feedburner.com/ChrisWarrickPython] @@ -249,9 +261,15 @@ name = Chris Warrick [http://lipyrary.blogspot.com/feeds/posts/default] name = Christian Heimes +[https://dev.to/feed/ldrscke.rss] +name = Christian Ledermann + [http://feeds.feedburner.com/mrtopf-python] name = Christian Scholz +[https://bugfactory.io/articles-on-python/feed.xml] +name = Christoph Schiessl + [https://cito.github.io/tags/python/index.xml] name = Christoph Zwerschke @@ -261,9 +279,6 @@ name = CodeGrades [http://codesnipers.com/?q=taxonomy/term/16/0/feed] name = CodeSnipers -[https://www.codementor.io/community/topic/python/feed] -name = Codementor - [https://coderslegacy.com/category/python/feed/] name = CodersLegacy @@ -315,7 +330,7 @@ name = Daniel Bader [http://danielnouri.org/notes/category/python/feed/index.xml] name = Daniel Nouri -[https://daniel.roygreenfeld.com/feeds/python.atom.xml] +[https://daniel.feldroy.com/feeds/python.atom.xml] name = Daniel Roy Greenfeld [http://www.datacommunitydc.org/blog?format=RSS&tag=python] @@ -324,6 +339,9 @@ name = Data Community DC [https://www.dataschool.io/tag/python/rss/] name = Data School +[https://www.datawars.io/articles/rss.xml] +name = DataWars.io + [http://dabeaz.blogspot.com/feeds/posts/default] name = Dave Beazley @@ -372,7 +390,7 @@ name = Djangostars [http://doingmathwithpython.github.io/feeds/all.atom.xml] name = Doing Math with Python -[http://feeds.doughellmann.com/doughellmann/python] +[https://feeds.feedburner.com/doughellmann/python] name = Doug Hellmann [http://www.dougalmatthews.com/feeds/python.atom.xml] @@ -423,6 +441,9 @@ name = Filip Wasilewski [http://blog.filipesaraiva.info/?feed=rss2&tag=planet-python] name = Filipe Saraiva +[https://first.institute/en/rss/python/] +name = First Institute of Reliable Software + [http://pyinsci.blogspot.com/feeds/posts/default] name = Flavio Coelho @@ -483,7 +504,7 @@ name = Godson Gera [http://www.curiousvenn.com/?feed=rss2&cat=4] name = Graeme Cross -[http://blog.dscpl.com.au/feeds/posts/default] +[https://grahamdumpleton.me/feed.xml] name = Graham Dumpleton [https://www.grahamwheeler.com/categories/python.xml] @@ -501,7 +522,7 @@ name = Greg Taylor [http://agiletesting.blogspot.com/feeds/posts/default/-/python] name = Grig Gheorghiu -[http://blog.fizyk.net.pl/tags/python.xml] +[https://fizyk.dev/tags/python.xml] name = Grzegorz Śliwiński [http://neopythonic.blogspot.com/feeds/posts/default] @@ -528,6 +549,12 @@ name = Holger Krekel [http://www.holger-peters.de/feeds/python.atom.xml] name = Holger Peters +[https://blog.holoviz.org/index.xml] +name = HoloViz + +[https://hugovk.dev/tags/python/index.xml] +name = Hugo van Kemenade + [https://humberto.io/tags/python/index.xml] name = Humberto Rocha @@ -687,6 +714,9 @@ name = Kay Schluehr [http://kbyanc.blogspot.com/feeds/posts/default/-/python] name = Kelly Yancey +[https://www.loopwerk.io/articles/tag/python/feed.xml] +name = Kevin Renskers + [https://kodnito.com/python/rss/] name = Kodnito @@ -780,12 +810,15 @@ name = Malthe Borch [https://www.marc-richter.info/category/python/planet-python-articles/feed/] name = Marc Richter -[http://www.malemburg.com/rss] +[https://www.malemburg.com/rss] name = Marc-André Lemburg -[http://www.grulic.org.ar/~mdione/glob/tags/python/index.atom] +[http://www.grulic.org.ar/~mdione/glob/categories/python.xml] name = Marcos Dione +[https://mariatta.ca/tags/python/index.xml] +name = Mariatta + [http://mg.pov.lt/blog/index.xml] name = Marius Gedminas @@ -804,9 +837,6 @@ name = Martijn Pieters [https://www.mfitzp.com/feeds/python.tag.atom.xml] name = Martin Fitzpatrick -[https://mathspp.com/blog/pydonts.rss] -name = "Mathspp Pydon'ts" - [http://mysqlmusings.blogspot.se/feeds/posts/default/-/python] name = Mats Kindahl @@ -846,6 +876,9 @@ name = Michael Foord [http://mjtokelly.blogspot.com/feeds/posts/default/-/Python] name = "Michael J.T. O'Kelly" +[https://mkennedy.codes/tags/python/index.xml] +name = "Michael Kennedy's Thoughts on Technology" + [http://micknelson.wordpress.com/category/python/feed/atom/] name = Michael Nelson @@ -969,9 +1002,6 @@ name = Omaha Python Users Group [http://ondrejcertik.blogspot.com/feeds/posts/default/-/python] name = Ondřej Čertík -[https://journal.paoloamoroso.com/tag:Python/feed/] -name = "Paolo Amoroso's Journal" - [https://www.paulox.net/feed/python.xml] name = Paolo Melchiorre @@ -981,9 +1011,15 @@ name = Pathwright [http://weblog.patrice.ch/tags/Python.atom] name = Patrice Neff +[https://wedgworth.dev/tag/python/rss/] +name = Patrick Altman + [http://www.patricksoftwareblog.com/tag/python/feed/] name = Patrick Kennedy +[https://patrickm.de/tag/python/rss/] +name = Patrick Müller + [http://pauleveritt.wordpress.com/feed/atom/] name = Paul Everitt @@ -1071,6 +1107,9 @@ name = PyCoder’s Weekly [http://feeds.feedburner.com/PyCon] name = PyCon +[https://pypodcats.live/episodes/index.xml] +name = PyPodcats + [https://www.pypy.org/rss.xml] name = PyPy @@ -1104,6 +1143,9 @@ name = Python Data [http://www.pythondiary.com/blog.xml] name = Python Diary +[https://python.github.io/editorial-board/index.xml] +name = Python Docs Editorial Board + [http://pythondoeswhat.blogspot.com/feeds/posts/default] name = Python Does What?! @@ -1119,13 +1161,16 @@ name = Python Insider [https://www.pythonmorsels.com/topics/feed/] name = Python Morsels +[https://pythonpeople.fm/rss] +name = Python People + [http://www.pyptug.org/feeds/posts/default/] name = Python Piedmont Triad User Group [https://www.pythonpool.com/feed/] name = Python Pool -[http://pyfound.blogspot.com/atom.xml] +[https://pyfound.blogspot.com/feeds/posts/default] name = Python Software Foundation [https://sweetness.hmmz.org/feeds/python.rss.xml] @@ -1239,6 +1284,9 @@ name = Robin Wilson [http://linil.wordpress.com/feed/atom/] name = Rodrigo Araúj +[https://mathspp.com/blog/tags/python.rss] +name = Rodrigo Girão Serrão + [https://www.rosehosting.com/blog/tag/python/feed/] name = RoseHosting Blog @@ -1287,6 +1335,9 @@ name = Selena Deckelmann [http://feeds.feedburner.com/phoe6pythonfeeds] name = Senthil Kumaran +[https://sethmlarson.dev/feed] +name = Seth Michael Larson + [http://jjinux.blogspot.com/feeds/posts/default/-/python] name = Shannon -jj Behrens @@ -1341,6 +1392,9 @@ name = Stefan Behnel [http://stefan.sofa-rockers.org/feeds/python] name = Stefan Scherfke +[https://stefaniemolin.com/feeds/Python-atom.xml] +name = Stefanie Molin + [http://www.jodal.no/atom-python.xml] name = Stein Magnus Jodal @@ -1368,7 +1422,10 @@ name = Suresh Dasari/Tutlane.com [https://ict.swisscom.ch/feed/?post_type=cubetech_post&cubetech_keyword=Python] name = Swisscom ICT -[http://www.talkpythontome.com/episodes/rss] +[https://talkpython.fm/blog/posts/index.xml] +name = Talk Python Blog + +[https://talkpython.fm/episodes/rss] name = Talk Python to Me [http://blog.tedmiston.com/tag/python/rss] @@ -1416,9 +1473,15 @@ name = The Parcon Blog [https://thepythoncodingbook.com/feed/] name = The Python Coding Blog +[https://www.thepythoncodingstack.com/feed] +name = The Python Coding Stack + [http://pythonpapers.blogspot.com/atom.xml] name = The Python Papers +[https://www.pythonshow.com/feed] +name = The Python Show + [https://threeofwands.com/tag/python/rss/] name = The Three of Wands @@ -1485,6 +1548,9 @@ name = Turnkey Linux [http://feeds.feedburner.com/TwistedMatrixLaboratories] name = Twisted Matrix Labs +[https://typethepipe.com/categories/python/index.xml] +name = TypeThePipe + [http://vsbabu.org/mt/index.rdf] name = V.S. Babu @@ -1548,7 +1614,7 @@ name = Wing Tips [http://wingware.com/news/rss&noheader=1] name = Wingware -[https://wyattbaldwin.com/categories/planet-python/index.xml] +[https://wyattbaldwin.com/categories/planet-python/rss.xml] name = Wyatt Baldwin [http://tech.blog.aknin.name/tag/python/feed/atom/] @@ -1584,7 +1650,7 @@ name = codeboje [https://death.andgravity.com/_feed/index/_tags/python.xml] name = death and gravity -[http://www.egenix.com/company/news/rss2] +[https://www.egenix.com/company/news/rss2] name = eGenix.com [http://hypothesis.works/articles/python/feed/] @@ -1605,6 +1671,9 @@ name = pgcli [https://py.checkio.org/blog/special-rss/] name = py.CheckIO +[https://www.pygame.org/news/feed/atom] +name = pygame + [http://www.pythonwise.blogspot.com/feeds/posts/default/-/python] name = pythonwise @@ -1617,7 +1686,7 @@ name = saaj/recollection [https://blog.scikit-learn.org/feed.xml] name = scikit-learn -[https://testmon.org/feeds/blog.atom.xml] +[https://testmon.org/index.xml] name = testmon [http://tryexceptpass.org/index.xml] diff --git a/config/index.html.tmpl b/config/index.html.tmpl index 965852e..f03ddba 100644 --- a/config/index.html.tmpl +++ b/config/index.html.tmpl @@ -92,7 +92,7 @@ src="/static/images/python-logo.gif" alt="homepage" border="0" />
  • Python Summer of Code
  • Planet Python Francophone
  • Planet Python Argentina
  • -
  • Planet Python Brasil
  • +
  • Planet Python Brasil
  • Planet Python Poland
  • Python Libraries @@ -134,8 +134,8 @@ src="/static/images/python-logo.gif" alt="homepage" border="0" />
  • - To request addition or removal:
    - Open an issue on github
    + To request addition or removal, + open a PR or issue
  • diff --git a/config/sort-ini.py b/config/sort-ini.py index 98976d3..e2db9ff 100755 --- a/config/sort-ini.py +++ b/config/sort-ini.py @@ -1,20 +1,20 @@ #!/usr/bin/env python import sys -import ConfigParser +import configparser if len(sys.argv) > 1: filename = sys.argv[1] else: filename = 'config.ini' -oconfig = ConfigParser.RawConfigParser() +oconfig = configparser.RawConfigParser() oconfig.read(filename) # This part will destroy the configuration if there's a crash while # writing the output. We're in an GIT-controlled directory, so # I didn't care enough to fix this. -with open(filename, 'wb') as fd: +with open(filename, 'w', encoding='utf-8') as fd: # Copy of write() code that sorts output by section if oconfig._defaults: fd.write("[%s]\n" % DEFAULTSECT) diff --git a/config/titles_only.html.tmpl b/config/titles_only.html.tmpl index c44a104..a77474f 100644 --- a/config/titles_only.html.tmpl +++ b/config/titles_only.html.tmpl @@ -78,7 +78,7 @@ src="/static/images/python-logo.gif" alt="homepage" border="0" />
  • Python Summer of Code
  • Planet Python Francophone
  • Planet Python Argentina
  • -
  • Planet Python Brasil
  • +
  • Planet Python Brasil
  • Planet Python Poland
  • Python Libraries @@ -117,8 +117,13 @@ src="/static/images/python-logo.gif" alt="homepage" border="0" />
  • " title="">
  • -
  • To request addition or removal:
    -e-mail planet at python.org (note, responses can take up to a few days)
  • + +
  • + + To request addition or removal, + open a PR or issue + +