From 8d34a2481e0aa18ae1279ca72d565946b62cee0c Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Thu, 15 Jan 2026 16:45:08 +0000 Subject: [PATCH 01/21] TMP: Homepage --- .gitignore | 1 + .readthedocs.yaml | 15 +- {images => _static/img}/Numfocus_stamp.png | Bin {images => _static/img}/astropy_banner.svg | 0 {images => _static/img}/astropy_banner_96.png | Bin {images => _static/img}/astropy_brandmark.png | Bin {images => _static/img}/astropy_doge.png | Bin {images => _static/img}/astropy_meow.png | Bin {images => _static/img}/astropy_powered.png | Bin .../img}/astropy_powered_white.png | Bin .../img}/astropy_project_logo.png | Bin .../img}/astropy_project_logo.svg | 0 {images => _static/img}/astropy_word.svg | 0 {images => _static/img}/astropy_word_32.png | Bin {images => _static/img}/background.jpg | Bin {images => _static/img}/menu.png | Bin {images => _static/img}/menu.svg | 0 {images => _static/img}/python-mark.png | Bin about.html | 173 --- acknowledging.html | 287 ----- affiliated/index.html | 478 -------- affiliated/registry.json | 1092 ----------------- affiliated/validate_registry.py | 135 -- annoucement_banner.html | 0 announcements/astropy_logo_notext.png | Bin 12730 -> 0 bytes announcements/release-0.4.html | 137 --- announcements/release-1.0.html | 156 --- announcements/release-1.1.html | 168 --- announcements/release-1.2.html | 168 --- announcements/release-1.3.html | 166 --- announcements/release-2.0.html | 188 --- announcements/release-3.0.html | 208 ---- announcements/release-3.1.html | 193 --- announcements/release-3.2.html | 185 --- announcements/release-4.0.html | 188 --- announcements/release-4.1.html | 193 --- announcements/release-4.3.html | 194 --- announcements/release-5.0.html | 191 --- announcements/release-5.1.html | 184 --- announcements/release-5.2.html | 183 --- announcements/release-5.3.html | 182 --- announcements/release-6.0.html | 185 --- announcements/release-6.1.html | 180 --- announcements/release-7.0.html | 198 --- announcements/release-7.2.html | 179 --- code_of_conduct.html | 146 --- code_of_conduct_old_astropy.html | 161 --- conf.py | 46 + contribute.html | 259 ---- credits.html | 319 ----- css/github_issues.css | 22 - css/jquery.sidr.light.css | 46 - css/style.css | 734 ----------- editing_tips.txt | 9 - getteam.py | 119 -- help.html | 122 -- history.html | 238 ---- index.html | 199 --- index.rst | 275 +++++ js/analytics.js | 9 - js/functions.js | 433 ------- js/jquery.sidr.min.js | 4 - js/yaml_parse_bundle.js | 138 --- paper1_10k_citation.html | 102 -- requirements.txt | 4 + roles.json | 710 ----------- team.html | 834 ------------- validate_roles.py | 73 -- 68 files changed, 333 insertions(+), 10476 deletions(-) rename {images => _static/img}/Numfocus_stamp.png (100%) rename {images => _static/img}/astropy_banner.svg (100%) rename {images => _static/img}/astropy_banner_96.png (100%) rename {images => _static/img}/astropy_brandmark.png (100%) rename {images => _static/img}/astropy_doge.png (100%) rename {images => _static/img}/astropy_meow.png (100%) rename {images => _static/img}/astropy_powered.png (100%) rename {images => _static/img}/astropy_powered_white.png (100%) rename {images => _static/img}/astropy_project_logo.png (100%) rename {images => _static/img}/astropy_project_logo.svg (100%) rename {images => _static/img}/astropy_word.svg (100%) rename {images => _static/img}/astropy_word_32.png (100%) rename {images => _static/img}/background.jpg (100%) rename {images => _static/img}/menu.png (100%) rename {images => _static/img}/menu.svg (100%) rename {images => _static/img}/python-mark.png (100%) delete mode 100644 about.html delete mode 100644 acknowledging.html delete mode 100644 affiliated/index.html delete mode 100644 affiliated/registry.json delete mode 100644 affiliated/validate_registry.py delete mode 100644 annoucement_banner.html delete mode 100644 announcements/astropy_logo_notext.png delete mode 100644 announcements/release-0.4.html delete mode 100644 announcements/release-1.0.html delete mode 100644 announcements/release-1.1.html delete mode 100644 announcements/release-1.2.html delete mode 100644 announcements/release-1.3.html delete mode 100644 announcements/release-2.0.html delete mode 100644 announcements/release-3.0.html delete mode 100644 announcements/release-3.1.html delete mode 100644 announcements/release-3.2.html delete mode 100644 announcements/release-4.0.html delete mode 100644 announcements/release-4.1.html delete mode 100644 announcements/release-4.3.html delete mode 100644 announcements/release-5.0.html delete mode 100644 announcements/release-5.1.html delete mode 100644 announcements/release-5.2.html delete mode 100644 announcements/release-5.3.html delete mode 100644 announcements/release-6.0.html delete mode 100644 announcements/release-6.1.html delete mode 100644 announcements/release-7.0.html delete mode 100644 announcements/release-7.2.html delete mode 100644 code_of_conduct.html delete mode 100755 code_of_conduct_old_astropy.html create mode 100644 conf.py delete mode 100644 contribute.html delete mode 100644 credits.html delete mode 100644 css/github_issues.css delete mode 100644 css/jquery.sidr.light.css delete mode 100644 css/style.css delete mode 100644 editing_tips.txt delete mode 100644 getteam.py delete mode 100644 help.html delete mode 100644 history.html delete mode 100644 index.html create mode 100644 index.rst delete mode 100644 js/analytics.js delete mode 100644 js/functions.js delete mode 100644 js/jquery.sidr.min.js delete mode 100644 js/yaml_parse_bundle.js delete mode 100644 paper1_10k_citation.html create mode 100644 requirements.txt delete mode 100644 roles.json delete mode 100644 team.html delete mode 100644 validate_roles.py diff --git a/.gitignore b/.gitignore index 1eb23947..3d349ced 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.py[co] *.DS_STORE +_build/ diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 9461c7d1..99757501 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -5,13 +5,12 @@ version: 2 build: os: ubuntu-24.04 - apt_packages: - - rsync tools: python: "3.13" - jobs: - build: - html: - - echo $READTHEDOCS_OUTPUT - - mkdir --parents $READTHEDOCS_OUTPUT/html/ - - rsync -avz --exclude .git --exclude ".*" --exclude _readthedocs --exclude "*.py" --exclude CNAME ./ _readthedocs/html + +sphinx: + configuration: conf.py + +python: + install: + - requirements: requirements.txt diff --git a/images/Numfocus_stamp.png b/_static/img/Numfocus_stamp.png similarity index 100% rename from images/Numfocus_stamp.png rename to _static/img/Numfocus_stamp.png diff --git a/images/astropy_banner.svg b/_static/img/astropy_banner.svg similarity index 100% rename from images/astropy_banner.svg rename to _static/img/astropy_banner.svg diff --git a/images/astropy_banner_96.png b/_static/img/astropy_banner_96.png similarity index 100% rename from images/astropy_banner_96.png rename to _static/img/astropy_banner_96.png diff --git a/images/astropy_brandmark.png b/_static/img/astropy_brandmark.png similarity index 100% rename from images/astropy_brandmark.png rename to _static/img/astropy_brandmark.png diff --git a/images/astropy_doge.png b/_static/img/astropy_doge.png similarity index 100% rename from images/astropy_doge.png rename to _static/img/astropy_doge.png diff --git a/images/astropy_meow.png b/_static/img/astropy_meow.png similarity index 100% rename from images/astropy_meow.png rename to _static/img/astropy_meow.png diff --git a/images/astropy_powered.png b/_static/img/astropy_powered.png similarity index 100% rename from images/astropy_powered.png rename to _static/img/astropy_powered.png diff --git a/images/astropy_powered_white.png b/_static/img/astropy_powered_white.png similarity index 100% rename from images/astropy_powered_white.png rename to _static/img/astropy_powered_white.png diff --git a/images/astropy_project_logo.png b/_static/img/astropy_project_logo.png similarity index 100% rename from images/astropy_project_logo.png rename to _static/img/astropy_project_logo.png diff --git a/images/astropy_project_logo.svg b/_static/img/astropy_project_logo.svg similarity index 100% rename from images/astropy_project_logo.svg rename to _static/img/astropy_project_logo.svg diff --git a/images/astropy_word.svg b/_static/img/astropy_word.svg similarity index 100% rename from images/astropy_word.svg rename to _static/img/astropy_word.svg diff --git a/images/astropy_word_32.png b/_static/img/astropy_word_32.png similarity index 100% rename from images/astropy_word_32.png rename to _static/img/astropy_word_32.png diff --git a/images/background.jpg b/_static/img/background.jpg similarity index 100% rename from images/background.jpg rename to _static/img/background.jpg diff --git a/images/menu.png b/_static/img/menu.png similarity index 100% rename from images/menu.png rename to _static/img/menu.png diff --git a/images/menu.svg b/_static/img/menu.svg similarity index 100% rename from images/menu.svg rename to _static/img/menu.svg diff --git a/images/python-mark.png b/_static/img/python-mark.png similarity index 100% rename from images/python-mark.png rename to _static/img/python-mark.png diff --git a/about.html b/about.html deleted file mode 100644 index 925ca005..00000000 --- a/about.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - -Astropy | About - - - - - - - -
- - - - -
-

About The Astropy Project

- -

The Astropy Project is a community effort to develop a core package - for astronomy using the - Python programming language - and improve usability, interoperability, and collaboration between astronomy - Python packages. The core astropy package contains functionality aimed - at professional astronomers and astrophysicists, but may be useful to anyone - developing astronomy software. The Astropy Project also includes - "affiliated packages," Python packages that are not necessarily developed by - the core development team, but share the goals of Astropy, and often build - from the core package's code and infrastructure.

- -

Aside from the actual code, Astropy is also a community of astronomy- - associated users and developers that agree that sharing utilities is - healthy for the community and the science it produces. This community is - of course central to accomplishing anything with the code itself. - We welcome anyone who - wishes to contribute to the project and expect everyone in our community - to follow the code of conduct when interacting with others.

- -

For more details on background of the project, you can read the - original vision - from when the project was founded.

-
- -
-

astropy Core Package

- -

The astropy package (alternatively known as the "core" package) - contains various classes, utilities, and a packaging framework intended - to provide commonly-used astronomy tools. It is divided into a variety - of sub-packages, which are described in detail in the - documentation.

-
- -
-

Affiliated Packages

- -

The Astropy project includes the concept of "affiliated packages." An - affiliated package is an astronomy-related python package that is not - part of the astropy core source code, but has requested to be included - in the general community effort of the Astropy project. Such a package - may be a candidate for eventual inclusion in the main astropy package - (although this is not required). Until then, however, it is a separate - package, and may not be in the astropy namespace.

- -

The authoritative listing of current affiliated packages is available at - http://affiliated.astropy.org. - That page also describes the process to get a package listed as an affiliated package.

-
- -
- - -

License

- -

Astropy is licensed under a three-clause BSD license. For details, see the LICENSE.rst file in the astropy repository.

-
- -
- -

Governance

-

Astropy governance is as laid out in APE 0, consisting of the Coordination Committee, the Ombudsperson, and the Voting Members. Accompanying policies are documented in the project policies folder.

-
- -
- -

Fiscal Sponsor

- -

Astropy is a Sponsored Project of NumFOCUS, a 501(c)(3) nonprofit charity in the United States. - NumFOCUS provides Astropy with fiscal, legal, and administrative support to help ensure the health and sustainability of the project. - Visit numfocus.org for more information.

- - - -
- - - -
- - - diff --git a/acknowledging.html b/acknowledging.html deleted file mode 100644 index b63e3dcb..00000000 --- a/acknowledging.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - - - - - - - - - - -Astropy | Acknowledging - - - - - - - - - - -
- - -
- - -

Acknowledging or Citing Astropy

- -

In Publications

- -

If you use Astropy Project tools and resources for work/research presented in a - publication (whether directly, or as a dependency to another package), we ask that you - please cite the Astropy papers. We encourage you to cite all three papers, but if space - is limited, please cite the most recent paper: -

-

- - Copy all BibTeX to clipboard - -

- If you are using AASTeX and plan to submit an article to one of the AAS journals, we recommend adding a \software{...} tag to your manuscript that cites Astropy (see the AASTeX guide for more information), e.g.: -

- -

- - \software{Astropy \citep{astropy:2013, astropy:2018, astropy:2022}} - -

- -

- (but please also consider adding and citing other software packages that you use to this list as well). -

- -

- If you are submitting an article to another journal, or have no other specific place in your manuscript to cite the papers, we provide the following LaTeX/BibTeX snippet to add to your acknowledgments: -

- -

- This work made use of Astropy:\footnote{http://www.astropy.org} a community-developed core Python package and an - ecosystem of tools and resources for astronomy \citep{astropy:2013, astropy:2018, astropy:2022}. - -

- -

- As an alternative, the BibTeX record recommended for a given version of Astropy is available from the Python package itself: -

-import astropy
-astropy.__citation__
-

- -
- -

In Presentations

- -

If you are giving a presentation or talk featuring work/research that makes use of Astropy and would like to acknowledge Astropy, we suggest using this logo on your title slide:

- - Powered by Astropy - -

The logo is also available with white text, or the SVG originals can be obtained at the astropy-logo github repository.

- -
- -

In Projects

- -

If you are using Astropy as part of a code project (e.g., affiliated packages), a useful way to acknowledge your use of Astropy is with a badge in your README. We suggest this badge:

- - Powered by Astropy Badge - -

Which is available at the URL http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat. If your code is hosted on github, You can place the following in your README.md file to get the badge:

- - - [![astropy](http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat)](http://www.astropy.org/) - - -
- - - -
- - - diff --git a/affiliated/index.html b/affiliated/index.html deleted file mode 100644 index 2f9d12c2..00000000 --- a/affiliated/index.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - - - - - - - - - -Astropy | Affiliated Packages - - - - - - - -
- -
- - - -

Astropy Affiliated Packages

- -

A major part of the Astropy Project is the concept of “Astropy - affiliated packages”. An affiliated package is an astronomy-related Python - package that is not part of the astropy core package, and is not managed by - the project but is a part of the Astropy Project community. These packages - demonstrate a commitment to Astropy’s goals of improving reuse, - interoperability, and interface standards for Python astronomy and - astrophysics packages. In many (but not all) cases, affiliated packages - also follow similar development processes and package templates as for the - core package.

- -

If you are a developer interested in signing up as an affiliated package, - details are in the Becoming an - Affiliated Package section.

- -

Astropy Coordinated Packages

- -

A related concept is that of “Astropy coordinated packages”. Coordinated - packages are similar to affiliated packages, but the Astropy Project as a - whole maintains them. In practice this means the Astropy coordination - committee has administrative control of a coordinated package repository - (delegated to the maintainers), and that maintainers of these packages have - formal roles in the Astropy Project. The most - prominent of these coordinated packages is the Astropy core package itself. - In some cases these are packages identified by the core team as needing - development separate from the core (either they are experimental or problem - space-focused), while others started as affiliated packages but have become - so important to the ecosystem that they grew to become coordinated.

- -

Astropy Infrastructure Packages

- -

One final related category are the "Astropy infrastructure packages". - These packages are those that are necessary infrastructure for Astropy - packages - e.g. testing and documentation machinery. While occasionally - these have astro-specific functionality, in general they are more generic - packages that are useful to packages outside of astronomy, and as a result - may have some maintainers outside the Astropy project. But some are also - Astropy coordinated packages, with maintainers drawn from the infrastructure - roles. -

- -
- -
- -

Installing Affiliated and Coordinated Packages

- -

All packages should be available on PyPI. Some are available via conda, particularly - through the conda-forge channel. That said, affiliated packages are developed - independently of the Astropy core library. You should refer to the package's - documentation first if you encounter problems.

- -
- - -
-

Coordinated Packages

-

The following table lists all current Astropy coordinated packages.

-

Total number of coordinated packages:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Loading...    
  
- -
- -
-

Affiliated Packages Registry

-

The following table lists all currently registered affiliated packages.

-

NOTE: The listing is currently minimal because Astropy has just accepted - APE 22 - in January 2024. We are in the midst of transitioning to the new process in - partnership with pyOpenSci, so we really appreciate your patience. -

- -

Total number of post-APE 22 affiliated packages:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
  
  
- - -

All accepted pyOpenSci packages available here.

- -

All currently under review packages via pyOpenSci available here.

-
- -
-

Affiliated Packages Registry (Pre-APE 22)

- -

This section contains the listing of Astropy Affiliated Packages that pre-dated - APE 22. -This section is frozen as of March 6, 2024.

- -

Total number of pre-APE 22 affiliated packages:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Loading...    
  
- -
- -
- -

Becoming an Affiliated Package

- -

Astropy uses the pyOpenSci peer review process - to vet affiliated packages. If you are a developer of an astronomy package and would like your package to become - affiliated with the Astropy Project, you submit your package directly to pyOpenSci. - Astropy will be involved in the review, which will allow your package to become an - affiliated package through that review process. You can also opt to be fast tracked through - JOSS if desired. Read the pyOpenSci author guide to learn - - how to get started with submitting a package to pyOpenSci through their affiliated partner program Guidebook. -

- -

In addition to pyOpenSci criteria, we also apply - - Astropy-specific guidelines for reviewing affiliated packages. - This will give you a - sense of whether your package is ready for review. Broadly speaking, your - package should:

- -
    - -
  • Comply with general pyOpenSci review standards. Please see Peer Review Guide for Python Open Source Authors for more details.
  • - -
  • Be potentially useful to astronomers. This can mean useful to a - specific sub-domain of astronomy, or more broadly useful to a large - fraction of astronomy (or beyond, as long as it is also useful for - astronomy).
  • - -
  • Specifically use, interface with, or provide complementary capabilities - to other Astropy packages.
  • - -
  • Use classes and functions from the - astropy core package wherever possible and appropriate, and (as much as - possible) avoid duplication with other packages in the Astropy ecosystem. - This facilitates re-use of code and sharing of resources.
  • - -
  • Be open to contributions from others. While this most straightforwardly - means it follows a Github-based open development model (like the Astropy core - package), alternative approaches are perfectly valid as long as they are - consistent with basic principles of open source; e.g., - an OSI-approved license.
  • - -
  • Include instructions to users on how to cite your package. This is commonly done - with a CITATION file. This file could include a Zenodo record (highly recommended), - acknowledgement text, and/or journal article(s). Where possible, full BibTeX entries of - these citations are recommended.
  • - -
  • Include citations to other relevant papers and software following - leading - practices for citing astronomy software.
  • - -
-

- -

In addition, you should make an effort to connect with the Astropy - developer community, including developers from the core astropy package or - any related affiliated packages. If your package is determined to meet the above - standards, it will be accepted and added to the affiliated package registry. - Note however that if packages become unmaintained or do not meet the standards - anymore, they may be removed from the list of affiliated packages, as per pyOpenSci policy.

- -

Package Template

-

If you are considering creating a new astronomy package and would like it - to be an Astropy affiliated package, you can use the OpenAstronomy packaging guide to - make it much easier to meet these standards. It reflects up-to-date Python packaging techniques - to generate documentation like that used in the astropy package, a - ready-to-use testing framework, and a variety of tools that streamline tasks - like user configuration, caching downloaded files, or linking C-compiled - extensions. More details on this template are available in the usage - instructions for the template. -

- -

Additionally, it is also acceptable to use -pyOpenSci Python Package Guide -if you think that better suits your package needs.

- -

We recommend that you join the astropy-affiliated-maintainers mailing list to be kept informed of any dicussions related to affiliated packages.

- -
- -
- -

Affiliated Package: FAQs

- -

I want my package to be Astropy Affiliated

- -

Thank you for your interest! Please see Becoming an Affiliated Package above. When in doubt, feel free to contact Astropy Affiliated Editors for advice.

- -

I no longer have time to maintain my Astropy Affiliated package

- -

Please contact pyOpenSci, as per Peer Review Guidelines & Policies.

- -

I want to delist my package as Astropy Affiliated

- -

Please see Requesting package removal from the pyOpenSci ecosystem.

- -

I am a new Editor

- -

Welcome and thank you! We usually do not switch out all our Editors at the same time, - so the incumbent co-Editor could help you contact pyOpenSci to add you to - pyOpenSci editorial board - with the understanding that we are taking the person you are replacing off that board - and that your role is Astropy- and astronomy-focused.

- -

Your name would also be added to Astropy Team under the same role.

- -

I am a new reviewer

- -

Welcome and thank you! Please submit the sign-up form that can be found under -Become a pyOpenSci reviewer. Do not forget to check "Astropy"/"astronomy"/"astrophysics" -when you see them as options.

- -

It is important that you understand your reviews will be done in public. There is no option to remain anonymous.

- -
- - -
- - - - - - - - - - - -
-

- - The Astropy Project is committed to fostering an inclusive community. -

- -
- -
- - - diff --git a/affiliated/registry.json b/affiliated/registry.json deleted file mode 100644 index 72b308cb..00000000 --- a/affiliated/registry.json +++ /dev/null @@ -1,1092 +0,0 @@ -{ - "packages": [ - { - "name": "regularizePSF", - "maintainer": "Marcus Hughes ", - "stable": true, - "home_url": "https://punch-mission.github.io/regularizepsf/", - "repo_url": "https://github.com/punch-mission/regularizepsf", - "pypi_name": "regularizepsf", - "description": "regularizePSF is a package for manipulating and correcting variable point spread functions in astronomical images", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2023-04-21" - } - }, - { - "name": "BayesicFitting", - "maintainer": "Do Kester and Migo Mueller ", - "stable": true, - "home_url": "https://bayesicfitting.nl/", - "repo_url": "https://github.com/dokester/BayesicFitting", - "pypi_name": "BayesicFitting", - "description": "General purpose toolbox for Bayesian fitting and evidence calculation.", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2021-11-25" - } - }, - { - "name": "PyCBC", - "maintainer": "Alexander Harvey Nitz ", - "stable": true, - "home_url": "https://pycbc.org/", - "repo_url": "https://github.com/gwastro/pycbc", - "pypi_name": "pycbc", - "description": "Core package to analyze gravitational-wave data, find signals, and study their parameters.", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2021-10-22" - } - }, - { - "name": "SpectraPy", - "maintainer": "Marco Fumana ", - "stable": true, - "home_url": "https://mcfuman.gitlab.io/SpectraPy/", - "repo_url": "https://gitlab.com/mcfuman/SpectraPy/", - "pypi_name": "", - "description": "SpectraPy is a Python3 library, which collects algorithms and methods for data reduction of astronomical spectra obtained by a through slits spectrograph. The library is designed to be spectrograph independent. Current implementation is focused on the extraction of 2D spectra.", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Functional but low activity", - "python3": "Yes", - "last-updated": "2021-10-14" - } - }, - { - "name": "statmorph", - "maintainer": "Vicente Rodriguez-Gomez ", - "stable": true, - "home_url": "https://statmorph.readthedocs.io/", - "repo_url": "https://github.com/vrodgom/statmorph", - "pypi_name": "statmorph", - "description": "A Python package for calculating non-parametric morphological diagnostics of galaxy images, as well as fitting 2D Sérsic profiles.", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2021-01-12" - } - }, - { - "name": "lenstronomy", - "maintainer": "Simon Birrer, Anowar Shajib, and Daniel Gilman ", - "stable": true, - "home_url": "https://lenstronomy.readthedocs.io", - "repo_url": "https://github.com/lenstronomy/lenstronomy", - "pypi_name": "lenstronomy", - "description": "Multi-purpose gravitational lensing and image modeling package", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2020-07-24" - } - }, - { - "name": "astropy core package", - "maintainer": "Astropy Coordination Committee", - "stable": true, - "home_url": "https://docs.astropy.org", - "repo_url": "https://github.com/astropy/astropy", - "pypi_name": "astropy", - "description": "A common core package for Astronomy in Python.", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2019-6-5" - } - }, - { - "name": "specutils", - "maintainer": "Ricky O'Steen, Adam Ginsburg, Erik Tollerud and Kelle Cruz ", - "stable": false, - "home_url": "https://specutils.readthedocs.io", - "repo_url": "https://github.com/astropy/specutils", - "pypi_name": "specutils", - "description": "Coordinated package for analysis tools and basic data types of astronomical spectra.", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2018-12-04" - } - }, - { - "name": "specreduce", - "maintainer": "Tim Pickering, Erik Tollerud, Kyle Conroy, Clare Shanahan, and Hannu Parviainen ", - "stable": false, - "home_url": "https://specreduce.readthedocs.io", - "repo_url": "https://github.com/astropy/specreduce", - "pypi_name": "specreduce", - "description": "Coordinated package to provide a data reduction toolkit for optical and infrared spectroscopy, on which applications such as pipeline processes for specific instruments can be built.", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2022-05-05" - } - }, - { - "name": "astroquery", - "maintainer": "Adam Ginsburg and Brigitta Sipőcz ", - "stable": true, - "home_url": "https://astroquery.readthedocs.io", - "repo_url": "https://github.com/astropy/astroquery", - "pypi_name": "astroquery", - "description": "Tools for querying online astronomical data sources.", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "photutils", - "maintainer": "Larry Bradley ", - "stable": false, - "home_url": "https://photutils.readthedocs.io/", - "repo_url": "https://github.com/astropy/photutils", - "pypi_name": "photutils", - "description": "Photometry and related image-processing tools.", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "asdf-astropy", - "maintainer": "Brett Graham, Nadia Dencheva, Perry Greenfield, and Stuart Mumford ", - "stable": true, - "home_url": "https://asdf-astropy.readthedocs.io/en/latest/", - "repo_url": "https://github.com/astropy/asdf-astropy", - "pypi_name": "asdf-astropy", - "description": "ASDF format support for astropy.", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2022-05-19" - } - }, - { - "name": "ginga", - "maintainer": "Eric Jeschke and Pey Lian Lim ", - "stable": true, - "home_url": "https://ejeschke.github.io/ginga", - "repo_url": "https://github.com/ejeschke/ginga", - "pypi_name": "ginga", - "description": "Ginga is a Python toolkit for building viewers for astronomical and scientific images stored in numpy data arrays and displaying them on a variety of different display platforms. The toolkit provides many features for building a viewer, including a flexible plugin framework that is provided as a customizable reference viewer for FITS images.", - "image": "https://ejeschke.github.io/ginga/images/Ginga_screenshot_MacOSX-1024x613.jpg", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "astroML", - "maintainer": "Jake Vanderplas and Brigitta Sipőcz ", - "stable": true, - "home_url": "http://www.astroml.org/", - "repo_url": "https://github.com/astroML/astroML", - "pypi_name": "astroML", - "description": "Tools for machine learning and data mining in Astronomy.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2019-10-06" - } - }, - { - "name": "PyDL", - "maintainer": "Benjamin Alan Weaver ", - "stable": false, - "home_url": "https://pydl.readthedocs.io", - "repo_url": "https://github.com/weaverba137/pydl", - "pypi_name": "pydl", - "image": null, - "description": "Python replacements for functions that are part of the IDL built-in library, or part of astronomical IDL libraries. The emphasis is on reproducing results of the astronomical library functions. Only the bare minimum of IDL built-in functions are implemented to support this.", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Needs work", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "APLpy", - "maintainer": "Thomas Robitaille and Eli Bressert ", - "stable": true, - "home_url": "https://aplpy.github.io", - "repo_url": "https://github.com/aplpy/aplpy", - "pypi_name": "APLpy", - "description": "A Python module aimed at producing publication-quality plots of astronomical imaging data in FITS format. The module uses Matplotlib, a powerful and interactive plotting package. It is capable of creating output files in several graphical formats, including EPS, PDF, PS, PNG, and SVG.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Functional but low activity", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "reproject", - "maintainer": "Thomas Robitaille, Stuart Mumford, and Sam Van Kooten ", - "stable": true, - "home_url": "https://reproject.readthedocs.io", - "repo_url": "https://github.com/astropy/reproject", - "pypi_name": "reproject", - "image": null, - "description": "Python-based astronomical image reprojection.", - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "PyVO", - "maintainer": "Adrian Damian, Brigitta Sipőcz, Manon Marchand, Markus Demleitner, and Tom Donaldson", - "stable": true, - "home_url": "https://pyvo.readthedocs.io/", - "repo_url": "https://github.com/astropy/pyvo", - "pypi_name": "pyvo", - "description": "Access to the Virtual Observatory through Python using IVOA Standards.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2019-10-06" - } - }, - { - "name": "gammapy", - "maintainer": "Axel Donath and Régis Terrier ", - "stable": false, - "home_url": "https://gammapy.org", - "repo_url": "https://github.com/gammapy/gammapy", - "pypi_name": "gammapy", - "description": "A Python package for gamma-ray astronomy", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "ccdproc", - "maintainer": "Matt Craig ", - "stable": true, - "home_url": "https://ccdproc.readthedocs.io", - "repo_url": "https://github.com/astropy/ccdproc", - "pypi_name": "ccdproc", - "description": "Package to do basic CCD data reduction.", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "sncosmo", - "maintainer": "Kyle Barbary", - "stable": true, - "home_url": "https://sncosmo.readthedocs.io", - "repo_url": "https://github.com/sncosmo/sncosmo", - "pypi_name": "sncosmo", - "image": "https://avatars1.githubusercontent.com/u/5490746?v=3&s=500", - "description": "Supernova light curve models in Python. SNCosmo synthesizes supernova spectra and photometry from SN models, and has functions for fitting and sampling SN model parameters given photometric light curve data. It includes built-in supernova models such as the SALT2, MLCS2k2, Hsiao, Nugent, PSNID, SNANA and Whalen models, a variety of built-in bandpasses and magnitude systems, and allows custom models, bandpasses, and magnitude systems to be defined.", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "Glue", - "maintainer": "Chris Beaumont and Thomas Robitaille ", - "stable": true, - "home_url": "http://www.glueviz.org", - "repo_url": "https://github.com/glue-viz/glue", - "pypi_name": "glueviz", - "image": null, - "description": "Linked data visualizations across multiple files.", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "pyregion", - "maintainer": "Jae-Joon Lee", - "stable": true, - "home_url": "https://pyregion.readthedocs.io", - "repo_url": "https://github.com/astropy/pyregion", - "pypi_name": "pyregion", - "image": null, - "description": "Python module to parse DS9 and CIAO region files.", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "imexam", - "maintainer": "Megan Sosey", - "stable": false, - "home_url": "https://imexam.readthedocs.io", - "repo_url": "https://github.com/spacetelescope/imexam", - "pypi_name": "imexam", - "description": "A package for functionality like IRAF's imexamine.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "spherical_geometry", - "maintainer": "Mihai Cara", - "stable": false, - "home_url": "https://spherical-geometry.readthedocs.io", - "repo_url": "https://github.com/spacetelescope/spherical_geometry", - "pypi_name": "spherical-geometry", - "image": null, - "description": "Python package for handling spherical polygons that represent arbitrary regions of the sky.", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Needs work", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Functional but low activity", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "gwcs", - "maintainer": "Nadia Dencheva", - "stable": false, - "home_url": "https://gwcs.readthedocs.io", - "repo_url": "https://github.com/spacetelescope/gwcs", - "pypi_name": "gwcs", - "image": null, - "description": "Package for managing the world coordinate system (WCS) of astronomical data.", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "spectral-cube", - "maintainer": "Adam Ginsburg and Eric Koch", - "stable": true, - "home_url": "https://spectral-cube.readthedocs.io", - "repo_url": "https://github.com/radio-astro-tools/spectral-cube", - "pypi_name": "spectral-cube", - "image": null, - "description": "Library for reading and analyzing astrophysical spectral data cubes.", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "astroplan", - "maintainer": "Brett Morris", - "stable": false, - "home_url": "https://astroplan.readthedocs.io/", - "repo_url": "https://github.com/astropy/astroplan", - "pypi_name": "astroplan", - "description": "An open source Python package to help astronomers plan observations.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "Astro-SCRAPPY", - "maintainer": "Curtis McCully ", - "stable": true, - "home_url": "https://github.com/astropy/astroscrappy", - "repo_url": "https://github.com/astropy/astroscrappy", - "pypi_name": "astroscrappy", - "description": "A high-performance package to detect and remove cosmic rays from astronomical images.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Needs work", - "testing": "Partial", - "devstatus": "Functional but low activity", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "naima", - "maintainer": "Victor Zabalza ", - "stable": true, - "home_url": "https://naima.readthedocs.io/", - "repo_url": "https://github.com/zblz/naima", - "pypi_name": "naima", - "description": "Derivation of non-thermal particle distributions through MCMC spectral fitting.", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "omnifit", - "maintainer": "Aleksi Suutarinen ", - "stable": true, - "home_url": "https://ricemunk.github.io/omnifit/", - "repo_url": "https://github.com/RiceMunk/omnifit", - "pypi_name": "omnifit", - "image": null, - "description": "Package for doing astronomical spectroscopy fitting of interstellar ices.", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Partial", - "testing": "Good", - "devstatus": "Functional but low activity", - "python3": "Yes", - "last-updated": "2022-01-12" - } - }, - { - "name": "gala", - "maintainer": "Adrian Price-Whelan ", - "stable": true, - "home_url": "http://gala.adrian.pw/en/latest/", - "repo_url": "https://github.com/adrn/gala", - "pypi_name": "gala", - "image": null, - "description": "A Python package for gravitational and galactic dynamics. gala contains functionality for representing gravitational potential models, numerically integrating orbits, and non-linear dynamics. gala also relies heavily on Astropy's unit and coordinates subpackages. (Note: this was previously listed on pypi as 'astro-gala', and older versions can still be installed with that name)", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "galpy", - "maintainer": "Jo Bovy", - "stable": true, - "home_url": "https://galpy.readthedocs.io/en/latest/", - "repo_url": "https://github.com/jobovy/galpy", - "pypi_name": "galpy", - "image": null, - "description": "A Python 2 and 3 package for galactic dynamics.", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "HENDRICS", - "maintainer": "Matteo Bachetti ", - "stable": true, - "repo_url": "https://github.com/StingraySoftware/HENDRICS", - "home_url": "https://hendrics.readthedocs.io", - "pypi_name": "hendrics", - "description": "Spectral-timing analysis of X-ray data from the command line (formerly known as MaLTPyNT).", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "Halotools", - "maintainer": "Andrew Hearin, Nick van Alfen ", - "stable": true, - "home_url": "https://halotools.readthedocs.io", - "repo_url": "https://github.com/astropy/halotools", - "pypi_name": "halotools", - "description": "Generate Monte Carlo realizations of mock galaxy populations using cosmological simulations.", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "cluster-lensing", - "maintainer": "Jes Ford", - "stable": false, - "repo_url": "https://github.com/jesford/cluster-lensing", - "home_url": "https://jesford.github.io/cluster-lensing", - "pypi_name": "cluster-lensing", - "description": "Galaxy cluster properties and NFW profiles (with miscentering option).", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "marxs", - "maintainer": "Hans Moritz G\u00fcnther (hamogu)", - "stable": true, - "repo_url": "https://github.com/Chandra-MARX/marxs", - "home_url": "https://marxs.readthedocs.io/", - "pypi_name": "marxs", - "description": "Multi-Architecture-Raytrace-Xraymission-Simulator (MARXS) is a toolsuite to ray-trace X-ray observatories. It is primarily aimed at astronomical X-ray satellites and sounding rocket payloads, but can be used to ray-trace experiments in the laboratory as well.", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "pyspeckit", - "maintainer": "Adam Ginsburg ", - "stable": true, - "home_url": "https://pyspeckit.readthedocs.io", - "repo_url": "https://github.com/pyspeckit/pyspeckit", - "pypi_name": "pyspeckit", - "description": "A toolkit for spectroscopic input/output, plotting, fitting, and manipulation.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "linetools", - "maintainer": "J. Xavier Prochaska, Nicolas Tejos, and Neil Crighton", - "stable": true, - "home_url": "https://linetools.readthedocs.io", - "repo_url": "https://github.com/linetools/linetools", - "pypi_name": "linetools", - "description": "Package for the analysis of 1-D spectra for astronomy.", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "poliastro", - "maintainer": "Juan Luis Cano Rodr\u00edguez", - "stable": false, - "repo_url": "https://github.com/poliastro/poliastro", - "home_url": "http://docs.poliastro.space", - "pypi_name": "poliastro", - "description": "Astrodynamics and Orbital Mechanics computations", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Partial", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "hips", - "maintainer": "Thomas Boch", - "stable": false, - "repo_url": "https://github.com/hipspy/hips", - "home_url": "https://hips.readthedocs.io", - "pypi_name": "hips", - "description": "A Python astronomy package for HiPS : Hierarchical Progressive Surveys.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Partial", - "testing": "Good", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "regions", - "maintainer": "Larry Bradley and Adam Ginsburg ", - "stable": false, - "repo_url": "https://github.com/astropy/regions", - "home_url": "https://astropy-regions.readthedocs.io", - "pypi_name": "regions", - "description": "A Python astronomy package for region handling, including serialization (input and output) and masking.", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "synphot", - "maintainer": "Pey Lian Lim", - "stable": true, - "home_url": "https://synphot.readthedocs.io", - "repo_url": "https://github.com/spacetelescope/synphot_refactor", - "pypi_name": "synphot", - "description": "A Python astronomy package for synthetic photometry.", - "image": "http://synphot.readthedocs.io/en/latest/_images/spectrum-2.png", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2017-11-08" - } - }, - { - "name": "astropy-healpix", - "maintainer": "Leo Singer and Thomas Robitaille ", - "stable": false, - "repo_url": "https://github.com/astropy/astropy-healpix", - "home_url": "https://astropy-healpix.readthedocs.io/", - "pypi_name": "astropy-healpix", - "description": "A BSD-licensed HEALPix implementation for Astropy", - "image": null, - "coordinated": true, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2017-11-27" - } - }, - { - "name": "dust_extinction", - "maintainer": "Karl Gordon", - "stable": false, - "repo_url": "https://github.com/karllark/dust_extinction", - "home_url": "http://dust-extinction.readthedocs.io", - "pypi_name": "dust_extinction", - "description": "Interstellar dust extinction curves", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Partial", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2018-5-25" - } - }, - { - "name": "feets", - "maintainer": "Juan B Cabral ", - "stable": true, - "repo_url": "https://github.com/carpyncho/feets", - "home_url": "http://feets.readthedocs.io", - "pypi_name": "feets", - "description": "feATURE eXTRACTOR FOR tIME sERIES.", - "image": "https://github.com/carpyncho/feets/raw/master/res/logo_medium.png", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2018-11-27" - } - }, - { - "name": "corral", - "maintainer": "Toros Survey Team", - "stable": true, - "repo_url": "https://github.com/toros-astro/corral", - "home_url": "http://corral.readthedocs.io/", - "pypi_name": "corral-pipeline", - "description": "Corral will solve your pipeline needs by merging a database full connection interface with a MVC model, by making you able of editing your custom schemas and adding the possibility of writting specific processing steps following a intuitive data handling model.", - "image": null, - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Partial", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2018-8-21" - } - }, - { - "name": "baseband", - "maintainer": "Marten H. van Kerkwijk ", - "stable": true, - "home_url": "https://baseband.readthedocs.io", - "repo_url": "https://github.com/mhvk/baseband", - "pypi_name": "baseband", - "description": "Radio baseband IO: readers and writers for VLBI and other baseband data formats.", - "image": null, - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2018-11-27" - } - }, - { - "name": "sbpy", - "maintainer": "Michael S. P. Kelley, Henry Hsieh, and Jian-Yang Li ", - "stable": false, - "home_url": "https://sbpy.org", - "repo_url": "https://github.com/NASA-Planetary-Science/sbpy", - "pypi_name": "sbpy", - "description": "A Python Module for Small-Body Planetary Astronomy", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Good", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2019-06-18" - } - }, - { - "name": "EinsteinPy", - "maintainer": "Shreyas Bapat, Ritwik Saha, Bhavya Bhatt, and Priyanshu Khandelwal ", - "stable": true, - "home_url": "https://einsteinpy.org", - "repo_url": "https://github.com/einsteinpy/einsteinpy", - "pypi_name": "einsteinpy", - "description": "A Python Package for General Relativity and Gravitational Astronomy", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2019-07-23" - } - }, - { - "name": "astroalign", - "maintainer": "Martin Beroiz ", - "stable": true, - "home_url": "http://astroalign.readthedocs.io/", - "repo_url": "https://github.com/quatrope/astroalign", - "pypi_name": "astroalign", - "description": "Astrometric registration of images when no WCS info is available", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2019-08-15" - } - }, - { - "name": "mocpy", - "maintainer": "François-Xavier Pineau , Matthieu Baumann , and Thomas Boch ", - "stable": true, - "home_url": "https://cds-astro.github.io/mocpy/", - "repo_url": "https://github.com/cds-astro/mocpy", - "pypi_name": "mocpy", - "description": "MOCPy is a Python library allowing easy creation, parsing and manipulation of MOCs (Multi-Order Coverage maps). These coverage maps heavily rely on the HEALPix sky partionning scheme. A MOC is therefore a set of HEALPix cells at different orders. This allows the description of any arbitrary maps on the sky.", - "coordinated": false, - "review": { - "functionality": "General package", - "ecointegration": "Partial", - "documentation": "Partial", - "testing": "Partial", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2019-11-04" - } - }, - { - "name": "ligo.skymap", - "maintainer": "Leo Singer ", - "stable": true, - "home_url": "http://lscsoft.docs.ligo.org/ligo.skymap/", - "repo_url": "https://git.ligo.org/lscsoft/ligo.skymap", - "pypi_name": "ligo.skymap", - "description": "Read, write, generate, simulate, and visualize LIGO/Virgo gravitational-wave probability sky maps.", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Good", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2020-07-01" - } - }, - { - "name": "agnpy", - "maintainer": "Cosimo Nigro ", - "stable": true, - "home_url": "https://agnpy.readthedocs.io/en/latest/", - "repo_url": "https://github.com/cosimoNigro/agnpy", - "pypi_name": "agnpy", - "description": "Modelling Active Galactic Nuclei radiative processes with python. agnpy focuses on the numerical computation of the photon spectra produced by leptonic radiative processes in jetted Active Galactic Nuclei (AGN).", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Partial", - "documentation": "Good", - "testing": "Good", - "devstatus": "Heavy development", - "python3": "Yes", - "last-updated": "2020-07-13" - } - }, - { - "name": "kanon", - "maintainer": "Léni Gauffier ", - "stable": true, - "home_url": "https://kanon.readthedocs.io/", - "repo_url": "https://github.com/legau/kanon", - "pypi_name": "kanon", - "description": "History of astronomy package, historical geocentric models and number systems", - "coordinated": false, - "review": { - "functionality": "Specialized package", - "ecointegration": "Good", - "documentation": "Partial", - "testing": "Good", - "devstatus": "Good", - "python3": "Yes", - "last-updated": "2022-02-05" - } - } - ] -} diff --git a/affiliated/validate_registry.py b/affiliated/validate_registry.py deleted file mode 100644 index a0e2b424..00000000 --- a/affiliated/validate_registry.py +++ /dev/null @@ -1,135 +0,0 @@ -import os -import sys -import json -from termcolor import cprint -from datetime import datetime - -import requests - -REQUIRED_KEYS = {'name', 'maintainer', 'stable', 'home_url', 'repo_url', 'coordinated'} - -OPTIONAL_KEYS = {'provisional', 'stable', 'pypi_name', 'image', 'review', 'description'} - -ALL_KEYS = REQUIRED_KEYS | OPTIONAL_KEYS - -REVIEW_KEYS = {'functionality', 'ecointegration', 'documentation', 'testing', - 'devstatus', 'python3', 'last-updated'} - -REVIEW_FUNCTIONALITY = {'Specialized package', 'General package'} -REVIEW_DEVSTATUS = {'Unmaintained', 'Functional but low activity', - 'Functional but unmaintained', 'Heavy development', 'Good'} -REVIEW_PYTHON3 = {'No', 'Yes'} -REVIEW_GENERIC = {'Needs work', 'Partial', 'Good'} - - -jsonfn = os.path.join(os.path.dirname(__file__), "registry.json") -try: - registry = json.load(open(jsonfn)) -except json.decoder.JSONDecodeError as e: - cprint(jsonfn + ' : ' + e.args[0], color='red') - cprint("*** JSON file appears to be malformed - see above ***", color='red') - sys.exit(2) - -error = 0 - -for package in registry['packages']: - - if 'name' in package: - name = package['name'] - else: - cprint("ERROR: Missing package name: {0}".format(package), file=sys.stderr, color='red') - error += 1 - continue - - cprint("Checking {0}".format(name), color='blue') - - print(" - verifying keys") - - difference = set(package.keys()) - (REQUIRED_KEYS | OPTIONAL_KEYS) - if difference: - cprint(f" ERROR: Unrecognized key(s) for {name}: {difference}. " - f"Valid options are {', '.join(ALL_KEYS)}", file=sys.stderr, color='red') - error += 1 - - difference = REQUIRED_KEYS - set(package.keys()) - if difference: - cprint(f" ERROR: Missing key(s) for {name}: {difference}", file=sys.stderr, color='red') - error += 1 - - # Check that URLs work - - print(" - verifying URLs") - - try: - r = requests.get(package['home_url']) - assert r.ok - except Exception: - cprint(f" ERROR: Home URL for {name} - {package['home_url']} - did not work", file=sys.stderr, color='red') - error += 1 - - try: - r = requests.get(package['repo_url']) - assert r.ok - except Exception: - cprint(f" ERROR: Repository URL for {name} - {package['repo_url']} - did not work", file=sys.stderr, color='red') - error += 1 - - if package.get('pypi_name'): - - print(" - verifying PyPI name") - - r = requests.get(f"https://pypi.python.org/pypi/{package['pypi_name']}/json") - if not r.ok: - cprint(f" ERROR: PyPI package {package['pypi_name']} doesn't appear to exist", file=sys.stderr, color='red') - error += 1 - - if package.get('review'): - - print(" - verifying review") - - review = package['review'] - - difference = set(review.keys()) - REVIEW_KEYS - if difference: - cprint(f" ERROR: Unrecognized review key(s) for {name}: {difference}. " - f"Valid options are {', '.join(REVIEW_KEYS)}", file=sys.stderr, color='red') - error += 1 - - difference = REVIEW_KEYS - set(review.keys()) - if difference: - cprint(f" ERROR: Missing review key(s) for {name}: {difference}", file=sys.stderr, color='red') - error += 1 - - for key, value in review.items(): - - if key == 'functionality': - if value not in REVIEW_FUNCTIONALITY: - cprint(f" ERROR: Invalid functionality in review for {name}: '{value}'. " - f"Valid options are {', '.join(REVIEW_FUNCTIONALITY)}", file=sys.stderr, color='red') - error += 1 - elif key == 'last-updated': - try: - dt = datetime.strptime(value, "%Y-%m-%d") - except Exception: - cprint(f" ERROR: Could not parse date: '{value}'", file=sys.stderr, color='red') - error += 1 - elif key == 'devstatus': - if value not in REVIEW_DEVSTATUS: - cprint(f" ERROR: Invalid devstatus in review for {name}: '{value}'. " - f"Valid options are {', '.join(REVIEW_DEVSTATUS)}", file=sys.stderr, color='red') - error += 1 - elif key == 'python3': - if value not in REVIEW_PYTHON3: - cprint(f" ERROR: Invalid python3 in review for {name}: '{value}'. " - f"Valid options are {', '.join(REVIEW_PYTHON3)}", file=sys.stderr, color='red') - error += 1 - else: - if value not in REVIEW_GENERIC: - cprint(f" ERROR: Invalid {key} in review for {name}: '{value}'. " - f"Valid options are {', '.join(REVIEW_GENERIC)}", file=sys.stderr, color='red') - error += 1 - -if error > 0: - sornot = 's' if error > 1 else '' - cprint(f"** {error} error{sornot} occurred - see above for details **", file=sys.stderr, color='red') - sys.exit(1) diff --git a/annoucement_banner.html b/annoucement_banner.html deleted file mode 100644 index e69de29b..00000000 diff --git a/announcements/astropy_logo_notext.png b/announcements/astropy_logo_notext.png deleted file mode 100644 index bcff0ed69dfd4de115cf4ba8e2c17c4dfb03bb7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12730 zcmZX5bx<6<^EYs~mf{YjSfSYA?#@Ah2lp1Y!#UjD-CbJT3Wr;<;_h%1ryTD3_B-#N zzs&4rva^$9H@lzAWHwRiAbA{2a!dpS1RO;L8I6Da`u_+W^&h9up9=cdA-hT`YN7vY zzUbc~|BW%g3VN>p^q2leh*HcsUjKw-ZnC;=nogE(o@Oo<2%esv>^6>eu3yc-7VJ(g zRyn64YN!qf29R3Gn@w1Oq3PAXj#p{f!COBxRox6JX{xdSH; ztE|#xjsL7+G-g@kcow&%Hn%4Z$&%L@#6Q5^<;;Du%SzYo%(d>yziV*}JPBEBy4@`3 z+P8|Te9r`;^gM^aC2|ES2%P%{qjo<0Uk>T=pp93KP41MSD?Gmt$3jF2Bs6{NIr3M% z8XulRh*HDaHKoM=57qXY(tm-)-w1W2BDL|7i~~WdDAkDCG-_2)6HhYMVH+7kuwam9 z8NxKFHRgOj{(tV2W{?G?l|e;Bp%0-Dw*@%$LkfK)7CSK+%U;lauk7%fNWrunbDbWB zieP^EMIfWkiJA&Ni6I-O#xdZt0869orVt?m6U`4EQ#vLTffz^cW%@evU?{8;Ms8bDl1@qNR8lDc=j1@0~0+K?gy0 zT^@tv78F9}0A?eO9jk^bBpWQlQBDYfSMsL!v|U6$UAHKcaJV9G_$X=W)|XmYx~1~c zJ*F|E?;^V#ewR(l{b(Y{Y+o}CkADKU-_>mgbE*6Ws397CxrD&uSx@xyFSg2#`_fIi zE*N+!0h*+rN&@8}3U?5=y2md&=s0%Td+fA>FN-DDBWdPX`U5p1_gxw{optU_YQeKa z7AQ_53+3!dpa1Z#V{9ghNI1c43QLDKy`(SY1k#Zn;_=$kLD!1~>H;h4HOMM3cQU|r zQQhh7cm-SJ5*VRQ`NMDfR61scudo{U7mekv%UyStJb*1!^9YG;+uerrTr)wi3+1l; z<9Yiv8u7OM={O|QKX48&H&yZ4SUsssi5W=tVM*54=(F=9remaGU?cjTUaBwGd19vb zfV{kS9}zQ7*kpa8;=6I)Wjf z5wJ!(b?Hg{PKKXvZ&fFw6+rZ`Vz|@e@cR9_-7Gn27%-R8XZd>r!tn-*PAAr@mX-SM za?nlyszR0yby_W6z~24Mz#V|s>p!8($kU72q`9v)OH~@AUI6HnosLM+7aHjG&4_=8 z9Yd@m`YR`E#IkR-HURFWwFKFdICav%Nnd5YQa`=w?AiP8H^t!U@vQrH`jPs*iqliN zr2s|dnCXwRG(cNNI0YLO*yBBkyXcv2dv%m&U)!C~l^up`uDIGqlgO^<5aI1LP`ypI zs@jIR@O1JU)MRcC)YtU^5=0Ut-|4}yKbnH@5Ff+24MoS&3EZEO2xBDcsj}gG!N}wn z*m*nPK-B5M+avGIt~0wpU+(DZ;+7dQk-(y!n{c$uenP%$Ohpp|=tJO2lX8U*n$yMN z3g!93#|@kpjsop8m&Adflp>8WHxqSTaSY-f916yu#|<|TACTB(RbULn@XeX^?>YlC zqYUL7g^}KTuXv0Af1x(?uUL3+)*l+UG0v7-XgZ+i7N;+u#}mNjkCxtz7h%pV^k@## zp!Q@kbvVUeSDq#D3Y&ANq&NJ~wlVlgI-)_n$a(1Pj>dKWUW)F9v-%mExC>>?oc+_L z3QQ@#zNeM_0P9qiB@)Q#(lngE>v*{v!5S_(P&>1>`j|uCnN}dJpW0wLA=)jDuyj=# zUN1!J;?e>$PBrhnlNdYc#{88N!6Bf=Ap17!8nf;_w#xqX;(# zhUBtBNlGav4URT7m7Al6St$aw+5ohb0V1|KRmN^?=WIw=8(cUf~408@V-oU_m|#d||V=n@jGPXo%z+Lo(L)oDs`Fg?z;~s(yrV2wx z2)FtCi=lD@u;}2ERZhYh+Z*M}qleW&dj}NPQe_qhme7k}2*0pQx?gxa9NXrH@p|S5W;skMSKeGP)-*8gj<6AK_7r4SQNo)o zV)p0yD2ENNP-p&J!Zoh=v;yk!*$ipa4{}gJk_NMQvDR&OWmH8W%MG*84>e-XSx$?| za8yrdhKZ?fZ=!YFFBP1MDFr%H%;|AElURI;j74&nCr_}4uqU^&aCCP7i+wg6%7lV|Hb0SF)^9_`-3=D;=z zp&N926I27@Vgusd^sok&{>z&rNCUQKgqLILyG!9TkIP~Z`T^P|`Y8qkl@#VZ z#Q1$0VX_VN$1GAMkEbnrt6(FIwqFAK6Xv2ya7o1a9UX$pM$U9+MHS>2ZK?M-s&+ps zo@SQ;$L`yPd*9K{ENZ4ob!=j|RGZL9TV7$`XZ2hAx~|cY8A4rAd?P+$ZPmaMw9czC zQ^nmRUUg`!4}{T4(nKv(+AP5&QzB^f(&dnD&WI>ijGf5&(P3|#jMtKdUY1oN#U~Lp zudvg~N<4J9L7LO)qtI9MlN;;W%A=Q&xU=@0gHF$xIvOzlR7xiuhuxNX&q+4ynrk$s z=~28n(Zl$Q7{1K|XYSGp+5AXUDOJdpxNHSpIDD+>ty}R|#PuW2Ctl1~s+%16!Qyoo_l)uAU?NaImv*w7J~Pcc7rdkARJ`LYT+m8`N|Lo9Sv$ZH z+OtpoGm9&vuz)RH=jK^mMVBO3>=Pt#D=?ALB@TE@w}cb4x;d`m)n6of7&>gW`5nfa z$P%3{Pi=sM5-s?aFNjTbH$6J#2T44gE6na&^?Y%2`^B(-5++Xs`H$b?j^RmFsf^?I zLq0#5T4}#U5-xpWL`JT$IlzjrVMn2KScSQObkk{|Yx1e3N-T8hNZnYb3=G>4+t0o40 zX4&05qYH38)29S(hTimKv+4|@CVENVK4e$?6k}Tv`@4u-fu~H8$|~X{#RnyWxUtOJ zJ5+ra%n@=(5_2u89{ft)*e>obE8a0|J*T06efdX^HE@3<&pFRcNSC5Z1@=PK&wIaM6L72oOtjHWy@~TRE?y201 zj_Mv-3Nq9WROAsNqVFqAF-rf+ST8K)q>se5!U}kYqUk?-uU_#AoMM5VM)sIneO%@U z1)eZV@7S1)CfsIR#Jfclp6Et!oRHt*Yo5~6qy67f+ZuVgsW4N)PY+e4c!~qn>)f9N z;PgnHxfkL_Dif#j?H~ccI|3$debG?E1@ZM(pKG=U%vWRUA#Eu-YvTSzs;jB(1w9L^ zTLkYidgEM$Pr=PT`0PI8H`UVp1*oG2v=CNG;gb_*;iOBF@DF>1)`AC9zLt}$QQ1}b zVW}IOewjXy%Hl22AQ6F;NI{zm+Q%^ps0e)KV-;Q;2FOR5+O&|xhi+#qX8i#p*E8j> z9@=if&w6LRcIWu3JEMU9eAS|e19n}cPx)AB6m(X+!N22*a`_E{O9vXVdx>vHpP1)4s4^4@_*t zO7{(^%|xKE8t})mBO03zymFM9?7*0GfrRCX6ZzHAv&9Jze!c(LB29fi8C%0rSF{Bs zca;tL!)wxG~cc!VY5i@#1C{ny4PrnZkY5mA8Y3f7VWch~HimQfvqwy&{G7Nc=bfA30q zx*dk@xOoeuiaSC)m8NT$zF>iT6eLqC42cY$`oI?lRL2)(XSSf(wR>8%LK84IFLT}@tei+j(%fd>$icV$oCkfL=s^EY}*Po%bv0^_^Ua8GXKtjlMM z{0U!* zPPi_NKviFan#zwuuEgDFn(X&t^JzydFHnPJ0l>owH+VBm{&0K^b z6p!Yvy23!;0vDks`2oTZL?2&BV%3}7n?=K>dbMK83-lzVh#YhjsNd%ktu%MENwiA z1-4eAu&JVN*Eg&nF?+7_bD!jRYB_m#F3)bmpkno{OG+Jm^5-^MZxbxyi2kzTRs!-F zEYMln5VLBv@p|!IA}&X$UW>hgXmGbP&U4%0H?g)jaP5Uj%*@4p{6R{2>vF)COk3^r z+T+Es&xNr5wZKX@%)d|gv{c5SQVg-H^9eo!t9o({;WAOt>J9Ak4k7b40Ek1MrPW0dFA;{yE5Ex520y!g-)!&gDwht!==>1kix>y zv_HbhMl^^D5hxZYY7h&>>g70-T6>ci1(xtJ#0eKSea2)z;-I%IRpI@6kV(m8O2BX} zmOHy?o6`!mv33u*AH*Em1{|JKFTad6!dO z7W%sFYtWC-+2z%c9CcE5elLNoEoHODK8(%r`%Bt9W6Aaa^8nmWq-hi%5?&)kZh=~= zo}Et6CI2aHUEo}-+J6*letlW*43oG83&S;QTaVWnj3y=$z8AkOQE7aJTd-=qKjO!) z^`DRJnbBy)nGFz|eVL1tr*z*ukTXoOjf-1;$QWPpKWjO3U?g-?27kHPKH+5=j4-qT z^Y_-B4P>u)u$xB#lMu0JxrT6E2!kwJX*t*;82Q6YYAr00>NF<6I2mLFOeathYyL)Z zP=^9Ws`lb0vXu#T8LPZzeG27roWCW@qsu1pZc&4JZ9CNyBeMqP(GAKhoSv!B{`;Nj zn!dscf#2(YrkB_>164xjEk!%9L{c2ymK|bbuG&_N;NoD#J{D z2kC3K{$BCqi1JvWam#R8-nW70!>iBwjQ6mlAfG~c9Qe_gK`&09?0N*y>lm`XekCzS zF|jPk>)dj2$P!Mws-a$O)kv8xA7?b6?g zEKz^lorHzW%cPl5Oc0Ujlaf!XX1v>%V16KzqtI5# zuhITqsMGaazkhzL63n75Jyy^C)xINr>bc3~6XF49Bda7m?c-1Fpv`yY^@4&|^vgd7 zpDBLs8L3}T0>!*lQ*cKDDg;=)kO0=$>hEma=nWqYWfoAdbeY21D znAZg>7?b*Ms*_G64ndTBb)l+b6Hi_%A?lUMWHeu+j^mQLO{DU7x}pg7c>e=ZEq_%7 z6Y|hPLq;7@;-bGRLToeXHE|a(8<%-i+$Kr(IkaCtC_FL6-jk&8*vG6t#cM7S5CYw< z7sO&BqBE^Es8u|q?fp{&ofkqdLBfi%sZAg*%V1xWLfdq!gow#?4*EBTdaT7i9Pi0QHejrpLMTd5XkFNWTsH}XlY>{F>p%men7&4_nCdt(p zjAljniGw~_fNFO@(bG4(zP>t1DGiYBpwXUaWD=0RDr$$MiPEUO=P56E3T8DJ9A9&r za}oG5wmXcxj{OOIqfviS=$B-*7t99}%U3UrDT2NjpA?;IYGN(yIJAG@bsR0)Wc-gw1&2iBX82A89o)uo)#s zGhAgb6sDEe`r~NZkRVvt8-3po>*=mAq*lx8Ji5umB3g|Cj` zAR9jyRo~Sv{cCT3b+@SrI4dQJQG0f4|E1EaB`YXiJmcH*-RzIU=?-Vs^*WM6{<`2T zCspu}E!1KT{%}~zz-`>Lo=$DAUufR@#(OcI`F%T?FDF2l2zQ$@@ZB_yGU&$Pk;(c9 znABm+l`OB)U?r^bGM)eO`=&59$coW|quR*2L|a)c{e>T0%-Y;4#x=hageIV$jKuy6 zx8RyYyeN?@Cr1aZ`^Q(b5_w!Yqlo=V7Ql-KGv!au*@Wg}`=RMs6Nwi~dlaU%$o4*D zD>?}=*qGJFkI>Ui%U9L3twb2E6&Kmt3z)|Sc=)zIpOvc>Kvy2^^u(IB7L0a6P&>S@}pA-|f#|s!JIrdiUOS z?o-cO?#;oBxb)nf&xFUB8Yjx~k8KqU_RkZsdDo;>+qjkiuCJLfw|2M&OWC7ySVOqs zf;-i?QVM^C$M3V7$zF}~-2G>O?5P}Wh67~!VP|TlW>n+*$K~CkUSG$UL{6YsB6?Fd-%iM9jpP{;;l5M22Mr8KHi?3oZ|CaNq5hBw*b+>j;rc!p zi@oo67*9)s=J+E@{jfTYCU?J0f}i4{D}V9SR_cvHg^s;p^sPPenB{WqXV_}K`n)<} z!w(u^KmQIf`OgBve$at%ssBitz~48ifxNj|)l_*jz-}qwbgAJUGGXQZa=+-?ws$Rh z(cg3PgJlybp2&a|;&CmXTih>0YS9-8OdUjofuU%3WEcXU^i=cZy|-0(S^n}RyfRV? zqdMKm38%|3#dA|IeWaY#nDKlp=GY`&J*|qT(|9E z&{4>k?a0tbni-i&ACXHU)jV%wSzG6Qj?g(n)YZWAID@dd}fUqA~%FKOUP;|ZGJtxt$1~N*uI4$Kp0roQ>+{i*7*R-Ee9VtD5O-u zVk==Wg_f$Kn0Ca)1ake&Q+@MA5!B3oK3tso7e z+%`7+^S!W_4zo2>w+pT1=JzeN5qSYS{l%NrEV{@?4(Hh2^CgEB94io(f^Q_DOS#A# z$gOLEu=kh}Wv=6%kviiZGVkF?e=iqkFU)m?HeyYR620ebY}qrhm;D#VEonW)4?1O3 zFLtaCWX&_~z9}vGY$4%Sx_;&c_ z{z+L`aX}~P>sdc*56xbl!n&)|^e*z+TkNkX&BW|*T)^mf^or$4b2m}t!ksZ`L++;~ zS?agxk@T8?ha>vsmYG|uZ^`*1MaBESx7DP@{rhm<2B_HtCF>b27IS_UJM-D(WCf*UdmsapIB8S5 zNDkmBLlUA$?Th0G`8D!$ymy=MdckoYp8s2$_ITx?8YE$43rBtKBE}^Zuxm5L|Gsru zYLucv4H!iQynG~-Feb&@s|tP1A$_Mbujo4>Jy4kPVEHld^^9!!wt~U}0`gz@ewSgv z0A*Ory<=s|C9gRP9JJgE@;iKbiMzk&*sG$I4sh1~FZ7QzsKQ!tHw^>)l|%Seha;3D zyq&Hkj`q<)o56F30{)7woR!$8xWBv~N7Je#TYcI_I?N%oC*IJzx0eMUGCW!VQ zI<->sI<=a+f4g`4u0Q2twyaPiOm{Zvej11K?C&OFwcI=ucUdjP#iy2filGl|>gHd3o{$(k9(miB%mM8?bVwH3{Z}b+`K`fY+t<2mmQr4XT&F=Pfox~+sSrir3Y ztzxmAJqX9fu&%^@RUG{f^p>=5el*e9fD_Gq3iTZIx-O6Q&RVfb< zekxVlL-T0?%zq}0HXX6rpKPCC3>>B6RvTXC%(MK`|)z`+uHQ@dj zY>kwwu=wFbYL1l&deK*&OmUPvA>#4`AaOIFa^+%BOs%B8Apl1odKEl6-UqNQXgTkw zGS6Y_IZA7ZwPF=O=#pSW(2>tGsIPWB4iXU(vAsfI%Z~Tx_!V1Y8cECHi|8PGeL zUz{x~YVrv~`x%urAmruC?cL>mh^>1Oh`!X3z}kaBtJ-pCOW_}~{g$NtvM=9~BTOho zV5oT%9~71&$)b;x)jUDwz!NC8j7qGVDXgs4jl8>8S2W1$aW#tjpB0i9Tti_sn$f{^ zUm&GLP*vkX&`&yPM_w!=%*E=1#Z;(^Rlgo@k({5x$eDxStn0ZKaCRdb2lgeau5NXl zmZy(5>36S*HWirw>T0&2ak_=;v=2xBh*EmB!bn1=5H7o$%{k1C)`I47n%6ke0e@PH zI5TG#S4JU8+M?SLiJKjZO9ZKWi&T%|Sp7{3dTRVs;vpYj_~IA{Sxk@?61}(M^*%tc z{6)Okr6S!n)v`=0(}!3Xi|yRV$xW;pk!B_vH~IePg*%mv;t}ry@rGIR*$wBG3jtp% z@Wr56S#ufsdzw&AxAOzmf;wq%HHJKxrs(5ZHP`h9q8uiQM1zLH7F~;@x?DV^)RQq9 z5L@d+z149@L&HGy%m8YJcoT)jhGZd-_9+>PRqAg)qY zEl3Fs=uYBZza5-T0+g`K{ct-*%-A|P#d+}&T`eQ?eTWC@QK5BH#BHjRFa{izO-p3O zUglykh=tWZf)Q5LeS7r_+ldn5=?gvwyG{bFI4#7zmFbsvSCN)e=Iw$-c#)2?|K{v7 zYk!v8@}k^Vxm_g)oalu#%HYUFV&>J`2|O6RFgqF4?S+%#I;caLFOM@4w^oy1=APgFL{o3B# z4FrfUl%HRC0KLQ#AGx&$K1EnuMd=mjle^vHrb6PU!I_viog^cN9s`Ir(u77H1u1&~Haf z(Jd$>vZnZc92<9H#>p5#(J{G1WJMT|FZ@>gRcBZ4s^P)il>eR^vm?o z6A|xY^*ECW$U~oFDr{mB9;-JeJ3y^P)_>GKc67=URGbgKT1pA;mHI#xh=G6f^uc9o zXCH?~Ns^`$H;<$wCLxAcp1uA3WEaAZE#%{TJQS?8DbFi8w?QP`hIcOxD}V< z;M~VUE_$et2BI!t8LJgb{guski!J@FI=j}W}-FcYFBLQ1A{WIhEj%i`^cX0yD0uBY|RhcA6|^5P6NiX{ivSAgkX{a z-oNyzi-dQ60tCag3Y(mM4!QO8X2KAjt(1vio`s=YB|#%8BwLv#gGD& zgIuHjFrh8-y#1f_MW%-THowY^R3C8eGGKWx_h#>xX*ld3hqT0SHx&QQr|eL^C^#De4cUbRj$XIhH7!kQOr3w<>Jc*w&AG( ziI4P~o|){w`Smr>bP;q-vRL7cvf;ibAj+f(ii<6XMW@rjXFKq(mQg$T{(nVe@3!<` z0A;NdYwXt@YBQ2}E1#6)KK(avH%Fro(Xoz0xcjo0uB#aHMSowWA!v~N6#12$8Xce@5WP) zG!66{jN1kGEEc`N!zW!tk#anjeL`CRdAoS8migcMh#Gq*AsH`jG@&bf zN9@T;nAj5Di*550VgwjdM7N7_18I9IEO8e4)f*Vi2Wsv1v z5Im||E#D+CJw$}HzKjvV#I_h;#x*(E{zUz=BdtsfR501U--3{`7mbC>3+8rAXIVKy^P<{MImJmIWGr(y=;1em?quf@JUK$GA}5ZA)9Z z(9iG4_c8zM=9e>Dd4hWOu17;q#J@_+XDda;+zphPjo+H=-AH6YsJ~NPS;taJDJ42K zBVUjEsYjO!{Fjm4t{fH>jfMXZ=P!WYgw9(}CEGA9QVpE6^2EsA_Hd@NsIfOl*n?wV zsgI@y{q??*h;veY_Y{i4F)s{PPUuO#1{nAKilI$4fACePV@i@og^HV?9rnskC$ZC% z?TH2;+-QMjzLnk)SaR^XlxjG#A67d&jUinQgkCBYJtqX$UJj_z^)P(4*nL1EC! ztPzjM0hoGdvBmyXdyYDllbUtmFyr(^ztG;JW=_nB@%3?UdWK%YD7Gt;pX2fxmb=b_ zo%SH{bxYgt(T$kmmnn`XQh+Q=7!c9BqYBSx?^xlCDbe7}xhCsJt6>xC_umb8_(0lHqj`hn9DVty%yb8(@6v zurzll(RmWp#%N*byLRo9>dk!CA;jPO?D@=Z7`(ZJ&*#u=FtX~NBy6;<@hv%a=`+zD zRcdxO{87fxzT*8Auc7y|)d*29b75l@8Pl$OyLjyN0|#LvPkNIl|7$rft)RSENpzD5 zoMj8w=-?-?L1laid~^Yy9+mh2BADyqADp2-oF=(2$&Cax@Hl7{6T0XL-`Rp)ZMc=b zZsB$@u(zCye)$)Z@adOss@0c!g?%j@np)L>;#T80F)-_M(}3@GcE_~Ic=UPgFm~!< zcb<2dQw96w$PT4^ysZXmzlkcSPg^HhY)#MxNufen={pGxd&cqT(Y!)Yw3XB z+u@n9a07Ok#zJjCYRkL2rQUh5G*Aaj^gkgO1$HzLDa!_VAN< zZUIzawHg2Ob4IeIKz|1cC-v^H)@P^hx-3HUu2z3~+RMly8Z9X}apk|w`F89m*R9jm zE#X3=oLVPQ_8*m%XbJ&f5->)1Z3w$ws0=GK^f~E{rOApQzIO=8)z{~bs%)!Z4YDWF z7PTm{FShRq2a9ZAx`6PcK?%>t*={%;Kr)Eny$YryJttNs&iFNa!D5JQI4W{Z<9|m# z1L!T?!3e-$3Df-hQ!M{D)c$0-;gITg#=9eq1f&@7FJ7!n_*&Iki6?WsBFLxDVyIQe z6JSE4b|0gRQphqHIJR;$`(tJ(o}AQfq&r+0&+1|O?-ZULe1YXdH+2y`69o?4XC5b|jX%T>s&FlQ$DLF_@luep4 w<`)VHQ+&*Bdm5wjpI_Yn_m{%|m%QO|g?Z~#T{!-GHbFp8lm*GuN|^@#KOTd{*Z=?k diff --git a/announcements/release-0.4.html b/announcements/release-0.4.html deleted file mode 100644 index 94940723..00000000 --- a/announcements/release-0.4.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - -Astropy | v0.4 Released! - - - - - - - -
- - -
- -

Astropy v0.4 Released!

- -

-Dear colleagues, -

-

-We are very happy to announce the third major public release (v0.4) of the astropy package, a core Python package for Astronomy: -

-

- http://www.astropy.org -

-

-Astropy is a community-driven package intended to contain much of the core functionality and common tools needed for performing astronomy and astrophysics with Python. -

-

-New and improved major functionality in this release includes: -

    -
  • A new astropy.vo.samp sub-package adapted from the previously standalone SAMPy package -
  • A re-designed astropy.coordinates sub-package for celestial coordinates -
  • A new ‘fitsheader’ command-line tool that can be used to quickly inspect FITS headers -
  • A new HTML table reader/writer -
  • Improved performance for Quantity objects -
  • A re-designed configuration framework -
-

-

-In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-     https://docs.astropy.org/en/stable/whatsnew/0.4.html -

-

-Instructions for installing Astropy are provided on our website, and extensive documentation can be found at: -

-

-     https://docs.astropy.org -

-

-In particular, if you use Anaconda, you can update to v0.4 with: -

-
-    conda update astropy
-
-

-Please report any issues, or request new features via our GitHub repository: -

-

-     https://github.com/astropy/astropy/issues -

-

-Over 80 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-     http://www.astropy.org/team.html -

-

-If you use Astropy directly - or as a dependency to another package - for your work, please remember to include the following acknowledgment at the end of papers: -

-

This research made use of Astropy, a community-developed core Python package for Astronomy (Astropy Collaboration, 2013).

- -

where (Astropy Collaboration, 2013) is a citation to the Astropy Paper (ADS - -BibTeX).

-

-Please feel free to forward this announcement to anyone you think might be interested in this release. -

-

-We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

-Thomas Robitaille, Erik Tollerud, and Perry Greenfield
-on behalf of The Astropy Collaboration -

- - -
- - - -
- - - -
- -
- - - diff --git a/announcements/release-1.0.html b/announcements/release-1.0.html deleted file mode 100644 index 8d2468fe..00000000 --- a/announcements/release-1.0.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - -Astropy | v1.0 Released! - - - - - - - -
- - -
- -

Astropy v1.0 Released!

- -

-Dear colleagues, -

-

-We are very happy to announce the fourth major public release (v1.0) of the astropy package, a core Python package for Astronomy: -

-

- http://www.astropy.org -

-

-Astropy is a community-driven Python package intended to contain much of the -core functionality and common tools needed for astronomy and astrophysics. -

-

-New and improved major functionality in this release includes: -

    -
  • Support for Altitude/Azimuth and Galactocentric coordinates in astropy.coordinates -
  • A new astropy.visualization sub-package -
  • A new astropy.analytic_functions sub-package -
  • Compound models in astropy.modeling may now be created using arithmetic expressions, and the resulting models support fitting. -
  • Significantly faster C-based readers/writers for astropy.io.ascii -
  • Support for a new enhanced CSV ASCII table format -
  • A refactored Table class with improved performance when adding/removing columns -
  • Support for using Time, Quantity, or SkyCoord arrays as Table columns -
-

-

-In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-     https://docs.astropy.org/en/stable/whatsnew/1.0.html -

-

- Astropy v1.0 is a special release that we are denoting a Long Term Support (LTS) - release, which means that we will be supporting it with bug fixes for - the next two years, rather than the usual six months. More information about - this can be found at the link above. -

-

-Instructions for installing Astropy are provided on our website, and extensive documentation can be found at: -

-

-     https://docs.astropy.org -

-

-In particular, if you use the Anaconda Python Distribution, you can update to v1.0 with: -

-
-    conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-    pip install astropy --upgrade
-
-

-Please report any issues, or request new features via our GitHub repository: -

-

-     https://github.com/astropy/astropy/issues -

-

-Over 122 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-     http://www.astropy.org/team.html -

-

-If you use Astropy directly for your work, or as a dependency to another -package, please remember to include the following acknowledgment at the end of -papers: -

-

This research made use of Astropy, a -community-developed core Python package for Astronomy (Astropy Collaboration, -2013).

- -

where (Astropy Collaboration, 2013) is a citation to the Astropy Paper (ADS - -BibTeX).

-

-Please feel free to forward this announcement to anyone you think might be interested in this release. -

-

-We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

-Thomas Robitaille, Erik Tollerud, and Perry Greenfield
-on behalf of The Astropy Collaboration -

- - -
- - - -
- - - -
- -
- - - diff --git a/announcements/release-1.1.html b/announcements/release-1.1.html deleted file mode 100644 index 750e4f51..00000000 --- a/announcements/release-1.1.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - - - - - - -Astropy | v1.1 Released! - - - - - - - -
- - -
- -

Astropy v1.1 Released!

- -

-Dear colleagues, -

-

-We are very happy to announce the v1.1 release of the Astropy package, -a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

-Astropy is a community-driven Python package intended to contain much of the -core functionality and common tools needed for astronomy and astrophysics. -

-

-New and improved major functionality in this release includes: -

    -
  • New functions to automatically determine histogram bins, including - the Bayesian blocks algorithm -
  • A new interface to transform between Table objects and pandas - DataFrame objects -
  • Support for table indexing -
  • Support for supergalactic and ecliptic coordinates -
  • A new .info attribute to get summary information about tables and - columns -
  • A new show_in_notebook() method to show a table in Jupyter/IPython - notebooks with additional interactivity features -
  • Support for new units, including logarithmic units such as - magnitudes, dex, and decibels -
  • Support for the Planck 2015 cosmology and significant performance - improvements in the cosmology sub-package -
-

-

-In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-     https://docs.astropy.org/en/stable/whatsnew/1.1.html -

-

-Instructions for installing Astropy are provided on our website, and extensive documentation can be found at: -

-

-     https://docs.astropy.org -

-

-If you make use of the Anaconda -Python Distribution, you can update to Astropy v1.1 with: -

-
-    conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-    pip install astropy --upgrade
-
-

-Please report any issues, or request new features via our GitHub repository: -

-

-     https://github.com/astropy/astropy/issues -

-

-Over 160 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-     http://www.astropy.org/team.html -

-

-As a reminder, Astropy v1.0 (our long term support release) will -continue to be supported with bug fixes until Feb 19th 2017, so if you -need to use Astropy in a very stable environment, you may want to -consider staying on the v1.0.x set of releases rather than upgrading to -v1.1. -

-

-If you use Astropy directly for your work, or as a dependency to another -package, please remember to include the following acknowledgment at the end of -papers: -

-

This research made use of Astropy, a -community-developed core Python package for Astronomy (Astropy Collaboration, -2013).

- -

where (Astropy Collaboration, 2013) is a citation to the Astropy Paper (ADS - -BibTeX).

-

-Please feel free to forward this announcement to anyone you think might be interested in this release. -

-

-We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

-Thomas Robitaille, Erik Tollerud, and Perry Greenfield
-on behalf of The Astropy Collaboration -

- - - - -
- - - -
- - - -
- -
- - - diff --git a/announcements/release-1.2.html b/announcements/release-1.2.html deleted file mode 100644 index edd3ab2b..00000000 --- a/announcements/release-1.2.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - - - - - - -Astropy | v1.2 Released! - - - - - - - -
- - -
- -

Astropy v1.2 Released!

- -

-Dear colleagues, -

-

-We are very happy to announce the v1.2 release of the Astropy package, -a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

-Astropy is a community-driven Python package intended to contain much of the -core functionality and common tools needed for astronomy and astrophysics. -

-

-New and improved major functionality in this release includes: -

    -
  • A new class to compute Lomb-Scargle periodograms efficiently using different methods. -
  • A number of new statistics functions including those for Jackknife resampling, circular statistics, and the Akaike and Bayesian information criteria. -
  • Support for getting the positions of solar system bodies in the coordinates sub-package. -
  • The ability to compute Barycentric and Heliocentric light-travel time corrections. -
  • Support for offset coordinate frames, which can be used to define a coordinate system relative to a known position and rotation. -
  • An implementation of the zscale algorithm to determine image limits automatically. -
  • Support for bolometric magnitudes in the units package. -
  • Improvements to the NDData class and subclasses. -
  • Auto-downloading of IERS tables as needed, which gives information about Earth orientation parameters necessary for high precision coordinate calculations and conversions to/from the UT1 scale. -
-

-

-In addition, hundreds of smaller improvements and fixes have been made. An -overview of the changes is provided at: -

-

-     https://docs.astropy.org/en/stable/whatsnew/1.2.html -

-

-Instructions for installing Astropy are provided on our website, and extensive documentation can be -found at: -

-

-     https://docs.astropy.org -

-

-If you make use of the Anaconda -Python Distribution, you can update to Astropy v1.2 with: -

-
-    conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-    pip install astropy --upgrade
-
-

-Note that if you install now you should get Astropy v1.2.1, as some last-minute bug fixes were found and fixed after the v1.2 release was created but before this announcement. -

-

-Please report any issues, or request new features via our GitHub repository: -

-

-     https://github.com/astropy/astropy/issues -

-

-Over 190 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-     http://www.astropy.org/team.html -

-

-As a reminder, Astropy v1.0 (our long term support release) will continue to be -supported with bug fixes until Feb 19th 2017, so if you need to use Astropy in -a very stable environment, you may want to consider staying on the v1.0.x set -of releases (for which we have recently released v1.0.10). -

-

-If you use Astropy directly for your work, or as a dependency to another -package, please remember to include the following acknowledgment at the end of -papers: -

-

This research made use of Astropy, a -community-developed core Python package for Astronomy (Astropy Collaboration, -2013).

- -

where (Astropy Collaboration, 2013) is a citation to the Astropy Paper (ADS - -BibTeX).

-

-Please feel free to forward this announcement to anyone you think might be interested in this release. -

-

-We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

-Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft
-on behalf of The Astropy Collaboration -

- - - - -
- - - -
- - - -
- -
- - - diff --git a/announcements/release-1.3.html b/announcements/release-1.3.html deleted file mode 100644 index 24710c26..00000000 --- a/announcements/release-1.3.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - -Astropy | v1.3 Released! - - - - - - - -
- - -
- -

Astropy v1.3 Released!

- -

-Dear colleagues, -

-

-We are very happy to announce the v1.3 release of the Astropy package, -a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

-Astropy is a community-driven Python package intended to contain much of the -core functionality and common tools needed for astronomy and astrophysics. -

-

-New and improved major functionality in this release includes: -

    -
  • The WCSAxes framework for plotting points or images on celestial coordinates in matplotlib.
  • -
  • A new function in astropy.visualization to generate 3-color images from astronomy images in different bands.
  • -
  • Astropy coordinate representations now combine like vectors, with useful mathematical operations that can be performed on them.
  • -
  • Astropy coordinates and time objects now behave much more consistently like arrays when they are reshaped.
  • -
  • Earth locations can now be created from a postal address.
  • -
  • JPL Ephemerides can now be used in the coordinates sub-package to improve the accuracy of coordinate transformations and barycentric time corrections.
  • -
  • FORTRAN-style extended floating precision files like 1.495D+238 can now be read using astropy.io.ascii or Table.read.
  • -
  • Astropy objects can now be serialized to (or re-loaded from) a standard YAML representation.
  • -
  • FITS HDUs can now be lazy loaded, improving performance in files with many HDUs.
  • -
  • The default cosmology is now Planck 2015.
  • -
-

-

-In addition, hundreds of smaller improvements and fixes have been made. An -overview of the changes is provided at: -

-

-     https://docs.astropy.org/en/stable/whatsnew/1.3.html -

-

-Instructions for installing Astropy are provided on our website, and extensive documentation can be -found at: -

-

-     https://docs.astropy.org -

-

-If you make use of the Anaconda -Python Distribution, you can update to Astropy v1.3 with: -

-
-    conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-    pip install astropy --upgrade
-
-

-Please report any issues, or request new features via our GitHub repository: -

-

-     https://github.com/astropy/astropy/issues -

-

-Over 210 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-     http://www.astropy.org/team.html -

-

-Astropy v1.0 (our long term support release) will continue to be supported with bug fixes until the v2.0 release in June 2017, so if you need to use Astropy in a very stable environment, you may want to consider staying on the v1.0.x set of releases (for which we are simultaneously releasing v1.0.11). -

-

-While we typically do not support non-LTS releases, we are also simultaneously releasing an Astropy v1.2.2, the last in that series. This update is primarily to include a leap second at the end of 2016 (but also contains other bug fixes). -

-

-If you use Astropy directly for your work, or as a dependency to another -package, please remember to include the following acknowledgment at the end of -papers: -

-

This research made use of Astropy, a -community-developed core Python package for Astronomy (Astropy Collaboration, -2013).

- -

where (Astropy Collaboration, 2013) is a citation to the Astropy Paper (ADS - -BibTeX).

-

-Please feel free to forward this announcement to anyone you think might be interested in this release. -

-

-We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

-Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft
-on behalf of The Astropy Collaboration -

- - - - -
- - - -
- - - -
- -
- - - diff --git a/announcements/release-2.0.html b/announcements/release-2.0.html deleted file mode 100644 index 308d7e0e..00000000 --- a/announcements/release-2.0.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - - - - -Astropy | v2.0 Released! - - - - - - - -
- - - -
- -

Astropy v2.0 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v2.0 release of the Astropy package, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- Astropy is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. -

-

- New and improved major functionality in this release includes: -

    -
  • Most models now support parameters having units (i.e., being Quantity objects).
  • -
  • A new CCDData class that is directly useful for typical astronomical images and implements the NDData interface.
  • -
  • Coordinate frame objects can now carry proper motions and radial velocities, and will carry them through and transform them between frames. (This functionality is experimental and feedback is greatly desired.)
  • -
  • Many of the typical mixin columns for astropy tables can now be saved into ECSV files and fully round-tripped.
  • -
  • The fft and direct versions of the convolution algorithm in astropy.convolution are now more consistent and work better with typical use cases.
  • -
  • A variety of additions to the astropy.stats subpackage
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/2.0.html -

-

- Note that the Astropy 2.x series will be the last versions of Astropy that will support Python 2.x. Future versions of Astropy will only support Python 3.x. -

-

- Instructions for installing Astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you make use of the Anaconda - Python Distribution, you can update to Astropy v2.0 with: -

-
-conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-pip install astropy --upgrade
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 232 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-      http://www.astropy.org/team.html -

-

- Astropy v2.0 now repaces v1.0 as the long term support release, and will be supported until the end of 2019. The next major release of Astropy (scheduled for January 2018) will only support Python 3.x. So if you need to use Astropy in a very stable environment in Python 2.7, you should continue to use the 2.0.x series after 3.0.x is released. -

-

- If you use Astropy directly for your work, or as a dependency to another - package, please remember to include the following acknowledgment at the end of - papers: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2013).

- -

where (Astropy Collaboration, 2013) is a citation to the Astropy Paper (ADS - - BibTeX).

-

- Special thanks to the coordinator for this release: Brigitta Sipocz. -

-

- We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

- Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft
- on behalf of The Astropy Collaboration -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-3.0.html b/announcements/release-3.0.html deleted file mode 100644 index a033827b..00000000 --- a/announcements/release-3.0.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - -Astropy | v3.0 Released! - - - - - - - -
- - - -
- -

Astropy v3.0 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v3.0 release of the Astropy package, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- Astropy is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • Full support for velocities in the coordinates subpackage, including SkyCoord objects and proper motion corrections.
  • -
  • Very large ASCII files can now be read in as chunks, allowing larger tables to be efficiently read in, along with other performance improvements reading tables.
  • -
  • Time objects can now be read from or written to FITS files following the official FITS time standard.
  • -
  • Table mixin columns (e.g., quantities) can now be losslessly saved to HDF5 or FITS tables.
  • -
  • Constants can now be versioned using context managers.
  • -
  • Support for quantities in scipy special functions
  • -
  • A new command line script, "showtable", is available to display tables from any format Astropy can read.
  • -
  • The pytest plugins for testing Astropy have been moved to external packages, enabling their use in a wider range of Python packages.
  • -
  • False alarm probabilities are now available for the Lomb-Scargle periodogram implementation.
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/3.0.html -

-

- Note that the Astropy 3.x series is the first to only support Python 3. Python 2 users can continue to use the 2.x series, which will receive bug fixes and support until the Python developers permanently sunset Python 2.7 (scheduled for 2019). -

-

- Instructions for installing Astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you make use of the Anaconda - Python Distribution, you can update to Astropy v3.0 with: -

-
-conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-pip install astropy --upgrade
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 253 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-      http://www.astropy.org/team.html -

-

- As a reminder, Astropy v2.0 (our long term support release) will continue to be supported with bug fixes until the end 2019, so if you need to use Astropy in a very stable environment, you may want to consider staying on the v2.0.x set of releases (for which we have recently released v2.0.4). - -

-

- If you use Astropy directly for your work, or as a dependency to another - package, please remember to include the following acknowledgment at the end of - papers: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2018).

- -

where (Astropy Collaboration, 2018) is a citation to the Astropy Paper II (ADS - - BibTeX).

-

- This paper is still under review, however, and an earlier paper is available - describing the status of the package at the time of v0.2. If your work has - used Astropy since then, you are encouraged to acknowledge both papers: -

- -

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2013, 2018).

- -

where (Astropy Collaboration, 2013) is a citation to the first Astropy Paper (ADS - - BibTeX).

- - -

- Special thanks to the coordinator for this release: Brigitta Sipocz. -

-

- We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

- Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft
- on behalf of The Astropy Collaboration -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-3.1.html b/announcements/release-3.1.html deleted file mode 100644 index 2db2e96a..00000000 --- a/announcements/release-3.1.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - -Astropy | v3.1 Released! - - - - - - - -
- - - -
- -

Astropy v3.1 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v3.1 release of the Astropy package, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- Astropy is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- The focus of this release is on performance, but it also contains new and improved major functionality. Highlights include: -

    -
  • Performance Improvements across-the-board
  • -
  • A new sub-package for Uncertainties and Distributions
  • -
  • A new Box Least Squares Periodogram
  • -
  • J-style coordinates parser
  • -
  • Support for use of Time and TimeDelta columns within a Table
  • -
  • Array-valued Time and TimeDelta objects are now mutable
  • -
  • Better uncertainty support and bit planes in NDData
  • -
  • A new operator for Quantity performance
  • -
  • Thermodynamic temperature equivalency
  • -
  • Little-h equivalency
  • -
  • Change in default cosmology
  • -
  • Significant improvements in WCSAxes
  • -
  • A new convenience function for imshow with ImageNormalize
  • -
  • A common API for World Coordinate Systems
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/3.1.html -

-

- Note that the Astropy 3.x series only supports Python 3. Python 2 users can continue to use the 2.x (LTS) series (but without new features). -

-

- Instructions for installing Astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you make use of the Anaconda - Python Distribution, you can update to Astropy v3.1 with: -

-
-conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-pip install astropy --upgrade
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 300 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-      http://www.astropy.org/team.html -

-

- As a reminder, Astropy v2.0 (our long term support release) will continue to be supported with bug fixes (but no new features) until the end of 2019, so if you need to use Astropy in a very stable environment, you may want to consider staying on the v2.0.x set of releases (for which we have recently released v2.0.10). - -

-

- If you use Astropy directly for your work, or as a dependency to another - package, please remember to acknowledgment it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page, but as of - this release the recommendation is: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2018).

- - -

- Special thanks to the coordinator for this release: Brigitta Sipocz. -

-

- We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

- Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft
- on behalf of The Astropy Collaboration -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-3.2.html b/announcements/release-3.2.html deleted file mode 100644 index aa4c88ef..00000000 --- a/announcements/release-3.2.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - -Astropy | v3.2 Released! - - - - - - - -
- - - -
- -

Astropy v3.2 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v3.2 release of the Astropy package, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- Astropy is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • New Sub-package for Time Series
  • -
  • New SI/CODATA 2018 Constants
  • -
  • Additions and changes to Ecliptic Transformations
  • -
  • Table performance improvements and change in metadata handling
  • -
  • Table I/O integration of pandas I/O functions for ASCII tables
  • -
  • Improved help on Table read() and write() methods
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/3.2.html -

-

- Note that the Astropy 3.x series only supports Python 3. Python 2 users can continue to use the 2.x (LTS) series (but without new features). -

-

- Instructions for installing Astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you make use of the Anaconda - Python Distribution, you can update to Astropy v3.2 with: -

-
-conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-pip install astropy --upgrade
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 300 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-      http://www.astropy.org/team.html -

-

- As a reminder, Astropy v2.0 (our long term support release) will continue to be supported with bug fixes (but no new features) until the end of 2019, so if you need to use Astropy in a very stable environment, you may want to consider staying on the v2.0.x set of releases (for which we have recently released v2.0.13). - -

-

- If you use Astropy directly for your work, or as a dependency to another - package, please remember to acknowledgment it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page, but as of - this release the recommendation is: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2018).

- - -

- Special thanks to the coordinator for this release: Brigitta Sipocz. -

-

- We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

- Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft
- on behalf of The Astropy Collaboration -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-4.0.html b/announcements/release-4.0.html deleted file mode 100644 index 4b53fc07..00000000 --- a/announcements/release-4.0.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - - - - -Astropy | v4.0 Released! - - - - - - - -
- - - -
- -

Astropy v4.0 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v4.0 release of the Astropy package, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- Astropy is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • Support for Planck 2018 Cosmological Parameters
  • -
  • Improved Consistency of Physical Constants and Units
  • -
  • Scientific enhancements to the Galactocentric Frame
  • -
  • New ymdhms Time Format
  • -
  • New Context Manager for plotting time values
  • -
  • Dynamic and improved handling of leap second
  • -
  • Major Improvements in Compatibility of Quantity Objects with NumPy Functions
  • -
  • Multiple interface improvements to WCSAxes
  • -
  • Fitting of WCS to Pairs of Pixel/World Coordinates
  • -
  • Support for WCS Transformations between Pixel and Time Values
  • -
  • Improvements to Folding for Time Series
  • -
  • New Table Methods and significant performance improvements for Tables
  • -
  • Improved downloading and caching of remote files
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/4.0.html -

-

The Astropy v4.0.x series now replaces v2.0.x as the long term support release, and will be supported until the end of 2021. - Also note that the Astropy 4.x series only supports Python 3. Python 2 users can continue to use the 2.x series but as of now it is no longer supported (as Python 2 itself is no longer supported). For assistance converting Python 2 code to Python 3, see the Python 3 for scientists conversion guide. -

-

- Instructions for installing Astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you make use of the Anaconda - Python Distribution, you can update to Astropy v4.0 with: -

-
-conda update astropy
-
-

- Whereas if you usually use pip, you can do: -

-
-pip install astropy --upgrade
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 350 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-      http://www.astropy.org/team.html -

-

- If you use Astropy directly for your work, or as a dependency to another - package, please remember to acknowledgment it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page, but as of - this release the recommendation is: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2018).

- - -

- Special thanks to the coordinator for this release: Brigitta Sipocz. -

-

- We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

- Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft
- on behalf of The Astropy Collaboration -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-4.1.html b/announcements/release-4.1.html deleted file mode 100644 index 1390fd9a..00000000 --- a/announcements/release-4.1.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - -Astropy | v4.1 Released! - - - - - - - -
- - - -
- -

Astropy v4.1 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v4.1 release of the Astropy package, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- Astropy is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • A new SpectralCoord class for representing and transforming spectral quantities
  • -
  • Support for writing Dask arrays to FITS files
  • -
  • Added True Equator Mean Equinox (TEME) frame for satellite two-line ephemeris data
  • -
  • Support for in-place setting of array-valued SkyCoord and frame objects
  • -
  • Change in the definition of equality comparison for coordinate classes
  • -
  • Support use of SkyCoord in table vstack, dstack, and insert_row
  • -
  • Support for table cross-match join with SkyCoord or N-d columns
  • -
  • Support for custom attributes in Table subclasses
  • -
  • Added a new Time subformat unix_tai
  • -
  • Added support for the -TAB convention in FITS WCS
  • -
  • Support for replacing submodels in CompoundModel
  • -
  • Support for units on otherwise unitless models via the Model.coerce_units method.
  • -
  • Support for ASDF serialization of models
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/4.1.html -

-

- Instructions for installing Astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip/vanilla Python, you can do: -

-
-pip install astropy --upgrade
-
-

- If you make use of the Anaconda - Python Distribution, soon you will be able update to Astropy v4.1 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the astropy channel: -

-
-conda update -c astropy astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Nearly 400 developers have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-      https://www.astropy.org/team.html -

-

- The LTS (Long Term Support) version of Astropy at the time of v4.1's release is v4.0 - this version will be maintained until next LTS release (v5.0, scheduled for Fall 2021). - Additionally, note that the Astropy 4.x series only supports Python 3. Python 2 users can continue to use the 2.x series but it is no longer supported (as Python 2 itself is no longer supported). For assistance converting Python 2 code to Python 3, see the Python 3 for scientists conversion guide. -

-

- If you use Astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page, but as of - this release the recommendation is: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2018).

- - -

- We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

- Erik Tollerud
- v4.1 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-4.3.html b/announcements/release-4.3.html deleted file mode 100644 index 2ae28ad9..00000000 --- a/announcements/release-4.3.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - -Astropy | v4.3 Released! - - - - - - - -
- - - -
- -

Astropy v4.3 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v4.3 release of the Astropy package, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- Astropy is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • Transformations to AltAz are now much more precise (and faster)
  • -
  • Improvements in making Astropy thread-safe
  • -
  • Performance improvements to sigma clipping
  • -
  • Changes in the Time and IERS leap second handling
  • -
  • Support for multidimensional and object columns in ECSV
  • -
  • Support for reading and writing tables to QDP format
  • -
  • Append table to existing FITS file
  • -
  • General masked class for Quantity and other ndarray subclasses
  • -
  • Configuration file improvements
  • -
  • Support for different solvers and bracket option in z_at_value
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/4.3.html -

-

- Instructions for installing Astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip/vanilla Python, you can do: -

-
-pip install astropy --upgrade
-
-

- Note that this will yield astropy v4.3.1 instead of 4.3, which is expected - a significant bug reported between the 4.3 release and this announcement means that the correct version is indeed 4.3.1. -

- -

- If you make use of the Anaconda - Python Distribution, soon you will be able update to Astropy v4.3.1 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 400 people have contributed code to Astropy so far, and you can find out more about the team behind Astropy here: -

-

-      https://www.astropy.org/team.html -

-

- The LTS (Long Term Support) version of Astropy at the time of v4.3's release is v4.0 - this version will be maintained until next LTS release (v5.0, scheduled for Fall 2021). - Additionally, note that the Astropy 4.x series only supports Python 3. Python 2 users can continue to use the 2.x series but it is no longer supported (as Python 2 itself is no longer supported). For assistance converting Python 2 code to Python 3, see the Python 3 for scientists conversion guide. -

-

- If you use Astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page, but as of - this release the recommendation is: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2018).

- - -

- We hope that you enjoy using Astropy as much as we enjoyed developing it! -

-

- Erik Tollerud
- v4.3 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-5.0.html b/announcements/release-5.0.html deleted file mode 100644 index 7f3d92ef..00000000 --- a/announcements/release-5.0.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - -Astropy | v5.0 Released! - - - - - - - -
- - - -
- -

Astropy v5.0 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v5.0 release of astropy, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- The astropy core package is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • Support for reading, writing, and converting Cosmology objects
  • -
  • A new cosmology units module
  • -
  • New trigonometric and spline models
  • -
  • Support for dask arrays in tables
  • -
  • Support for registering array-like objects as mixin columns
  • -
  • Support for reading and writing tables to Parquet format
  • -
  • Support for reading and writing tables to MRT format
  • -
  • Support for masked quantity columns, including masked FITS columns with units
  • -
  • Converting SkyCoord to QTable
  • -
  • A new unified I/O architecture
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/5.0.html -

-

- The astropy v5.0.x series now replaces v4.0.x as the long term - support release, and will be supported for two years. -

-

- Instructions for installing astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip/vanilla Python, you can do: -

-
-pip install astropy --upgrade
-
- -

- If you make use of the Anaconda - Python Distribution, soon you will be able update to Astropy v5.0 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 400 people have contributed code to the core astropy package so far, and you can find out more about the team here: -

-

-      https://www.astropy.org/team.html -

-

- If you use astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page, but as of - this release the recommendation is: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2018).

- - -

- We hope that you enjoy using astropy as much as we enjoyed developing it! -

-

- Thomas Robitaille
- v5.0 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-5.1.html b/announcements/release-5.1.html deleted file mode 100644 index cbc4aa6b..00000000 --- a/announcements/release-5.1.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - -Astropy | v5.1 Released! - - - - - - - -
- - - -
- -

Astropy v5.1 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v5.1 release of astropy, - a core Python package for Astronomy: -

-

-
- http://www.astropy.org -

-

- The astropy core package is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • Updates to cosmology
  • -
  • doppler_redshift() equivalency
  • -
  • Specifying data types when reading ASCII tables
  • -
  • Structured Columns
  • -
  • New model fitters have been added
  • -
  • Allow time conversions without predictive Earth rotation data (IERS-A)
  • -
  • Uncertainty classes can be transformed into each other
  • -
  • Schechter1D Model
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/5.1.html -

-

- Instructions for installing astropy are provided on our website, and extensive documentation can be - found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip/vanilla Python, you can do: -

-
-pip install astropy --upgrade
-
- -

- If you make use of the Anaconda - Python Distribution, soon you will be able update to Astropy v5.1 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 400 people have contributed code to the core astropy package so far, and you can find out more about the team here: -

-

-      https://www.astropy.org/team.html -

-

- If you use astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page, but as of - this release the recommendation is: -

-

This research made use of Astropy, a - community-developed core Python package for Astronomy (Astropy Collaboration, - 2018).

- - -

- We hope that you enjoy using astropy as much as we enjoyed developing it! -

-

- Simon Conseil
- v5.1 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-5.2.html b/announcements/release-5.2.html deleted file mode 100644 index 66c7fd1e..00000000 --- a/announcements/release-5.2.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - -Astropy | v5.2 Released! - - - - - - - -
- - - -
- -

Astropy v5.2 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v5.2 release of astropy, a core Python - package for Astronomy (and a v5.2.1 release which fixes compatibility - with Numpy 1.24): -

-

-
- http://www.astropy.org -

-

- The astropy core package is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • Quantity data types
  • -
  • Updates to astropy.cosmology
  • -
  • Topocentric ITRS Frame
  • -
  • Enhanced Fixed Width ASCII Tables
  • -
  • Accessing cloud-hosted FITS files
  • -
  • Drawing the instrument beam and a physical scale bar on celestial images
  • -
  • Interior ticks and tick labels
  • -
  • Support for tilde-prefixed paths
  • -
  • CCDData PSF Image representation
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. - An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/5.2.html -

-

- Instructions for installing astropy are provided on our website, and extensive documentation - can be found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip/vanilla Python, you can do: -

-
-pip install astropy --upgrade
-
- -

- If you make use of the Anaconda - Python Distribution, soon you will be able update to Astropy v5.2 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 430 people have contributed code to the core astropy package so far, and you can find out more about the team here: -

-

-      https://www.astropy.org/team.html -

-

- If you use astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page -

- - -

- We hope that you enjoy using astropy as much as we enjoyed developing it! -

-

- Thomas Robitaille
- v5.2 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-5.3.html b/announcements/release-5.3.html deleted file mode 100644 index 7ec36ed9..00000000 --- a/announcements/release-5.3.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - -Astropy | v5.3 Released! - - - - - - - -
- - - -
- -

Astropy v5.3 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v5.3 release of astropy, a core Python - package for Astronomy: -

-

-
- http://www.astropy.org -

-

- The astropy core package is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • New flat astropy.cosmology classes
  • -
  • New union operators for Table
  • -
  • Efficient data access for compressed FITS files
  • -
  • Added support for NOCOMPRESS for compressed FITS files
  • -
  • New fraction option for representing units as strings
  • -
  • Change in order in unit string representations
  • -
  • Support for collapse operations on arbitrary axes in nddata
  • -
  • Refresh cached observatory site registry for EarthLocation methods
  • -
  • New LombScargleMultiband class for multiband datasets
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. - An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/5.3.html -

-

- Instructions for installing astropy are provided on our website, and extensive documentation - can be found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip/vanilla Python, you can do: -

-
-pip install astropy --upgrade
-
- -

- If you make use of the Anaconda - Python Distribution, soon you will be able update to Astropy v5.3 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 490 people have contributed code to the core astropy package so far, and you can find out more about the team here: -

-

-      https://www.astropy.org/team.html -

-

- If you use astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page -

- - -

- We hope that you enjoy using astropy as much as we enjoyed developing it! -

-

- Simon Conseil
- v5.3 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-6.0.html b/announcements/release-6.0.html deleted file mode 100644 index 9bf0b5e0..00000000 --- a/announcements/release-6.0.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - -Astropy | v6.0 Released! - - - - - - - -
- - - -
- -

Astropy v6.0 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v6.0 release of astropy, a core Python - package for Astronomy: -

-

-
- http://www.astropy.org -

-

- The astropy core package is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- New and improved major functionality in this release includes: -

    -
  • Define Geodetic and Bodycentric Representations via their geometric parameters
  • -
  • Body-fixed planetary reference frames and their WCS description
  • -
  • Support for Numpy broadcasting over frame data and attributes
  • -
  • Updates to cosmology
  • -
  • Updates to how IERS data are handled
  • -
  • Masked Time values now use Masked arrays internally
  • -
  • Reading and writing VO model annotations
  • -
  • TimeDelta string format “quantity_str”
  • -
  • VOTable now supports PARQUET serialization
  • -
  • Faster FITS file decompression
  • -
  • New GeneralSersic2D model
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. - An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/6.0.html -

-

- Instructions for installing astropy are provided on our website, and extensive documentation - can be found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip/vanilla Python, you can do: -

-
-pip install astropy --upgrade
-
- -

- If you make use of the Anaconda - Python Distribution, soon you will be able update to Astropy v6.0 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 490 people have contributed code to the core astropy package so far, and you can find out more about the team here: -

-

-      https://www.astropy.org/team.html -

-

- If you use astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page. -

- - -

- We hope that you enjoy using astropy as much as we enjoyed developing it! -

-

- Simon Conseil
- v6.0 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-6.1.html b/announcements/release-6.1.html deleted file mode 100644 index 79aaeae3..00000000 --- a/announcements/release-6.1.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - -Astropy | v6.1 Released! - - - - - - - -
- - - -
- -

Astropy v6.1 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v6.1 release of astropy, a core Python - package for Astronomy: -

-

-
- http://www.astropy.org -

-

- The astropy core package is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- Notable changes in this release include: -

    -
  • Warnings are now emitted when carrying out order-dependent angular separation calculations
  • -
  • Cosmology classes are now Python dataclasses
  • -
  • Compatibility with the upcoming major Numpy 2.0 release
  • -
  • Changes to the meaning of the copy= argument when using Numpy 2.0
  • -
  • io.ascii now uses 64-bit integers by default for integer numerical data on all platforms
  • -
  • Minimum supported version of Python updated to 3.10
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. - An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/6.1.html -

-

- Instructions for installing astropy are provided on our website, and extensive documentation - can be found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip to install packages, you can do: -

-
-pip install astropy --upgrade
-
- -

- If you make use of conda (such as through the Anaconda - Python Distribution), you should soon be able update to Astropy v6.1 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 490 people have contributed code to the core astropy package so far, and you can find out more about the team here: -

-

-      https://www.astropy.org/team.html -

-

- If you use astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page. -

- - -

- We hope that you enjoy using astropy as much as we enjoyed developing it! -

-

- Thomas Robitaille
- v6.1 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-7.0.html b/announcements/release-7.0.html deleted file mode 100644 index 30b31ebe..00000000 --- a/announcements/release-7.0.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - -Astropy | v7.0 Released! - - - - - - - -
- - - -
- -

Astropy v7.0 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v7.0 release of astropy, a core Python - package for Astronomy: -

-

-
- http://www.astropy.org -

-

- The astropy core package is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- Notable changes in this release include: -

    -
  • Full MaskedQuantity Support in QTable
  • -
  • Coordinate frames can now be stored in tables
  • -
  • Table show_in_notebook is back with ipydatagrid
  • -
  • Ordering of table columns constructed from rows
  • -
  • Table.pformat is now independent of terminal dimensions
  • -
  • Quantity.to_string supports formatter for formatting
  • -
  • NumPy constructor functions with a like argument are now supported with Quantity
  • -
  • Change default type for meta attribute to dict and update ECSV writer
  • -
  • Improve the Contributor Documentation
  • -
  • Typing in astropy.stats
  • -
  • Converting units on dask and other array-like objects
  • -
  • Performance improvements in astropy.modeling
  • -
  • Fitting models in parallel with N-dimensional data
  • -
  • RGB image visualization enhancements
  • -
  • New Lorentz2D model
  • -
  • Faster guessing of formats in astropy.io.ascii
  • -
  • Support VOTable version 1.5
  • -
  • New `parquet.votable` format is available to read/write a Table from Parquet files with VOTable metadata included
  • -
  • New SimpleNorm class
  • -
  • New SigmaClippedStats class
  • -
  • Automatic placement of axis and tick labels for WCSAxes
  • -
  • Support for masks in coordinates
  • -
  • Minimum supported version of Python updated to 3.11
  • -
  • The astropy conda-forge package now has all the optional dependencies, a new astropy-base package is provided with only required dependencies.
  • -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. - An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/7.0.html -

-

- Instructions for installing astropy are provided on our website, and extensive documentation - can be found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip to install packages, you can do: -

-
-pip install astropy --upgrade
-
- -

- If you make use of conda (such as through the Anaconda - Python Distribution), you should soon be able update to Astropy v7.0 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 540 people have contributed code to the core astropy package so far, and you can find out more about the team here: -

-

-      https://www.astropy.org/team.html -

-

- If you use astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page. -

- - -

- We hope that you enjoy using astropy as much as we enjoyed developing it! -

-

- Simon Conseil
- v7.0 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/announcements/release-7.2.html b/announcements/release-7.2.html deleted file mode 100644 index 7f64ec61..00000000 --- a/announcements/release-7.2.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - - - -Astropy | v7.2 Released! - - - - - - - -
- - - -
- -

Astropy v7.2.0 Released!

- -

- Dear colleagues, -

-

- We are very happy to announce the v7.2.0 release of astropy, a core Python - package for Astronomy: -

-

-
- http://www.astropy.org -

-

- The astropy core package is a community-driven Python package intended to contain much of the - core functionality and common tools needed for astronomy and astrophysics. - It is part of the Astropy Project, which aims to foster an ecosystem of - interoperable astronomy packages for Python. -

-

- Notable changes in this release include: -

    -
  • A faster ECSV table reader -
  • Generic DataFrame conversion methods -
  • Table index improvements and deprecation -
  • Cosmology traits -
  • An option to preserve units in FITS-WCS -
  • Concatenation and stacking of coordinates and time classes -
-

-

- In addition, hundreds of smaller improvements and fixes have been made. - An overview of the changes is provided at: -

-

-      https://docs.astropy.org/en/stable/whatsnew/7.2.html -

-

- Instructions for installing astropy are provided on our website, and extensive documentation - can be found at: -

-

-      https://docs.astropy.org -

-

- If you usually use pip to install packages, you can do: -

-
-pip install astropy --upgrade
-
- -

- If you make use of conda (such as through the Anaconda - Python Distribution), you should soon be able update to Astropy v7.2.0 with: -

-
-conda update astropy
-
-

- Or if you cannot wait for Anaconda to update their default version, you can use the conda-forge channel: -

-
-conda update -c conda-forge astropy
-
-

- Please report any issues, or request new features via our GitHub repository: -

-

-      https://github.com/astropy/astropy/issues -

-

- Over 580 people have contributed code to the core astropy package so far, and you can find out more about the team here: -

-

-      https://www.astropy.org/team.html -

-

- If you use astropy directly for your work, or as a dependency to another - package, please remember to acknowledge it by citing the appropriate - Astropy paper. For the most up-to-date suggestions, see - the acknowledgement page. -

- -

- We hope that you enjoy using astropy as much as we enjoyed developing it! -

-

- Thomas Robitaille
- v7.2 Release Coordinator
- on behalf of The Astropy Project -

-
- - - -
- - - -
- -
- - - diff --git a/code_of_conduct.html b/code_of_conduct.html deleted file mode 100644 index 6dc03790..00000000 --- a/code_of_conduct.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - -Astropy | Code of Conduct - - - - - - - -
- - -
- - -

Astropy Community Code of Conduct

- - -

Since November 2025, the Astropy Project has adopted the NumFOCUS Code of Conduct, which is summarized below. - For the previous version of the Astropy Code of Conduct, click here.

- -
- -

The Short Version

- -

Be kind to others. Do not insult or put down others. Behave professionally. - Remember that harassment and sexist, racist, or exclusionary jokes are not - appropriate for Astropy.

- -

Astropy is dedicated to providing a harassment-free community for everyone, - regardless of gender, sexual orientation, gender identity and expression, disability, - physical appearance, body size, race, or religion. We do not tolerate harassment - of community members in any form.

- -

All communication should be appropriate for a professional audience including - people of many different backgrounds. Sexual language and imagery is not appropriate.

- -

Thank you for helping make this a welcoming, friendly community for all.

- -

The Long Version

- -

You can find the long version of the Code of Conduct on the - NumFOCUS website.

- -

How To Report

- -

If you feel that the Code of Conduct has been violated, you can submit a report via the NumFOCUS Code of Conduct Reporting Form. - -

Who Will Receive Your Report

- -

Your report will be received and handled by NumFOCUS Code of Conduct Working Group; - trained, and experienced contributors with diverse backgrounds. The group is making - decisions independently from the project, PyData, NumFOCUS, or any other organization.

- -

The Working Group will work with the Astropy Project's Ombudsperson to resolve an incident: - The NumFOCUS Code of Conduct Working group will review the incident, and provide recommendations on how to handle this or what consequences or sanction might be appropriate. As per Astropy's governance charter, the Astropy Ombudsperson along with the Coordination Committee will receive those recommendations and perform any actions necessary to address the concern.

- -

Examples

- -

To make this Code of Conduct more concrete, we provide here some hypothetical examples of how a Code of Conduct issue might arise that may be particular to our community:

- -
    - -
  • A member of the Astropy community might express a preference on an online forum for a specific tool or programming language (e.g., Python) over another language. If this preference is expressed as a personal preference or with reference to particular technical merits of that language vs. others, there is no violation of the Code of Conduct. However, if that member instead expresses this preference by way of insult to those who use another language, or via violent imagery directed at those other languages or its users, that would be an act of "tool shaming" and be a violation of the Code of Conduct.
  • - -
  • If a member of the community knowingly uses a software tool or astronomical dataset in a public package or academic publication without acknowledging or citing the tool in a reasonable way requested by the upstream tool, this is a violation of the Code of Conduct. If the member makes a reasonable effort to find an acknowledgement and one is not available, this would not be a Code of Conduct violation (although it might or might not represent a violation of copyright law depending on the details of the situation and adopted license).
  • - -
  • If an Astropy maintainer were to post a message in a public forum that is insulting an astronomy research community member's skills as a programmer, this would be a violation of the Code of Conduct, as the researcher is also a member of our community. Conversely, if a researcher insultingly rejected a maintainer's suggestion because the maintainer is not a scientist, this would be a violation by the researcher. If that same thing were stated in a meeting with other Astropy maintainers, it may or may not represent a code of conduct violation, depending on whether the intent is to insult vs. pointing out a skill lack in the community in a productive manner.
  • - -
- - -
- -
- - - -
- -
- - - diff --git a/code_of_conduct_old_astropy.html b/code_of_conduct_old_astropy.html deleted file mode 100755 index 8c615e5f..00000000 --- a/code_of_conduct_old_astropy.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - -Astropy | Code of Conduct (old) - - - - - - - -
- - -
- - -

Astropy Community Code of Conduct (prior to November 2025)

- -

Astropy has switched to using NumFOCUS code of conduct, please see the - current code of conduct.

- -

The community of participants in open source Astronomy projects is made - up of members from around the globe with a diverse set of skills, - personalities, and experiences. It is through these differences that our - community experiences success and continued growth. We expect everyone in - our community to follow these guidelines when interacting with others both - inside and outside of our community. Our goal is to keep ours a positive, - inclusive, successful, and growing community.

- -

As members of the community,

- -
    - -
  • We pledge to treat all people with respect and provide a harassment- and - bullying-free environment, regardless of sex, sexual orientation and/or - gender identity, disability, physical appearance, body size, race, - nationality, ethnicity, and religion. In particular, sexual language and - imagery, sexist, racist, or otherwise exclusionary jokes are not - appropriate.
  • - -
  • We pledge to respect the work of others by recognizing - acknowledgment/citation requests of original authors. As authors, we pledge - to be explicit about how we want our own work to be cited or - acknowledged.
  • - -
  • We pledge to welcome those interested in joining the community, and - realize that including people with a variety of opinions and backgrounds - will only serve to enrich our community. In particular, discussions relating - to pros/cons of various technologies, programming languages, and so on are - welcome, but these should be done with respect, taking proactive measure to - ensure that all participants are heard and feel confident that they can - freely express their opinions.
  • - -
  • We pledge to welcome questions and answer them respectfully, paying - particular attention to those new to the community. We pledge to provide - respectful criticisms and feedback in forums, especially in discussion - threads resulting from code contributions.
  • - -
  • We pledge to be conscientious of the perceptions of the wider community - and to respond to criticism respectfully. We will strive to model behaviors - that encourage productive debate and disagreement, both within our community - and where we are criticized. We will treat those outside our community with - the same respect as people within our community.
  • - -
  • We pledge to help the entire community follow the code of conduct, and - to not remain silent when we see violations of the code of conduct. We will - take action when members of our community violate this code such as - contacting confidential@astropy.org (all emails sent to this address will be - treated with the strictest confidence) or talking privately with the - person.
  • - -
- -

This code of conduct applies to all community situations online and - offline, including mailing lists, forums, social media, conferences, - meetings, associated social events, and one-to-one interactions.

- -

Any related activity or project organized by members of the Astropy - community, including affiliated packages, are welcome to have their own - codes of conduct, but agree to also abide by the present code of - conduct.

- -

Parts of this code of conduct have been adapted from the PSF code of - conduct.

- -

Creative Commons License
The Astropy Community Code of Conduct is licensed under a Creative Commons Attribution 4.0 International License. We encourage other communities related to ours to use or adapt this code as they see fit.

- -
- - -
- - - -
- -
- - - diff --git a/conf.py b/conf.py new file mode 100644 index 00000000..ea813ce9 --- /dev/null +++ b/conf.py @@ -0,0 +1,46 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'astropy.org' +copyright = '2026, Astropy Community' +author = 'Astropy Community' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "myst_parser", + "sphinx_design", +] + +templates_path = ['_templates'] +exclude_patterns = [ + '_build', + 'Thumbs.db', + '.DS_Store', + 'LICENSE.rst', + 'README.md', + 'CONTRIBUTING.md', +] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'astropy' +html_static_path = ['_static'] + +html_theme_options = { + "show_prev_next": False, + "sst_is_root": True, +} + +html_sidebars = { + "index": [], +} diff --git a/contribute.html b/contribute.html deleted file mode 100644 index 9c6daa7d..00000000 --- a/contribute.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - - - - - - - - -Astropy | Contribute - - - - - - - -
- - -
-

Contribute to Astropy

- -

The Astropy project is made both by and for its users, so we accept contributions of many kinds. We always welcome contributors who will abide by the Astropy Community Code of Conduct.

- Feedback | - Report an issue | - Code/docs | - Project Role | - Affiliated Package | - Financial | - Academic Contributions -
- -
-

Contribute feedback

- -

There are several ways in which you can give feedback.

- -
    -
  • If you would like to give feedback and participate in discussions, we encourage you - to join the astropy mailing - list and post there. This is the easiest way to have a discussion with both developers - and other users.
  • - -
  • Feature requests from the community are welcome and encouraged.
  • - -
  • If you have feedback you would prefer to keep private, you can e-mail feedback@astropy.org. This address - points to a private mailing list that includes the astropy core developers. If - you would like a reply (e.g., an acknowledgement of your comment), please - request it.
  • - -
  • For the extremely impatient, astropy developers often can be found in the - Astropy Slack team (get an account here). Slack is basically a live web - chat.
  • - -
  • If you would like to participate in discussions about how - the Project is run, please join the - Developer Email List [astropy-dev]. -
  • - -
- -
- - -
-

Reporting Issues

- -

If you have found a bug in Astropy please report it. The preferred way is to - create a new issue on the Astropy - GitHub issue page; - that requires creating a free - account on GitHub if you do not have one.

- -

If you prefer not to create a GitHub account, please report the issue to either - the astropy mailing list, - the astropy-dev mailing list - or sending a - private email to the astropy core developers at - feedback@astropy.org

- -

Please include an example that demonstrates the issue that will allow the - developers to reproduce and fix the problem. You may be asked to also provide - information about your operating system and a full Python stack trace; the - Astropy developers will walk you through obtaining a stack trace if it is - necessary.

-

- - - -
-

Contribute code or documentation

- -

If you are interested in contributing fixes, code or documentation to Astropy (whether the core package or affiliated packages), you should join the astropy-dev mailing list/forum. For the core, start looking at any related issues. In particular, we have introduced a labeling system used across most Astropy-related packages which will allow you to find good starting issues. Good labels to start with are Good-first-issue and Package-novice which means you don't need much prior experience of the package. You can use the following links to find all the issues labeled this way and also labeled by how much work they involve:

- -

You may also want to familiarize yourself with the developer documentation, particularly the coding and documentation guidelines.

- -

Once you have a change to propose, if it's a simple fix to just a single file, you can even just browse to the appropriate file and use the "edit" button on github. If it's a more complex change, we suggest you follow the developer install instructions, and use that with Astropy's github page to issue a pull request with your changes. If you aren't familiar with github, we suggest you looking over our workflow documentation. Once your code is accepted, you are officially an Astropy contributor and eligible to be included on the author list of future publications.

- -

If you want to propose a larger change to Astropy, there's a procedure for that: Astropy Proposals for Enhancement (APEs) (modeled after Python's PEPs). The sort of changes that APEs are intended for include plans for new sub-packages, wide-ranging code re-organizations, a new procedure needing review by a lot of the Astropy community, or an informational document on some decision for Astropy that you want remembered. For more background on APEs, check out APE #1 and the APE repository's README. There is also a wiki page on Astropy's github repository that has an overview of the existing APEs.

- - -
- -
-

Taking on a formal project role

- -

- If you are interested in a higher level of contribution to the project, you can consider taking on one of the formal - project roles as listed in the Astropy Team page. -

-

- In order to be nominated for a named Astropy role, it is typical that a person will have - been actively involved in the project for a considerable amount of time (at least a year - and often longer) and have made substantial contributions. They will have shown a - sustained commitment to Astropy by participating actively already in activities related - to the role. This could involve submitting pull requests and participating in - reviews, or discussions in other channels such as mailing lists or Slack, or other - contributions as defined by a particular role. Finally, they need to express a desire to - maintain this involvement going forward and accept the responsibility of having a role. - For example, being a core sub-package maintainer involves interacting with users and - responding to bug reports in a timely manner. If you are interested in taking on such a role, you can volunteer - either on astropy-dev, by talking to a holder of the - role you are interested in, or a coordination committee member. -

- -
- -
-

Develop an affiliated package

- -

Whether you have an idea for a new Astronomy package, or already have a package that you want to integrate with the Astropy project, you can develop an affiliated package! You'll want to join the astropy-dev list so you can notify other developers of your intent to develop an affiliated package, and the astropy-affiliated-maintainers mailing list to be kept informed of any discussions related to setting up affiliated packages. Then you can check out the affiliated package guidelines to get started.

- - -
- - - -
-

For academics: How to justify your contribution

-

While in some more technical areas, contributing code is recognized as a - goal in and of itself, some academic fields have not yet developed a clear - understanding of the role of code development relative to other more - traditional contributions like publication. This section aims to - provide suggestions to academics for how you might justify contributions - to the Astropy project if you are in a field or institution that needs - convincing of the value of such contributions. -

- -

Contributing to the Astropy Project as a volunteer directly benefits - the astronomical research community in tangible ways. Nevertheless, - people employed in academic departments may be asked to justify their - time and efforts in terms of direct benefit to their own department or - organization. In this case it is worth highlighting the - well-established role of community service in academia, including: -

    -
  • Referring journal papers
  • -
  • Reviewing proposals for funding or for an observatory time allocation committee
  • -
  • Serving on a conference science organizing committee
  • -
  • Serving on an external review committee such as the NASA Senior Review
  • -
-

- -

- These volunteer duties typically bring no direct benefit to the home - department of a researcher, yet they are widely accepted as - necessary to the functioning of global research astronomy. We should - now add the following to the above list of community service duties: -

    -
  • Contribute to open source software projects that benefit astronomical research
  • -
-

- -
- - - -
- - - diff --git a/credits.html b/credits.html deleted file mode 100644 index 8a81bc41..00000000 --- a/credits.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - - - - - - - -Astropy Credits - - - - - - - -
- - -
-

Astropy Credits

- -

The Astropy Project is made possible through the hard work of hundreds of - people in the community. Contributions take many forms, from participating - in online forums, being an Astropy sub-committee member, giving talks, - writing tutorials and documentation, writing code, making releases, - organizing conferences, and much much more.

- -

In this page we specially recognize the people and organizations that - have made significant contributions to the Astropy project. This comes in - the form of lifetime contributors and institutional support that provides both - direct and indirect funding for Astropy. - -

- - -
- -
-

Lifetime Contributors

- -

Here we list individuals who estimate they have spent 2000 hours or more, - equivalent to full time for a year, working on and contributing to the - Astropy Project. These individuals have demonstrated a long-term commitment - to the project in many areas and exemplify the high standards we seek to - achieve. -

- -

Adam Ginsburg

- Together with others, Adam initiated development of the astroquery and - regions packages, and continued maintaining or contributing to both since. - He developed the fft part of the convolution package and maintained it - since. Adam played small roles in a number of other areas, but particularly - recently in outreach to the radio community by creating tools - (spectral-cube, etc.) that link radio data to astropy. - -

Adrian Price-Whelan

- Adrian is the lead coordinator and developer behind the Learn Astropy and - Astropy tutorials initiatives. He was an initial contributor of the concept - and code for the Quantity class in astropy.units and serves as lead - developer of astropy.coordinates. In the latter role he was a key player in - adding support for velocity data such as proper motions in - astropy.coordinates. - -

Brigitta Sipőcz

- Since coming to the project in - 2014, Brigitta has been an active and valued member of the Astropy community - in many key roles. Most notably, she has been the lead developer and maintains - responsibility for critical parts of the Astropy infrastructure which keep - the core package and affiliated packages running smoothly for both testing - and release distribution. She is an astropy core release manager and - the GSoC coordinator for Astropy. - -

Erik Tollerud

- Erik has played a key leadership and technical role in the Astropy project - since it began in 2011. His contributions include writing large parts of the core coordinates and - uncertainties packages, serving in the Coordination Committee since 2011, - serving as a release manager and a number of infrastructure roles, providing - leadership on writing the Astropy papers and proposals, and Finance - committee work. - -

Kelle Cruz

- Kelle has been on the Coordination Committee since 2016 with a focus on - community management, user discussion forums, workshops, and expanding - educational materials. Her role as the Learn Coordinator has been especially - impacting. She has played a crucial lead role in the areas of governance, - fundraising, and grant writing as Astropy has grown into a large and widely - recognized project. - -

Larry Bradley

- Larry has been involved in the project since the fall of 2013. - Since 2014, he has served as the lead developer and maintainer of - the Photutils package, an Astropy coordinated package for source - detection, photometry, and related tools. He is also a developer - and maintainer of the Astropy visualization, stats, and convolution - packages and the Regions coordinated package. Larry has also served - as an instructor at Astropy workshops since 2016. - -

Madison Bray

- Madison was a founding member of the Astropy project and was the main - developer of the io.fits core subpackage which forms the basis of much of - the I/O for astropy. After taking a hiatus from Astropy in 2016 for another - opportunity, Madison rejoined in the role of DevOps and Operations Support - in 2020. - -

Marten van Kerkwijk

- Marten has been actively involved in astropy core development since 2013. He - has made many key contributions, most notably leading the effort to make - Quantities truly useful throughout astropy by working with and contributing to numpy to ensure interaction - with numpy functions became seemless, and optimizing their use inside coordinates. He led - the development of algorithm improvements in the Time class to ensure - accuracy at the level needed for pulsar timing, and he played an important - role in making the Table class versatile. - -

Matt Craig

- Since becoming involved in the project in fall 2013, Matt co-led the - development of ccdproc, the coordinated package for optical/IR image data - reduction and served as lead for the NDData subpackage. He also served - on multiple Python in Astronomy organizing committees, helped with a couple - of coordination meetings, and worked hard to make sure the astropy ecosystem - of packages is available on major platforms to improve accessibility. - -

Michael Droettboom

- Michael was a prolific contributor to Astropy from 2011 through 2015, - contributing over 400 pull requests in many areas of the core, with a focus - on the wcs, votable, and table subpackages. His deep understanding of best - coding practices provided important inspiration for other members of the - initial core development team. - -

Moritz Günther

- Moritz has been involved in the Project since 2011, with contributions to - the io.ascii package and a continuing role as a package maintainer. He has - also contributed to the stats core subpackage and the photutils and saba - packages. Since 2020, Moritz has been serving as an Affiliated Package - review editor and has been an active member of the interim Finance Committee. - -

Nadia Dencheva

- Nadia has been an active member of the project since it started, where she - has been the lead developer and maintainer for the modeling and wcs - packages. She has also been involved with the serialization of astropy - objects to the ASDF format. - -

Perry Greenfield

- More than any other single person, Perry has been responsible for the - adoption of Python in astronomy. He recognized the promise of Python as a - language for astronomical data analysis and processing far before the rest - of the community and was responsible for an institutional commitment of - substantial resources in this direction. Perry was a key player in the - initial formation of the Astropy project and served as a Coordination - Committee member from 2011 to 2016. In 2020, Perry took on the role of - Ombudsperson. - -

Pey Lian Lim

- Pey Lian has been an important team member since 2012, providing key - infrastructure and operational support focused on the core package. In her - maintainer roles for testing and documentation infrastructure and DevOps and - Operations Support, she keeps Astropy running. Special commendation is due - for leading the extremely rapid and unexpected migration from Travis CI to - GitHub Actions in 2020. Pey Lian's tireless attention in triaging core - issues is well-recognized. - -

Simon Conseil

- After a first pull request in 2012, Simon became a regular contributor to - Astropy around 2015. Since 2017 he has been the main maintainer of io.fits, - taking on the daunting role of managing this complex and critical - subpackage. He also contributes other parts of Astropy including - infrastructure, modeling, io.ascii, stats, table, and visualization. - -

Tom Aldcroft

- In 2011, Tom was part of an initial core group that recognized the need for - a common Astropy package for the community, and he helped organize the first - official Astropy coordination meeting. Since that time he has been an active - contributor to the project, taking a lead role in the development and - maintenance of three core subpackages: table, time, and io.ascii. In 2016 he - was appointed as one of the Astropy Project Coordination Committee members. - -

Tom Robitaille

- Tom has been a recognized leader in the Astropy project since it began, - being part of the core group that started the project and organized the - first Astropy coordination meeting. His individual contributions are too - numerous to name, but they include contributing large parts of the core - package covering many areas, developing the astropy-healpix and regions - coordinated packages, serving as a release manager, GSoC coordinator, and - member of the Coordination Committee. - -
-
- -

Institutional Support

- -Here we recognize the institutions who have made major contributions to the -Astropy project by either direct funding to the project or by indirect funding -of employees who have contributed. - -

Space Telescope Science Institute (STScI)

-STScI has played a foundational role in the development and advancement of the -Astropy Project since its inception. STScI has provided continued and -substantial support to the project via staff contributions since 2011, including -six lifetime contributors to astropy. Additionally, STScI has provided on-going -support and leadership to both Astropy and the broader scientific Python -computing ecosystem. - -

Moore Foundation

-In late 2019 the Astropy project was awarded a major grant from the Gordon and -Betty Moore Foundation. This grant was targeted at supporting Astropy’s -transition to a fully sustainable project, where success no longer hinges on a -limited set of contributors. This grant was transformative for the Project. - -

NASA

-NASA has awarded funding for the Astropy Project through the -"ROSES E.7 (Support for Open Source Tools, Frameworks, and Libraries)" program (2021) -and the Open-Source Tools, Frameworks, and Libraries" foundation award (2024). -This funding is used to support ongoing infrastructure work, help -with maintaining the core package, and to support the ecosystem of affiliated packages. -This grant helps to ensure that Astropy remains a sustainable project. - -

Chandra X-ray Center (CXC)

-The CXC has supported multiple staff members to work on the Astropy project, -equivalent to more than 5 person-years since the start of the project. - -

IPAC at CalTech

-The NASA/IPAC Infrared Science Archive (IRSA) at Caltech curates and serves the science products and documentation for many space- and ground-based observatories. In our work, we have benefitted from the Astropy project, and have been committed to sharing our solutions back to the project to benefit the broader community. Most of our effort has gone into the astroquery, pyvo, and the core libraries. - -

NumFOCUS

-We wish to express gratitude to the NumFocus Organization for providing the -organizational support to grow Astropy into the role of a community-leading -project with a substantial budget. - -

Gemini

-The Science User Support Department at the Gemini Observatory has supported work -on both the Astropy and DRAGONS projects. This support has happened by funding staff members -who can contribute to Astropy development, and by providing funding for developers -on the Astropy project. - -

Center for Computational Astrophysics (CCA), Flatiron Institute, Simons -Foundation

-The CCA has provided logistical and travel support for the Python in Astronomy -conference, the coordination meeting, and the spectroscopy working -group. - -

Dunlap

-Dunlap has provided Financial support/seed funding for the Astropy Learn project since 2020. - -

Europlanet Society

-The Europlanet society has awarded funding for the Astropy Project through the Europlanet 2024 RI, -European Union's Horizon 2020 research and innovation programme, under grant agreement No 871149. -This funding is used in particular to support the ongoing work on planetary reference frames and -world coordinate system. -
- - - -
- - - diff --git a/css/github_issues.css b/css/github_issues.css deleted file mode 100644 index e2ac5d05..00000000 --- a/css/github_issues.css +++ /dev/null @@ -1,22 +0,0 @@ -.github-label-effort { - font-size: 11px; - font-weight: bold; - padding: 3px 4px; - border-radius: 2px; - line-height: 1; - box-shadow: inset 0 -1px 0 rgba(0,0,0,0.12); - background-color: #fef2c0; - color: #333026; - font: Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"; -} -.github-label-package { - font-size: 11px; - font-weight: bold; - padding: 3px 4px; - border-radius: 2px; - line-height: 1; - box-shadow: inset 0 -1px 0 rgba(0,0,0,0.12); - background-color: #bfe5bf; - color: #333026; - font: Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"; -} \ No newline at end of file diff --git a/css/jquery.sidr.light.css b/css/jquery.sidr.light.css deleted file mode 100644 index c534f6db..00000000 --- a/css/jquery.sidr.light.css +++ /dev/null @@ -1,46 +0,0 @@ -.sidr{display:none;position:absolute;position:fixed;top:0;height:100%;z-index:999999;width:260px;overflow-x:none;overflow-y:auto;font-family:"lucida grande",tahoma,verdana,arial,sans-serif;font-size:15px;background:#f8f8f8;color:#333;-webkit-box-shadow:inset 0 0 5px 5px #ebebeb;-moz-box-shadow:inset 0 0 5px 5px #ebebeb;box-shadow:inset 0 0 5px 5px #ebebeb}.sidr .sidr-inner{padding:0 0 15px}.sidr .sidr-inner>p{margin-left:15px;margin-right:15px}.sidr.right{left:auto;right:-260px}.sidr.left{left:-260px;right:auto}.sidr h1,.sidr h2,.sidr h3,.sidr h4,.sidr h5,.sidr h6{font-size:11px;font-weight:normal;padding:0 15px;margin:0 0 5px;color:#333;line-height:24px;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #dfdfdf));background-image:-webkit-linear-gradient(#ffffff,#dfdfdf);background-image:-moz-linear-gradient(#ffffff,#dfdfdf);background-image:-o-linear-gradient(#ffffff,#dfdfdf);background-image:linear-gradient(#ffffff,#dfdfdf);-webkit-box-shadow:0 5px 5px 3px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 5px 3px rgba(0,0,0,0.2);box-shadow:0 5px 5px 3px rgba(0,0,0,0.2)}.sidr p{font-size:13px;margin:0 0 12px}.sidr p a{color:rgba(51,51,51,0.9)}.sidr>p{margin-left:15px;margin-right:15px}.sidr ul{display:block;margin:0 0 15px;padding:0;border-top:1px solid #dfdfdf;border-bottom:1px solid #fff}.sidr ul li{display:block;margin:0;line-height:48px;border-top:1px solid #fff;border-bottom:1px solid #dfdfdf}.sidr ul li:hover,.sidr ul li.active,.sidr ul li.sidr-class-active{border-top:none;line-height:49px}.sidr ul li:hover>a,.sidr ul li:hover>span,.sidr ul li.active>a,.sidr ul li.active>span,.sidr ul li.sidr-class-active>a,.sidr ul li.sidr-class-active>span{-webkit-box-shadow:inset 0 0 15px 3px #ebebeb;-moz-box-shadow:inset 0 0 15px 3px #ebebeb;box-shadow:inset 0 0 15px 3px #ebebeb}.sidr ul li a,.sidr ul li span{padding:0 15px;display:block;text-decoration:none;color:#333}.sidr ul li ul{border-bottom:none;margin:0}.sidr ul li ul li{line-height:40px;font-size:13px}.sidr ul li ul li:last-child{border-bottom:none}.sidr ul li ul li:hover,.sidr ul li ul li.active,.sidr ul li ul li.sidr-class-active{border-top:none;line-height:41px}.sidr ul li ul li:hover>a,.sidr ul li ul li:hover>span,.sidr ul li ul li.active>a,.sidr ul li ul li.active>span,.sidr ul li ul li.sidr-class-active>a,.sidr ul li ul li.sidr-class-active>span{-webkit-box-shadow:inset 0 0 15px 3px #ebebeb;-moz-box-shadow:inset 0 0 15px 3px #ebebeb;box-shadow:inset 0 0 15px 3px #ebebeb}.sidr ul li ul li a,.sidr ul li ul li span{color:rgba(51,51,51,0.8);padding-left:30px}.sidr form{margin:0 15px}.sidr label{font-size:13px}.sidr input[type="text"],.sidr input[type="password"],.sidr input[type="date"],.sidr input[type="datetime"],.sidr input[type="email"],.sidr input[type="number"],.sidr input[type="search"],.sidr input[type="tel"],.sidr input[type="time"],.sidr input[type="url"],.sidr textarea,.sidr select{width:100%;font-size:13px;padding:5px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0 0 10px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;border:none;background:rgba(0,0,0,0.1);color:rgba(51,51,51,0.6);display:block;clear:both}.sidr input[type=checkbox]{width:auto;display:inline;clear:none}.sidr input[type=button],.sidr input[type=submit]{color:#f8f8f8;background:#333}.sidr input[type=button]:hover,.sidr input[type=submit]:hover{background:rgba(51,51,51,0.9)} - -.sidr{ - background-color: white; -} - -.sidr ul li a, .sidr ul li span{ - background-color: #FF5000; - color: white; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - -ms-transition: none - transition: none; - background-image: -webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #FC9468), - color-stop(0.89, #FF5100) - ); - background-image: -o-linear-gradient(bottom, #FC9468 0%, #FF5100 89%); - background-image: -moz-linear-gradient(bottom, #FC9468 0%, #FF5100 89%); - background-image: -webkit-linear-gradient(bottom, #FC9468 0%, #FF5100 89%); - background-image: -ms-linear-gradient(bottom, #FC9468 0%, #FF5100 89%); - background-image: linear-gradient(to bottom, #FC9468 0%, #FF5100 89%); - border-radius: 3px; -} - -.sidr ul li:hover>a, .sidr ul li:hover>span, .sidr ul li.active>a, .sidr ul li.active>span, .sidr ul li.sidr-class-active>a, .sidr ul li.sidr-class-active>span{ - background-color: white; - color:#FF5000; - -webkit-box-shadow: none; - -moz-box-shadow: none - box-shadow: none; - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - -ms-transition: none - transition: none; - - background-image: none; -} diff --git a/css/style.css b/css/style.css deleted file mode 100644 index 99596360..00000000 --- a/css/style.css +++ /dev/null @@ -1,734 +0,0 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ - -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} - -em { - font-style: italic; -} - -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} -.footer { - color: black; - background-color: #f5f5f5; - position: relative; -} -.footer-text { - width: 50%; - padding: 12px 12px; -} -.footer-text a:hover { - color: #FF851B; -} -.footer-stamp { - position: absolute; - top: 20px; - right: 10px; -} -@media (max-width: 710px) { - .footer-text { - width: 40%; - padding: 12px 6px; - } -} -@media (max-width: 593px) { - .footer-text { - width: 90%; - padding: 12px 12px; - } - .footer-stamp { - position: static; - margin: 13px; - } -} -body { - line-height: 1; -} -ol, ul { - list-style: none; -} -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -} - -body{ - line-height: 1.25em; - font-size: 14px; - color:#333; - font-family: 'Open Sans', sans-serif; -} - -code { - font-family: monospace; -} - -/* This file is in the public domain because it was created by NASA -and ESA. The material was created for NASA by Space Telescope Science -Institute under Contract NAS5-26555, or for ESA by the Hubble European -Space Agency Information Centre. Copyright statement at -hubblesite.org. */ -#index { - background-image: url("../images/background.jpg"); - background-repeat: repeat-x; - background-position: center top; -} - -#wrapper{ - margin:0 auto; - max-width:960px; - padding:0 10px; - min-width: 320px; /* min-width of whole site */ -} - -a{ - color: #FF5000; - text-decoration: none; -} -a, svg{ - -webkit-transition: all 0.3s ease; - -moz-transition: all 0.3s ease; - -o-transition: all 0.3s ease; - -ms-transition: all 0.3s ease; - transition: all 0.3s ease; -} - -a:hover{ - color:#333; -} - -a.paralink{ - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; - opacity: 0.8; - visibility: hidden; -} - -a.paralink:hover{ - background-color: #FF5000; - color: white; - text-decoration: none; -} - -h1{ - font-size: 24px; - margin-top: 10px; - margin-bottom: 20px; -} - -h2{ - font-size: 20px; - margin-bottom: 10px; -} - -h3{ - font-size: 16px; - margin: 20px 0px 10px 0px; - -} - -p{ - margin-bottom: 10px; - margin-top: 10px; - line-height: 1.5em; -} - -strong{ - font-weight: bold; - -} - -section{ - border-bottom: 1px #efefef solid; - padding: 30px 0 30px; - clear: both; -} - -section:first-of-type{ - margin-top:42px; -} - -section:last-of-type{ - border-bottom: 0px; -} - -section *:last-child{ - margin-bottom: 0px; -} - -ul li{ - list-style-type: square; - list-style-position: outside; - list-style-color: #FF5000; - line-height: 1.5em; - margin-bottom:0.5em; - margin-left: 30px; -} - -ul li:last-child{ - margin-bottom: 0px; -} - -cite{ - font-family: monospace; -} - -section.notice { - font-size: 13pt; - line-height: 1.25em; - font-style: italic; - padding: 10px; - margin: 20px; - margin-top: 50px; - border: 1px solid #FF5000; - webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -} - -pre{ - background-color: #f5f5f5; - border: 1px solid #ddd; - padding: 10px; - color: black; - font-family: Monaco, Andale Mono, Courier New, monospace; - webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - margin-bottom: 5px; -} - -.button{ - padding: 8px; - display: inline-block; - background-image: -webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #FC9468), - color-stop(0.89, #FF5100) - ); - background-image: -o-linear-gradient(bottom, #FC9468 0%, #FF5100 89%); - background-image: -moz-linear-gradient(bottom, #FC9468 0%, #FF5100 89%); - background-image: -webkit-linear-gradient(bottom, #FC9468 0%, #FF5100 89%); - background-image: -ms-linear-gradient(bottom, #FC9468 0%, #FF5100 89%); - background-image: linear-gradient(to bottom, #FC9468 0%, #FF5100 89%); - border-radius: 3px; -} - -a.button, .button a{ - color: white; -} - - -p .button{ - padding-top:0px; - padding-bottom:0px; - padding-right:4px; - padding-left:4px; -} - -.button:hover{ - cursor: pointer; - background-image: -webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #FFA47D), - color-stop(1, #FF7D45) - ); - background-image: -o-linear-gradient(bottom, #FFA47D 0%, #FF7D45 100%); - background-image: -moz-linear-gradient(bottom, #FFA47D 0%, #FF7D45 100%); - background-image: -webkit-linear-gradient(bottom, #FFA47D 0%, #FF7D45 100%); - background-image: -ms-linear-gradient(bottom, #FFA47D 0%, #FF7D45 100%); - background-image: linear-gradient(to bottom, #FFA47D 0%, #FF7D45 100%); -} - -hr { - border: none; - height: 1px; - /* Set the hr color */ - color: #333; /* old IE */ - background-color: grey; /* Modern Browsers */ -} - -.right{ - float: right; -} - -/* nav */ -nav{ - line-height: 42px; - position:absolute; - left:0px; - top:0px; - width:100%; - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #222222),color-stop(0.89, #333333)); - background-image: -o-linear-gradient(bottom, #222222 0%, #333333 89%); - background-image: -moz-linear-gradient(bottom, #222222 0%, #333333 89%); - background-image: -webkit-linear-gradient(bottom, #222222 0%, #333333 89%); - background-image: -ms-linear-gradient(bottom, #222222 0%, #333333 89%); - background-image: linear-gradient(to bottom, #222222 0%, #333333 89%); -} - -nav > *{ - display:inline-block; - vertical-align:top; -} - -nav img{ - float: left; - margin-left: 20px; - margin-top: 5px; -} - -nav ul{ - max-width:960px; - margin:0 auto; -} - -nav ul li{ - display:inline; - list-style: none; - margin: 10px; -} - - -nav li a, nav li a:link{ - color:white; -} -nav li a:hover{ - color:#FF5000; -} - -nav li a.active{ - color:#FF5000; -} - -nav .pull-right{ - float: right; - margin-right:10px; -} - -.search input{ - margin-top: 4px; - width: 180px; - height: 18px; - border: 1px solid #ccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - background-color: #ffffff; - font-size: 13px; - line-height: 18px; - padding-left: 5px; -} - -#mobile-header { - display: none; -} - -#mobile-header a{ - width: 46px; - display:block; -} - - -#mobile-header div svg{ - fill:white; - height: 15px; - width: 15px; - padding: 13px 15px; - display:block; -} - -#mobile-header div:hover svg{ - fill:#FF5000; -} - - -@media only screen and (max-width: 840px){ - #mobile-header { - display: inline-block; - width: 46px; - height: 42px; - border-right:1px solid white; - } - - nav ul{ - display:none; - } - - .search input{ - width: 180px; - } - - nav img{ - margin-left: 10px; - } - -} - - -@media only screen and (max-width: 370px){ - .search{ - display: none; - } -} - - -/*hero*/ - -section#hero{ - text-align: center; - left:0px; - top:0; - width:100%; - border-bottom: 0px; -} - -section#hero p{ - max-width: 600px; - margin: 10px auto 20px auto; - -} - -section#hero .version{ - color:grey; - font-size: 12px; - margin-bottom:0px; -} - -section#hero .acknowledge{ - color:grey; - font-size: 12px; - margin-top:0px; - margin-bottom:10px; -} - -section#hero img{ - display: inline; - margin:20px 0px; - max-width:90%; -} - -section#hero div#documentation{ - color:white; - display: inline-block; - position: relative; -} - -section#hero div#documentation span{ - font-size: 10px; - padding:10px 20px 6px 20px; -} - -section#hero div#documentation a{ - color: white; - text-align:center; -} - -section#hero div#documentation ul{ - border-top: white 2px solid; - text-align: left; - position: absolute; - left: 179px; top: 33px; - display: none; - background-color: #FF5000; - width: 107px; - font-size: 12px; - z-index:1; -} - -section#hero div#documentation ul li{ - border-top: white 1px solid; - padding: 5px 5px; - list-style: none; - margin: 0px; -} -section#hero div#documentation ul li:hover{ - background-color: #ffa077; - cursor: pointer; -} - -section#hero div#documentation ul li a { - display: block; - text-decoration: none; -} - -/*Front Page*/ - -section.whatsnew{ - border:1px #E8E8E8 solid; - border-right-style:none; - border-left-style:none; - border-padding:1px; - padding-top: 15px; - padding-bottom: 15px; -} - -section.whatsnew .version{ - color:grey; - font-size: 12px; - margin-top:6px; - margin-bottom:0px; -} - -.whatsnew{ - font-size: 24px; - text-align: center; -} - -/*Installation Instructions*/ - -/*section.install{ - margin-top:380px; -}*/ - -/*section.install div{ - margin-top: 30px; -}*/ - -section.install .button.download{ - padding: 5px 5px; -} - -section.install ul li{ - list-style: none; - margin-left: 0px; -} - -section.install ul li a{ - background: #fff; - border: 1px #FFE1D6 solid; - padding: 10px; - float: left; - margin: 0px 5px -1px 5px; - height:20px; - line-height: 20px; - border-radius: 3px 3px 0px 0px; -} -section.install ul li a.right{ - float: right; -} - - -/* Make tweaks here to accomodate additional tabs */ -@media all and (max-width: 630px) { - section.install ul li a{ - padding:10px 2px; - font-size:12px; - } -} - -@media all and (max-width: 420px) { - - section.install ul li a{ - padding: 10px 15px; - } - - section.install ul li a span{ - display: none; - } -} -/* end changes */ - - -section.install ul li:first-child a{ - margin-left: 0px; -} - -section.install div h3{ - color: black; - margin-top: 0px; -} - - - - -/* Affiliated (pre-APE 22) */ - -.featured{ - background-color:#fdfdfd; -} - -.featured div{ - clear: both; - padding: 20px 0px; -} - -.featured div:first-of-type{ - padding-top: 5px; -} - -.featured div h3{ - color:black; - margin-bottom: 10px; - padding-bottom: 10px; - border-bottom: 1px solid #FFE1D6; -} - -.featured img{ - float: left+; - margin-right:10px; -} - -table{ - margin: 20px 0px; - word-break:overflow-wrap; -} - - - -thead{ - text-align: left; - font-weight: bold; - border-bottom: 1px solid rgba(128,128,128,0.2); -} - - - -td{ - padding:5px 5px; - font-size: 100%; - line-height: 1.3em; -} - - -td.first-package-row { - padding:15px 5px 5px 5px; - font-weight: bold; - } - -/* Create gray border after every 3rd row to visually separate packages */ -table tr.border-top { - border-top: 1px solid rgba(128,128,128,0.2); -} - - -/* About */ - -p.citation{ - margin: 10px 40px; -} - -ul.team{ - -moz-column-count:5; /* Firefox */ - -webkit-column-count:5; /* Safari and Chrome */ - column-count:5; -} - -@media only screen and (max-width: 920px){ - ul.team{ - -moz-column-count:2; /* Firefox */ - -webkit-column-count:2; /* Safari and Chrome */ - column-count:2; - } -} - -ul.team li, ul.coordinators li{ - margin-bottom:0px; -} - -p.centered { - text-align: center -} - -.center { - text-align: center; - color: red; -} - -.dropdown { - position: relative; - display: inline-block; -} - -.dropdown-content { - display: none; - position: absolute; - background-color: DimGray; - min-width: 160px; - width: 100%; - height: 100% - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - padding: 0px 16px; - z-index: 1; -} - -.dropdown:hover .dropdown-content { - display: block; -} - -.dropdown-content a { -display: block; -} - -.dropdown-content a:hover { -color: white; -} - -.dropdown a:hover { -color: #FF5000; -} - -.dropdown z:hover { -color: #FF5000; -width: 10; -display: none; -} - -.dropdown z { -color: white; -} - -.dropdown:after { - content: ""; - position: absolute; - right: -13px; - top: 9px; - width: 0; - height: 0; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid white; -} - -#roles-table td { - padding: 7px 5px; -} diff --git a/editing_tips.txt b/editing_tips.txt deleted file mode 100644 index 8ad55b4e..00000000 --- a/editing_tips.txt +++ /dev/null @@ -1,9 +0,0 @@ -Editing the installation instructions tabs: - -1) To add additional tabs, copy the format used by existing tabs, including wrapping the text title in the table in a span tag. - -2) When the window width becomes less than a specified value, the css of span tag will switch to display:none and the padding on the tab will be adjusted slightly. If adding additional tabs, the values for this transition will be have to be tweaked in css/style.css. I've marked this area (l:439-456 in this commit) with the comment: "/* Make tweaks here to accommodate additional tabs */". Change the max-width parameter on both @media styles to allow the tabs to shrink gracefully when resizing the window. - -The first style shrinks the font size and padding to allow the full text to appear on tablets. The second style hides the text for optimal viewing on phones. Feel free to further adjust font-sizes and padding in these styles to produce the optimal experience. - -3) If the number of tabs increases, it may be necessary to adjust the min-width of the whole site. This can be done by tweaking the min-width style under #wrapper (l:61 in this commit). Try to avoid increasing this value too much and instead adjust padding, font size or image sizes as in step (2) or else you will get a horizontal scrollbar on phones which is less than ideal. diff --git a/getteam.py b/getteam.py deleted file mode 100644 index 08c966bf..00000000 --- a/getteam.py +++ /dev/null @@ -1,119 +0,0 @@ -""" -A command line script that updates "The team" in the ``about.html`` file to -reflect the current ``credits.rst`` file from the astropy repository. - -Note that this first looks for the ``ASTROPY_REPO_PATH`` environment -variable to try to find a local copy of the astropy repo. -""" - - -def get_astropy_credits(warner=print): - """ - Looks for the ``credits.rst`` file in the astropy repo and returns it, or - returns False if the repo can't be found. - """ - import os - import requests - - creditspath = os.environ.get('ASTROPY_REPO_PATH', 'https://raw.githubusercontent.com/astropy/astropy/main/docs/credits.rst') - - if creditspath.startswith('http'): - #url - download page from web - u = None - try: - return requests.get(creditspath).content - except Exception as e: - warner('Could not download credits.rst from requested path: "{0}" Using placeholder for "The Team" page.'.format(e)) - return False - finally: - if u is not None: - u.close() - else: - if not os.path.isfile(creditspath): - warner('Credits.rst file at "{0}" is not a file! Using placeholder for "The Team" page.'.format(creditspath)) - return False - - with open(creditspath) as f: - return f.read() - - -def extract_names_list(docs, sectionname, warner=print): - from docutils import nodes - from docutils.core import publish_doctree - - if not isinstance(docs, nodes.document): - docs = publish_doctree(docs) - - assert isinstance(docs, nodes.document) - - foundsections = [] - for c in docs.children: - titleidx = c.first_child_matching_class(nodes.title) - if titleidx is not None: - title = str(c.children[titleidx].children[0]) - if title == sectionname: - section = c - break - else: - foundsections.append(title) - else: - warner("No section found with name {0}. Sections are:{1!s}".format(sectionname, foundsections)) - return None - - listidx = section.first_child_matching_class(nodes.bullet_list) - litems = section.children[listidx].children - - names = [] - for litem in litems: - # Use astext() to get the concatenated text content of the list item - # instead of joining node objects which can produce unexpected - # characters when their string representation is used. - names.append(litem.astext()) - - return names - - -def process_html(fn, newcontributors, indent='\t\t\t'): - """ - Returns a string of html mean to look like the input, but with content from - the credits file. - """ - lines = [] - incoord = incontrib = False - with open(fn) as fr: - for l in fr: - if l.endswith('\n'): - l = l[:-1] # strip newline - - if incontrib: - if '' in l: - lines.extend([(indent + '
  • ' + c + '
  • ') for c in newcontributors]) - lines.append(l) - incontrib = False - else: - if '
      ' in l: - lines.append(l) - lines.append(f"{:>12}") - #skip otherwise - else: - # if '
        ' in l: - # incoord = True - if '

        ' in l: - incontrib = True - lines.append(l) - - return '\n'.join(lines) - - -if __name__ == '__main__': - from docutils.core import publish_doctree - - dt = publish_doctree(get_astropy_credits()) - - contributors = extract_names_list(dt, 'Core Package Contributors') - - newhtml = process_html('team.html', contributors) - print('Replacing "team.html" with updated version. Be sure to "git diff ' - 'team.html" before committing to ensure no funny business happened.') - with open('team.html', 'wb') as f: - f.write(newhtml.encode('UTF-8')) diff --git a/help.html b/help.html deleted file mode 100644 index fd5ea77e..00000000 --- a/help.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - -Astropy | Get Help - - - - - - - -
        - - -
        -

        Getting Help with Astropy

        - -

        The best way to get help is usually by asking questions to the Astropy user - and development community. There are a number of active forums and you are - welcome to use whichever one you are the most comfortable with.

        - -
          -
        • Open Astronomy Discourse - This forum allows - questions to be tagged by topic, is searchable on Google, and displays - code snippets well. Please head over and ask (and answer) questions.
        • - -
        • Astropy Slack workspace (get an account) - This forum is primarily - focused on developing and maintaining the Astropy project, but the - #community-help channel is a good place for users to seek help from the - Astropy community.
        • - -
        • Astropy Users Email - List [astropy@python.org] - Post questions or start discussions about anything related to - Python programming applied to astronomy.
        • - -
        • Astropy Developers Email - List [astropy-dev@googlegroups.com] - Start discussions and ask questions about changing or adding - functionality to the astropy package. This is also the place where significant - announcements for contributors/developers are usually made. If you would like to - participate in discussion about how the Project is run, - please join this list. -
        • - -
        - -
        - - - -
        - - - diff --git a/history.html b/history.html deleted file mode 100644 index 7e02d5d0..00000000 --- a/history.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - - - - - -Astropy - - - - - - - - -
        - - -
        -

        A brief history of the Astropy Project

        - -

        Some of the earliest use of Python in astronomy was at the Space Telescope - Science Institute (STScI) with their release of PyRAF around 2000. That - release helped raise awareness of Python as a scripting language, leading to - its use at more institutions. STScI was also active in the development of - Python tools for science, including a pre-cursor to numpy and early versions - of matplotlib. By the early 2010s there were multiple independent efforts - by institutions and individuals to use Python for data analysis.

        - -

        The initial trigger for Astropy was a conversation - in 2011 on the astropy mailing list (which pre-dated The Astropy Project by - over a decade) on the topic of how many “general astronomy” packages were - being written in Python. This discussion thread led to the creation of a short-lived - wiki where over 100 participants voted in favor of a shared package to - combine the efforts of these different developers into a single space. This - demonstrated broad interest in such an effort. With that motivation and - charge in place, this same wiki was used to organize a planning meeting for - this effort.

        - -

        That planning meeting, in Fall 2011, was the formal beginning of the - Astropy Project and was held at the Harvard - Center for Astrophysics. The list - of attendees at that meeting underscores what has been essential to the - launch, growth, and continued development of Astropy: it was a mix of - graduate students, postdocs, scientists, and professional software developers. - The attendees with permanent positions were willing to contribute both code - and their time to the project; Space Telescope Science Institute - (STScI) additionally contributed substantial staff time to the project. The - early-career attendees had either already devoted substantial time to code - development, would do so over the ensuing years, or both.

        - -

        The foundation of Astropy’s subsequent success was the combination of - institutional resources, a deliberate effort to include and foster the growth - of a broad community of contributors, the rapid growth of GitHub and the - surrounding ecosystem of open source development tools, and a willingness of - early-career professionals to contribute code to an open community project. - The initial release for users of the core astropy package, version 0.2 on - February 19, 2013, was less than 18 months after the CfA meeting and already - contained many of the core subpackages that are part of the package today. - That was possible only because some of the code already existed in a form - that could be adapted to Astropy. Major pieces had been written by staff at - STScI that were contributed by the Institute to the project. There were also - large contributions from early participants who were graduate students and - postdocs.

        - -

        By the time of the first stable release in 2013, the number of contributors - to the code base was over 20, including several people who were not involved - in the initial meeting. Though most of the lines of code at that point had - been written by a handful of people, the effort they put into welcoming and - supporting new contributors was just as important and is not easily captured - in a single number. The project made an effort early on to provide prompt, - constructive, and welcoming feedback to new contributors. The promptness was - a key factor in encouraging early contributors and was possible in part - because STScI devoted substantial staff time to the project with the explicit - intent of growing the community of contributors.

        - -

        One of the Project’s first efforts to formally recruit early career - scientists was participation in - Google’s Summer of Code (GSoC) program. - That program provides participants with a stipend in exchange for doing - extensive work on open source projects during the northern hemisphere summer. - It was the first of several efforts to grow the community of contributors. - These efforts yielded a handful of very active long-term contributors to the - project whose cumulative work goes well beyond the initial code contributions - made by participants.

        - -

        Another critical element in the growth of the Astropy Project was the - Python in Astronomy conference series. The first Python in Astronomy - conference was held in 2015. The hope was that the conference would encourage - the development of Python packages in astronomy outside of the astropy core, - foster the adoption of Astropy in the broader community, and serve as an - introduction to contributing to open source software. Though it was not an - Astropy conference, many of the astropy core developers were attending. For - example, the initial Code of Conduct for the Astropy Project was written at - the conference and the “Python in Astronomy” Facebook group was started, - among other - activities.

        - -

        The intent from the first coordination meeting in 2011 was to put some - functionality into more specialized packages, called affiliated packages, - that were developed independent of the core project but followed the same - coding, testing and documentation conventions and often used the same - continuous integration (CI) infrastructure. The first affiliated packages - were created in 2011. That model has been quite successful: as of early 2022 - there are almost 50 affiliated packages (pre-APE 22). The use of common conventions across - the packages has eased the burden of maintaining those packages as the - project ecosystem grows.

        - -

        Deliberate community development has been essential to the success of the - Project and has included several aspects. Astropy was an early and - enthusiastic adopter of an explicit Code of Conduct. This served to formalize - the welcoming atmosphere established early in the project. Community presence - has included setting up social media spaces for Python in Astronomy, - workshops at AAS meetings, work on learning materials for Astropy and - development of the project’s web presence. The Facebook group “Python in - Astronomy’’ has been wildly successful with over 6400 members and nearly - daily postings. This success is in part because of careful moderation by - members of the project early in the list's history to keep conversations on topic, though community moderators have taken on more of those responsibilities as time has gone on. Workshops at AAS - meetings have helped several hundred astronomers adopt Python and astropy as - part of their workflow.

        - -

        The day-to-day effort of managing the Astropy codebase is unglamorous but - critical. Tasks include promptly labeling and triaging new issues, responding - to new pull requests, and watching for and fixing changes that break part of - the infrastructure. There have been times when that infrastructure has - shifted very rapidly, such as when Travis-CI - stopped hosting open source packages. Transitioning the entire ecosystem - to a new infrastructure required substantial effort by a number of people, - though it was facilitated primarily by a single individual. Indeed, much of - this day-to-day work has been done by a handful of people, many of whom are - in permanent positions at STScI and a few other institutions.

        - -

        The patterns at the beginning of the project have persisted throughout: it - is the combined effort of individuals and institutions that includes - scientists and software developers. It includes early-career individuals and - those in permanent positions.

        - -

        There are a few important changes to the project since its inception. One - is external funding from the Moore Foundation in 2019 and from NASA in 2022, - which provides monetary support for contributors at all career stages in - addition to funding for Project needs. Another is the establishment of a - formal governance structure - (APE 0 - adopted in 2021) that is open and responsive to community needs.

        - -

        Another development that was perhaps not envisioned at the start of the - project is some contributors choosing to make Astropy an essential part of - their career. Their involvement since the beginning of the project has - provided continuity to the project and represents taking a risk that - potential future employers may not scientifically value this software work, - regardless of its impact on astronomy as a whole.

        - -

        As of summer 2022, the success of the Project hinged on a number of factors, - including the willingness of institutions and individuals to contribute - extensive prior work to a community project, a deliberate effort to foster - new contributors, and an effort to create a welcoming community. It is - difficult to see how the project could have come so far absent any of these - factors or absent any one of the groups of contributors. Institutional - support and individual contributions has been inextricably linked.

        - -
        - - -
        - - - - diff --git a/index.html b/index.html deleted file mode 100644 index 3ce8b623..00000000 --- a/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - -Astropy - - - - - - - - - - - -
        - - -
        - Astropy: a community Python library for Astronomy -

        The Astropy Project is a community effort to develop a common core - package for Astronomy in Python and foster an ecosystem of interoperable - astronomy packages.

        -

        The Astropy community is committed to - supporting the community code of conduct.

        -

        Please remember to acknowledge and cite the use of Astropy!

        -
        - -
        - What's new in Astropy 7.2 -

        - -
        - -
        -

        Install Astropy

        - There are a number of ways of installing the latest release of the astropy core package. If you normally use pip to install Python packages, you can do: -

        pip install astropy[recommended] --upgrade
        - The astropy core package is also available in a number of other package managers, so be sure to check your preferred one! -

        Please see the astropy installation guide for important details. This guide covers creating a Python environment, installing with pip or conda, building from source, requirements, and testing.

        -
        - -
        -

        Learn Astropy

        -

        You can explore the functionality available in Astropy by checking out the Tutorials and Documentation.

        - Tutorials - Documentation -
        - -
        -

        Get Help

        -

        If you have any questions regarding using Astropy there are numerous channels for communication. Post to any one of several forums to get help from our active, helpful, and friendly community of users and developers. -

        - Get Help -
        - -
        -

        Report bugs and Contribute

        -

        If you encounter something you believe to be a mistake, error, or bug, the best way to get it addressed is to report it on the github issue tracker. If you aren't sure if something is a bug or not, or if you don't have a Github account, feel free to ask on one of the forums. If you believe you know how to fix the problem, please consider contributing!

        - Report issues - Contribute -
        - -
        -

        Support Astropy

        -

        If you use Astropy in your work, we would be grateful if you could include an acknowledgment in papers and/or - presentations. See Acknowledging & Citing Astropy for details.

        -

        You can also purchase apparel and trinkets from fashion.astropy.org, and - a portion of the profits go to support the project!

        -

        If you are interested in directly financially supporting Astropy (either one-time or recurring), you can do so - via our fiscal sponsor NumFOCUS:

        - Donate to Astropy -
        - -
        -

        Awards

        -

        -

        -

        -
        - -
        -

        Zenodo community

        -

        Documents, notes from previous meetings, and talks about Astropy are collected in a Zenodo community for long-term archiving. - Everyone is encouraged to submit talks, etc. and other relevant materials. -

        - Zenodo community -
        - -
        - - - -
        -
        - - - - diff --git a/index.rst b/index.rst new file mode 100644 index 00000000..0cfa6be5 --- /dev/null +++ b/index.rst @@ -0,0 +1,275 @@ +.. astropy-org:index +Astropy +======= + +.. toctree:: + :maxdepth: 0 + :hidden: + + about/index + +.. raw:: html + +
        +
        +
        + +.. image:: _static/img/astropy_project_logo.svg + :name: logo + :class: dark-light sunpy-logo + :alt: Astropy Logo + +.. raw:: html +
        + +
        + +The Astropy Project is a community effort to develop a `common core package `__ for Astronomy in Python and foster an ecosystem of :ref:`astropy-org:affiliated`. +The Astropy community is committed to supporting the :ref:`astropy-org:coc`. + +.. rst-class:: acknowledge + + Please remember to :ref:`astropy-org:acknowledge` the use of Astropy! + +.. raw:: html + +
        +
        +
        + +.. container:: text-center mx-auto + + .. rst-class:: whatsnew + + What's new in `Astropy 7.2 `__ + + .. raw:: html + +

        + Latest stable release: +

        + +Install Astropy +--------------- + +There are a number of ways of installing the latest release of the astropy core package. If you normally use ``pip`` to install Python packages, you can do: + +.. code-block:: + + pip install astropy[recommended] --upgrade + +The astropy core package is also available in a number of other package managers, so be sure to check your preferred one! +Please see the `astropy installation guide `__ for important details. + +This guide covers creating a Python environment, installing with ``pip`` or ``conda``, building from source, requirements, and testing. + +Learn Astropy +------------- + +You can explore the functionality available in Astropy by checking out the `Tutorials `__ and `Documentation `__. + +.. grid:: 2 + :gutter: 1 + + .. grid-item:: + :columns: auto + + .. button-link:: https://learn.astropy.org + + Tutorials + + .. grid-item:: + :columns: auto + + .. button-link:: https://docs.astropy.org/en/stable/index.html + + Documentation + +Get Help +-------- + +If you have any questions regarding using Astropy there are numerous +channels for communication. Post to any one of several forums to get +help from our active, helpful, and friendly community of users and +developers. + +.. button-link:: help.html + + Get Help + +Report bugs and Contribute +-------------------------- + +If you encounter something you believe to be a mistake, error, or bug, the best way to get it addressed is to report it on the `github issue tracker `__. +If you aren't sure if something is a bug or not, or if you don't have a Github account, feel free to ask on one of the `forums `__. +If you believe you know how to fix the problem, please consider `contributing `__! + +.. grid:: 2 + :gutter: 1 + + .. grid-item:: + :columns: auto + + .. button-link:: https://github.com/astropy/astropy/issues + + Report issues + + .. grid-item:: + :columns: auto + + .. button-link:: contribute.html + + Contribute + +Support Astropy +--------------- + +If you use Astropy in your work, we would be grateful if you could +include an acknowledgment in papers and/or presentations. See +`Acknowledging & Citing Astropy `__ for details. + +You can also purchase apparel and trinkets from +`fashion.astropy.org `__, and a portion +of the profits go to support the project! + +If you are interested in directly financially supporting Astropy +(either one-time or recurring), you can do so via our fiscal sponsor +NumFOCUS: + +.. button-link:: https://numfocus.org/donate-to-astropy + + Donate to Astropy + +Awards +------ + +- `Lancelot M. Berkeley–New York Community Trust Prize for Meritorious Work in Astronomy `__ (2025) +- `IOP Publishing Top Cited Paper Awards North America `__ (2023) +- `ADASS Prize for an Outstanding Contribution to Astronomical Software `__ (2022) +- `Royal Astronomical Society Group Award (Astronomy) `__ (2020) + +.. rst-class:: last + +Zenodo Community +---------------- + +Documents, notes from previous meetings, and talks about Astropy are +collected in a Zenodo community for long-term archiving. Everyone is +encouraged to submit talks, etc. and other relevant materials. + +.. button-link:: https://www.zenodo.org/communities/astropy + + Zenodo community + +.. raw:: html + + + +.. raw:: html + + + + diff --git a/js/analytics.js b/js/analytics.js deleted file mode 100644 index eff5389a..00000000 --- a/js/analytics.js +++ /dev/null @@ -1,9 +0,0 @@ -(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ -(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), -m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) -})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - -ga('create', 'G-R0510VK4B6', 'auto'); -ga('require', 'displayfeatures'); -ga('require', 'linkid', 'linkid.js'); -ga('send', 'pageview'); diff --git a/js/functions.js b/js/functions.js deleted file mode 100644 index 78a1f0f5..00000000 --- a/js/functions.js +++ /dev/null @@ -1,433 +0,0 @@ -$( document ).ready(function(){ - - $('#responsive-menu-button').sidr({ - name: 'sidr-main', - source: '#navigation' - }); - - $("div#documentation span").click(function() { //When trigger is clicked... - - $("div#documentation ul").slideDown('fast').show(); //Drop down the subnav on click - - $(this).parent().hover(function() { - }, function(){ - $(this).parent().find("ul").slideUp('fast'); //When the mouse hovers out of the subnav, move it back up - }); - - - //Following events are applied to the trigger (Hover events for the trigger) - }).hover(function() { - $(this).addClass("subhover"); //On hover over, add class "subhover" - }, function(){ //On Hover Out - $(this).removeClass("subhover"); //On hover out, remove class "subhover" - }); - - $('#os-selector ul').each(function(){ - // For each set of tabs, we want to keep track of - // which tab is active and it's associated content - var hash, $active, $content, $links = $(this).find('a'); - - // If the location.hash matches one of the links, use that as the active tab. - // If no location.hash is given, use a tab determined by guess_os() - // If no match is found, use the first link as the initial active tab. - hash = (location.hash === "") ? '#' + guess_os() : location.hash; - $active = $($links.filter('[href="'+hash+'"]')[0] || $links[0]); - $active.addClass('active'); - $content = $($active.attr('href')); - - // Hide the remaining content - $links.not($active).each(function () { - $($(this).attr('href')).hide(); - }); - - // Bind the click event handler - $(this).on('click', 'a', function(e){ - // Make the old tab inactive. - $active.removeClass('active'); - $content.hide(); - - // Update the variables with the new link and content - $active = $(this); - $content = $($(this).attr('href')); - - // Make the tab active. - $active.addClass('active'); - $content.show(); - - // Prevent the anchor's default click action - e.preventDefault(); - }); - - // Now go through and find any links that are *not* in the above list - // but should point to a tab. - $('a').each(function(){ - //For every link check if it matches one of the tabs. - //If so, replace with "clicking" on the tab. - var $curra = $(this); - var currhref = $curra.attr('href'); - $links.each(function() { - var $currlia = $(this); - - if ((currhref == $currlia.attr('href'))) { - //Don't press the tab itself, that's above - if (! $curra.is($currlia)) { - $curra.on('click', function(e){ - //act like we clicked on the tab itself instead of this link - $currlia.click(); - // We let the default through here, because - // you probably want to jump to the revealed tab - e.preventDefault(); - }); - } - } - }); - }); - }); - - // makes permalink visible only when user moves cursor on headline, otherwise hidden - $("h1").hover(function() { - $(this).children("a").css("visibility", "visible"); - }, function() { - $(this).children("a").css("visibility", "hidden"); - }); - $("h2").hover(function() { - $(this).children("a").css("visibility", "visible"); - }, function() { - $(this).children("a").css("visibility", "hidden"); - }); - $("h3").hover(function() { - $(this).children("a").css("visibility", "visible"); - }, function() { - $(this).children("a").css("visibility", "hidden"); - }); - -}); // Document Ready - - -//Using jQuery is ok because it is needed by and bundled with sphinx - -//Quirk to note: the jQuery.getJSON function fails if you open this locally -//with Chrome, because Chrome thinks local JSON files are unsafe for some -//reason. Use basically any other modern browser, or it works fine if its -//actually on the web server even with chrome. - -function url_translator(urltext) { - if (urltext === undefined) { - return 'None'; - } else { - return '' + 'Website' + ''; - } -} - - -function repo_translator(urltext) { - if (urltext === undefined) { - return 'None'; - } else { - return '' + 'Repository' + ''; - } -} - - -function pypi_translator(pypiname) { - if (pypiname === undefined) { - return 'None'; - } else { - var urltext = 'https://pypi.python.org/pypi/' + pypiname; - return '' + 'PyPI' + ''; - } -} - - -function bool_translator(stable) { - if (stable) { - return 'Yes'; - } else { - return 'No'; - } -} - - -function ghuser_translator(fullname, ghname) { - if (fullname === undefined || ghname === undefined) { - return 'None'; - } else { - var urltext = 'https://github.com/' + ghname; - if (fullname === null) { - fullname = ghname; - } - return '' + fullname + ''; - } -} - - -var _email_regex_str = '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'; -var _email_regex = new RegExp(_email_regex_str, 'i'); -var _email_with_name_regex = new RegExp('(.+)<(' + _email_regex_str + ')>', 'i'); - - -function maintainer_translator(maint, pkgnm) { - var url, match; - if (_email_with_name_regex.test(maint)) { - match = _email_with_name_regex.exec(maint); - url = 'mailto:' + match[2] + '?subject=Astropy%20affiliated%20package%20' + pkgnm; - return '' + match[1] + ''; - } else if (_email_regex.test(maint)) { - url = 'mailto:' + maint + '?subject=Astropy%20affiliated%20package%20' + pkgnm; - return '' + maint + ''; - } else { - return maint; - } -} - - -function createRolesTable(roles) { - //roles is an array of objects called "role" - var rows = ''; - roles.forEach(function (role) { - //role is an object containing information about each team role - //index marks current people - var index = 0; - - // for roles where there are no sub-roles, the people are defined - // at the top-level of the JSON role dict - for convenience below we create - // a virtual sub-role with no heading - if (!('sub-roles' in role)) { - role['sub-roles'] = [{'role': '', - 'people': role['people']}]; - } - - //creating each row by iterating over each person in a role - role["sub-roles"].forEach(function (subrole) { - //rowRole is displayed once for each role - rowRole = index == 0 ? '' + role["role"] + '' : ""; - - var rowSubRole = subrole['role']; - - if (subrole['people'][0] == "Unfilled") { - rowPeople = 'Unfilled'; - } else { - rowPeople = subrole['people'].join(', '); - } - - //generating rows - if (index == 0) { - rows += ''; - } else { - rows += ''; - } - - rows += '' + rowRole + '' + - '' + rowSubRole + '' + - '' + rowPeople + '' + - ''; - index++; - }); - }); - - $("#roles-table").append(rows); -} - - -function createRolesDescription(roles) { - //roles is an array of objects called "role" - var blocks = ""; - roles.forEach(function (role) { - //role is an object containing information about each team role - var list = ""; - //checking if role["description"] array isn't empty - if (role["responsibilities"] != null) { - - // If responsibilities is a dict, wrap inside a list so that all entries have a list - // dicts - if (role['responsibilities'].constructor == Object) { - role['responsibilities'] = [role['responsibilities']]; - } - - //console.log(role['responsibilities']); - - blocks += '
        ' + - '

        ' + role["role-head"] + '

        '; - - index = 0; - - role['responsibilities'].forEach(function (resp) { - - //console.log(resp); - - detail_list = ''; - resp["details"].forEach(function (detail) { - detail_list += '
      • ' + detail + '
      • '; - }); - - if ('subrole-head' in resp) { - if (index > 0) { - blocks += '
        '; - } - blocks += '' + resp["subrole-head"] + ''; - } - blocks += '

        ' + resp["description"] + '

        ' + - '
          ' + detail_list + '
        '; - - index += 1; - - }) - - } - }); - $("#roles-description").append(blocks); -} - - -function populateRoles(data, tstat, xhr) { - //creating roles table from json data - createRolesTable(data); - //creating roles lists from json data - createRolesDescription(data); -} - - -function populateTables(data, tstat, xhr) { - populatePackageTable('coordinated', filter_pkg_data(data, "coordinated", true)); - populatePackageTable('affiliated', filter_pkg_data(data, "coordinated", false)); -} - - -function filter_pkg_data(data, field, value) { - if (data === null) { - return null; - } - var pkgs = data.packages; - var filtered_data = []; - - for (i=0; i nmarr[b] ? 1 : 0; }); - - var pkgi; - var namerow, descrow, shieldrow, maintrow; - var nmcell, pypicell, urlcell, repocell; - var desccell, maintcell, shieldcell; - - for (i=0; i" + " " - } - } - } - return shield_string -} - - -function guess_os() { - var OSName="source"; - if (navigator.appVersion.indexOf("Win")!=-1) OSName="windows"; - if (navigator.appVersion.indexOf("Mac")!=-1) OSName="osx"; - if (navigator.appVersion.indexOf("Linux")!=-1) OSName="linux"; - return OSName; -} diff --git a/js/jquery.sidr.min.js b/js/jquery.sidr.min.js deleted file mode 100644 index c0e3deb4..00000000 --- a/js/jquery.sidr.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! Sidr - v1.2.1 - 2013-11-06 - * https://github.com/artberri/sidr - * Copyright (c) 2013 Alberto Varela; Licensed MIT */ -(function(e){var t=!1,i=!1,n={isUrl:function(e){var t=RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i");return t.test(e)?!0:!1},loadContent:function(e,t){e.html(t)},addPrefix:function(e){var t=e.attr("id"),i=e.attr("class");"string"==typeof t&&""!==t&&e.attr("id",t.replace(/([A-Za-z0-9_.\-]+)/g,"sidr-id-$1")),"string"==typeof i&&""!==i&&"sidr-inner"!==i&&e.attr("class",i.replace(/([A-Za-z0-9_.\-]+)/g,"sidr-class-$1")),e.removeAttr("style")},execute:function(n,s,a){"function"==typeof s?(a=s,s="sidr"):s||(s="sidr");var r,d,l,c=e("#"+s),u=e(c.data("body")),f=e("html"),p=c.outerWidth(!0),g=c.data("speed"),h=c.data("side"),m=c.data("displace"),v=c.data("onOpen"),y=c.data("onClose"),x="sidr"===s?"sidr-open":"sidr-open "+s+"-open";if("open"===n||"toggle"===n&&!c.is(":visible")){if(c.is(":visible")||t)return;if(i!==!1)return o.close(i,function(){o.open(s)}),void 0;t=!0,"left"===h?(r={left:p+"px"},d={left:"0px"}):(r={right:p+"px"},d={right:"0px"}),u.is("body")&&(l=f.scrollTop(),f.css("overflow-x","hidden").scrollTop(l)),m?u.addClass("sidr-animating").css({width:u.width(),position:"absolute"}).animate(r,g,function(){e(this).addClass(x)}):setTimeout(function(){e(this).addClass(x)},g),c.css("display","block").animate(d,g,function(){t=!1,i=s,"function"==typeof a&&a(s),u.removeClass("sidr-animating")}),v()}else{if(!c.is(":visible")||t)return;t=!0,"left"===h?(r={left:0},d={left:"-"+p+"px"}):(r={right:0},d={right:"-"+p+"px"}),u.is("body")&&(l=f.scrollTop(),f.removeAttr("style").scrollTop(l)),u.addClass("sidr-animating").animate(r,g).removeClass(x),c.animate(d,g,function(){c.removeAttr("style").hide(),u.removeAttr("style"),e("html").removeAttr("style"),t=!1,i=!1,"function"==typeof a&&a(s),u.removeClass("sidr-animating")}),y()}}},o={open:function(e,t){n.execute("open",e,t)},close:function(e,t){n.execute("close",e,t)},toggle:function(e,t){n.execute("toggle",e,t)},toogle:function(e,t){n.execute("toggle",e,t)}};e.sidr=function(t){return o[t]?o[t].apply(this,Array.prototype.slice.call(arguments,1)):"function"!=typeof t&&"string"!=typeof t&&t?(e.error("Method "+t+" does not exist on jQuery.sidr"),void 0):o.toggle.apply(this,arguments)},e.fn.sidr=function(t){var i=e.extend({name:"sidr",speed:200,side:"left",source:null,renaming:!0,body:"body",displace:!0,onOpen:function(){},onClose:function(){}},t),s=i.name,a=e("#"+s);if(0===a.length&&(a=e("
        ").attr("id",s).appendTo(e("body"))),a.addClass("sidr").addClass(i.side).data({speed:i.speed,side:i.side,body:i.body,displace:i.displace,onOpen:i.onOpen,onClose:i.onClose}),"function"==typeof i.source){var r=i.source(s);n.loadContent(a,r)}else if("string"==typeof i.source&&n.isUrl(i.source))e.get(i.source,function(e){n.loadContent(a,e)});else if("string"==typeof i.source){var d="",l=i.source.split(",");if(e.each(l,function(t,i){d+='
        '+e(i).html()+"
        "}),i.renaming){var c=e("
        ").html(d);c.find("*").each(function(t,i){var o=e(i);n.addPrefix(o)}),d=c.html()}n.loadContent(a,d)}else null!==i.source&&e.error("Invalid Sidr Source");return this.each(function(){var t=e(this),i=t.data("sidr");i||(t.data("sidr",s),"ontouchstart"in document.documentElement?(t.bind("touchstart",function(e){e.originalEvent.touches[0],this.touched=e.timeStamp}),t.bind("touchend",function(e){var t=Math.abs(e.timeStamp-this.touched);200>t&&(e.preventDefault(),o.toggle(s))})):t.click(function(e){e.preventDefault(),o.toggle(s)}))})}})(jQuery); \ No newline at end of file diff --git a/js/yaml_parse_bundle.js b/js/yaml_parse_bundle.js deleted file mode 100644 index bce10c7a..00000000 --- a/js/yaml_parse_bundle.js +++ /dev/null @@ -1,138 +0,0 @@ -(()=>{var an=Object.defineProperty;var as=(s,e)=>{for(var t in e)an(s,t,{get:e[t],enumerable:!0})};var ls={};as(ls,{Alias:()=>ee,CST:()=>ns,Composer:()=>be,Document:()=>se,Lexer:()=>Me,LineCounter:()=>Be,Pair:()=>C,Parser:()=>we,Scalar:()=>y,Schema:()=>Ce,YAMLError:()=>$e,YAMLMap:()=>$,YAMLParseError:()=>q,YAMLSeq:()=>M,YAMLWarning:()=>_e,isAlias:()=>F,isCollection:()=>T,isDocument:()=>X,isMap:()=>R,isNode:()=>L,isPair:()=>A,isScalar:()=>O,isSeq:()=>U,parse:()=>rn,parseAllDocuments:()=>nn,parseDocument:()=>os,stringify:()=>on,visit:()=>V,visitAsync:()=>je});var et=Symbol.for("yaml.alias"),tt=Symbol.for("yaml.document"),Q=Symbol.for("yaml.map"),Mt=Symbol.for("yaml.pair"),x=Symbol.for("yaml.scalar"),re=Symbol.for("yaml.seq"),j=Symbol.for("yaml.node.type"),F=s=>!!s&&typeof s=="object"&&s[j]===et,X=s=>!!s&&typeof s=="object"&&s[j]===tt,R=s=>!!s&&typeof s=="object"&&s[j]===Q,A=s=>!!s&&typeof s=="object"&&s[j]===Mt,O=s=>!!s&&typeof s=="object"&&s[j]===x,U=s=>!!s&&typeof s=="object"&&s[j]===re;function T(s){if(s&&typeof s=="object")switch(s[j]){case Q:case re:return!0}return!1}function L(s){if(s&&typeof s=="object")switch(s[j]){case et:case Q:case x:case re:return!0}return!1}var cs=s=>(O(s)||T(s))&&!!s.anchor;var K=Symbol("break visit"),fs=Symbol("skip children"),z=Symbol("remove node");function V(s,e){let t=us(e);X(s)?ke(null,s.contents,t,Object.freeze([s]))===z&&(s.contents=null):ke(null,s,t,Object.freeze([]))}V.BREAK=K;V.SKIP=fs;V.REMOVE=z;function ke(s,e,t,n){let i=hs(s,e,t,n);if(L(i)||A(i))return ps(s,n,i),ke(s,i,t,n);if(typeof i!="symbol"){if(T(e)){n=Object.freeze(n.concat(e));for(let r=0;rs.replace(/[!,[\]{}]/g,e=>cn[e]),Z=class s{constructor(e,t){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},s.defaultYaml,e),this.tags=Object.assign({},s.defaultTags,t)}clone(){let e=new s(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){let e=new s(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:s.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},s.defaultTags);break}return e}add(e,t){this.atNextDocument&&(this.yaml={explicit:s.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},s.defaultTags),this.atNextDocument=!1);let n=e.trim().split(/[ \t]+/),i=n.shift();switch(i){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;let[r,o]=n;return this.tags[r]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;let[r]=n;if(r==="1.1"||r==="1.2")return this.yaml.version=r,!0;{let o=/^\d+\.\d+$/.test(r);return t(6,`Unsupported YAML version ${r}`,o),!1}}default:return t(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e==="!")return"!";if(e[0]!=="!")return t(`Not a valid tag: ${e}`),null;if(e[1]==="<"){let o=e.slice(2,-1);return o==="!"||o==="!!"?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==">"&&t("Verbatim tags must end with a >"),o)}let[,n,i]=e.match(/^(.*!)([^!]*)$/s);i||t(`The ${e} tag has no suffix`);let r=this.tags[n];if(r)try{return r+decodeURIComponent(i)}catch(o){return t(String(o)),null}return n==="!"?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+fn(e.substring(n.length));return e[0]==="!"?e:`!<${e}>`}toString(e){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags),i;if(e&&n.length>0&&L(e.contents)){let r={};V(e.contents,(o,l)=>{L(l)&&l.tag&&(r[l.tag]=!0)}),i=Object.keys(r)}else i=[];for(let[r,o]of n)r==="!!"&&o==="tag:yaml.org,2002:"||(!e||i.some(l=>l.startsWith(o)))&&t.push(`%TAG ${r} ${o}`);return t.join(` -`)}};Z.defaultYaml={explicit:!1,version:"1.2"};Z.defaultTags={"!!":"tag:yaml.org,2002:"};function st(s){if(/[\x00-\x19\s,[\]{}]/.test(s)){let t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(s)}`;throw new Error(t)}return!0}function Bt(s){let e=new Set;return V(s,{Value(t,n){n.anchor&&e.add(n.anchor)}}),e}function Dt(s,e){for(let t=1;;++t){let n=`${s}${t}`;if(!e.has(n))return n}}function ms(s,e){let t=[],n=new Map,i=null;return{onAnchor:r=>{t.push(r),i||(i=Bt(s));let o=Dt(e,i);return i.add(o),o},setAnchors:()=>{for(let r of t){let o=n.get(r);if(typeof o=="object"&&o.anchor&&(O(o.node)||T(o.node)))o.node.anchor=o.anchor;else{let l=new Error("Failed to resolve repeated object (this should not happen)");throw l.source=r,l}}},sourceObjects:n}}function ce(s,e,t,n){if(n&&typeof n=="object")if(Array.isArray(n))for(let i=0,r=n.length;i_(n,String(i),t));if(s&&typeof s.toJSON=="function"){if(!t||!cs(s))return s.toJSON(e,t);let n={aliasCount:0,count:1,res:void 0};t.anchors.set(s,n),t.onCreate=r=>{n.res=r,delete t.onCreate};let i=s.toJSON(e,t);return t.onCreate&&t.onCreate(i),i}return typeof s=="bigint"&&!t?.keep?Number(s):s}var fe=class{constructor(e){Object.defineProperty(this,j,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:i,reviver:r}={}){if(!X(e))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},l=_(this,"",o);if(typeof i=="function")for(let{count:a,res:c}of o.anchors.values())i(c,a);return typeof r=="function"?ce(r,{"":l},"",l):l}};var ee=class extends fe{constructor(e){super(et),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e){let t;return V(e,{Node:(n,i)=>{if(i===this)return V.BREAK;i.anchor===this.source&&(t=i)}}),t}toJSON(e,t){if(!t)return{source:this.source};let{anchors:n,doc:i,maxAliasCount:r}=t,o=this.resolve(i);if(!o){let a=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(a)}let l=n.get(o);if(l||(_(o,null,t),l=n.get(o)),!l||l.res===void 0){let a="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(a)}if(r>=0&&(l.count+=1,l.aliasCount===0&&(l.aliasCount=nt(i,o,n)),l.count*l.aliasCount>r)){let a="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(a)}return l.res}toString(e,t,n){let i=`*${this.source}`;if(e){if(st(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let r=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(r)}if(e.implicitKey)return`${i} `}return i}};function nt(s,e,t){if(F(e)){let n=e.resolve(s),i=t&&n&&t.get(n);return i?i.count*i.aliasCount:0}else if(T(e)){let n=0;for(let i of e.items){let r=nt(s,i,t);r>n&&(n=r)}return n}else if(A(e)){let n=nt(s,e.key,t),i=nt(s,e.value,t);return Math.max(n,i)}return 1}var it=s=>!s||typeof s!="function"&&typeof s!="object",y=class extends fe{constructor(e){super(x),this.value=e}toJSON(e,t){return t?.keep?this.value:_(this.value,e,t)}toString(){return String(this.value)}};y.BLOCK_FOLDED="BLOCK_FOLDED";y.BLOCK_LITERAL="BLOCK_LITERAL";y.PLAIN="PLAIN";y.QUOTE_DOUBLE="QUOTE_DOUBLE";y.QUOTE_SINGLE="QUOTE_SINGLE";var un="tag:yaml.org,2002:";function hn(s,e,t){if(e){let n=t.filter(r=>r.tag===e),i=n.find(r=>!r.format)??n[0];if(!i)throw new Error(`Tag ${e} not found`);return i}return t.find(n=>n.identify?.(s)&&!n.format)}function oe(s,e,t){if(X(s)&&(s=s.contents),L(s))return s;if(A(s)){let f=t.schema[Q].createNode?.(t.schema,null,t);return f.items.push(s),f}(s instanceof String||s instanceof Number||s instanceof Boolean||typeof BigInt<"u"&&s instanceof BigInt)&&(s=s.valueOf());let{aliasDuplicateObjects:n,onAnchor:i,onTagObj:r,schema:o,sourceObjects:l}=t,a;if(n&&s&&typeof s=="object"){if(a=l.get(s),a)return a.anchor||(a.anchor=i(s)),new ee(a.anchor);a={anchor:null,node:null},l.set(s,a)}e?.startsWith("!!")&&(e=un+e.slice(2));let c=hn(s,e,o.tags);if(!c){if(s&&typeof s.toJSON=="function"&&(s=s.toJSON()),!s||typeof s!="object"){let f=new y(s);return a&&(a.node=f),f}c=s instanceof Map?o[Q]:Symbol.iterator in Object(s)?o[re]:o[Q]}r&&(r(c),delete t.onTagObj);let p=c?.createNode?c.createNode(t.schema,s,t):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(t.schema,s,t):new y(s);return e?p.tag=e:c.default||(p.tag=c.tag),a&&(a.node=p),p}function Ke(s,e,t){let n=t;for(let i=e.length-1;i>=0;--i){let r=e[i];if(typeof r=="number"&&Number.isInteger(r)&&r>=0){let o=[];o[r]=n,n=o}else n=new Map([[r,n]])}return oe(n,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:s,sourceObjects:new Map})}var Oe=s=>s==null||typeof s=="object"&&!!s[Symbol.iterator]().next().done,ge=class extends fe{constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(n=>L(n)||A(n)?n.clone(e):n),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(Oe(e))this.add(t);else{let[n,...i]=e,r=this.get(n,!0);if(T(r))r.addIn(i,t);else if(r===void 0&&this.schema)this.set(n,Ke(this.schema,i,t));else throw new Error(`Expected YAML collection at ${n}. Remaining path: ${i}`)}}deleteIn(e){let[t,...n]=e;if(n.length===0)return this.delete(t);let i=this.get(t,!0);if(T(i))return i.deleteIn(n);throw new Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){let[n,...i]=e,r=this.get(n,!0);return i.length===0?!t&&O(r)?r.value:r:T(r)?r.getIn(i,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!A(t))return!1;let n=t.value;return n==null||e&&O(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){let[t,...n]=e;if(n.length===0)return this.has(t);let i=this.get(t,!0);return T(i)?i.hasIn(n):!1}setIn(e,t){let[n,...i]=e;if(i.length===0)this.set(n,t);else{let r=this.get(n,!0);if(T(r))r.setIn(i,t);else if(r===void 0&&this.schema)this.set(n,Ke(this.schema,i,t));else throw new Error(`Expected YAML collection at ${n}. Remaining path: ${i}`)}}};ge.maxFlowStringSingleLineLength=60;var ds=s=>s.replace(/^(?!$)(?: $)?/gm,"#");function Y(s,e){return/^\n+$/.test(s)?s.substring(1):e?s.replace(/^(?! *$)/gm,e):s}var te=(s,e,t)=>s.endsWith(` -`)?Y(t,e):t.includes(` -`)?` -`+Y(t,e):(s.endsWith(" ")?"":" ")+t;var jt="flow",rt="block",qe="quoted";function xe(s,e,t="flow",{indentAtStart:n,lineWidth:i=80,minContentWidth:r=20,onFold:o,onOverflow:l}={}){if(!i||i<0)return s;let a=Math.max(1+r,1+i-e.length);if(s.length<=a)return s;let c=[],p={},f=i-e.length;typeof n=="number"&&(n>i-Math.max(2,r)?c.push(0):f=i-n);let h,d,b=!1,u=-1,m=-1,S=-1;t===rt&&(u=gs(s,u,e.length),u!==-1&&(f=u+a));for(let k;k=s[u+=1];){if(t===qe&&k==="\\"){switch(m=u,s[u+1]){case"x":u+=3;break;case"u":u+=5;break;case"U":u+=9;break;default:u+=1}S=u}if(k===` -`)t===rt&&(u=gs(s,u,e.length)),f=u+e.length+a,h=void 0;else{if(k===" "&&d&&d!==" "&&d!==` -`&&d!==" "){let N=s[u+1];N&&N!==" "&&N!==` -`&&N!==" "&&(h=u)}if(u>=f)if(h)c.push(h),f=h+a,h=void 0;else if(t===qe){for(;d===" "||d===" ";)d=k,k=s[u+=1],b=!0;let N=u>S+1?u-2:m-1;if(p[N])return s;c.push(N),p[N]=!0,f=N+a,h=void 0}else b=!0}d=k}if(b&&l&&l(),c.length===0)return s;o&&o();let w=s.slice(0,c[0]);for(let k=0;k({indentAtStart:e?s.indent.length:s.indentAtStart,lineWidth:s.options.lineWidth,minContentWidth:s.options.minContentWidth}),at=s=>/^(%|---|\.\.\.)/m.test(s);function pn(s,e,t){if(!e||e<0)return!1;let n=e-t,i=s.length;if(i<=n)return!1;for(let r=0,o=0;rn)return!0;if(o=r+1,i-o<=n)return!1}return!0}function Fe(s,e){let t=JSON.stringify(s);if(e.options.doubleQuotedAsJSON)return t;let{implicitKey:n}=e,i=e.options.doubleQuotedMinMultiLineLength,r=e.indent||(at(s)?" ":""),o="",l=0;for(let a=0,c=t[a];c;c=t[++a])if(c===" "&&t[a+1]==="\\"&&t[a+2]==="n"&&(o+=t.slice(l,a)+"\\ ",a+=1,l=a,c="\\"),c==="\\")switch(t[a+1]){case"u":{o+=t.slice(l,a);let p=t.substr(a+2,4);switch(p){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:p.substr(0,2)==="00"?o+="\\x"+p.substr(2):o+=t.substr(a,6)}a+=5,l=a+1}break;case"n":if(n||t[a+2]==='"'||t.length -`;let f,h;for(h=t.length;h>0;--h){let g=t[h-1];if(g!==` -`&&g!==" "&&g!==" ")break}let d=t.substring(h),b=d.indexOf(` -`);b===-1?f="-":t===d||b!==d.length-1?(f="+",r&&r()):f="",d&&(t=t.slice(0,-d.length),d[d.length-1]===` -`&&(d=d.slice(0,-1)),d=d.replace(qt,`$&${c}`));let u=!1,m,S=-1;for(m=0;m")+(u?c?"2":"1":"")+f;if(s&&(N+=" "+l(s.replace(/ ?[\r\n]+/g," ")),i&&i()),p)return t=t.replace(/\n+/g,`$&${c}`),`${N} -${c}${w}${t}${d}`;t=t.replace(/\n+/g,` -$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`);let E=xe(`${w}${t}${d}`,c,rt,lt(n,!0));return`${N} -${c}${E}`}function mn(s,e,t,n){let{type:i,value:r}=s,{actualString:o,implicitKey:l,indent:a,indentStep:c,inFlow:p}=e;if(l&&r.includes(` -`)||p&&/[[\]{},]/.test(r))return Ae(r,e);if(!r||/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(r))return l||p||!r.includes(` -`)?Ae(r,e):ot(s,e,t,n);if(!l&&!p&&i!==y.PLAIN&&r.includes(` -`))return ot(s,e,t,n);if(at(r)){if(a==="")return e.forceBlockIndent=!0,ot(s,e,t,n);if(l&&a===c)return Ae(r,e)}let f=r.replace(/\n+/g,`$& -${a}`);if(o){let h=u=>u.default&&u.tag!=="tag:yaml.org,2002:str"&&u.test?.test(f),{compat:d,tags:b}=e.doc.schema;if(b.some(h)||d?.some(h))return Ae(r,e)}return l?f:xe(f,a,jt,lt(e,!1))}function le(s,e,t,n){let{implicitKey:i,inFlow:r}=e,o=typeof s.value=="string"?s:Object.assign({},s,{value:String(s.value)}),{type:l}=s;l!==y.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(l=y.QUOTE_DOUBLE);let a=p=>{switch(p){case y.BLOCK_FOLDED:case y.BLOCK_LITERAL:return i||r?Ae(o.value,e):ot(o,e,t,n);case y.QUOTE_DOUBLE:return Fe(o.value,e);case y.QUOTE_SINGLE:return Kt(o.value,e);case y.PLAIN:return mn(o,e,t,n);default:return null}},c=a(l);if(c===null){let{defaultKeyType:p,defaultStringType:f}=e.options,h=i&&p||f;if(c=a(h),c===null)throw new Error(`Unsupported default string type ${h}`)}return c}function ct(s,e){let t=Object.assign({blockQuote:!0,commentString:ds,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},s.schema.toStringOptions,e),n;switch(t.collectionStyle){case"block":n=!1;break;case"flow":n=!0;break;default:n=null}return{anchors:new Set,doc:s,flowCollectionPadding:t.flowCollectionPadding?" ":"",indent:"",indentStep:typeof t.indent=="number"?" ".repeat(t.indent):" ",inFlow:n,options:t}}function dn(s,e){if(e.tag){let i=s.filter(r=>r.tag===e.tag);if(i.length>0)return i.find(r=>r.format===e.format)??i[0]}let t,n;if(O(e)){n=e.value;let i=s.filter(r=>r.identify?.(n));t=i.find(r=>r.format===e.format)??i.find(r=>!r.format)}else n=e,t=s.find(i=>i.nodeClass&&n instanceof i.nodeClass);if(!t){let i=n?.constructor?.name??typeof n;throw new Error(`Tag not resolved for ${i} value`)}return t}function gn(s,e,{anchors:t,doc:n}){if(!n.directives)return"";let i=[],r=(O(s)||T(s))&&s.anchor;r&&st(r)&&(t.add(r),i.push(`&${r}`));let o=s.tag?s.tag:e.default?null:e.tag;return o&&i.push(n.directives.tagString(o)),i.join(" ")}function ae(s,e,t,n){if(A(s))return s.toString(e,t,n);if(F(s)){if(e.doc.directives)return s.toString(e);if(e.resolvedAliases?.has(s))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(s):e.resolvedAliases=new Set([s]),s=s.resolve(e.doc)}let i,r=L(s)?s:e.doc.createNode(s,{onTagObj:a=>i=a});i||(i=dn(e.doc.schema.tags,r));let o=gn(r,i,e);o.length>0&&(e.indentAtStart=(e.indentAtStart??0)+o.length+1);let l=typeof i.stringify=="function"?i.stringify(r,e,t,n):O(r)?le(r,e,t,n):r.toString(e,t,n);return o?O(r)||l[0]==="{"||l[0]==="["?`${o} ${l}`:`${o} -${e.indent}${l}`:l}function ys({key:s,value:e},t,n,i){let{allNullValues:r,doc:o,indent:l,indentStep:a,options:{commentString:c,indentSeq:p,simpleKeys:f}}=t,h=L(s)&&s.comment||null;if(f){if(h)throw new Error("With simple keys, key nodes cannot have comments");if(T(s)){let I="With simple keys, collection cannot be used as a key value";throw new Error(I)}}let d=!f&&(!s||h&&e==null&&!t.inFlow||T(s)||(O(s)?s.type===y.BLOCK_FOLDED||s.type===y.BLOCK_LITERAL:typeof s=="object"));t=Object.assign({},t,{allNullValues:!1,implicitKey:!d&&(f||!r),indent:l+a});let b=!1,u=!1,m=ae(s,t,()=>b=!0,()=>u=!0);if(!d&&!t.inFlow&&m.length>1024){if(f)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");d=!0}if(t.inFlow){if(r||e==null)return b&&n&&n(),m===""?"?":d?`? ${m}`:m}else if(r&&!f||e==null&&d)return m=`? ${m}`,h&&!b?m+=te(m,t.indent,c(h)):u&&i&&i(),m;b&&(h=null),d?(h&&(m+=te(m,t.indent,c(h))),m=`? ${m} -${l}:`):(m=`${m}:`,h&&(m+=te(m,t.indent,c(h))));let S,w,k;L(e)?(S=!!e.spaceBefore,w=e.commentBefore,k=e.comment):(S=!1,w=null,k=null,e&&typeof e=="object"&&(e=o.createNode(e))),t.implicitKey=!1,!d&&!h&&O(e)&&(t.indentAtStart=m.length+1),u=!1,!p&&a.length>=2&&!t.inFlow&&!d&&U(e)&&!e.flow&&!e.tag&&!e.anchor&&(t.indent=t.indent.substring(2));let N=!1,E=ae(e,t,()=>N=!0,()=>u=!0),g=" ";if(h||S||w){if(g=S?` -`:"",w){let I=c(w);g+=` -${Y(I,t.indent)}`}E===""&&!t.inFlow?g===` -`&&(g=` - -`):g+=` -${t.indent}`}else if(!d&&T(e)){let I=E[0],v=E.indexOf(` -`),B=v!==-1,de=t.inFlow??e.flow??e.items.length===0;if(B||!de){let Se=!1;if(B&&(I==="&"||I==="!")){let P=E.indexOf(" ");I==="&"&&P!==-1&&Ps===bs||O(s)&&s.value===bs&&(!s.type||s.type===y.PLAIN);function xt(s,e,t){let n=s&&F(t)?t.resolve(s.doc):t;if(!R(n))throw new Error("Merge sources must be maps or map aliases");let i=n.toJSON(null,s,Map);for(let[r,o]of i)e instanceof Map?e.has(r)||e.set(r,o):e instanceof Set?e.add(r):Object.prototype.hasOwnProperty.call(e,r)||Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0});return e}function bn(s,e,t){if(e===null)return"";if(typeof e!="object")return String(e);if(L(s)&&t?.doc){let n=ct(t.doc,{});n.anchors=new Set;for(let r of t.anchors.keys())n.anchors.add(r.anchor);n.inFlow=!0,n.inStringifyKey=!0;let i=s.toString(n);if(!t.mapKeyWarned){let r=JSON.stringify(i);r.length>40&&(r=r.substring(0,36)+'..."'),ft(t.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${r}. Set mapAsMap: true to use object keys.`),t.mapKeyWarned=!0}return i}return JSON.stringify(e)}function Ee(s,e,t){let n=oe(s,void 0,t),i=oe(e,void 0,t);return new C(n,i)}var C=class s{constructor(e,t=null){Object.defineProperty(this,j,{value:Mt}),this.key=e,this.value=t}clone(e){let{key:t,value:n}=this;return L(t)&&(t=t.clone(e)),L(n)&&(n=n.clone(e)),new s(t,n)}toJSON(e,t){let n=t?.mapAsMap?new Map:{};return ut(t,n,this)}toString(e,t,n){return e?.doc?ys(this,e,t,n):JSON.stringify(this)}};function pt(s,e,t){return(e.inFlow??s.flow?Sn:wn)(s,e,t)}function wn({comment:s,items:e},t,{blockItemPrefix:n,flowChars:i,itemIndent:r,onChompKeep:o,onComment:l}){let{indent:a,options:{commentString:c}}=t,p=Object.assign({},t,{indent:r,type:null}),f=!1,h=[];for(let b=0;bm=null,()=>f=!0);m&&(S+=te(S,r,c(m))),f&&m&&(f=!1),h.push(n+S)}let d;if(h.length===0)d=i.start+i.end;else{d=h[0];for(let b=1;bm=null);bp||S.includes(` -`))&&(c=!0),f.push(S),p=f.length}let{start:h,end:d}=t;if(f.length===0)return h+d;if(!c){let b=f.reduce((u,m)=>u+m.length+2,2);c=e.options.lineWidth>0&&b>e.options.lineWidth}if(c){let b=h;for(let u of f)b+=u?` -${r}${i}${u}`:` -`;return`${b} -${i}${d}`}else return`${h}${o}${f.join(" ")}${o}${d}`}function ht({indent:s,options:{commentString:e}},t,n,i){if(n&&i&&(n=n.replace(/^\n+/,"")),n){let r=Y(e(n),s);t.push(r.trimStart())}}function ue(s,e){let t=O(e)?e.value:e;for(let n of s)if(A(n)&&(n.key===e||n.key===t||O(n.key)&&n.key.value===t))return n}var $=class extends ge{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(Q,e),this.items=[]}static from(e,t,n){let{keepUndefined:i,replacer:r}=n,o=new this(e),l=(a,c)=>{if(typeof r=="function")c=r.call(t,a,c);else if(Array.isArray(r)&&!r.includes(a))return;(c!==void 0||i)&&o.items.push(Ee(a,c,n))};if(t instanceof Map)for(let[a,c]of t)l(a,c);else if(t&&typeof t=="object")for(let a of Object.keys(t))l(a,t[a]);return typeof e.sortMapEntries=="function"&&o.items.sort(e.sortMapEntries),o}add(e,t){let n;A(e)?n=e:!e||typeof e!="object"||!("key"in e)?n=new C(e,e?.value):n=new C(e.key,e.value);let i=ue(this.items,n.key),r=this.schema?.sortMapEntries;if(i){if(!t)throw new Error(`Key ${n.key} already set`);O(i.value)&&it(n.value)?i.value.value=n.value:i.value=n.value}else if(r){let o=this.items.findIndex(l=>r(n,l)<0);o===-1?this.items.push(n):this.items.splice(o,0,n)}else this.items.push(n)}delete(e){let t=ue(this.items,e);return t?this.items.splice(this.items.indexOf(t),1).length>0:!1}get(e,t){let i=ue(this.items,e)?.value;return(!t&&O(i)?i.value:i)??void 0}has(e){return!!ue(this.items,e)}set(e,t){this.add(new C(e,t),!0)}toJSON(e,t,n){let i=n?new n:t?.mapAsMap?new Map:{};t?.onCreate&&t.onCreate(i);for(let r of this.items)ut(t,i,r);return i}toString(e,t,n){if(!e)return JSON.stringify(this);for(let i of this.items)if(!A(i))throw new Error(`Map items must all be pairs; found ${JSON.stringify(i)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),pt(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:n,onComment:t})}};var G={collection:"map",default:!0,nodeClass:$,tag:"tag:yaml.org,2002:map",resolve(s,e){return R(s)||e("Expected a mapping for this tag"),s},createNode:(s,e,t)=>$.from(s,e,t)};var M=class extends ge{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(re,e),this.items=[]}add(e){this.items.push(e)}delete(e){let t=mt(e);return typeof t!="number"?!1:this.items.splice(t,1).length>0}get(e,t){let n=mt(e);if(typeof n!="number")return;let i=this.items[n];return!t&&O(i)?i.value:i}has(e){let t=mt(e);return typeof t=="number"&&t=0?e:null}var W={collection:"seq",default:!0,nodeClass:M,tag:"tag:yaml.org,2002:seq",resolve(s,e){return U(s)||e("Expected a sequence for this tag"),s},createNode:(s,e,t)=>M.from(s,e,t)};var he={identify:s=>typeof s=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:s=>s,stringify(s,e,t,n){return e=Object.assign({actualString:!0},e),le(s,e,t,n)}};var ye={identify:s=>s==null,createNode:()=>new y(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new y(null),stringify:({source:s},e)=>typeof s=="string"&&ye.test.test(s)?s:e.options.nullStr};var Re={identify:s=>typeof s=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:s=>new y(s[0]==="t"||s[0]==="T"),stringify({source:s,value:e},t){if(s&&Re.test.test(s)){let n=s[0]==="t"||s[0]==="T";if(e===n)return s}return e?t.options.trueStr:t.options.falseStr}};function D({format:s,minFractionDigits:e,tag:t,value:n}){if(typeof n=="bigint")return String(n);let i=typeof n=="number"?n:Number(n);if(!isFinite(i))return isNaN(i)?".nan":i<0?"-.inf":".inf";let r=JSON.stringify(n);if(!s&&e&&(!t||t==="tag:yaml.org,2002:float")&&/^\d/.test(r)){let o=r.indexOf(".");o<0&&(o=r.length,r+=".");let l=e-(r.length-o-1);for(;l-- >0;)r+="0"}return r}var dt={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN))$/,resolve:s=>s.slice(-3).toLowerCase()==="nan"?NaN:s[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:D},gt={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:s=>parseFloat(s),stringify(s){let e=Number(s.value);return isFinite(e)?e.toExponential():D(s)}},yt={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(s){let e=new y(parseFloat(s)),t=s.indexOf(".");return t!==-1&&s[s.length-1]==="0"&&(e.minFractionDigits=s.length-t-1),e},stringify:D};var bt=s=>typeof s=="bigint"||Number.isInteger(s),Ft=(s,e,t,{intAsBigInt:n})=>n?BigInt(s):parseInt(s.substring(e),t);function ws(s,e,t){let{value:n}=s;return bt(n)&&n>=0?t+n.toString(e):D(s)}var wt={identify:s=>bt(s)&&s>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(s,e,t)=>Ft(s,2,8,t),stringify:s=>ws(s,8,"0o")},St={identify:bt,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(s,e,t)=>Ft(s,0,10,t),stringify:D},kt={identify:s=>bt(s)&&s>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(s,e,t)=>Ft(s,2,16,t),stringify:s=>ws(s,16,"0x")};var Ss=[G,W,he,ye,Re,wt,St,kt,dt,gt,yt];function ks(s){return typeof s=="bigint"||Number.isInteger(s)}var Nt=({value:s})=>JSON.stringify(s),kn=[{identify:s=>typeof s=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:s=>s,stringify:Nt},{identify:s=>s==null,createNode:()=>new y(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Nt},{identify:s=>typeof s=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true|false$/,resolve:s=>s==="true",stringify:Nt},{identify:ks,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(s,e,{intAsBigInt:t})=>t?BigInt(s):parseInt(s,10),stringify:({value:s})=>ks(s)?s.toString():JSON.stringify(s)},{identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:s=>parseFloat(s),stringify:Nt}],Nn={default:!0,tag:"",test:/^/,resolve(s,e){return e(`Unresolved plain scalar ${JSON.stringify(s)}`),s}},Ns=[G,W].concat(kn,Nn);var Ue={identify:s=>s instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(s,e){if(typeof Buffer=="function")return Buffer.from(s,"base64");if(typeof atob=="function"){let t=atob(s.replace(/[\n\r]/g,"")),n=new Uint8Array(t.length);for(let i=0;i1&&e("Each pair must have its own sequence indicator");let i=n.items[0]||new C(new y(null));if(n.commentBefore&&(i.key.commentBefore=i.key.commentBefore?`${n.commentBefore} -${i.key.commentBefore}`:n.commentBefore),n.comment){let r=i.value??i.key;r.comment=r.comment?`${n.comment} -${r.comment}`:n.comment}n=i}s.items[t]=A(n)?n:new C(n)}}else e("Expected a sequence for this tag");return s}function Ut(s,e,t){let{replacer:n}=t,i=new M(s);i.tag="tag:yaml.org,2002:pairs";let r=0;if(e&&Symbol.iterator in Object(e))for(let o of e){typeof n=="function"&&(o=n.call(e,String(r++),o));let l,a;if(Array.isArray(o))if(o.length===2)l=o[0],a=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let c=Object.keys(o);if(c.length===1)l=c[0],a=o[l];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else l=o;i.items.push(Ee(l,a,t))}return i}var Ve={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Rt,createNode:Ut};var Le=class s extends M{constructor(){super(),this.add=$.prototype.add.bind(this),this.delete=$.prototype.delete.bind(this),this.get=$.prototype.get.bind(this),this.has=$.prototype.has.bind(this),this.set=$.prototype.set.bind(this),this.tag=s.tag}toJSON(e,t){if(!t)return super.toJSON(e);let n=new Map;t?.onCreate&&t.onCreate(n);for(let i of this.items){let r,o;if(A(i)?(r=_(i.key,"",t),o=_(i.value,r,t)):r=_(i,"",t),n.has(r))throw new Error("Ordered maps must not include duplicate keys");n.set(r,o)}return n}static from(e,t,n){let i=Ut(e,t,n),r=new this;return r.items=i.items,r}};Le.tag="tag:yaml.org,2002:omap";var Ye={collection:"seq",identify:s=>s instanceof Map,nodeClass:Le,default:!1,tag:"tag:yaml.org,2002:omap",resolve(s,e){let t=Rt(s,e),n=[];for(let{key:i}of t.items)O(i)&&(n.includes(i.value)?e(`Ordered maps must not include duplicate keys: ${i.value}`):n.push(i.value));return Object.assign(new Le,t)},createNode:(s,e,t)=>Le.from(s,e,t)};function Os({value:s,source:e},t){return e&&(s?Vt:Yt).test.test(e)?e:s?t.options.trueStr:t.options.falseStr}var Vt={identify:s=>s===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new y(!0),stringify:Os},Yt={identify:s=>s===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new y(!1),stringify:Os};var As={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN)$/,resolve:s=>s.slice(-3).toLowerCase()==="nan"?NaN:s[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:D},Es={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:s=>parseFloat(s.replace(/_/g,"")),stringify(s){let e=Number(s.value);return isFinite(e)?e.toExponential():D(s)}},Ls={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(s){let e=new y(parseFloat(s.replace(/_/g,""))),t=s.indexOf(".");if(t!==-1){let n=s.substring(t+1).replace(/_/g,"");n[n.length-1]==="0"&&(e.minFractionDigits=n.length)}return e},stringify:D};var Je=s=>typeof s=="bigint"||Number.isInteger(s);function Ot(s,e,t,{intAsBigInt:n}){let i=s[0];if((i==="-"||i==="+")&&(e+=1),s=s.substring(e).replace(/_/g,""),n){switch(t){case 2:s=`0b${s}`;break;case 8:s=`0o${s}`;break;case 16:s=`0x${s}`;break}let o=BigInt(s);return i==="-"?BigInt(-1)*o:o}let r=parseInt(s,t);return i==="-"?-1*r:r}function Jt(s,e,t){let{value:n}=s;if(Je(n)){let i=n.toString(e);return n<0?"-"+t+i.substr(1):t+i}return D(s)}var Ts={identify:Je,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(s,e,t)=>Ot(s,2,2,t),stringify:s=>Jt(s,2,"0b")},Is={identify:Je,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(s,e,t)=>Ot(s,1,8,t),stringify:s=>Jt(s,8,"0")},Cs={identify:Je,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(s,e,t)=>Ot(s,0,10,t),stringify:D},vs={identify:Je,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(s,e,t)=>Ot(s,2,16,t),stringify:s=>Jt(s,16,"0x")};var Te=class s extends ${constructor(e){super(e),this.tag=s.tag}add(e){let t;A(e)?t=e:e&&typeof e=="object"&&"key"in e&&"value"in e&&e.value===null?t=new C(e.key,null):t=new C(e,null),ue(this.items,t.key)||this.items.push(t)}get(e,t){let n=ue(this.items,e);return!t&&A(n)?O(n.key)?n.key.value:n.key:n}set(e,t){if(typeof t!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);let n=ue(this.items,e);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new C(e))}toJSON(e,t){return super.toJSON(e,t,Set)}toString(e,t,n){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),t,n);throw new Error("Set items must all have null values")}static from(e,t,n){let{replacer:i}=n,r=new this(e);if(t&&Symbol.iterator in Object(t))for(let o of t)typeof i=="function"&&(o=i.call(t,o,o)),r.items.push(Ee(o,null,n));return r}};Te.tag="tag:yaml.org,2002:set";var Qe={collection:"map",identify:s=>s instanceof Set,nodeClass:Te,default:!1,tag:"tag:yaml.org,2002:set",createNode:(s,e,t)=>Te.from(s,e,t),resolve(s,e){if(R(s)){if(s.hasAllNullValues(!0))return Object.assign(new Te,s);e("Set items must all have null values")}else e("Expected a mapping for this tag");return s}};function Qt(s,e){let t=s[0],n=t==="-"||t==="+"?s.substring(1):s,i=o=>e?BigInt(o):Number(o),r=n.replace(/_/g,"").split(":").reduce((o,l)=>o*i(60)+i(l),i(0));return t==="-"?i(-1)*r:r}function $s(s){let{value:e}=s,t=o=>o;if(typeof e=="bigint")t=o=>BigInt(o);else if(isNaN(e)||!isFinite(e))return D(s);let n="";e<0&&(n="-",e*=t(-1));let i=t(60),r=[e%i];return e<60?r.unshift(0):(e=(e-r[0])/i,r.unshift(e%i),e>=60&&(e=(e-r[0])/i,r.unshift(e))),n+r.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var At={identify:s=>typeof s=="bigint"||Number.isInteger(s),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(s,e,{intAsBigInt:t})=>Qt(s,t),stringify:$s},Et={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:s=>Qt(s,!1),stringify:$s},Ie={identify:s=>s instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(s){let e=s.match(Ie.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,t,n,i,r,o,l]=e.map(Number),a=e[7]?Number((e[7]+"00").substr(1,3)):0,c=Date.UTC(t,n-1,i,r||0,o||0,l||0,a),p=e[8];if(p&&p!=="Z"){let f=Qt(p,!1);Math.abs(f)<30&&(f*=60),c-=6e4*f}return new Date(c)},stringify:({value:s})=>s.toISOString().replace(/((T00:00)?:00)?\.000Z$/,"")};var Gt=[G,W,he,ye,Vt,Yt,Ts,Is,Cs,vs,As,Es,Ls,Ue,Ye,Ve,Qe,At,Et,Ie];var _s=new Map([["core",Ss],["failsafe",[G,W,he]],["json",Ns],["yaml11",Gt],["yaml-1.1",Gt]]),Ps={binary:Ue,bool:Re,float:yt,floatExp:gt,floatNaN:dt,floatTime:Et,int:St,intHex:kt,intOct:wt,intTime:At,map:G,null:ye,omap:Ye,pairs:Ve,seq:W,set:Qe,timestamp:Ie},Ms={"tag:yaml.org,2002:binary":Ue,"tag:yaml.org,2002:omap":Ye,"tag:yaml.org,2002:pairs":Ve,"tag:yaml.org,2002:set":Qe,"tag:yaml.org,2002:timestamp":Ie};function Lt(s,e){let t=_s.get(e);if(!t)if(Array.isArray(s))t=[];else{let n=Array.from(_s.keys()).filter(i=>i!=="yaml11").map(i=>JSON.stringify(i)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${n} or define customTags array`)}if(Array.isArray(s))for(let n of s)t=t.concat(n);else typeof s=="function"&&(t=s(t.slice()));return t.map(n=>{if(typeof n!="string")return n;let i=Ps[n];if(i)return i;let r=Object.keys(Ps).map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown custom tag "${n}"; use one of ${r}`)})}var On=(s,e)=>s.keye.key?1:0,Ce=class s{constructor({compat:e,customTags:t,merge:n,resolveKnownTags:i,schema:r,sortMapEntries:o,toStringDefaults:l}){this.compat=Array.isArray(e)?Lt(e,"compat"):e?Lt(null,e):null,this.merge=!!n,this.name=typeof r=="string"&&r||"core",this.knownTags=i?Ms:{},this.tags=Lt(t,this.name),this.toStringOptions=l??null,Object.defineProperty(this,Q,{value:G}),Object.defineProperty(this,x,{value:he}),Object.defineProperty(this,re,{value:W}),this.sortMapEntries=typeof o=="function"?o:o===!0?On:null}clone(){let e=Object.create(s.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};function Bs(s,e){let t=[],n=e.directives===!0;if(e.directives!==!1&&s.directives){let a=s.directives.toString(s);a?(t.push(a),n=!0):s.directives.docStart&&(n=!0)}n&&t.push("---");let i=ct(s,e),{commentString:r}=i.options;if(s.commentBefore){t.length!==1&&t.unshift("");let a=r(s.commentBefore);t.unshift(Y(a,""))}let o=!1,l=null;if(s.contents){if(L(s.contents)){if(s.contents.spaceBefore&&n&&t.push(""),s.contents.commentBefore){let p=r(s.contents.commentBefore);t.push(Y(p,""))}i.forceBlockIndent=!!s.comment,l=s.contents.comment}let a=l?void 0:()=>o=!0,c=ae(s.contents,i,()=>l=null,a);l&&(c+=te(c,"",r(l))),(c[0]==="|"||c[0]===">")&&t[t.length-1]==="---"?t[t.length-1]=`--- ${c}`:t.push(c)}else t.push(ae(s.contents,i));if(s.directives?.docEnd)if(s.comment){let a=r(s.comment);a.includes(` -`)?(t.push("..."),t.push(Y(a,""))):t.push(`... ${a}`)}else t.push("...");else{let a=s.comment;a&&o&&(a=a.replace(/^\n+/,"")),a&&((!o||l)&&t[t.length-1]!==""&&t.push(""),t.push(Y(r(a),"")))}return t.join(` -`)+` -`}var se=class s{constructor(e,t,n){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,j,{value:tt});let i=null;typeof t=="function"||Array.isArray(t)?i=t:n===void 0&&t&&(n=t,t=void 0);let r=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,uniqueKeys:!0,version:"1.2"},n);this.options=r;let{version:o}=r;n?._directives?(this.directives=n._directives.atDocument(),this.directives.yaml.explicit&&(o=this.directives.yaml.version)):this.directives=new Z({version:o}),this.setSchema(o,n),this.contents=e===void 0?null:this.createNode(e,i,n)}clone(){let e=Object.create(s.prototype,{[j]:{value:tt}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=L(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){ve(this.contents)&&this.contents.add(e)}addIn(e,t){ve(this.contents)&&this.contents.addIn(e,t)}createAlias(e,t){if(!e.anchor){let n=Bt(this);e.anchor=!t||n.has(t)?Dt(t||"a",n):t}return new ee(e.anchor)}createNode(e,t,n){let i;if(typeof t=="function")e=t.call({"":e},"",e),i=t;else if(Array.isArray(t)){let m=w=>typeof w=="number"||w instanceof String||w instanceof Number,S=t.filter(m).map(String);S.length>0&&(t=t.concat(S)),i=t}else n===void 0&&t&&(n=t,t=void 0);let{aliasDuplicateObjects:r,anchorPrefix:o,flow:l,keepUndefined:a,onTagObj:c,tag:p}=n??{},{onAnchor:f,setAnchors:h,sourceObjects:d}=ms(this,o||"a"),b={aliasDuplicateObjects:r??!0,keepUndefined:a??!1,onAnchor:f,onTagObj:c,replacer:i,schema:this.schema,sourceObjects:d},u=oe(e,p,b);return l&&T(u)&&(u.flow=!0),h(),u}createPair(e,t,n={}){let i=this.createNode(e,null,n),r=this.createNode(t,null,n);return new C(i,r)}delete(e){return ve(this.contents)?this.contents.delete(e):!1}deleteIn(e){return Oe(e)?this.contents==null?!1:(this.contents=null,!0):ve(this.contents)?this.contents.deleteIn(e):!1}get(e,t){return T(this.contents)?this.contents.get(e,t):void 0}getIn(e,t){return Oe(e)?!t&&O(this.contents)?this.contents.value:this.contents:T(this.contents)?this.contents.getIn(e,t):void 0}has(e){return T(this.contents)?this.contents.has(e):!1}hasIn(e){return Oe(e)?this.contents!==void 0:T(this.contents)?this.contents.hasIn(e):!1}set(e,t){this.contents==null?this.contents=Ke(this.schema,[e],t):ve(this.contents)&&this.contents.set(e,t)}setIn(e,t){Oe(e)?this.contents=t:this.contents==null?this.contents=Ke(this.schema,Array.from(e),t):ve(this.contents)&&this.contents.setIn(e,t)}setSchema(e,t={}){typeof e=="number"&&(e=String(e));let n;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new Z({version:"1.1"}),n={merge:!0,resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new Z({version:e}),n={merge:!1,resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,n=null;break;default:{let i=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${i}`)}}if(t.schema instanceof Object)this.schema=t.schema;else if(n)this.schema=new Ce(Object.assign(n,t));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:t,mapAsMap:n,maxAliasCount:i,onAnchor:r,reviver:o}={}){let l={anchors:new Map,doc:this,keep:!e,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof i=="number"?i:100},a=_(this.contents,t??"",l);if(typeof r=="function")for(let{count:c,res:p}of l.anchors.values())r(p,c);return typeof o=="function"?ce(o,{"":a},"",a):a}toJSON(e,t){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:t})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let t=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${t}`)}return Bs(this,e)}};function ve(s){if(T(s))return!0;throw new Error("Expected a YAML collection as document contents")}var $e=class extends Error{constructor(e,t,n,i){super(),this.name=e,this.code=n,this.message=i,this.pos=t}},q=class extends $e{constructor(e,t,n){super("YAMLParseError",e,t,n)}},_e=class extends $e{constructor(e,t,n){super("YAMLWarning",e,t,n)}},Ge=(s,e)=>t=>{if(t.pos[0]===-1)return;t.linePos=t.pos.map(l=>e.linePos(l));let{line:n,col:i}=t.linePos[0];t.message+=` at line ${n}, column ${i}`;let r=i-1,o=s.substring(e.lineStarts[n-1],e.lineStarts[n]).replace(/[\n\r]+$/,"");if(r>=60&&o.length>80){let l=Math.min(r-39,o.length-79);o="\u2026"+o.substring(l),r-=l-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),n>1&&/^ *$/.test(o.substring(0,r))){let l=s.substring(e.lineStarts[n-2],e.lineStarts[n-1]);l.length>80&&(l=l.substring(0,79)+`\u2026 -`),o=l+o}if(/[^ ]/.test(o)){let l=1,a=t.linePos[1];a&&a.line===n&&a.col>i&&(l=Math.max(1,Math.min(a.col-i,80-r)));let c=" ".repeat(r)+"^".repeat(l);t.message+=`: - -${o} -${c} -`}};function ne(s,{flow:e,indicator:t,next:n,offset:i,onError:r,startOnNewline:o}){let l=!1,a=o,c=o,p="",f="",h=!1,d=!1,b=!1,u=null,m=null,S=null,w=null,k=null;for(let g of s)switch(b&&(g.type!=="space"&&g.type!=="newline"&&g.type!=="comma"&&r(g.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),b=!1),g.type){case"space":!e&&a&&t!=="doc-start"&&g.source[0]===" "&&r(g,"TAB_AS_INDENT","Tabs are not allowed as indentation"),c=!0;break;case"comment":{c||r(g,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let I=g.source.substring(1)||" ";p?p+=f+I:p=I,f="",a=!1;break}case"newline":a?p?p+=g.source:l=!0:f+=g.source,a=!0,h=!0,(u||m)&&(d=!0),c=!0;break;case"anchor":u&&r(g,"MULTIPLE_ANCHORS","A node can have at most one anchor"),g.source.endsWith(":")&&r(g.offset+g.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),u=g,k===null&&(k=g.offset),a=!1,c=!1,b=!0;break;case"tag":{m&&r(g,"MULTIPLE_TAGS","A node can have at most one tag"),m=g,k===null&&(k=g.offset),a=!1,c=!1,b=!0;break}case t:(u||m)&&r(g,"BAD_PROP_ORDER",`Anchors and tags must be after the ${g.source} indicator`),w&&r(g,"UNEXPECTED_TOKEN",`Unexpected ${g.source} in ${e??"collection"}`),w=g,a=!1,c=!1;break;case"comma":if(e){S&&r(g,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),S=g,a=!1,c=!1;break}default:r(g,"UNEXPECTED_TOKEN",`Unexpected ${g.type} token`),a=!1,c=!1}let N=s[s.length-1],E=N?N.offset+N.source.length:i;return b&&n&&n.type!=="space"&&n.type!=="newline"&&n.type!=="comma"&&(n.type!=="scalar"||n.source!=="")&&r(n.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),{comma:S,found:w,spaceBefore:l,comment:p,hasNewline:h,hasNewlineAfterProp:d,anchor:u,tag:m,end:E,start:k??E}}function pe(s){if(!s)return null;switch(s.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(s.source.includes(` -`))return!0;if(s.end){for(let e of s.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of s.items){for(let t of e.start)if(t.type==="newline")return!0;if(e.sep){for(let t of e.sep)if(t.type==="newline")return!0}if(pe(e.key)||pe(e.value))return!0}return!1;default:return!0}}function We(s,e,t){if(e?.type==="flow-collection"){let n=e.end[0];n.indent===s&&(n.source==="]"||n.source==="}")&&pe(e)&&t(n,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function Tt(s,e,t){let{uniqueKeys:n}=s.options;if(n===!1)return!1;let i=typeof n=="function"?n:(r,o)=>r===o||O(r)&&O(o)&&r.value===o.value&&!(r.value==="<<"&&s.schema.merge);return e.some(r=>i(r.key,t))}var Ds="All mapping items must start at the same column";function js({composeNode:s,composeEmptyNode:e},t,n,i,r){let o=r?.nodeClass??$,l=new o(t.schema);t.atRoot&&(t.atRoot=!1);let a=n.offset,c=null;for(let p of n.items){let{start:f,key:h,sep:d,value:b}=p,u=ne(f,{indicator:"explicit-key-ind",next:h??d?.[0],offset:a,onError:i,startOnNewline:!0}),m=!u.found;if(m){if(h&&(h.type==="block-seq"?i(a,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in h&&h.indent!==n.indent&&i(a,"BAD_INDENT",Ds)),!u.anchor&&!u.tag&&!d){c=u.end,u.comment&&(l.comment?l.comment+=` -`+u.comment:l.comment=u.comment);continue}(u.hasNewlineAfterProp||pe(h))&&i(h??f[f.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else u.found?.indent!==n.indent&&i(a,"BAD_INDENT",Ds);let S=u.end,w=h?s(t,h,u,i):e(t,S,f,null,u,i);t.schema.compat&&We(n.indent,h,i),Tt(t,l.items,w)&&i(S,"DUPLICATE_KEY","Map keys must be unique");let k=ne(d??[],{indicator:"map-value-ind",next:b,offset:w.range[2],onError:i,startOnNewline:!h||h.type==="block-scalar"});if(a=k.end,k.found){m&&(b?.type==="block-map"&&!k.hasNewline&&i(a,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),t.options.strict&&u.starts&&(s.type==="block-map"||s.type==="block-seq");function qs({composeNode:s,composeEmptyNode:e},t,n,i,r){let o=n.start.source==="{",l=o?"flow map":"flow sequence",a=r?.nodeClass??(o?$:M),c=new a(t.schema);c.flow=!0;let p=t.atRoot;p&&(t.atRoot=!1);let f=n.offset+n.start.source.length;for(let m=0;m0){let m=ie(b,u,t.options.strict,i);m.comment&&(c.comment?c.comment+=` -`+m.comment:c.comment=m.comment),c.range=[n.offset,u,m.offset]}else c.range=[n.offset,u,u];return c}function Xt(s,e,t,n,i,r){let o=t.type==="block-map"?js(s,e,t,n,r):t.type==="block-seq"?Ks(s,e,t,n,r):qs(s,e,t,n,r),l=o.constructor;return i==="!"||i===l.tagName?(o.tag=l.tagName,o):(i&&(o.tag=i),o)}function xs(s,e,t,n,i){let r=n?e.directives.tagName(n.source,f=>i(n,"TAG_RESOLVE_FAILED",f)):null,o=t.type==="block-map"?"map":t.type==="block-seq"?"seq":t.start.source==="{"?"map":"seq";if(!n||!r||r==="!"||r===$.tagName&&o==="map"||r===M.tagName&&o==="seq"||!o)return Xt(s,e,t,i,r);let l=e.schema.tags.find(f=>f.tag===r&&f.collection===o);if(!l){let f=e.schema.knownTags[r];if(f&&f.collection===o)e.schema.tags.push(Object.assign({},f,{default:!1})),l=f;else return f?.collection?i(n,"BAD_COLLECTION_TYPE",`${f.tag} used for ${o} collection, but expects ${f.collection}`,!0):i(n,"TAG_RESOLVE_FAILED",`Unresolved tag: ${r}`,!0),Xt(s,e,t,i,r)}let a=Xt(s,e,t,i,r,l),c=l.resolve?.(a,f=>i(n,"TAG_RESOLVE_FAILED",f),e.options)??a,p=L(c)?c:new y(c);return p.range=a.range,p.tag=r,l?.format&&(p.format=l.format),p}function It(s,e,t){let n=s.offset,i=An(s,e,t);if(!i)return{value:"",type:null,comment:"",range:[n,n,n]};let r=i.mode===">"?y.BLOCK_FOLDED:y.BLOCK_LITERAL,o=s.source?En(s.source):[],l=o.length;for(let u=o.length-1;u>=0;--u){let m=o[u][1];if(m===""||m==="\r")l=u;else break}if(l===0){let u=i.chomp==="+"&&o.length>0?` -`.repeat(Math.max(1,o.length-1)):"",m=n+i.length;return s.source&&(m+=s.source.length),{value:u,type:r,comment:i.comment,range:[n,m,m]}}let a=s.indent+i.indent,c=s.offset+i.length,p=0;for(let u=0;ua&&(a=m.length);else{m.length=l;--u)o[u][0].length>a&&(l=u+1);let f="",h="",d=!1;for(let u=0;ua||S[0]===" "?(h===" "?h=` -`:!d&&h===` -`&&(h=` - -`),f+=h+m.slice(a)+S,h=` -`,d=!0):S===""?h===` -`?f+=` -`:h=` -`:(f+=h+S,h=" ",d=!1)}switch(i.chomp){case"-":break;case"+":for(let u=l;ut(n+h,d,b);switch(i){case"scalar":l=y.PLAIN,a=Ln(r,c);break;case"single-quoted-scalar":l=y.QUOTE_SINGLE,a=Tn(r,c);break;case"double-quoted-scalar":l=y.QUOTE_DOUBLE,a=In(r,c);break;default:return t(s,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${i}`),{value:"",type:null,comment:"",range:[n,n+r.length,n+r.length]}}let p=n+r.length,f=ie(o,p,e,t);return{value:a,type:l,comment:f.comment,range:[n,p,f.offset]}}function Ln(s,e){let t="";switch(s[0]){case" ":t="a tab character";break;case",":t="flow indicator character ,";break;case"%":t="directive indicator character %";break;case"|":case">":{t=`block scalar indicator ${s[0]}`;break}case"@":case"`":{t=`reserved character ${s[0]}`;break}}return t&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${t}`),Fs(s)}function Tn(s,e){return(s[s.length-1]!=="'"||s.length===1)&&e(s.length,"MISSING_CHAR","Missing closing 'quote"),Fs(s.slice(1,-1)).replace(/''/g,"'")}function Fs(s){let e,t;try{e=new RegExp(`(.*?)(?r?s.slice(r,n+1):i)}else t+=i}return(s[s.length-1]!=='"'||s.length===1)&&e(s.length,"MISSING_CHAR",'Missing closing "quote'),t}function Cn(s,e){let t="",n=s[e+1];for(;(n===" "||n===" "||n===` -`||n==="\r")&&!(n==="\r"&&s[e+2]!==` -`);)n===` -`&&(t+=` -`),e+=1,n=s[e+1];return t||(t=" "),{fold:t,offset:e}}var vn={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` -`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function $n(s,e,t,n){let i=s.substr(e,t),o=i.length===t&&/^[0-9a-fA-F]+$/.test(i)?parseInt(i,16):NaN;if(isNaN(o)){let l=s.substr(e-2,t+2);return n(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${l}`),l}return String.fromCodePoint(o)}function zt(s,e,t,n){let{value:i,type:r,comment:o,range:l}=e.type==="block-scalar"?It(e,s.options.strict,n):Ct(e,s.options.strict,n),a=t?s.directives.tagName(t.source,f=>n(t,"TAG_RESOLVE_FAILED",f)):null,c=t&&a?_n(s.schema,i,a,t,n):e.type==="scalar"?Pn(s,i,e,n):s.schema[x],p;try{let f=c.resolve(i,h=>n(t??e,"TAG_RESOLVE_FAILED",h),s.options);p=O(f)?f:new y(f)}catch(f){let h=f instanceof Error?f.message:String(f);n(t??e,"TAG_RESOLVE_FAILED",h),p=new y(i)}return p.range=l,p.source=i,r&&(p.type=r),a&&(p.tag=a),c.format&&(p.format=c.format),o&&(p.comment=o),p}function _n(s,e,t,n,i){if(t==="!")return s[x];let r=[];for(let l of s.tags)if(!l.collection&&l.tag===t)if(l.default&&l.test)r.push(l);else return l;for(let l of r)if(l.test?.test(e))return l;let o=s.knownTags[t];return o&&!o.collection?(s.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(i(n,"TAG_RESOLVE_FAILED",`Unresolved tag: ${t}`,t!=="tag:yaml.org,2002:str"),s[x])}function Pn({directives:s,schema:e},t,n,i){let r=e.tags.find(o=>o.default&&o.test?.test(t))||e[x];if(e.compat){let o=e.compat.find(l=>l.default&&l.test?.test(t))??e[x];if(r.tag!==o.tag){let l=s.tagString(r.tag),a=s.tagString(o.tag),c=`Value may be parsed as either ${l} or ${a}`;i(n,"TAG_RESOLVE_FAILED",c,!0)}}return r}function Rs(s,e,t){if(e){t===null&&(t=e.length);for(let n=t-1;n>=0;--n){let i=e[n];switch(i.type){case"space":case"comment":case"newline":s-=i.source.length;continue}for(i=e[++n];i?.type==="space";)s+=i.source.length,i=e[++n];break}}return s}var Mn={composeNode:Zt,composeEmptyNode:vt};function Zt(s,e,t,n){let{spaceBefore:i,comment:r,anchor:o,tag:l}=t,a,c=!0;switch(e.type){case"alias":a=Bn(s,e,n),(o||l)&&n(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":a=zt(s,e,l,n),o&&(a.anchor=o.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":a=xs(Mn,s,e,l,n),o&&(a.anchor=o.source.substring(1));break;default:{let p=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;n(e,"UNEXPECTED_TOKEN",p),a=vt(s,e.offset,void 0,null,t,n),c=!1}}return o&&a.anchor===""&&n(o,"BAD_ALIAS","Anchor cannot be an empty string"),i&&(a.spaceBefore=!0),r&&(e.type==="scalar"&&e.source===""?a.comment=r:a.commentBefore=r),s.options.keepSourceTokens&&c&&(a.srcToken=e),a}function vt(s,e,t,n,{spaceBefore:i,comment:r,anchor:o,tag:l,end:a},c){let p={type:"scalar",offset:Rs(e,t,n),indent:-1,source:""},f=zt(s,p,l,c);return o&&(f.anchor=o.source.substring(1),f.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),i&&(f.spaceBefore=!0),r&&(f.comment=r,f.range[2]=a),f}function Bn({options:s},{offset:e,source:t,end:n},i){let r=new ee(t.substring(1));r.source===""&&i(e,"BAD_ALIAS","Alias cannot be an empty string"),r.source.endsWith(":")&&i(e+t.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=e+t.length,l=ie(n,o,s.strict,i);return r.range=[e,o,l.offset],l.comment&&(r.comment=l.comment),r}function Us(s,e,{offset:t,start:n,value:i,end:r},o){let l=Object.assign({_directives:e},s),a=new se(void 0,l),c={atRoot:!0,directives:a.directives,options:a.options,schema:a.schema},p=ne(n,{indicator:"doc-start",next:i??r?.[0],offset:t,onError:o,startOnNewline:!0});p.found&&(a.directives.docStart=!0,i&&(i.type==="block-map"||i.type==="block-seq")&&!p.hasNewline&&o(p.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),a.contents=i?Zt(c,i,p,o):vt(c,p.end,n,null,p,o);let f=a.contents.range[2],h=ie(r,f,!1,o);return h.comment&&(a.comment=h.comment),a.range=[t,f,h.offset],a}function He(s){if(typeof s=="number")return[s,s+1];if(Array.isArray(s))return s.length===2?s:[s[0],s[1]];let{offset:e,source:t}=s;return[e,e+(typeof t=="string"?t.length:1)]}function Vs(s){let e="",t=!1,n=!1;for(let i=0;i{let o=He(t);r?this.warnings.push(new _e(o,n,i)):this.errors.push(new q(o,n,i))},this.directives=new Z({version:e.version||"1.2"}),this.options=e}decorate(e,t){let{comment:n,afterEmptyLine:i}=Vs(this.prelude);if(n){let r=e.contents;if(t)e.comment=e.comment?`${e.comment} -${n}`:n;else if(i||e.directives.docStart||!r)e.commentBefore=n;else if(T(r)&&!r.flow&&r.items.length>0){let o=r.items[0];A(o)&&(o=o.key);let l=o.commentBefore;o.commentBefore=l?`${n} -${l}`:n}else{let o=r.commentBefore;r.commentBefore=o?`${n} -${o}`:n}}t?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Vs(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,t=!1,n=-1){for(let i of e)yield*this.next(i);yield*this.end(t,n)}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(t,n,i)=>{let r=He(e);r[0]+=t,this.onError(r,"BAD_DIRECTIVE",n,i)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let t=Us(this.options,this.directives,e,this.onError);this.atDirectives&&!t.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(t,!1),this.doc&&(yield this.doc),this.doc=t,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let t=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,n=new q(He(e),"UNEXPECTED_TOKEN",t);this.atDirectives||!this.doc?this.errors.push(n):this.doc.errors.push(n);break}case"doc-end":{if(!this.doc){let n="Unexpected doc-end without preceding document";this.errors.push(new q(He(e),"UNEXPECTED_TOKEN",n));break}this.doc.directives.docEnd=!0;let t=ie(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),t.comment){let n=this.doc.comment;this.doc.comment=n?`${n} -${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.push(new q(He(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,t=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let n=Object.assign({_directives:this.directives},this.options),i=new se(void 0,n);this.atDirectives&&this.onError(t,"MISSING_CHAR","Missing directives-end indicator line"),i.range=[0,t,t],this.decorate(i,!1),yield i}}};var ns={};as(ns,{BOM:()=>Xe,DOCUMENT:()=>ze,FLOW_END:()=>Ze,SCALAR:()=>Pe,createScalarToken:()=>Js,isCollection:()=>Kn,isScalar:()=>qn,prettyToken:()=>xn,resolveAsScalar:()=>Ys,setScalarValue:()=>Qs,stringify:()=>Ws,tokenType:()=>ss,visit:()=>me});function Ys(s,e=!0,t){if(s){let n=(i,r,o)=>{let l=typeof i=="number"?i:Array.isArray(i)?i[0]:i.offset;if(t)t(l,r,o);else throw new q([l,l+1],r,o)};switch(s.type){case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return Ct(s,e,n);case"block-scalar":return It(s,e,n)}}return null}function Js(s,e){let{implicitKey:t=!1,indent:n,inFlow:i=!1,offset:r=-1,type:o="PLAIN"}=e,l=le({type:o,value:s},{implicitKey:t,indent:n>0?" ".repeat(n):"",inFlow:i,options:{blockQuote:!0,lineWidth:-1}}),a=e.end??[{type:"newline",offset:-1,indent:n,source:` -`}];switch(l[0]){case"|":case">":{let c=l.indexOf(` -`),p=l.substring(0,c),f=l.substring(c+1)+` -`,h=[{type:"block-scalar-header",offset:r,indent:n,source:p}];return Gs(h,a)||h.push({type:"newline",offset:-1,indent:n,source:` -`}),{type:"block-scalar",offset:r,indent:n,props:h,source:f}}case'"':return{type:"double-quoted-scalar",offset:r,indent:n,source:l,end:a};case"'":return{type:"single-quoted-scalar",offset:r,indent:n,source:l,end:a};default:return{type:"scalar",offset:r,indent:n,source:l,end:a}}}function Qs(s,e,t={}){let{afterKey:n=!1,implicitKey:i=!1,inFlow:r=!1,type:o}=t,l="indent"in s?s.indent:null;if(n&&typeof l=="number"&&(l+=2),!o)switch(s.type){case"single-quoted-scalar":o="QUOTE_SINGLE";break;case"double-quoted-scalar":o="QUOTE_DOUBLE";break;case"block-scalar":{let c=s.props[0];if(c.type!=="block-scalar-header")throw new Error("Invalid block scalar header");o=c.source[0]===">"?"BLOCK_FOLDED":"BLOCK_LITERAL";break}default:o="PLAIN"}let a=le({type:o,value:e},{implicitKey:i||l===null,indent:l!==null&&l>0?" ".repeat(l):"",inFlow:r,options:{blockQuote:!0,lineWidth:-1}});switch(a[0]){case"|":case">":Dn(s,a);break;case'"':es(s,a,"double-quoted-scalar");break;case"'":es(s,a,"single-quoted-scalar");break;default:es(s,a,"scalar")}}function Dn(s,e){let t=e.indexOf(` -`),n=e.substring(0,t),i=e.substring(t+1)+` -`;if(s.type==="block-scalar"){let r=s.props[0];if(r.type!=="block-scalar-header")throw new Error("Invalid block scalar header");r.source=n,s.source=i}else{let{offset:r}=s,o="indent"in s?s.indent:-1,l=[{type:"block-scalar-header",offset:r,indent:o,source:n}];Gs(l,"end"in s?s.end:void 0)||l.push({type:"newline",offset:-1,indent:o,source:` -`});for(let a of Object.keys(s))a!=="type"&&a!=="offset"&&delete s[a];Object.assign(s,{type:"block-scalar",indent:o,props:l,source:i})}}function Gs(s,e){if(e)for(let t of e)switch(t.type){case"space":case"comment":s.push(t);break;case"newline":return s.push(t),!0}return!1}function es(s,e,t){switch(s.type){case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":s.type=t,s.source=e;break;case"block-scalar":{let n=s.props.slice(1),i=e.length;s.props[0].type==="block-scalar-header"&&(i-=s.props[0].source.length);for(let r of n)r.offset+=i;delete s.props,Object.assign(s,{type:t,source:e,end:n});break}case"block-map":case"block-seq":{let i={type:"newline",offset:s.offset+e.length,indent:s.indent,source:` -`};delete s.items,Object.assign(s,{type:t,source:e,end:[i]});break}default:{let n="indent"in s?s.indent:-1,i="end"in s&&Array.isArray(s.end)?s.end.filter(r=>r.type==="space"||r.type==="comment"||r.type==="newline"):[];for(let r of Object.keys(s))r!=="type"&&r!=="offset"&&delete s[r];Object.assign(s,{type:t,indent:n,source:e,end:i})}}}var Ws=s=>"type"in s?_t(s):$t(s);function _t(s){switch(s.type){case"block-scalar":{let e="";for(let t of s.props)e+=_t(t);return e+s.source}case"block-map":case"block-seq":{let e="";for(let t of s.items)e+=$t(t);return e}case"flow-collection":{let e=s.start.source;for(let t of s.items)e+=$t(t);for(let t of s.end)e+=t.source;return e}case"document":{let e=$t(s);if(s.end)for(let t of s.end)e+=t.source;return e}default:{let e=s.source;if("end"in s&&s.end)for(let t of s.end)e+=t.source;return e}}}function $t({start:s,key:e,sep:t,value:n}){let i="";for(let r of s)i+=r.source;if(e&&(i+=_t(e)),t)for(let r of t)i+=r.source;return n&&(i+=_t(n)),i}var ts=Symbol("break visit"),jn=Symbol("skip children"),Hs=Symbol("remove item");function me(s,e){"type"in s&&s.type==="document"&&(s={start:s.start,value:s.value}),Xs(Object.freeze([]),s,e)}me.BREAK=ts;me.SKIP=jn;me.REMOVE=Hs;me.itemAtPath=(s,e)=>{let t=s;for(let[n,i]of e){let r=t?.[n];if(r&&"items"in r)t=r.items[i];else return}return t};me.parentCollection=(s,e)=>{let t=me.itemAtPath(s,e.slice(0,-1)),n=e[e.length-1][0],i=t?.[n];if(i&&"items"in i)return i;throw new Error("Parent collection not found")};function Xs(s,e,t){let n=t(e,s);if(typeof n=="symbol")return n;for(let i of["key","value"]){let r=e[i];if(r&&"items"in r){for(let o=0;o!!s&&"items"in s,qn=s=>!!s&&(s.type==="scalar"||s.type==="single-quoted-scalar"||s.type==="double-quoted-scalar"||s.type==="block-scalar");function xn(s){switch(s){case Xe:return"";case ze:return"";case Ze:return"";case Pe:return"";default:return JSON.stringify(s)}}function ss(s){switch(s){case Xe:return"byte-order-mark";case ze:return"doc-mode";case Ze:return"flow-error-end";case Pe:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case` -`:case`\r -`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(s[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function J(s){switch(s){case void 0:case" ":case` -`:case"\r":case" ":return!0;default:return!1}}var zs="0123456789ABCDEFabcdef".split(""),Fn="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()".split(""),is=",[]{}".split(""),Rn=` ,[]{} -\r `.split(""),rs=s=>!s||Rn.includes(s),Me=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,t=!1){e&&(this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null),this.atEnd=!t;let n=this.next??"stream";for(;n&&(t||this.hasChars(1));)n=yield*this.parseNext(n)}atLineEnd(){let e=this.pos,t=this.buffer[e];for(;t===" "||t===" ";)t=this.buffer[++e];return!t||t==="#"||t===` -`?!0:t==="\r"?this.buffer[e+1]===` -`:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let t=this.buffer[e];if(this.indentNext>0){let n=0;for(;t===" ";)t=this.buffer[++n+e];if(t==="\r"){let i=this.buffer[n+e+1];if(i===` -`||!i&&!this.atEnd)return e+n+1}return t===` -`||n>=this.indentNext||!t&&!this.atEnd?e+n:-1}if(t==="-"||t==="."){let n=this.buffer.substr(e,3);if((n==="---"||n==="...")&&J(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!J(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[e,t]=this.peek(2);if(!t&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&J(t)){let n=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=n,yield*this.parseBlockStart()}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let e=this.getLine();if(e===null)return this.setNext("doc");let t=yield*this.pushIndicators();switch(e[t]){case"#":yield*this.pushCount(e.length-t);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(rs),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return t+=yield*this.parseBlockScalarHeader(),t+=yield*this.pushSpaces(!0),yield*this.pushCount(e.length-t),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let e,t,n=-1;do e=yield*this.pushNewline(),e>0?(t=yield*this.pushSpaces(!1),this.indentValue=n=t):t=0,t+=yield*this.pushSpaces(!0);while(e+t>0);let i=this.getLine();if(i===null)return this.setNext("flow");if((n!==-1&&n"0"&&t<="9")this.blockScalarIndent=Number(t)-1;else if(t!=="-")break}return yield*this.pushUntil(t=>J(t)||t==="#")}*parseBlockScalar(){let e=this.pos-1,t=0,n;e:for(let i=this.pos;n=this.buffer[i];++i)switch(n){case" ":t+=1;break;case` -`:e=i,t=0;break;case"\r":{let r=this.buffer[i+1];if(!r&&!this.atEnd)return this.setNext("block-scalar");if(r===` -`)break}default:break e}if(!n&&!this.atEnd)return this.setNext("block-scalar");if(t>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=t:this.indentNext+=this.blockScalarIndent;do{let i=this.continueScalar(e+1);if(i===-1)break;e=this.buffer.indexOf(` -`,i)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}if(!this.blockScalarKeep)do{let i=e-1,r=this.buffer[i];r==="\r"&&(r=this.buffer[--i]);let o=i;for(;r===" "||r===" ";)r=this.buffer[--i];if(r===` -`&&i>=this.pos&&i+1+t>o)e=i;else break}while(!0);return yield Pe,yield*this.pushToIndex(e+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let e=this.flowLevel>0,t=this.pos-1,n=this.pos-1,i;for(;i=this.buffer[++n];)if(i===":"){let r=this.buffer[n+1];if(J(r)||e&&r===",")break;t=n}else if(J(i)){let r=this.buffer[n+1];if(i==="\r"&&(r===` -`?(n+=1,i=` -`,r=this.buffer[n+1]):t=n),r==="#"||e&&is.includes(r))break;if(i===` -`){let o=this.continueScalar(n+1);if(o===-1)break;n=Math.max(n,o-2)}}else{if(e&&is.includes(i))break;t=n}return!i&&!this.atEnd?this.setNext("plain-scalar"):(yield Pe,yield*this.pushToIndex(t+1,!0),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,t){let n=this.buffer.slice(this.pos,e);return n?(yield n,this.pos+=n.length,n.length):(t&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*this.pushTag())+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators());case"&":return(yield*this.pushUntil(rs))+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators());case"-":case"?":case":":{let e=this.flowLevel>0,t=this.charAt(1);if(J(t)||e&&is.includes(t))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*this.pushCount(1))+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators())}}return 0}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,t=this.buffer[e];for(;!J(t)&&t!==">";)t=this.buffer[++e];return yield*this.pushToIndex(t===">"?e+1:e,!1)}else{let e=this.pos+1,t=this.buffer[e];for(;t;)if(Fn.includes(t))t=this.buffer[++e];else if(t==="%"&&zs.includes(this.buffer[e+1])&&zs.includes(this.buffer[e+2]))t=this.buffer[e+=3];else break;return yield*this.pushToIndex(e,!1)}}*pushNewline(){let e=this.buffer[this.pos];return e===` -`?yield*this.pushCount(1):e==="\r"&&this.charAt(1)===` -`?yield*this.pushCount(2):0}*pushSpaces(e){let t=this.pos-1,n;do n=this.buffer[++t];while(n===" "||e&&n===" ");let i=t-this.pos;return i>0&&(yield this.buffer.substr(this.pos,i),this.pos=t),i}*pushUntil(e){let t=this.pos,n=this.buffer[t];for(;!e(n);)n=this.buffer[++t];return yield*this.pushToIndex(t,!1)}};var Be=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let t=0,n=this.lineStarts.length;for(;t>1;this.lineStarts[r]=0;)switch(s[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;s[++e]?.type==="space";);return s.splice(e,s.length)}function en(s){if(s.start.type==="flow-seq-start")for(let e of s.items)e.sep&&!e.value&&!H(e.start,"explicit-key-ind")&&!H(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,tn(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}var we=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new Me,this.onNewLine=e}*parse(e,t=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let n of this.lexer.lex(e,t))yield*this.next(n);t||(yield*this.end())}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=e.length;return}let t=ss(e);if(t)if(t==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=t,yield*this.step(),t){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case"space":this.atNewLine&&e[0]===" "&&(this.indent+=e.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=e.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=e.length}else{let n=`Not a YAML token: ${e}`;yield*this.pop({type:"error",offset:this.offset,message:n,source:e}),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&(!e||e.type!=="doc-end")){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*this.stream();switch(e.type){case"document":return yield*this.document(e);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(e);case"block-scalar":return yield*this.blockScalar(e);case"block-map":return yield*this.blockMap(e);case"block-seq":return yield*this.blockSequence(e);case"flow-collection":return yield*this.flowCollection(e);case"doc-end":return yield*this.documentEnd(e)}yield*this.pop()}peek(e){return this.stack[this.stack.length-e]}*pop(e){let t=e??this.stack.pop();if(!t)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield t;else{let n=this.peek(1);switch(t.type==="block-scalar"?t.indent="indent"in n?n.indent:0:t.type==="flow-collection"&&n.type==="document"&&(t.indent=0),t.type==="flow-collection"&&en(t),n.type){case"document":n.value=t;break;case"block-scalar":n.props.push(t);break;case"block-map":{let i=n.items[n.items.length-1];if(i.value){n.items.push({start:[],key:t,sep:[]}),this.onKeyLine=!0;return}else if(i.sep)i.value=t;else{Object.assign(i,{key:t,sep:[]}),this.onKeyLine=!H(i.start,"explicit-key-ind");return}break}case"block-seq":{let i=n.items[n.items.length-1];i.value?n.items.push({start:[],value:t}):i.value=t;break}case"flow-collection":{let i=n.items[n.items.length-1];!i||i.value?n.items.push({start:[],key:t,sep:[]}):i.sep?i.value=t:Object.assign(i,{key:t,sep:[]});return}default:yield*this.pop(),yield*this.pop(t)}if((n.type==="document"||n.type==="block-map"||n.type==="block-seq")&&(t.type==="block-map"||t.type==="block-seq")){let i=t.items[t.items.length-1];i&&!i.sep&&!i.value&&i.start.length>0&&Zs(i.start)===-1&&(t.indent===0||i.start.every(r=>r.type!=="comment"||r.indent=e.indent){let n=!this.onKeyLine&&this.indent===e.indent&&t.sep&&this.type!=="seq-item-ind",i=[];if(n&&t.sep&&!t.value){let r=[];for(let o=0;oe.indent&&(r.length=0);break;default:r.length=0}}r.length>=2&&(i=t.sep.splice(r[1]))}switch(this.type){case"anchor":case"tag":n||t.value?(i.push(this.sourceToken),e.items.push({start:i}),this.onKeyLine=!0):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case"explicit-key-ind":!t.sep&&!H(t.start,"explicit-key-ind")?t.start.push(this.sourceToken):n||t.value?(i.push(this.sourceToken),e.items.push({start:i})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]}),this.onKeyLine=!0;return;case"map-value-ind":if(H(t.start,"explicit-key-ind"))if(t.sep)if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(H(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(tn(t.key)&&!H(t.sep,"newline")){let r=De(t.start),o=t.key,l=t.sep;l.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:o,sep:l}]})}else i.length>0?t.sep=t.sep.concat(i,this.sourceToken):t.sep.push(this.sourceToken);else if(H(t.start,"newline"))Object.assign(t,{key:null,sep:[this.sourceToken]});else{let r=De(t.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]})}else t.sep?t.value||n?e.items.push({start:i,key:null,sep:[this.sourceToken]}):H(t.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let r=this.flowScalar(this.type);n||t.value?(e.items.push({start:i,key:r,sep:[]}),this.onKeyLine=!0):t.sep?this.stack.push(r):(Object.assign(t,{key:r,sep:[]}),this.onKeyLine=!0);return}default:{let r=this.startBlockValue(e);if(r){n&&r.type!=="block-seq"&&H(t.start,"explicit-key-ind")&&e.items.push({start:i}),this.stack.push(r);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let t=e.items[e.items.length-1];switch(this.type){case"newline":if(t.value){let n="end"in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment"?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case"space":case"comment":if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){let i=e.items[e.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,t.start),i.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case"anchor":case"tag":if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;t.value||H(t.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return}if(this.indent>e.indent){let n=this.startBlockValue(e);if(n){this.stack.push(n);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let t=e.items[e.items.length-1];if(this.type==="flow-error-end"){let n;do yield*this.pop(),n=this.peek(1);while(n&&n.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!t||t.sep?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return;case"map-value-ind":!t||t.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!t||t.value?e.items.push({start:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let i=this.flowScalar(this.type);!t||t.value?e.items.push({start:[],key:i,sep:[]}):t.sep?this.stack.push(i):Object.assign(t,{key:i,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let n=this.startBlockValue(e);n?this.stack.push(n):(yield*this.pop(),yield*this.step())}else{let n=this.peek(2);if(n.type==="block-map"&&(this.type==="map-value-ind"&&n.indent===e.indent||this.type==="newline"&&!n.items[n.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&n.type!=="flow-collection"){let i=Pt(n),r=De(i);en(e);let o=e.end.splice(1,e.end.length);o.push(this.sourceToken);let l={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:r,key:e,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=l}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let t=this.source.indexOf(` -`)+1;for(;t!==0;)this.onNewLine(this.offset+t),t=this.source.indexOf(` -`,t)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let t=Pt(e),n=De(t);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n}]}}case"map-value-ind":{this.onKeyLine=!0;let t=Pt(e),n=De(t);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){return this.type!=="comment"||this.indent<=t?!1:e.every(n=>n.type==="newline"||n.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function sn(s){let e=s.prettyErrors!==!1;return{lineCounter:s.lineCounter||e&&new Be||null,prettyErrors:e}}function nn(s,e={}){let{lineCounter:t,prettyErrors:n}=sn(e),i=new we(t?.addNewLine),r=new be(e),o=Array.from(r.compose(i.parse(s)));if(n&&t)for(let l of o)l.errors.forEach(Ge(s,t)),l.warnings.forEach(Ge(s,t));return o.length>0?o:Object.assign([],{empty:!0},r.streamInfo())}function os(s,e={}){let{lineCounter:t,prettyErrors:n}=sn(e),i=new we(t?.addNewLine),r=new be(e),o=null;for(let l of r.compose(i.parse(s),!0,s.length))if(!o)o=l;else if(o.options.logLevel!=="silent"){o.errors.push(new q(l.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return n&&t&&(o.errors.forEach(Ge(s,t)),o.warnings.forEach(Ge(s,t))),o}function rn(s,e,t){let n;typeof e=="function"?n=e:t===void 0&&e&&typeof e=="object"&&(t=e);let i=os(s,t);if(!i)return null;if(i.warnings.forEach(r=>ft(i.options.logLevel,r)),i.errors.length>0){if(i.options.logLevel!=="silent")throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:n},t))}function on(s,e,t){let n=null;if(typeof e=="function"||Array.isArray(e)?n=e:t===void 0&&e&&(t=e),typeof t=="string"&&(t=t.length),typeof t=="number"){let i=Math.round(t);t=i<1?void 0:i>8?{indent:8}:{indent:i}}if(s===void 0){let{keepUndefined:i}=t??e??{};if(!i)return}return new se(s,n,t).toString(t)}var ln=ls;window.yaml=ln;})(); diff --git a/paper1_10k_citation.html b/paper1_10k_citation.html deleted file mode 100644 index bed586e0..00000000 --- a/paper1_10k_citation.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - -Astropy | Paper 1 Reaches 10k Citations - - - - - - - - -
        - - -
        -

        Astropy Paper Reaches 10,000 Citations

        - -

        Published by NumFOCUS on 2025-10-04 (link to original article)

        - -

        The Astropy Project is excited to announce that the first Astropy paper has reached 10,000 citations, as tracked by the Astrophysics Data System.

        - -

        Astropy is a community-driven project that develops the astropy Python package along with other libraries and tools that enable astronomical research software. The Astropy Project has published three journal articles that mark significant milestones for the project, coinciding with the initial announcement of the project, version 2.0 of the core package, and version 5.0 of the core package, respectively.

        - -

        Since its inception just over 10 years ago, Astropy has become a core pillar of astronomical research, laying the foundation for thousands of software packages and enabling over 10,000 published research projects. This milestone demonstrates the impact Astropy has had on astronomy research and reflects the potential impact of scientific software. Other recent milestones include the ADASS Software Prize in 2022 and the 2025 Berkeley Prize.

        - -

        The Astropy Project is not a centralized institution or endeavor: The astropy Python package contains contributions from over 500 unique contributors and the governing bodies of the project are located at a range of universities and institutes with members spanning junior to senior positions in both academic and non-academic careers. While many have contributed to Astropy, the majority of the effort in the project was done by a much smaller group of 20–25 core contributors and maintainers.

        - -

        Astropy has benefitted from and is grateful for grant funding from the Moore Foundation and NASA over the years. However, most of the project was developed through volunteer effort or in-kind contributions from institutions such as Space Telescope Science Institute and the Chandra X-ray Center, and more recently the Center for Computational Astrophysics at the Flatiron Institute. Astropy also receives support as a Sponsored Project with NumFOCUS, which provides services in funding and infrastructure for open source scientific computing projects. Infrastructure software like Astropy is critical to the success of modern astronomy, and we hope that the community will continue to support the project in the future through funding and contributions.

        -
        - - - -
        - - diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..49500b25 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +sphinx +myst-parser +sphinx-design +sphinx-astropy[confv3]@git+https://github.com/Cadair/sphinx-astropy@conf-v3-sunpy diff --git a/roles.json b/roles.json deleted file mode 100644 index 25ceea2e..00000000 --- a/roles.json +++ /dev/null @@ -1,710 +0,0 @@ -[ - { - "role": "Coordination committee member", - "url": "Coordination_committee_member", - "people": [ - "Clara Brasseur", - "Aarya Patil", - "Nathaniel Starkman", - "Erik Tollerud", - "Kyle Westfall" - ], - "role-head": "Coordination committee member", - "responsibilities": [ - { - "description": "Overall coordination and management of the Astropy project, including:", - "details": [ - "Formally detailed in the The Astropy Project Governance Charter (APE 0)", - "Keeping a large-scale view of the Astropy ecosystem", - "Approving or rejecting Astropy APEs", - "Evaluating and merging core package pull requests as needed (e.g., for sub-packages without a maintainer)", - "Arbitrating disagreements in the core package, including final decisions when otherwise deadlocked", - "Maintaining the list of roles and related github permissions", - "Managing finances for the project", - "Coordinating with NumFOCUS and other funding organizations", - "Securing funding for the project via discussions and proposals to funding agencies" - ] - }, - { - "description": "Organization and communication:", - "details": [ - "Policies: CoCo Operating Policies.", - "Meeting records: CoCo Running Notes.", - "Communication within the coordination committee happens through regular Zoom meetings and a private Slack channel.", - "Contact the Coordination Committee via email to coordinators@astropy.org or by tagging the github team @astropy/coordinators.", - "Coordination committee members send project updates to appropriate email lists (e.g. astropy-dev)." - ] - } - ] - }, - { - "role": "Ombudsperson", - "url": "Ombudsperson", - "people": [ - "Perry Greenfield" - ], - "role-head": "Ombudsperson", - "responsibilities": { - "description": "Provide a point of contact for sensitive issues separate from the coordinating committee, including:", - "details": [ - "Formally detailed in the The Astropy Project Governance Charter (APE 0)", - "Monitoring the confidential@astropy.org email account", - "Solicit and provide anonymized feedback to the astropy coordination committee regarding coordination of the project", - "Assist the coordination committee and community engagement coordinator with violations of the code of conduct or other ethical concerns" - ] - } - }, - { - "role": "Strategic planning and organizing committee member", - "url": "strategic_planner", - "people": [ - "Kelle Cruz", - "Adrian Price-Whelan", - "Thomas Robitaille", - "Nathaniel Starkman", - "Erik Tollerud" - ], - "role-head": "Strategic planner", - "responsibilities": [{ - "description": "Do long-term planning for the Astropy Project as a whole, including:", - "details": [ - "Shape and provide a vision for next major steps in the Project, in consultation with the whole Astropy community.", - "Maintain an overview of all the project activities (both from developer and user perspectives).", - "Provide points of contact for external stakeholders on the above (with the Coordination Committee).", - "Monitor project activities to see how well aligned they are with the roadmap and strategic goals of the project, and report back to the community and Coordination Committee.", - "Coordinate writing grant proposals (in collaboration with the Finance Committee, Coordination Committee, and community).", - "Maintain the Astropy Project Roadmap.", - "Engage with, and collect input from, the whole Astropy Community on project vision and priorities." - ] - }, - { - "description": "Organization and communication:", - "details": [ - "Policies: Beta-Year Draft.", - "Meeting records: Strategic Planning Running Notes.", - "Communication within the coordination committee happens through regular Zoom meetings and a private Slack channel.", - "Contact the Strategic Planning Committee via email to strategic.planning@astropy.org or by tagging the github team @astropy/strategic-planning." - ] - }] - }, - { - "role": "Finance committee member", - "url": "finance_committee_member", - "people": [ - "Kelle Cruz (chair)", - "Aarya Patil", - "John Swinbank", - "Erik Tollerud" - ], - "role-head": "Finance committee member", - "responsibilities": [{ - "description": "Plan, oversee, and disburse the Astropy project finances, including:", - "details": [ - "Determine and manage the process for paying people from Astropy's project-level funding.", - "Paying and overseeing people in supporting roles (e.g., documentation copy-editors, contract lawyers).", - "Oversee payment for services, licenses, and travel (e.g., Python in Astronomy, SciPy), and other miscellaneous expenses the project already pays for.", - "Maintain and continuously develop a transparent process for reporting all of the above to the Coordination Committee and wider community, related record keeping, and planning the same for future possible financial committee efforts." - ] - }, - { - "description": "Organization and communication:", - "details": [ - "Policies: Finance Committee Operating Policies.", - "Meeting records: Finance Running Notes.", - "Communication within the finance committee happens through regular Zoom meetings and a private Slack channel.", - "Contact the Finance Committee via email to finance@astropy.org, tagging the github team @astropy/finance-committee, or via #finance-committee public channel in Astropy Slack workspace.", - "Finance committee members send project updates to appropriate email lists (e.g. astropy-dev)." - ] - }] - }, - { - "role": "Maintainer Mentorship coordinator", - "url": "mentorship", - "people": [ - "Tom Aldcroft" - ], - "role-head": "Maintainer Mentorship coordinator", - "responsibilities": { - "description": "Lead the maintainer mentorship program, including:", - "details": [ - "identifying active and experienced contributors that would like to become maintainers", - "finding mentors for new maintainers", - "develop opportunities for new maintainers" - ] - } - }, - { - "role": "Community engagement coordinator", - "url": "Community_engagement_coordinator", - "role-head": "Community engagement coordinator", - "sub-roles": [ - { - "role": "Overall", - "people": [ - "Unfilled" - ] - }, - { - "role": "Facebook", - "people": [ - "Kelle Cruz" - ] - }, - { - "role": "Slack/Matrix", - "people": [ - "Stuart Mumford" - ] - }, - { - "role": "Discourse", - "people": [ - "Stuart Mumford" - ] - }, - { - "role": "Conferences", - "people": [ - "Kelle Cruz", - "Erik Tollerud" - ] - }, - { - "role": "BlueSky", - "people": [ - "Brett Morris" - ] - }, - { - "role": "Mastodon", - "people": [ - "Stuart Mumford" - ] - } - ], - "responsibilities": { - "description": "Facilitate engagement with the Astropy community, including:", - "details": [ - "Maintain Astropy's social media accounts", - "Monitor/moderate the Python Users in Astronomy Facebook group", - "Keep track of/help organize presence in conferences and workshops", - "Maintain infrastructure for communication channels (e.g., Discourse)" - ] - } - }, - { - "role": "Learn Team", - "url": "Learn_team", - "role-head": "Learn Team", - "sub-roles": [ - { - "role": "Coordinators", - "people": [ - "Clara Brasseur" - ] - }, - { - "role": "Learn content and infrastructure", - "people": [ - "Lia Corrales", - "Kelle Cruz", - "Matt Craig", - "Adrian Price-Whelan", - "Erik Tollerud", - "Jonathan Sick", - "Jeff Jennings" - ] - }, - { - "role": "Workshop Coordinators", - "people": [ - "David Shupe", - "Brett Morris", - "Kelle Cruz" - ] - } - ], - "responsibilities": [ - { - "subrole-head": "Coordinators", - "description": "Oversee the Astropy \"Learn\" ecosystem, including:", - "details": [ - "Ensuring that the documentation, tutorials, and guide materials are internally consistent and cover key areas of the ecosystem", - "Overseeing the maintainers for the aforementioned areas", - "Organizing sprints or other events focused on Astropy learning materials" - ] - }, - { - "subrole-head": "Learn content and infrastructure", - "description": "Maintain the infrastructure and edit content of the Tutorials website, including:", - "details": [ - "Facilitating the display and discoverability of the tutorials", - "Rendering of the Jupyter notebooks", - "Integrated testing of notebooks", - "Reviewing issues and pull requests", - "Soliciting new content as needed" - ] - }, - { - "subrole-head": "Workshop Coordinators", - "description": "Organize and coordinate Astropy workshops for training and outreach to users", - "details": [ - "Maintain the astropy-workshops repository", - "Oversee staffing/volunteers for workshops", - "Identify opportunities for workshops in diverse geographic locations" - ] - } - ] - }, - { - "role": "Affiliated package review editor", - "url": "Affiliated_package_review_editor", - "people": ["Hans Moritz G\u00fcnther", "Derek Homeier"], - "deputy": ["Unfilled"], - "role-head": "Affiliated package review editor", - "responsibilities": { - "description": "Oversee affiliated packages in partnership with pyOpenSci, including:", - "details": [ - "Representing Astropy as pyOpenSci Software Review Editor", - "Keeping track of submissions to the affiliated package ecosystem", - "Guiding submissions through the pre-submission and submission steps to the Peer Review system" - ] - } - }, - { - "role": "APE editor", - "url": "APE_editor", - "people": [ - "Clara Brasseur", - "Aarya Patil", - "Nathaniel Starkman", - "Erik Tollerud", - "Kyle Westfall" - ], - "deputy": ["Unfilled"], - "role-head": "APE editor", - "responsibilities": { - "description": "Oversee APE submissions as laid out in APE 1, including:", - "details": [ - "Perform editorial reviews of new APE submissions", - "Shepherd the APE discussions and redirect them to astropy-dev, as needed", - "Monitor and maintain astropy-APEs repository" - ] - } - }, - { - "role": "Release team", - "url": "release_team", - "people": [ - "Simon Conseil", - "Thomas Robitaille" - ], - "role-head": "Release team", - "responsibilities": { - "description": "Oversee the release process for packages in the project, including:", - "details": [ - "Carrying out releases of the core astropy package", - "Notifying the Distribution Coordinators of any core astropy package release", - "Working with the Community Engagement Coordinator to make release announcements via channels such as mailing lists and social media", - "Keeping documentation for the release process of the core package up to date", - "Designing policies to improve the uniformity of release procedures for the coordinated and infrastructure packages of the Astropy Project", - "Testing the interoperability of the core, coordinated, and infrastructure packages and provide safeguards against breaking the ecosystem." - ] - } - }, - { - "role": "Security team", - "url": "security_team", - "people": [ - "Hans Moritz G\u00fcnther", - "Pey Lian Lim", - "Thomas Robitaille", - "Erik Tollerud" - ], - "role-head": "Security team", - "responsibilities": { - "description": "Organize security reporting and auditing for packages in the project, including:", - "details": [ - "Monitor and reply to security reports (this role needs admin privileges on GitHub to access reports submitted through GitHub's secure reporting form)", - "Coordinate the response to any security report with the relevant package maintainers and outside security experts", - "Coordinate security audits with external experts as needed and available", - "Release CVEs as necessary" - ] - } - }, - { - "role": "Infrastructure and Operations", - "url": "devops_team", - "role-head": "Infrastructure and Operations", - "sub-roles": [ - { - "role": "Technical Lead", - "people": [ - "Pey Lian Lim", - "Brigitta Sip\u0151cz" - ] - }, - { - "role": "Testing infrastructure", - "people": [ - "Simon Conseil", - "Pey Lian Lim", - "Thomas Robitaille", - "Brigitta Sip\u0151cz" - ] - }, - { - "role": "Documentation infrastructure", - "people": [ - "Simon Conseil", - "Pey Lian Lim", - "Thomas Robitaille", - "Brigitta Sip\u0151cz" - ] - }, - { - "role": "Astropy.org web page maintainer", - "people": [ - "Hans Moritz G\u00fcnther", - "Derek Homeier", - "Erik Tollerud" - ] - } - - ], - "responsibilities": [ - { - "subrole-head": "Technical Lead", - "description": "Ensure the smooth running of the project", - "details": [ - "Set up and maintain continuous integration services", - "Move issues between repositories within the organization" - ] - }, - { - "subrole-head": "Testing infrastructure", - "description": "Lead development and maintenance of the testing infrastructure for Astropy and the helpers, including:", - "details": [ - "Managing issues/pull request for the Astropy core package regarding testing infrastructure", - "Managing issues/pull requests in the repositories containing the testing plugins, and determining when new plugins are required", - "Maintaining the 'metapackage' with the testing machinery (pytest-astropy at the time of this writing)", - "Supporting and enabling affiliated package usage of the testing infrastructure" - ] - }, - { - "subrole-head": "Documentation infrastructure", - "description": "Maintain the Astropy documentation website, including:", - "details": [ - "Managing the Sphinx infrastructure", - "Implementing changes and improvements to the documentation website", - "Overseeing content (although primary responsibility for content lies with subpackage maintainers)" - ] - }, - { - "subrole-head": "Astropy.org web page maintainer", - "description": "Manage the astropy.org web site, including:", - "details": [ - "Managing pull requests to the website repository in general", - "Managing data.astropy.org, which is done by managing the astropy-data repository (which is automatically synced with data.astropy.org)", - "Managing the astropy.org DNS entries and related domain name upkeep" - ] - } - ] - }, - { - "role": "Core astropy package maintainer", - "url": "Subpackage_maintainer", - "role-head": "Sub-package maintainer (at least one per core package sub-package)", - "sub-roles": [ - { - "role": "General", - "people": [ - "Derek Homeier", - "Pey Lian Lim", - "Cl\u00e9ment Robert", - "Ole Streicher" - ] - }, - { - "role": "astropy.constants", - "people": [ - "David Shupe", - "Marten van Kerkwijk" - ] - }, - { - "role": "astropy.convolution", - "people": [ - "Larry Bradley", - "Axel Donath", - "Adam Ginsburg" - ] - }, - { - "role": "astropy.coordinates", - "people": [ - "Stuart Littlefair", - "Adrian Price-Whelan", - "Eero Vaher", - "Marten van Kerkwijk" - ] - }, - { - "role": "astropy.cosmology", - "people": [ - "Nathaniel Starkman" - ] - }, - { - "role": "astropy.io.ascii", - "people": [ - "Tom Aldcroft", - "Hans Moritz G\u00fcnther", - "Derek Homeier" - ] - }, - { - "role": "astropy.io.fits", - "people": [ - "Simon Conseil", - "Thomas Robitaille" - ] - }, - { - "role": "astropy.io.misc", - "people": [ - "Matteo Bachetti" - ] - }, - { - "role": "astropy.io.votable", - "people": [ - "Thomas Boch", - "Tom Donaldson", - "Pey Lian Lim" - ] - }, - { - "role": "astropy.modeling", - "people": [ - "Nadia Dencheva", - "Perry Greenfield", - "William Jamieson" - ] - }, - { - "role": "astropy.nddata", - "people": [ - "Matt Craig", - "Brett Morris" - ] - }, - { - "role": "astropy.samp", - "people": [ - "Unfilled" - ] - }, - { - "role": "astropy.stats", - "people": [ - "Larry Bradley" - ] - }, - { - "role": "astropy.table", - "people": [ - "Tom Aldcroft", - "Marten van Kerkwijk" - ] - }, - { - "role": "astropy.time", - "people": [ - "Tom Aldcroft", - "Marten van Kerkwijk" - ] - }, - { - "role": "astropy.timeseries", - "people": [ - "Thomas Robitaille", - "Brigitta Sip\u0151cz" - ] - }, - { - "role": "astropy.uncertainties", - "people": [ - "Erik Tollerud", - "Marten van Kerkwijk" - ] - }, - { - "role": "astropy.units", - "people": [ - "Nathaniel Starkman", - "Marten van Kerkwijk" - ] - }, - { - "role": "astropy.utils", - "people": [ - "Pey Lian Lim", - "Brigitta Sip\u0151cz" - ] - }, - { - "role": "astropy.visualization", - "people": [ - "Larry Bradley", - "Stuart Mumford", - "Thomas Robitaille" - ] - }, - { - "role": "astropy.wcs", - "people": [ - "Mihai Cara, Nadia Dencheva" - ] - } - ], - "responsibilities": [ - { - "subrole-head": "General maintainer", - "description": "Maintain the astropy core package in aspects that are not specific to a single sub-package, including:", - "details": [ - "Evaluating new pull requests for quality, API consistency, Astropy coding standards, and appropriateness within the overall astropy ecosystem, in particular for pull requests spanning multiple sub-packages", - "Merging Pull Requests that are non-controversial or after reaching out to relevant subpackage maintainers", - "Maintain, review, and advocate for useful interaction between multiple sub-packages", - "Perform initial triaging of issues and pull requests", - "Keeping track of frequent contributors and their relevant areas of expertise" - ] - }, - { - - "subrole-head": "Sub-package maintainer", - "description": "Maintain a sub-package of the astropy core package, including:", - "details": [ - "Evaluating new pull requests for quality, API consistency, Astropy coding standards, and appropriateness within the overall astropy ecosystem", - "Merging Pull Requests in the sub-package", - "Keeping track of the \u201cbig picture\u201d progress of the sub-package - includes new feature development and significant bugs", - "Perform initial triaging of issues and pull requests", - "Keeping track of frequent contributors to the sub-package and their relevant areas of expertise" - ] - } - ] - }, - { - "role": "Coordinated package maintainer", - "url": "Coordinated_package_maintainer", - "role-head": "Astropy coordinated package maintainer", - "sub-roles": [ - { - "role": "asdf-astropy", - "people": [ - "Brett Graham", - "Nadia Dencheva", - "Perry Greenfield", - "Stuart Mumford" - ] - }, - { - "role": "astropy-healpix", - "people": [ - "Leo Singer", - "Thomas Robitaille" - ] - }, - { - "role": "astroquery", - "people": [ - "Adam Ginsburg", - "Brigitta Sip\u0151cz" - ] - }, - { - "role": "ccdproc", - "people": [ - "Matt Craig" - ] - }, - { - "role": "photutils", - "people": [ - "Larry Bradley" - ] - }, - { - "role": "regions", - "people": [ - "Larry Bradley", - "Adam Ginsburg" - ] - }, - { - "role": "reproject", - "people": [ - "Thomas Robitaille", - "Stuart Mumford", - "Sam Van Kooten" - ] - }, - { - "role": "specreduce", - "people": [ - "Tim Pickering", - "Erik Tollerud", - "Kyle Conroy", - "Clare Shanahan", - "Hannu Parviainen" - ] - }, - { - "role": "specutils", - "people": [ - "Ricky O'Steen", - "Adam Ginsburg", - "Erik Tollerud", - "Kelle Cruz" - ] - } - ], - "responsibilities": { - "description": "Maintain an astropy coordinated package, including:", - "details": [ - "Maintaining the github repository for the coordinated package", - "Maintaining the coordinated package's infrastructure (usually via the helpers and package template)", - "Monitoring features and bringing them for inclusion in the core package when relevant", - "All the same responsilities as a sub-package, but for the coordinated package." - ] - } - }, - { - "role": "Dev-telecon coordinator", - "url": "devtelecon_coordinator", - "people": [ - "Hans Moritz G\u00fcnther" - ], - "role-head": "Developer telecon coordinators", - "responsibilities": { - "description": "Organize monthly developer telecons", - "details": [] - } - }, - { - "role": "Distribution coordinator", - "url": "Distribution_coordinator", - "people": [ - "Matt Craig", - "Stuart Mumford", - "Sergio Pascual", - "Ole Streicher", - "Miguel de Val-Borro" - ], - "role-head": "Distribution coordinators", - "responsibilities": { - "description": "Create and maintain binary distribution packages for Astropy core and affiliated packages for a specific OS or package management system.", - "details": [] - } - } -] diff --git a/team.html b/team.html deleted file mode 100644 index a08b8778..00000000 --- a/team.html +++ /dev/null @@ -1,834 +0,0 @@ - - - - - - - - - - - - - - -Astropy Team - - - - - - - -
        - - -
        -

        Astropy Team

        - -

        Roles

        - -

        The Astropy project is made possible through the efforts of - community members that perform numerous important roles. This - encompasses a broad scope of responsibilities ranging from - direct package development to communication, distribution, and - managerial activities. In this section we list the identified - project roles and responsible parties, to provide members with a - point-of-contact for individual tasks and to give the project an - overview of the current state of the team. Different roles on this - page have very different scope and effort needed to perform them. - Listing on this page is also not mean to be any particular assignment - of credit beyond that implict in having the responsibilities of the role. - See the Astropy project role - responsibilities section below for a full description of each - role. - -

        We are always looking for interested community members to fill empty roles and to join existing - teams. Community members may volunteer or nominate someone else for any role by emailing - coordinators@astropy.org or by getting in - touch with the current team. -

        - - - - - - - - - - -
        RoleSub-rolePerson/People (last name alphabetical)
        - -
        - -
        -

        Astropy Project Role Responsibilities

        - -

        The Astropy project is made possible through the efforts of - community members that perform numerous important roles. This - encompasses a broad scope of responsibilities ranging from direct - package development to communication, distribution, and managerial - activities. In this section we list the responsibilities for each of - the identified project roles. The list of people fulfilling these - roles is found in the Roles section. - Committee/Team specific policies and communication methods are outlined in the - Astropy Policies - readme document. -

        - -
        -
        - -
        -

        Voting Members

        - -

        - The Voting Members are the group of trusted individuals who operate the Astropy Project on behalf of the community. - Their role and responsibilites are defined in The Astropy Project Governance Charter (APE 0). -

        - -

        Active Voting Members

        -
          -
        • Tom Aldcroft
        • -
        • Larry Bradley
        • -
        • Clara Brasseur
        • -
        • Michael K. Brewer
        • -
        • Mihai Cara
        • -
        • Kyle Conroy
        • -
        • Simon Conseil
        • -
        • Lia Corrales
        • -
        • Matt Craig
        • -
        • Kelle Cruz
        • -
        • Nadia Dencheva
        • -
        • Nicholas Earl
        • -
        • Tom Donaldson
        • -
        • Wilfred Gee
        • -
        • Adam Ginsburg
        • -
        • Lauren Glattly
        • -
        • Perry Greenfield
        • -
        • Moritz Günther
        • -
        • Derek Homeier
        • -
        • William Jamieson
        • -
        • Pey Lian Lim
        • -
        • Stuart Littlefair
        • -
        • Brett Morris
        • -
        • Stuart Mumford
        • -
        • Ricky O'Steen
        • -
        • Hannu Parviainen
        • -
        • Aarya Patil
        • -
        • Tim Pickering
        • -
        • Adrian Price-Whelan
        • -
        • Clément Robert
        • -
        • Thomas Robitaille
        • -
        • Albert Y. Shih
        • -
        • David Shupe
        • -
        • Jonathan Sick
        • -
        • Leo Singer
        • -
        • Brigitta Sipőcz
        • -
        • Nathaniel Starkman
        • -
        • Ole Streicher
        • -
        • John Swinbank
        • -
        • Erik Tollerud
        • -
        • James Turner
        • -
        • Marten van Kerkwijk
        • -
        • Eero Vaher
        • -
        • Benjamin Alan Weaver
        • -
        • Kyle Westfall
        • -
        - -

        Emeritus Voting Members

        -
          -
        • E. Madison Bray
        • -
        • Juan Luis Cano Rodríguez
        • -
        • Steve Crawford
        • -
        • Michael Droettboom
        • -
        • Michael Seifert
        • -
        • Edward Slavich
        • -
        • Zé Vinícius
        • -
        -

        - -
        - -
        -

        Contributors

        - -

        Astropy project packages are under continuous development by professional astronomers and software developers from around the world. The Project is community-driven, with decisions generally made by consensus, but with oversight and organization provided by the coordinating committee.

        - -

        Core Package Contributors

        -
          - -
        • Aaron Meisner
        • -
        • aarsh1a
        • -
        • Aarya Patil
        • -
        • Abdu Zoghbi
        • -
        • Abhinuv Nitin Pitale
        • -
        • Abigail Stevens
        • -
        • Adam Broussard
        • -
        • Adam Ginsburg
        • -
        • Adam Turner
        • -
        • Adele Plunkett
        • -
        • Aditya Sharma
        • -
        • Adrian Price-Whelan
        • -
        • Adrien Thob
        • -
        • Akash Deshpande
        • -
        • Akeem
        • -
        • Akshat Dixit
        • -
        • Al Niessner
        • -
        • Albert Y. Shih
        • -
        • Albert Zhang
        • -
        • Aleh Khvalko
        • -
        • Alex Conley
        • -
        • Alex de la Vega
        • -
        • Alex Drlica-Wagner
        • -
        • Alex Fox
        • -
        • Alex Hagen
        • -
        • Alex Rudy
        • -
        • Alexander Bakanov
        • -
        • Alexandre Beelen
        • -
        • Alexandre R. Bomfim Junior
        • -
        • Alfio Puglisi
        • -
        • Alpha-Ursae-Minoris
        • -
        • Amit Kumar
        • -
        • Ana Posses
        • -
        • Anany Shrey Jain
        • -
        • Anchit Jain
        • -
        • Andreas Baumbach
        • -
        • Andreas Faisst
        • -
        • Andreas Michael Hermansen
        • -
        • Andrej Rode
        • -
        • Andrew Hearin
        • -
        • Andrii Oriekhov
        • -
        • Andy Casey
        • -
        • Aniket Kulkarni
        • -
        • Aniket Sanghi
        • -
        • Anirudh Katipally
        • -
        • Anne Archibald
        • -
        • Antetokounpo
        • -
        • Anthony Horton
        • -
        • Antonio Bento Pereira
        • -
        • Antony Lee
        • -
        • Arfon Smith
        • -
        • Arie Kurniawan
        • -
        • Arne de Laat
        • -
        • Arthur Eigenbrot
        • -
        • Arthur Sardella
        • -
        • Arthur Xavier Joao Pedro Maia
        • -
        • Aryan Shukla
        • -
        • Asish Panda
        • -
        • Asra Nizami
        • -
        • athul
        • -
        • Austen Groener
        • -
        • Axel Donath
        • -
        • Azalee Bostroem
        • -
        • Bastian Beischer
        • -
        • Ben Greiner
        • -
        • Benjamin Alan Weaver
        • -
        • Benjamin Roulston
        • -
        • Benjamin Scully
        • -
        • Benjamin Winkel
        • -
        • Bernardo Sulzbach
        • -
        • Bernie Simon
        • -
        • Bharath Saiguhan
        • -
        • Bhavya Khandelwal
        • -
        • Bili Dong
        • -
        • Bill Cleveland
        • -
        • Bogdan Nicula
        • -
        • Bojan Nikolic
        • -
        • Brandie-M
        • -
        • Brett Graham
        • -
        • Brett Morris
        • -
        • Brett Woltz
        • -
        • Brian Soto
        • -
        • Brigitta Sipőcz
        • -
        • britgit
        • -
        • Bruce Merry
        • -
        • Bruno Oliveira
        • -
        • Bryce Kalmbach
        • -
        • Bryce Nordgren
        • -
        • Caden Gobat
        • -
        • CaioCoutinhoP
        • -
        • Carl Osterwisch
        • -
        • Carl Schaffer
        • -
        • Caspar van Leeuwen
        • -
        • Chiara Marmo
        • -
        • Chris Beaumont
        • -
        • Chris Hanley
        • -
        • Chris Osborne
        • -
        • Chris Simpson
        • -
        • Christian Clauss
        • -
        • Christian Hettlage
        • -
        • Christoph Deil
        • -
        • Christoph Gohlke
        • -
        • Christopher Bonnett
        • -
        • Chun Ly
        • -
        • Clara Brasseur
        • -
        • Clare Shanahan
        • -
        • Clément Robert
        • -
        • Conor MacBride
        • -
        • Cristian Ardelean
        • -
        • Curtis McCully
        • -
        • Damien LaRocque
        • -
        • Dan Foreman-Mackey
        • -
        • Dan P. Cunningham
        • -
        • Dan Taranu
        • -
        • Daniel Bell
        • -
        • Daniel D'Avella
        • -
        • Daniel Datsev
        • -
        • Daniel Giles
        • -
        • Daniel Lenz
        • -
        • Daniel Ruschel Dutra
        • -
        • Daniel Ryan
        • -
        • Danny Goldstein
        • -
        • Dany Vohl
        • -
        • Daria Cara
        • -
        • David Kirkby
        • -
        • David M. Palmer
        • -
        • David Paz
        • -
        • David Pérez-Suárez
        • -
        • David Shiga
        • -
        • David Shupe
        • -
        • David Stansby
        • -
        • Deen-Dot
        • -
        • Demitri Muna
        • -
        • Derek Homeier
        • -
        • Devin Crichton
        • -
        • Diego Alonso
        • -
        • Diego Asterio de Zaballa
        • -
        • disha
        • -
        • Dominik Klaes
        • -
        • Doron Behar
        • -
        • Doug Branton
        • -
        • Douglas Burke
        • -
        • Drew Leonard
        • -
        • Duncan Macleod
        • -
        • Dylan Gregersen
        • -
        • E. Madison Bray
        • -
        • E. Rykoff
        • -
        • E.C. Herenz
        • -
        • Eduardo Olinto
        • -
        • Edward Betts
        • -
        • Edward Slavich
        • -
        • Eero Vaher
        • -
        • Eli Bressert
        • -
        • Elijah Bernstein-Cooper
        • -
        • Elise Chavez
        • -
        • Eloy Salinas
        • -
        • Emily Deibert
        • -
        • Emily Hu
        • -
        • Emir Karamehmetoglu
        • -
        • Emma Hogan
        • -
        • Eric Depagne
        • -
        • Eric Jeschke
        • -
        • Eric Koch
        • -
        • Erik Tollerud
        • -
        • Erin Allard
        • -
        • Esteban Pardo Sánchez
        • -
        • Evan Jones
        • -
        • Even Rouault
        • -
        • Everett Schlawin
        • -
        • Evert Rol
        • -
        • Felipe Cybis Pereira
        • -
        • Felipe Gameleira
        • -
        • Felix Yan
        • -
        • Finn Womack
        • -
        • fockez
        • -
        • Francesc Vilardell
        • -
        • Francesco Biscani
        • -
        • Francesco Montanari
        • -
        • Francesco Montesano
        • -
        • Frazer McLean
        • -
        • Frédéric Chapoton
        • -
        • Frédéric Grollier
        • -
        • Gabriel Brammer
        • -
        • Gabriel Perren
        • -
        • Geert Barentsen
        • -
        • George Galvin
        • -
        • Georgiana Ogrean
        • -
        • Gerrit Schellenberger
        • -
        • Giang Nguyen
        • -
        • Gilles Landais
        • -
        • Giorgio Calderone
        • -
        • Gordon Gibb
        • -
        • Graham Kanarek
        • -
        • Grant Jenks
        • -
        • Gregory Dubois-Felsmann
        • -
        • Gregory Simonian
        • -
        • Griffin Hosseinzadeh
        • -
        • Gustavo Bragança
        • -
        • Gyanendra Shukla
        • -
        • Hannes Breytenbach
        • -
        • Hans Moritz Günther
        • -
        • Harry Ferguson
        • -
        • Harshada Raut
        • -
        • Heinz-Alexander Fuetterer
        • -
        • Helen Sherwood-Taylor
        • -
        • Hélvio Peixoto
        • -
        • Henrike F
        • -
        • Henry Schreiner
        • -
        • Himanshu Pathak
        • -
        • homeboy445
        • -
        • Hood Chatham
        • -
        • Hsin Fan
        • -
        • Hugo Buddelmeijer
        • -
        • Humna Awan
        • -
        • iamsoto
        • -
        • Igor Lemos
        • -
        • ikkamens
        • -
        • Inada Naoki
        • -
        • J. Goutin
        • -
        • J. Xavier Prochaska
        • -
        • Jackson Hayward
        • -
        • Jake VanderPlas
        • -
        • Jakob Maljaars
        • -
        • James Davies
        • -
        • James Dearman
        • -
        • James Noss
        • -
        • James O'Keeffe
        • -
        • James Taylor
        • -
        • James Tocknell
        • -
        • James Turner
        • -
        • Jamie Kennea
        • -
        • Jan Skowron
        • -
        • Jane Rigby
        • -
        • Jani Šumak
        • -
        • Jason Segnini
        • -
        • Javier Pascual Granado
        • -
        • JC Hsu
        • -
        • Jean Connelly
        • -
        • Jeff Jennings
        • -
        • Jeff Taylor
        • -
        • Jeffrey McBeth
        • -
        • Jero Bado
        • -
        • jimboH
        • -
        • Jo Bovy
        • -
        • Joanna Power
        • -
        • Joe Hunkeler
        • -
        • Joe Lyman
        • -
        • Joe Philip Ninan
        • -
        • John Fisher
        • -
        • John Parejko
        • -
        • Johnny Greco
        • -
        • johnny1up
        • -
        • Jon Carifio
        • -
        • Jonas Große Sundrup
        • -
        • Jonas Kemmer
        • -
        • Jonathan Eisenhamer
        • -
        • Jonathan Foster
        • -
        • Jonathan Sick
        • -
        • Jonathan Whitmore
        • -
        • Jörg Dietrich
        • -
        • Jose Sabater
        • -
        • José Sabater Montes
        • -
        • Joseph Jon Booker
        • -
        • Joseph Long
        • -
        • Joseph Ryan
        • -
        • Joseph Schlitz
        • -
        • Jost Migenda
        • -
        • JP Maia
        • -
        • Juan Luis Cano Rodríguez
        • -
        • Juanjo Bazán
        • -
        • Julien Woillez
        • -
        • Jurien Huisman
        • -
        • Kacper Kowalik
        • -
        • Kang Wang
        • -
        • Karan Grover
        • -
        • Karl Gordon
        • -
        • Karl Vyhmeister
        • -
        • Karl Wessel
        • -
        • Katrin Leinweber
        • -
        • Kelle Cruz
        • -
        • Kevin Gullikson
        • -
        • Kevin Sooley
        • -
        • Kewei Li
        • -
        • Kieran Leschinski
        • -
        • Kim Searle
        • -
        • Kirill Tchernyshyov
        • -
        • Kris Stern
        • -
        • Kristin Berry
        • -
        • Kunam Balaram Reddy
        • -
        • Kyle Barbary
        • -
        • Kyle Conroy
        • -
        • Kyle Oman
        • -
        • Kyle Westfall
        • -
        • Larry Bradley
        • -
        • Laura Hayes
        • -
        • Laura Watkins
        • -
        • Lauren Glattly
        • -
        • Laurent Michel
        • -
        • Laurie Stephey
        • -
        • Leah Fulmer
        • -
        • Lee Kelvin
        • -
        • Lee Spitler
        • -
        • Lehman Garrison
        • -
        • Léni Gauffier
        • -
        • Lennard Kiehl
        • -
        • Leo Singer
        • -
        • Leonardo Ferreira
        • -
        • Lia Corrales
        • -
        • Lily Fahey
        • -
        • Lingyi Hu
        • -
        • Lisa Martin
        • -
        • Lisa Walter
        • -
        • Lu Xu
        • -
        • Ludwig Schwardt
        • -
        • Luigi Paioro
        • -
        • Luke G. Bouma
        • -
        • Luke Kelley
        • -
        • Luz Paz
        • -
        • M Atakan Gürkan
        • -
        • M S R Dinesh
        • -
        • Mabry Cervin
        • -
        • Madhura Parikh
        • -
        • Magali Mebsout
        • -
        • maggiesam
        • -
        • Maik Nijhuis
        • -
        • Malynda Chizek Frouard
        • -
        • Manas Satish Bedmutha
        • -
        • Maneesh Yadav
        • -
        • Mangala Gowri Krishnamoorthy
        • -
        • Manish Biswas
        • -
        • Manodeep Sinha
        • -
        • Manon Marchand
        • -
        • Marcello Nascif
        • -
        • Mark Fardal
        • -
        • Mark Taylor
        • -
        • Markus Demleitner
        • -
        • Marten van Kerkwijk
        • -
        • Martin Dyer
        • -
        • Martin Glatzle
        • -
        • MatCat776
        • -
        • Matej Stuchlik
        • -
        • Mathieu Servillat
        • -
        • Matt Davis
        • -
        • Matteo Bachetti
        • -
        • Matthew Bourque
        • -
        • Matthew Brett
        • -
        • Matthew Craig
        • -
        • Matthew Petroff
        • -
        • Matthew Pitkin
        • -
        • Matthew Turk
        • -
        • Matthias Bussonnier
        • -
        • Matthias Stein
        • -
        • Matthieu Bec
        • -
        • Mavani Bhautik
        • -
        • Max Mahlke
        • -
        • Max Silbiger
        • -
        • Max Voronkov
        • -
        • Maximilian Linhoff
        • -
        • Maximillian Weber
        • -
        • Médéric Boquien
        • -
        • Megan Sosey
        • -
        • Melissa Weber Mendonça
        • -
        • Michael Belfrage
        • -
        • Michael Brewer
        • -
        • Michael Droettboom
        • -
        • Michael Hirsch
        • -
        • Michael Hoenig
        • -
        • Michael Kelley
        • -
        • Michael Lindner-D'Addario
        • -
        • Michael Mueller
        • -
        • Michael Seifert
        • -
        • Michael Wood-Vasey
        • -
        • Michael Zhang
        • -
        • Michele Costa
        • -
        • Michele Mastropietro
        • -
        • Michele Peresano
        • -
        • Michiel De Wilde
        • -
        • Miguel de Val-Borro
        • -
        • Mihai Cara
        • -
        • Mike Alexandersen
        • -
        • Mike McCarty
        • -
        • Mikhail Minin
        • -
        • Mikołaj
        • -
        • Miruna Oprescu
        • -
        • Moataz Hisham
        • -
        • Mohan Agrawal
        • -
        • Mohsin Mehmood
        • -
        • Molly Peeples
        • -
        • Mridul Seth
        • -
        • Mubin Manasia
        • -
        • myanm
        • -
        • mzhengxi
        • -
        • Nabil Freij
        • -
        • Nadia Dencheva
        • -
        • Nathanial Hendler
        • -
        • Nathaniel Starkman
        • -
        • Naveen Selvadurai
        • -
        • Neal McBurnett
        • -
        • Neil Crighton
        • -
        • Neil Parley
        • -
        • Nicholas Earl
        • -
        • Nicholas S. Kern
        • -
        • Nicholas Saunders
        • -
        • Nick Lloyd
        • -
        • Nick Murphy
        • -
        • Nicolas Tessore
        • -
        • Nikita Saxena
        • -
        • Nikita Tewary
        • -
        • Nimit Bhardwaj
        • -
        • Noah Zuckman
        • -
        • Nora Luetzgendorf
        • -
        • odidev
        • -
        • Ole Streicher
        • -
        • omahs
        • -
        • Orion Poplawski
        • -
        • orionlee
        • -
        • P. L. Lim
        • -
        • Param Patidar
        • -
        • Parikshit Sakurikar
        • -
        • Parkerwise
        • -
        • Patricio Rojo
        • -
        • Patti Carroll
        • -
        • Paul Barrett
        • -
        • Paul Hirst
        • -
        • Paul Huwe
        • -
        • Paul Price
        • -
        • Paul Sladen
        • -
        • Pauline Barmby
        • -
        • Perry Greenfield
        • -
        • Peter Cock
        • -
        • Peter Scicluna
        • -
        • Peter Teuben
        • -
        • Peter Yoachim
        • -
        • Pieter Eendebak
        • -
        • Piyush Sharma
        • -
        • Porter Averett
        • -
        • Prajwel Joseph
        • -
        • Prasanth Nair
        • -
        • Pratik Patel
        • -
        • Preshanth Jagannathan
        • -
        • Pritish Chakraborty
        • -
        • Pushkar Kopparla
        • -
        • Rachel Guo
        • -
        • Raghuram Devarakonda
        • -
        • Ralf Gommers
        • -
        • Raphael Erik Hviding
        • -
        • Rashid Khan
        • -
        • Rasmus Handberg
        • -
        • Ravi Kumar
        • -
        • Ray Plante
        • -
        • Régis Terrier
        • -
        • Ricardo Fonseca
        • -
        • Ricardo Ogando
        • -
        • Richard R
        • -
        • Ricky O'Steen
        • -
        • Rik van Lieshout
        • -
        • Ritiek Malhotra
        • -
        • Ritwick DSouza
        • -
        • Roban Hultman Kramer
        • -
        • Robel Geda
        • -
        • Robert Cross
        • -
        • Robert Queenin
        • -
        • Rocio Kiman
        • -
        • Rohan Rajpal
        • -
        • Rohit Kapoor
        • -
        • Rohit Patil
        • -
        • Roland Weber
        • -
        • Roman Tolesnikov
        • -
        • Roy Smart
        • -
        • Rui Xue
        • -
        • Ryan Abernathey
        • -
        • Ryan Cooke
        • -
        • Ryan Fox
        • -
        • Sadie Bartholomew
        • -
        • Sam Bianco
        • -
        • Sam Holt
        • -
        • Sam Lee
        • -
        • Sam Van Kooten
        • -
        • Sam Verstocken
        • -
        • Samruddhi Khandale
        • -
        • Samuel Brice
        • -
        • Sandeep Desai
        • -
        • Sanjeev Dubey
        • -
        • Sara Ogaz
        • -
        • Sarah Graves
        • -
        • Sarah Kendrew
        • -
        • Sarah Weissman
        • -
        • Saransh Chopra
        • -
        • Sashank Mishra
        • -
        • Saurav Sachidanand
        • -
        • Scott Thomas
        • -
        • Sebastian Meßlinger
        • -
        • Sébastien Maret
        • -
        • Sedona Price
        • -
        • Semyeong Oh
        • -
        • Serge Montagnac
        • -
        • Sergio Pascual
        • -
        • Shaheer Ahmad
        • -
        • Shailesh Ahuja
        • -
        • Shane Maloney
        • -
        • Shankar Kulumani
        • -
        • Shantanu Srivastava
        • -
        • Sharath Ramkumar
        • -
        • Shilpi Jain
        • -
        • Shivan Sornarajah
        • -
        • Shivansh Mishra
        • -
        • Shreeharsh Shinde
        • -
        • Shresth Verma
        • -
        • Shreyas Bapat
        • -
        • Sigurd Næss
        • -
        • Simon Alinder
        • -
        • Simon Conseil
        • -
        • Simon Gibbons
        • -
        • Simon Liedtke
        • -
        • Simon Torres
        • -
        • Somia Floret
        • -
        • Sonu Singh
        • -
        • Sourabh Cheedella
        • -
        • Srikrishna Sekhar
        • -
        • srirajshukla
        • -
        • Stefan Becker
        • -
        • Stefan Nelson
        • -
        • Stelios Voutsinas
        • -
        • Stephen Bailey
        • -
        • Stephen Portillo
        • -
        • Steve Crawford
        • -
        • Steve Guest
        • -
        • Steven Bamford
        • -
        • Stuart Littlefair
        • -
        • Stuart Mumford
        • -
        • Sudheesh Singanamalla
        • -
        • Sushobhana Patra
        • -
        • Suyog Garg
        • -
        • Swapnil Sharma
        • -
        • T. Carl Beery
        • -
        • T. E. Pickering
        • -
        • Tanuj Rastogi
        • -
        • Tanvi Pooranmal Meena
        • -
        • Thais Borges
        • -
        • Thomas Erben
        • -
        • Thomas J. Fan
        • -
        • Thomas Robitaille
        • -
        • Thomas Vandal
        • -
        • Thompson Le Blanc
        • -
        • thuiop
        • -
        • Tiago Gomes
        • -
        • Tiago Ribeiro
        • -
        • Tiffany Jansen
        • -
        • Tim Gates
        • -
        • Tim Jenness
        • -
        • Tim Plummer
        • -
        • Timothy P. Ellsworth Bowers
        • -
        • Tito Dal Canton
        • -
        • Tom Aldcroft
        • -
        • Tom Donaldson
        • -
        • Tom J Wilson
        • -
        • Tom Kooij
        • -
        • Tomas Babej
        • -
        • Tyler Finethy
        • -
        • Varun Nikam
        • -
        • Vatsala Swaroop
        • -
        • Víctor Terrón
        • -
        • Víctor Zabalza
        • -
        • Victoria Dye
        • -
        • Vinayak Mehta
        • -
        • Vishnunarayan K I
        • -
        • Vital Fernández
        • -
        • Volodymyr Savchenko
        • -
        • VSN Reddy Janga
        • -
        • Wilfred Tyler Gee
        • -
        • William Jamieson
        • -
        • Wolfgang Kerzendorf
        • -
        • xuewc
        • -
        • Yannick Copin
        • -
        • Yash Kumar
        • -
        • Yash Nandwana
        • -
        • Yash Sharma
        • -
        • Yingqi Ying
        • -
        • Zac Hatfield-Dodds
        • -
        • Zach Burnett
        • -
        • Zach Edwards
        • -
        • Zachary Kurtz
        • -
        • Zé Vinicius
        • -
        • Zeljko Ivezic
        • -
        • Zhen-Kai Gao
        • -
        • Zhiyuan Ma
        • -
        • Zlatan Vasović
        • -
        - -

        Other Credits

        - -
          -
        • Kaylea Nelson for designing this web site.
        • -
        • Kyle Barbary for designing the Astropy logos and documentation themes.
        • -
        • Andrew Pontzen and the pynbody team (For code that grew into astropy.units)
        • -
        • Everyone on astropy-dev and the astropy mailing list for contributing to many discussions and decisions!
        • -
        -

        If you have contributed to the Astropy project and your name is missing, - please send an email to the coordinators, or open a pull request for the credits document in the astropy repository.

        - -
        - - - -
        - - - \ No newline at end of file diff --git a/validate_roles.py b/validate_roles.py deleted file mode 100644 index e3a42492..00000000 --- a/validate_roles.py +++ /dev/null @@ -1,73 +0,0 @@ -import os -import sys -import json -from termcolor import cprint - -REQUIRED_KEYS = {"role", "url", "role-head", "responsibilities"} - - -def assert_is_list(i, key, value): - if isinstance(value, list): - return 0 - else: - cprint(f" ERROR: Key \"{key}\" for role #{i} should be a list but instead is a {type(value)}", file=sys.stderr, color='red') - return 1 - - -def assert_is_string(i, key, value): - if isinstance(value, str): - return 0 - else: - cprint(f" ERROR: Key \"{key}\" for role #{i} should be a string but instead is a {type(value)}", file=sys.stderr, color='red') - return 1 - - -jsonfn = "roles.json" -try: - roles = json.load(open(jsonfn)) -except json.decoder.JSONDecodeError as e: - cprint(jsonfn + ' : ' + e.args[0], color='red') - cprint("*** JSON file appears to be malformed - see above ***", color='red') - sys.exit(2) - -error = 0 - -for i, role in enumerate(roles): - if not isinstance(role, dict): - cprint(f" ERROR: Role #{i} is not a key/value set", file=sys.stderr, color='red') - error += 1 - else: - key_difference = REQUIRED_KEYS - set(role.keys()) - if key_difference: - cprint(f" ERROR: Missing key(s) for role #{i}: {key_difference}", file=sys.stderr, color='red') - error += 1 - - error += assert_is_string(i, 'role', role['role']) - error += assert_is_string(i, 'url', role['url']) - error += assert_is_string(i, 'role-head', role['role-head']) - - if 'sub-roles' in role: - if 'people' in role: - cprint(f" ERROR: people should not be defined at top level for role #{i} since sub-roles are defined") - error += 1 - for sub_role in role['sub-roles']: - error += assert_is_string(i, 'sub-roles[role]', sub_role['role']) - error += assert_is_list(i, 'sub-roles[people]', sub_role['people']) - else: - error += assert_is_list(i, 'people', role['people']) - - if isinstance(role['responsibilities'], list): - for resp in role['responsibilities']: - error += assert_is_string(i, 'responsibilities[description]', resp['description']) - for detail in resp['details']: - error += assert_is_string(i, 'responsibilities[detail]', detail) - else: - resp = role['responsibilities'] - error += assert_is_string(i, 'responsibilities[description]', resp['description']) - for detail in resp['details']: - error += assert_is_string(i, 'responsibilities[detail]', detail) - -if error > 0: - sornot = 's' if error > 1 else '' - cprint(f"** {error} error{sornot} occurred - see above for details **", file=sys.stderr, color='red') - sys.exit(1) From 9db2a26d2f4240ff8994dcc5974abe7bbc4391b0 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Mon, 19 Jan 2026 13:39:57 +0000 Subject: [PATCH 02/21] TMP: Acknoledge --- _static/css/astropy-org.css | 21 ++++ acknowledging.rst | 200 ++++++++++++++++++++++++++++++++++++ conf.py | 8 +- index.rst | 25 +---- requirements.txt | 1 + 5 files changed, 233 insertions(+), 22 deletions(-) create mode 100644 _static/css/astropy-org.css create mode 100644 acknowledging.rst diff --git a/_static/css/astropy-org.css b/_static/css/astropy-org.css new file mode 100644 index 00000000..eea226a1 --- /dev/null +++ b/_static/css/astropy-org.css @@ -0,0 +1,21 @@ +.bd-sidebar-secondary { + background-color: transparent; +} + +a.sd-btn { + border: none; +} + +a.sd-btn { + color: var(--sst-lightest-color); + background-image: linear-gradient(var(--sst-accent-color-muted), var(--sst-accent-color-bright)); +} + +a.sd-btn:hover, +a.sd-btn:visited:hover { + color: var(--sst-dark-color); + background: rgba(255, 255, 255, 0.3); + background-blend-mode: lighten; + background-image: linear-gradient(var(--sst-accent-color-muted), var(--sst-accent-color-bright)); + text-decoration: none; +} diff --git a/acknowledging.rst b/acknowledging.rst new file mode 100644 index 00000000..2c2d4650 --- /dev/null +++ b/acknowledging.rst @@ -0,0 +1,200 @@ +.. raw:: html + + + +.. _astropy-org-acknowledge: + +Acknowledging or Citing +======================= + +In Publications +--------------- + +If you use Astropy Project tools and resources for work/research presented in a publication (whether directly, or as a dependency to another package), we ask that you please cite the Astropy papers. +We encourage you to cite all three papers, but if space is limited, please cite the most recent paper: + +- `Astropy Paper III (v5.0) `__ (`ADS `__ - `BibTeX `__) +- `Astropy Paper II (v2.0) `__ (`ADS `__ - `BibTeX `__) +- `Astropy Paper I (v0.2) `__ (`ADS `__ - `BibTeX `__ - `10k citations `__) + +.. raw:: html + +

        Copy all BibTeX to clipboard

        + +If you are using AASTeX and plan to submit an article to one of the AAS journals, we recommend adding a ``\software{...}`` tag to your manuscript that cites Astropy (`see the AASTeX guide for more information `__), +e.g.: + +.. code-block:: latex + + \software{Astropy \citep{astropy:2013, astropy:2018, astropy:2022}} + +(but please also consider adding and citing other software packages that you use to this list as well). +If you are submitting an article to another journal, or have no other specific place in your manuscript to cite the papers, we provide the following LaTeX/BibTeX snippet to add to your acknowledgments: + +.. code-block:: latex + + This work made use of Astropy: \footnote{http://www.astropy.org} a community-developed core Python package and an ecosystem of tools and resources for astronomy \citep{astropy:2013, astropy:2018, astropy:2022}. + +As an alternative, the BibTeX record recommended for a given version of Astropy is available from the Python package itself: + +.. code-block:: python + + import astropy + astropy.__citation__ + + +In Presentations +---------------- + +If you are giving a presentation or talk featuring work/research that makes use of Astropy and would like to acknowledge Astropy, we suggest using this logo on your title slide: + +|Powered by Astropy| + +The logo is also available `with white text `__, or the SVG originals can be obtained at the `astropy-logo github repository. `__ + +In Projects +----------- +If you are using Astropy as part of a code project (e.g., affiliated packages), a useful way to acknowledge your use of Astropy is with a badge in your README. +We suggest this badge: + +|Powered by Astropy Badge| + +Which is available at the URL http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat +You can place the following in your ``README.md`` file to get the badge: + +.. code-block:: markdown + + [![astropy](http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat)](http://www.astropy.org/) + +.. |Powered by Astropy| image:: http://www.astropy.org/images/astropy_powered.png + :width: 256px +.. |Powered by Astropy Badge| image:: http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat + + +.. raw:: html + + diff --git a/conf.py b/conf.py index ea813ce9..b3386f5b 100644 --- a/conf.py +++ b/conf.py @@ -16,6 +16,7 @@ extensions = [ "myst_parser", "sphinx_design", + "sphinx_copybutton", ] templates_path = ['_templates'] @@ -34,6 +35,7 @@ # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = 'astropy' + html_static_path = ['_static'] html_theme_options = { @@ -42,5 +44,9 @@ } html_sidebars = { - "index": [], + "*": [], } + +html_css_files = [ + "css/astropy-org.css" +] diff --git a/index.rst b/index.rst index 0cfa6be5..485c50cd 100644 --- a/index.rst +++ b/index.rst @@ -1,4 +1,5 @@ -.. astropy-org:index +.. _astropy-org-index: + Astropy ======= @@ -6,7 +7,7 @@ Astropy :maxdepth: 0 :hidden: - about/index + acknowledging .. raw:: html @@ -29,7 +30,7 @@ The Astropy community is committed to supporting the :ref:`astropy-org:coc`. .. rst-class:: acknowledge - Please remember to :ref:`astropy-org:acknowledge` the use of Astropy! + Please remember to :ref:`acknowledge and cite ` the use of Astropy! .. raw:: html @@ -241,24 +242,6 @@ encouraged to submit talks, etc. and other relevant materials. margin-bottom: 0; } - a.sd-btn { - border: none; - } - - a.sd-btn { - color: var(--sst-lightest-color); - background-image: linear-gradient(var(--sst-accent-color-muted), var(--sst-accent-color-bright)); - } - - a.sd-btn:hover, - a.sd-btn:visited:hover { - color: var(--sst-dark-color); - background: rgba(255, 255, 255, 0.3); - background-blend-mode: lighten; - background-image: linear-gradient(var(--sst-accent-color-muted), var(--sst-accent-color-bright)); - text-decoration: none; - } - .sd-container, .sd-container-fluid, .sd-container-lg, .sd-container-md, .sd-container-sm, .sd-container-xl { padding-left: 0; padding-right: 0; diff --git a/requirements.txt b/requirements.txt index 49500b25..1a43a497 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ sphinx myst-parser sphinx-design sphinx-astropy[confv3]@git+https://github.com/Cadair/sphinx-astropy@conf-v3-sunpy +sphinx-copybutton From 850f3e608846f5ad3779c8a729dfc7cb6079e847 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Mon, 19 Jan 2026 15:54:46 +0000 Subject: [PATCH 03/21] TMP: Add in affiliated --- _static/css/astropy-org.css | 45 ++ _static/js/functions.js | 328 ++++++++++ _static/js/jquery.sidr.min.js | 4 + _static/js/yaml_parse_bundle.js | 138 ++++ affiliated/index.rst | 294 +++++++++ affiliated/registry.json | 1092 +++++++++++++++++++++++++++++++ conf.py | 14 +- exts/rawfiles.py | 18 + index.rst | 5 +- 9 files changed, 1934 insertions(+), 4 deletions(-) create mode 100644 _static/js/functions.js create mode 100644 _static/js/jquery.sidr.min.js create mode 100644 _static/js/yaml_parse_bundle.js create mode 100644 affiliated/index.rst create mode 100644 affiliated/registry.json create mode 100644 exts/rawfiles.py diff --git a/_static/css/astropy-org.css b/_static/css/astropy-org.css index eea226a1..8a8ea4c4 100644 --- a/_static/css/astropy-org.css +++ b/_static/css/astropy-org.css @@ -19,3 +19,48 @@ a.sd-btn:visited:hover { background-image: linear-gradient(var(--sst-accent-color-muted), var(--sst-accent-color-bright)); text-decoration: none; } + +table{ + margin: 20px 0px; + word-break:overflow-wrap; +} + +.package-table { + border: 0; +} + +table.package-table thead{ + text-align: left; + font-weight: bold; + border-bottom: 1px solid rgba(128,128,128,0.2); +} + +table.package-table td{ + padding:5px 5px; + font-size: 100%; + line-height: 1.3em; + border: 0; +} + +table.package-table td.first-package-row { + padding:15px 5px 5px 5px; + font-weight: bold; + min-width: 130px; +} + +.package-table td ~ td, .table td ~ th, .table th ~ td, .table th ~ th { + border-left: 0; +} + +.package-table tbody tr:nth-child(2n+1), +.package-table tbody tr { + background-color: transparent !important; +} + +/* Create a border after every 3rd row to visually separate packages */ +.forth-row-sep tbody tr:nth-child(4n+5) { + border-top: 1px var(--bs-border-color) solid; +} +.third-row-sep tbody tr:nth-child(3n+4) { + border-top: 1px var(--bs-border-color) solid; +} diff --git a/_static/js/functions.js b/_static/js/functions.js new file mode 100644 index 00000000..f5619805 --- /dev/null +++ b/_static/js/functions.js @@ -0,0 +1,328 @@ +// Using jQuery is ok because it is needed by and bundled with sphinx + +// Quirk to note: the jQuery.getJSON function fails if you open this locally +// with Chrome, because Chrome thinks local JSON files are unsafe for some +// reason. Use basically any other modern browser, or it works fine if its +// actually on the web server even with chrome. + +function url_translator(urltext) { + if (urltext === undefined) { + return 'None'; + } else { + return '' + 'Website' + ''; + } +} + + +function repo_translator(urltext) { + if (urltext === undefined) { + return 'None'; + } else { + return '' + 'Repository' + ''; + } +} + + +function pypi_translator(pypiname) { + if (pypiname === undefined) { + return 'None'; + } else { + var urltext = 'https://pypi.python.org/pypi/' + pypiname; + return '' + 'PyPI' + ''; + } +} + + +function bool_translator(stable) { + if (stable) { + return 'Yes'; + } else { + return 'No'; + } +} + + +function ghuser_translator(fullname, ghname) { + if (fullname === undefined || ghname === undefined) { + return 'None'; + } else { + var urltext = 'https://github.com/' + ghname; + if (fullname === null) { + fullname = ghname; + } + return '' + fullname + ''; + } +} + + +var _email_regex_str = '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'; +var _email_regex = new RegExp(_email_regex_str, 'i'); +var _email_with_name_regex = new RegExp('(.+)<(' + _email_regex_str + ')>', 'i'); + + +function maintainer_translator(maint, pkgnm) { + var url, match; + if (_email_with_name_regex.test(maint)) { + match = _email_with_name_regex.exec(maint); + url = 'mailto:' + match[2] + '?subject=Astropy%20affiliated%20package%20' + pkgnm; + return '' + match[1] + ''; + } else if (_email_regex.test(maint)) { + url = 'mailto:' + maint + '?subject=Astropy%20affiliated%20package%20' + pkgnm; + return '' + maint + ''; + } else { + return maint; + } +} + + +function createRolesTable(roles) { + //roles is an array of objects called "role" + var rows = ''; + roles.forEach(function (role) { + //role is an object containing information about each team role + //index marks current people + var index = 0; + + // for roles where there are no sub-roles, the people are defined + // at the top-level of the JSON role dict - for convenience below we create + // a virtual sub-role with no heading + if (!('sub-roles' in role)) { + role['sub-roles'] = [{'role': '', + 'people': role['people']}]; + } + + //creating each row by iterating over each person in a role + role["sub-roles"].forEach(function (subrole) { + //rowRole is displayed once for each role + rowRole = index == 0 ? '' + role["role"] + '' : ""; + + var rowSubRole = subrole['role']; + + if (subrole['people'][0] == "Unfilled") { + rowPeople = 'Unfilled'; + } else { + rowPeople = subrole['people'].join(', '); + } + + //generating rows + if (index == 0) { + rows += ''; + } else { + rows += ''; + } + + rows += '' + rowRole + '' + + '' + rowSubRole + '' + + '' + rowPeople + '' + + ''; + index++; + }); + }); + + $("#roles-table").append(rows); +} + + +function createRolesDescription(roles) { + //roles is an array of objects called "role" + var blocks = ""; + roles.forEach(function (role) { + //role is an object containing information about each team role + var list = ""; + //checking if role["description"] array isn't empty + if (role["responsibilities"] != null) { + + // If responsibilities is a dict, wrap inside a list so that all entries have a list + // dicts + if (role['responsibilities'].constructor == Object) { + role['responsibilities'] = [role['responsibilities']]; + } + + //console.log(role['responsibilities']); + + blocks += '
        ' + + '

        ' + role["role-head"] + '

        '; + + index = 0; + + role['responsibilities'].forEach(function (resp) { + + //console.log(resp); + + detail_list = ''; + resp["details"].forEach(function (detail) { + detail_list += '
      • ' + detail + '
      • '; + }); + + if ('subrole-head' in resp) { + if (index > 0) { + blocks += '
        '; + } + blocks += '' + resp["subrole-head"] + ''; + } + blocks += '

        ' + resp["description"] + '

        ' + + '
          ' + detail_list + '
        '; + + index += 1; + + }) + + } + }); + $("#roles-description").append(blocks); +} + + +function populateRoles(data, tstat, xhr) { + //creating roles table from json data + createRolesTable(data); + //creating roles lists from json data + createRolesDescription(data); +} + + +function populateTables(data, tstat, xhr) { + populatePackageTable('coordinated', filter_pkg_data(data, "coordinated", true)); + populatePackageTable('affiliated', filter_pkg_data(data, "coordinated", false)); +} + + +function filter_pkg_data(data, field, value) { + if (data === null) { + return null; + } + var pkgs = data.packages; + var filtered_data = []; + + for (i=0; i nmarr[b] ? 1 : 0; }); + + var pkgi; + var namerow, descrow, shieldrow, maintrow; + var nmcell, pypicell, urlcell, repocell; + var desccell, maintcell, shieldcell; + + for (i=0; i" + " " + } + } + } + return shield_string +} + + +function guess_os() { + var OSName="source"; + if (navigator.appVersion.indexOf("Win")!=-1) OSName="windows"; + if (navigator.appVersion.indexOf("Mac")!=-1) OSName="osx"; + if (navigator.appVersion.indexOf("Linux")!=-1) OSName="linux"; + return OSName; +} diff --git a/_static/js/jquery.sidr.min.js b/_static/js/jquery.sidr.min.js new file mode 100644 index 00000000..c0e3deb4 --- /dev/null +++ b/_static/js/jquery.sidr.min.js @@ -0,0 +1,4 @@ +/*! Sidr - v1.2.1 - 2013-11-06 + * https://github.com/artberri/sidr + * Copyright (c) 2013 Alberto Varela; Licensed MIT */ +(function(e){var t=!1,i=!1,n={isUrl:function(e){var t=RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i");return t.test(e)?!0:!1},loadContent:function(e,t){e.html(t)},addPrefix:function(e){var t=e.attr("id"),i=e.attr("class");"string"==typeof t&&""!==t&&e.attr("id",t.replace(/([A-Za-z0-9_.\-]+)/g,"sidr-id-$1")),"string"==typeof i&&""!==i&&"sidr-inner"!==i&&e.attr("class",i.replace(/([A-Za-z0-9_.\-]+)/g,"sidr-class-$1")),e.removeAttr("style")},execute:function(n,s,a){"function"==typeof s?(a=s,s="sidr"):s||(s="sidr");var r,d,l,c=e("#"+s),u=e(c.data("body")),f=e("html"),p=c.outerWidth(!0),g=c.data("speed"),h=c.data("side"),m=c.data("displace"),v=c.data("onOpen"),y=c.data("onClose"),x="sidr"===s?"sidr-open":"sidr-open "+s+"-open";if("open"===n||"toggle"===n&&!c.is(":visible")){if(c.is(":visible")||t)return;if(i!==!1)return o.close(i,function(){o.open(s)}),void 0;t=!0,"left"===h?(r={left:p+"px"},d={left:"0px"}):(r={right:p+"px"},d={right:"0px"}),u.is("body")&&(l=f.scrollTop(),f.css("overflow-x","hidden").scrollTop(l)),m?u.addClass("sidr-animating").css({width:u.width(),position:"absolute"}).animate(r,g,function(){e(this).addClass(x)}):setTimeout(function(){e(this).addClass(x)},g),c.css("display","block").animate(d,g,function(){t=!1,i=s,"function"==typeof a&&a(s),u.removeClass("sidr-animating")}),v()}else{if(!c.is(":visible")||t)return;t=!0,"left"===h?(r={left:0},d={left:"-"+p+"px"}):(r={right:0},d={right:"-"+p+"px"}),u.is("body")&&(l=f.scrollTop(),f.removeAttr("style").scrollTop(l)),u.addClass("sidr-animating").animate(r,g).removeClass(x),c.animate(d,g,function(){c.removeAttr("style").hide(),u.removeAttr("style"),e("html").removeAttr("style"),t=!1,i=!1,"function"==typeof a&&a(s),u.removeClass("sidr-animating")}),y()}}},o={open:function(e,t){n.execute("open",e,t)},close:function(e,t){n.execute("close",e,t)},toggle:function(e,t){n.execute("toggle",e,t)},toogle:function(e,t){n.execute("toggle",e,t)}};e.sidr=function(t){return o[t]?o[t].apply(this,Array.prototype.slice.call(arguments,1)):"function"!=typeof t&&"string"!=typeof t&&t?(e.error("Method "+t+" does not exist on jQuery.sidr"),void 0):o.toggle.apply(this,arguments)},e.fn.sidr=function(t){var i=e.extend({name:"sidr",speed:200,side:"left",source:null,renaming:!0,body:"body",displace:!0,onOpen:function(){},onClose:function(){}},t),s=i.name,a=e("#"+s);if(0===a.length&&(a=e("
        ").attr("id",s).appendTo(e("body"))),a.addClass("sidr").addClass(i.side).data({speed:i.speed,side:i.side,body:i.body,displace:i.displace,onOpen:i.onOpen,onClose:i.onClose}),"function"==typeof i.source){var r=i.source(s);n.loadContent(a,r)}else if("string"==typeof i.source&&n.isUrl(i.source))e.get(i.source,function(e){n.loadContent(a,e)});else if("string"==typeof i.source){var d="",l=i.source.split(",");if(e.each(l,function(t,i){d+='
        '+e(i).html()+"
        "}),i.renaming){var c=e("
        ").html(d);c.find("*").each(function(t,i){var o=e(i);n.addPrefix(o)}),d=c.html()}n.loadContent(a,d)}else null!==i.source&&e.error("Invalid Sidr Source");return this.each(function(){var t=e(this),i=t.data("sidr");i||(t.data("sidr",s),"ontouchstart"in document.documentElement?(t.bind("touchstart",function(e){e.originalEvent.touches[0],this.touched=e.timeStamp}),t.bind("touchend",function(e){var t=Math.abs(e.timeStamp-this.touched);200>t&&(e.preventDefault(),o.toggle(s))})):t.click(function(e){e.preventDefault(),o.toggle(s)}))})}})(jQuery); \ No newline at end of file diff --git a/_static/js/yaml_parse_bundle.js b/_static/js/yaml_parse_bundle.js new file mode 100644 index 00000000..bce10c7a --- /dev/null +++ b/_static/js/yaml_parse_bundle.js @@ -0,0 +1,138 @@ +(()=>{var an=Object.defineProperty;var as=(s,e)=>{for(var t in e)an(s,t,{get:e[t],enumerable:!0})};var ls={};as(ls,{Alias:()=>ee,CST:()=>ns,Composer:()=>be,Document:()=>se,Lexer:()=>Me,LineCounter:()=>Be,Pair:()=>C,Parser:()=>we,Scalar:()=>y,Schema:()=>Ce,YAMLError:()=>$e,YAMLMap:()=>$,YAMLParseError:()=>q,YAMLSeq:()=>M,YAMLWarning:()=>_e,isAlias:()=>F,isCollection:()=>T,isDocument:()=>X,isMap:()=>R,isNode:()=>L,isPair:()=>A,isScalar:()=>O,isSeq:()=>U,parse:()=>rn,parseAllDocuments:()=>nn,parseDocument:()=>os,stringify:()=>on,visit:()=>V,visitAsync:()=>je});var et=Symbol.for("yaml.alias"),tt=Symbol.for("yaml.document"),Q=Symbol.for("yaml.map"),Mt=Symbol.for("yaml.pair"),x=Symbol.for("yaml.scalar"),re=Symbol.for("yaml.seq"),j=Symbol.for("yaml.node.type"),F=s=>!!s&&typeof s=="object"&&s[j]===et,X=s=>!!s&&typeof s=="object"&&s[j]===tt,R=s=>!!s&&typeof s=="object"&&s[j]===Q,A=s=>!!s&&typeof s=="object"&&s[j]===Mt,O=s=>!!s&&typeof s=="object"&&s[j]===x,U=s=>!!s&&typeof s=="object"&&s[j]===re;function T(s){if(s&&typeof s=="object")switch(s[j]){case Q:case re:return!0}return!1}function L(s){if(s&&typeof s=="object")switch(s[j]){case et:case Q:case x:case re:return!0}return!1}var cs=s=>(O(s)||T(s))&&!!s.anchor;var K=Symbol("break visit"),fs=Symbol("skip children"),z=Symbol("remove node");function V(s,e){let t=us(e);X(s)?ke(null,s.contents,t,Object.freeze([s]))===z&&(s.contents=null):ke(null,s,t,Object.freeze([]))}V.BREAK=K;V.SKIP=fs;V.REMOVE=z;function ke(s,e,t,n){let i=hs(s,e,t,n);if(L(i)||A(i))return ps(s,n,i),ke(s,i,t,n);if(typeof i!="symbol"){if(T(e)){n=Object.freeze(n.concat(e));for(let r=0;rs.replace(/[!,[\]{}]/g,e=>cn[e]),Z=class s{constructor(e,t){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},s.defaultYaml,e),this.tags=Object.assign({},s.defaultTags,t)}clone(){let e=new s(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){let e=new s(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:s.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},s.defaultTags);break}return e}add(e,t){this.atNextDocument&&(this.yaml={explicit:s.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},s.defaultTags),this.atNextDocument=!1);let n=e.trim().split(/[ \t]+/),i=n.shift();switch(i){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;let[r,o]=n;return this.tags[r]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;let[r]=n;if(r==="1.1"||r==="1.2")return this.yaml.version=r,!0;{let o=/^\d+\.\d+$/.test(r);return t(6,`Unsupported YAML version ${r}`,o),!1}}default:return t(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e==="!")return"!";if(e[0]!=="!")return t(`Not a valid tag: ${e}`),null;if(e[1]==="<"){let o=e.slice(2,-1);return o==="!"||o==="!!"?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==">"&&t("Verbatim tags must end with a >"),o)}let[,n,i]=e.match(/^(.*!)([^!]*)$/s);i||t(`The ${e} tag has no suffix`);let r=this.tags[n];if(r)try{return r+decodeURIComponent(i)}catch(o){return t(String(o)),null}return n==="!"?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+fn(e.substring(n.length));return e[0]==="!"?e:`!<${e}>`}toString(e){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags),i;if(e&&n.length>0&&L(e.contents)){let r={};V(e.contents,(o,l)=>{L(l)&&l.tag&&(r[l.tag]=!0)}),i=Object.keys(r)}else i=[];for(let[r,o]of n)r==="!!"&&o==="tag:yaml.org,2002:"||(!e||i.some(l=>l.startsWith(o)))&&t.push(`%TAG ${r} ${o}`);return t.join(` +`)}};Z.defaultYaml={explicit:!1,version:"1.2"};Z.defaultTags={"!!":"tag:yaml.org,2002:"};function st(s){if(/[\x00-\x19\s,[\]{}]/.test(s)){let t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(s)}`;throw new Error(t)}return!0}function Bt(s){let e=new Set;return V(s,{Value(t,n){n.anchor&&e.add(n.anchor)}}),e}function Dt(s,e){for(let t=1;;++t){let n=`${s}${t}`;if(!e.has(n))return n}}function ms(s,e){let t=[],n=new Map,i=null;return{onAnchor:r=>{t.push(r),i||(i=Bt(s));let o=Dt(e,i);return i.add(o),o},setAnchors:()=>{for(let r of t){let o=n.get(r);if(typeof o=="object"&&o.anchor&&(O(o.node)||T(o.node)))o.node.anchor=o.anchor;else{let l=new Error("Failed to resolve repeated object (this should not happen)");throw l.source=r,l}}},sourceObjects:n}}function ce(s,e,t,n){if(n&&typeof n=="object")if(Array.isArray(n))for(let i=0,r=n.length;i_(n,String(i),t));if(s&&typeof s.toJSON=="function"){if(!t||!cs(s))return s.toJSON(e,t);let n={aliasCount:0,count:1,res:void 0};t.anchors.set(s,n),t.onCreate=r=>{n.res=r,delete t.onCreate};let i=s.toJSON(e,t);return t.onCreate&&t.onCreate(i),i}return typeof s=="bigint"&&!t?.keep?Number(s):s}var fe=class{constructor(e){Object.defineProperty(this,j,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:i,reviver:r}={}){if(!X(e))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},l=_(this,"",o);if(typeof i=="function")for(let{count:a,res:c}of o.anchors.values())i(c,a);return typeof r=="function"?ce(r,{"":l},"",l):l}};var ee=class extends fe{constructor(e){super(et),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e){let t;return V(e,{Node:(n,i)=>{if(i===this)return V.BREAK;i.anchor===this.source&&(t=i)}}),t}toJSON(e,t){if(!t)return{source:this.source};let{anchors:n,doc:i,maxAliasCount:r}=t,o=this.resolve(i);if(!o){let a=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(a)}let l=n.get(o);if(l||(_(o,null,t),l=n.get(o)),!l||l.res===void 0){let a="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(a)}if(r>=0&&(l.count+=1,l.aliasCount===0&&(l.aliasCount=nt(i,o,n)),l.count*l.aliasCount>r)){let a="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(a)}return l.res}toString(e,t,n){let i=`*${this.source}`;if(e){if(st(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let r=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(r)}if(e.implicitKey)return`${i} `}return i}};function nt(s,e,t){if(F(e)){let n=e.resolve(s),i=t&&n&&t.get(n);return i?i.count*i.aliasCount:0}else if(T(e)){let n=0;for(let i of e.items){let r=nt(s,i,t);r>n&&(n=r)}return n}else if(A(e)){let n=nt(s,e.key,t),i=nt(s,e.value,t);return Math.max(n,i)}return 1}var it=s=>!s||typeof s!="function"&&typeof s!="object",y=class extends fe{constructor(e){super(x),this.value=e}toJSON(e,t){return t?.keep?this.value:_(this.value,e,t)}toString(){return String(this.value)}};y.BLOCK_FOLDED="BLOCK_FOLDED";y.BLOCK_LITERAL="BLOCK_LITERAL";y.PLAIN="PLAIN";y.QUOTE_DOUBLE="QUOTE_DOUBLE";y.QUOTE_SINGLE="QUOTE_SINGLE";var un="tag:yaml.org,2002:";function hn(s,e,t){if(e){let n=t.filter(r=>r.tag===e),i=n.find(r=>!r.format)??n[0];if(!i)throw new Error(`Tag ${e} not found`);return i}return t.find(n=>n.identify?.(s)&&!n.format)}function oe(s,e,t){if(X(s)&&(s=s.contents),L(s))return s;if(A(s)){let f=t.schema[Q].createNode?.(t.schema,null,t);return f.items.push(s),f}(s instanceof String||s instanceof Number||s instanceof Boolean||typeof BigInt<"u"&&s instanceof BigInt)&&(s=s.valueOf());let{aliasDuplicateObjects:n,onAnchor:i,onTagObj:r,schema:o,sourceObjects:l}=t,a;if(n&&s&&typeof s=="object"){if(a=l.get(s),a)return a.anchor||(a.anchor=i(s)),new ee(a.anchor);a={anchor:null,node:null},l.set(s,a)}e?.startsWith("!!")&&(e=un+e.slice(2));let c=hn(s,e,o.tags);if(!c){if(s&&typeof s.toJSON=="function"&&(s=s.toJSON()),!s||typeof s!="object"){let f=new y(s);return a&&(a.node=f),f}c=s instanceof Map?o[Q]:Symbol.iterator in Object(s)?o[re]:o[Q]}r&&(r(c),delete t.onTagObj);let p=c?.createNode?c.createNode(t.schema,s,t):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(t.schema,s,t):new y(s);return e?p.tag=e:c.default||(p.tag=c.tag),a&&(a.node=p),p}function Ke(s,e,t){let n=t;for(let i=e.length-1;i>=0;--i){let r=e[i];if(typeof r=="number"&&Number.isInteger(r)&&r>=0){let o=[];o[r]=n,n=o}else n=new Map([[r,n]])}return oe(n,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:s,sourceObjects:new Map})}var Oe=s=>s==null||typeof s=="object"&&!!s[Symbol.iterator]().next().done,ge=class extends fe{constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(n=>L(n)||A(n)?n.clone(e):n),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(Oe(e))this.add(t);else{let[n,...i]=e,r=this.get(n,!0);if(T(r))r.addIn(i,t);else if(r===void 0&&this.schema)this.set(n,Ke(this.schema,i,t));else throw new Error(`Expected YAML collection at ${n}. Remaining path: ${i}`)}}deleteIn(e){let[t,...n]=e;if(n.length===0)return this.delete(t);let i=this.get(t,!0);if(T(i))return i.deleteIn(n);throw new Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){let[n,...i]=e,r=this.get(n,!0);return i.length===0?!t&&O(r)?r.value:r:T(r)?r.getIn(i,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!A(t))return!1;let n=t.value;return n==null||e&&O(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){let[t,...n]=e;if(n.length===0)return this.has(t);let i=this.get(t,!0);return T(i)?i.hasIn(n):!1}setIn(e,t){let[n,...i]=e;if(i.length===0)this.set(n,t);else{let r=this.get(n,!0);if(T(r))r.setIn(i,t);else if(r===void 0&&this.schema)this.set(n,Ke(this.schema,i,t));else throw new Error(`Expected YAML collection at ${n}. Remaining path: ${i}`)}}};ge.maxFlowStringSingleLineLength=60;var ds=s=>s.replace(/^(?!$)(?: $)?/gm,"#");function Y(s,e){return/^\n+$/.test(s)?s.substring(1):e?s.replace(/^(?! *$)/gm,e):s}var te=(s,e,t)=>s.endsWith(` +`)?Y(t,e):t.includes(` +`)?` +`+Y(t,e):(s.endsWith(" ")?"":" ")+t;var jt="flow",rt="block",qe="quoted";function xe(s,e,t="flow",{indentAtStart:n,lineWidth:i=80,minContentWidth:r=20,onFold:o,onOverflow:l}={}){if(!i||i<0)return s;let a=Math.max(1+r,1+i-e.length);if(s.length<=a)return s;let c=[],p={},f=i-e.length;typeof n=="number"&&(n>i-Math.max(2,r)?c.push(0):f=i-n);let h,d,b=!1,u=-1,m=-1,S=-1;t===rt&&(u=gs(s,u,e.length),u!==-1&&(f=u+a));for(let k;k=s[u+=1];){if(t===qe&&k==="\\"){switch(m=u,s[u+1]){case"x":u+=3;break;case"u":u+=5;break;case"U":u+=9;break;default:u+=1}S=u}if(k===` +`)t===rt&&(u=gs(s,u,e.length)),f=u+e.length+a,h=void 0;else{if(k===" "&&d&&d!==" "&&d!==` +`&&d!==" "){let N=s[u+1];N&&N!==" "&&N!==` +`&&N!==" "&&(h=u)}if(u>=f)if(h)c.push(h),f=h+a,h=void 0;else if(t===qe){for(;d===" "||d===" ";)d=k,k=s[u+=1],b=!0;let N=u>S+1?u-2:m-1;if(p[N])return s;c.push(N),p[N]=!0,f=N+a,h=void 0}else b=!0}d=k}if(b&&l&&l(),c.length===0)return s;o&&o();let w=s.slice(0,c[0]);for(let k=0;k({indentAtStart:e?s.indent.length:s.indentAtStart,lineWidth:s.options.lineWidth,minContentWidth:s.options.minContentWidth}),at=s=>/^(%|---|\.\.\.)/m.test(s);function pn(s,e,t){if(!e||e<0)return!1;let n=e-t,i=s.length;if(i<=n)return!1;for(let r=0,o=0;rn)return!0;if(o=r+1,i-o<=n)return!1}return!0}function Fe(s,e){let t=JSON.stringify(s);if(e.options.doubleQuotedAsJSON)return t;let{implicitKey:n}=e,i=e.options.doubleQuotedMinMultiLineLength,r=e.indent||(at(s)?" ":""),o="",l=0;for(let a=0,c=t[a];c;c=t[++a])if(c===" "&&t[a+1]==="\\"&&t[a+2]==="n"&&(o+=t.slice(l,a)+"\\ ",a+=1,l=a,c="\\"),c==="\\")switch(t[a+1]){case"u":{o+=t.slice(l,a);let p=t.substr(a+2,4);switch(p){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:p.substr(0,2)==="00"?o+="\\x"+p.substr(2):o+=t.substr(a,6)}a+=5,l=a+1}break;case"n":if(n||t[a+2]==='"'||t.length +`;let f,h;for(h=t.length;h>0;--h){let g=t[h-1];if(g!==` +`&&g!==" "&&g!==" ")break}let d=t.substring(h),b=d.indexOf(` +`);b===-1?f="-":t===d||b!==d.length-1?(f="+",r&&r()):f="",d&&(t=t.slice(0,-d.length),d[d.length-1]===` +`&&(d=d.slice(0,-1)),d=d.replace(qt,`$&${c}`));let u=!1,m,S=-1;for(m=0;m")+(u?c?"2":"1":"")+f;if(s&&(N+=" "+l(s.replace(/ ?[\r\n]+/g," ")),i&&i()),p)return t=t.replace(/\n+/g,`$&${c}`),`${N} +${c}${w}${t}${d}`;t=t.replace(/\n+/g,` +$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`);let E=xe(`${w}${t}${d}`,c,rt,lt(n,!0));return`${N} +${c}${E}`}function mn(s,e,t,n){let{type:i,value:r}=s,{actualString:o,implicitKey:l,indent:a,indentStep:c,inFlow:p}=e;if(l&&r.includes(` +`)||p&&/[[\]{},]/.test(r))return Ae(r,e);if(!r||/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(r))return l||p||!r.includes(` +`)?Ae(r,e):ot(s,e,t,n);if(!l&&!p&&i!==y.PLAIN&&r.includes(` +`))return ot(s,e,t,n);if(at(r)){if(a==="")return e.forceBlockIndent=!0,ot(s,e,t,n);if(l&&a===c)return Ae(r,e)}let f=r.replace(/\n+/g,`$& +${a}`);if(o){let h=u=>u.default&&u.tag!=="tag:yaml.org,2002:str"&&u.test?.test(f),{compat:d,tags:b}=e.doc.schema;if(b.some(h)||d?.some(h))return Ae(r,e)}return l?f:xe(f,a,jt,lt(e,!1))}function le(s,e,t,n){let{implicitKey:i,inFlow:r}=e,o=typeof s.value=="string"?s:Object.assign({},s,{value:String(s.value)}),{type:l}=s;l!==y.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(l=y.QUOTE_DOUBLE);let a=p=>{switch(p){case y.BLOCK_FOLDED:case y.BLOCK_LITERAL:return i||r?Ae(o.value,e):ot(o,e,t,n);case y.QUOTE_DOUBLE:return Fe(o.value,e);case y.QUOTE_SINGLE:return Kt(o.value,e);case y.PLAIN:return mn(o,e,t,n);default:return null}},c=a(l);if(c===null){let{defaultKeyType:p,defaultStringType:f}=e.options,h=i&&p||f;if(c=a(h),c===null)throw new Error(`Unsupported default string type ${h}`)}return c}function ct(s,e){let t=Object.assign({blockQuote:!0,commentString:ds,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},s.schema.toStringOptions,e),n;switch(t.collectionStyle){case"block":n=!1;break;case"flow":n=!0;break;default:n=null}return{anchors:new Set,doc:s,flowCollectionPadding:t.flowCollectionPadding?" ":"",indent:"",indentStep:typeof t.indent=="number"?" ".repeat(t.indent):" ",inFlow:n,options:t}}function dn(s,e){if(e.tag){let i=s.filter(r=>r.tag===e.tag);if(i.length>0)return i.find(r=>r.format===e.format)??i[0]}let t,n;if(O(e)){n=e.value;let i=s.filter(r=>r.identify?.(n));t=i.find(r=>r.format===e.format)??i.find(r=>!r.format)}else n=e,t=s.find(i=>i.nodeClass&&n instanceof i.nodeClass);if(!t){let i=n?.constructor?.name??typeof n;throw new Error(`Tag not resolved for ${i} value`)}return t}function gn(s,e,{anchors:t,doc:n}){if(!n.directives)return"";let i=[],r=(O(s)||T(s))&&s.anchor;r&&st(r)&&(t.add(r),i.push(`&${r}`));let o=s.tag?s.tag:e.default?null:e.tag;return o&&i.push(n.directives.tagString(o)),i.join(" ")}function ae(s,e,t,n){if(A(s))return s.toString(e,t,n);if(F(s)){if(e.doc.directives)return s.toString(e);if(e.resolvedAliases?.has(s))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(s):e.resolvedAliases=new Set([s]),s=s.resolve(e.doc)}let i,r=L(s)?s:e.doc.createNode(s,{onTagObj:a=>i=a});i||(i=dn(e.doc.schema.tags,r));let o=gn(r,i,e);o.length>0&&(e.indentAtStart=(e.indentAtStart??0)+o.length+1);let l=typeof i.stringify=="function"?i.stringify(r,e,t,n):O(r)?le(r,e,t,n):r.toString(e,t,n);return o?O(r)||l[0]==="{"||l[0]==="["?`${o} ${l}`:`${o} +${e.indent}${l}`:l}function ys({key:s,value:e},t,n,i){let{allNullValues:r,doc:o,indent:l,indentStep:a,options:{commentString:c,indentSeq:p,simpleKeys:f}}=t,h=L(s)&&s.comment||null;if(f){if(h)throw new Error("With simple keys, key nodes cannot have comments");if(T(s)){let I="With simple keys, collection cannot be used as a key value";throw new Error(I)}}let d=!f&&(!s||h&&e==null&&!t.inFlow||T(s)||(O(s)?s.type===y.BLOCK_FOLDED||s.type===y.BLOCK_LITERAL:typeof s=="object"));t=Object.assign({},t,{allNullValues:!1,implicitKey:!d&&(f||!r),indent:l+a});let b=!1,u=!1,m=ae(s,t,()=>b=!0,()=>u=!0);if(!d&&!t.inFlow&&m.length>1024){if(f)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");d=!0}if(t.inFlow){if(r||e==null)return b&&n&&n(),m===""?"?":d?`? ${m}`:m}else if(r&&!f||e==null&&d)return m=`? ${m}`,h&&!b?m+=te(m,t.indent,c(h)):u&&i&&i(),m;b&&(h=null),d?(h&&(m+=te(m,t.indent,c(h))),m=`? ${m} +${l}:`):(m=`${m}:`,h&&(m+=te(m,t.indent,c(h))));let S,w,k;L(e)?(S=!!e.spaceBefore,w=e.commentBefore,k=e.comment):(S=!1,w=null,k=null,e&&typeof e=="object"&&(e=o.createNode(e))),t.implicitKey=!1,!d&&!h&&O(e)&&(t.indentAtStart=m.length+1),u=!1,!p&&a.length>=2&&!t.inFlow&&!d&&U(e)&&!e.flow&&!e.tag&&!e.anchor&&(t.indent=t.indent.substring(2));let N=!1,E=ae(e,t,()=>N=!0,()=>u=!0),g=" ";if(h||S||w){if(g=S?` +`:"",w){let I=c(w);g+=` +${Y(I,t.indent)}`}E===""&&!t.inFlow?g===` +`&&(g=` + +`):g+=` +${t.indent}`}else if(!d&&T(e)){let I=E[0],v=E.indexOf(` +`),B=v!==-1,de=t.inFlow??e.flow??e.items.length===0;if(B||!de){let Se=!1;if(B&&(I==="&"||I==="!")){let P=E.indexOf(" ");I==="&"&&P!==-1&&Ps===bs||O(s)&&s.value===bs&&(!s.type||s.type===y.PLAIN);function xt(s,e,t){let n=s&&F(t)?t.resolve(s.doc):t;if(!R(n))throw new Error("Merge sources must be maps or map aliases");let i=n.toJSON(null,s,Map);for(let[r,o]of i)e instanceof Map?e.has(r)||e.set(r,o):e instanceof Set?e.add(r):Object.prototype.hasOwnProperty.call(e,r)||Object.defineProperty(e,r,{value:o,writable:!0,enumerable:!0,configurable:!0});return e}function bn(s,e,t){if(e===null)return"";if(typeof e!="object")return String(e);if(L(s)&&t?.doc){let n=ct(t.doc,{});n.anchors=new Set;for(let r of t.anchors.keys())n.anchors.add(r.anchor);n.inFlow=!0,n.inStringifyKey=!0;let i=s.toString(n);if(!t.mapKeyWarned){let r=JSON.stringify(i);r.length>40&&(r=r.substring(0,36)+'..."'),ft(t.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${r}. Set mapAsMap: true to use object keys.`),t.mapKeyWarned=!0}return i}return JSON.stringify(e)}function Ee(s,e,t){let n=oe(s,void 0,t),i=oe(e,void 0,t);return new C(n,i)}var C=class s{constructor(e,t=null){Object.defineProperty(this,j,{value:Mt}),this.key=e,this.value=t}clone(e){let{key:t,value:n}=this;return L(t)&&(t=t.clone(e)),L(n)&&(n=n.clone(e)),new s(t,n)}toJSON(e,t){let n=t?.mapAsMap?new Map:{};return ut(t,n,this)}toString(e,t,n){return e?.doc?ys(this,e,t,n):JSON.stringify(this)}};function pt(s,e,t){return(e.inFlow??s.flow?Sn:wn)(s,e,t)}function wn({comment:s,items:e},t,{blockItemPrefix:n,flowChars:i,itemIndent:r,onChompKeep:o,onComment:l}){let{indent:a,options:{commentString:c}}=t,p=Object.assign({},t,{indent:r,type:null}),f=!1,h=[];for(let b=0;bm=null,()=>f=!0);m&&(S+=te(S,r,c(m))),f&&m&&(f=!1),h.push(n+S)}let d;if(h.length===0)d=i.start+i.end;else{d=h[0];for(let b=1;bm=null);bp||S.includes(` +`))&&(c=!0),f.push(S),p=f.length}let{start:h,end:d}=t;if(f.length===0)return h+d;if(!c){let b=f.reduce((u,m)=>u+m.length+2,2);c=e.options.lineWidth>0&&b>e.options.lineWidth}if(c){let b=h;for(let u of f)b+=u?` +${r}${i}${u}`:` +`;return`${b} +${i}${d}`}else return`${h}${o}${f.join(" ")}${o}${d}`}function ht({indent:s,options:{commentString:e}},t,n,i){if(n&&i&&(n=n.replace(/^\n+/,"")),n){let r=Y(e(n),s);t.push(r.trimStart())}}function ue(s,e){let t=O(e)?e.value:e;for(let n of s)if(A(n)&&(n.key===e||n.key===t||O(n.key)&&n.key.value===t))return n}var $=class extends ge{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(Q,e),this.items=[]}static from(e,t,n){let{keepUndefined:i,replacer:r}=n,o=new this(e),l=(a,c)=>{if(typeof r=="function")c=r.call(t,a,c);else if(Array.isArray(r)&&!r.includes(a))return;(c!==void 0||i)&&o.items.push(Ee(a,c,n))};if(t instanceof Map)for(let[a,c]of t)l(a,c);else if(t&&typeof t=="object")for(let a of Object.keys(t))l(a,t[a]);return typeof e.sortMapEntries=="function"&&o.items.sort(e.sortMapEntries),o}add(e,t){let n;A(e)?n=e:!e||typeof e!="object"||!("key"in e)?n=new C(e,e?.value):n=new C(e.key,e.value);let i=ue(this.items,n.key),r=this.schema?.sortMapEntries;if(i){if(!t)throw new Error(`Key ${n.key} already set`);O(i.value)&&it(n.value)?i.value.value=n.value:i.value=n.value}else if(r){let o=this.items.findIndex(l=>r(n,l)<0);o===-1?this.items.push(n):this.items.splice(o,0,n)}else this.items.push(n)}delete(e){let t=ue(this.items,e);return t?this.items.splice(this.items.indexOf(t),1).length>0:!1}get(e,t){let i=ue(this.items,e)?.value;return(!t&&O(i)?i.value:i)??void 0}has(e){return!!ue(this.items,e)}set(e,t){this.add(new C(e,t),!0)}toJSON(e,t,n){let i=n?new n:t?.mapAsMap?new Map:{};t?.onCreate&&t.onCreate(i);for(let r of this.items)ut(t,i,r);return i}toString(e,t,n){if(!e)return JSON.stringify(this);for(let i of this.items)if(!A(i))throw new Error(`Map items must all be pairs; found ${JSON.stringify(i)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),pt(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:n,onComment:t})}};var G={collection:"map",default:!0,nodeClass:$,tag:"tag:yaml.org,2002:map",resolve(s,e){return R(s)||e("Expected a mapping for this tag"),s},createNode:(s,e,t)=>$.from(s,e,t)};var M=class extends ge{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(re,e),this.items=[]}add(e){this.items.push(e)}delete(e){let t=mt(e);return typeof t!="number"?!1:this.items.splice(t,1).length>0}get(e,t){let n=mt(e);if(typeof n!="number")return;let i=this.items[n];return!t&&O(i)?i.value:i}has(e){let t=mt(e);return typeof t=="number"&&t=0?e:null}var W={collection:"seq",default:!0,nodeClass:M,tag:"tag:yaml.org,2002:seq",resolve(s,e){return U(s)||e("Expected a sequence for this tag"),s},createNode:(s,e,t)=>M.from(s,e,t)};var he={identify:s=>typeof s=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:s=>s,stringify(s,e,t,n){return e=Object.assign({actualString:!0},e),le(s,e,t,n)}};var ye={identify:s=>s==null,createNode:()=>new y(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new y(null),stringify:({source:s},e)=>typeof s=="string"&&ye.test.test(s)?s:e.options.nullStr};var Re={identify:s=>typeof s=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:s=>new y(s[0]==="t"||s[0]==="T"),stringify({source:s,value:e},t){if(s&&Re.test.test(s)){let n=s[0]==="t"||s[0]==="T";if(e===n)return s}return e?t.options.trueStr:t.options.falseStr}};function D({format:s,minFractionDigits:e,tag:t,value:n}){if(typeof n=="bigint")return String(n);let i=typeof n=="number"?n:Number(n);if(!isFinite(i))return isNaN(i)?".nan":i<0?"-.inf":".inf";let r=JSON.stringify(n);if(!s&&e&&(!t||t==="tag:yaml.org,2002:float")&&/^\d/.test(r)){let o=r.indexOf(".");o<0&&(o=r.length,r+=".");let l=e-(r.length-o-1);for(;l-- >0;)r+="0"}return r}var dt={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN))$/,resolve:s=>s.slice(-3).toLowerCase()==="nan"?NaN:s[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:D},gt={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:s=>parseFloat(s),stringify(s){let e=Number(s.value);return isFinite(e)?e.toExponential():D(s)}},yt={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(s){let e=new y(parseFloat(s)),t=s.indexOf(".");return t!==-1&&s[s.length-1]==="0"&&(e.minFractionDigits=s.length-t-1),e},stringify:D};var bt=s=>typeof s=="bigint"||Number.isInteger(s),Ft=(s,e,t,{intAsBigInt:n})=>n?BigInt(s):parseInt(s.substring(e),t);function ws(s,e,t){let{value:n}=s;return bt(n)&&n>=0?t+n.toString(e):D(s)}var wt={identify:s=>bt(s)&&s>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(s,e,t)=>Ft(s,2,8,t),stringify:s=>ws(s,8,"0o")},St={identify:bt,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(s,e,t)=>Ft(s,0,10,t),stringify:D},kt={identify:s=>bt(s)&&s>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(s,e,t)=>Ft(s,2,16,t),stringify:s=>ws(s,16,"0x")};var Ss=[G,W,he,ye,Re,wt,St,kt,dt,gt,yt];function ks(s){return typeof s=="bigint"||Number.isInteger(s)}var Nt=({value:s})=>JSON.stringify(s),kn=[{identify:s=>typeof s=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:s=>s,stringify:Nt},{identify:s=>s==null,createNode:()=>new y(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Nt},{identify:s=>typeof s=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true|false$/,resolve:s=>s==="true",stringify:Nt},{identify:ks,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(s,e,{intAsBigInt:t})=>t?BigInt(s):parseInt(s,10),stringify:({value:s})=>ks(s)?s.toString():JSON.stringify(s)},{identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:s=>parseFloat(s),stringify:Nt}],Nn={default:!0,tag:"",test:/^/,resolve(s,e){return e(`Unresolved plain scalar ${JSON.stringify(s)}`),s}},Ns=[G,W].concat(kn,Nn);var Ue={identify:s=>s instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(s,e){if(typeof Buffer=="function")return Buffer.from(s,"base64");if(typeof atob=="function"){let t=atob(s.replace(/[\n\r]/g,"")),n=new Uint8Array(t.length);for(let i=0;i1&&e("Each pair must have its own sequence indicator");let i=n.items[0]||new C(new y(null));if(n.commentBefore&&(i.key.commentBefore=i.key.commentBefore?`${n.commentBefore} +${i.key.commentBefore}`:n.commentBefore),n.comment){let r=i.value??i.key;r.comment=r.comment?`${n.comment} +${r.comment}`:n.comment}n=i}s.items[t]=A(n)?n:new C(n)}}else e("Expected a sequence for this tag");return s}function Ut(s,e,t){let{replacer:n}=t,i=new M(s);i.tag="tag:yaml.org,2002:pairs";let r=0;if(e&&Symbol.iterator in Object(e))for(let o of e){typeof n=="function"&&(o=n.call(e,String(r++),o));let l,a;if(Array.isArray(o))if(o.length===2)l=o[0],a=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let c=Object.keys(o);if(c.length===1)l=c[0],a=o[l];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else l=o;i.items.push(Ee(l,a,t))}return i}var Ve={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Rt,createNode:Ut};var Le=class s extends M{constructor(){super(),this.add=$.prototype.add.bind(this),this.delete=$.prototype.delete.bind(this),this.get=$.prototype.get.bind(this),this.has=$.prototype.has.bind(this),this.set=$.prototype.set.bind(this),this.tag=s.tag}toJSON(e,t){if(!t)return super.toJSON(e);let n=new Map;t?.onCreate&&t.onCreate(n);for(let i of this.items){let r,o;if(A(i)?(r=_(i.key,"",t),o=_(i.value,r,t)):r=_(i,"",t),n.has(r))throw new Error("Ordered maps must not include duplicate keys");n.set(r,o)}return n}static from(e,t,n){let i=Ut(e,t,n),r=new this;return r.items=i.items,r}};Le.tag="tag:yaml.org,2002:omap";var Ye={collection:"seq",identify:s=>s instanceof Map,nodeClass:Le,default:!1,tag:"tag:yaml.org,2002:omap",resolve(s,e){let t=Rt(s,e),n=[];for(let{key:i}of t.items)O(i)&&(n.includes(i.value)?e(`Ordered maps must not include duplicate keys: ${i.value}`):n.push(i.value));return Object.assign(new Le,t)},createNode:(s,e,t)=>Le.from(s,e,t)};function Os({value:s,source:e},t){return e&&(s?Vt:Yt).test.test(e)?e:s?t.options.trueStr:t.options.falseStr}var Vt={identify:s=>s===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new y(!0),stringify:Os},Yt={identify:s=>s===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new y(!1),stringify:Os};var As={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN)$/,resolve:s=>s.slice(-3).toLowerCase()==="nan"?NaN:s[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:D},Es={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:s=>parseFloat(s.replace(/_/g,"")),stringify(s){let e=Number(s.value);return isFinite(e)?e.toExponential():D(s)}},Ls={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(s){let e=new y(parseFloat(s.replace(/_/g,""))),t=s.indexOf(".");if(t!==-1){let n=s.substring(t+1).replace(/_/g,"");n[n.length-1]==="0"&&(e.minFractionDigits=n.length)}return e},stringify:D};var Je=s=>typeof s=="bigint"||Number.isInteger(s);function Ot(s,e,t,{intAsBigInt:n}){let i=s[0];if((i==="-"||i==="+")&&(e+=1),s=s.substring(e).replace(/_/g,""),n){switch(t){case 2:s=`0b${s}`;break;case 8:s=`0o${s}`;break;case 16:s=`0x${s}`;break}let o=BigInt(s);return i==="-"?BigInt(-1)*o:o}let r=parseInt(s,t);return i==="-"?-1*r:r}function Jt(s,e,t){let{value:n}=s;if(Je(n)){let i=n.toString(e);return n<0?"-"+t+i.substr(1):t+i}return D(s)}var Ts={identify:Je,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(s,e,t)=>Ot(s,2,2,t),stringify:s=>Jt(s,2,"0b")},Is={identify:Je,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(s,e,t)=>Ot(s,1,8,t),stringify:s=>Jt(s,8,"0")},Cs={identify:Je,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(s,e,t)=>Ot(s,0,10,t),stringify:D},vs={identify:Je,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(s,e,t)=>Ot(s,2,16,t),stringify:s=>Jt(s,16,"0x")};var Te=class s extends ${constructor(e){super(e),this.tag=s.tag}add(e){let t;A(e)?t=e:e&&typeof e=="object"&&"key"in e&&"value"in e&&e.value===null?t=new C(e.key,null):t=new C(e,null),ue(this.items,t.key)||this.items.push(t)}get(e,t){let n=ue(this.items,e);return!t&&A(n)?O(n.key)?n.key.value:n.key:n}set(e,t){if(typeof t!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);let n=ue(this.items,e);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new C(e))}toJSON(e,t){return super.toJSON(e,t,Set)}toString(e,t,n){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),t,n);throw new Error("Set items must all have null values")}static from(e,t,n){let{replacer:i}=n,r=new this(e);if(t&&Symbol.iterator in Object(t))for(let o of t)typeof i=="function"&&(o=i.call(t,o,o)),r.items.push(Ee(o,null,n));return r}};Te.tag="tag:yaml.org,2002:set";var Qe={collection:"map",identify:s=>s instanceof Set,nodeClass:Te,default:!1,tag:"tag:yaml.org,2002:set",createNode:(s,e,t)=>Te.from(s,e,t),resolve(s,e){if(R(s)){if(s.hasAllNullValues(!0))return Object.assign(new Te,s);e("Set items must all have null values")}else e("Expected a mapping for this tag");return s}};function Qt(s,e){let t=s[0],n=t==="-"||t==="+"?s.substring(1):s,i=o=>e?BigInt(o):Number(o),r=n.replace(/_/g,"").split(":").reduce((o,l)=>o*i(60)+i(l),i(0));return t==="-"?i(-1)*r:r}function $s(s){let{value:e}=s,t=o=>o;if(typeof e=="bigint")t=o=>BigInt(o);else if(isNaN(e)||!isFinite(e))return D(s);let n="";e<0&&(n="-",e*=t(-1));let i=t(60),r=[e%i];return e<60?r.unshift(0):(e=(e-r[0])/i,r.unshift(e%i),e>=60&&(e=(e-r[0])/i,r.unshift(e))),n+r.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var At={identify:s=>typeof s=="bigint"||Number.isInteger(s),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(s,e,{intAsBigInt:t})=>Qt(s,t),stringify:$s},Et={identify:s=>typeof s=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:s=>Qt(s,!1),stringify:$s},Ie={identify:s=>s instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(s){let e=s.match(Ie.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,t,n,i,r,o,l]=e.map(Number),a=e[7]?Number((e[7]+"00").substr(1,3)):0,c=Date.UTC(t,n-1,i,r||0,o||0,l||0,a),p=e[8];if(p&&p!=="Z"){let f=Qt(p,!1);Math.abs(f)<30&&(f*=60),c-=6e4*f}return new Date(c)},stringify:({value:s})=>s.toISOString().replace(/((T00:00)?:00)?\.000Z$/,"")};var Gt=[G,W,he,ye,Vt,Yt,Ts,Is,Cs,vs,As,Es,Ls,Ue,Ye,Ve,Qe,At,Et,Ie];var _s=new Map([["core",Ss],["failsafe",[G,W,he]],["json",Ns],["yaml11",Gt],["yaml-1.1",Gt]]),Ps={binary:Ue,bool:Re,float:yt,floatExp:gt,floatNaN:dt,floatTime:Et,int:St,intHex:kt,intOct:wt,intTime:At,map:G,null:ye,omap:Ye,pairs:Ve,seq:W,set:Qe,timestamp:Ie},Ms={"tag:yaml.org,2002:binary":Ue,"tag:yaml.org,2002:omap":Ye,"tag:yaml.org,2002:pairs":Ve,"tag:yaml.org,2002:set":Qe,"tag:yaml.org,2002:timestamp":Ie};function Lt(s,e){let t=_s.get(e);if(!t)if(Array.isArray(s))t=[];else{let n=Array.from(_s.keys()).filter(i=>i!=="yaml11").map(i=>JSON.stringify(i)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${n} or define customTags array`)}if(Array.isArray(s))for(let n of s)t=t.concat(n);else typeof s=="function"&&(t=s(t.slice()));return t.map(n=>{if(typeof n!="string")return n;let i=Ps[n];if(i)return i;let r=Object.keys(Ps).map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown custom tag "${n}"; use one of ${r}`)})}var On=(s,e)=>s.keye.key?1:0,Ce=class s{constructor({compat:e,customTags:t,merge:n,resolveKnownTags:i,schema:r,sortMapEntries:o,toStringDefaults:l}){this.compat=Array.isArray(e)?Lt(e,"compat"):e?Lt(null,e):null,this.merge=!!n,this.name=typeof r=="string"&&r||"core",this.knownTags=i?Ms:{},this.tags=Lt(t,this.name),this.toStringOptions=l??null,Object.defineProperty(this,Q,{value:G}),Object.defineProperty(this,x,{value:he}),Object.defineProperty(this,re,{value:W}),this.sortMapEntries=typeof o=="function"?o:o===!0?On:null}clone(){let e=Object.create(s.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};function Bs(s,e){let t=[],n=e.directives===!0;if(e.directives!==!1&&s.directives){let a=s.directives.toString(s);a?(t.push(a),n=!0):s.directives.docStart&&(n=!0)}n&&t.push("---");let i=ct(s,e),{commentString:r}=i.options;if(s.commentBefore){t.length!==1&&t.unshift("");let a=r(s.commentBefore);t.unshift(Y(a,""))}let o=!1,l=null;if(s.contents){if(L(s.contents)){if(s.contents.spaceBefore&&n&&t.push(""),s.contents.commentBefore){let p=r(s.contents.commentBefore);t.push(Y(p,""))}i.forceBlockIndent=!!s.comment,l=s.contents.comment}let a=l?void 0:()=>o=!0,c=ae(s.contents,i,()=>l=null,a);l&&(c+=te(c,"",r(l))),(c[0]==="|"||c[0]===">")&&t[t.length-1]==="---"?t[t.length-1]=`--- ${c}`:t.push(c)}else t.push(ae(s.contents,i));if(s.directives?.docEnd)if(s.comment){let a=r(s.comment);a.includes(` +`)?(t.push("..."),t.push(Y(a,""))):t.push(`... ${a}`)}else t.push("...");else{let a=s.comment;a&&o&&(a=a.replace(/^\n+/,"")),a&&((!o||l)&&t[t.length-1]!==""&&t.push(""),t.push(Y(r(a),"")))}return t.join(` +`)+` +`}var se=class s{constructor(e,t,n){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,j,{value:tt});let i=null;typeof t=="function"||Array.isArray(t)?i=t:n===void 0&&t&&(n=t,t=void 0);let r=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,uniqueKeys:!0,version:"1.2"},n);this.options=r;let{version:o}=r;n?._directives?(this.directives=n._directives.atDocument(),this.directives.yaml.explicit&&(o=this.directives.yaml.version)):this.directives=new Z({version:o}),this.setSchema(o,n),this.contents=e===void 0?null:this.createNode(e,i,n)}clone(){let e=Object.create(s.prototype,{[j]:{value:tt}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=L(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){ve(this.contents)&&this.contents.add(e)}addIn(e,t){ve(this.contents)&&this.contents.addIn(e,t)}createAlias(e,t){if(!e.anchor){let n=Bt(this);e.anchor=!t||n.has(t)?Dt(t||"a",n):t}return new ee(e.anchor)}createNode(e,t,n){let i;if(typeof t=="function")e=t.call({"":e},"",e),i=t;else if(Array.isArray(t)){let m=w=>typeof w=="number"||w instanceof String||w instanceof Number,S=t.filter(m).map(String);S.length>0&&(t=t.concat(S)),i=t}else n===void 0&&t&&(n=t,t=void 0);let{aliasDuplicateObjects:r,anchorPrefix:o,flow:l,keepUndefined:a,onTagObj:c,tag:p}=n??{},{onAnchor:f,setAnchors:h,sourceObjects:d}=ms(this,o||"a"),b={aliasDuplicateObjects:r??!0,keepUndefined:a??!1,onAnchor:f,onTagObj:c,replacer:i,schema:this.schema,sourceObjects:d},u=oe(e,p,b);return l&&T(u)&&(u.flow=!0),h(),u}createPair(e,t,n={}){let i=this.createNode(e,null,n),r=this.createNode(t,null,n);return new C(i,r)}delete(e){return ve(this.contents)?this.contents.delete(e):!1}deleteIn(e){return Oe(e)?this.contents==null?!1:(this.contents=null,!0):ve(this.contents)?this.contents.deleteIn(e):!1}get(e,t){return T(this.contents)?this.contents.get(e,t):void 0}getIn(e,t){return Oe(e)?!t&&O(this.contents)?this.contents.value:this.contents:T(this.contents)?this.contents.getIn(e,t):void 0}has(e){return T(this.contents)?this.contents.has(e):!1}hasIn(e){return Oe(e)?this.contents!==void 0:T(this.contents)?this.contents.hasIn(e):!1}set(e,t){this.contents==null?this.contents=Ke(this.schema,[e],t):ve(this.contents)&&this.contents.set(e,t)}setIn(e,t){Oe(e)?this.contents=t:this.contents==null?this.contents=Ke(this.schema,Array.from(e),t):ve(this.contents)&&this.contents.setIn(e,t)}setSchema(e,t={}){typeof e=="number"&&(e=String(e));let n;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new Z({version:"1.1"}),n={merge:!0,resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new Z({version:e}),n={merge:!1,resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,n=null;break;default:{let i=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${i}`)}}if(t.schema instanceof Object)this.schema=t.schema;else if(n)this.schema=new Ce(Object.assign(n,t));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:t,mapAsMap:n,maxAliasCount:i,onAnchor:r,reviver:o}={}){let l={anchors:new Map,doc:this,keep:!e,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof i=="number"?i:100},a=_(this.contents,t??"",l);if(typeof r=="function")for(let{count:c,res:p}of l.anchors.values())r(p,c);return typeof o=="function"?ce(o,{"":a},"",a):a}toJSON(e,t){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:t})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let t=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${t}`)}return Bs(this,e)}};function ve(s){if(T(s))return!0;throw new Error("Expected a YAML collection as document contents")}var $e=class extends Error{constructor(e,t,n,i){super(),this.name=e,this.code=n,this.message=i,this.pos=t}},q=class extends $e{constructor(e,t,n){super("YAMLParseError",e,t,n)}},_e=class extends $e{constructor(e,t,n){super("YAMLWarning",e,t,n)}},Ge=(s,e)=>t=>{if(t.pos[0]===-1)return;t.linePos=t.pos.map(l=>e.linePos(l));let{line:n,col:i}=t.linePos[0];t.message+=` at line ${n}, column ${i}`;let r=i-1,o=s.substring(e.lineStarts[n-1],e.lineStarts[n]).replace(/[\n\r]+$/,"");if(r>=60&&o.length>80){let l=Math.min(r-39,o.length-79);o="\u2026"+o.substring(l),r-=l-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),n>1&&/^ *$/.test(o.substring(0,r))){let l=s.substring(e.lineStarts[n-2],e.lineStarts[n-1]);l.length>80&&(l=l.substring(0,79)+`\u2026 +`),o=l+o}if(/[^ ]/.test(o)){let l=1,a=t.linePos[1];a&&a.line===n&&a.col>i&&(l=Math.max(1,Math.min(a.col-i,80-r)));let c=" ".repeat(r)+"^".repeat(l);t.message+=`: + +${o} +${c} +`}};function ne(s,{flow:e,indicator:t,next:n,offset:i,onError:r,startOnNewline:o}){let l=!1,a=o,c=o,p="",f="",h=!1,d=!1,b=!1,u=null,m=null,S=null,w=null,k=null;for(let g of s)switch(b&&(g.type!=="space"&&g.type!=="newline"&&g.type!=="comma"&&r(g.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),b=!1),g.type){case"space":!e&&a&&t!=="doc-start"&&g.source[0]===" "&&r(g,"TAB_AS_INDENT","Tabs are not allowed as indentation"),c=!0;break;case"comment":{c||r(g,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let I=g.source.substring(1)||" ";p?p+=f+I:p=I,f="",a=!1;break}case"newline":a?p?p+=g.source:l=!0:f+=g.source,a=!0,h=!0,(u||m)&&(d=!0),c=!0;break;case"anchor":u&&r(g,"MULTIPLE_ANCHORS","A node can have at most one anchor"),g.source.endsWith(":")&&r(g.offset+g.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),u=g,k===null&&(k=g.offset),a=!1,c=!1,b=!0;break;case"tag":{m&&r(g,"MULTIPLE_TAGS","A node can have at most one tag"),m=g,k===null&&(k=g.offset),a=!1,c=!1,b=!0;break}case t:(u||m)&&r(g,"BAD_PROP_ORDER",`Anchors and tags must be after the ${g.source} indicator`),w&&r(g,"UNEXPECTED_TOKEN",`Unexpected ${g.source} in ${e??"collection"}`),w=g,a=!1,c=!1;break;case"comma":if(e){S&&r(g,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),S=g,a=!1,c=!1;break}default:r(g,"UNEXPECTED_TOKEN",`Unexpected ${g.type} token`),a=!1,c=!1}let N=s[s.length-1],E=N?N.offset+N.source.length:i;return b&&n&&n.type!=="space"&&n.type!=="newline"&&n.type!=="comma"&&(n.type!=="scalar"||n.source!=="")&&r(n.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),{comma:S,found:w,spaceBefore:l,comment:p,hasNewline:h,hasNewlineAfterProp:d,anchor:u,tag:m,end:E,start:k??E}}function pe(s){if(!s)return null;switch(s.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(s.source.includes(` +`))return!0;if(s.end){for(let e of s.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of s.items){for(let t of e.start)if(t.type==="newline")return!0;if(e.sep){for(let t of e.sep)if(t.type==="newline")return!0}if(pe(e.key)||pe(e.value))return!0}return!1;default:return!0}}function We(s,e,t){if(e?.type==="flow-collection"){let n=e.end[0];n.indent===s&&(n.source==="]"||n.source==="}")&&pe(e)&&t(n,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function Tt(s,e,t){let{uniqueKeys:n}=s.options;if(n===!1)return!1;let i=typeof n=="function"?n:(r,o)=>r===o||O(r)&&O(o)&&r.value===o.value&&!(r.value==="<<"&&s.schema.merge);return e.some(r=>i(r.key,t))}var Ds="All mapping items must start at the same column";function js({composeNode:s,composeEmptyNode:e},t,n,i,r){let o=r?.nodeClass??$,l=new o(t.schema);t.atRoot&&(t.atRoot=!1);let a=n.offset,c=null;for(let p of n.items){let{start:f,key:h,sep:d,value:b}=p,u=ne(f,{indicator:"explicit-key-ind",next:h??d?.[0],offset:a,onError:i,startOnNewline:!0}),m=!u.found;if(m){if(h&&(h.type==="block-seq"?i(a,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in h&&h.indent!==n.indent&&i(a,"BAD_INDENT",Ds)),!u.anchor&&!u.tag&&!d){c=u.end,u.comment&&(l.comment?l.comment+=` +`+u.comment:l.comment=u.comment);continue}(u.hasNewlineAfterProp||pe(h))&&i(h??f[f.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else u.found?.indent!==n.indent&&i(a,"BAD_INDENT",Ds);let S=u.end,w=h?s(t,h,u,i):e(t,S,f,null,u,i);t.schema.compat&&We(n.indent,h,i),Tt(t,l.items,w)&&i(S,"DUPLICATE_KEY","Map keys must be unique");let k=ne(d??[],{indicator:"map-value-ind",next:b,offset:w.range[2],onError:i,startOnNewline:!h||h.type==="block-scalar"});if(a=k.end,k.found){m&&(b?.type==="block-map"&&!k.hasNewline&&i(a,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),t.options.strict&&u.starts&&(s.type==="block-map"||s.type==="block-seq");function qs({composeNode:s,composeEmptyNode:e},t,n,i,r){let o=n.start.source==="{",l=o?"flow map":"flow sequence",a=r?.nodeClass??(o?$:M),c=new a(t.schema);c.flow=!0;let p=t.atRoot;p&&(t.atRoot=!1);let f=n.offset+n.start.source.length;for(let m=0;m0){let m=ie(b,u,t.options.strict,i);m.comment&&(c.comment?c.comment+=` +`+m.comment:c.comment=m.comment),c.range=[n.offset,u,m.offset]}else c.range=[n.offset,u,u];return c}function Xt(s,e,t,n,i,r){let o=t.type==="block-map"?js(s,e,t,n,r):t.type==="block-seq"?Ks(s,e,t,n,r):qs(s,e,t,n,r),l=o.constructor;return i==="!"||i===l.tagName?(o.tag=l.tagName,o):(i&&(o.tag=i),o)}function xs(s,e,t,n,i){let r=n?e.directives.tagName(n.source,f=>i(n,"TAG_RESOLVE_FAILED",f)):null,o=t.type==="block-map"?"map":t.type==="block-seq"?"seq":t.start.source==="{"?"map":"seq";if(!n||!r||r==="!"||r===$.tagName&&o==="map"||r===M.tagName&&o==="seq"||!o)return Xt(s,e,t,i,r);let l=e.schema.tags.find(f=>f.tag===r&&f.collection===o);if(!l){let f=e.schema.knownTags[r];if(f&&f.collection===o)e.schema.tags.push(Object.assign({},f,{default:!1})),l=f;else return f?.collection?i(n,"BAD_COLLECTION_TYPE",`${f.tag} used for ${o} collection, but expects ${f.collection}`,!0):i(n,"TAG_RESOLVE_FAILED",`Unresolved tag: ${r}`,!0),Xt(s,e,t,i,r)}let a=Xt(s,e,t,i,r,l),c=l.resolve?.(a,f=>i(n,"TAG_RESOLVE_FAILED",f),e.options)??a,p=L(c)?c:new y(c);return p.range=a.range,p.tag=r,l?.format&&(p.format=l.format),p}function It(s,e,t){let n=s.offset,i=An(s,e,t);if(!i)return{value:"",type:null,comment:"",range:[n,n,n]};let r=i.mode===">"?y.BLOCK_FOLDED:y.BLOCK_LITERAL,o=s.source?En(s.source):[],l=o.length;for(let u=o.length-1;u>=0;--u){let m=o[u][1];if(m===""||m==="\r")l=u;else break}if(l===0){let u=i.chomp==="+"&&o.length>0?` +`.repeat(Math.max(1,o.length-1)):"",m=n+i.length;return s.source&&(m+=s.source.length),{value:u,type:r,comment:i.comment,range:[n,m,m]}}let a=s.indent+i.indent,c=s.offset+i.length,p=0;for(let u=0;ua&&(a=m.length);else{m.length=l;--u)o[u][0].length>a&&(l=u+1);let f="",h="",d=!1;for(let u=0;ua||S[0]===" "?(h===" "?h=` +`:!d&&h===` +`&&(h=` + +`),f+=h+m.slice(a)+S,h=` +`,d=!0):S===""?h===` +`?f+=` +`:h=` +`:(f+=h+S,h=" ",d=!1)}switch(i.chomp){case"-":break;case"+":for(let u=l;ut(n+h,d,b);switch(i){case"scalar":l=y.PLAIN,a=Ln(r,c);break;case"single-quoted-scalar":l=y.QUOTE_SINGLE,a=Tn(r,c);break;case"double-quoted-scalar":l=y.QUOTE_DOUBLE,a=In(r,c);break;default:return t(s,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${i}`),{value:"",type:null,comment:"",range:[n,n+r.length,n+r.length]}}let p=n+r.length,f=ie(o,p,e,t);return{value:a,type:l,comment:f.comment,range:[n,p,f.offset]}}function Ln(s,e){let t="";switch(s[0]){case" ":t="a tab character";break;case",":t="flow indicator character ,";break;case"%":t="directive indicator character %";break;case"|":case">":{t=`block scalar indicator ${s[0]}`;break}case"@":case"`":{t=`reserved character ${s[0]}`;break}}return t&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${t}`),Fs(s)}function Tn(s,e){return(s[s.length-1]!=="'"||s.length===1)&&e(s.length,"MISSING_CHAR","Missing closing 'quote"),Fs(s.slice(1,-1)).replace(/''/g,"'")}function Fs(s){let e,t;try{e=new RegExp(`(.*?)(?r?s.slice(r,n+1):i)}else t+=i}return(s[s.length-1]!=='"'||s.length===1)&&e(s.length,"MISSING_CHAR",'Missing closing "quote'),t}function Cn(s,e){let t="",n=s[e+1];for(;(n===" "||n===" "||n===` +`||n==="\r")&&!(n==="\r"&&s[e+2]!==` +`);)n===` +`&&(t+=` +`),e+=1,n=s[e+1];return t||(t=" "),{fold:t,offset:e}}var vn={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` +`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function $n(s,e,t,n){let i=s.substr(e,t),o=i.length===t&&/^[0-9a-fA-F]+$/.test(i)?parseInt(i,16):NaN;if(isNaN(o)){let l=s.substr(e-2,t+2);return n(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${l}`),l}return String.fromCodePoint(o)}function zt(s,e,t,n){let{value:i,type:r,comment:o,range:l}=e.type==="block-scalar"?It(e,s.options.strict,n):Ct(e,s.options.strict,n),a=t?s.directives.tagName(t.source,f=>n(t,"TAG_RESOLVE_FAILED",f)):null,c=t&&a?_n(s.schema,i,a,t,n):e.type==="scalar"?Pn(s,i,e,n):s.schema[x],p;try{let f=c.resolve(i,h=>n(t??e,"TAG_RESOLVE_FAILED",h),s.options);p=O(f)?f:new y(f)}catch(f){let h=f instanceof Error?f.message:String(f);n(t??e,"TAG_RESOLVE_FAILED",h),p=new y(i)}return p.range=l,p.source=i,r&&(p.type=r),a&&(p.tag=a),c.format&&(p.format=c.format),o&&(p.comment=o),p}function _n(s,e,t,n,i){if(t==="!")return s[x];let r=[];for(let l of s.tags)if(!l.collection&&l.tag===t)if(l.default&&l.test)r.push(l);else return l;for(let l of r)if(l.test?.test(e))return l;let o=s.knownTags[t];return o&&!o.collection?(s.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(i(n,"TAG_RESOLVE_FAILED",`Unresolved tag: ${t}`,t!=="tag:yaml.org,2002:str"),s[x])}function Pn({directives:s,schema:e},t,n,i){let r=e.tags.find(o=>o.default&&o.test?.test(t))||e[x];if(e.compat){let o=e.compat.find(l=>l.default&&l.test?.test(t))??e[x];if(r.tag!==o.tag){let l=s.tagString(r.tag),a=s.tagString(o.tag),c=`Value may be parsed as either ${l} or ${a}`;i(n,"TAG_RESOLVE_FAILED",c,!0)}}return r}function Rs(s,e,t){if(e){t===null&&(t=e.length);for(let n=t-1;n>=0;--n){let i=e[n];switch(i.type){case"space":case"comment":case"newline":s-=i.source.length;continue}for(i=e[++n];i?.type==="space";)s+=i.source.length,i=e[++n];break}}return s}var Mn={composeNode:Zt,composeEmptyNode:vt};function Zt(s,e,t,n){let{spaceBefore:i,comment:r,anchor:o,tag:l}=t,a,c=!0;switch(e.type){case"alias":a=Bn(s,e,n),(o||l)&&n(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":a=zt(s,e,l,n),o&&(a.anchor=o.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":a=xs(Mn,s,e,l,n),o&&(a.anchor=o.source.substring(1));break;default:{let p=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;n(e,"UNEXPECTED_TOKEN",p),a=vt(s,e.offset,void 0,null,t,n),c=!1}}return o&&a.anchor===""&&n(o,"BAD_ALIAS","Anchor cannot be an empty string"),i&&(a.spaceBefore=!0),r&&(e.type==="scalar"&&e.source===""?a.comment=r:a.commentBefore=r),s.options.keepSourceTokens&&c&&(a.srcToken=e),a}function vt(s,e,t,n,{spaceBefore:i,comment:r,anchor:o,tag:l,end:a},c){let p={type:"scalar",offset:Rs(e,t,n),indent:-1,source:""},f=zt(s,p,l,c);return o&&(f.anchor=o.source.substring(1),f.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),i&&(f.spaceBefore=!0),r&&(f.comment=r,f.range[2]=a),f}function Bn({options:s},{offset:e,source:t,end:n},i){let r=new ee(t.substring(1));r.source===""&&i(e,"BAD_ALIAS","Alias cannot be an empty string"),r.source.endsWith(":")&&i(e+t.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=e+t.length,l=ie(n,o,s.strict,i);return r.range=[e,o,l.offset],l.comment&&(r.comment=l.comment),r}function Us(s,e,{offset:t,start:n,value:i,end:r},o){let l=Object.assign({_directives:e},s),a=new se(void 0,l),c={atRoot:!0,directives:a.directives,options:a.options,schema:a.schema},p=ne(n,{indicator:"doc-start",next:i??r?.[0],offset:t,onError:o,startOnNewline:!0});p.found&&(a.directives.docStart=!0,i&&(i.type==="block-map"||i.type==="block-seq")&&!p.hasNewline&&o(p.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),a.contents=i?Zt(c,i,p,o):vt(c,p.end,n,null,p,o);let f=a.contents.range[2],h=ie(r,f,!1,o);return h.comment&&(a.comment=h.comment),a.range=[t,f,h.offset],a}function He(s){if(typeof s=="number")return[s,s+1];if(Array.isArray(s))return s.length===2?s:[s[0],s[1]];let{offset:e,source:t}=s;return[e,e+(typeof t=="string"?t.length:1)]}function Vs(s){let e="",t=!1,n=!1;for(let i=0;i{let o=He(t);r?this.warnings.push(new _e(o,n,i)):this.errors.push(new q(o,n,i))},this.directives=new Z({version:e.version||"1.2"}),this.options=e}decorate(e,t){let{comment:n,afterEmptyLine:i}=Vs(this.prelude);if(n){let r=e.contents;if(t)e.comment=e.comment?`${e.comment} +${n}`:n;else if(i||e.directives.docStart||!r)e.commentBefore=n;else if(T(r)&&!r.flow&&r.items.length>0){let o=r.items[0];A(o)&&(o=o.key);let l=o.commentBefore;o.commentBefore=l?`${n} +${l}`:n}else{let o=r.commentBefore;r.commentBefore=o?`${n} +${o}`:n}}t?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Vs(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,t=!1,n=-1){for(let i of e)yield*this.next(i);yield*this.end(t,n)}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(t,n,i)=>{let r=He(e);r[0]+=t,this.onError(r,"BAD_DIRECTIVE",n,i)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let t=Us(this.options,this.directives,e,this.onError);this.atDirectives&&!t.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(t,!1),this.doc&&(yield this.doc),this.doc=t,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let t=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,n=new q(He(e),"UNEXPECTED_TOKEN",t);this.atDirectives||!this.doc?this.errors.push(n):this.doc.errors.push(n);break}case"doc-end":{if(!this.doc){let n="Unexpected doc-end without preceding document";this.errors.push(new q(He(e),"UNEXPECTED_TOKEN",n));break}this.doc.directives.docEnd=!0;let t=ie(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),t.comment){let n=this.doc.comment;this.doc.comment=n?`${n} +${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.push(new q(He(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,t=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let n=Object.assign({_directives:this.directives},this.options),i=new se(void 0,n);this.atDirectives&&this.onError(t,"MISSING_CHAR","Missing directives-end indicator line"),i.range=[0,t,t],this.decorate(i,!1),yield i}}};var ns={};as(ns,{BOM:()=>Xe,DOCUMENT:()=>ze,FLOW_END:()=>Ze,SCALAR:()=>Pe,createScalarToken:()=>Js,isCollection:()=>Kn,isScalar:()=>qn,prettyToken:()=>xn,resolveAsScalar:()=>Ys,setScalarValue:()=>Qs,stringify:()=>Ws,tokenType:()=>ss,visit:()=>me});function Ys(s,e=!0,t){if(s){let n=(i,r,o)=>{let l=typeof i=="number"?i:Array.isArray(i)?i[0]:i.offset;if(t)t(l,r,o);else throw new q([l,l+1],r,o)};switch(s.type){case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return Ct(s,e,n);case"block-scalar":return It(s,e,n)}}return null}function Js(s,e){let{implicitKey:t=!1,indent:n,inFlow:i=!1,offset:r=-1,type:o="PLAIN"}=e,l=le({type:o,value:s},{implicitKey:t,indent:n>0?" ".repeat(n):"",inFlow:i,options:{blockQuote:!0,lineWidth:-1}}),a=e.end??[{type:"newline",offset:-1,indent:n,source:` +`}];switch(l[0]){case"|":case">":{let c=l.indexOf(` +`),p=l.substring(0,c),f=l.substring(c+1)+` +`,h=[{type:"block-scalar-header",offset:r,indent:n,source:p}];return Gs(h,a)||h.push({type:"newline",offset:-1,indent:n,source:` +`}),{type:"block-scalar",offset:r,indent:n,props:h,source:f}}case'"':return{type:"double-quoted-scalar",offset:r,indent:n,source:l,end:a};case"'":return{type:"single-quoted-scalar",offset:r,indent:n,source:l,end:a};default:return{type:"scalar",offset:r,indent:n,source:l,end:a}}}function Qs(s,e,t={}){let{afterKey:n=!1,implicitKey:i=!1,inFlow:r=!1,type:o}=t,l="indent"in s?s.indent:null;if(n&&typeof l=="number"&&(l+=2),!o)switch(s.type){case"single-quoted-scalar":o="QUOTE_SINGLE";break;case"double-quoted-scalar":o="QUOTE_DOUBLE";break;case"block-scalar":{let c=s.props[0];if(c.type!=="block-scalar-header")throw new Error("Invalid block scalar header");o=c.source[0]===">"?"BLOCK_FOLDED":"BLOCK_LITERAL";break}default:o="PLAIN"}let a=le({type:o,value:e},{implicitKey:i||l===null,indent:l!==null&&l>0?" ".repeat(l):"",inFlow:r,options:{blockQuote:!0,lineWidth:-1}});switch(a[0]){case"|":case">":Dn(s,a);break;case'"':es(s,a,"double-quoted-scalar");break;case"'":es(s,a,"single-quoted-scalar");break;default:es(s,a,"scalar")}}function Dn(s,e){let t=e.indexOf(` +`),n=e.substring(0,t),i=e.substring(t+1)+` +`;if(s.type==="block-scalar"){let r=s.props[0];if(r.type!=="block-scalar-header")throw new Error("Invalid block scalar header");r.source=n,s.source=i}else{let{offset:r}=s,o="indent"in s?s.indent:-1,l=[{type:"block-scalar-header",offset:r,indent:o,source:n}];Gs(l,"end"in s?s.end:void 0)||l.push({type:"newline",offset:-1,indent:o,source:` +`});for(let a of Object.keys(s))a!=="type"&&a!=="offset"&&delete s[a];Object.assign(s,{type:"block-scalar",indent:o,props:l,source:i})}}function Gs(s,e){if(e)for(let t of e)switch(t.type){case"space":case"comment":s.push(t);break;case"newline":return s.push(t),!0}return!1}function es(s,e,t){switch(s.type){case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":s.type=t,s.source=e;break;case"block-scalar":{let n=s.props.slice(1),i=e.length;s.props[0].type==="block-scalar-header"&&(i-=s.props[0].source.length);for(let r of n)r.offset+=i;delete s.props,Object.assign(s,{type:t,source:e,end:n});break}case"block-map":case"block-seq":{let i={type:"newline",offset:s.offset+e.length,indent:s.indent,source:` +`};delete s.items,Object.assign(s,{type:t,source:e,end:[i]});break}default:{let n="indent"in s?s.indent:-1,i="end"in s&&Array.isArray(s.end)?s.end.filter(r=>r.type==="space"||r.type==="comment"||r.type==="newline"):[];for(let r of Object.keys(s))r!=="type"&&r!=="offset"&&delete s[r];Object.assign(s,{type:t,indent:n,source:e,end:i})}}}var Ws=s=>"type"in s?_t(s):$t(s);function _t(s){switch(s.type){case"block-scalar":{let e="";for(let t of s.props)e+=_t(t);return e+s.source}case"block-map":case"block-seq":{let e="";for(let t of s.items)e+=$t(t);return e}case"flow-collection":{let e=s.start.source;for(let t of s.items)e+=$t(t);for(let t of s.end)e+=t.source;return e}case"document":{let e=$t(s);if(s.end)for(let t of s.end)e+=t.source;return e}default:{let e=s.source;if("end"in s&&s.end)for(let t of s.end)e+=t.source;return e}}}function $t({start:s,key:e,sep:t,value:n}){let i="";for(let r of s)i+=r.source;if(e&&(i+=_t(e)),t)for(let r of t)i+=r.source;return n&&(i+=_t(n)),i}var ts=Symbol("break visit"),jn=Symbol("skip children"),Hs=Symbol("remove item");function me(s,e){"type"in s&&s.type==="document"&&(s={start:s.start,value:s.value}),Xs(Object.freeze([]),s,e)}me.BREAK=ts;me.SKIP=jn;me.REMOVE=Hs;me.itemAtPath=(s,e)=>{let t=s;for(let[n,i]of e){let r=t?.[n];if(r&&"items"in r)t=r.items[i];else return}return t};me.parentCollection=(s,e)=>{let t=me.itemAtPath(s,e.slice(0,-1)),n=e[e.length-1][0],i=t?.[n];if(i&&"items"in i)return i;throw new Error("Parent collection not found")};function Xs(s,e,t){let n=t(e,s);if(typeof n=="symbol")return n;for(let i of["key","value"]){let r=e[i];if(r&&"items"in r){for(let o=0;o!!s&&"items"in s,qn=s=>!!s&&(s.type==="scalar"||s.type==="single-quoted-scalar"||s.type==="double-quoted-scalar"||s.type==="block-scalar");function xn(s){switch(s){case Xe:return"";case ze:return"";case Ze:return"";case Pe:return"";default:return JSON.stringify(s)}}function ss(s){switch(s){case Xe:return"byte-order-mark";case ze:return"doc-mode";case Ze:return"flow-error-end";case Pe:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case` +`:case`\r +`:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(s[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function J(s){switch(s){case void 0:case" ":case` +`:case"\r":case" ":return!0;default:return!1}}var zs="0123456789ABCDEFabcdef".split(""),Fn="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()".split(""),is=",[]{}".split(""),Rn=` ,[]{} +\r `.split(""),rs=s=>!s||Rn.includes(s),Me=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,t=!1){e&&(this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null),this.atEnd=!t;let n=this.next??"stream";for(;n&&(t||this.hasChars(1));)n=yield*this.parseNext(n)}atLineEnd(){let e=this.pos,t=this.buffer[e];for(;t===" "||t===" ";)t=this.buffer[++e];return!t||t==="#"||t===` +`?!0:t==="\r"?this.buffer[e+1]===` +`:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let t=this.buffer[e];if(this.indentNext>0){let n=0;for(;t===" ";)t=this.buffer[++n+e];if(t==="\r"){let i=this.buffer[n+e+1];if(i===` +`||!i&&!this.atEnd)return e+n+1}return t===` +`||n>=this.indentNext||!t&&!this.atEnd?e+n:-1}if(t==="-"||t==="."){let n=this.buffer.substr(e,3);if((n==="---"||n==="...")&&J(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!J(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[e,t]=this.peek(2);if(!t&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&J(t)){let n=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=n,yield*this.parseBlockStart()}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let e=this.getLine();if(e===null)return this.setNext("doc");let t=yield*this.pushIndicators();switch(e[t]){case"#":yield*this.pushCount(e.length-t);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(rs),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return t+=yield*this.parseBlockScalarHeader(),t+=yield*this.pushSpaces(!0),yield*this.pushCount(e.length-t),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let e,t,n=-1;do e=yield*this.pushNewline(),e>0?(t=yield*this.pushSpaces(!1),this.indentValue=n=t):t=0,t+=yield*this.pushSpaces(!0);while(e+t>0);let i=this.getLine();if(i===null)return this.setNext("flow");if((n!==-1&&n"0"&&t<="9")this.blockScalarIndent=Number(t)-1;else if(t!=="-")break}return yield*this.pushUntil(t=>J(t)||t==="#")}*parseBlockScalar(){let e=this.pos-1,t=0,n;e:for(let i=this.pos;n=this.buffer[i];++i)switch(n){case" ":t+=1;break;case` +`:e=i,t=0;break;case"\r":{let r=this.buffer[i+1];if(!r&&!this.atEnd)return this.setNext("block-scalar");if(r===` +`)break}default:break e}if(!n&&!this.atEnd)return this.setNext("block-scalar");if(t>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=t:this.indentNext+=this.blockScalarIndent;do{let i=this.continueScalar(e+1);if(i===-1)break;e=this.buffer.indexOf(` +`,i)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}if(!this.blockScalarKeep)do{let i=e-1,r=this.buffer[i];r==="\r"&&(r=this.buffer[--i]);let o=i;for(;r===" "||r===" ";)r=this.buffer[--i];if(r===` +`&&i>=this.pos&&i+1+t>o)e=i;else break}while(!0);return yield Pe,yield*this.pushToIndex(e+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let e=this.flowLevel>0,t=this.pos-1,n=this.pos-1,i;for(;i=this.buffer[++n];)if(i===":"){let r=this.buffer[n+1];if(J(r)||e&&r===",")break;t=n}else if(J(i)){let r=this.buffer[n+1];if(i==="\r"&&(r===` +`?(n+=1,i=` +`,r=this.buffer[n+1]):t=n),r==="#"||e&&is.includes(r))break;if(i===` +`){let o=this.continueScalar(n+1);if(o===-1)break;n=Math.max(n,o-2)}}else{if(e&&is.includes(i))break;t=n}return!i&&!this.atEnd?this.setNext("plain-scalar"):(yield Pe,yield*this.pushToIndex(t+1,!0),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,t){let n=this.buffer.slice(this.pos,e);return n?(yield n,this.pos+=n.length,n.length):(t&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*this.pushTag())+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators());case"&":return(yield*this.pushUntil(rs))+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators());case"-":case"?":case":":{let e=this.flowLevel>0,t=this.charAt(1);if(J(t)||e&&is.includes(t))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*this.pushCount(1))+(yield*this.pushSpaces(!0))+(yield*this.pushIndicators())}}return 0}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,t=this.buffer[e];for(;!J(t)&&t!==">";)t=this.buffer[++e];return yield*this.pushToIndex(t===">"?e+1:e,!1)}else{let e=this.pos+1,t=this.buffer[e];for(;t;)if(Fn.includes(t))t=this.buffer[++e];else if(t==="%"&&zs.includes(this.buffer[e+1])&&zs.includes(this.buffer[e+2]))t=this.buffer[e+=3];else break;return yield*this.pushToIndex(e,!1)}}*pushNewline(){let e=this.buffer[this.pos];return e===` +`?yield*this.pushCount(1):e==="\r"&&this.charAt(1)===` +`?yield*this.pushCount(2):0}*pushSpaces(e){let t=this.pos-1,n;do n=this.buffer[++t];while(n===" "||e&&n===" ");let i=t-this.pos;return i>0&&(yield this.buffer.substr(this.pos,i),this.pos=t),i}*pushUntil(e){let t=this.pos,n=this.buffer[t];for(;!e(n);)n=this.buffer[++t];return yield*this.pushToIndex(t,!1)}};var Be=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let t=0,n=this.lineStarts.length;for(;t>1;this.lineStarts[r]=0;)switch(s[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;s[++e]?.type==="space";);return s.splice(e,s.length)}function en(s){if(s.start.type==="flow-seq-start")for(let e of s.items)e.sep&&!e.value&&!H(e.start,"explicit-key-ind")&&!H(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,tn(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}var we=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new Me,this.onNewLine=e}*parse(e,t=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let n of this.lexer.lex(e,t))yield*this.next(n);t||(yield*this.end())}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=e.length;return}let t=ss(e);if(t)if(t==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=t,yield*this.step(),t){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case"space":this.atNewLine&&e[0]===" "&&(this.indent+=e.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=e.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=e.length}else{let n=`Not a YAML token: ${e}`;yield*this.pop({type:"error",offset:this.offset,message:n,source:e}),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&(!e||e.type!=="doc-end")){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*this.stream();switch(e.type){case"document":return yield*this.document(e);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(e);case"block-scalar":return yield*this.blockScalar(e);case"block-map":return yield*this.blockMap(e);case"block-seq":return yield*this.blockSequence(e);case"flow-collection":return yield*this.flowCollection(e);case"doc-end":return yield*this.documentEnd(e)}yield*this.pop()}peek(e){return this.stack[this.stack.length-e]}*pop(e){let t=e??this.stack.pop();if(!t)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield t;else{let n=this.peek(1);switch(t.type==="block-scalar"?t.indent="indent"in n?n.indent:0:t.type==="flow-collection"&&n.type==="document"&&(t.indent=0),t.type==="flow-collection"&&en(t),n.type){case"document":n.value=t;break;case"block-scalar":n.props.push(t);break;case"block-map":{let i=n.items[n.items.length-1];if(i.value){n.items.push({start:[],key:t,sep:[]}),this.onKeyLine=!0;return}else if(i.sep)i.value=t;else{Object.assign(i,{key:t,sep:[]}),this.onKeyLine=!H(i.start,"explicit-key-ind");return}break}case"block-seq":{let i=n.items[n.items.length-1];i.value?n.items.push({start:[],value:t}):i.value=t;break}case"flow-collection":{let i=n.items[n.items.length-1];!i||i.value?n.items.push({start:[],key:t,sep:[]}):i.sep?i.value=t:Object.assign(i,{key:t,sep:[]});return}default:yield*this.pop(),yield*this.pop(t)}if((n.type==="document"||n.type==="block-map"||n.type==="block-seq")&&(t.type==="block-map"||t.type==="block-seq")){let i=t.items[t.items.length-1];i&&!i.sep&&!i.value&&i.start.length>0&&Zs(i.start)===-1&&(t.indent===0||i.start.every(r=>r.type!=="comment"||r.indent=e.indent){let n=!this.onKeyLine&&this.indent===e.indent&&t.sep&&this.type!=="seq-item-ind",i=[];if(n&&t.sep&&!t.value){let r=[];for(let o=0;oe.indent&&(r.length=0);break;default:r.length=0}}r.length>=2&&(i=t.sep.splice(r[1]))}switch(this.type){case"anchor":case"tag":n||t.value?(i.push(this.sourceToken),e.items.push({start:i}),this.onKeyLine=!0):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case"explicit-key-ind":!t.sep&&!H(t.start,"explicit-key-ind")?t.start.push(this.sourceToken):n||t.value?(i.push(this.sourceToken),e.items.push({start:i})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]}),this.onKeyLine=!0;return;case"map-value-ind":if(H(t.start,"explicit-key-ind"))if(t.sep)if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(H(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(tn(t.key)&&!H(t.sep,"newline")){let r=De(t.start),o=t.key,l=t.sep;l.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:o,sep:l}]})}else i.length>0?t.sep=t.sep.concat(i,this.sourceToken):t.sep.push(this.sourceToken);else if(H(t.start,"newline"))Object.assign(t,{key:null,sep:[this.sourceToken]});else{let r=De(t.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]})}else t.sep?t.value||n?e.items.push({start:i,key:null,sep:[this.sourceToken]}):H(t.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let r=this.flowScalar(this.type);n||t.value?(e.items.push({start:i,key:r,sep:[]}),this.onKeyLine=!0):t.sep?this.stack.push(r):(Object.assign(t,{key:r,sep:[]}),this.onKeyLine=!0);return}default:{let r=this.startBlockValue(e);if(r){n&&r.type!=="block-seq"&&H(t.start,"explicit-key-ind")&&e.items.push({start:i}),this.stack.push(r);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let t=e.items[e.items.length-1];switch(this.type){case"newline":if(t.value){let n="end"in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment"?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case"space":case"comment":if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){let i=e.items[e.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,t.start),i.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case"anchor":case"tag":if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;t.value||H(t.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return}if(this.indent>e.indent){let n=this.startBlockValue(e);if(n){this.stack.push(n);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let t=e.items[e.items.length-1];if(this.type==="flow-error-end"){let n;do yield*this.pop(),n=this.peek(1);while(n&&n.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!t||t.sep?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return;case"map-value-ind":!t||t.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!t||t.value?e.items.push({start:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let i=this.flowScalar(this.type);!t||t.value?e.items.push({start:[],key:i,sep:[]}):t.sep?this.stack.push(i):Object.assign(t,{key:i,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let n=this.startBlockValue(e);n?this.stack.push(n):(yield*this.pop(),yield*this.step())}else{let n=this.peek(2);if(n.type==="block-map"&&(this.type==="map-value-ind"&&n.indent===e.indent||this.type==="newline"&&!n.items[n.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&n.type!=="flow-collection"){let i=Pt(n),r=De(i);en(e);let o=e.end.splice(1,e.end.length);o.push(this.sourceToken);let l={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:r,key:e,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=l}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let t=this.source.indexOf(` +`)+1;for(;t!==0;)this.onNewLine(this.offset+t),t=this.source.indexOf(` +`,t)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let t=Pt(e),n=De(t);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n}]}}case"map-value-ind":{this.onKeyLine=!0;let t=Pt(e),n=De(t);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){return this.type!=="comment"||this.indent<=t?!1:e.every(n=>n.type==="newline"||n.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function sn(s){let e=s.prettyErrors!==!1;return{lineCounter:s.lineCounter||e&&new Be||null,prettyErrors:e}}function nn(s,e={}){let{lineCounter:t,prettyErrors:n}=sn(e),i=new we(t?.addNewLine),r=new be(e),o=Array.from(r.compose(i.parse(s)));if(n&&t)for(let l of o)l.errors.forEach(Ge(s,t)),l.warnings.forEach(Ge(s,t));return o.length>0?o:Object.assign([],{empty:!0},r.streamInfo())}function os(s,e={}){let{lineCounter:t,prettyErrors:n}=sn(e),i=new we(t?.addNewLine),r=new be(e),o=null;for(let l of r.compose(i.parse(s),!0,s.length))if(!o)o=l;else if(o.options.logLevel!=="silent"){o.errors.push(new q(l.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return n&&t&&(o.errors.forEach(Ge(s,t)),o.warnings.forEach(Ge(s,t))),o}function rn(s,e,t){let n;typeof e=="function"?n=e:t===void 0&&e&&typeof e=="object"&&(t=e);let i=os(s,t);if(!i)return null;if(i.warnings.forEach(r=>ft(i.options.logLevel,r)),i.errors.length>0){if(i.options.logLevel!=="silent")throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:n},t))}function on(s,e,t){let n=null;if(typeof e=="function"||Array.isArray(e)?n=e:t===void 0&&e&&(t=e),typeof t=="string"&&(t=t.length),typeof t=="number"){let i=Math.round(t);t=i<1?void 0:i>8?{indent:8}:{indent:i}}if(s===void 0){let{keepUndefined:i}=t??e??{};if(!i)return}return new se(s,n,t).toString(t)}var ln=ls;window.yaml=ln;})(); diff --git a/affiliated/index.rst b/affiliated/index.rst new file mode 100644 index 00000000..ffb322ba --- /dev/null +++ b/affiliated/index.rst @@ -0,0 +1,294 @@ +.. _astropy-org-affiliated: + +Affiliated Packages +=================== + +Astropy Affiliated Packages + A major part of the Astropy Project is the concept of “Astropy + affiliated packages”. An affiliated package is an + astronomy-related Python package that is not part of the astropy + core package, and is not managed by the project but is a part of + the Astropy Project community. These packages demonstrate a + commitment to Astropy’s goals of improving reuse, + interoperability, and interface standards for Python astronomy and + astrophysics packages. In many (but not all) cases, affiliated + packages also follow similar development processes and package + templates as for the core package. + + If you are a developer interested in signing up as an affiliated package, details are in the `Becoming an Affiliated Package <#affiliated-instructions>`__ section. + +Astropy Coordinated Packages + A related concept is that of “Astropy coordinated packages”. + Coordinated packages are similar to affiliated packages, but the + Astropy Project as a whole maintains them. In practice this means + the Astropy coordination committee has administrative control of a + coordinated package repository (delegated to the maintainers), and + that maintainers of these packages have `formal + roles <../team.html>`__ in the Astropy Project. The most prominent + of these coordinated packages is the Astropy core package itself. + In some cases these are packages identified by the core team as + needing development separate from the core (either they are + experimental or problem space-focused), while others started as + affiliated packages but have become so important to the ecosystem + that they grew to become coordinated. + +Astropy Infrastructure Packages + One final related category are the "Astropy infrastructure + packages". These packages are those that are necessary + infrastructure for Astropy packages - e.g. testing and + documentation machinery. While occasionally these have + astro-specific functionality, in general they are more generic + packages that are useful to packages outside of astronomy, and as + a result may have some maintainers outside the Astropy project. + But some are also Astropy coordinated packages, with maintainers + drawn from the infrastructure roles. + +Installing Affiliated and Coordinated Packages + All packages should be available on PyPI. Some are available via + conda, particularly through the conda-forge channel. That said, + affiliated packages are developed independently of the Astropy + core library. You should refer to the package's documentation + first if you encounter problems. + +.. _astropy-org-affililated-coordinated-table: + +Coordinated Packages +-------------------- + +The following table lists all current Astropy coordinated +packages. + +.. raw:: html + +

        Total number of coordinated packages:

        + +.. list-table:: + :header-rows: 0 + :stub-columns: 1 + :name: coordinated-package-table + :class: package-table forth-row-sep + + * - Loading... + - \- + - \- + - \- + * - \- + - \- + - \- + - \- + + +.. _astropy-org-affililated-registry-table: + +Affiliated Packages Registry +---------------------------- + +The following table lists all currently registered affiliated +packages. + +NOTE: The listing is currently minimal because Astropy has just +accepted `APE 22 `__ +in January 2024. We are in the midst of transitioning to the new +process in partnership with pyOpenSci, so we really appreciate +your patience. + + +.. raw:: html + +

        Total number of post-APE 22 affiliated packages:

        + + +.. list-table:: + :header-rows: 0 + :stub-columns: 1 + :name: pyos-package-table + :class: package-table third-row-sep + + * - Loading... + - \- + - \- + - \- + * - \- + - \- + - \- + - \- + +All accepted pyOpenSci packages available `here `__. + +All currently under review packages via pyOpenSci available `here `__. + +.. _astropy-org-affililated-registry-pre-ape-table: + +Affiliated Packages Registry (Pre-APE 22) +----------------------------------------- + +This section contains the listing of Astropy Affiliated Packages +that pre-dated `APE 22 `__. +This section is frozen as of March 6, 2024. + +.. raw:: html + +

        Total number of pre-APE 22 affiliated packages:

        + + +.. list-table:: + :header-rows: 0 + :stub-columns: 1 + :name: affiliated-package-table + :class: package-table forth-row-sep + + * - Loading... + - \- + - \- + - \- + * - \- + - \- + - \- + - \- + +Becoming an Affiliated Package +------------------------------ + +Astropy `uses the pyOpenSci peer review process `__ to vet affiliated packages. If you are a developer of an astronomy package and would like your package to become affiliated with the Astropy Project, you submit your package directly to pyOpenSci. +Astropy will be involved in the review, which will allow your package to become an affiliated package through that review process. You can also opt to be fast tracked through `JOSS `__ if desired. +Read the pyOpenSci author guide to learn `how to get started with submitting a package to pyOpenSci through their affiliated partner program Guidebook `__. + +In addition to pyOpenSci criteria, we also apply `Astropy-specific guidelines for reviewing affiliated packages `__. +This will give you a sense of whether your package is ready for review. +Broadly speaking, your package should: + +- Comply with general pyOpenSci review standards. Please see `Peer Review Guide for Python Open Source Authors `__ for more details. +- Be potentially useful to astronomers. This can mean useful to a specific sub-domain of astronomy, or more broadly useful to a large fraction of astronomy (or beyond, as long as it is also useful for astronomy). +- Specifically use, interface with, or provide complementary capabilities to other Astropy packages. +- Use `classes and functions from the astropy core package `__ wherever possible and appropriate, and (as much as possible) avoid duplication with other packages in the Astropy ecosystem. This facilitates re-use of code and sharing of resources. +- Be open to contributions from others. While this most straightforwardly means it follows a Github-based open development model (like the Astropy core package), alternative approaches are perfectly valid as long as they are consistent with basic principles of open source; e.g., `an OSI-approved license `__. +- Include instructions to users on how to cite your package. This is commonly done with a CITATION file. This file could include a Zenodo record (highly recommended), acknowledgement text, and/or journal article(s). Where possible, full BibTeX entries of these citations are recommended. +- Include citations to other relevant papers and software following `leading practices for citing astronomy software `__. + +In addition, you should make an effort to connect with the Astropy developer community, including developers from the core astropy package or any related affiliated packages. +If your package is determined to meet the above standards, it will be accepted and added to the affiliated package registry. +Note however that if packages become unmaintained or do not meet the standards anymore, they may be removed from the list of affiliated packages, `as per pyOpenSci policy. `__ + +Package Template +################ + +If you are considering creating a new astronomy package and would like it to be an Astropy affiliated package, you can use `the OpenAstronomy packaging guide `__ to make it much easier to meet these standards. +It reflects up-to-date Python packaging techniques to generate documentation like that used in the astropy package, a ready-to-use testing framework, and a variety of tools that streamline tasks like user configuration, caching downloaded files, or linking C-compiled extensions. More details on this template are available in the `usage instructions for the template `__. + +Additionally, it is also acceptable to use `pyOpenSci Python Package Guide `__ if you think that better suits your package needs. + +We recommend that you join the `astropy-affiliated-maintainers `__ mailing list to be kept informed of any dicussions related to affiliated packages. + + +Affiliated Package: FAQs +------------------------ + +I want my package to be Astropy Affiliated +########################################## + +Thank you for your interest! Please see `Becoming an Affiliated Package <#becoming-an-affiliated-package>`__ above. +When in doubt, feel free to contact Astropy Affiliated Editors for advice. + +I no longer have time to maintain my Astropy Affiliated package +############################################################### + +Please contact pyOpenSci, as per `Peer Review Guidelines & Policies `__. + +I want to delist my package as Astropy Affiliated +################################################# + +Please see `Requesting package removal from the pyOpenSci ecosystem `__. + +I am a new Editor +################# + +Welcome and thank you! We usually do not switch out all our Editors at the same time, so the incumbent co-Editor could help you contact pyOpenSci to add you to `pyOpenSci editorial board `__ with the understanding that we are taking the person you are replacing off that board and that your role is Astropy- and astronomy-focused. + +Your name would also be added to `Astropy Team <../team.html>`__ under the same role. + +I am a new reviewer +################### + +Welcome and thank you! Please submit the sign-up form that can be found under `Become a pyOpenSci reviewer `__. +Do not forget to check "Astropy"/"astronomy"/"astrophysics" when you see them as options. + +It is important that you understand your reviews will be done in public. There is no option to remain anonymous. + +.. raw:: html + + + + + + + diff --git a/affiliated/registry.json b/affiliated/registry.json new file mode 100644 index 00000000..72b308cb --- /dev/null +++ b/affiliated/registry.json @@ -0,0 +1,1092 @@ +{ + "packages": [ + { + "name": "regularizePSF", + "maintainer": "Marcus Hughes ", + "stable": true, + "home_url": "https://punch-mission.github.io/regularizepsf/", + "repo_url": "https://github.com/punch-mission/regularizepsf", + "pypi_name": "regularizepsf", + "description": "regularizePSF is a package for manipulating and correcting variable point spread functions in astronomical images", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2023-04-21" + } + }, + { + "name": "BayesicFitting", + "maintainer": "Do Kester and Migo Mueller ", + "stable": true, + "home_url": "https://bayesicfitting.nl/", + "repo_url": "https://github.com/dokester/BayesicFitting", + "pypi_name": "BayesicFitting", + "description": "General purpose toolbox for Bayesian fitting and evidence calculation.", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2021-11-25" + } + }, + { + "name": "PyCBC", + "maintainer": "Alexander Harvey Nitz ", + "stable": true, + "home_url": "https://pycbc.org/", + "repo_url": "https://github.com/gwastro/pycbc", + "pypi_name": "pycbc", + "description": "Core package to analyze gravitational-wave data, find signals, and study their parameters.", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2021-10-22" + } + }, + { + "name": "SpectraPy", + "maintainer": "Marco Fumana ", + "stable": true, + "home_url": "https://mcfuman.gitlab.io/SpectraPy/", + "repo_url": "https://gitlab.com/mcfuman/SpectraPy/", + "pypi_name": "", + "description": "SpectraPy is a Python3 library, which collects algorithms and methods for data reduction of astronomical spectra obtained by a through slits spectrograph. The library is designed to be spectrograph independent. Current implementation is focused on the extraction of 2D spectra.", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Functional but low activity", + "python3": "Yes", + "last-updated": "2021-10-14" + } + }, + { + "name": "statmorph", + "maintainer": "Vicente Rodriguez-Gomez ", + "stable": true, + "home_url": "https://statmorph.readthedocs.io/", + "repo_url": "https://github.com/vrodgom/statmorph", + "pypi_name": "statmorph", + "description": "A Python package for calculating non-parametric morphological diagnostics of galaxy images, as well as fitting 2D Sérsic profiles.", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2021-01-12" + } + }, + { + "name": "lenstronomy", + "maintainer": "Simon Birrer, Anowar Shajib, and Daniel Gilman ", + "stable": true, + "home_url": "https://lenstronomy.readthedocs.io", + "repo_url": "https://github.com/lenstronomy/lenstronomy", + "pypi_name": "lenstronomy", + "description": "Multi-purpose gravitational lensing and image modeling package", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2020-07-24" + } + }, + { + "name": "astropy core package", + "maintainer": "Astropy Coordination Committee", + "stable": true, + "home_url": "https://docs.astropy.org", + "repo_url": "https://github.com/astropy/astropy", + "pypi_name": "astropy", + "description": "A common core package for Astronomy in Python.", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2019-6-5" + } + }, + { + "name": "specutils", + "maintainer": "Ricky O'Steen, Adam Ginsburg, Erik Tollerud and Kelle Cruz ", + "stable": false, + "home_url": "https://specutils.readthedocs.io", + "repo_url": "https://github.com/astropy/specutils", + "pypi_name": "specutils", + "description": "Coordinated package for analysis tools and basic data types of astronomical spectra.", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2018-12-04" + } + }, + { + "name": "specreduce", + "maintainer": "Tim Pickering, Erik Tollerud, Kyle Conroy, Clare Shanahan, and Hannu Parviainen ", + "stable": false, + "home_url": "https://specreduce.readthedocs.io", + "repo_url": "https://github.com/astropy/specreduce", + "pypi_name": "specreduce", + "description": "Coordinated package to provide a data reduction toolkit for optical and infrared spectroscopy, on which applications such as pipeline processes for specific instruments can be built.", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2022-05-05" + } + }, + { + "name": "astroquery", + "maintainer": "Adam Ginsburg and Brigitta Sipőcz ", + "stable": true, + "home_url": "https://astroquery.readthedocs.io", + "repo_url": "https://github.com/astropy/astroquery", + "pypi_name": "astroquery", + "description": "Tools for querying online astronomical data sources.", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "photutils", + "maintainer": "Larry Bradley ", + "stable": false, + "home_url": "https://photutils.readthedocs.io/", + "repo_url": "https://github.com/astropy/photutils", + "pypi_name": "photutils", + "description": "Photometry and related image-processing tools.", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "asdf-astropy", + "maintainer": "Brett Graham, Nadia Dencheva, Perry Greenfield, and Stuart Mumford ", + "stable": true, + "home_url": "https://asdf-astropy.readthedocs.io/en/latest/", + "repo_url": "https://github.com/astropy/asdf-astropy", + "pypi_name": "asdf-astropy", + "description": "ASDF format support for astropy.", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2022-05-19" + } + }, + { + "name": "ginga", + "maintainer": "Eric Jeschke and Pey Lian Lim ", + "stable": true, + "home_url": "https://ejeschke.github.io/ginga", + "repo_url": "https://github.com/ejeschke/ginga", + "pypi_name": "ginga", + "description": "Ginga is a Python toolkit for building viewers for astronomical and scientific images stored in numpy data arrays and displaying them on a variety of different display platforms. The toolkit provides many features for building a viewer, including a flexible plugin framework that is provided as a customizable reference viewer for FITS images.", + "image": "https://ejeschke.github.io/ginga/images/Ginga_screenshot_MacOSX-1024x613.jpg", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "astroML", + "maintainer": "Jake Vanderplas and Brigitta Sipőcz ", + "stable": true, + "home_url": "http://www.astroml.org/", + "repo_url": "https://github.com/astroML/astroML", + "pypi_name": "astroML", + "description": "Tools for machine learning and data mining in Astronomy.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2019-10-06" + } + }, + { + "name": "PyDL", + "maintainer": "Benjamin Alan Weaver ", + "stable": false, + "home_url": "https://pydl.readthedocs.io", + "repo_url": "https://github.com/weaverba137/pydl", + "pypi_name": "pydl", + "image": null, + "description": "Python replacements for functions that are part of the IDL built-in library, or part of astronomical IDL libraries. The emphasis is on reproducing results of the astronomical library functions. Only the bare minimum of IDL built-in functions are implemented to support this.", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Needs work", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "APLpy", + "maintainer": "Thomas Robitaille and Eli Bressert ", + "stable": true, + "home_url": "https://aplpy.github.io", + "repo_url": "https://github.com/aplpy/aplpy", + "pypi_name": "APLpy", + "description": "A Python module aimed at producing publication-quality plots of astronomical imaging data in FITS format. The module uses Matplotlib, a powerful and interactive plotting package. It is capable of creating output files in several graphical formats, including EPS, PDF, PS, PNG, and SVG.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Functional but low activity", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "reproject", + "maintainer": "Thomas Robitaille, Stuart Mumford, and Sam Van Kooten ", + "stable": true, + "home_url": "https://reproject.readthedocs.io", + "repo_url": "https://github.com/astropy/reproject", + "pypi_name": "reproject", + "image": null, + "description": "Python-based astronomical image reprojection.", + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "PyVO", + "maintainer": "Adrian Damian, Brigitta Sipőcz, Manon Marchand, Markus Demleitner, and Tom Donaldson", + "stable": true, + "home_url": "https://pyvo.readthedocs.io/", + "repo_url": "https://github.com/astropy/pyvo", + "pypi_name": "pyvo", + "description": "Access to the Virtual Observatory through Python using IVOA Standards.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2019-10-06" + } + }, + { + "name": "gammapy", + "maintainer": "Axel Donath and Régis Terrier ", + "stable": false, + "home_url": "https://gammapy.org", + "repo_url": "https://github.com/gammapy/gammapy", + "pypi_name": "gammapy", + "description": "A Python package for gamma-ray astronomy", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "ccdproc", + "maintainer": "Matt Craig ", + "stable": true, + "home_url": "https://ccdproc.readthedocs.io", + "repo_url": "https://github.com/astropy/ccdproc", + "pypi_name": "ccdproc", + "description": "Package to do basic CCD data reduction.", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "sncosmo", + "maintainer": "Kyle Barbary", + "stable": true, + "home_url": "https://sncosmo.readthedocs.io", + "repo_url": "https://github.com/sncosmo/sncosmo", + "pypi_name": "sncosmo", + "image": "https://avatars1.githubusercontent.com/u/5490746?v=3&s=500", + "description": "Supernova light curve models in Python. SNCosmo synthesizes supernova spectra and photometry from SN models, and has functions for fitting and sampling SN model parameters given photometric light curve data. It includes built-in supernova models such as the SALT2, MLCS2k2, Hsiao, Nugent, PSNID, SNANA and Whalen models, a variety of built-in bandpasses and magnitude systems, and allows custom models, bandpasses, and magnitude systems to be defined.", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "Glue", + "maintainer": "Chris Beaumont and Thomas Robitaille ", + "stable": true, + "home_url": "http://www.glueviz.org", + "repo_url": "https://github.com/glue-viz/glue", + "pypi_name": "glueviz", + "image": null, + "description": "Linked data visualizations across multiple files.", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "pyregion", + "maintainer": "Jae-Joon Lee", + "stable": true, + "home_url": "https://pyregion.readthedocs.io", + "repo_url": "https://github.com/astropy/pyregion", + "pypi_name": "pyregion", + "image": null, + "description": "Python module to parse DS9 and CIAO region files.", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "imexam", + "maintainer": "Megan Sosey", + "stable": false, + "home_url": "https://imexam.readthedocs.io", + "repo_url": "https://github.com/spacetelescope/imexam", + "pypi_name": "imexam", + "description": "A package for functionality like IRAF's imexamine.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "spherical_geometry", + "maintainer": "Mihai Cara", + "stable": false, + "home_url": "https://spherical-geometry.readthedocs.io", + "repo_url": "https://github.com/spacetelescope/spherical_geometry", + "pypi_name": "spherical-geometry", + "image": null, + "description": "Python package for handling spherical polygons that represent arbitrary regions of the sky.", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Needs work", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Functional but low activity", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "gwcs", + "maintainer": "Nadia Dencheva", + "stable": false, + "home_url": "https://gwcs.readthedocs.io", + "repo_url": "https://github.com/spacetelescope/gwcs", + "pypi_name": "gwcs", + "image": null, + "description": "Package for managing the world coordinate system (WCS) of astronomical data.", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "spectral-cube", + "maintainer": "Adam Ginsburg and Eric Koch", + "stable": true, + "home_url": "https://spectral-cube.readthedocs.io", + "repo_url": "https://github.com/radio-astro-tools/spectral-cube", + "pypi_name": "spectral-cube", + "image": null, + "description": "Library for reading and analyzing astrophysical spectral data cubes.", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "astroplan", + "maintainer": "Brett Morris", + "stable": false, + "home_url": "https://astroplan.readthedocs.io/", + "repo_url": "https://github.com/astropy/astroplan", + "pypi_name": "astroplan", + "description": "An open source Python package to help astronomers plan observations.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "Astro-SCRAPPY", + "maintainer": "Curtis McCully ", + "stable": true, + "home_url": "https://github.com/astropy/astroscrappy", + "repo_url": "https://github.com/astropy/astroscrappy", + "pypi_name": "astroscrappy", + "description": "A high-performance package to detect and remove cosmic rays from astronomical images.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Needs work", + "testing": "Partial", + "devstatus": "Functional but low activity", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "naima", + "maintainer": "Victor Zabalza ", + "stable": true, + "home_url": "https://naima.readthedocs.io/", + "repo_url": "https://github.com/zblz/naima", + "pypi_name": "naima", + "description": "Derivation of non-thermal particle distributions through MCMC spectral fitting.", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "omnifit", + "maintainer": "Aleksi Suutarinen ", + "stable": true, + "home_url": "https://ricemunk.github.io/omnifit/", + "repo_url": "https://github.com/RiceMunk/omnifit", + "pypi_name": "omnifit", + "image": null, + "description": "Package for doing astronomical spectroscopy fitting of interstellar ices.", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Partial", + "testing": "Good", + "devstatus": "Functional but low activity", + "python3": "Yes", + "last-updated": "2022-01-12" + } + }, + { + "name": "gala", + "maintainer": "Adrian Price-Whelan ", + "stable": true, + "home_url": "http://gala.adrian.pw/en/latest/", + "repo_url": "https://github.com/adrn/gala", + "pypi_name": "gala", + "image": null, + "description": "A Python package for gravitational and galactic dynamics. gala contains functionality for representing gravitational potential models, numerically integrating orbits, and non-linear dynamics. gala also relies heavily on Astropy's unit and coordinates subpackages. (Note: this was previously listed on pypi as 'astro-gala', and older versions can still be installed with that name)", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "galpy", + "maintainer": "Jo Bovy", + "stable": true, + "home_url": "https://galpy.readthedocs.io/en/latest/", + "repo_url": "https://github.com/jobovy/galpy", + "pypi_name": "galpy", + "image": null, + "description": "A Python 2 and 3 package for galactic dynamics.", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "HENDRICS", + "maintainer": "Matteo Bachetti ", + "stable": true, + "repo_url": "https://github.com/StingraySoftware/HENDRICS", + "home_url": "https://hendrics.readthedocs.io", + "pypi_name": "hendrics", + "description": "Spectral-timing analysis of X-ray data from the command line (formerly known as MaLTPyNT).", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "Halotools", + "maintainer": "Andrew Hearin, Nick van Alfen ", + "stable": true, + "home_url": "https://halotools.readthedocs.io", + "repo_url": "https://github.com/astropy/halotools", + "pypi_name": "halotools", + "description": "Generate Monte Carlo realizations of mock galaxy populations using cosmological simulations.", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "cluster-lensing", + "maintainer": "Jes Ford", + "stable": false, + "repo_url": "https://github.com/jesford/cluster-lensing", + "home_url": "https://jesford.github.io/cluster-lensing", + "pypi_name": "cluster-lensing", + "description": "Galaxy cluster properties and NFW profiles (with miscentering option).", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "marxs", + "maintainer": "Hans Moritz G\u00fcnther (hamogu)", + "stable": true, + "repo_url": "https://github.com/Chandra-MARX/marxs", + "home_url": "https://marxs.readthedocs.io/", + "pypi_name": "marxs", + "description": "Multi-Architecture-Raytrace-Xraymission-Simulator (MARXS) is a toolsuite to ray-trace X-ray observatories. It is primarily aimed at astronomical X-ray satellites and sounding rocket payloads, but can be used to ray-trace experiments in the laboratory as well.", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "pyspeckit", + "maintainer": "Adam Ginsburg ", + "stable": true, + "home_url": "https://pyspeckit.readthedocs.io", + "repo_url": "https://github.com/pyspeckit/pyspeckit", + "pypi_name": "pyspeckit", + "description": "A toolkit for spectroscopic input/output, plotting, fitting, and manipulation.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "linetools", + "maintainer": "J. Xavier Prochaska, Nicolas Tejos, and Neil Crighton", + "stable": true, + "home_url": "https://linetools.readthedocs.io", + "repo_url": "https://github.com/linetools/linetools", + "pypi_name": "linetools", + "description": "Package for the analysis of 1-D spectra for astronomy.", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "poliastro", + "maintainer": "Juan Luis Cano Rodr\u00edguez", + "stable": false, + "repo_url": "https://github.com/poliastro/poliastro", + "home_url": "http://docs.poliastro.space", + "pypi_name": "poliastro", + "description": "Astrodynamics and Orbital Mechanics computations", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Partial", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "hips", + "maintainer": "Thomas Boch", + "stable": false, + "repo_url": "https://github.com/hipspy/hips", + "home_url": "https://hips.readthedocs.io", + "pypi_name": "hips", + "description": "A Python astronomy package for HiPS : Hierarchical Progressive Surveys.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Partial", + "testing": "Good", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "regions", + "maintainer": "Larry Bradley and Adam Ginsburg ", + "stable": false, + "repo_url": "https://github.com/astropy/regions", + "home_url": "https://astropy-regions.readthedocs.io", + "pypi_name": "regions", + "description": "A Python astronomy package for region handling, including serialization (input and output) and masking.", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "synphot", + "maintainer": "Pey Lian Lim", + "stable": true, + "home_url": "https://synphot.readthedocs.io", + "repo_url": "https://github.com/spacetelescope/synphot_refactor", + "pypi_name": "synphot", + "description": "A Python astronomy package for synthetic photometry.", + "image": "http://synphot.readthedocs.io/en/latest/_images/spectrum-2.png", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2017-11-08" + } + }, + { + "name": "astropy-healpix", + "maintainer": "Leo Singer and Thomas Robitaille ", + "stable": false, + "repo_url": "https://github.com/astropy/astropy-healpix", + "home_url": "https://astropy-healpix.readthedocs.io/", + "pypi_name": "astropy-healpix", + "description": "A BSD-licensed HEALPix implementation for Astropy", + "image": null, + "coordinated": true, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2017-11-27" + } + }, + { + "name": "dust_extinction", + "maintainer": "Karl Gordon", + "stable": false, + "repo_url": "https://github.com/karllark/dust_extinction", + "home_url": "http://dust-extinction.readthedocs.io", + "pypi_name": "dust_extinction", + "description": "Interstellar dust extinction curves", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Partial", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2018-5-25" + } + }, + { + "name": "feets", + "maintainer": "Juan B Cabral ", + "stable": true, + "repo_url": "https://github.com/carpyncho/feets", + "home_url": "http://feets.readthedocs.io", + "pypi_name": "feets", + "description": "feATURE eXTRACTOR FOR tIME sERIES.", + "image": "https://github.com/carpyncho/feets/raw/master/res/logo_medium.png", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2018-11-27" + } + }, + { + "name": "corral", + "maintainer": "Toros Survey Team", + "stable": true, + "repo_url": "https://github.com/toros-astro/corral", + "home_url": "http://corral.readthedocs.io/", + "pypi_name": "corral-pipeline", + "description": "Corral will solve your pipeline needs by merging a database full connection interface with a MVC model, by making you able of editing your custom schemas and adding the possibility of writting specific processing steps following a intuitive data handling model.", + "image": null, + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Partial", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2018-8-21" + } + }, + { + "name": "baseband", + "maintainer": "Marten H. van Kerkwijk ", + "stable": true, + "home_url": "https://baseband.readthedocs.io", + "repo_url": "https://github.com/mhvk/baseband", + "pypi_name": "baseband", + "description": "Radio baseband IO: readers and writers for VLBI and other baseband data formats.", + "image": null, + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2018-11-27" + } + }, + { + "name": "sbpy", + "maintainer": "Michael S. P. Kelley, Henry Hsieh, and Jian-Yang Li ", + "stable": false, + "home_url": "https://sbpy.org", + "repo_url": "https://github.com/NASA-Planetary-Science/sbpy", + "pypi_name": "sbpy", + "description": "A Python Module for Small-Body Planetary Astronomy", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Good", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2019-06-18" + } + }, + { + "name": "EinsteinPy", + "maintainer": "Shreyas Bapat, Ritwik Saha, Bhavya Bhatt, and Priyanshu Khandelwal ", + "stable": true, + "home_url": "https://einsteinpy.org", + "repo_url": "https://github.com/einsteinpy/einsteinpy", + "pypi_name": "einsteinpy", + "description": "A Python Package for General Relativity and Gravitational Astronomy", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2019-07-23" + } + }, + { + "name": "astroalign", + "maintainer": "Martin Beroiz ", + "stable": true, + "home_url": "http://astroalign.readthedocs.io/", + "repo_url": "https://github.com/quatrope/astroalign", + "pypi_name": "astroalign", + "description": "Astrometric registration of images when no WCS info is available", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2019-08-15" + } + }, + { + "name": "mocpy", + "maintainer": "François-Xavier Pineau , Matthieu Baumann , and Thomas Boch ", + "stable": true, + "home_url": "https://cds-astro.github.io/mocpy/", + "repo_url": "https://github.com/cds-astro/mocpy", + "pypi_name": "mocpy", + "description": "MOCPy is a Python library allowing easy creation, parsing and manipulation of MOCs (Multi-Order Coverage maps). These coverage maps heavily rely on the HEALPix sky partionning scheme. A MOC is therefore a set of HEALPix cells at different orders. This allows the description of any arbitrary maps on the sky.", + "coordinated": false, + "review": { + "functionality": "General package", + "ecointegration": "Partial", + "documentation": "Partial", + "testing": "Partial", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2019-11-04" + } + }, + { + "name": "ligo.skymap", + "maintainer": "Leo Singer ", + "stable": true, + "home_url": "http://lscsoft.docs.ligo.org/ligo.skymap/", + "repo_url": "https://git.ligo.org/lscsoft/ligo.skymap", + "pypi_name": "ligo.skymap", + "description": "Read, write, generate, simulate, and visualize LIGO/Virgo gravitational-wave probability sky maps.", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Good", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2020-07-01" + } + }, + { + "name": "agnpy", + "maintainer": "Cosimo Nigro ", + "stable": true, + "home_url": "https://agnpy.readthedocs.io/en/latest/", + "repo_url": "https://github.com/cosimoNigro/agnpy", + "pypi_name": "agnpy", + "description": "Modelling Active Galactic Nuclei radiative processes with python. agnpy focuses on the numerical computation of the photon spectra produced by leptonic radiative processes in jetted Active Galactic Nuclei (AGN).", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Partial", + "documentation": "Good", + "testing": "Good", + "devstatus": "Heavy development", + "python3": "Yes", + "last-updated": "2020-07-13" + } + }, + { + "name": "kanon", + "maintainer": "Léni Gauffier ", + "stable": true, + "home_url": "https://kanon.readthedocs.io/", + "repo_url": "https://github.com/legau/kanon", + "pypi_name": "kanon", + "description": "History of astronomy package, historical geocentric models and number systems", + "coordinated": false, + "review": { + "functionality": "Specialized package", + "ecointegration": "Good", + "documentation": "Partial", + "testing": "Good", + "devstatus": "Good", + "python3": "Yes", + "last-updated": "2022-02-05" + } + } + ] +} diff --git a/conf.py b/conf.py index b3386f5b..53b9e23d 100644 --- a/conf.py +++ b/conf.py @@ -3,6 +3,9 @@ # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html +import sys +from pathlib import Path + # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information @@ -13,10 +16,12 @@ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration +sys.path.append(Path("exts").absolute().as_posix()) extensions = [ "myst_parser", "sphinx_design", "sphinx_copybutton", + "rawfiles", ] templates_path = ['_templates'] @@ -29,7 +34,7 @@ 'CONTRIBUTING.md', ] - +rawfiles = ["affiliated/registry.json"] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output @@ -44,9 +49,14 @@ } html_sidebars = { - "*": [], + "**": [], } html_css_files = [ "css/astropy-org.css" ] + +html_js_files = [ + "js/functions.js", + "https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js", +] diff --git a/exts/rawfiles.py b/exts/rawfiles.py new file mode 100644 index 00000000..a00aa105 --- /dev/null +++ b/exts/rawfiles.py @@ -0,0 +1,18 @@ +import shutil +from pathlib import Path + + +def on_html_collect_pages(app): + for f in app.builder.config.rawfiles: + src = str(Path(app.srcdir) / Path(f)) + dst = str(Path(app.builder.outdir) / Path(f)) + if Path(src).is_file(): + shutil.copy(src, dst) + else: + shutil.copytree(src, dst) + return () + + +def setup(app) -> None: + app.add_config_value("rawfiles", [], "html") + app.connect("html-collect-pages", on_html_collect_pages) diff --git a/index.rst b/index.rst index 485c50cd..35eea408 100644 --- a/index.rst +++ b/index.rst @@ -8,6 +8,7 @@ Astropy :hidden: acknowledging + affiliated/index .. raw:: html @@ -25,8 +26,8 @@ Astropy
        -The Astropy Project is a community effort to develop a `common core package `__ for Astronomy in Python and foster an ecosystem of :ref:`astropy-org:affiliated`. -The Astropy community is committed to supporting the :ref:`astropy-org:coc`. +The Astropy Project is a community effort to develop a `common core package `__ for Astronomy in Python and foster an ecosystem of :ref:`astropy-org-affiliated`. +The Astropy community is committed to supporting the :ref:`astropy-org-coc`. .. rst-class:: acknowledge From a73bb2ffcf3641cac1e2d7982d9b4ca8c2fc7d93 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Mon, 19 Jan 2026 16:13:44 +0000 Subject: [PATCH 04/21] TMP: Add CoC Pages --- code_of_conduct.rst | 77 +++++++++++++++++++++++++++++++++ code_of_conduct_old_astropy.rst | 72 ++++++++++++++++++++++++++++++ exts/rawfiles.py | 5 +++ index.rst | 1 + 4 files changed, 155 insertions(+) create mode 100644 code_of_conduct.rst create mode 100644 code_of_conduct_old_astropy.rst diff --git a/code_of_conduct.rst b/code_of_conduct.rst new file mode 100644 index 00000000..08c0ff01 --- /dev/null +++ b/code_of_conduct.rst @@ -0,0 +1,77 @@ +.. _astropy-org-coc: + +Astropy Community Code of Conduct +================================= + +Since November 2025, the Astropy Project has adopted the NumFOCUS Code of Conduct, which is summarized below. For the previous version of the Astropy Code of Conduct, click :ref:`here `. + + +The Short Version +----------------- + +Be kind to others. Do not insult or put down others. +Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are not appropriate for Astropy. + +Astropy is dedicated to providing a harassment-free community for everyone, regardless of gender, sexual orientation, gender identity and expression, disability, physical appearance, body +size, race, or religion. +We do not tolerate harassment of community members in any form. + +All communication should be appropriate for a professional audience including people of many different backgrounds. +Sexual language and imagery is not appropriate. + +Thank you for helping make this a welcoming, friendly community for all. + +The Long Version +---------------- + +You can find the long version of the Code of Conduct on the `NumFOCUS website `__. + +How To Report +------------- + +If you feel that the Code of Conduct has been violated, you can submit a report via the `NumFOCUS Code of Conduct Reporting Form `__. + +Who Will Receive Your Report +---------------------------- + +Your report will be received and handled by NumFOCUS Code of Conduct Working Group; trained, and experienced contributors with diverse backgrounds. +The group is making decisions independently from the project, PyData, NumFOCUS, or any other organization. + +The Working Group will work with the Astropy Project's Ombudsperson to resolve an incident: The NumFOCUS Code of Conduct Working group will review the incident, and provide recommendations on how to handle this or what consequences or sanction might be appropriate. +As per `Astropy's governance charter `__, the Astropy Ombudsperson along with the Coordination Committee will receive those recommendations and perform any actions necessary to address the concern. + +Examples +-------- + +To make this Code of Conduct more concrete, we provide here some hypothetical examples of how a Code of Conduct issue might arise that may be particular to our community: + +- A member of the Astropy community might express a preference on + an online forum for a specific tool or programming language + (e.g., Python) over another language. If this preference is + expressed as a personal preference or with reference to + particular technical merits of that language vs. others, there + is no violation of the Code of Conduct. However, if that member + instead expresses this preference by way of insult to those who + use another language, or via violent imagery directed at those + other languages or its users, that would be an act of "tool + shaming" and be a violation of the Code of Conduct. +- If a member of the community knowingly uses a software tool or + astronomical dataset in a public package or academic publication + without acknowledging or citing the tool in a reasonable way + requested by the upstream tool, this is a violation of the Code + of Conduct. If the member makes a reasonable effort to find an + acknowledgement and one is not available, this would not be a + Code of Conduct violation (although it might or might not + represent a violation of copyright law depending on the details + of the situation and adopted license). +- If an Astropy maintainer were to post a message in a public + forum that is insulting an astronomy research community member's + skills as a programmer, this would be a violation of the Code of + Conduct, as the researcher is also a member of our community. + Conversely, if a researcher insultingly rejected a maintainer's + suggestion because the maintainer is not a scientist, this would + be a violation by the researcher. If that same thing were stated + in a meeting with other Astropy maintainers, it may or may not + represent a code of conduct violation, depending on whether the + intent is to insult vs. pointing out a skill lack in the + community in a productive manner. diff --git a/code_of_conduct_old_astropy.rst b/code_of_conduct_old_astropy.rst new file mode 100644 index 00000000..8277d84e --- /dev/null +++ b/code_of_conduct_old_astropy.rst @@ -0,0 +1,72 @@ +:orphan: + +.. _astropy-org-coc-old: + +Astropy Community Code of Conduct (prior to November 2025) +========================================================== + +**Astropy has switched to using NumFOCUS code of conduct, please see the** :ref:`astropy-org-coc` **for the current version.** + +The community of participants in open source Astronomy projects is +made up of members from around the globe with a diverse set of +skills, personalities, and experiences. It is through these +differences that our community experiences success and continued +growth. We expect everyone in our community to follow these +guidelines when interacting with others both inside and outside of +our community. Our goal is to keep ours a positive, inclusive, +successful, and growing community. + +As members of the community, + +- We pledge to treat all people with respect and provide a + harassment- and bullying-free environment, regardless of sex, + sexual orientation and/or gender identity, disability, physical + appearance, body size, race, nationality, ethnicity, and + religion. In particular, sexual language and imagery, sexist, + racist, or otherwise exclusionary jokes are not appropriate. +- We pledge to respect the work of others by recognizing + acknowledgment/citation requests of original authors. As + authors, we pledge to be explicit about how we want our own work + to be cited or acknowledged. +- We pledge to welcome those interested in joining the community, + and realize that including people with a variety of opinions and + backgrounds will only serve to enrich our community. In + particular, discussions relating to pros/cons of various + technologies, programming languages, and so on are welcome, but + these should be done with respect, taking proactive measure to + ensure that all participants are heard and feel confident that + they can freely express their opinions. +- We pledge to welcome questions and answer them respectfully, + paying particular attention to those new to the community. We + pledge to provide respectful criticisms and feedback in forums, + especially in discussion threads resulting from code + contributions. +- We pledge to be conscientious of the perceptions of the wider + community and to respond to criticism respectfully. We will + strive to model behaviors that encourage productive debate and + disagreement, both within our community and where we are + criticized. We will treat those outside our community with the + same respect as people within our community. +- We pledge to help the entire community follow the code of + conduct, and to not remain silent when we see violations of the + code of conduct. We will take action when members of our + community violate this code such as contacting + confidential@astropy.org (all emails sent to this address will + be treated with the strictest confidence) or talking privately + with the person. + +This code of conduct applies to all community situations online +and offline, including mailing lists, forums, social media, +conferences, meetings, associated social events, and one-to-one +interactions. + +Any related activity or project organized by members of the +Astropy community, including affiliated packages, are welcome to +have their own codes of conduct, but agree to also abide by the +present code of conduct. + +Parts of this code of conduct have been adapted from the PSF code +of conduct. + +The Astropy Community Code of Conduct is licensed under a `Creative Commons Attribution 4.0 International License `__. +We encourage other communities related to ours to use or adapt this code as they see fit. diff --git a/exts/rawfiles.py b/exts/rawfiles.py index a00aa105..715b085d 100644 --- a/exts/rawfiles.py +++ b/exts/rawfiles.py @@ -16,3 +16,8 @@ def on_html_collect_pages(app): def setup(app) -> None: app.add_config_value("rawfiles", [], "html") app.connect("html-collect-pages", on_html_collect_pages) + + return { + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/index.rst b/index.rst index 35eea408..1a55d9c4 100644 --- a/index.rst +++ b/index.rst @@ -9,6 +9,7 @@ Astropy acknowledging affiliated/index + code_of_conduct .. raw:: html From a737703435946376667fc313293a54f537f57f75 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Mon, 19 Jan 2026 16:33:32 +0000 Subject: [PATCH 05/21] TMP: Announcement Banner --- annoucement_banner.html | 0 conf.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 annoucement_banner.html diff --git a/annoucement_banner.html b/annoucement_banner.html new file mode 100644 index 00000000..e69de29b diff --git a/conf.py b/conf.py index 53b9e23d..550c0ff9 100644 --- a/conf.py +++ b/conf.py @@ -34,7 +34,7 @@ 'CONTRIBUTING.md', ] -rawfiles = ["affiliated/registry.json"] +rawfiles = ["annoucement_banner.html", "affiliated/registry.json"] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output From 1e1f89cd747911338793e25df613e023033d7547 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Mon, 19 Jan 2026 16:38:45 +0000 Subject: [PATCH 06/21] TMP: About --- about.rst | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ index.rst | 5 ++++ 2 files changed, 95 insertions(+) create mode 100644 about.rst diff --git a/about.rst b/about.rst new file mode 100644 index 00000000..701dd6ca --- /dev/null +++ b/about.rst @@ -0,0 +1,90 @@ +.. _astropy-org-about: + +About The Astropy Project +========================= + +The Astropy Project is a community effort to develop a core +package for astronomy using the `Python programming +language `__ and improve usability, +interoperability, and collaboration between astronomy Python +packages. The core *astropy* package contains functionality aimed +at professional astronomers and astrophysicists, but may be useful +to anyone developing astronomy software. The Astropy Project also +includes "affiliated packages," Python packages that are not +necessarily developed by the core development team, but share the +goals of Astropy, and often build from the core package's code and +infrastructure. + +Aside from the actual code, Astropy is also a community of +astronomy- associated users and developers that agree that sharing +utilities is healthy for the community and the science it +produces. This community is of course central to accomplishing +anything with the code itself. We welcome anyone who wishes to +contribute to the project and expect everyone in our community to +follow the `code of conduct `__ when +interacting with others. + +For more details on background of the project, you can read the +`original +vision `__ +from when the project was founded. + + +``astropy`` Core Package +------------------------ + +The *astropy* package (alternatively known as the "core" package) +contains various classes, utilities, and a packaging framework +intended to provide commonly-used astronomy tools. It is divided +into a variety of sub-packages, which are described in detail in +the `documentation `__. + +Affiliated Packages +------------------- + +The Astropy project includes the concept of "affiliated packages." +An affiliated package is an astronomy-related python package that +is not part of the *astropy* core source code, but has requested +to be included in the general community effort of the Astropy +project. Such a package may be a candidate for eventual inclusion +in the main *astropy* package (although this is not required). +Until then, however, it is a separate package, and may not be in +the *astropy* namespace. + +The authoritative listing of current affiliated packages is +available at http://affiliated.astropy.org. That page also +describes the process to get a package listed as an affiliated +package. + +License +------- + +Astropy is licensed under a `three-clause BSD +license `__. For +details, see the +`LICENSE.rst `__ +file in the astropy repository. + +Governance +---------- + +Astropy governance is as laid out in `APE 0 `__, +consisting of the Coordination Committee, the Ombudsperson, and +the Voting Members. Accompanying policies are documented in the +`project policies folder `__. + + +Fiscal Sponsor +-------------- + +Astropy is a Sponsored Project of +`NumFOCUS `__, a 501(c)(3) nonprofit +charity in the United States. +`NumFOCUS `__ provides Astropy with +fiscal, legal, and administrative support to help ensure the +health and sustainability of the project. Visit +`numfocus.org `__ for more information. + +.. image:: _static/img/Numfocus_stamp.png + :width: 299px + :target: https://www.numfocus.org diff --git a/index.rst b/index.rst index 1a55d9c4..80fbad9a 100644 --- a/index.rst +++ b/index.rst @@ -7,9 +7,14 @@ Astropy :maxdepth: 0 :hidden: + about acknowledging affiliated/index code_of_conduct + contribute + help + history + team .. raw:: html From d6e4fb6a7253ef5f8574d8964930467d09246b61 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Mon, 19 Jan 2026 16:40:20 +0000 Subject: [PATCH 07/21] TMP: help --- help.rst | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 help.rst diff --git a/help.rst b/help.rst new file mode 100644 index 00000000..01befc05 --- /dev/null +++ b/help.rst @@ -0,0 +1,31 @@ +.. _astropy-org-help: + +Getting Help with Astropy +========================= + +The best way to get help is usually by asking questions to the +Astropy user and development community. There are a number of +active forums and you are welcome to use whichever one you are the +most comfortable with. + +- `Open Astronomy + Discourse `__ - + This forum allows questions to be tagged by topic, is searchable + on Google, and displays code snippets well. Please head over and + ask (and answer) questions. +- `Astropy Slack workspace `__ (`get an + account `__) - This forum is + primarily focused on developing and maintaining the Astropy + project, but the ``#community-help`` channel is a good place for + users to seek help from the Astropy community. +- `Astropy Users Email List + [astropy@python.org] `__ + - Post questions or start discussions about anything related to + Python programming applied to astronomy. +- `Astropy Developers Email List + [astropy-dev@googlegroups.com] `__ + - Start discussions and ask questions about changing or adding + functionality to the ``astropy`` package. This is also the place + where significant announcements for contributors/developers are + usually made. If you would like to participate in discussion + about how the Project is run, please join this list. From dce9fc5c9bcf287ebfe9129c973629164e200f67 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Mon, 19 Jan 2026 16:41:53 +0000 Subject: [PATCH 08/21] TMP: history --- history.rst | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 history.rst diff --git a/history.rst b/history.rst new file mode 100644 index 00000000..2d062430 --- /dev/null +++ b/history.rst @@ -0,0 +1,168 @@ +.. _astropy-org-history: + +A brief history of the Astropy Project +====================================== + +Some of the earliest use of Python in astronomy was at the Space +Telescope Science Institute (STScI) with their release of PyRAF +around 2000. That release helped raise awareness of Python as a +scripting language, leading to its use at more institutions. STScI +was also active in the development of Python tools for science, +including a pre-cursor to numpy and early versions of matplotlib. +By the early 2010s there were multiple independent efforts by +institutions and individuals to use Python for data analysis. + +The initial trigger for Astropy was a `conversation in 2011 on the +astropy mailing list (which pre-dated The Astropy Project by over +a +decade) `__ +on the topic of how many “general astronomy” packages were being +written in Python. This discussion thread led to the creation of a +`short-lived +wiki `__ +where over 100 participants voted in favor of a shared package to +combine the efforts of these different developers into a single +space. This demonstrated broad interest in such an effort. With +that motivation and charge in place, this same wiki was used to +organize a planning meeting for this effort. + +That planning meeting, in Fall 2011, was the formal beginning of +the Astropy Project and was held at the `Harvard Center for +Astrophysics `__. +The `list of +attendees `__ +at that meeting underscores what has been essential to the launch, +growth, and continued development of Astropy: it was a mix of +graduate students, postdocs, scientists, and professional software +developers. The attendees with permanent positions were willing to +contribute both code and their time to the project; Space +Telescope Science Institute (STScI) additionally contributed +substantial staff time to the project. The early-career attendees +had either already devoted substantial time to code development, +would do so over the ensuing years, or both. + +The foundation of Astropy’s subsequent success was the combination +of institutional resources, a deliberate effort to include and +foster the growth of a broad community of contributors, the rapid +growth of GitHub and the surrounding ecosystem of open source +development tools, and a willingness of early-career professionals +to contribute code to an open community project. The initial +release for users of the core astropy package, version 0.2 on +February 19, 2013, was less than 18 months after the CfA meeting +and already contained many of the core subpackages that are part +of the package today. That was possible only because some of the +code already existed in a form that could be adapted to Astropy. +Major pieces had been written by staff at STScI that were +contributed by the Institute to the project. There were also large +contributions from early participants who were graduate students +and postdocs. + +By the time of the first stable release in 2013, the number of +contributors to the code base was over 20, including several +people who were not involved in the initial meeting. Though most +of the lines of code at that point had been written by a handful +of people, the effort they put into welcoming and supporting new +contributors was just as important and is not easily captured in a +single number. The project made an effort early on to provide +prompt, constructive, and welcoming feedback to new contributors. +The promptness was a key factor in encouraging early contributors +and was possible in part because STScI devoted substantial staff +time to the project with the explicit intent of growing the +community of contributors. + +One of the Project’s first efforts to formally recruit early +career scientists was participation in `Google’s Summer of Code +(GSoC) +program `__. +That program provides participants with a stipend in exchange for +doing extensive work on open source projects during the northern +hemisphere summer. It was the first of several efforts to grow the +community of contributors. These efforts yielded a handful of very +active long-term contributors to the project whose cumulative work +goes well beyond the initial code contributions made by +participants. + +Another critical element in the growth of the Astropy Project was +the Python in Astronomy conference series. The first Python in +Astronomy conference was held in 2015. The hope was that the +conference would encourage the development of Python packages in +astronomy outside of the astropy core, foster the adoption of +Astropy in the broader community, and serve as an introduction to +contributing to open source software. Though it was not an Astropy +conference, many of the astropy core developers were attending. +For example, the initial Code of Conduct for the Astropy Project +was written at the conference and the “Python in Astronomy” +Facebook group was started, among `other +activities `__. + +The intent from the first coordination meeting in 2011 was to put +some functionality into more specialized packages, called +affiliated packages, that were developed independent of the core +project but followed the same coding, testing and documentation +conventions and often used the same continuous integration (CI) +infrastructure. The first affiliated packages were created in +2011. That model has been quite successful: as of early 2022 there +are almost 50 affiliated packages (pre-APE 22). The use of common +conventions across the packages has eased the burden of +maintaining those packages as the project ecosystem grows. + +Deliberate community development has been essential to the success +of the Project and has included several aspects. Astropy was an +early and enthusiastic adopter of an explicit Code of Conduct. +This served to formalize the welcoming atmosphere established +early in the project. Community presence has included setting up +social media spaces for Python in Astronomy, workshops at AAS +meetings, work on learning materials for Astropy and development +of the project’s web presence. The Facebook group “Python in +Astronomy’’ has been wildly successful with over 6400 members and +nearly daily postings. This success is in part because of careful +moderation by members of the project early in the list's history +to keep conversations on topic, though community moderators have +taken on more of those responsibilities as time has gone on. +Workshops at AAS meetings have helped several hundred astronomers +adopt Python and astropy as part of their workflow. + +The day-to-day effort of managing the Astropy codebase is +unglamorous but critical. Tasks include promptly labeling and +triaging new issues, responding to new pull requests, and watching +for and fixing changes that break part of the infrastructure. +There have been times when that infrastructure has shifted very +rapidly, such as when `Travis-CI stopped hosting open source +packages `__. +Transitioning the entire ecosystem to a new infrastructure +required substantial effort by a number of people, though it was +facilitated primarily by a single individual. Indeed, much of this +day-to-day work has been done by a handful of people, many of whom +are in permanent positions at STScI and a few other institutions. + +The patterns at the beginning of the project have persisted +throughout: it is the combined effort of individuals and +institutions that includes scientists and software developers. It +includes early-career individuals and those in permanent +positions. + +There are a few important changes to the project since its +inception. One is external funding from the Moore Foundation in +2019 and from NASA in 2022, which provides monetary support for +contributors at all career stages in addition to funding for +Project needs. Another is the establishment of a formal governance +structure (`APE 0 adopted in +2021 `__) +that is open and responsive to community needs. + +Another development that was perhaps not envisioned at the start +of the project is some contributors choosing to make Astropy an +essential part of their career. Their involvement since the +beginning of the project has provided continuity to the project +and represents taking a risk that potential future employers may +not scientifically value this software work, regardless of its +impact on astronomy as a whole. + +As of summer 2022, the success of the Project hinged on a number +of factors, including the willingness of institutions and +individuals to contribute extensive prior work to a community +project, a deliberate effort to foster new contributors, and an +effort to create a welcoming community. It is difficult to see how +the project could have come so far absent any of these factors or +absent any one of the groups of contributors. Institutional +support and individual contributions has been inextricably linked. From 2f9da795080183e24b28c12ccda00ca99dfd4a9b Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Mon, 19 Jan 2026 19:57:52 +0000 Subject: [PATCH 09/21] TMP: team --- .gitignore | 1 + _static/js/functions.js | 5 +- conf.py | 14 +- roles.json | 710 ++++++++++++++++++++++++++++++++++++++++ team.rst | 126 +++++++ 5 files changed, 853 insertions(+), 3 deletions(-) create mode 100644 roles.json create mode 100644 team.rst diff --git a/.gitignore b/.gitignore index 3d349ced..43601850 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.py[co] *.DS_STORE _build/ +credits.rst diff --git a/_static/js/functions.js b/_static/js/functions.js index f5619805..f843b511 100644 --- a/_static/js/functions.js +++ b/_static/js/functions.js @@ -76,6 +76,8 @@ function maintainer_translator(maint, pkgnm) { function createRolesTable(roles) { + var tab = document.getElementById("roles-table"); + tab.deleteRow(1); //roles is an array of objects called "role" var rows = ''; roles.forEach(function (role) { @@ -140,8 +142,7 @@ function createRolesDescription(roles) { //console.log(role['responsibilities']); - blocks += '
        ' + - '

        ' + role["role-head"] + '

        '; + blocks += '

        ' + role["role-head"] + '

        '; index = 0; diff --git a/conf.py b/conf.py index 550c0ff9..270f3a8c 100644 --- a/conf.py +++ b/conf.py @@ -34,7 +34,7 @@ 'CONTRIBUTING.md', ] -rawfiles = ["annoucement_banner.html", "affiliated/registry.json"] +rawfiles = ["annoucement_banner.html", "roles.json", "affiliated/registry.json"] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output @@ -60,3 +60,15 @@ "js/functions.js", "https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js", ] + +################################################################################ +# Other Trickery +################################################################################ +# We want to get the credits.rst file from astropy core, but not keep it in the repo + +from urllib.request import urlretrieve + +urlretrieve( + "https://raw.githubusercontent.com/astropy/astropy/refs/heads/main/docs/credits.rst", + filename="credits.rst", +) diff --git a/roles.json b/roles.json new file mode 100644 index 00000000..25ceea2e --- /dev/null +++ b/roles.json @@ -0,0 +1,710 @@ +[ + { + "role": "Coordination committee member", + "url": "Coordination_committee_member", + "people": [ + "Clara Brasseur", + "Aarya Patil", + "Nathaniel Starkman", + "Erik Tollerud", + "Kyle Westfall" + ], + "role-head": "Coordination committee member", + "responsibilities": [ + { + "description": "Overall coordination and management of the Astropy project, including:", + "details": [ + "Formally detailed in the The Astropy Project Governance Charter (APE 0)", + "Keeping a large-scale view of the Astropy ecosystem", + "Approving or rejecting Astropy APEs", + "Evaluating and merging core package pull requests as needed (e.g., for sub-packages without a maintainer)", + "Arbitrating disagreements in the core package, including final decisions when otherwise deadlocked", + "Maintaining the list of roles and related github permissions", + "Managing finances for the project", + "Coordinating with NumFOCUS and other funding organizations", + "Securing funding for the project via discussions and proposals to funding agencies" + ] + }, + { + "description": "Organization and communication:", + "details": [ + "Policies: CoCo Operating Policies.", + "Meeting records: CoCo Running Notes.", + "Communication within the coordination committee happens through regular Zoom meetings and a private Slack channel.", + "Contact the Coordination Committee via email to coordinators@astropy.org or by tagging the github team @astropy/coordinators.", + "Coordination committee members send project updates to appropriate email lists (e.g. astropy-dev)." + ] + } + ] + }, + { + "role": "Ombudsperson", + "url": "Ombudsperson", + "people": [ + "Perry Greenfield" + ], + "role-head": "Ombudsperson", + "responsibilities": { + "description": "Provide a point of contact for sensitive issues separate from the coordinating committee, including:", + "details": [ + "Formally detailed in the The Astropy Project Governance Charter (APE 0)", + "Monitoring the confidential@astropy.org email account", + "Solicit and provide anonymized feedback to the astropy coordination committee regarding coordination of the project", + "Assist the coordination committee and community engagement coordinator with violations of the code of conduct or other ethical concerns" + ] + } + }, + { + "role": "Strategic planning and organizing committee member", + "url": "strategic_planner", + "people": [ + "Kelle Cruz", + "Adrian Price-Whelan", + "Thomas Robitaille", + "Nathaniel Starkman", + "Erik Tollerud" + ], + "role-head": "Strategic planner", + "responsibilities": [{ + "description": "Do long-term planning for the Astropy Project as a whole, including:", + "details": [ + "Shape and provide a vision for next major steps in the Project, in consultation with the whole Astropy community.", + "Maintain an overview of all the project activities (both from developer and user perspectives).", + "Provide points of contact for external stakeholders on the above (with the Coordination Committee).", + "Monitor project activities to see how well aligned they are with the roadmap and strategic goals of the project, and report back to the community and Coordination Committee.", + "Coordinate writing grant proposals (in collaboration with the Finance Committee, Coordination Committee, and community).", + "Maintain the Astropy Project Roadmap.", + "Engage with, and collect input from, the whole Astropy Community on project vision and priorities." + ] + }, + { + "description": "Organization and communication:", + "details": [ + "Policies: Beta-Year Draft.", + "Meeting records: Strategic Planning Running Notes.", + "Communication within the coordination committee happens through regular Zoom meetings and a private Slack channel.", + "Contact the Strategic Planning Committee via email to strategic.planning@astropy.org or by tagging the github team @astropy/strategic-planning." + ] + }] + }, + { + "role": "Finance committee member", + "url": "finance_committee_member", + "people": [ + "Kelle Cruz (chair)", + "Aarya Patil", + "John Swinbank", + "Erik Tollerud" + ], + "role-head": "Finance committee member", + "responsibilities": [{ + "description": "Plan, oversee, and disburse the Astropy project finances, including:", + "details": [ + "Determine and manage the process for paying people from Astropy's project-level funding.", + "Paying and overseeing people in supporting roles (e.g., documentation copy-editors, contract lawyers).", + "Oversee payment for services, licenses, and travel (e.g., Python in Astronomy, SciPy), and other miscellaneous expenses the project already pays for.", + "Maintain and continuously develop a transparent process for reporting all of the above to the Coordination Committee and wider community, related record keeping, and planning the same for future possible financial committee efforts." + ] + }, + { + "description": "Organization and communication:", + "details": [ + "Policies: Finance Committee Operating Policies.", + "Meeting records: Finance Running Notes.", + "Communication within the finance committee happens through regular Zoom meetings and a private Slack channel.", + "Contact the Finance Committee via email to finance@astropy.org, tagging the github team @astropy/finance-committee, or via #finance-committee public channel in Astropy Slack workspace.", + "Finance committee members send project updates to appropriate email lists (e.g. astropy-dev)." + ] + }] + }, + { + "role": "Maintainer Mentorship coordinator", + "url": "mentorship", + "people": [ + "Tom Aldcroft" + ], + "role-head": "Maintainer Mentorship coordinator", + "responsibilities": { + "description": "Lead the maintainer mentorship program, including:", + "details": [ + "identifying active and experienced contributors that would like to become maintainers", + "finding mentors for new maintainers", + "develop opportunities for new maintainers" + ] + } + }, + { + "role": "Community engagement coordinator", + "url": "Community_engagement_coordinator", + "role-head": "Community engagement coordinator", + "sub-roles": [ + { + "role": "Overall", + "people": [ + "Unfilled" + ] + }, + { + "role": "Facebook", + "people": [ + "Kelle Cruz" + ] + }, + { + "role": "Slack/Matrix", + "people": [ + "Stuart Mumford" + ] + }, + { + "role": "Discourse", + "people": [ + "Stuart Mumford" + ] + }, + { + "role": "Conferences", + "people": [ + "Kelle Cruz", + "Erik Tollerud" + ] + }, + { + "role": "BlueSky", + "people": [ + "Brett Morris" + ] + }, + { + "role": "Mastodon", + "people": [ + "Stuart Mumford" + ] + } + ], + "responsibilities": { + "description": "Facilitate engagement with the Astropy community, including:", + "details": [ + "Maintain Astropy's social media accounts", + "Monitor/moderate the Python Users in Astronomy Facebook group", + "Keep track of/help organize presence in conferences and workshops", + "Maintain infrastructure for communication channels (e.g., Discourse)" + ] + } + }, + { + "role": "Learn Team", + "url": "Learn_team", + "role-head": "Learn Team", + "sub-roles": [ + { + "role": "Coordinators", + "people": [ + "Clara Brasseur" + ] + }, + { + "role": "Learn content and infrastructure", + "people": [ + "Lia Corrales", + "Kelle Cruz", + "Matt Craig", + "Adrian Price-Whelan", + "Erik Tollerud", + "Jonathan Sick", + "Jeff Jennings" + ] + }, + { + "role": "Workshop Coordinators", + "people": [ + "David Shupe", + "Brett Morris", + "Kelle Cruz" + ] + } + ], + "responsibilities": [ + { + "subrole-head": "Coordinators", + "description": "Oversee the Astropy \"Learn\" ecosystem, including:", + "details": [ + "Ensuring that the documentation, tutorials, and guide materials are internally consistent and cover key areas of the ecosystem", + "Overseeing the maintainers for the aforementioned areas", + "Organizing sprints or other events focused on Astropy learning materials" + ] + }, + { + "subrole-head": "Learn content and infrastructure", + "description": "Maintain the infrastructure and edit content of the Tutorials website, including:", + "details": [ + "Facilitating the display and discoverability of the tutorials", + "Rendering of the Jupyter notebooks", + "Integrated testing of notebooks", + "Reviewing issues and pull requests", + "Soliciting new content as needed" + ] + }, + { + "subrole-head": "Workshop Coordinators", + "description": "Organize and coordinate Astropy workshops for training and outreach to users", + "details": [ + "Maintain the astropy-workshops repository", + "Oversee staffing/volunteers for workshops", + "Identify opportunities for workshops in diverse geographic locations" + ] + } + ] + }, + { + "role": "Affiliated package review editor", + "url": "Affiliated_package_review_editor", + "people": ["Hans Moritz G\u00fcnther", "Derek Homeier"], + "deputy": ["Unfilled"], + "role-head": "Affiliated package review editor", + "responsibilities": { + "description": "Oversee affiliated packages in partnership with pyOpenSci, including:", + "details": [ + "Representing Astropy as pyOpenSci Software Review Editor", + "Keeping track of submissions to the affiliated package ecosystem", + "Guiding submissions through the pre-submission and submission steps to the Peer Review system" + ] + } + }, + { + "role": "APE editor", + "url": "APE_editor", + "people": [ + "Clara Brasseur", + "Aarya Patil", + "Nathaniel Starkman", + "Erik Tollerud", + "Kyle Westfall" + ], + "deputy": ["Unfilled"], + "role-head": "APE editor", + "responsibilities": { + "description": "Oversee APE submissions as laid out in APE 1, including:", + "details": [ + "Perform editorial reviews of new APE submissions", + "Shepherd the APE discussions and redirect them to astropy-dev, as needed", + "Monitor and maintain astropy-APEs repository" + ] + } + }, + { + "role": "Release team", + "url": "release_team", + "people": [ + "Simon Conseil", + "Thomas Robitaille" + ], + "role-head": "Release team", + "responsibilities": { + "description": "Oversee the release process for packages in the project, including:", + "details": [ + "Carrying out releases of the core astropy package", + "Notifying the Distribution Coordinators of any core astropy package release", + "Working with the Community Engagement Coordinator to make release announcements via channels such as mailing lists and social media", + "Keeping documentation for the release process of the core package up to date", + "Designing policies to improve the uniformity of release procedures for the coordinated and infrastructure packages of the Astropy Project", + "Testing the interoperability of the core, coordinated, and infrastructure packages and provide safeguards against breaking the ecosystem." + ] + } + }, + { + "role": "Security team", + "url": "security_team", + "people": [ + "Hans Moritz G\u00fcnther", + "Pey Lian Lim", + "Thomas Robitaille", + "Erik Tollerud" + ], + "role-head": "Security team", + "responsibilities": { + "description": "Organize security reporting and auditing for packages in the project, including:", + "details": [ + "Monitor and reply to security reports (this role needs admin privileges on GitHub to access reports submitted through GitHub's secure reporting form)", + "Coordinate the response to any security report with the relevant package maintainers and outside security experts", + "Coordinate security audits with external experts as needed and available", + "Release CVEs as necessary" + ] + } + }, + { + "role": "Infrastructure and Operations", + "url": "devops_team", + "role-head": "Infrastructure and Operations", + "sub-roles": [ + { + "role": "Technical Lead", + "people": [ + "Pey Lian Lim", + "Brigitta Sip\u0151cz" + ] + }, + { + "role": "Testing infrastructure", + "people": [ + "Simon Conseil", + "Pey Lian Lim", + "Thomas Robitaille", + "Brigitta Sip\u0151cz" + ] + }, + { + "role": "Documentation infrastructure", + "people": [ + "Simon Conseil", + "Pey Lian Lim", + "Thomas Robitaille", + "Brigitta Sip\u0151cz" + ] + }, + { + "role": "Astropy.org web page maintainer", + "people": [ + "Hans Moritz G\u00fcnther", + "Derek Homeier", + "Erik Tollerud" + ] + } + + ], + "responsibilities": [ + { + "subrole-head": "Technical Lead", + "description": "Ensure the smooth running of the project", + "details": [ + "Set up and maintain continuous integration services", + "Move issues between repositories within the organization" + ] + }, + { + "subrole-head": "Testing infrastructure", + "description": "Lead development and maintenance of the testing infrastructure for Astropy and the helpers, including:", + "details": [ + "Managing issues/pull request for the Astropy core package regarding testing infrastructure", + "Managing issues/pull requests in the repositories containing the testing plugins, and determining when new plugins are required", + "Maintaining the 'metapackage' with the testing machinery (pytest-astropy at the time of this writing)", + "Supporting and enabling affiliated package usage of the testing infrastructure" + ] + }, + { + "subrole-head": "Documentation infrastructure", + "description": "Maintain the Astropy documentation website, including:", + "details": [ + "Managing the Sphinx infrastructure", + "Implementing changes and improvements to the documentation website", + "Overseeing content (although primary responsibility for content lies with subpackage maintainers)" + ] + }, + { + "subrole-head": "Astropy.org web page maintainer", + "description": "Manage the astropy.org web site, including:", + "details": [ + "Managing pull requests to the website repository in general", + "Managing data.astropy.org, which is done by managing the astropy-data repository (which is automatically synced with data.astropy.org)", + "Managing the astropy.org DNS entries and related domain name upkeep" + ] + } + ] + }, + { + "role": "Core astropy package maintainer", + "url": "Subpackage_maintainer", + "role-head": "Sub-package maintainer (at least one per core package sub-package)", + "sub-roles": [ + { + "role": "General", + "people": [ + "Derek Homeier", + "Pey Lian Lim", + "Cl\u00e9ment Robert", + "Ole Streicher" + ] + }, + { + "role": "astropy.constants", + "people": [ + "David Shupe", + "Marten van Kerkwijk" + ] + }, + { + "role": "astropy.convolution", + "people": [ + "Larry Bradley", + "Axel Donath", + "Adam Ginsburg" + ] + }, + { + "role": "astropy.coordinates", + "people": [ + "Stuart Littlefair", + "Adrian Price-Whelan", + "Eero Vaher", + "Marten van Kerkwijk" + ] + }, + { + "role": "astropy.cosmology", + "people": [ + "Nathaniel Starkman" + ] + }, + { + "role": "astropy.io.ascii", + "people": [ + "Tom Aldcroft", + "Hans Moritz G\u00fcnther", + "Derek Homeier" + ] + }, + { + "role": "astropy.io.fits", + "people": [ + "Simon Conseil", + "Thomas Robitaille" + ] + }, + { + "role": "astropy.io.misc", + "people": [ + "Matteo Bachetti" + ] + }, + { + "role": "astropy.io.votable", + "people": [ + "Thomas Boch", + "Tom Donaldson", + "Pey Lian Lim" + ] + }, + { + "role": "astropy.modeling", + "people": [ + "Nadia Dencheva", + "Perry Greenfield", + "William Jamieson" + ] + }, + { + "role": "astropy.nddata", + "people": [ + "Matt Craig", + "Brett Morris" + ] + }, + { + "role": "astropy.samp", + "people": [ + "Unfilled" + ] + }, + { + "role": "astropy.stats", + "people": [ + "Larry Bradley" + ] + }, + { + "role": "astropy.table", + "people": [ + "Tom Aldcroft", + "Marten van Kerkwijk" + ] + }, + { + "role": "astropy.time", + "people": [ + "Tom Aldcroft", + "Marten van Kerkwijk" + ] + }, + { + "role": "astropy.timeseries", + "people": [ + "Thomas Robitaille", + "Brigitta Sip\u0151cz" + ] + }, + { + "role": "astropy.uncertainties", + "people": [ + "Erik Tollerud", + "Marten van Kerkwijk" + ] + }, + { + "role": "astropy.units", + "people": [ + "Nathaniel Starkman", + "Marten van Kerkwijk" + ] + }, + { + "role": "astropy.utils", + "people": [ + "Pey Lian Lim", + "Brigitta Sip\u0151cz" + ] + }, + { + "role": "astropy.visualization", + "people": [ + "Larry Bradley", + "Stuart Mumford", + "Thomas Robitaille" + ] + }, + { + "role": "astropy.wcs", + "people": [ + "Mihai Cara, Nadia Dencheva" + ] + } + ], + "responsibilities": [ + { + "subrole-head": "General maintainer", + "description": "Maintain the astropy core package in aspects that are not specific to a single sub-package, including:", + "details": [ + "Evaluating new pull requests for quality, API consistency, Astropy coding standards, and appropriateness within the overall astropy ecosystem, in particular for pull requests spanning multiple sub-packages", + "Merging Pull Requests that are non-controversial or after reaching out to relevant subpackage maintainers", + "Maintain, review, and advocate for useful interaction between multiple sub-packages", + "Perform initial triaging of issues and pull requests", + "Keeping track of frequent contributors and their relevant areas of expertise" + ] + }, + { + + "subrole-head": "Sub-package maintainer", + "description": "Maintain a sub-package of the astropy core package, including:", + "details": [ + "Evaluating new pull requests for quality, API consistency, Astropy coding standards, and appropriateness within the overall astropy ecosystem", + "Merging Pull Requests in the sub-package", + "Keeping track of the \u201cbig picture\u201d progress of the sub-package - includes new feature development and significant bugs", + "Perform initial triaging of issues and pull requests", + "Keeping track of frequent contributors to the sub-package and their relevant areas of expertise" + ] + } + ] + }, + { + "role": "Coordinated package maintainer", + "url": "Coordinated_package_maintainer", + "role-head": "Astropy coordinated package maintainer", + "sub-roles": [ + { + "role": "asdf-astropy", + "people": [ + "Brett Graham", + "Nadia Dencheva", + "Perry Greenfield", + "Stuart Mumford" + ] + }, + { + "role": "astropy-healpix", + "people": [ + "Leo Singer", + "Thomas Robitaille" + ] + }, + { + "role": "astroquery", + "people": [ + "Adam Ginsburg", + "Brigitta Sip\u0151cz" + ] + }, + { + "role": "ccdproc", + "people": [ + "Matt Craig" + ] + }, + { + "role": "photutils", + "people": [ + "Larry Bradley" + ] + }, + { + "role": "regions", + "people": [ + "Larry Bradley", + "Adam Ginsburg" + ] + }, + { + "role": "reproject", + "people": [ + "Thomas Robitaille", + "Stuart Mumford", + "Sam Van Kooten" + ] + }, + { + "role": "specreduce", + "people": [ + "Tim Pickering", + "Erik Tollerud", + "Kyle Conroy", + "Clare Shanahan", + "Hannu Parviainen" + ] + }, + { + "role": "specutils", + "people": [ + "Ricky O'Steen", + "Adam Ginsburg", + "Erik Tollerud", + "Kelle Cruz" + ] + } + ], + "responsibilities": { + "description": "Maintain an astropy coordinated package, including:", + "details": [ + "Maintaining the github repository for the coordinated package", + "Maintaining the coordinated package's infrastructure (usually via the helpers and package template)", + "Monitoring features and bringing them for inclusion in the core package when relevant", + "All the same responsilities as a sub-package, but for the coordinated package." + ] + } + }, + { + "role": "Dev-telecon coordinator", + "url": "devtelecon_coordinator", + "people": [ + "Hans Moritz G\u00fcnther" + ], + "role-head": "Developer telecon coordinators", + "responsibilities": { + "description": "Organize monthly developer telecons", + "details": [] + } + }, + { + "role": "Distribution coordinator", + "url": "Distribution_coordinator", + "people": [ + "Matt Craig", + "Stuart Mumford", + "Sergio Pascual", + "Ole Streicher", + "Miguel de Val-Borro" + ], + "role-head": "Distribution coordinators", + "responsibilities": { + "description": "Create and maintain binary distribution packages for Astropy core and affiliated packages for a specific OS or package management system.", + "details": [] + } + } +] diff --git a/team.rst b/team.rst new file mode 100644 index 00000000..e424a0b0 --- /dev/null +++ b/team.rst @@ -0,0 +1,126 @@ +.. NOTE: This file has weird heading order deliberately to allow us to just include credits.rst from astropy core + +.. _astropy-org-team: + +************ +Astropy Team +************ + +.. _astropy-org-team-roles: + +Roles +----- + +The Astropy project is made possible through the efforts of community members that perform numerous important roles. This encompasses a broad scope of responsibilities ranging from direct package development to communication, distribution, and managerial activities. In this section we list the identified project roles and responsible parties, to provide members with a point-of-contact for individual tasks and to give the project an overview of the current state of the team. Different roles on this page have very different scope and effort needed to perform them. Listing on this page is also not mean to be any particular assignment of credit beyond that implict in having the responsibilities of the role. See the `Astropy project role responsibilities <#role-responsibilities>`__ section below for a full description of each role. + +We are always looking for interested community members to fill empty roles and to join existing teams. Community members may volunteer or nominate someone else for any role by emailing coordinators@astropy.org or by getting in touch with the current team. + +.. list-table:: + :header-rows: 1 + :name: roles-table + :class: package-table + + * - Role + - Sub-role + - Person/People (last name alphabetical) + * - \- + - \- + - \- + +Astropy Project Role Responsibilities +===================================== + +The Astropy project is made possible through the efforts of community members that perform numerous important roles. This encompasses a broad scope of responsibilities ranging from direct package development to communication, distribution, and managerial activities. In this section we list the responsibilities for each of the identified project roles. The list of people fulfilling these roles is found in the `Roles <#roles>`__ section. Committee/Team specific policies and communication methods are outlined in the `Astropy Policies `__ readme document. + +.. container:: + :name: roles-description + + .. raw:: html + +
        + +Voting Members +-------------- + +The Voting Members are the group of trusted individuals who operate the Astropy Project on behalf of the community. Their role and responsibilites are defined in `The Astropy Project Governance Charter (APE 0) `__. + +Active Voting Members +===================== + +- Tom Aldcroft +- Larry Bradley +- Clara Brasseur +- Michael K. Brewer +- Mihai Cara +- Kyle Conroy +- Simon Conseil +- Lia Corrales +- Matt Craig +- Kelle Cruz +- Nadia Dencheva +- Nicholas Earl +- Tom Donaldson +- Wilfred Gee +- Adam Ginsburg +- Lauren Glattly +- Perry Greenfield +- Moritz Günther +- Derek Homeier +- William Jamieson +- Pey Lian Lim +- Stuart Littlefair +- Brett Morris +- Stuart Mumford +- Ricky O'Steen +- Hannu Parviainen +- Aarya Patil +- Tim Pickering +- Adrian Price-Whelan +- Clément Robert +- Thomas Robitaille +- Albert Y. Shih +- David Shupe +- Jonathan Sick +- Leo Singer +- Brigitta Sipőcz +- Nathaniel Starkman +- Ole Streicher +- John Swinbank +- Erik Tollerud +- James Turner +- Marten van Kerkwijk +- Eero Vaher +- Benjamin Alan Weaver +- Kyle Westfall + + +Emeritus Voting Members +======================= + +- E. Madison Bray +- Juan Luis Cano Rodríguez +- Steve Crawford +- Michael Droettboom +- Michael Seifert +- Edward Slavich +- Zé Vinícius + + +Contributors +------------ + +Astropy project packages are under continuous development by professional astronomers and software developers from around the world. The Project is community-driven, with decisions generally made by consensus, but with oversight and organization provided by the coordinating committee. + +.. include:: credits.rst + :start-line: 4 + +.. |Astropy mailing list| replace:: `Astropy mailing list `__ +.. |astropy-dev mailing list| replace:: `astropy-dev mailing list `__ + +.. raw:: html + + From 8b15918cc0b841bb5d1f3a3db0fddeabff2804bd Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Tue, 20 Jan 2026 13:38:28 +0000 Subject: [PATCH 10/21] TMP: Contributing --- affiliated/index.rst | 2 + contribute.rst | 122 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 contribute.rst diff --git a/affiliated/index.rst b/affiliated/index.rst index ffb322ba..34daee1a 100644 --- a/affiliated/index.rst +++ b/affiliated/index.rst @@ -146,6 +146,8 @@ This section is frozen as of March 6, 2024. - \- - \- +.. _astropy-org-affiliated-instructions: + Becoming an Affiliated Package ------------------------------ diff --git a/contribute.rst b/contribute.rst new file mode 100644 index 00000000..c0cad4d9 --- /dev/null +++ b/contribute.rst @@ -0,0 +1,122 @@ +.. _astropy-org-contribute: + +Contribute to Astropy +===================== + +The Astropy project is made both by and for its users, so we accept contributions of many kinds. +We always welcome contributors who will abide by the :ref:`astropy-org-coc`. + +.. _astropy-org-contribute-feedback: + +Contribute feedback +------------------- + +There are several ways in which you can give feedback. + +- If you would like to give feedback and participate in discussions, we encourage you to join the `astropy mailing list `__ and post there. + This is the easiest way to have a discussion with both developers and other users. +- Feature requests from the community are welcome and encouraged. +- If you have feedback you would prefer to keep private, you can e-mail feedback@astropy.org. + This address points to a private mailing list that includes the astropy core developers. + If you would like a reply (e.g., an acknowledgement of your comment), please request it. +- For the extremely impatient, astropy developers often can be found in the `Astropy Slack team `__ (get an account `here `__). + Slack is basically a live web chat. +- If you would like to participate in discussions about how the Project is run, please join the `Developer Email List [astropy-dev] `__. + +.. _astropy-org-contribute-issues: + +Reporting Issues +---------------- + +If you have found a bug in Astropy please report it. +The preferred way is to create a new issue on the Astropy `GitHub issue page `__; that requires `creating a free account `__ on GitHub if you do not have one. + +If you prefer not to create a GitHub account, please report the issue to either the `astropy mailing list `__, the `astropy-dev mailing list `__ or sending a private email to the astropy core developers at feedback@astropy.org + +Please include an example that demonstrates the issue that will allow the developers to reproduce and fix the problem. +You may be asked to also provide information about your operating system and a full Python stack trace; the Astropy developers will walk you through obtaining a stack trace if it is necessary. + +.. _astropy-org-contribute-code: + +Contribute code or documentation +-------------------------------- + +If you are interested in contributing fixes, code or documentation to Astropy (whether the core package or affiliated packages), you should join the `astropy-dev `__ mailing list/forum. +For the core, start looking at any related `issues `__. +In particular, we have introduced a labeling system used across most Astropy-related packages which will allow you to find good starting issues. +Good labels to start with are `Good-first-issue `__ and `Package-novice `__ which means you don't need much prior experience of the package. +You can use the following links to find all the issues labeled this way and also labeled by how much work they involve: + +- `Effort-low `__: issues that should take a few hours at most +- `Effort-medium `__: issues that should take a few days at most +- `Effort-high `__: longer term issues + +You may also want to familiarize yourself with the `developer documentation `__, particularly the `coding `__ and `documentation `__ guidelines. + +Once you have a change to propose, if it's a simple fix to just a single file, you can even just browse to the appropriate file and use the "edit" button on github. +If it's a more complex change, we suggest you follow the `developer install instructions `__, and use that with `Astropy's github page `__ to issue a pull request with your changes. +If you aren't familiar with github, we suggest you looking over our `workflow documentation `__. +Once your code is accepted, you are officially an Astropy contributor and eligible to be included on the author list of future publications. + +If you want to propose a larger change to Astropy, there's a procedure for that: `Astropy Proposals for Enhancement (APEs) `__ (modeled after Python's `PEPs `__). +The sort of changes that APEs are intended for include plans for new sub-packages, wide-ranging code re-organizations, a new procedure needing review by a lot of the Astropy community, or an informational document on some decision for Astropy that you want remembered. +For more background on APEs, check out `APE #1 `__ and the `APE repository's README `__. +There is also a `wiki page on Astropy's github repository `__ that has an overview of the existing APEs. + +.. _astropy-org-contribute-role: + +Taking on a formal project role +------------------------------- + +If you are interested in a higher level of contribution to the project, you can consider taking on one of the formal project roles as listed in the :ref:`astropy-org-team` page. + +In order to be nominated for a named Astropy role, it is typical that a person will have been actively involved in the project for a considerable amount of time (at least a year and often longer) and have made substantial contributions. +They will have shown a sustained commitment to Astropy by participating actively already in activities related to the role. +This could involve submitting pull requests and participating in reviews, or discussions in other channels such as mailing lists or Slack, or other contributions as defined by a particular role. +Finally, they need to express a desire to maintain this involvement going forward and accept the responsibility of having a role. +For example, being a core sub-package maintainer involves interacting with users and responding to bug reports in a timely manner. +If you are interested in taking on such a role, you can volunteer either on `astropy-dev `__, by talking to a holder of the role you are interested in, or a coordination committee member. + +.. _astropy-org-contribute-affiliated: + +Develop an affiliated package +----------------------------- + +Whether you have an idea for a new Astronomy package, or already have a package that you want to integrate with the Astropy project, you can develop an affiliated package! You'll want to join the `astropy-dev `__ list so you can notify other developers of your intent to develop an affiliated package, and the `astropy-affiliated-maintainers `__ mailing list to be kept informed of any discussions related to setting up affiliated packages. +Then you can check out the section on :ref:`astropy-org-affiliated-instructions` to get started. + +.. _astropy-org-contribute-financially: + +Contribute Financially +---------------------- + +Donations to Astropy are managed by `NumFOCUS `__. +For donors in the United States, your gift is tax-deductible to the extent provided by law. +As with any donation, you should consult with your tax adviser about your particular tax situation. +If you would like to donate to astropy, please see the NumFOCUS contribution page for the Astropy Project: + +.. button-link:: https://numfocus.org/donate-to-astropy + + Donate to Astropy + +.. _astropy-org-contribute-justify: + +For academics: How to justify your contribution +----------------------------------------------- + +While in some more technical areas, contributing code is recognized as a goal in and of itself, some academic fields have not yet developed a clear understanding of the role of code development relative to other more traditional contributions like publication. +This section aims to provide suggestions to academics for how you might justify contributions to the Astropy project if you are in a field or institution that needs convincing of the value of such contributions. + +Contributing to the Astropy Project as a volunteer directly benefits the astronomical research community in tangible ways. +Nevertheless, people employed in academic departments may be asked to justify their time and efforts in terms of direct benefit to their own department or organization. +In this case it is worth highlighting the well-established role of community service in academia, including: + +- Referring journal papers +- Reviewing proposals for funding or for an observatory time allocation committee +- Serving on a conference science organizing committee +- Serving on an external review committee such as the NASA Senior Review + +These volunteer duties typically bring no direct benefit to the home department of a researcher, yet they are widely accepted as necessary to the functioning of global research astronomy. +We should now add the following to the above list of community service duties: + +- Contribute to open source software projects that benefit astronomical research From 7f61aa47571057030c115b65c305e0ee7bc6e314 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Tue, 20 Jan 2026 13:47:35 +0000 Subject: [PATCH 11/21] TMP: 10k citations --- acknowledging.rst | 2 +- paper_10k_citation.rst | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 paper_10k_citation.rst diff --git a/acknowledging.rst b/acknowledging.rst index 2c2d4650..18abf2c2 100644 --- a/acknowledging.rst +++ b/acknowledging.rst @@ -19,7 +19,7 @@ We encourage you to cite all three papers, but if space is limited, please cite - `Astropy Paper III (v5.0) `__ (`ADS `__ - `BibTeX `__) - `Astropy Paper II (v2.0) `__ (`ADS `__ - `BibTeX `__) -- `Astropy Paper I (v0.2) `__ (`ADS `__ - `BibTeX `__ - `10k citations `__) +- `Astropy Paper I (v0.2) `__ (`ADS `__ - `BibTeX `__ - :ref:`10k citations `) .. raw:: html diff --git a/paper_10k_citation.rst b/paper_10k_citation.rst new file mode 100644 index 00000000..019e00a2 --- /dev/null +++ b/paper_10k_citation.rst @@ -0,0 +1,18 @@ +:orphan: + +.. _astropy-org-paper-10k: + +Astropy Paper Reaches 10,000 Citations +====================================== + +Published by NumFOCUS on 2025-10-04 (`link to original article `__) + +The Astropy Project is excited to announce that the `first Astropy paper `__ has reached 10,000 citations, as tracked by the Astrophysics Data System. + +Astropy is a community-driven project that develops the astropy Python package along with other libraries and tools that enable astronomical research software. The Astropy Project has published three journal articles that mark significant milestones for the project, coinciding with the initial announcement of the project, version 2.0 of the core package, and version 5.0 of the core package, respectively. + +Since its inception just over 10 years ago, Astropy has become a core pillar of astronomical research, laying the foundation for thousands of software packages and enabling over 10,000 published research projects. This milestone demonstrates the impact Astropy has had on astronomy research and reflects the potential impact of scientific software. Other recent milestones include the ADASS Software Prize in 2022 and the 2025 Berkeley Prize. + +The Astropy Project is not a centralized institution or endeavor: The astropy Python package contains contributions from over 500 unique contributors and the governing bodies of the project are located at a range of universities and institutes with members spanning junior to senior positions in both academic and non-academic careers. While many have contributed to Astropy, the majority of the effort in the project was done by a much smaller group of 20–25 core contributors and maintainers. + +Astropy has benefitted from and is grateful for grant funding from the Moore Foundation and NASA over the years. However, most of the project was developed through volunteer effort or in-kind contributions from institutions such as Space Telescope Science Institute and the Chandra X-ray Center, and more recently the Center for Computational Astrophysics at the Flatiron Institute. Astropy also receives support as a Sponsored Project with `NumFOCUS `__, which provides services in funding and infrastructure for open source scientific computing projects. Infrastructure software like Astropy is critical to the success of modern astronomy, and we hope that the community will continue to support the project in the future through funding and contributions. From 26ff776d4d6c4833909073f899fa1beeefb1f49e Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Tue, 20 Jan 2026 14:59:58 +0000 Subject: [PATCH 12/21] TMP: announcements --- _static/css/astropy-org.css | 7 ++ _static/img/astropy_logo_notext.png | Bin 0 -> 12730 bytes announcements/release-0.4.rst | 75 +++++++++++++++++ announcements/release-1.0.rst | 90 +++++++++++++++++++++ announcements/release-1.1.rst | 100 +++++++++++++++++++++++ announcements/release-1.2.rst | 108 +++++++++++++++++++++++++ announcements/release-1.3.rst | 110 +++++++++++++++++++++++++ announcements/release-2.0.rst | 103 +++++++++++++++++++++++ announcements/release-3.0.rst | 121 ++++++++++++++++++++++++++++ announcements/release-3.1.rst | 102 +++++++++++++++++++++++ announcements/release-3.2.rst | 93 +++++++++++++++++++++ announcements/release-4.0.rst | 100 +++++++++++++++++++++++ announcements/release-4.1.rst | 110 +++++++++++++++++++++++++ announcements/release-4.3.rst | 107 ++++++++++++++++++++++++ announcements/release-5.0.rst | 99 +++++++++++++++++++++++ announcements/release-5.1.rst | 93 +++++++++++++++++++++ announcements/release-5.2.rst | 91 +++++++++++++++++++++ announcements/release-5.3.rst | 89 ++++++++++++++++++++ announcements/release-6.0.rst | 92 +++++++++++++++++++++ announcements/release-6.1.rst | 88 ++++++++++++++++++++ announcements/release-7.0.rst | 108 +++++++++++++++++++++++++ announcements/release-7.2.rst | 86 ++++++++++++++++++++ 22 files changed, 1972 insertions(+) create mode 100644 _static/img/astropy_logo_notext.png create mode 100644 announcements/release-0.4.rst create mode 100644 announcements/release-1.0.rst create mode 100644 announcements/release-1.1.rst create mode 100644 announcements/release-1.2.rst create mode 100644 announcements/release-1.3.rst create mode 100644 announcements/release-2.0.rst create mode 100644 announcements/release-3.0.rst create mode 100644 announcements/release-3.1.rst create mode 100644 announcements/release-3.2.rst create mode 100644 announcements/release-4.0.rst create mode 100644 announcements/release-4.1.rst create mode 100644 announcements/release-4.3.rst create mode 100644 announcements/release-5.0.rst create mode 100644 announcements/release-5.1.rst create mode 100644 announcements/release-5.2.rst create mode 100644 announcements/release-5.3.rst create mode 100644 announcements/release-6.0.rst create mode 100644 announcements/release-6.1.rst create mode 100644 announcements/release-7.0.rst create mode 100644 announcements/release-7.2.rst diff --git a/_static/css/astropy-org.css b/_static/css/astropy-org.css index 8a8ea4c4..56c079c8 100644 --- a/_static/css/astropy-org.css +++ b/_static/css/astropy-org.css @@ -64,3 +64,10 @@ table.package-table td.first-package-row { .third-row-sep tbody tr:nth-child(3n+4) { border-top: 1px var(--bs-border-color) solid; } + +.announce-logo { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} diff --git a/_static/img/astropy_logo_notext.png b/_static/img/astropy_logo_notext.png new file mode 100644 index 0000000000000000000000000000000000000000..bcff0ed69dfd4de115cf4ba8e2c17c4dfb03bb7f GIT binary patch literal 12730 zcmZX5bx<6<^EYs~mf{YjSfSYA?#@Ah2lp1Y!#UjD-CbJT3Wr;<;_h%1ryTD3_B-#N zzs&4rva^$9H@lzAWHwRiAbA{2a!dpS1RO;L8I6Da`u_+W^&h9up9=cdA-hT`YN7vY zzUbc~|BW%g3VN>p^q2leh*HcsUjKw-ZnC;=nogE(o@Oo<2%esv>^6>eu3yc-7VJ(g zRyn64YN!qf29R3Gn@w1Oq3PAXj#p{f!COBxRox6JX{xdSH; ztE|#xjsL7+G-g@kcow&%Hn%4Z$&%L@#6Q5^<;;Du%SzYo%(d>yziV*}JPBEBy4@`3 z+P8|Te9r`;^gM^aC2|ES2%P%{qjo<0Uk>T=pp93KP41MSD?Gmt$3jF2Bs6{NIr3M% z8XulRh*HDaHKoM=57qXY(tm-)-w1W2BDL|7i~~WdDAkDCG-_2)6HhYMVH+7kuwam9 z8NxKFHRgOj{(tV2W{?G?l|e;Bp%0-Dw*@%$LkfK)7CSK+%U;lauk7%fNWrunbDbWB zieP^EMIfWkiJA&Ni6I-O#xdZt0869orVt?m6U`4EQ#vLTffz^cW%@evU?{8;Ms8bDl1@qNR8lDc=j1@0~0+K?gy0 zT^@tv78F9}0A?eO9jk^bBpWQlQBDYfSMsL!v|U6$UAHKcaJV9G_$X=W)|XmYx~1~c zJ*F|E?;^V#ewR(l{b(Y{Y+o}CkADKU-_>mgbE*6Ws397CxrD&uSx@xyFSg2#`_fIi zE*N+!0h*+rN&@8}3U?5=y2md&=s0%Td+fA>FN-DDBWdPX`U5p1_gxw{optU_YQeKa z7AQ_53+3!dpa1Z#V{9ghNI1c43QLDKy`(SY1k#Zn;_=$kLD!1~>H;h4HOMM3cQU|r zQQhh7cm-SJ5*VRQ`NMDfR61scudo{U7mekv%UyStJb*1!^9YG;+uerrTr)wi3+1l; z<9Yiv8u7OM={O|QKX48&H&yZ4SUsssi5W=tVM*54=(F=9remaGU?cjTUaBwGd19vb zfV{kS9}zQ7*kpa8;=6I)Wjf z5wJ!(b?Hg{PKKXvZ&fFw6+rZ`Vz|@e@cR9_-7Gn27%-R8XZd>r!tn-*PAAr@mX-SM za?nlyszR0yby_W6z~24Mz#V|s>p!8($kU72q`9v)OH~@AUI6HnosLM+7aHjG&4_=8 z9Yd@m`YR`E#IkR-HURFWwFKFdICav%Nnd5YQa`=w?AiP8H^t!U@vQrH`jPs*iqliN zr2s|dnCXwRG(cNNI0YLO*yBBkyXcv2dv%m&U)!C~l^up`uDIGqlgO^<5aI1LP`ypI zs@jIR@O1JU)MRcC)YtU^5=0Ut-|4}yKbnH@5Ff+24MoS&3EZEO2xBDcsj}gG!N}wn z*m*nPK-B5M+avGIt~0wpU+(DZ;+7dQk-(y!n{c$uenP%$Ohpp|=tJO2lX8U*n$yMN z3g!93#|@kpjsop8m&Adflp>8WHxqSTaSY-f916yu#|<|TACTB(RbULn@XeX^?>YlC zqYUL7g^}KTuXv0Af1x(?uUL3+)*l+UG0v7-XgZ+i7N;+u#}mNjkCxtz7h%pV^k@## zp!Q@kbvVUeSDq#D3Y&ANq&NJ~wlVlgI-)_n$a(1Pj>dKWUW)F9v-%mExC>>?oc+_L z3QQ@#zNeM_0P9qiB@)Q#(lngE>v*{v!5S_(P&>1>`j|uCnN}dJpW0wLA=)jDuyj=# zUN1!J;?e>$PBrhnlNdYc#{88N!6Bf=Ap17!8nf;_w#xqX;(# zhUBtBNlGav4URT7m7Al6St$aw+5ohb0V1|KRmN^?=WIw=8(cUf~408@V-oU_m|#d||V=n@jGPXo%z+Lo(L)oDs`Fg?z;~s(yrV2wx z2)FtCi=lD@u;}2ERZhYh+Z*M}qleW&dj}NPQe_qhme7k}2*0pQx?gxa9NXrH@p|S5W;skMSKeGP)-*8gj<6AK_7r4SQNo)o zV)p0yD2ENNP-p&J!Zoh=v;yk!*$ipa4{}gJk_NMQvDR&OWmH8W%MG*84>e-XSx$?| za8yrdhKZ?fZ=!YFFBP1MDFr%H%;|AElURI;j74&nCr_}4uqU^&aCCP7i+wg6%7lV|Hb0SF)^9_`-3=D;=z zp&N926I27@Vgusd^sok&{>z&rNCUQKgqLILyG!9TkIP~Z`T^P|`Y8qkl@#VZ z#Q1$0VX_VN$1GAMkEbnrt6(FIwqFAK6Xv2ya7o1a9UX$pM$U9+MHS>2ZK?M-s&+ps zo@SQ;$L`yPd*9K{ENZ4ob!=j|RGZL9TV7$`XZ2hAx~|cY8A4rAd?P+$ZPmaMw9czC zQ^nmRUUg`!4}{T4(nKv(+AP5&QzB^f(&dnD&WI>ijGf5&(P3|#jMtKdUY1oN#U~Lp zudvg~N<4J9L7LO)qtI9MlN;;W%A=Q&xU=@0gHF$xIvOzlR7xiuhuxNX&q+4ynrk$s z=~28n(Zl$Q7{1K|XYSGp+5AXUDOJdpxNHSpIDD+>ty}R|#PuW2Ctl1~s+%16!Qyoo_l)uAU?NaImv*w7J~Pcc7rdkARJ`LYT+m8`N|Lo9Sv$ZH z+OtpoGm9&vuz)RH=jK^mMVBO3>=Pt#D=?ALB@TE@w}cb4x;d`m)n6of7&>gW`5nfa z$P%3{Pi=sM5-s?aFNjTbH$6J#2T44gE6na&^?Y%2`^B(-5++Xs`H$b?j^RmFsf^?I zLq0#5T4}#U5-xpWL`JT$IlzjrVMn2KScSQObkk{|Yx1e3N-T8hNZnYb3=G>4+t0o40 zX4&05qYH38)29S(hTimKv+4|@CVENVK4e$?6k}Tv`@4u-fu~H8$|~X{#RnyWxUtOJ zJ5+ra%n@=(5_2u89{ft)*e>obE8a0|J*T06efdX^HE@3<&pFRcNSC5Z1@=PK&wIaM6L72oOtjHWy@~TRE?y201 zj_Mv-3Nq9WROAsNqVFqAF-rf+ST8K)q>se5!U}kYqUk?-uU_#AoMM5VM)sIneO%@U z1)eZV@7S1)CfsIR#Jfclp6Et!oRHt*Yo5~6qy67f+ZuVgsW4N)PY+e4c!~qn>)f9N z;PgnHxfkL_Dif#j?H~ccI|3$debG?E1@ZM(pKG=U%vWRUA#Eu-YvTSzs;jB(1w9L^ zTLkYidgEM$Pr=PT`0PI8H`UVp1*oG2v=CNG;gb_*;iOBF@DF>1)`AC9zLt}$QQ1}b zVW}IOewjXy%Hl22AQ6F;NI{zm+Q%^ps0e)KV-;Q;2FOR5+O&|xhi+#qX8i#p*E8j> z9@=if&w6LRcIWu3JEMU9eAS|e19n}cPx)AB6m(X+!N22*a`_E{O9vXVdx>vHpP1)4s4^4@_*t zO7{(^%|xKE8t})mBO03zymFM9?7*0GfrRCX6ZzHAv&9Jze!c(LB29fi8C%0rSF{Bs zca;tL!)wxG~cc!VY5i@#1C{ny4PrnZkY5mA8Y3f7VWch~HimQfvqwy&{G7Nc=bfA30q zx*dk@xOoeuiaSC)m8NT$zF>iT6eLqC42cY$`oI?lRL2)(XSSf(wR>8%LK84IFLT}@tei+j(%fd>$icV$oCkfL=s^EY}*Po%bv0^_^Ua8GXKtjlMM z{0U!* zPPi_NKviFan#zwuuEgDFn(X&t^JzydFHnPJ0l>owH+VBm{&0K^b z6p!Yvy23!;0vDks`2oTZL?2&BV%3}7n?=K>dbMK83-lzVh#YhjsNd%ktu%MENwiA z1-4eAu&JVN*Eg&nF?+7_bD!jRYB_m#F3)bmpkno{OG+Jm^5-^MZxbxyi2kzTRs!-F zEYMln5VLBv@p|!IA}&X$UW>hgXmGbP&U4%0H?g)jaP5Uj%*@4p{6R{2>vF)COk3^r z+T+Es&xNr5wZKX@%)d|gv{c5SQVg-H^9eo!t9o({;WAOt>J9Ak4k7b40Ek1MrPW0dFA;{yE5Ex520y!g-)!&gDwht!==>1kix>y zv_HbhMl^^D5hxZYY7h&>>g70-T6>ci1(xtJ#0eKSea2)z;-I%IRpI@6kV(m8O2BX} zmOHy?o6`!mv33u*AH*Em1{|JKFTad6!dO z7W%sFYtWC-+2z%c9CcE5elLNoEoHODK8(%r`%Bt9W6Aaa^8nmWq-hi%5?&)kZh=~= zo}Et6CI2aHUEo}-+J6*letlW*43oG83&S;QTaVWnj3y=$z8AkOQE7aJTd-=qKjO!) z^`DRJnbBy)nGFz|eVL1tr*z*ukTXoOjf-1;$QWPpKWjO3U?g-?27kHPKH+5=j4-qT z^Y_-B4P>u)u$xB#lMu0JxrT6E2!kwJX*t*;82Q6YYAr00>NF<6I2mLFOeathYyL)Z zP=^9Ws`lb0vXu#T8LPZzeG27roWCW@qsu1pZc&4JZ9CNyBeMqP(GAKhoSv!B{`;Nj zn!dscf#2(YrkB_>164xjEk!%9L{c2ymK|bbuG&_N;NoD#J{D z2kC3K{$BCqi1JvWam#R8-nW70!>iBwjQ6mlAfG~c9Qe_gK`&09?0N*y>lm`XekCzS zF|jPk>)dj2$P!Mws-a$O)kv8xA7?b6?g zEKz^lorHzW%cPl5Oc0Ujlaf!XX1v>%V16KzqtI5# zuhITqsMGaazkhzL63n75Jyy^C)xINr>bc3~6XF49Bda7m?c-1Fpv`yY^@4&|^vgd7 zpDBLs8L3}T0>!*lQ*cKDDg;=)kO0=$>hEma=nWqYWfoAdbeY21D znAZg>7?b*Ms*_G64ndTBb)l+b6Hi_%A?lUMWHeu+j^mQLO{DU7x}pg7c>e=ZEq_%7 z6Y|hPLq;7@;-bGRLToeXHE|a(8<%-i+$Kr(IkaCtC_FL6-jk&8*vG6t#cM7S5CYw< z7sO&BqBE^Es8u|q?fp{&ofkqdLBfi%sZAg*%V1xWLfdq!gow#?4*EBTdaT7i9Pi0QHejrpLMTd5XkFNWTsH}XlY>{F>p%men7&4_nCdt(p zjAljniGw~_fNFO@(bG4(zP>t1DGiYBpwXUaWD=0RDr$$MiPEUO=P56E3T8DJ9A9&r za}oG5wmXcxj{OOIqfviS=$B-*7t99}%U3UrDT2NjpA?;IYGN(yIJAG@bsR0)Wc-gw1&2iBX82A89o)uo)#s zGhAgb6sDEe`r~NZkRVvt8-3po>*=mAq*lx8Ji5umB3g|Cj` zAR9jyRo~Sv{cCT3b+@SrI4dQJQG0f4|E1EaB`YXiJmcH*-RzIU=?-Vs^*WM6{<`2T zCspu}E!1KT{%}~zz-`>Lo=$DAUufR@#(OcI`F%T?FDF2l2zQ$@@ZB_yGU&$Pk;(c9 znABm+l`OB)U?r^bGM)eO`=&59$coW|quR*2L|a)c{e>T0%-Y;4#x=hageIV$jKuy6 zx8RyYyeN?@Cr1aZ`^Q(b5_w!Yqlo=V7Ql-KGv!au*@Wg}`=RMs6Nwi~dlaU%$o4*D zD>?}=*qGJFkI>Ui%U9L3twb2E6&Kmt3z)|Sc=)zIpOvc>Kvy2^^u(IB7L0a6P&>S@}pA-|f#|s!JIrdiUOS z?o-cO?#;oBxb)nf&xFUB8Yjx~k8KqU_RkZsdDo;>+qjkiuCJLfw|2M&OWC7ySVOqs zf;-i?QVM^C$M3V7$zF}~-2G>O?5P}Wh67~!VP|TlW>n+*$K~CkUSG$UL{6YsB6?Fd-%iM9jpP{;;l5M22Mr8KHi?3oZ|CaNq5hBw*b+>j;rc!p zi@oo67*9)s=J+E@{jfTYCU?J0f}i4{D}V9SR_cvHg^s;p^sPPenB{WqXV_}K`n)<} z!w(u^KmQIf`OgBve$at%ssBitz~48ifxNj|)l_*jz-}qwbgAJUGGXQZa=+-?ws$Rh z(cg3PgJlybp2&a|;&CmXTih>0YS9-8OdUjofuU%3WEcXU^i=cZy|-0(S^n}RyfRV? zqdMKm38%|3#dA|IeWaY#nDKlp=GY`&J*|qT(|9E z&{4>k?a0tbni-i&ACXHU)jV%wSzG6Qj?g(n)YZWAID@dd}fUqA~%FKOUP;|ZGJtxt$1~N*uI4$Kp0roQ>+{i*7*R-Ee9VtD5O-u zVk==Wg_f$Kn0Ca)1ake&Q+@MA5!B3oK3tso7e z+%`7+^S!W_4zo2>w+pT1=JzeN5qSYS{l%NrEV{@?4(Hh2^CgEB94io(f^Q_DOS#A# z$gOLEu=kh}Wv=6%kviiZGVkF?e=iqkFU)m?HeyYR620ebY}qrhm;D#VEonW)4?1O3 zFLtaCWX&_~z9}vGY$4%Sx_;&c_ z{z+L`aX}~P>sdc*56xbl!n&)|^e*z+TkNkX&BW|*T)^mf^or$4b2m}t!ksZ`L++;~ zS?agxk@T8?ha>vsmYG|uZ^`*1MaBESx7DP@{rhm<2B_HtCF>b27IS_UJM-D(WCf*UdmsapIB8S5 zNDkmBLlUA$?Th0G`8D!$ymy=MdckoYp8s2$_ITx?8YE$43rBtKBE}^Zuxm5L|Gsru zYLucv4H!iQynG~-Feb&@s|tP1A$_Mbujo4>Jy4kPVEHld^^9!!wt~U}0`gz@ewSgv z0A*Ory<=s|C9gRP9JJgE@;iKbiMzk&*sG$I4sh1~FZ7QzsKQ!tHw^>)l|%Seha;3D zyq&Hkj`q<)o56F30{)7woR!$8xWBv~N7Je#TYcI_I?N%oC*IJzx0eMUGCW!VQ zI<->sI<=a+f4g`4u0Q2twyaPiOm{Zvej11K?C&OFwcI=ucUdjP#iy2filGl|>gHd3o{$(k9(miB%mM8?bVwH3{Z}b+`K`fY+t<2mmQr4XT&F=Pfox~+sSrir3Y ztzxmAJqX9fu&%^@RUG{f^p>=5el*e9fD_Gq3iTZIx-O6Q&RVfb< zekxVlL-T0?%zq}0HXX6rpKPCC3>>B6RvTXC%(MK`|)z`+uHQ@dj zY>kwwu=wFbYL1l&deK*&OmUPvA>#4`AaOIFa^+%BOs%B8Apl1odKEl6-UqNQXgTkw zGS6Y_IZA7ZwPF=O=#pSW(2>tGsIPWB4iXU(vAsfI%Z~Tx_!V1Y8cECHi|8PGeL zUz{x~YVrv~`x%urAmruC?cL>mh^>1Oh`!X3z}kaBtJ-pCOW_}~{g$NtvM=9~BTOho zV5oT%9~71&$)b;x)jUDwz!NC8j7qGVDXgs4jl8>8S2W1$aW#tjpB0i9Tti_sn$f{^ zUm&GLP*vkX&`&yPM_w!=%*E=1#Z;(^Rlgo@k({5x$eDxStn0ZKaCRdb2lgeau5NXl zmZy(5>36S*HWirw>T0&2ak_=;v=2xBh*EmB!bn1=5H7o$%{k1C)`I47n%6ke0e@PH zI5TG#S4JU8+M?SLiJKjZO9ZKWi&T%|Sp7{3dTRVs;vpYj_~IA{Sxk@?61}(M^*%tc z{6)Okr6S!n)v`=0(}!3Xi|yRV$xW;pk!B_vH~IePg*%mv;t}ry@rGIR*$wBG3jtp% z@Wr56S#ufsdzw&AxAOzmf;wq%HHJKxrs(5ZHP`h9q8uiQM1zLH7F~;@x?DV^)RQq9 z5L@d+z149@L&HGy%m8YJcoT)jhGZd-_9+>PRqAg)qY zEl3Fs=uYBZza5-T0+g`K{ct-*%-A|P#d+}&T`eQ?eTWC@QK5BH#BHjRFa{izO-p3O zUglykh=tWZf)Q5LeS7r_+ldn5=?gvwyG{bFI4#7zmFbsvSCN)e=Iw$-c#)2?|K{v7 zYk!v8@}k^Vxm_g)oalu#%HYUFV&>J`2|O6RFgqF4?S+%#I;caLFOM@4w^oy1=APgFL{o3B# z4FrfUl%HRC0KLQ#AGx&$K1EnuMd=mjle^vHrb6PU!I_viog^cN9s`Ir(u77H1u1&~Haf z(Jd$>vZnZc92<9H#>p5#(J{G1WJMT|FZ@>gRcBZ4s^P)il>eR^vm?o z6A|xY^*ECW$U~oFDr{mB9;-JeJ3y^P)_>GKc67=URGbgKT1pA;mHI#xh=G6f^uc9o zXCH?~Ns^`$H;<$wCLxAcp1uA3WEaAZE#%{TJQS?8DbFi8w?QP`hIcOxD}V< z;M~VUE_$et2BI!t8LJgb{guski!J@FI=j}W}-FcYFBLQ1A{WIhEj%i`^cX0yD0uBY|RhcA6|^5P6NiX{ivSAgkX{a z-oNyzi-dQ60tCag3Y(mM4!QO8X2KAjt(1vio`s=YB|#%8BwLv#gGD& zgIuHjFrh8-y#1f_MW%-THowY^R3C8eGGKWx_h#>xX*ld3hqT0SHx&QQr|eL^C^#De4cUbRj$XIhH7!kQOr3w<>Jc*w&AG( ziI4P~o|){w`Smr>bP;q-vRL7cvf;ibAj+f(ii<6XMW@rjXFKq(mQg$T{(nVe@3!<` z0A;NdYwXt@YBQ2}E1#6)KK(avH%Fro(Xoz0xcjo0uB#aHMSowWA!v~N6#12$8Xce@5WP) zG!66{jN1kGEEc`N!zW!tk#anjeL`CRdAoS8migcMh#Gq*AsH`jG@&bf zN9@T;nAj5Di*550VgwjdM7N7_18I9IEO8e4)f*Vi2Wsv1v z5Im||E#D+CJw$}HzKjvV#I_h;#x*(E{zUz=BdtsfR501U--3{`7mbC>3+8rAXIVKy^P<{MImJmIWGr(y=;1em?quf@JUK$GA}5ZA)9Z z(9iG4_c8zM=9e>Dd4hWOu17;q#J@_+XDda;+zphPjo+H=-AH6YsJ~NPS;taJDJ42K zBVUjEsYjO!{Fjm4t{fH>jfMXZ=P!WYgw9(}CEGA9QVpE6^2EsA_Hd@NsIfOl*n?wV zsgI@y{q??*h;veY_Y{i4F)s{PPUuO#1{nAKilI$4fACePV@i@og^HV?9rnskC$ZC% z?TH2;+-QMjzLnk)SaR^XlxjG#A67d&jUinQgkCBYJtqX$UJj_z^)P(4*nL1EC! ztPzjM0hoGdvBmyXdyYDllbUtmFyr(^ztG;JW=_nB@%3?UdWK%YD7Gt;pX2fxmb=b_ zo%SH{bxYgt(T$kmmnn`XQh+Q=7!c9BqYBSx?^xlCDbe7}xhCsJt6>xC_umb8_(0lHqj`hn9DVty%yb8(@6v zurzll(RmWp#%N*byLRo9>dk!CA;jPO?D@=Z7`(ZJ&*#u=FtX~NBy6;<@hv%a=`+zD zRcdxO{87fxzT*8Auc7y|)d*29b75l@8Pl$OyLjyN0|#LvPkNIl|7$rft)RSENpzD5 zoMj8w=-?-?L1laid~^Yy9+mh2BADyqADp2-oF=(2$&Cax@Hl7{6T0XL-`Rp)ZMc=b zZsB$@u(zCye)$)Z@adOss@0c!g?%j@np)L>;#T80F)-_M(}3@GcE_~Ic=UPgFm~!< zcb<2dQw96w$PT4^ysZXmzlkcSPg^HhY)#MxNufen={pGxd&cqT(Y!)Yw3XB z+u@n9a07Ok#zJjCYRkL2rQUh5G*Aaj^gkgO1$HzLDa!_VAN< zZUIzawHg2Ob4IeIKz|1cC-v^H)@P^hx-3HUu2z3~+RMly8Z9X}apk|w`F89m*R9jm zE#X3=oLVPQ_8*m%XbJ&f5->)1Z3w$ws0=GK^f~E{rOApQzIO=8)z{~bs%)!Z4YDWF z7PTm{FShRq2a9ZAx`6PcK?%>t*={%;Kr)Eny$YryJttNs&iFNa!D5JQI4W{Z<9|m# z1L!T?!3e-$3Df-hQ!M{D)c$0-;gITg#=9eq1f&@7FJ7!n_*&Iki6?WsBFLxDVyIQe z6JSE4b|0gRQphqHIJR;$`(tJ(o}AQfq&r+0&+1|O?-ZULe1YXdH+2y`69o?4XC5b|jX%T>s&FlQ$DLF_@luep4 w<`)VHQ+&*Bdm5wjpI_Yn_m{%|m%QO|g?Z~#T{!-GHbFp8lm*GuN|^@#KOTd{*Z=?k literal 0 HcmV?d00001 diff --git a/announcements/release-0.4.rst b/announcements/release-0.4.rst new file mode 100644 index 00000000..d053ba6e --- /dev/null +++ b/announcements/release-0.4.rst @@ -0,0 +1,75 @@ +:orphan: + +Astropy v0.4 Released! +====================== + +Dear colleagues, + +We are very happy to announce the third major public release (v0.4) of +the astropy package, a core Python package for Astronomy: + +http://www.astropy.org + +Astropy is a community-driven package intended to contain much of the +core functionality and common tools needed for performing astronomy and +astrophysics with Python. + +New and improved major functionality in this release includes: + +- A new astropy.vo.samp sub-package adapted from the previously + standalone SAMPy package +- A re-designed astropy.coordinates sub-package for celestial + coordinates +- A new ‘fitsheader’ command-line tool that can be used to quickly + inspect FITS headers +- A new HTML table reader/writer +- Improved performance for Quantity objects +- A re-designed configuration framework + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/0.4.html + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +In particular, if you use Anaconda, you can update to v0.4 with: + +:: + + conda update astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 80 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +If you use Astropy directly - or as a dependency to another package - +for your work, please remember to include the following acknowledgment +at the end of papers: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (Astropy Collaboration, 2013). + +where (Astropy Collaboration, 2013) is a citation to the `Astropy +Paper `__ +(`ADS `__ - +`BibTeX `__). + +Please feel free to forward this announcement to anyone you think might +be interested in this release. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Thomas Robitaille, Erik Tollerud, and Perry Greenfield +| on behalf of The Astropy Collaboration diff --git a/announcements/release-1.0.rst b/announcements/release-1.0.rst new file mode 100644 index 00000000..87ce644b --- /dev/null +++ b/announcements/release-1.0.rst @@ -0,0 +1,90 @@ +:orphan: + +Astropy v1.0 Released! +====================== + +Dear colleagues, + +We are very happy to announce the fourth major public release (v1.0) of +the astropy package, a core Python package for Astronomy: + +http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. + +New and improved major functionality in this release includes: + +- Support for Altitude/Azimuth and Galactocentric coordinates in + astropy.coordinates +- A new astropy.visualization sub-package +- A new astropy.analytic_functions sub-package +- Compound models in astropy.modeling may now be created using + arithmetic expressions, and the resulting models support fitting. +- Significantly faster C-based readers/writers for astropy.io.ascii +- Support for a new enhanced CSV ASCII table format +- A refactored Table class with improved performance when + adding/removing columns +- Support for using Time, Quantity, or SkyCoord arrays as Table columns + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/1.0.html + +Astropy v1.0 is a special release that we are denoting a *Long Term +Support* (LTS) release, which means that we will be supporting it with +bug fixes for the next two years, rather than the usual six months. More +information about this can be found at the link above. + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +In particular, if you use the `Anaconda Python +Distribution `__, you can +update to v1.0 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 122 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to include the following acknowledgment at the +end of papers: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (Astropy Collaboration, 2013). + +where (Astropy Collaboration, 2013) is a citation to the `Astropy +Paper `__ +(`ADS `__ - +`BibTeX `__). + +Please feel free to forward this announcement to anyone you think might +be interested in this release. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Thomas Robitaille, Erik Tollerud, and Perry Greenfield +| on behalf of The Astropy Collaboration diff --git a/announcements/release-1.1.rst b/announcements/release-1.1.rst new file mode 100644 index 00000000..4e6034c9 --- /dev/null +++ b/announcements/release-1.1.rst @@ -0,0 +1,100 @@ +:orphan: + +Astropy v1.1 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v1.1 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. + +New and improved major functionality in this release includes: + +- New functions to automatically determine histogram bins, including the + Bayesian blocks algorithm +- A new interface to transform between Table objects and pandas + DataFrame objects +- Support for table indexing +- Support for supergalactic and ecliptic coordinates +- A new .info attribute to get summary information about tables and + columns +- A new show_in_notebook() method to show a table in Jupyter/IPython + notebooks with additional interactivity features +- Support for new units, including logarithmic units such as magnitudes, + dex, and decibels +- Support for the Planck 2015 cosmology and significant performance + improvements in the cosmology sub-package + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/1.1.html + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you make use of the `Anaconda Python +Distribution `__, you can update to +Astropy v1.1 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 160 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +As a reminder, Astropy v1.0 (our long term support release) will +continue to be supported with bug fixes until Feb 19th 2017, so if you +need to use Astropy in a very stable environment, you may want to +consider staying on the v1.0.x set of releases rather than upgrading to +v1.1. + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to include the following acknowledgment at the +end of papers: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (Astropy Collaboration, 2013). + +where (Astropy Collaboration, 2013) is a citation to the `Astropy +Paper `__ +(`ADS `__ - +`BibTeX `__). + +Please feel free to forward this announcement to anyone you think might +be interested in this release. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Thomas Robitaille, Erik Tollerud, and Perry Greenfield +| on behalf of The Astropy Collaboration diff --git a/announcements/release-1.2.rst b/announcements/release-1.2.rst new file mode 100644 index 00000000..794f04c5 --- /dev/null +++ b/announcements/release-1.2.rst @@ -0,0 +1,108 @@ +:orphan: + +Astropy v1.2 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v1.2 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. + +New and improved major functionality in this release includes: + +- A new class to compute Lomb-Scargle periodograms efficiently using + different methods. +- A number of new statistics functions including those for Jackknife + resampling, circular statistics, and the Akaike and Bayesian + information criteria. +- Support for getting the positions of solar system bodies in the + coordinates sub-package. +- The ability to compute Barycentric and Heliocentric light-travel time + corrections. +- Support for offset coordinate frames, which can be used to define a + coordinate system relative to a known position and rotation. +- An implementation of the zscale algorithm to determine image limits + automatically. +- Support for bolometric magnitudes in the units package. +- Improvements to the NDData class and subclasses. +- Auto-downloading of IERS tables as needed, which gives information + about Earth orientation parameters necessary for high precision + coordinate calculations and conversions to/from the UT1 scale. + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/1.2.html + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you make use of the `Anaconda Python +Distribution `__, you can update to +Astropy v1.2 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Note that if you install now you should get Astropy v1.2.1, as some +last-minute bug fixes were found and fixed after the v1.2 release was +created but before this announcement. + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 190 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +As a reminder, Astropy v1.0 (our long term support release) will +continue to be supported with bug fixes until Feb 19th 2017, so if you +need to use Astropy in a very stable environment, you may want to +consider staying on the v1.0.x set of releases (for which we have +recently released v1.0.10). + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to include the following acknowledgment at the +end of papers: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (Astropy Collaboration, 2013). + +where (Astropy Collaboration, 2013) is a citation to the `Astropy +Paper `__ +(`ADS `__ - +`BibTeX `__). + +Please feel free to forward this announcement to anyone you think might +be interested in this release. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft +| on behalf of The Astropy Collaboration diff --git a/announcements/release-1.3.rst b/announcements/release-1.3.rst new file mode 100644 index 00000000..9677a6ad --- /dev/null +++ b/announcements/release-1.3.rst @@ -0,0 +1,110 @@ +:orphan: + +Astropy v1.3 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v1.3 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. + +New and improved major functionality in this release includes: + +- The WCSAxes framework for plotting points or images on celestial + coordinates in matplotlib. +- A new function in astropy.visualization to generate 3-color images + from astronomy images in different bands. +- Astropy coordinate representations now combine like vectors, with + useful mathematical operations that can be performed on them. +- Astropy coordinates and time objects now behave much more consistently + like arrays when they are reshaped. +- Earth locations can now be created from a postal address. +- JPL Ephemerides can now be used in the coordinates sub-package to + improve the accuracy of coordinate transformations and barycentric + time corrections. +- FORTRAN-style extended floating precision files like 1.495D+238 can + now be read using astropy.io.ascii or Table.read. +- Astropy objects can now be serialized to (or re-loaded from) a + standard YAML representation. +- FITS HDUs can now be lazy loaded, improving performance in files with + many HDUs. +- The default cosmology is now Planck 2015. + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/1.3.html + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you make use of the `Anaconda Python +Distribution `__, you can update to +Astropy v1.3 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 210 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +Astropy v1.0 (our long term support release) will continue to be +supported with bug fixes until the v2.0 release in June 2017, so if you +need to use Astropy in a very stable environment, you may want to +consider staying on the v1.0.x set of releases (for which we are +simultaneously releasing v1.0.11). + +While we typically do not support non-LTS releases, we are also +simultaneously releasing an Astropy v1.2.2, the last in that series. +This update is primarily to include a leap second at the end of 2016 +(but also contains other bug fixes). + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to include the following acknowledgment at the +end of papers: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (Astropy Collaboration, 2013). + +where (Astropy Collaboration, 2013) is a citation to the `Astropy +Paper `__ +(`ADS `__ - +`BibTeX `__). + +Please feel free to forward this announcement to anyone you think might +be interested in this release. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft +| on behalf of The Astropy Collaboration diff --git a/announcements/release-2.0.rst b/announcements/release-2.0.rst new file mode 100644 index 00000000..dba3bf56 --- /dev/null +++ b/announcements/release-2.0.rst @@ -0,0 +1,103 @@ +:orphan: + +Astropy v2.0 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v2.0 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. + +New and improved major functionality in this release includes: + +- Most models now support parameters having units (i.e., being Quantity + objects). +- A new CCDData class that is directly useful for typical astronomical + images and implements the NDData interface. +- Coordinate frame objects can now carry proper motions and radial + velocities, and will carry them through and transform them between + frames. (This functionality is experimental and feedback is greatly + desired.) +- Many of the typical mixin columns for astropy tables can now be saved + into ECSV files and fully round-tripped. +- The fft and direct versions of the convolution algorithm in + astropy.convolution are now more consistent and work better with + typical use cases. +- A variety of additions to the astropy.stats subpackage + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/2.0.html + +Note that the Astropy 2.x series will be the last versions of Astropy +that will support Python 2.x. Future versions of Astropy will only +support Python 3.x. + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you make use of the `Anaconda Python +Distribution `__, you can update to +Astropy v2.0 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 232 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +Astropy v2.0 now repaces v1.0 as the long term support release, and will +be supported until the end of 2019. The next major release of Astropy +(scheduled for January 2018) will only support Python 3.x. So if you +need to use Astropy in a very stable environment in Python 2.7, you +should continue to use the 2.0.x series after 3.0.x is released. + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to include the following acknowledgment at the +end of papers: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (Astropy Collaboration, 2013). + +where (Astropy Collaboration, 2013) is a citation to the `Astropy +Paper `__ +(`ADS `__ - +`BibTeX `__). + +Special thanks to the coordinator for this release: Brigitta Sipocz. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft +| on behalf of The Astropy Collaboration diff --git a/announcements/release-3.0.rst b/announcements/release-3.0.rst new file mode 100644 index 00000000..0d2250e6 --- /dev/null +++ b/announcements/release-3.0.rst @@ -0,0 +1,121 @@ +:orphan: + +Astropy v3.0 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v3.0 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. It is part of the Astropy Project, which aims to foster an +ecosystem of interoperable astronomy packages for Python. + +New and improved major functionality in this release includes: + +- Full support for velocities in the coordinates subpackage, including + SkyCoord objects and proper motion corrections. +- Very large ASCII files can now be read in as chunks, allowing larger + tables to be efficiently read in, along with other performance + improvements reading tables. +- Time objects can now be read from or written to FITS files following + the official FITS time standard. +- Table mixin columns (e.g., quantities) can now be losslessly saved to + HDF5 or FITS tables. +- Constants can now be versioned using context managers. +- Support for quantities in scipy special functions +- A new command line script, "showtable", is available to display tables + from any format Astropy can read. +- The pytest plugins for testing Astropy have been moved to external + packages, enabling their use in a wider range of Python packages. +- False alarm probabilities are now available for the Lomb-Scargle + periodogram implementation. + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/3.0.html + +Note that the Astropy 3.x series is the first to only support Python 3. +Python 2 users can continue to use the 2.x series, which will receive +bug fixes and support until the Python developers permanently sunset +Python 2.7 (scheduled for 2019). + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you make use of the `Anaconda Python +Distribution `__, you can update to +Astropy v3.0 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 253 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +As a reminder, Astropy v2.0 (our long term support release) will +continue to be supported with bug fixes until the end 2019, so if you +need to use Astropy in a very stable environment, you may want to +consider staying on the v2.0.x set of releases (for which we have +recently released v2.0.4). + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to include the following acknowledgment at the +end of papers: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (Astropy Collaboration, 2018). + +where (Astropy Collaboration, 2018) is a citation to the `Astropy Paper +II `__ +(`ADS `__ - +`BibTeX `__). + +This paper is still under review, however, and an earlier paper is +available describing the status of the package at the time of v0.2. If +your work has used Astropy since then, you are encouraged to acknowledge +both papers: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (Astropy Collaboration, 2013, 2018). + +where (Astropy Collaboration, 2013) is a citation to the `first Astropy +Paper `__ +(`ADS `__ - +`BibTeX `__). + +Special thanks to the coordinator for this release: Brigitta Sipocz. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft +| on behalf of The Astropy Collaboration diff --git a/announcements/release-3.1.rst b/announcements/release-3.1.rst new file mode 100644 index 00000000..cb9f6f21 --- /dev/null +++ b/announcements/release-3.1.rst @@ -0,0 +1,102 @@ +:orphan: + +Astropy v3.1 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v3.1 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. It is part of the Astropy Project, which aims to foster an +ecosystem of interoperable astronomy packages for Python. + +The focus of this release is on performance, but it also contains new +and improved major functionality. Highlights include: + +- Performance Improvements across-the-board +- A new sub-package for Uncertainties and Distributions +- A new Box Least Squares Periodogram +- J-style coordinates parser +- Support for use of Time and TimeDelta columns within a Table +- Array-valued Time and TimeDelta objects are now mutable +- Better uncertainty support and bit planes in NDData +- A new operator for Quantity performance +- Thermodynamic temperature equivalency +- Little-h equivalency +- Change in default cosmology +- Significant improvements in WCSAxes +- A new convenience function for imshow with ImageNormalize +- A common API for World Coordinate Systems + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/3.1.html + +Note that the Astropy 3.x series only supports Python 3. Python 2 users +can continue to use the 2.x (LTS) series (but without new features). + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you make use of the `Anaconda Python +Distribution `__, you can update to +Astropy v3.1 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 300 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +As a reminder, Astropy v2.0 (our long term support release) will +continue to be supported with bug fixes (but no new features) until the +end of 2019, so if you need to use Astropy in a very stable environment, +you may want to consider staying on the v2.0.x set of releases (for +which we have recently released v2.0.10). + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to acknowledgment it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__, but as of this release +the recommendation is: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (`Astropy Collaboration, +2018 `__). + +Special thanks to the coordinator for this release: Brigitta Sipocz. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft +| on behalf of The Astropy Collaboration diff --git a/announcements/release-3.2.rst b/announcements/release-3.2.rst new file mode 100644 index 00000000..5efc7b1e --- /dev/null +++ b/announcements/release-3.2.rst @@ -0,0 +1,93 @@ +:orphan: + +Astropy v3.2 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v3.2 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. It is part of the Astropy Project, which aims to foster an +ecosystem of interoperable astronomy packages for Python. + +New and improved major functionality in this release includes: + +- New Sub-package for Time Series +- New SI/CODATA 2018 Constants +- Additions and changes to Ecliptic Transformations +- Table performance improvements and change in metadata handling +- Table I/O integration of pandas I/O functions for ASCII tables +- Improved help on Table read() and write() methods + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/3.2.html + +Note that the Astropy 3.x series only supports Python 3. Python 2 users +can continue to use the 2.x (LTS) series (but without new features). + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you make use of the `Anaconda Python +Distribution `__, you can update to +Astropy v3.2 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 300 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +As a reminder, Astropy v2.0 (our long term support release) will +continue to be supported with bug fixes (but no new features) until the +end of 2019, so if you need to use Astropy in a very stable environment, +you may want to consider staying on the v2.0.x set of releases (for +which we have recently released v2.0.13). + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to acknowledgment it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__, but as of this release +the recommendation is: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (`Astropy Collaboration, +2018 `__). + +Special thanks to the coordinator for this release: Brigitta Sipocz. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft +| on behalf of The Astropy Collaboration diff --git a/announcements/release-4.0.rst b/announcements/release-4.0.rst new file mode 100644 index 00000000..517bd174 --- /dev/null +++ b/announcements/release-4.0.rst @@ -0,0 +1,100 @@ +:orphan: + +Astropy v4.0 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v4.0 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. It is part of the Astropy Project, which aims to foster an +ecosystem of interoperable astronomy packages for Python. + +New and improved major functionality in this release includes: + +- Support for Planck 2018 Cosmological Parameters +- Improved Consistency of Physical Constants and Units +- Scientific enhancements to the Galactocentric Frame +- New ymdhms Time Format +- New Context Manager for plotting time values +- Dynamic and improved handling of leap second +- Major Improvements in Compatibility of Quantity Objects with NumPy + Functions +- Multiple interface improvements to WCSAxes +- Fitting of WCS to Pairs of Pixel/World Coordinates +- Support for WCS Transformations between Pixel and Time Values +- Improvements to Folding for Time Series +- New Table Methods and significant performance improvements for Tables +- Improved downloading and caching of remote files + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/4.0.html + +The Astropy v4.0.x series now replaces v2.0.x as the long term support +release, and will be supported until the end of 2021. Also note that the +Astropy 4.x series only supports Python 3. Python 2 users can continue +to use the 2.x series but as of now it is no longer supported (as Python +2 itself is no longer supported). For assistance converting Python 2 +code to Python 3, see the `Python 3 for scientists conversion +guide `__. + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you make use of the `Anaconda Python +Distribution `__, you can update to +Astropy v4.0 with: + +:: + + conda update astropy + +Whereas if you usually use pip, you can do: + +:: + + pip install astropy --upgrade + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 350 developers have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     http://www.astropy.org/team.html + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to acknowledgment it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__, but as of this release +the recommendation is: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (`Astropy Collaboration, +2018 `__). + +Special thanks to the coordinator for this release: Brigitta Sipocz. + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud, Tom Robitaille, Kelle Cruz, and Tom Aldcroft +| on behalf of The Astropy Collaboration diff --git a/announcements/release-4.1.rst b/announcements/release-4.1.rst new file mode 100644 index 00000000..91cafe02 --- /dev/null +++ b/announcements/release-4.1.rst @@ -0,0 +1,110 @@ +:orphan: + +Astropy v4.1 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v4.1 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. It is part of the Astropy Project, which aims to foster an +ecosystem of interoperable astronomy packages for Python. + +New and improved major functionality in this release includes: + +- A new SpectralCoord class for representing and transforming spectral + quantities +- Support for writing Dask arrays to FITS files +- Added True Equator Mean Equinox (TEME) frame for satellite two-line + ephemeris data +- Support for in-place setting of array-valued SkyCoord and frame + objects +- Change in the definition of equality comparison for coordinate classes +- Support use of SkyCoord in table vstack, dstack, and insert_row +- Support for table cross-match join with SkyCoord or N-d columns +- Support for custom attributes in Table subclasses +- Added a new Time subformat unix_tai +- Added support for the -TAB convention in FITS WCS +- Support for replacing submodels in CompoundModel +- Support for units on otherwise unitless models via the + Model.coerce_units method. +- Support for ASDF serialization of models + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/4.1.html + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip/vanilla Python, you can do: + +:: + + pip install astropy --upgrade + +If you make use of the `Anaconda Python +Distribution `__, soon you will be +able update to Astropy v4.1 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the astropy channel: + +:: + + conda update -c astropy astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Nearly 400 developers have contributed code to Astropy so far, and you +can find out more about the team behind Astropy here: + +     https://www.astropy.org/team.html + +The LTS (Long Term Support) version of Astropy at the time of v4.1's +release is v4.0 - this version will be maintained until next LTS release +(v5.0, scheduled for Fall 2021). Additionally, note that the Astropy 4.x +series only supports Python 3. Python 2 users can continue to use the +2.x series but it is no longer supported (as Python 2 itself is no +longer supported). For assistance converting Python 2 code to Python 3, +see the `Python 3 for scientists conversion +guide `__. + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__, but as of this release +the recommendation is: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (`Astropy Collaboration, +2018 `__). + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud +| v4.1 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-4.3.rst b/announcements/release-4.3.rst new file mode 100644 index 00000000..b10a3190 --- /dev/null +++ b/announcements/release-4.3.rst @@ -0,0 +1,107 @@ +:orphan: + +Astropy v4.3 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v4.3 release of the Astropy package, a +core Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +Astropy is a community-driven Python package intended to contain much of +the core functionality and common tools needed for astronomy and +astrophysics. It is part of the Astropy Project, which aims to foster an +ecosystem of interoperable astronomy packages for Python. + +New and improved major functionality in this release includes: + +- Transformations to AltAz are now much more precise (and faster) +- Improvements in making Astropy thread-safe +- Performance improvements to sigma clipping +- Changes in the Time and IERS leap second handling +- Support for multidimensional and object columns in ECSV +- Support for reading and writing tables to QDP format +- Append table to existing FITS file +- General masked class for Quantity and other ndarray subclasses +- Configuration file improvements +- Support for different solvers and bracket option in z_at_value + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     `https://docs.astropy.org/en/stable/whatsnew/4.3.html `__ + +Instructions for installing Astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip/vanilla Python, you can do: + +:: + + pip install astropy --upgrade + +Note that this will yield astropy v4.3.1 instead of 4.3, which is +expected - a significant bug reported between the 4.3 release and this +announcement means that the correct version is indeed 4.3.1. + +If you make use of the `Anaconda Python +Distribution `__, soon you will be +able update to Astropy v4.3.1 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 400 people have contributed code to Astropy so far, and you can +find out more about the team behind Astropy here: + +     https://www.astropy.org/team.html + +The LTS (Long Term Support) version of Astropy at the time of v4.3's +release is v4.0 - this version will be maintained until next LTS release +(v5.0, scheduled for Fall 2021). Additionally, note that the Astropy 4.x +series only supports Python 3. Python 2 users can continue to use the +2.x series but it is no longer supported (as Python 2 itself is no +longer supported). For assistance converting Python 2 code to Python 3, +see the `Python 3 for scientists conversion +guide `__. + +If you use Astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__, but as of this release +the recommendation is: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (`Astropy Collaboration, +2018 `__). + +We hope that you enjoy using Astropy as much as we enjoyed developing +it! + +| Erik Tollerud +| v4.3 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-5.0.rst b/announcements/release-5.0.rst new file mode 100644 index 00000000..ed325505 --- /dev/null +++ b/announcements/release-5.0.rst @@ -0,0 +1,99 @@ +:orphan: + +Astropy v5.0 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v5.0 release of astropy, a core Python +package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +The astropy core package is a community-driven Python package intended +to contain much of the core functionality and common tools needed for +astronomy and astrophysics. It is part of the Astropy Project, which +aims to foster an ecosystem of interoperable astronomy packages for +Python. + +New and improved major functionality in this release includes: + +- Support for reading, writing, and converting Cosmology objects +- A new cosmology units module +- New trigonometric and spline models +- Support for dask arrays in tables +- Support for registering array-like objects as mixin columns +- Support for reading and writing tables to Parquet format +- Support for reading and writing tables to MRT format +- Support for masked quantity columns, including masked FITS columns + with units +- Converting SkyCoord to QTable +- A new unified I/O architecture + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     `https://docs.astropy.org/en/stable/whatsnew/5.0.html `__ + +The astropy v5.0.x series now replaces v4.0.x as the long term support +release, and will be supported for two years. + +Instructions for installing astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip/vanilla Python, you can do: + +:: + + pip install astropy --upgrade + +If you make use of the `Anaconda Python +Distribution `__, soon you will be +able update to Astropy v5.0 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 400 people have contributed code to the core astropy package so +far, and you can find out more about the team here: + +     https://www.astropy.org/team.html + +If you use astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__, but as of this release +the recommendation is: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (`Astropy Collaboration, +2018 `__). + +We hope that you enjoy using astropy as much as we enjoyed developing +it! + +| Thomas Robitaille +| v5.0 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-5.1.rst b/announcements/release-5.1.rst new file mode 100644 index 00000000..695db3f6 --- /dev/null +++ b/announcements/release-5.1.rst @@ -0,0 +1,93 @@ +:orphan: + +Astropy v5.1 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v5.1 release of astropy, a core Python +package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +The astropy core package is a community-driven Python package intended +to contain much of the core functionality and common tools needed for +astronomy and astrophysics. It is part of the Astropy Project, which +aims to foster an ecosystem of interoperable astronomy packages for +Python. + +New and improved major functionality in this release includes: + +- Updates to cosmology +- doppler_redshift() equivalency +- Specifying data types when reading ASCII tables +- Structured Columns +- New model fitters have been added +- Allow time conversions without predictive Earth rotation data (IERS-A) +- Uncertainty classes can be transformed into each other +- Schechter1D Model + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     `https://docs.astropy.org/en/stable/whatsnew/5.1.html `__ + +Instructions for installing astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip/vanilla Python, you can do: + +:: + + pip install astropy --upgrade + +If you make use of the `Anaconda Python +Distribution `__, soon you will be +able update to Astropy v5.1 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 400 people have contributed code to the core astropy package so +far, and you can find out more about the team here: + +     https://www.astropy.org/team.html + +If you use astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__, but as of this release +the recommendation is: + +This research made use of Astropy, a community-developed core Python +package for Astronomy (`Astropy Collaboration, +2018 `__). + +We hope that you enjoy using astropy as much as we enjoyed developing +it! + +| Simon Conseil +| v5.1 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-5.2.rst b/announcements/release-5.2.rst new file mode 100644 index 00000000..eb8ab4c3 --- /dev/null +++ b/announcements/release-5.2.rst @@ -0,0 +1,91 @@ +:orphan: + +Astropy v5.2 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v5.2 release of astropy, a core Python +package for Astronomy (and a v5.2.1 release which fixes compatibility +with Numpy 1.24): + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +The astropy core package is a community-driven Python package intended +to contain much of the core functionality and common tools needed for +astronomy and astrophysics. It is part of the Astropy Project, which +aims to foster an ecosystem of interoperable astronomy packages for +Python. + +New and improved major functionality in this release includes: + +- Quantity data types +- Updates to astropy.cosmology +- Topocentric ITRS Frame +- Enhanced Fixed Width ASCII Tables +- Accessing cloud-hosted FITS files +- Drawing the instrument beam and a physical scale bar on celestial + images +- Interior ticks and tick labels +- Support for tilde-prefixed paths +- CCDData PSF Image representation + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/5.2.html + +Instructions for installing astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip/vanilla Python, you can do: + +:: + + pip install astropy --upgrade + +If you make use of the `Anaconda Python +Distribution `__, soon you will be +able update to Astropy v5.2 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 430 people have contributed code to the core astropy package so +far, and you can find out more about the team here: + +     https://www.astropy.org/team.html + +If you use astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__ + +We hope that you enjoy using astropy as much as we enjoyed developing +it! + +| Thomas Robitaille +| v5.2 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-5.3.rst b/announcements/release-5.3.rst new file mode 100644 index 00000000..c23dd9a3 --- /dev/null +++ b/announcements/release-5.3.rst @@ -0,0 +1,89 @@ +:orphan: + +Astropy v5.3 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v5.3 release of astropy, a core Python +package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +The astropy core package is a community-driven Python package intended +to contain much of the core functionality and common tools needed for +astronomy and astrophysics. It is part of the Astropy Project, which +aims to foster an ecosystem of interoperable astronomy packages for +Python. + +New and improved major functionality in this release includes: + +- New flat astropy.cosmology classes +- New union operators for Table +- Efficient data access for compressed FITS files +- Added support for NOCOMPRESS for compressed FITS files +- New fraction option for representing units as strings +- Change in order in unit string representations +- Support for collapse operations on arbitrary axes in nddata +- Refresh cached observatory site registry for EarthLocation methods +- New LombScargleMultiband class for multiband datasets + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/5.3.html + +Instructions for installing astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip/vanilla Python, you can do: + +:: + + pip install astropy --upgrade + +If you make use of the `Anaconda Python +Distribution `__, soon you will be +able update to Astropy v5.3 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 490 people have contributed code to the core astropy package so +far, and you can find out more about the team here: + +     https://www.astropy.org/team.html + +If you use astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__ + +We hope that you enjoy using astropy as much as we enjoyed developing +it! + +| Simon Conseil +| v5.3 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-6.0.rst b/announcements/release-6.0.rst new file mode 100644 index 00000000..333067c6 --- /dev/null +++ b/announcements/release-6.0.rst @@ -0,0 +1,92 @@ +:orphan: + +Astropy v6.0 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v6.0 release of astropy, a core Python +package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +The astropy core package is a community-driven Python package intended +to contain much of the core functionality and common tools needed for +astronomy and astrophysics. It is part of the Astropy Project, which +aims to foster an ecosystem of interoperable astronomy packages for +Python. + +New and improved major functionality in this release includes: + +- Define Geodetic and Bodycentric Representations via their geometric + parameters +- Body-fixed planetary reference frames and their WCS description +- Support for Numpy broadcasting over frame data and attributes +- Updates to cosmology +- Updates to how IERS data are handled +- Masked Time values now use Masked arrays internally +- Reading and writing VO model annotations +- TimeDelta string format “quantity_str” +- VOTable now supports PARQUET serialization +- Faster FITS file decompression +- New GeneralSersic2D model + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/6.0.html + +Instructions for installing astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip/vanilla Python, you can do: + +:: + + pip install astropy --upgrade + +If you make use of the `Anaconda Python +Distribution `__, soon you will be +able update to Astropy v6.0 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 490 people have contributed code to the core astropy package so +far, and you can find out more about the team here: + +     https://www.astropy.org/team.html + +If you use astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__. + +We hope that you enjoy using astropy as much as we enjoyed developing +it! + +| Simon Conseil +| v6.0 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-6.1.rst b/announcements/release-6.1.rst new file mode 100644 index 00000000..4ca67c6c --- /dev/null +++ b/announcements/release-6.1.rst @@ -0,0 +1,88 @@ +:orphan: + +Astropy v6.1 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v6.1 release of astropy, a core Python +package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +The astropy core package is a community-driven Python package intended +to contain much of the core functionality and common tools needed for +astronomy and astrophysics. It is part of the Astropy Project, which +aims to foster an ecosystem of interoperable astronomy packages for +Python. + +Notable changes in this release include: + +- Warnings are now emitted when carrying out order-dependent angular + separation calculations +- Cosmology classes are now Python dataclasses +- Compatibility with the upcoming major Numpy 2.0 release +- Changes to the meaning of the copy= argument when using Numpy 2.0 +- io.ascii now uses 64-bit integers by default for integer numerical + data on all platforms +- Minimum supported version of Python updated to 3.10 + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/6.1.html + +Instructions for installing astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip to install packages, you can do: + +:: + + pip install astropy --upgrade + +If you make use of conda (such as through the `Anaconda Python +Distribution `__), you should soon +be able update to Astropy v6.1 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 490 people have contributed code to the core astropy package so +far, and you can find out more about the team here: + +     https://www.astropy.org/team.html + +If you use astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__. + +We hope that you enjoy using astropy as much as we enjoyed developing +it! + +| Thomas Robitaille +| v6.1 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-7.0.rst b/announcements/release-7.0.rst new file mode 100644 index 00000000..2a45eff7 --- /dev/null +++ b/announcements/release-7.0.rst @@ -0,0 +1,108 @@ +:orphan: + +Astropy v7.0 Released! +====================== + +Dear colleagues, + +We are very happy to announce the v7.0 release of astropy, a core Python +package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +The astropy core package is a community-driven Python package intended +to contain much of the core functionality and common tools needed for +astronomy and astrophysics. It is part of the Astropy Project, which +aims to foster an ecosystem of interoperable astronomy packages for +Python. + +Notable changes in this release include: + +- Full MaskedQuantity Support in QTable +- Coordinate frames can now be stored in tables +- Table show_in_notebook is back with ipydatagrid +- Ordering of table columns constructed from rows +- Table.pformat is now independent of terminal dimensions +- Quantity.to_string supports formatter for formatting +- NumPy constructor functions with a like argument are now supported + with Quantity +- Change default type for meta attribute to dict and update ECSV writer +- Improve the Contributor Documentation +- Typing in astropy.stats +- Converting units on dask and other array-like objects +- Performance improvements in astropy.modeling +- Fitting models in parallel with N-dimensional data +- RGB image visualization enhancements +- New Lorentz2D model +- Faster guessing of formats in astropy.io.ascii +- Support VOTable version 1.5 +- New \`parquet.votable\` format is available to read/write a Table from + Parquet files with VOTable metadata included +- New SimpleNorm class +- New SigmaClippedStats class +- Automatic placement of axis and tick labels for WCSAxes +- Support for masks in coordinates +- Minimum supported version of Python updated to 3.11 +- The astropy conda-forge package now has all the optional dependencies, + a new astropy-base package is provided with only required + dependencies. + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/7.0.html + +Instructions for installing astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip to install packages, you can do: + +:: + + pip install astropy --upgrade + +If you make use of conda (such as through the `Anaconda Python +Distribution `__), you should soon +be able update to Astropy v7.0 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 540 people have contributed code to the core astropy package so +far, and you can find out more about the team here: + +     https://www.astropy.org/team.html + +If you use astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__. + +We hope that you enjoy using astropy as much as we enjoyed developing +it! + +| Simon Conseil +| v7.0 Release Coordinator +| on behalf of The Astropy Project diff --git a/announcements/release-7.2.rst b/announcements/release-7.2.rst new file mode 100644 index 00000000..ba14bd19 --- /dev/null +++ b/announcements/release-7.2.rst @@ -0,0 +1,86 @@ +:orphan: + +Astropy v7.2.0 Released! +======================== + +Dear colleagues, + +We are very happy to announce the v7.2.0 release of astropy, a core +Python package for Astronomy: + +.. rst-class:: announce-logo +.. container:: + + .. image:: /_static/img/astropy_logo_notext.png + :width: 100px + + http://www.astropy.org + +The astropy core package is a community-driven Python package intended +to contain much of the core functionality and common tools needed for +astronomy and astrophysics. It is part of the Astropy Project, which +aims to foster an ecosystem of interoperable astronomy packages for +Python. + +Notable changes in this release include: + +- A faster ECSV table reader +- Generic DataFrame conversion methods +- Table index improvements and deprecation +- Cosmology traits +- An option to preserve units in FITS-WCS +- Concatenation and stacking of coordinates and time classes + +In addition, hundreds of smaller improvements and fixes have been made. +An overview of the changes is provided at: + +     https://docs.astropy.org/en/stable/whatsnew/7.2.html + +Instructions for installing astropy are provided on our +`website `__, and extensive documentation can be +found at: + +     https://docs.astropy.org + +If you usually use pip to install packages, you can do: + +:: + + pip install astropy --upgrade + +If you make use of conda (such as through the `Anaconda Python +Distribution `__), you should soon +be able update to Astropy v7.2.0 with: + +:: + + conda update astropy + +Or if you cannot wait for Anaconda to update their default version, you +can use the conda-forge channel: + +:: + + conda update -c conda-forge astropy + +Please report any issues, or request new features via our GitHub +repository: + +     https://github.com/astropy/astropy/issues + +Over 580 people have contributed code to the core astropy package so +far, and you can find out more about the team here: + +     https://www.astropy.org/team.html + +If you use astropy directly for your work, or as a dependency to another +package, please remember to acknowledge it by citing the appropriate +Astropy paper. For the most up-to-date suggestions, see `the +acknowledgement page <../acknowledging.html>`__. + +We hope that you enjoy using astropy as much as we enjoyed developing +it! + +| Thomas Robitaille +| v7.2 Release Coordinator +| on behalf of The Astropy Project From 066f8afa1cd6427f54ae1fb6604ecbac480d7fe4 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Tue, 20 Jan 2026 16:59:33 +0000 Subject: [PATCH 13/21] add back Python helpers --- affiliated/validate_registry.py | 135 ++++++++++++++++++++++++++++++++ getteam.py | 119 ++++++++++++++++++++++++++++ validate_roles.py | 73 +++++++++++++++++ 3 files changed, 327 insertions(+) create mode 100644 affiliated/validate_registry.py create mode 100644 getteam.py create mode 100644 validate_roles.py diff --git a/affiliated/validate_registry.py b/affiliated/validate_registry.py new file mode 100644 index 00000000..a0e2b424 --- /dev/null +++ b/affiliated/validate_registry.py @@ -0,0 +1,135 @@ +import os +import sys +import json +from termcolor import cprint +from datetime import datetime + +import requests + +REQUIRED_KEYS = {'name', 'maintainer', 'stable', 'home_url', 'repo_url', 'coordinated'} + +OPTIONAL_KEYS = {'provisional', 'stable', 'pypi_name', 'image', 'review', 'description'} + +ALL_KEYS = REQUIRED_KEYS | OPTIONAL_KEYS + +REVIEW_KEYS = {'functionality', 'ecointegration', 'documentation', 'testing', + 'devstatus', 'python3', 'last-updated'} + +REVIEW_FUNCTIONALITY = {'Specialized package', 'General package'} +REVIEW_DEVSTATUS = {'Unmaintained', 'Functional but low activity', + 'Functional but unmaintained', 'Heavy development', 'Good'} +REVIEW_PYTHON3 = {'No', 'Yes'} +REVIEW_GENERIC = {'Needs work', 'Partial', 'Good'} + + +jsonfn = os.path.join(os.path.dirname(__file__), "registry.json") +try: + registry = json.load(open(jsonfn)) +except json.decoder.JSONDecodeError as e: + cprint(jsonfn + ' : ' + e.args[0], color='red') + cprint("*** JSON file appears to be malformed - see above ***", color='red') + sys.exit(2) + +error = 0 + +for package in registry['packages']: + + if 'name' in package: + name = package['name'] + else: + cprint("ERROR: Missing package name: {0}".format(package), file=sys.stderr, color='red') + error += 1 + continue + + cprint("Checking {0}".format(name), color='blue') + + print(" - verifying keys") + + difference = set(package.keys()) - (REQUIRED_KEYS | OPTIONAL_KEYS) + if difference: + cprint(f" ERROR: Unrecognized key(s) for {name}: {difference}. " + f"Valid options are {', '.join(ALL_KEYS)}", file=sys.stderr, color='red') + error += 1 + + difference = REQUIRED_KEYS - set(package.keys()) + if difference: + cprint(f" ERROR: Missing key(s) for {name}: {difference}", file=sys.stderr, color='red') + error += 1 + + # Check that URLs work + + print(" - verifying URLs") + + try: + r = requests.get(package['home_url']) + assert r.ok + except Exception: + cprint(f" ERROR: Home URL for {name} - {package['home_url']} - did not work", file=sys.stderr, color='red') + error += 1 + + try: + r = requests.get(package['repo_url']) + assert r.ok + except Exception: + cprint(f" ERROR: Repository URL for {name} - {package['repo_url']} - did not work", file=sys.stderr, color='red') + error += 1 + + if package.get('pypi_name'): + + print(" - verifying PyPI name") + + r = requests.get(f"https://pypi.python.org/pypi/{package['pypi_name']}/json") + if not r.ok: + cprint(f" ERROR: PyPI package {package['pypi_name']} doesn't appear to exist", file=sys.stderr, color='red') + error += 1 + + if package.get('review'): + + print(" - verifying review") + + review = package['review'] + + difference = set(review.keys()) - REVIEW_KEYS + if difference: + cprint(f" ERROR: Unrecognized review key(s) for {name}: {difference}. " + f"Valid options are {', '.join(REVIEW_KEYS)}", file=sys.stderr, color='red') + error += 1 + + difference = REVIEW_KEYS - set(review.keys()) + if difference: + cprint(f" ERROR: Missing review key(s) for {name}: {difference}", file=sys.stderr, color='red') + error += 1 + + for key, value in review.items(): + + if key == 'functionality': + if value not in REVIEW_FUNCTIONALITY: + cprint(f" ERROR: Invalid functionality in review for {name}: '{value}'. " + f"Valid options are {', '.join(REVIEW_FUNCTIONALITY)}", file=sys.stderr, color='red') + error += 1 + elif key == 'last-updated': + try: + dt = datetime.strptime(value, "%Y-%m-%d") + except Exception: + cprint(f" ERROR: Could not parse date: '{value}'", file=sys.stderr, color='red') + error += 1 + elif key == 'devstatus': + if value not in REVIEW_DEVSTATUS: + cprint(f" ERROR: Invalid devstatus in review for {name}: '{value}'. " + f"Valid options are {', '.join(REVIEW_DEVSTATUS)}", file=sys.stderr, color='red') + error += 1 + elif key == 'python3': + if value not in REVIEW_PYTHON3: + cprint(f" ERROR: Invalid python3 in review for {name}: '{value}'. " + f"Valid options are {', '.join(REVIEW_PYTHON3)}", file=sys.stderr, color='red') + error += 1 + else: + if value not in REVIEW_GENERIC: + cprint(f" ERROR: Invalid {key} in review for {name}: '{value}'. " + f"Valid options are {', '.join(REVIEW_GENERIC)}", file=sys.stderr, color='red') + error += 1 + +if error > 0: + sornot = 's' if error > 1 else '' + cprint(f"** {error} error{sornot} occurred - see above for details **", file=sys.stderr, color='red') + sys.exit(1) diff --git a/getteam.py b/getteam.py new file mode 100644 index 00000000..08c966bf --- /dev/null +++ b/getteam.py @@ -0,0 +1,119 @@ +""" +A command line script that updates "The team" in the ``about.html`` file to +reflect the current ``credits.rst`` file from the astropy repository. + +Note that this first looks for the ``ASTROPY_REPO_PATH`` environment +variable to try to find a local copy of the astropy repo. +""" + + +def get_astropy_credits(warner=print): + """ + Looks for the ``credits.rst`` file in the astropy repo and returns it, or + returns False if the repo can't be found. + """ + import os + import requests + + creditspath = os.environ.get('ASTROPY_REPO_PATH', 'https://raw.githubusercontent.com/astropy/astropy/main/docs/credits.rst') + + if creditspath.startswith('http'): + #url - download page from web + u = None + try: + return requests.get(creditspath).content + except Exception as e: + warner('Could not download credits.rst from requested path: "{0}" Using placeholder for "The Team" page.'.format(e)) + return False + finally: + if u is not None: + u.close() + else: + if not os.path.isfile(creditspath): + warner('Credits.rst file at "{0}" is not a file! Using placeholder for "The Team" page.'.format(creditspath)) + return False + + with open(creditspath) as f: + return f.read() + + +def extract_names_list(docs, sectionname, warner=print): + from docutils import nodes + from docutils.core import publish_doctree + + if not isinstance(docs, nodes.document): + docs = publish_doctree(docs) + + assert isinstance(docs, nodes.document) + + foundsections = [] + for c in docs.children: + titleidx = c.first_child_matching_class(nodes.title) + if titleidx is not None: + title = str(c.children[titleidx].children[0]) + if title == sectionname: + section = c + break + else: + foundsections.append(title) + else: + warner("No section found with name {0}. Sections are:{1!s}".format(sectionname, foundsections)) + return None + + listidx = section.first_child_matching_class(nodes.bullet_list) + litems = section.children[listidx].children + + names = [] + for litem in litems: + # Use astext() to get the concatenated text content of the list item + # instead of joining node objects which can produce unexpected + # characters when their string representation is used. + names.append(litem.astext()) + + return names + + +def process_html(fn, newcontributors, indent='\t\t\t'): + """ + Returns a string of html mean to look like the input, but with content from + the credits file. + """ + lines = [] + incoord = incontrib = False + with open(fn) as fr: + for l in fr: + if l.endswith('\n'): + l = l[:-1] # strip newline + + if incontrib: + if '

      ' in l: + lines.extend([(indent + '
    • ' + c + '
    • ') for c in newcontributors]) + lines.append(l) + incontrib = False + else: + if '
        ' in l: + lines.append(l) + lines.append(f"{:>12}") + #skip otherwise + else: + # if '
          ' in l: + # incoord = True + if '

          ' in l: + incontrib = True + lines.append(l) + + return '\n'.join(lines) + + +if __name__ == '__main__': + from docutils.core import publish_doctree + + dt = publish_doctree(get_astropy_credits()) + + contributors = extract_names_list(dt, 'Core Package Contributors') + + newhtml = process_html('team.html', contributors) + print('Replacing "team.html" with updated version. Be sure to "git diff ' + 'team.html" before committing to ensure no funny business happened.') + with open('team.html', 'wb') as f: + f.write(newhtml.encode('UTF-8')) diff --git a/validate_roles.py b/validate_roles.py new file mode 100644 index 00000000..e3a42492 --- /dev/null +++ b/validate_roles.py @@ -0,0 +1,73 @@ +import os +import sys +import json +from termcolor import cprint + +REQUIRED_KEYS = {"role", "url", "role-head", "responsibilities"} + + +def assert_is_list(i, key, value): + if isinstance(value, list): + return 0 + else: + cprint(f" ERROR: Key \"{key}\" for role #{i} should be a list but instead is a {type(value)}", file=sys.stderr, color='red') + return 1 + + +def assert_is_string(i, key, value): + if isinstance(value, str): + return 0 + else: + cprint(f" ERROR: Key \"{key}\" for role #{i} should be a string but instead is a {type(value)}", file=sys.stderr, color='red') + return 1 + + +jsonfn = "roles.json" +try: + roles = json.load(open(jsonfn)) +except json.decoder.JSONDecodeError as e: + cprint(jsonfn + ' : ' + e.args[0], color='red') + cprint("*** JSON file appears to be malformed - see above ***", color='red') + sys.exit(2) + +error = 0 + +for i, role in enumerate(roles): + if not isinstance(role, dict): + cprint(f" ERROR: Role #{i} is not a key/value set", file=sys.stderr, color='red') + error += 1 + else: + key_difference = REQUIRED_KEYS - set(role.keys()) + if key_difference: + cprint(f" ERROR: Missing key(s) for role #{i}: {key_difference}", file=sys.stderr, color='red') + error += 1 + + error += assert_is_string(i, 'role', role['role']) + error += assert_is_string(i, 'url', role['url']) + error += assert_is_string(i, 'role-head', role['role-head']) + + if 'sub-roles' in role: + if 'people' in role: + cprint(f" ERROR: people should not be defined at top level for role #{i} since sub-roles are defined") + error += 1 + for sub_role in role['sub-roles']: + error += assert_is_string(i, 'sub-roles[role]', sub_role['role']) + error += assert_is_list(i, 'sub-roles[people]', sub_role['people']) + else: + error += assert_is_list(i, 'people', role['people']) + + if isinstance(role['responsibilities'], list): + for resp in role['responsibilities']: + error += assert_is_string(i, 'responsibilities[description]', resp['description']) + for detail in resp['details']: + error += assert_is_string(i, 'responsibilities[detail]', detail) + else: + resp = role['responsibilities'] + error += assert_is_string(i, 'responsibilities[description]', resp['description']) + for detail in resp['details']: + error += assert_is_string(i, 'responsibilities[detail]', detail) + +if error > 0: + sornot = 's' if error > 1 else '' + cprint(f"** {error} error{sornot} occurred - see above for details **", file=sys.stderr, color='red') + sys.exit(1) From 6c40ce8d7ead4e012b9a05cdd348aadfb3f07aa9 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Tue, 20 Jan 2026 17:08:32 +0000 Subject: [PATCH 14/21] Some other cleanup --- favicon.ico => _static/img/favicon.ico | Bin conf.py | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) rename favicon.ico => _static/img/favicon.ico (100%) diff --git a/favicon.ico b/_static/img/favicon.ico similarity index 100% rename from favicon.ico rename to _static/img/favicon.ico diff --git a/conf.py b/conf.py index 270f3a8c..ee3a3107 100644 --- a/conf.py +++ b/conf.py @@ -58,9 +58,12 @@ html_js_files = [ "js/functions.js", - "https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js", + "https://code.jquery.com/jquery-3.7.1.min.js", ] +html_title = "" +html_favicon = "_static/img/favicon.ico" + ################################################################################ # Other Trickery ################################################################################ From 47c17616e1d8ac2e301af57df7b4cfa1b88f7c38 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Tue, 20 Jan 2026 17:11:38 +0000 Subject: [PATCH 15/21] Attempt to fix circlci --- .circleci/config.yml | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7f084e43..87c8bf05 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,22 +2,33 @@ # # Check https://circleci.com/docs/2.0/language-python/ for more details # -version: 2 +version: 2.1 jobs: build: docker: - - image: continuumio/miniconda3 + - image: cimg/python:3.14 steps: - checkout - run: - name: Conda setup + name: Install with pip command: | - conda config --set always_yes yes --set changeps1 no - conda install requests termcolor + python -m pip install requests termcolor + - run: name: Validate roles JSON file command: | python validate_roles.py + + - run: + name: Install sphinx deps + command: | + python -m pip install -r requirements.txt + + - run: + name: Build sphinx + command: | + sphinx-build --color -W --keep-going -b html . _build/html + - store_artifacts: - path: /root/project + path: /root/project/_build/html destination: html From 073c927513781b789deb0c7505633d696ddd21e6 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Tue, 20 Jan 2026 20:47:01 +0000 Subject: [PATCH 16/21] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 43601850..1b72099e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.DS_STORE _build/ credits.rst + From e7e55f99de456d910d148d7273884373e2f8f635 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Wed, 21 Jan 2026 14:25:44 +0000 Subject: [PATCH 17/21] Use theme in new home --- conf.py | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index ee3a3107..82bc5fb2 100644 --- a/conf.py +++ b/conf.py @@ -39,7 +39,7 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'astropy' +html_theme = 'astropy-unified' html_static_path = ['_static'] diff --git a/requirements.txt b/requirements.txt index 1a43a497..3ecbd586 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ sphinx myst-parser sphinx-design -sphinx-astropy[confv3]@git+https://github.com/Cadair/sphinx-astropy@conf-v3-sunpy +astropy-sphinx-theme@git+https://github.com/Cadair/astropy-sphinx-theme@sunpy-astropy-theme sphinx-copybutton From edab2baa517b6f0a69a86f944efe300b70620a17 Mon Sep 17 00:00:00 2001 From: Stuart Mumford Date: Wed, 21 Jan 2026 14:27:28 +0000 Subject: [PATCH 18/21] Remove now redundant subs --- team.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/team.rst b/team.rst index e424a0b0..09da8254 100644 --- a/team.rst +++ b/team.rst @@ -114,9 +114,6 @@ Astropy project packages are under continuous development by professional astron .. include:: credits.rst :start-line: 4 -.. |Astropy mailing list| replace:: `Astropy mailing list `__ -.. |astropy-dev mailing list| replace:: `astropy-dev mailing list `__ - .. raw:: html