diff --git a/.github/workflows/generate_changelog.yml b/.github/workflows/generate_changelog.yml
new file mode 100644
index 00000000..4fd95ac7
--- /dev/null
+++ b/.github/workflows/generate_changelog.yml
@@ -0,0 +1,39 @@
+name: Generate Changelog
+
+on:
+ workflow_dispatch:
+ inputs:
+ release_tag:
+ description: 'Release tag of latest release'
+ required: true
+
+permissions:
+ contents: write
+
+jobs:
+ process-release:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v4
+
+ - name: Install Dependencies
+ run: pip install -r requirements.txt
+
+ - name: Run Script
+ env:
+ RELEASE_TAG: ${{ inputs.release_tag }}
+ GITHUB_PAT: ${{ secrets.SAGE_ACCESS_TOKEN }}
+ run: python scripts/create_changelog.py "$RELEASE_TAG"
+
+ - name: Commit and Push Changes
+ env:
+ RELEASE_TAG: ${{ inputs.release_tag }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ git config --global user.name "github-actions[bot]"
+ git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
+ git add "src/changelogs/sage-${RELEASE_TAG}.txt"
+ git add conf/contributors.xml
+ git commit -m "Added changelog for release ${{ inputs.release_tag }}"
+ git push
diff --git a/conf/contributors.xml b/conf/contributors.xml
index 8e3902e1..747461a4 100644
--- a/conf/contributors.xml
+++ b/conf/contributors.xml
@@ -108,6 +108,15 @@ Please keep the list in alphabetical order by last name!
location="MIT"
url="http://www.joshalman.com/"
trac="jalman"/>
+
@@ -242,9 +251,9 @@ Please keep the list in alphabetical order by last name!
name="Eviatar Bach"
location="University of Maryland, College Park"
description="Combinatorics; bug fixes"
+ url="http://eviatarbach.com/"
trac="eviatarbach"
github="eviatarbach"/>
- url="http://eviatarbach.com/"/>
@@ -370,6 +379,13 @@ Please keep the list in alphabetical order by last name!
+
+ name="Davide Berti"
+ altnames="dberti"
+ location="Cuneo, Italy"
+ work="Istituto Professionale Grandis"
+ description="Italian translation of Developer Guide"
+ url="http://www.matematica-con-sage.it"
+ trac="dberti"
+ github="berdavcn"/>
@@ -498,6 +514,9 @@ Please keep the list in alphabetical order by last name!
trac="boerner"/>
+
@@ -687,6 +706,9 @@ Please keep the list in alphabetical order by last name!
description="combinatorics and representation theory"
trac="bump"
github="dwbump"/>
+
+
+
+
@@ -1146,7 +1177,7 @@ Please keep the list in alphabetical order by last name!
github="thecaligarmo"/>
+
-
@@ -1617,6 +1648,9 @@ Please keep the list in alphabetical order by last name!
name="Elisa Lorenzo Garcia"
location="Universite de Rennes 1, France"
trac="elorenzogarcia"/>
+
@@ -2150,6 +2184,9 @@ Please keep the list in alphabetical order by last name!
name="Daira Hopwood"/>
+
+
+
-
@@ -2392,6 +2432,10 @@ Please keep the list in alphabetical order by last name!
name="Mark Jordan"
location="University of Washington, WA, USA"
trac="mjordan7"/>
+
@@ -2426,10 +2470,6 @@ Please keep the list in alphabetical order by last name!
github="mjungmath"/>
-
@@ -3046,7 +3086,7 @@ Please keep the list in alphabetical order by last name!
github="davidlowryduda"/>
+
+
@@ -3546,7 +3592,7 @@ Please keep the list in alphabetical order by last name!
name="Pablo De Nápoli"
work="University of Buenos Aires"
location="Buenos Aires, Argentina"
- description="bug fixes"
+ description="bug fixes"
github="pdenapo"
gitlab="pdenapo"
trac="pdenapo"/>
@@ -3600,6 +3646,15 @@ Please keep the list in alphabetical order by last name!
+
+
@@ -3755,6 +3813,11 @@ Please keep the list in alphabetical order by last name!
+
+
+
+ github="rosirot"/>
-
-
-
+
-
+
-
+ github="anna-somoza"/>
-
-
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index d67464d1..f5c97e50 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,3 +5,6 @@ autopep8 >= 0.5
pyyaml
six
pybtex
+requests
+python-dotenv
+unidecode
\ No newline at end of file
diff --git a/scripts/create_changelog.py b/scripts/create_changelog.py
new file mode 100644
index 00000000..8cb3b38f
--- /dev/null
+++ b/scripts/create_changelog.py
@@ -0,0 +1,461 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This script is used in 'Generate Changelog' workflow, defined in the 'generate_changelog.yml' file
+to automate the process of creating changelogs after each stable release.
+
+It fetches release data, extracts relevant pull request (PR) information, and generates a detailed changelog
+and add it to src/changelogs.
+The script uses the GitHub REST API to collect information about contributors, PR authors, and reviewers.
+
+Additional Note:
+- The script requires a GitHub personal access token (PAT) stored in an environment variable named `GITHUB_PAT`.
+"""
+
+import requests
+import re
+from dotenv import load_dotenv
+import os
+import argparse
+import xml.etree.ElementTree as ET
+from unidecode import unidecode
+import html
+
+load_dotenv()
+GITHUB_PAT = os.getenv('GITHUB_PAT')
+BASE_URL = r"https://api.github.com/repos/sagemath/sage"
+HEADERS = {'Authorization': f'token {GITHUB_PAT}', }
+AUTOMATED_BOTS = ['dependabot[bot]', 'github-actions', 'renovate[bot]']
+RELEASE_MANAGER = "Volker Braun"
+
+# Maps the github username to contributor name
+git_to_name = {}
+
+# Stores unique names of contributors
+all_contribs = set([])
+
+# Stores unique names of first constributors
+first_contribs = set([])
+
+# Stores information for all the prs across all pre-releases
+# Maps tag of pre-release to its info
+all_info = {}
+
+# Stores new names which didn't previously existed in conf/contributor.xml
+new_names = []
+
+
+def get_last_name(full_name):
+ return full_name.split()[-1]
+
+
+def merge_contributors(original_file, new_contributors):
+ """
+ Merge new contributors into the existing contributors XML file and sort alphabetically by last name.
+
+ Args:
+ original_file (str): Path to the existing contributors XML file.
+ new_contributors (list): A list of tuples, each containing (full_name, github_username)
+ of new contributors to be added.
+
+ Side effects:
+ - Modifies the original XML file in-place
+ """
+ with open(original_file, 'r',encoding='utf-8') as f:
+ original_content = f.read()
+ tree = ET.fromstring(original_content)
+
+ for new_name, github in new_contributors:
+ new_contributor = ET.Element('contributor')
+ new_contributor.set('name', new_name)
+ new_contributor.set('github', github)
+
+ tree.append(new_contributor)
+
+ sorted_contributors = sorted(
+ tree.findall('contributor'),
+ # Items which don't have a name attribute are placed at the end
+ key=lambda x: unidecode(get_last_name(x.get('name', '\x7F'))) # '\x7F' is highest ASCII value
+ )
+
+ for cont in tree.findall('contributor'):
+ tree.remove(cont)
+
+ for cont in sorted_contributors:
+ tree.append(cont)
+
+ xml_lines = [
+ '',
+ '',
+ ''
+ ]
+
+ # Write contributors with precise formatting
+ for contributor in sorted_contributors:
+ contrib_line = ''
+ xml_lines.append(contrib_line)
+ xml_lines.append('')
+
+ with open(original_file, 'w',encoding='utf-8') as f:
+ f.write('\n'.join(xml_lines))
+
+
+def map_git_to_names():
+ """
+ Create a mapping between GitHub usernames and full names from the contributors XML file.
+
+ Side effects:
+ - Populates the global git_to_name dictionary with GitHub username to full name mappings
+ """
+ tree = ET.parse('conf/contributors.xml')
+ root = tree.getroot()
+ for c in root.findall('contributor'):
+ name = c.get('name')
+ git = c.get('github')
+ if git and name:
+ git_to_name[git] = unidecode(name)
+
+
+def fetch_real_name(github_name):
+ """
+ Fetch the full name of a GitHub user via the GitHub API.
+
+ Args:
+ github_name (str): GitHub username to look up.
+
+ Side effects:
+ - Updates the global git_to_name dictionary if a full name is found
+ - Adds the full name and GitHub username to the global new_names list
+ """
+ url = f"https://api.github.com/users/{github_name}"
+ try:
+ res = requests.get(url,headers=HEADERS)
+ res.raise_for_status()
+ user = res.json()
+ if not user['name']:
+ return
+ name_parts = user['name'].split()
+ if len(name_parts) < 2: # Full name is not available
+ return
+ git_to_name[github_name] = user['name']
+ new_names.append((user['name'],github_name))
+ except Exception as e:
+ print(f"Failed to fetch real name for @{github_name} : {str(e)}")
+
+
+def update_names():
+ """
+ Update contributor names by replacing GitHub usernames with real names
+ or formatted usernames (in the form @).
+
+ Side effects:
+ - Attempts to fetch real names for contributors not already in global git_to_name
+ - Modifies global all_contribs and global first_contribs to use real names or formatted usernames
+ - Updates PR information in global all_info with real names or formatted usernames
+ """
+ global all_contribs
+ global first_contribs
+ for c in all_contribs:
+ if c not in git_to_name:
+ fetch_real_name(c)
+ for tag in all_info:
+ for pr in all_info[tag]:
+ pr['creator'] = git_to_name.get(pr['creator'],f"@{pr['creator']}")
+ pr['authors'] = [git_to_name.get(a,f"@{a}") for a in pr['authors']]
+ pr['reviewers'] = [git_to_name.get(r,f"@{r}") for r in pr['reviewers']]
+ all_contribs = set([git_to_name.get(c,f"@{c}") for c in all_contribs])
+ first_contribs = set([git_to_name.get(c,f"@{c}") for c in first_contribs])
+
+
+def get_release_data(tag):
+ """
+ Fetch release data for a specific GitHub tag.
+
+ Args:
+ tag (str): The release tag to fetch data for.
+
+ Returns:
+ dict or None: Release data if found, otherwise None.
+ """
+ url = fr"{BASE_URL}/releases/tags/{tag}"
+ res = requests.get(url, headers=HEADERS)
+ if res.status_code == 404:
+ print(f"{tag} release not found")
+ return None
+ if res.status_code != 200:
+ print(f"Failed to fetch release data: {res.status_code}")
+ return None
+ return res.json()
+
+
+def get_release_date(release_data):
+ """
+ Extract the publication date from release data.
+
+ Args:
+ release_data (dict): Release data from GitHub API.
+
+ Returns:
+ str: Formatted date of release (YYYY-MM-DD) or 'Unavailable' if no date is found.
+ """
+ date_time = release_data.get('published_at', '')
+ if not date_time:
+ return 'Unavailable'
+ return date_time.split('T')[0]
+
+
+def extract_pr_info(release_data):
+ """
+ Extract pull request information from release body text.
+
+ Args:
+ release_data (dict): Release data from GitHub API.
+
+ Returns:
+ list: A list of dictionaries, each containing PR details:
+ - title: PR title
+ - creator: GitHub username of PR creator
+ - pr_id: Pull request Id
+ - authors: List of PR authors
+ - reviewers: List of PR reviewers
+ """
+ body = release_data.get('body', '')
+ pr_info = []
+ pattern = r"\* (.*?) by (@\S+) in https://github.com/sagemath/sage/pull/(\d+)"
+ matches = re.findall(pattern, body)
+ for match in matches:
+ title = match[0]
+ creator = match[1][1::]
+ pr_id = match[2]
+ authors = get_authors(pr_id)
+ reviewers = get_reviewers(pr_id, authors)
+ pr_info.append({
+ 'title': title,
+ 'creator': creator,
+ 'pr_id': pr_id,
+ 'authors': authors,
+ 'reviewers': reviewers
+ })
+ return pr_info
+
+
+def update_first_contribs(release_data):
+ """
+ Update the set of first-time contributors from release body text.
+
+ Args:
+ release_data (dict): Release data from GitHub API.
+
+ Side effects:
+ - Adds newly identified first-time contributors to the global first_contribs set
+ """
+ body = release_data.get('body', '')
+ pattern = r"\* (@\S+) made their first contribution in"
+ matches = re.findall(pattern, body)
+ for match in matches:
+ username = match[1::]
+ first_contribs.add(username)
+
+
+def get_authors(pr_id):
+ """
+ Retrieve the authors of commits for a specific pull request.
+
+ Args:
+ pr_id (str): Pull request ID.
+
+ Returns:
+ list: Unique GitHub usernames of PR commit authors, excluding automated bot accounts.
+
+ Side effects:
+ - Updates the global all_contribs set with discovered authors
+ """
+ url = f"{BASE_URL}/pulls/{pr_id}/commits"
+ authors = []
+ try:
+ res = requests.get(url, headers=HEADERS)
+ res.raise_for_status()
+ commits = res.json()
+ for commit in commits:
+ if commit['commit']['committer']['name'] in AUTOMATED_BOTS:
+ continue
+ if 'author' in commit and 'login' and commit['author']:
+ username = commit['author']['login']
+ if username not in AUTOMATED_BOTS:
+ authors.append(username)
+ all_contribs.add(username)
+ except Exception as e:
+ print(f"Failed to fetch commits for PR {pr_id}: {e}")
+ return list(set(authors))
+
+
+def get_reviewers(pr_id, authors):
+ """
+ Retrieve the reviewers of a specific pull request.
+
+ Args:
+ pr_id (str): Pull request ID.
+ authors (list): List of PR authors to exclude from reviewers.
+
+ Returns:
+ list: Unique GitHub usernames of PR reviewers,
+ excluding PR authors and automated bot accounts.
+
+ Side effects:
+ - Updates the global all_contribs set with discovered reviewers
+ """
+ url = f"{BASE_URL}/pulls/{pr_id}/reviews"
+ reviewers = []
+ try:
+ res = requests.get(url, headers=HEADERS)
+ res.raise_for_status()
+ reviews = res.json()
+ for review in reviews:
+ if 'user' in review and 'login' in review['user']:
+ username = review['user']['login']
+ if username not in authors and username not in AUTOMATED_BOTS:
+ reviewers.append(username)
+ all_contribs.add(username)
+ except Exception as e:
+ print(f"Failed to fetch reviews for PR {pr_id}: {e}")
+ return list(set(reviewers))
+
+
+def get_latest_tags():
+ url = f"{BASE_URL}/tags?per_page=100" # If per_page is not specified then very few tags are fetched
+ try:
+ res = requests.get(url, headers=HEADERS)
+ res.raise_for_status()
+ tags = res.json()
+ tags = [tag['name'] for tag in tags]
+ return tags
+ except Exception as e:
+ print(f"Failed to fetch tags")
+ return None
+
+
+def sort_tags(tag):
+ """
+ Custom sorting key for release tags to prioritize in order: beta, RC, and stable versions.
+
+ Args:
+ tag (str): Tag name to be sorted.
+ """
+ name = tag.lower()
+ if "beta" in name:
+ return (0, name) # Beta comes first
+ elif "rc" in name:
+ return (1, name) # RC comes next
+ else:
+ return (2, name) # Stable versions come last
+
+
+def save_to_file(filename, ver, date_of_release):
+ """
+ Generate and save the changelog to a text file.
+
+ Args:
+ filename (str): Path to the output changelog file.
+ ver (str): Sage version number.
+ date_of_release (str): Date of the release.
+
+ Side effects:
+ - Creates a changelog file with contributor and PR information
+ """
+ with open(filename, 'w') as file:
+ file.write(f"Sage {ver} was released on {date_of_release}. It is available from:\n\n")
+ file.write(f" * https://www.sagemath.org/download-source.html\n\n")
+ file.write(f"Sage (http://www.sagemath.org) is developed by volunteers and combines\n")
+ file.write(f"hundreds of open source packages.\n\n")
+ file.write(f"The following {len(all_contribs)} people contributed to this release. Of those, {len(first_contribs)} made\n")
+ file.write(f"their first contribution to Sage:\n\n")
+ max_name_len = max([len(c) for c in all_contribs])
+ for c in all_contribs:
+ file.write(f" - {c}{' '*(max_name_len - len(c)) + ' [First contribution]' if c in first_contribs else ''}\n")
+ file.write(f"\nRelease manager: {RELEASE_MANAGER}\n")
+ pr_count = sum([len(all_info[tag]) for tag in all_info])
+ file.write(f"\nWe merged {pr_count} pull requests in this release.")
+ sorted_tags = sorted(all_info.keys(), key=sort_tags)
+ for tag in sorted_tags:
+ file.write(f"\n\nMerged in sage-{tag}:\n")
+ for pr in all_info[tag]:
+ file.write(f"\n#{pr['pr_id']}: {', '.join(pr['authors'])}: {pr['title']}")
+ if pr['reviewers']:
+ file.write(f" [Reviewed by {', '.join(pr['reviewers'])}]")
+
+ print(f"Saved changelog to {filename}")
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description="Fetch release data from GitHub and extract PR info")
+ parser.add_argument('version', type=str, help="The release version (e.g., 10.1)")
+ args = parser.parse_args()
+ ver = args.version
+ is_stable = re.match(r'^\d+(\.\d+){0,3}$', ver)
+ if not is_stable:
+ print(f"{ver} is not a stable release. terminating....")
+ exit(1)
+
+ filepath = f"src/changelogs/sage-{ver}.txt"
+ if os.path.exists(filepath):
+ print(f"{filepath} already exists. Exiting without making changes.")
+ exit(1)
+
+ map_git_to_names()
+ all_tags = get_latest_tags()
+ tag_pattern = fr"^{ver}.(beta|rc)\d*$"
+ valid_tags = set([ver,])
+ for tag in all_tags:
+ if re.match(tag_pattern, tag):
+ valid_tags.add(tag)
+
+ for tag in valid_tags:
+ release_data = get_release_data(tag)
+ if tag == ver:
+ if release_data:
+ date_of_release = get_release_date(release_data)
+ else:
+ date_of_release = "N/A"
+ if release_data is None:
+ continue
+ pr_info = extract_pr_info(release_data)
+ all_info[tag] = pr_info
+ update_first_contribs(release_data)
+ print(f"Fetched data for tag: {tag}")
+
+ update_names()
+ first_contribs = first_contribs.intersection(all_contribs)
+ all_contribs = sorted(all_contribs, key=lambda x: (x[0].startswith('@'), x[0]))
+ if all_info:
+ save_to_file(filepath, ver, date_of_release)
+ else:
+ print("No information found.")
+ exit(1)
+
+ if new_names:
+ merge_contributors('conf/contributors.xml',new_names)
+ print("Added new contributors to conf/contributors.xml")
+ else:
+ print("No new contributors found.")
diff --git a/src/changelogs/sage-10.0.txt b/src/changelogs/sage-10.0.txt
new file mode 100644
index 00000000..98b1f8d4
--- /dev/null
+++ b/src/changelogs/sage-10.0.txt
@@ -0,0 +1,375 @@
+Sage 10.0 was released on 2023-05-20. It is available from:
+
+ * https://www.sagemath.org/download-source.html
+
+Sage (http://www.sagemath.org) is developed by volunteers and
+combines hundreds of open source packages.
+
+The following 68 people contributed to this release.
+Of those, 13 made their first contribution to Sage:
+
+ - Antonio Rojas
+ - Andrey Belgorodski
+ - Alex Chandler
+ - Aram Dermenjian
+ - Alex J. Best
+ - Agamdeep Singh [First Contribution]
+ - Alex Hutman [First Contribution]
+ - Aadya Chinubhai [First Contribution]
+ - Andy Howell
+ - Antoine Leudiere
+ - Bryan Gillespie
+ - Darij Grinberg
+ - David Joyner
+ - Daniel Bump
+ - David Lowry-Duda
+ - David Roe
+ - Dima Pasechnik
+ - David Ayotte
+ - David Coudert
+ - Eric Gourgoulhon
+ - Eloi Torrents [First Contribution]
+ - Edgar Costa
+ - Enrique Artal
+ - Frederic Chapoton
+ - Francois Bissey
+ - Gonzalo Tornaria
+ - Isuru Fernando
+ - John Cremona
+ - Jonathan Kliem
+ - John Palmieri
+ - Julian Ruth
+ - Kwankyu Lee
+ - Kevin Dilks
+ - Lorenz Panny
+ - Martin Rubey
+ - Moritz Firsching
+ - Michael Orlitzky
+ - Marie Bonboire [First Contribution]
+ - Matthias Koppe
+ - Max Horn
+ - Mauricio Collares
+ - Marc Mezzarobba
+ - Matan Ziv-Av [First Contribution]
+ - Miguel Marco
+ - Peter Bruin
+ - Priyanshu Kumar Rai [First Contribution]
+ - Rémy Oudompheng
+ - Rohan Garg [First Contribution]
+ - Ralf Hemmecke
+ - Sanjay Rijal [First Contribution]
+ - Sebastien Labbe
+ - Samuel Lelievre
+ - Sebastian Oehms
+ - Tirthankar Mazumder [First Contribution]
+ - Trevor Karn
+ - Travis Scrimshaw
+ - Tobias Diez
+ - Vincent Delecroix
+ - Vincent Neiger
+ - Volker Braun
+ - Xavier Caruso
+ - @Bruno-TT
+ - @mathcals [First Contribution]
+ - @wrongisright
+ - @aritra-bhattacharya-0
+ - @MatteoCati
+ - @minaminao [First Contribution]
+ - @yukibl [First Contribution]
+
+* We merged 292 pull requests in this release.
+
+Merged in sage-10.0:
+
+#34984: Tobias Diez: Fix deployment of docs to netlify [Reviewed by Matthias Koppe]
+#35109: Tobias Diez: Fix W391 linter issues [Reviewed by Frederic Chapoton, Matthias Koppe]
+#35126: Matthias Koppe: `tox.ini` (fedora-33): Do not set `IGNORE_MISSING_SYSTEM_PACKAGES=no`
+#35058: Gonzalo Tornaria: Mark unstable tests in `klyachko.py` due to #32773 [Reviewed by Matthias Koppe]
+#35125: Matthias Koppe: ci-linux: Remove unmaintained local-conda runs [Reviewed by Tobias Diez]
+#35052: Matthias Koppe: Fix Cygwin CI after #32841 [Reviewed by David Roe]
+#35072: Tobias Diez: Add default devcontainer using conda [Reviewed by Matthias Koppe]
+#34960: Kwankyu Lee: Improve camera positioning for threejs [Reviewed by Dima Pasechnik]
+#34967: Tobias Diez, Lorenz Panny: Show explicit formulas in documentation of `WeierstrassIsomorphism` [Reviewed by Kwankyu Lee]
+#34968: Lorenz Panny: Compute matrix kernels modulo composites [Reviewed by Travis Scrimshaw]
+#34972: Rohan Garg: Cross-link matrix methods `image` and `column_space` [Reviewed by Marc Mezzarobba]
+#34974: Rohan Garg: `SignedPermutation` should allow iterables as input [Reviewed by Travis Scrimshaw]
+#34982: Lorenz Panny: Add `.torsion_basis()` method to `EllipticCurve_finite_field` [Reviewed by David Roe]
+#34986: @MatteoCati: Add construction of strongly regular digraph [Reviewed by David Coudert]
+#35015: David Roe: Trac role to GitHub [Reviewed by Kwankyu Lee, Matthias Koppe]
+#34963: Marc Mezzarobba: Add doctest for #20847 [Reviewed by Lorenz Panny]
+#34981: John Cremona, Lorenz Panny: Add `.twists()` to `EllipticCurve_finite_field`
+#34985: @MatteoCati, Dima Pasechnik: Add new skew Hadamard matrices
+#34994: Gonzalo Tornaria: Fix doctests to support numpy 1.24 [Reviewed by Volker Braun, Matthias Koppe]
+#34997: Gonzalo Tornaria: Fix bug due to UB in conversion from python `int` to `ZZ` (python 3.11, 32 bit, gcc12) [Reviewed by Matthias Koppe]
+#34999: Tobias Diez: Enable dependabot for github action updates [Reviewed by Matthias Koppe]
+#35001: Marc Mezzarobba: Add doctest for #20846 [Reviewed by Frederic Chapoton]
+#35003: Marc Mezzarobba: Add doctest for #16031 [Reviewed by Lorenz Panny]
+#35004: David Ayotte, Dima Pasechnik: Speed up some methods for quasimodular forms ring elements [Reviewed by Travis Scrimshaw]
+#35007: Frederic Chapoton, Dima Pasechnik: Fix some "cannot" [Reviewed by Matthias Koppe]
+#35010: Marc Mezzarobba: Add doctest for #13569 [Reviewed by Frederic Chapoton, Edgar Costa, David Roe]
+#35012: Alex Chandler, Matthias Koppe: `sage.{categories,matrix,structure}`: Replace imports from `sage.*.all` for namespace packages [Reviewed by Tobias Diez]
+#35019: Lorenz Panny: Add `limit=` argument to `Integer.prime_divisors()` [Reviewed by Edgar Costa]
+#34966: Lorenz Panny: Use NTL's `MinPolyMod()` for more rings [Reviewed by Marc Mezzarobba]
+#34961: Marc Mezzarobba: `qqbar.clear_denominators`: crude but fast alternative algorithm [Reviewed by Vincent Delecroix]
+#34995: Gonzalo Tornaria: Support for tachyon >= 0.99.2 [Reviewed by Mauricio Collares, Matthias Koppe]
+#35021: Samuel Lelievre, @aritra-bhattacharya-0, Bryan Gillespie, Frederic Chapoton, Dima Pasechnik: Implement check for Lorentzian polynomials #28252 [Reviewed by Travis Scrimshaw]
+#35023: David Roe: Remove upstream urls from `checksums.ini` that point to trac [Reviewed by Dima Pasechnik]
+#35024: Alex J. Best: Fix usage of `verbose` with positional argument [Reviewed by Frederic Chapoton]
+#35025: David Ayotte: Implement `__getitem__` and alias weight methods for quasimodular forms
+#35027: Alex J. Best: gitignore another (temporary) autoconf file [Reviewed by David Roe]
+#35033: Alex Chandler, Matthias Koppe: `sage.schemes`: Replace imports from `sage.*.all` for namespace packages [Reviewed by Lorenz Panny]
+#35035: Lorenz Panny: Make `_multiple_x_*()` methods work for all n≠0 [Reviewed by John Cremona]
+#35040: Eric Gourgoulhon: Document argument `is_open` in `ManifoldSubset.complement` and `difference` [Reviewed by Tobias Diez, Matthias Koppe]
+#35059: @MatteoCati, Dima Pasechnik: Add Hadamard matrices up to order 1000 [Reviewed by David Joyner]
+#35060: Martin Rubey: A bijectionist's toolkit [Reviewed by Travis Scrimshaw, Matthias Koppe]
+#35063: Sebastian Oehms: Add notes about recent changes on `KnotInfo` [Reviewed by Matthias Koppe]
+#35064: Frederic Chapoton: Removing some unused imports [Reviewed by Travis Scrimshaw]
+#35067: Alex J. Best: Upgrade eclib to 20221012 [Reviewed by Francois Bissey, Dima Pasechnik]
+#35069: Alex J. Best: Conform to doc requirements so that the docs look more beautiful [Reviewed by Frederic Chapoton, Travis Scrimshaw]
+#35070: Sanjay Rijal, Matthias Koppe: Document sage installation method with pip [Reviewed by Alex J. Best]
+#35073: Jonathan Kliem: Combinatorial polyhedron: move list of pairs to dedicated class [Reviewed by Travis Scrimshaw, Matthias Koppe]
+#35076: Matthias Koppe: Add ABCs `CommutativePolynomial`, `MPolynomial_libsingular`, `InfinitePolynomial`; deprecate `is_Polynomial`, `is_MPolynomial` [Reviewed by Dima Pasechnik, Travis Scrimshaw]
+#35079: Matthias Koppe: Remove 'docker' from the names of the Docker images published on ghcr.io [Reviewed by Dima Pasechnik, Tobias Diez]
+#34970: Rohan Garg, Dima Pasechnik, Tobias Diez: Add `is_supergreedy()` to linear extensions [Reviewed by Martin Rubey]
+#34979: Lorenz Panny: Deprecate constructing number-field fractional ideals via orders' `.ideal()` method [Reviewed by Peter Bruin]
+#34980: Gonzalo Tornaria: `is_prime` for ideals uses factorization, can be VERY slow [Reviewed by David Roe, Lorenz Panny]
+#34988: Frederic Chapoton: Integer-valued polynomial ring [Reviewed by Travis Scrimshaw]
+#35026: Xavier Caruso, Antoine Leudiere: Drinfeld modules [Reviewed by David Ayotte]
+#35043: David Ayotte: Fix the method `monomials_of_degree`
+#35045: Marc Mezzarobba, David Roe: Convert result of multivariate polynomial evaluation into correct parent [Reviewed by Travis Scrimshaw]
+#35099: Alex Chandler, Matthias Koppe: `sage.{coding,groups}`: Replace imports from sage.*.all for namespace packages [Reviewed by Dima Pasechnik]
+#35104: Matthias Koppe: Remove direct use of `setup.py sdist`, add targets `make SPKG-sdist` [Reviewed by John Palmieri]
+#35105: Alex Chandler, Matthias Koppe: `sage.{functions,interfaces,symbolic}`: Replace imports from `sage.*.all` for namespace packages [Reviewed by Dima Pasechnik, Tobias Diez]
+#35106: Alex Chandler, Matthias Koppe: `sage.{arith,crypto,databases,dynamics,lfunctions,quadratic_forms}`: Replace imports from `sage.*.all` for namespace packages [Reviewed by Dima Pasechnik, Tobias Diez]
+#35107: Alex Chandler, Matthias Koppe: `sage.{finance,interacts,libs,numerical,stats,tests}`: Replace imports from `sage.*.all` for namespace packages [Reviewed by Dima Pasechnik, Tobias Diez]
+#35119: Matthias Koppe: Deprecate `is_FiniteField` etc., make `sage.rings.finite_rings` a namespace package [Reviewed by Lorenz Panny]
+#35044: Marc Mezzarobba: Fix use of `sig_on()`/`sig_off()` in `CBF.integral()` [Reviewed by Frederic Chapoton]
+#35054: Travis Scrimshaw: Implementing q-commuting Laurent polynomials. [Reviewed by Frederic Chapoton]
+#35082: Matthias Koppe: Upgrade scipy to 1.10.1 [Reviewed by Francois Bissey]
+#35083: Matthias Koppe: `build/pkgs/pcre`: Remove [Reviewed by Dima Pasechnik]
+#35085: Matthias Koppe: Upgrade polymake to 4.9 [Reviewed by Jonathan Kliem]
+#35086: Frederic Chapoton: Move `single_valued` method of MZV to auxiliary F ring [Reviewed by Vincent Delecroix]
+#35087: Jonathan Kliem: Use enum for face iterator status [Reviewed by Matthias Koppe]
+#35090: Alex Chandler, Matthias Koppe: `sage.{algebras,combinat,matroids}`: Replace imports from sage.*.all for namespace packages [Reviewed by Travis Scrimshaw, Tobias Diez]
+#35091: Frederic Chapoton: Fix and activate W391 in `pyx` files [Reviewed by Edgar Costa]
+#35093: Antonio Rojas, Dima Pasechnik: Update GAP to 4.12.2 [Reviewed by Gonzalo Tornaria, Matthias Koppe]
+#35094: Antonio Rojas, Gonzalo Tornaria, Dima Pasechnik: To determine `GAP_SO`, `sage.env` looks for `libgap.so` but it should look for `libgap.so*` [Reviewed by Matthias Koppe]
+#35097: Miguel Marco: Simplicial set group [Reviewed by John Palmieri]
+#35098: Alex Chandler, Matthias Koppe: `sage.{topology,homology}`: Replace imports from `sage.*.all` for namespace packages
+#35100: Matthias Koppe: New ABC `sage.structure.element.NumberFieldElement`, `deprecate is_NumberFieldElement` [Reviewed by Travis Scrimshaw]
+#35101: Matthias Koppe: `scip_backend`: Remove use of deprecated `sage.ext.memory_allocator` [Reviewed by Jonathan Kliem]
+#35151: Frederic Chapoton: Fix all pycodestyle E303 warnings in all folders `c*` [Reviewed by Matthias Koppe]
+#35159: Dima Pasechnik, Matthias Koppe: Update msolve to 0.4.9
+#35162: Gonzalo Tornaria: Fix a slow doctest in `matrix_integer_dense_hnf.py` [Reviewed by Alex J. Best]
+#35163: Travis Scrimshaw: Fix the documentation for the so matrix Lie algebra [Reviewed by Frederic Chapoton]
+#35164: Lorenz Panny: Compute the matrix of an isogeny on a given n-torsion subgroup [Reviewed by John Cremona]
+#35165: Frederic Chapoton: Activate W293 and E714 in `pyx` files [Reviewed by David Coudert]
+#35170: David Coudert: Fix bug in `is_eulerian` [Reviewed by Marc Mezzarobba]
+#35173: Trevor Karn: Speedup of Poset characteristic polynomial [Reviewed by Travis Scrimshaw]
+#35174: Frederic Chapoton, Vincent Delecroix: Cleaning and enhancement to `PolyDict` [Reviewed by Travis Scrimshaw]
+#35177: Francois Bissey: Matplotlib 3.7.0 support [Reviewed by Gonzalo Tornaria]
+#35180: @minaminao: Docs: use double backquotes for a command [Reviewed by Marc Mezzarobba]
+#35183: : Bump codecov/codecov-action from 2 to 3 [Reviewed by Tobias Diez]
+#35184: : Bump actions/github-script from 3.1.0 to 6.4.0 [Reviewed by Tobias Diez]
+#35185: : Bump actions/cache from 2 to 3 [Reviewed by Tobias Diez]
+#35186: Travis Scrimshaw: Various improvements to Weyl character rings [Reviewed by Dima Pasechnik]
+#35189: Tobias Diez: Add typing to tangent vectors [Reviewed by Eric Gourgoulhon]
+#35193: : Symbolics: add derivative operator [Reviewed by Eric Gourgoulhon, Matthias Koppe]
+#35195: Gonzalo Tornaria: Workaround for an ecl race in maxima init [Reviewed by Matthias Koppe]
+#35197: John Palmieri: Fix bug with `Set` equality/inequality [Reviewed by Matthias Koppe]
+#35203: Matthias Koppe: sagemath-standard: Add dependencies `typing_extensions`, `importlib_resources`, `importlib_metadata` [Reviewed by Tobias Diez]
+#35204: Andy Howell: Remove directories leftover from improper shutdown so `sage-cleaner` won't kill random processes
+#35205: Frederic Chapoton: Remove deprecated slicing semantics of polynomials [Reviewed by Matthias Koppe]
+#35206: Frederic Chapoton: Fixing some E502 (unnecessary backslash) in `pyx` files [Reviewed by David Coudert]
+#35056: Kwankyu Lee: Make automatic codecov report less noisy [Reviewed by Tobias Diez]
+#35080: Matthias Koppe: Use the Docker images published on ghcr.io without 'docker' in the name [Reviewed by Dima Pasechnik]
+#35110: Alex Chandler, Matthias Koppe: Meta-PR: Replace imports from `sage.*.all` for namespace packages [Reviewed by Dima Pasechnik]
+#35111: Tobias Diez: Partly fix conda ci and update python versions tested [Reviewed by Matthias Koppe]
+#35113: Agamdeep Singh, @wrongisright: Added check for invalid range in `contour_plot` and derivatives [Reviewed by Kwankyu Lee]
+#35114: Antonio Rojas, Mauricio Collares, Dima Pasechnik: `libgap`: Remove some GC hazards
+#35115: Travis Scrimshaw: Make the key polynomials know their degree [Reviewed by Frederic Chapoton]
+#35117: Frederic Chapoton: Fix pep8 E303 in `modular/` and `algebras/` [Reviewed by Edgar Costa]
+#35118: Matthias Koppe: `sage.env.sage_include_directories`: Don't use `distutils` and `SAGE_LIB` [Reviewed by Francois Bissey]
+#35120: Andrey Belgorodski, Matthias Koppe: Add optional package cvxpy, update cylp, add CVXPY MIP backend [Reviewed by Dima Pasechnik]
+#35123: Frederic Chapoton: Fixing most of pycodestyle E271 [Reviewed by Matthias Koppe]
+#35127: Gonzalo Tornaria: Fix a very slow doctest in `sage/data_structures/stream.py` [Reviewed by Travis Scrimshaw, Martin Rubey]
+#35128: Aram Dermenjian: Fix French notation for `Tableau` plots [Reviewed by Dima Pasechnik]
+#35131: David Coudert: Add parameter 'induced' to `connected_subgraphs_iterator` [Reviewed by Vincent Delecroix]
+#35132: Frederic Chapoton: Fix pep8 E303 in various folders (plot, quadratic forms, etc) [Reviewed by Matthias Koppe]
+#35135: Matthias Koppe: `sage.geometry.integral_points`: Use generic impl if no `matrix_integer_dense` [Reviewed by Jonathan Kliem]
+#35136: Matthias Koppe: `sage.{geometry,rings}`: More `# optional` tags in doctests [Reviewed by Jonathan Kliem]
+#35138: Travis Scrimshaw: Allow skew tableaux to be hashed [Reviewed by Kwankyu Lee]
+#35140: Matthias Koppe: Update normaliz to 3.10.0, update e_antic, pynormaliz
+#35141: Kwankyu Lee: Revise the PR template [Reviewed by Tobias Diez]
+#35142: Tirthankar Mazumder: Fix broken link in README [Reviewed by Tobias Diez]
+#35146: @Bruno-TT, David Coudert: Equal hashes for non-isomorphic bipartite graphs with edge labels [Reviewed by David Roe]
+#35153: Matthias Koppe: `sage.matrix.operation_table`: Modularization and code style fixes [Reviewed by Dima Pasechnik, Travis Scrimshaw]
+#35155: Tirthankar Mazumder, Priyanshu Kumar Rai: Update the logo at README.md [Reviewed by Kwankyu Lee]
+#35156: Andrey Belgorodski: Fix index out of range exception (#35031) [Reviewed by Sebastien Labbe]
+#35160: Matthias Koppe: Move `filterwarnings` calls from `sage.all` to `sage.all__sagemath_repl` [Reviewed by Gonzalo Tornaria]
+#35220: Vincent Delecroix: Add tests for solved issue about fraction fields [Reviewed by Frederic Chapoton]
+#35233: Martin Rubey: Systematically avoid checking of input [Reviewed by Travis Scrimshaw]
+#35236: @mathcals: Make `Expression.simplify` optionally use sympy [Reviewed by Matthias Koppe]
+#35237: Matthias Koppe: `sage.features`: Add `sage.libs.singular`, features for standard Python packages [Reviewed by Kwankyu Lee]
+#35244: Frederic Chapoton: Fix pep8 E303 in all folders starting with [defghi] [Reviewed by Matthias Koppe]
+#35248: Frederic Chapoton: Using `change_ring` in `quadratic_forms` [Reviewed by Matthias Koppe]
+#35249: Frederic Chapoton: Catch some more precise exceptions in `combinat/` [Reviewed by David Coudert]
+#35250: Gonzalo Tornaria: Fix doctests for nauty 2.8.6 output changes [Reviewed by David Coudert]
+#35252: Frederic Chapoton: More standard shape for error messages in `combinat` [Reviewed by Matthias Koppe]
+#35253: Matthias Koppe: Deprecate `is_Algebra`, `is_CommutativeAlgebra` [Reviewed by Travis Scrimshaw]
+#35254: David Ayotte, Martin Rubey: Fix docstring of `src/sage/rings/lazy_series.py` [Reviewed by David Coudert]
+#35257: Frederic Chapoton: Shorter doctests in finite monoids [Reviewed by David Coudert]
+#35262: Lorenz Panny: Support calling PARI's `qfbcornacchia()` from `BinaryQF` [Reviewed by Travis Scrimshaw]
+#35263: Matthias Koppe: `sage.topology`: Move imports from `sage.graphs`, `sage.homology` into methods [Reviewed by David Coudert]
+#35265: Martin Rubey: Improve approximate order on `__getitem__` calls [Reviewed by Travis Scrimshaw]
+#35266: Matthias Koppe: `sage.graphs`: Add `# optional` doctest tags for modularization [Reviewed by Dima Pasechnik, David Coudert]
+#35267: Matthias Koppe: `sage.manifolds`, `sage.tensor`: Add `# optional` doctest tags for modularization [Reviewed by Eric Gourgoulhon]
+#35270: Lorenz Panny: Construct `AdditiveAbelianGroupWrapper` from (not necessarily independent) generating set [Reviewed by Travis Scrimshaw]
+#35275: Matthias Koppe: Drinfeld modules: Make some imports lazy [Reviewed by Antoine Leudiere]
+#35277: Matthias Koppe: `sage.rings.polynomial.polynomial_ring[_constructor]`: Handle missing implementation modules [Reviewed by Marc Mezzarobba]
+#35278: Matthias Koppe: Use the Docker images published on ghcr.io without 'docker' in the name (step 3) [Reviewed by Dima Pasechnik]
+#35279: Matthias Koppe: `sage.categories`: Modularization fixes for imports [Reviewed by Kwankyu Lee]
+#35280: Lorenz Panny: Support `all=` keyword argument in `AlgebraicClosureFiniteFieldElement.sqrt()` [Reviewed by David Roe]
+#35283: Matthias Koppe: Modularization fixes for imports of number fields [Reviewed by Marc Mezzarobba]
+#35284: Dima Pasechnik: primesieve/count update, add gentoo packages info for them [Reviewed by Francois Bissey]
+#35287: David Ayotte: Add missing colon in `finite_drinfeld_module.py` [Reviewed by Antoine Leudiere, David Coudert]
+#35289: Dima Pasechnik: pplpy*: update upstream info and deps [Reviewed by Matthias Koppe]
+#35290: Dima Pasechnik: Update pplpy to 0.8.7 - to make gcc 12.2.1 happy [Reviewed by Matthias Koppe]
+#35291: Martin Rubey: Do not evaluate unnecessarily [Reviewed by Travis Scrimshaw]
+#35293: Andrey Belgorodski, Gonzalo Tornaria, Priyanshu Kumar Rai, Travis Scrimshaw, Kwankyu Lee, Lorenz Panny, @wrongisright, Frederic Chapoton, Dima Pasechnik, Agamdeep Singh, Matthias Koppe: Arity check for shift and added some warnings [Reviewed by Martin Rubey]
+#35294: Rémy Oudompheng: Avoid a square root computation in `EllipticCurve_field.quadratic_twist` [Reviewed by Lorenz Panny]
+#35303: Dima Pasechnik: `pyscipopt`: Update to 4.3.0, use tarball without generated `.c` files, run Cython instead [Reviewed by Matthias Koppe]
+#35304: Matthias Koppe: HTML documentation: Add copy buttons to code blocks [Reviewed by Kwankyu Lee, Tobias Diez]
+#35307: Rémy Oudompheng: Use `StringIO` to format polynomials [Reviewed by Lorenz Panny]
+#35310: David Coudert: Fix radius and diameter for digraphs with non-comparable vertices [Reviewed by Frederic Chapoton]
+#35036: Travis Scrimshaw: Implement Specht modules for diagrams [Reviewed by Frederic Chapoton]
+#35037: Kevin Dilks: Implement symmetry classes of plane partitions [Reviewed by Frederic Chapoton]
+#35102: Darij Grinberg, Matthias Koppe: Introduce extension of scalars coercion of CombinatorialFreeModules [Reviewed by Kwankyu Lee]
+#35166: John Cremona, David Roe: Improve CM testing for elliptic curves over number fields
+#35181: Michael Orlitzky, Matthias Koppe: Document, lint, and fix placement of magic comments in multiline doctests [Reviewed by Gonzalo Tornaria]
+#35210: Kwankyu Lee: Refactor `subs()` of multivariate polynomials for readability and efficiency [Reviewed by Matthias Koppe]
+#35211: @MatteoCati: Add skew Hadamard matrices up to order 1000 [Reviewed by Dima Pasechnik, Travis Scrimshaw]
+#35214: Enrique Artal: Some improvements for braids computations [Reviewed by Travis Scrimshaw, Miguel Marco, Trevor Karn]
+#35215: Eloi Torrents: Fix description of inputs of primes. [Reviewed by Trevor Karn]
+#35218: Peter Bruin: Reduce exponents of `AbelianGroup` elements modulo the respective orders [Reviewed by Alex J. Best]
+#35222: Matan Ziv-Av: Reference Manual: fix definition of inverse Laplace transform [Reviewed by Frederic Chapoton]
+#35224: Frederic Chapoton: Fixing some `:class:`, `:meth:` roles [Reviewed by David Roe]
+#35228: Frederic Chapoton: Large partial pep8 cleanup in `cluster_seed` [Reviewed by Matthias Koppe]
+#35229: Matthias Koppe: `sage.rings.polynomial.laurent_polynomial_ring_base`: Split out from `.laurent_polynomial_ring` [Reviewed by Travis Scrimshaw]
+#35230: Kwankyu Lee, Matthias Koppe: `sage.rings.function_field`: Modularization fixes
+#35240: Matthias Koppe: ABC for `BooleanPolynomialRing` [Reviewed by Francois Bissey]
+#35438: Gonzalo Tornaria: Ignore deprecation warnings triggered by pythran 0.12.1 [Reviewed by Matthias Koppe]
+#35377: Matthias Koppe: `build/pkgs/openblas/spkg-configure.m4`: Reject version 0.3.22 [Reviewed by John Palmieri]
+#35381: Rémy Oudompheng: Use Singular `maMapPoly` to avoid quadratic complexity in polynomial evaluation [Reviewed by Vincent Delecroix]
+#35382: : Add missing backticks to correct formatting [Reviewed by Matthias Koppe]
+#35384: Matthias Koppe: `make dist`: Update git remotes [Reviewed by John Palmieri]
+#35385: Matthias Koppe: `src/tox.ini`: Add cython-lint [Reviewed by Frederic Chapoton]
+#35390: @yukibl: Typo: 'minumum' for 'minimum' [Reviewed by Matthias Koppe]
+#35394: Sebastien Labbe: Adding a `save` method to class `Standalone`/`TikzPicture` for compatibility with sagetex [Reviewed by Frederic Chapoton]
+#35405: Marc Mezzarobba: Accept plain Python types in `block_matrix()` [Reviewed by Matthias Koppe]
+#35409: Frederic Chapoton: Fix pep8 E303 in folders starting with `m` [Reviewed by David Coudert]
+#35412: Tobias Diez: Activate codecov reports even if other checks are failing [Reviewed by Kwankyu Lee, Matthias Koppe]
+#35413: Frederic Chapoton: Fixing some pep8 E303 (folders before `l*` and after `t*`) [Reviewed by Matthias Koppe]
+#35416: Matthias Koppe: `argon2_cffi`: Add missing dependency
+#35418: Frederic Chapoton: Fix the broken linters [Reviewed by Matthias Koppe]
+#35421: Frederic Chapoton: `WordMorphism`: remove keyword deprecated in #26307 [Reviewed by Sebastien Labbe, Travis Scrimshaw]
+#35423: Gonzalo Tornaria: Fix doctests with ipython 8.12 [Reviewed by Francois Bissey]
+#35312: Frederic Chapoton: Fixing most of pycodestyle E271 in `pyx` files [Reviewed by David Coudert, Matthias Koppe]
+#35313: Alex Hutman: Make `data_structures/bitset_base.pxd` use explicit integer division [Reviewed by David Coudert]
+#35314: Matthias Koppe: `sage.schemes`: Reformat doctests, add `# optional` annotations [Reviewed by Kwankyu Lee]
+#35316: Rémy Oudompheng: Use PARI implementation of Frobenius morphism [Reviewed by Travis Scrimshaw]
+#35317: Frederic Chapoton: Fixing some E502 outside of `schemes` and `combinat` [Reviewed by Matthias Koppe]
+#35322: Gonzalo Tornaria, Matthias Koppe: Many more namespace packages
+#35323: Rémy Oudompheng: Fix `squarefree_decomposition` failure over `GF(2)` [Reviewed by Travis Scrimshaw]
+#35331: Moritz Firsching, Matthias Koppe: Add monotile to polygon examples
+#35334: Rémy Oudompheng, Travis Scrimshaw: Improvements to `squarefree_decomposition()` for finite fields.
+#35335: Rémy Oudompheng: Make FLINT `polynomial factor()` interruptible [Reviewed by Vincent Delecroix, Travis Scrimshaw]
+#35336: Antonio Rojas: Fix test output to pass with ipywidgets 8.0.5 [Reviewed by Francois Bissey]
+#35337: Gonzalo Tornaria: Fix warning with ipython 8.11 (was #35235) [Reviewed by Francois Bissey]
+#35345: Travis Scrimshaw: Allow `completion()` to return a lazy series for infinite precision [Reviewed by Martin Rubey]
+#35349: Tobias Diez: Correctly list develop packages in conda dev environment [Reviewed by Matthias Koppe]
+#35350: Tobias Diez: Fix version specifiers of python packages for conda [Reviewed by Matthias Koppe]
+#35351: Tobias Diez: Add minimum version of conda gap package [Reviewed by Dima Pasechnik]
+#35352: Tobias Diez: Add instructions on how to update existing conda environment [Reviewed by Matthias Koppe]
+#35353: Tobias Diez: Replace `\mbox` by `\text` in `manifolds` [Reviewed by Eric Gourgoulhon]
+#35355: Frederic Chapoton: Partial fix for E221 (to be continued) [Reviewed by Matthias Koppe]
+#35356: Tobias Diez: Fix documentation deployment [Reviewed by Kwankyu Lee, Dima Pasechnik]
+#35358: Rémy Oudompheng: Lighter construction of finite field elements from lists [Reviewed by Travis Scrimshaw]
+#35366: Gonzalo Tornaria, Matthias Koppe: Many more namespace packages – follow up
+#35367: David Lowry-Duda: Add output documentation on `monte_carlo_integral` [Reviewed by Matthias Koppe]
+#35372: Frederic Chapoton, Rémy Oudompheng, Matthias Koppe: Replace more `.all` imports [Reviewed by Gonzalo Tornaria]
+#35225: Daniel Bump, Daniel Bump, Dima Pasechnik: `SmallPermutationGroups` [Reviewed by Max Horn, Travis Scrimshaw]
+#35487: Ralf Hemmecke: Docfix: decimal --> binary [Reviewed by Marc Mezzarobba]
+#35392: Frederic Chapoton: Partial cython linting in `algebras/` [Reviewed by David Coudert]
+#35408: Frederic Chapoton: Some cython-linting inside `categories/` [Reviewed by David Coudert]
+#35414: Vincent Delecroix: Conversion of `complex_root_of` to algebraic [Reviewed by Frederic Chapoton]
+#35419: Michael Orlitzky: Add "flint" factorization algorithm and replace qsieve implementation [Reviewed by Vincent Delecroix]
+#35420: Frederic Chapoton: Slight generalisation of MZV auxiliary F-algebra [Reviewed by Travis Scrimshaw]
+#35426: Aadya Chinubhai: Removed redundant imports from `matrix_modn_dense_float.pyx` [Reviewed by Vincent Neiger]
+#35439: David Coudert: Fix doctests in oeis [Reviewed by Sebastien Labbe]
+#35441: Gonzalo Tornaria: Fix construction functor for p-adic relaxed types [Reviewed by Xavier Caruso, David Roe]
+#35442: Gonzalo Tornaria: Make `Qp.integer_ring()` faster [Reviewed by David Roe]
+#35449: Gonzalo Tornaria: Don't call `sylvester_matrix` with zero polynomials [Reviewed by Travis Scrimshaw]
+#35450: Matthias Koppe: Replace remaining uses of `is_SymbolicEquation`, `is_SymbolicVariable`
+#35451: : Add modules to modules/index.rst [Reviewed by Matthias Koppe]
+#35452: Frederic Chapoton: Fix all pycodestyle E303 warnings in `rings/` [Reviewed by Matthias Koppe]
+#35453: Frederic Chapoton: Partial cython-linting in `graphs/` [Reviewed by David Coudert]
+#35454: Frederic Chapoton: Fix pycodestyle E502 in `coding` and `crypto` folders [Reviewed by Matthias Koppe]
+#35455: Rémy Oudompheng: Faster `get_unsafe` for NTL `GF(p)` polynomials [Reviewed by Marc Mezzarobba]
+#35456: Rémy Oudompheng: Faster computation of cached Frobenius powers [Reviewed by Marc Mezzarobba]
+#35458: Frederic Chapoton: Remove old deprecated properties in `set_partition` + pep8 cleanup [Reviewed by David Coudert]
+#35459: Frederic Chapoton: pep8 and code details in `weyl_characters.py` [Reviewed by David Coudert]
+#35466: Frederic Chapoton: Refactor poset examples for better code coverage [Reviewed by David Coudert]
+#35482: Kwankyu Lee: Update GitHub transition notices in the developer manual [Reviewed by Matthias Koppe]
+#35271: Lorenz Panny: Add `.conductor()` and `.order_of_conductor()` methods for orders in quadratic fields [Reviewed by Travis Scrimshaw]
+#35318: Frederic Chapoton: Fix E502 in `schemes` and `combinat` [Reviewed by Kwankyu Lee]
+#35325: Rémy Oudompheng: Correct NTL calls when computing modular powers of `GF(2)` polynomials [Reviewed by Vincent Delecroix]
+#35346: Rémy Oudompheng: Do not require a multiplicative generator for finite field `nth_root` [Reviewed by Vincent Delecroix]
+#35359: Frederic Chapoton: Fix and activate pep E271 in python files [Reviewed by Matthias Koppe]
+#35370: Rémy Oudompheng: Faster Kohel isogenies without bivariate polynomials [Reviewed by Lorenz Panny]
+#35379: Matthias Koppe: Fix for `sage -package create --pypi --source wheel` [Reviewed by Kwankyu Lee]
+#35397: Frederic Chapoton: Cython-linting a few `pyx` files [Reviewed by Kwankyu Lee]
+#35039: Julian Ruth, Xavier Caruso: Add `lazy_string` in `matrix2.pyx` [Reviewed by Frederic Chapoton, Sebastien Labbe, Vincent Delecroix]
+#35462: David Coudert: Iterator over the minimal distance k dominating sets [Reviewed by Travis Scrimshaw]
+#35463: David Coudert: Add iterator over minimum distance k dominating sets [Reviewed by Travis Scrimshaw]
+#35465: Tobias Diez: Fix conda workflow [Reviewed by Matthias Koppe]
+#35472: Frederic Chapoton, Travis Scrimshaw: Implement the Feichtner-Yuzvinsky rings for lattices
+#35476: Matthias Koppe: scipy: Patch out test requiring internet access [Reviewed by Frederic Chapoton]
+#35478: Max Horn: Remove unused code from GAP interface [Reviewed by Frederic Chapoton]
+#35499: Mauricio Collares: Fix test output for ipywidgets 8.0.5, part deux [Reviewed by Francois Bissey]
+#35504: Matthias Koppe: `build/pkgs/sphinx_{copybutton,basic_ng}`: Add conda info [Reviewed by Isuru Fernando]
+#35506: Frederic Chapoton: Add check for pycodestyle E502 in python files [Reviewed by Tobias Diez, Matthias Koppe]
+#35507: Frederic Chapoton: Aix pycodestyle E303 in `schemes` [Reviewed by David Coudert]
+#35509: Frederic Chapoton: Some cython-linting in `matrix/` folder [Reviewed by David Coudert, Matthias Koppe]
+#35510: Gonzalo Tornaria: Make `BooleanPolynomial.variables()` way faster [Reviewed by Vincent Delecroix]
+#35511: Gonzalo Tornaria: Fix `Graph.add_clique()` for one vertex [Reviewed by David Coudert]
+#35512: Gonzalo Tornaria: Improve `PolynomialSequence.connection_graph()` implementation [Reviewed by Vincent Delecroix, David Coudert]
+#35513: Gonzalo Tornaria: Silence initialization of giac [Reviewed by Francois Bissey]
+#35514: Gonzalo Tornaria: Don't force ecl lisp with `maxima -l ecl` on command line. [Reviewed by Francois Bissey]
+#35515: Frederic Chapoton: Bug in integer valued polys [Reviewed by Travis Scrimshaw]
+#35518: David Coudert: Improve `PolynomialSequence.connected_components()` [Reviewed by Vincent Delecroix, Gonzalo Tornaria]
+#35521: Darij Grinberg: `sage.combinat.sf`: re-enable a doctest [Reviewed by Frederic Chapoton]
+#35525: Frederic Chapoton: Cython-lint and some doc cleanup for `expression.pyx` [Reviewed by Matthias Koppe]
+#35526: Frederic Chapoton: Fix pycodestyle E271 and E502 in `pyx` files [Reviewed by Matthias Koppe]
+#35530: Frederic Chapoton: Some minor details in `interfaces` [Reviewed by Matthias Koppe]
+#35533: David Coudert: Fix bug in `graph.maximum_average_degree` [Reviewed by Travis Scrimshaw]
+#35534: Frederic Chapoton: Some cython-lint fixes in `matroids/` [Reviewed by Matthias Koppe]
+#35542: Frederic Chapoton: Some fixes for cython-lint in various places [Reviewed by Matthias Koppe]
+#35543: Frederic Chapoton: Cleaning set partition [Reviewed by Martin Rubey, Matthias Koppe]
+#35305: Matthias Koppe: `sage.quadratic_forms`: Modularization fixes for imports [Reviewed by Kwankyu Lee]
+#35306: Matthias Koppe: `sage.groups.matrix_gps`: Modularization fixes for imports [Reviewed by Kwankyu Lee]
+#35375: : Fix minimal kernel basis corner cases [Reviewed by Travis Scrimshaw]
+#35389: Matthias Koppe: `sage.rings.finite_rings.residue_field`: Modularization fixes [Reviewed by Kwankyu Lee]
+#35431: Marie Bonboire: Documentation improvements for rounding methods [Reviewed by Vincent Neiger, Travis Scrimshaw]
+#35443: Gonzalo Tornaria: Fix slow doctests or mark `# long time` [Reviewed by Matthias Koppe]
+#35446: Frederic Chapoton: Add method `is_simple` to permutations [Reviewed by Vincent Delecroix, Kevin Dilks]
+#35558: Matthias Koppe: `sage.quadratic_forms`: Fix use of `staticmethod` for Python < 3.10 [Reviewed by Kwankyu Lee]
+#35415: Dima Pasechnik, Matthias Koppe: `givaro`, `zeromq`: Add patches for GCC 13 support
+#35552: Frederic Chapoton: Fix the linter once more [Reviewed by Matthias Koppe]
+#35594: Frederic Chapoton, Dima Pasechnik, Matthias Koppe: Remove some circular imports in `sage.rings`, `sage.symbolic`
+#35524: Matthias Koppe: Accept system openblas 0.3.23 and newer (needed for archlinux) [Reviewed by Dima Pasechnik, Rémy Oudompheng]
+#35555: John Cremona: Update eclib to version 20230424
+#35625: Matthias Koppe: `zeromq`: Add system package info for Arch Linux, Gentoo [Reviewed by Frederic Chapoton]
+#35637: Dima Pasechnik: Remark that WSL needs a lot of RAM [Reviewed by Tobias Diez]
+#35638: Matthias Koppe: `build/pkgs/python3/spkg-configure.m4`: Add depcheck for zlib [Reviewed by Dima Pasechnik]
+#35460: Kwankyu Lee: Update developer guide for workflows on github [Reviewed by Matthias Koppe, Sebastian Oehms]
\ No newline at end of file