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 = '') + + 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