From 57a461bd07ce7a11f2d04bb133c14dc5b50f9917 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sat, 13 Jul 2024 20:23:27 +0200 Subject: [PATCH 01/65] docs: initial contribute guide --- .gitignore | 9 +++++++++ CONTRIBUTING.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index f0a64e0b..a61d98cf 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,12 @@ __pycache__ styles/ # Exclude translation .mo files locales/*/LC_MESSAGES/*.mo + + +# Exclude virtual environments +venv/ +env/ +ENV/ +.venv/ +.ENV/ +*/venv/ \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f395d91..d7fe4dc1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,6 +33,9 @@ The second approach is making your contribution directly in the GitHub website. ## Forking the repository Independently of the approach you choose, the first step is to fork the Python Packaging Guide repository into your personal GitHub space. +You can do this by clicking the "Fork" button in the top right corner of the repository page. + +[Fork and Clone GitHub Repos](https://datascienceskills.org/lessons/git-github/git-intro/3-fork-clone/) is a good resource to learn more about forking. *__TODO__: This section should show a beginner user how to fork a repository in GitHub.* From adb76245d89df0b6e8b10cd0fa698c1b121a8509 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sat, 13 Jul 2024 20:47:13 +0200 Subject: [PATCH 02/65] docs: add how to contribute in github inteface section --- .gitignore | 22 ++++++++++++++++------ CONTRIBUTING.md | 18 ++++++++++++++---- images/commit-changes.png | Bin 0 -> 35604 bytes images/edit-file.png | Bin 0 -> 62504 bytes images/preview-changes.png | Bin 0 -> 120971 bytes 5 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 images/commit-changes.png create mode 100644 images/edit-file.png create mode 100644 images/preview-changes.png diff --git a/.gitignore b/.gitignore index a61d98cf..58f6dc80 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,9 @@ -_build -.vscode -*/.ipynb_checkpoints/* +# Vscode +.vscode/ + +# Python tmp/ .DS_Store -.nox -__pycache__ *notes-from-review.md *.idea* # Grammar / syntax checkers @@ -12,6 +11,15 @@ styles/ # Exclude translation .mo files locales/*/LC_MESSAGES/*.mo +# Exclude Jupyter Notebook checkpoints +.ipynb_checkpoints/ +*/.ipynb_checkpoints/* + +# Exclude Python bytecode +__pycache__/ + +# Exclude build directories +_build/ # Exclude virtual environments venv/ @@ -19,4 +27,6 @@ env/ ENV/ .venv/ .ENV/ -*/venv/ \ No newline at end of file +*/venv/ +.nox +*/.nox/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d7fe4dc1..2e10b3d8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,17 +37,27 @@ You can do this by clicking the "Fork" button in the top right corner of the rep [Fork and Clone GitHub Repos](https://datascienceskills.org/lessons/git-github/git-intro/3-fork-clone/) is a good resource to learn more about forking. -*__TODO__: This section should show a beginner user how to fork a repository in GitHub.* - ## Contributing via the GitHub website ### How to edit a MarkDown file -*__TODO__: This section should show how to use the GitHub interface to edit and previewing a Markdown file.* +The Python Packaging Guide is written in myST, a variant of MarkDown. You can edit the files directly in the GitHub website. +To do so, navigate to the file you want to edit and click the pencil icon in the top right corner of the file. + +![Edit file in GitHub](../images/edit-file.png) + +To preview your changes, click the "Preview changes" tab. + +![Preview changes in GitHub](../images/preview-changes.png) ### How to commit your changes -*__TODO__: This section should show how to commit changes via the GitHub interface.* +When you are done editing the file, scroll down to the bottom of the page. You will see a section called "Commit changes". +Here you can write a title and a description for your changes. Make sure to write a clear and concise title that describes the changes you made. + +![Commit changes in GitHub](../images/commit-changes.png) + +click on the "propose changes" button to submit your changes and open a pull request. See (How to make a pull request)[#how-to-make-a-pull-request] for more information. ## Contributing locally on your computer diff --git a/images/commit-changes.png b/images/commit-changes.png new file mode 100644 index 0000000000000000000000000000000000000000..15a371cad8b3825af30a1d5ec979b15b68147458 GIT binary patch literal 35604 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

7C5UF2f?XgD`}JF0}3{ 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%0A-Y*KowiPDAXxn%}KR6 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 Qit(zcs-uEXy8G;Z0Bc}{K>z>% literal 0 HcmV?d00001 diff --git a/images/edit-file.png b/images/edit-file.png new file mode 100644 index 0000000000000000000000000000000000000000..b9951464e726abc9634ee42b53763786055c2bd1 GIT binary patch literal 62504 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 mL8S>>Nu(T+#a{ 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 literal 0 HcmV?d00001 diff --git a/images/preview-changes.png b/images/preview-changes.png new file mode 100644 index 0000000000000000000000000000000000000000..b9cda4a335653a88ef5d72acffe03919c4c9241f GIT binary patch literal 120971 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 F{{X-B1m^$% literal 0 HcmV?d00001 From 2229d53018ee9482648829b094ece543531563c3 Mon Sep 17 00:00:00 2001 From: Han Date: Sat, 13 Jul 2024 11:59:00 -0700 Subject: [PATCH 03/65] Update conf.py test to update the conf.py file in relation to issue #322 --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 04007608..6a15a229 100644 --- a/conf.py +++ b/conf.py @@ -109,7 +109,7 @@ "show_toc_level": 1, # "navbar_align": "left", # [left, content, right] For testing that the navbar items align properly "github_url": "https://github.com/pyopensci/python-package-guide", - "footer_start": ["copyright"], + "footer_start": ["copyright",], "footer_end": [], } From 8a82c31c6e4cee6d4708500923d8ebbbe4394681 Mon Sep 17 00:00:00 2001 From: Han Date: Sat, 13 Jul 2024 12:04:51 -0700 Subject: [PATCH 04/65] Update conf.py - breaking things test of "draft mode" --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 6a15a229..c5cacf05 100644 --- a/conf.py +++ b/conf.py @@ -109,7 +109,7 @@ "show_toc_level": 1, # "navbar_align": "left", # [left, content, right] For testing that the navbar items align properly "github_url": "https://github.com/pyopensci/python-package-guide", - "footer_start": ["copyright",], + "footer_start": ["copyright",!], "footer_end": [], } From fa6245740236e070ef42b6bd63bd102b26e43475 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sat, 13 Jul 2024 21:25:11 +0200 Subject: [PATCH 05/65] docs: add local github setup guide --- CONTRIBUTING.md | 95 ++++++++++++++++-- images/contributing/clone-repository.png | Bin 0 -> 13526 bytes images/{ => contributing}/commit-changes.png | Bin images/{ => contributing}/edit-file.png | Bin images/{ => contributing}/preview-changes.png | Bin 5 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 images/contributing/clone-repository.png rename images/{ => contributing}/commit-changes.png (100%) rename images/{ => contributing}/edit-file.png (100%) rename images/{ => contributing}/preview-changes.png (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2e10b3d8..0799b668 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,18 +44,18 @@ You can do this by clicking the "Fork" button in the top right corner of the rep The Python Packaging Guide is written in myST, a variant of MarkDown. You can edit the files directly in the GitHub website. To do so, navigate to the file you want to edit and click the pencil icon in the top right corner of the file. -![Edit file in GitHub](../images/edit-file.png) +![Edit file in GitHub](images/contributing/edit-file.png) To preview your changes, click the "Preview changes" tab. -![Preview changes in GitHub](../images/preview-changes.png) +![Preview changes in GitHub](images/contributing/preview-changes.png) ### How to commit your changes When you are done editing the file, scroll down to the bottom of the page. You will see a section called "Commit changes". Here you can write a title and a description for your changes. Make sure to write a clear and concise title that describes the changes you made. -![Commit changes in GitHub](../images/commit-changes.png) +![Commit changes in GitHub](images/contributing/commit-changes.png) click on the "propose changes" button to submit your changes and open a pull request. See (How to make a pull request)[#how-to-make-a-pull-request] for more information. @@ -63,31 +63,106 @@ click on the "propose changes" button to submit your changes and open a pull req ### Clone your forked repository -*__TODO__: This section should show how to clone a repository from GitHub into your computer.* +To clone your forked repository to your computer, you need to copy the URL of your forked repository and run the following command in your terminal: + +```bash +git clone +``` +Replace `` with the URL of your forked repository. You can find the URL by clicking the green "Code" button on your forked repository page. + +![Clone repository](images/contributing/clone-repository.png) ### Create a new branch -*__TODO__: This section should show how to create a new branch.* +Before making any changes, you should create a new branch to work on. This will help keep your changes separate from the main branch and make it easier to submit a pull request. + +To create a new branch, run the following command in your terminal: + +```bash +git checkout -b +``` ### Create a virtual environment -*__TODO__: This section should show how to create a virtual environment using venv.* +To build the guide locally, you need to create a virtual environment and install the dependencies. You can do this by running the following commands in your terminal: + +- **On Windows**: + ```bash + python -m venv .venv + .venv\Scripts\activate + ``` + +- **On MacOS and Linux**: + ```bash + python -m venv .venv + source .venv/bin/activate + ``` ### Install the development dependencies -*__TODO__: This section should show how to install the development dependencies defined in pyproject.toml.* +To install the development dependencies, run the following command in your terminal: + +```bash +python -m pip install -e .[dev] +``` ### Commit your changes -*__TODO__: This section should describe how to commit from the command line.* +After making your changes, you need to commit them to your local repository. To do this, run the following commands in your terminal: + +- To see the changes you made: + ```bash + git status + ``` +- To add the changes to the staging area: + ```bash + git add . + ``` +- To commit the changes: + ```bash + git commit -m "Your commit message here" + ``` +Replace `"Your commit message here"` with a clear and concise message that describes the changes you made. ### How to build the guide locally -*__TODO__: This section should describe the different sessions in nox related to building the docs: docs, docs-test, docs-live. It should also show how to see the guide built locally, by opening the right file in the browser or using the live version from docs-live* +To build the guide locally, you can use the `nox` command. This will run the default `nox` session, which builds the guide and opens it in your browser. + +To see the different sessions available, you can run the following command in your terminal: + +```bash +nox --list-sessions +``` +There are different sessions in nox related to building the docs: `docs`, `docs-test`, `docs-live`. You can run them by specifying the session name after the `nox` command. + +- `docs`: this session builds the guide and opens it in your browser. + ```bash + nox -e docs + ``` + To see the guide built locally, open the file `_build/html/index.html` in your browser. + +- `docs-test`: this session runs the tests for the guide. + ```bash + nox -e docs-test + ``` + If the tests fail, you will see an error message in your terminal. You need to fix the errors before submitting your pull request. + +- `docs-live`: this session builds the guide and opens it in your browser with live reloading. + ```bash + nox -e docs-live + ``` + open the local version of the guide in your browser at ``localhost`` shown in the terminal. ### Before you submit your pull request -*__TODO__: This section should describe what steps a user should follow before submitting the pull request: build the docs, verify your changes look correct, etc.* +Before submitting your pull request, make sure to run the tests and check the formatting of your code. + +```bash +nox -e docs-test +``` +If the tests fail, you will see an error message in your terminal. You need to fix the errors before submitting your pull request. +Also make sure to check the formatting of your documentation by building the docs locally and checking that your changes look correct. + ## Submitting a pull request with your contribution diff --git a/images/contributing/clone-repository.png b/images/contributing/clone-repository.png new file mode 100644 index 0000000000000000000000000000000000000000..b793fa517c222aca60f18e415e4c8ea7a0b96496 GIT binary patch literal 13526 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 Date: Sat, 13 Jul 2024 17:24:10 -0400 Subject: [PATCH 06/65] add spanish translation of a couple sections in documention.po - hosting-tools/intro - hosting-tools/myst-markdown-rst --- locales/es/LC_MESSAGES/documentation.po | 49 ++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 2f34859e..6e8225c6 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -8,8 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-28 08:42-0400\n" +"Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-06-28 08:42-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -22,7 +21,7 @@ msgstr "" #: ../../documentation/hosting-tools/intro.md:1 msgid "Tools to Build and Host your Documentation" -msgstr "" +msgstr "Herramientas para hacer y servir tu documentación" #: ../../documentation/hosting-tools/intro.md:3 msgid "" @@ -31,6 +30,10 @@ msgid "" "[mkdocs](https://www.mkdocs.org/) for documentation. It is up to you to " "use the platform that you prefer for your documentation!" msgstr "" +"Sphinx es la herramienta más común para construir documentación en la " +"ecosistema de Python. Sin embargo, algunos mantendors están usando " +"herramientascomo [mkdocs](https://www.mkdocs.org/) para documentación. Es tu " +"decisión usar la herramienta que prefieres para tu documentación." #: ../../documentation/hosting-tools/intro.md:8 msgid "" @@ -38,20 +41,26 @@ msgid "" "documentation. We talk about various syntax options that you can use when" " writing Sphinx documentation including mySt and rST." msgstr "" +"En esta seción introducimos Sphinx como herramienta para construir " +"documentación. Hablamos sobre varios opciones de sintaxis puedes usar " +"para escribir documentación de Sphinx incluyendo myST and rST" #: ../../documentation/hosting-tools/intro.md:12 msgid "" "We also talk about ways to publish your documentation online and Sphinx " "tools that might help you optimize your documentation website." msgstr "" +"Hablamos también sobre methodos para publicar tu documentación en línea " +"y herramientas de Sphinx que puedas ayudarte optimizar tu sitio web para " +"documentación." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:1 msgid "Documentation syntax: markdown vs. myST vs. rst syntax to create your docs" -msgstr "" +msgstr "Sintaxis de documentación: markdown vs. myST vs. rst sintaxis para crear tu docs." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:3 msgid "There are three commonly used syntaxes for creating Python documentation:" -msgstr "" +msgstr "Hay tres sintaxis comúnes usado para creando documentación en Python:" #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:4 msgid "" @@ -63,6 +72,13 @@ msgid "" " blocks and other custom elements to your documentation, you will need to" " use either **myST** or **rST**." msgstr "" +"[markdown](https://www.markdownguide.org/): Markdown es una sintaxis de text " +"fácil aprender. Es la sintaxis por defecto para Jupyter Notebooks. Hay " +"herramientas que puedas añadir a sitio web de Sphinx que lo permite hacer " +"markdown como html. Sin embargo, usando markdown escribir documentación " +"tiene limitaciónes. Por ejemplo, si quieres añadir referencias, tarjetas " +"de colores, o otros elementos personalizados a tu documentación, necesitaras " +"usar **myST** o **rST**." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:8 msgid "" @@ -73,6 +89,12 @@ msgid "" "the top as a favorite for documentation given the flexibility that it " "allows." msgstr "" +"[rST (ReStructured Text):](https://www.sphinx-" +"doc.org/en/master/usage/restructuredtext/basics.html). **rST** es la sintaxis " +"nativa que Sphinx apoya. rST fue sintaxis por defecto usado para docuemntación " +"por muchos años. Sin embargo, recientemente myST ha aumentando en popularidad " +"para ponerse una herramienta favorita para documentación gracias a su +flexibilidad." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:9 msgid "" @@ -82,40 +104,55 @@ msgid "" "many because it offers both the rich functionality of rST combined with a" " simple-to-write markdown syntax." msgstr "" +"[myST:](https://myst-parser.readthedocs.io/en/latest/intro.html) myST es una " +"cominación de `markdown` y `rST` sintaxis. Es una opción buena si eres comdo " +"escribiendo markdown. `myst` es preferido por mucho gente porque ofrece la " +"functionalidad extensiva de rST en combinación con la sintaxis fácil de " +"markdown." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:12 msgid "" "While you can chose to use any of the syntaxes listed above, we suggest " "using `myST` because:" msgstr "" +"Aunque puedas elegir cualquiera sintaxis listado arriba, sugerimos que " +"usas `myST` porque:" #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:15 msgid "It is a simpler syntax and thus easier to learn;" -msgstr "" +msgstr "Es una sintaxis más simple y entonces es más facil aprender;" #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:16 msgid "" "The above simplicity will make it easier for more people to contribute to" " your documentation." msgstr "" +"Esta simplicidad lo hará más simple para más gente contribuye a tu " +"documentación." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:17 msgid "" "Most of your core Python package text files, such as your README.md file," " are already in `.md` format" msgstr "" +"La mayoría de tus archivos de texto de paquetes primarios de Python, " +"como tu archivo README.md, ya están en formato `.md`." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:18 msgid "" "`GitHub` and `Jupyter Notebooks` support markdown thus it's more widely " "used in the scientific ecosystem." msgstr "" +"`GitHub` y `Jupyter Notebooks` apoyan markdown, entonces son más usados en la +ecosistema cientifica." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:22 msgid "" "If you are on the fence about myST vs rst, you might find that **myST** " "is easier for more people to contribute to." msgstr "" +"Si no estás seguro sobre si utilizar myST o rst, puede que encuentre que " +"**myST** es más fácil para contribuciones de más gente." #: ../../documentation/hosting-tools/publish-documentation-online.md:1 msgid "How to publish your Python package documentation online" From b5f296aa866594ad4c58b7cc1e985d3479e1c795 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sat, 13 Jul 2024 23:30:23 +0200 Subject: [PATCH 07/65] docs: add create a Pr and approval sections --- CONTRIBUTING.md | 30 ++++++++++++++++++++++ images/contributing/new-pull-request.png | Bin 0 -> 6123 bytes images/contributing/pull-requests-tab.PNG | Bin 0 -> 8799 bytes 3 files changed, 30 insertions(+) create mode 100644 images/contributing/new-pull-request.png create mode 100644 images/contributing/pull-requests-tab.PNG diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0799b668..15920974 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -168,14 +168,44 @@ Also make sure to check the formatting of your documentation by building the doc ### How to make a pull request +1. To open a pull request on GitHub, navigate to the main page of your forked repository and click on the "Pull requests" tab. + +![Pull requests tab in GitHub](images/contributing/pull-requests-tab.png) + +2. Click on the "New pull request" button. + +![New pull request button in GitHub](images/contributing/new-pull-request.png) + +3. Write a clear and concise title and description for your pull request. Make sure to describe the changes you made and why they are necessary. + *__TODO__: This section should describe how to make a pull request in GitHub.* ### What happens when you submit a pull request (CI/CD) +Once you submit a pull request, a series of checks will be run to ensure that your changes do not introduce any bugs or errors. These checks include: + +- **Code formatting**: checks that your code is formatted correctly. +- **Code style**: checks that your code follows the style guidelines. +- **Tests**: runs the tests to ensure that your changes do not break any existing functionality. + +If any of these checks fail, you will see an error message in your pull request. You need to fix the errors before your changes can be merged. +To get more information about the errors, you can click on the "Details" link next to the failed check. + + *__TODO__: This section should describe how to see the results of the CD/CI checks and how to get more information about errors* ### What to expect from the review process +Once you submit a pull request, a maintainer of the repository will review your changes and provide feedback. The review process may involve: + +- **Comments**: the reviewer may leave comments on your pull request to ask questions or provide feedback. +- **Suggestions**: the reviewer may suggest changes to your code or documentation. +- **Approvals**: once the reviewer is satisfied with your changes, they will approve the pull request. + +You can make changes to your pull request by pushing new commits to the branch. The pull request will be updated automatically with your new changes. + +Once your pull request is approved, it will be merged into the main branch and your changes will be included in the guide. + *__TODO__: This section should describe how review happens in GitHub, how see the comments, and how to submit changes (push a new branch)* ## Additional help diff --git a/images/contributing/new-pull-request.png b/images/contributing/new-pull-request.png new file mode 100644 index 0000000000000000000000000000000000000000..e40d55a899b5d9a48074bb011a6f356dea9f1fc9 GIT binary patch literal 6123 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 b652Ro2R!Lok?Ht+e7naF^&cSbzli!@ Date: Sat, 13 Jul 2024 17:36:20 -0400 Subject: [PATCH 08/65] typo fixes --- locales/es/LC_MESSAGES/documentation.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 6e8225c6..48cf022f 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -105,10 +105,10 @@ msgid "" " simple-to-write markdown syntax." msgstr "" "[myST:](https://myst-parser.readthedocs.io/en/latest/intro.html) myST es una " -"cominación de `markdown` y `rST` sintaxis. Es una opción buena si eres comdo " -"escribiendo markdown. `myst` es preferido por mucho gente porque ofrece la " -"functionalidad extensiva de rST en combinación con la sintaxis fácil de " -"markdown." +"combinación de `markdown` y `rST` sintaxis. Es una opción buena si eres " +"cómodo escribiendo markdown. `myst` es preferido por mucho gente porque " +"ofrece la functionalidad extensiva de rST en combinación con la sintaxis " +"fácil de markdown." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:12 msgid "" @@ -143,8 +143,8 @@ msgid "" "`GitHub` and `Jupyter Notebooks` support markdown thus it's more widely " "used in the scientific ecosystem." msgstr "" -"`GitHub` y `Jupyter Notebooks` apoyan markdown, entonces son más usados en la -ecosistema cientifica." +"`GitHub` y `Jupyter Notebooks` apoyan markdown, entonces son más " +"usados en la ecosistema cientifica." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:22 msgid "" From 38982a4fae9546010e5c51a5a1da57e4962df0b7 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sat, 13 Jul 2024 23:41:56 +0200 Subject: [PATCH 09/65] docs: add images for Pr fails --- CONTRIBUTING.md | 11 ++++++++--- .../contributing/pull-requests-checks-fails.png | Bin 0 -> 25629 bytes images/contributing/pull-requests-checks.png | Bin 0 -> 17614 bytes 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 images/contributing/pull-requests-checks-fails.png create mode 100644 images/contributing/pull-requests-checks.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 15920974..c6def4be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -184,11 +184,16 @@ Also make sure to check the formatting of your documentation by building the doc Once you submit a pull request, a series of checks will be run to ensure that your changes do not introduce any bugs or errors. These checks include: -- **Code formatting**: checks that your code is formatted correctly. -- **Code style**: checks that your code follows the style guidelines. -- **Tests**: runs the tests to ensure that your changes do not break any existing functionality. +- **Code formatting and styles**: checks that your code is formatted correctly, by `pre-commit.ci - pr check`. +- **docs build**: checks that the documentation builds correctly, using `circleci`. + +You will see the status of these checks in your pull request. + +![Pull request checks in GitHub](images/contributing/pull-request-checks.png) If any of these checks fail, you will see an error message in your pull request. You need to fix the errors before your changes can be merged. + +![Pull request checks failed in GitHub](images/contributing/pull-request-checks-failed.png) To get more information about the errors, you can click on the "Details" link next to the failed check. diff --git a/images/contributing/pull-requests-checks-fails.png b/images/contributing/pull-requests-checks-fails.png new file mode 100644 index 0000000000000000000000000000000000000000..e7072d93bb6242d4f46055ad3df84dbbfce985ed GIT binary patch literal 25629 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

9X;U3B;~m2vvl^@>>09?!&Ab1l8o zmn$84EijtXt7pLxNQ=%hmb6}H5Iy)uqh;Q<4&VsXnj53{wy2&1QpOOpcNO9%PhVR@ zztTS8sq7(2zQ>q=c_sHmKRIsOB^yIyG!iFe*I5kMIaSI;*X)p^fnHH_jzWkk{gC8( zrdR!T1R)8j>OG|RheC#FT&c*XF?THU_;!1~hEfNZfx3U3(^s9>vED0Yd;Dde&7kZJ z-;XA^P$kp%(MRJRCgoe#k+pN9}IE`e8D54w^7?GG-az9rcnLTMZK>n*>H0U;s>DTmyOen!YsFP z1I3+StB9_S5xfU`{Czpvkq`SFv5Ek36v3S3{3Ojs4H$qHC48{`E(?J@a(-7_P5kt#t0ZGAUYI|~uQ$ud$%a!3b*2~p z9&&>JwykU-r=15bMcRPDy8W+#4E%2Gbgf#gIjmiZ9PTon=_3<^F`e*r>U?gW%34yo zBk^tLdEgj-rfoRrO6Fh6(q3zzNx_8_h-ei^0g2@TD&RCLJD0G6{Cq9L9yb!9&uX~q zip>cITRHUg9M~TW)Jm*yHQHP1BQiJ1eq%&$nj1Niihg>uj|glA9>HCLl);)*QNrJ8 zDeTcoCjVc6IoqfE? zY5*Cuif(@54Oaa_DGkp@K`+8**im#4VNsnEq-JX`2FL~3>Rav8@NbuF)Q^c;FL*xo z+<$Epi*_WpW(!qaAgF=JLRNoyXJJiBwT{9B`Sf`# zA0JO;A)1U~`320AqUm1AqgB@rABqcCMr`-Rl=}Yxi|;{FsPhyWiK}ysU>jx9-OnQ- zO^&}dUe*EizE3oyY|177g{6#KM$F}|5shUveGEF{&b&0k&&{lpx?X>WOCPaUz`Jh^ zR2Ivn#9!$6#Iy8?yJYYWz^xRfAXancJC46w1{lmAZP0A>o!|M7OXAHNHfz@OySZgG zAK)TA1%JV=@QJNXg!?~%zW;?EBP0LPVm=ep2F_Q2 z=S3)+x{-Btb><)K!4v>Z!OPeYr9U;>DcV9*@~4K)J33IQFADY2`uh{T1OF3#J{?sY zT5Kd#B$xq&)-6u#%fWh;=~A5FGXUc1(aP!x(f-4${|C(6i;`gE%(-myoVn^W>@}j@EagoNPLk=Qy={IPpQ(&hgkmuHCUf2M@o1&J*%3uv~;do3{UpH zYacUtqrJ}%g1>?wv3<@(XMay?5)k``;!(ELyf?;9U>?Ei_dqf;I|o}@{Nw%NMISYP z-KQ^Rga?v7=xj!DUWh2w;>>`e88QSOMpo{w*Kz$PJnUywkyF!VJmPsTbPHs$Uhi>$ zpfmGx=!=`zQtJ`74*GvS6deh&OxzCUFfEH&B{ceY z(#9SH-QbSjT`DYnt?%?l@}Dz-ixs#NxGOV0h^1^myzV^MN|`SzXzmfVo+GB3j*Q9u z!M=VvZ!kbl`tNv5$|{PM!^Ifq@^ojede(A^vLZwb6dvJwBq-E6S7G`}(z=*?#sr>h z+3sLA3a9usmkR^CQKs#eH@QYp5!Mzs(E`aSlCI^X;S=c80N&%`?LvpH_n$jSx{Q_7 z?WTmjPijW3b(FVHG_Nd{vkE+xI$jq&em^Wi3Dy=yIAS`Ns+PM{lZ`E+Wmj%g{ODA@ zyk}{3lb4ut+!%-(oj0`#cNObB0n{rL&?}PBhi`dcEtyd}ovK(FrSy^f7155@ zMpk9COtvc&g8j!n34`Qh+!*A0Z>%KoevpH0f6 zu!%w4bmIpvJ4mL*^{sh&fYVluvB8+6HopIYe)WhGH!E;EtBU>bS3g*Y5z?xY5=tmY zaoI!NG#!OSb8IwsK`~9E&(7mHZvTTdB2KbLYHF|B^H=(Wy=E3YjRoD!#F9tQY zEQqbRbNyysi)=8A!Tc!0(f7P8>&(~N-W65laxdtFnqE>T$>9lagwNxb-Uu_Rx3Y56 zj?3fI-MfQrR2P??8$==K5g9t5<9_4a{mua#As{%StIO9>X5zejOaFdI8dO%+vF_;O z%}!iZqf;4%2dU$|+*mndR9)P6K!L+!bW7?fAg03z-_j^OZQnp|aEE+Bd6Uvlt9mZ9 z-%RfF%i^|@HvU!*V=g=SxeOu&VVClhEL&gRuu1p|;qScjI-&WMkL4QmRv6 zN+{Tk`Oz06+rTW*-P^^G!P;AU7wMLifCn1#K-r|xrN9z%h%bkaIPZG_A3c+qh15&p z?{5KYdfj}QqnNfnuKVs{u3lBj3iIfy0zUh;u~mxAi}Q}#>jlS>`_Vbe-lv~}&qlo9 zWnMHQ#QC{h{wf@ZQj1FaC5?J5GQQoLmC1V*Sv$iz-4+I)5QyD=a(>MZ?W|$wi%au? zZ>GP^m*ro32j)VKu#a6VQ&jG^s(5v!YC@ew{f{+0m^c#Et&(7Um_6UM&wD0*TxeAXo}a06tm|r^GLkBoh(qqCwEu` zgAxR?_>UGed=cKiL__%Ez1(HRj<&u7xxp&DVsFGI-d%>iyBxsRTJw}0`cs;CYRmlo z++K@iuQ}O#bBzmjv090&5_yX*K5W}up+{l=;JMMo`UuW3q0&WbW#7p8Hr?(rcNfOF zyPe{yWZ8K$$o|(|7G|&IiGl);Cd2Z<)O%s)HvINpj1cPXCap7v`>cFJJUtI;)e?^N zu0O&kc{H5hW}nEo5SaNyNE>hG-T9BvGw83(V?Zh*@Uida_4z0IQm7K~duYzHCXX3I z5%gKIt}L*R+I07f9E&WAKH|=Hd@`Hj^z{wf>xVw#BD-oQ$>)|GSxv%WA3J9RFa`T@ zQl9Bgk##N@SsS!e3Ye1Jv=}`RWrPu!Nt8o_3pZxk76CG`FWr4B!)n~T3rfKZY2b@l zl)%XQR$#dobL+Y5f*4(`Twry7Nxfx+8^Rd+e$BKxs|)|gpK#|>_d5gVj&_mBBpx+5 zc#5)WUmg}lBoK0LO6TU}v>l8!9U9#Roj)d*9^11E8zw-$A~2YT8x>iHcTVh2v!S$y z;}R}P>VP@>+6=ye#KqL{b|VsR)17wSY2MeB$q3U(+WyRqxRleh*S(L*{IwWGAYaWr zHTRHqt_{*W-aNZmODaiFJ}rUz%FKlH3ID8wq0$YJ5ZlpFQf$ecS!7m^2P~Ia9`-ft z6>OIgyhjs9@a47)c9QeBD&Gbm+M5~W$m$~z$4|>-<1%^Bqia1gh(-L?q176mm6_5` zZ0(T4adc4f+47Gk2brI3t$Ee(_%B!wSSzgSgaYgD9l10=62zgR?SAcQ6acI2+Bsua zGUac@ymsVOvYK>ksC8NzH?43CR6K91lG)2LZ=7)V3G)o*({c_Zovgmxff=T7M}AuM zOd|nC1nUUpMVi5#_AsUK_0;^jh0Z7ju=@b~;n`iHKoMwgYm4SOzs-~6A@KUv>5rB} zP%_ygCZ)lX6004Sd5!N4&b1I#Dbwv$@a9&`ksI&Dz!FjGnaHp_$=c5t#4OHcS#pD$NNdwhGP^ha&TJ{7FOe*ktR5QH zPqM2Jeb;yK`n#Bl&%C^rZ*npbigu!peHDVI2POTJQSK`D&O_?_F8(3<&=ZEttT ztl>3VPxZR9^Y<|AoS3}NK_*3UD_qo3tClec;17S~nqNWH6s~wlQye{i*Ldu&P-arTBWY?BR1M2)^vOsmSK)6lnDReVHjZ z?6xQ`m?8dVVc<)}_DsW~=a!!z={=y>ZB7w)OJsfERo8c_hwP-*hH$0YoE0xDl`QTowmx_vd$&3a3X-Kw#aD{|EJC~^9H;8e+vGB(ZkR8B*gM(p@ z@6S3$SfMt_`jaCxu7IWl+4!rx^Sz!__K2yEaAGopj^fty^5CG7rX%umQzZ=hLd-8~ z8l6&G>e}6U4Exp-vt;);(ZFUV4YAtti}cr{ww=Kjl*q|LMrMGkIOj)o4j2;(SakDV zE%{X^6s*n~IMIj4*~c^=?t%r%Vo3kz)de*N%aSc+!5vG5$9BHIvFLNOzjLm32gH7Z)a~{S6o* z1`b5^=JII11X(=n7y(Y-O9jN>LLYB*iQbdt4lOlCy>!oJ&PD(}2+xL{V_Y5! z9aKG#yB*yK5zhDp3wz+$_e|?M6b!p^PUwbQP<1tS{EclR}vj z!*#mQfze3fR{Fe8+S1j#In~44r=uJoF|tI?lUK}hxV3*F4~a5ODIGDVc~0l<;4S4_ z7W1+)J9k(v^$YObr1kd4S1jGk27lOL$16g}Ool`#_ zT^WqtIv}4-laW#Ero2i7Q67iYO1_EkN)X)qqi>V*{MSlqw^HKs?@svn?otx>7$h~H zdMgbCdBhPhU*=VQcZoXBbP1gJgp>XX-=bQ7LQ9!4r8WT`3Q}?_cisOugqfWTd5f7A zAI01B}f16hy=D8CYQES4Gd` zIqc8bc%Ae76-uK4;xAsjAU2<7)|#7lfV?%vzjbmd=(%JIzUkT9Ik9bdk(zKnE%abj zwAed|EXMS5D9|EsEts;#Rx&<)yIJ8olSWM;w@ZuhSM}wimZkc|mnrSn^J8gGd#rv4 zz4MNRmUYoG-#oy|pC1#o_K6!uH{INjeWl+`k&iOpr? z%c63LC@7!eF~WAh_x35CxzE+l%a`ox@C}A1k9$5Fi99Z%B!^DDFWINOz{jbPx}rnuiK2EvE4sfnygX65qO@u@i#dM)igsvr;ZgP3IHJT<&=YIt*GnBdR2kys|+vwH&{tS2~R8vfGy=xBwM=M?# zsTk_(zsjU|yxUAvDyx_gCIO^JRd#f}5PnK1NFC3e2M#j8b(x*=0) zk2JU)R7OU-MeZ!Jh~`8BBDuDgJ~C1^jcH)vLmCP@m%POytG63l;VcQsiCSij#!KLv zmxy|Lk!v`kqRDAHdM{oqetNfSZdYz$@#j#OPDTQWpw;^G`$f7FWKyzY(OZpB^dSgdvHY!7>Zy`(ouqN{;L z?ljAc%?>YvIChMqP$!O_#&>_aDr9r? zRhBfC+cRBIM1;aV#u!$bj{P=3#~UEKxt%d55NyhKCncDHgYX>|ELR8DJfV1QH_h$M zT`A0GDrMmj^5T7o#funroZ#NLf)dQCFwOAI3k}Y$6F??76Q)>Y=C}8G0ubTEw>(ss zEGQ&Y!CzHZNBBiS33d zY=*wPxIEW9-5wF2G>l*Z0P!zOM+Q%AvbuZ9{^5<^xhaX4HJ!X;r%RfChA>{I_uFmd zO`Xs5=}t&WN@Ww$^XkN<$@HX7#$8tJg;J7hAC`<0BZ>w;`kFQU&4ab> z#lMbCH2M|X9%bqk{?_l(%PUWKww~~koIn37Sv4EUMD1hl63CHhN~N1Bnjhm)llSjS zQPi0-5u&=yGQsUMb9?EAC#*Pj`+t`j2dIPVE&E&lLAsj%H#x*@5`UAAgWPCpEdOR0 z*D3t-z<)0xnNmvx1)=|8?)_~4%^c=2&gXg~ssC4F=NZ*R7baj46cK43(h&p{RBAwq zR22bHiU?8+J@gO|k)8mGQVdOz5`v(BAW}mKy-5>D=p_(}66r<=q1PSs+ud{a?Af#b zCo{Lr&Are2+;>XX?v*)0wcLRwf|J?)RCXkyUE$@@cwm|Dfp!@%rX(zCR6T+A`=Dl{ z@wbV6K43OVyo^!upDusO*VoeeY4JDS>aBJ|nKh4XpHjPC#7 z9W1udpzc$9(Ko#3QicH%{a(dy{C`Eu1;mp6)V{*mS?zMj9y4`@Q96}Ts;cQ%4JsA$|>2P5I@gi3;Zk3qrJ+)8y@cNdRTY&K71rWT~4hv|7+gpPg8)RX+U;*RXkHeVIm8t4}EDG$Rjm!9H_9g;| zK84XnU8t~gsr2;VL3-jGW=rKaJPWY0fpfUp(x0oU2>ii>AJ$o^(#h6=d3pKyW#lZu z^?9U-4fb6k8X9Qj$-Lm3g4*lMostFAC_Inzd*|N*{*8HG@~BB{C7G(?h`~+(aH&GznG1~5I%842J6xi!$A=;==9rbGIvnT_W5tz4BA@xZ`vGhj{68C zc4-Q=4GL8~`2H@zkdkVQKiXdi!Bvb}LU%XF&cS}0E4Yxuj*!4^hUtSIKYX@sLIDPt za*O3NycrYv|H~{E%GsIihZIl_Y&8j==XT0}44WJyP(In9`KzUk`RR~9T z`76vu+ieIj_zurWOSm1}E_AYPlMeKiF7m32{&*?5=&tj1tW1zh`0pF9A)6E5FnOcz zn+f;$8>abMug&uSo;9lzZ?_vSo~LEhB24_W99Q-vd})AyrKOrl%1ZYHspZCzfB=INavtU|&5gFDDwLxLCysiQxTC3)nT78~>Cf(N3Q~ zoyFiCxaMiFnfg%1w&{eiscBMqX|SYamCRar*{v;>(%C-}_aJAJiCqO}KDJ>W8{VGO zj;#;P^ERt}@`HRXzaq39d$6F_KH_JMr3b``X^lubfbz49=|LKD-nL^C)_P`8SB;5~ zXVYn>?rntN-NoFwpr8=xmT3D^*!c>zLZKKD?w^ADTP(8UG=#a(dh8B2_!sj1^&J>> zue%s4%3*5*Tl`Y-MwC`CN<-BlWzq(Tz$$wNbY7ENZJ@^$8!C;ZO7Fu1hM)?)@(wj| zyJTKwE{&UhZgG4{F(qye-%BJU0nV_1 z|F%((>M>iMYt{*OQZ;4vRtv=Wd;dO_Oz?kz-C|Ni19)4OwB%NAB3XYnyPAOg|(N_!7i(!8IW4j&D_YtL^*-fYMTodNg z>B^Hy!`}Si(%O~Qgu0h)S+~Fqq(#jhS~Z;omT#7e>RI+3hBolKTZ!}o=|Kf8s~bX; zrKj1Bt)LhJ6bWM>q+fI`wYs@UT7thzes*hRRLe%W*NQE+jN_JPBJ23THs?zWqR}OG z=Md3Yp0hb%<^hr?KCMl8jd_3F>+NXt%zd7cfAWv>mKi^MXx|w5v8F~DHC~XL5jgH) z^@R9!$`T%AQPj>E{_#jHte`X0tJ<$mb3~>&MZy9rJfw88+Vx!fot0bfZ#a8&RUMnX zP6V6uk{r5lx}74SLBxdOwjEk*XQx$6^vr3-oQ>W%4Mz{MU#`3spnuygovw8Es&SGv zgCHAhKii#Vliuy%cETNgOM=26$m*)Hqk0AMG4VaH_b|{{wj_EMwQqJo11(rpfNhow zpZCif+7>8ic1x3p=z3H&y=T3O{IFE|QYiHlHBw#fxT9BTdz1KN_ z1*>!oorK+d(mx!2TQ96(q3e}pa*LK47bIx(gAgVtAj_#Fa=OdD5H?y!yM zOiw?nlWh<%^eJ44<*)2ca5~8an1E%*z%d=9?ihTAPtGHgESR75klBgT5T*pkqPQ2*Ty3uhokd9(Nwq(6)SakFPtoC< z9kCe>9WVUZ{Gfc`iMsh7j@<)dIm$P!nipKYaSV99!*n`-Y+tn6ZM_l7T|Rb7W<_SO zbc;9OI5<&=42VBQyfI#P{o?X)XrhkJbL2G~om5rPtyQZhR&s2C3^Kf zFWLOs!y)u*J6!1Cn-~4(SW+ydeW_A+21!JaXqc>43^_3elg z0ru{b5XR#`ha}o0T&^F%gb5?qP zG^3zYs5!-r;kVXMgk@93)whR}NaZK`w+U^N@}~!!CXh-?S#=(x$)_i<6m}BJa`$L# zIZY`Z#mdQYbJ_ze>$l6@S?9bgNR3=m_ZIb;B+Uwl??-N!-GFwr?os1Y^!HVhZG@)YS4Z#s^P zL*IFkT*Q?>VXVwBZT!kVpVgXSOM5if0u9NtS-U@BZnuD}8n}|+jbXFSe;8h=Df~j^ zW^{HE!cikijt)M3^{x`JJkOX=>onf92_my=QHE0xN6tCuZov(ng6Z-brfFVX+fO>g zs!khE)sm31naZ4%8C3_uOhl!UhhN^zpBLe5eF-f4masCp3$z+#7X&XDnxH-415)S6 zDCZ1MBKO94)zCFh9g>{9k#>{3pdFWACDUTZXb#JeAD(T=&3GZR<3smubSzOJ9-~|D zjtQ@zwPX+5c?x-^Z;n0eXPG-6Py>7aoA#ipL!YEVZ^?>WQKGF3Ce+!b zd@y|hV)E-YfwCq9YvYM)C)0k&_#7Zs&E7$<_c1kfL4=zm;0do?fkOfdGrXzw4l4Gu z?*qegk5e#T`NL6FpATob@1nitIS)F$2JargJN}Ndv1nU@<<4rwJRihdmA5rk_G#>Q zghCkkP|Bf&99GWsf2p@u0RUJ%V_dfK0a6g4Hor5KqkM*Wv9RLcWlv}wvwwJo`6~#E+4uFgQ6Z^Y{z0S z{q9qBH^SD|*2>WxwvRolcQ~ojd;67Rd$mDCbcbkkMm$d6WwOR+E;NHb-p&o9=r`W_tzVIofpy(oxkr_xnrlY~Gn73|>sVx|6}@ zrvaimU$EFn)F7=0h1ZrWLz71`&XM4**PxePE$o6aoUJb?K!k`*a8pf0 zzda`4t7R3??(Lfe-csdz_H69-n$a$NRFR{;Z)pqaMgr8=q*r2wcWWcrT~j=_^3Eu= zmqv`J<&38}6QM+bmsaa-*Ig1WI{Kt?vmu(3Y9v8eJFg%0&`Ydg!AsABABPV0Q+CF+ zaZe-Q<~&?HxzJD<4Q2hVMeKvqBvx8r;qY@&T_$*vergYwm(J*FjMmnr4*O6xe(>=P z^yS2wCF6aW@9N#O=Xzk)qhS;DZE!x9l{1K7%m$yY0PEben%@5yqa!HzCN-i&eVuYq zQVe(fb@e(*Yc%rYyXugxB$F{2cI4Iq%fU?jI^a#W?cKU%G<0BJR{C^IuN+fo0_9B14KGzbwc-&mB+M@id) z`cf83v}`21#t0`1a_lP3#pS%{41K=nH-DncX)^p=f{Dfo33_EaEj?T?k-y#;n*4;Pq!Nwhu>EO&~%)ekQ@CfRj$==+P1oK*NT=56?0 zsYc8P_Q(ho)6nZbKSq~F)$CfXT`;aMT`pp-RJ0eKK$iBjXn`Y*nYosFxukUEE<6-P z=k-V0J=x<($n?U;^b9)PenR9-$X?!Q|8naBPl7;Wv4)~kolcs)Tj@qI>C_eRaNS6` z(_7|0e2l#E4p6YVrqPJ>psQhe%7a8 zk0+0Jh^Ij@GD*DL_qp|KE}R%#9O>5{l@!S_*87}I+F1Wo;i|0=i}8VY+&5+fGRF{E zm18ic1SQaD*~&tg+jDNB;T*!gfoe0|DU)UH*mf3XDNmQMopliWuAg}uuiMBVTBjfl zK{GxbObHI85qjB5lk?5_`x&9^vcb#Ik}1Y()dBFiZ>EaCDKN>+Z|Towbgebd0!)+5 z_|c=p^5S4gtD2$xrQ}Ay?4zYWS3WyFKiCzZd;4VYUD4Z~-NwAiF%Ff|HM;;#U!^q8y*mzQ!r*p%4Q1G54CuHAIzUjcYc z1Wy>3cD^fztq6+7oC475Wj$vf`|cAs^3rg={+7pKaUZ^2ZEJ#EZ$W{``O>#veV4Lf z_@`)VVs`FOSNB%{U(G3;xV^1iDkc!}H4QN`X5smd%EE^*97nQ^U5;T!`sPnMi#)Bp zhTwmtVSo%?6t5&OBKhi9&(o%usJ8evzc}SIv&^o4RJ(^}>}hOD3z$RAbqScI+G$3N z6?a)Rz^lg^5VewVfyX5F;U5G#fW5;4Fj?f|EXLJe-Wla9Q!;^ zpNA;z`fqjzv0R~xj_wJHv7e%0ngayR!~%IAB5ys@A6J-l;HnG30|70==>NtrMN6ie zRB$DEnH3Wqu63A(@J0g+y@Um#xv9Kcx|7>!s2B zI3UmW&)mr1#XtC4h-_f%HcEeZUY!HTggsoz^bxe}3jCFik0%m0(7&*Bzp7`M9RK3l zdJM9F2?$molZ&y3CUsw|3n!B-F|RN%w^DIzl%7RJo8L;3nF;CK)fld~cxq-o8=P&tCiATf3IhmycCZ>j;iO?hXwP8T<3ZS;UV4d?cK+|> ziK&{E4VvB|pxFG%w3Rxf@+QzockPU^@~eS2chvEw+pU+t-Qp)#%T#3wIdW9}ZH(Cb z@m<%J6@RGw&}c(`O@6I2oL}KD`(i5mLp1E^FjlJCjqic6G1|!^SHlZgT{kM{B&y8x z*<7J*g443j6a66VEc0{G7uKAX-)Y14wsm|j@~YhAe%`dLt}NpHy(v|ho7B`Nfpyhw zi4PP!VLV8E-lTVZwA*Dg=@$4)TCp{=gaB6xHC^VWfpw|p`uyff>|m^6++`+E{!+$C zXUiz=e-Msu)lF0CO;jAcaamUqHd%CJB_-1@>L+&cmx;A2Io$Zo*-N3|lX1^Ipp>fI z_at789`}w%y%6o`8~j1Q?2`SUa~00a6RvR4(dCCEt>$v-<832K&T3v@#fXRIgZzr9 z!ZQjWqcc)U6_Or*?YV@tUMM zkJp(g5W*px&eg-Ff%2&Yaj(ke!xiR%RHEMVMRNqha$SVEqrp8U9fb|nJh3q#o!Ty(31V&@I(fyurN1l zse7O4EM3kv_QPS{m_guM9zwUulh;=tx@r|`xCGL*2Zm?kgBARbKJb7iEJd@dY*5*Y zzbOu^;Q#C^yu2n^RnpA$kizhh92CWSU$)m(yncn-`^~KREHXyKh3k56Tu6iLs(_gw zC9Wc5ihTn?A*{*9{X6u&v#mI*eSExM9$Yfk*L4;a{!xGG3a6vnMgnW=kU}#-*a!`- zpT>?&^eD!i;#%wg5|W#ozQi5+{iZO1!%1RO!3~n%d^nL_newqrHGoDgy(zt`>H6n# zVYtZzl}Ao5SA|jqRLH_Jm)p14XcL7xx9k zj`}%BBqia^6bAO#cM=U3?SJ8Nj_Z8#*-FyBCyT9+`*7 zo@y?I&_~0B*eBr_E6dG7H?XKvuay_h;hyCm|{qt5!93 zyxdqB;_2s5AI*0VPt)%~ox%@3AL^H#Pl$I|q=TD8b5uAyrl9ArA7Vb1atQAT2wLP0 zIB7sNN(I1aa6wz*2>It-ZT=U0akCJW9-?T$1J?oVKuf&s@0s=#iM=~Ay`Z&!AS`{} z;?$%OZPv=bjL6XoVCeU#X@N4_4R77(%LwLV1AhgG0ZCw`kF*peM%teJ`_@QBbrkR1 z8q<5It+0wLidg4)O!-jy5PIM`knd&;eEZ>f-XsQ+JI2Tmbu!o+EnAhL>KSM`+OdA- zoX1IcH2*&THr68joCL<|*4lLz6y@@BK9m6Aq|o^^G1Vfn-2t&^V!CHK!kZ@`_>wME zJS$C3&f&ikEv&b{M|asImF?h#<^u(Pr=SDW*hzm@k7^fZ`Ha-TeQ z>=?6_<{iUh$BsjRa_b2O;J3_*k2>&&#@kRs?N~`K?;>z=-08ON?PJHv5T_38=z(*l z=bGl;$BvzQar8rjeIfw7{EofWo!iDxo7Ksn7bd1@hwJ@Gv+p95To!+E6*^uUwiO8L z{~V_GY3NgkQU1y9Ur#LFe&YTrk$*bcf}^b;^H4aVyw&W}{W5lYG1`IX;o1*A$*4zD z3gEDV%v?G8ld+-b%Q=Ez6ouN0onP_p`=&xl4~UtV2_->_M_VVnd$Huy05X~i?Nxza zK7ZHX-yX*1Lv!;Gze6#rgKKbT@@ zL@t~jS}))mPIn$15%_yY`OJ&KPKPf;l*0C^;3?0T-9O}x8?6@XxKU{TTo5}D$qZ%T z1!t)zx|BBbau0CAH$>oY6DPR7jEE|CbuueVWYP&> z);|FCWbapm|FvZ1d7!4v4KecU`*@M!PhlHXaB@|-J(@+)XDJp^yJLtUt&9o5Nf5Y` zn}z}93)OXcLG~@G>$BVHj+@haq_<@3l#pa>8**ng7X|5%Q%=v<9xuWmm9-rUD*D!V z5;|=#JFrpVE_dTmw`6gQJtp1tt2ObH`(zd-_euYgWzK`2>XQj#H8sjq90QoG_a5VHiKWHt_?%uBYJe-6rf+8?&Hwhy zQ_jtis>b2Hz*=5KuRB=ibU3HUoUO^+X0`^Rv&g(+%UZQx-bA%P6?4;7$x_BJSD3<< zoHJZ*J+_ryxHYrCB;e*r#a=qq_NBu&SFWUr2$#QzzuNYb32JCfq{e&v#(sQcw?+>p z9B*u^-t-)Eoa{THx62sN%qHNH!EoVE{|)M9)(;&M=gsu-B(21_q)~|*^9#qpl&p$E zOOzYjplSOW=l3r+d>S{?i0vIQA{4yv{kT0-lQnN2g+5XvN!hQ<5_`_s6lfnK%6J>w zAo3pfwV@fmEIGFdR}vjxMT2f~9wK(i1UX=ZzZ@hgh`-7}qo2Y3nx?Nr0~UEH@T&2P z4eAGQpi_FJhHc7^a=kT%%v3Rk7Mj zUdV20_zCC-=@+!=y*S4WTOxG?!A5F1zh;K%W=npJR;{K>hc#`!IhqDC5wk4%z6!)h zyQ-DQ&#ye*E!=HpQ*VwLEO2v~sRv0Wkb>sfHr_V$S(3^WU*xDWO17MtQzrT$1O~qB zw<$CV!Vl1J@wm9S4GIx%OK2p!?=6`&U9+WbB+QOjdc^r{&ULWDchzgQ2DG=+RF`DE zMf$J}0kad{eay(xKW$)-M70FzbjhrHG>WO7?T3EktAu1#(~eg? zV|{A%9ouV)JUQMjF+wGXZ7FSCqLVwCN!JyHy5t%6nR(&$KDiDhe8qGn z1zm+#26G9xvFvB-;u>zyq<+7#)+pe4fCCCgLH zP$g7X`MxuW+axT$qaY)qovQ3s{><~<=j8QYCAnoDA#%g|QA{Szst~L7GD{dpS*oL) zdmHm5cB!V9v`FM(ug4aP$;g-o&G+K6g%zjAxPy45aXzQR?4437yFE)o4y~2u8+Ovo zVFD%z`mwcsE)E_DMXUh}4dRN~n#dGZzT&g)i^sefMFB7G=P29eD4ROC`qwL>Ff%7K zwm2p148aba3@80lkcTUK^hwLVZ4o~e6Q?J4D1F(28WG-_+%9WmO>$bzC3^z|?8<>& z>uBqM(+X$l>cXDiK-i$0LaR$(6MNM3@hCjpcYubwlWT;ItEW!I+{JnSYd$? zl<&=!j*L+I(NGze$zZ@+uEb5&A0}HC{F>Tzq;J1n#t!KX@?>-?)gpukf ztMrUu7PjW0;uAX9svBC!YZ13e$+D06<_J(a#2DlJ)XM78S=l8=Lg#FOV zo1SO`lL}*to*SePjtkFqV!~w8Lz8SS&RBgMLomQZKneGYSx)pMay#r?W-IBAH({)& zJZ|Fi?&at_eqkhON4(o7#X?s1-r~BP=Hv~+ZYaVNCT9HvCpRh$ifB`Gzy5iFIG{?5 zl0n)~VC7BW1zd=Z+p?d%SfE*K4pNoxR_FC+dS?8~s`PZqp^v7@=^2C{eWe#r31Zpt zt|ZOsZGCflqK<(6I-{8PntHIz-XIL2UaW6|^r+tsnGJY;1u@M1VP>zlD2V*hcsKR& zJU?gz)O0H`8&MWm^=b84+cRb2E&TbLShvBNwqCPxasbZhkt=E$aCU#fHyFY07b`5& zY)d2wKD>?((CU|CZ`V(|R#J&)qF=F21C^b6_V z+vxZ&6nwGIQ#sQ}b{qsNyl6it0R>d`aymt?x{ZDs$Z<|u2_!Ur>e@T_X)lA>t6Rdj zM2j2b>(eUma-EjYpgJFvl;L04vw|YBu4?bt$dE%RYg*-8N@;_54%&wjt3X&#%)UyaS(@ zT+Cd2UXsF6RDRoX`M2|=jp&wV;xSz~Vt;cb(K+EbI-S|0Bz@kxuiYch=RHsQUGi7y zQQf!UPjD=o$_}`Nc!E;0r}6#a8(ikIl!yx?gQ~(DJ0Cn*WlXYXaG3h?O?w0Gfgc07 zKU3IFru0xxfFL^Z^Dg3>N^jt&+a>msw=T*^2I*$mBk5^by0*2J`ur#B*Di5i``+6z zf{3;+S`QYfwJjlvS7+4dz4X4%slVdSK+>+3y!{NF1j4`HnhF>6w^=8qA1z?9hM$0$ z$;#lIS`xI`{u6?E;zx`E{%Yo`iriD$^u`mA*r(01{##EE2|U}-;TV0Ds~)h;6w2ze zVyl_~_#N%NZYPy#53y_bMQM*N8H9Gy`+zk)zAOA|uF1=jT2aku$E&&uxRyM;Q!%)q zD?AfB-9irwC*M~v-6^W?@R4^|EArSPptK(CUq`1jqu2IF5bpGtQ`nj*CKZ_+svd;7 z9POx%ppC#)89EQ+UPg9{K4s?bTA#XJs+;U$+=N2U*hD*yGNNWVV`?izCTw@A1}i7( z*q&L16ospBKd~#ZT;0I$`Dkl5kp1j%AzT_W5jPI&W0GJ4$H9cxRiwu)!3M6)_DnQe z^Zg)^RLV-sj)VViJ|ma1PKoDllHH!UBxH_Ne<0kb3^A-C*#(*TNj?XJ2*ET)kDA$-?E~pUuVbxm z-KIAB(eZCWA4-2z z1xkM}J5xjwg< zL*eZY7FoSOuYuF)I2#d=yU|rpcB#N??{;(N}?{VX*t$8~9Xn{`Y+l-ZP?y>$>^nP)XFS z+gE?{hMCndP3d^;+A-0e8~^BI_TKiO5 z!*HVtxWJL)k{LL|3f&Sio{QkqzRnh_fM0J-Nkur!GDEFekT9?CrqbBU_?kz(c`u-w zZ^$n8g8J7d_C^_({Vxzi`-3$axWvp&1(KFr2#@1PeidGUITJo2JDwaGVM8-fn7>ZnXwX5nvYYW8qiz3(xZzTS&$ z_pFK+!TE@-1iU*8{gwfmZ;;;IyEu%aK~!XbqV!I%h`YwTAb+2XA@ZIRA*^e_qse8A zCr40huQ--{v`?5kei`c66lgDT6R!o<(3s(#KTx?e5j3o%zV|KW#kBE?JrdEi!Kb*@ zcx1Cj%`>Nx}+o;>_u*u{ptQ zmQ84OZeFXy#LAUTsvgf;;+k5T%bFf5++fP}Yvd01W%>*G5hR>1ySY%Ct-6R~Gh2fS zbDd>)X6N> z=Z=Gy;B_&Juh%ZNDrxme_wLT9_SWjJOn4pVeUB0UbW4ji{lH!Vj4vzpVf!To)$>!o zq5pj1YJ`@8-VYe{A3g7+el&-EFC4A2AB?UyDO?Cff5N&Mm4@Ps1ey(xX{A6>*rVv|Ttg74gP&dXRh?(}KdZ$a| zdE*>qmBnHkZ zRQBQm7jC-S+6PtBa9h8T-&#CtIdu^oH2T-YW#?C$o{6sojMZh0)Ud}HDoc?tP5UPA zY55O5x^lq6b~=RhslG`q|NTrskYCknu3B6U@>MkL1xwLKtS5^`i+=@+{4filSd!&4 z7|H#s_u2?S?2WzH?T-;HT=SEPC7#u)9sv=!Fv`sz{P&KqOYlb2nRKY&M+v$2^fDHC zauTNrF09_s*hCYv=IH}IXN9TWOqGWNcjJfC!1FktH!MD3aO&Ra!-(|8GtAIXRsl&6 zgaEiCGu=tDG7!SVE5h%Z<&wIYt;Io`Q8q1*4}@M=j>-g%?cUgWRlBq8u%UC$BCMHSv+Zxi2$-?-#iIlCVs0 za44_p`{Ic#f8>)wZco{S06u72Zn@90VMpSbxeezIaV9GP_3(Kh&aia`$2dtw$3GR# zS}_+=O*3D8d$*uxj8qiW@JZgSDQzW9r3U*sP6=uS0H!IvHmG&m)RYdw!59?L>g)}1C>u?mpgGZZA@ExZC zEViUd!)3U@WaEel;rg>{X*J zZl#RFgZbH*j010`v>;iPrzHyJK5bf*fn27)wZ}M3oLJy|lBz zth9YwdzVyG5r>vd_47{?z8JTSaF0Nt%8d1uia!5@)?)RyEFIOJ(~m#O7Q&3-D9^t& z#kNMChT6a!n+|r?MbvJGd1C$MI|Qg}j19tw0y;((Gg1JdW`1kuC>lH@o|3F?uFU`t zixbaZP5kyM!a5CA`R!pY*`iNCGYs1f%S0X5_;q>4ZW3r zdMsFDY!szBp9cN`jPNi23N=}v=e6A1rr>2d<++85@(Z6eBw`pxoB>U{fu@=g97VfWSs=K)}lr3%vd zNr*2$pEB%;+WGtT4CCf!*IxLL+Pg|u5>|^rj+h;ekDntHONtPHudT4@K3sRQ;0CoF4zkKQ5$u zrpW+y7IZ*9jL63w%qeV8y>TAQZYS5VP0&)7_j>8zMWlGGz;K2e?_XQxUcXGozl{<@ zUMw#d8F^S!v?Sy5$fyV)uw7;L=ojRIKi4*RJ*{&cA92S$3`>_Et1RnjEPmuxzS4He zarfP`a#w^~0C8oq`tHuouc|BNAdT>OwP#i?IGdscvy+Q?nbND~*NoDF-r}l_cg9hq zIx0o)B^DzN!THw>scw95#F#%OP8$-fLh2OEP{0R%bc`>y&iz@OOA1H=bKj|*9-L-9 zxnFj56IIk_Md5PMWZRlz4Kj1z@6`1ok9s7)Q@0Qs3G)ZJKC06bq%<)x(~=>M`~M)t zMyV3zkHV5&P47?pV|>vs;|%j?UoMKxX1WDv))ggBg)$?%$d_goo37&@ZHg=RPTdeY zby8_x2wxWdCOFU7Ch9G*-rCvST70<(leCf%#IOt@L=*};_dkII*oMjk{Tu=K@)?2U zV%5mEB!;TDhjo@!qR)?#Cs*b}MZUSR^H;9e(gy5wAoUI*dz(JA>Gkp}u!ro2ed+_= zzhiysdj8DfU!FU4NF|ujao?3lJs_D<8j38d^qNj8o0T^17X+401#I+xKrErlUD2$n z9@R%{66r4qH%gU%mabwLYC3%1yVar2#}g^bRT>)_FV|vN<(jNuP;gDS^VN3H**n{| zoIh(|jmDu)<@9G?MD zUupL%<=!wv;TJ7G(F_AuSZ4p@1+|D@1uw>a4&&K!2#Hs#US;N2Kj~Rh zPXuK|s;&fKYY{!b09JZ#AlNf}_#Am7)u55G>d`gz?QO##ax`AT(o3@YV6v{UkYq&3 zhq+BJawuc@RP5)vKGO;~F7bp&onAl$qeFx9D!0DN$P4<2><7u%5sIm&?e;5H%jK$R z`7O^35P?Wwz!r3r3cJ2L^RHNZUb^7~^zjMkIpv)RXVr=OFi0*5={C$|ve@ahM`Qm~H32He@TGi$N$ z9MwQi30MQbY){Y7gYPm*G#EQH?PL!9nLkgf?6t-`{&s;j9Y)&S>}&UfL<~&z&M-dd zC`9X_|l#Py;qo~fJ}Lpg;XyqG(m^kA0Z z)VIR6t|2mN*=_x+;7@cf;5-^hWWU0EcAd|>^9y8TIHP8(?p;Zdo$V!kNKaMsvIS()Kw@7;G% zGIn0~;@wc<-3>?7Tcf1P*$AExItyC$(~2MdvTSyB*!xs~Ly6QIkvvo#q}yMaroUq$ z^hfV}{MYX?b~_>!`<%lz(DLQ-t;G{>SZy#=->&1BG#w36$0#a*`4z@XZARfv=qolHWaz7tC%H~h!)H0`awV?pgHC1? zVr+VGn#YcoQO>}Pw<7vdu5orrLFJ&`8WLw*la2nPI;?87E>qF`H1@*z3H};&(P1Hr zF^%>xDoZefN%J7)xrQ`N-}*G#k%(=OCX;WP*I-=0|s)j4S?nyky%(m*3;2rz`j=KI6*4!PKTZW`a1 zmWB&11WvEGHOtni2$`4+%a9}Pbqpmwcdqxgd9wPckrlclnK8F5Ybf038c7f7j_xp- zc5JQQZG5lO>>YGZCgz%>t8SYM+AX`_Nq%K=W_Q!bHJxN(t{~=yTkTxmRy61Y`+9Q? z3rnj;=O!4Elsm}og-^P!sa_6)#+OnLy%cIRXKRIU=J$}+g)kEO$Kmw;F`3F&~bpY9_m)-7uO&AC2 zwOVEl2%6d_WEaJAf_}V@XAMfB=XmKGQM2p{IN+Bi40M`fP(Z=~_k-P#`W+XjR$Eus zpnONFHFc|Cd$ucqgLmyqmF(iJM+1Rl=Nn|zwOODOKjKQG>3Qff3UBzmNPHgGZDR*_ z6;s6L$6oVs(#yPhQaeu)lMY?_K;?-*(3 zQ!nnV-m2L}sBC*SAEiTI1RJgfioEnzoe3<#y?*$pc{)%a$>e45=WkpIjZflWAcDum zbNe@y($@7Jxb3>gHeA+?nXq?BI9>{oudngPvJ)%TAkHP0m57(W^{#WE33oJ8q4z{u zwPGgZ*ygOZ*86?gXoEFv{X}|DsA9_O)V9m1dt01dpipazXTVVMPpkTL*_B|h~b`b_6{ zI{s5Zu6W7xdK!HiH_|5<&?|j-qqXN@4@+|g{ZO)=-a^GzdROzsosHT7ZZAQH+s<1KXB7WFzyI>gcmTC1YzZw4nVzaM`BF zjaIu|>8E_=bn>7}AM1(Ih^Z{p1@StSuWq>e`MOVyCdb$aQsgvw36B>cS)RSfuMC0rc1k{A zwa$KqvYBJ7`T9G6)SbDc9KM6ie|Kv=%GWL9+0?~vX`1tiH!U&Jqu?JmWY3}PGrGy6 zdZg*~QjK)#wvR8$QvE{?QS89_4Q+1Z+IB^!XGz&~%+7Fz2&E(zFlbg&Sv^JR68SQN za|;giCvP1<55W8DZKjV-Oi$9EpCP6Icv9_i7CT(h2H;Dl<^u1(Rj{pYl4svI{w)n2 z^tA*)M21hBjm*sf2?pw*X-!FaT2&TXi)(#z>eOlIxz?2P%*yUrSo}s6XuKSFtFd0)O!4^Z=a`2(N{l5Vl!yW&n@?6#>IcQ2LC5;J9D;p7$o2Mj%bswo(kU|d$G8* z*q=cfwl}~1h5?LF*?%ftX;6BPRT7oDe74w8JK+M?+Al)$b=Mf^W_66Crz4w;8R3$2 zG+p}B2M@Y;Y0;Ol+tZrTy;uft5{_QrtaoB$c2<9#(G@}b`^m*=(aZRJ_@#0^-KxqV zjh&t!Vcu#nmG@A^Y10gn$gU6?{SpwgUgNjd#Dy7L%QT5&S8udrYh;zF#9HpBYfJ!1 zmi+z3x%20*CspY+#{3%BT@n)^S^a*gN${QMfTnjqB7D^#!IzJpu4xUMprl-E2PiPP z^L`^0g}Zg9*M(hC<(VzTFWvJqll^J!fD!NRBbycfBqfNNK4o`0b)+It$aU@gGKbyV?!8O z+bXN7-m;rNoa!km?TK#Ur;Z*)Bc&YXHtWk5un((tRxu(Rwl6%zCk$Lj;IR#dmo)kt z+}F(ekNt@HT3tR@N;j?3ZmPj=u#v+G{lJ6!EMV=ZdQall!530!(fOn0jE$gLH=?ss zn{*~e<~+lm%l3KhwZt=btv}+^9#DU`9Sw#DKRog*k}W3tHcDD#-C;{Npuz|3jSL9f z!@D!}3}J3w8TP-q(~L!Q#&vH+K{nF9D_zw;d*|03OgV}#0aA~xL8IAfU?V?Ul@qK4 z)dB&`?LO*JNK^Kec z3euDONB29aUw^Bu9O^{{JsDsG&lOwT1(MX0_qKFxgNkwhHU{$RZCXCbx5RmPu*pT` zQx0l54(<_4v40tsW#dLY*z60)TZ}*HH&i&70b6>;M|*d#%38`wJ()ek+A3w&P!Z(>qP z$zjFG!pME@3!G~@U*bD1U@_IkARA3N!QEspZ{5^BdyoEtM9!1%lt%kVSPORe$A`l= z!e8F-6>m~x^Pjc;n0Nl1a1-{m0@!>}#;^+pvA{o*B^lAS)DJ6Ct=3U-T1` z%e(#_nd|1%P34J;-g&>#C(C<$VKa=Le+o4b#4Ft1K6qH7!T$DJ=+k3SX9ixEz9CWG zw6YOpyUL_dD&q5Vu!pYA*@@C`nlyC7TMk0SSFcdp&b6fWYD^Noe?ZmBL*xn1C06IFH_ zkSTpwAVqo=`=Q@3XfV(`K+_GOgX;O+8S@)KJkB>!Z!8mo4xs6LBjY@A{?N^Yo*sN( za9S44JASEaDX;xFaTxo@wNLt(b7cTl;<+P_e`Yl)>@uJ9$RS7Pc^mJlZJH%C<8HYY zy|F(Sn6p?WZHgh-Yt^0Y<;6>qTwRS?fJZlNI95AcqayserrttE8`a*jkY>C@t^vXV zmO#}QiBSto#XVSonz)p>p<8dGQ}_xq@)=o=4sz=Xw#VdJ&8x7L8Js3EBl#=4%%0vO z;odS>Lx=x^qKuzA&H_0^&3-&|DRs7S=y?WoQ;#}{a`Z8F=^sr^UHkvLL z4_o*C8h&Hc<6`T8#@e_OX;HU%`a_0yj;eNmBHX^LjIk~8I!dnTis?bq1&K4*Ge_LL z1UUD#+*JI1OIy)8&G|t#wlMH-YY9D;$ zpJk8y+}o8iAsP(vWe)mXWjic zGc7=_Zk$H@9@G#)rbh_3tUz_R)D7I=#BSQFsh!{kIyQ6b4>3!<@CUTcs>t|k%v|N$ z2&2@MjRdznpy_o?uogZdH?v1-m)W@#_xP!K<|=~A7mX&^cA@R!soZ^oKcO;BFwNb6 zuPfWtWAZ8=U)uhi^ZW1FZY+h7rEW?)fh-z#(r*XQOvVWmSB5I= zImmD+!Vaq4wd0&k0Zm!i_Fszm;2J>440e#KtdkwtOEVoY<&UVeNphZs*dMWC*RIX9 zT~+8b(pSFVKNw%*t%3Ad=J<1mnX#cSfWZ#(8?sPzzU{C*B6eZqh?B^BV8vNgx4s^b ztEkomrG@c*aO&p9tW=Qs+>PEC5zF*gKnG%=m!VQjGDRN=TPJG%!f=Kd03(Vzhw~!O zl>1}iPC9+a1u)~+IlyfN4o;ok55Xc|{%cCf@ehse=^ID!#nJIUBH;c1NruG;|5ORH z{g1xMe^Oc64H`iA=rq&qQrfl7CNcwP8V4pP(~j_S9$=PVN82=0Wd+*Sso$ zcYKLhp*r6NV>v)jtbue|{(H%zi>LR3=i8%L_DdW!FD2@(=(!yAE zRx80`*1kw1<&Kuf|JXTY@QX`?C=T0+q|M$mBavFi!vgbxhQKf#u7LMoD8{keyZ`C4 z{c%S_S%Q#P_ny^c$L4tcH1_QJe=;Km(#V6m9{Fj*w-Z;Ipompom0H`fY}c11ngKMkh&TVgG0>8g8tgBa5OFsg#&P|5g zqZpLXyI`k_XVy+T$43g^IC7Jok9dEJv6DZ=_|$qrnLJ~WcUX6@CrG1j!{e(e_VI9D za8c2-vv%_HzsrU#u1$>X{p=Z_c8Sec_{{efPk|s=?0TgGkc}7OHEK4{r=h8ee%&rt zEst3C(x^OttlGbj(J|r_9!PLLdV(CooT2HvB`S|!L@aAG zvmuwG1T=e!KRTv4S^^spjvd1nC7e%xao?zo*}wd@w%~;CN2U1Syz7Oi;;2nRwH20> zrr$2GqvA1%o&$0VCY{fJ^3>(8=^qqvB`S%(8+T3439q-_NXF_Ft(P zhE;Fo+QJ$#K~NUH#h)*=zYe|XlqyM-Ow(>_M`laK|B#j1R8Ktwkz&01whAI0ahzAl z?1=an)*70h`p$(jwkkgFVOHA39p3wQcJ=uG+UqngZTidG&9Y}sKpA9@8Yvjt&XIne zr{v7qRvkJ6ey_LAJC+3^ta@GBMj6&xYa0!uIc?sQVB>SyjUT!YzM#ur0iSy`yJ@dy z{%!rD?tGVR{c^}g%wob)q{b?|Parb;oim{)(9#eSJRMrOt5~P}`y|ahl!CD1I7Q>nSw3lRBL@0`SJS<>>k0 zK?2G%Tp{%AQ4&0?XalnlKVq^egmH1at$kUJDb;9xBsV%~CgRypPMA2RfInp^UblBw z#MIAis5=2kE=RxZ_10>`c;x6joFAN887#Y-{N!Pm=&;6*r}?_|dcC-S_)cS_ZEP(T zOO;kERZkJGGYFE`jo+RXvUrlJAQ{)dhjBCy+BrDblqZLlcmUdBn?-&O*V0&d@sW=| zo=|S_W0&1G>G(Y!JMWZ*vPK0(3l|fPD}K#THAfvk4@((i@>$t6j|WL>`-Xd4;eJBH+IO?bzg}f7AdBG+-krfB zFv`LD@^UmqcTe2zZTvK8p_61iSJxO}CeRWT-FpRFswgSF^*+6BHWi3B*WhHgr%X*u zKns`0sDl0c?FvtKt;9^W^fjQr9Blj3Vz#L*ZucK43y?}O@jLB&YWe*AohoWiwjjsk zzWmi)UdJm2ExiV2)fm`?T7S!Uiw9%JLH)t=$z76w1Z>uRyc%IG3SSA_f%j4(SzdHE zk`6JBUf<#p7EHfXsesjO;H#B{yoKO-RG7oHdz~{$%;lM|WEPL1c{U&p#f%>3NK$0> zLMpXQF@Ps~QR}@pK=tuW5$2vf*mhpw;*pe>z7=stS*pgR>x;edQ$u2{20Of#@nSU`Ym)~Huin&~mYEh8t%agj3x3qR| zHHBI9pw7)Xbw@;zJZaaOc`CO6)+nAhla{9l_#XJ))CbMpPebGsN9}hmlPU^bWC+`S zTe&OHkPVx+FcxSD1jg9A7j80rIvvtu`0NHQyQXoQdEg62pzrAifMRZ|g=zjMgrVcV z5yh;h)X?Gi^f5oVJLR&5aG`s^6cf4j?vuwWdXFjcI+OyQv*}!YK$lTq`14< zd(WJP)>EQOJmh9htgtbIHYohXIFqkZn?c7*tXJyAr#q+&o2eg#s63VM&v(h?sotVP zTGbEVuL5pSY}x@0f~S2YKCj1V8M1uq3QsfCPFwW&eL!cn2R_GM^YTF^rJe>cYWw`` z)A_`@USLL)`U?dRNNr4kxfh@*~R!K-LpCjX%8+aCUWx?(lDVzTorxZgHJQPp8?f9J=&&r#+y@ zL-_WU@mvO10lI4X72+D%=1G{R?jrFWSDN>3Z6yefwO?)LL8Va5X}tlrd4WlVeMsjrPd%)Ka;_vm z)a<9*6@&!ohW^5+<~}xi8j+@N+)0! zHW*9xU7FsIsvpD&X`SXlvrSLMvfuaJCMWbezp5(RV#y_Ey)v)ztZ|ZhzC^=IONI^u z&_tq?3O;E)k@vLQa(ul1jj}$53&J_o{x*1bF7)S`ICmbVi3i_~v)yJce^_N_BLRyO z|CQ)AI)YxAyS0lq4|t17Z<3fw?cOaUVhC{GgBk7e75{BNaQjIT@;0|gijeUALHW%j zdnbIqFtGwqs2z+7x;0k-d#NUEA3O(33*)(DZRPKxkXQu+0U~13$`swmYYu-V?6O_WmiEPz0cak%k(=zMOvxy6gNP zV#rT-f3GH7yYrqmWoiEj;uNCqIJ?$_r^q4uK%j@@Way~-T0L7+NISBR9H6sj9oi># z5z6u@Xu1jc-P>~u(#$p~vIhaCm?#H(jmcKRf=ovi|wt2KJrpo(M7hk`n4JT7srg?lNz}l5x&n!pEi3CLc(l<612KKBtA_p)Z8q>RbfjJwEUY%1lj$gEq7JmOr; zi+s|1kRsJn!_WsgoVE8~<=fVLNRkQo>g~E0C*!e{>oqt`z*O4!1)@@y6fFXqjie>& zY{J!x3uSM^)1%@gNwNWJQzbmvn0F-zAS<1cJo=q*qU@QqRWas-#2il~ggO0#dHJvq42MTaT3EoU!O!bwHYAgl0d->TFq=JffkqF&`oJQ19yKdV-&pI z!c?0Cogc?Vc@1QMQM@$wTxHyWZZ&^_I6B!UGx8c%j-CTCW=F2yy-Z=RFEcOIXQ|cS zB!7L)O;u^>+obYuTED&2D%t~^4EtG=*pxjgYqzrB6oa3Scd27Lq15D^B zVG50||L;-Qg5Fe>e4KAC)_?nlzV#(linED$r8JHH^QhU&OTB4Q2ya~0_QAJ`nQhs; z7pef(jVW*}pItSkTJuEY0HW``XXfDn32zTW3xSlb#LV`Xvoy{{hi5vscVkENaMiHP zGa|Nj_9foo3&eDeZZE+K*;zs@wg2P86ILBHJa;K~o5h0$QASNnWW58}!CyDqI0 zE3E?|!g$Z`!kH0(W)>J9@g22uI@RhP)#Y#H-+T0LP+15WlcSDlt{RJ4UY9wa3yb!xi5`c9DCST<1 zP~IXm$x@|}@<4>Qo^8Vl=sM<#qC%EAYCeT+l8ywcnO6>O8a!^!-m28FgSB188fzt4Bhy7pwq3v8gCvIE)_P67J#N3MFjEv zDzM$(Z=~nEFI>D!mnKI8Z2nuA2QsC8 zfUPSw;f~ZL+bzH9>^pS)CZ%agk^oAG%hpD>GnA{pV59me|(Py;mC952NC$90sM;mMH+p$(gZf2 zF5wTuxd1R6Z{p0N+3(2?BTGl?7!l3Mn(S6SxG`^qowrSgiEYUyP!e;!ipqh4CzY)LEm1cIB!W8;FK75NUb3 zS65J`loW%0CypAT{uw$yJPv+v0vgFk!#dz4(06}tR}iQ(H0K|h)cYD5d5~*UO5PiZ zjWP2JrELo!Kf+;ESB{962%^?oV{$5cWWoU9m=A*JWi0GioJjaXTQn}w@{1k^w}%8X z?p3!$SbTf?9H3cvR|SBMB-oBg0Ybxdy(>0(2*~1%qfpjaH+>-uykxTA+{1^=+&IMw zm)J3T`1QX=s@TQv+RE;^gc*ZUuqk9?LLvLU1xLgH5I5g|49zdOnLFw6ks{tD{O1zY zU(B|((ZohYzan)DfpkGefoe5sL#^SFzu@4$o5<@+g;A%>y~@$l#Dr`Aalbr}BUy35 zWRUdIM{PmH#2F@)tX#r`->Obv)Dxq*UcP@NXah8e$G|VSpL3 z4UG*;0DG!ue?~?8`4R$4U@|#6=vIsVeia?!5T*k0&v{& z`#LP(cWC&p-#!sie*!A{A?x2Bo&WFr|6q?58btdcqrKw!Z7v$K4@Y*@x~q4mMD5Y5 F{|~}CwYUHP literal 0 HcmV?d00001 From 348f01a1c11d344c810383cdc736be7473be8021 Mon Sep 17 00:00:00 2001 From: Han Date: Sat, 13 Jul 2024 14:44:02 -0700 Subject: [PATCH 10/65] Update conf.py Updated footer to include direct URL to Code of Conduct document as defined in issue #322 --- conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index c5cacf05..8da5cd5f 100644 --- a/conf.py +++ b/conf.py @@ -109,8 +109,8 @@ "show_toc_level": 1, # "navbar_align": "left", # [left, content, right] For testing that the navbar items align properly "github_url": "https://github.com/pyopensci/python-package-guide", - "footer_start": ["copyright",!], - "footer_end": [], + "footer_start": ["pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community."], + "footer_end": ["copyright"], } html_context = { From 534a838f719074a2a23ba05ea2f560d1f01279b2 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sat, 13 Jul 2024 23:46:06 +0200 Subject: [PATCH 11/65] docs: add images for Pr fails --- CONTRIBUTING.md | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c6def4be..8f1ce505 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -178,8 +178,6 @@ Also make sure to check the formatting of your documentation by building the doc 3. Write a clear and concise title and description for your pull request. Make sure to describe the changes you made and why they are necessary. -*__TODO__: This section should describe how to make a pull request in GitHub.* - ### What happens when you submit a pull request (CI/CD) Once you submit a pull request, a series of checks will be run to ensure that your changes do not introduce any bugs or errors. These checks include: @@ -189,16 +187,13 @@ Once you submit a pull request, a series of checks will be run to ensure that yo You will see the status of these checks in your pull request. -![Pull request checks in GitHub](images/contributing/pull-request-checks.png) +![Pull request checks in GitHub](images/contributing/pull-requests-checks.png) If any of these checks fail, you will see an error message in your pull request. You need to fix the errors before your changes can be merged. -![Pull request checks failed in GitHub](images/contributing/pull-request-checks-failed.png) +![Pull request checks failed in GitHub](images/contributing/pull-requests-checks-fails.png) To get more information about the errors, you can click on the "Details" link next to the failed check. - -*__TODO__: This section should describe how to see the results of the CD/CI checks and how to get more information about errors* - ### What to expect from the review process Once you submit a pull request, a maintainer of the repository will review your changes and provide feedback. The review process may involve: @@ -211,8 +206,6 @@ You can make changes to your pull request by pushing new commits to the branch. Once your pull request is approved, it will be merged into the main branch and your changes will be included in the guide. -*__TODO__: This section should describe how review happens in GitHub, how see the comments, and how to submit changes (push a new branch)* - ## Additional help ### How to get help From e79a410949ed9495a2e1f16680fef1aba83ab7a6 Mon Sep 17 00:00:00 2001 From: Han Date: Sat, 13 Jul 2024 14:48:05 -0700 Subject: [PATCH 12/65] Update conf.py Closes #322 Updated conf.py file to include direct URL to Code of Conduct in the footer of all pages as mentioned in issue #322 From 0f282c5c542aac0043cd8e60e343897175051d3b Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sat, 13 Jul 2024 23:51:23 +0200 Subject: [PATCH 13/65] docs: update the images --- images/contributing/clone-repository.png | Bin 13526 -> 15540 bytes images/contributing/commit-changes.png | Bin 35604 -> 27103 bytes images/contributing/new-pull-request.png | Bin 6123 -> 6269 bytes .../pull-requests-checks-fails.png | Bin 25629 -> 31345 bytes images/contributing/pull-requests-tab.PNG | Bin 8799 -> 10870 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/images/contributing/clone-repository.png b/images/contributing/clone-repository.png index b793fa517c222aca60f18e415e4c8ea7a0b96496..8702d0848740b0e2d3df233958efcf77ee4e8c8c 100644 GIT binary patch literal 15540 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 XnP_uilNbC;V+g4q@?upYh5`Qz9ilFE literal 13526 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

7C5UF2f?XgD`}JF0}3{ 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%0A-Y*KowiPDAXxn%}KR6 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 Qit(zcs-uEXy8G;Z0Bc}{K>z>% diff --git a/images/contributing/new-pull-request.png b/images/contributing/new-pull-request.png index e40d55a899b5d9a48074bb011a6f356dea9f1fc9..262b8ea316b5a6b0decf138820cc14b512167ceb 100644 GIT binary patch literal 6269 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 literal 6123 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�dxoj@BGqtGW% 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 literal 25629 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

9X;U3B;~m2vvl^@>>09?!&Ab1l8o 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 MN-0W~iyMCbU!A8&EC2ui literal 8799 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 b652Ro2R!Lok?Ht+e7naF^&cSbzli!@ Date: Sat, 13 Jul 2024 14:59:26 -0700 Subject: [PATCH 14/65] Update conf.py Closes #322 Updated conf.py file to include direct URL to Code of Conduct in the footer of all pages as mentioned in issue #322 --- conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf.py b/conf.py index 8da5cd5f..61e2b1e0 100644 --- a/conf.py +++ b/conf.py @@ -109,8 +109,8 @@ "show_toc_level": 1, # "navbar_align": "left", # [left, content, right] For testing that the navbar items align properly "github_url": "https://github.com/pyopensci/python-package-guide", - "footer_start": ["pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community."], - "footer_end": ["copyright"], + "footer_start": ["copyright", "pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community."], + "footer_end": [], } html_context = { From 04ad164f66f7740d1d9de0a18394feea1ab7bc2d Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sun, 14 Jul 2024 00:08:02 +0200 Subject: [PATCH 15/65] docs: update the images with text --- CONTRIBUTING.md | 84 ++++++++++++++++++--- images/contributing/edit-button-pencil.png | Bin 0 -> 4745 bytes 2 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 images/contributing/edit-button-pencil.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8f1ce505..df512138 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,20 +44,49 @@ You can do this by clicking the "Fork" button in the top right corner of the rep The Python Packaging Guide is written in myST, a variant of MarkDown. You can edit the files directly in the GitHub website. To do so, navigate to the file you want to edit and click the pencil icon in the top right corner of the file. -![Edit file in GitHub](images/contributing/edit-file.png) +```{figure} images/contributing/edit-button-pencil.png +--- +name: edit-button-pencil in GitHub +width: 80% +alt: Edit button in GitHub +--- +An image showing how to edit a file in GitHub. The pencil icon is highlighted with a red circle. + +```{figure} images/contributing/edit-file.png +--- +name: edit-file in GitHub +width: 80% +alt: Edit file in GitHub +--- +An image showing when a file is being edited in GitHub. The file content is displayed in a text editor. +``` To preview your changes, click the "Preview changes" tab. -![Preview changes in GitHub](images/contributing/preview-changes.png) +```{figure} images/contributing/preview-changes.png +--- +name: preview-changes in GitHub +width: 80% +alt: Preview changes in GitHub +--- +An image showing how to preview changes in GitHub. The file content is displayed in a text editor. +``` ### How to commit your changes When you are done editing the file, scroll down to the bottom of the page. You will see a section called "Commit changes". Here you can write a title and a description for your changes. Make sure to write a clear and concise title that describes the changes you made. -![Commit changes in GitHub](images/contributing/commit-changes.png) +```{figure} images/contributing/commit-changes.png +--- +name: commit-changes in GitHub +width: 80% +alt: Commit changes in GitHub +--- +An image showing how to commit changes in GitHub. The commit message is displayed in a text editor. +``` -click on the "propose changes" button to submit your changes and open a pull request. See (How to make a pull request)[#how-to-make-a-pull-request] for more information. +After writing your commit message, click the "Commit changes" button to save your changes. ## Contributing locally on your computer @@ -70,7 +99,14 @@ git clone ``` Replace `` with the URL of your forked repository. You can find the URL by clicking the green "Code" button on your forked repository page. -![Clone repository](images/contributing/clone-repository.png) +```{figure} images/contributing/clone-repository.png +--- +name: clone-repository in GitHub +width: 80% +alt: Clone repository in GitHub +--- +An image showing how to clone a repository in GitHub. The URL of the repository is displayed in a text editor. +``` ### Create a new branch @@ -170,11 +206,25 @@ Also make sure to check the formatting of your documentation by building the doc 1. To open a pull request on GitHub, navigate to the main page of your forked repository and click on the "Pull requests" tab. -![Pull requests tab in GitHub](images/contributing/pull-requests-tab.png) +```{figure} images/contributing/pull-requests-tab.png +--- +name: pull-requests-tab in GitHub +width: 80% +alt: Pull requests tab in GitHub +--- +An image showing how to navigate to the pull requests tab in GitHub. +``` 2. Click on the "New pull request" button. -![New pull request button in GitHub](images/contributing/new-pull-request.png) +```{figure} images/contributing/new-pull-request.png +--- +name: new-pull-request in GitHub +width: 80% +alt: New pull request button in GitHub +--- +An image showing how to create a new pull request in GitHub. +``` 3. Write a clear and concise title and description for your pull request. Make sure to describe the changes you made and why they are necessary. @@ -187,11 +237,25 @@ Once you submit a pull request, a series of checks will be run to ensure that yo You will see the status of these checks in your pull request. -![Pull request checks in GitHub](images/contributing/pull-requests-checks.png) - +```{figure} images/contributing/pull-requests-checks.png +--- +name: pull-requests-checks in GitHub +width: 80% +alt: Pull request checks in GitHub +--- +An image showing the status of the checks in a pull request in GitHub. +``` If any of these checks fail, you will see an error message in your pull request. You need to fix the errors before your changes can be merged. -![Pull request checks failed in GitHub](images/contributing/pull-requests-checks-fails.png) +```{figure} images/contributing/pull-requests-checks-fails.png +--- +name: pull-requests-checks-fails in GitHub +width: 80% +alt: Pull request checks failed in GitHub +--- +An image showing the status of the checks in a pull request in GitHub. +``` + To get more information about the errors, you can click on the "Details" link next to the failed check. ### What to expect from the review process diff --git a/images/contributing/edit-button-pencil.png b/images/contributing/edit-button-pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..fd64a5019268c425fbab03f568838d7e400f2a69 GIT binary patch literal 4745 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 Date: Sat, 13 Jul 2024 15:12:28 -0700 Subject: [PATCH 16/65] Update conf.py Closes #322 Updated conf.py file to include direct URL to Code of Conduct in the footer of all pages as mentioned in issue #322 --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 61e2b1e0..7fde7dd3 100644 --- a/conf.py +++ b/conf.py @@ -109,7 +109,7 @@ "show_toc_level": 1, # "navbar_align": "left", # [left, content, right] For testing that the navbar items align properly "github_url": "https://github.com/pyopensci/python-package-guide", - "footer_start": ["copyright", "pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community."], + "footer_start": ["copyright", "pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community."], "footer_end": [], } From 63362bcde3571e697ff7434b568492dd909981a6 Mon Sep 17 00:00:00 2001 From: Han Date: Sat, 13 Jul 2024 15:13:40 -0700 Subject: [PATCH 17/65] Update conf.py Closes #322 Updated conf.py file to include direct URL to Code of Conduct in the footer of all pages as mentioned in issue #322 From 301b9b5718fdae85ca16919276e52565f8f9bbb7 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sun, 14 Jul 2024 00:17:31 +0200 Subject: [PATCH 18/65] docs: update the images with highlight --- CONTRIBUTING.md | 16 ++++++++-------- images/contributing/clone-repository.png | Bin 15540 -> 15399 bytes images/contributing/commit-changes.png | Bin 27103 -> 27235 bytes images/contributing/edit-button-pencil.png | Bin 4745 -> 4761 bytes images/contributing/new-pull-request.png | Bin 6269 -> 6410 bytes images/contributing/preview-changes.png | Bin 120971 -> 147410 bytes images/contributing/pull-requests-checks.png | Bin 17614 -> 22814 bytes images/contributing/pull-requests-tab.PNG | Bin 10870 -> 10946 bytes 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df512138..be1f3b76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,7 +50,7 @@ name: edit-button-pencil in GitHub width: 80% alt: Edit button in GitHub --- -An image showing how to edit a file in GitHub. The pencil icon is highlighted with a red circle. +An image showing how to edit a file in GitHub. The pencil icon is highlighted with a red rectangle. ```{figure} images/contributing/edit-file.png --- @@ -69,7 +69,7 @@ name: preview-changes in GitHub width: 80% alt: Preview changes in GitHub --- -An image showing how to preview changes in GitHub. The file content is displayed in a text editor. +An image showing how to preview changes in GitHub. The file content is displayed in a text editor. The preview changes tab is highlighted with a red rectangle. ``` ### How to commit your changes @@ -83,7 +83,7 @@ name: commit-changes in GitHub width: 80% alt: Commit changes in GitHub --- -An image showing how to commit changes in GitHub. The commit message is displayed in a text editor. +An image showing how to commit changes in GitHub. The commit message is displayed in a text editor. The commit changes section is highlighted with a red rectangle. ``` After writing your commit message, click the "Commit changes" button to save your changes. @@ -105,7 +105,7 @@ name: clone-repository in GitHub width: 80% alt: Clone repository in GitHub --- -An image showing how to clone a repository in GitHub. The URL of the repository is displayed in a text editor. +An image showing how to clone a repository in GitHub. The URL of the repository is displayed in a text editor. The code button is highlighted with a red rectangle. ``` ### Create a new branch @@ -212,7 +212,7 @@ name: pull-requests-tab in GitHub width: 80% alt: Pull requests tab in GitHub --- -An image showing how to navigate to the pull requests tab in GitHub. +An image showing how to navigate to the pull requests tab in GitHub. The pull requests tab is highlighted with a red rectangle. ``` 2. Click on the "New pull request" button. @@ -223,7 +223,7 @@ name: new-pull-request in GitHub width: 80% alt: New pull request button in GitHub --- -An image showing how to create a new pull request in GitHub. +An image showing how to create a new pull request in GitHub. The new pull request button is highlighted with a red rectangle. ``` 3. Write a clear and concise title and description for your pull request. Make sure to describe the changes you made and why they are necessary. @@ -243,7 +243,7 @@ name: pull-requests-checks in GitHub width: 80% alt: Pull request checks in GitHub --- -An image showing the status of the checks in a pull request in GitHub. +An image showing the status of the checks in a pull request in GitHub. The checks are displayed in a table with a status icon next to each check. The checks are highlighted with a red rectangle. ``` If any of these checks fail, you will see an error message in your pull request. You need to fix the errors before your changes can be merged. @@ -253,7 +253,7 @@ name: pull-requests-checks-fails in GitHub width: 80% alt: Pull request checks failed in GitHub --- -An image showing the status of the checks in a pull request in GitHub. +An image showing the status of the checks in a pull request in GitHub. The checks are displayed in a table with a status icon next to each check. The checks that failed and the details link are highlighted with a red rectangle. ``` To get more information about the errors, you can click on the "Details" link next to the failed check. diff --git a/images/contributing/clone-repository.png b/images/contributing/clone-repository.png index 8702d0848740b0e2d3df233958efcf77ee4e8c8c..7c0ef8ef2971cd232d9f7216ab144f342359a258 100644 GIT binary patch literal 15399 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 literal 15540 zcmdVBRa6|&x9&@VySqb>KyV1|1b27W#yxm&cWETJySuvur*RMN?s7W+ea5}xKJELk zAI|A9Xrb0xwW_+-tnd5H+2M-v637Sy2oMku$WoGG$`BBr@xkw};9$Vd<_U#z;FnL% z$`T?FRg*+V;15t1!g9h85Vf(0uSU?|&+rbCTFwv<7%u<*K5dwj{)B+wladk>R{g1e zwhrr!xkn0fS?r~BZ?o)mVI>SDCIkhQR#))34hwrZEQ0HuZU+k1i)mT334zvYl(yV3 z7h2k1*g@si_kOzWa zkb2{U#l*xy3`fYo8%3E-(a_Q3$?;ghn?}&SODMcJ!O<(>SeTeVTF^-Bx;P7G>2h!F z9_Cb!c8ru*u5~%1x{LIq@Z^;1 z@Xq(V64j35Lg>$VVF^p--qPM?3H!xsX{9dUMhYDlw-|aDFDNM3T6orTGozaGEuebg zEl6{KT!0$I@oEKYSafu5NFA}Z$<3{%w%(uE=1RX^_-FHkkWXc}oQn%mH@?`iP)8GG zY&3}atjCdo7B2?no>sl!SJ(G9MuSfOkwZMJuW_*V_xCIJci3Bu+oMJ%&)sgAn3#d( zoOb7XACqGqtc1Bfu z$Ajs(h{(LT4THJj2FODS$K)vypt3#uh??DkiB6-iN;V zzncD6E(ue50)9^<1))(C@piaP@<@0|taooUwJbgcyIs$M=w>oilQCgoQL`6?(W;5O zSF*RI)Y*QX88W7+WzlS?__q$%{M_zmdFcn7A+&^v@AyY&D&%{%Hjl+0?1@u?otuQM zC?UxGUkm-C6B#J- zkXVt(s;o{TDt21{UJ|Uoph9w1-O=-dVPIjsT3TDliraPS{`O0FRg|_;*k+cQ6u(J5y1gH9IYQfrOp$jQLmoI1QGi21M=h=w z&PLh&$=KRDKLl6062_W6jJDlmgscwZNP%3?aR2zUfN7Kq*FvI^;eLi$eR>pf$(>cQ zTS9ChrBP(4_UZ6r-*S%q1j@k&c4KjW^MhZJ34$oAuri|qQseGLOe>h(d1-aotOSPg z>vD*0no`q~3tZor(Vb$aI=?J;8I!c!76B4yOuhP!A?7Gj8QTq>up2)Zn30y%e**OL zXRDuXUqnMXyyNlZ&Ik5)r{*=id{^JtJVVnOrXNSUJo1H-{T(9woJXU_b06Zr#LRv5 zX|wE$;U6ylmA8*j{7vgbcQqeqrF%4NY-BI5lRY}k}W}aUf)gUfg;q7?% z-uux`X7h9T$Gk6e>ZK5Ogaw1gxwgs@@{{2tp6dj-gv~mAANn>b(zfd(eF0=S?~LdVO{!byV|y|O`|R6N3QpXRW%b% zQ_M(O`RC)5`3sd0v&wypJexnae^nM<635g94c(kj)uAn$88UK%-7s5Ck=;T|IARSR z^-}eveYx67@yA4l8VMql7+`bt!wG1UR6s0LJMrac$H0p483x$$x`l0j;kRNVmnZKy z64m%-RO9q7DC4g%X+U4hq8Iqv zcT9L6x`f+8$@tdIL71;zpXcUHiVXwj(+^LI3JYgIb%LR?r_I7z(=%T|N>FZ+Wi&4IpYJXs^urlBf^j+7uMC~ftXL!=>&RKx}N*_Dgz(dJW($JpXdBRJ4) z1&h+B!0_qSd(rqc3OHkz+$B`{%U5sz@8Q7uLxvi)?eNBX{|rmE{(wm2ca^Jy#}_l7 z5WgtjuUUbq&6V~VW3j(O!a4YE@0NiKU)UvS##OPb_&>9CT|}?2ZmRDWZU!B7DUzFB zn`5y&6vtVK&=;7k!pl+E7D^S+g_I1(3ayG1fvj?~{KUz4f z;)iQ}Y`<)+kT3vR^Ude(k53(5b~YQg;#J|A6pkZ4ZQ2ag3P~hYDSygR;=R(^j8C&1J@?3wazA?)vY(gT z&xs@WK+d0Tdx84He;PyG*)h{>E48-7LJY|R`1AwdP_a9I#Kz^mZCp0@HM`#P=v1yx zq+47MWM2}cd-v7+qh8kFhD?jbte}FAx?b4iXQroO^rg}V_`+IVIXdhAX*713_E?|} zjpgDdW~!Q$Zg>&1Q|PrbEIh|Nvcs#^apwKUawpiyE=K5gX@!cvda5Qv>$G95?J(M- zUN=;?BAG>28{X|0XR5LilQ}d4-Ouf`Sy$!EbfBL&lPz%*=|eRFQCfD>O2Dq}roR>8 zXSGMXga*MM=FOQn&o_(b_V}_0d1t@WY4dzs?**)AqLUa(38LsgGbSl+7V7pK_UT1r zGI#NRe#H@w*M32AIG%+;ZgAOFtwwH>Ar1B8G+H!M!LJ|boMSP!4a1S_xZDmQ*6cL= zl)|taM65zUdF>zQ`sM!ZRX`oadew&KQ$|zTv&y&C7I?v*Kd3MbNp_dLnM3ZZLuQZl zzcw5euaolOG0e`*s37ue`n6$_SLt2;UD0~<9x#kb0@3t*W17BSA1_a>oKVR`BH?8IdvH8v*$T7zx%*yp!PlTL&p^Hf6X8Lxm+o6@5> zM~b1_j+BUI;vo6Dvl6yPD^EoB*Cu)b-)j{0(UUr+aQP|iY9{FeZQGi>k6YDZc@CYE z!peRe4nQdZyvp$SZM)|#TvZ+&5A`B9TjHub;>``sF*6;4)p*0S^-Bgq-vTmkqYjOWUsbwQydFox8NG$ghw*t)P;G9+)JEg+ zFWsw&=9$r*g2_%JT%?lXO_oUh$aQ7W00cai4oJQUpU-D&GdZE01c&a?IJb)gHuEA$ z#qO}|ET9_ttmur~a5uu%dopj?NY+Y)SjG}{sy!7At;O;e`sdD53EydjKH(`(rt%tQ z)1wznU(@`q`|W}XZp)GHraDI-@jb5&PRtWO#ET2pCm{RB)fJuNff_j{F)y1|-6j_% zlT<48hQd?khqP?^cZ%|6;Se?kocOC|>W@=H({oaZ4NYg)MM4;d?GT9=2{$B2oi0)n z+}I_>gE%L6O*Rxwzu#rLAIP*gy$3^|`A=$+>)$a}dLIEoFrp!RRdF;ChYy(JYfW=~ z4Ytk(DC1TL>iAp)Az|!5cViIA*+M^|?OhZ(ou^f&b{`L`D@ zfI4B(lu;gQ-OxQp{IwP!0<7beBVLCo-vZHQUbPf2Jb_b9lI=*-#-*p4fk~1%ZBeL9 zch6A~KBD0ILb(Xh?;N^0!~+TW)@Zn%-WyiuYy;idi?KIb+=@p>5kDjj(9DN;g98Kk z0Dg_(gB)e2KD0=%+Oz45@5SF=Ziqady4q6JGe_8sm(Hi8un3z@t-IIPW&f-{0Cwt2G5)1C4|L?%(x@wC~ z46v?7mKtg2|5m*eGbd0wugXWxXJ>~YVS2&%mFmaJj~L_zw2i3cmF57FhZ2Zk?*tI# zM+)VyAPl;{0Iy>@!*dFV1@)ZzToT;TaTC--Hd@k(VzL*u^p{lCNL1^h|IK$^_CgcD zk3kJ{e-eIeCR6^4{6;~fC$-DV|5(S!+9Z;+U0wvJ&2(%%D^GG0c(1t}Vsmo9A9>4R z^-x*8vAca9ysf8AZuLXUnAeeVo?WA3%Wy6#SlHv1Bzv2@2&Dksv&3yO)=7#7@4=zj z(q3h9%dW+W@p_+t{jKRFaE>W4-ZCx{TQc>h?Yq~K&vp(19;>}r4_XtK8&s$g8nSgE z1KbzeXIka*lw-qIy4LNoqcu12g6CH;E!mk_xnEkVbv_mf=pKg1zR6MB+tF5txT!p5 z+VYzo87N)ji-uk`e_HZ=6U|uz^#qv)1R~L^-U*8`n#@K!8MAD^vUy#eyh6gUTtJ#Y z)?91gv%Xj+-5*07U1PU;Q>#-SjSx7QbAL~-7B)9?3V-H=^)QkA5CFVOk@#u{+gqyg`-oV4#qG&oIgI zJQYV|`;Tc&ne{(mUsEkd0MNH5+?Z?~x9#dU#DvjRY@s;^zqbJ!v`rUNT>cccUd2Wu zmTC;&EIGADBvq{yOSnTC7)q+L<1Mkmb^lUKtWH9mJ@EpnPy7!wfWil8>SNm1?yqnL z-_s&VmVI5MzT97ERsm@Fcs+8BorZf5DrYqA=9a>d{n7x8YZ(tiJ<2PxJ)e;**J1R$ z?nD;lCuYo16uTqnjC+Y0JiW@}$=?w}a-Jf!wJKl7r`&t^=7X^%?hC6ly*d_~3kamH zjb8SDdR#)uroA%^-C76kuY;HFsgu&ew*fv=5E1(qKE9|V7WZ3rRI7=W#zTI4&pznC z2%b&DhXOa4&!RR*Yug|AA7}S~w8316a|%%uL!zu1l5gd*#sJRr%GyCFnAZ zoitnZtJU#leDv~IBg3rc^7+a}r_xKCuAc~x`i9`I@)OJ3>WF@}Z#??PixWSwfKb(E zwr!K*c?W*Z2=@!N$qo#tc@pG|=SCK4Pgk=F`|(tzv5X#%O(gkSf;CR9e^iAGBH7vp z_%6LI=B$>guzBS;P~}0)Hs{}>taXsjjf5|`@ga)G0$KddX&Xi=BdB*&<#aghvGgnU zV@7(|F0b6h2FdH0{Z!fJE@JsGLw%H`24(`5Md;OhAG`G3Up3O@EaVgc<928Fx-K5i}?A>l2f{j_8^K zh%z&ih6)xoElXVgdaiTwTIBXmL89RlqBho`5nzYh3*HSk^IDw9(DEAn^SZb+5(9(7 zl&m}iEVcL-$h5K1VG#>WW-HX_N^Z&f0{EwG!nY0&eH3T}Bq%zBV7Rf;KSS=rfv%)2 z6dn;FtgHKNO;<0jAEafF$a+7T6D4V%9hGMfVk=O9;ZMW38;ygwstFGxkr(l=&&M=w zj6=i5kM_#l26F|G1{{(+6XS&J23KYAu`!d~+DUnND+D|-F|9NPNT_(%Jtue2=K#dK z#u_pXjCgGaFb@;^`SV&uOe~3x(rgcG{g+|Dvm9KK|1N*D7ys$U#98&dT}Va_?=u9TL76Ol^I=nm@U{ zox5vgq{vs3=qr?7m$B8J>(J0FF-c@) zpVIF1LU8{=0*WEP2r9%0QfbQG9fJ6-bakj+O-!IsQVkvRWsy;yMYiB-5briUoEH9w z-SfE*Ta|VXzSu=qfs*|j5iX;FM5%Fbb}H#cUPB`JEH0CQXqs`bDyE*cUYjHSl>B)R z7bk;hL49d3NhSLte8JC-DY43cd&SjhuG91yj6wt)U`%$AVJ`JovTf?t(T3w(Omuz% zU^PsxVVCX^0-lI?)$Zs~$O)(2iOiuDMRvRQ`!&C0Yyxz|cIJ0TBh1_wtfXKncN=-P z*>|9eGX1XK)u^nMAtp(zyEdxgCN93_wUC@RfD0q|@G6l22_6sS-i=oMi-{m64mNi1 zuO6KhEn7YW?2&$g=;B}VhLSxs&Gr5gy&Vooq>p329&mi3%wQKG8NXZcpDU&$b)hnC zAKK$Xegp8$SKu(WfqdXqJmuLL=D!fK;!%gy;ou{aW%6BYAc{^`^3ujJ;UXMN_O~oo&(rZt|rOGL9o8qUs5;p}*_jAsei6v@Oh? zcXyv;X%NIQC`?8_^)8QoI)D(a>EJ3O@!7^MZ)3c@26u)PCZozSB5nljELe+zJ@V zm^qMnUXPIaiGMV)-DpybwIv`T?036p(R6we5fg(^HyjOYyXiQM9`%E512N14o|pnU zz8nTNW;x^JZW*f87Yb?VS>cX*gQ%wNu!tCORaGPk6XP#jJ)l9Yw|6C0ElQ;&FiG@` z7#-{s^Yo>S49n7Isda=yjqT|SlT>Su@1NjUPDj4+0W;TP-Ik{M7F-GbQz=%RaXd(1#wn8P-Ri(``F-}vD_l&h%s~8ojT;>wJ9sP3D}fCI8X4R~ zStIDr_P+6o6dHPA;A@KVhAuZcHgRD4g9zq-ZP)!xgpNZ}TE-O~HY*w+&gjl5CMI6) zOR%5wFM$vdSx+g_7#H6F;4V-H>I4glsQyLV;DpLhRfJ+)1R$>WmNI_9Y z0{ahdOWx3n!l0w0Yo*mELgxKfo??aQ^bAzp!up@wh1&A!>Q&ti_{%r-acgorPWexo zqhgFtG5WvW#Y|BB+X&Zsj`E+8@B_#LXKnA&U1_zNFuGoh+PZ?m>dG#|;JgJ~d7itu z2|{Du%bBP=!3R>86Bvq89{AYuASf2p6iAjwBO`0`?Vgw~BDVVxC2#}3`g2duwh7C9 z{)f@Y47> zO@Q^x9%fa!GH?mQsP; zXTJv}ouv-!_^$x5cBx#xNWU{P?>NFoB@X^N!#M9V^qhBp_;>q3l&Mw)Y4CJLov*in zugo7zRv0)WG0F5ACc)o{`Q3^s~dAE|6msb+)e)z^ZPhN?|jt~YqemIBrvfn-F zQ0Fu=7F{Z7b%T8%1Fze5#|0IVZzt~Yd_@tktJ_x13j;fvZ$)5x52!Dc@7ZW%ZOsGA zVekBrYtrJ(DaOF0mWTKJa1`?S>8AG~Asa!SamDv|J@>8lY-;_{Ym;0|VmRlg66%?& zo5(1}4^Y#<*%t3oiz^KZDSvJg%}a7$FhY*R!F`Et?r;4uu&VxS{oQVG1G4CWa!RjA z)e-4zQ)1PkwUl+?C#q@GxCW$FV!YlciuGHF+~Ld%N5$qNFCTwIj+6-#Xw-UkcZ&Hn zGae41trQrN4m86QNG-^egU+qhpj0i_#@;qE3R@_*R>gFIz&#wiydHd^WBcCY$`4XWLcRjV{n{8!$;?CO_vQ6-j?(8^}8kiMXjsJx(o(;pzB+q0?q z#)IxM;AgiFXNdN9fgF8<{% zf&Wg;<9hmQGE;x3Qm47bZ5;-SQ5TNGT2;bEm#FCDl|JR0P7KLo9N*41%jLS@Zv*=bt6RCjsW5jZrNjkOY4wjjZZI3~gDETiOKJv*eB4}SpJL+>OWG*+z4vejS@D2Ek}V3&?B zr|%K#&Yom6dIh%#JY7%1vh;Xzd^6K&4Vse5(Bt+v%GG+$c#E`QmnEVI1mLDP>`L?_ zgCIH2JbwQsQkxjqfRsSP!HJjOZ#^fyF+ z#fk_Eg87+oXmSgAchzqO;;vDd?LUKYie43qRN9l6M6baaZZI=X$uYW z1qDMH|9O zzO*v)E#rYSizIkktAIJ+VohyZT)#Z?-dmZ?>G{+H#H}V7Eh7Iw1lW-6lcQ&tPc~6&3%! z=f133soABgbthr^)jo@lR=)%9JUFC`Eueg{s&qdl0(*?ouj|#b6n2z!^9d1`*>Bsp zgVU3!?fx)WSafrC5hI>M5-sk?s31fL<l1t z5^g!H@4N}ccGI+H_&(VZ3qsRQ+aP-KKW-jInpPmuH$6Q) z2hLsnJOP9Sa|_`8dRse=enI$l+OsQ3YC)5*ykVQGCw%@UNsu)5SlP-i$e+ z6=68ShM|@ao^C9&01%l+|%FGHe)k_no9Nu3&7~V1_-4d?vI>R>AtJL4V;Y?&l z#|oy0Exz3SXmv8X!vKp0Cv~QLhTRJ_6em_~3J&E=CL@EYa`N7Rgx|sAX&tXVGTooK z;9G#HQ1{#8DFpkWQDOxi2S`wf(`9jG$o#jUa(c-J~S0XU>9B)0>~y8V$_b(^g+5D-P)?aYEg*kgZUeJu!x zB(f}5r>kDLSaz4>ActFKI(_!)=E>1c7#=Y(BdlX^7KA1j6=^QNEmBu2H8E66rF#{4{E%$T|Hx9lG2dULnPTc!nUG_s zvpw4KywEQp2gmr>#nF*~KZ~PrD+s0jHMOnT&}JpaOEZ*ecyZ`ooQ@oo3Y~s%adY$)oD)^_Zp$i15>B@OwnY*;3WSn4zM^7v8hf)AU{rCp}>e@#F0XD8VR65U=30h zx0YfE)_o8j5pMBbo;`e=MLag7HQTGuLFvFCtAgH;v^0(vfOCRKj>j@r=2h&J{-GwH zu4&qiq4|7wTow{A_Wh5jW-woqZkjS&i<=&ZdZdwV_d-7;*$uF$-ATgzGkX!`-dE$* zar7eM{x!Emu?Y$0_AF}}i<|?GHAqcF;X`1(@fxV=5Z6VHe6lcP&EH;9o`C?5`E;|d zbYj2OQK)ZnfWlOUlCK;|nJ;p@z#2^EaRDk<@4F)uUhzHpF4EtpdI`9{ zlck#n!Lab~8K7xYXD5F;`@Kl?G3fT6BTK?*wuAk9S&IoySz}b`BdR|9*x+kbDsT`^ zV$wlqEYnbWsQ=vkt0y!x%E0_jUvaiy>1KV*D5;!Sbr%1v*S`@GE-&FKbRT%%*XmIn z9UY%%cbAu!w_AshXKMB6xp=vcWJqJ#gQLK4{qOlY+U?morUz?UjGc9<_4#Y?NCqbp z%Ee|r6BU>~?5?471(wd4Q*0f(x^C7>8mX45l9I%R1YsZcS8|zKl;PxEHKBg z?`WgkL+&N2exDz||BWk(Q>wF}a`k$>^xgfl8<|`~k^4iJ$4`5mVB5`sIi#BngEJuD z@^7<2zRQvFGXZ#Cr{uf(v;yxtyr6I3dZ0)YrY5nBl&R9EUCFJb7BiX!yOpB-n}dnK zs|)17b}y99fqW`*%2n6b4zMgsVf;Y$>4eRbj&7ra;_%!45rzLCFlo?|0|Z~7V_n9^ zCRhDT&T2g)*-T6uq)*fTMlZC&sE#8>t40ai-KiRgUaE?S;s6GJd=7YVPHphWKGiP5*nq`Y@hEj z{{66w_;dpHNy6yEKM?QzT=KWTS)c}wThF9zcmKnw6zJ6H{MPYLHXEcJ_uB0&_$yvk zksRT-S?f@lX!g7Ez`FUCw?AS2M<)PPFe3t5M#E^k4utpCd$0u7;Xaj8jtof+_BS2r z1`jXa*AS6aZeq3DL_?yZk-_K1;qVgO#j7#)*utoR*ZtghjRhIw0+>Qzfi>k6``eNYo#$dPJRtN;g8qbzMiT59> zF6`34Z!x$!-{*kozi+uCJ7HsbW@d!%rY-@RxL`D*+2sjYrPrMcWR2fXPN0gQU}cp? z_VFQ_C1$Z zAoYY-SzWGXv&jD-6h$W@isFRnh~a6pHo9MX!sE9yu3H5!7wO3>6@lX>tG_VE0~-lm zF+|5acyBK*!}MpXIR;bU%za^=Hq8Wm%5JS3K^lw>k)YL@VdT7NiGp}*omoRpEgUo= zPEYBaz~NthAp;YnY&HwkIoZl|4n;CQUmvSyU9d6yv+TURzaL`Y_xwo)cS1w%+le}Z z#6wkPt?Q~=g8P4lob(h&8?v5ARF-WnE;3f{`xkZ;1B_3=x z|25!G8i8(2po5GDWnNebo90!~>o6*n($xjZwzR8cI^u|E4I2{%-rQR zB<03!gHcblix0NHKc^~Y-)WlQiFFhQ zaH_z$Q(Fc|S8AtVy}hsG!ahOUN_Tu1Pf3zWuuu)$CcpzPgSOpyrmQ`8Dxr0136Vgk zNY3ZZ2#e#z8KA&nLiQ09uf^oBvv8G5C=%hBAgq@csMhf)&m+9*GeMSVPzc<(X%89) zKvi^t08|SODK@KJl%lveSGVlZECOEVuaJw6aYn8GEC#d!5i!wip%o>ij?=+d;eO%N z$QI|bAakSrqIxnVcpj;FBt_)qz&8~Xd=bVLHCe%?!rkui_v3q`y{LrqxOiT7Mw`tx z^l_XijW@h+Qiqy#4t9A~FZ;+~t`Cwil~qzuaLvKN6ikn@@BTpNw1c8z7aqBsBj)`W zP-pm6P@oN>qtz)wTBy*8^?5=4!l%yTSf$^tzy94)@x%Y&mRVVJ`%aeft_3;c``;B; zmAPvO*v|IL3_#q;CCS=RKCsX8Z<0;jsSgp}+@~7ls{>{ESJH#_OJx8^5tW2uN zsd43!gc&Zk)Ws$qoy8u7xS&d%$8ee%93445yBA2$c-(pef+J_zEl|Pf;~$+a&+}z! zkeT{+)#3?~2Fd98LuDt{x4vhtvd_ED17a5EG}qx_het}?ZpbZdZ6)*`RodNJ2I-oY z>o35Vn%~V0#uMUe$gQD7c2y-B#UWj{Gh>P)KZ$l%@a&N;ha#vDr>pHRf=Kxj381Pi z2zK&OsdKF6r~z6|UrHox!{(bBEZ=_vzAra=p+;aa1|11{M?MV4`jht*QI{qDw z>7z*$P!zTC(`hBB-~aRDT(^})Y1M8tf$BB^d`6bfdW~uTibl#lJnf zibyvV_}Xe7^2**}xmq@8^0NF8`i@XOk0&`d(DS}Qr)4ItsmbM=#v-FyC;U&l9FBCoPy-UL`az!r$XYA+@R!38N0S20h%f3n6dla?t-$5Ks0nS1$AV6@EOBUw8%nN`k!NW`cXdIwoU+xE zcm3z5wS!56uq>bFT(F)zz8iZXxnF2sYBHfQHZf6ar3gmM*U#huBzV-zd_0x<^=JEK zmNK!7jy$|LM$T-UZ1}t+zMVGPtY=-?$EO&Yyn6xWswlyV@mMB2O!XOV+uWL|lj_lf#dD;6Vihxa@xFq;A z%J1DZg~#xt$*EC$VW}Mb8Zg!DGfWBx2d6k*7jc8j*yGh>=zYD6d;B)?lJGzaJ7O~Y z@k3QLi4M5Fpvv>>oMl}^yAT5qpuqp zJszFJYsA6HsShkV`d+!&=Go6e?G-zYqZad=P$IPd)e)R)C7(bdzPKH9s7AFrEx8H=LVcvZs;Pvx_s5Rdr@8;po8 z4Tp8zC6oNkpK;}Yu~+>|#{_f1nw~B@DlogpSW_4dpZTM(;Hu#s9N4mw)mhNjb1Z$ajR;`DUC;bkv@*mm` zsAi&5t0?IkJTUMMw(ojj$>sjWJu6#hazI*^R-;f<7`H&W{oj95uP_S;p2-koe7S zt)M>RwC6{BU+{dIZJ{*wOtn2J$nK2aFpejK-+R|Gg^zX|-zxT8Pc?CBr*M3x)r;v* zS~J;l{aI8;HJF0s8H2P@z1`|$7tAZI%K!OsRoXhzF%p&J%5ST>0IbySk`I1K>+hsS<#l zWRVDm&M&T@Cl?Y$8(+4&sa~n{h6UzNVrr$UtIONbpEk<60~(B~^_o9rw%zvp5*Bp? zpNIFuihP?i*3`Qb7gw|-0XS0mXQ+uR`)ChD94emi3A+n=$}j98CzRZOI8@E|_u9Mk_#U+`GkhF7LgLnvOs}5;L(N7Z z6Qj`Z?>5?(8ho)kzzi%!?)B2d`+YA-tezg9MF7O=sm{Ds5Ou{O+4Bx5*?*6Sx7fc0BwP1kfC zG<6JVWVE$L?z#*U^=~Tegh>b6)rO&tWwy(EoqpBg9&q&MbI^;f5YqR%G9F}h?9&9B zT@{YpZ+iEH;QU`1u!V`Yv-&pfK}{7EZ8m{!%g~TAIEJbHOj(H;2UZ_~120KuF@>oniqV_dGwS8}A}k5XkK4wtiGjf1 zpAbuZQvin*vSoAh8dU`VE4#IpTqYkyH!lOLZBR+>@m8DJsv8lvr>sFb2N>7p)%eyj zjdwB6ZfgPvl_?sP_9M;U;T2dT#7EqDsGKtKtjy!5)SplJY}gUd zD@;xbe)NGg)_jNelc#G@-1f z2IGEU^>1x5G9A2usFu%k%x)P~#qXIbQN5`6k!Eo>tXBhPtZQjk6CR$5MR*uwR)6bMwbBf2{R|n{cOBoL@g>qf-t8 z{Cix^B9f3iZfx(;T)~1I28p1kYGJwB-X81jc3$R-Lb^{K zr%BJ6@WsO$)UfUyM5xXA3nfo*%CUF~JZFAAFxe#~Vch}B&w>9v;E^OI7P@%%4{B(sh5m;t=S9WE^@7W3!0H=f>*Kse XnP_uilNbC;V+g4q@?upYh5`Qz9ilFE diff --git a/images/contributing/commit-changes.png b/images/contributing/commit-changes.png index 44eab8b1f1eca072f4fb7968f1e19383650d89c8..40bc99dc8be4fa2856b5ba4b4362a8119950441f 100644 GIT binary patch literal 27235 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%0D)b&}F)209OZVrwjJRdj;@wQe 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⋙I(UsYiCzc&}n;kipS-&fuCFdf#h z_A(;X4XJ*>gVa|A|3e&`+@qz)$f!siSJxM9lFmq+?G1(YeQh*=78C_SQ-hk@fMqUZ z3sIEhwq(}q9dmJL=vRep3&oZVusB4qt0F-3{!H&5!W!=I5;3m|GT@CZbALWeG19ni zn7m}_F1l9`1-?1aOwTb`ja@*STK7uqXlfUIz%Y5x{OPqB0Q2F5dfS6PCa8O?)Ha!V zGzlCX-T!!q{6(5uRo0*I?ap`BuYorx_U!j*>Vo;ol>@pPsP%aAKw~n*9B8IaJG*BDMr2bPF4>pIVBPk%IhGM(88ubo%2KWMuwd%=xMzM`cRZbJXw!TkfYTCF26 z@}HhClwnU!!c5~&D-x{xJ>PtSO6C-bxaKF3n{<3VfSXn71dmkh%Mf%2 zxu3ikY`ELFWe4y_OMonSHObTH08X_rQdVlr^uWu59PzB$Yfie%rYYZ~e7ytZw(^a) z7;Hkcx0|l2X~HK;xGCRd1+Xw-IdQeA+q=578P*(-87xgx?Kpq2HZBgX>onimuv53> z_PXHopFaF&Ka=l&z^-!{tFL*D{GcxOaeTpQfjQMp@C(RNU``n&8*X?6S%1@G9pOfO z&P?_4*ja}`IELEojcZ>23LG%WKoF)P?-u6id+<(8O^NCH>k7iBjE|bn$ktvI_j$-Q zF?qC?Q&ZOpz>{JxPeqkFD!Nn|^&?_H4qus>gIs8ai#O7dU?n z4>PLpWCOU6!WM7CS+3hy1n$oB%a`|YyJW|Ib=Vj$N}3Pb645T!WtXm^2tvFzg zovF@}T&>-yKcl zGiG%A(oS7BPJKt=;Nk{;W1-q#Uc+c4X~J8~5d~@^~q`RTUug~4GWZy4W! zu0yqwa=>QnST>f0iKw?X~bi?qN*E)$q*$VVYAve`)izj`p5~6ZcTTfVyXIx3k z%}>MM`MjwY-lY1CS-tczrt z#ie`gSKXThtx6j$N``Kcr10tPmgo|Q)fyvtP>)@FE4kboF%e!yAWl|iE3WWn$Zs=m z1pL6S+SMT^$(gq8a;%hF-8kfm`)qzw=#K-IChWd-5qOAwU&8TDIAML!G>U=iMlg0I z0TkfgcNPGfc+1r~bgB8t7tro<2&LHumXTiJ#@h3l?Lt(eP~wxZ;r4AIuQwP0XxSwp zYk_u4JD)BbqEKd#0+j~n=%GR#M~9g`^C@tZ)9~dJ))sfh}h3>6aq{D zHRe{A#;1XKeQ5uV1h>?cq3QZhEi1%;j*KqhZcKDWmjnoA<0HRo)_)AKJ8<}sh8dif*>>^$zLD=}e}nM#GAjn@6H$p}s5irlpZ z;ZFy#lnP}$U9BOydclM5I!Fh2td}5Z1^E9wq_$ppen6HWd}fkpHi#x{8OL1}=Mw zC|xpZi*pBw$Bs@YtG@Ca4V6>khpRMvnBH42U%swO>!klJAdS8MfxlV;f2$1_7^Z!6 z^@PhdrH{jvIw~q}@z8y0DwX=tJx)ep8^gwMBi zLq$V;=oHp$#9k3FT|J4nI$_Nl7$OPYyhMFlG@WN;=pBEMa$t(h7a8gkD)nOzSvWa) z@0qE90+*66D+gE&Tf}AiJW}5T_$>bZ!Cj%jg?A%D6J-ob10K<*c6Q>Xmt=ECQmHS9 zKj@CDez>e$eegB#Jy|FzcB?-8O zls9s444B_NsbY|KUqD(qH9Uh(@*$uKX2f`azhPCqm%r?(>Hw-&{8?9e*g+6XB?%mI ze~Qb|8!`X=fTv{O6^a^qTrYWe8}Y>oQ0i=MGSLo2vP0h;0eW5ht>2MQ?We_o7ftn*(HV&1zbTSan6W{6TV9($$#-;IffD=w0E7H6dBH(OHL{==wpM8 zQ2KBOc123}v_QpBEz!*?rd)94d)4ylF|pK&azx`0U%aRC0d?o8&)m+Mm>Fn5tYN!0Sz!%gIBi3Wbqs`-Awwxc)vWUzJ-~a)iG0g; d{`@sE?Zjn0<)b@xj=;;Pv~L?|RH!*T{V$oOM_2#= literal 27103 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 diff --git a/images/contributing/preview-changes.png b/images/contributing/preview-changes.png index b9cda4a335653a88ef5d72acffe03919c4c9241f..57f4fd0e4958ab374e7b9078ea766803351910d9 100644 GIT binary patch literal 147410 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 F{{X-B1m^$% diff --git a/images/contributing/pull-requests-checks.png b/images/contributing/pull-requests-checks.png index 40a16e96244a83c670b8d790ac53b984d2e9b99b..38e52f5fa6e212b865eb8e2f71cb7ce2517120ad 100644 GIT binary patch literal 22814 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 F{|~}CwYUHP diff --git a/images/contributing/pull-requests-tab.PNG b/images/contributing/pull-requests-tab.PNG index eaf4f4dca1db07f48b183d0cf1d794840984c7ff..757d5f5c7b1d8395cc51b302a93e48ae681a93d1 100644 GIT binary patch delta 10485 zcmZ{KbzD?Y)4vJ`h=R1VECSMk(j`*T-5pAIFAG_xyG5xpQacGk4D1@0{;Js{hvbt_f(#NQkL>8tyOPK>nPsiXM@6%`+rbttVj|in6sKNx6^lfl!m^Ydb0!ygG3}WNsL=JB_3wRVdb_b`u^ldbG9gtAClPMX}VoH zyx8=qA8CTPFU^uwSj0?R&HtTs`nw4csTjF&57%#YK4%F1H}u~YABO$ANPqk;c9ELY zTim;F=wceCCeaY1dgHOf1OlB9vFgNsq@*HpcRW@u7ig?J7G02Sj3LA)#{JI&ao`q% z6mLD+sG-qwn_w`3y=*gdo<;EHa@GZ)U1^}=b3A&d2o);Z$a}Va_$|}u%RGfLP87wo z)~Txvp9_+bgyV|b`+^bC8$|)O`b)&7OXPOgLfV!Ip{+>LgN+}!A!)OY8JjZ?6@bYZ8z4Z$sRZ}b>1AfRQ&mydm4q>)OE#L zAsqm58+xPTF{r-hKANsCZh2LWq$h%S!e)HIpd`OJ>ox2ZiLkn27s4+92ss){f2EJQ zacD!wvVuKbXc5lY{Klq7c+~TozL3h1*AQ|?)|SxU#s%*iLAg=C7rmlnR7_Vr^|-#t zHq4kqJSoiQtAxE=IcC765(y6oi80=U`dGm=+9vSCG0&y>X=u2Wf+plDqI%AEVVoOv zNh*2H^lg)Gogljz7gHF((b{qD`FLc8fX~y_rJI*M-55O~hfx!9MU~)nBZrm4j*4x5 z*g;bZ3G~HbkPXb?^-gZnXOYta!_`!eFal2ikp_;Ytonms`#RgORFdU+VZc3Bt)o`A zS8xxH97uw~_#`WAl&`lXmeZTrfBpJ!cuHTrI8TE{gjEFw7 zy2*jr%sblVn!m`g2BT;6d;QjlW9Whc^upYQNXLXTR9UnlP?O4XgI zk{zi2kgE2r2oe*3@U0RiO?|9R{j5n^8jVunVCt?{6l;4bUWNDx(dyI9Z}~-#f5oeoH^icI%v?%YkAlAJq!4Y;?V1mQOn`x{eg)f7h#I#VV57>*=IZ zZHNGq5!;^xiZFuxtdq2hOfe!UMbI+@M1J~b5jP#gjv|3q#|UFL)$e&qE@mW~&1GqV zWH%>7-Me1RZB9VHzU7UvD~aC-B!084>K=^okojtxd|s5Xq{$A^V4X6Tc|(y9#?OX4 zlT1LNkMR+gxu?5e({qmI70P5QZT)uV7wtE`R0McbnkHRivmJM;`?8u4nv(iI-UHg4 zGg#=z2H-c<&dHGQV~?U6`XNo@UrBNr8c_ASXhFw^)H(AiZb?mAlhH8L!Dz64>~Kg> zETB}6F_3{i?0#KJPFD;67#Xt|X>K^P*)jRXR#yn$toaX90%PjTImKlATeRh@JEdIR zI>GbQ;i*DH;((`T8ZkfUadv%gWhw^P;7)HZ`T#07)&4#7k5EbCH+(d(XXl%RcM1(( zU;WrmqS>A?91&9(`r@T{NUACJ2kToDr+0~=v2-R&!J93wkwg>i1V6JfK1aFgpMx4o z;^C!T2b5#om^>05pNVp5s;sh(rR_~a%SVdHY4DRsj;dLhB zeUJo}7VniOelV*mYiSC5yNVl&=b~oDeu_@|9C)olo888$vl}rkm$eaJS<|^*E_na_ zRj%HKy&mJzVZ3tLbE%Yb+LKWbuhCa;rkJEiTc|r_q+lVC=U+I`6n^z-86nEN zkPo~nnk_xujkYoc(x-({OKCK$T{+KvD0u8Y#eyU!9ntLc8YXSh2i%+~n#v&Zh5))0 z8Bu^VT0E@9m(U;Na+JULv{{+rlUu-at`hGsPG9gCukJfGoLrc#1RvYbLQ$ysoKCqvk0!u2n%& zetaG2G2CN|-==!5`D>K*XN9)#K!DXYGv$)T^joNyXN}ss>2ShFau^F1Ysnr*zeC5Y zcxRg=;}o)nhu$|2Z1#J%W2Ffz1qQv6s3D8&JLclnJ7!MB%L|u%tvl#nvZcL=6C98D zt!iK#{%#wQY!Y~G?DUssLpWoove9w?W+isKZ74ii+=B*=;%o$AdyBRQ>I3^?)YT>xf%5Am&#I?H}ce+2?!XyG{oB7*a96 zU7VX{*!h0aFtEX+i2AHustkZutCrD4!YWfEQ(d*NGg#Up{Brubid3E}~hL#eA7%(SJ7 zd;s30x3H=2Kf@bI@MuYs3ZI;p;jy&B_LM>+*N+ECe-fv91-_DqA4K``?$RSUcRG+orQ3L`~o(s~Xo&!@nqD=0a0(BxsI> z=z7Z9Z<+U@0e3MmpVVy$iruhChq{g{jX)#^$n=TM<5j8mSWDq#S`_<>HF$^e;lIN* zsuIO5XJm)sqcfE+_h!0f$w?Nj@guPn)|j1lw)7$)-z6lrE?`J9i~G}B zi}aS^O@1Jv_$U%7?xg>Ubz_yGKbmSq`zH);eYDo}!PE8Qobx%ab%{n$_?2l*VG#-2 z$ab-1U-8$e`8PRqztmD(;J?+w{WD70g1Go<*gN5tw*QBad0F1+W5Vqa9 zBNahvR&Xf<%(CP8OL=D*;Pis5J(%a(k@T9w5Gu6bw&($tuf~qtPRo(LG)vT+)T!5} zu0U%QE5=)@$N?K3)7VnedtkSUi&-1VG?1~t>FF?S|AsfZd(+0kbgk0l6~7B{{=Hgj zX!omOUH1ELjpPRHsu^cD@`gbJX2E0?Zu{U!Tl?pq4BB$Fk@C{01?*3}$3ke`Wp)b3 zhmk0W3}xMR9z2>33Z_J9)8U*b?VF#QlR$ueJ4A9p3#mY(H4?tZ%?5wdjyk}+^eIpQ zS#9VIct*>CXA09fWgmTF4BV|ZYsZQY5Re{mQfYb3F3^opAXGoYn}IE%&BG3v(55U= z-y$OY9eS_{`9)63=pWjYq4yg4J-buCI=i^9``G#Wl{wuLiJxQc;niXtN!gEamjK#= z5wZS(O{;tw2LMWVv)bqcicFTPcdnr!&)eF*X?b%e_0u~*#_%1f`U9k=`I|Rnb(lNP zp>JSZj0`vRDzR-Xsa}>PvE*OF_o%Y1@jU%1_JTh)((I<&fagh&wbGmN$xKJ5pz`7< z`67{ARk>Wg*=~2`sTaxpx^HQ#`gFd9G$H`?&T_S#i`wW!$?rc|BDZO?^-n1HGf?$7VCWm1w_|PIx`r| z5Q6A<@2{VEC+w)CdrIzr9^|gBCNYZ$-1YW4dX?E$8IQDJni9>#q#%$@w6jNK{0i zOt{pt=4;11dxZ0C?{9C!!aPB?JkQn3O(<`M2;JrgtwpAV0DP4y6UG#|W-aPU40*=b z0CxT|Ao&?a>PCrx88vzCod4K;SBwgM>|Ggf_Fp2R;o};MtcOM*K~cX`IBAf+xMx%S)6ALkuys z2cqQdc+dV=9*RvP)HT|`9jU=teOq4;5r_cB#f-4WQWHJ?V?`J{DF9r6ke3#TM2XK8NsCUl^8mB{vu^GvEdFv{`fMUD=75Oy87`R5&q9 zup$-p@3dS)v94>kGhp0RI+}d@b2RREwca30a0@74tZ?BtFm<2sBLkO+=5~Cu8HcG0R)TF&Oos+g)W)5O_K99Qm&lAVvFnc~qRN`&X0Y7|{(dZCS3ob|EJ4KzD( zE_!LY^%}zjdf5s4PsWcMO^77u5y=9YyTb%yW9@6Rakk^e`anWAvGI0?fp&sMU$s^Z z+dFpc)(?7qDw={reKYuJ~0-N zuuHyboVmo$y}>{a;h5l>)9|8o;GgGLZk@>$Ftf2h$G|HCNyy%FA(%qCrBI;{CG(r1<9Ay(7J%yq!UY{l@FqG*qS4Pq4^Tz6x-7Q!cRV*_?(DZ5YdIk(%*P z`SztesaOZHpoh_BFt@!p@g2o{T=Gs`x943^4 zb!Ag?e#j+Kzw`J6XIUVWK`>e{ue_g%A|EU=D|dE6OeaM7_Y?M?Ivd#cvyd_D<+Xtc z_YRf}mwX`GrTz9L9bGeB|FJBrf_%JLDaD)0sKazeJ#J($0wt}GARf;c^)IZ9se{ah z4hipri(OST5+WxQsq`T#vzm{#N3%Bv-TE?rocLAz9bIGtH$h&Yfic3%YMmcjQXI33 zELP&P7{*J-N=URdu-cGn8Mb5XP&2WAtAEX243O@Gd4PK?j}2Vl6ws<*wcx158DdcCAWKKs zv&eCKhuO%{cGIMG$%$BE0&`T}%m#<6;E1S)M%Z2doS+RdYdP7mRr19ufU*T7x`g+2 zSnRh0mnvEd@}O(2h^A=$ik+>n2hnja2Pm=hB?5l;TicM$1xmZj#4qkn+V6lGlrlf; z%fNyFYW5~erUlp9dY`rGK6&nzN{@$XjGg^01Qm6StgGr+PTu$8pf{Er{wi#?8pS{b zE-D$V8{-W1c*V?k)z>qVg*(Z_=iaSux3?bPo%)nqICBI_YC}cUwe12{{VZY%+=F~* zus)%2yHRTizhUKhVfz!@G-yP9?f!%F(f5>FyDg~~?;ZM%&Ks6iA+pb8lh~seqN0E= zNIpC}lMycncP=w?gxSHD6?5py>AKa;XP+Fo5{BH{@9>fLB{y32$SzjMhSW-w1xe}~ zYN1FUOx(GJ=+M=4)<>N2-09Af0D9AZb|t)iC9>u8HCyXh+rW}T6^i-&r<{6Zualu| zI9pmC4?Wx)@yvbc`t^@+Mn$OR#8)7lFNFuIVV(yjrh*fmATwu~xuP!&3h{jx<(5ps zPSqxJE_$Pg`n)ZSubVn=mx5Eq+5^cbvGN^Ah=973LBJLin2DVYaRnl z!Z~c+(gTL$WRzN^7^X+y)#QnmM{{vsUyzx}Z z3G=gaOeq4*g~ft>W}5xlA9({*CNXTTkNfVr9Y%Jp*7$sytT`+^gb4d4<}hGGC+=|o zd}M-e1Vb>La9s(J8qz#~@GTV2vrDUW4{OfI*>|!QQsj-pX8M`Ln>Tm zb&F6^8ctFFmun_fc7bS=iUmBn}If=A4#*6ri!P&DPyQGjN^&hMvqdz(8>2J%6 z56x$Wx5JP~x{8NJ@73(1#bZRE{*Wb2(#`T(QH{Er>sXHD*!s##4Hw!1gIGrYsVY%~ zw^RJYiN~Ii_mx+jk=n`|AYUmC%{qyhzTCa`y~RjT=52i5XnY?9++51=9USmIQNkTJ zc-8-_N|>|IOJLT}Yh)2kyGnrM-!AviEvn>oshad;(;;=j8STkMhy;e1PVL>9+PxzgQ63522eJ6h;6~45(A~|%eNntC3hXwz@oNK&1GR11P0L|FD@Zu`AI$?+aZCAS1%z zKO~@^M9~W?d)v=IyO8Nnj(FOY{eo;HCd9)*0;STibMf%trqW7h`y;;dFtU71P z{A@Z2=2r6aBWcI5rc=v_=BDEDq0rKUc=0#;GfkN1yOUB8UlrH@ImdqDMAi)nP2@2P z;!TI?xj>z$g=W;+`g&e*T(j%56`2*1quJY@8S?uU=n%yPuT|uo(#50;wfvoarnS`i zQHi+(Mxe=<_&Nh?Tnp!eCU>M$E|C)^E~QXuut(f!T&X?sv?S6S&6>7S1udbYOB}qT zT%MtLM`$yR3gtCwU?^1dZlc9>O!{Lh;AV@rB-=zTCQ3tZ>>l77sygA^&+t_8gz|X= zb+}2az1w_WSm-m%Y3|siP+)ERM+xuw2e0q{A$_(7A%aRu_{6U(avGhC2!-Qa%8|$a zO9M&b-aCbxjG_Ioo0e6|W4RwU1BVwH(>Lt;u}s!`aUZM+zzHhCV17eiQqdToTf?wn|BKNm6P0}c-j6~d5j z#_A{dcV`NCNocovo#y}Z<-r?O3G})rGS*tE6^M~j(%3j>Y_0n{iagoG&YqznFdOkt zQ$xc>cT_W!4g|`9>-Yus5DsiQ?hNy*w{~HQe38wT2t$Bhc=@+s#$*R~RQy*g1>S{N zSuM~g`T^uUd%M%a5D)zv-1CjxV}~CEfI!U|P28-51U(T+6U+72x)%GUv zxx?Ok9cBp(75czTeRsV@FE{EahY{f8tC%d;XWq!o_>8uR(t23q@i0EQ_)vmo#L*U6 z{iZ?mqT%8rNV7DuC!0=ss#4}Fz1$Cpq|ukPHWLJr5huDq4>6xu$g$WJPJW-o@f3GE z!Z-79Y)Ha5WA1rW+J~;u^#L$|y`G0d$^il|n#yMqM?DZ+Sr4?=*7ax1=h0gc)G_Y8 zXbKdo8|M_-%@F#<3@)?*i@V8~VHQD7k8aD>cMb*63nA>&?p=zim)KzFKZC^Wm9J>> zo@5TeD;Z}v+|?mV?snP#M2^zp>a6zmkrSefbRb9f<^1!a7&=o-Y! z%0m_zvoX@AwE<5?9!-@Dv}u;3#1`&XkIM_yvs+W^RZF!wg;45vM5iaer!SWrS-0`p zf*(G%kiyFDGN>dQa~M-MruUjGMkiQ&R;0@4`AZ>tfcUG3we5Q2Fwf!J+Zwje=Un+} z$kN_)ewQj&6z$JW%*V7o#}zQpXij*Qp)9cIa0D*8dd2O8P4I-#7&WPQ)CP_Gb6Q|} zz$=*CNs|wP|+jw90JL-gTEUJVdZ| zLe51TsMpaCjn4>PjT#*Ur#S9Nx4vg0VLW41CNrT6$&J5!u2dTJTd+il?j7U_)b0%| z1xn`_f?6$h?WUlk@$Z2CFsJBl0z%hOeoE){+av3&cHS+UoOk(6WD;{OxAiYMy7vM* zRy(i@s=%s5n(5;;aSC{EK`?{U;S-uX% zhXu1|zk5*F9!2-AP|HSL%_VB|%lBl`hAdg@$8qfxVbb6zsbNhT^oyvEo-kd$HeZsb z?f|x23Q;%T_eufov|J6AsP6_) zwfK6zD5KzpOdk75y_S(hAIwRg&V>iUuJl=BNpSO04a^hL{@p|_kWUmpGJlBK+Q~at zjpX+*&vE03pT(J(`qXieHa<1*AxJR|9iJ$MPTs+Wn8+YbOcRp>zMDo3mEmp%M`DG0 zguk@#9=_?qe|mgP`Ke&#gQh%r6dNE`Zx?m(npP^XZ|RI7^?8j{W33&_-2(QBu+Ta4LnmAx>0rlvpj{Ec272I6m~!TfVe`IYsd1%mq4B`oKwSlk%VzzCiD|hI2{Z z(XZ+vPXm$rUA3yan^;SgK~H)2(o1`KC>bAL7uKn$GdDF^`ab3yTA{9-#icrSn}?9uID`v>C1@D%ObN^0&cp2W9fC` zLb2apf712|Op#k9KbHZ70aM+emfG`zs_Rqj^zV70?s+~x#;krqUI=o+ig+76+Z2M~ zD2nxt8=Yf+LR0w_RrK8^?CQy>TL=7mdon{M`q#ho!ejND@c9akzZS!V&h7?D&B!8_{IZ;fpEunjfhDQ9I2VW;1oLX+iXP!|T6f~R*n)P-hAmUt3%m4LG&Qu4r* z7aj~HvgIC}24r?%>9G4N=06EY?=t%F)bnF-Heocq#rYVkU|tx*-N|{_w}zhVz>)DH zs!NSqy(fZjEnbRlVD~%6b&MLWNf{S4mMgo$i|27-hqYKfy{-7AX!w@arr96j4tuO_ zQe;dER{!+lK`VwebFWgfqZ?Bk~cm?7e`52CZHnCHCiZ3#t$~Y`k%E9 zW3O){BwXc~fL4<+Nr$b5Pp9o1u66E8#qN=R8+vuNy!NA-SH`qET$w>FJfFhUI!unc zu>yt2f&%5h@wO)?C#u<%ZY7#v?8#buBAkr^YwIP#N14@MoX)nKxLp?^Rrw z=5Nz^&V6bvr{ysu`3;oCRG1B0Up2cO6#C8`)_55qPKall7|o1WFJqoXI=A+K-3}+@ zPE~${07t>kg^N)Jr7kVvn140?j9XC(|Bxv%i%t>*lOFTi*^W6%9w^yiqcj9nU{( z3!91G6-~XtaNl1j*bsE{{JhW-Wer#mKUE+=WXN6kzE51Y(I~MewIZ84yAISSmzDM~ zjqvolQy}L{fHYe=yiKIHt-(tyevykc&Qd++8y6aCkMlg@#|}t&y@BQ(vZ#G)wt-^< z=#T#rCCv$HP29P4FP_-b9Q2;Muf`epb z-$S&!e8KxX_uG2O^z!eZJ-5h#=s+(3cb`aOxg@euQHsNmKR;`?-v6QU=o_$wl*F!L zKTQQQZ$7@d*uSec!zAH9i}Cc??iy27Pqk}rB7_f%aa^6#2 zwU_eIFNWOZM{`;2Gg86b1zJfTGF{I^`>Z(NNTzFS#h&ITbS_{)hF)3GEde-|T9!LK zKJRWfrTX4z#cjI5`imopA{*9y^(x^*LxTD<-XO+f3BF$7lbES zdAkeoMa}1wxkR-0q$^T<7o-EM9k&^HOZ7%=90GW#*)!nXTU=a)m92UJZ()NbUM4Qb#_ z>sUq%hQ$|D-FJ%Z%>s|SFKCEJG-gAXsacj|ISSq%BO#Mo5aAn;DZAGhxbW=_B zNId-pDF6Nd%t|>~0ad^F0Ot-a+m~~7UN0XQnK8KseBMu3`3J;55Wy4ipu^S1cmRa| zFm#;tv{}^#^_2eIsF*rKOOYPkKXxNrf6Qk7<(ti;han@WC{g~&*#Cb3y#o;X delta 10408 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 From 9c29ea44c816751fe04bca9c1c9aa07a5f43f777 Mon Sep 17 00:00:00 2001 From: Revathyvenugopal162 Date: Sun, 14 Jul 2024 00:17:41 +0200 Subject: [PATCH 19/65] docs: update the images with highlight --- .../pull-requests-checks-fails.png | Bin 31345 -> 31286 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/contributing/pull-requests-checks-fails.png b/images/contributing/pull-requests-checks-fails.png index f8b77dbe0287994a0d8ca885ef85c2e997debdef..e1a12b29cc720e77a350d80318622e2925ad5a7f 100644 GIT binary patch literal 31286 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�dxoj@BGqtGW% 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 From 1c1a9262b98d7e3d5e04523112cf5aae8d52d11c Mon Sep 17 00:00:00 2001 From: Han Date: Sat, 13 Jul 2024 15:24:27 -0700 Subject: [PATCH 20/65] Update conf.py Closes #322 Updated conf.py file to include direct URL to Code of Conduct in the footer of all pages as mentioned in issue #322 --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 7fde7dd3..24c9b25b 100644 --- a/conf.py +++ b/conf.py @@ -109,7 +109,7 @@ "show_toc_level": 1, # "navbar_align": "left", # [left, content, right] For testing that the navbar items align properly "github_url": "https://github.com/pyopensci/python-package-guide", - "footer_start": ["copyright", "pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community."], + "footer_start": ["copyright", "

    pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community.

    "], "footer_end": [], } From d979b4c6ab2e57712768be3733b8a5a6ff6840c8 Mon Sep 17 00:00:00 2001 From: Han Date: Sat, 13 Jul 2024 15:36:19 -0700 Subject: [PATCH 21/65] Update conf.py test short url --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 24c9b25b..ee55ec5a 100644 --- a/conf.py +++ b/conf.py @@ -109,7 +109,7 @@ "show_toc_level": 1, # "navbar_align": "left", # [left, content, right] For testing that the navbar items align properly "github_url": "https://github.com/pyopensci/python-package-guide", - "footer_start": ["copyright", "

    pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community.

    "], + "footer_start": ["copyright", "https://www.pyopensci.org/handbook/CODE_OF_CONDUCT.html"], "footer_end": [], } From c051c65079f24b3048ae534bd3edad8fb07f0987 Mon Sep 17 00:00:00 2001 From: Han Aw Yeang Date: Sat, 13 Jul 2024 16:39:44 -0700 Subject: [PATCH 22/65] Add Code of Conduct to Footer --- _templates/code_of_conduct.html | 1 + conf.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 _templates/code_of_conduct.html diff --git a/_templates/code_of_conduct.html b/_templates/code_of_conduct.html new file mode 100644 index 00000000..21e71e61 --- /dev/null +++ b/_templates/code_of_conduct.html @@ -0,0 +1 @@ +

    pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community.

    \ No newline at end of file diff --git a/conf.py b/conf.py index ee55ec5a..a37a669a 100644 --- a/conf.py +++ b/conf.py @@ -109,7 +109,7 @@ "show_toc_level": 1, # "navbar_align": "left", # [left, content, right] For testing that the navbar items align properly "github_url": "https://github.com/pyopensci/python-package-guide", - "footer_start": ["copyright", "https://www.pyopensci.org/handbook/CODE_OF_CONDUCT.html"], + "footer_start": ["code_of_conduct", "copyright"], "footer_end": [], } From f354e287b22681dd23c99db673fd47a8438f5cd8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 23:44:33 +0000 Subject: [PATCH 23/65] =?UTF-8?q?'[pre-commit.ci=20=F0=9F=A4=96]=20Apply?= =?UTF-8?q?=20code=20format=20tools=20to=20PR'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _templates/code_of_conduct.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/code_of_conduct.html b/_templates/code_of_conduct.html index 21e71e61..3b82d0ab 100644 --- a/_templates/code_of_conduct.html +++ b/_templates/code_of_conduct.html @@ -1 +1 @@ -

    pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community.

    \ No newline at end of file +

    pyOpensci is dedicated to creating a welcoming, supportive and diverse community around the open source Python tools that drive open science. Our Code of Conduct defines expected behavior and guidelines that help create such a community.

    From 32fd6521a802444ccdcdffc220cac89c06c85a82 Mon Sep 17 00:00:00 2001 From: sneakers-the-rat Date: Fri, 12 Jul 2024 22:20:43 -0700 Subject: [PATCH 24/65] update badges url --- documentation/repository-files/readme-file-best-practices.md | 2 +- locales/es/LC_MESSAGES/documentation.po | 2 +- tutorials/add-readme.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/repository-files/readme-file-best-practices.md b/documentation/repository-files/readme-file-best-practices.md index 2c5b7efc..1275791a 100644 --- a/documentation/repository-files/readme-file-best-practices.md +++ b/documentation/repository-files/readme-file-best-practices.md @@ -81,7 +81,7 @@ Example: [![PyPI version shields.io](https://img.shields.io/pypi/v/pandera.svg)] ```{tip} Once you package is accepted to pyOpenSci, we will provide you with a badge to add to your repository that shows that it has been reviewed. -[![pyOpenSci](https://tinyurl.com/y22nb8up)](https://github.com/pyOpenSci/software-review/issues/12) +[![pyOpenSci](https://pyopensci.org/badges/peer-reviewed.svg)](https://github.com/pyOpenSci/software-review/issues/12) ``` diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 2f34859e..b5493ae5 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -1581,7 +1581,7 @@ msgstr "" msgid "" "Once you package is accepted to pyOpenSci, we will provide you with a " "badge to add to your repository that shows that it has been reviewed. " -"[![pyOpenSci](https://tinyurl.com/y22nb8up)](https://github.com/pyOpenSci" +"[![pyOpenSci](https://pyopensci.org/badges/peer-reviewed.svg)](https://github.com/pyOpenSci" "/software-review/issues/12)" msgstr "" diff --git a/tutorials/add-readme.md b/tutorials/add-readme.md index e5d2693b..784c12aa 100644 --- a/tutorials/add-readme.md +++ b/tutorials/add-readme.md @@ -188,7 +188,7 @@ Your finished `README.md` file should look something like this: # pyosPackage [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8365068.svg)](https://doi.org/10.5281/zenodo.8365068) -[![pyOpenSci](https://tinyurl.com/y22nb8up)](https://github.com/pyOpenSci/software-review/issues/115) +[![pyOpenSci](https://pyopensci.org/badges/peer-reviewed.svg)](https://github.com/pyOpenSci/software-review/issues/115) ## What pyosPackage does From c71e7050c9bc71b925840aee331df547b7fe9f93 Mon Sep 17 00:00:00 2001 From: yardasol Date: Sun, 14 Jul 2024 12:24:28 -0400 Subject: [PATCH 25/65] translation tweaks --- locales/es/LC_MESSAGES/documentation.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 48cf022f..2756b5e6 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -31,8 +31,8 @@ msgid "" "use the platform that you prefer for your documentation!" msgstr "" "Sphinx es la herramienta más común para construir documentación en la " -"ecosistema de Python. Sin embargo, algunos mantendors están usando " -"herramientascomo [mkdocs](https://www.mkdocs.org/) para documentación. Es tu " +"ecosistema de Python. Sin embargo, algunos mantendores están usando " +"herramientas como [mkdocs](https://www.mkdocs.org/) para documentación. Es tu " "decisión usar la herramienta que prefieres para tu documentación." #: ../../documentation/hosting-tools/intro.md:8 @@ -41,8 +41,8 @@ msgid "" "documentation. We talk about various syntax options that you can use when" " writing Sphinx documentation including mySt and rST." msgstr "" -"En esta seción introducimos Sphinx como herramienta para construir " -"documentación. Hablamos sobre varios opciones de sintaxis puedes usar " +"En esta sección introducimos Sphinx como herramienta para construir " +"documentación. Hablamos sobre varios opciones de sintaxis que puedes usar " "para escribir documentación de Sphinx incluyendo myST and rST" #: ../../documentation/hosting-tools/intro.md:12 @@ -51,7 +51,7 @@ msgid "" "tools that might help you optimize your documentation website." msgstr "" "Hablamos también sobre methodos para publicar tu documentación en línea " -"y herramientas de Sphinx que puedas ayudarte optimizar tu sitio web para " +"y herramientas de Sphinx que pueda ayudarte optimizar tu sitio web para " "documentación." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:1 @@ -60,7 +60,7 @@ msgstr "Sintaxis de documentación: markdown vs. myST vs. rst sintaxis para crea #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:3 msgid "There are three commonly used syntaxes for creating Python documentation:" -msgstr "Hay tres sintaxis comúnes usado para creando documentación en Python:" +msgstr "Hay tres sintaxis comúnes para creando documentación en Python:" #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:4 msgid "" @@ -73,9 +73,9 @@ msgid "" " use either **myST** or **rST**." msgstr "" "[markdown](https://www.markdownguide.org/): Markdown es una sintaxis de text " -"fácil aprender. Es la sintaxis por defecto para Jupyter Notebooks. Hay " -"herramientas que puedas añadir a sitio web de Sphinx que lo permite hacer " -"markdown como html. Sin embargo, usando markdown escribir documentación " +"que es fácil aprender. Es la sintaxis por defecto para Jupyter Notebooks. Hay " +"herramientas que puedas añadir al sitio web de Sphinx que lo permite rendir " +"markdown como html. Sin embargo, usando markdown para escribir documentación " "tiene limitaciónes. Por ejemplo, si quieres añadir referencias, tarjetas " "de colores, o otros elementos personalizados a tu documentación, necesitaras " "usar **myST** o **rST**." @@ -91,7 +91,7 @@ msgid "" msgstr "" "[rST (ReStructured Text):](https://www.sphinx-" "doc.org/en/master/usage/restructuredtext/basics.html). **rST** es la sintaxis " -"nativa que Sphinx apoya. rST fue sintaxis por defecto usado para docuemntación " +"nativa que Sphinx apoya. rST fue sintaxis por defecto para docuemntación " "por muchos años. Sin embargo, recientemente myST ha aumentando en popularidad " "para ponerse una herramienta favorita para documentación gracias a su flexibilidad." @@ -144,7 +144,7 @@ msgid "" "used in the scientific ecosystem." msgstr "" "`GitHub` y `Jupyter Notebooks` apoyan markdown, entonces son más " -"usados en la ecosistema cientifica." +"utilizados en la ecosistema cientifica." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:22 msgid "" From e3cd9c4f015126e1ab7a75505d3b94d008a25738 Mon Sep 17 00:00:00 2001 From: Roberto Pastor Muela <37798125+RobPasMue@users.noreply.github.com> Date: Sun, 14 Jul 2024 19:56:17 +0200 Subject: [PATCH 26/65] docs: translate to Spanish python-package-structure.md file --- .../es/LC_MESSAGES/package-structure-code.po | 159 +++++++++++++++--- 1 file changed, 139 insertions(+), 20 deletions(-) diff --git a/locales/es/LC_MESSAGES/package-structure-code.po b/locales/es/LC_MESSAGES/package-structure-code.po index 90bc3f35..36a10d58 100644 --- a/locales/es/LC_MESSAGES/package-structure-code.po +++ b/locales/es/LC_MESSAGES/package-structure-code.po @@ -4283,7 +4283,7 @@ msgstr "" #: ../../package-structure-code/python-package-structure.md:1 msgid "Python Package Structure for Scientific Python Projects" -msgstr "" +msgstr "Estuctura de paquete de Python para proyectos científicos en Python" #: ../../package-structure-code/python-package-structure.md:3 msgid "" @@ -4293,6 +4293,10 @@ msgid "" "vs-flat-layout/) Both layouts have advantages for different groups of " "maintainers." msgstr "" +"Existen dos diseños diferentes que comúnmente verá dentro del ecosistema de " +"empaquetado de Python: [diseños src y flat](https://packaging.python.org/en/" +"latest/discussions/src-layout-vs-flat-layout/). Ambos diseños tienen ventajas " +"para diferentes grupos de mantenedores." #: ../../package-structure-code/python-package-structure.md:8 msgid "" @@ -4302,16 +4306,22 @@ msgid "" "guide](https://packaging.python.org/en/latest/tutorials/packaging-" "projects/)." msgstr "" +"Le sugerimos, pero no requerimos, que use el diseño **src/** (discutido a " +"continuación) para crear su paquete de Python. Este diseño también se " +"recomienda en la [guía de empaquetado de PyPA](https://packaging.python.org/" +"en/latest/tutorials/packaging-projects/)." #: ../../package-structure-code/python-package-structure.md:12 msgid "pyOpenSci will never require a specific package structure for peer review" -msgstr "" +msgstr "pyOpenSci nunca requerirá una estructura de paquete específica para la revisión por pares" #: ../../package-structure-code/python-package-structure.md:15 msgid "" "We understand that it would be tremendous effort for existing maintainers" " to move to a new layout." msgstr "" +"Entendemos que sería un esfuerzo tremendo para los mantenedores existentes " +"moverse a un nuevo diseño." #: ../../package-structure-code/python-package-structure.md:18 msgid "" @@ -4320,14 +4330,18 @@ msgid "" "package has a simple build and might be open to moving to a more fail-" "proof approach." msgstr "" +"La descripción general en esta página presenta recomendaciones que creemos " +"que son las mejores para alguien que está comenzando con el empaquetado de " +"Python o para alguien cuyo paquete tiene una construcción simple y podría " +"estar abierto a moverse a un enfoque a prueba de fallos." #: ../../package-structure-code/python-package-structure.md:23 msgid "An example of the **src/package** layout structure can be seen below." -msgstr "" +msgstr "Un ejemplo de la estructura de diseño **src/package** se puede ver a continuación." #: ../../package-structure-code/python-package-structure.md:45 msgid "Note the location of the following directories in the example above:" -msgstr "" +msgstr "Nótese la ubicación de los siguientes directorios en el ejemplo anterior:" #: ../../package-structure-code/python-package-structure.md:47 msgid "" @@ -4335,6 +4349,10 @@ msgid "" "user-facing documentation website. In a **src/** layout docs/ are " "normally included at the same directory level of the **src/** folder." msgstr "" +"**docs/:** discutido en nuestro capítulo de documentación, este directorio " +"contiene el sitio web de documentación orientado al usuario. En un diseño " +"**src/**, los docs/ normalmente se incluyen en el mismo nivel de directorio " +"que la carpeta **src/**." #: ../../package-structure-code/python-package-structure.md:48 msgid "" @@ -4342,12 +4360,17 @@ msgid "" "**src/** layout tests are normally included at the same directory level " "of the **src/** folder." msgstr "" +"**tests/** este directorio contiene las pruebas o tests para el código de su proyecto. " +"En un diseño **src/**, las pruebas o tests normalmente se incluyen en el " +"mismo nivel de directorio que la carpeta **src/**." #: ../../package-structure-code/python-package-structure.md:49 msgid "" "**src/package/**: this is the directory that contains the code for your " "Python project. \"Package\" is normally your project's name." msgstr "" +"**src/package/**: este es el directorio que contiene el código de su proyecto de Python. " +"\"Package\" es normalmente el nombre de su proyecto." #: ../../package-structure-code/python-package-structure.md:51 msgid "" @@ -4355,6 +4378,9 @@ msgid "" "files that pyOpenSci requires live in the root of your project directory." " These files include:" msgstr "" +"También en el ejemplo anterior, observe que todos los archivos de documentación " +"básicos que pyOpenSci requiere se encuentran en la raíz del directorio de su proyecto. " +"Estos archivos incluyen:" #: ../../package-structure-code/python-package-structure.md:55 msgid "CHANGELOG.md" @@ -4378,17 +4404,19 @@ msgstr "" #: ../../package-structure-code/python-package-structure.md:63 msgid "Click here to read about our packaging documentation requirements." -msgstr "" +msgstr "Haga clic aquí para leer sobre nuestros requisitos de documentación de empaquetado." #: ../../package-structure-code/python-package-structure.md:70 msgid "" "While we recommend the **src/** layout we also review the **flat** layout" " here. Both are used in the Python ecosystem." msgstr "" +"Aunque recomendamos el diseño **src/**, también revisamos el diseño **flat** aquí. " +"Ambos se utilizan en el ecosistema de Python." #: ../../package-structure-code/python-package-structure.md:72 msgid "Example scientific packages that use **src/package** layout" -msgstr "" +msgstr "Ejemplos de paquetes científicos que utilizan el diseño **src/package**" #: ../../package-structure-code/python-package-structure.md:74 msgid "[Sourmash](https://github.com/sourmash-bio/sourmash)" @@ -4412,7 +4440,7 @@ msgstr "" #: ../../package-structure-code/python-package-structure.md:82 msgid "The src/ layout and testing" -msgstr "" +msgstr "El diseño src/ y los tests o pruebas" #: ../../package-structure-code/python-package-structure.md:84 msgid "" @@ -4423,6 +4451,12 @@ msgid "" "installed version, you may be missing issues that users encounter when " "your package is installed." msgstr "" +"El beneficio de usar el diseño **src/package**, particularmente si está " +"creando un nuevo paquete, es que asegura que las pruebas se ejecuten contra " +"la versión instalada de su paquete en lugar de los archivos en el directorio " +"de trabajo de su paquete. Si ejecuta sus pruebas en sus archivos en lugar de " +"la versión instalada, es posible que se pierda problemas que los usuarios " +"encuentran cuando su paquete está instalado." #: ../../package-structure-code/python-package-structure.md:91 msgid "" @@ -4431,22 +4465,30 @@ msgid "" "smaller which then places places a smaller storage burden on PyPI which " "has over 400,000 packages to support." msgstr "" +"Si `tests/` están fuera del directorio **src/package**, no se incluyen en la " +"rueda del paquete. Esto hace que el tamaño de su paquete sea ligeramente " +"más pequeño, lo que a su vez genera un almacenamiento más pequeño " +"en PyPI, que tiene más de 400,000 paquetes." #: ../../package-structure-code/python-package-structure.md:93 msgid "" "[Read more about reasons to use the **src/package** " "layout](https://hynek.me/articles/testing-packaging/)" msgstr "" +"[Lea más sobre las razones para usar el diseño" +" **src/package**](https://hynek.me/articles/testing-packaging/)" #: ../../package-structure-code/python-package-structure.md:95 msgid "How Python discovers and prioritizes importing modules" -msgstr "" +msgstr "¿Cómo descubre y prioriza Python la importación de módulos?" #: ../../package-structure-code/python-package-structure.md:97 msgid "" "By default, Python adds a module in your current working directory to the" " front of the Python module search path." msgstr "" +"De forma predeterminada, Python agrega un módulo en su directorio de trabajo " +"actual al principio de la ruta de búsqueda de módulos de Python." #: ../../package-structure-code/python-package-structure.md:99 msgid "" @@ -4455,6 +4497,9 @@ msgid "" "discover `package/module.py` file before it discovers the installed " "package." msgstr "" +"Esto significa que si ejecuta sus pruebas en el directorio de trabajo de su " +"paquete, utilizando un diseño plano, `/package/module.py`, Python descubrirá " +"el archivo `package/module.py` antes de que descubra el paquete instalado." #: ../../package-structure-code/python-package-structure.md:101 msgid "" @@ -4463,6 +4508,10 @@ msgid "" "This means that when you import your package, Python will be forced to " "search the active environment (which has your package installed)." msgstr "" +"Sin embargo, si su paquete se encuentra en una estructura de directorio src/ " +"**src/package**, entonces no se agregará, por defecto, a la ruta de Python. " +"Esto significa que cuando importe su paquete, Python se verá obligado a buscar " +"en el entorno activo (que tiene su paquete instalado)." #: ../../package-structure-code/python-package-structure.md:103 msgid "" @@ -4470,10 +4519,13 @@ msgid "" "adjusted to ensure the priority is to use installed packages first (e.g. " "`PYTHONSAFEPATH`)." msgstr "" +"Nota: Las versiones de Python 3.11 y superiores tienen un ajuste de ruta que " +"se puede modificar para garantizar que la prioridad sea utilizar primero los " +"paquetes instalados (por ejemplo, `PYTHONSAFEPATH`)." #: ../../package-structure-code/python-package-structure.md:106 msgid "Sometimes tests are needed in a distribution" -msgstr "" +msgstr "A veces se necesitan pruebas en una distribución" #: ../../package-structure-code/python-package-structure.md:108 msgid "" @@ -4486,12 +4538,21 @@ msgid "" "`tests/` directory into the **src/package** directory (see example " "below)." msgstr "" +"No recomendamos incluir pruebas como parte de su rueda de paquete de forma " +"predeterminada. Sin embargo, no incluir pruebas en su distribución de paquete " +"hará que sea más difícil para las personas que no sean usted mismo probar si " +"su paquete funciona correctamente en su sistema. Si tiene un conjunto de pruebas " +"pequeño (archivos Python + datos) y cree que sus usuarios pueden querer ejecutar " +"pruebas localmente en sus sistemas, puede incluir pruebas moviendo el directorio " +"`tests/` al directorio **src/package** (ver ejemplo a continuación)." #: ../../package-structure-code/python-package-structure.md:117 msgid "" "Including the **tests/** directory in your **src/package** directory " "ensures that tests will be included in your package's wheel." msgstr "" +"Incluir el directorio **tests/** en su directorio **src/package** asegura que " +"las pruebas se incluirán en la rueda de su paquete." #: ../../package-structure-code/python-package-structure.md:119 msgid "" @@ -4500,36 +4561,43 @@ msgid "" "distribution](https://docs.pytest.org/en/7.2.x/explanation/goodpractices.html#choosing-a" "-test-layout-import-rules)." msgstr "" +"Asegúrese de leer la [documentación de pytest para obtener más información " +"sobre cómo incluir pruebas en su distribución de paquete](https://docs.pytest.org/en/" +"7.2.x/explanation/goodpractices.html#choosing-a-test-layout-import-rules)." #: ../../package-structure-code/python-package-structure.md:121 msgid "Challenges with including tests and data in a package wheel" -msgstr "" +msgstr "Desafíos al incluir pruebas y datos en una rueda de paquete" #: ../../package-structure-code/python-package-structure.md:124 msgid "" "Tests, especially when accompanied by test data can create a few small " "challenges including:" -msgstr "" +msgstr "Los tests, especialmente cuando van acompañados de datos de prueba, " +"pueden crear algunos pequeños desafíos, incluyendo:" #: ../../package-structure-code/python-package-structure.md:126 msgid "" "Take up space in your distribution which will build up over time as " "storage space on PyPI" msgstr "" +"Ocupar espacio en su distribución, lo que se acumulará con el tiempo en PyPI" #: ../../package-structure-code/python-package-structure.md:127 msgid "Large file sizes can also slow down package install." -msgstr "" +msgstr "Archivos grandes también pueden ralentizar la instalación del paquete." #: ../../package-structure-code/python-package-structure.md:129 msgid "" "However, in some cases, particularly in the scientific Python ecosystems " "you may need to include tests." msgstr "" +"Sin embargo, en algunos casos, particularmente en los ecosistemas científicos " +"de Python, es posible que necesite incluir pruebas." #: ../../package-structure-code/python-package-structure.md:132 msgid "**Don't include test suite datasets in your package**" -msgstr "" +msgstr "**No incluya conjuntos de datos de pruebas en su paquete**" #: ../../package-structure-code/python-package-structure.md:134 msgid "" @@ -4539,12 +4607,18 @@ msgid "" "tool such as [Pooch](https://www.fatiando.org/pooch/latest/) to access " "the data when you (or a user) runs tests." msgstr "" +"Si incluye sus pruebas en su distribución de paquete, le recomendamos " +"encarecidamente que no incluya datos en su directorio de pruebas. En su lugar, " +"aloje sus datos de prueba en un repositorio como Figshare o Zenodo. Utilice " +"una herramienta como [Pooch](https://www.fatiando.org/pooch/latest/) para " +"acceder a los datos cuando usted (o un usuario) ejecute pruebas." #: ../../package-structure-code/python-package-structure.md:140 msgid "" "Check out the testing section of our guide for more information about " "tests." msgstr "" +"Consulte la sección de pruebas de nuestra guía para obtener más información sobre las pruebas." #: ../../package-structure-code/python-package-structure.md:142 msgid "" @@ -4552,6 +4626,9 @@ msgid "" "found in the **src/package** directory, `tests/` and `docs/`are in the " "root directory." msgstr "" +"El diseño **src/package** es semánticamente más claro. El código siempre se " +"encuentra en el directorio **src/package**, `tests/` y `docs/` están en el " +"directorio raíz." #: ../../package-structure-code/python-package-structure.md:146 msgid "" @@ -4562,14 +4639,20 @@ msgid "" "repositories like PyPI and Anaconda.org that have to deal with thousands " "of package uploads." msgstr "" +"Si las pruebas de su paquete requieren datos, le sugerimos que NO incluya " +"esos datos en su estructura de paquete. Discutiremos esto con más detalle en " +"un tutorial. Incluir datos en su estructura de paquete aumenta el tamaño de " +"los archivos de su distribución. Esto impone un peaje de mantenimiento en " +"repositorios como PyPI y Anaconda.org que tienen que lidiar con miles de " +"paquetes subidos." #: ../../package-structure-code/python-package-structure.md:153 msgid "About the flat Python package layout" -msgstr "" +msgstr "Sobre el diseño plano de paquetes de Python" #: ../../package-structure-code/python-package-structure.md:155 msgid "Currently most scientific packages use the **flat-layout** given:" -msgstr "" +msgstr "Actualmente, la mayoría de los paquetes científicos utilizan el **diseño plano** dado:" #: ../../package-structure-code/python-package-structure.md:157 msgid "" @@ -4577,6 +4660,9 @@ msgid "" "and people tend to look to other packages / maintainers that they respect" " for examples of how to build Python packages." msgstr "" +"Es el diseño más común en el ecosistema científico de Python " +"y las personas tienden a buscar otros paquetes / mantenedores que respetan " +"como ejemplos de cómo construir paquetes de Python." #: ../../package-structure-code/python-package-structure.md:160 msgid "" @@ -4584,6 +4670,9 @@ msgid "" "builds with compilation steps. Many developers thus appreciate / are used" " to features of the flat layout." msgstr "" +"Muchas herramientas de Python dependen de herramientas en otros idiomas y/o " +"construcciones complejas con pasos de compilación. Por lo tanto, muchos " +"desarrolladores aprecian/están acostumbrados a las características del diseño plano." #: ../../package-structure-code/python-package-structure.md:164 msgid "" @@ -4593,10 +4682,16 @@ msgid "" "move to a src/ layout](https://github.com/scikit-build/cmake-python-" "distributions/pull/145)" msgstr "" +"Aunque presentamos este diseño aquí en nuestra guía, sugerimos que aquellos " +"que recién comienzan con el empaquetado de Python comiencen con el diseño " +"src/package discutido anteriormente. Numerosos paquetes en el ecosistema " +"[han tenido que moverse a un diseño src/]" +"(https://github.com/scikit-build/cmake-python-" +"distributions/pull/145)" #: ../../package-structure-code/python-package-structure.md:169 msgid "Why most scientific Python packages do not use source" -msgstr "" +msgstr "¿Por qué la mayoría de los paquetes científicos de Python no usan el código fuente?" #: ../../package-structure-code/python-package-structure.md:172 msgid "" @@ -4605,6 +4700,10 @@ msgid "" "it. Moving from a flat layout to a **src/package** layout would come at a" " significant cost to maintainers." msgstr "" +"En la mayoría de los casos, las ventajas de usar el diseño **src/package** " +"para paquetes científicos más grandes que ya utilizan un enfoque plano no " +"merecen la pena. Pasar de un diseño plano a un diseño **src/package** " +"supondría un costo significativo para los mantenedores." #: ../../package-structure-code/python-package-structure.md:177 msgid "" @@ -4613,48 +4712,60 @@ msgid "" "started with creating a package, that you consider using a " "**src/package** layout." msgstr "" +"Sin embargo, las ventajas de usar el diseño **src/package** para un principiante " +"son significativas. Por lo tanto, recomendamos que si está comenzando a crear un " +"paquete, considere usar un diseño **src/package**." #: ../../package-structure-code/python-package-structure.md:182 msgid "What does the flat layout structure look like?" -msgstr "" +msgstr "¿Cómo es la estructura del diseño plano?" #: ../../package-structure-code/python-package-structure.md:184 msgid "The flat layout's primary characteristics are:" -msgstr "" +msgstr "Las características principales del diseño plano son:" #: ../../package-structure-code/python-package-structure.md:186 msgid "" "The source code for your package lives in a directory with your package's" " name in the root of your directory" msgstr "" +"El código fuente de su paquete se encuentra en un directorio con el nombre de " +"su paquete en la raíz de su directorio" #: ../../package-structure-code/python-package-structure.md:188 msgid "" "Often the `tests/` directory also lives within that same `package` " "directory." msgstr "" +"A menudo, el directorio `tests/` también se encuentra dentro de ese mismo " +"directorio `package`." #: ../../package-structure-code/python-package-structure.md:190 msgid "" "Below you can see the recommended structure of a scientific Python " "package using the flat layout." msgstr "" +"A continuación, puede ver la estructura recomendada de un paquete científico " +"de Python que utiliza el diseño plano." #: ../../package-structure-code/python-package-structure.md:212 msgid "Benefits of using the flat layout in your Python package" -msgstr "" +msgstr "Beneficios de usar el diseño plano en su paquete de Python" #: ../../package-structure-code/python-package-structure.md:214 msgid "" "There are some benefits to the scientific community in using the flat " "layout." msgstr "" +"Existen algunos beneficios para la comunidad científica al utilizar el diseño plano." #: ../../package-structure-code/python-package-structure.md:216 msgid "" "This structure has historically been used across the ecosystem and " "packages using it are unlikely to change." msgstr "" +"Esta estructura se ha utilizado históricamente en todo el ecosistema y es poco probable " +"que los paquetes que la utilizan cambien." #: ../../package-structure-code/python-package-structure.md:218 msgid "" @@ -4664,10 +4775,15 @@ msgid "" "against the installed version of your package. Rather, you are working " "directly with the flat files." msgstr "" +"Puede importar el paquete directamente desde el directorio raíz. Para algunos, " +"esto está arraigado en sus respectivos flujos de trabajo. Sin embargo, para un " +"principiante, el peligro de hacer esto es que no está desarrollando y probando " +"contra la versión instalada de su paquete. En cambio, está trabajando directamente " +"con los archivos planos." #: ../../package-structure-code/python-package-structure.md:224 msgid "Core scientific Python packages that use the flat layout" -msgstr "" +msgstr "Paquetes científicos de Python que utilizan el diseño plano" #: ../../package-structure-code/python-package-structure.md:227 msgid "[numpy](https://github.com/numpy/numpy)" @@ -4703,6 +4819,9 @@ msgid "" "these packages to a different layout. The potential benefits of the " "source layout for these tools is not worth the maintenance investment." msgstr "" +"Sería un costo y una carga de mantenimiento significativos mover todos estos " +"paquetes a un diseño diferente. Los posibles beneficios del diseño src para " +"estas herramientas no valen la inversión en mantenimiento." #: ../../package-structure-code/python-package-versions.md:1 msgid "Creating New Versions of Your Python Package" From 3b6d03691c2bd59e76f9c6ec8973f44e00cddd25 Mon Sep 17 00:00:00 2001 From: yardasol Date: Sun, 14 Jul 2024 13:39:57 -0400 Subject: [PATCH 27/65] translate publish-documentation-online.md --- locales/es/LC_MESSAGES/documentation.po | 47 +++++++++++++++++++++---- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 2756b5e6..4a9f9f89 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -76,7 +76,7 @@ msgstr "" "que es fácil aprender. Es la sintaxis por defecto para Jupyter Notebooks. Hay " "herramientas que puedas añadir al sitio web de Sphinx que lo permite rendir " "markdown como html. Sin embargo, usando markdown para escribir documentación " -"tiene limitaciónes. Por ejemplo, si quieres añadir referencias, tarjetas " +"tiene limitaciónes. Por ejemplo, si deseas añadir referencias, tarjetas " "de colores, o otros elementos personalizados a tu documentación, necesitaras " "usar **myST** o **rST**." @@ -156,7 +156,7 @@ msgstr "" #: ../../documentation/hosting-tools/publish-documentation-online.md:1 msgid "How to publish your Python package documentation online" -msgstr "" +msgstr "Cómo publicar la documentación de tu paquete de Python en línea" #: ../../documentation/hosting-tools/publish-documentation-online.md:3 msgid "" @@ -164,50 +164,65 @@ msgid "" "documentation. Two free and commonly used ways to quickly create a " "documentation website hosting environment are below." msgstr "" +"Sugerimos que utilizas un servicio de hosting para la documentación de tu " +"paquete de Python. Abajo están dos métodos gratutios i comúnes para crear un " +"entorno de hosting del sitio del web para documentacićon." #: ../../documentation/hosting-tools/publish-documentation-online.md:7 msgid "" "You can host your documentation yourself using [GitHub " "Pages](https://pages.github.com/) or another online hosting service." msgstr "" +"Puedes servir tu documentación utilizando [GitHub " +"Pages](https://pages.github.com/) o otro servicio de hosting." #: ../../documentation/hosting-tools/publish-documentation-online.md:8 msgid "" "You can host your documentation using [Read the " "Docs](https://readthedocs.org/)." msgstr "" +"Puedes servir tu documentación utilizando [Read the " +"Docs](https://readthedocs.org/)." #: ../../documentation/hosting-tools/publish-documentation-online.md:10 msgid "What is Read the Docs ?" -msgstr "" +msgstr "¿Qué es Read the Docs ?" #: ../../documentation/hosting-tools/publish-documentation-online.md:11 msgid "" "[Read the Docs](https://readthedocs.org/) is a documentation hosting " "service that supports publishing your project's documentation." msgstr "" +"[Read the Docs](https://readthedocs.org/) es un servicio de hosting de " +"documentación que apoya publicando la documentación de tu proyecto." #: ../../documentation/hosting-tools/publish-documentation-online.md:13 msgid "" "Read the Docs is a fully featured, free, documentation hosting service. " "Some of its many features include:" msgstr "" +"Read the Docs es un servicio de hosting de documentación gratis. Algunos de " +"sus funcionalidades son:" #: ../../documentation/hosting-tools/publish-documentation-online.md:16 msgid "" "Is free to host your documentation (but there are also paid tiers if you " "wish to customize hosting)" msgstr "" +"Es libre servir tu documentación (pero hay opciones para pagar si deseas " +"peronalizar el hosting)" #: ../../documentation/hosting-tools/publish-documentation-online.md:17 msgid "Automates building your documentation" -msgstr "" +msgstr "Construye tu documentación automáticamente" #: ../../documentation/hosting-tools/publish-documentation-online.md:18 msgid "" "Allows you to turn on integration with pull requests where you can view " "documentation build progress (success vs failure)." msgstr "" +"Te permite usar integractión con pull requests para ver el progreso del build " +"de la documentación (éxito vs error)" #: ../../documentation/hosting-tools/publish-documentation-online.md:19 msgid "" @@ -215,20 +230,25 @@ msgid "" "older tagged versions of the docs if they are using older versions of " "your package." msgstr "" +"Apoya versionando de tu documentación que permite usarios referir a " +"versiones antiguas etiquetadas del docs si están utilizando versiones " +"antiguas de tu paquete." #: ../../documentation/hosting-tools/publish-documentation-online.md:20 msgid "Supports downloading of documentation in PDF and other formats." -msgstr "" +msgstr "Apoya descargando documención en PDF y otras formatas." #: ../../documentation/hosting-tools/publish-documentation-online.md:21 msgid "" "You can customize the documentation build using a **.readthedocs.yaml** " "file in your GitHub repository." msgstr "" +"Puedes personalizar la construcción de la documentación usando un " +"**.readthedocs.yaml** archivo en tu repositorio de GitHub." #: ../../documentation/hosting-tools/publish-documentation-online.md:24 msgid "What is GitHub Pages?" -msgstr "" +msgstr "¿Qué es GitHub Pages?" #: ../../documentation/hosting-tools/publish-documentation-online.md:25 msgid "" @@ -238,10 +258,15 @@ msgid "" "using a Continuous Integration setup, and then push to a branch in your " "GitHub repository that is setup to run the GitHub Pages web build." msgstr "" +"[GitHub Pages](https://docs.github.com/en/pages/getting-started-with-" +"github-pages/about-github-pages) es un servicio de web hosting gratis " +"de GitHub. Con GitHub Pages, puedes construir tu documentactión localmente " +"o utilizando Continuous Integration, y push a un branch en tu repositorio " +"de GitHub que está configurado ejecutar web build de GitHub Pages." #: ../../documentation/hosting-tools/publish-documentation-online.md:33 msgid "Read the Docs vs GitHub Pages" -msgstr "" +msgstr "Read the Docs vs GitHub Pages" #: ../../documentation/hosting-tools/publish-documentation-online.md:35 msgid "" @@ -249,6 +274,9 @@ msgid "" "However, you will need to do a bit more work to build and deploy your " "documentation if you use GitHub pages." msgstr "" +"GitHub Pages es una opción buena para implementación de tu documentación " +"Sin embargo, necesitaras hacer un poco más trabajo para construir y " +"implementar tu documentación si utilizas GitHub Pages." #: ../../documentation/hosting-tools/publish-documentation-online.md:39 msgid "" @@ -256,12 +284,17 @@ msgid "" "service automates the entire process of building and deploying your " "documentation." msgstr "" +"Read the Docs pueda estar configurado en tu cuenta de Read the Docs. " +"El servicio automatiza el proceso de construyendo y implementando tu" +"documentación." #: ../../documentation/hosting-tools/publish-documentation-online.md:42 msgid "" "If you don't want to maintain a documentation website for your Python " "package, we suggest using the Read the Docs website." msgstr "" +"Si no deseas mantener un sitio del web de documentación para tu paquete de " +"Python, sugerimos utilizando Read the Docs." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:1 msgid "Using Sphinx to Build Python Package Documentation" From 33c0558d0418cafad795a1e2af150fa2c87022d1 Mon Sep 17 00:00:00 2001 From: yardasol Date: Sun, 14 Jul 2024 18:25:25 -0400 Subject: [PATCH 28/65] translate sphinx-python-package-documentation-tools.md Also included is a small grammar fix in the source .md file --- ...hinx-python-package-documentation-tools.md | 2 +- locales/es/LC_MESSAGES/documentation.po | 63 ++++++++++++++----- 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/documentation/hosting-tools/sphinx-python-package-documentation-tools.md b/documentation/hosting-tools/sphinx-python-package-documentation-tools.md index 1e1f54d9..ac99959b 100644 --- a/documentation/hosting-tools/sphinx-python-package-documentation-tools.md +++ b/documentation/hosting-tools/sphinx-python-package-documentation-tools.md @@ -46,7 +46,7 @@ and themes. A few examples include: * You can apply documentation themes for quick generation of beautiful documentation. * You can [automatically create documentation for your package's functions and classes (the package's API) from docstrings in your code using the autodoc extension](https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html) * You can [run and test code examples in your docstrings using the doctest extension](https://www.sphinx-doc.org/en/master/usage/extensions/doctest.html) -* While Sphinx natively supports the `rST` syntax. You can add custom syntax parsers to support easier-to-write syntax using tools such as [the MyST parser](https://myst-parser.readthedocs.io/). +* While Sphinx natively supports the `rST` syntax, you can add custom syntax parsers to support easier-to-write syntax using tools such as [the MyST parser](https://myst-parser.readthedocs.io/). ### Commonly used Sphinx themes diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 4a9f9f89..94195cbe 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -135,7 +135,7 @@ msgid "" "Most of your core Python package text files, such as your README.md file," " are already in `.md` format" msgstr "" -"La mayoría de tus archivos de texto de paquetes primarios de Python, " +"La mayoría de tus archivos de texto de paquetes principales de Python, " "como tu archivo README.md, ya están en formato `.md`." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:18 @@ -298,7 +298,7 @@ msgstr "" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:1 msgid "Using Sphinx to Build Python Package Documentation" -msgstr "" +msgstr "Usando Sphinx para construir documentación de paquetes de Python" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:17 msgid "" @@ -309,30 +309,40 @@ msgid "" "[mkdocs](https://www.mkdocs.org/) which is gaining popularity in the " "Python packaging ecosystem." msgstr "" +"En esta página discutimos utilizando [Sphinx](https://www.sphinx-doc.org/) " +"para construir la documentación orientado al usuario de tu paquete. Aunque " +"Sphinx está la herramienta más común en la ecosistma de Python cientifica, " +"puedes explorar otras herramientas para construir documentación como " +"[mkdocs](https://www.mkdocs.org/) que está ganando popularidad en la " +"ecosistema de empaquetado de Python." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:25 msgid "Examples of documentation websites that we love:" -msgstr "" +msgstr "Ejemplos de sitios del web de documentación que queremos:" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:27 msgid "[GeoPandas](https://geopandas.org/en/stable/)" -msgstr "" +msgstr "[GeoPandas](https://geopandas.org/en/stable/)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:28 msgid "" "[View rst to create landing " "page](https://raw.githubusercontent.com/geopandas/geopandas/main/doc/source/index.rst)" msgstr "" +"[Ver rst para crear pagina de " +"entrada](https://raw.githubusercontent.com/geopandas/geopandas/main/doc/source/index.rst)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:29 msgid "[verde](https://www.fatiando.org/verde/latest/)" -msgstr "" +msgstr "[verde](https://www.fatiando.org/verde/latest/)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:30 msgid "" "[View verde landing page code - rst " "file.](https://github.com/fatiando/verde/blob/main/doc/index.rst)" msgstr "" +"[Ver verde codigo de página de entrada - rst " +"archivo.](https://github.com/fatiando/verde/blob/main/doc/index.rst)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:31 msgid "" @@ -340,10 +350,13 @@ msgid "" " page.](https://github.com/pyOpenSci/python-package-" "guide/blob/main/index.md)" msgstr "" +"[Aquí está nuestra documentación si deseas leer un ejemplo de página de " +"entrada de myST.](https://github.com/pyOpenSci/python-package-" +"guide/blob/main/index.md)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:34 msgid "Sphinx - a static site generator" -msgstr "" +msgstr "Sphinx - un generador de sitios estáticos" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:36 msgid "" @@ -354,26 +367,36 @@ msgid "" "\"Statically\" which means that there is no generation or modification of" " the files on the fly." msgstr "" +"Sphinx es un [generador de " +"sitios estáticos](https://www.cloudflare.com/es-es/learning/performance/static-site-" +"generator/). Un generador de sitios estáticos es una herramienta que crea " +"html para un sitio del web por archivos de plantillas. Los archivos html " +"se sirven \"estáticamente\" que significa no hay generación ni modificación " +"de lo archivos instantánea." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:39 msgid "Sphinx is written using Python." -msgstr "" +msgstr "Sphinx se escribe con Python" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:41 msgid "Sphinx sites can be customized using extensions and themes" -msgstr "" +msgstr "Sitios de Sphinx puede ser personalizado con extensiones y temas" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:43 msgid "" "The functionality of Sphinx can be extended using extensions and themes. " "A few examples include:" msgstr "" +"La funcionalidad de Sphinx puede ser extendido con extensiones y temas. " +"Algunos ejemplos incluye:" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:46 msgid "" "You can apply documentation themes for quick generation of beautiful " "documentation." msgstr "" +"Puedes usar temas de documentación para generación rápida de documentación" +"hermosa." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:47 msgid "" @@ -382,6 +405,10 @@ msgid "" "autodoc extension](https://www.sphinx-" "doc.org/en/master/usage/extensions/autodoc.html)" msgstr "" +"Puedes [generar automaticamente documentación para los funciones y clases " +"(el API del paquete) de los docstrings en el código por la extensión " +"autodoc](https://www.sphinx-" +"doc.org/en/master/usage/extensions/autodoc.html)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:48 msgid "" @@ -389,17 +416,23 @@ msgid "" "extension](https://www.sphinx-" "doc.org/en/master/usage/extensions/doctest.html)" msgstr "" +"Puedes [ejecutar y probar ejemplos del codigo en los docstrings por la " +"extensión doctest](https://www.sphinx-" +"doc.org/en/master/usage/extensions/doctest.html)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:49 msgid "" -"While Sphinx natively supports the `rST` syntax. You can add custom " +"While Sphinx natively supports the `rST` syntax, you can add custom " "syntax parsers to support easier-to-write syntax using tools such as [the" " MyST parser](https://myst-parser.readthedocs.io/)." msgstr "" +"Aunque Sphinx apoya sintaxis `rST` nativamente, puedes añadir analidores de " +"sintaxis personalizadas para apoyar sintaxis más fácil con herramientas como " +"[el analizador MyST](https://myst-parser.readthedocs.io/)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:51 msgid "Commonly used Sphinx themes" -msgstr "" +msgstr "Temas comúnes en Sphinx" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:53 msgid "" @@ -407,22 +440,24 @@ msgid "" "most common Sphinx themes used in the Python scientific community " "include:" msgstr "" +"Puedes usar cualquiera tema de Sphinx que prefieres. Sin embargo, las " +"temas más comúnes utilizadas en la comunidad de Python cientifica incluyen:" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:57 msgid "[pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/)" -msgstr "" +msgstr "[pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:58 msgid "[sphinx-book-theme](https://sphinx-book-theme.readthedocs.io/)" -msgstr "" +msgstr "[sphinx-book-theme](https://sphinx-book-theme.readthedocs.io/)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:59 msgid "[furo](https://pradyunsg.me/furo/quickstart/)" -msgstr "" +msgstr "[furo](https://pradyunsg.me/furo/quickstart/)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:63 msgid "This book is created using Sphinx and the `furo` theme." -msgstr "" +msgstr "Este libro se crea con Sphinx y la tema `furo`." #: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:1 msgid "Optimizing your documentation so search engines (and other users) find it" From 638ef5e2ac5458dda483fa7c0a5cb85dfc143bc8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:08:05 +0000 Subject: [PATCH 29/65] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7618bdaf..af134f73 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pyOpenSci scientific Python Packaging Guide -[![All Contributors](https://img.shields.io/badge/all_contributors-66-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-67-orange.svg?style=flat-square)](#contributors-) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/pyopensci/python-package-guide?color=purple&display_name=tag&style=plastic) @@ -159,6 +159,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Ananthu C V
    Ananthu C V

    👀 Chris Holdgraf
    Chris Holdgraf

    💻 👀 Neil Chue Hong
    Neil Chue Hong

    👀 + Roberto Pastor Muela
    Roberto Pastor Muela

    💻 👀 From f8324a87d884790af5022be8d085f2b7686f68a5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:08:06 +0000 Subject: [PATCH 30/65] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7e23ce99..3dccb72d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -679,6 +679,16 @@ "contributions": [ "review" ] + }, + { + "login": "RobPasMue", + "name": "Roberto Pastor Muela", + "avatar_url": "https://avatars.githubusercontent.com/u/37798125?v=4", + "profile": "http://robpasmue.github.io", + "contributions": [ + "code", + "review" + ] } ], "contributorsPerLine": 7, From 39e0102c89d65df320f1dbbc7ad5bfbb207387f9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:12:04 +0000 Subject: [PATCH 31/65] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af134f73..f64465ce 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pyOpenSci scientific Python Packaging Guide -[![All Contributors](https://img.shields.io/badge/all_contributors-67-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-68-orange.svg?style=flat-square)](#contributors-) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/pyopensci/python-package-guide?color=purple&display_name=tag&style=plastic) @@ -160,6 +160,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Chris Holdgraf
    Chris Holdgraf

    💻 👀 Neil Chue Hong
    Neil Chue Hong

    👀 Roberto Pastor Muela
    Roberto Pastor Muela

    💻 👀 + Olek
    Olek

    💻 👀 From fd802cd3fa38163086ff8a51c75f11df01f4feb2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:12:05 +0000 Subject: [PATCH 32/65] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3dccb72d..63988613 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -689,6 +689,16 @@ "code", "review" ] + }, + { + "login": "yardasol", + "name": "Olek", + "avatar_url": "https://avatars.githubusercontent.com/u/45364492?v=4", + "profile": "https://github.com/yardasol", + "contributions": [ + "code", + "review" + ] } ], "contributorsPerLine": 7, From 2c28718b17252017e2662f46c9cd255d162c7de8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:16:37 +0000 Subject: [PATCH 33/65] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f64465ce..ca8514a4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pyOpenSci scientific Python Packaging Guide -[![All Contributors](https://img.shields.io/badge/all_contributors-68-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-69-orange.svg?style=flat-square)](#contributors-) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/pyopensci/python-package-guide?color=purple&display_name=tag&style=plastic) @@ -161,6 +161,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Neil Chue Hong
    Neil Chue Hong

    👀 Roberto Pastor Muela
    Roberto Pastor Muela

    💻 👀 Olek
    Olek

    💻 👀 + Han
    Han

    💻 👀 From 34cddbd90e89dff63fb13fe4a2b453605315320c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:16:38 +0000 Subject: [PATCH 34/65] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 63988613..eb487e96 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -699,6 +699,16 @@ "code", "review" ] + }, + { + "login": "ayhanxian", + "name": "Han", + "avatar_url": "https://avatars.githubusercontent.com/u/20816603?v=4", + "profile": "https://github.com/ayhanxian", + "contributions": [ + "code", + "review" + ] } ], "contributorsPerLine": 7, From ac82adb9b5ccc90ed854ab398e087eabc86f3054 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:17:36 +0000 Subject: [PATCH 35/65] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ca8514a4..35c8fe80 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pyOpenSci scientific Python Packaging Guide -[![All Contributors](https://img.shields.io/badge/all_contributors-69-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-70-orange.svg?style=flat-square)](#contributors-) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/pyopensci/python-package-guide?color=purple&display_name=tag&style=plastic) @@ -162,6 +162,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Roberto Pastor Muela
    Roberto Pastor Muela

    💻 👀 Olek
    Olek

    💻 👀 Han
    Han

    💻 👀 + hpodzorski-USGS
    hpodzorski-USGS

    💻 👀 From 13a721bea7f3aa447ded97d3a5aab412da4c6bf7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:17:37 +0000 Subject: [PATCH 36/65] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index eb487e96..f7659e20 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -709,6 +709,16 @@ "code", "review" ] + }, + { + "login": "hpodzorski-USGS", + "name": "hpodzorski-USGS", + "avatar_url": "https://avatars.githubusercontent.com/u/159824971?v=4", + "profile": "https://github.com/hpodzorski-USGS", + "contributions": [ + "code", + "review" + ] } ], "contributorsPerLine": 7, From 46aa9b011931293e26f65aad30997a63ec2c5ffb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:18:57 +0000 Subject: [PATCH 37/65] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 35c8fe80..8256ca45 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pyOpenSci scientific Python Packaging Guide -[![All Contributors](https://img.shields.io/badge/all_contributors-70-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-71-orange.svg?style=flat-square)](#contributors-) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/pyopensci/python-package-guide?color=purple&display_name=tag&style=plastic) @@ -164,6 +164,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Han
    Han

    💻 👀 hpodzorski-USGS
    hpodzorski-USGS

    💻 👀 + + Naty Clementi
    Naty Clementi

    💻 👀 + From 44d631e6c2cbd86d5648f6b7966d0a4446931381 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:18:58 +0000 Subject: [PATCH 38/65] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f7659e20..29389f08 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -719,6 +719,16 @@ "code", "review" ] + }, + { + "login": "ncclementi", + "name": "Naty Clementi", + "avatar_url": "https://avatars.githubusercontent.com/u/7526622?v=4", + "profile": "https://www.linkedin.com/in/ncclementi/", + "contributions": [ + "code", + "review" + ] } ], "contributorsPerLine": 7, From 935a1ae674dc82ce25e778bf7c3f6b25db428d47 Mon Sep 17 00:00:00 2001 From: Olek <45364492+yardasol@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:41:29 -0400 Subject: [PATCH 39/65] Apply suggestions from @RobPasMue code review Co-authored-by: Roberto Pastor Muela <37798125+RobPasMue@users.noreply.github.com> --- locales/es/LC_MESSAGES/documentation.po | 155 ++++++++++++------------ 1 file changed, 76 insertions(+), 79 deletions(-) diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 94195cbe..8b5a3f47 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -8,7 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-06-28 08:42-0400\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-06-28 08:42-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -30,10 +31,10 @@ msgid "" "[mkdocs](https://www.mkdocs.org/) for documentation. It is up to you to " "use the platform that you prefer for your documentation!" msgstr "" -"Sphinx es la herramienta más común para construir documentación en la " -"ecosistema de Python. Sin embargo, algunos mantendores están usando " -"herramientas como [mkdocs](https://www.mkdocs.org/) para documentación. Es tu " -"decisión usar la herramienta que prefieres para tu documentación." +"Sphinx es la herramienta más común para construir documentación en el " +"ecosistema de Python. Sin embargo, algunos mantenedores están usando " +"herramientas como [mkdocs](https://www.mkdocs.org/) para generar la documentación. ¡Es tu " +"decisión usar la herramienta que prefieras para tu documentación!" #: ../../documentation/hosting-tools/intro.md:8 msgid "" @@ -42,8 +43,8 @@ msgid "" " writing Sphinx documentation including mySt and rST." msgstr "" "En esta sección introducimos Sphinx como herramienta para construir " -"documentación. Hablamos sobre varios opciones de sintaxis que puedes usar " -"para escribir documentación de Sphinx incluyendo myST and rST" +"documentación. Hablamos sobre varias opciones de sintaxis que puedes usar " +"para escribir documentación de Sphinx incluyendo myST and rST." #: ../../documentation/hosting-tools/intro.md:12 msgid "" @@ -56,11 +57,11 @@ msgstr "" #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:1 msgid "Documentation syntax: markdown vs. myST vs. rst syntax to create your docs" -msgstr "Sintaxis de documentación: markdown vs. myST vs. rst sintaxis para crear tu docs." +msgstr "Sintaxis de documentación: markdown vs. myST vs. rst." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:3 msgid "There are three commonly used syntaxes for creating Python documentation:" -msgstr "Hay tres sintaxis comúnes para creando documentación en Python:" +msgstr "Hay tres sintaxis comúnes para crear documentación en Python:" #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:4 msgid "" @@ -72,12 +73,12 @@ msgid "" " blocks and other custom elements to your documentation, you will need to" " use either **myST** or **rST**." msgstr "" -"[markdown](https://www.markdownguide.org/): Markdown es una sintaxis de text " +"[markdown](https://www.markdownguide.org/): Markdown es una sintaxis de texto plano " "que es fácil aprender. Es la sintaxis por defecto para Jupyter Notebooks. Hay " -"herramientas que puedas añadir al sitio web de Sphinx que lo permite rendir " -"markdown como html. Sin embargo, usando markdown para escribir documentación " -"tiene limitaciónes. Por ejemplo, si deseas añadir referencias, tarjetas " -"de colores, o otros elementos personalizados a tu documentación, necesitaras " +"herramientas que puedes usar con Sphinx que permiten renderizar " +"markdown como HTML. Sin embargo, usar markdown para escribir documentación " +"tiene limitaciones. Por ejemplo, si deseas añadir referencias, tarjetas " +"de colores, u otros elementos personalizados a tu documentación, necesitarás " "usar **myST** o **rST**." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:8 @@ -91,9 +92,9 @@ msgid "" msgstr "" "[rST (ReStructured Text):](https://www.sphinx-" "doc.org/en/master/usage/restructuredtext/basics.html). **rST** es la sintaxis " -"nativa que Sphinx apoya. rST fue sintaxis por defecto para docuemntación " -"por muchos años. Sin embargo, recientemente myST ha aumentando en popularidad " -"para ponerse una herramienta favorita para documentación gracias a su +"nativa para Sphinx. rST ha sido la sintaxis por defecto para documentación " +"durante muchos años. Sin embargo, recientemente myST ha aumentado en popularidad " +"para convertirse en la herramienta favorita para documentación gracias a su flexibilidad." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:9 @@ -105,9 +106,9 @@ msgid "" " simple-to-write markdown syntax." msgstr "" "[myST:](https://myst-parser.readthedocs.io/en/latest/intro.html) myST es una " -"combinación de `markdown` y `rST` sintaxis. Es una opción buena si eres " -"cómodo escribiendo markdown. `myst` es preferido por mucho gente porque " -"ofrece la functionalidad extensiva de rST en combinación con la sintaxis " +"combinación de `markdown` y `rST`. Es una opción buena si te sientes " +"cómodo escribiendo markdown. `myst` es preferido por mucha gente dado que " +"ofrece la amplia funcionalidad de rST en combinación con la sintaxis " "fácil de markdown." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:12 @@ -120,14 +121,14 @@ msgstr "" #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:15 msgid "It is a simpler syntax and thus easier to learn;" -msgstr "Es una sintaxis más simple y entonces es más facil aprender;" +msgstr "Es una sintaxis más simple y, por lo tanto más facil de aprender;" #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:16 msgid "" "The above simplicity will make it easier for more people to contribute to" " your documentation." msgstr "" -"Esta simplicidad lo hará más simple para más gente contribuye a tu " +"Esta simplicidad hará más fácil que más gente contribuya a tu " "documentación." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:17 @@ -135,23 +136,23 @@ msgid "" "Most of your core Python package text files, such as your README.md file," " are already in `.md` format" msgstr "" -"La mayoría de tus archivos de texto de paquetes principales de Python, " -"como tu archivo README.md, ya están en formato `.md`." +"La mayoría de los archivos de texto de tus paquetes principales de Python, " +"como el archivo README.md, ya están en formato `.md`." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:18 msgid "" "`GitHub` and `Jupyter Notebooks` support markdown thus it's more widely " "used in the scientific ecosystem." msgstr "" -"`GitHub` y `Jupyter Notebooks` apoyan markdown, entonces son más " -"utilizados en la ecosistema cientifica." +"`GitHub` y `Jupyter Notebooks` apoyan markdown, por lo que son más " +"utilizados en el ecosistema científico." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:22 msgid "" "If you are on the fence about myST vs rst, you might find that **myST** " "is easier for more people to contribute to." msgstr "" -"Si no estás seguro sobre si utilizar myST o rst, puede que encuentre que " +"Si no estás seguro sobre si utilizar myST o rst, puede que encuentres que " "**myST** es más fácil para contribuciones de más gente." #: ../../documentation/hosting-tools/publish-documentation-online.md:1 @@ -165,16 +166,15 @@ msgid "" "documentation website hosting environment are below." msgstr "" "Sugerimos que utilizas un servicio de hosting para la documentación de tu " -"paquete de Python. Abajo están dos métodos gratutios i comúnes para crear un " -"entorno de hosting del sitio del web para documentacićon." - +"paquete de Python. Abajo encontrarás dos métodos gratuitos y comúnes para servir " +"tu documentación en un sitio web." #: ../../documentation/hosting-tools/publish-documentation-online.md:7 msgid "" "You can host your documentation yourself using [GitHub " "Pages](https://pages.github.com/) or another online hosting service." msgstr "" "Puedes servir tu documentación utilizando [GitHub " -"Pages](https://pages.github.com/) o otro servicio de hosting." +"Pages](https://pages.github.com/) u otro servicio de hosting." #: ../../documentation/hosting-tools/publish-documentation-online.md:8 msgid "" @@ -186,22 +186,22 @@ msgstr "" #: ../../documentation/hosting-tools/publish-documentation-online.md:10 msgid "What is Read the Docs ?" -msgstr "¿Qué es Read the Docs ?" +msgstr "¿Qué es Read the Docs?" #: ../../documentation/hosting-tools/publish-documentation-online.md:11 msgid "" "[Read the Docs](https://readthedocs.org/) is a documentation hosting " "service that supports publishing your project's documentation." msgstr "" -"[Read the Docs](https://readthedocs.org/) es un servicio de hosting de " -"documentación que apoya publicando la documentación de tu proyecto." +"[Read the Docs](https://readthedocs.org/) es un servicio de hosting " +"que permite publicar la documentación de tu proyecto." #: ../../documentation/hosting-tools/publish-documentation-online.md:13 msgid "" "Read the Docs is a fully featured, free, documentation hosting service. " "Some of its many features include:" msgstr "" -"Read the Docs es un servicio de hosting de documentación gratis. Algunos de " +"Read the Docs es un servicio de hosting de documentación gratuito. Algunas de " "sus funcionalidades son:" #: ../../documentation/hosting-tools/publish-documentation-online.md:16 @@ -209,8 +209,8 @@ msgid "" "Is free to host your documentation (but there are also paid tiers if you " "wish to customize hosting)" msgstr "" -"Es libre servir tu documentación (pero hay opciones para pagar si deseas " -"peronalizar el hosting)" +"Permite servir tu documentación de forma gratuita (pero hay opciones de pago si deseas " +"personalizar el hosting)" #: ../../documentation/hosting-tools/publish-documentation-online.md:17 msgid "Automates building your documentation" @@ -230,13 +230,13 @@ msgid "" "older tagged versions of the docs if they are using older versions of " "your package." msgstr "" -"Apoya versionando de tu documentación que permite usarios referir a " +"Permite versionar tu documentación, lo que permite a los usuarios acceder a " "versiones antiguas etiquetadas del docs si están utilizando versiones " "antiguas de tu paquete." #: ../../documentation/hosting-tools/publish-documentation-online.md:20 msgid "Supports downloading of documentation in PDF and other formats." -msgstr "Apoya descargando documención en PDF y otras formatas." +msgstr "Permite descargar la documentación en PDF y otros formatos." #: ../../documentation/hosting-tools/publish-documentation-online.md:21 msgid "" @@ -244,7 +244,7 @@ msgid "" "file in your GitHub repository." msgstr "" "Puedes personalizar la construcción de la documentación usando un " -"**.readthedocs.yaml** archivo en tu repositorio de GitHub." +"archivo **.readthedocs.yaml** en tu repositorio de GitHub." #: ../../documentation/hosting-tools/publish-documentation-online.md:24 msgid "What is GitHub Pages?" @@ -260,7 +260,7 @@ msgid "" msgstr "" "[GitHub Pages](https://docs.github.com/en/pages/getting-started-with-" "github-pages/about-github-pages) es un servicio de web hosting gratis " -"de GitHub. Con GitHub Pages, puedes construir tu documentactión localmente " +"de GitHub. Con GitHub Pages, puedes construir tu documentación localmente " "o utilizando Continuous Integration, y push a un branch en tu repositorio " "de GitHub que está configurado ejecutar web build de GitHub Pages." @@ -274,9 +274,9 @@ msgid "" "However, you will need to do a bit more work to build and deploy your " "documentation if you use GitHub pages." msgstr "" -"GitHub Pages es una opción buena para implementación de tu documentación " -"Sin embargo, necesitaras hacer un poco más trabajo para construir y " -"implementar tu documentación si utilizas GitHub Pages." +"GitHub Pages es una opción buena para el despliegue de tu documentación. " +"Sin embargo, necesitarás hacer un poco más de trabajo para construir y " +"desplegar tu documentación si utilizas GitHub Pages." #: ../../documentation/hosting-tools/publish-documentation-online.md:39 msgid "" @@ -284,17 +284,16 @@ msgid "" "service automates the entire process of building and deploying your " "documentation." msgstr "" -"Read the Docs pueda estar configurado en tu cuenta de Read the Docs. " -"El servicio automatiza el proceso de construyendo y implementando tu" +"Read the Docs se puede configurar a través de tu cuenta de Read the Docs. " +"El servicio automatiza el proceso de construcción y despliegue de tu " "documentación." - #: ../../documentation/hosting-tools/publish-documentation-online.md:42 msgid "" "If you don't want to maintain a documentation website for your Python " "package, we suggest using the Read the Docs website." msgstr "" -"Si no deseas mantener un sitio del web de documentación para tu paquete de " -"Python, sugerimos utilizando Read the Docs." +"Si no deseas mantener un sitio web de documentación para tu paquete de " +"Python, sugerimos utilizar Read the Docs." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:1 msgid "Using Sphinx to Build Python Package Documentation" @@ -309,20 +308,19 @@ msgid "" "[mkdocs](https://www.mkdocs.org/) which is gaining popularity in the " "Python packaging ecosystem." msgstr "" -"En esta página discutimos utilizando [Sphinx](https://www.sphinx-doc.org/) " -"para construir la documentación orientado al usuario de tu paquete. Aunque " -"Sphinx está la herramienta más común en la ecosistma de Python cientifica, " +"En esta página presentamos como utilizar [Sphinx](https://www.sphinx-doc.org/) " +"para construir la documentación orientada a los usuarios de tu paquete. Aunque " +"Sphinx es la herramienta más común en la ecosistema de Python científico, " "puedes explorar otras herramientas para construir documentación como " -"[mkdocs](https://www.mkdocs.org/) que está ganando popularidad en la " +"[mkdocs](https://www.mkdocs.org/) que está ganando popularidad en el " "ecosistema de empaquetado de Python." - #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:25 msgid "Examples of documentation websites that we love:" -msgstr "Ejemplos de sitios del web de documentación que queremos:" +msgstr "Ejemplos de sitios del web de documentación que nos gustan:" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:27 msgid "[GeoPandas](https://geopandas.org/en/stable/)" -msgstr "[GeoPandas](https://geopandas.org/en/stable/)" +msgstr "" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:28 msgid "" @@ -334,16 +332,15 @@ msgstr "" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:29 msgid "[verde](https://www.fatiando.org/verde/latest/)" -msgstr "[verde](https://www.fatiando.org/verde/latest/)" +msgstr "" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:30 msgid "" "[View verde landing page code - rst " "file.](https://github.com/fatiando/verde/blob/main/doc/index.rst)" msgstr "" -"[Ver verde codigo de página de entrada - rst " -"archivo.](https://github.com/fatiando/verde/blob/main/doc/index.rst)" - +"[Ver página de inicio para verde - archivo rst " +".](https://github.com/fatiando/verde/blob/main/doc/index.rst)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:31 msgid "" "[Here is our documentation if you want to see a myST example of a landing" @@ -351,7 +348,7 @@ msgid "" "guide/blob/main/index.md)" msgstr "" "[Aquí está nuestra documentación si deseas leer un ejemplo de página de " -"entrada de myST.](https://github.com/pyOpenSci/python-package-" +"inicio en myST.](https://github.com/pyOpenSci/python-package-" "guide/blob/main/index.md)" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:34 @@ -370,25 +367,25 @@ msgstr "" "Sphinx es un [generador de " "sitios estáticos](https://www.cloudflare.com/es-es/learning/performance/static-site-" "generator/). Un generador de sitios estáticos es una herramienta que crea " -"html para un sitio del web por archivos de plantillas. Los archivos html " -"se sirven \"estáticamente\" que significa no hay generación ni modificación " +"HTML para un sitio web basado en plantillas. Los archivos HTML " +"se sirven \"estáticamente\", lo que significa que no hay generación ni modificación " "de lo archivos instantánea." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:39 msgid "Sphinx is written using Python." -msgstr "Sphinx se escribe con Python" +msgstr "Sphinx está desarrollado en Python." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:41 msgid "Sphinx sites can be customized using extensions and themes" -msgstr "Sitios de Sphinx puede ser personalizado con extensiones y temas" +msgstr "La documentación creada con Sphinx puede ser personalizada con extensiones y temas" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:43 msgid "" "The functionality of Sphinx can be extended using extensions and themes. " "A few examples include:" msgstr "" -"La funcionalidad de Sphinx puede ser extendido con extensiones y temas. " -"Algunos ejemplos incluye:" +"La funcionalidad de Sphinx puede ser extendida con extensiones y temas. " +"Algunos ejemplos incluyen:" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:46 msgid "" @@ -405,8 +402,8 @@ msgid "" "autodoc extension](https://www.sphinx-" "doc.org/en/master/usage/extensions/autodoc.html)" msgstr "" -"Puedes [generar automaticamente documentación para los funciones y clases " -"(el API del paquete) de los docstrings en el código por la extensión " +"Puedes [generar automáticamente documentación para las funciones y clases " +"(la API del paquete) desde los docstrings de tu código usando la extensión " "autodoc](https://www.sphinx-" "doc.org/en/master/usage/extensions/autodoc.html)" @@ -416,7 +413,7 @@ msgid "" "extension](https://www.sphinx-" "doc.org/en/master/usage/extensions/doctest.html)" msgstr "" -"Puedes [ejecutar y probar ejemplos del codigo en los docstrings por la " +"Puedes [ejecutar y probar ejemplos del código en los docstrings usando la " "extensión doctest](https://www.sphinx-" "doc.org/en/master/usage/extensions/doctest.html)" @@ -426,9 +423,9 @@ msgid "" "syntax parsers to support easier-to-write syntax using tools such as [the" " MyST parser](https://myst-parser.readthedocs.io/)." msgstr "" -"Aunque Sphinx apoya sintaxis `rST` nativamente, puedes añadir analidores de " -"sintaxis personalizadas para apoyar sintaxis más fácil con herramientas como " -"[el analizador MyST](https://myst-parser.readthedocs.io/)" +"Aunque Sphinx se basa en sintaxis `rST` de forma nativa, puedes añadir intérpretes de " +"sintaxis personalizadas para usar otras sintaxis más fáciles con herramientas como " +"[MyST](https://myst-parser.readthedocs.io/)." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:51 msgid "Commonly used Sphinx themes" @@ -440,24 +437,24 @@ msgid "" "most common Sphinx themes used in the Python scientific community " "include:" msgstr "" -"Puedes usar cualquiera tema de Sphinx que prefieres. Sin embargo, las " -"temas más comúnes utilizadas en la comunidad de Python cientifica incluyen:" +"Puedes usar cualquiera tema de Sphinx que prefieras. Sin embargo, los " +"temas más comúnes utilizados en la comunidad de Python científico incluyen:" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:57 msgid "[pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/)" -msgstr "[pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/)" +msgstr "" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:58 msgid "[sphinx-book-theme](https://sphinx-book-theme.readthedocs.io/)" -msgstr "[sphinx-book-theme](https://sphinx-book-theme.readthedocs.io/)" +msgstr "" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:59 msgid "[furo](https://pradyunsg.me/furo/quickstart/)" -msgstr "[furo](https://pradyunsg.me/furo/quickstart/)" +msgstr "" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:63 msgid "This book is created using Sphinx and the `furo` theme." -msgstr "Este libro se crea con Sphinx y la tema `furo`." +msgstr "Este archivo se crea con Sphinx y el tema `furo`." #: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:1 msgid "Optimizing your documentation so search engines (and other users) find it" From 3fff1f59129d95aa3f8dd05b974deff4bdbbb2aa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 16:55:27 -0600 Subject: [PATCH 40/65] docs: add John-Drake as a contributor for code, and review (#349) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 29389f08..018448f3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -729,6 +729,16 @@ "code", "review" ] + }, + { + "login": "John-Drake", + "name": "John Drake", + "avatar_url": "https://avatars.githubusercontent.com/u/22374979?v=4", + "profile": "https://github.com/John-Drake", + "contributions": [ + "code", + "review" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 8256ca45..50cc01cc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pyOpenSci scientific Python Packaging Guide -[![All Contributors](https://img.shields.io/badge/all_contributors-71-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-72-orange.svg?style=flat-square)](#contributors-) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/pyopensci/python-package-guide?color=purple&display_name=tag&style=plastic) @@ -166,6 +166,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Naty Clementi
    Naty Clementi

    💻 👀 + John Drake
    John Drake

    💻 👀 From a08c10e9ab391b5d8e6a75828c1eef24965efbd7 Mon Sep 17 00:00:00 2001 From: hpodzorski-USGS <159824971+hpodzorski-USGS@users.noreply.github.com> Date: Sat, 13 Jul 2024 12:52:14 -0500 Subject: [PATCH 41/65] Added links for installing hatch via pip and conda. --- tutorials/get-to-know-hatch.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tutorials/get-to-know-hatch.md b/tutorials/get-to-know-hatch.md index 2dd90617..f395f97f 100644 --- a/tutorials/get-to-know-hatch.md +++ b/tutorials/get-to-know-hatch.md @@ -66,6 +66,19 @@ however, if you prefer another method, check out the [Hatch installation documen ::: :::: +:::{tip} +Hatch can also be installed directly using [pip](https://hatch.pypa.io/latest/install/#pip) or [conda](https://hatch.pypa.io/latest/install/#conda). We encourage you to +follow the instructions above because we have found that the Hatch installers +for Windows and Mac are the easiest and most efficient. + +Our Linux users have found success installing Hatch with pipx if they already +use apt install. + +Both approaches (using a graphical installer on Windows/Mac and pipx) ensure +that you have Hatch installed globally. A global install means that Hatch is +available across all of your Python environments on your computer. +::: + ### Check that hatch installed correctly Once you have completed the installation instructions above, you can open your @@ -79,19 +92,6 @@ hatch --version *Note the version number output of `hatch --version` will likely be different from the output above in this tutorial.* -:::{tip} -Hatch can also be installed directly using pip or conda. We encourage you to -follow the instructions above because we have found that the Hatch installers -for Windows and Mac are the easiest and most efficient. - -Our Linux users have found success installing Hatch with pipx if they already -use apt install. - -Both approaches (using a graphical installer on Windows/Mac and pipx) ensure -that you have Hatch installed globally. A global install means that Hatch is -available across all of your Python environments on your computer. -::: - ## Configure Hatch Once you have installed Hatch, you can customize its configuration. This From 6f0b5d4a11079580fb19c7fdb1205f819ea7b60f Mon Sep 17 00:00:00 2001 From: hpodzorski-USGS <159824971+hpodzorski-USGS@users.noreply.github.com> Date: Sat, 13 Jul 2024 13:35:31 -0500 Subject: [PATCH 42/65] Updated CONTRIBUTING.md, added text on forking a repo. --- CONTRIBUTING.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f395d91..5c7c10e4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,9 +32,15 @@ The second approach is making your contribution directly in the GitHub website. ## Forking the repository -Independently of the approach you choose, the first step is to fork the Python Packaging Guide repository into your personal GitHub space. +Independently of the approach you choose, the first step is to fork the Python Packaging Guide repository into your personal GitHub space. To "fork" a repository in GitHub means to create a copy of the main repository, or repo, that you have complete control over and can modify as you see fit. -*__TODO__: This section should show a beginner user how to fork a repository in GitHub.* +To fork a repo, + +1. Make sure you are logged into GitHub. + +2. Go to the repo you would like to fork, in this case the [Python Packaging Guide](https://www.github.com/pyopensci/python-package-guide) repo. + +3. In the top right-hand corner of the page there is a 'Fork' button. Click that button. You will be brought to a new page where you will 'Create a new fork'. Feel free to keep all the default inputs and click 'Create fork'. This will create a copy of the repo at `https://github.com//python-package-guide`, where `` is your GitHub username. ## Contributing via the GitHub website From 875d86b4ae2d5708ada31082a90d0cc4895e0921 Mon Sep 17 00:00:00 2001 From: hpodzorski-USGS <159824971+hpodzorski-USGS@users.noreply.github.com> Date: Sat, 13 Jul 2024 13:49:59 -0500 Subject: [PATCH 43/65] Updated CONTRIBUTING.md, added image with fork button. --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c7c10e4..330db17c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,6 +42,8 @@ To fork a repo, 3. In the top right-hand corner of the page there is a 'Fork' button. Click that button. You will be brought to a new page where you will 'Create a new fork'. Feel free to keep all the default inputs and click 'Create fork'. This will create a copy of the repo at `https://github.com//python-package-guide`, where `` is your GitHub username. +fork_repo + ## Contributing via the GitHub website ### How to edit a MarkDown file From c6518a0ae883200fdea178f6cf40970b6533a08d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 22:15:43 +0000 Subject: [PATCH 44/65] =?UTF-8?q?'[pre-commit.ci=20=F0=9F=A4=96]=20Apply?= =?UTF-8?q?=20code=20format=20tools=20to=20PR'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 330db17c..d5ab0ec4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,7 +34,7 @@ The second approach is making your contribution directly in the GitHub website. Independently of the approach you choose, the first step is to fork the Python Packaging Guide repository into your personal GitHub space. To "fork" a repository in GitHub means to create a copy of the main repository, or repo, that you have complete control over and can modify as you see fit. -To fork a repo, +To fork a repo, 1. Make sure you are logged into GitHub. From a1c950af60c02d3a7b8f50aefdec2f4c255916a6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 16:34:24 -0600 Subject: [PATCH 45/65] docs: add Revathyvenugopal162 as a contributor for code, and review (#351) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 018448f3..23c7719a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -739,6 +739,16 @@ "code", "review" ] + }, + { + "login": "Revathyvenugopal162", + "name": "Revathy Venugopal", + "avatar_url": "https://avatars.githubusercontent.com/u/104772255?v=4", + "profile": "https://github.com/Revathyvenugopal162", + "contributions": [ + "code", + "review" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 50cc01cc..9cfb2dda 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pyOpenSci scientific Python Packaging Guide -[![All Contributors](https://img.shields.io/badge/all_contributors-72-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-73-orange.svg?style=flat-square)](#contributors-) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/pyopensci/python-package-guide?color=purple&display_name=tag&style=plastic) @@ -167,6 +167,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Naty Clementi
    Naty Clementi

    💻 👀 John Drake
    John Drake

    💻 👀 + Revathy Venugopal
    Revathy Venugopal

    💻 👀 From bcdb31abc17957425c486688a198c50df1d3fa04 Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 18:05:34 +0900 Subject: [PATCH 46/65] Create empty translation files for Japanese --- locales/es/LC_MESSAGES/CONTRIBUTING.po | 147 +- locales/es/LC_MESSAGES/tutorials.po | 321 +- locales/ja/LC_MESSAGES/CONTRIBUTING.po | 436 ++ locales/ja/LC_MESSAGES/TRANSLATING.po | 718 +++ locales/ja/LC_MESSAGES/documentation.po | 2546 ++++++++ locales/ja/LC_MESSAGES/index.po | 484 ++ .../ja/LC_MESSAGES/package-structure-code.po | 5302 ++++++++++++++++ locales/ja/LC_MESSAGES/tests.po | 1003 +++ locales/ja/LC_MESSAGES/tutorials.po | 5537 +++++++++++++++++ noxfile.py | 2 +- 10 files changed, 16375 insertions(+), 121 deletions(-) create mode 100644 locales/ja/LC_MESSAGES/CONTRIBUTING.po create mode 100644 locales/ja/LC_MESSAGES/TRANSLATING.po create mode 100644 locales/ja/LC_MESSAGES/documentation.po create mode 100644 locales/ja/LC_MESSAGES/index.po create mode 100644 locales/ja/LC_MESSAGES/package-structure-code.po create mode 100644 locales/ja/LC_MESSAGES/tests.po create mode 100644 locales/ja/LC_MESSAGES/tutorials.po diff --git a/locales/es/LC_MESSAGES/CONTRIBUTING.po b/locales/es/LC_MESSAGES/CONTRIBUTING.po index b2a801f4..0cddd183 100644 --- a/locales/es/LC_MESSAGES/CONTRIBUTING.po +++ b/locales/es/LC_MESSAGES/CONTRIBUTING.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: pyOpenSci Python Package Guide \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-03 16:27-0400\n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -119,96 +119,117 @@ msgstr "" #: ../../CONTRIBUTING.md:35 msgid "" "Independently of the approach you choose, the first step is to fork the " -"Python Packaging Guide repository into your personal GitHub space." +"Python Packaging Guide repository into your personal GitHub space. To " +"\"fork\" a repository in GitHub means to create a copy of the main " +"repository, or repo, that you have complete control over and can modify " +"as you see fit." msgstr "" #: ../../CONTRIBUTING.md:37 -msgid "" -"*__TODO__: This section should show a beginner user how to fork a " -"repository in GitHub.*" +msgid "To fork a repo," msgstr "" #: ../../CONTRIBUTING.md:39 -msgid "Contributing via the GitHub website" +msgid "Make sure you are logged into GitHub." msgstr "" #: ../../CONTRIBUTING.md:41 -msgid "How to edit a MarkDown file" +msgid "" +"Go to the repo you would like to fork, in this case the [Python Packaging" +" Guide](https://www.github.com/pyopensci/python-package-guide) repo." msgstr "" #: ../../CONTRIBUTING.md:43 msgid "" +"In the top right-hand corner of the page there is a 'Fork' button. Click " +"that button. You will be brought to a new page where you will 'Create a " +"new fork'. Feel free to keep all the default inputs and click 'Create " +"fork'. This will create a copy of the repo at " +"`https://github.com//python-package-guide`, where `` " +"is your GitHub username." +msgstr "" + +#: ../../CONTRIBUTING.md:47 +msgid "Contributing via the GitHub website" +msgstr "" + +#: ../../CONTRIBUTING.md:49 +msgid "How to edit a MarkDown file" +msgstr "" + +#: ../../CONTRIBUTING.md:51 +msgid "" "*__TODO__: This section should show how to use the GitHub interface to " "edit and previewing a Markdown file.*" msgstr "" -#: ../../CONTRIBUTING.md:45 +#: ../../CONTRIBUTING.md:53 msgid "How to commit your changes" msgstr "" -#: ../../CONTRIBUTING.md:47 +#: ../../CONTRIBUTING.md:55 msgid "" "*__TODO__: This section should show how to commit changes via the GitHub " "interface.*" msgstr "" -#: ../../CONTRIBUTING.md:49 +#: ../../CONTRIBUTING.md:57 msgid "Contributing locally on your computer" msgstr "" -#: ../../CONTRIBUTING.md:51 +#: ../../CONTRIBUTING.md:59 msgid "Clone your forked repository" msgstr "" -#: ../../CONTRIBUTING.md:53 +#: ../../CONTRIBUTING.md:61 msgid "" "*__TODO__: This section should show how to clone a repository from GitHub" " into your computer.*" msgstr "" -#: ../../CONTRIBUTING.md:55 +#: ../../CONTRIBUTING.md:63 msgid "Create a new branch" msgstr "" -#: ../../CONTRIBUTING.md:57 +#: ../../CONTRIBUTING.md:65 msgid "*__TODO__: This section should show how to create a new branch.*" msgstr "" -#: ../../CONTRIBUTING.md:59 +#: ../../CONTRIBUTING.md:67 msgid "Create a virtual environment" msgstr "" -#: ../../CONTRIBUTING.md:61 +#: ../../CONTRIBUTING.md:69 msgid "" "*__TODO__: This section should show how to create a virtual environment " "using venv.*" msgstr "" -#: ../../CONTRIBUTING.md:63 +#: ../../CONTRIBUTING.md:71 msgid "Install the development dependencies" msgstr "" -#: ../../CONTRIBUTING.md:65 +#: ../../CONTRIBUTING.md:73 msgid "" "*__TODO__: This section should show how to install the development " "dependencies defined in pyproject.toml.*" msgstr "" -#: ../../CONTRIBUTING.md:67 +#: ../../CONTRIBUTING.md:75 msgid "Commit your changes" msgstr "" -#: ../../CONTRIBUTING.md:69 +#: ../../CONTRIBUTING.md:77 msgid "" "*__TODO__: This section should describe how to commit from the command " "line.*" msgstr "" -#: ../../CONTRIBUTING.md:71 +#: ../../CONTRIBUTING.md:79 msgid "How to build the guide locally" msgstr "" -#: ../../CONTRIBUTING.md:73 +#: ../../CONTRIBUTING.md:81 msgid "" "*__TODO__: This section should describe the different sessions in nox " "related to building the docs: docs, docs-test, docs-live. It should also " @@ -216,85 +237,85 @@ msgid "" " browser or using the live version from docs-live*" msgstr "" -#: ../../CONTRIBUTING.md:75 +#: ../../CONTRIBUTING.md:83 msgid "Before you submit your pull request" msgstr "" -#: ../../CONTRIBUTING.md:77 +#: ../../CONTRIBUTING.md:85 msgid "" "*__TODO__: This section should describe what steps a user should follow " "before submitting the pull request: build the docs, verify your changes " "look correct, etc.*" msgstr "" -#: ../../CONTRIBUTING.md:79 +#: ../../CONTRIBUTING.md:87 msgid "Submitting a pull request with your contribution" msgstr "" -#: ../../CONTRIBUTING.md:81 +#: ../../CONTRIBUTING.md:89 msgid "How to make a pull request" msgstr "" -#: ../../CONTRIBUTING.md:83 +#: ../../CONTRIBUTING.md:91 msgid "" "*__TODO__: This section should describe how to make a pull request in " "GitHub.*" msgstr "" -#: ../../CONTRIBUTING.md:85 +#: ../../CONTRIBUTING.md:93 msgid "What happens when you submit a pull request (CI/CD)" msgstr "" -#: ../../CONTRIBUTING.md:87 +#: ../../CONTRIBUTING.md:95 msgid "" "*__TODO__: This section should describe how to see the results of the " "CD/CI checks and how to get more information about errors*" msgstr "" -#: ../../CONTRIBUTING.md:89 +#: ../../CONTRIBUTING.md:97 msgid "What to expect from the review process" msgstr "" -#: ../../CONTRIBUTING.md:91 +#: ../../CONTRIBUTING.md:99 msgid "" "*__TODO__: This section should describe how review happens in GitHub, how" " see the comments, and how to submit changes (push a new branch)*" msgstr "" -#: ../../CONTRIBUTING.md:93 +#: ../../CONTRIBUTING.md:101 msgid "Additional help" msgstr "" -#: ../../CONTRIBUTING.md:95 +#: ../../CONTRIBUTING.md:103 msgid "How to get help" msgstr "" -#: ../../CONTRIBUTING.md:97 +#: ../../CONTRIBUTING.md:105 msgid "" "*__TODO__: This section should describe the options for finding more help" " in case beginner contributors need more help (e.g., create an issue, " "post in a forum, etc).*" msgstr "" -#: ../../CONTRIBUTING.md:99 +#: ../../CONTRIBUTING.md:107 msgid "Additional resources" msgstr "" -#: ../../CONTRIBUTING.md:101 +#: ../../CONTRIBUTING.md:109 msgid "" "*__TODO__: It should also include links to beginner documentation, like " "the GitHub docs.*" msgstr "" -#: ../../CONTRIBUTING.md:103 +#: ../../CONTRIBUTING.md:111 msgid "Annex" msgstr "" -#: ../../CONTRIBUTING.md:105 +#: ../../CONTRIBUTING.md:113 msgid "Code examples" msgstr "" -#: ../../CONTRIBUTING.md:107 +#: ../../CONTRIBUTING.md:115 msgid "" "This guide uses the [literalinclude Sphinx directive](https://www.sphinx-" "doc.org/en/master/usage/restructuredtext/directives.html#directive-" @@ -302,18 +323,18 @@ msgid "" "for use in the documentation is kept in the `examples/` folder." msgstr "" -#: ../../CONTRIBUTING.md:111 +#: ../../CONTRIBUTING.md:119 msgid "Referencing code in documentation" msgstr "" -#: ../../CONTRIBUTING.md:113 +#: ../../CONTRIBUTING.md:121 msgid "" "If an example is present elsewhere in the documentation that you want to " "use, you can copy the `literalinclude` directive verbatim and the " "examples will stay in sync." msgstr "" -#: ../../CONTRIBUTING.md:116 +#: ../../CONTRIBUTING.md:124 msgid "" "If you already see code in the examples folder that you can use for new " "documentation, a new `literalinclude` can be made to extract it into the " @@ -323,7 +344,7 @@ msgid "" "the later can protect your example from future modifications to the code." msgstr "" -#: ../../CONTRIBUTING.md:121 +#: ../../CONTRIBUTING.md:129 msgid "" "**Pro tip**: As an alternative to `:lines:` there are also the `:start-" "after:`, `:start-at:`, `:end-before:`, and `:end-at:` options. And if the" @@ -331,17 +352,17 @@ msgid "" "way to keep the same documentation content even through code refactors." msgstr "" -#: ../../CONTRIBUTING.md:125 +#: ../../CONTRIBUTING.md:133 msgid "" "If you need example code that doesn't yet exist in `examples/` see " "creating code for documentation](#creating-code-for-documentation)." msgstr "" -#: ../../CONTRIBUTING.md:128 +#: ../../CONTRIBUTING.md:136 msgid "Creating code for documentation" msgstr "" -#: ../../CONTRIBUTING.md:130 +#: ../../CONTRIBUTING.md:138 msgid "" "Whenever you come across a place that could benefit from a code block, " "instead of writing it in-line with a code fence (`` ``` `` blocked text) " @@ -350,7 +371,7 @@ msgid "" "code-in-documentation)." msgstr "" -#: ../../CONTRIBUTING.md:134 +#: ../../CONTRIBUTING.md:142 msgid "" "If you want to add a new example that doesn't fit into any of the " "existing example files, you can create a new file and reference it in a " @@ -359,7 +380,7 @@ msgid "" "create a new folder in the `examples` directory." msgstr "" -#: ../../CONTRIBUTING.md:138 +#: ../../CONTRIBUTING.md:146 msgid "" "If an existing example is incomplete or a new example makes sense to be " "added to an existing file, go ahead and add it, but take care to not " @@ -368,14 +389,14 @@ msgid "" "file, new methods after all existing ones in a class." msgstr "" -#: ../../CONTRIBUTING.md:142 +#: ../../CONTRIBUTING.md:150 msgid "" "Example code is checked for correctness, so adding a new example may " "require adding additional tests for coverage, and will require fixing any" " failing tests." msgstr "" -#: ../../CONTRIBUTING.md:145 +#: ../../CONTRIBUTING.md:153 msgid "" "***⚠️ WARNING***: great care should be taken when modifying existing " "example code, especially any modification beyond appending to the end of " @@ -386,29 +407,43 @@ msgid "" "and then checking those pages in a new build." msgstr "" -#: ../../CONTRIBUTING.md:153 +#: ../../CONTRIBUTING.md:161 msgid "Example:" msgstr "" -#: ../../CONTRIBUTING.md:155 +#: ../../CONTRIBUTING.md:163 msgid "Instead of writing example code in markdown like this" msgstr "" -#: ../../CONTRIBUTING.md:166 +#: ../../CONTRIBUTING.md:174 msgid "The python can be extracted into a `.py` file" msgstr "" -#: ../../CONTRIBUTING.md:180 +#: ../../CONTRIBUTING.md:188 msgid "" "As another example, if you only need to show part of a `pyproject.toml`, " "we already have complete project definitions, you need only to find the " "relevant part." msgstr "" -#: ../../CONTRIBUTING.md:183 +#: ../../CONTRIBUTING.md:191 msgid "Instead of writing this" msgstr "" -#: ../../CONTRIBUTING.md:195 +#: ../../CONTRIBUTING.md:203 msgid "an example could be extracted from an existing toml file" msgstr "" + +#~ msgid "" +#~ "Independently of the approach you " +#~ "choose, the first step is to fork" +#~ " the Python Packaging Guide repository " +#~ "into your personal GitHub space." +#~ msgstr "" + +#~ msgid "" +#~ "*__TODO__: This section should show a" +#~ " beginner user how to fork a " +#~ "repository in GitHub.*" +#~ msgstr "" + diff --git a/locales/es/LC_MESSAGES/tutorials.po b/locales/es/LC_MESSAGES/tutorials.po index 3427e46d..137d86ab 100644 --- a/locales/es/LC_MESSAGES/tutorials.po +++ b/locales/es/LC_MESSAGES/tutorials.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: pyOpenSci Python Package Guide \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-28 08:42-0400\n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -913,116 +913,231 @@ msgstr "" msgid "Discourages misuse of your package and associated code" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:1 ../../tutorials/intro.md:27 -#: ../../tutorials/setup-py-to-pyproject-toml.md:24 -msgid "Get to know Hatch" +#: ../../tutorials/get-to-know-hatch.md:1 +msgid "Get to Know Hatch" msgstr "" #: ../../tutorials/get-to-know-hatch.md:3 msgid "" -"Our Python packaging tutorials use the tool Hatch. In this tutorial, you " -"will install and get to know Hatch a bit more before starting to use it." +"Our Python packaging tutorials use the tool " +"[Hatch](https://hatch.pypa.io/latest/). While there are [many great " +"packaging tools](/package-structure-code/python-package-build-tools) out " +"there, we have selected Hatch because:" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:6 -msgid "Install Hatch" +#: ../../tutorials/get-to-know-hatch.md:8 +msgid "" +"It is an end-to-end tool that supports most of the steps required to " +"create a quality Python package. Beginners will have fewer tools to learn" +" if they use Hatch." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:7 +#: ../../tutorials/get-to-know-hatch.md:11 msgid "" -"To begin, install Hatch from the command line using " -"[pipx](https://pipx.pypa.io/stable/)" +"It supports different build back-ends if you ever need to compile code in" +" other languages." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:14 +#: ../../tutorials/get-to-know-hatch.md:13 msgid "" -"Hatch can also be installed directly using `pip` or `conda`, but we " -"encourage you to use `pipx`. This is because `pipx` will ensure that your" -" package is available across all of your Python environments on your " -"computer rather than just in the environment that you install it into. If" -" you install hatch this way you will have to take care that the " -"environment it is installed into is activated for the command to work." +"As a community, pyOpenSci has decided that Hatch is a user-friendly tool " +"that supports many different scientific Python use cases." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:16 +msgid "" +"In this tutorial, you will install and get to know Hatch a bit more " +"before starting to use it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:19 +msgid "You need two things to successfully complete this tutorial:" msgstr "" #: ../../tutorials/get-to-know-hatch.md:21 +msgid "You need Python installed." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:22 +msgid "You need Hatch installed." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:25 +msgid "" +"If you don't already have Python installed on your computer, Hatch will " +"do it for you when you install Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:29 +msgid "Install Hatch" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:31 +msgid "" +"To begin, follow the operating-system-specific instructions below to " +"install Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "MAC" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:38 +msgid "" +"Follow the instructions " +"[here](https://hatch.pypa.io/latest/install/#installers)." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:40 +msgid "" +"Download the latest GUI installer for MAC [hatch-" +"universal.pkg](https://github.com/pypa/hatch/releases/latest/download" +"/hatch-universal.pkg)." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:41 +msgid "Run the installer and follow the setup instructions." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:42 +msgid "If your terminal is open, then restart it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "Windows" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:48 +msgid "" +"In your browser, download the correct `.msi` file for your system: " +"[hatch-x64.msi](https://github.com/pypa/hatch/releases/latest/download/hatch-x64.msi)" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:50 +msgid "Run your downloaded installer file and follow the on-screen instructions." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "Linux" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:56 +msgid "" +"We suggest that you install Hatch using pipx on Linux. however, if you " +"prefer another method, check out the [Hatch installation " +"documentation](https://hatch.pypa.io/latest/install/) for other methods." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:70 +msgid "" +"Hatch can also be installed directly using " +"[pip](https://hatch.pypa.io/latest/install/#pip) or " +"[conda](https://hatch.pypa.io/latest/install/#conda). We encourage you to" +" follow the instructions above because we have found that the Hatch " +"installers for Windows and Mac are the easiest and most efficient." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:74 +msgid "" +"Our Linux users have found success installing Hatch with pipx if they " +"already use apt install." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:77 msgid "" -"You can check that hatch is working properly by issuing a simple command " -"to get the version" +"Both approaches (using a graphical installer on Windows/Mac and pipx) " +"ensure that you have Hatch installed globally. A global install means " +"that Hatch is available across all of your Python environments on your " +"computer." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:28 -msgid "Note the version numbers will likely be different" +#: ../../tutorials/get-to-know-hatch.md:82 +msgid "Check that hatch installed correctly" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:30 -msgid "Configure hatch" +#: ../../tutorials/get-to-know-hatch.md:84 +msgid "" +"Once you have completed the installation instructions above, you can open" +" your terminal, and make sure that Hatch installed correctly using the " +"command below:" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:32 +#: ../../tutorials/get-to-know-hatch.md:92 msgid "" -"Once you have installed Hatch, you will want to customize the " -"configuration." +"*Note the version number output of `hatch --version` will likely be " +"different from the output above in this tutorial.*" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:95 +msgid "Configure Hatch" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:34 +#: ../../tutorials/get-to-know-hatch.md:97 msgid "" -"Hatch stores your configuration information in a [`config.toml` " +"Once you have installed Hatch, you can customize its configuration. This " +"includes setting the default name and setup for every package you create." +" While this step is not required, we suggest that you do it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:101 +msgid "" +"Hatch stores your configuration in a [`config.toml` " "file](https://hatch.pypa.io/latest/config/project-templates/)." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:36 +#: ../../tutorials/get-to-know-hatch.md:103 msgid "" "While you can update the `config.toml` file through the command line, it " -"might be easier to look at it and update it in a text editor if you are " +"might be easier to look at and update it in a text editor if you are " "using it for the first time." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:39 -msgid "Step 1: Open and edit your `config.toml` file" +#: ../../tutorials/get-to-know-hatch.md:107 +msgid "Step 1: Open and Edit Your `config.toml` File" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:41 +#: ../../tutorials/get-to-know-hatch.md:109 msgid "" "To open the config file in your file browser, run the following command " "in your shell:" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:43 +#: ../../tutorials/get-to-know-hatch.md:112 msgid "`hatch config explore`" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:45 +#: ../../tutorials/get-to-know-hatch.md:114 msgid "" -"This will open up a directory window that will allow you to double click " -"on the file and open it in your favorite text editor." +"This will open up a directory window that allows you to double-click on " +"the file and open it in your favorite text editor." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:47 +#: ../../tutorials/get-to-know-hatch.md:117 msgid "" "You can also retrieve the location of the Hatch config file by running " "the following command in your shell:" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:54 +#: ../../tutorials/get-to-know-hatch.md:125 msgid "Step 2 - update your email and name" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:56 +#: ../../tutorials/get-to-know-hatch.md:127 msgid "" "Once the file is open, update the [template] table of the `config.toml` " "file with your name and email. This information will be used in any " "`pyproject.toml` metadata files that you create using Hatch." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:64 +#: ../../tutorials/get-to-know-hatch.md:137 msgid "Step 3" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:66 +#: ../../tutorials/get-to-know-hatch.md:139 msgid "Next, set tests to false in the `[template.plugins.default]` table." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:68 +#: ../../tutorials/get-to-know-hatch.md:141 msgid "" "While tests are important, setting the tests configuration in Hatch to " "`true` will create a more complex `pyproject.toml` file. You won't need " @@ -1030,11 +1145,11 @@ msgid "" " introduce it in later tutorials." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:73 +#: ../../tutorials/get-to-know-hatch.md:146 msgid "Your `config.toml` file should look something like the one below." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:111 +#: ../../tutorials/get-to-know-hatch.md:184 msgid "" "Also notice that the default license option is MIT. While we will discuss" " license in more detail in a later lesson, the MIT license is the " @@ -1043,11 +1158,11 @@ msgid "" "use it for this tutorial series." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:116 +#: ../../tutorials/get-to-know-hatch.md:190 msgid "You are of course welcome to select another license." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:118 +#: ../../tutorials/get-to-know-hatch.md:192 #: ../../tutorials/installable-code.md:22 #: ../../tutorials/installable-code.md:411 #: ../../tutorials/installable-code.md:502 ../../tutorials/intro.md:226 @@ -1056,84 +1171,84 @@ msgstr "" msgid "Todo" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:119 +#: ../../tutorials/get-to-know-hatch.md:193 msgid "" "I think we'd need the SPDX license options here if they want to chose " "bsd-3 for instance" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:122 +#: ../../tutorials/get-to-know-hatch.md:196 msgid "Step 4: Close the config file and run `hatch config show`" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:124 +#: ../../tutorials/get-to-know-hatch.md:198 msgid "" "Once you have completed the steps above run the following command in your" " shell." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:126 +#: ../../tutorials/get-to-know-hatch.md:200 msgid "`hatch config show`" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:128 +#: ../../tutorials/get-to-know-hatch.md:202 msgid "" "`hatch config show` will print out the contents of your `config.toml` " "file in your shell. look at the values and ensure that your name, email " "is set. Also make sure that `tests=false`." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:130 +#: ../../tutorials/get-to-know-hatch.md:206 msgid "Hatch features" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:132 +#: ../../tutorials/get-to-know-hatch.md:208 msgid "" "Hatch offers a suite of features that will make creating, publishing and " "maintaining your Python package easier." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:135 +#: ../../tutorials/get-to-know-hatch.md:211 msgid "Comparison to other tools" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:137 +#: ../../tutorials/get-to-know-hatch.md:213 msgid "" "[We compared Hatch to several of the other popular packaging tools in the" " ecosystem including flit, pdm and poetry. Learn more here](package-" "features)" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:140 +#: ../../tutorials/get-to-know-hatch.md:216 msgid "[More on Hatch here](hatch)" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:142 +#: ../../tutorials/get-to-know-hatch.md:218 msgid "A few features that Hatch offers" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:145 +#: ../../tutorials/get-to-know-hatch.md:220 msgid "" "it will convert metadata stored in a `setup.py` or `setup.cfg` file to a " "pyproject.toml file for you (see [Migrating setup.py to pyproject.toml " "using Hatch](setup-py-to-pyproject-toml.md ))" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:147 +#: ../../tutorials/get-to-know-hatch.md:222 msgid "" "It will help you by storing configuration information for publishing to " "PyPI after you've entered it once." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:149 +#: ../../tutorials/get-to-know-hatch.md:224 msgid "Use `hatch -h` to see all of the available commands." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:152 +#: ../../tutorials/get-to-know-hatch.md:226 msgid "What's next" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:154 +#: ../../tutorials/get-to-know-hatch.md:228 msgid "" "In the next lesson you'll learn how to package and make your code " "installable using Hatch." @@ -2038,6 +2153,10 @@ msgstr "" msgid "[epydoc](https://epydoc.sourceforge.net/epytext.html)" msgstr "" +#: ../../tutorials/intro.md:27 ../../tutorials/setup-py-to-pyproject-toml.md:24 +msgid "Get to know Hatch" +msgstr "" + #: ../../tutorials/intro.md:27 msgid "Python Packaging Tutorial Setup" msgstr "" @@ -5415,3 +5534,77 @@ msgid "" "existing functionality remains intact. Run any pre-existing tests to " "verify that everything still works as expected." msgstr "" + +#~ msgid "" +#~ "Our Python packaging tutorials use the" +#~ " tool Hatch. In this tutorial, you" +#~ " will install and get to know " +#~ "Hatch a bit more before starting " +#~ "to use it." +#~ msgstr "" + +#~ msgid "" +#~ "To begin, install Hatch from the " +#~ "command line using " +#~ "[pipx](https://pipx.pypa.io/stable/)" +#~ msgstr "" + +#~ msgid "" +#~ "Hatch can also be installed directly " +#~ "using `pip` or `conda`, but we " +#~ "encourage you to use `pipx`. This " +#~ "is because `pipx` will ensure that " +#~ "your package is available across all " +#~ "of your Python environments on your " +#~ "computer rather than just in the " +#~ "environment that you install it into." +#~ " If you install hatch this way " +#~ "you will have to take care that" +#~ " the environment it is installed into" +#~ " is activated for the command to " +#~ "work." +#~ msgstr "" + +#~ msgid "" +#~ "You can check that hatch is " +#~ "working properly by issuing a simple " +#~ "command to get the version" +#~ msgstr "" + +#~ msgid "Note the version numbers will likely be different" +#~ msgstr "" + +#~ msgid "Configure hatch" +#~ msgstr "" + +#~ msgid "" +#~ "Once you have installed Hatch, you " +#~ "will want to customize the " +#~ "configuration." +#~ msgstr "" + +#~ msgid "" +#~ "Hatch stores your configuration information" +#~ " in a [`config.toml` " +#~ "file](https://hatch.pypa.io/latest/config/project-templates/)." +#~ msgstr "" + +#~ msgid "" +#~ "While you can update the `config.toml`" +#~ " file through the command line, it" +#~ " might be easier to look at it" +#~ " and update it in a text editor" +#~ " if you are using it for the" +#~ " first time." +#~ msgstr "" + +#~ msgid "Step 1: Open and edit your `config.toml` file" +#~ msgstr "" + +#~ msgid "" +#~ "This will open up a directory " +#~ "window that will allow you to " +#~ "double click on the file and open" +#~ " it in your favorite text editor." +#~ msgstr "" + diff --git a/locales/ja/LC_MESSAGES/CONTRIBUTING.po b/locales/ja/LC_MESSAGES/CONTRIBUTING.po new file mode 100644 index 00000000..3c3eee6f --- /dev/null +++ b/locales/ja/LC_MESSAGES/CONTRIBUTING.po @@ -0,0 +1,436 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../CONTRIBUTING.md:4 +msgid "Contributing to the Python Packaging Guide" +msgstr "" + +#: ../../CONTRIBUTING.md:6 +msgid "The guide is a community resource." +msgstr "" + +#: ../../CONTRIBUTING.md:8 +msgid "TL;DR" +msgstr "" + +#: ../../CONTRIBUTING.md:10 +msgid "We welcome contributions in the form of issues and pull requests:" +msgstr "" + +#: ../../CONTRIBUTING.md:12 +msgid "" +"If you have an idea for something that should be included in the guide, " +"[please open an issue here](https://github.com/pyOpenSci/python-package-" +"guide/issues)." +msgstr "" + +#: ../../CONTRIBUTING.md:13 +msgid "" +"If you find a typo, feel free to [submit a pull " +"request](https://github.com/pyOpenSci/python-package-guide/pulls) to " +"modify the text directly. Or, if you are less comfortable with pull " +"requests, feel free to open an issue." +msgstr "" + +#: ../../CONTRIBUTING.md:14 +msgid "" +"If you are interested in helping translate the guide into other " +"languages, take a look at the [translation guide](./TRANSLATING.md)." +msgstr "" + +#: ../../CONTRIBUTING.md:15 +msgid "" +"If you want to see a larger change to the content of the guide book, " +"please submit an issue first!" +msgstr "" + +#: ../../CONTRIBUTING.md:17 +msgid "" +"If you are unsure about how to contribute or are not familiar with git " +"and github, this guide will help you through the process." +msgstr "" + +#: ../../CONTRIBUTING.md:19 +msgid "How the Python Packaging Guide is structured" +msgstr "" + +#: ../../CONTRIBUTING.md:21 +msgid "" +"The Python Packaging Guide is written in myST (a variant of MarkDown and " +"rST) and we use **Sphinx**, a documentation engine built in `Python` to " +"build the HTML version you see online." +msgstr "" + +#: ../../CONTRIBUTING.md:23 +msgid "We use a tool called Nox to manage the process of building the guide." +msgstr "" + +#: ../../CONTRIBUTING.md:25 +msgid "Two approaches to contributing" +msgstr "" + +#: ../../CONTRIBUTING.md:27 +msgid "You can contribute to the guide using two approaches." +msgstr "" + +#: ../../CONTRIBUTING.md:29 +msgid "" +"The first approach is using a local copy of the guide in your computer. " +"This option requires a more involved setup, but allows you to build the " +"guide locally to verify your contribution did not introduce any bugs " +"before submitting a pull request. It is the recommended approach for " +"larger contribution, like writing a whole new section." +msgstr "" + +#: ../../CONTRIBUTING.md:31 +msgid "" +"The second approach is making your contribution directly in the GitHub " +"website. This option does not require any setup on your computer and " +"while your contribution will still be tested when you submit a PR " +"(continuous integration), it will take longer for you to get any feedback" +" in case of issue. It is the best way to make small contribution, like " +"fixing typos, or if this is your first contribution to open source and " +"the first approach feels too intimidating." +msgstr "" + +#: ../../CONTRIBUTING.md:33 +msgid "Forking the repository" +msgstr "" + +#: ../../CONTRIBUTING.md:35 +msgid "" +"Independently of the approach you choose, the first step is to fork the " +"Python Packaging Guide repository into your personal GitHub space. To " +"\"fork\" a repository in GitHub means to create a copy of the main " +"repository, or repo, that you have complete control over and can modify " +"as you see fit." +msgstr "" + +#: ../../CONTRIBUTING.md:37 +msgid "To fork a repo," +msgstr "" + +#: ../../CONTRIBUTING.md:39 +msgid "Make sure you are logged into GitHub." +msgstr "" + +#: ../../CONTRIBUTING.md:41 +msgid "" +"Go to the repo you would like to fork, in this case the [Python Packaging" +" Guide](https://www.github.com/pyopensci/python-package-guide) repo." +msgstr "" + +#: ../../CONTRIBUTING.md:43 +msgid "" +"In the top right-hand corner of the page there is a 'Fork' button. Click " +"that button. You will be brought to a new page where you will 'Create a " +"new fork'. Feel free to keep all the default inputs and click 'Create " +"fork'. This will create a copy of the repo at " +"`https://github.com//python-package-guide`, where `` " +"is your GitHub username." +msgstr "" + +#: ../../CONTRIBUTING.md:47 +msgid "Contributing via the GitHub website" +msgstr "" + +#: ../../CONTRIBUTING.md:49 +msgid "How to edit a MarkDown file" +msgstr "" + +#: ../../CONTRIBUTING.md:51 +msgid "" +"*__TODO__: This section should show how to use the GitHub interface to " +"edit and previewing a Markdown file.*" +msgstr "" + +#: ../../CONTRIBUTING.md:53 +msgid "How to commit your changes" +msgstr "" + +#: ../../CONTRIBUTING.md:55 +msgid "" +"*__TODO__: This section should show how to commit changes via the GitHub " +"interface.*" +msgstr "" + +#: ../../CONTRIBUTING.md:57 +msgid "Contributing locally on your computer" +msgstr "" + +#: ../../CONTRIBUTING.md:59 +msgid "Clone your forked repository" +msgstr "" + +#: ../../CONTRIBUTING.md:61 +msgid "" +"*__TODO__: This section should show how to clone a repository from GitHub" +" into your computer.*" +msgstr "" + +#: ../../CONTRIBUTING.md:63 +msgid "Create a new branch" +msgstr "" + +#: ../../CONTRIBUTING.md:65 +msgid "*__TODO__: This section should show how to create a new branch.*" +msgstr "" + +#: ../../CONTRIBUTING.md:67 +msgid "Create a virtual environment" +msgstr "" + +#: ../../CONTRIBUTING.md:69 +msgid "" +"*__TODO__: This section should show how to create a virtual environment " +"using venv.*" +msgstr "" + +#: ../../CONTRIBUTING.md:71 +msgid "Install the development dependencies" +msgstr "" + +#: ../../CONTRIBUTING.md:73 +msgid "" +"*__TODO__: This section should show how to install the development " +"dependencies defined in pyproject.toml.*" +msgstr "" + +#: ../../CONTRIBUTING.md:75 +msgid "Commit your changes" +msgstr "" + +#: ../../CONTRIBUTING.md:77 +msgid "" +"*__TODO__: This section should describe how to commit from the command " +"line.*" +msgstr "" + +#: ../../CONTRIBUTING.md:79 +msgid "How to build the guide locally" +msgstr "" + +#: ../../CONTRIBUTING.md:81 +msgid "" +"*__TODO__: This section should describe the different sessions in nox " +"related to building the docs: docs, docs-test, docs-live. It should also " +"show how to see the guide built locally, by opening the right file in the" +" browser or using the live version from docs-live*" +msgstr "" + +#: ../../CONTRIBUTING.md:83 +msgid "Before you submit your pull request" +msgstr "" + +#: ../../CONTRIBUTING.md:85 +msgid "" +"*__TODO__: This section should describe what steps a user should follow " +"before submitting the pull request: build the docs, verify your changes " +"look correct, etc.*" +msgstr "" + +#: ../../CONTRIBUTING.md:87 +msgid "Submitting a pull request with your contribution" +msgstr "" + +#: ../../CONTRIBUTING.md:89 +msgid "How to make a pull request" +msgstr "" + +#: ../../CONTRIBUTING.md:91 +msgid "" +"*__TODO__: This section should describe how to make a pull request in " +"GitHub.*" +msgstr "" + +#: ../../CONTRIBUTING.md:93 +msgid "What happens when you submit a pull request (CI/CD)" +msgstr "" + +#: ../../CONTRIBUTING.md:95 +msgid "" +"*__TODO__: This section should describe how to see the results of the " +"CD/CI checks and how to get more information about errors*" +msgstr "" + +#: ../../CONTRIBUTING.md:97 +msgid "What to expect from the review process" +msgstr "" + +#: ../../CONTRIBUTING.md:99 +msgid "" +"*__TODO__: This section should describe how review happens in GitHub, how" +" see the comments, and how to submit changes (push a new branch)*" +msgstr "" + +#: ../../CONTRIBUTING.md:101 +msgid "Additional help" +msgstr "" + +#: ../../CONTRIBUTING.md:103 +msgid "How to get help" +msgstr "" + +#: ../../CONTRIBUTING.md:105 +msgid "" +"*__TODO__: This section should describe the options for finding more help" +" in case beginner contributors need more help (e.g., create an issue, " +"post in a forum, etc).*" +msgstr "" + +#: ../../CONTRIBUTING.md:107 +msgid "Additional resources" +msgstr "" + +#: ../../CONTRIBUTING.md:109 +msgid "" +"*__TODO__: It should also include links to beginner documentation, like " +"the GitHub docs.*" +msgstr "" + +#: ../../CONTRIBUTING.md:111 +msgid "Annex" +msgstr "" + +#: ../../CONTRIBUTING.md:113 +msgid "Code examples" +msgstr "" + +#: ../../CONTRIBUTING.md:115 +msgid "" +"This guide uses the [literalinclude Sphinx directive](https://www.sphinx-" +"doc.org/en/master/usage/restructuredtext/directives.html#directive-" +"literalinclude) whenever possible to keep code and prose separate. Code " +"for use in the documentation is kept in the `examples/` folder." +msgstr "" + +#: ../../CONTRIBUTING.md:119 +msgid "Referencing code in documentation" +msgstr "" + +#: ../../CONTRIBUTING.md:121 +msgid "" +"If an example is present elsewhere in the documentation that you want to " +"use, you can copy the `literalinclude` directive verbatim and the " +"examples will stay in sync." +msgstr "" + +#: ../../CONTRIBUTING.md:124 +msgid "" +"If you already see code in the examples folder that you can use for new " +"documentation, a new `literalinclude` can be made to extract it into the " +"site. Only a relative path to the code is required for a working " +"`literalinclude`, but you should in almost all cases also provide a " +"`:language:` and `:lines:`. The former makes code examples prettier, and " +"the later can protect your example from future modifications to the code." +msgstr "" + +#: ../../CONTRIBUTING.md:129 +msgid "" +"**Pro tip**: As an alternative to `:lines:` there are also the `:start-" +"after:`, `:start-at:`, `:end-before:`, and `:end-at:` options. And if the" +" example code is Python, `:pyobject:` can be an even more future-proof " +"way to keep the same documentation content even through code refactors." +msgstr "" + +#: ../../CONTRIBUTING.md:133 +msgid "" +"If you need example code that doesn't yet exist in `examples/` see " +"creating code for documentation](#creating-code-for-documentation)." +msgstr "" + +#: ../../CONTRIBUTING.md:136 +msgid "Creating code for documentation" +msgstr "" + +#: ../../CONTRIBUTING.md:138 +msgid "" +"Whenever you come across a place that could benefit from a code block, " +"instead of writing it in-line with a code fence (`` ``` `` blocked text) " +"you can write it as a file in its own format. Your example may even " +"already exist; [see referencing code in documentation ](#referencing-" +"code-in-documentation)." +msgstr "" + +#: ../../CONTRIBUTING.md:142 +msgid "" +"If you want to add a new example that doesn't fit into any of the " +"existing example files, you can create a new file and reference it in a " +"`literalinclude` block. If it makes sense for that file to live within " +"one of the existing example projects please add it there; otherwise " +"create a new folder in the `examples` directory." +msgstr "" + +#: ../../CONTRIBUTING.md:146 +msgid "" +"If an existing example is incomplete or a new example makes sense to be " +"added to an existing file, go ahead and add it, but take care to not " +"break the rest of the guide. Whenever possible, extend the example rather" +" that rewrite it. So for instance, add new functions to the end of the " +"file, new methods after all existing ones in a class." +msgstr "" + +#: ../../CONTRIBUTING.md:150 +msgid "" +"Example code is checked for correctness, so adding a new example may " +"require adding additional tests for coverage, and will require fixing any" +" failing tests." +msgstr "" + +#: ../../CONTRIBUTING.md:153 +msgid "" +"***⚠️ WARNING***: great care should be taken when modifying existing " +"example code, especially any modification beyond appending to the end of " +"the file. All code examples are (potentially) shared examples. This makes" +" for more consistent examples in the guide but can mean action-" +"at-a-distance when modifying the examples for one particular use case. If" +" you find yourself modifying existing examples try running this command " +"and then checking those pages in a new build." +msgstr "" + +#: ../../CONTRIBUTING.md:161 +msgid "Example:" +msgstr "" + +#: ../../CONTRIBUTING.md:163 +msgid "Instead of writing example code in markdown like this" +msgstr "" + +#: ../../CONTRIBUTING.md:174 +msgid "The python can be extracted into a `.py` file" +msgstr "" + +#: ../../CONTRIBUTING.md:188 +msgid "" +"As another example, if you only need to show part of a `pyproject.toml`, " +"we already have complete project definitions, you need only to find the " +"relevant part." +msgstr "" + +#: ../../CONTRIBUTING.md:191 +msgid "Instead of writing this" +msgstr "" + +#: ../../CONTRIBUTING.md:203 +msgid "an example could be extracted from an existing toml file" +msgstr "" + diff --git a/locales/ja/LC_MESSAGES/TRANSLATING.po b/locales/ja/LC_MESSAGES/TRANSLATING.po new file mode 100644 index 00000000..707de067 --- /dev/null +++ b/locales/ja/LC_MESSAGES/TRANSLATING.po @@ -0,0 +1,718 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../TRANSLATING.md:5 +msgid "Translation Guide for the Python Packaging Guide" +msgstr "" + +#: ../../TRANSLATING.md:7 +msgid "" +"This guide will help you get started contributing to the translation of " +"the Python Packaging Guide." +msgstr "" + +#: ../../TRANSLATING.md:9 +msgid "" +"The process of contributing to the translation of the guide is similar to" +" the process of contributing to the guide itself, except that instead of " +"working on the guide source files directly, you will be working on the " +"translation files." +msgstr "" + +#: ../../TRANSLATING.md:11 +msgid "Overview of the Translation Process" +msgstr "" + +#: ../../TRANSLATING.md:13 +msgid "" +"The process of adapting software to different languages is called " +"internationalization, or i18n for short. Internationalization makes sure " +"that translation can happen without having to modify the source code, or " +"in our case, the original English source files of the guide." +msgstr "" + +#: ../../TRANSLATING.md:15 +msgid "" +"Sphinx, the documentation engine we use to build the Python Package " +"Guide, has built-in support for internationalization, so the workflow is " +"very straightforward." +msgstr "" + +#: ../../TRANSLATING.md:17 +msgid "" +"The process of actually translating the guide into different languages is" +" called localization, or l10n for short. This is the step you will be " +"helping with your contribution." +msgstr "" + +#: ../../TRANSLATING.md:19 +msgid "Here is a quick overview of how the translation process works:" +msgstr "" + +#: ../../TRANSLATING.md:21 +msgid "" +"The guide is originally written in English and stored in a set of " +"MarkDown files." +msgstr "" + +#: ../../TRANSLATING.md:22 +msgid "" +"The source files are processed by Sphinx to generate a set of translation" +" files stored in a folder for each target language." +msgstr "" + +#: ../../TRANSLATING.md:23 +msgid "" +"Contributors (like you!) translate these files into the different " +"languages." +msgstr "" + +#: ../../TRANSLATING.md:24 +msgid "" +"When the guide is built, Sphinx creates a version of the guide in the " +"original language (English) and the translated versions for the languages" +" defined in the configuration." +msgstr "" + +#: ../../TRANSLATING.md:27 +msgid "" +"You don't need to understand the technical details to contribute, but if " +"you are interested in learning how Sphinx handles internationalization " +"and localization, you can find more information [here](https://www" +".sphinx-doc.org/en/master/usage/advanced/intl.html)." +msgstr "" + +#: ../../TRANSLATING.md:30 +msgid "Setting up Your Local Environment" +msgstr "" + +#: ../../TRANSLATING.md:32 +msgid "Before you start, you will need to set up your local work environment." +msgstr "" + +#: ../../TRANSLATING.md:34 +msgid "" +"First, fork the guide repository into your personal GitHub account and " +"clone the forked repository to your local computer." +msgstr "" + +#: ../../TRANSLATING.md:36 +msgid "" +"To create a virtual environment and install the development dependencies " +"for the guide, run the following commands:" +msgstr "" + +#: ../../TRANSLATING.md:45 +msgid "" +"TODO: This section needs more work or to be replaced with a reference to " +"the CONTRIBUTING guide." +msgstr "" + +#: ../../TRANSLATING.md:47 +msgid "Starting a New Language Translation" +msgstr "" + +#: ../../TRANSLATING.md:49 +msgid "" +"If you plan to work on an existing translation, you can skip this step " +"and go directly to the next section." +msgstr "" + +#: ../../TRANSLATING.md:51 ../../TRANSLATING.md:217 +msgid "Important" +msgstr "" + +#: ../../TRANSLATING.md:52 +msgid "" +"If you would like to start the translation of the guide into a new " +"language, start by [creating an issue](https://github.com/pyOpenSci" +"/python-package-guide/issues) in the repository." +msgstr "" + +#: ../../TRANSLATING.md:55 +msgid "" +"To generate the translation files for a new language, add the language to" +" the `LANGUAGES` list in the `noxfile.py` configuration file. " +"[Nox](https://nox.thea.codes/en/stable/index.html) is the tool we use to " +"manage the building of the guide and its translations." +msgstr "" + +#: ../../TRANSLATING.md:57 +msgid "" +"Inside `noxfile.py`, find the `LANGUAGES` list and add the corresponding " +"two-letter code. For example, if you want to start the translation of the" +" guide into French, you would add `'fr'`:" +msgstr "" + +#: ../../TRANSLATING.md:68 +msgid "" +"You can find a list of the two-letter ISO language codes " +"[here](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes)." +msgstr "" + +#: ../../TRANSLATING.md:71 +msgid "Preparing the Translation Files" +msgstr "" + +#: ../../TRANSLATING.md:73 +msgid "" +"The translation files contain the original English text and a space for " +"you to enter the translated text. Before starting to translate, you need " +"to make sure the translation files are up to date with the latest changes" +" to the guide." +msgstr "" + +#: ../../TRANSLATING.md:75 +msgid "You can do this by running the following command:" +msgstr "" + +#: ../../TRANSLATING.md:81 +msgid "" +"This command will create the translation files if they don't exist yet, " +"or update them with the latest changes if they already exist." +msgstr "" + +#: ../../TRANSLATING.md:83 +msgid "" +"The translation files are text files with the `.po` extension stored in " +"the `./locales`, in folders corresponding to each language. For example, " +"the translation files for Spanish are stored in the " +"`locale/es/LC_MESSAGES` directory." +msgstr "" + +#: ../../TRANSLATING.md:85 +msgid "" +"Because the translation files map the original English text to translated" +" text, they are sometimes referred to as \"catalog\" files or \"portable " +"object\" files." +msgstr "" + +#: ../../TRANSLATING.md:88 +msgid "" +"You don't need to know all the details about the PO format in order to " +"translate. If you are interested in learning more, you can find " +"additional details in the [GNU gettext " +"documentation](https://www.gnu.org/software/gettext/manual/html_node/PO-" +"Files.html)." +msgstr "" + +#: ../../TRANSLATING.md:91 +msgid "Working on a Translation" +msgstr "" + +#: ../../TRANSLATING.md:93 +msgid "" +"In order to start translating, go to the folder inside `./locales` " +"corresponding to the target language you want to translate to (for " +"example, `./locale/es/LC_MESSAGES/` for the Spanish translation)." +msgstr "" + +#: ../../TRANSLATING.md:95 +msgid "" +"In this folder you will find a set of `.po` files, corresponding to the " +"different sections of the guide:" +msgstr "" + +#: ../../TRANSLATING.md:111 +msgid "" +"You may also see some `.mo` files in the same folder. These are compiled " +"versions of the `.po` files create by Sphinx during the build process, " +"and used to generate the translated version of the guide. They are " +"intermediary files and are not meant to be edited directly or stored in " +"the repository." +msgstr "" + +#: ../../TRANSLATING.md:114 +msgid "" +"If you are working on a new translation, choose one of the `.po` files to" +" start with. If you are working on an existing translation, you can start" +" with the `.po` files that need the most work." +msgstr "" + +#: ../../TRANSLATING.md:116 +msgid "" +"To see how much of each file has been translated, use the `sphinx-intl " +"stat`. You will be able to see the number of translated, fuzzy, and " +"untranslated strings in each `.po` file." +msgstr "" + +#: ../../TRANSLATING.md:118 +msgid "" +"For example, to see the statistics for the Spanish translation, you would" +" run:" +msgstr "" + +#: ../../TRANSLATING.md:132 +msgid "What do these categories mean:" +msgstr "" + +#: ../../TRANSLATING.md:134 +msgid "" +"Translated strings are strings that have been translated into the target " +"language." +msgstr "" + +#: ../../TRANSLATING.md:135 +msgid "" +"Fuzzy strings are strings that have been translated but need to be " +"reviewed because the original English string in the guide changed." +msgstr "" + +#: ../../TRANSLATING.md:136 +msgid "Untranslated strings are strings that have not been translated yet." +msgstr "" + +#: ../../TRANSLATING.md:139 +msgid "" +"When Sphinx is building the guide in another language, it will look into " +"the corresponding folder in `./locales/` for translated strings. If the " +"translation is available, Sphinx will replace the English text with the " +"equivalent text in the target language. If the translation is not " +"available, Sphinx will use the original English strings." +msgstr "" + +#: ../../TRANSLATING.md:142 +msgid "Editing the Translation Files" +msgstr "" + +#: ../../TRANSLATING.md:144 +msgid "" +"You can use any text editor to edit the `.po` file. But if you prefer, " +"there are also tools like [Poedit](https://poedit.net/) that provide a " +"graphic use interface." +msgstr "" + +#: ../../TRANSLATING.md:146 +msgid "" +"Depending on your editor of choice, you may be able to install a plugin " +"or extension that can provide syntax highlighting and other features for " +"working with `.po` files. Like for example, the " +"[gettext](https://marketplace.visualstudio.com/items?itemName=mrorz" +".language-gettext) extension for Visual Studio Code." +msgstr "" + +#: ../../TRANSLATING.md:148 +msgid "" +"When you open a `.po` file, you will see a series of entries that look " +"like this:" +msgstr "" + +#: ../../TRANSLATING.md:158 +msgid "" +"The first line of an entry starts with `#:` and is a reference to the " +"original source file and line number from which the text was extracted. " +"This information is useful for finding the context of the text in the " +"guide." +msgstr "" + +#: ../../TRANSLATING.md:160 +msgid "" +"The `msgid` field contains the original English text that needs to be " +"translated. The `msgstr` field is where you will enter the translated " +"text. This field might contain text if someone else already translated " +"the entry." +msgstr "" + +#: ../../TRANSLATING.md:170 +msgid "" +"Sometimes the original English text may be too long for a single line, " +"and it may be split into multiple lines. In this case, you can keep the " +"same structure in the translated text. Notice that both the `msgid` and " +"`msgstr` fields in the example below start with an empty string, " +"indicating that the text continues in the next line." +msgstr "" + +#: ../../TRANSLATING.md:186 +msgid "" +"The English text will sometimes contain Markdown formatting, such as bold" +" or italic text. You should keep the formatting in the translated text, " +"making sure to translate the text inside the formatting tags." +msgstr "" + +#: ../../TRANSLATING.md:188 +msgid "" +"The English text may also contain links to other sections of the guide or" +" external resources. You should keep the links in the translated text, " +"making sure to update the link text when appropriate." +msgstr "" + +#: ../../TRANSLATING.md:196 +msgid "" +"An entry may be marked as `fuzzy`, which means that the original English " +"text has changed since the translation was made, and the translation may " +"need to be revised. When this is the case you will see an additional line" +" in the entry, starting with `#,`:" +msgstr "" + +#: ../../TRANSLATING.md:213 +msgid "" +"You can review the translation and make any necessary changes, removing " +"the `fuzzy` tag once you are satisfied with the translation." +msgstr "" + +#: ../../TRANSLATING.md:215 +msgid "" +"You can also add comments to the translation file, by adding lines that " +"start with a `#` character to the entry. This can be helpful to add " +"context to the translation for other translators or reviewers to see, but" +" this might be only necessary in special circumstances." +msgstr "" + +#: ../../TRANSLATING.md:218 +msgid "" +"When working on a translation, you **should not** modify the original " +"English text in the `msgid` field. If you see a typo or an error in the " +"original text, please consider fixing it in the original source file (use" +" the first line of the entry to locate it) and submit a separate pull " +"request." +msgstr "" + +#: ../../TRANSLATING.md:221 +msgid "Building the Translated Documentation" +msgstr "" + +#: ../../TRANSLATING.md:223 +msgid "" +"Once you finished translating or when you want to check the translation " +"in context, you can build the guide locally on your computer, using the " +"following command:" +msgstr "" + +#: ../../TRANSLATING.md:229 +msgid "" +"This command will build all the translated versions of the guide defined " +"in the `LANGUAGES` list in `noxfile.py`. These translations will be " +"stored in the `_build/html`, in folders named after the language code " +"(e.g., `es`, `fr`, etc.)." +msgstr "" + +#: ../../TRANSLATING.md:231 +msgid "" +"To view the translated version of the guide in your browser, open the " +"corresponding `index.html` file. For example, to view the Spanish " +"translation, you would open `_build/html/es/index.html`." +msgstr "" + +#: ../../TRANSLATING.md:233 +msgid "" +"You can also build a live version of the guide that updates automatically" +" as you make changes to the translation files. To do this, use the `nox " +"-s docs-live-lang` command. Note that in this case you need to specify " +"which language you want to build. For example, if you are working on the " +"Spanish translation, you would run:" +msgstr "" + +#: ../../TRANSLATING.md:239 +msgid "" +"Note the `--` before the language code, it indicates that the following " +"arguments should be passed into the nox session and not be interpreted " +"directly by nox. If you forget the `--`, nox will look instead for a " +"session named 'es' and complain that it does not exist." +msgstr "" + +#: ../../TRANSLATING.md:241 +msgid "" +"This command will use `sphinx-autobuild` to launch a local web server " +"where you can access the translated version of the guide. You can open " +"the guide in your browser by navigating to `http://localhost:8000`." +msgstr "" + +#: ../../TRANSLATING.md:243 +msgid "" +"This is a great way to see how the translated version of the guide looks " +"as you make changes to the translation files." +msgstr "" + +#: ../../TRANSLATING.md:245 +msgid "Submitting a PR for Your Contribution" +msgstr "" + +#: ../../TRANSLATING.md:247 +msgid "" +"Once you are finished translating and before you submit a pull request " +"(PR) for your translation, you need to make sure that the translated " +"version of the guide builds without any errors or warning and looks " +"correctly in the browser." +msgstr "" + +#: ../../TRANSLATING.md:249 +msgid "You can follow these steps:" +msgstr "" + +#: ../../TRANSLATING.md:251 +msgid "" +"Build the translations of the guide with same parameters that will be " +"used during the release:" +msgstr "" + +#: ../../TRANSLATING.md:257 +msgid "" +"Make sure there are no warnings or errors in the output. If there are, " +"you will need to fix them before submitting the PR." +msgstr "" + +#: ../../TRANSLATING.md:258 +msgid "" +"Make sure the translated version of the guide looks good in the browser " +"by opening the `_build/html//index.html` file, where `` is " +"the language you have been working on." +msgstr "" + +#: ../../TRANSLATING.md:260 +msgid "If everything looks good, you can submit a PR with your changes." +msgstr "" + +#: ../../TRANSLATING.md:263 +msgid "" +"When you submit a PR for a translation, you should only include changes " +"to one language. If you worked in multiple languages, please submit a " +"separate PR for each language." +msgstr "" + +#: ../../TRANSLATING.md:266 +msgid "" +"Translations PRs will be tagged with a label indicating the language to " +"make them easier to identify and review. For example, contributions to " +"the Spanish translation will be tagged with 'lang-es'." +msgstr "" + +#: ../../TRANSLATING.md:268 +msgid "TODO: This tagging could be automated with a GitHub action." +msgstr "" + +#: ../../TRANSLATING.md:270 +msgid "" +"When you submit the PR, make sure to include a short description of the " +"changes you made and any context that might be helpful for the reviewer " +"(e.g., you translated new strings, you reviewed fuzzy entries, you fixed " +"typos, etc.)" +msgstr "" + +#: ../../TRANSLATING.md:272 +msgid "The Review Process" +msgstr "" + +#: ../../TRANSLATING.md:274 +msgid "" +"The review process for a translation contribution is similar to the " +"review process for any other contribution to the guide." +msgstr "" + +#: ../../TRANSLATING.md:276 +msgid "" +"TODO: This section needs more work, depending on the review workflow we " +"decide to adopt. Other projects usually assign a coordinator/editor for " +"each language, who is responsible for reviewing and merging translation " +"contributions." +msgstr "" + +#: ../../TRANSLATING.md:278 +msgid "" +"Each language has an assigned editor who is responsible for reviewing and" +" merging translation contributions. The editor will review the changes to" +" make sure they are accurate and consistent with the style and tone of " +"the guide." +msgstr "" + +#: ../../TRANSLATING.md:280 +msgid "" +"Sometimes the editor may ask for clarification or suggest changes to " +"improve the translation. If this happens, you can make the requested " +"changes and push them to the same branch where you submitted the original" +" PR." +msgstr "" + +#: ../../TRANSLATING.md:282 +msgid "" +"When the editor is satisfied with the translation, they will merge the " +"PR. The translated version of the guide will be available on the " +"pyOpenSci website once the language is released." +msgstr "" + +#: ../../TRANSLATING.md:284 +msgid "The Release Process" +msgstr "" + +#: ../../TRANSLATING.md:286 +msgid "" +"If a language is ready to go live, the maintainers will add the language " +"code to the `RELEASE_LANGUAGES` list in the `noxfile.py` configuration " +"file." +msgstr "" + +#: ../../TRANSLATING.md:288 +msgid "" +"When the guide is built for release in CI, Sphinx will also generate the " +"translated versions of the guide for the languages in the " +"`RELEASE_LANGUAGES` list." +msgstr "" + +#: ../../TRANSLATING.md:290 +msgid "" +"Translations are released in the same way as the English version of the " +"guide, and the translated versions will be available in folders named " +"after the language code. For example, the Spanish translation will be " +"available in [https://www.pyopensci.org/python-package-" +"guide/es/](https://www.pyopensci.org/python-package-guide/es/)." +msgstr "" + +#: ../../TRANSLATING.md:292 +msgid "Frequently Asked Questions (FAQ)" +msgstr "" + +#: ../../TRANSLATING.md:294 +msgid "How do I know which strings need to be translated?" +msgstr "" + +#: ../../TRANSLATING.md:296 +msgid "" +"When you run the `sphinx-intl stat` command, you will see a list of `.po`" +" files with the number of translated, fuzzy, and untranslated strings. " +"You can start by working on the files with the most untranslated strings." +msgstr "" + +#: ../../TRANSLATING.md:298 +msgid "What happens when a string has changed in the original English text?" +msgstr "" + +#: ../../TRANSLATING.md:300 +msgid "" +"If a string has changed in the original English version, it will be " +"marked as `fuzzy` in the translation file the next time it is updated " +"(`nox -s update-translations`). Contributors working on the translation " +"can then review the fuzzy entries and make the necessary changes to " +"ensure it is accurate, before removing the `fuzzy` tag." +msgstr "" + +#: ../../TRANSLATING.md:302 +msgid "How do I handle links in the translated text?" +msgstr "" + +#: ../../TRANSLATING.md:304 +msgid "" +"You should keep the links in the translated text, but make sure to update" +" the link text if necessary. For example, if the original English text " +"contains a link to `[What is a Python package?](/tutorials/intro)`, you " +"should keep the link in the translated text but update the link text to " +"`[¿Que es un paquete de Python?](/tutorials/intro)`." +msgstr "" + +#: ../../TRANSLATING.md:306 +msgid "How do I handle formatting in the translated text?" +msgstr "" + +#: ../../TRANSLATING.md:308 +msgid "" +"You should keep the formatting in the translated text, but make sure to " +"translate the text inside the formatting tags as well. For example, if " +"the original English text is `**Test special cases:**`, you should keep " +"the bold formatting in the translated text but update the text inside the" +" formatting tags to `**Prueba casos especiales:**`." +msgstr "" + +#: ../../TRANSLATING.md:310 +msgid "How do I handle strings that are too long for a single line?" +msgstr "" + +#: ../../TRANSLATING.md:312 +msgid "" +"If the original English text is too long for a single line, it may be " +"split into multiple lines. Multiline strings in the `.po` file are " +"indicated by an empty string in the `msgid` and `msgstr` fields, followed" +" by the continuation of the text in the next line. For example:" +msgstr "" + +#: ../../TRANSLATING.md:325 +msgid "How do I translate images?" +msgstr "" + +#: ../../TRANSLATING.md:327 +msgid "" +"You should not translate images in the guide. Producing translated " +"versions of images is a complex process that requires additional tools " +"and resources, and it is not typically done unless the translated images " +"are created alongside the original images. More often, the text around " +"the image is modified to include any necessary translations." +msgstr "" + +#: ../../TRANSLATING.md:329 +msgid "" +"In some special cases, an image might be critical to the understanding of" +" the content. In those cases, the translations will be handled by the " +"maintainers and editors outside this workflow." +msgstr "" + +#: ../../TRANSLATING.md:331 +msgid "" +"I am interested in translating the guide into a language that is not " +"listed. How can I get started?" +msgstr "" + +#: ../../TRANSLATING.md:333 +msgid "" +"If you want to start a new translation of the guide into a language that " +"is not listed, you should [create an issue](https://github.com/pyOpenSci" +"/python-package-guide/issues) in the repository to let the maintainers " +"know that you intend to work on it. This will help avoid duplication of " +"effort and ensure that the maintainers are ready to review your " +"contribution when you are done." +msgstr "" + +#: ../../TRANSLATING.md:335 +msgid "How do I know when a translation is ready to be released?" +msgstr "" + +#: ../../TRANSLATING.md:337 +msgid "" +"When a translation is ready to be included in the next release of the " +"guide, the maintainers will add the language code to the " +"`RELEASE_LANGUAGES` list in the `noxfile.py` configuration file. This " +"will trigger the build of the translation during the release process, and" +" the translated version of the guide will be available on the pyOpenSci " +"website." +msgstr "" + +#: ../../TRANSLATING.md:339 +msgid "" +"TODO: There are many approaches here, some projects release a translation" +" as soon as some strings are translated, others wait until a certain " +"percentage of the content is translated." +msgstr "" + +#: ../../TRANSLATING.md:341 +msgid "How can I get help with my translation?" +msgstr "" + +#: ../../TRANSLATING.md:343 +msgid "" +"If you have any questions or need help with your translation, you can " +"create an issue in the repository if you encounter any problems or need " +"assistance." +msgstr "" + +#: ../../TRANSLATING.md:345 +msgid "" +"TODO: Maybe [Discourse](https://pyopensci.discourse.group/) could be used" +" as a way for contributors to ask for help with translations or the " +"translation workflow?" +msgstr "" + diff --git a/locales/ja/LC_MESSAGES/documentation.po b/locales/ja/LC_MESSAGES/documentation.po new file mode 100644 index 00000000..8a849f4a --- /dev/null +++ b/locales/ja/LC_MESSAGES/documentation.po @@ -0,0 +1,2546 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../documentation/hosting-tools/intro.md:1 +msgid "Tools to Build and Host your Documentation" +msgstr "" + +#: ../../documentation/hosting-tools/intro.md:3 +msgid "" +"The most common tool for building documentation in the Python ecosystem " +"currently is Sphinx. However, some maintainers are using tools like " +"[mkdocs](https://www.mkdocs.org/) for documentation. It is up to you to " +"use the platform that you prefer for your documentation!" +msgstr "" + +#: ../../documentation/hosting-tools/intro.md:8 +msgid "" +"In this section, we introduce Sphinx as a common tool to build " +"documentation. We talk about various syntax options that you can use when" +" writing Sphinx documentation including mySt and rST." +msgstr "" + +#: ../../documentation/hosting-tools/intro.md:12 +msgid "" +"We also talk about ways to publish your documentation online and Sphinx " +"tools that might help you optimize your documentation website." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:1 +msgid "Documentation syntax: markdown vs. myST vs. rst syntax to create your docs" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:3 +msgid "There are three commonly used syntaxes for creating Python documentation:" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:4 +msgid "" +"[markdown](https://www.markdownguide.org/): Markdown is an easy-to-learn " +"text syntax. It is the default syntax used in Jupyter Notebooks. There " +"are tools that you can add to a Sphinx website that allow it to render " +"markdown as html. However, using markdown to write documentation has " +"limitations. For instance if you want to add references, colored call out" +" blocks and other custom elements to your documentation, you will need to" +" use either **myST** or **rST**." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:8 +msgid "" +"[rST (ReStructured Text):](https://www.sphinx-" +"doc.org/en/master/usage/restructuredtext/basics.html). **rST** is the " +"native syntax that sphinx supports. rST was the default syntax used for " +"documentation for many years. However, in recent years myST has risen to " +"the top as a favorite for documentation given the flexibility that it " +"allows." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:9 +msgid "" +"[myST:](https://myst-parser.readthedocs.io/en/latest/intro.html) myST is " +"a combination of vanilla of `markdown` and `rST` syntax. It is a nice " +"option if you are comfortable writing markdown. `myst` is preferred by " +"many because it offers both the rich functionality of rST combined with a" +" simple-to-write markdown syntax." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:12 +msgid "" +"While you can chose to use any of the syntaxes listed above, we suggest " +"using `myST` because:" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:15 +msgid "It is a simpler syntax and thus easier to learn;" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:16 +msgid "" +"The above simplicity will make it easier for more people to contribute to" +" your documentation." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:17 +msgid "" +"Most of your core Python package text files, such as your README.md file," +" are already in `.md` format" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:18 +msgid "" +"`GitHub` and `Jupyter Notebooks` support markdown thus it's more widely " +"used in the scientific ecosystem." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:22 +msgid "" +"If you are on the fence about myST vs rst, you might find that **myST** " +"is easier for more people to contribute to." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:1 +msgid "How to publish your Python package documentation online" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:3 +msgid "" +"We suggest that you setup a hosting service for your Python package " +"documentation. Two free and commonly used ways to quickly create a " +"documentation website hosting environment are below." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:7 +msgid "" +"You can host your documentation yourself using [GitHub " +"Pages](https://pages.github.com/) or another online hosting service." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:8 +msgid "" +"You can host your documentation using [Read the " +"Docs](https://readthedocs.org/)." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:10 +msgid "What is Read the Docs ?" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:11 +msgid "" +"[Read the Docs](https://readthedocs.org/) is a documentation hosting " +"service that supports publishing your project's documentation." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:13 +msgid "" +"Read the Docs is a fully featured, free, documentation hosting service. " +"Some of its many features include:" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:16 +msgid "" +"Is free to host your documentation (but there are also paid tiers if you " +"wish to customize hosting)" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:17 +msgid "Automates building your documentation" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:18 +msgid "" +"Allows you to turn on integration with pull requests where you can view " +"documentation build progress (success vs failure)." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:19 +msgid "" +"Supports versioning of your documentation which allows users to refer to " +"older tagged versions of the docs if they are using older versions of " +"your package." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:20 +msgid "Supports downloading of documentation in PDF and other formats." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:21 +msgid "" +"You can customize the documentation build using a **.readthedocs.yaml** " +"file in your GitHub repository." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:24 +msgid "What is GitHub Pages?" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:25 +msgid "" +"[GitHub Pages](https://docs.github.com/en/pages/getting-started-with-" +"github-pages/about-github-pages) is a free web hosting service offered by" +" GitHub. Using GitHub pages, you can build your documentation locally or " +"using a Continuous Integration setup, and then push to a branch in your " +"GitHub repository that is setup to run the GitHub Pages web build." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:33 +msgid "Read the Docs vs GitHub Pages" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:35 +msgid "" +"GitHub pages is a great option for your documentation deployment. " +"However, you will need to do a bit more work to build and deploy your " +"documentation if you use GitHub pages." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:39 +msgid "" +"Read the Docs can be setup in your Read the Docs user account. The " +"service automates the entire process of building and deploying your " +"documentation." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:42 +msgid "" +"If you don't want to maintain a documentation website for your Python " +"package, we suggest using the Read the Docs website." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:1 +msgid "Using Sphinx to Build Python Package Documentation" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:17 +msgid "" +"On this page we discuss using [Sphinx](https://www.sphinx-doc.org/) to " +"build your user-facing package documentation. While Sphinx is currently " +"the most commonly-used tool in the scientific Python ecosystem, you are " +"welcome to explore other tools to build documentation such as " +"[mkdocs](https://www.mkdocs.org/) which is gaining popularity in the " +"Python packaging ecosystem." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:25 +msgid "Examples of documentation websites that we love:" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:27 +msgid "[GeoPandas](https://geopandas.org/en/stable/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:28 +msgid "" +"[View rst to create landing " +"page](https://raw.githubusercontent.com/geopandas/geopandas/main/doc/source/index.rst)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:29 +msgid "[verde](https://www.fatiando.org/verde/latest/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:30 +msgid "" +"[View verde landing page code - rst " +"file.](https://github.com/fatiando/verde/blob/main/doc/index.rst)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:31 +msgid "" +"[Here is our documentation if you want to see a myST example of a landing" +" page.](https://github.com/pyOpenSci/python-package-" +"guide/blob/main/index.md)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:34 +msgid "Sphinx - a static site generator" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:36 +msgid "" +"Sphinx is a [static-site " +"generator](https://www.cloudflare.com/learning/performance/static-site-" +"generator/). A static site generator is a tool that creates html for a " +"website based upon a set of templates. The html files are then served " +"\"Statically\" which means that there is no generation or modification of" +" the files on the fly." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:39 +msgid "Sphinx is written using Python." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:41 +msgid "Sphinx sites can be customized using extensions and themes" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:43 +msgid "" +"The functionality of Sphinx can be extended using extensions and themes. " +"A few examples include:" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:46 +msgid "" +"You can apply documentation themes for quick generation of beautiful " +"documentation." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:47 +msgid "" +"You can [automatically create documentation for your package's functions " +"and classes (the package's API) from docstrings in your code using the " +"autodoc extension](https://www.sphinx-" +"doc.org/en/master/usage/extensions/autodoc.html)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:48 +msgid "" +"You can [run and test code examples in your docstrings using the doctest " +"extension](https://www.sphinx-" +"doc.org/en/master/usage/extensions/doctest.html)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:49 +msgid "" +"While Sphinx natively supports the `rST` syntax. You can add custom " +"syntax parsers to support easier-to-write syntax using tools such as [the" +" MyST parser](https://myst-parser.readthedocs.io/)." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:51 +msgid "Commonly used Sphinx themes" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:53 +msgid "" +"You are free to use whatever Sphinx theme that you prefer. However, the " +"most common Sphinx themes used in the Python scientific community " +"include:" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:57 +msgid "[pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:58 +msgid "[sphinx-book-theme](https://sphinx-book-theme.readthedocs.io/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:59 +msgid "[furo](https://pradyunsg.me/furo/quickstart/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:63 +msgid "This book is created using Sphinx and the `furo` theme." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:1 +msgid "Optimizing your documentation so search engines (and other users) find it" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:3 +msgid "" +"If you are interested in more people finding your package, you may want " +"to add some core Sphinx extensions (and theme settings) that will help " +"search engines such as Google find your documentation." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:7 +msgid "Google Analytics" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:11 +msgid "" +"Google analytics [is not compliant with the European General Data " +"Protection Regulation (GDPR)](https://matomo.org/blog/2022/05/google-" +"analytics-4-gdpr/). While there are many components to this regulation, " +"one of the core elements is that you have to let users know on your site " +"that you are collecting data and they have to consent. While it is " +"possible to add infrastructure around Google Analytics to make it close " +"to following GDPR regulations, the community is slowly shifting away from" +" Google using open tools such as [Plausible](https://plausible.io/), " +"[Cloudflare Web Analytics](https://www.cloudflare.com/web-analytics/) and" +" [Matomo](https://matomo.org) for web analytics." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:13 +msgid "" +"pyOpenSci is currently looking into free options for open source " +"developers." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:16 +msgid "" +"Some of the [sphinx themes such as the `pydata-sphinx-theme` and sphinx-" +"book-theme have built in support for Google Analytics](https://pydata-" +"sphinx-theme.readthedocs.io/en/latest/user_guide/analytics.html#google-" +"analytics). However, if the theme that you chose does not offer Google " +"Analytics support, you can use the [`sphinxcontrib-gtagjs` " +"extension](https://github.com/attakei/sphinxcontrib-gtagjs). This " +"extension will add a Google Analytics site tag to each page of your " +"documentation." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:22 +msgid "" +"[sphinx-sitemap](https://sphinx-" +"sitemap.readthedocs.io/en/latest/index.html) for search engine " +"optimization" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:24 +msgid "" +"While we are trying to move away from Google Analytics do to compliance " +"and privacy issues, search engine optimization is still important. Google" +" is the most popular search engine. And if your documentation is search " +"optimized, users are more likely to find your package!" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:30 +msgid "" +"If you are interested in optimizing your documentation for search engines" +" such as Google, you want a **sitemap.xml** file. You can submit this " +"sitemap to Google and it will index your entire site. This over time can " +"make the content on your site more visible to others when they search." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:36 +msgid "This extension is lightweight." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:38 +msgid "" +"It [requires that you to add it to your Sphinx `conf.py` extension list " +"and site your documentation base url](https://sphinx-" +"sitemap.readthedocs.io/en/latest/getting-started.html)." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:40 +msgid "[sphinxext.opengraph](https://github.com/wpilibsuite/sphinxext-opengraph)" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:42 +msgid "" +"OpenGraph is an extension that allows you to add metadata to your " +"documentation content pages. [The OpenGraph protocol allows other " +"websites to provide a useful preview of the content on your page when " +"shared](https://www.freecodecamp.org/news/what-is-open-graph-and-how-" +"can-i-use-it-for-my-website/#what-is-open-graph). This is important for " +"when the pages in your documentation are shared on social media sites " +"like Twitter and Mastodon and even for shares on tools like Slack and " +"Discourse." +msgstr "" + +#: ../../documentation/index.md:3 +msgid "Documentation Overview" +msgstr "" + +#: ../../documentation/index.md:3 ../../documentation/index.md:10 +#: ../../documentation/index.md:21 ../../documentation/index.md:42 +msgid "Intro" +msgstr "" + +#: ../../documentation/index.md:10 +msgid "Create Your Docs" +msgstr "" + +#: ../../documentation/index.md:10 +msgid "Document Your Code (API)" +msgstr "" + +#: ../../documentation/index.md:10 +msgid "Create Package Tutorials" +msgstr "" + +#: ../../documentation/index.md:10 +msgid "Write User Documentation" +msgstr "" + +#: ../../documentation/index.md:21 +msgid "Contributing File" +msgstr "" + +#: ../../documentation/index.md:21 +msgid "Development Guide" +msgstr "" + +#: ../../documentation/index.md:21 +msgid "Changelog File" +msgstr "" + +#: ../../documentation/index.md:21 +msgid "Docs for Contributors & Maintainers" +msgstr "" + +#: ../../documentation/index.md:32 +msgid "README file" +msgstr "" + +#: ../../documentation/index.md:32 +msgid "Code of Conduct File" +msgstr "" + +#: ../../documentation/index.md:32 +msgid "LICENSE files" +msgstr "" + +#: ../../documentation/index.md:32 +msgid "Community Docs" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "Sphinx for Docs" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "myST vs Markdown vs rst" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "Publish Your Docs" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "Website Hosting and Optimization" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "Publication tools for your docs" +msgstr "" + +#: ../../documentation/index.md:1 +msgid "Documentation for your Open Source Python Package" +msgstr "" + +#: ../../documentation/index.md:55 +msgid "" +"Please note that the tools discussed here are those that we see commonly " +"used in the community. As tools evolve we will update this guide. If you " +"are submitting a package for pyOpenSci peer review and use other tools " +"that are not listed in our guide to build your package you can still " +"submit for review! The tools listed here are suggestions, not " +"requirements. Our requirements are focused on the documentation content " +"of your package." +msgstr "" + +#: ../../documentation/index.md:65 +msgid "Documentation is critical for your Python package's success" +msgstr "" + +#: ../../documentation/index.md:67 +msgid "" +"Documentation is as important to the success of your Python open source " +"package as the code itself." +msgstr "" + +#: ../../documentation/index.md:70 +msgid "" +"Quality code is of course valuable as its how your package gets the tasks" +" done. However, if users don't understand how to use your package in " +"their workflows, then they won't use it." +msgstr "" + +#: ../../documentation/index.md:73 +msgid "" +"Further, explicitly documenting how to contribute is important if you " +"wish to build a base of contributors to your package." +msgstr "" + +#: ../../documentation/index.md:76 +msgid "Two types of Python package users" +msgstr "" + +#: ../../documentation/index.md:78 +msgid "" +"The documentation that you write for your package should target two types" +" of users:" +msgstr "" + +#: ../../documentation/index.md:81 +msgid "1. Basic Tool Users" +msgstr "" + +#: ../../documentation/index.md:83 +msgid "" +"Basic tool users are the people who will use your package code in their " +"Python workflows. They might be new(er) to Python and/or data science. Or" +" expert programmers. But they might not have a background in software " +"development. These users need to know:" +msgstr "" + +#: ../../documentation/index.md:88 +msgid "How to install your package" +msgstr "" + +#: ../../documentation/index.md:89 +msgid "How to install dependencies that your package requires" +msgstr "" + +#: ../../documentation/index.md:90 +msgid "How to get started using the code base" +msgstr "" + +#: ../../documentation/index.md:91 +msgid "" +"Information on how to cite your code / give you credit if they are using " +"it in a research application." +msgstr "" + +#: ../../documentation/index.md:93 +msgid "" +"Information on the license that your code uses so they know how they can " +"or can't use the code in an operational setting." +msgstr "" + +#: ../../documentation/index.md:96 +msgid "2. Potential tool contributors" +msgstr "" + +#: ../../documentation/index.md:98 +msgid "" +"The other subset of users are more experienced and/or more engaged with " +"your package. As such they are potential contributors. These users:" +msgstr "" + +#: ../../documentation/index.md:102 +msgid "might have a software development background," +msgstr "" + +#: ../../documentation/index.md:103 +msgid "" +"might also be able to contribute bug fixes to your package or updates to " +"your documentation" +msgstr "" + +#: ../../documentation/index.md:104 +msgid "" +"might also just be users who will find spelling errors in your " +"documentation, or bugs in your tutorials." +msgstr "" + +#: ../../documentation/index.md:106 +msgid "" +"These users need all of the things that a basic user needs. But, they " +"also need to understand how you'd like for them to contribute to your " +"package. These potential contributors need:" +msgstr "" + +#: ../../documentation/index.md:110 +msgid "" +"A development guide to help them understand the infrastructure used in " +"your package repository." +msgstr "" + +#: ../../documentation/index.md:111 +msgid "" +"Contributing guidelines that clarify the types of contributions that you " +"welcome and how you'd prefer those contributions to be submitted." +msgstr "" + +#: ../../documentation/index.md:114 +msgid "" +"It's important to remember that the definition of what a contribution is " +"can be broad. A contribution could be something as simple as a bug " +"report. Or fixing a spelling issue in your documentation. Or it could be " +"a code fix that includes a new test that covers an edge-case that they " +"discovered." +msgstr "" + +#: ../../documentation/index.md:120 +msgid "Documentation elements that pyOpenSci looks for reviewing a Python package" +msgstr "" + +#: ../../documentation/index.md:122 +msgid "" +"In the pyOpenSci open peer review, we look for a documentation structure " +"that supports both your tool users and potential contributors. The files " +"and elements that we look for specifically can be found in our peer " +"review check list (see link below)." +msgstr "" + +#: ../../documentation/index.md:127 +msgid "" +"In this guide, we discuss each required element, and also discuss other " +"elements that you should consider in your package's documentation in more" +" detail." +msgstr "" + +#: ../../documentation/index.md:131 +msgid "View pyOpenSci peer review check list" +msgstr "" + +#: ../../documentation/index.md:138 +msgid "" +"Image showing the files in the the MovingPandas GitHub repository. Files " +"in the image include code of conduct.md contributing.md license.txt and " +"readme.md." +msgstr "" + +#: ../../documentation/index.md:144 +msgid "" +"An example from the MovingPandas GitHub repository with all of the major " +"files in it including CONTRIBUTING.md, README.md, CODE_OF_CONDUCT.md and " +"a LICENSE.txt file. *(screen shot taken Nov 23 2022)*" +msgstr "" + +#: ../../documentation/index.md:147 +msgid "What's next in this Python package documentation section?" +msgstr "" + +#: ../../documentation/index.md:149 +msgid "" +"In this section of the pyOpenSci package guide, we will walk you through " +"best practices for setting up documentation for your Python package. We " +"will also suggest tools that you can use to build your user-facing " +"documentation website." +msgstr "" + +#: ../../documentation/index.md:154 +msgid "Todo" +msgstr "" + +#: ../../documentation/index.md:156 +msgid "" +"Python version support You should always be explicit about which versions" +" of Python your package supports. Keeping compatibility with old Python " +"versions can be difficult as functionality changes. A good rule of thumb " +"is that the package should support, at least, the latest three Python " +"versions (e.g., 3.8, 3.7, 3.6)." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:1 +msgid "CHANGELOG.md Guide" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:3 +msgid "Introduction" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:5 +msgid "" +"The `CHANGELOG.md` document serves as a valuable resource for developers " +"and users alike to track the evolution of a project over time. " +"Understanding the structure and purpose of a changelog helps users and " +"contributors stay informed about new features, bug fixes, and other " +"changes introduced in each release." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:7 +msgid "What is CHANGELOG.md?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:9 +msgid "" +"The primary purpose of `CHANGELOG.md` is to provide a record of notable " +"changes made to the project with each new release. This document helps " +"users understand what has been added, fixed, modified, or removed with " +"each version of the software." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:11 +msgid "" +"[Keep a CHAGELOG.md](https://keepachangelog.com/en/1.1.0/) is a great, " +"simple resource for understanding what a changelog is and how to create a" +" good changelog. It also includes examples of things to avoid." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:13 +msgid "Versioning your Python package and semantic versioning" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:16 +msgid "" +"An important component of a package that serves as the backbone behind " +"the changelog file is a good versioning scheme. Semantic Versioning is " +"widely used across Python packages." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:17 +msgid "" +"[Creating New Versions of Your Python Package](../../package-structure-" +"code/python-package-versions.md)" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:18 +msgid "[Semantic Versioning](https://semver.org)" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:21 +msgid "Why is it important?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:23 +msgid "" +"A well-maintained changelog is essential for transparent communication " +"with users and developers. It serves as a centralized hub for documenting" +" changes and highlights the progress made in each release. By keeping the" +" changelog up-to-date, project maintainers can build trust with their " +"user base and demonstrate their commitment to improving the software." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:25 +msgid "What does it include?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:27 +msgid "" +"The contents of a changelog.md file typically follow a structured format," +" detailing the changes introduced in each release. While the exact format" +" may vary depending on the project's conventions, some common elements " +"found in changelogs for Python packages include:" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:29 +msgid "" +"**Versioning**: Clear identification of each release version using " +"semantic versioning or another versioning scheme adopted by the project." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:31 +msgid "" +"**Release Date**: The date when each version was released to the public, " +"providing context for the timeline of changes." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:33 +msgid "" +"**Change Categories**: Organizing changes into categories such as " +"\"Added,\" \"Changed,\" \"Fixed,\" and \"Removed\" to facilitate " +"navigation and understanding." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:35 +msgid "" +"**Description of Changes**: A concise description of the changes made in " +"each category, including new features, enhancements, bug fixes, and " +"deprecated functionality." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:37 +msgid "" +"**Links to Issues or Pull Requests**: References to relevant issue " +"tracker items or pull requests associated with each change, enabling " +"users to access more detailed information if needed." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:39 +msgid "" +"**Upgrade Instructions**: Guidance for users on how to upgrade to the " +"latest version, including any breaking changes or migration steps they " +"need to be aware of." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:41 +msgid "" +"**Contributor Recognition**: Acknowledgment of contributors who made " +"significant contributions to the release, fostering a sense of community " +"and appreciation for their efforts." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:43 +msgid "How do maintainers use it?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:45 +msgid "Often you will see a changelog that documents a few things:" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:47 +msgid "Unreleased Section" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:49 +msgid "" +"Unreleased commits are at the top of the changelog, commonly in an " +"`Unreleased` section. This is where you can add new fixes, updates and " +"features that have been added to the package since the last release." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:51 +msgid "This section might look something like this:" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:59 +msgid "Release Sections" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:61 +msgid "" +"When you are ready to make a new release, you can move the elements into " +"a section that is specific to that new release number." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:63 +msgid "" +"This specific release section will sit below the unreleased section and " +"can include any updates, additions, deprecations and contributors." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:65 +msgid "" +"The unreleased section then always lives at the top of the file and new " +"features continue to be added there. At the same time, after releasing a " +"version like v1.0 all of its features remain in that specific section." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:83 +msgid "What does it look like?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:85 +msgid "" +"This example comes from [Devicely](https://github.com/hpi-" +"dhc/devicely/blob/main/CHANGELOG.md), a pyOpenSci accepted package." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:1 +msgid "The CODE_OF_CONDUCT file - Python Packaging" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:3 +msgid "Example CODE_OF_CONDUCT files" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:6 +msgid "" +"[SciPy Code of Conduct file - notice they included theirs in their " +"documentation](https://docs.scipy.org/doc/scipy/dev/conduct/code_of_conduct.html)" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:7 +msgid "" +"[fatiando CODE_OF_CONDUCT.md " +"file](https://github.com/fatiando/community/blob/main/CODE_OF_CONDUCT.md)" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:10 +msgid "" +"Your package should have a `CODE_OF_CONDUCT.md` file located the root of " +"the repository. Once you have people using your package, you can consider" +" the package itself as having a community around it. Some of this " +"community uses your tool. These users may have questions or encounter " +"challenges using your package." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:16 +msgid "" +"Others in the community might want to contribute to your tool. They might" +" fix bugs, update documentation and engage with the maintainer team." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:20 +msgid "Why you need a CODE_OF_CONDUCT" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:22 +msgid "" +"In order to keep this community healthy and to protect yourself, your " +"maintainer team and your users from unhealthy behavior, it is important " +"to have a [`CODE_OF_CONDUCT`](https://opensource.guide/code-of-conduct/)." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:26 +msgid "" +"The `CODE_OF_CONDUCT` is important as it establishes what you expect in " +"terms of how users and contributors interact with maintainers and each " +"other. It also establishes rules and expectations which can then be " +"enforced if need be to protect others from harmful and/or negative " +"behaviors." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:32 +msgid "" +"If you are not comfortable with creating your own `CODE_OF_CONDUCT` text," +" we encourage you to adopt the `CODE_OF_CONDUCT` language used in the " +"[Contributor Covenant](https://www.contributor-" +"covenant.org/version/2/1/code_of_conduct/). [Many other " +"communities](https://www.contributor-covenant.org/adopters/) have adopted" +" this `CODE_OF_CONDUCT` as their own. See the [Fatiando a Terra " +"Geoscience Python community's example " +"here.](https://github.com/fatiando/community/blob/main/CODE_OF_CONDUCT.md)" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:1 +msgid "Contributing File in your Python Open Source Package" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:3 +msgid "What a CONTRIBUTING.md file should contain" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:5 +msgid "Example contributing files" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:8 +msgid "" +"[pyGMT contributing " +"file](https://github.com/GenericMappingTools/pygmt/blob/main/CONTRIBUTING.md)" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:9 +msgid "" +"[fatiando verde's contributing " +"file](https://github.com/fatiando/verde/blob/main/CONTRIBUTING.md)" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:12 +msgid "" +"Your Python open source package should include a file called " +"**CONTRIBUTING.md** located in the root of your repository (with your " +"**README.md** file)." +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:15 +msgid "" +"The contributing file should include information about the types of " +"contributions that you welcome, and how you'd like to see contributions " +"happen." +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:19 +msgid "" +"This guide should also include information for someone interested in " +"asking questions, submitting issues or pull requests. It should have " +"things like:" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:22 +msgid "" +"Any guidelines that you have in place for users submitting issues, pull " +"requests or asking questions." +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:23 +msgid "A link to your code of conduct" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:24 +msgid "A link to licensing information found in your README file." +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:25 +msgid "A link to a development guide if you have one" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:1 +msgid "What the development guide for your Python package should contain" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:3 +msgid "" +"Ideally, your package should also have a development guide. This file may" +" live in your package documentation and should be linked to from your " +"CONTRIBUTING.md file (discussed above). A development guide should " +"clearly show technically proficient users how to:" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:7 +msgid "Set up a development environment locally to work on your package" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:8 +msgid "Run the test suite" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:9 +msgid "Build documentation locally" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:11 +msgid "The development guide should also have guidelines for:" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:12 +msgid "" +"code standards including docstring style, code format and any specific " +"code approaches that the package follows." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:14 +msgid "" +"It's also helpful to specify the types of tests you request if a " +"contributor submits a new feature or a change to an existing feature that" +" will not be covered by your existing test suite." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:16 +msgid "" +"If you have time to document it, it's also helpful to document your " +"maintainer workflow and release processes." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:18 +msgid "Why a development guide is important" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:20 +msgid "It's valuable to have a development guide, in the case that you wish to:" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:23 +msgid "Onboard new maintainers." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:24 +msgid "" +"Allow technically inclined contributors to make thoughtful and useful " +"code based pull requests to your repository." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:26 +msgid "" +"It also is important to pyOpenSci that the maintenance workflow is " +"documented in the case that we need to help you onboard new maintainers " +"in the future." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:31 +msgid "" +"A well thought out continuous integration setup in your repository can " +"allow users to skip building the package locally (especially if they are " +"just updating text)." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:36 +msgid "" +"A development guide, while strongly recommended, is not a file that " +"pyOpenSci requires a package to have in order to be eligible for review. " +"Some maintainers may also opt to include the development information in " +"their contributing guide." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:43 +msgid "" +"[The Mozilla Science Lab website has a nice outline of things to consider" +" when creating a contributing guide](https://mozillascience.github.io" +"/working-open-workshop/contributing/)" +msgstr "" + +#: ../../documentation/repository-files/intro.md:1 +msgid "Documentation Files That Should be in your Python Package Repository" +msgstr "" + +#: ../../documentation/repository-files/intro.md:3 +msgid "" +"In this section of the Python packaging guide, we review all of the files" +" that you should have in your Python package repository. Your Python " +"package should, at a minimum have the following files:" +msgstr "" + +#: ../../documentation/repository-files/intro.md:7 +msgid "" +"The files mentions above (README, Code of Conduct, license file, etc) are" +" used as a measure of package community health on many online platforms. " +"Below, you can see an example how Github evaluates community health. This" +" community health link is available for all GitHub repositories." +msgstr "" + +#: ../../documentation/repository-files/intro.md:13 +msgid "" +"Image showing that the MovingPandas GitHub repository community health " +"page with green checks next to each file including a description, README," +" code of conduct, contributing, license and issue templates. Note that " +"Security policy has a yellow circle next to it as that is missing from " +"the repo." +msgstr "" + +#: ../../documentation/repository-files/intro.md:19 +msgid "" +"GitHub community health looks for a readme file among other elements when" +" it evaluates the community level health of your repository. This example" +" is from the [MovingPandas GitHub " +"repo](https://github.com/anitagraser/movingpandas/community) *(screen " +"shot taken Nov 23 2022)*" +msgstr "" + +#: ../../documentation/repository-files/intro.md:22 +msgid "" +"[Snyk](https://snyk.io/advisor/python) is another well-known company that" +" keeps tabs on package health. Below you can see a similar evaluation of " +"files in the Github repo as a measure of community health." +msgstr "" + +#: ../../documentation/repository-files/intro.md:26 +msgid "" +"Screenshot of the Snyk page for movingpandas. It shows that the " +"repository has a README file, contributing file, code of conduct. It also" +" shows that it has 30 contributors and no funding. The package health " +"score is 78/100." +msgstr "" + +#: ../../documentation/repository-files/intro.md:32 +msgid "" +"Screenshot showing [SNYK](https://snyk.io/advisor/python/movingpandas) " +"package health for moving pandas. Notice both platforms look for a README" +" file. *(screen shot taken Nov 23 2022)*" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:1 +msgid "License files for scientific Python open source software" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:3 +msgid "" +"Want to learn how to add a license file to your GitHub repository? Check " +"out this lesson." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:10 +msgid "What is a Open Source License file?" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:12 +msgid "" +"When we talk about LICENSE files, we are referring to a file in your " +"GitHub or GitLab repository that contains legally binding language that " +"describes to your users how they can legally use (and not use) your " +"package." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:16 +msgid "Why licenses are important" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:18 +msgid "" +"A license file is important for all open source projects because it " +"protects both you as a maintainer and your users. The license file helps " +"your users and the community understand:" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:20 +msgid "How they can use your software" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:21 +msgid "Whether the software can be reused or adapted for other purposes" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:22 +msgid "How people can contribute to your project" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:24 +msgid "and more." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:26 +msgid "" +"[Read more about why license files are critical in protecting both you as" +" a maintainer and your users of your scientific Python open source " +"package.](https://opensource.guide/legal/#just-give-me-the-tldr-on-what-i" +"-need-to-protect-my-project)" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:29 +msgid "Where to store your license" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:31 +msgid "" +"Your `LICENSE` file should be stored at root of your GitHub / GitLab " +"repository." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:33 +msgid "" +"Some maintainers customize the language in their license files for " +"specific reasons. However, if you are just getting started, we suggest " +"that you select a permissive license and then use the legal language " +"templates provided both by GitHub and/or the " +"[choosealicense.com](https://choosealicense.com/) website." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:36 +msgid "" +"Licenses are legally binding, as such you should avoid trying to create " +"your own license unless you have the guidance of legal council." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:38 +msgid "Use open permissive licenses when possible" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:40 +msgid "" +"We generally suggest that you use a permissive, license that is [Open " +"Software Initiative (OSI) approved](https://opensource.org/licenses/). If" +" you are [submitting your package to pyOpenSci for peer " +"review](https://www.pyopensci.org/about-peer-review/index.html), then we " +"require an OSI approved license." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:44 +msgid "How to choose a license" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:46 +msgid "" +"To select your license, we suggest that you use GitHub's [Choose a " +"License tool ](https://choosealicense.com/)." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:49 +msgid "" +"If you choose your license when creating a new GitHub repository, you can" +" also automatically get a text copy of the license file to add to your " +"repository. However in some cases the license that you want is not " +"available through that online process." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:54 +msgid "License recommendations from the SciPy package" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:55 +msgid "" +"[The SciPy documentation has an excellent overview of " +"licenses.](https://docs.scipy.org/doc/scipy/dev/core-" +"dev/index.html#licensing). Once of the key elements that these docs " +"recommend is ensuring that the license that you select is complementary " +"to license used in the core scientific Python ecosystem. Below is a " +"highlight of this text which outlines license that are compatible with " +"the modified BSD license that SciPy uses." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:61 +msgid "" +"Other licenses that are compatible with the modified BSD license that " +"SciPy uses are 2-clause BSD, MIT and PSF. Incompatible licenses are GPL, " +"Apache and custom licenses that require attribution/citation or prohibit " +"use for commercial purposes." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:63 +msgid "" +"To coordinate with other packages in our scientific ecosystem, we also " +"recommend that you consider using either BSD or MIT as your license. If " +"you are unsure, the MIT license tends to be a simpler easier-to-" +"understand option." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:69 +msgid "" +"Important: make sure that you closely follow the guidelines outlines by " +"the License that you chose" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:71 +msgid "" +"Every license has different guidelines in terms of what code you can use " +"in your package and also how others can (or can not) use the code in your" +" package." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:74 +msgid "" +"If you borrow code from other tools or online sources, make sure that the" +" license for the code that you are using also complies with the license " +"that you selected for your package." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:78 +msgid "An example of how a license determine how code can be reused" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:81 +msgid "" +"Let's use StackOverflow as an example that highlights how a license " +"determines how code can or can not be used." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:83 +msgid "" +"[Stack overflow uses a Creative Commons Share Alike " +"license.](https://stackoverflow.com/help/licensing). The sharealike " +"license requires you to use the same sharealike license when you reuse " +"any code from StackOverflow." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:85 +msgid "" +"This means that technically, if you copy code from the Stack Overflow " +"website, and use it in your package. And your packages uses a different " +"license such as a MIT license, you are violating Stack Overflow's license" +" requirements!" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:87 +msgid "🚨 Proceed with caution! 🚨" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:91 +msgid "What about software citation?" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:93 +msgid "" +"While many permissive licenses do not require citation we STRONG " +"encourage that you cite all software that you use in papers, blogs and " +"other publications. You tell your users how to cite your package by using" +" a [citation.cff file](https://docs.github.com/en/repositories/managing-" +"your-repositorys-settings-and-features/customizing-your-repository/about-" +"citation-files). We will cover this topic when we talk about creating " +"DOI's for your package using zenodo." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:1 +msgid "README File Guidelines and Resources" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:3 +msgid "" +"Your **README.md** file should be located in the root of your GitHub " +"repository. The **README.md** file is important as it is often the first " +"thing that someone sees before they install your package." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:7 +msgid "The README.md file is the landing page of:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:9 +msgid "" +"Your package as it appears on a repository site such as PyPI or " +"Anaconda.org" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:10 +msgid "Your package's GitHub repository" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:12 +msgid "" +"Your README.md file is also used as a measure of package and community " +"health on sites such as:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:14 +msgid "" +"[GitHub community health for MovingPandas (available for all " +"repositories)](https://github.com/anitagraser/movingpandas/community) and" +" [Snyk - moving pandas " +"example](https://snyk.io/advisor/python/movingpandas)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:17 +msgid "" +"README landing page screenshot for the Pandera package. It has the " +"Pandera logo at the top - which has two arrows in a chevron pattern " +"pointing downward within a circle. Subtitle is statistical data testing " +"toolkit. A data validation library for scientists, engineering, and " +"analytics seeking correctness. Below that are a series of badges " +"including CI tests passing, docs passing, version of Pandera on pypi " +"(0.13.4), MIT license and that it has been pyOpenSci peer reviewed. There" +" are numerous badges below that. Finally below the badges the text says, " +"Pandera provides a flexible and expressive API for performing data " +"validation on dataframe-like objects to make data processing pipelines " +"more readable and robust." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:23 +msgid "" +"Your GitHub repository landing page highlights the README.md file. Here " +"you can see the README.md file for the pyOpenSci package " +"[Pandera](https://github.com/unionai-oss/pandera). *(screen shot taken " +"Nov 23 2022)*" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:26 +msgid "" +"Thus, it is important that you spend some time up front creating a high " +"quality **README.md** file for your Python package." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:30 +msgid "" +"An editor or the editor in chief will ask you to revise your README file " +"before a review begins if it does not meet the criteria specified below." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:33 +msgid "Please go through this list before submitting your package to pyOpenSci" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:50 +msgid "What your README.md file should contain" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:52 +msgid "" +"Your **README.md** file should contain the following things (listed from " +"top to bottom):" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:54 +msgid "✔️ Your package's name" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:55 +msgid "" +"Ideally your GitHub repository's name is also the name of your package. " +"The more self explanatory that name is, the better." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:58 +msgid "" +"✔️ Badges for current package version, continuous integration and test " +"coverage" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:60 +msgid "" +"Badges are a useful way to draw attention to the quality of your project." +" Badges assure users that your package is well-designed, tested, and " +"maintained. They are also a useful maintenance tool to evaluate if things" +" are building properly. A great example of this is adding a [Read the " +"Docs status badge](https://docs.readthedocs.io/en/stable/badges.html) to " +"your README.md file to quickly see when the build on that site fails." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:66 +msgid "" +"It is common to provide a collection of badges towards the top of your " +"README file for others to quickly browse." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:69 +msgid "Some badges that you might consider adding to your README file include:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:71 +msgid "Current version of the package on PyPI / Anaconda.org" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:73 +msgid "" +"Example: [![PyPI version " +"shields.io](https://img.shields.io/pypi/v/pandera.svg)](https://pypi.org/project/pandera/)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:73 +msgid "PyPI version shields.io" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:75 +msgid "" +"Status of tests (pass or fail) - Example: [![CI Build](https://github.com" +"/pandera-" +"dev/pandera/workflows/CI%20Tests/badge.svg?branch=main)](https://github.com" +"/pandera-" +"dev/pandera/actions?query=workflow%3A%22CI+Tests%22+branch%3Amain)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:75 +msgid "CI Build" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:77 +msgid "" +"Documentation build - Example: ![Docs " +"Building](https://github.com/pyOpenSci/python-package-" +"guide/actions/workflows/build-book.yml/badge.svg)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:77 +msgid "Docs Building" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:79 +msgid "" +"DOI (for citation) Example: " +"[![DOI](https://zenodo.org/badge/556814582.svg)](https://zenodo.org/badge/latestdoi/556814582)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:79 +msgid "DOI" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:82 +msgid "" +"Once you package is accepted to pyOpenSci, we will provide you with a " +"badge to add to your repository that shows that it has been reviewed. " +"[![pyOpenSci](https://pyopensci.org/badges/peer-" +"reviewed.svg)](https://github.com/pyOpenSci/software-review/issues/12)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:82 +msgid "pyOpenSci" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:90 +msgid "" +"Beware of the overuse of badges! There is such a thing as too much of a " +"good thing (which can overload a potential user!)." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:93 +msgid "✔️ A short, easy-to-understand description of what your package does" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:95 +msgid "" +"At the top of your README file you should have a short, easy-to-" +"understand, 1-3 sentence description of what your package does. This " +"section should clearly state your goals for the package. The language in " +"this description should use less technical terms so that a variety of " +"users with varying scientific (and development) backgrounds can " +"understand it." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:101 +msgid "" +"In this description, it's useful to let users know how your package fits " +"within the broader scientific Python package ecosystem. If there are " +"other similar packages or complementary package mentions them here in 1-2" +" sentences." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:106 +msgid "" +"Consider writing for a high school level (or equivalent) level. This " +"level of writing is often considered an appropriate level for scientific " +"content that serves a variety of users with varying backgrounds." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:110 +msgid "" +"The goal of this description is to maximize accessibility of your " +"**README** file." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:114 +msgid "✔️ Installation instructions" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:116 +msgid "" +"Include instructions for installing your package. If you have published " +"the package on both PyPI and Anaconda.org, be sure to include " +"instructions for both." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:119 +msgid "✔️ Document any additional setup required" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:121 +msgid "" +"Add any additional setup required such as authentication tokens, to get " +"started using your package. If setup is complex, consider linking to an " +"installation page in your online documentation here rather than over " +"complicating your README file." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:126 +msgid "✔️ Brief demonstration of how to use the package" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:128 +msgid "" +"This description ideally includes a brief, quick start code example that " +"shows a user how to get started using your package." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:131 +msgid "✔️ Descriptive links to package documentation, short tutorials" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:133 +msgid "Include descriptive links to:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:135 +msgid "The package's documentation page." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:136 +msgid "Short tutorials that demonstrate application of your package." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:138 +msgid "Too Much Of A Good Thing" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:141 +msgid "" +"Try to avoid including several tutorials in the README.md file itself. " +"This too will overwhelm the user with information." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:143 +msgid "" +"A short quick-start code example that shows someone how to use your " +"package is plenty of content for the README file. All other tutorials and" +" documentation should be presented as descriptive links." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:149 +msgid "✔️ A Community Section with Links to Contributing Guide, Code of Conduct" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:151 +msgid "Use your README.md file to direct users to more information on:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:153 +msgid "Contributing to your package" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:154 +msgid "Development setup for more advanced technical contributors" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:155 +msgid "Your code of conduct" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:156 +msgid "Licensing information" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:158 +msgid "" +"All of the above files are important for building community around your " +"project." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:161 +msgid "✔️ Citation information" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:163 +msgid "" +"Finally be sure to include instructions on how to cite your package. " +"Citation should include the DOI that you want used when citing your " +"package, and any language that you'd like to see associated with the " +"citation." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:167 +msgid "README Resources" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:171 +msgid "" +"Below are some resources on creating great README.md files that you might" +" find helpful." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:174 +msgid "" +"[How to Write a Great README - Bane " +"Sullivan](https://github.com/banesullivan/README)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:175 +msgid "" +"[Art of README - Kira (@hackergrrl)](https://github.com/hackergrrl/art-" +"of-readme)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:1 +msgid "Create tutorials in your Python package documentation" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:6 +msgid "" +"Your package should have tutorials that make it easy for a user to get " +"started using your package. Ideally, those tutorials also can be run from" +" start to finish providing a second set of checks (on top of your test " +"suite) to your package's code base." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:11 +msgid "" +"On this page, we review two Sphinx extensions (`sphinx-gallery` and " +"`nbsphinx`) that allow you to create reproducible tutorials that are run" +" when your Sphinx documentation builds." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:15 +msgid "Create Python package tutorials that run when you build your docs" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:17 +msgid "" +"Adding well constructed tutorials to your package will make it easier for" +" someone new to begin using your package." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:20 +msgid "" +"There are two Sphinx tools that make it easy to add tutorials to your " +"package:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:22 +msgid "[Sphinx Gallery](https://sphinx-gallery.github.io/stable/index.html) and" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:23 +msgid "[NbSphinx](https://nbsphinx.readthedocs.io/en/latest/)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:25 +msgid "Both of these tools act as Sphinx extensions and:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:27 +msgid "" +"Support creating a gallery type page in your Sphinx documentation where " +"users can explore tutorials via thumbnails." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:28 +msgid "" +"Run the code in your tutorials adding another level of \"testing\" for " +"your package as used." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:29 +msgid "Render your tutorials with Python code and plot outputs" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:31 +msgid "[sphinx gallery:](https://sphinx-gallery.github.io/stable/index.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:33 +msgid "" +"If you prefer to write your tutorials using Python **.py** scripts, you " +"may enjoy using Sphinx gallery. Sphinx gallery uses **.py** files with " +"text and code sections that mimic the Jupyter Notebook format. When you " +"build your documentation, the gallery extension:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:38 +msgid "" +"Runs the code in each tutorial. Running your tutorial like this acts as a" +" check to ensure your package's functions, classes, methods, and " +"attributes (ie the API) are working as they should." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:39 +msgid "" +"Creates a downloadable Jupyter Notebook **.ipynb** file and a **.py** " +"script for your tutorial that a user can quickly download and run." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:40 +msgid "" +"Creates a rendered **.html** page with the code elements and code " +"outputs in a user-friendly tutorial gallery." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:41 +msgid "" +"Creates a gallery landing page with visual thumbnails for each tutorial " +"that you create." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:44 +msgid "" +"Image showing the gallery output provided by sphinx-gallery where each " +"tutorial is in a grid and the tutorial thumbnails are created from a " +"graphic in the tutorial." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:50 +msgid "" +"`sphinx-gallery` makes it easy to create a user-friendly tutorial " +"gallery. Each tutorial has a download link where the user can download a " +"**.py** file or a Jupyter Notebook. And it renders the tutorials in a " +"user-friendly grid." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:54 +msgid "Below you can see what a tutorial looks like created with sphinx-gallery." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:56 +msgid "" +"Image showing ta single tutorial from Sphinx gallery. The tutorial shows " +"a simple matplotlib created plot and associated code." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:62 +msgid "" +"`sphinx-gallery` tutorials by default include download links for both the" +" python script (**.py** file) and a Jupyter notebook (**.ipynb** file) at" +" the bottom." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:66 +msgid "Sphinx Gallery benefits" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:67 +msgid "easy-to-download notebook and .py outputs for each tutorials." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:68 +msgid ".py files are easy to work with in the GitHub pull request environment." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:69 +msgid "Nice gridded gallery output." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:70 +msgid "" +"Build execution time data per tutorial. [Example](https://sphinx-" +"gallery.github.io/stable/auto_examples/sg_execution_times.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:72 +msgid "Sphinx gallery challenges" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:74 +msgid "The downsides of using Sphinx gallery include:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:76 +msgid "" +"the **.py** files can be finicky to configure, particularly if you have " +"matplotlib plot outputs." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:78 +msgid "" +"For example: To allow for plots to render, you need to name each file " +"with `plot_` at the beginning." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:81 +msgid "" +"Many users these days are used to working in Jupyter Notebooks. .py may " +"be slightly less user friendly to work with" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:83 +msgid "" +"These nuances can make it challenging for potential contributors to add " +"tutorials to your package. This can also present maintenance challenge." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:86 +msgid "Add about the gallery setup:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:93 +msgid "File directory structure:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:114 +msgid "" +"[nbsphinx - tutorials using Jupyter " +"Notebooks](https://nbsphinx.readthedocs.io/en/latest/)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:116 +msgid "" +"If you prefer to use Jupyter Notebooks to create tutorials you can use " +"nbsphinx. nbsphinx operates similarly to Sphinx gallery in that:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:119 +msgid "It runs your notebooks and produces outputs in the rendered tutorials" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:121 +msgid "" +"Pro/con By default it does not support downloading of **.py** and " +"**.ipynb** files. However you can add a [link to the notebook at the top " +"of the page with some additional conf.py settings (see: epilog " +"settings)](https://nbsphinx.readthedocs.io/en/0.8.10/prolog-and-" +"epilog.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:125 +msgid "" +"Image showing the gallery output provided by nbsphinx using the sphinx-" +"gallery front end interface." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:131 +msgid "" +"`nbsphinx` can be combined with Sphinx gallery to create a gallery of " +"tutorials. However, rather than rendering the gallery as a grid, it lists" +" all of the gallery elements in a single column." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:1 +msgid "Document the code in your package's API using docstrings" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:3 +msgid "What is an API?" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:5 +msgid "" +"API stands for **A**pplied **P**rogramming **I**nterface. When discussed " +"in the context of a (Python) package, the API refers to the functions, " +"classes, methods, and attributes that a package maintainer creates for " +"users." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:9 +msgid "" +"A simple example of a package API element: For instance, a package might " +"have a function called `add_numbers()` that adds up a bunch of numbers. " +"To add up numbers, you as the user simply call `add_numbers(1,2,3)` and " +"the package function calculates the value and returns `6`. By calling the" +" `add_numbers` function, you are using the package's API." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:15 +msgid "" +"Package APIs consist of functions, classes, methods and attributes that " +"create a user interface." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:17 +msgid "What is a docstring and how does it relate to documentation?" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:19 +msgid "" +"In Python, a docstring refers to text in a function, method or class that" +" describes what the function does and its inputs and outputs. Python " +"programmers usually refer to the inputs to functions as " +"[\"parameters\"](https://docs.python.org/3/glossary.html#term-parameter) " +"or [\"arguments\"](https://docs.python.org/3/faq/programming.html#faq-" +"argument-vs-parameter), and the outputs are often called \"return " +"values\"" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:22 +msgid "The docstring is thus important for:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:24 +msgid "" +"When you call `help()` in Python, for example, `help(add_numbers)` will " +"show the text of the function's docstring. The docstring thus helps a " +"user better understand how to apply the function more effectively to " +"their workflow." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:25 +msgid "" +"When you build your package's documentation, the docstrings can also be " +"used to automatically create full API documentation that provides a clean" +" view of all its functions, classes, methods, and attributes." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:28 +msgid "" +"Example API Documentation for all functions, classes, methods, and " +"attributes in a package." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:29 +msgid "" +"[View example high-level API documentation for the Verde package. This " +"page lists every function and class in the package along with a brief " +"explanation of what it " +"does](https://www.fatiando.org/verde/latest/api/index.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:30 +msgid "" +"[You can further dig down to see what a specific function does within the" +" package by clicking on an API " +"element](https://www.fatiando.org/verde/latest/api/generated/verde.grid_coordinates.html#verde.grid_coordinates)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:33 +msgid "Python package API documentation" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:35 +msgid "" +"If you have a descriptive docstring for every user-facing class, method, " +"attribute and/or function in your package (_within reason_), then your " +"package's API is considered well-documented." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:38 +msgid "" +"In Python, this means that you need to add a docstring for every user-" +"facing class, method, attribute and/or function in your package (_within " +"reason_) that:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:42 +msgid "Explains what the function, method, attribute, or class does" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:43 +msgid "Defines the `type` inputs and outputs (ie. `string`, `int`, `np.array`)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:44 +msgid "Explains the expected output `return` of the object, method or function." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:47 +msgid "Three Python docstring formats and why we like NumPy style" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:49 +msgid "" +"There are several Python docstring formats that you can choose to use " +"when documenting your package including:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:52 +msgid "" +"[NumPy-style](https://numpydoc.readthedocs.io/en/latest/format.html" +"#docstring-standard)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:53 +msgid "" +"[google style](https://sphinxcontrib-" +"napoleon.readthedocs.io/en/latest/example_google.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:54 +msgid "" +"[reST style](https://sphinx-rtd-" +"tutorial.readthedocs.io/en/latest/docstrings.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:58 +msgid "" +"We suggest using [NumPy-style " +"docstrings](https://numpydoc.readthedocs.io/en/latest/format.html" +"#docstring-standard) for your Python documentation because:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:61 +msgid "" +"NumPy style docstrings are core to the scientific Python ecosystem and " +"defined in the [NumPy style " +"guide](https://numpydoc.readthedocs.io/en/latest/format.html). Thus you " +"will find them widely used there." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:62 +msgid "" +"The Numpy style docstring is simplified and thus easier to read both in " +"the code and when calling `help()` in Python. In contrast, some feel that" +" reST style docstrings are harder to quickly scan, and can take up more " +"lines of code in modules." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:65 +msgid "" +"If you are using NumPy style docstrings, be sure to include the [sphinx " +"napoleon extension](https://www.sphinx-" +"doc.org/en/master/usage/extensions/napoleon.html) in your documentation " +"`conf.py` file. This extension allows Sphinx to properly read and format " +"NumPy format docstrings." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:70 +msgid "Docstring examples Better and Best" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:72 +msgid "" +"Below is a good example of a well-documented function. Notice that this " +"function's docstring describes the function's inputs and the function's " +"output (or return value). The initial description of the function is " +"short (one line). Following that single-line description, there is a " +"slightly longer description of what the function does (2 to 3 sentences)." +" The return of the function is also specified." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:106 +msgid "Best: a docstring with example use of the function" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:108 +msgid "" +"This example contains an example of using the function that is also " +"tested in sphinx using " +"[doctest](https://docs.python.org/3/library/doctest.html)." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:159 +msgid "" +"Using the above NumPy format docstring in sphinx, the autodoc extension " +"will create the about documentation section for the `extent_to_json` " +"function. The output of the `es.extent_to_json(rmnp)` command can even be" +" tested using doctest adding another quality check to your package." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:165 +msgid "" +"Using doctest to run docstring examples in your package's methods and " +"functions" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:170 +msgid "" +"Above, we provided some examples of good, better, best docstring formats." +" If you are using Sphinx to create your docs, you can add the " +"[doctest](https://www.sphinx-" +"doc.org/en/master/usage/extensions/doctest.html) extension to your Sphinx" +" build. Doctest provides an additional check for docstrings with example " +"code in them. Doctest runs the example code in your docstring `Examples` " +"checking that the expected output is correct. Similar to running " +"tutorials in your documentation, `doctest` can be a useful step that " +"assures that your package's code (API) runs as you expect it to." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:177 +msgid "" +"It's important to keep in mind that examples in your docstrings help " +"users using your package. Running `doctest` on those examples provides a " +"check of your package's API. doctest ensures that the functions and " +"methods in your package run as you expect them to. Neither of these items" +" replace a separate, stand-alone test suite that is designed to test your" +" package's core functionality across operating systems and Python " +"versions." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:185 +msgid "" +"Below is an example of a docstring with an example. doctest will run the " +"example below and test that if you provide `add_me` with the values 1 and" +" 3 it will return 4." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:218 +msgid "Adding type hints to your docstrings" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:220 +msgid "" +"In the example above, you saw the use of numpy-style docstrings to " +"describe data types that are passed into functions as parameters or into " +"classes as attributes. In a numpy-style docstring you add those types in " +"the Parameters section of the docstring. Below you can see that the " +"parameter `num1` and `num2` should both be a Python `int` (integer) " +"value." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:235 +msgid "" +"Describing the expected data type that a function or method requires " +"helps users better understand how to call a function or method." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:238 +msgid "" +"Type-hints add another layer of type documentation to your code. Type-" +"hints make it easier for new developers, your future self or contributors" +" to get to know your code base quickly." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:242 +msgid "" +"Type hints are added to the definition of your function. In the example " +"below, the parameters aNum and aNum2 are defined as being type = int " +"(integer)." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:249 +msgid "" +"You can further describe the expected function output using `->`. Below " +"the output of the function is also an int." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:257 +msgid "Why use type hints" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:259 +msgid "Type hints:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:261 +msgid "Make development and debugging faster," +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:262 +msgid "" +"Make it easier for a user to see the data format inputs and outputs of " +"methods and functions," +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:263 +msgid "" +"Support using static type checking tools such as [`mypy`](https://mypy-" +"lang.org/) which will check your code to ensure types are correct." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:265 +msgid "You should consider adding type hinting to your code if:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:267 +msgid "Your package performs data processing," +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:268 +msgid "You use functions that require complex inputs" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:269 +msgid "" +"You want to lower the entrance barrier for new contributors to help you " +"with your code." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:271 +msgid "Beware of too much type hinting" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:274 +msgid "As you add type hints to your code consider that in some cases:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:276 +msgid "" +"If you have a complex code base, type hints may make code more difficult " +"to read. This is especially true when a parameter’s input takes multiple " +"data types and you list each one." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:277 +msgid "" +"Writing type hints for simple scripts and functions that perform obvious " +"operations don't make sense." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:280 +msgid "Gradually adding type hints" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:282 +msgid "" +"Adding type hints can take a lot of time. However, you can add type hints" +" incrementally as you work on your code." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:286 +msgid "" +"Adding type hints is also a great task for new contributors. It will help" +" them get to know your package's code and structure better before digging" +" into more complex contributions." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:1 +msgid "Create User Facing Documentation for your Python Package" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:14 +msgid "Core components of user-facing Python package documentation" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:15 +msgid "Below we break documentation into two broad types." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:17 +msgid "" +"**User-facing documentation** refers to documentation that describes the " +"way the tools within a package are broadly used in workflows. **API " +"documentation** refers to documentation of functions, classes, methods, " +"and attributes in your code and is written at a more granular level. This" +" documentation is what a user sees when they type `help(function-name)`." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:23 +msgid "" +"Your user-facing documentation for your Python package should include " +"several core components." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:26 +msgid "" +"**Documentation Website:** This refers to easy-to-read documentation that" +" helps someone use your package. This documentation should help users " +"both install and use your package." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:27 +msgid "" +"**Short Tutorials:** Your user-facing documentation should also include " +"[**short tutorials** that showcase core features of your package](create-" +"package-tutorials)." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:28 +msgid "" +"**Package Code / API documentation:** You package's functions, classes, " +"methods, and attributes (the API) should also be documented. API " +"documentation can be generated from " +"[docstrings](https://pandas.pydata.org/docs/development/contributing_docstring.html)" +" found in your code. Ideally, you have docstrings for all user-facing " +"functions, classes, and methods in your Python package. [We discuss code " +"documentation and docstrings in greater detail here.](document-your-code-" +"api-docstrings)" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:32 +msgid "Write usable documentation" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:34 +msgid "" +"User-facing documentation should be published on a easy-to-navigate " +"website. The documentation should be written keeping in mind that users " +"may not be developers or expert-level programmers. Rather, the language " +"that you use in your documentation should not be highly technical." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:39 +msgid "" +"To make the language of your documentation more accessible to a broader " +"audience:" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:42 +msgid "Whenever possible, define technical terms and jargon." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:43 +msgid "Consider writing instructions for a high-school level reader." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:44 +msgid "" +"Include step-by-step code examples, tutorials or vignettes that support " +"getting started using your package." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:46 +msgid "Four elements of a good open source documentation landing page" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:48 +msgid "" +"To make it easy for users to find what they need quickly, consider adding" +" quick links on your package's landing page to the following elements:" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:52 +msgid "" +"**Getting started:** This section should provide the user with a quick " +"start for installing your package. A small example of how to use the " +"package is good to have here as well. Or you can link to useful tutorials" +" in the get started section." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:53 +msgid "" +"**About:** Describe your project, stating its goals and its " +"functionality." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:54 +msgid "" +"**Community:** Instructions for how to help and/or get involved. This " +"might include links to your issues (if that is where you let users ask " +"questions) or the discussion part of your GitHub repo. This section might" +" include a development guide for those who might contribute to your " +"package." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:55 +msgid "" +"**API Documentation:** This is the detailed project documentation. Here " +"you store documentation for your package's API including all user-facing " +"functions, classes, methods, and attributes as well as any additional " +"high level discussion that will help people use your package." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:58 +msgid "" +"Image showing the landing page for GeoPandas documentation which has 4 " +"sections including Getting started, Documentation, About GeoPandas, " +"Community." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:64 +msgid "" +"The documentation landing page of GeoPandas, a spatial Python library, " +"has the 4 element specified above. Notice that the landing page is simple" +" and directs users to each element using a Sphinx card." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:67 +msgid "" +"NOTE: in many cases you can include your **README** file and your " +"**CONTRIBUTING** files in your documentation given those files may have " +"some of the components listed above." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:71 +msgid "" +"You can include files in Sphinx using the include directive. Below is an " +"example of doing this using `myst` syntax." +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:1 +msgid "Writing user-facing documentation for your Python package" +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:3 +msgid "" +"This section walks you through best practices for with writing " +"documentation for your Python package." +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:6 +msgid "" +"We talk about the elements that you should consider adding to your " +"documentation, the different types of users who might read your " +"documentation and how to create tutorials for your package." +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:10 +msgid "" +"Here we also cover sphinx extensions that you can user to make " +"documentation easier such as:" +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:13 +msgid "" +"autodoc to automagically populate documentation for your code's " +"functions, classes, methods and attributes (API documentation) and" +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:15 +msgid "sphinx gallery for tutorials." +msgstr "" + diff --git a/locales/ja/LC_MESSAGES/index.po b/locales/ja/LC_MESSAGES/index.po new file mode 100644 index 00000000..6d662248 --- /dev/null +++ b/locales/ja/LC_MESSAGES/index.po @@ -0,0 +1,484 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../index.md:283 +msgid "Tutorials" +msgstr "" + +#: ../../index.md:289 +msgid "Packaging" +msgstr "" + +#: ../../index.md:139 ../../index.md:297 +msgid "Documentation" +msgstr "" + +#: ../../index.md:187 ../../index.md:305 +msgid "Tests" +msgstr "" + +#: ../../index.md:305 +msgid "Testing" +msgstr "" + +#: ../../index.md:1 +msgid "pyOpenSci Python Package Guide" +msgstr "" + +#: ../../index.md:3 +msgid "" +"We support the Python tools that scientists need to create open science " +"workflows." +msgstr "" + +#: ../../index.md:20 +msgid "" +"![GitHub release (latest by " +"date)](https://img.shields.io/github/v/release/pyopensci/python-package-" +"guide?color=purple&display_name=tag&style=plastic) " +"[![](https://img.shields.io/github/stars/pyopensci/python-package-" +"guide?style=social)](https://github.com/pyopensci/contributing-guide) " +"[![DOI](https://zenodo.org/badge/556814582.svg)](https://zenodo.org/badge/latestdoi/556814582)" +msgstr "" + +#: ../../index.md:20 +msgid "GitHub release (latest by date)" +msgstr "" + +#: ../../index.md:20 +msgid "DOI" +msgstr "" + +#: ../../index.md:27 +msgid "About this guide" +msgstr "" + +#: ../../index.md:29 +msgid "" +"Image with the pyOpenSci flower logo in the upper right hand corner. The " +"image shows the packaging lifecycle. The graphic shows a high level " +"overview of the elements of a Python package. the inside circle has 5 " +"items - user documentation, code/api, test suite, contributor " +"documentation, project metadata / license / readme. In the middle of the " +"circle is says maintainers and has a small icon with people. on the " +"outside circle there is an arrow and it says infrastructure." +msgstr "" + +#: ../../index.md:35 +msgid "This guide will help you:" +msgstr "" + +#: ../../index.md:37 +msgid "Learn how to create a Python package from start to finish" +msgstr "" + +#: ../../index.md:38 +msgid "Understand the broader Python packaging tool ecosystem" +msgstr "" + +#: ../../index.md:39 +msgid "Navigate and make decisions around tool options" +msgstr "" + +#: ../../index.md:40 +msgid "Understand all of the pieces of creating and maintaining a Python package" +msgstr "" + +#: ../../index.md:42 +msgid "" +"You will also find best practice recommendations and curated lists of " +"community resources surrounding packaging and package documentation." +msgstr "" + +#: ../../index.md:46 +msgid "Todo" +msgstr "" + +#: ../../index.md:47 +msgid "TODO: change the navigation of docs to have a" +msgstr "" + +#: ../../index.md:49 +msgid "user documentation contributor / maintainer documentation" +msgstr "" + +#: ../../index.md:51 +msgid "development guide" +msgstr "" + +#: ../../index.md:52 +msgid "contributing guide" +msgstr "" + +#: ../../index.md:54 +msgid "Community docs" +msgstr "" + +#: ../../index.md:55 +msgid "readme, coc, license" +msgstr "" + +#: ../../index.md:57 +msgid "Publish your docs" +msgstr "" + +#: ../../index.md:59 +msgid "_new_ Tutorial Series: Create a Python Package" +msgstr "" + +#: ../../index.md:61 +msgid "" +"The first round of our community-developed, how to create a Python " +"package tutorial series for scientists is complete! Join our community " +"review process or watch development of future tutorials in our [Github " +"repo here](https://github.com/pyOpenSci/python-package-guide)." +msgstr "" + +#: ../../index.md:71 +msgid "✿ Create a Package Tutorials ✿" +msgstr "" + +#: ../../index.md:75 +msgid "[What is a Python package?](/tutorials/intro)" +msgstr "" + +#: ../../index.md:76 +msgid "[Make your code installable](/tutorials/installable-code)" +msgstr "" + +#: ../../index.md:77 +msgid "[Publish your package to (test) PyPI](/tutorials/publish-pypi)" +msgstr "" + +#: ../../index.md:78 +msgid "[Publish your package to conda-forge](/tutorials/publish-conda-forge)" +msgstr "" + +#: ../../index.md:83 +msgid "✿ Package Metadata Tutorials ✿" +msgstr "" + +#: ../../index.md:87 +msgid "[How to add a README file](/tutorials/add-readme)" +msgstr "" + +#: ../../index.md:88 +msgid "" +"[How to add metadata to a pyproject.toml file for publication to " +"PyPI.](/tutorials/pyproject-toml.md)" +msgstr "" + +#: ../../index.md:93 +msgid "✿ Packaging Tool Tutorials ✿" +msgstr "" + +#: ../../index.md:97 +msgid "[Introduction to Hatch](/tutorials/get-to-know-hatch)" +msgstr "" + +#: ../../index.md:102 +msgid "Python Packaging for Scientists" +msgstr "" + +#: ../../index.md:104 +msgid "" +"Learn about Python packaging best practices. You will also get to know " +"the the vibrant ecosystem of packaging tools that are available to help " +"you with your Python packaging needs." +msgstr "" + +#: ../../index.md:113 +msgid "✨ Create your package ✨" +msgstr "" + +#: ../../index.md:117 +msgid "[Package file structure](/package-structure-code/python-package-structure)" +msgstr "" + +#: ../../index.md:118 +msgid "" +"[Package metadata / pyproject.toml](package-structure-code/pyproject-" +"toml-python-package-metadata.md)" +msgstr "" + +#: ../../index.md:119 +msgid "" +"[Build your package (sdist / wheel)](package-structure-code/python-" +"package-distribution-files-sdist-wheel.md)" +msgstr "" + +#: ../../index.md:120 +msgid "[Declare dependencies](package-structure-code/declare-dependencies.md)" +msgstr "" + +#: ../../index.md:121 +msgid "" +"[Navigate the packaging tool ecosystem](package-structure-code/python-" +"package-build-tools.md)" +msgstr "" + +#: ../../index.md:122 +msgid "" +"[Non pure Python builds](package-structure-code/complex-python-package-" +"builds.md)" +msgstr "" + +#: ../../index.md:127 +msgid "✨ Publish your package ✨" +msgstr "" + +#: ../../index.md:131 +msgid "" +"Gain a better understanding of the Python packaging ecosystem Learn about" +" best practices for:" +msgstr "" + +#: ../../index.md:134 +msgid "" +"[Package versioning & release](/package-structure-code/python-package-" +"versions.md)" +msgstr "" + +#: ../../index.md:135 +msgid "" +"[Publish to PyPI & Conda-forge](/package-structure-code/publish-python-" +"package-pypi-conda.md)" +msgstr "" + +#: ../../index.md:148 +msgid "✨ Write The Docs ✨" +msgstr "" + +#: ../../index.md:151 +msgid "" +"[Create documentation for your users](/documentation/write-user-" +"documentation/intro)" +msgstr "" + +#: ../../index.md:152 +msgid "" +"[Core files to include in your package repository](/documentation" +"/repository-files/intro)" +msgstr "" + +#: ../../index.md:153 +msgid "" +"[Write tutorials to show how your package is used](/documentation/write-" +"user-documentation/create-package-tutorials)" +msgstr "" + +#: ../../index.md:158 +msgid "✨ Developer Docs ✨" +msgstr "" + +#: ../../index.md:161 +msgid "" +"[Create documentation for collaborating developers](/documentation" +"/repository-files/contributing-file)" +msgstr "" + +#: ../../index.md:162 +msgid "" +"[Write a development guide](/documentation/repository-files/development-" +"guide)" +msgstr "" + +#: ../../index.md:167 +msgid "✨ Document For A Community ✨" +msgstr "" + +#: ../../index.md:170 +msgid "" +"[Writing a README file](/documentation/repository-files/readme-file-best-" +"practices)" +msgstr "" + +#: ../../index.md:171 +msgid "" +"[Set norms with a Code of Conduct](/documentation/repository-files/code-" +"of-conduct-file)" +msgstr "" + +#: ../../index.md:172 +msgid "[License your package](/documentation/repository-files/license-files)" +msgstr "" + +#: ../../index.md:177 +msgid "✨ Publish Your Docs ✨" +msgstr "" + +#: ../../index.md:180 +msgid "[How to publish your docs](/documentation/hosting-tools/intro)" +msgstr "" + +#: ../../index.md:181 +msgid "[Using Sphinx](/documentation/hosting-tools/intro)" +msgstr "" + +#: ../../index.md:182 +msgid "" +"[Markdown, MyST, and ReST](/documentation/hosting-tools/myst-markdown-" +"rst-doc-syntax)" +msgstr "" + +#: ../../index.md:183 +msgid "" +"[Host your docs on Read The Docs or Github Pages](/documentation/hosting-" +"tools/publish-documentation-online)" +msgstr "" + +#: ../../index.md:189 +msgid "" +"*We are actively working on this section. [Follow development " +"here.](https://github.com/pyOpenSci/python-package-guide)*" +msgstr "" + +#: ../../index.md:197 +msgid "✨ Tests for your Python package ✨" +msgstr "" + +#: ../../index.md:200 +msgid "[Intro to testing](tests/index.md)" +msgstr "" + +#: ../../index.md:201 +msgid "[Write tests](tests/write-tests)" +msgstr "" + +#: ../../index.md:202 +msgid "[Types of tests](tests/test-types)" +msgstr "" + +#: ../../index.md:207 +msgid "✨ Run your tests ✨" +msgstr "" + +#: ../../index.md:210 +msgid "[Run tests locally](tests/run-tests)" +msgstr "" + +#: ../../index.md:211 +msgid "[Run tests in CI](tests/tests-ci)" +msgstr "" + +#: ../../index.md:215 +msgid "Contributing" +msgstr "" + +#: ../../index.md:225 +msgid "✨ Code style & Format ✨" +msgstr "" + +#: ../../index.md:230 +msgid "[Code style](package-structure-code/code-style-linting-format.md)" +msgstr "" + +#: ../../index.md:235 +msgid "✨ Want to contribute? ✨" +msgstr "" + +#: ../../index.md:240 +msgid "" +"We welcome contributions to this guide. Learn more about how you can " +"contribute." +msgstr "" + +#: ../../index.md:246 +msgid "" +"xkcd comic showing a stick figure on the ground and one in the air. The " +"one on the ground is saying. `You're flying! how?` The person in the air" +" replies `Python!` Below is a 3 rectangle comic with the following text " +"in each box. box 1 - I learned it last night. Everything is so simple. " +"Hello world is just print hello world. box 2 - the person on the ground " +"says - come join us programming is fun again. it's a whole new world. But" +" how are you flying? box 3 - the person flying says - i just typed import" +" antigravity. I also sampled everything in the medicine cabinet. But i " +"think this is the python. the person on the ground is saying - that's it?" +msgstr "" + +#: ../../index.md:252 +msgid "A community-created guidebook" +msgstr "" + +#: ../../index.md:254 +msgid "" +"Every page in this guidebook goes through an extensive community review " +"process. To ensure our guidebook is both beginner-friendly and accurate, " +"we encourage reviews from a diverse set of pythonistas and scientists " +"with a wide range of skills and expertise." +msgstr "" + +#: ../../index.md:257 +msgid "View guidebook contributors" +msgstr "" + +#: ../../index.md:265 +msgid "Who this guidebook is for" +msgstr "" + +#: ../../index.md:267 +msgid "" +"This guidebook is for anyone interested in learning more about Python " +"packaging. It is beginner-friendly and will provide:" +msgstr "" + +#: ../../index.md:269 +msgid "Beginning-to-end guidance on creating a Python package." +msgstr "" + +#: ../../index.md:270 +msgid "" +"Resources to help you navigate the Python packaging ecosystem of tools " +"and approaches to packaging." +msgstr "" + +#: ../../index.md:271 +msgid "" +"A curated list of resources to help you get your package into documented," +" usable and maintainable shape." +msgstr "" + +#: ../../index.md:273 +msgid "Where this guide is headed" +msgstr "" + +#: ../../index.md:275 +msgid "" +"If you have ideas of things you'd like to see here clarified in this " +"guide, [we invite you to open an issue on " +"GitHub.](https://github.com/pyOpenSci/python-package-guide/issues)." +msgstr "" + +#: ../../index.md:278 +msgid "" +"If you have questions about our peer review process or packaging in " +"general, you are welcome to use our [pyOpenSci Discourse " +"forum](https://pyopensci.discourse.group/)." +msgstr "" + +#: ../../index.md:280 +msgid "" +"This is a living guide that is updated as tools and best practices evolve" +" in the Python packaging ecosystem. We will be adding new content over " +"the next year." +msgstr "" + diff --git a/locales/ja/LC_MESSAGES/package-structure-code.po b/locales/ja/LC_MESSAGES/package-structure-code.po new file mode 100644 index 00000000..e409630c --- /dev/null +++ b/locales/ja/LC_MESSAGES/package-structure-code.po @@ -0,0 +1,5302 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../package-structure-code/code-style-linting-format.md:1 +msgid "Python Package Code Style, Format and Linters" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:3 +#: ../../package-structure-code/publish-python-package-pypi-conda.md:12 +msgid "Take Aways" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:5 +msgid "pyOpenSci requires authors to follow PEP 8 code format guidelines" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:6 +msgid "" +"Setting up a code formatters like Black and isort will help you enforce " +"PEP 8 style guidelines and also consistent, readable code format" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:7 +msgid "Some commonly used tools are: Black, Isort, flake8, Ruff" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:8 +msgid "" +"You can also setup pre-commit hooks which will run code formatters " +"locally each time you make a commit." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:10 +msgid "" +"[precommit.ci](https://pre-commit.ci/) is a bot that you can add to your " +"GitHub repository. It will automagically apply code format to every PR " +"using the tools specified in your pre-commit-config.yaml file. It can " +"save significant time and make contributions easier for new contributors." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:11 +msgid "" +"Automation is good! By making code quality tools care of your code, you " +"can focus on structural and high values tasks." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:14 +msgid "" +"Consistent code format and style is useful to both your package and " +"across the scientific Python ecosystem because using similar formats " +"makes code easier to read." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:18 +msgid "" +"For instance, if you saw a sentence like this one without any spaces, or " +"punctuation, it would take your brain longer to process it." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:25 +msgid "" +"pyOpenSci peer review process requires that you to follow standard " +"[Python PEP 8 format rules](https://peps.python.org/pep-0008/) as closely" +" as you can." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:29 +msgid "" +"pyOpenSci doesn't require you to use a specific code format tool. " +"However, we do look for consistency and readability in code style. Below " +"you will find a discussion of:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:33 +msgid "The benefits of using linters and code format tools in your workflow" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:34 +msgid "Some commonly used tools in the scientific Python space" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:35 +msgid "" +"Setting up pre-commit hooks and the pre-commit.ci bot to make using code " +"format tools in daily workflows and in pull requests on GitHub easier." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:38 +msgid "Use a code format tool (or tools) to make your life easier" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:40 +msgid "" +"We suggest that you use a code format tool, or a set of format tools, " +"because manually applying all of the PEP 8 format specifications is both " +"time consuming for maintainers and can be a road block for potential new " +"contributors. Code formatters will automagically reformat your code for " +"you, adhering to PEP 8 standards and applying consistent style decisions " +"throughout." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:46 +msgid "Setting up a code format suite of tools will:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:48 +msgid "Save you and your maintainer team time in fixing PEP 8 inconsistencies." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:49 +msgid "Ensure that format and style is consistent across your entire code-base." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:50 +msgid "" +"Avoid lengthy discussions with contributors and other maintainers about " +"personalized code format preferences during reviews." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:52 +msgid "" +"Avoid pure visual edits in the code base so that code reviews focus on " +"added value" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:54 +msgid "" +"Many packages use a suite of tools to apply code format rules, taking the" +" work out of manually implementing code format requirements." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:57 +msgid "" +"Consistent code format across packages within the (scientific) Python " +"ecosystem, will also broadly make code easier to scan, understand and " +"contribute to." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:60 +msgid "Linting vs format and style" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:62 +msgid "Before we dive in let's get a few definitions out of the way." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:64 +msgid "Code Linting" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:66 +msgid "" +"A code linter is a tool that will review your code and identify errors or" +" issues. A linter typically does not modify your code. It will tell you " +"what the error is and on what line it was discovered. Flake8, discussed " +"below, is an example of a commonly-used code linter." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:71 +msgid "Code Formatters (and stylers)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:73 +msgid "" +"Code formatters will reformat your code for you. Python focused code " +"formatters often follow PEP 8 standards. However, they also make " +"stylistic decisions about code consistency." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:77 +msgid "" +"Black is an example of a commonly-used code formatter. Black both applies" +" PEP 8 standards while also making decisions about things like consistent" +" use of double quotes for strings, and spacing of items in lists." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:81 +msgid "You will learn more about Black below." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:83 +msgid "Code linting, formatting and styling tools" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:85 +msgid "Black" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:87 +msgid "" +"[Black](https://black.readthedocs.io/en/stable/) is a code formatter. " +"Black will automagically (and _unapologetically_) fix spacing issues and " +"ensure code format is consistent throughout your package. Black also " +"generally adheres to PEP 8 style guidelines with some exceptions. A few " +"examples of those exceptions are below:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:93 +msgid "" +"Black defaults to a line length of 88 (79 + 10%) rather than the 79 " +"character `PEP 8` specification. However, line length is a setting can be" +" manually overwritten in your Black configuration." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:94 +msgid "Black will not adjust line length in your comments or docstrings." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:95 +msgid "" +"This tool will not review and fix import order (you need `isort` or " +"`ruff` to do that - see below)." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:98 +msgid "" +"If you are interested in seeing how Black will format your code, you can " +"use the [Black playground](https://black.vercel.app/)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:102 +msgid "" +"Using a code formatter like Black will leave you more time to work on " +"code function rather than worry about format." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:105 +msgid "Flake8" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:107 +msgid "" +"To adhere to Python `pep8` format standards, you might want to add " +"[flake8](https://flake8.pycqa.org/en/latest/) to your code format " +"toolbox." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:111 +msgid "flake8 will:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:113 +msgid "" +"Flag every line in your code that extends beyond 79 characters (including" +" those in docstrings and comments)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:114 +msgid "" +"Flag spacing issues that conflict with PEP 8 guidelines such as missing " +"spaces after commas" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:116 +msgid "" +"Flake8 also flags unused imports and unused declared variables in your " +"modules." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:119 +msgid "" +"Below you can see the output of running `flake8 filename.py` at the " +"command line for a Python file within a package called `stravalib`." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:123 +msgid "The line length standard for PEP 8 is 79 characters." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:125 +msgid "" +"Notice that flake8 returns a list of issues that it found in the model.py" +" module on the command line. The Python file itself is not modified. " +"Using this output, you can fix each issue line by line manually." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:140 +msgid "Isort" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:142 +msgid "" +"Python imports refer to the Python packages that a module in your package" +" requires. Imports should always be located at the top of each Python " +"module in your package." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:146 +msgid "" +"[PEP 8 has specific standards for the order of these " +"imports](https://peps.python.org/pep-0008/#imports). These standards are " +"listed below:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:148 +msgid "Imports should be grouped in the following order:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:150 +msgid "Standard library imports." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:151 +msgid "Related third party imports." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:152 +msgid "Local application/library specific imports." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:154 +msgid "" +"While `flake8` will identify unused imports in your code, it won't fix or" +" identify issues with the order of package imports." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:157 +msgid "" +"`isort` will identify where imports in your code are out of order. It " +"will then modify your code, automatically reordering all imports. This " +"leaves you with one less thing to think about when cleaning up your code." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:162 +msgid "Example application of isort" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:164 +msgid "Code imports before `isort` is run:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:166 +msgid "" +"Below, the `pandas` is a third party package, `typing` is a core `Python`" +" package distributed with `Python`, and `examplePy.temperature` is a " +"first-party module which means it belongs to the same package as the file" +" doing the import. Also notice that there are no spaces in the imports " +"listed below." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:176 +msgid "From the project root, run:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:182 +msgid "Python file `temporal.py` imports after `isort` has been run" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:189 +msgid "Ruff" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:191 +msgid "" +"[Ruff](https://docs.astral.sh/ruff/) is a new addition to the code " +"quality ecosystem, gaining some traction since its release. `ruff` is " +"both a linter and a code formatter for Python, aiming to replace several " +"tools behind a single interface. As such, `ruff` can be used at a " +"replacement of all other tools mentioned here, or in complement to some " +"of them." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:197 +msgid "" +"`ruff` has some interesting features that distinguish it from other " +"linters:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:199 +msgid "Linter configuration in `pyproject.toml`" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:200 +msgid "Several hundred rules included, many of which are automatically fixable" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:201 +msgid "" +"Rules explanation, see [F403](https://docs.astral.sh/ruff/rules" +"/undefined-local-with-import-star/) for an example" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:202 +msgid "" +"Fast execution time, makes a quick feedback loop possible even on large " +"projects." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:204 +msgid "" +"Here is a simple configuration to get started with `ruff`. It would go " +"into your `pyproject.toml`:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:212 +msgid "" +"Depending on your project, you might want to add the following to sort " +"imports correctly:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:219 +msgid "How to use code formatter in your local workflow" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:221 +msgid "Linters, code formatters and your favorite coding tools" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:223 +msgid "" +"Linters can be run as a command-line tool as shown above. They also can " +"be run within your favorite coding tool (e.g. VScode, pycharm, etc). For " +"example, you might prefer to have tools like Black and isort run when you" +" save a file. In some editors you can also setup shortcuts that run your " +"favorite code format tools on demand." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:229 +msgid "Use pre-commit hooks to run code formatters and linters on commits" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:231 +msgid "You can also setup a `pre-commit hook` in your Python package repository." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:233 +msgid "" +"A pre-commit hook is a tool that allows an action (or actions) to be " +"triggered when you apply a commit to your git repository." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:236 +msgid "Pre-commit hook example workflow" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:238 +msgid "The precommit workflow looks like this: You type and run:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:241 +msgid "`git commit -m \"message here\"` at the command line" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:243 +msgid "" +"Once you hit return, pre-commit will run any tools that you have " +"configured in a **.pre-commit-config.yaml** file." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:245 +msgid "" +"If the tools configured in the pre-commit hook run successfully without " +"making changes or finding errors in your code, the commit will be applied" +" to the repository." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:249 +msgid "" +"If the tools configured in the hook find errors in your files, the commit" +" will NOT be applied to the repository. Remember from the discussion " +"above that a code formatter like Black will run and reformat your code. A" +" linter like _flake8_ will provide you with some output that details " +"where there are syntax issues in your code. You will then need to fix " +"those issues, manually." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:256 +msgid "" +"Once all of the fixes are applied you can re-add (stage) the files to be " +"commit. And re-run your commit." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:260 +msgid "Diagram showing the steps of a pre-commit workflow from left to right." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:262 +msgid "" +"The pre-commit workflow begins with you adding files that have changes to" +" be staged in git. Next, you'd run git commit. when you run git commit, " +"the pre-commit hooks will then run. In this example, Black, the code " +"formatter and flake8, a linter both run. If all of the files pass Black " +"and flake8 checks, then your commit will be recorded. If they don't, the " +"commit is canceled. You will have to fix any flake8 issues, and then re-" +"add / stage the files to be committed. [_Image " +"Source_](https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-" +"using-black-and-flake8/*)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:275 +msgid "" +"If have a Python code-base and multiple maintainers actively working on " +"the code, and you intend to run a tool like Black, be sure to coordinate " +"across your team. An initial commit that applies Black to your entire " +"package will likely change a significant amount of your code. This could " +"lead to merge conflicts on open and new PR's before the new changes are " +"merged." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:282 +msgid "General pre commit checks" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:284 +msgid "" +"In addition to calling tools, Pre-commit also has a suite of [built in " +"format hooks](https://github.com/pre-commit/pre-commit-hooks#hooks-" +"available) that you can call. Some, such as trailing-whitespace can be " +"also useful to add to your pre-commit workflow to ensure clean, " +"streamlined code files." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:289 +msgid "" +"An example pre-commit-config.yaml file is below with examples of how this" +" is all setup." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:292 +msgid "Pre-commit.ci" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:294 +msgid "" +"[Pre-commit.ci](https://pre-commit.ci) is a bot that may become your new " +"best friend. This bot, when setup on a repo can be configured to do the " +"following:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:297 +msgid "It will check every pull request using all of the pre-commit hook setting" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:298 +msgid "" +"If you wish, it will also submit a pull request to your repo with pre-" +"commit fixes, saving you, and new contributors the time of reformatting a" +" pr that has format issues." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:301 +msgid "You can also call the bot on any pull request to run / and fix the code." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:303 +msgid "" +"The pre-commit.ci bot uses the same pre-commit-config.yaml file that you " +"use to setup pre-commit locally." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:306 +msgid "Setting up a bot like this can be valuable because:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:308 +msgid "" +"It can make is easier for maintainers as they no longer have to worry at " +"allows about fixing code format. The bot will do the work for them." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:310 +msgid "" +"It can make it easier for new comers as they never have to setup pre-" +"commit locally or worry about linting their code. They can even make " +"small fixes to the code directly on GitHub without worry." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:312 +msgid "Setting up a git pre-commit hook" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:314 +msgid "To setup pre-commit locally, you need to do 3 things:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:316 +msgid "" +"Install pre-commit (and include it as a development requirement in your " +"repository)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:326 +msgid "" +"Create a .pre-commit-config.yaml file in the root of your package " +"directory." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:328 +msgid "" +"Below is an example **.pre-commit-cofig.yaml** file that can be used to " +"setup the pre-commit hook and the pre-commit.ci bot if you chose to " +"implement that too." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:336 +msgid "" +"This file specifies a hook that will be triggered automatically before " +"each `git commit`, in this case, it specifies a `flake8` using version " +"`6.0.0`." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:339 +msgid "" +"Install your pre-commit hook(s) using `pre-commit install`. This will " +"install all of the hooks specified in the pre-commit yaml file into your " +"environment." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:341 +msgid "" +"Once you have done the above, you are ready to start working on your " +"code. Pre-commit will run every time you run `git commit`." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:344 +msgid "Summary" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:346 +msgid "" +"pyOpenSci suggests setting up a linter and a code styler for your " +"package, regardless of whether you use pre-commit hooks, CI or other " +"infrastructure to manage code format. Setting up these tools will give " +"you automatic feedback about your code's structure as you (or a " +"contributor) write it. And using a tool like black that format code for " +"you, reduce effort that you need to make surrounding decisions around " +"code format and style." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:1 +msgid "Complex Python package builds" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:3 +msgid "" +"This guide is focused on packages that are either pure-python or that " +"have a few simple extensions in another language such as C or C++." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:6 +msgid "" +"In the future, we want to provide resources for packaging workflows that " +"require more complex builds. If you have questions about these types of " +"package, please [add a question to our " +"discourse](https://pyopensci.discourse.group/) or open an [issue about " +"this guide specifically in the GitHub repo for this " +"guide](https://github.com/pyOpenSci/python-package-guide/issues). There " +"are many nuances to building and distributing Python packages that have " +"compiled extensions requiring non-Python dependencies at build time. For " +"an overview and thorough discussion of these nuances, please see [this " +"site.](https://pypackaging-native.github.io/)" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:8 +msgid "Pure Python Packages vs. packages with extensions in other languages" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:10 +msgid "" +"You can classify Python package complexity into three general categories." +" These categories can in turn help you select the correct package " +"frontend and backend tools." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:14 +msgid "" +"**Pure-python packages:** these are packages that only rely on Python to " +"function. Building a pure Python package is simpler. As such, you can " +"chose a tool below that has the features that you want and be done with " +"your decision!" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:16 +msgid "" +"**Python packages with non-Python extensions:** These packages have " +"additional components called extensions written in other languages (such " +"as C or C++). If you have a package with non-Python extensions, then you " +"need to select a build backend tool that allows additional build steps " +"needed to compile your extension code. Further, if you wish to use a " +"frontend tool to support your workflow, you will need to select a tool " +"that supports additional build setups. We suggest that you chose build " +"tool that supports custom build steps like Hatch." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:18 +msgid "" +"**Python packages that have extensions written in different languages " +"(e.g. Fortran and C++) or that have non Python dependencies that are " +"difficult to install (e.g. GDAL)** These packages often have complex " +"build steps (more complex than a package with just a few C extensions for" +" instance). As such, these packages require tools such as [scikit-" +"build](https://scikit-build.readthedocs.io/en/latest/) or [meson-" +"python](https://mesonbuild.com/Python-module.html) to build. NOTE: you " +"can use meson-python with PDM." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:21 +msgid "Mixing frontend and backend projects" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:23 +msgid "" +"It is sometimes necessary or desirable to use a build frontend with an " +"alternative build-backend. This is because some frontends do not have a " +"default backend (`build`), and this choice is placed on the maintainer. " +"Other backends (`hatch`) have a preferred backend (`hatchling`) but allow" +" the maintainer to migrate to another, while some backends (`poetry`) " +"only work with a single backend (`poetry-core`). Refer to (#python-" +"package-build-tools) for more information about frontend and backend " +"compatibility." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:29 +msgid "" +"In this packaging guide we recommend using `hatch` along with its " +"preferred backend `hatchling`. While this will be suitable for most " +"packages, an alternate backend may be used with Hatch if needed when " +"creating an extension module. A Python extension module is one that is " +"made up, either in part or entirely, of compiled code. In this case the " +"backend chosen (such as `meson-python`) must know how to compile the " +"extension language and bind it to Python. `hatchling` does not know how " +"to do this all on its own and must either make use of " +"[plugins](https://hatch.pypa.io/1.9/plugins/about/) or be replaced by a " +"backend that is already capable of building extension modules." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:37 +msgid "" +"In order to use a different backend you will need to edit your project's " +"`pyproject.toml`. If you have a `pyproject.toml` generated by the `hatch`" +" command, or from following the packaging tutorial, you may have to make " +"a change like this" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:8 +#: ../../package-structure-code/declare-dependencies.md:375 +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:25 +msgid "Todo" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:10 +msgid "" +"keep this comment - https://github.com/pyOpenSci/python-package-" +"guide/pull/106#issuecomment-1844278487 in this file for now - jeremiah " +"did a nice inventory of common shells and whether they need quotes or " +"not. it's really comprehensive. but do we want it in the guide?? it's " +"really useful for more advanced users i think." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:12 +msgid "" +"Following this comment: https://github.com/pyOpenSci/python-package-" +"guide/pull/106#pullrequestreview-1766663571" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:15 +msgid "Jonny will add a section that talks about:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:17 +msgid "" +"Why you specify dependencies How to specify dependencies When you use " +"different specifiers" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:22 +msgid "Python Package Dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:24 +msgid "What is a package dependency?" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:26 +msgid "" +"A Python package dependency refers to an external package or software " +"that your Python project:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:29 +msgid "needs to function properly." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:30 +msgid "" +"requires if someone wants to develop / work on improving your package " +"locally or" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:31 +msgid "" +"requires if a user wants to add additional functionality (that is not " +"core) to your package" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:33 +msgid "" +"A dependency is not part of your project's codebase. It is a package or " +"software that is called within the code of your project or during " +"development of your package." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:37 +msgid "Understanding optional vs. required dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:38 +msgid "" +"You can think about dependencies as being either optional or required. If" +" they are required, they will be listed in the `[dependency] =` table of " +"your `pyproject.toml` file. If they are optional, they will be listed in " +"the `[optional.dependencies]` table of your `pyproject.toml`." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:40 +msgid "You will learn about both below." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:46 +msgid "" +"There are two broad groups of Python package dependencies: those that are" +" optional and those that are required. Required packages are those that a" +" user needs to use your package. Optional dependencies are packages a " +"user can chose to install to add functionality to your package. Within " +"those 2 groups, there are three use cases that you can think about. 1. " +"Core dependencies are **required** for a user to use your package. 2. " +"Development dependencies are optional and only needed if someone wants to" +" work on your package locally. 3. Finally feature dependencies are " +"optional and add additional functionality to your package. Not all " +"packages will have feature dependencies." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:51 +msgid "Required (or core) dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:53 +msgid "" +"Required dependencies are called directly within your package's code. On " +"this page we refer to these dependencies as **core dependencies** as they" +" are needed in order to run your package. You should place your core or " +"required dependencies in the `[dependency]=` table of your " +"`pyproject.toml` file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:56 +#: ../../package-structure-code/declare-dependencies.md:147 +msgid "Optional dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:58 +msgid "" +"Optional dependencies dependencies can be optionally installed by users " +"depending upon their needs. There are two broad groups of optional " +"dependencies:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:61 +msgid "" +"**Development dependencies**: These are dependencies that are required to" +" support development of your package. They include tools to run tests " +"such as `pytest`, linters (like `flake8` and `ruff`) and code formatters " +"such as `black` and even automation tools such as `nox` or `tox` that run" +" tasks." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:63 +msgid "" +"**Feature dependencies:** These are dependencies that a user can chose to" +" install to add functionality to your package." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:65 +msgid "" +"When a Python project is installed, the Python package manager (either " +"`pip` or `conda`) installs your package's dependencies automatically. " +"This ensures that when you call a function in a specific dependency, it " +"is available in your user's environment." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:70 +msgid "Dependencies can be added to your pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:72 +msgid "" +"In the [pyproject.toml overview page](pyproject-toml-python-package-" +"metadata), you learned how to set up a **pyproject.toml** file with basic" +" metadata for your package. On this page, you will learn how to specify " +"different types of dependencies in your `pyproject.toml`." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:79 +msgid "How do you declare dependencies?" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:81 +msgid "" +"We recommend that you declare your dependencies using your " +"`pyproject.toml` file. This ensures that all of the metadata associated " +"with your package is declared in a single place, making it simpler for " +"users and contributors to understand your package infrastructure." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:86 +msgid "" +"Previously, it was common to use a `requirements.txt` file to declare " +"package dependencies. However in recent years, the ecosystem has moved to" +" storing this information in your **pyproject.toml** file. You may notice" +" however that some projects still maintain a `requirements.txt` file for " +"specific local development needs." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:92 +msgid "Other ways you may see packages storing dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:95 +msgid "" +"If a project contains extensions written in other languages, you may need" +" a `setup.py` file. Or you may contribute to a package that us using " +"`setup.cfg` for dependency declaration. [Learn more about this in the " +"setuptools " +"documentation](https://setuptools.pypa.io/en/latest/userguide/dependency_management.html" +"#declaring-required-dependency)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:100 +msgid "Add required dependencies to your pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:102 +msgid "" +"Your core project dependencies need to be installed by a package manager " +"such as `pip` or `conda` when a user installs your package. You can add " +"those dependencies to the `dependencies` array located within the " +"`[project]` table of your **pyproject.toml** file. This looks something " +"like this:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:121 +msgid "" +"Ideally, you should only list the packages that are necessary to install " +"and use your package in the `[dependencies]` section. This minimizes the " +"number of additional packages that your users must install as well as the" +" number of packages that depend upon your package must also install." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:128 +msgid "" +"Remember that fewer dependencies to install reduces the likelihood of " +"version mismatches in user environments." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:131 +msgid "A dependency example" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:133 +msgid "" +"Let's pretend you have a package called `plotMe` that creates beautiful " +"plots of data stored in `numpy` arrays. To create your plots in the " +"`plotMe` package, you use the `seaborn` package to stylize our plots and " +"also `numpy` to process array formatted data." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:135 +msgid "In the example above, the plotMe package, depends upon two packages:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:137 +msgid "seaborn" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:138 +msgid "numpy" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:140 +msgid "" +"This means that in order for plotMe to work in a user's `environment` " +"when installed, you also need to ensure that they have both of those " +"required `dependencies` installed in their environment too." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:142 +msgid "" +"Declaring a dependency in your `pyproject.toml` file will ensure that it " +"is listed as a required dependency when your package is published to PyPI" +" and that a package manager (`pip` or `conda`) will automatically install" +" it into a user's environment alongside your package:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:144 +msgid "`python -m pip install plotMe`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:149 +msgid "" +"Optional dependencies for building your documentation, running your tests" +" and building your package's distribution files are often referred to as " +"development dependencies. These are the dependencies that a user needs to" +" work on your package locally and perform tasks such as:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:151 +msgid "running your test suite" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:152 +msgid "building your documentation" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:153 +msgid "linting and other code cleanup tools" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:155 +msgid "" +"These dependencies are considered optional, because they are not required" +" to install and use your package. Feature dependencies are considered " +"optional and should also be placed in the `[optional.dependencies]` " +"table." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:158 +msgid "" +"Optional dependencies can be stored in an `[optional.dependencies]` table" +" in your **pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:161 +msgid "" +"It's important to note that within the `[optional.dependencies]` table, " +"you can store additional, optional dependencies within named sub-groups. " +"This is a different table than the dependencies array located within the " +"`[project]` table discussed above which contains a single array with a " +"single list of required packages." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:163 +msgid "Create optional dependency groups" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:165 +msgid "To declare optional dependencies in your **pyproject.toml** file:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:167 +msgid "Add a `[optional.dependencies]` table to your **pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:168 +msgid "Create named groups of dependencies using the syntax:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:170 +msgid "`group-name = [\"dep1\", \"dep2\"]`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:172 +msgid "Installing packages from GitHub / Gitlab" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:175 +msgid "" +"If you have dependencies that need to be installed directly from GitHub " +"using a `git+https` installation approach, you can do so using the " +"pyproject.toml file like so:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:185 +msgid "" +"IMPORTANT: For security reasons, if your library depends on a GitHub-" +"hosted project, you will need to point to a specific commit/tag/hash of " +"that repository in order to upload your project to PyPI" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:190 +msgid "" +"Below we've created three sets of optional development dependencies " +"named: tests, docs and lint. We've also added a set of feature " +"dependencies." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:213 +msgid "Additional dependency resources" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:215 +msgid "" +"[Learn more: View PyPA's overview of declaring optional " +"dependencies](https://packaging.python.org/en/latest/specifications" +"/declaring-project-metadata/#dependencies-optional-dependencies)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:217 +msgid "" +"[Dependency " +"specifiers](https://packaging.python.org/en/latest/specifications" +"/dependency-specifiers/)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:221 +msgid "Install dependency groups" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:226 +msgid "" +"Diagram showing a ven diagram with three sections representing the " +"dependency groups listed above - docs feature and tests. In the center it" +" says your-package and lists the core dependencies of that package " +"seaborn and numpy. To the right are two arrows. The first shows the " +"command python - m pip install your-package. it them shows how installing" +" your package that way installs only the package and the two core " +"dependencies into a users environment. Below is a second arrow with " +"python -m pip install youPackage[tests]. This leads to an environment " +"with both the package dependencies - your-package, seaborn and numpy and " +"also the tests dependencies including pytest and pytest-cov" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:228 +msgid "" +"When a user installs your package locally using python -m pip install " +"your-package only your package and it's core dependencies get installed. " +"When they install your package `[tests]` pip will install both your " +"package and its core dependencies plus any of the dependencies listed " +"within the tests array of your `[optional.dependencies]` table." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:231 +msgid "Using `python -m pip install` vs. `pip install`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:233 +msgid "" +"In all of the examples in this guide, you will notice we are calling " +"`pip` using the syntax:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:236 +msgid "`python -m pip`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:238 +msgid "" +"Calling pip using `python -m` ensures that the `pip` that you are using " +"to install your package comes from your current active Python " +"environment. We strongly suggest that you use this approach whenever you " +"call `pip` to avoid installation conflicts." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:242 +msgid "" +"To ensure this works as you want it to, activate your package's " +"development environment prior to installing anything using `pip`." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:246 +msgid "" +"You can install development dependencies using the groups that you " +"defined above using the syntax:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:249 +msgid "`python -m pip install \".[docs]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:251 +msgid "Above you install:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:252 +msgid "dependencies needed for your documentation (`docs`)," +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:253 +msgid "required package dependencies in the `dependency` array and" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:254 +msgid "your package" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:256 +msgid "" +"using pip. Below you install your package, required dependencies and " +"optional test dependencies." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:259 +#: ../../package-structure-code/declare-dependencies.md:277 +msgid "`python -m pip install \".[tests]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:261 +msgid "" +"You can install multiple dependency groups in the " +"`[optional.dependencies]` table using:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:263 +msgid "`python -m pip install \".[docs, tests, lint]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:266 +msgid "For zsh shell users" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:270 +msgid "" +"There are different shell applications that you and your package " +"contributors might use." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:271 +msgid "zsh is the shell that comes by default on newer Mac OS computers" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:272 +msgid "Windows users may use a tool such as git bash" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:274 +msgid "" +"Some shells don't support unquoted brackets (`[tests]`) which is why we " +"add quotes to the command in this guide like this:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:279 +msgid "" +"In some cases you may see commands without the quotes in guidebooks or " +"contributing guides like the example below:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:282 +msgid "`python -m pip install your-package[tests]`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:284 +msgid "" +"Calling your-package[tests] without the double quotes will work on some " +"shells *but not all*." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:287 +msgid "Combining sets of dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:289 +msgid "" +"Above we reviewed how to install dependencies from your `pyproject.toml`." +" In some cases you may want to group sets of dependencies like so:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:302 +msgid "" +"The above allows you to install both the tests and docs dependency lists " +"using the command:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:305 +msgid "`python -m pip install \".[dev]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:308 +msgid "When you install dependencies using the above syntax:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:310 +msgid "`python -m pip install \".[tests, docs]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:312 +msgid "`pip` will also install your package and its core dependencies." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:316 +msgid "Where does conda fit in?" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:319 +msgid "" +"The `pyproject.toml` file allows you to list any Python package published" +" on PyPI (or on GitHub/ GitLab) as a dependency. Once you create this " +"file, declare dependencies, [build your package](python-package-" +"distribution-files-sdist-wheel.md) and [publish your package to PyPI" +"](publish-python-package-pypi-conda.md), people can install both your " +"package and all of it's dependencies with one command." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:322 +msgid "`python -m pip install your-package`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:324 +msgid "This works great if your package is pure-python (no other languages used)." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:326 +msgid "" +"Some packages, particularly in the scientific Python ecosystem, require " +"dependencies that are not written in Python. Conda was created to support" +" distribution of tools that have code written in both Python and " +"languages other than Python." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:329 +msgid "Support conda users with environment.yml files" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:331 +msgid "" +"The above workflow assumes that you want to publish your package on PyPI." +" And then you plan to publish to conda-forge (optionally), [by submitting" +" a recipe using grayskull](https://www.pyopensci.org/python-package-guide" +"/package-structure-code/publish-python-package-pypi-conda.html)." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:333 +msgid "" +"If you want to support conda users, you may want to also maintain a conda" +" environment that they can use to install your package. Maintaining a " +"conda environment will also help you test that your package installs as " +"you expect into a conda environment." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:336 +msgid "A note for conda users" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:339 +msgid "" +"If you use a conda environment for developing your tool, keep in mind " +"that when you install your package using `python -m pip install -e .` (or" +" using pip in general), dependencies will be installed from PyPI rather " +"than conda." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:341 +msgid "" +"Thus, if you are running a conda environment, installing your package in " +"\"editable\" mode risks dependency conflicts. This is particularly " +"important if you have a spatial package that requires geospatial system " +"libraries like GDAL or another system-level dependency." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:343 +msgid "" +"Alternatively, you can install your package using `python -m pip install " +"-e . --no-deps` to only install the package. And install the rest of your" +" dependencies using a conda environment file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:346 +msgid "Dependencies in Read the Docs" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:348 +msgid "" +"Now that you have your dependencies specified in your project, you can " +"use them to support other workflows such as publishing to Read the Docs." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:350 +msgid "" +"[Read the Docs](https://readthedocs.org) is a documentation platform with" +" a continuous integration / continuous deployment service that " +"automatically builds and publishes your documentation." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:352 +msgid "" +"If you are using Read the Docs to build your documentation, then you may " +"need to install your dependencies using a **readthedocs.yaml** file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:354 +msgid "" +"Below is an example of installing the **docs** section of your dependency" +" table in the pyproject.toml file within a readthedocs.yaml file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:366 +msgid "Read the Docs and Python packages" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:370 +msgid "" +"[Learn more about creating a `readthedocs.yaml` file here. " +"](https://docs.readthedocs.io/en/stable/config-file/index.html)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:371 +msgid "" +"If you want to install dependencies using Poetry in Read the Docs, [you " +"can learn more here.](https://docs.readthedocs.io/en/stable/build-" +"customization.html#install-dependencies-with-poetry)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:376 +msgid "This is hidden. TO" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Intro" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Python package structure" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "pyproject.toml Package Metadata" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Build Your Package" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Declare dependencies" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Package Build Tools" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Complex Builds" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Package structure & code style" +msgstr "" + +#: ../../package-structure-code/intro.md:177 +msgid "Publish with Conda / PyPI" +msgstr "" + +#: ../../package-structure-code/intro.md:177 +msgid "Package versions" +msgstr "" + +#: ../../package-structure-code/intro.md:177 +msgid "Code style" +msgstr "" + +#: ../../package-structure-code/intro.md:177 +msgid "Publishing a package" +msgstr "" + +#: ../../package-structure-code/intro.md:1 +msgid "Python package structure information" +msgstr "" + +#: ../../package-structure-code/intro.md:3 +msgid "" +"This section provides guidance on your Python package's structure, code " +"formats and style. It also reviews the various packaging tools that you " +"can use to support building and publishing your package." +msgstr "" + +#: ../../package-structure-code/intro.md:7 +msgid "" +"If you are confused by Python packaging, you are not alone! The good news" +" is there are some great modern packaging tools that ensure that you're " +"following best practices. Here, we review tool features and suggest tools" +" that might be best fitted for your workflow." +msgstr "" + +#: ../../package-structure-code/intro.md:19 +msgid "✨ 1. Package file structure ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:23 +msgid "" +"src layout, flat layout and where should tests folders live? No matter " +"what your level of packaging knowledge is, this page will help you decide" +" upon a package structure that follows modern python best practices." +msgstr "" + +#: ../../package-structure-code/intro.md:28 +msgid "✨ 2. Learn about building your package ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:32 +msgid "" +"To publish your Python package on PyPI, you will need to first build it. " +"The act of \"building\" refers to the process of placing your package " +"code and metadata into a format that can be published on PyPI. Learn more" +" about building your Python package." +msgstr "" + +#: ../../package-structure-code/intro.md:41 +msgid "✨ 4. Add metadata ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:45 +msgid "" +"Learn how to add project metadata to your Python package to support both " +"filtering on PyPI and also the metadata that a package installer needs to" +" build and install your package." +msgstr "" + +#: ../../package-structure-code/intro.md:52 +msgid "✨ 3. What Python package tool should you use? ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:56 +msgid "" +"Learn more about the suite of packaging tools out there. And learn which " +"tool might be best for you." +msgstr "" + +#: ../../package-structure-code/intro.md:62 +msgid "✨ 4. Publish to PyPI and Conda ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:66 +msgid "" +"If you have a pure Python package, it's a straight forward process to " +"publish to both PyPI and then a Conda channel such as conda-forge. Learn " +"more here." +msgstr "" + +#: ../../package-structure-code/intro.md:73 +msgid "✨ 5. Setup package versioning ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:77 +msgid "" +"Semver (numeric versioning) and Calver (versioning using the date) are 2 " +"common ways to version a package. Which one should you pick? Learn more " +"here." +msgstr "" + +#: ../../package-structure-code/intro.md:83 +msgid "✨ 6. Code style & linters ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:87 +msgid "" +"Black, blue, flake8, Ruff - which tools can help you ensure your package " +"follows best practices for code format? Learn more about the options and " +"why this is important here." +msgstr "" + +#: ../../package-structure-code/intro.md:95 +msgid "" +"Figure showing a decision tree with the various packaging tool front-end " +"and back-end options." +msgstr "" + +#: ../../package-structure-code/intro.md:97 +msgid "" +"Diagram showing the various front-end build tools that you can select " +"from. See the packaging tools page to learn more about each tool." +msgstr "" + +#: ../../package-structure-code/intro.md:102 +msgid "" +"If you are considering submitting a package for peer review, have a look " +"at the bare-minimum [editor checks](https://www.pyopensci.org/software-" +"peer-review/how-to/editor-in-chief-guide.html#editor-checklist-template) " +"that pyOpenSci performs before a review begins. These checks are useful " +"to explore for both authors planning to submit a package to us for review" +" and for anyone who is just getting started with creating a Python " +"package." +msgstr "" + +#: ../../package-structure-code/intro.md:109 +msgid "What you will learn here" +msgstr "" + +#: ../../package-structure-code/intro.md:111 +msgid "In this section of our Python packaging guide, we:" +msgstr "" + +#: ../../package-structure-code/intro.md:113 +msgid "" +"Provide an overview of the options available to you when packaging your " +"tool." +msgstr "" + +#: ../../package-structure-code/intro.md:115 +msgid "" +"Suggest tools and approaches that both meet your needs and also support " +"existing standards." +msgstr "" + +#: ../../package-structure-code/intro.md:117 +msgid "" +"Suggest tools and approaches that will allow you to expand upon a " +"workflow that may begin as a pure Python tool and evolve into a tool that" +" requires addition layers of complexity in the packaging build." +msgstr "" + +#: ../../package-structure-code/intro.md:120 +msgid "" +"Align our suggestions with the most current, accepted [PEPs (Python " +"Enhancement Protocols)](https://peps.python.org/pep-0000/) and the " +"[Scientific Python community SPECs](https://scientific-" +"python.org/specs/)." +msgstr "" + +#: ../../package-structure-code/intro.md:123 +msgid "" +"In an effort to maintain consistency within our community, we also align " +"with existing best practices being implemented by developers of core " +"Scientific Python packages such as Numpy, SciPy and others." +msgstr "" + +#: ../../package-structure-code/intro.md:127 +msgid "Guidelines for pyOpenSci's packaging recommendations" +msgstr "" + +#: ../../package-structure-code/intro.md:129 +msgid "" +"The flexibility of the Python programming language lends itself to a " +"diverse range of tool options for creating a Python package. Python is so" +" flexible that it is one of the few languages that can be used to wrap " +"around other languages. The ability of Python to wrap other languages is " +"one the reasons you will often hear Python described as a [\"glue\" " +"language](https://numpy.org/doc/stable/user/c-info.python-as-glue.html)\"" +msgstr "" + +#: ../../package-structure-code/intro.md:135 +msgid "" +"If you are building a pure Python package, then your packaging setup can " +"be simple. However, some scientific packages have complex requirements as" +" they may need to support extensions or tools written in other languages " +"such as C or C++." +msgstr "" + +#: ../../package-structure-code/intro.md:139 +msgid "" +"To support the many different uses of Python, there are many ways to " +"create a Python package. In this guide, we suggest packaging approaches " +"and tools based on:" +msgstr "" + +#: ../../package-structure-code/intro.md:142 +msgid "" +"What we think will be best and easiest to adopt for those who are newer " +"to packaging." +msgstr "" + +#: ../../package-structure-code/intro.md:144 +msgid "Tools that we think are well maintained and documented." +msgstr "" + +#: ../../package-structure-code/intro.md:145 +msgid "" +"A shared goal of standardizing packaging approaches across this " +"(scientific) Python ecosystem." +msgstr "" + +#: ../../package-structure-code/intro.md:148 +msgid "" +"Here, we also try to align our suggestions with the most current, " +"accepted [Python community](https://packaging.python.org/en/latest/) and " +"[scientific community](https://scientific-python.org/specs/)." +msgstr "" + +#: ../../package-structure-code/intro.md:151 +msgid "Suggestions in this guide are not pyOpenSci review requirements" +msgstr "" + +#: ../../package-structure-code/intro.md:154 +msgid "" +"The suggestions for package layout in this section are made with the " +"intent of being helpful; they are not specific requirements for your " +"package to be reviewed and accepted into our pyOpenSci open source " +"ecosystem." +msgstr "" + +#: ../../package-structure-code/intro.md:158 +msgid "" +"Please check out our [package scope page](https://www.pyopensci.org" +"/software-peer-review/about/package-scope.html) and [review requirements " +"in our author guide](https://www.pyopensci.org/software-peer-review/how-" +"to/author-guide.html#) if you are looking for pyOpenSci's Python package " +"review requirements!" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:1 +msgid "Publishing Your Package In A Community Repository: PyPI or Anaconda.org" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:5 +msgid "" +"pyOpenSci requires that your package has an distribution that can be " +"installed from a public community repository such as PyPI or a conda " +"channel such as `bioconda` or `conda-forge` on Anaconda.org." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:9 +msgid "" +"Below you will learn more about the various publishing options for your " +"Python package." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:14 +msgid "" +"Installing packages in the same environment using both pip and conda can " +"lead to package conflicts." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:16 +msgid "" +"To minimize conflicts for users who may be using conda (or pip) to manage" +" local environments, consider publishing your package to both PyPI and " +"the conda-forge channel on Anaconda.org." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:18 +msgid "" +"Below you will learn more specifics about the differences between PyPI " +"and conda publishing of your Python package." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:24 +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:6 +msgid "" +"Image showing the progression of creating a Python package, building it " +"and then publishing to PyPI and conda-forge. You take your code and turn " +"it into distribution files (sdist and wheel) that PyPI accepts. then " +"there is an arrow towards the PyPI repository where ou publish both " +"distributions. From PyPI if you create a conda-forge recipe you can then " +"publish to conda-forge." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:26 +msgid "" +"Once you have published both package distributions (the source " +"distribution and the wheel) to PyPI, you can then publish to conda-forge." +" conda-forge requires a source distribution on PyPI in order to build " +"your package on conda-forge. You do not need to rebuild your package to " +"publish to conda-forge." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:29 +msgid "What is PyPI" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:31 +msgid "" +"[PyPI](https://pypi.org/) is an online Python package repository that you" +" can use to both find and install and publish your Python package. There " +"is also a test PyPI repository where you can test publishing your package" +" prior to the final publication on PyPI." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:36 +msgid "" +"Many if not most Python packages can be found on PyPI and are thus " +"installable using `pip`." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:38 +msgid "" +"The biggest different between using pip and conda to install a package is" +" that conda can install any package regardless of the language(s) that it" +" is written in. Whereas `pip` can only install Python packages." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:43 +msgid "Click here for a tutorial on publishing your package to PyPI." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:52 +msgid "" +"On the package build page, we discussed the [two package distribution " +"types that you will create when making a Python package](python-package-" +"distribution-files-sdist-wheel): SDist (packaged as a .tar.gz or .zip) " +"and Wheel (.whl) which is really a zip file. Both of those file " +"\"bundles\" will be published on PyPI when you use [a standard build tool" +"](python-package-build-tools) to build your package." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:60 +msgid "What is conda and Anaconda.org?" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:62 +msgid "" +"conda is an open source package and environment management tool. conda " +"can be used to install tools from the [Anaconda " +"repository](https://repo.anaconda.com/)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:66 +msgid "" +"Anaconda.org contains public and private repositories for packages. These" +" repositories are known as channels (discussed below)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:69 +msgid "A brief history of conda's evolution" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:72 +msgid "" +"The conda ecosystem evolved years ago to provide support for, and " +"simplify the process of, managing software dependencies in scientific " +"Python projects." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:76 +msgid "" +"Many of the core scientific Python projects depend upon or wrap around " +"tools and extensions that are written in other languages, such as C++. In" +" the early stages of the scientific ecosystem's development, these non-" +"Python extensions and tools were not well supported on PyPI, making " +"publication difficult. In recent years there is more support for complex " +"builds that allow developers to bundle non-Python code into a Python " +"distribution using the [wheel distribution format](python-wheel)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:78 +msgid "" +"Conda provides a mechanism to manage these dependencies and ensure that " +"the required packages are installed correctly." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:82 +msgid "" +"While conda was originally created to support Python packages, it is now " +"used across all languages. This cross-language support makes it easier " +"for some packages to include and have access to tools written in other " +"languages, such as C/C++ (gdal), Julia, or R. Creating an environment " +"that mixes all of these packages is usually easier and more consistent " +"with full-fledged package managers like conda." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:90 +msgid "conda channels" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:92 +msgid "" +"conda built packages are housed within repositories that are called " +"channels. The conda package manager can install packages from different " +"channels." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:95 +msgid "" +"There are several core public channels that most people use to install " +"packages using conda, including:" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:98 +msgid "" +"**defaults:** this is a channel managed by Anaconda. It is the version of" +" the Python packages that you will install if you install the Anaconda " +"Distribution. Anaconda (the company) decides what packages live on the " +"`defaults` channel." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:99 +msgid "" +"[**conda-forge:**](https://anaconda.org/conda-forge) this is a community-" +"driven channel that focuses on scientific packages. This channel is ideal" +" for tools that support geospatial data. Anyone can publish a package to " +"this channel." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:100 +msgid "" +"[**bioconda**](https://anaconda.org/bioconda): this channel focuses on " +"biomedical tools." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:102 +msgid "" +"**conda-forge** emerged as many of the scientific packages did not exist " +"in the `defaults` Anaconda channel." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:107 +msgid "" +"Graphic with the title Python package repositories. Below it says " +"Anything hosted on PyPI can be installed using pip install. Packaging " +"hosted on a conda channel can be installed using conda install. Below " +"that there are two rows. the top row says conda channels. next to it are " +"three boxes one with conda-forge, community maintained; bioconda and then" +" default - managed by the anaconda team. Below that there is a row that " +"says PyPI servers. PyPI - anyone can publish to PyPI. and test PyPI. a " +"testbed server for you to practice." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:109 +msgid "" +"Conda channels represent various repositories that you can install " +"packages from. Because conda-forge is community maintained, anyone can " +"submit a recipe there. PyPI is also a community maintained repository. " +"Anyone can submit a package to PyPI and test PyPI. Unlike conda-forge " +"there are no manual checks of packages submitted to PyPI." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:113 +msgid "conda channels, PyPI, conda, pip - Where to publish your package" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:115 +msgid "" +"You might be wondering why there are different package repositories that " +"can be used to install Python packages." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:118 +msgid "" +"And more importantly you are likely wondering how to pick the right " +"repository to publish your Python package." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:121 +msgid "The answer to both questions relates dependency conflicts." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:125 +msgid "" +"Image showing an XKCD comic that shows a web of Python environments and " +"tools and installations. At the bottom is says - My python environment " +"has become so degraded that my laptop has been declared a superfund site." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:127 +msgid "" +"Installing Python and Python packages from different repositories can " +"lead to environment conflicts where a version of on package doesn't work " +"with a version of another package. To keep your environments clean and " +"working, it's best to install packages from the same repository. So use " +"pip to install everything. Or use conda. If you can, try to avoid " +"installing package from both pip and conda into the same environment." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:135 +msgid "Managing Python package dependency conflicts" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:137 +msgid "" +"Python environments can encounter conflicts because Python tools can be " +"installed from different repositories. Broadly speaking, Python " +"environments have a smaller chance of dependency conflicts when the tools" +" are installed from the same package repository. Thus environments that " +"contain packages installed from both pip and conda are more likely to " +"yield dependency conflicts." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:144 +msgid "" +"Similarly installing packages from the default anaconda package mixed " +"with the conda-forge channel can also lead to dependency conflicts." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:146 +msgid "" +"Many install packages directly from conda `defaults` channel. However, " +"because this channel is managed by Anaconda, the packages available on it" +" are limited to those that Anaconda decides should be core to a stable " +"installation. The conda-forge channel was created to complement the " +"`defaults` channel. It allows anyone to submit a package to be published " +"in the channel . Thus, `conda-forge` channel ensures that a broad suite " +"of user-developed community packages can be installed from conda." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:150 +msgid "" +"Take-aways: If you can, publish on both PyPI and conda-forge to " +"accommodate more users of your package" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:152 +msgid "" +"The take-away here for maintainers is that if you anticipate users " +"wanting to use conda to manage their local environments (which many do), " +"you should consider publishing to both PyPI and the conda-forge channel " +"(_more on that below_)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:157 +msgid "Additional resources" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:158 +msgid "" +"[learn more about why conda-forge was created, here](https://conda-" +"forge.org/docs/user/introduction.html)" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:160 +msgid "" +"[To learn more about conda terminology, check out their " +"glossary.](https://docs.conda.io/projects/conda/en/latest/glossary.html )" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:165 +msgid "How to submit to conda-forge" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:167 +msgid "" +"While pyOpenSci doesn't require you to add your package to conda-forge, " +"we encourage you to consider doing so!" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:170 +msgid "" +"Once your package is on PyPI, the process to add your package to conda-" +"forge is straight forward to do. [You can follow the detailed steps " +"provided by the conda-forge maintainer team.](https://conda-" +"forge.org/docs/maintainer/adding_pkgs.html)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:175 +msgid "Click here for a tutorial on adding your package to conda-forge." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:182 +msgid "If you want a step by step tutorial, click here." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:185 +msgid "" +"Once your package is added, you will have a feedstock repository on " +"GitHub with your packages name" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:188 +msgid "" +"[Here is an example conda-forge feedstock for the pyOpenSci approved " +"package - movingpandas](https://github.com/conda-forge/movingpandas-" +"feedstock)" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:191 +msgid "Maintaining your conda-forge package repository" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:193 +msgid "" +"Once your package is on the conda-forge channel, maintaining it is " +"simple. Every time that you push a new version of your package to PyPI, " +"it will kick off a continuous integration build that updates your package" +" in the conda-forge repository. Once that build is complete, you will get" +" a notification to review the update." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:199 +msgid "" +"You can merge the pull request for that update once you are happy with " +"it. A ready-to-merge PR usually means ensuring that your project's " +"dependencies (known as runtime requirements) listed in the updated YAML " +"file found in the pull request match the PyPI metadata of the new " +"release." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:1 +msgid "Use a pyproject.toml file for your package configuration & metadata" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:12 +msgid "Important pyproject.toml take aways" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:16 +msgid "" +"There are only two tables that are required for an installable Python " +"package: **[build-system]** and **[project]**. The **[project]** table " +"stores your package's metadata." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:17 +msgid "" +"There are only two _required_ fields in the **[project]** table: " +"**name=** and **version=**." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:18 +msgid "" +"We suggest you add additional metadata to your `pyproject.toml` file as " +"it will make it easier for users to find your project on PyPI." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:19 +msgid "" +"When you are adding classifiers to the [project] table, only use valid " +"values from [PyPI’s classifier page](https://PyPI.org/classifiers/). An " +"invalid value here will raise an error when you build your package or " +"publish to PyPI." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:20 +msgid "" +"There is no specific order for tables in the `pyproject.toml` file. " +"However fields need to be placed within the correct table sections. For " +"example `requires =` always need to be associated with the **[build-" +"system]** table." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:21 +msgid "" +"**python-requires**: is important to have in your `pyproject.toml` file " +"as it helps pip install your package." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:27 +msgid "when these are published, remove this todo" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:36 +msgid "" +"Need help creating your pyproject.toml file? This tutorial will walk you" +" through the process." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:50 +msgid "" +"Click here if need help migrating from setup.py/setup.cfg to " +"pyproject.toml" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:60 +msgid "About the pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:62 +msgid "" +"Every modern Python package should include a `pyproject.toml` file. If " +"your project is pure Python and you're using a `setup.py` or `setup.cfg` " +"file to describe its metadata, you should consider migrating your " +"metadata and build information to a `pyproject.toml` file." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:64 +msgid "" +"If your project isn’t pure-python, you might still require a `setup.py` " +"file to build the non Python extensions. However, a `pyproject.toml` file" +" should still be used to store your project’s metadata." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:66 +msgid "What happened to setup.py & how do i migrate to pyproject.toml?" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:68 +msgid "" +"Prior to August 2017, Python package metadata was stored either in the " +"`setup.py` file or a `setup.cfg` file. In recent years, there has been a " +"shift to storing Python package metadata in a much more user-readable " +"`pyproject.toml` format. Having all metadata in a single file:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:70 +msgid "simplifies package management," +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:71 +msgid "" +"allows you to use a suite of different [build " +"backends](https://www.pyopensci.org/python-package-guide/package-" +"structure-code/python-package-build-tools.html#build-back-ends) such as " +"(flit-core, hatchling, pdm-build), and" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:72 +msgid "aligns with modern best practices." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:79 +msgid "" +"The standard file that Python packages use to [specify build requirements" +" and metadata is called a " +"**pyproject.toml**](https://packaging.python.org/en/latest/specifications" +"/declaring-project-metadata/). Adding metadata, build requirements and " +"package dependencies to a **pyproject.toml** file replaces storing that " +"information in a setup.py or setup.cfg file." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:84 +msgid "About the .toml format" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:86 +msgid "" +"The **pyproject.toml** file is written in [TOML (Tom's Obvious, Minimal " +"Language) format](https://toml.io/en/). TOML is an easy-to-read structure" +" that is founded on key/value pairs. Each section in the " +"**pyproject.toml** file contains a `[table identifier]`. Below that table" +" identifier are key/value pairs that support configuration for that " +"particular table." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:90 +msgid "Below `[build-system]` is considered a table in the toml language." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:91 +msgid "Within the `build-system` table below `requires =` is a key." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:92 +msgid "" +"The associated value for `requires` is an array containing the value " +"`\"hatchling\"`." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:100 +msgid "How the pyproject.toml is used when you build a package" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:104 +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:81 +msgid "" +"When you publish to PyPI, you will notice that each package has metadata " +"listed. Let’s have a look at [xclim](https://pypi.org/project/xclim/), " +"one of our [pyOpenSci packages](https://www.pyopensci.org/python-" +"packages.html). Notice that on the PyPI landing page you see some " +"metadata about the package including python, maintainer information and " +"more. PyPI is able to populate this metadata because it was defined using" +" correct syntax and classifiers by Xclim's maintainers, [pyproject.toml " +"file](https://github.com/Ouranosinc/xclim/blob/master/pyproject.toml). " +"This metadata when the xclim package is built, is translated into a " +"distribution file that allows PyPI to read the metadata and print it out " +"on their website." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:106 +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:83 +msgid "" +"Image showing the left side bar of PyPI for the package xclim. The " +"section at the top says Classifier. Below there is a list of items " +"including Development status, intended audience, License, natural " +"language, operating system, programming language and topic. Below each of" +" those sections are various classifier options.\" width=\"300px\">" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:111 +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:88 +msgid "" +"When you add the classifier section to your pyproject.toml and your " +"package is built, the build tool organizes the metadata into a format " +"that PyPI can understand and represent on your PyPI landing page. These " +"classifiers also allow users to sort through packages by version of " +"python they support, categories and more." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:116 +msgid "Benefits of using a pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:118 +msgid "" +"Including your package's metadata in a separate human-readable " +"**pyproject.toml** format also allows someone to view the project's " +"metadata in a GitHub repository." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:126 +msgid "Setup.py is still useful for complex package builds" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:130 +msgid "" +"Using **setup.py** to manage package builds and metadata [can cause " +"problems with package " +"development](https://blog.ganssle.io/articles/2021/10/setup-py-" +"deprecated.html). In some cases where a Python package build is complex, " +"a **setup.py** file may be required. While this guide will not cover " +"complex builds, we will provide resources working with complex builds in " +"the future." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:136 +msgid "Optional vs. Required pyproject.toml file fields" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:138 +msgid "" +"When you create your `pyproject.toml` file, there are numerous metadata " +"fields that you can use. Below we suggest specific fields to get you " +"started that support publication on PyPI and users finding your package." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:140 +msgid "" +"[An overview of all of the project metadata elements can be found " +"here.](https://packaging.python.org/en/latest/specifications/core-" +"metadata/#project-url-multiple-use)" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:142 +msgid "Required fields for the [project] table" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:144 +msgid "" +"As mentioned above, your pyproject.toml file needs to have a **name** and" +" **version** field in order to properly build your package:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:146 +msgid "Name: This is the name of your project provided as a string" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:147 +msgid "" +"Version: This is the version of your project. If you are using a scm tool" +" for versioning (using git tags to determine versions), then the version " +"may be dynamic (more on that below)." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:149 +msgid "Optional fields to include in the `[project]` table" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:151 +msgid "" +"We strongly suggest that you also add the metadata keys below as they " +"will help users finding your package on PyPI. These fields will make it " +"clear how your package is structured, what platforms you support and what" +" dependencies your package requires." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:156 +msgid "**Description:** this is a short one-line description of your package." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:157 +msgid "" +"**Readme:** A link to your README.md file is used for the long long-" +"description. This information will be published on your packages PyPI " +"landing page." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:158 +msgid "" +"**Requires-python** (used by pip): this is a field that is used by pip. " +"Here you tell the installer whether you are using Python 2.x or 3.x. Most" +" projects will be using 3.x." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:159 +msgid "**License:** the license you are using" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:160 +msgid "" +"**Authors:** these are the original authors of the package. Sometimes the" +" authors are different from the maintainers. Other times they might be " +"the same." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:161 +msgid "" +"**Maintainers:** you can choose to populate this or not. You can populate" +" this using a list with a sub element for each author or maintainer name," +" email" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:169 +msgid "" +"**dependencies:** dependencies are optional but we strongly suggest you " +"include them in your pyproject.toml. Dependencies will be installed by " +"pip when your project is installed creating a better user-experience." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:171 +msgid "" +"**`[project.optional-dependencies]`:** the optional or development " +"dependencies will be installed if someone runs `python -m pip install " +"projectname[dev]`. This is a nice way to include your development " +"dependencies for users who may wish to contribute to your project." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:173 +msgid "" +"**keywords:** These are the keywords that will appear on your PyPI " +"landing page. Think of them as words that people might use to search for " +"your package." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:174 +msgid "" +"**classifiers:** The classifiers section of your metadata is also " +"important for the landing page of your package in PyPI and for filtering " +"of packages in PyPI. A list of [all options for classifiers can be found " +"her](https://PyPI.org/classifiers/)e. Some of the classifiers that you " +"should consider including" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:175 +msgid "Development Status" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:176 +msgid "Intended Audience" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:177 +msgid "Topic" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:178 +msgid "LIcense" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:179 +msgid "Programming language" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:181 +msgid "Advanced options in the pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:183 +msgid "The examples at the bottom of this page contain ..." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:185 +msgid "" +"**`[project.scripts]` (Entry points):** Entry points are optional. If you" +" have a command line tool that runs a specific script hosted in your " +"package, you may include an entry point to call that script directly at " +"the command line (rather than at the Python shell)." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:186 +msgid "" +"Here is an example of[ a package that has entry point " +"script](https://github.com/pyOpenSci/update-web-" +"metadata/blob/main/pyproject.toml#L60)s. Notice that there are several " +"core scripts defined in that package that perform sets of tasks. " +"pyOpenSci is using those scripts to process their metadata." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:187 +msgid "" +"**Dynamic Fields:** if you have fields that are dynamically populated. " +"One example of this is if you are using scm / version control based " +"version with tools like `setuptooms_scm`, then you might use the dynamic " +"field. such as version (using scm) **dynamic = [\"version\"]**" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:189 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Add dependencies to your pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:191 +msgid "" +"The pyproject.toml file can also be used as a replacement for the " +"requirements.txt file which has been traditionally used to store " +"development dependencies such as pytest, code formatters such as Black " +"and documentation tools such as sphinx." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:193 +msgid "" +"To add dependencies to your build, add a `[project.optional-" +"dependencies]` table to your pyproject.toml file." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:195 +msgid "Then specify dependency groups as follows:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:202 +msgid "Following the above example, you install dependencies like this:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:204 +msgid "`python -m pip install -e .[tests]`" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:206 +msgid "" +"The above will install both your package in editable mode and all of the " +"dependencies declared in the tests section of your `[project.optional-" +"dependencies]` table." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:208 +msgid "To install all dependencies and also your package, you'd use:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:210 +msgid "`python -m pip install -e .[tests,lint,docs]`" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:212 +msgid "Recursive dependencies" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:216 +msgid "" +"You can also setup sets of recursive dependencies. [See this blog post " +"for more.](https://hynek.me/articles/python-recursive-optional-" +"dependencies/)" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:219 +msgid "Example pyproject.toml for building using hatchling" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:221 +msgid "" +"Below is an example build configuration for a Python project. This " +"example package setup uses **hatchling** to build the [package's sdist " +"and wheels](python-package-distribution-files-sdist-wheel)." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:229 +msgid "Notice that dependencies are specified in this file." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:231 +msgid "Example pyproject.toml for building using setuptools" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:233 +msgid "" +"The package metadata including authors, keywords, etc is also easy to " +"read. Below you can see the same TOML file that uses a different build " +"system (setuptools). Notice how simple it is to swap out the tools needed" +" to build this package!" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:237 +msgid "In this example package setup you use:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:239 +msgid "" +"**setuptools** to build the [package's sdist and wheels](python-package-" +"distribution-files-sdist-wheel)" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:240 +msgid "" +"**setuptools_scm** to manage package version updates using version " +"control tags" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:242 +msgid "" +"In the example below `[build-system]` is the first table of values. It " +"has two keys that specify the build backend API and containing package:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:245 +msgid "`requires =`" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:246 +msgid "`build-back-end =`" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:253 +msgid "" +"[Click here to read about our packaging build tools including PDM, " +"setuptools, Poetry and Hatch.](/package-structure-code/python-package-" +"build-tools)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:1 +msgid "Python Packaging Tools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:3 +msgid "Tools for building your package" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:5 +msgid "" +"There are a several different build tools that you can use to [create " +"your Python package's _sdist_ and _wheel_ distributions](python-package-" +"distribution-files-sdist-wheel). Below, we discuss the features, benefits" +" and limitations of the most commonly used Python packaging tools. We " +"focus on pure-python packages in this guide. However, we also highlight " +"tools that currently support packages with C/C++ and other language " +"extensions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:13 +msgid "" +"Decision tree diagram showing the various front and back end packaging " +"tools. You can decide what packaging tool to use by thinking about what " +"features you need. PDM and Hatch are currently the most flexible tools " +"as they also using different build back-ends. As such currently PDM and " +"Hatch are the tools we think beginners might appreciate most with Poetry " +"being a close second. Poetry is nice for pure Python projects." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:15 +msgid "" +"Diagram showing the different front end build tools available to use in " +"the Python package ecosystem that you can select from. We selected tools " +"to include in this diagram based upon the PyPI survey which helped us " +"understand the most populate tools in the ecosystem. Each tool has " +"different features as highlighted below." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:18 +msgid "" +"If you want to know more about Python packages that have extensions " +"written in other languages, [check out the page on complex package builds" +".](complex-python-package-builds)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:21 +msgid "Tools that we review here" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:23 +msgid "" +"In this section we have selected tools that were returned as the most " +"popular packaging tools in the PyPA survey. You will learn more about the" +" following tools on this page:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:27 +msgid "" +"[Twine](https://twine.readthedocs.io/en/stable/), [Build](https://pypa-" +"build.readthedocs.io/en/stable/) + " +"[setuptools](https://setuptools.pypa.io/en/latest/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:28 +msgid "[Flit](https://flit.pypa.io/en/stable/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:29 +msgid "[Hatch](https://hatch.pypa.io/latest/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:30 +msgid "[PDM](https://pdm.fming.dev/latest/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:31 +msgid "[Poetry](https://python-poetry.org/docs/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:33 +msgid "Summary of tools Hatch vs. PDM vs. Poetry (and setuptools)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:35 +msgid "If you are looking for a quick summary, read below." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:37 +msgid "" +"In general, any modern tool that you select from this page will be great " +"to build your package. Selecting a tool comes down to the features that " +"you are looking for in your workflow." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:38 +msgid "" +"We suggest that beginners start with a modern workflow tool like PDM as " +"opposed to navigating the complexities of setuptools." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:39 +msgid "" +"If you are going to use Poetry (it is the most popular tool and does have" +" the best documentation) beware of the upper bounds dependency additions " +"and consider overriding dependencies when you add them. If you do that " +"Poetry will work well for pure-python builds! Poetry also has an active " +"discord where you can ask questions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:41 +msgid "Below are some features that Hatch and PDM offer that Poetry does not." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:43 +msgid "PDM:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:45 +msgid "" +"Supports other back-ends making it ideal for builds that are not pure " +"Python. This means PDM is a great option for both pure python and more " +"complex Python builds as it supports meson-python and other build " +"backends." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:46 +msgid "Offers flexibility in dependency management which we like" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:47 +msgid "Offers lock files if you need them" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:49 +msgid "Hatch:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:51 +msgid "" +"Offers matrix environment management that allows you to run tests across " +"Python versions. If this feature is important to you, then Hatch is a " +"clear winner." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:52 +msgid "" +"Offers a Nox / Make file like tool to streamline your build workflow. If " +"you are looking to reduce the number of tools in your workflow, Hatch " +"might be for you." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:55 +msgid "Build front-end vs. build back-end tools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:57 +msgid "" +"To better understand your options, when it comes to building a Python " +"package, it's important to first understand the difference between a " +"build tool front-end and build back-end." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:62 +msgid "Build back-ends" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:64 +msgid "" +"Most packaging tools have a back-end build tool that builds you package " +"and creates associated [(sdist and wheel) distribution files](python-" +"package-distribution-files-sdist-wheel). Some tools, such as **Flit**, " +"only support pure-Python package builds. A pure-Python build refers to a " +"package build that does not have extensions that are written in another " +"programming language (such as `C` or `C++`)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:71 +msgid "" +"Other packages that have C and C++ extensions (or that wrap other " +"languages such as fortran) require additional code compilation steps when" +" built. Back-ends such as **setuptools.build**, **meson.build** and " +"**scikit-build** support complex builds with custom steps. If your build " +"is particularly complex (i.e. you have more than a few `C`/`C++` " +"extensions), then we suggest you use **meson.build** or **scikit-build**." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:77 +msgid "Python package build front-ends" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:79 +msgid "" +"A packaging front-end tool refers to a tool that makes it easier for you " +"to perform common packaging tasks using similar commands. These tasks " +"include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:82 +msgid "" +"[Build your packages (create the sdist and wheel distributions)](python-" +"package-distribution-files-sdist-wheel)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:83 +msgid "" +"Installing your package in a development mode (so it updates when you " +"update your code)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:84 +msgid "Publishing to PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:85 +msgid "Running tests" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:86 +msgid "Building documentation" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:87 +msgid "" +"Managing an environment or multiple environments in which you need to run" +" tests and develop your package" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:89 +msgid "" +"There are several Python packaging tools that you can use for pure Python" +" builds. Each front-end tool discussed below supports a slightly " +"different set of Python packaging tasks." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:93 +msgid "" +"For instance, you can use the packaging tools **Flit**, **Hatch** or " +"**PDM** to both build and publish your package to PyPI. However while " +"**Hatch** and **PDM** support versioning and environment management, " +"**Flit** does not. If you want a tool that supports dependency locking, " +"you can use **PDM** or **Poetry** but not **Hatch**. If you only need to " +"build your package's sdist and wheel distribution files, then you can " +"stick with PyPA's Build. You'd then use Twine to publish to PyPI." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:100 +msgid "" +"If you are using **Setuptools**, there is no default user-friendly build " +"front-end that performs multiple tasks. You will need to use **build** to" +" build your package and **twine** to publish to PyPI." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:103 +msgid "Example build steps that can be simplified using a front-end tool" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:105 +msgid "" +"Below, you can see how a build tool streamlines your packaging " +"experience. Example to build your package with **Hatch**:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:115 +msgid "Example build steps using the **setuptools** back-end and **build**:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:125 +msgid "Choosing a build back-end" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:127 +msgid "" +"Most front-end packaging tools have their own back-end build tool. The " +"build tool creates your package's (sdist and wheel) distribution files. " +"For pure Python packages, the main difference between the different build" +" back-ends discussed below is:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:132 +msgid "" +"How configurable they are - for example, do they allow you to add build " +"steps that support non python extensions?" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:133 +msgid "" +"How much you need to configure them to ensure the correct files are " +"included in your sdist and wheel distributions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:135 +msgid "Build back-end support for non pure-python packages" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:137 +msgid "" +"It is important to note that some build back-ends, such as **Flit-core**," +" only support pure Python builds. Other back-ends support C and C++ " +"extensions as follows:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:140 +msgid "setuptools supports builds using C / C++ extensions" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:141 +msgid "" +"Hatchling (hatch's back-end) supports C / C++ extensions via plugins that" +" the developer creates to customize a build" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:142 +msgid "PDM's back-end supports C / C++ extensions by using setuptools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:143 +msgid "" +"Poetry's back-end supports C/C++ extensions however this functionality is" +" currently undocumented. As such we don't recommend using Poetry for " +"complex or non pure Python builds until it is documented." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:145 +msgid "" +"While we won't discuss more complex builds below, we will identify which " +"tools have documented support for C / C++ extensions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:148 +msgid "An ecosystem of Python build tools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:150 +msgid "" +"Below we introduce several of the most commonly used Python packaging " +"build front-end tools. We highlight the features that each tool offers as" +" a way to help you decide what tool might be best for your workflow." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:154 +msgid "We do not suggest using setuptools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:157 +msgid "" +"We suggest that you pick one of the modern tools listed above rather than" +" setuptools because setuptools will require some additional knowledge to " +"set up correctly." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:161 +msgid "" +"We review setuptools as a back-end because it is still popular. However " +"it is not the most user friendly option." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:165 +msgid "" +"The most commonly used tools in the ecosystem are setuptools back-end " +"(with build) and Poetry (a front end tool with numerous features and " +"excellent documentation)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:171 +msgid "" +"Graph showing the results of the 2022 PyPA survey of Python packaging " +"tools. On the x axis is percent response and on the y axis are the tools." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:173 +msgid "" +"The Python developers survey results (n=>8,000 PyPI users) show " +"setuptools and poetry as the most commonly used Python packaging tools. " +"The core tools that we've seen being used in the scientific community are" +" included here. [You can view the full survey results by clicking " +"here.](https://drive.google.com/file/d/1U5d5SiXLVkzDpS0i1dJIA4Hu5Qg704T9/view)" +" NOTE: this data represent maintainers across domains and is likely " +"heavily represented by those in web development. So this represents a " +"snapshot across the broader Python ecosystem." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:176 +msgid "Chose a build workflow tool" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:178 +msgid "The tools that we review below include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:180 +msgid "Twine, Build + setuptools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:181 +#: ../../package-structure-code/python-package-build-tools.md:291 +msgid "Flit" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:182 +#: ../../package-structure-code/python-package-build-tools.md:331 +msgid "Hatch" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:183 +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:230 +msgid "PDM" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:184 +#: ../../package-structure-code/python-package-build-tools.md:374 +msgid "Poetry" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:186 +msgid "" +"When you are selecting a tool, you might consider this general workflow " +"of questions:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:189 +msgid "" +"**Is your tool pure python? Yes?** You can use any tool that you wish! " +"Pick the tool that has the features that you want to use in your build " +"workflow. We suggest:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:191 +msgid "Flit, Hatch, PDM or Poetry (read below for more)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:193 +msgid "" +"**Does your tool have a few C or C++ extensions?** Great, we suggest " +"using **PDM** for the time being. It is the only tool in the list below " +"that has both documented workflow to support such extensions and support " +"for other back-ends in the case that build hooks are not enough for your " +"workflow. PDM supports other back-ends such as scikit-build and meson-" +"python that will allow you to fully customize your package's build." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:197 +msgid "" +"NOTE: You can also use Hatch for non pure python builds. Hatch, similar " +"to PDM, allows you to write your own build hooks or plugins to support " +"custom build steps. But currently, hatch does not support other build " +"back ends. Many of the core scientific packages are moving to meson-" +"python to build their packages. Thus, we appreciate that PDM can work " +"with meson-python specifically." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:199 +msgid "Python packaging tools summary" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:201 +msgid "" +"Below, we summarize features offered by the most popular build front end " +"tools. It is important to keep in mind that these front-end tools remove " +"the need to use other core tools in your workflow. For example if you use" +" setuptools, you will need to also use Build and Twine to build your " +"package and publish to PyPI. But if you use Poetry, Hatch or PDM you can " +"do all of those things using the same tool (e.g. `hatch build`, `hatch " +"publish` or `pdm build`, `pdm publish`)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:204 +msgid "" +"Note that because setuptools does not offer a front-end interface, it is " +"not included in the table." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:208 +msgid "Package tool features table" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Feature, Flit, Hatch, PDM, Poetry" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Default Build Back-end" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Flit-core" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "hatchling" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Poetry-core" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Use Other Build Backends" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "✖" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "✅" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Dependency management" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Publish to PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Version Control based versioning (using `git tags`)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Version bumping" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Environment Management" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "More than one maintainer? (bus factor)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:225 +msgid "Notes:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:227 +msgid "_Hatch plans to support dependency management in the future_" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:228 +msgid "" +"Poetry supports semantic versioning. Thus, it will support version " +"bumping following commit messages if you use a tool such as Python " +"Semantic Release" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:232 +msgid "" +"[PDM is a Python packaging and dependency management " +"tool](https://pdm.fming.dev/latest/). PDM supports builds for pure Python" +" projects. It also provides multiple layers of support for projects that " +"have C and C++ extensions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:236 +msgid "PDM support for C and C++ extensions" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:238 +msgid "" +"PDM supports using the PDM-back-end and setuptools at the same time. This" +" means that you can run setuptools to compile and build C extensions. " +"PDM's build back-end receives the compiled extension files (.so, .pyd) " +"and packages them with the pure Python files." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:244 +msgid "PDM Features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Feature, PDM, Notes" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"When you setup PDM it allows you to select one of several build back ends" +" including: PDM-core, flit-core and hatchling. PDM also can work with " +"Meson-Python which supports move complex python builds." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Dependency specifications" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM has flexible support for managing dependencies. PDM defaults to " +"using an open bound (e.g. `requests >=1.2`) approach to dependencies. " +"However you can [customize how you want to add dependencies in case you " +"prefer another approach such as that of Poetry which uses an upper bound " +"limit](https://pdm.fming.dev/latest/usage/dependency/#about-update-" +"strategy).**" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Environment lock files" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM and Poetry are currently the only tools that create environment lock " +"files. Lock files are often most useful to developers creating web apps " +"where locking the environment is critical for consistent user experience." +" For community-used packages, you will likely never want to use a lock " +"file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Environment management" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM provides environment management support. It supports Python virtual " +"environments, conda and a local `__pypackages__` environment which is a " +"newer option in the Python ecosystem. No extensions are needed for this " +"support." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Select your environment type on install" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"When you run `PDM init`, PDM will discover environments that are already " +"on your system and allow you to select one to use for your project." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "PDM supports publishing to both test PyPI and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Version Control based versioning" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM has a setuptools_scm like tool built into it which allows you to use " +"dynamic versioning that rely on git tags." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM supports you bumping the version of your package using standard " +"semantic version terms patch; minor; major" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Follows current packaging standards" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM supports current packaging standards for adding metadata to the " +"**pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Install your package in editable mode" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "PDM supports installing your package in editable mode." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Build your sdist and wheel distributions" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"Similar to all of the other tools PDM builds your packages sdist and " +"wheel files for you." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:264 +msgid "PDM vs. Poetry" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:265 +msgid "" +"The functionality of PDM is similar to Poetry. However, PDM also offers " +"additional, documented support for C extensions and version control based" +" versioning. As such, PDM is preferred for those working on non pure-" +"Python packages." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:269 +msgid "" +"If you are deciding between the Poetry and PDM, a smaller difference is " +"the default way that dependencies are added to your pyproject.toml file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:271 +msgid "" +"Poetry by default follows strict semantic versioning adding dependencies " +"to your pyproject.toml file [using an upper bounds constraint " +"(`^`)](https://python-poetry.org/docs/dependency-specification/#version-" +"constraints). Upper bounds lock means that Poetry will never bump a " +"dependency to the next major version (i.e. from 1.2 to 2.0). However, you" +" can tell Poetry to use an open bound approach by explicitly adding the " +"package like this: `poetry add requests >= 1.2` rather than just using " +"`poetry add requests` which will result in a upper bound locked (ie Upper" +" bound locks means that requests 2.0 could never be installed even if it " +"came out and your package could benefit from it)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:272 +msgid "" +"PDM defaults to open-bounds (`>=`) dependency additions which is the " +"preferred approach in the scientific python ecosystem. However, PDM also " +"allows you to specify the way dependencies are added by default. As such," +" you can also specify upper-bounds (`^`) using PDM if require that " +"approach." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:274 +msgid "" +"Finally there are some nuanced differences in how both tools create lock " +"files which we will not go into detail about here." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:277 +msgid "Challenges with PDM" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:279 +msgid "" +"PDM is a full-featured packaging tool. However it is not without " +"challenges:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:281 +msgid "" +"Its documentation can be confusing, especially if you are new to " +"packaging. For example, PDM doesn't provide an end to end beginning " +"workflow in its documentation." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:283 +msgid "" +"PDM also only has one maintainer currently. We consider individual " +"maintainer teams to be a potential risk. If the maintainer finds they no " +"longer have time to work on the project, it leaves users with a gap in " +"support. Hatch and Flit also have single maintainer teams." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:288 +msgid "" +"[You can view an example of a package that uses PDM " +"here](https://github.com/pyOpenSci/examplePy/tree/main/example4_pdm). The" +" README file for this directly provides you with an overview of what the " +"PDM command line interface looks like when you use it." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:293 +msgid "" +"[Flit is a no-frills, streamlined packaging " +"tool](https://flit.pypa.io/en/stable/) that supports modern Python " +"packaging standards. Flit is a great choice if you are building a basic " +"package to use in a local workflow that doesn't require any advanced " +"features. And if your package structure is already created. More on that " +"below." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:297 +msgid "Flit Features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Feature, Flit, Notes" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Publish to PyPI and test PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Flit supports publishing to both test PyPI and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Helps you add metadata to your **pyproject.toml** file" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "" +"Flit does support adding metadata to your **pyproject.toml** file " +"following modern packaging standards." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "" +"Flit supports current packaging standards for adding metadata to the " +"**pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Flit supports installing your package in editable mode.**" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Flit can be used to build your packages sdist and wheel distributions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:311 +msgid "" +"NOTE: _If you are using the most current version of pip, it supports both" +" a symlink approach `flit install -s` and `python -m pip install -e .`_" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:313 +msgid "Learn more about flit" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:314 +msgid "[Why use flit?](https://flit.pypa.io/en/stable/rationale.html)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:317 +msgid "Why you might not want to use Flit" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:319 +msgid "" +"Because Flit is no frills, it is best for basic, quick builds. If you are" +" a beginner you may want to select Hatch or PDM which will offer you more" +" support in common operations." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:323 +msgid "You may NOT want to use flit if:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:325 +msgid "" +"You want to setup more advanced version tracking and management (using " +"version control for version bumping)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:326 +msgid "" +"You want a tool that handles dependency versions (use PDM or Poetry " +"instead)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:327 +msgid "You have a project that is not pure Python (Use Hatch, PDM or setuptools)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:328 +msgid "You want environment management (use PDM, Hatch or Poetry)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:333 +msgid "" +"[**Hatch**](https://hatch.pypa.io/latest/), similar to Poetry and PDM, " +"provides a unified command line interface. To separate Hatch from Poetry " +"and PDM, it also provides an environment manager for testing that will " +"make it easier for you to run tests locally across different versions of " +"Python. It also offers a nox / makefile like feature that allows you to " +"create custom build workflows such as building your documentation " +"locally. This means that you could potentially drop a tool like **Make** " +"or **Nox** from your workflow and use Hatch instead." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:340 +msgid "Hatch features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Feature, Hatch, Notes" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch is used with the backend Hatchling by default, but allows you to " +"use another backend by switching the declaration in pyproject.toml." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Currently you have to add dependencies manually with Hatch. However a " +"feature to support dependencies management may be added in a future " +"release." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch supports Python virtual environments. If you wish to use other " +"types of environments such as Conda, you will need to [install a plugin " +"such as hatch-conda for conda support](https://github.com/OldGrumpyViking" +"/hatch-conda)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Hatch supports publishing to both test PyPI and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch offers `hatch_vcs` which is a plugin that uses setuptools_scm to " +"support versioning using git tags. The workflow with `hatch_vcs` is the " +"same as that with `setuptools_scm`." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch supports you bumping the version of your package using standard " +"semantic version terms patch; minor; major" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch supports current packaging standards for adding metadata to the " +"**pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch will install your package into any of its environments by default " +"in editable mode. You can install your package in editable mode manually " +"using `python -m pip install -e .` Hatch mentions [editable " +"installs](https://hatch.pypa.io/latest/config/build/#dev-mode) but refers" +" to pip in its documentation." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Hatch will build the sdist and wheel distributions" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "✨Matrix environment creation to support testing across Python versions✨" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"The matrix environment creation is a feature that is unique to Hatch in " +"the packaging ecosystem. This feature is useful if you wish to test your " +"package locally across Python versions (instead of using a tool such as " +"tox)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"✨[Nox / MAKEFILE like " +"functionality](https://hatch.pypa.io/latest/environment/#selection)✨" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"This feature is also unique to Hatch. This functionality allows you to " +"create workflows in the **pyproject.toml** configuration to do things " +"like serve docs locally and clean your package build directory. This " +"means you may have one less tool in your build workflow." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "✨A flexible build backend: **hatchling**✨" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"**The hatchling build backend offered by the maintainer of Hatch allows " +"developers to easily build plugins to support custom build steps when " +"packaging." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:362 +msgid "" +"_There is some argument about this approach placing a burden on " +"maintainers to create a custom build system. But others appreciate the " +"flexibility. The Hatch build hook approach is also comparable with the " +"features offered by PDM._" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:364 +msgid "Why you might not want to use Hatch" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:366 +msgid "" +"There are a few features that hatch is missing that may be important for " +"some. These include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:369 +msgid "" +"Hatch doesn't support adding dependencies. You will have to add them " +"manually." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:370 +msgid "Hatch won't by default recognize Conda environments without a plugin." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:371 +msgid "" +"Similar to PDM, Hatch's documentation can difficult to work through, " +"particularly if you are just getting started with creating a package." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:372 +msgid "Hatch, similar to PDM and Flit currently only has one maintainer." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:376 +msgid "" +"[Poetry is a full-featured build tool.](https://python-poetry.org/) It is" +" also the second most popular front-end packaging tool (based upon the " +"PyPA survey). Poetry is user-friendly and has clean and easy-to-read " +"documentation." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:381 +msgid "" +"While some have used Poetry for Python builds with C/C++ extensions, this" +" support is currently undocumented. Thus, we don't recommend using Poetry" +" for more complex builds." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:385 +msgid "Poetry features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Feature, Poetry, Notes" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry helps you add dependencies to your `pyproject.toml` metadata. " +"_NOTE: currently Poetry adds dependencies using an approach that is " +"slightly out of alignment with current Python peps - however there is a " +"plan to fix this in an upcoming release._ Poetry also allows you to " +"organize dependencies in groups such as documentation, packaging and " +"tests." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Dependency specification" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry allows you to be specific about version of dependencies that you " +"add to your package's pyproject.toml file. However, it's default upper " +"bound approach can be problematic for some packages (We suggest you " +"override the default setting when adding dependencies). Read below for " +"more." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry allows you to either use its built in environment or you can " +"select the environment type that you want to use for managing your " +"package. [Read more about its built in environment management " +"options](https://python-poetry.org/docs/basic-usage/#using-your-virtual-" +"environment)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Lock files" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry creates a **poetry.lock** file that you can use if you need a lock" +" file for your build." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Poetry supports publishing to both test PyPI and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"The plugin [Poetry dynamic versioning](https://github.com/mtkennerly" +"/poetry-dynamic-versioning) supports versioning using git tags with " +"Poetry." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry supports you bumping the version of your package using standard " +"semantic version terms patch; minor; major" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "✖✅" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry does not quite support current packaging standards for adding " +"metadata to the **pyproject.toml** file but plans to fix this in an " +"upcoming release." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry supports installing your package in editable mode using " +"`--editable`" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Poetry will build your sdist and wheel distributions using `poetry build`" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:407 +msgid "Challenges with Poetry" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:409 +msgid "Some challenges of Poetry include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:411 +msgid "" +"Poetry, by default, pins dependencies using an \"upper bound\" limit " +"specified with the `^` symbol by default. However, this behavior can be " +"over-written by specifying the dependency when you use `Poetry add` as " +"follows: `poetry add \"requests>=2.1\"` See breakout below for more " +"discussion on issues surrounding upper-bounds pinning." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:412 +msgid "" +"_Minor Challenge:_ The way Poetry currently adds metadata to your " +"pyproject.toml file does not follow current Python standards. However, " +"this is going to be addressed with Poetry release version 2.0." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:414 +msgid "" +"Poetry is an excellent tool. Use caution when using it to pin " +"dependencies as Poetry's approach to pinning can be problematic for many " +"builds. If you use Poetry, we strongly suggest that you override the " +"default upper bound dependency option." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:420 +msgid "Challenges with Poetry dependency pinning" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:423 +msgid "" +"By default, Poetry pins dependencies using `^` by default. This `^` " +"symbol means that there is an \"upper bound\" to the dependency. Thus " +"poetry won't bump a dependency version to a new major version. Thus, if " +"your package uses a dependency that is at version 1.2.3, Poetry will " +"never bump the dependency to 2.0 even if there is a new major version of " +"the package. Poetry will instead bump up to 1.9.x." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:429 +msgid "" +"Poetry does this because it adheres to strict semantic versioning which " +"states that a major version bump (from 1.0 to 2.0 for example) means " +"there are breaking changes in the tool. However, not all tools follow " +"strict semantic versioning. [This approach has been found to be " +"problematic by many of our core scientific " +"packages.](https://iscinumpy.dev/post/bound-version-constraints/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:434 +msgid "" +"This approach also won't support others ways of versioning tools, for " +"instance, some tools use [calver](https://calver.org/) which creates new " +"versions based on the date." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:438 +msgid "Using Setuptools Back-end for Python Packaging with Build Front-end" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:440 +msgid "" +"[Setuptools](https://setuptools.pypa.io/en/latest/) is the most mature " +"Python packaging build tool with [development dating back to 2009 and " +"earlier](https://setuptools.pypa.io/en/latest/history.html#). Setuptools " +"also has the largest number of community users (according to the PyPA " +"survey). Setuptools does not offer a user front-end like Flit, Poetry and" +" Hatch offer. As such you will need to use other tools such as **build** " +"to create your package distributions and **twine** to publish to PyPI." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:448 +msgid "" +"While setuptools is the most commonly used tool, we encourage package " +"maintainers to consider using a more modern tool for packaging such as " +"Poetry, Hatch or PDM." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:451 +msgid "" +"We discuss setuptools here because it's commonly found in the ecosystem " +"and contributors may benefit from understanding it." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:454 +msgid "Setuptools Features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:456 +msgid "Some of features of setuptools include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:458 +msgid "Fully customizable build workflow" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:459 +msgid "Many scientific Python packages use it." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:460 +msgid "" +"It offers version control based package versioning using " +"**setuptools_scm**" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:461 +msgid "It supports modern packaging using **pyproject.toml** for metadata" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:462 +msgid "Supports backwards compatibly for older packaging approaches." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:464 +msgid "Challenges using setuptools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:468 +msgid "Setuptools has a few challenges:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:470 +msgid "" +"Setuptools does not support interactive features such as auto / tab " +"completion by default if you are working in an IDE like VSCODE and using " +"an editable install for development. [See notes here about pylance " +"support](https://github.com/microsoft/pylance-" +"release/blob/main/TROUBLESHOOTING.md#editable-install-modules-not-found)." +" In comparison, tools such as flit, hatch, PDM support interactive " +"features such as tab / auto completion when using an IDE like VSCODE or " +"pycharm (as long as your version of pip is current!)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:471 +msgid "" +"Because **setuptools** has to maintain backwards compatibility across a " +"range of packages, it is not as flexible in its adoption of modern Python" +" packaging standards." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:474 +msgid "" +"The above-mentioned backwards compatibility makes for a more complex " +"code-base." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:475 +msgid "" +"Your experience as a user will be less streamlined and simple using " +"setuptools compared to other tools discussed on this page." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:477 +msgid "" +"There are also some problematic default settings that users should be " +"aware of when using setuptools. For instance:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:480 +msgid "" +"setuptools will build a project without a name or version if you are not " +"using a **pyproject.toml** file to store metadata." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:482 +msgid "" +"setuptools also will include all of the files in your package repository " +"if you do not explicitly tell it to exclude files using a **MANIFEST.in**" +" file" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:1 +msgid "Learn about Building a Python Package" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:8 +msgid "" +"Once you have published both package distributions (the source " +"distribution and the wheel) to PyPI, you can then publish to conda-forge." +" conda-forge requires an source distribution on PyPI in order to build " +"your package on conda-forge. You do not need to rebuild your package to " +"publish to conda-forge." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:11 +msgid "" +"You need to build your Python package in order to publish it to PyPI (or " +"a conda channel). The build process organizes your code and metadata into" +" a distribution format that can be uploaded to PyPI and subsequently " +"downloaded and installed by users. NOTE: you need to publish a sdist to " +"PyPI in order for conda-forge to properly build your package " +"automatically." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:14 +msgid "What is building a Python package?" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:16 +msgid "" +"To [publish your Python package](publish-python-package-pypi-conda) and " +"make it easy for anyone to install, you first need to build it." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:18 +msgid "But, what does it mean to build a Python package?" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:20 +msgid "" +"[As shown in the figure above](#pypi-conda-channels), when you build your" +" Python package, you convert the source files into something called a " +"distribution package. A distribution package contains your source code " +"and metadata about the package, in the format required by the Python " +"Package Index, so that it can be installed by tools like pip." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:23 +msgid "" +"The term package used to mean many different things in Python and other " +"languages. On this page, we adapt the convention of the [Python Packaging" +" Authority](https://www.pypa.io/en/latest/) and refer to the product of " +"the build step as a **distribution package**." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:27 +msgid "" +"This process of organizing and formatting your code, documentation, tests" +" and metadata into a format that both pip and PyPI can use, is called a " +"build step." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:31 +msgid "Project metadata and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:33 +msgid "" +"The metadata that both build tools and PyPI uses to describe and " +"understand your package is generally stored in a [pyproject.toml file" +"](pyproject-toml-python-package-metadata). This metadata is used for " +"several purposes:" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:35 +msgid "" +"It helps whatever tool you use to build your package (pip, [pypa's " +"Build](https://pypi.org/project/build/) or an end-to-end tool such as " +"poetry, PDM or Hatch) understand how to build your package. Information " +"it provides to your build tool includes:" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:37 +msgid "" +"The `[build-system]` table in your pyproject.toml file tells pip what " +"[build backend tool](build_backends) you wish to use for creating your " +"sdist and wheel distributions." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:45 +msgid "" +"And the dependencies section of your project table tells the build tool " +"and PyPI what dependencies your project requires." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:54 +msgid "" +"When the build tool creates your package distribution file (the file that" +" you publish on PyPI), it also creates a METADATA file which PyPI can " +"read and use to help users find your package. For example:" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:56 +msgid "" +"The `classifiers = ` section of your `[project]` table in the " +"pyproject.toml file provides information that users on PyPI can use to " +"filter for packages that contain specific licenses or that support " +"specific versions of python." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:73 +msgid "What happened to setup.py and setup.cfg for metadata?" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:76 +msgid "" +"Project metadata used to be stored in either a setup.py file or a " +"setup.cfg file. The current recommended practice for storing package " +"metadata is to use a pyproject.toml file. [Learn more about the " +"pyproject.toml file here.](pyproject-toml-python-package-metadata)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:79 +msgid "An example - xclim" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:94 +msgid "" +"Graphic showing the high level packaging workflow. On the left you see a " +"graphic with code, metadata and tests in it. those items all go into your" +" package. Documentation and data are below that box because they aren't " +"normally published in your packaging wheel distribution. an arrow to the " +"right takes you to a build distribution files box. that box leads you to " +"either publishing to TestPyPI or the real PyPI. from PyPI you can then " +"connect to conda-forge for an automated build that sends distributions " +"from PyPI to conda-forge." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:96 +msgid "" +"You need to build your Python package in order to publish it to PyPI (or " +"Conda). The build process organizes your code and metadata into a " +"distribution format that can be uploaded to PyPI and subsequently " +"downloaded and installed by users. NOTE: you need to publish a sdist to " +"PyPI in order for conda-forge to properly build your package " +"automatically." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:101 +msgid "" +"This screenshot shows the metadata on PyPI for the xclim package. on it " +"you can see the name of the license, the author and maintainer names " +"keywords associated with the package and the base python version it " +"requires which is 3.8." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:103 +msgid "PyPI screenshot showing metadata for the xclim package." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:110 +msgid "" +"Here you see the maintinaer metadata as it is displayed on PyPI. for " +"xclim there are three maintainers listed with their profile pictures and " +"github user names to the right." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:112 +msgid "" +"Maintainer names and GitHub usernames for the xclim package as they are " +"displayed on PyPI. This information is recorded in your pyproject.toml " +"and then processed by your build tool and stored in your packages sdist " +"and wheel distributions." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:115 +msgid "How to create the distribution format that PyPI and Pip expects?" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:117 +msgid "" +"You could in theory create your own scripts to organize your code the way" +" PyPI wants it to be. However, just like there are packages that handle " +"known structures such as Pandas for data frames and Numpy for arrays, " +"there are packages and tools that help you create package build " +"distribution files." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:121 +msgid "" +"There are a suite of packaging tools that can either help you with the " +"entire packaging process or just one step of the process. For instance " +"setuptools is a commonly used build back end that can be used to create " +"your sdist and wheel. Whereas tools like Hatch, PDM, Poetry and flit help" +" with other parts of the packaging process." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:127 +msgid "" +"While this can cause some confusion and complexity in the packaging " +"ecosystem - for the most part, each tool provides the same distribution " +"output (with minor differences that most users may not care about). Learn" +" more about those tools on this page." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:133 +msgid "" +"Below, you will learn about the two distribution files that PyPI expects " +"you to publish: sdist and wheel. You will learn about their structure and" +" what files belong in each." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:136 +msgid "" +"There are two core distribution files that you need to create to publish " +"your Python package to PyPI source distribution (often called an sdist) " +"and wheel. The sdist contains the raw source code for your package. The " +"wheel (.whl) contains the built / compiled files that can be directly " +"installed onto anyones' computer." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:142 +msgid "Learn more about both distributions below." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:145 +msgid "" +"If your package is a pure python package with no additional build / " +"compilation steps then the sdist and wheel distributions will have " +"similar content. However if your package has extensions in other " +"languages or is more complex in its build, the two distributions will be " +"very different." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:150 +msgid "" +"Also note that we are not discussing conda build workflows in this " +"section. [You can learn more about conda builds " +"here.](https://conda.io/projects/conda-build/en/latest/user-" +"guide/tutorials/index.html)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:155 +msgid "Source Distribution (sdist)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:157 +msgid "" +"**Source files** are the unbuilt files needed to build your package. " +"These are the \"raw / as-is\" files that you store on GitHub or whatever " +"platform you use to manage your code." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:161 +msgid "" +"Source Distributions (**S** + **Dist**) are referred to as sdist. As the " +"name implies, a SDIST contains the source code; it has not been built or " +"compiled in any way. Thus, when a user installs your source distribution " +"using pip, pip needs to run a build step first. For this reason, you " +"could define a source distribution as a compressed archive that contains " +"everything required to build a wheel (except for project dependencies) " +"without network access." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:165 +msgid "" +"Sdist is normally stored as a `.tar.gz` archive (often called a " +"\"tarball\"). Thus, when a user installs your source distribution using " +"pip, pip needs to run a build step first." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:167 +msgid "Below is an example sdist for the stravalib Python package:" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:219 +msgid "GitHub archive vs sdist" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:221 +msgid "" +"When you make a release on GitHub, it creates a `git archive` that " +"contains all of the files in your GitHub repository. While these files " +"are similar to an sdist, these two archives are not the same. The sdist " +"contains a few other items including a metadata directory and if you use " +"`setuptools_scm` or `hatch_vcs` the sdist may also contain a file that " +"stores the version." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:229 +msgid "Wheel (.whl files):" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:231 +msgid "" +"A wheel file is a ZIP-format archive whose filename follows a specific " +"format (below) and has the extension `.whl`. The `.whl` archive contains " +"a specific set of files, including metadata that are generated from your " +"project's pyproject.toml file. The pyproject.toml and other files that " +"may be included in source distributions are not included in wheels " +"because it is a built distribution." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:238 +msgid "" +"The wheel (.whl) is your built binary distribution. **Binary files** are " +"the built / compiled source files. These files are ready to be installed." +" A wheel (**.whl**) is a **zip** file containing all of the files needed " +"to directly install your package. All of the files in a wheel are " +"binaries - this means that code is already compiled / built. Wheels are " +"thus faster to install - particularly if you have a package that requires" +" build steps." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:240 +msgid "" +"The wheel does not contain any of your package's configuration files such" +" as **setup.cfg** or **pyproject.toml**. This distribution is already " +"built so it's ready to install." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:244 +msgid "" +"Because it is built, the wheel file will be faster to install for pure " +"Python projects and can lead to consistent installs across machines." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:252 +msgid "" +"Wheels are also useful in the case that a package needs a **setup.py** " +"file to support a more complex build. In this case, because the files in " +"the wheel bundle are pre built, the user installing doesn't have to worry" +" about malicious code injections when it is installed." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:259 +msgid "The filename of a wheel contains important metadata about your package." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:261 +msgid "Example: **stravalib-1.1.0.post2-py3-none.whl**" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:263 +msgid "name: stravalib" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:264 +msgid "version: 1.1.0" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:265 +msgid "" +"build-number: 2 (post2) [(read more about post " +"here)](https://peps.python.org/pep-0440/#post-release-separators)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:266 +msgid "py3: supports Python 3.x" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:267 +msgid "none: is not operating system specific (runs on windows, mac, linux)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:268 +msgid "any: runs on any computer processor / architecture" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:270 +msgid "What a wheel file looks like when unpacked (unzipped):" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:304 +msgid "[Read more about the wheel format here](https://pythonwheels.com/)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:1 +msgid "Python Package Structure for Scientific Python Projects" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:3 +msgid "" +"There are two different layouts that you will commonly see within the " +"Python packaging ecosystem: [src and flat " +"layouts.](https://packaging.python.org/en/latest/discussions/src-layout-" +"vs-flat-layout/) Both layouts have advantages for different groups of " +"maintainers." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:8 +msgid "" +"We strongly suggest, but do not require, that you use the **src/** layout" +" (discussed below) for creating your Python package. This layout is also " +"recommended in the [PyPA packaging " +"guide](https://packaging.python.org/en/latest/tutorials/packaging-" +"projects/)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:12 +msgid "pyOpenSci will never require a specific package structure for peer review" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:15 +msgid "" +"We understand that it would be tremendous effort for existing maintainers" +" to move to a new layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:18 +msgid "" +"The overview on this page presents recommendations that we think are best" +" for someone getting started with Python packaging or someone who's " +"package has a simple build and might be open to moving to a more fail-" +"proof approach." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:23 +msgid "An example of the **src/package** layout structure can be seen below." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:45 +msgid "Note the location of the following directories in the example above:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:47 +msgid "" +"**docs/:** discussed in our docs chapter, this directory contains your " +"user-facing documentation website. In a **src/** layout docs/ are " +"normally included at the same directory level of the **src/** folder." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:48 +msgid "" +"**tests/** this directory contains the tests for your project code. In a " +"**src/** layout tests are normally included at the same directory level " +"of the **src/** folder." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:49 +msgid "" +"**src/package/**: this is the directory that contains the code for your " +"Python project. \"Package\" is normally your project's name." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:51 +msgid "" +"Also in the above example, notice that all of the core documentation " +"files that pyOpenSci requires live in the root of your project directory." +" These files include:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:55 +msgid "CHANGELOG.md" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:56 +msgid "CODE_OF_CONDUCT.md" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:57 +msgid "CONTRIBUTING.md" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:58 +msgid "LICENSE.txt" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:59 +msgid "README.md" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:63 +msgid "Click here to read about our packaging documentation requirements." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:70 +msgid "" +"While we recommend the **src/** layout we also review the **flat** layout" +" here. Both are used in the Python ecosystem." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:72 +msgid "Example scientific packages that use **src/package** layout" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:74 +msgid "[Sourmash](https://github.com/sourmash-bio/sourmash)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:75 +msgid "[bokeh](https://github.com/bokeh/bokeh)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:76 +msgid "[openscm](https://github.com/openscm/openscm-runner)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:77 +msgid "[awkward](https://github.com/scikit-hep/awkward)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:78 +msgid "[poliastro](https://github.com/poliastro/poliastro/)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:82 +msgid "The src/ layout and testing" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:84 +msgid "" +"The benefit of using the **src/package** layout, particularly if you are " +"creating a new package, is that it ensures tests are run against the " +"installed version of your package rather than the files in your package " +"working directory. If you run your tests on your files rather than the " +"installed version, you may be missing issues that users encounter when " +"your package is installed." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:91 +msgid "" +"If `tests/` are outside of the **src/package** directory, they aren't " +"included in the package wheel. This makes your package size slightly " +"smaller which then places places a smaller storage burden on PyPI which " +"has over 400,000 packages to support." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:93 +msgid "" +"[Read more about reasons to use the **src/package** " +"layout](https://hynek.me/articles/testing-packaging/)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:95 +msgid "How Python discovers and prioritizes importing modules" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:97 +msgid "" +"By default, Python adds a module in your current working directory to the" +" front of the Python module search path." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:99 +msgid "" +"This means that if you run your tests in your package's working " +"directory, using a flat layout, `/package/module.py`, Python will " +"discover `package/module.py` file before it discovers the installed " +"package." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:101 +msgid "" +"However, if your package lives in a src/ directory structure " +"**src/package** then it won't be, by default, added to the Python path. " +"This means that when you import your package, Python will be forced to " +"search the active environment (which has your package installed)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:103 +msgid "" +"Note: Python versions 3.11 and above have a path setting that can be " +"adjusted to ensure the priority is to use installed packages first (e.g. " +"`PYTHONSAFEPATH`)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:106 +msgid "Sometimes tests are needed in a distribution" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:108 +msgid "" +"We do not recommend including tests as part of your package wheel by " +"default. However, not including tests in your package distribution will " +"make it harder for people other than yourself to test whether your " +"package is functioning correctly on their system. If you have a small " +"test suite (Python files + data), and think your users may want to run " +"tests locally on their systems, you can include tests by moving the " +"`tests/` directory into the **src/package** directory (see example " +"below)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:117 +msgid "" +"Including the **tests/** directory in your **src/package** directory " +"ensures that tests will be included in your package's wheel." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:119 +msgid "" +"Be sure to read the [pytest documentation for more about including tests " +"in your package " +"distribution](https://docs.pytest.org/en/7.2.x/explanation/goodpractices.html#choosing-a" +"-test-layout-import-rules)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:121 +msgid "Challenges with including tests and data in a package wheel" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:124 +msgid "" +"Tests, especially when accompanied by test data can create a few small " +"challenges including:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:126 +msgid "" +"Take up space in your distribution which will build up over time as " +"storage space on PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:127 +msgid "Large file sizes can also slow down package install." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:129 +msgid "" +"However, in some cases, particularly in the scientific Python ecosystems " +"you may need to include tests." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:132 +msgid "**Don't include test suite datasets in your package**" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:134 +msgid "" +"If you do include your tests in your package distribution, we strongly " +"discourage you from including data in your test suite directory. Rather, " +"host your test data in a repository such as Figshare or Zenodo. Use a " +"tool such as [Pooch](https://www.fatiando.org/pooch/latest/) to access " +"the data when you (or a user) runs tests." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:140 +msgid "" +"Check out the testing section of our guide for more information about " +"tests." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:142 +msgid "" +"The **src/package** layout is semantically more clear. Code is always " +"found in the **src/package** directory, `tests/` and `docs/`are in the " +"root directory." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:146 +msgid "" +"If your package tests require data, we suggest that you do NOT include " +"that data within your package structure. We will discuss this in more " +"detail in a tutorial. Include data in your package structure increases " +"the size of your distribution files. This places a maintenance toll on " +"repositories like PyPI and Anaconda.org that have to deal with thousands " +"of package uploads." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:153 +msgid "About the flat Python package layout" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:155 +msgid "Currently most scientific packages use the **flat-layout** given:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:157 +msgid "" +"It's the most commonly found layout with the scientific Python ecosystem " +"and people tend to look to other packages / maintainers that they respect" +" for examples of how to build Python packages." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:160 +msgid "" +"Many Python tools depend upon tools in other language and / or complex " +"builds with compilation steps. Many developers thus appreciate / are used" +" to features of the flat layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:164 +msgid "" +"While we present this layout here in our guide, we suggest that those " +"just getting started with python packaging start with the src/package " +"layout discussed above. Numerous packages in the ecosystem [have had to " +"move to a src/ layout](https://github.com/scikit-build/cmake-python-" +"distributions/pull/145)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:169 +msgid "Why most scientific Python packages do not use source" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:172 +msgid "" +"In most cases the advantages of using the **src/package** layout for " +"larger scientific packages that already use flat approach are not worth " +"it. Moving from a flat layout to a **src/package** layout would come at a" +" significant cost to maintainers." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:177 +msgid "" +"However, the advantages of using the **src/package** layout for a " +"beginner are significant. As such, we recommend that if you are getting " +"started with creating a package, that you consider using a " +"**src/package** layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:182 +msgid "What does the flat layout structure look like?" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:184 +msgid "The flat layout's primary characteristics are:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:186 +msgid "" +"The source code for your package lives in a directory with your package's" +" name in the root of your directory" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:188 +msgid "" +"Often the `tests/` directory also lives within that same `package` " +"directory." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:190 +msgid "" +"Below you can see the recommended structure of a scientific Python " +"package using the flat layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:212 +msgid "Benefits of using the flat layout in your Python package" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:214 +msgid "" +"There are some benefits to the scientific community in using the flat " +"layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:216 +msgid "" +"This structure has historically been used across the ecosystem and " +"packages using it are unlikely to change." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:218 +msgid "" +"You can import the package directly from the root directory. For some " +"this is engrained in their respective workflows. However, for a beginner " +"the danger of doing this is that you are not developing and testing " +"against the installed version of your package. Rather, you are working " +"directly with the flat files." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:224 +msgid "Core scientific Python packages that use the flat layout" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:227 +msgid "[numpy](https://github.com/numpy/numpy)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:228 +msgid "[scipy](https://github.com/scipy/scipy)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:229 +msgid "[pandas](https://github.com/pandas-dev/pandas)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:230 +msgid "[xarray](https://github.com/pydata/xarray)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:231 +msgid "[Jupyter-core](https://github.com/jupyter/jupyter_core)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:232 +msgid "[Jupyter notebook](https://github.com/jupyter/notebook)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:233 +msgid "[scikit-learn](https://github.com/scikit-learn/scikit-learn)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:235 +msgid "" +"It would be a significant maintenance cost and burden to move all of " +"these packages to a different layout. The potential benefits of the " +"source layout for these tools is not worth the maintenance investment." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:1 +msgid "Creating New Versions of Your Python Package" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:6 +msgid "Key Takeways" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:8 +msgid "" +"Follow [semantic versioning guidelines (SemVer) " +"rules](https://semver.org/) when bumping (increasing) your Python's " +"package version; for example a major version bump (version 1.0 --> 2.0) " +"equates to breaking changes in your package's code for a user." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:9 +msgid "" +"You may want to consider using a plugin like hatch_vsc for managing " +"versions of your package - if you want to have a GitHub only release " +"workflow." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:10 +msgid "" +"Otherwise most major package build tools such as Hatch, Flit and PDM have" +" a version feature that will help you update your package's version" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:11 +msgid "Avoid updating your packages version number manually by hand in your code!" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:14 +msgid "" +"pyOpenSci recommends that you follow the [Python PEP " +"440](https://peps.python.org/pep-0440) which recommends using [semantic " +"versioning guidelines](https://www.python.org/dev/peps/pep-0440" +"/#semantic-versioning) when assigning release values to new versions of " +"your Python package." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:18 +msgid "" +"[Semantic versioning](https://semver.org/) is an approach to updating " +"package versions that considers the type and extent of a change that you " +"are making to the package code. Being consistent with how and when you " +"update your package versions is important as:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:23 +msgid "" +"It helps your users (which might include other developers that depend on " +"your package) understand the extent of changes to a package." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:24 +msgid "" +"It helps your development team make decisions about when to bump a " +"package version based on standard rules." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:26 +msgid "" +"Consistent version increases following semver rules mean that values of " +"your package version explain the extent of the changes made in the code " +"base from version to version. thus your package version numbers become " +"\"expressive\" in the same way that naming code variables well can [make " +"code expressive](https://medium.com/@daniel.oliver.king/writing-" +"expressive-code-b69ef7a5a2fa)." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:28 +msgid "A note about versioning" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:29 +msgid "" +"In some cases even small version changes can turn a package update into a" +" breaking change for some users. What is also important is that you " +"document how you version your code and if you can, also document your " +"deprecation policy for code." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:37 +msgid "SemVer rules" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:39 +msgid "Following SemVer, your bump your package version to a:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:41 +msgid "patch (1.1.1 --> 1.1.**2**)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:42 +msgid "minor (1.1.1 --> 1.**2**.1)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:43 +msgid "major (1.1.1 --> **2**.1.1)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:45 +msgid "version number change based on the following rules:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:47 +msgid "Given a version number MAJOR.MINOR.PATCH, increment the:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:49 +msgid "**MAJOR version** when you make incompatible API changes" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:50 +msgid "" +"**MINOR version** when you add functionality in a backwards compatible " +"manner" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:51 +msgid "" +"**PATCH version** when you make backwards compatible bug fixes Additional" +" labels for pre-release and build metadata are available as extensions to" +" the MAJOR.MINOR.PATCH format." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:56 +msgid "" +"Some people prefer to use [calver](https://calver.org/index.html) for " +"versioning. It may be a simpler-to-use system given it relies upon date " +"values associated with released versions. However, calver does not " +"provide a user with a sense of when a new version might break an existing" +" build. As such we still suggest semver." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:59 +msgid "" +"pyOpenSci will never require semver in a peer review as long as a package" +" has a reasonable approach to versioning!" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:63 +msgid "Avoid manually updating Python package version numbers if you can" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:65 +msgid "" +"Often times you may want to have your package version value in multiple " +"locations. One example of this is that it might be both an attribute in " +"your package **version** and also called in your documentation." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:70 +msgid "" +"We recommend that you avoid manual updates of your package version number" +" to avoid human-error. It is better practice to keep your version number " +"in one location." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:74 +msgid "" +"If you can't implement a single location version, then consider using a " +"tool like hatch, PDM or bump2version that will update the version values " +"for you - throughout your package." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:78 +msgid "" +"Below we discuss some tools that you can use to manage updating Python " +"package versions." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:83 +msgid "Tools to manage versions for your Python package" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:85 +msgid "" +"There are a handful of tools that are widely used in the scientific " +"ecosystem that you can use to manage your package versions. Some of these" +" tools are built into or work with your chosen [packaging build tools " +"that discussed in this chapter.](python-package-build-tools)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:91 +msgid "Below, we provide an overview of these tools." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:97 +msgid "" +"There are three general groups of tools that you can use to manage " +"package versions:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:100 +msgid "" +"**semantic release tools:** These tools will automagically determine what" +" type of version bump to use using the text in your commit messages. " +"Below we discuss [Python Semantic Release](https://python-semantic-" +"release.readthedocs.io/en/latest/) as a Python tool that implements a " +"semantic versioning approach." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:102 +msgid "" +"**Manual incremental bump tools:** Tools like " +"[Hatch](https://hatch.pypa.io/latest/version/) offer version bumping " +"within your package. Normally this is implemented at the command link for" +" instance `hatch version major` would bump your project from 0.x to 1.0." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:103 +msgid "" +"**Version Control System tools:** Finally there are tools that rely on " +"your version control system to track versions. These tools often are " +"plugins to your package build tool (ex: setuptools build or hatchling). " +"We discuss this option below assuming that you are using **.git tags** " +"and **GitHub** to manage your package repository." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:105 +msgid "Semantic release, vs version control based vs manual version bumping" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:107 +msgid "" +"Generally semantic release and version control system tools can be setup " +"to run automatically on GitHub using GitHub actions. This means that you " +"can create a workflow where a GitHub release and associated new version " +"tag is used to trigger an automated build that:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:113 +msgid "Builds your package and updates the version following the new tag" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:114 +msgid "Tests the build and publishes to test PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:115 +msgid "Publishes the package to PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:118 +msgid "" +"Bumping a package version refers to the step of increasing the package " +"version after a set number of changes have been made to it. For example, " +"you might bump from version 0.8 to 0.9 of a package. or from 0.9 to 1.0." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:122 +msgid "" +"Using semantic versioning, there are three main \"levels\" of versions " +"that you might consider:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:125 +msgid "Major, minor and patch. These are described in more detail below." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:128 +msgid "Tools for bumping Python package versions" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:130 +msgid "" +"In this section we discuss the following tools for managing your Python " +"package's version:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:133 +msgid "hatch &" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:134 +msgid "hatch_vcs plugin for hatchling" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:135 +msgid "setuptools-scm" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:136 +msgid "python-semantic-version" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:138 +msgid "Tool 1: Hatch and other build tools that offer incremental versioning" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:140 +msgid "" +"Many of the modern build tool front end tools offer version support that " +"follow semantic versioning rules. These tools are different from Python " +"Semantic Version in that they do not require specific commit messages to " +"implement version. Rather, they allow you to update the version at the " +"command line using commands such as:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:146 +msgid "`tool-name version update major`" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:147 +msgid "`tool-name version update minor`" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:149 +msgid "" +"[Hatch](https://hatch.pypa.io/latest/version/), for instance offers " +"`hatch version minor` which will modify the version of your package " +"incrementally. With **Hatch** the version value will be found in your " +"`pyproject.toml` file. " +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:152 +msgid "Hatch (or other tools like PDM) Pros" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:154 +msgid "Easy to use version updates locally using a single tool!" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:156 +msgid "Hatch (or other tools like PDM) Cons" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:158 +msgid "" +"There will be some setup involved to ensure package version is updated " +"throughout your package" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:160 +msgid "Tool 2: Hatch_vcs & hatchling build back-end" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:162 +msgid "" +"[hatch_vcs](https://github.com/ofek/hatch-vcs) is a versioning tool that " +"allows you to manage package versions using **git tags**. Hatch_vcs " +"creates a **\\_version.py** file in your package ecosystem that keeps " +"track of the package's current version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:167 +msgid "" +"Hatch keeps track of your package's version in a `_version.py` file. " +"Storing the version in a single file managed by Hatch provides your " +"package with a \"single source of truth\" value for the version number. " +"This in turn eliminates potential error associated with manually updating" +" your package's version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:173 +msgid "" +"When you (or your CI system) build your package, hatch checks the current" +" tag number for your package. if it has increased, it will update the " +"**\\_version.py** file with the new value." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:176 +msgid "" +"Thus, when you create a new tag or a new release with a tag and build " +"your package, Hatch will access the new tag value and use it to update " +"your package version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:179 +msgid "" +"To use **hatch_vcs** you will need to use the **hatchling** build back " +"end." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:182 +msgid "" +"Hatchling can also be used with any of the modern build tools including " +"**Flit** and **PDM** if you prefer those for your day to day workflow." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:187 +msgid "Hatch example setup in your pyproject.toml" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:196 +msgid "" +"**Hatch_vcs** supports a fully automated package release and build, and " +"push to PyPI workflow on GitHub." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:206 +msgid "" +"If you use **setuptools_scm**, then you might find **hatch_vcs** and " +"**hatchling** to be the modern equivalent to your current setuptools / " +"build workflow." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:209 +msgid "hatch_vcs Pros" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:211 +msgid "Hatch supports modern Python packaging standards" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:212 +#: ../../package-structure-code/python-package-versions.md:238 +msgid "It creates a single-source file that contains your package version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:213 +#: ../../package-structure-code/python-package-versions.md:239 +msgid "You never manually update the package version" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:214 +#: ../../package-structure-code/python-package-versions.md:240 +msgid "" +"You can automate writing the version anywhere in your package including " +"your documentation!" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:215 +#: ../../package-structure-code/python-package-versions.md:241 +msgid "" +"It supports a purely GitHub based release workflow. This simplifies " +"maintenance workflows." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:216 +#: ../../package-structure-code/python-package-versions.md:242 +msgid "" +"Version number is updated in your package via a hidden `_version.py` " +"file. There is no manual configuration updates required." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:217 +#: ../../package-structure-code/python-package-versions.md:243 +msgid "" +"While we like detailed commit messages (See Python Semantic Version " +"below), we know that sometimes when maintaining a package specific " +"guidelines around commit messages can be hard to apply and manage." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:219 +msgid "hatch_vcs Cons" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:221 +msgid "" +"In a CI workflow you will end up manually entering or creating the " +"version number via a tag on GitHub. But you could locally develop a build" +" to \"bump\" tag versions" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:224 +msgid "Tool 3: setuptools-scm versioning using git tags" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:226 +msgid "" +"[`Setuptools_scm`](https://github.com/pypa/setuptools_scm/) is an " +"extension that you can use with setuptools to manage package versions. " +"**Setuptools_scm** operates the same way that **hatch_vcs** (discussed " +"above) does. It stores a version in a **\\_version.py** file and relies " +"on (**git**) tags to determine the package's current version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:232 +msgid "" +"If you are using **setuptools** as your primary build tool, then " +"`*setuptools-scm` is a good choice as:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:236 +msgid "setuptools_scm Pros" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:244 +msgid "**setuptools** is still the most commonly used Python packaging build tool" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:246 +msgid "setuptools_scm Cons" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:248 +msgid "" +"In a CI workflow you will end up manually entering or creating the " +"version number via a tag on GitHub." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:249 +msgid "Not well documented" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:250 +msgid "" +"Because setuptools will always have to support backwards compatibility it" +" will always be slower in adopting modern Python packaging conventions." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:252 +msgid "" +"As such you might consider using a more modern tool such as **hatch_vcs**" +" and **hatchling** to build your package and manage package versions." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:264 +msgid "" +"Tool 4: [Python semantic release](https://python-semantic-" +"release.readthedocs.io/en/latest/)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:266 +msgid "" +"Python semantic release uses a commit message workflow that updates the " +"version of your package based on keywords found in your commit messages. " +"As the name implies, Python Semantic Release follows semver release " +"rules." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:271 +msgid "" +"With Python Semantic Release, versions are triggered using specific " +"language found in a git commit message." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:274 +msgid "" +"For example, the words `fix(attribute_warning):` trigger Python Semantic " +"Release to implement a **patch** version bump. For instance if your " +"package was at version 1.1.0 and you made the commit below with the words" +" fix(text-here), Python Semantic Release would bump your package to " +"version 1.1.1." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:284 +msgid "" +"Similarly a feature (`feat()`) triggers a minor version bump. For example" +" from version 1.1 to version 1.2" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:292 +msgid "" +"You can find a thoughtful discussion of python semantic version [in this " +"Python package guide](https://py-pkgs.org/07-releasing-versioning" +"#automatic-version-bumping). Note that the guide hasn't been updated " +"since 2020 and will potentially be updated in the future! But for now, " +"some of the commands are dated but the content is still excellent." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:295 +msgid "Python Semantic Release Pros" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:297 +msgid "Follows semver versioning closely" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:298 +msgid "" +"Enforces maintainers using descriptive commit messages which can simplify" +" troubleshooting and ensure a cleaner and more self-describing git " +"history." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:300 +msgid "Python Semantic Release Cons" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:302 +msgid "" +"Requires very specific commit language to work. In practice some " +"maintainers and contributors may not be able to maintain that level of " +"specificity in commit messages (NOTE: there are bots that will check git " +"commit messages in a repo)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:303 +msgid "" +"Release happens at the command line. This makes is harder to implement a " +"GitHub based release workflow as the wrong commit message could trigger a" +" release." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:304 +msgid "" +"The version number is manually updated in a configuration file such as " +"`pyproject.toml` vs. in a package **\\_version.py** file." +msgstr "" + diff --git a/locales/ja/LC_MESSAGES/tests.po b/locales/ja/LC_MESSAGES/tests.po new file mode 100644 index 00000000..540e03ab --- /dev/null +++ b/locales/ja/LC_MESSAGES/tests.po @@ -0,0 +1,1003 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../tests/index.md:72 +msgid "Intro" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Write tests" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Test types" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Run tests locally" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Run tests online (using CI)" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Create & Run Tests" +msgstr "" + +#: ../../tests/index.md:1 +msgid "Tests and data for your Python package" +msgstr "" + +#: ../../tests/index.md:3 +msgid "" +"Tests are an important part of your Python package because they provide a" +" set of checks that ensure that your package is functioning how you " +"expect it to." +msgstr "" + +#: ../../tests/index.md:7 +msgid "" +"In this section you will learn more about the importance of writing tests" +" for your Python package and how you can setup infrastructure to run your" +" tests both locally and on GitHub." +msgstr "" + +#: ../../tests/index.md:19 +msgid "✨ Why write tests ✨" +msgstr "" + +#: ../../tests/index.md:24 +msgid "" +"Learn more about the art of writing tests for your Python package. Learn " +"about why you should write tests and how they can help you and potential " +"contributors to your project." +msgstr "" + +#: ../../tests/index.md:31 +msgid "✨ Types of tests ✨" +msgstr "" + +#: ../../tests/index.md:36 +msgid "" +"There are three general types of tests that you can write for your Python" +" package: unit tests, integration tests and end-to-end (or functional) " +"tests. Learn about all three." +msgstr "" + +#: ../../tests/index.md:42 +msgid "✨ Run tests locally ✨" +msgstr "" + +#: ../../tests/index.md:47 +msgid "" +"If you expect your users to use your package across different versions of" +" Python, then using an automation tool such as nox to run your tests is " +"useful. Learn about the various tools that you can use to run your tests " +"across python versions here." +msgstr "" + +#: ../../tests/index.md:53 +msgid "✨ Run tests online (using CI) ✨" +msgstr "" + +#: ../../tests/index.md:58 +msgid "" +"Continuous integration platforms such as GitHub actions can be useful for" +" running your tests across both different Python versions and different " +"operating systems. Learn about setting up tests to run in Continuous " +"Integration here." +msgstr "" + +#: ../../tests/index.md:69 +msgid "Graphic showing the elements of the packaging process." +msgstr "" + +#: ../../tests/run-tests.md:6 +msgid "Run Python package tests" +msgstr "" + +#: ../../tests/run-tests.md:8 +msgid "" +"Running your tests is important to ensure that your package is working as" +" expected. It's good practice to consider that tests will run on your " +"computer and your users' computers that may be running a different Python" +" version and operating systems. Think about the following when running " +"your tests:" +msgstr "" + +#: ../../tests/run-tests.md:11 +msgid "" +"Run your test suite in a matrix of environments that represent the Python" +" versions and operating systems your users are likely to have." +msgstr "" + +#: ../../tests/run-tests.md:12 +msgid "" +"Running your tests in an isolated environment provides confidence in the " +"tests and their reproducibility. This ensures that tests do not pass " +"randomly due to your computer's specific setup. For instance, you might " +"have unexpectedly installed dependencies on your local system that are " +"not declared in your package's dependency list. This oversight could lead" +" to issues when others try to install or run your package on their " +"computers." +msgstr "" + +#: ../../tests/run-tests.md:14 +msgid "" +"On this page, you will learn about the tools that you can use to both run" +" tests in isolated environments and across Python versions." +msgstr "" + +#: ../../tests/run-tests.md:19 +msgid "Tools to run your tests" +msgstr "" + +#: ../../tests/run-tests.md:21 +msgid "" +"There are three categories of tools that will make is easier to setup and" +" run your tests in various environments:" +msgstr "" + +#: ../../tests/run-tests.md:24 +msgid "" +"A **test framework**, is a package that provides a particular syntax and " +"set of tools for _both writing and running your tests_. Some test " +"frameworks also have plugins that add additional features such as " +"evaluating how much of your code the tests cover. Below you will learn " +"about the **pytest** framework which is one of the most commonly used " +"Python testing frameworks in the scientific ecosystem. Testing frameworks" +" are essential but they only serve to run your tests. These frameworks " +"don't provide a way to easily run tests across Python versions without " +"the aid of additional automation tools." +msgstr "" + +#: ../../tests/run-tests.md:25 +msgid "" +"**Automation tools** allow you to automate running workflows such as " +"tests in specific ways using user-defined commands. For instance it's " +"useful to be able to run tests across different Python versions with a " +"single command. Tools such as " +"[**nox**](https://nox.thea.codes/en/stable/index.html) and " +"[**tox**](https://tox.wiki/en/latest/index.html) also allow you to run " +"tests across Python versions. However, it will be difficult to test your " +"build on different operating systems using only nox and tox - this is " +"where continuous integration (CI) comes into play." +msgstr "" + +#: ../../tests/run-tests.md:26 +msgid "" +"**Continuous Integration (CI):** is the last tool that you'll need to run" +" your tests. CI will not only allow you to replicate any automated builds" +" you create using nox or tox to run your package in different Python " +"environments. It will also allow you to run your tests on different " +"operating systems (Windows, Mac and Linux). [We discuss using CI to run " +"tests here](tests-ci)." +msgstr "" + +#: ../../tests/run-tests.md:28 +msgid "Table: Testing & Automation Tool" +msgstr "" + +#: ../../tests/run-tests.md:35 +msgid "Features" +msgstr "" + +#: ../../tests/run-tests.md:36 +msgid "Testing Framework (pytest)" +msgstr "" + +#: ../../tests/run-tests.md:37 +msgid "Test Runner (Tox)" +msgstr "" + +#: ../../tests/run-tests.md:38 +msgid "Automation Tools (Nox)" +msgstr "" + +#: ../../tests/run-tests.md:39 +msgid "Continuous Integration (GitHub Actions)" +msgstr "" + +#: ../../tests/run-tests.md:40 +msgid "Run Tests Locally" +msgstr "" + +#: ../../tests/run-tests.md:41 ../../tests/run-tests.md:42 +#: ../../tests/run-tests.md:43 ../../tests/run-tests.md:49 +#: ../../tests/run-tests.md:52 ../../tests/run-tests.md:53 +#: ../../tests/run-tests.md:54 ../../tests/run-tests.md:57 +#: ../../tests/run-tests.md:58 ../../tests/run-tests.md:59 +#: ../../tests/run-tests.md:64 ../../tests/run-tests.md:68 +#: ../../tests/run-tests.md:69 +msgid "" +msgstr "" + +#: ../../tests/run-tests.md:44 ../../tests/run-tests.md:46 +#: ../../tests/run-tests.md:47 ../../tests/run-tests.md:48 +#: ../../tests/run-tests.md:51 ../../tests/run-tests.md:56 +#: ../../tests/run-tests.md:61 ../../tests/run-tests.md:62 +#: ../../tests/run-tests.md:63 ../../tests/run-tests.md:66 +#: ../../tests/run-tests.md:67 +msgid "" +msgstr "" + +#: ../../tests/run-tests.md:45 +msgid "Run Tests Online" +msgstr "" + +#: ../../tests/run-tests.md:50 +msgid "Run Tests Across Python Versions" +msgstr "" + +#: ../../tests/run-tests.md:55 +msgid "Run Tests In Isolated Environments" +msgstr "" + +#: ../../tests/run-tests.md:60 +msgid "Run Tests Across Operating Systems (Windows, MacOS, Linux)" +msgstr "" + +#: ../../tests/run-tests.md:65 +msgid "Use for other automation tasks (e.g. building docs)" +msgstr "" + +#: ../../tests/run-tests.md:73 +msgid "What testing framework / package should I use to run tests?" +msgstr "" + +#: ../../tests/run-tests.md:75 +msgid "" +"We recommend using `Pytest` to build and run your package tests. Pytest " +"is the most common testing tool used in the Python ecosystem." +msgstr "" + +#: ../../tests/run-tests.md:77 +msgid "" +"[The Pytest package](https://docs.pytest.org/en/latest/) also has a " +"number of extensions that can be used to add functionality such as:" +msgstr "" + +#: ../../tests/run-tests.md:80 +msgid "" +"[pytest-cov](https://pytest-cov.readthedocs.io/en/latest/) allows you to " +"analyze the code coverage of your package during your tests, and " +"generates a report that you can [upload to codecov](https://codecov.io/)." +msgstr "" + +#: ../../tests/run-tests.md:82 ../../tests/run-tests.md:174 +#: ../../tests/test-types.md:14 ../../tests/tests-ci.md:7 +msgid "Todo" +msgstr "" + +#: ../../tests/run-tests.md:83 +msgid "Learn more about code coverage here. (add link)" +msgstr "" + +#: ../../tests/run-tests.md:87 +msgid "" +"Your editor or IDE may add additional convenience for running tests, " +"setting breakpoints, and toggling the `–no-cov` flag. Check your editor's" +" documentation for more information." +msgstr "" + +#: ../../tests/run-tests.md:90 +msgid "Run tests using pytest" +msgstr "" + +#: ../../tests/run-tests.md:92 +msgid "If you are using **pytest**, you can run your tests locally by calling:" +msgstr "" + +#: ../../tests/run-tests.md:95 +msgid "`pytest`" +msgstr "" + +#: ../../tests/run-tests.md:97 +msgid "" +"Or if you want to run a specific test file - let's call this file " +"\"`test_module.py`\" - you can run:" +msgstr "" + +#: ../../tests/run-tests.md:99 +msgid "`pytest test_module.py`" +msgstr "" + +#: ../../tests/run-tests.md:101 +msgid "" +"Learn more from the [get started docs](https://docs.pytest.org/en/7.1.x" +"/getting-started.html)." +msgstr "" + +#: ../../tests/run-tests.md:103 +msgid "" +"Running pytest on your computer is going to run your tests in whatever " +"Python environment you currently have activated. This means that tests " +"will be run on a single version of Python and only on the operating " +"system that you are running locally." +msgstr "" + +#: ../../tests/run-tests.md:108 +msgid "" +"An automation tool can simplify the process of running tests in various " +"Python environments." +msgstr "" + +#: ../../tests/run-tests.md:111 +msgid "Tests across operating systems" +msgstr "" + +#: ../../tests/run-tests.md:112 +msgid "" +"If you want to run your tests across different operating systems you can " +"[continuous integration. Learn more here](tests-ci)." +msgstr "" + +#: ../../tests/run-tests.md:115 +msgid "Tools to automate running your tests" +msgstr "" + +#: ../../tests/run-tests.md:117 +msgid "" +"To run tests on various Python versions or in various specific " +"environments with a single command, you can use an automation tool such " +"as `nox` or `tox`. Both `nox` and `tox` can create an isolated virtual " +"environments. This allows you to easily run your tests in multiple " +"environments and across Python versions." +msgstr "" + +#: ../../tests/run-tests.md:120 +msgid "" +"We will focus on [Nox](https://nox.thea.codes/) in this guide. `nox` is a" +" Python-based automation tool that builds upon the features of both " +"`make` and `tox`. `nox` is designed to simplify and streamline testing " +"and development workflows. Everything that you do with `nox` can be " +"implemented using a Python-based interface." +msgstr "" + +#: ../../tests/run-tests.md:122 +msgid "Other automation tools you'll see in the wild" +msgstr "" + +#: ../../tests/run-tests.md:125 +msgid "" +"**[Tox](https://tox.wiki/en/latest/index.html#useful-links)** is an " +"automation tool that supports common steps such as building " +"documentation, running tests across various versions of Python, and more." +" You can find [a nice overview of tox in the plasmaPy " +"documentation](https://docs.plasmapy.org/en/stable/contributing/testing_guide.html" +"#using-tox)." +msgstr "" + +#: ../../tests/run-tests.md:127 +msgid "" +"**[Hatch](https://github.com/ofek/hatch)** is a modern end-to-end " +"packaging tool that works with the popular build backend called " +"hatchling. `hatch` offers a `tox`-like setup where you can run tests " +"locally using different Python versions. If you are using `hatch` to " +"support your packaging workflow, you may want to also use its testing " +"capabilities rather than using `nox`." +msgstr "" + +#: ../../tests/run-tests.md:129 +msgid "" +"[**make:**](https://www.gnu.org/software/make/manual/make.html) Some " +"developers use Make, which is a build automation tool, for running tests " +"due to its versatility; it's not tied to a specific language and can be " +"used to run various build processes. However, Make's unique syntax and " +"approach can make it more challenging to learn, particularly if you're " +"not already familiar with it. Make also won't manage environments for you" +" like **nox** will do." +msgstr "" + +#: ../../tests/run-tests.md:136 +msgid "Run tests across Python versions with nox" +msgstr "" + +#: ../../tests/run-tests.md:138 +msgid "**Nox** is a great automation tool to learn because it:" +msgstr "" + +#: ../../tests/run-tests.md:140 +msgid "Is Python-based making it accessible if you already know Python and" +msgstr "" + +#: ../../tests/run-tests.md:141 +msgid "Will create isolated environments to run workflows." +msgstr "" + +#: ../../tests/run-tests.md:143 +msgid "" +"`nox` simplifies creating and managing testing environments. With `nox`, " +"you can set up virtual environments, and run tests across Python versions" +" using the environment manager of your choice with a single command." +msgstr "" + +#: ../../tests/run-tests.md:148 +msgid "Nox Installations" +msgstr "" + +#: ../../tests/run-tests.md:150 +msgid "" +"When you install and use nox to run tests across different Python " +"versions, nox will create and manage individual `venv` environments for " +"each Python version that you specify in the nox function." +msgstr "" + +#: ../../tests/run-tests.md:152 +msgid "Nox will manage each environment on its own." +msgstr "" + +#: ../../tests/run-tests.md:154 +msgid "" +"Nox can also be used for other development tasks such as building " +"documentation, creating your package distribution, and testing " +"installations across both PyPI related environments (e.g. venv, " +"virtualenv) and `conda` (e.g. `conda-forge`)." +msgstr "" + +#: ../../tests/run-tests.md:158 +msgid "" +"To get started with nox, you create a `noxfile.py` file at the root of " +"your project directory. You then define commands using Python functions. " +"Some examples of that are below." +msgstr "" + +#: ../../tests/run-tests.md:162 +msgid "Test Environments" +msgstr "" + +#: ../../tests/run-tests.md:164 +msgid "" +"By default, `nox` uses the Python built in `venv` environment manager. A " +"virtual environment (`venv`) is a self-contained Python environment that " +"allows you to isolate and manage dependencies for different Python " +"projects. It helps ensure that project-specific libraries and packages do" +" not interfere with each other, promoting a clean and organized " +"development environment." +msgstr "" + +#: ../../tests/run-tests.md:166 +msgid "" +"An example of using nox to run tests in `venv` environments for Python " +"versions 3.9, 3.10, 3.11 and 3.12 is below." +msgstr "" + +#: ../../tests/run-tests.md:169 +msgid "" +"Note that for the code below to work, you need to have all 4 versions of " +"Python installed on your computer for `nox` to find." +msgstr "" + +#: ../../tests/run-tests.md:172 +msgid "Nox with venv environments" +msgstr "" + +#: ../../tests/run-tests.md:175 +msgid "" +"TODO: add some tests above and show what the output would look like in " +"the examples below..." +msgstr "" + +#: ../../tests/run-tests.md:178 +msgid "" +"Below is an example of setting up nox to run tests using `venv` which is " +"the built in environment manager that comes with base Python." +msgstr "" + +#: ../../tests/run-tests.md:180 +msgid "" +"Note that the example below assumes that you have [setup your " +"`pyproject.toml` to declare test dependencies in a way that pip can " +"understand](../package-structure-code/declare-dependencies.md). An " +"example of that setup is below." +msgstr "" + +#: ../../tests/run-tests.md:201 +msgid "" +"If you have the above setup, then you can use " +"`session.install(\".[tests]\")` to install your test dependencies. Notice" +" that below one single nox session allows you to run your tests on 4 " +"different Python environments (Python 3.9, 3.10, 3.11, and 3.12)." +msgstr "" + +#: ../../tests/run-tests.md:222 +msgid "" +"Above you create a nox session in the form of a function with a " +"`@nox.session` decorator. Notice that within the decorator you declare " +"the versions of python that you wish to run." +msgstr "" + +#: ../../tests/run-tests.md:226 +msgid "" +"To run the above you'd execute the following command, specifying which " +"session with `--session` (sometimes shortened to `-s`). Your function " +"above is called test, therefore the session name is test." +msgstr "" + +#: ../../tests/run-tests.md:234 +msgid "Nox with conda / mamba" +msgstr "" + +#: ../../tests/run-tests.md:236 +msgid "" +"Below is an example for setting up nox to use mamba (or conda) for your " +"environment manager. Note that unlike venv, conda can automatically " +"install the various versions of Python that you need. You won't need to " +"install all four Python versions if you use conda/mamba, like you do with" +" `venv`." +msgstr "" + +#: ../../tests/run-tests.md:242 +msgid "" +"For `conda` to work with `nox`, you will need to ensure that either " +"`conda` or `mamba` is installed on your computer." +msgstr "" + +#: ../../tests/run-tests.md:264 +msgid "To run the above session you'd use:" +msgstr "" + +#: ../../tests/test-types.md:1 +msgid "Test Types for Python packages" +msgstr "" + +#: ../../tests/test-types.md:3 +msgid "Three types of tests: Unit, Integration & Functional Tests" +msgstr "" + +#: ../../tests/test-types.md:5 +msgid "" +"There are different types of tests that you want to consider when " +"creating your test suite:" +msgstr "" + +#: ../../tests/test-types.md:8 +msgid "Unit tests" +msgstr "" + +#: ../../tests/test-types.md:9 +msgid "Integration" +msgstr "" + +#: ../../tests/test-types.md:10 +msgid "End-to-end (also known as Functional) tests" +msgstr "" + +#: ../../tests/test-types.md:12 +msgid "" +"Each type of test has a different purpose. Here, you will learn about all" +" three types of tests." +msgstr "" + +#: ../../tests/test-types.md:15 +msgid "" +"I think this page would be stronger if we did have some examples from our" +" package here: https://github.com/pyOpenSci/pyosPackage" +msgstr "" + +#: ../../tests/test-types.md:20 +msgid "Unit Tests" +msgstr "" + +#: ../../tests/test-types.md:22 +msgid "" +"A unit test involves testing individual components or units of code in " +"isolation to ensure that they work correctly. The goal of unit testing is" +" to verify that each part of the software, typically at the function or " +"method level, performs its intended task correctly." +msgstr "" + +#: ../../tests/test-types.md:24 +msgid "" +"Unit tests can be compared to examining each piece of your puzzle to " +"ensure parts of it are not broken. If all of the pieces of your puzzle " +"don’t fit together, you will never complete it. Similarly, when working " +"with code, tests ensure that each function, attribute, class, method " +"works properly when isolated." +msgstr "" + +#: ../../tests/test-types.md:26 +msgid "" +"**Unit test example:** Pretend that you have a function that converts a " +"temperature value from Celsius to Fahrenheit. A test for that function " +"might ensure that when provided with a value in Celsius, the function " +"returns the correct value in degrees Fahrenheit. That function is a unit " +"test. It checks a single unit (function) in your code." +msgstr "" + +#: ../../tests/test-types.md:44 +msgid "" +"Example unit test for the above function. You'd run this test using the " +"`pytest` command in your **tests/** directory." +msgstr "" + +#: ../../tests/test-types.md:65 ../../tests/test-types.md:115 +msgid "" +"image of puzzle pieces that all fit together nicely. The puzzle pieces " +"are colorful - purple, green and teal." +msgstr "" + +#: ../../tests/test-types.md:69 +msgid "" +"Your unit tests should ensure each part of your code works as expected on" +" its own." +msgstr "" + +#: ../../tests/test-types.md:72 +msgid "Integration tests" +msgstr "" + +#: ../../tests/test-types.md:74 +msgid "" +"Integration tests involve testing how parts of your package work together" +" or integrate. Integration tests can be compared to connecting a bunch of" +" puzzle pieces together to form a whole picture. Integration tests focus " +"on how different pieces of your code fit and work together." +msgstr "" + +#: ../../tests/test-types.md:76 +msgid "" +"For example, if you had a series of steps that collected temperature data" +" in a spreadsheet, converted it from degrees celsius to Fahrenheit and " +"then provided an average temperature for a particular time period. An " +"integration test would ensure that all parts of that workflow behaved as " +"expected." +msgstr "" + +#: ../../tests/test-types.md:107 +msgid "" +"image of two puzzle pieces with some missing parts. The puzzle pieces are" +" purple teal yellow and blue. The shapes of each piece don’t fit " +"together." +msgstr "" + +#: ../../tests/test-types.md:112 +msgid "" +"If puzzle pieces have missing ends, they can’t work together with other " +"elements in the puzzle. The same is true with individual functions, " +"methods and classes in your software. The code needs to work both " +"individually and together to perform certain sets of tasks." +msgstr "" + +#: ../../tests/test-types.md:120 +msgid "" +"Your integration tests should ensure that parts of your code that are " +"expected to work together, do so as expected." +msgstr "" + +#: ../../tests/test-types.md:124 +msgid "End-to-end (functional) tests" +msgstr "" + +#: ../../tests/test-types.md:126 +msgid "" +"End-to-end tests (also referred to as functional tests) in Python are " +"like comprehensive checklists for your software. They simulate real user " +"end-to-end workflows to make sure the code base supports real life " +"applications and use-cases from start to finish. These tests help catch " +"issues that might not show up in smaller tests and ensure your entire " +"application or program behaves correctly. Think of them as a way to give " +"your software a final check before it's put into action, making sure it's" +" ready to deliver a smooth experience to its users." +msgstr "" + +#: ../../tests/test-types.md:128 +msgid "Image of a completed puzzle showing a daisy" +msgstr "" + +#: ../../tests/test-types.md:133 +msgid "" +"End-to-end or functional tests represent an entire workflow that you " +"expect your package to support." +msgstr "" + +#: ../../tests/test-types.md:137 +msgid "" +"End-to-end test also test how a program runs from start to finish. A " +"tutorial that you add to your documentation that runs in CI in an " +"isolated environment is another example of an end-to-end test." +msgstr "" + +#: ../../tests/test-types.md:140 +msgid "" +"For scientific packages, creating short tutorials that highlight core " +"workflows that your package supports, that are run when your " +"documentation is built could also serve as end-to-end tests." +msgstr "" + +#: ../../tests/test-types.md:143 +msgid "Comparing unit, integration and end-to-end tests" +msgstr "" + +#: ../../tests/test-types.md:145 +msgid "" +"Unit tests, integration tests, and end-to-end tests have complementary " +"advantages and disadvantages. The fine-grained nature of unit tests make " +"them well-suited for isolating where errors are occurring. However, unit " +"tests are not useful for verifying that different sections of code work " +"together." +msgstr "" + +#: ../../tests/test-types.md:147 +msgid "" +"Integration and end-to-end tests verify that the different portions of " +"the program work together, but are less well-suited for isolating where " +"errors are occurring. For example, when you refactor your code, it is " +"possible that that your end-to-end tests will break. But if the refactor " +"didn't introduce new behavior to your existing code, then you can rely on" +" your unit tests to continue to pass, testing the original functionality " +"of your code." +msgstr "" + +#: ../../tests/test-types.md:152 +msgid "" +"It is important to note that you don't need to spend energy worrying " +"about the specifics surrounding the different types of tests. When you " +"begin to work on your test suite, consider what your package does and how" +" you may need to test parts of your package. Bring familiar with the " +"different types of tests can provides a framework to help you think about" +" writing tests and how different types of tests can complement each " +"other." +msgstr "" + +#: ../../tests/tests-ci.md:1 +msgid "Run tests with Continuous Integration" +msgstr "" + +#: ../../tests/tests-ci.md:3 +msgid "" +"Running your [test suite locally](run-tests) is useful as you develop " +"code and also test new features or changes to the code base. However, you" +" also will want to setup Continuous Integration (CI) to run your tests " +"online. CI allows you to run all of your tests in the cloud. While you " +"may only be able to run tests locally on a specific operating system, " +"using CI you can specify tests to run both on various versions of Python " +"and across different operating systems." +msgstr "" + +#: ../../tests/tests-ci.md:5 +msgid "" +"CI can also be triggered for pull requests and pushes to your repository." +" This means that every pull request that you, your maintainer team or a " +"contributor submit, can be tested. In the end CI testing ensures your " +"code continues to run as expected even as changes are made to the code " +"base." +msgstr "" + +#: ../../tests/tests-ci.md:9 +msgid "" +"Learn more about Continuous Integration and how it can be used, here. " +"(add link)" +msgstr "" + +#: ../../tests/tests-ci.md:13 +msgid "CI & pull requests" +msgstr "" + +#: ../../tests/tests-ci.md:15 +msgid "" +"CI is invaluable if you have outside people contributing to your " +"software. You can setup CI to run on all pull requests submitted to your " +"repository. CI can make your repository more friendly to new potential " +"contributors. It allows users to contribute code, documentation fixes and" +" more without having to create development environments, run tests and " +"build documentation locally." +msgstr "" + +#: ../../tests/tests-ci.md:22 +msgid "Example GitHub action that runs tests" +msgstr "" + +#: ../../tests/tests-ci.md:24 +msgid "" +"Below is an example GitHub action that runs tests using nox across both " +"Windows, Mac and Linux and on Python versions 3.9-3.11." +msgstr "" + +#: ../../tests/tests-ci.md:28 +msgid "" +"To work properly, this file should be located in a root directory of your" +" GitHub repository:" +msgstr "" + +#: ../../tests/write-tests.md:1 +msgid "Write tests for your Python package" +msgstr "" + +#: ../../tests/write-tests.md:3 +msgid "" +"Writing code that tests your package code, also known as test suites, is " +"important for you as a maintainer, your users, and package contributors. " +"Test suites consist of sets of functions, methods, and classes that are " +"written with the intention of making sure a specific part of your code " +"works as you expected it to." +msgstr "" + +#: ../../tests/write-tests.md:7 +msgid "Why write tests for your package?" +msgstr "" + +#: ../../tests/write-tests.md:9 +msgid "" +"Tests act as a safety net for code changes. They help you spot and " +"rectify bugs before they affect users. Tests also instill confidence that" +" code alterations from contributors won't breaking existing " +"functionality." +msgstr "" + +#: ../../tests/write-tests.md:13 +msgid "Writing tests for your Python package is important because:" +msgstr "" + +#: ../../tests/write-tests.md:15 +msgid "" +"**Catch Mistakes:** Tests are a safety net. When you make changes or add " +"new features to your package, tests can quickly tell you if you " +"accidentally broke something that was working fine before." +msgstr "" + +#: ../../tests/write-tests.md:16 +msgid "" +"**Save Time:** Imagine you have a magic button that can automatically " +"check if your package is still working properly. Tests are like that " +"magic button! They can run all those checks for you saving you time." +msgstr "" + +#: ../../tests/write-tests.md:17 +msgid "" +"**Easier Collaboration:** If you're working with others, or have outside " +"contributors, tests help everyone stay on the same page. Your tests " +"explain how your package is supposed to work, making it easier for others" +" to understand and contribute to your project." +msgstr "" + +#: ../../tests/write-tests.md:18 +msgid "" +"**Fearless Refactoring:** Refactoring means making improvements to your " +"code structure without changing its behavior. Tests empower you to make " +"these changes as if you break something, test failures will let you know." +msgstr "" + +#: ../../tests/write-tests.md:19 +msgid "" +"**Documentation:** Tests serve as technical examples of how to use your " +"package. This can be helpful for a new technical contributor that wants " +"to contribute code to your package. They can look at your tests to " +"understand how parts of your code functionality fits together." +msgstr "" + +#: ../../tests/write-tests.md:20 +msgid "" +"**Long-Term ease of maintenance:** As your package evolves, tests ensure " +"that your code continues to behave as expected, even as you make changes " +"over time. Thus you are helping your future self when writing tests." +msgstr "" + +#: ../../tests/write-tests.md:21 +msgid "" +"**Easier pull request reviews:** By running your tests in a CI framework " +"such as GitHub actions, each time you or a contributor makes a change to " +"your code-base, you can catch issues and things that may have changed in " +"your code base. This ensures that your software behaves the way you " +"expect it to." +msgstr "" + +#: ../../tests/write-tests.md:23 +msgid "Tests for user edge cases" +msgstr "" + +#: ../../tests/write-tests.md:25 +msgid "" +"Edge cases refer to unexpected or \"outlier\" ways that some users may " +"use your package. Tests enable you to address various edge cases that " +"could impair your package's functionality. For example, what occurs if a " +"function expects a pandas `dataframe` but a user supplies a numpy " +"`array`? Does your code gracefully handle this situation, providing clear" +" feedback, or does it leave users frustrated by an unexplained failure?" +msgstr "" + +#: ../../tests/write-tests.md:33 +msgid "" +"For a good introduction to testing, see [this Software Carpentry " +"lesson](https://swcarpentry.github.io/python-novice-" +"inflammation/10-defensive.html)" +msgstr "" + +#: ../../tests/write-tests.md:41 +msgid "" +"Imagine you're working on a puzzle where each puzzle piece represents a " +"function, method, class or attribute in your Python package that you want" +" other people to be able to use. Would you want to give someone a puzzle " +"that has missing pieces or pieces that don't fit together? Providing " +"people with the right puzzle pieces that work together can be compared to" +" writing tests for your Python package." +msgstr "" + +#: ../../tests/write-tests.md:44 +msgid "Test examples" +msgstr "" + +#: ../../tests/write-tests.md:47 +msgid "" +"Let’s say you have a Python function that adds two numbers a and b " +"together." +msgstr "" + +#: ../../tests/write-tests.md:54 +msgid "" +"A test to ensure that function runs as you might expect when provided " +"with different numbers might look like this:" +msgstr "" + +#: ../../tests/write-tests.md:72 +msgid "🧩🐍" +msgstr "" + +#: ../../tests/write-tests.md:74 +msgid "How do I know what type of tests to write?" +msgstr "" + +#: ../../tests/write-tests.md:77 +msgid "" +"This section has been adapted from [a presentation by Nick " +"Murphy](https://zenodo.org/record/8185113)." +msgstr "" + +#: ../../tests/write-tests.md:80 +msgid "" +"At this point, you may be wondering - what should you be testing in your " +"package? Below are a few examples:" +msgstr "" + +#: ../../tests/write-tests.md:82 +msgid "" +"**Test some typical cases:** Test that the package functions as you " +"expect it to when users use it. For instance, if your package is supposed" +" to add two numbers, test that the outcome value of adding those two " +"numbers is correct." +msgstr "" + +#: ../../tests/write-tests.md:84 +msgid "" +"**Test special cases:** Sometimes there are special or outlier cases. For" +" instance, if a function performs a specific calculation that may become " +"problematic closer to the value = 0, test it with the input of both 0 and" +msgstr "" + +#: ../../tests/write-tests.md:86 +msgid "" +"**Test at and near the expected boundaries:** If a function requires a " +"value that is greater than or equal to 1, make sure that the function " +"still works with both the values 1 and less than one and 1.001 as well " +"(something close to the constraint value).." +msgstr "" + +#: ../../tests/write-tests.md:88 +msgid "" +"**Test that code fails correctly:** If a function requires a value " +"greater than or equal to 1, then test at 0.999. Make sure that the " +"function fails gracefully when given unexpected values and help and that " +"the user can easily understand why if failed (provides a useful error " +"message)." +msgstr "" + diff --git a/locales/ja/LC_MESSAGES/tutorials.po b/locales/ja/LC_MESSAGES/tutorials.po new file mode 100644 index 00000000..6f88c534 --- /dev/null +++ b/locales/ja/LC_MESSAGES/tutorials.po @@ -0,0 +1,5537 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../tutorials/add-license-coc.md:1 +msgid "Add a `LICENSE` & `CODE_OF_CONDUCT` to your Python package" +msgstr "" + +#: ../../tutorials/add-license-coc.md:3 +msgid "In the [previous lesson](add-readme) you:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:5 +msgid "" +" " +"Created a basic `README.md` file for your scientific Python package" +msgstr "" + +#: ../../tutorials/add-license-coc.md:7 +msgid "" +" " +"Learned about the core components that are useful to have in a `README` " +"file." +msgstr "" + +#: ../../tutorials/add-license-coc.md:9 ../../tutorials/add-readme.md:10 +msgid "Learning objectives" +msgstr "" + +#: ../../tutorials/add-license-coc.md:12 ../../tutorials/add-readme.md:12 +#: ../../tutorials/installable-code.md:41 ../../tutorials/pyproject-toml.md:22 +#: ../../tutorials/setup-py-to-pyproject-toml.md:15 +msgid "In this lesson you will learn:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:14 +msgid "" +"How to select a license and add a `LICENSE` file to your package " +"repository, with a focus on the GitHub interface." +msgstr "" + +#: ../../tutorials/add-license-coc.md:15 +msgid "How to add a `CODE_OF_CONDUCT` file to your package repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md:16 +msgid "" +"How you can use the Contributors Covenant website to add generic language" +" as a starting place for your `CODE_OF_CONDUCT`." +msgstr "" + +#: ../../tutorials/add-license-coc.md:19 +msgid "What is a license?" +msgstr "" + +#: ../../tutorials/add-license-coc.md:21 +msgid "" +"A license contains legal language about how users can use and reuse your " +"software. To set the `LICENSE` for your project, you:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:23 +msgid "" +"create a `LICENSE` file in your project directory that specifies the " +"license that you choose for your package and" +msgstr "" + +#: ../../tutorials/add-license-coc.md:24 +msgid "reference that file in your `pyproject.toml` data where metadata are set." +msgstr "" + +#: ../../tutorials/add-license-coc.md:26 +msgid "" +"By adding the `LICENSE` file to your `pyproject.toml` file, the `LICENSE`" +" will be included in your package's metadata which is used to populate " +"your package's PyPI landing page. The `LICENSE` is also used in your " +"GitHub repository's landing page interface." +msgstr "" + +#: ../../tutorials/add-license-coc.md:28 +msgid "What license should you use?" +msgstr "" + +#: ../../tutorials/add-license-coc.md:30 +msgid "" +"We suggest that you use a permissive license that accommodates the other " +"most commonly used licenses in the scientific Python ecosystem (MIT[^mit]" +" and BSD-3[^bsd3]). If you are unsure, use MIT given it's the generally " +"recommended license on [choosealicense.com](https://choosealicense.com/)." +msgstr "" + +#: ../../tutorials/add-license-coc.md:33 +msgid "Licenses for the scientific Python ecosystem" +msgstr "" + +#: ../../tutorials/add-license-coc.md:34 +msgid "" +"[We discuss licenses for the scientific Python ecosystem in more detail " +"here in our guidebook.](../documentation/repository-files/license-files)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:37 +msgid "Where should the `LICENSE` file live" +msgstr "" + +#: ../../tutorials/add-license-coc.md:39 +msgid "" +"Your `LICENSE` file should be placed at the root of your package's " +"repository. When you add the `LICENSE` at the root, GitHub will " +"automagically discover it and provide users with a direct link to your " +"`LICENSE` file within your GitHub repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md:45 +msgid "" +"Image showing the GitHub repository for SunPy an accepted pyOpenSci " +"package." +msgstr "" + +#: ../../tutorials/add-license-coc.md:47 +msgid "" +"Notice at the top of the README portion of the GitHub landing page, there" +" are three tabs directly linking to the `README` file which is visible, " +"the `CODE_OF_CONDUCT` file and one that specifies the license that SunPy " +"uses. These files are discovered by GitHub because they are placed in the" +" root of the project directory using standard naming conventions." +msgstr "" + +#: ../../tutorials/add-license-coc.md:54 +msgid "How to add a `LICENSE` file to your package directory" +msgstr "" + +#: ../../tutorials/add-license-coc.md:56 +msgid "There are several ways to add a `LICENSE` file:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:58 +msgid "" +"When you create a new repository on GitHub, it will ask you if you wish " +"to add a `LICENSE` file at that time. If you select yes, it will create " +"the file for you." +msgstr "" + +#: ../../tutorials/add-license-coc.md:59 +msgid "" +"You can add a `LICENSE` through the GitHub gui following the [ instructions " +"here](https://docs.github.com/en/communities/setting-up-your-project-for-" +"healthy-contributions/adding-a-license-to-a-repository)." +msgstr "" + +#: ../../tutorials/add-license-coc.md:60 +msgid "You can add the file manually as we are doing in this lesson." +msgstr "" + +#: ../../tutorials/add-license-coc.md:63 +msgid "If you completed the past lessons including" +msgstr "" + +#: ../../tutorials/add-license-coc.md:65 +msgid "[Making your code installable](installable-code.md) and" +msgstr "" + +#: ../../tutorials/add-license-coc.md:66 +msgid "[publishing your package to PyPI](publish-pypi.md)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:68 +msgid "" +"then you already have a `LICENSE` file containing text for the MIT " +"license in your Python package. Thus you can skip to the next section of " +"this tutorial which walks you through adding a `CODE_OF_CONDUCT`." +msgstr "" + +#: ../../tutorials/add-license-coc.md:70 +msgid "" +"If you don't yet have a `LICENSE` file in your directory, then continue " +"reading." +msgstr "" + +#: ../../tutorials/add-license-coc.md:73 +msgid "How to add a `LICENSE` to your package - the manual way" +msgstr "" + +#: ../../tutorials/add-license-coc.md:75 +msgid "" +"If you don't already have a `LICENSE` file, and you are not yet using a " +"platform such as GitHub or GitLab, then you can create a `LICENSE` file " +"by" +msgstr "" + +#: ../../tutorials/add-license-coc.md:77 +msgid "Create a new file called `LICENSE`. If you are using shell you can type:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:84 +msgid "Go to [choosealicense.com](https://choosealicense.com/)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:85 +msgid "Select permissive license" +msgstr "" + +#: ../../tutorials/add-license-coc.md:86 +msgid "" +"It will suggest that you use the [MIT " +"license](https://choosealicense.com/licenses/mit/)." +msgstr "" + +#: ../../tutorials/add-license-coc.md:87 +msgid "" +"Copy the license text that it provides into your `LICENSE` file that you " +"created above." +msgstr "" + +#: ../../tutorials/add-license-coc.md:88 +msgid "Save your file. You're all done!" +msgstr "" + +#: ../../tutorials/add-license-coc.md:90 +msgid "An overview of licenses in the scientific Python ecosystem" +msgstr "" + +#: ../../tutorials/add-license-coc.md:93 +msgid "" +"In the pyOpenSci [packaging guidebook](../documentation/repository-files" +"/license-files), we provide an overview of licenses in the scientific " +"Python ecosystem. We review why license files are important, which ones " +"are most commonly used for scientific software and how to select the " +"correct license." +msgstr "" + +#: ../../tutorials/add-license-coc.md:95 +msgid "" +"If you want a broad overview of why licenses are important for protecting" +" open source software, [check out this blog post that overviews the legal" +" side of things.](https://opensource.guide/legal/#just-give-me-the-tldr-" +"on-what-i-need-to-protect-my-project)" +msgstr "" + +#: ../../tutorials/add-license-coc.md +msgid "Instructions for adding a `LICENSE` file within the GitHub interface" +msgstr "" + +#: ../../tutorials/add-license-coc.md +msgid "Add license: new GitHub repository" +msgstr "" + +#: ../../tutorials/add-license-coc.md:106 +msgid "" +"When you create a new GitHub repository you can add a `LICENSE` file " +"through the GitHub interface." +msgstr "" + +#: ../../tutorials/add-license-coc.md:111 +msgid "" +"Screenshot of the create new repository interface that GitHub provides. " +"The elements of this are the owner and repository name for the new repo. " +"Below that you can add a description of the repository. Below that you " +"can set it to be public or private. At the bottom of the interface there " +"is an Add a README checkbox where it will add a blank readme file for " +"you. At the very bottom there is a line to add a .gitignore file and " +"another to choose a license." +msgstr "" + +#: ../../tutorials/add-license-coc.md:113 +msgid "" +"Image showing the GitHub interface that allows you to add a `LICENSE` and" +" `README` file when you create a new repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md +msgid "Add `LICENSE`: Existing GitHub repository" +msgstr "" + +#: ../../tutorials/add-license-coc.md:119 +msgid "" +"If you already have a GitHub repository for your package, then you can " +"add a `LICENSE` using the GitHub interface by adding a new file to the " +"repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md:121 +msgid "" +"Follow the instructions to select and add a license to your repository on" +" the [GitHub LICENSE page](https://docs.github.com/en/communities" +"/setting-up-your-project-for-healthy-contributions/adding-a-license-" +"to-a-repository) ." +msgstr "" + +#: ../../tutorials/add-license-coc.md:122 +msgid "" +"Once you have added your `LICENSE` file, be sure to sync your git local " +"repository with the repository on GitHub.com. This means running `git " +"pull` to update your local branch." +msgstr "" + +#: ../../tutorials/add-license-coc.md:125 +msgid "" +"Image showing what the LICENSE file looks like in the GItHub interface. " +"At the top you can see the actual license which in this image is BSD " +"3-clause New or revised license. Then there is some text describing both " +"what the license is and the associated permissions for that specific " +"license. At the bottom of the image, the actual text for the license is " +"shown in the LICENSE file." +msgstr "" + +#: ../../tutorials/add-license-coc.md:127 +msgid "" +"You can view a summary of the `LICENSE` chosen on your project's GitHub " +"landing page." +msgstr "" + +#: ../../tutorials/add-license-coc.md:134 +msgid "" +"Now you know how to add a `LICENSE` to your project. Next, you'll learn " +"about the `CODE_OF_CONDUCT.md` file and how to add it to your package " +"directory." +msgstr "" + +#: ../../tutorials/add-license-coc.md:139 +msgid "What is a code of conduct file?" +msgstr "" + +#: ../../tutorials/add-license-coc.md:141 +msgid "" +"A `CODE_OF_CONDUCT` file is used to establish guidelines for how people " +"in your community interact." +msgstr "" + +#: ../../tutorials/add-license-coc.md:143 +msgid "" +"This file is critical to supporting your community as it grows. The " +"`CODE_OF_CONDUCT`:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:146 +msgid "" +"Establishes guidelines for how users and contributors interact with each " +"other and you in your software repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md:147 +msgid "Identifies negative behaviors that you don't want in your interactions." +msgstr "" + +#: ../../tutorials/add-license-coc.md:149 +msgid "" +"You can use your code of conduct as a tool that can be referenced when " +"moderating challenging conversations." +msgstr "" + +#: ../../tutorials/add-license-coc.md:151 +msgid "What to put in your `CODE_OF_CONDUCT` file" +msgstr "" + +#: ../../tutorials/add-license-coc.md:153 +msgid "" +"If you are unsure of what language to add to your `CODE_OF_CONDUCT` file," +" we suggest that you adopt the [contributor covenant " +"language](https://www.contributor-" +"covenant.org/version/2/1/code_of_conduct/) as a starting place." +msgstr "" + +#: ../../tutorials/add-license-coc.md:156 +msgid "" +"![Contributor " +"Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:156 +msgid "Contributor Covenant" +msgstr "" + +#: ../../tutorials/add-license-coc.md:158 +msgid "" +"The `CODE_OF_CONDUCT.md` should be placed at the root of your project " +"directory, similar to the `LICENSE` file." +msgstr "" + +#: ../../tutorials/add-license-coc.md:160 +msgid "How to add a `CODE_OF_CONDUCT` file to your package directory" +msgstr "" + +#: ../../tutorials/add-license-coc.md:162 +msgid "" +"Add a `CODE_OF_CONDUCT.md` file to the root of your repository if it " +"doesn't already exist." +msgstr "" + +#: ../../tutorials/add-license-coc.md:168 +msgid "" +"Visit the [contributor covenant website](https://www.contributor-" +"covenant.org/) and add [the markdown version of their code of " +"conduct](https://www.contributor-" +"covenant.org/version/2/1/code_of_conduct/code_of_conduct.md) to your " +"`CODE_OF_CONDUCT.md` file. Be sure to fill in any placeholder " +"information. Read the text closely to ensure you both understand it and " +"also agree with its contents!" +msgstr "" + +#: ../../tutorials/add-license-coc.md:170 +msgid "That's it - you've now added a code of conduct to your package directory." +msgstr "" + +#: ../../tutorials/add-license-coc.md:172 +msgid "Additional Code of Conduct resources" +msgstr "" + +#: ../../tutorials/add-license-coc.md:175 +msgid "" +"[ Guide: `CODE_OF_CONDUCT.md` " +"files](https://docs.github.com/en/communities/setting-up-your-project-" +"for-healthy-contributions/adding-a-code-of-conduct-to-your-project)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:176 +msgid "" +"[pyOpenSci package guide `CODE_OF_CONDUCT.md` " +"overview](https://www.pyopensci.org/python-package-guide/documentation" +"/repository-files/code-of-conduct-file.html)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:179 ../../tutorials/add-readme.md:233 +#: ../../tutorials/publish-conda-forge.md:463 +#: ../../tutorials/pyproject-toml.md:673 +msgid " Wrap up" +msgstr "" + +#: ../../tutorials/add-license-coc.md:181 +msgid "In this lesson and the [last lesson](add-readme), you have added a:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:183 +msgid "`README` file;" +msgstr "" + +#: ../../tutorials/add-license-coc.md:184 +msgid "`LICENSE` file and a" +msgstr "" + +#: ../../tutorials/add-license-coc.md:185 +msgid "`CODE_OF_CONDUCT` file." +msgstr "" + +#: ../../tutorials/add-license-coc.md:187 +msgid "" +"These are fundamental files needed for every scientific Python package " +"repository. These files help users understand how to use your package and" +" interact with package maintainers." +msgstr "" + +#: ../../tutorials/add-license-coc.md:191 +msgid "In the upcoming lessons, you will:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:193 +msgid "" +"[Add more metadata to your `pyproject.toml` file](pyproject-toml) to " +"support building and publishing your package on PyPI." +msgstr "" + +#: ../../tutorials/add-license-coc.md:194 +msgid "" +"Publish a new version of your Python package to the test PyPI to preview " +"the updated metadata landing page." +msgstr "" + +#: ../../tutorials/add-license-coc.md:199 +#: ../../tutorials/installable-code.md:642 +#: ../../tutorials/publish-conda-forge.md:475 +#: ../../tutorials/publish-pypi.md:394 +msgid "Footnotes" +msgstr "" + +#: ../../tutorials/add-license-coc.md:201 +msgid "https://opensource.org/license/mit/" +msgstr "" + +#: ../../tutorials/add-license-coc.md:202 +msgid "https://opensource.org/license/bsd-3-clause/" +msgstr "" + +#: ../../tutorials/add-readme.md:1 +msgid "Add a README file to your Python package" +msgstr "" + +#: ../../tutorials/add-readme.md:3 +msgid "In the previous lessons you learned:" +msgstr "" + +#: ../../tutorials/add-readme.md:5 +msgid "[What a Python package is](intro.md)" +msgstr "" + +#: ../../tutorials/add-readme.md:6 +msgid "[How to make your code installable](installable-code)" +msgstr "" + +#: ../../tutorials/add-readme.md:7 +msgid "[How to publish your package to (test) PyPI](publish-pypi.md)" +msgstr "" + +#: ../../tutorials/add-readme.md:8 +msgid "[How to publish your package to conda-forge](publish-conda-forge.md)" +msgstr "" + +#: ../../tutorials/add-readme.md:14 +msgid "How to add a **README.md** file to your package." +msgstr "" + +#: ../../tutorials/add-readme.md:15 +msgid "What the core elements of a **README.md** file are." +msgstr "" + +#: ../../tutorials/add-readme.md:18 +msgid "What is a README file?" +msgstr "" + +#: ../../tutorials/add-readme.md:20 +msgid "" +"The `README.md` file is a markdown file located at the root of your " +"project directory that helps a user understand:" +msgstr "" + +#: ../../tutorials/add-readme.md:23 +msgid "You package's name" +msgstr "" + +#: ../../tutorials/add-readme.md:24 +msgid "" +"What the package does. Your README file should clearly state the " +"problem(s) that your software is designed to solve and its target " +"audience." +msgstr "" + +#: ../../tutorials/add-readme.md:25 +msgid "The current development \"state\" of the package (through badges)" +msgstr "" + +#: ../../tutorials/add-readme.md:26 +msgid "How to get started with using your package." +msgstr "" + +#: ../../tutorials/add-readme.md:27 +msgid "How to contribute to your package" +msgstr "" + +#: ../../tutorials/add-readme.md:28 +msgid "How to cite your package" +msgstr "" + +#: ../../tutorials/add-readme.md:30 +msgid "" +"Your **README.md** file is important as it is often the first thing that " +"someone sees before they install your package. The README file is also " +"used to populate your PyPI landing page." +msgstr "" + +#: ../../tutorials/add-readme.md:32 +msgid "" +"Note that there is no specific content structure for README files. " +"However, this tutorial outlines the sections that we suggest that you " +"include in your README file." +msgstr "" + +#: ../../tutorials/add-readme.md:36 +msgid "Create a README.md file for your package" +msgstr "" + +#: ../../tutorials/add-readme.md:38 +msgid "It's time to add a `README.md` file to your project directory." +msgstr "" + +#: ../../tutorials/add-readme.md:40 +msgid "Step 0: Create a README file" +msgstr "" + +#: ../../tutorials/add-readme.md:41 +msgid "" +"To get started, if you don't already have a README.md file in your " +"project directory, create one." +msgstr "" + +#: ../../tutorials/add-readme.md:44 +msgid "If you created your project directory from" +msgstr "" + +#: ../../tutorials/add-readme.md:46 +msgid "a GitHub repository online" +msgstr "" + +#: ../../tutorials/add-readme.md:47 +msgid "using `hatch init`" +msgstr "" + +#: ../../tutorials/add-readme.md:49 +msgid "Then you may already have a README.MD file in your project directory." +msgstr "" + +#: ../../tutorials/add-readme.md:55 +msgid "Step 1: Add the name of your package as the README title" +msgstr "" + +#: ../../tutorials/add-readme.md:57 +msgid "At the top of the `README.md` file, add the name of your package." +msgstr "" + +#: ../../tutorials/add-readme.md:59 +msgid "" +"If you are using markdown it should be a header 1 (H1) tag which is " +"denoted with a single `#` sign." +msgstr "" + +#: ../../tutorials/add-readme.md:61 +msgid "`# Package-title-here`" +msgstr "" + +#: ../../tutorials/add-readme.md:63 +msgid "Step 2: add badges to the top of your README file" +msgstr "" + +#: ../../tutorials/add-readme.md:65 +msgid "" +"It's common for maintainers to add badges to the top of their README " +"files. Badges allow you and your package users to track things like:" +msgstr "" + +#: ../../tutorials/add-readme.md:67 +msgid "Broken documentation and test builds." +msgstr "" + +#: ../../tutorials/add-readme.md:68 +msgid "Versions of your package that are on PyPI and conda." +msgstr "" + +#: ../../tutorials/add-readme.md:69 +msgid "" +"Whether your package has been reviewed and vetted by an organization such" +" as pyOpenSci and/or JOSS." +msgstr "" + +#: ../../tutorials/add-readme.md:71 +msgid "" +"If you have already published your package to pypi.org you can use " +"[shields.io to create a package version badge](https://shields.io/badges" +"/py-pi-version). This badge will dynamically update as you release new " +"versions of your package to PyPI." +msgstr "" + +#: ../../tutorials/add-readme.md:73 +msgid "" +"If not, you can leave the top empty for now and add badges to your README" +" at a later point as they make sense." +msgstr "" + +#: ../../tutorials/add-readme.md:75 +msgid "Step 3: Add a description of what your package does" +msgstr "" + +#: ../../tutorials/add-readme.md:77 +msgid "" +"Below the badges (if you have them), add a section of text that provides " +"an easy-to-understand overview of what your package does." +msgstr "" + +#: ../../tutorials/add-readme.md:81 +msgid "Keep this section short." +msgstr "" + +#: ../../tutorials/add-readme.md:82 +msgid "Try to avoid jargon." +msgstr "" + +#: ../../tutorials/add-readme.md:83 +msgid "" +"Define technical terms that you use to make the description accessible to" +" more people." +msgstr "" + +#: ../../tutorials/add-readme.md:85 +msgid "" +"Remember that the more people understand what your package does, the more" +" people will use it." +msgstr "" + +#: ../../tutorials/add-readme.md:87 +msgid "Step 4: Add package installation instructions" +msgstr "" + +#: ../../tutorials/add-readme.md:89 +msgid "Next, add instructions that tell users how to install your package." +msgstr "" + +#: ../../tutorials/add-readme.md:91 +msgid "" +"For example, can they use pip to install your package? `python -m pip " +"install packagename`" +msgstr "" + +#: ../../tutorials/add-readme.md:94 +msgid "or conda?" +msgstr "" + +#: ../../tutorials/add-readme.md:96 +msgid "`conda install -c conda-forge packagename`." +msgstr "" + +#: ../../tutorials/add-readme.md:98 +msgid "" +"If you haven't yet published your package to pypi.org then you can skip " +"this section and come back and add these instructions later." +msgstr "" + +#: ../../tutorials/add-readme.md:102 +msgid "Step 5: Any additional setup" +msgstr "" + +#: ../../tutorials/add-readme.md:104 +msgid "" +"In some cases, your package users may need to manually install other " +"tools in order to use your package. If that is the case, be sure to add a" +" section on additional setup to your README file." +msgstr "" + +#: ../../tutorials/add-readme.md:109 +msgid "" +"Here, briefly document (or link to documentation for) any additional " +"setup that is required to use your package. This might include:" +msgstr "" + +#: ../../tutorials/add-readme.md:113 +msgid "authentication information, if it is applicable to your package." +msgstr "" + +#: ../../tutorials/add-readme.md:114 +msgid "additional tool installations, such as GDAL." +msgstr "" + +#: ../../tutorials/add-readme.md:117 +msgid "" +"Many packages won't need an additional setup section in their README. In " +"that case you can always skip this section." +msgstr "" + +#: ../../tutorials/add-readme.md:122 +msgid "Step 6: Add a get started section" +msgstr "" + +#: ../../tutorials/add-readme.md:124 +msgid "" +"Next add a get-started section. Within this section, add a small code " +"example that demonstrates importing and using some of the functionality " +"in your package." +msgstr "" + +#: ../../tutorials/add-readme.md:127 +msgid "Provide a fully functional code snippet if possible" +msgstr "" + +#: ../../tutorials/add-readme.md:130 +msgid "" +"It is important to try to make the code examples that you provide your " +"users as useful as possible." +msgstr "" + +#: ../../tutorials/add-readme.md:132 +msgid "" +"Be sure to provide a copy/paste code example that will work as-is when " +"pasted into a Jupyter Notebook or .py file if that is possible." +msgstr "" + +#: ../../tutorials/add-readme.md:134 +msgid "" +"If there are tokens and other steps needed to run your package, be sure " +"to be clear about what those steps are." +msgstr "" + +#: ../../tutorials/add-readme.md:137 +msgid "For the pyosPackage, a short get started demo might look like this:" +msgstr "" + +#: ../../tutorials/add-readme.md:145 +msgid "" +"Or it could simply be a link to a getting started tutorial that you have " +"created. If you don't have this yet, you can leave it empty for the time " +"being." +msgstr "" + +#: ../../tutorials/add-readme.md:148 +msgid "" +"This would also be a great place to add links to tutorials that help " +"users understand how to use your package for common workflows." +msgstr "" + +#: ../../tutorials/add-readme.md:153 +msgid "Step 7: Community section" +msgstr "" + +#: ../../tutorials/add-readme.md:155 +msgid "" +"The community section of your README file is a place to include " +"information for users who may want to engage with your project. This " +"engagement will likely happen on a platform like GitHub or GitLab." +msgstr "" + +#: ../../tutorials/add-readme.md:157 +msgid "" +"In the community section, you will add links to your contributing guide " +"and `CODE_OF_CONDUCT.md`. You will create a [`CODE_OF_CONDUCT.md` file in" +" the next lesson](add-license-coc)." +msgstr "" + +#: ../../tutorials/add-readme.md:160 +msgid "" +"As your package grows you may also have a link to a development guide " +"that contributors and your maintainer team will follow. The development " +"guide outlines how to perform maintenance tasks such as:" +msgstr "" + +#: ../../tutorials/add-readme.md:163 +msgid "running tests" +msgstr "" + +#: ../../tutorials/add-readme.md:164 +msgid "making package releases" +msgstr "" + +#: ../../tutorials/add-readme.md:165 +msgid "building documentation" +msgstr "" + +#: ../../tutorials/add-readme.md:166 +msgid "and more." +msgstr "" + +#: ../../tutorials/add-readme.md:170 +msgid "Step 8: Citation information" +msgstr "" + +#: ../../tutorials/add-readme.md:172 +msgid "" +"Finally it is important to let users know how to cite your package. You " +"can communicate citation information in a few different ways." +msgstr "" + +#: ../../tutorials/add-readme.md:175 +msgid "" +"You can use a tool such as zenodo to create a DOI and associated citation" +" information for your package if it is hosted on a platform such as " +"GitHub. [Check out this short tutorial that covers setting that " +"up.](https://coderefinery.github.io/github-without-command-line/doi/)" +msgstr "" + +#: ../../tutorials/add-readme.md:179 +msgid "" +"Alternatively if you send your package through a peer review process such" +" as the [one lead by pyOpenSci](https://www.pyopensci.org/about-peer-" +"review/index.html). After being accepted by pyOpenSci, if your package is" +" in scope, you can be accepted by the Journal of Open Source Software and" +" get a cross-ref DOI through [our partnership with the Journal of Open " +"Source Software.](https://www.pyopensci.org/about-peer-review/index.html)" +msgstr "" + +#: ../../tutorials/add-readme.md:183 +msgid "The finished README file" +msgstr "" + +#: ../../tutorials/add-readme.md:185 +msgid "Your finished `README.md` file should look something like this:" +msgstr "" + +#: ../../tutorials/add-readme.md:235 +msgid "" +"It's important to consider the information that a new user or contributor" +" might need when creating your `README.md` file. While there is no " +"perfect template, above is a set of recommendations as you are just " +"getting started. You may find the need for other elements to be added to " +"this file as you further develop your package and as a community begins " +"to use your package." +msgstr "" + +#: ../../tutorials/add-readme.md:241 +msgid "" +"In the [next lesson](add-license-coc.md), you will add a LICENSE file to " +"your Python package. A license file is critical as it tells users how " +"they legally can (and can't) use your package. It also:" +msgstr "" + +#: ../../tutorials/add-readme.md:245 +msgid "Builds trust with your users" +msgstr "" + +#: ../../tutorials/add-readme.md:246 +msgid "Discourages misuse of your package and associated code" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:1 +msgid "Get to Know Hatch" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:3 +msgid "" +"Our Python packaging tutorials use the tool " +"[Hatch](https://hatch.pypa.io/latest/). While there are [many great " +"packaging tools](/package-structure-code/python-package-build-tools) out " +"there, we have selected Hatch because:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:8 +msgid "" +"It is an end-to-end tool that supports most of the steps required to " +"create a quality Python package. Beginners will have fewer tools to learn" +" if they use Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:11 +msgid "" +"It supports different build back-ends if you ever need to compile code in" +" other languages." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:13 +msgid "" +"As a community, pyOpenSci has decided that Hatch is a user-friendly tool " +"that supports many different scientific Python use cases." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:16 +msgid "" +"In this tutorial, you will install and get to know Hatch a bit more " +"before starting to use it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:19 +msgid "You need two things to successfully complete this tutorial:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:21 +msgid "You need Python installed." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:22 +msgid "You need Hatch installed." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:25 +msgid "" +"If you don't already have Python installed on your computer, Hatch will " +"do it for you when you install Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:29 +msgid "Install Hatch" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:31 +msgid "" +"To begin, follow the operating-system-specific instructions below to " +"install Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "MAC" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:38 +msgid "" +"Follow the instructions " +"[here](https://hatch.pypa.io/latest/install/#installers)." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:40 +msgid "" +"Download the latest GUI installer for MAC [hatch-" +"universal.pkg](https://github.com/pypa/hatch/releases/latest/download" +"/hatch-universal.pkg)." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:41 +msgid "Run the installer and follow the setup instructions." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:42 +msgid "If your terminal is open, then restart it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "Windows" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:48 +msgid "" +"In your browser, download the correct `.msi` file for your system: " +"[hatch-x64.msi](https://github.com/pypa/hatch/releases/latest/download/hatch-x64.msi)" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:50 +msgid "Run your downloaded installer file and follow the on-screen instructions." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "Linux" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:56 +msgid "" +"We suggest that you install Hatch using pipx on Linux. however, if you " +"prefer another method, check out the [Hatch installation " +"documentation](https://hatch.pypa.io/latest/install/) for other methods." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:70 +msgid "" +"Hatch can also be installed directly using " +"[pip](https://hatch.pypa.io/latest/install/#pip) or " +"[conda](https://hatch.pypa.io/latest/install/#conda). We encourage you to" +" follow the instructions above because we have found that the Hatch " +"installers for Windows and Mac are the easiest and most efficient." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:74 +msgid "" +"Our Linux users have found success installing Hatch with pipx if they " +"already use apt install." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:77 +msgid "" +"Both approaches (using a graphical installer on Windows/Mac and pipx) " +"ensure that you have Hatch installed globally. A global install means " +"that Hatch is available across all of your Python environments on your " +"computer." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:82 +msgid "Check that hatch installed correctly" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:84 +msgid "" +"Once you have completed the installation instructions above, you can open" +" your terminal, and make sure that Hatch installed correctly using the " +"command below:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:92 +msgid "" +"*Note the version number output of `hatch --version` will likely be " +"different from the output above in this tutorial.*" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:95 +msgid "Configure Hatch" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:97 +msgid "" +"Once you have installed Hatch, you can customize its configuration. This " +"includes setting the default name and setup for every package you create." +" While this step is not required, we suggest that you do it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:101 +msgid "" +"Hatch stores your configuration in a [`config.toml` " +"file](https://hatch.pypa.io/latest/config/project-templates/)." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:103 +msgid "" +"While you can update the `config.toml` file through the command line, it " +"might be easier to look at and update it in a text editor if you are " +"using it for the first time." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:107 +msgid "Step 1: Open and Edit Your `config.toml` File" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:109 +msgid "" +"To open the config file in your file browser, run the following command " +"in your shell:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:112 +msgid "`hatch config explore`" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:114 +msgid "" +"This will open up a directory window that allows you to double-click on " +"the file and open it in your favorite text editor." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:117 +msgid "" +"You can also retrieve the location of the Hatch config file by running " +"the following command in your shell:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:125 +msgid "Step 2 - update your email and name" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:127 +msgid "" +"Once the file is open, update the [template] table of the `config.toml` " +"file with your name and email. This information will be used in any " +"`pyproject.toml` metadata files that you create using Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:137 +msgid "Step 3" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:139 +msgid "Next, set tests to false in the `[template.plugins.default]` table." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:141 +msgid "" +"While tests are important, setting the tests configuration in Hatch to " +"`true` will create a more complex `pyproject.toml` file. You won't need " +"to use this feature in this beginner friendly tutorial series but we will" +" introduce it in later tutorials." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:146 +msgid "Your `config.toml` file should look something like the one below." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:184 +msgid "" +"Also notice that the default license option is MIT. While we will discuss" +" license in more detail in a later lesson, the MIT license is the " +"recommended permissive license from " +"[choosealicense.com](https://www.choosealicense.com) and as such we will " +"use it for this tutorial series." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:190 +msgid "You are of course welcome to select another license." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:192 +#: ../../tutorials/installable-code.md:22 +#: ../../tutorials/installable-code.md:411 +#: ../../tutorials/installable-code.md:502 ../../tutorials/intro.md:226 +#: ../../tutorials/publish-pypi.md:3 ../../tutorials/publish-pypi.md:178 +#: ../../tutorials/publish-pypi.md:350 ../../tutorials/pyproject-toml.md:718 +msgid "Todo" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:193 +msgid "" +"I think we'd need the SPDX license options here if they want to chose " +"bsd-3 for instance" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:196 +msgid "Step 4: Close the config file and run `hatch config show`" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:198 +msgid "" +"Once you have completed the steps above run the following command in your" +" shell." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:200 +msgid "`hatch config show`" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:202 +msgid "" +"`hatch config show` will print out the contents of your `config.toml` " +"file in your shell. look at the values and ensure that your name, email " +"is set. Also make sure that `tests=false`." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:206 +msgid "Hatch features" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:208 +msgid "" +"Hatch offers a suite of features that will make creating, publishing and " +"maintaining your Python package easier." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:211 +msgid "Comparison to other tools" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:213 +msgid "" +"[We compared Hatch to several of the other popular packaging tools in the" +" ecosystem including flit, pdm and poetry. Learn more here](package-" +"features)" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:216 +msgid "[More on Hatch here](hatch)" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:218 +msgid "A few features that Hatch offers" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:220 +msgid "" +"it will convert metadata stored in a `setup.py` or `setup.cfg` file to a " +"pyproject.toml file for you (see [Migrating setup.py to pyproject.toml " +"using Hatch](setup-py-to-pyproject-toml.md ))" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:222 +msgid "" +"It will help you by storing configuration information for publishing to " +"PyPI after you've entered it once." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:224 +msgid "Use `hatch -h` to see all of the available commands." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:226 +msgid "What's next" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:228 +msgid "" +"In the next lesson you'll learn how to package and make your code " +"installable using Hatch." +msgstr "" + +#: ../../tutorials/installable-code.md:6 +msgid "Make your Python code installable" +msgstr "" + +#: ../../tutorials/installable-code.md:8 +msgid "What we previously covered" +msgstr "" + +#: ../../tutorials/installable-code.md:9 +msgid "" +"[In the previous lesson](intro), you learned about what a Python package " +"is. You also learned about the [benefits of creating a Python package" +"](package-benefits)." +msgstr "" + +#: ../../tutorials/installable-code.md:13 +msgid "" +"Your next step in our packaging tutorial series is to create a Python " +"package that is installable both locally and remotely from a website such" +" as GitHub (or GitLab). The package that you create in this lesson will " +"have the bare minimum elements needed to be installable into a Python " +"environment." +msgstr "" + +#: ../../tutorials/installable-code.md:18 +msgid "" +"Making your code installable is an important steps towards creating a " +"full Python package that is directly installable from PyPI." +msgstr "" + +#: ../../tutorials/installable-code.md:23 +msgid "" +"Is it clear where to add commands? Bash vs. Python console Bash vs. Zsh " +"is different" +msgstr "" + +#: ../../tutorials/installable-code.md:25 +msgid "Does this lesson run as expected on windows and mac?" +msgstr "" + +#: ../../tutorials/installable-code.md:26 +msgid "" +"ADD: note about what makes something \"package worthy\", with a common " +"misconception being that a package should be production-ready code that's" +" valuable to a broad audience. this may not be a pervasive misconception " +"in Python, but a quick break-out with an explanation of what a package " +"can consist of would be helpful." +msgstr "" + +#: ../../tutorials/installable-code.md:31 +msgid "" +"Diagram showing the basic steps to creating an installable package. There" +" are 4 boxes with arrows pointing towards the right. The boxes read, your" +" code, create package structure, add metadata to pyproject.toml and pip " +"install package." +msgstr "" + +#: ../../tutorials/installable-code.md:33 +msgid "" +"A basic installable package needs a few things: code, a [specific package" +" file structure](https://www.pyopensci.org/python-package-guide/package-" +"structure-code/python-package-structure.html) and a `pyproject.toml` " +"containing your package's name and version. Once you have these items in " +"the correct directory structure, you can pip install your package into " +"any environment on your computer. You will learn how to create a basic " +"installable package in this lesson." +msgstr "" + +#: ../../tutorials/installable-code.md:37 +msgid "About this lesson" +msgstr "" + +#: ../../tutorials/installable-code.md:43 +msgid "" +"How to make your code installable into any Python environment both " +"locally and from GitHub" +msgstr "" + +#: ../../tutorials/installable-code.md:44 +msgid "" +"How to create a basic `pyproject.toml` file that includes package " +"dependencies and metadata. This file is required to make your package " +"installable." +msgstr "" + +#: ../../tutorials/installable-code.md:45 +msgid "" +"How to declare a [build backend](build_backends) which will be used to " +"[build](build-package) and install your package" +msgstr "" + +#: ../../tutorials/installable-code.md:46 +msgid "How to install your package in editable mode for interactive development" +msgstr "" + +#: ../../tutorials/installable-code.md:48 +msgid "**What you need to complete this lesson**" +msgstr "" + +#: ../../tutorials/installable-code.md:50 +msgid "" +"To complete this lesson you will need a local Python environment and " +"shell on your computer. You will also need to have [Hatch installed](get-" +"to-know-hatch)." +msgstr "" + +#: ../../tutorials/installable-code.md:53 +msgid "" +"If you are using Windows or are not familiar with Shell, you may want to " +"check out the Carpentries shell lesson[^shell-lesson]. Windows users will" +" likely need to configure a tool for any Shell and git related steps." +msgstr "" + +#: ../../tutorials/installable-code.md:55 +msgid "**What comes next**" +msgstr "" + +#: ../../tutorials/installable-code.md:57 +msgid "In the upcoming lessons you will learn how to:" +msgstr "" + +#: ../../tutorials/installable-code.md:59 +msgid "[Publish your package to PyPI](publish-pypi)" +msgstr "" + +#: ../../tutorials/installable-code.md:60 +msgid "Add a README file to your package to support community use" +msgstr "" + +#: ../../tutorials/installable-code.md:61 +msgid "" +"Add additional project metadata to your package to support PyPI " +"publication" +msgstr "" + +#: ../../tutorials/installable-code.md:67 +msgid "" +"This diagram has two smaller boxes with arrows pointing to the right to a" +" Python environment. The small boxes read your-package and pip install " +"package. The environment box on the right reads - your Python " +"environment. It them lists your-package along with a few other core " +"packages such as Matplotlib, NumPy, Pandas, Xarray and GeoPandas." +msgstr "" + +#: ../../tutorials/installable-code.md:69 +msgid "" +"Making your code installable is the first step towards creating a " +"publishable Python package. Once your code is installable, it is a Python" +" package and can be added to any Python environment on your computer and " +"imported in the same way that you might import a package such as Pandas " +"or GeoPandas. If your code is on GitHub or GitLab you can also install it" +" directly from there." +msgstr "" + +#: ../../tutorials/installable-code.md:74 +msgid "About the Python package directory structure" +msgstr "" + +#: ../../tutorials/installable-code.md:76 +msgid "" +"To make your Python code installable you need to create a specific " +"directory structure with the following elements:" +msgstr "" + +#: ../../tutorials/installable-code.md:78 +msgid "A `pyproject.toml` file." +msgstr "" + +#: ../../tutorials/installable-code.md:79 +msgid "A specific directory structure." +msgstr "" + +#: ../../tutorials/installable-code.md:80 +msgid "Some code." +msgstr "" + +#: ../../tutorials/installable-code.md:81 +msgid "An `__init__.py` file in your code directory." +msgstr "" + +#: ../../tutorials/installable-code.md:83 +msgid "The directory structure you’ll create in this lesson will look like this:" +msgstr "" + +#: ../../tutorials/installable-code.md:95 +msgid "About the basic package directory structure" +msgstr "" + +#: ../../tutorials/installable-code.md:97 +msgid "Notice a few things about the above layout:" +msgstr "" + +#: ../../tutorials/installable-code.md:99 +msgid "" +"Your package code lives within a `src/packagename` directory. We suggest " +"that you use `src` (short for **source code**) directory as it [ensures " +"that you are running tests on the installed version of your " +"code](https://www.pyopensci.org/python-package-guide/package-structure-" +"code/python-package-structure.html#the-src-layout-and-testing)." +msgstr "" + +#: ../../tutorials/installable-code.md:100 +msgid "" +"Within the `src` directory you have a package directory called " +"`pyospackage`. Use the name of your package for that directory name. This" +" will be the name for importing your package in Python code once " +"installed." +msgstr "" + +#: ../../tutorials/installable-code.md:101 +msgid "" +"In your package directory, you have an `__init__.py` file and all of your" +" Python modules. You will learn more about the `__init__.py` file below." +msgstr "" + +#: ../../tutorials/installable-code.md:102 +msgid "The `pyproject.toml` file lives at the root directory of your package." +msgstr "" + +#: ../../tutorials/installable-code.md:103 +msgid "" +"The name of the root directory for the package is **pyospackage** which " +"is the name of the package. This is not a requirement but you will often " +"see that the GitHub / GitLab repository and the root directory name are " +"the same as the package name." +msgstr "" + +#: ../../tutorials/installable-code.md:105 +msgid "What is an `__init__.py` file?" +msgstr "" + +#: ../../tutorials/installable-code.md:107 +msgid "" +"The `__init__.py` file tells Python that a directory should be treated as" +" a Python package. As such, a directory with an `__init__.py` file can be" +" imported directly into Python. The `__init__.py` file does not need to " +"contain any code in order for Python to recognize it; it can be empty." +msgstr "" + +#: ../../tutorials/installable-code.md:111 +msgid "" +"For example, following the file structure example above which has an " +"`__init__.py` file within it, you can run:" +msgstr "" + +#: ../../tutorials/installable-code.md:117 ../../tutorials/pyproject-toml.md:48 +msgid "What is a pyproject.toml file?" +msgstr "" + +#: ../../tutorials/installable-code.md:119 +msgid "The **pyproject.toml** file is:" +msgstr "" + +#: ../../tutorials/installable-code.md:121 +msgid "" +"Where you define your project’s metadata (including its name, authors, " +"license, etc)" +msgstr "" + +#: ../../tutorials/installable-code.md:122 +msgid "Where you define dependencies (the packages that it depends on)" +msgstr "" + +#: ../../tutorials/installable-code.md:123 +msgid "" +"Used to specify and configure what build backend you want to use to " +"[build your package](../package-structure-code/python-package-" +"distribution-files-sdist-wheel)." +msgstr "" + +#: ../../tutorials/installable-code.md:125 +msgid "" +"After the `__init__.py` and `pyproject.toml` files have been added, your " +"package can be built and distributed as an installable Python package " +"using tools such as pip. Note that the `pyproject.toml` file needs to " +"have a few basic items defined for the package to be installable " +"including:" +msgstr "" + +#: ../../tutorials/installable-code.md:131 +msgid "The `build-backend` that you want to use," +msgstr "" + +#: ../../tutorials/installable-code.md:132 +msgid "The project `name` and `version`." +msgstr "" + +#: ../../tutorials/installable-code.md:134 +msgid "Why the pyproject.toml file is important" +msgstr "" + +#: ../../tutorials/installable-code.md:138 +msgid "" +"The `pyproject.toml` file replaces some of the functionality of both the " +"`setup.py` file and `setup.cfg` files. If you try to pip install a " +"package with no `pyproject.toml` you will get the following error:" +msgstr "" + +#: ../../tutorials/installable-code.md:150 +msgid "Note about `setup.py`" +msgstr "" + +#: ../../tutorials/installable-code.md:154 +msgid "" +"If your project already defines a `setup.py` file, Hatch can be used to " +"automatically create the `pyproject.toml`." +msgstr "" + +#: ../../tutorials/installable-code.md:155 +msgid "" +"See [Using Hatch to Migrate setup.py to a pyproject.toml ](setup-py-to-" +"pyproject-toml.md)" +msgstr "" + +#: ../../tutorials/installable-code.md:161 +msgid "Time to create your Python package!" +msgstr "" + +#: ../../tutorials/installable-code.md:163 +msgid "" +"Now that you understand the basics of the Python package directory " +"structure, and associated key files (`__init__.py` and `pyproject.toml`)," +" it's time to create your Python package! Below you will create a " +"directory structure similar to the structure described above using Hatch." +msgstr "" + +#: ../../tutorials/installable-code.md:167 +msgid "Step 1: Set Up the Package Directory Structure" +msgstr "" + +#: ../../tutorials/installable-code.md:169 +msgid "Open your shell or preferred terminal." +msgstr "" + +#: ../../tutorials/installable-code.md:170 +msgid "" +"Use the shell `cd` command to navigate in your shell to the location " +"where you'd like your package directory to live. Hatch will create the " +"package directory for you" +msgstr "" + +#: ../../tutorials/installable-code.md:171 +msgid "Choose a name for your package. The name should:" +msgstr "" + +#: ../../tutorials/installable-code.md:172 +msgid "Have no spaces (*Required*)" +msgstr "" + +#: ../../tutorials/installable-code.md:173 +msgid "" +"Use all lowercase characters (*Recommended*). For this tutorial we will " +"use `pyospackage`." +msgstr "" + +#: ../../tutorials/installable-code.md:174 +msgid "" +"Only use letter and the characters _ or - in the name. This means that " +"the name `pyos*package` is not an acceptable name. However, the names " +"`pyos_package` or `pyos-package` both are ok" +msgstr "" + +#: ../../tutorials/installable-code.md:176 +msgid "Hatch and project names" +msgstr "" + +#: ../../tutorials/installable-code.md:177 +msgid "" +"Hatch makes some decisions for your project's name when you run `hatch " +"new`" +msgstr "" + +#: ../../tutorials/installable-code.md:179 +msgid "These include using:" +msgstr "" + +#: ../../tutorials/installable-code.md:180 +msgid "dashes for the top level directory" +msgstr "" + +#: ../../tutorials/installable-code.md:181 +msgid "dashes for the project name in the pyproject.toml" +msgstr "" + +#: ../../tutorials/installable-code.md:182 +msgid "underscores for the package directory name" +msgstr "" + +#: ../../tutorials/installable-code.md:196 +msgid "If you use a name with underscores, Hatch will return the same thing:" +msgstr "" + +#: ../../tutorials/installable-code.md:209 +msgid "" +"In both of the examples above the project name in the pyproject.toml file" +" that hatch creates is `pyos-package`." +msgstr "" + +#: ../../tutorials/installable-code.md:213 +msgid "Next run:" +msgstr "" + +#: ../../tutorials/installable-code.md:228 +msgid "Your final project directory structure should look like this:" +msgstr "" + +#: ../../tutorials/installable-code.md:243 +msgid "Step 2: Add module to your package" +msgstr "" + +#: ../../tutorials/installable-code.md:245 +msgid "" +"A Python module refers to a `.py` file containing the code that you want " +"your package to access and run. Within the `pyospackage` subdirectory, " +"add at least one Python modules (.py files)." +msgstr "" + +#: ../../tutorials/installable-code.md:247 +msgid "" +"If you don't have code already and are just learning how to create a " +"Python package, then create an empty `add_numbers.py` file. You will " +"populate the `add_numbers.py` file with code provided below." +msgstr "" + +#: ../../tutorials/installable-code.md:250 +msgid "Python modules and the `__init__.py` file" +msgstr "" + +#: ../../tutorials/installable-code.md:254 +msgid "" +"When you see the word module, we are referring to a `.py` file containing" +" Python code." +msgstr "" + +#: ../../tutorials/installable-code.md:257 +msgid "" +"The `__init__.py` allows Python to recognize that a directory contains " +"at least one module that may be imported and used in your code. A package" +" can have multiple modules[^python-modules]." +msgstr "" + +#: ../../tutorials/installable-code.md:261 +msgid "Your project directory should now look like this:" +msgstr "" + +#: ../../tutorials/installable-code.md:271 +msgid "Step 3: Add code to your module" +msgstr "" + +#: ../../tutorials/installable-code.md:273 +msgid "" +"If you are following along and making a Python package from scratch then " +"you can add the code below to your `add_numbers.py` module. The function " +"below adds two integers together and returns the result. Notice that the " +"code below has a few features that we will review in future tutorials:" +msgstr "" + +#: ../../tutorials/installable-code.md:275 +msgid "It has a [numpy-style docstring](numpy-docstring)" +msgstr "" + +#: ../../tutorials/installable-code.md:276 +msgid "It uses [typing](type-hints)" +msgstr "" + +#: ../../tutorials/installable-code.md:278 +msgid "" +"Python can support many different docstrings formats depending on the " +"documentation build system you wish to use. The most popular supported " +"formats for documenting Python objects are NumPy Style " +"Docstring[^numpydoc], Google Style Docstring[^googledoc], and the Epytext" +" Style Docstrings[^epytextdoc]." +msgstr "" + +#: ../../tutorials/installable-code.md:280 +msgid "**pyOpenSci recommends using the NumPy Docstring convention.**" +msgstr "" + +#: ../../tutorials/installable-code.md:282 +msgid "" +"If you aren’t familiar with docstrings or typing yet, that is ok. You can" +" review [this page in the pyOpenSci packaging " +"guide](https://www.pyopensci.org/python-package-guide/documentation" +"/write-user-documentation/document-your-code-api-docstrings.html) for an " +"overview of both topics." +msgstr "" + +#: ../../tutorials/installable-code.md:311 +msgid "Step 4: Modify metadata in your `pyproject.toml` file" +msgstr "" + +#: ../../tutorials/installable-code.md:313 +msgid "" +"Next, you will modify some of the metadata (information) that Hatch adds " +"to your `pyproject.toml` file. You are are welcome to copy the file we " +"have in our [example pyospackage GitHub " +"repository](https://github.com/pyOpenSci/pyosPackage)." +msgstr "" + +#: ../../tutorials/installable-code.md:317 +msgid "Brief overview of the TOML file" +msgstr "" + +#: ../../tutorials/installable-code.md:320 +msgid "" +"[The TOML format](https://toml.io/en/) consists of tables and variables. " +"Tables are sections of information denoted by square brackets:" +msgstr "" + +#: ../../tutorials/installable-code.md:322 +msgid "`[this-is-a-table]`." +msgstr "" + +#: ../../tutorials/installable-code.md:324 +msgid "" +"Tables can contain variables within them defined by an variable name and " +"an `=` sign. For instance, a `build-system` table most often holds two " +"(2) variables:" +msgstr "" + +#: ../../tutorials/installable-code.md:327 +msgid "" +"`requires = `, which tells a build tool what tools it needs to install " +"prior to building your package. In this case " +"[hatchling](https://pypi.org/project/hatchling/)" +msgstr "" + +#: ../../tutorials/installable-code.md:329 +msgid "" +"`build-backend = `, which is used to define the specific build-backend " +"name, (in this example we are using `hatchling.build`)." +msgstr "" + +#: ../../tutorials/installable-code.md:338 +msgid "" +"TOML organizes data structures, defining relationships within a " +"configuration file." +msgstr "" + +#: ../../tutorials/installable-code.md:341 +msgid "" +"[Learn more about the pyproject.toml format here.](../package-structure-" +"code/pyproject-toml-python-package-metadata)" +msgstr "" + +#: ../../tutorials/installable-code.md:345 +msgid "" +"You will learn more about the `pyproject.toml` format in the [next lesson" +" when you add additional metadata / information to this file.](pyproject-" +"toml.md)" +msgstr "" + +#: ../../tutorials/installable-code.md:348 +msgid "" +"Open up the `pyproject.toml` file that Hatch created in your favorite " +"text editor. It should look something like the example below." +msgstr "" + +#: ../../tutorials/installable-code.md:390 +msgid "Edit the file as follows:" +msgstr "" + +#: ../../tutorials/installable-code.md:392 +msgid "" +"Delete `dynamic = [\"version\"]`: This sets up dynamic versioning based " +"on tags stored in your git commit history. We will walk through " +"implementing this in a later lesson." +msgstr "" + +#: ../../tutorials/installable-code.md:393 +msgid "" +"Add `version = \"0.1\"` in the place of `dynamic = [\"version\"]` which " +"you just deleted. This sets up manual versioning." +msgstr "" + +#: ../../tutorials/installable-code.md:394 +msgid "Fill in the description if it doesn't already exist." +msgstr "" + +#: ../../tutorials/installable-code.md:404 +msgid "Remove the `[tool.hatch.version]` table from the bottom of the file." +msgstr "" + +#: ../../tutorials/installable-code.md:412 +msgid "" +"When this lesson exists, uncomment this admonition You will learn how to " +"automate defining a package version using git tags in the version and " +"release your package lesson." +msgstr "" + +#: ../../tutorials/installable-code.md:417 +msgid "OPTIONAL: Adjust project classifiers" +msgstr "" + +#: ../../tutorials/installable-code.md:419 +msgid "" +"Hatch by default provides a list of classifiers that define what Python " +"versions your package supports. These classifiers do not in any way " +"impact your package's build and are primarily intended to be used when " +"you publish your package to PyPI." +msgstr "" + +#: ../../tutorials/installable-code.md:424 +msgid "" +"If you don't plan on publishing to PyPI, you can skip this section. " +"However, if you wish, you can clean it up a bit." +msgstr "" + +#: ../../tutorials/installable-code.md:427 +msgid "To begin:" +msgstr "" + +#: ../../tutorials/installable-code.md:429 +msgid "Remove support for Python 3.8" +msgstr "" + +#: ../../tutorials/installable-code.md:430 +msgid "" +"Within the `[project]` table, update `requires-python = \">3.8\"` to " +"`requires-python = \">3.9\"`" +msgstr "" + +#: ../../tutorials/installable-code.md:432 +msgid "" +"Since you are creating a pure Python package in this lesson, you can " +"remove the following classifiers:" +msgstr "" + +#: ../../tutorials/installable-code.md:442 +msgid "Your new pyproject.toml file should now look something like this:" +msgstr "" + +#: ../../tutorials/installable-code.md:477 +msgid "The bare minimum needed in a pyproject.toml file" +msgstr "" + +#: ../../tutorials/installable-code.md:480 +msgid "" +"The core information that you need in a `pyproject.toml` file in order to" +" publish on PyPI is your **package's name** and the **version**. " +"However, we suggest that you flesh out your metadata early on in the " +"`pyproject.toml` file." +msgstr "" + +#: ../../tutorials/installable-code.md:482 +msgid "" +"Once you have your project metadata in the pyproject.toml file, you will " +"rarely update it. In the next lesson you’ll add more metadata and " +"structure to this file." +msgstr "" + +#: ../../tutorials/installable-code.md:486 +msgid "Step 5: Install your package locally" +msgstr "" + +#: ../../tutorials/installable-code.md:488 +msgid "At this point you should have:" +msgstr "" + +#: ../../tutorials/installable-code.md:490 +msgid "A project directory structure with a `pyproject.toml` file at the root" +msgstr "" + +#: ../../tutorials/installable-code.md:491 +msgid "A package directory containing an empty `__init__.py` file and" +msgstr "" + +#: ../../tutorials/installable-code.md:492 +msgid "At least one Python module (e.g. `add_numbers.py`)" +msgstr "" + +#: ../../tutorials/installable-code.md:494 +msgid "You are now ready to install (and build) your Python package!" +msgstr "" + +#: ../../tutorials/installable-code.md:496 +msgid "" +"While you can do this using hatch, we are going to use pip for this " +"lesson, so you can see how to install your tool into your preferred " +"environment." +msgstr "" + +#: ../../tutorials/installable-code.md:498 +msgid "" +"First open your preferred shell (Windows users may be using something " +"like gitbash) and `cd` into your project directory if you are not already" +" there." +msgstr "" + +#: ../../tutorials/installable-code.md:499 +msgid "Activate the Python environment that you wish to use." +msgstr "" + +#: ../../tutorials/installable-code.md:500 +msgid "Run `python -m pip install -e .`" +msgstr "" + +#: ../../tutorials/installable-code.md:503 +msgid "Add this back in when the lesson is published" +msgstr "" + +#: ../../tutorials/installable-code.md:504 +msgid "" +"Activate the Python environment that you wish to use. If you need help " +"with working with virtual environments check out this lesson (add link)." +msgstr "" + +#: ../../tutorials/installable-code.md:530 +msgid "What does `python -m pip install -e .` do?" +msgstr "" + +#: ../../tutorials/installable-code.md:533 +msgid "Let's break down `python -m pip install -e .`" +msgstr "" + +#: ../../tutorials/installable-code.md:535 +msgid "" +"`python -m pip install -e .` installs your package into the current " +"active Python environment in **editable mode** (`-e`). Installing your " +"package in editable mode, allows you to work on your code and then test " +"the updates interactively in your favorite Python interface. One " +"important caveat of editable mode is that every time you update your " +"code, you may need to restart Python." +msgstr "" + +#: ../../tutorials/installable-code.md:540 +msgid "" +"If you wish to install the package regularly (not in editable mode) you " +"can use:" +msgstr "" + +#: ../../tutorials/installable-code.md:543 +msgid "`python -m pip install . `" +msgstr "" + +#: ../../tutorials/installable-code.md:545 +msgid "**Using `python -m` when calling `pip`**" +msgstr "" + +#: ../../tutorials/installable-code.md:547 +msgid "" +"Above, you use`python -m` to call the version of pip installed into your " +"current active environment. `python -m` is important to ensure that you " +"are calling the version of pip installed in your current environment." +msgstr "" + +#: ../../tutorials/installable-code.md:552 +msgid "Look for pyospackage in your environment" +msgstr "" + +#: ../../tutorials/installable-code.md:554 +msgid "" +"Once you have installed your package, you can view it in your current " +"environment. If you are using `venv` or `conda`, `pip` list will allow " +"you to see your current package installations." +msgstr "" + +#: ../../tutorials/installable-code.md:558 +msgid "" +"Note that because pyospackage is installed in editable mode (`-e`) pip " +"will show you the directory path to your project's code" +msgstr "" + +#: ../../tutorials/installable-code.md:586 +msgid "Step 6: Test out your new package" +msgstr "" + +#: ../../tutorials/installable-code.md:588 +msgid "" +"After installing your package, type “python” at the command prompt in " +"your chosen terminal to start a Python session in your active Python " +"environment." +msgstr "" + +#: ../../tutorials/installable-code.md:591 +msgid "You can now import your package and access the `add_num` function." +msgstr "" + +#: ../../tutorials/installable-code.md:603 +msgid "Installing packages from GitHub" +msgstr "" + +#: ../../tutorials/installable-code.md:605 +msgid "" +"If you wish to share your code without publishing to PyPI you can always " +"install packages directly from GitHub using the syntax:" +msgstr "" + +#: ../../tutorials/installable-code.md:612 +msgid "To make your package GitHub installable, you can:" +msgstr "" + +#: ../../tutorials/installable-code.md:614 +msgid "Create a new GitHub repository" +msgstr "" + +#: ../../tutorials/installable-code.md:615 +msgid "" +"Push the contents of the project directory that you created above, to " +"GitHub" +msgstr "" + +#: ../../tutorials/installable-code.md:616 +msgid "" +"Finally install the package from GitHub using the command above. When you" +" use the command above, don't forget to substitute the user, repo, and " +"branch_or_tag with your specific values." +msgstr "" + +#: ../../tutorials/installable-code.md:618 +msgid "" +"For instance below you install the pyospackage from the main branch of " +"the pyOpenSci repository." +msgstr "" + +#: ../../tutorials/installable-code.md:621 +msgid "`python -m pip install git+https://github.com/user/repo.git@branch_or_tag`" +msgstr "" + +#: ../../tutorials/installable-code.md:625 +msgid "Congratulations! You created your first Python package" +msgstr "" + +#: ../../tutorials/installable-code.md:627 +msgid "" +"You did it! You have now created a Python package that you can install " +"into any Python environment." +msgstr "" + +#: ../../tutorials/installable-code.md:630 +msgid "In the upcoming lessons you will:" +msgstr "" + +#: ../../tutorials/installable-code.md:632 +msgid "" +"Learn how to [build and publish your Python package to (test) PyPI" +"](publish-pypi)" +msgstr "" + +#: ../../tutorials/installable-code.md:633 +msgid "Add a README file and LICENSE to your package" +msgstr "" + +#: ../../tutorials/installable-code.md:634 +msgid "" +"Add more metadata to your `pyproject.toml` file to support PyPI " +"publication." +msgstr "" + +#: ../../tutorials/installable-code.md:635 +msgid "learn how to publish to **conda-forge** from **PyPI**." +msgstr "" + +#: ../../tutorials/installable-code.md:637 +msgid "" +"Add a [README file](add-readme.md) and [LICENSE](add-license-coc.md) to " +"your package" +msgstr "" + +#: ../../tutorials/installable-code.md:638 +msgid "" +"[Add more metadata to your `pyproject.toml`](pyproject-toml.md) file to " +"support PyPI publication." +msgstr "" + +#: ../../tutorials/installable-code.md:639 +msgid "" +"[Learn how to build your package distribution](publish-pypi) files " +"(**sdist** and **wheel**) and publish to **test PyPI**." +msgstr "" + +#: ../../tutorials/installable-code.md:640 +msgid "" +"Finally you will learn how to [publish to **conda-forge**](publish-conda-" +"forge) from **PyPI**." +msgstr "" + +#: ../../tutorials/installable-code.md:644 +msgid "[Carpentries shell lesson](https://swcarpentry.github.io/shell-novice/)" +msgstr "" + +#: ../../tutorials/installable-code.md:646 +msgid "" +"[Python module " +"docs](https://docs.python.org/3/tutorial/modules.html#packages)" +msgstr "" + +#: ../../tutorials/installable-code.md:648 +msgid "[Numpy style docs](https://numpydoc.readthedocs.io/en/latest/format.html)" +msgstr "" + +#: ../../tutorials/installable-code.md:647 +msgid "[Google docstring style](https://google.github.io/styleguide/pyguide.html)" +msgstr "" + +#: ../../tutorials/installable-code.md:649 +msgid "[epydoc](https://epydoc.sourceforge.net/epytext.html)" +msgstr "" + +#: ../../tutorials/intro.md:27 ../../tutorials/setup-py-to-pyproject-toml.md:24 +msgid "Get to know Hatch" +msgstr "" + +#: ../../tutorials/intro.md:27 +msgid "Python Packaging Tutorial Setup" +msgstr "" + +#: ../../tutorials/intro.md:34 ../../tutorials/intro.md:71 +msgid "What is a Python package?" +msgstr "" + +#: ../../tutorials/intro.md:34 +msgid "Make your code installable" +msgstr "" + +#: ../../tutorials/intro.md:34 +msgid "Publish to PyPI" +msgstr "" + +#: ../../tutorials/intro.md:34 +msgid "Publish to conda-forge" +msgstr "" + +#: ../../tutorials/intro.md:34 +msgid "Create and publish a Python Package" +msgstr "" + +#: ../../tutorials/intro.md:44 +msgid "Add README file" +msgstr "" + +#: ../../tutorials/intro.md:44 +msgid "Add a license & code of conduct" +msgstr "" + +#: ../../tutorials/intro.md:44 +msgid "Update metadata in pyproject.toml" +msgstr "" + +#: ../../tutorials/intro.md:44 +msgid "Project information files & metadata" +msgstr "" + +#: ../../tutorials/intro.md:53 +msgid "Migrate setup.py to a pyproject.toml using Hatch" +msgstr "" + +#: ../../tutorials/intro.md:53 +msgid "Hatch for Existing Packages" +msgstr "" + +#: ../../tutorials/intro.md:1 +msgid "Python packaging 101" +msgstr "" + +#: ../../tutorials/intro.md:3 +msgid "_A start to finish beginner-friendly tutorial_" +msgstr "" + +#: ../../tutorials/intro.md:5 +msgid "" +"Welcome to the pyOpenSci Python packaging tutorial series. The lessons on" +" the upcoming pages walk you through the core steps needed to create a " +"Python package." +msgstr "" + +#: ../../tutorials/intro.md:11 +msgid "" +"Diagram showing the lessons in our packaging tutorial. There are 6 total " +"- what is a Python package, make code pip installable, publish your " +"package to PyPI, add a README and LICENSE file, add metadata for PyPI and" +" finally publish to conda forge." +msgstr "" + +#: ../../tutorials/intro.md:13 +msgid "" +"This lesson is the first in a series of lessons to help you get started " +"with Python packaging." +msgstr "" + +#: ../../tutorials/intro.md:16 +msgid "Who are these tutorials for?" +msgstr "" + +#: ../../tutorials/intro.md:18 +msgid "" +"The content in this tutorial series is beginner friendly and assumes that" +" you have not created a Python package before. However, the content will " +"still be valuable if you are interested in better understanding the steps" +" involved in creating a Python package." +msgstr "" + +#: ../../tutorials/intro.md:23 +msgid "" +"In this series you will learn about the core elements that you need to " +"publish your package to the [Python Package Index " +"(PyPI)](https://pypi.org/)." +msgstr "" + +#: ../../tutorials/intro.md:25 +msgid "" +"In the second series, you will learn about infrastructure and " +"documentation needed to support package maintenance." +msgstr "" + +#: ../../tutorials/intro.md:60 ../../tutorials/publish-conda-forge.md:15 +#: ../../tutorials/publish-pypi.md:13 ../../tutorials/pyproject-toml.md:19 +#: ../../tutorials/setup-py-to-pyproject-toml.md:12 +msgid "Learning Objectives" +msgstr "" + +#: ../../tutorials/intro.md:62 +msgid "" +"This lesson introduces you to the basic components of a Python package. " +"After reading this lesson you will:" +msgstr "" + +#: ../../tutorials/intro.md:65 +msgid "Understand what a Python package is" +msgstr "" + +#: ../../tutorials/intro.md:66 +msgid "Be able to list the 5 core components of a Python package" +msgstr "" + +#: ../../tutorials/intro.md:67 +msgid "" +"Be able to explain the difference between generalizable code and code " +"that supports a specific scientific application" +msgstr "" + +#: ../../tutorials/intro.md:73 +msgid "" +"At a high level, you can think about a Python package as a toolbox that " +"you can use to perform various tasks." +msgstr "" + +#: ../../tutorials/intro.md:76 +msgid "" +"A Python package is basically a directory with a specific file structure." +" Within the package directory structure, there are modules which are " +"files that end in `.py` (the same extension you'd see in a Python " +"script). These modules allow you to group and structure your Python code." +" Each module contains functions and classes, that you can think about as " +"the tools in your toolbox." +msgstr "" + +#: ../../tutorials/intro.md:85 +msgid "" +"Diagram showing a sketch of a toolbox filled with different tools " +"including a hammer and a saw." +msgstr "" + +#: ../../tutorials/intro.md:87 +msgid "" +"You can think about a package as a toolbox filled with coding tools. A " +"tool may be a function or a class. Each tool does a specific thing well." +msgstr "" + +#: ../../tutorials/intro.md:92 +msgid "Python packages are installable" +msgstr "" + +#: ../../tutorials/intro.md:94 +msgid "" +"A package is installable, which means that you can add the functionality " +"within the package's code to any Python environment and import that " +"functionality like you would import core scientific Python packages such " +"as NumPy or Matplotlib." +msgstr "" + +#: ../../tutorials/intro.md:103 +msgid "" +"Installing a package into an environment makes it easier to manage and " +"reuse your code across different projects. Structuring your code as a " +"package is the first step you need to take so you can share the tools in " +"the toolbox you've created and let others build with it." +msgstr "" + +#: ../../tutorials/intro.md:108 +msgid "Why create a Python package?" +msgstr "" + +#: ../../tutorials/intro.md:110 +msgid "You might create a Python package because you want to:" +msgstr "" + +#: ../../tutorials/intro.md:112 +msgid "" +"**Use your code across different projects:** At its most basic level, " +"creating a package allows you to install your code into a Python " +"environment. This allows you to then import functions and classes into " +"any workflows both locally and in the cloud." +msgstr "" + +#: ../../tutorials/intro.md:113 +msgid "" +"**Share your code:** If you publish a package on a public repository such" +" as PyPI or conda, your package can be installed on any machine using pip" +" or conda with a single command." +msgstr "" + +#: ../../tutorials/intro.md:114 +msgid "" +"**Build community around your code:** Packages make it easier for " +"multiple people to work on the same project (particularly when published " +"on GitHub). A version control system such as git (the system used by " +"GitHub), further makes it easier to track changes to the codebase over " +"time. Tools such as issues and pull requests make it easier for outside " +"users to contribute bug fixes and to establish review processes for " +"accepting changes to the code base." +msgstr "" + +#: ../../tutorials/intro.md:115 +msgid "" +"**Organize your code:** Packages can be used to organize large code " +"projects, dividing them into smaller, more manageable components. This " +"structure can help with both maintaining the codebase and with making it " +"easier to understand." +msgstr "" + +#: ../../tutorials/intro.md:117 +msgid "What to consider before you create a package" +msgstr "" + +#: ../../tutorials/intro.md:119 +msgid "" +"Creating a Python package that others use takes considerable time and " +"effort. Before you begin, think about your goals including:" +msgstr "" + +#: ../../tutorials/intro.md:122 +msgid "Who you think will use your package" +msgstr "" + +#: ../../tutorials/intro.md:123 +msgid "How people might use your package and on what data (if data are relevant)" +msgstr "" + +#: ../../tutorials/intro.md:124 +msgid "Whether you have time to add things such as documentation and tests" +msgstr "" + +#: ../../tutorials/intro.md:125 +msgid "" +"How long you might be able to maintain it: remember that once people " +"begin using your package they will depend on your maintainer team to " +"update it, fix bugs and answer questions." +msgstr "" + +#: ../../tutorials/intro.md:127 +msgid "" +"Before creating a user-facing package, it's important to consider all of " +"the above." +msgstr "" + +#: ../../tutorials/intro.md:129 +msgid "The elements of a Python package" +msgstr "" + +#: ../../tutorials/intro.md:133 ../../tutorials/intro.md:211 +msgid "Diagram showing .. more here if this stays." +msgstr "" + +#: ../../tutorials/intro.md:135 +msgid "" +"The elements of a Python package include code, documentation, tests, an " +"OSI-approved license and infrastructure. Maintainers are at the core " +"making sure everything works and is up to date while fixing bugs and " +"addressing user concerns." +msgstr "" + +#: ../../tutorials/intro.md:141 +msgid "The core elements of Python package include:" +msgstr "" + +#: ../../tutorials/intro.md:143 +msgid "" +"**Code:** Functions and classes that provide functionality for a user of " +"your package" +msgstr "" + +#: ../../tutorials/intro.md:144 +msgid "" +"**Documentation:** Installation instructions, tutorials, and examples " +"that both help users get started using your package and contributors and " +"maintainers fix bugs and maintain the package." +msgstr "" + +#: ../../tutorials/intro.md:145 +msgid "" +"Contributor Documentation in the form of a **CONTRIBUTING.md** file is " +"useful to help people to contribute to your package." +msgstr "" + +#: ../../tutorials/intro.md:146 +msgid "" +"Development Documentation helps both maintainers and contributors " +"understand how to maintain a package's infrastructure." +msgstr "" + +#: ../../tutorials/intro.md:147 +msgid "" +"**Tests:** that make sure your code works as it should and makes it " +"easier for you and others to contribute to, modify and update the code in" +" the future" +msgstr "" + +#: ../../tutorials/intro.md:148 +msgid "" +"**License:** An open source license, or license that is [OSI " +"approved](https://opensource.org/licenses/), refers to an license that " +"allows others to use your package. It also provides legal direction " +"regarding how elements of the package can and can't be reused." +msgstr "" + +#: ../../tutorials/intro.md:149 +msgid "" +"**Infrastructure** that automates updates, publication workflows and runs" +" test suites. Infrastructure includes a suite of things such as platforms" +" like GitHub and GitLab, tools to run tests and tools locally such as nox" +" and tox and continuous integration that automates package maintenance " +"steps." +msgstr "" + +#: ../../tutorials/intro.md:151 +msgid "What pyOpenSci looks for in a package" +msgstr "" + +#: ../../tutorials/intro.md:154 +msgid "" +"pyOpenSci performs an [initial set of editor " +"checks](https://www.pyopensci.org/software-peer-review/how-to/editor-in-" +"chief-guide.html#editor-checklist-template) for any package submitted to " +"us for peer review. You may find these checks useful as you create your " +"package as a baseline for things that you package should have." +msgstr "" + +#: ../../tutorials/intro.md:160 +msgid "Packages are more than just code - Infrastructure" +msgstr "" + +#: ../../tutorials/intro.md:162 +msgid "" +"A package in any language is more than just code. If you expect other " +"people to use your package, besides yourself, you should consider not " +"only writing high quality code, but also the various elements of a " +"package that make it a useful community resource." +msgstr "" + +#: ../../tutorials/intro.md:167 +msgid "Version control and storing your package on GitHub or GitLab" +msgstr "" + +#: ../../tutorials/intro.md:169 +msgid "" +"Most Python packages live in an online version control platform such as " +"GitHub or GitLab. GitHub and GitLab both run [git](https://git-scm.com/) " +"for version control. Having your software under version control is " +"important because it allows you to both track changes over time while " +"also going back in history and undoing changes in the case that a change " +"to the code base unexpectedly breaks something." +msgstr "" + +#: ../../tutorials/intro.md:174 +msgid "" +"By publishing your package on GitHub or GitLab, you are making your code " +"public facing. This means that others can both see your code and also " +"make contributions using a pull request (GitHub) / merge request (GitLab)" +" / code review workflow." +msgstr "" + +#: ../../tutorials/intro.md:176 +msgid "GitHub & GitLab vs. Git" +msgstr "" + +#: ../../tutorials/intro.md:179 +msgid "" +"GitHub and GitLab are online (cloud) platforms that run `git` (version " +"control software) on the backend. Running git locally on your computer " +"allows you to upload (`git push`) and download (`git pull`) files to " +"GitHub and GitLab." +msgstr "" + +#: ../../tutorials/intro.md:184 +msgid "Issues or Ticket Trackers" +msgstr "" + +#: ../../tutorials/intro.md:186 +msgid "" +"GitHub and GitLab also both offer community features such as issues that " +"allow:" +msgstr "" + +#: ../../tutorials/intro.md:188 +msgid "you to communicate with your maintainers and contributor community" +msgstr "" + +#: ../../tutorials/intro.md:189 +msgid "users to report bugs, ask questions and request new features" +msgstr "" + +#: ../../tutorials/intro.md:190 +msgid "" +"you to publicly keep track of enhancements and features you want to work " +"on for your package." +msgstr "" + +#: ../../tutorials/intro.md:192 +msgid "Continuous integration and continuous deployment" +msgstr "" + +#: ../../tutorials/intro.md:194 +msgid "" +"GitHub and GitLab also provide continuous integration and continuous " +"deployment (CI/CD). Continuous integration (CI) refers to a platform that" +" automatically runs a specific job when a certain event occurs, whereas " +"continuous deployment (CD) is an extension of CI that refers to not only " +"running or building but also to publishing the final outputs somewhere." +msgstr "" + +#: ../../tutorials/intro.md:196 +msgid "**An example of Continuous integration:**" +msgstr "" + +#: ../../tutorials/intro.md:198 +msgid "" +"When someone submits a change to your code, your tests will run across " +"different operating systems and the code will be checked for format " +"issues." +msgstr "" + +#: ../../tutorials/intro.md:200 +msgid "**An example of Continuous deployment:**" +msgstr "" + +#: ../../tutorials/intro.md:202 +msgid "" +"When you are ready to release your package to PyPI, a continuous " +"deployment operation might be triggered on release to publish your " +"package to PyPI." +msgstr "" + +#: ../../tutorials/intro.md:204 +msgid "" +"Integrated CI/CD will help you maintain your software, ensuring that " +"changes to the code don't break things unexpectedly. They can also help " +"you maintain code style and format consistency for every new change to " +"your code." +msgstr "" + +#: ../../tutorials/intro.md:213 +msgid "The lifecycle of a scientific Python package." +msgstr "" + +#: ../../tutorials/intro.md:216 +msgid "When should you turn your code into a Python package?" +msgstr "" + +#: ../../tutorials/intro.md:218 +msgid "" +"You may be wondering, what types of code should become a Python package " +"that is both on GitHub and published to PyPI and/or conda-forge." +msgstr "" + +#: ../../tutorials/intro.md:220 +msgid "There are a few use cases to consider:" +msgstr "" + +#: ../../tutorials/intro.md:222 +msgid "" +"**Creating a basic package for yourself:** Sometimes you want create a " +"package for your own personal use. This might mean making your code " +"locally pip installable and you may also want to publish it to GitHub. In" +" that case you don't expect others to use your code, and as such you may " +"only have documentation for you and your future self if you need to " +"update the package." +msgstr "" + +#: ../../tutorials/intro.md:224 +msgid "" +"An example of this type of package might be a set of functions that you " +"write that are useful across several of your projects. It could be useful" +" to have those functions available to all of your projects." +msgstr "" + +#: ../../tutorials/intro.md:227 +msgid "LINK to pip installable lesson when it's published - it's in review now" +msgstr "" + +#: ../../tutorials/intro.md:230 +msgid "" +"**Creating a package for the community:** In other cases, you may create " +"some code that you soon realize might also be useful to not just you, but" +" to other people as well. In that case, you might consider both creating " +"the package, publishing it on GitHub, and because other users may be " +"using it, you may make use of GitHub's infrastructure including CI/CD " +"pipelines and issue trackers. Because you want other people to use your " +"package, you will want to also include LICENSE information, documentation" +" for users and contributors and tests. This type of package is most often" +" published to PyPI." +msgstr "" + +#: ../../tutorials/intro.md:233 +msgid "" +"For example, all of the [pyOpenSci packages](https://www.pyopensci.org" +"/python-packages.html) are public facing with an intended audience beyond" +" just the maintainers." +msgstr "" + +#: ../../tutorials/intro.md:235 +msgid "Packages that you expect others to use should be well-scoped" +msgstr "" + +#: ../../tutorials/intro.md:237 +msgid "" +"Ideally the code in your Python package is focused on a specific theme or" +" use case. This theme is important as it's a way to scope the content of " +"your package." +msgstr "" + +#: ../../tutorials/intro.md:239 +msgid "" +"It can be tricky to decide when your code becomes something that might be" +" more broadly useful to others. But one question you can ask yourself is " +"- is your code written specifically for a single research project? Or " +"could it have a broader application across multiple projects in your " +"domain?" +msgstr "" + +#: ../../tutorials/intro.md:241 +msgid "How does this relate to code for a research project?" +msgstr "" + +#: ../../tutorials/intro.md:244 +msgid "" +"A [Research Compendium](https://the-turing-way.netlify.app/reproducible-" +"research/compendia.html) is an organized set of code, data and " +"documentation that supports a specific research project. It aims to " +"enhance the reproducibility and transparency of research by providing a " +"comprehensive record of the methods, data, and analyses used in a study." +msgstr "" + +#: ../../tutorials/intro.md:249 +msgid "" +"A Python package is a collection of modules that can be used to perform a" +" specific set of tasks. These tasks should be applicable to numerous " +"workflows. As such a Python package is more generalizable than a Research" +" Compendium which supports a specific project." +msgstr "" + +#: ../../tutorials/intro.md:254 +msgid "" +"[Read about `Good enough practices in scientific " +"computing`](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005510)" +msgstr "" + +#: ../../tutorials/intro.md:255 +msgid "" +"[Learn more about research compendia (also called repo-packs) in this " +"blog post.](https://lorenabarba.com/blog/how-repro-packs-can-save-your-" +"future-self/)" +msgstr "" + +#: ../../tutorials/intro.md:258 +msgid "Below are a few examples well scoped pyOpenSci packages:" +msgstr "" + +#: ../../tutorials/intro.md:260 +msgid "" +"[Crowsetta](https://crowsetta.readthedocs.io/en/latest/): is a package " +"designed to work with annotating animal vocalizations and bioacoustics " +"data. This package helps scientists process different types of " +"bioacoustic data rather than focusing on a specific individual research " +"application associated with a user-specific research workflow." +msgstr "" + +#: ../../tutorials/intro.md:261 +msgid "" +"[Pandera](https://www.union.ai/pandera) is another more broadly used " +"Python package. Pandera supports data testing and thus also has a broader" +" research application." +msgstr "" + +#: ../../tutorials/intro.md:263 +msgid "Matplotlib as an example" +msgstr "" + +#: ../../tutorials/intro.md:265 +msgid "" +"At the larger end of the user spectrum, Matplotlib is a great example. " +"Matplotlib does one thing really well:" +msgstr "" + +#: ../../tutorials/intro.md:268 +msgid "_It creates visual plots of data._" +msgstr "" + +#: ../../tutorials/intro.md:270 +msgid "" +"Thousands of people use Matplotlib for different plotting applications " +"using different types of data. While few scientific packages will have " +"the same broad application and large user base that Matplotlib has, the " +"idea of scoping out what your package does is still important." +msgstr "" + +#: ../../tutorials/intro.md:276 +msgid "Code should also be clean & readable & documented" +msgstr "" + +#: ../../tutorials/intro.md:278 +msgid "" +"The code in your package should also be clean, readable, and well " +"documented." +msgstr "" + +#: ../../tutorials/intro.md:280 +msgid "" +"**Clean code:** Clean code refers to code that uses expressive variable " +"names, is concise and doesn't repeat itself. You can learn about best " +"practices for clean code in future pyOpenSci tutorials." +msgstr "" + +#: ../../tutorials/intro.md:284 +msgid "" +"**Readable code:** readable code is code written with a consistent style." +" You can use linters and code formatters such as black and flake8 to " +"ensure this consistency throughout your entire package. [Learn more about" +" code formatters here.](../package-structure-code/code-style-linting-" +"format)" +msgstr "" + +#: ../../tutorials/intro.md:288 +msgid "" +"**Documented code:** documented code is written using docstrings that " +"help a user understand both what the functions and methods in your code " +"do and also what the input and output elements of each function are. [You" +" can learn more about docstrings in our guide, here.](../documentation" +"/write-user-documentation/document-your-code-api-docstrings)" +msgstr "" + +#: ../../tutorials/intro.md:292 +msgid "Making your package installable - publishing to PyPI & conda-forge" +msgstr "" + +#: ../../tutorials/intro.md:294 +msgid "Python packages and environments" +msgstr "" + +#: ../../tutorials/intro.md:296 +msgid "" +"You can install a Python package into a Python environment in the same " +"way you might install NumPy or Pandas. Installing your package into an " +"environment allows you to access it from any code run with that specific " +"Python environment activated." +msgstr "" + +#: ../../tutorials/intro.md:302 +msgid "" +"Diagram showing the steps associated with creating a package and then " +"installing it. The first arrow says your package and the second says pip " +"install package. The second arrow leads to a box that represents a Python" +" environment that already has some packages installed such as Pandas and " +"NumPy. Your package will also get installed into that same environment " +"when you pip install it." +msgstr "" + +#: ../../tutorials/intro.md:304 +msgid "" +"You don't have to publish to PyPI to make your code installable. With the" +" correct file structure and project metadata you can make your code " +"installable locally on your computer and use it for projects that you are" +" working on without having to ever publish to PyPI. Publishing to PyPI is" +" useful when you want to make your code public-facing and share it with " +"others." +msgstr "" + +#: ../../tutorials/intro.md:311 +msgid "Publishing a package to PyPI / Conda-Forge" +msgstr "" + +#: ../../tutorials/intro.md:313 +msgid "" +"If you want to make your package directly installable without having to " +"download the code to your computer locally then you need to publish it in" +" a repository such as **PyPI** or **conda-forge**." +msgstr "" + +#: ../../tutorials/intro.md:317 +msgid "" +"Learn [how to publish your package to PyPI in this tutorial.](publish-" +"pypi.md)" +msgstr "" + +#: ../../tutorials/intro.md:319 +msgid "" +"Then you can create a conda-forge recipe using the " +"[Grayskull](https://github.com/conda/grayskull) tool. You can then submit" +" this recipe to conda-forge." +msgstr "" + +#: ../../tutorials/intro.md:321 +msgid "" +"[You will learn more about the conda-forge publication process here" +".](publish-conda-forge.md)" +msgstr "" + +#: ../../tutorials/intro.md:324 +msgid "" +"Graphic showing the high level packaging workflow. On the left you see a " +"graphic with code, metadata and tests in it. Those items all go into your" +" package. Documentation and data are below that box because they aren't " +"normally published in your packaging wheel distribution. an arrow to the " +"right takes you to a build distribution files box. that box leads you to " +"either publishing to TestPyPI or the real PyPI. From PyPI you can then " +"connect to conda-forge for an automated build that sends distributions " +"from PyPI to conda-forge." +msgstr "" + +#: ../../tutorials/intro.md:326 +msgid "" +"In the image above, you can see the steps associated with publishing your" +" package on PyPI and conda-forge. Note that the distribution files that " +"PyPI requires are the [sdist](#python-source-distribution) and [wheel" +"](#python-wheel) files. Once you are ready to make your code publicly " +"installable, you can publish it on PyPI. Once your code is on PyPI it is " +"straight forward to then publish to conda-forge. You create a recipe " +"using the Grayskull package and then you open a pr in the conda-forge " +"recipe repository. You will learn more about this process in the [conda-" +"forge lesson](/tutorials/publish-conda-forge)." +msgstr "" + +#: ../../tutorials/intro.md:330 +msgid "Yay, your package has users! Now what?" +msgstr "" + +#: ../../tutorials/intro.md:332 +msgid "" +"As the community using your package grows, you may also find yourself " +"managing users, contributors, and others who want to interact with your " +"package. It’s important to consider all this before you dive into " +"development. Once you have a user base in the community, people will " +"depend upon your code to work and will need direction regarding how to " +"use it." +msgstr "" + +#: ../../tutorials/intro.md:334 +msgid "To support your community, you'll want to add things like:" +msgstr "" + +#: ../../tutorials/intro.md:336 +msgid "" +"[a development guide that documents your maintainer workflow process " +"](/documentation/repository-files/development-guide.md)" +msgstr "" + +#: ../../tutorials/intro.md:337 +msgid "" +"[a code of conduct to defines community interaction standards and " +"expectations](/documentation/repository-files/code-of-conduct-file.md)" +msgstr "" + +#: ../../tutorials/intro.md:338 +msgid "" +"[a contributing guide that helps users understand expectations associated" +" with making contributions to your project](/documentation/repository-" +"files/contributing-file.md)" +msgstr "" + +#: ../../tutorials/intro.md:340 +msgid "Support for contributors and maintainers" +msgstr "" + +#: ../../tutorials/intro.md:342 +msgid "" +"If you intend for others to use and contribute to your code, consider who" +" will maintain it over time. You will want a **contributing and " +"development** guide to help new potential contributors get started with " +"contributing to your package, as well as a **code of conduct** to ensure " +"community interactions remain healthy both for you and your contributors " +"and maintainer team." +msgstr "" + +#: ../../tutorials/intro.md:344 +msgid "" +"The elements above are also important for future maintenance of your " +"package. In the case that you are no long able to maintain it or simply " +"want extra help, development, and contributing documentation will help " +"you onboard new maintainers." +msgstr "" + +#: ../../tutorials/intro.md:349 +msgid "What's next?" +msgstr "" + +#: ../../tutorials/intro.md:351 +msgid "" +"In future lessons you will learn more about the infrastructure around a " +"published Python package that makes it both easier to maintain, easier " +"for others to contribute to and easier for other scientists to use. " +"However, first we want to get you to your initial goal of publishing a " +"Python package." +msgstr "" + +#: ../../tutorials/intro.md:353 +msgid "" +"In this next lesson you will learn how to create a basic installable " +"Python package. Make your code pip installable " +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:1 +msgid "Publish your Python package that is on PyPI to conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:3 +msgid "In the previous lessons, you've learned:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:5 +msgid "" +"How to [create the most basic version of a Python package](installable-" +"code.md). This entailed making your code installable." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:6 +msgid "[How to publish your Python package to PyPI](publish-pypi)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:7 +msgid "How to add a `README` and `LICENSE` file to your package" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:8 +msgid "" +"How to setup your `pyproject.toml` file with all of the metadata that " +"PyPI requires and also metadata that will be helpful for users to find " +"your package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:10 +msgid "" +"If you have gone through all of the above lessons, you are now ready to " +"publish your package on conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:13 +msgid "" +"**IMPORTANT:** Please do not practice publishing your package to conda-" +"forge. You should only publish to conda-forge when you have a package on " +"pypi.org that you plan to maintain." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:19 ../../tutorials/publish-pypi.md:17 +msgid "In this lesson you will learn how to:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:21 +msgid "Create a conda-forge yaml recipe for your package using Grayskull" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:22 +msgid "" +"Submit the recipe (yaml file) to the conda-forge staged recipes " +"repository as a pull request" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:23 +msgid "" +"Maintain your conda-forge package by creating new releases for your " +"package on PyPI" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:26 +msgid "" +"Once your package is on PyPI you can then easily publish it to conda-" +"forge using the [grayskull](https://conda.github.io/grayskull/) tool. You" +" do not need to build the package specifically for conda, conda-forge " +"will build from your PyPI source distribution file (sdist)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:33 +msgid "" +"Image showing the progression of creating a Python package, building it " +"and then publishing to PyPI and conda-forge. You take your code and turn " +"it into distribution files (sdist and wheel) that PyPI accepts. then " +"there is an arrow towards the PyPI repository where ou publish both " +"distributions. From PyPI if you create a conda-forge recipe you can then " +"publish to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:35 +msgid "" +"Once you have published both package distributions (the source " +"distribution and the wheel) to PyPI, you can then publish to conda-forge." +" Conda-forge requires a source distribution on PyPI in order to build " +"your package on conda-forge. You do not need to rebuild your package to " +"publish to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:38 +msgid "What is conda-forge?" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:40 +msgid "" +"conda is an open source package and environment management tool that can " +"be used to install tools from the different channels on Anaconda.org." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:43 +msgid "" +"You can think about a channel as a specific location where a group of " +"packages are stored and can be installed from using a command such as " +"`conda install packagename`. In the case of conda channels, some of these" +" channels such as the `defaults` channel, is managed by Anaconda (the " +"company). Only Anaconda can decide what packages are available in the " +"`defaults` channel. However, the conda-forge (and bioconda) channel are " +"community-managed channels. Anyone can submit a package to these channels" +" however they must pass a technical review in the [staged-recipes GitHub " +"repository](https://github.com/conda-forge/staged-recipes) to be " +"published." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:46 +msgid "[Learn more about conda channels here.](#about-conda)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:50 +msgid "" +"Graphic with the title Python package repositories. Below it says " +"anything hosted on PyPI can be installed using pip install. Packaging " +"hosted on a conda channel can be installed using conda install. Below " +"that there are two rows. The top row says conda channels. Next to it are " +"three boxes one with conda-forge, community maintained; bioconda and then" +" default - managed by the Anaconda team. Below that there is a row that " +"says PyPI servers. PyPI - anyone can publish to PyPI and test PyPI (a " +"testbed server for you to practice)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:52 +msgid "" +"Conda channels represent various repositories that you can install " +"packages from. Because conda-forge is community maintained, anyone can " +"submit a recipe there. PyPI is also a community maintained repository. " +"Anyone can submit a package to PyPI and test PyPI. Unlike conda-forge " +"there are no manual checks of packages submitted to PyPI." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:55 +msgid "Why publish to conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:57 +msgid "" +"There are many users, especially in the scientific Python ecosystem that " +"use conda as their primary package manager / environment tool. Thus, " +"having packages available to these users on the conda-forge channel is " +"useful. In some cases packages on conda-forge can minimize dependency " +"conflicts that can occur when mixing installations using pip and conda. " +"This is particularly important for the spatial ecosystem." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:59 +msgid "How publishing to conda-forge works" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:61 +msgid "" +"Once you have built and published your package to PyPI, you have " +"everything that you need to publish to conda-forge. There is no " +"additional build step needed to publish to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:63 +msgid "" +"Conda-forge will build your package from the source distribution which " +"you [published to PyPI in the previous lesson](publish-pypi) using the " +"recipe that you will create below." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:65 +msgid "Conda-forge publication steps" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:68 +msgid "" +"Image showing the steps associated with publishing to conda-forge. Check " +"out the caption below for a detailed description." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:70 +msgid "" +"The steps for publishing to conda-forge begin with publishing your Python" +" package to PyPI. Once you have published to PyPI you can then create a " +"yaml file recipe that can be submitted to the conda-forge staged recipes " +"repository for review. Once that recipe is accepted, your package will " +"get it's on repository (known as a feedstock) on conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:73 +msgid "The steps to publish to conda-forge are:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:75 +msgid "Publish your Python package distribution files (sdist & wheel) to PyPI" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:76 +msgid "" +"Create a conda-forge recipe, which is a yaml file with instructions on " +"how to build your package on conda-forge, using the grayskull[^grayskull]" +" package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:77 +msgid "" +"Submit the recipe (yaml file) to the conda-forge staged recipes " +"repository as a pull request for review. [Click here for an example " +"submission from pyOpenSci.](https://github.com/conda-forge/staged-" +"recipes/pull/25173)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:79 +msgid "" +"Once someone from the conda-forge team reviews your pull request, you may" +" need to make some changes. Eventually the pull request will be approved " +"and merged." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:81 +msgid "" +"Once your recipe is accepted and merged on conda-forge, users can install" +" your package using:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:83 +msgid "`conda install -c conda-forge your-package`" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:85 +msgid "" +"You only create the recipe once. Once the recipe is accepted and merged, " +"you only need to maintain the repository." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:87 +msgid "Maintaining a conda-forge package" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:89 +msgid "" +"Once your package is on conda-forge, the repository will track release " +"activity on the package's PyPI repository. Any time you make a new PyPI " +"release with a new source distribution, conda-forge will build and update" +" your conda-forge repository (also known as a feedstock)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:91 +msgid "" +"When the update is processed, the friendly conda-forge bot will create a " +"new pull request with an updated distribution recipe in your feedstock." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:93 +msgid "" +"You can review that pull request and then merge it once all of the " +"continuous integration tests pass." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:95 +msgid "" +" How to Publish your package" +" on conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:97 +msgid "" +"It's time to add your package to the conda-forge channel. Remember that " +"your package needs to be on PyPI before the steps below will work. And " +"also remember that the team managing conda-forge are all volunteers." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:100 +msgid "" +"Be sure that your package is on PyPI.org (not test.pypi.org) before you " +"attempt to publish to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:103 +msgid "" +"Only submit your package to conda-forge if you intend to maintain it over" +" time." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:106 +msgid "" +"Note - this is a tutorial aimed to help you get your package onto conda-" +"forge. The official conda documentation for this processed [is " +"here](https://conda-forge.org/docs/maintainer/adding_pkgs.html)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:108 +msgid "Step 1: Install grayskull" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:110 +msgid "" +"First, [install " +"grayskull](https://conda.github.io/grayskull/user_guide.html). You can " +"install it using either pip:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:116 +msgid "or conda" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:122 +msgid "" +"To run this command, use the same shell / terminal that you have been " +"using to run hatch commands in the previous tutorials." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:127 +msgid "" +"You can also install grayskull using pipx[^pipx]. pipx is a tool that " +"allows you to install commonly used tools that you might want to have " +"available across multiple Python environments rather than installing the " +"package into every Python environment that ou create." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:130 +msgid "Step 2: Fork and clone the conda-forge staged-recipes repository" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:132 +msgid "" +"Next, open your shell and `cd` to a location where you want to clone the " +"**conda-forge/staged-recipes** repository." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:133 +msgid "" +"fork and clone the [conda-forge/staged-recipes GitHub " +"repository](https://github.com/conda-forge/staged-recipes)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:134 +msgid "" +"Create a new branch in your fork rather than submitting from the main " +"branch of your fork. We suggest naming the branch your package's name." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:136 +msgid "`git checkout -b your-package-name `" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:138 +msgid "In bash, `cd` into the `staged-recipes/recipes` folder" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:146 +msgid "" +"Next, create a new branch in your `conda-forge/staged-recipes` cloned " +"repository. You might want to make that branch the same name as your " +"package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:157 +msgid "Step 3: Create your conda-forge recipe" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:159 +msgid "Next, navigate to the recipes directory" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:161 +msgid "" +"If you run `ls` here, you will notice there is an example directory with " +"an example recipe for you to look at." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:173 +msgid "Next, run `grayskull pypi your-package-name` to generate a recipe." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:217 +msgid "" +"Grayskull will pull metadata about your package from PyPI. It does not " +"use your local installation of the package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:218 +msgid "" +"An internet connection is needed to run the `grayskull pypi your-package-" +"name` step." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:221 +msgid "" +"When you run grayskull, it will grab the latest distribution of your " +"package from PyPI and will use that to create a new recipe." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:223 +msgid "" +"The recipe will be saved in a directory named after your package's name, " +"wherever you run the command." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:225 +msgid "`recipes/packagename/meta.yaml`" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:227 +msgid "" +"At the very bottom of the grayskull output, it will also tell you where " +"it saved the recipe file." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:230 +msgid "" +"Open the meta.yaml file. The finished `meta.yaml` file that grayskull " +"creates should look like the example below:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:277 +msgid "Step 3b: Bug fix - add a home url to the about: section" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:279 +msgid "" +"There is currently a small bug in Grayskull where it doesn't populate the" +" home: element of the recipe. if you don't include this, [you will " +"receive an error message](https://github.com/conda-forge/staged-" +"recipes/pull/25173#issuecomment-1917916528) from the friendly conda-forge" +" linter bot." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:293 +msgid "to fix this, open your meta.yaml file in your favorite text editor." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:294 +msgid "and add a home: element to the about section" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:296 +msgid "The about section will look like this after you create your recipe." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:306 +msgid "" +"Below you add a home: element. If you have a project home page / website " +"you can use that url. Otherwise, you can also use your PyPI landing page." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:317 +msgid "Step 4: tests for conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:319 +msgid "" +"Next, have a look at the tests section in your **meta.yaml** file. At a " +"minimum you should import your package or the main modules associated " +"with your package and run `pip check`." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:321 +msgid "" +"`pip check` will ensure that your package installs properly with all of " +"the proper dependencies." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:333 +msgid "" +"If you have more advanced tests that you wish to run, you can add them " +"here. However, you can also simply leave the tests section as it is." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:335 +msgid "Step 4: Submit a pull request to the staged-recipes repository" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:337 +msgid "" +"Once you have completed all of the above, you are ready to open up a pull" +" request in the `conda-forge/staged-recipes repository`." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:339 +msgid "" +"Submit a pull request from your fork/branch of the staged-recipes " +"repository." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:340 +msgid "" +"Remember that the conda-forge maintainers are volunteers. Be patient for " +"someone to respond and supportive in your communication with them." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md +msgid "Conda-forge checklist help" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:346 +msgid "Conda-forge Staged-recipes Pull Request Checklist" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:348 +msgid "" +"When you submit your package to conda-forge, the pull request template " +"includes a list of checks that you want to ensure you have covered." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:350 +msgid "Below we break down each element of that list." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:352 +msgid "Pull request template checklist tips" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:355 +msgid "" +"-[x] Title of this PR is meaningful: e.g. \"Adding my_nifty_package\", " +"not \"updated meta.yaml\"." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:357 +msgid "" +"**Translation:** Make sure that your pull request title is specific. We " +"suggest something like: `Add recipe for `" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:360 +msgid "" +"-[x] License file is packaged (see [here](https://github.com/conda-forge" +"/staged-" +"recipes/blob/5eddbd7fc9d1502169089da06c3688d9759be978/recipes/example/meta.yaml#L64-L73)" +" for an example)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:362 +msgid "" +"**Translation:** You should have a LICENSE file included in your " +"package's source distribution. If you have followed the pyOpenSci " +"tutorials then you already have a LICENSE file and are likely using the " +"MIT license. When you run `hatch build`, it will bundle that file into " +"the output [source distribution file (which is the tar.gz file)](python-" +"source-distribution) that conda-forge will use to build your package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:364 +msgid "[x] Source is from official source." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:366 +msgid "" +"**Translation:** If your package is on PyPI as you learned in the " +"[previous lesson on publishing your Python package](publish-pypi) then " +"you are in good shape. conda-forge prefers that your distribution is " +"published to a known repository." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:368 +msgid "" +"-[x] Package does not vendor other packages. (If a package uses the " +"source of another package, they should be separate packages or the " +"licenses of all packages need to be packaged)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:370 +msgid "" +"**Translation:** If the code base in your package is your own and it all " +"shares the same LICENSE then you are in good shape. If you have code " +"taken from other packages then you may need to declare that and include " +"licenses for that code if it is different. If you followed these " +"tutorials then you do not have any vendored code." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:372 +msgid "" +"-[x] If static libraries are linked in, the license of the static library" +" is packaged." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:374 +msgid "" +"-[x] Package does not ship static libraries. If static libraries are " +"needed, [follow CFEP-18](https://github.com/conda-" +"forge/cfep/blob/main/cfep-18.md)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:376 +msgid "" +"**Translation:** A static library refers to a copy of a package built " +"into your package. If your package is a pure Python package, then you can" +" check that your package does not ship static libraries as this does not " +"apply to you." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:378 +msgid "" +"The pyOpenSci tutorials are all pure Python and as such do not use static" +" libraries in a linked or shipped (included in the package distribution) " +"format." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:380 +msgid "" +"If your package has a more complex build that includes links to " +"extensions written in other languages such as C++, then be sure to " +"include the proper licenses for those extensions in your metadata." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:385 +msgid "" +"If you want to learn more about static libraries, then [this " +"overview](https://pypackaging-" +"native.github.io/background/compilation_concepts/#shared-vs-static-" +"libraries) might help." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:388 +msgid "-[ ] Build number is 0." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:390 +msgid "" +"**Translation:** The build number in your recipe is right below the " +"source location of your package's source distribution. `number: 0` is " +"what you should see in that section of your recipe." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:403 +msgid "" +"[x] A tarball (`url`) rather than a repo (e.g. `git_url`) is used in your" +" recipe (see [here](https://conda-" +"forge.org/docs/maintainer/adding_pkgs.html) for more details)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:405 +msgid "" +"**Translation:** Here conda wants you to provide a link to the source " +"distribution on PyPI rather than a link to your GitHub repository " +"distribution. Notice above in the Source section of your recipe there is " +"a `url:` section that provides a PyPI url that ends in tar.gz. That is a " +"link to your source distribution that conda-forge will use." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:411 +msgid "" +"[x] GitHub users listed in the maintainer section have posted a comment " +"confirming they are willing to be listed there." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:413 +msgid "" +"**Translation** Once you have submitted your recipe, be sure that all " +"maintainers listed in your recipe respond acknowledging that they are ok " +"with being listed as a maintainer for the conda-forge version of your " +"package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:415 +msgid "" +"[x] When in trouble, please check our [knowledge base " +"documentation](https://conda-" +"forge.org/docs/maintainer/knowledge_base.html) before pinging a team." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:417 +msgid "" +"**Translation** The conda team are volunteers who spend their time " +"supporting our community. Please try to troubleshoot on your own first " +"before tagging one of them for help." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:419 +msgid "" +"This is also why we don't suggest you publish to conda-forge as a " +"practice run." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:423 +msgid "" +"Once you create your pull request, a suite of CI actions will run that " +"build and test the build of your package. A conda-forge maintainer will " +"work with you to get your recipe in good shape and merged." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:427 +msgid "" +"Image showing the 5 CI tasks that will run against your package in the " +"GitHub interface after you'ce created a pull request." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:429 +msgid "" +"Wait until all of the CI steps in your pull request have run. At that " +"point your pull request is ready for review by a conda-forge maintainer." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:432 +msgid "" +"In some cases getting all of the checks to run successfully in CI might " +"take a bit of work. If you are struggling to get your recipe to build " +"properly, you can ping the conda-forge maintainer team for help." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:434 +msgid "Please be patient and wait for them to respond." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:436 +msgid "conda-forge staged recipes and CI failures" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:439 +msgid "" +"If your package is a pure Python package that can be installed on any " +"type of computer (Windows, mac, linux) and has no architecture " +"requirements (known as noarch: Python or no architecture requirements) " +"then the conda-forge team only requires tests for Linux CI to pass." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:441 +msgid "" +"So if tests for Windows and MAC OS fail, that is to be expected. In this " +"case, don't worry about failing tests, the maintainer team can help you " +"get your package published." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:444 +msgid "" +"Once you have submitted your recipe, you can wait for the CI build to " +"pass. If it's not passing, and you aren't sure why, a conda-forge " +"maintainer can likely help you figure things out." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:446 +msgid "" +"Once your recipe is built and merged, the conda team will create a new " +"package repository for you similar to [this one for the GemGIS " +"package](https://github.com/conda-forge/gemgis-feedstock)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:448 +msgid "" +" Congratulations - you " +"have added your package to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:450 +msgid "" +"The last part of this process is maintaining the repository. We cover " +"that next." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:453 +msgid "Maintaining your conda-forge feedstock" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:455 +msgid "" +"Every time you create a new release on PyPI, the conda-forge bots will " +"recognize the release and will rebuild the newly released version of your" +" package. This process may take a day or two to complete so be patient." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:457 +msgid "" +"Once the conda-forge build is complete, all of the maintainers of your " +"conda-forge feedstock will get a ping on GitHub that a new pull request " +"has been opened." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:459 +msgid "" +"Review the pull request. If all tests are passing, you can merge it. " +"Shortly after merging your pull request, the conda-forge release will be " +"available for users to install:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:461 +msgid "`conda install -c conda-forge yourpackage`" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:465 +msgid "If you have walked through this entire tutorial series you will now:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:467 +msgid "Understand [what a Python package is ](intro.md)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:468 +msgid "" +"Know how to [make your code installable](installable-code.md) into Python" +" environments" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:469 +msgid "" +"Know how to create a `pyproject.toml` file, a `README` file, and a " +"`LICENSE` and code of conduct." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:470 +msgid "Know how to [publish your package to PyPI](publish-pypi.md) and" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:471 +msgid "Know how to publish your package to conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:473 +msgid "" +"The above are the basic steps that you need to take to create and publish" +" a Python package. In a future tutorial series we will cover that basics " +"of maintaining your package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:477 +msgid "[Grayskull blogpost](https://conda-forge.org/blog/2020/03/05/grayskull/)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:478 +msgid "[Pipx documentation](https://pipx.pypa.io/stable/)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:1 +msgid "Publish your Python package to PyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:4 +msgid "" +"Make sure they add /dist to their .gitignore file. We have not discussed " +"GitHub workflows anywhere yet. Where does that fit?" +msgstr "" + +#: ../../tutorials/publish-pypi.md:8 +msgid "In the previous Python packaging lessons, you've learned:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:10 +msgid "What a Python package is" +msgstr "" + +#: ../../tutorials/publish-pypi.md:11 +msgid "How to make your code installable." +msgstr "" + +#: ../../tutorials/publish-pypi.md:19 +msgid "Build your package's source (sdist) and wheel distributions" +msgstr "" + +#: ../../tutorials/publish-pypi.md:20 +msgid "Setup an account on TestPyPI (the process is similar for PyPI)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:21 +msgid "Publish your package to TestPyPI and PyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:23 +msgid "" +"You will do all of your development work in this lesson using " +"[Hatch](https://hatch.pypa.io/latest/)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:25 +msgid "" +"Once your package is on PyPI you can publish it to conda-forge (which is " +"a channel on conda) using " +"[Grayskull](https://conda.github.io/grayskull/)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:28 +msgid "" +"You will learn how to publish to conda-forge in the [next lesson" +"](publish-conda-forge)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:32 +msgid "" +"Graphic showing the high level packaging workflow. On the left you see a " +"graphic with code, metadata and tests in it. Those items all go into your" +" package. An arrow to the right takes you to a build distribution files " +"box. Another arrow to the right takes you to a publish to PyPI box which " +"has an arrow containing sdist and wheel that notes those files go to PyPI" +" for hosting. From PyPI is an arrow containing sdist since you can then " +"connect to conda-forge for an automated build that sends distributions " +"from PyPI to conda-forge." +msgstr "" + +#: ../../tutorials/publish-pypi.md:34 +msgid "" +"You need to build your Python package in order to publish it to PyPI (or " +"Conda). The build process organizes your code and metadata into a " +"distribution format that can be uploaded to PyPI and subsequently " +"downloaded and installed by users." +msgstr "" + +#: ../../tutorials/publish-pypi.md:37 +msgid "TestPyPI vs PyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:39 +msgid "" +"There are two repositories associated with PyPI to which you can upload " +"your Python package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:42 +msgid "" +"**[TestPyPI](https://test.pypi.org):** TestPyPI is a package repository " +"provided by PyPI that you can use for testing that your package can be " +"uploaded, downloaded, and installed correctly. This is a great place to " +"practice and learn how to publish a package without exposing your " +"incomplete package on the real PyPI service." +msgstr "" + +#: ../../tutorials/publish-pypi.md:43 +msgid "" +"**[PyPI](https://pypi.org):** This is the live, production PyPI " +"repository where you can officially publish your Python package, and from" +" which users will get your package. IMPORTANT: Only publish your package " +"to PyPI when you are ready for it to be used by others and/or confident " +"that it will become a package that you will maintain. PyPI is not a place" +" to practice learning how to publish a Python package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:45 +msgid "" +"The steps for publishing on TestPyPI vs. PyPI are similar with the " +"exception of a different url. We will point out where they differ." +msgstr "" + +#: ../../tutorials/publish-pypi.md:48 +msgid "4 Steps for publishing a Python package on TestPyPI (or PyPI)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:50 +msgid "" +"In this lesson you will learn how to publish your package to TestPyPI " +"using [Hatch](https://hatch.pypa.io/latest/). There are 4 things that you" +" need to do to publish your Python package: to TestPyPI. You need to:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:55 +msgid "**Create a package development environment**" +msgstr "" + +#: ../../tutorials/publish-pypi.md:56 +msgid "" +"[**Build your package using `hatch build`**](../package-structure-code" +"/python-package-distribution-files-sdist-wheel). Building a package is " +"the process of turning your code into two types of distribution files: " +"sdist and wheel. The wheel distribution file is particularly important " +"for users who will `pip install` your package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:57 +msgid "" +"**Create an account on TestPyPI (or PyPI)**: You will need to create a " +"TestPyPI account and associated token which provides permissions for you " +"to upload your package. When you later publish your package to PyPI, you " +"will need a separate PyPI account and token." +msgstr "" + +#: ../../tutorials/publish-pypi.md:58 +msgid "**Publish to TestPyPI using `hatch publish`**" +msgstr "" + +#: ../../tutorials/publish-pypi.md:60 +msgid "" +"In a future lesson, you will learn how to create an automated GitHub " +"action workflow that publishes an updated version of your package to PyPI" +" every time you create a GitHub release." +msgstr "" + +#: ../../tutorials/publish-pypi.md:64 +msgid "Learn more about building Python packages in our guide" +msgstr "" + +#: ../../tutorials/publish-pypi.md:68 +msgid "" +"[Learn more about what building a Python package is](../package-" +"structure-code/python-package-distribution-files-sdist-wheel)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:69 +msgid "" +"[Learn more about the package distribution file that PyPI needs called " +"the wheel](#python-wheel)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:70 +msgid "" +"[Learn more about the package distribution file that conda-forge will " +"need on PyPI called the sdist (source distribution)](#python-source-" +"distribution)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:73 +msgid "Step 1: Create a Python package development environment" +msgstr "" + +#: ../../tutorials/publish-pypi.md:75 +msgid "" +"The first step in building your package is to create a development " +"environment. The Python environment will contain all of the dependencies " +"needed to both install and work on your package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:77 +msgid "Use Hatch to create your environment." +msgstr "" + +#: ../../tutorials/publish-pypi.md:85 +msgid "Then view all of the current environments that hatch has access to:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:97 +msgid "" +"Then activate the environment. Note that when you call a shell from a " +"Hatch environment, it will automatically install your package into the " +"environment in development or editable mode." +msgstr "" + +#: ../../tutorials/publish-pypi.md:107 +msgid "View what's in the environment using `pip list`:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:123 +msgid "At any time you can exit the environment using `exit`." +msgstr "" + +#: ../../tutorials/publish-pypi.md:137 +msgid "Hatch and environments" +msgstr "" + +#: ../../tutorials/publish-pypi.md:139 +msgid "" +"Behind the scenes when hatch creates a new virtual environment, by " +"default it uses venv[^venv] which is the default environment management " +"tool that comes with Python installations." +msgstr "" + +#: ../../tutorials/publish-pypi.md:142 +msgid "Hatch will:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:144 +msgid "Create a new virtualenv (venv) that is located on your computer." +msgstr "" + +#: ../../tutorials/publish-pypi.md:145 +msgid "" +"Install your package into the environment in editable mode (similar to " +"`python -m pip install -e`). This means it installs both your project and" +" your project's dependencies as declared in your pyproject.toml file." +msgstr "" + +#: ../../tutorials/publish-pypi.md:147 +msgid "Step 2: Build your package's sdist and wheel distributions" +msgstr "" + +#: ../../tutorials/publish-pypi.md:149 +msgid "" +"Once you have your development environment setup, you are ready to build " +"your package using Hatch. Remember that building is the process of " +"turning your Python package file structure into two distribution files:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:151 +msgid "" +"The [wheel distribution](#python-wheel) is a pre-built version of your " +"package. It useful for users as it can be directly installed using a tool" +" such as `pip`. This file has the extension `.whl`." +msgstr "" + +#: ../../tutorials/publish-pypi.md:152 +msgid "" +"The [source distribution](#python-source-distribution) contains the files" +" that make up your package in an unbuilt format. This file will have the " +"extension `.tar.gz`." +msgstr "" + +#: ../../tutorials/publish-pypi.md:154 +msgid "" +"You will use Hatch as a **Front end** tool that builds your package's " +"sdist and wheel using the [hatchling](https://hatch.pypa.io/latest/) " +"build back-end. The hatchling build back-end is used because you declared" +" it in your pyproject.toml file in the [previous lesson](installable-" +"code)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:158 +msgid "To build your package run `hatch build`:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:169 +msgid "Learn more about building a Python package" +msgstr "" + +#: ../../tutorials/publish-pypi.md:171 +msgid "" +"You can learn more about building in the [build page of our packaging " +"guide](../package-structure-code/python-package-distribution-files-sdist-" +"wheel)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:175 +msgid "" +"The sdist is important if you wish to [publish your package to conda-" +"forge](publish-conda-forge). You will learn about this in a later lesson." +msgstr "" + +#: ../../tutorials/publish-pypi.md:179 +msgid "" +"➜ hatch build ────────────────────────────────────── sdist " +"────────────────────────────────────── dist/pyospackage-0.1.tar.gz " +"────────────────────────────────────── wheel " +"────────────────────────────────────── dist/pyospackage-0.1-py3-none-" +"any.whl" +msgstr "" + +#: ../../tutorials/publish-pypi.md:186 +msgid "" +" Congratulations - " +"you've created your Python package distribution files " +msgstr "" + +#: ../../tutorials/publish-pypi.md:188 +msgid "" +"You've now built your Python package and created your package " +"distribution files. The next step is to setup your account on TestPyPI so" +" you can publish your package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:191 +msgid "Step 3. Setup your TestPyPI account" +msgstr "" + +#: ../../tutorials/publish-pypi.md:193 +msgid "" +"Next, you'll setup an account on TestPyPI. Remember that you are using " +"TestPyPI here instead of the real PyPI as a way to safely learn how to " +"publish a package without accidentally \"releasing\" your package before " +"it's ready." +msgstr "" + +#: ../../tutorials/publish-pypi.md:197 +msgid "TestPyPI vs. PyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:198 +msgid "" +"If you have a package that you are confident belongs on PyPI, all of the " +"steps below will also work for you. When you publish using Hatch, you " +"will call `hatch publish` to publish directly to PyPI instead of `hatch " +"publish -r test` which publishes to TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:201 +msgid "" +"[Open up a web browser and go to the TestPyPI " +"website](https://test.pypi.org/)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:202 +msgid "" +"[Create an account](https://test.pypi.org/account/register/) if you don't" +" already have one. Be sure to store your password in a safe place!" +msgstr "" + +#: ../../tutorials/publish-pypi.md:203 +msgid "Once you have an account setup, login to it." +msgstr "" + +#: ../../tutorials/publish-pypi.md:204 +msgid "" +"Search on [https://test.pypi.org/](https://test.pypi.org/) (and also on " +"[https://pypi.org/](https://pypi.org/)) to ensure that the package name " +"that you have selected doesn't already exist. If you are using our test " +"pyosPackage, then we suggest that you add your name or GitHub username to" +" the end of the package name to ensure it's unique." +msgstr "" + +#: ../../tutorials/publish-pypi.md:206 +msgid "Example: `pyosPackage_yourNameHere`." +msgstr "" + +#: ../../tutorials/publish-pypi.md +msgid "Renaming your project before publishing" +msgstr "" + +#: ../../tutorials/publish-pypi.md:211 +msgid "Required" +msgstr "" + +#: ../../tutorials/publish-pypi.md:213 +msgid "" +"Search your publishing location(s) to make sure your new name isn't taken" +" ([TestPyPI](https://test.pypi.org/), [PyPI](https://pypi.org/), [conda-" +"forge](https://conda-forge.org/packages/))" +msgstr "" + +#: ../../tutorials/publish-pypi.md:214 +msgid "" +"Update the project name in your pyproject.toml file (e.g. `name = " +"\"pyospackage_yourNameHere\"`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:215 +msgid "" +"Update the module folder name to be the same (e.g. " +"`src/pyospackage_yourNameHere`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:216 +msgid "Rebuild your project (`hatch build`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:217 +msgid "Publish your package to capture the name (continue this tutorial!)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:219 +msgid "Recommended" +msgstr "" + +#: ../../tutorials/publish-pypi.md:221 +msgid "Update the Github repository name to align with the new package name" +msgstr "" + +#: ../../tutorials/publish-pypi.md:222 +msgid "" +"Update your local project folder to match the new package name (e.g. " +"`pyospackage_yourNameHere/src`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:223 +msgid "Update mentions of your repository name in other files (e.g. `README.md`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:227 +msgid "" +"This is a screenshot of the TestPyPI website. At the top in the search " +"bar, you can see the search for pyosPackage. The search return says there" +" were no results for pyosPackage Did you mean probpackage" +msgstr "" + +#: ../../tutorials/publish-pypi.md:229 +msgid "" +"Before you try to upload to TestPyPI, check to see if the name of your " +"package is already taken. You can do that using the search box at the top" +" of the TestPyPI website." +msgstr "" + +#: ../../tutorials/publish-pypi.md:233 +msgid "Setup 2-factor (2FA) authentication" +msgstr "" + +#: ../../tutorials/publish-pypi.md:235 +msgid "" +"2-factor authentication is a secure login process that allows you to use " +"a backup device that only you can access to validate that the person " +"logging in is really you. It addresses the issue of password phishing " +"where someone else gains access to a password and can login to your " +"account." +msgstr "" + +#: ../../tutorials/publish-pypi.md:238 +msgid "" +"This matters on PyPI because someone could login to your account and " +"upload a version of your package that has security issues. These issues " +"will then impact all of your users when they download and install that " +"version of the package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:240 +msgid "" +"2-factor authentication is required for PyPI authentication as of 1 " +"January 2024." +msgstr "" + +#: ../../tutorials/publish-pypi.md:244 +msgid "Step 4. Create a package upload token" +msgstr "" + +#: ../../tutorials/publish-pypi.md:246 +msgid "" +"To upload your package to TestPyPI (or PyPI), you will need to create a " +"token for your account first, and should then create a package-specific " +"token. (If you completed this step previously, you can reuse the tokens " +"when you upload your package again.)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:248 +msgid "Why create package-specific tokens?" +msgstr "" + +#: ../../tutorials/publish-pypi.md:250 +msgid "" +"It's ideal to create a package-specific token. When you create an " +"account-wide token this allows anyone with access to the account to then " +"access all of your TestPyPI (or PyPI) projects. By creating a package-" +"specific token, you are limiting the scope of the token to only your " +"specific package. This is just a safe way to set things up for you " +"particularly if you are collaborating with others on package development." +msgstr "" + +#: ../../tutorials/publish-pypi.md:253 +msgid "Follow the steps below to create your token." +msgstr "" + +#: ../../tutorials/publish-pypi.md:255 +msgid "Login to TestPyPI and go to your account settings" +msgstr "" + +#: ../../tutorials/publish-pypi.md:256 +msgid "Scroll down to the **API tokens** section" +msgstr "" + +#: ../../tutorials/publish-pypi.md:257 +msgid "Click on the **Add API Token** button" +msgstr "" + +#: ../../tutorials/publish-pypi.md:258 +msgid "" +"If you are new to using TestPyPI and don't have any packages there yet, " +"OR if you have other packages on TestPyPI but are uploading a new " +"package, you will need to create an account-wide token." +msgstr "" + +#: ../../tutorials/publish-pypi.md:259 +msgid "" +"When you create your token, be sure to copy the token value and store it " +"in a secure place before closing that browser." +msgstr "" + +#: ../../tutorials/publish-pypi.md:261 +msgid "Your token should look something like this:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:263 +msgid "`pypi-abunchofrandomcharactershere...`" +msgstr "" + +#: ../../tutorials/publish-pypi.md:265 +msgid "It should start with `pypi` followed by a dash and a bunch of characters." +msgstr "" + +#: ../../tutorials/publish-pypi.md:267 +msgid "Upload to TestPyPI using Hatch" +msgstr "" + +#: ../../tutorials/publish-pypi.md:269 +msgid "Once you have your token, you are ready to publish to TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:272 +msgid "Run `hatch publish -r test`" +msgstr "" + +#: ../../tutorials/publish-pypi.md:274 +msgid "" +"`-r` stands for repository. In this case because you are publishing to " +"TestPyPI you will use `-r test`. Hatch will then ask for a username and " +"credentials." +msgstr "" + +#: ../../tutorials/publish-pypi.md:276 +msgid "" +"Add the word `__token__` for your username. This tells TestPyPI that you " +"are using a token value rather than a username." +msgstr "" + +#: ../../tutorials/publish-pypi.md:277 +msgid "Paste your TestPyPI token value in at the `Enter your credentials` prompt:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:288 +msgid "" +"If your credentials are valid, and you have already run `hatch build` and" +" thus have your 2 distribution files in a `dist/` directory then Hatch " +"will publish your package to TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:292 +msgid "" +"Hatch also has a caching system so once you enter your credentials it " +"will remember them." +msgstr "" + +#: ../../tutorials/publish-pypi.md:295 +msgid "Install your package from TestPyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:297 +msgid "" +"Once your package upload is complete, you can install it from TestPyPI. " +"You can find the installation instructions on the TestPyPI landing page " +"for your newly uploaded package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:302 +msgid "" +"A screenshot of the TestPyPI page for pyosPackage. It says pyosPackage " +"0.1.0 at the top with the pip install instructions below. The landing " +"page of the package has information from the package's README file." +msgstr "" + +#: ../../tutorials/publish-pypi.md:304 +msgid "" +"This is an example landing page for the pyosPackage that was just " +"uploaded. Notice at the top of the page there are instructions for how to" +" install the package from TestPyPI. You can simply copy that code and use" +" it to install your package from TestPyPI locally." +msgstr "" + +#: ../../tutorials/publish-pypi.md:307 +msgid "" +"As an example, [check out our pyOpenSci pyosPackage landing page on " +"TestPyPI](https://test.pypi.org/project/pyosPackage/). Notice that the " +"page has information about the current package version and also " +"installation instructions as follows:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:311 +msgid "`python -m pip install -i https://test.pypi.org/simple/ pyosPackage`" +msgstr "" + +#: ../../tutorials/publish-pypi.md:314 +msgid "" +"Publishing to TestPyPI vs PyPI While you can install from TestPyPI it's " +"not recommended that you publish to TestPyPI as a permanent way to " +"install your package. In fact, you cannot, because TestPyPI may delete " +"accounts after a time. TestPyPI is a perfect place to learn how to " +"publish your package and test the installation process. But your end goal" +" should be to publish to PyPI once you have figured out your workflow and" +" your package is ready to deploy." +msgstr "" + +#: ../../tutorials/publish-pypi.md:318 +msgid "Time to install your package" +msgstr "" + +#: ../../tutorials/publish-pypi.md:320 +msgid "" +"On your computer, activate the development environment that you wish to " +"install your newly published package in." +msgstr "" + +#: ../../tutorials/publish-pypi.md:322 +msgid "Run the installation instructions for your package from TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md +msgid "Conda" +msgstr "" + +#: ../../tutorials/publish-pypi.md +msgid "venv Mac / Linux" +msgstr "" + +#: ../../tutorials/publish-pypi.md:346 +msgid "The value of end-to-end tools like hatch, flit and poetry" +msgstr "" + +#: ../../tutorials/publish-pypi.md:347 +msgid "" +"In this lesson you are using Hatch and hatchling to create, build and " +"publish your Python package. [Click here to learn about other packaging " +"tools in the ecosystem.](../package-structure-code/python-package-build-" +"tools.md)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:351 +msgid "" +"teach them to setup trusted publisher for actions... in the actions " +"lesson https://pypi.org/help/#twofa" +msgstr "" + +#: ../../tutorials/publish-pypi.md:354 +msgid "" +"from PyPI: https://pypi.org/help/#apitoken - You can create a token for " +"an entire PyPI account, in which case, the token will work for all " +"projects associated with that account. Alternatively, you can limit a " +"token's scope to a specific project." +msgstr "" + +#: ../../tutorials/publish-pypi.md:357 +msgid "Package-specific token vs trusted publisher" +msgstr "" + +#: ../../tutorials/publish-pypi.md:359 +msgid "" +"For long run maintenance of your package, you have two options related to" +" PyPI publication." +msgstr "" + +#: ../../tutorials/publish-pypi.md:362 +msgid "" +"You can create a package-specific token which you will use to publish " +"your package (manually) to PyPI. This is a great option if you don't wish" +" to automate your PyPI publication workflow." +msgstr "" + +#: ../../tutorials/publish-pypi.md:363 +msgid "" +"You can also create an automated publication workflow on GitHub using " +"GitHub actions. This is a great way to make the publication process " +"easier and it also supports a growing maintainer team. In this case we " +"suggest you don't worry about the token and instead setup a specific " +"GitHub action that publishes your package when you make a release. You " +"can then create a \"trusted publisher\" workflow on PyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:365 +msgid "" +"You will learn how to create the automated trusted publisher workflow in " +"a followup lesson." +msgstr "" + +#: ../../tutorials/publish-pypi.md:368 +msgid "OPTIONAL: If you want to use a manual token-based publication workflow" +msgstr "" + +#: ../../tutorials/publish-pypi.md:370 +msgid "" +"If you plan to use your token regularly to publish to PyPI, we strongly " +"recommend going through the above steps again to create a token specific " +"to your new package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:373 +msgid "To do this:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:374 +msgid "Go to TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:375 +msgid "Navigate to the \"Your Projects\" section of your account" +msgstr "" + +#: ../../tutorials/publish-pypi.md:376 +msgid "" +"Click on the manage button for the project that you wish to add a token " +"for" +msgstr "" + +#: ../../tutorials/publish-pypi.md:377 +msgid "Go to settings" +msgstr "" + +#: ../../tutorials/publish-pypi.md:378 +msgid "Click on \"Create a token for your-package-name-here\"" +msgstr "" + +#: ../../tutorials/publish-pypi.md:379 +msgid "" +"Create the token and follow the steps above publish your package using " +"the repository specific token." +msgstr "" + +#: ../../tutorials/publish-pypi.md:381 +msgid "And you're all done!" +msgstr "" + +#: ../../tutorials/publish-pypi.md:383 +msgid "You have published your package to TestPyPI!" +msgstr "" + +#: ../../tutorials/publish-pypi.md:385 +msgid "" +"Congratulations. You have now successfully published your package to " +"TestPyPI. If you have a package that is ready for real-world use on the " +"real PyPI, then you can follow the same steps (with the differences noted" +" above) to publish it on PyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:387 +msgid "" +"Once you publish on PyPI, you can then easily add your package to the " +"conda-forge ecosystem using the [grayskull](https://conda-" +"forge.org/blog/posts/2020-03-05-grayskull/) tool." +msgstr "" + +#: ../../tutorials/publish-pypi.md:389 +msgid "You will learn how to do that in the next lesson." +msgstr "" + +#: ../../tutorials/publish-pypi.md:396 +msgid "https://docs.python.org/3/library/venv.html" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:1 +msgid "Make your Python package PyPI ready - pyproject.toml" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:3 +msgid "" +"In [the installable code lesson](installable-code), you learned how to " +"add the bare minimum information to a `pyproject.toml` file to make it " +"installable. You then learned how to [publish a bare minimum version of " +"your package to PyPI](publish-pypi.md)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:5 +msgid "Following that you learned how to add a:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:6 +msgid "[README.md](add-readme)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:7 +msgid "[LICENSE](add-license-coc) and" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:8 +msgid "[CODE_OF_CONDUCT](add-coc)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:10 +msgid "to the root of your project directory." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:12 +msgid "" +"To enhance the visibility of your package on PyPI and provide more " +"information about its compatibility with Python versions, project " +"development status, and project maintainers, you should add additional " +"metadata to your `pyproject.toml` file. This lesson will guide you " +"through the process." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:24 +msgid "" +"More about the `pyproject.toml` file and how it's used to store different" +" types of metadata about your package" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:25 +msgid "" +"How to declare information (metadata) about your project to help users " +"find and understand it on PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:27 +msgid "" +"If you wish to learn more about the `pyproject.toml` format, [check out " +"this page. ](../package-structure-code/pyproject-toml-python-package-" +"metadata.md)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md +msgid "Click for lesson takeaways" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:34 +msgid "When creating your pyproject.toml file, consider the following:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:36 +msgid "" +"There are only two required metadata tables that you need to install and " +"publish your Python package:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:37 +msgid "**[build-system]**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:38 +msgid "**[project]**." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:39 +msgid "" +"The **[project]** table stores your package's metadata. Within the " +"**[project]** table, There are only two _required_ fields:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:40 +msgid "**name=**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:41 +msgid "**version=**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:42 +msgid "" +"You should add more metadata to the `[project]` table as it will make it " +"easier for users to find your project on PyPI. And it will also make it " +"easier for installers to understand how to install your package." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:43 +msgid "" +"When you are adding classifiers to the **[project]** table, only use " +"valid values from [PyPI’s classifier " +"page](https://PyPI.org/classifiers/). An invalid value here will raise an" +" error when you build and publish your package on PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:44 +msgid "" +"There is no specific order for tables in the `pyproject.toml` file. " +"However, fields need to be placed within the correct tables. For example " +"`requires =` always need to be in the **[build-system]** table." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:45 +msgid "" +"We suggest that you include your **[build-system]** table at the top of " +"your `pyproject.toml` file." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:50 +msgid "" +"The `pyproject.toml` file is a human and machine-readable file that " +"serves as the primary configuration file for your Python package." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:54 +msgid "" +"[Building your package](build-package) is the step that created the " +"distribution files that are required for you to publish to PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:58 +msgid "About the .toml format" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:60 +msgid "" +"The **pyproject.toml** file is written in [TOML (Tom's Obvious, Minimal " +"Language) format](https://toml.io/en/). TOML is an easy-to-read structure" +" that is based on key/value pairs. Each section in the **pyproject.toml**" +" file contains a `[table identifier]`. The TOML format can be compared to" +" other structured formats such as`.json`. However, the TOML format was " +"designed to be easier to read for humans." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:62 +msgid "" +"Below you can see the `[build-system]` table. Within that table there are" +" two required key/value pairs." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:65 +msgid "" +"`requires =` is the key and the value is `[\"hatchling\"]` within the " +"`[build-system]` array specified by square brackets `[]`." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:75 +msgid "What is the pyproject.toml used for?" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:77 +msgid "The pyproject.toml file tells your build tool:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:79 +msgid "" +"What build backend to use to build your package (we are using `hatchling`" +" in this tutorial but there are [many others to choose from](/package-" +"structure-code/python-package-build-tools))." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:80 +msgid "How and where to retrieve your package's version:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:81 +msgid "**statically** where you declare the version `version = \"0.1.0\"` or" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:82 +msgid "" +"**dynamically** where the tool looks to the most recent tag in your " +"history to determine the current version." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:83 +msgid "What dependencies your package needs" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:84 +msgid "What versions of Python your package supports (important for your users)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:86 +msgid "" +"The `pyproject.toml` file also makes it easy for anyone browsing your " +"GitHub repository to quickly understand your package's structure such as:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:89 +msgid "How your package is built," +msgstr "" + +#: ../../tutorials/pyproject-toml.md:90 +msgid "What Python versions and operating systems it supports" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:91 +msgid "What it does," +msgstr "" + +#: ../../tutorials/pyproject-toml.md:92 +msgid "Who maintains it" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:94 +msgid "" +"Finally, the pyproject.toml file is also often used to configure tools " +"such as static type checkers (e.g. mypy) and code formatters/linters " +"(e.g. black, ruff)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:97 +msgid "" +"Check out the [PyPA " +"documentation](https://packaging.python.org/en/latest/tutorials" +"/packaging-projects/#choosing-a-build-backend) if you are interested in " +"setting build configurations for other tools." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:99 +msgid "" +"Note that some build tools may deviate in how they store project " +"metadata. As such you may want to refer to their documentation if you " +"decide to use a tool other than Hatch and hatchling. We have selected " +"hatchling and hatch as our tool of choice for this tutorial as it adheres" +" to PyPA rules and guidelines." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:103 +msgid "How is pyproject.toml metadata used?" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:105 +msgid "" +"The pyproject.toml file is the file that your build tool uses to populate" +" a `METADATA` that is included in your Python distribution files that get" +" published to PyPI. This `METADATA` file is then used by PyPI to populate" +" your package's PyPI landing page and help users filter through the tens " +"of thousands of packages published there." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:108 +msgid "" +"Image showing the left side bar of PyPI for the package xclim. The " +"section at the top says Classifier. Below there is a list of items " +"including Development status, intended audience, License, natural " +"language, operating system, programming language and topic. Below each of" +" those sections are various classifier options.\" width=\"300px\">" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:113 +msgid "" +"When you add the classifier section to your pyproject.toml and your " +"package is built, the build tool organizes the metadata into a format " +"that PyPI can understand and represent on your PyPI landing page. These " +"classifiers also allow users to sort through packages by version of " +"python they support, categories and more." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:119 +msgid "A more in-depth overview of pyproject.toml files" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:121 +msgid "" +"[Our guidebook page has a more in depth overview of this file" +"](../package-structure-code/pyproject-toml-python-package-metadata/)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:124 +msgid "How to update your pyproject.toml file" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:126 +msgid "" +"In the last lesson, you created a bare-bones pyproject.toml file that " +"contained the core elements needed to build your package:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:130 +msgid "" +"A `[build-system]` table where you defined your project's backend build " +"tool (`hatchling`)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:131 +msgid "A `[project]` table where you defined your project's version and name." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:133 +msgid "The `pyproject.toml` file that you created, looked like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:145 +msgid "" +"Your next step is to add additional recommended metadata fields that will" +" both help users find your package on PyPI and also better describe the " +"scope of your package. Once you add this metadata, you don't have to do " +"it again. These metadata fields will only be updated periodically when " +"you do something such as:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:148 +msgid "drop a package dependency" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:149 +msgid "modify what Python versions your package supports." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:151 +msgid "More on hatchling" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:154 +msgid "" +"The documentation for the hatchling back-end is " +"[here](https://hatch.pypa.io/latest/config/metadata/)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:157 +msgid "Step 1: Add Author, maintainer and project description" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:159 +msgid "" +"After completing the [installable code tutorial](installable-code), you " +"should have a pyproject.toml file with a project name and a version in " +"the `[project]` table." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:167 +msgid "Add the following to your table:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:169 +msgid "" +"A **description** of your package. This should be a single line and " +"should briefly describe the goal of your package using non technical " +"terms if as all possible!" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:170 +msgid "package **authors**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:171 +msgid "package **maintainers**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:173 +msgid "The `description` is just a string like the other values you've set:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:184 +msgid "" +"When you add authors and maintainers you need to use a format that will " +"look like a Python list with a dictionary within it:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:198 +msgid "Author names & emails" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:202 +msgid "" +"There is a quirk with PyPI for authors that have names but not emails in " +"the pyproject.toml. If you are missing the email for one or more authors " +"or maintainers, like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:211 +msgid "" +"Then we suggest that you only provide names in your list of names to " +"ensure that everything renders properly on your PyPI page - like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:220 +msgid "don't have emails for everyone, we suggest that you only add names." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:223 +msgid "" +"Your `pyproject.toml` file now should look like the example below. It is " +"OK if you only have 1 author and the same author is also maintainer of " +"your package:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md +msgid "" +"Learn More: What's the difference between author and maintainer in open " +"source?" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:251 +msgid "" +"When adding maintainers and authors, you may want to think about the " +"difference between the two." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:253 +msgid "Authors generally include people who:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:254 +msgid "originally created / designed developed the package and" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:255 +msgid "people who add new functionality to the package." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:257 +msgid "" +"Whereas maintainers are the people that are currently, actively working " +"on the project. It is often the case that there is overlap in authors and" +" maintainers. As such these lists may be similar or the same." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:259 +msgid "" +"A good example of when the lists might diverge is sometimes you have a " +"package where an initial author developed it and then stepped down as a " +"maintainer to move on to other things. This person may continue to be " +"considered an author but no longer actively maintains the package." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:261 +msgid "" +"It is important to note that there are many ways to define author vs " +"maintainer and we don't prescribe a single approach in this tutorial." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:263 +msgid "" +"However, we encourage you to consider carefully, for PyPI publication, " +"who you want to have listed as authors and maintainers on your PyPI " +"landing page." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:267 +msgid "Step 2: Add README and license" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:269 +msgid "" +"In the previous lessons, you added both a [README.md](add-readme) file " +"and a [LICENSE](add-license-coc) to your package repository. Once you " +"have those files, you can add them to your pyproject.toml file as links " +"following the example below." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:297 +msgid "Step 3: Specify Python version with `requires-python`" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:299 +msgid "" +"Add the `requires-python` field to your `pyproject.toml` `[project]` " +"table. The `requires-python` field helps pip identify which Python " +"versions that your package supports. It is set to a single value. The " +"[packaging " +"specification](https://packaging.python.org/en/latest/specifications" +"/core-metadata/#core-metadata-requires-python) defines`requires-python` " +"as a string that uses version specifiers. Most projects will specify the " +"oldest Python version supported by the package. In some advanced cases, " +"an upper bound is set to indicate which future Python versions, if any, " +"will be supported." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:331 +msgid "Step 4: Specify Dependencies" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:333 +msgid "" +"Next add your dependencies table to the project table. The `dependencies " +"=` section contains a list (or array in the toml language) of the Python " +"packages that your package requires to run properly in a Python " +"environment. Similar to the requirements listed in the `[build-system]` " +"table above:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:341 +msgid "dependencies are added in an array (similar to a Python list) structure." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:347 +msgid "" +"A dependency can be limited to specific versions using a **version " +"specifier.** If the dependency has no version specifier after the " +"dependency name, your package can use any version of the dependent " +"package. Code changes over time, bugs are fixed, APIs change, and so it's" +" good to be clear about which version of the dependency you wrote your " +"code to be compatible with - a package you wrote this year probably isn't" +" compatible with numpy v0.0.1!" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:351 +msgid "" +"[Learn more about various ways to specify ranges of package versions " +"here.](https://packaging.python.org/en/latest/specifications/version-" +"specifiers/#id5)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:353 +msgid "" +"The most common version specifier is a **lower bound,** allowing any " +"version higher than the specified version. Ideally you should set this to" +" the lowest version that is still compatible with your package, but in " +"practice for new packages this is often set at the version that was " +"current at the time the package was written[^lowerbound]." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:358 +msgid "Lower bounds look like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:364 +msgid "" +"Commas are used to separate individual dependencies, and each package in " +"your `dependencies` section can use different types of version " +"specifiers:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:375 +msgid "Your `pyproject.toml` file will now look like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:405 +msgid "Pin dependencies with caution" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:406 +msgid "" +"\"Pinning\" a dependency means setting it to a specific version, like " +"this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:408 +msgid "`numpy == 1.0`." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:410 +msgid "" +"If you are building a library package that other developers will depend " +"upon, you must be cautious before pinning to a precise dependency " +"version. Applications, such as production websites, will often pin their " +"dependencies since other packages will not depend on their project. This " +"is because users will be installing your package into various " +"environments. A dependency pinned to a single specific version can make " +"resolving a Python environment more challenging. As such only pin " +"dependencies to a specific version if you absolutely need to do so." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:418 +msgid "" +"Similarly, you should be cautious when specifying an upper bound on a " +"package. These two specifications are equivalent:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:426 +msgid "" +"One build tool that you should be aware of that pins dependencies to an " +"upper bound by default is Poetry. [Read more about how to safely add " +"dependencies with Poetry, here.](challenges-with-poetry)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:429 +msgid "Step 5: Add PyPI classifiers" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:431 +msgid "" +"Next you will add classifiers to your `pyproject.toml` file. The value " +"for each classifier that you add to your `pyproject.toml` file must come " +"from the list of [PyPI accepted classifier values found " +"here](https://PyPI.org/classifiers/). Any deviations in spelling and " +"format will cause issues when you publish to PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:433 +msgid "What happens when you use incorrect classifiers?" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:436 +msgid "" +"If you do not [use standard classifier " +"values](https://PyPI.org/classifiers/), when you try to publish your " +"package on PyPI it will be rejected. 😔 Don't worry if PyPI rejects you on" +" your first try! It has happened to all of us." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:439 +msgid "Review that list and add items below to your `pyproject.toml` file:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:441 +msgid "development status" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:442 +msgid "intended audiences" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:443 +msgid "topic" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:444 +msgid "license and" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:445 +msgid "programming language support" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:447 +msgid "" +"The classifier key should look something like the example below. A few " +"notes:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:449 +msgid "" +"Your classifier values might be different depending upon the license you " +"have selected for your package, your intended audience, development " +"status of your package and the Python versions that you support" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:450 +msgid "" +"You can add as many classifiers as you wish as long as you use the " +"[designated PyPI classifier values](https://PyPI.org/classifiers/)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:490 +msgid "" +"Note that while classifiers are not required in your `pyproject.toml` " +"file, they will help users find your package. As such we strongly " +"recommend that you add them." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:492 +msgid "Step 6: Add the `[project.urls]` table" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:494 +msgid "Finally, add the project.urls table to your pyproject.toml file." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:496 +msgid "" +"`project.urls` contains links that are relevant for your project. You " +"might want to include:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:498 +msgid "" +"**Homepage:** A link to your published documentation for your project. If" +" you are working through this tutorial, then you may not have this link " +"yet. That's ok, you can skip it for the time being." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:499 +msgid "" +"**Bug reports:** a link to your issues / discussions or wherever you want" +" users to report bugs." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:500 +msgid "**Source:** the GitHub / GitLab link for your project." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:546 +msgid "" +"There are many other urls that you can add here. Check out the [README " +"file here for an overview](https://github.com/patrick91/links-demo)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:549 +msgid "Putting it all together - your completed pyproject.toml file" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:551 +msgid "" +"Below is an example of a complete `pyproject.toml` file that is commented" +" with all of the sections we discussed above." +msgstr "" + +#: ../../tutorials/pyproject-toml.md +msgid "Appendix - Click for a fully commented pyproject.toml file" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:601 +msgid "" +"Below is a fully commented pyproject.toml file if you want to use it for " +"reference." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:666 +msgid "Example `pyproject.toml` files" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:668 +msgid "" +"Below are some examples of `pyproject.toml` files from various packages " +"in the scientific and pyOpenSci ecosystem." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:669 +msgid "" +"[PyPA's fully documented example pyproject.toml " +"file](https://github.com/pypa/sampleproject/blob/main/pyproject.toml)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:670 +msgid "" +"[taxpasta has a nicely organized pyproject.toml file and is a pyOpenSci " +"approved " +"package](https://github.com/taxprofiler/taxpasta/blob/f9f6eea2ae7dd08bb60a53dd49ad77e4cf143573/pyproject.toml)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:676 +msgid "At this point you've created:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:678 +msgid "A [README.md](add-readme) file for your package" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:679 +msgid "A [CODE_OF_CONDUCT.md](add-coc) file to support your user community" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:680 +msgid "" +"And a [LICENSE](add-license-coc) file which provides legal boundaries " +"around how people can and can't use your software" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:682 +msgid "" +"You also learned [how to publish your package to (test)PyPI](publish-" +"pypi)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:684 +msgid "Publish a new version of your package to PyPI" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:686 +msgid "" +"You are now ready to publish a new version of your Python package to " +"(test) PyPI. When you do this you will see that the landing page for your" +" package now contains a lot more information." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:688 +msgid "Try to republish now." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:690 +msgid "" +"First, update the version of your package in your pyproject toml file. " +"Below version is updated from `0.1` to `0.1.1`." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:703 +msgid "Now use hatch to publish the new version of your package to test.PyPI.org." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:710 +msgid "Next (optional) step - publishing to conda-forge" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:712 +msgid "" +"You now have all of the skills that you need to publish your package to " +"PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:715 +msgid "" +"If you also want to publish your package on conda-forge (which is a " +"channel within the conda ecosystem), you will learn how to do that in the" +" next lesson." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:719 +msgid "" +"Really good resources from jeremiah " +"https://daniel.feldroy.com/posts/2023-08-pypi-project-urls-cheatsheet " +"useful (and the linked links-demo even more so)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:356 +msgid "" +"Some packaging tools will do this for you when you add a dependency using" +" their cli interface. For example [`poetry add`](https://python-" +"poetry.org/docs/cli/#add) will add the most recent version with a `^` " +"specifier, and [`pdm add`](https://pdm-" +"project.org/latest/reference/cli/#add) will add the most recent version " +"with `>=`." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:1 +msgid "Using Hatch to Migrate setup.py to a pyproject.toml" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:3 +msgid "" +"Hatch can be particularly useful to generate your project's " +"`pyproject.toml` if your project already has a `setup.py`." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:5 +msgid "Note" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:8 +msgid "" +"This step is not necessary and is only useful if your project already has" +" a `setup.py` file defined." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:9 +msgid "" +"If your project does not already define a `setup.py` see [Make your " +"Python code installable](installable-code.md)" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:17 +msgid "" +"The process of using Hatch to transition to using `pyproject.toml` for " +"projects that already have a `setup.py` defined." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:20 +msgid "What is Hatch?" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:22 +msgid "" +"Hatch is a Python package manager designed to streamline the process of " +"creating, managing, and distributing Python packages. It provides a " +"convenient CLI (Command-Line Interface) for tasks such as creating new " +"projects, managing dependencies, building distributions, and publishing " +"packages to repositories like PyPI." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:28 +msgid "See [Get to know Hatch](get-to-know-hatch.md) for more information." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:31 +msgid "Prerequisites" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:33 +msgid "" +"Before we begin, ensure that you have Hatch installed on your system. You" +" can install it via pip:" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:39 +msgid "Sample Directory Tree" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:41 +msgid "" +"Let's take a look at a sample directory tree structure before and after " +"using `hatch init`:" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:43 +msgid "Before `hatch init`" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:59 +msgid "After `hatch init`" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:77 +msgid "" +"As you can see, the main change after running `hatch init` is the " +"addition of the `pyproject.toml` file in the project directory." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:79 +msgid "Step-by-Step Guide" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:81 +msgid "" +"Now, let's walk through the steps to use Hatch to create a " +"`pyproject.toml` file for your project." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:83 +msgid "" +"**Navigate to Your Project Directory**: Open your terminal or command " +"prompt and navigate to the directory where your Python project is " +"located." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:85 +msgid "" +"**Initialize Hatch**: Run the following command to initialize Hatch in " +"your project directory:" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:91 +msgid "" +"**Review and Customize**: After running the previous command, Hatch will " +"automatically generate a `pyproject.toml` file based on your existing " +"project configuration. Take some time to review the contents of the " +"generated `pyproject.toml` file. You may want to customize certain " +"settings or dependencies based on your project's requirements (see " +"[pyproject.toml tutorial](pyproject-toml.md) for more information about " +"the `pyproject.toml`)." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:93 +msgid "" +"**Verify**: Verify that the `pyproject.toml` file accurately reflects " +"your project configuration and dependencies. You can manually edit the " +"file if needed, but be cautious and ensure that the syntax is correct." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:95 +msgid "" +"**Delete setup.py**: Since we're migrating to using `pyproject.toml` " +"exclusively, the `setup.py` file becomes unnecessary. You can safely " +"delete it from your project directory." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:97 +msgid "" +"**Test Build**: Before proceeding further, it's essential to ensure that " +"your project builds successfully using only the `pyproject.toml` file. " +"Run the following command to build your project:" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:103 +msgid "" +"This command will build your project based on the specifications in the " +"`pyproject.toml` file. Make sure to check for any errors or warnings " +"during the build process." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:105 +msgid "" +"**Test Existing Functionality**: After successfully building your project" +" with `pyproject.toml`, it's crucial to ensure that your project's " +"existing functionality remains intact. Run any pre-existing tests to " +"verify that everything still works as expected." +msgstr "" + diff --git a/noxfile.py b/noxfile.py index 4a0ea835..ee44f29c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -43,7 +43,7 @@ ## Localization options (translations) # List of languages for which locales will be generated in (/locales/) -LANGUAGES = ["es"] +LANGUAGES = ["es", "ja"] # List of languages that should be built when releasing the guide (docs or docs-test sessions) RELEASE_LANGUAGES = [] From a35a30c12caf959f203f68e075c44def65bf1538 Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 18:10:41 +0900 Subject: [PATCH 47/65] Revert changes of es locale --- locales/es/LC_MESSAGES/CONTRIBUTING.po | 147 +++++------ locales/es/LC_MESSAGES/tutorials.po | 321 +++++-------------------- 2 files changed, 120 insertions(+), 348 deletions(-) diff --git a/locales/es/LC_MESSAGES/CONTRIBUTING.po b/locales/es/LC_MESSAGES/CONTRIBUTING.po index 0cddd183..b2a801f4 100644 --- a/locales/es/LC_MESSAGES/CONTRIBUTING.po +++ b/locales/es/LC_MESSAGES/CONTRIBUTING.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: pyOpenSci Python Package Guide \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"POT-Creation-Date: 2024-07-03 16:27-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -119,117 +119,96 @@ msgstr "" #: ../../CONTRIBUTING.md:35 msgid "" "Independently of the approach you choose, the first step is to fork the " -"Python Packaging Guide repository into your personal GitHub space. To " -"\"fork\" a repository in GitHub means to create a copy of the main " -"repository, or repo, that you have complete control over and can modify " -"as you see fit." +"Python Packaging Guide repository into your personal GitHub space." msgstr "" #: ../../CONTRIBUTING.md:37 -msgid "To fork a repo," -msgstr "" - -#: ../../CONTRIBUTING.md:39 -msgid "Make sure you are logged into GitHub." -msgstr "" - -#: ../../CONTRIBUTING.md:41 msgid "" -"Go to the repo you would like to fork, in this case the [Python Packaging" -" Guide](https://www.github.com/pyopensci/python-package-guide) repo." +"*__TODO__: This section should show a beginner user how to fork a " +"repository in GitHub.*" msgstr "" -#: ../../CONTRIBUTING.md:43 -msgid "" -"In the top right-hand corner of the page there is a 'Fork' button. Click " -"that button. You will be brought to a new page where you will 'Create a " -"new fork'. Feel free to keep all the default inputs and click 'Create " -"fork'. This will create a copy of the repo at " -"`https://github.com//python-package-guide`, where `` " -"is your GitHub username." -msgstr "" - -#: ../../CONTRIBUTING.md:47 +#: ../../CONTRIBUTING.md:39 msgid "Contributing via the GitHub website" msgstr "" -#: ../../CONTRIBUTING.md:49 +#: ../../CONTRIBUTING.md:41 msgid "How to edit a MarkDown file" msgstr "" -#: ../../CONTRIBUTING.md:51 +#: ../../CONTRIBUTING.md:43 msgid "" "*__TODO__: This section should show how to use the GitHub interface to " "edit and previewing a Markdown file.*" msgstr "" -#: ../../CONTRIBUTING.md:53 +#: ../../CONTRIBUTING.md:45 msgid "How to commit your changes" msgstr "" -#: ../../CONTRIBUTING.md:55 +#: ../../CONTRIBUTING.md:47 msgid "" "*__TODO__: This section should show how to commit changes via the GitHub " "interface.*" msgstr "" -#: ../../CONTRIBUTING.md:57 +#: ../../CONTRIBUTING.md:49 msgid "Contributing locally on your computer" msgstr "" -#: ../../CONTRIBUTING.md:59 +#: ../../CONTRIBUTING.md:51 msgid "Clone your forked repository" msgstr "" -#: ../../CONTRIBUTING.md:61 +#: ../../CONTRIBUTING.md:53 msgid "" "*__TODO__: This section should show how to clone a repository from GitHub" " into your computer.*" msgstr "" -#: ../../CONTRIBUTING.md:63 +#: ../../CONTRIBUTING.md:55 msgid "Create a new branch" msgstr "" -#: ../../CONTRIBUTING.md:65 +#: ../../CONTRIBUTING.md:57 msgid "*__TODO__: This section should show how to create a new branch.*" msgstr "" -#: ../../CONTRIBUTING.md:67 +#: ../../CONTRIBUTING.md:59 msgid "Create a virtual environment" msgstr "" -#: ../../CONTRIBUTING.md:69 +#: ../../CONTRIBUTING.md:61 msgid "" "*__TODO__: This section should show how to create a virtual environment " "using venv.*" msgstr "" -#: ../../CONTRIBUTING.md:71 +#: ../../CONTRIBUTING.md:63 msgid "Install the development dependencies" msgstr "" -#: ../../CONTRIBUTING.md:73 +#: ../../CONTRIBUTING.md:65 msgid "" "*__TODO__: This section should show how to install the development " "dependencies defined in pyproject.toml.*" msgstr "" -#: ../../CONTRIBUTING.md:75 +#: ../../CONTRIBUTING.md:67 msgid "Commit your changes" msgstr "" -#: ../../CONTRIBUTING.md:77 +#: ../../CONTRIBUTING.md:69 msgid "" "*__TODO__: This section should describe how to commit from the command " "line.*" msgstr "" -#: ../../CONTRIBUTING.md:79 +#: ../../CONTRIBUTING.md:71 msgid "How to build the guide locally" msgstr "" -#: ../../CONTRIBUTING.md:81 +#: ../../CONTRIBUTING.md:73 msgid "" "*__TODO__: This section should describe the different sessions in nox " "related to building the docs: docs, docs-test, docs-live. It should also " @@ -237,85 +216,85 @@ msgid "" " browser or using the live version from docs-live*" msgstr "" -#: ../../CONTRIBUTING.md:83 +#: ../../CONTRIBUTING.md:75 msgid "Before you submit your pull request" msgstr "" -#: ../../CONTRIBUTING.md:85 +#: ../../CONTRIBUTING.md:77 msgid "" "*__TODO__: This section should describe what steps a user should follow " "before submitting the pull request: build the docs, verify your changes " "look correct, etc.*" msgstr "" -#: ../../CONTRIBUTING.md:87 +#: ../../CONTRIBUTING.md:79 msgid "Submitting a pull request with your contribution" msgstr "" -#: ../../CONTRIBUTING.md:89 +#: ../../CONTRIBUTING.md:81 msgid "How to make a pull request" msgstr "" -#: ../../CONTRIBUTING.md:91 +#: ../../CONTRIBUTING.md:83 msgid "" "*__TODO__: This section should describe how to make a pull request in " "GitHub.*" msgstr "" -#: ../../CONTRIBUTING.md:93 +#: ../../CONTRIBUTING.md:85 msgid "What happens when you submit a pull request (CI/CD)" msgstr "" -#: ../../CONTRIBUTING.md:95 +#: ../../CONTRIBUTING.md:87 msgid "" "*__TODO__: This section should describe how to see the results of the " "CD/CI checks and how to get more information about errors*" msgstr "" -#: ../../CONTRIBUTING.md:97 +#: ../../CONTRIBUTING.md:89 msgid "What to expect from the review process" msgstr "" -#: ../../CONTRIBUTING.md:99 +#: ../../CONTRIBUTING.md:91 msgid "" "*__TODO__: This section should describe how review happens in GitHub, how" " see the comments, and how to submit changes (push a new branch)*" msgstr "" -#: ../../CONTRIBUTING.md:101 +#: ../../CONTRIBUTING.md:93 msgid "Additional help" msgstr "" -#: ../../CONTRIBUTING.md:103 +#: ../../CONTRIBUTING.md:95 msgid "How to get help" msgstr "" -#: ../../CONTRIBUTING.md:105 +#: ../../CONTRIBUTING.md:97 msgid "" "*__TODO__: This section should describe the options for finding more help" " in case beginner contributors need more help (e.g., create an issue, " "post in a forum, etc).*" msgstr "" -#: ../../CONTRIBUTING.md:107 +#: ../../CONTRIBUTING.md:99 msgid "Additional resources" msgstr "" -#: ../../CONTRIBUTING.md:109 +#: ../../CONTRIBUTING.md:101 msgid "" "*__TODO__: It should also include links to beginner documentation, like " "the GitHub docs.*" msgstr "" -#: ../../CONTRIBUTING.md:111 +#: ../../CONTRIBUTING.md:103 msgid "Annex" msgstr "" -#: ../../CONTRIBUTING.md:113 +#: ../../CONTRIBUTING.md:105 msgid "Code examples" msgstr "" -#: ../../CONTRIBUTING.md:115 +#: ../../CONTRIBUTING.md:107 msgid "" "This guide uses the [literalinclude Sphinx directive](https://www.sphinx-" "doc.org/en/master/usage/restructuredtext/directives.html#directive-" @@ -323,18 +302,18 @@ msgid "" "for use in the documentation is kept in the `examples/` folder." msgstr "" -#: ../../CONTRIBUTING.md:119 +#: ../../CONTRIBUTING.md:111 msgid "Referencing code in documentation" msgstr "" -#: ../../CONTRIBUTING.md:121 +#: ../../CONTRIBUTING.md:113 msgid "" "If an example is present elsewhere in the documentation that you want to " "use, you can copy the `literalinclude` directive verbatim and the " "examples will stay in sync." msgstr "" -#: ../../CONTRIBUTING.md:124 +#: ../../CONTRIBUTING.md:116 msgid "" "If you already see code in the examples folder that you can use for new " "documentation, a new `literalinclude` can be made to extract it into the " @@ -344,7 +323,7 @@ msgid "" "the later can protect your example from future modifications to the code." msgstr "" -#: ../../CONTRIBUTING.md:129 +#: ../../CONTRIBUTING.md:121 msgid "" "**Pro tip**: As an alternative to `:lines:` there are also the `:start-" "after:`, `:start-at:`, `:end-before:`, and `:end-at:` options. And if the" @@ -352,17 +331,17 @@ msgid "" "way to keep the same documentation content even through code refactors." msgstr "" -#: ../../CONTRIBUTING.md:133 +#: ../../CONTRIBUTING.md:125 msgid "" "If you need example code that doesn't yet exist in `examples/` see " "creating code for documentation](#creating-code-for-documentation)." msgstr "" -#: ../../CONTRIBUTING.md:136 +#: ../../CONTRIBUTING.md:128 msgid "Creating code for documentation" msgstr "" -#: ../../CONTRIBUTING.md:138 +#: ../../CONTRIBUTING.md:130 msgid "" "Whenever you come across a place that could benefit from a code block, " "instead of writing it in-line with a code fence (`` ``` `` blocked text) " @@ -371,7 +350,7 @@ msgid "" "code-in-documentation)." msgstr "" -#: ../../CONTRIBUTING.md:142 +#: ../../CONTRIBUTING.md:134 msgid "" "If you want to add a new example that doesn't fit into any of the " "existing example files, you can create a new file and reference it in a " @@ -380,7 +359,7 @@ msgid "" "create a new folder in the `examples` directory." msgstr "" -#: ../../CONTRIBUTING.md:146 +#: ../../CONTRIBUTING.md:138 msgid "" "If an existing example is incomplete or a new example makes sense to be " "added to an existing file, go ahead and add it, but take care to not " @@ -389,14 +368,14 @@ msgid "" "file, new methods after all existing ones in a class." msgstr "" -#: ../../CONTRIBUTING.md:150 +#: ../../CONTRIBUTING.md:142 msgid "" "Example code is checked for correctness, so adding a new example may " "require adding additional tests for coverage, and will require fixing any" " failing tests." msgstr "" -#: ../../CONTRIBUTING.md:153 +#: ../../CONTRIBUTING.md:145 msgid "" "***⚠️ WARNING***: great care should be taken when modifying existing " "example code, especially any modification beyond appending to the end of " @@ -407,43 +386,29 @@ msgid "" "and then checking those pages in a new build." msgstr "" -#: ../../CONTRIBUTING.md:161 +#: ../../CONTRIBUTING.md:153 msgid "Example:" msgstr "" -#: ../../CONTRIBUTING.md:163 +#: ../../CONTRIBUTING.md:155 msgid "Instead of writing example code in markdown like this" msgstr "" -#: ../../CONTRIBUTING.md:174 +#: ../../CONTRIBUTING.md:166 msgid "The python can be extracted into a `.py` file" msgstr "" -#: ../../CONTRIBUTING.md:188 +#: ../../CONTRIBUTING.md:180 msgid "" "As another example, if you only need to show part of a `pyproject.toml`, " "we already have complete project definitions, you need only to find the " "relevant part." msgstr "" -#: ../../CONTRIBUTING.md:191 +#: ../../CONTRIBUTING.md:183 msgid "Instead of writing this" msgstr "" -#: ../../CONTRIBUTING.md:203 +#: ../../CONTRIBUTING.md:195 msgid "an example could be extracted from an existing toml file" msgstr "" - -#~ msgid "" -#~ "Independently of the approach you " -#~ "choose, the first step is to fork" -#~ " the Python Packaging Guide repository " -#~ "into your personal GitHub space." -#~ msgstr "" - -#~ msgid "" -#~ "*__TODO__: This section should show a" -#~ " beginner user how to fork a " -#~ "repository in GitHub.*" -#~ msgstr "" - diff --git a/locales/es/LC_MESSAGES/tutorials.po b/locales/es/LC_MESSAGES/tutorials.po index 137d86ab..3427e46d 100644 --- a/locales/es/LC_MESSAGES/tutorials.po +++ b/locales/es/LC_MESSAGES/tutorials.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: pyOpenSci Python Package Guide \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"POT-Creation-Date: 2024-06-28 08:42-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -913,231 +913,116 @@ msgstr "" msgid "Discourages misuse of your package and associated code" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:1 -msgid "Get to Know Hatch" +#: ../../tutorials/get-to-know-hatch.md:1 ../../tutorials/intro.md:27 +#: ../../tutorials/setup-py-to-pyproject-toml.md:24 +msgid "Get to know Hatch" msgstr "" #: ../../tutorials/get-to-know-hatch.md:3 msgid "" -"Our Python packaging tutorials use the tool " -"[Hatch](https://hatch.pypa.io/latest/). While there are [many great " -"packaging tools](/package-structure-code/python-package-build-tools) out " -"there, we have selected Hatch because:" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:8 -msgid "" -"It is an end-to-end tool that supports most of the steps required to " -"create a quality Python package. Beginners will have fewer tools to learn" -" if they use Hatch." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:11 -msgid "" -"It supports different build back-ends if you ever need to compile code in" -" other languages." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:13 -msgid "" -"As a community, pyOpenSci has decided that Hatch is a user-friendly tool " -"that supports many different scientific Python use cases." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:16 -msgid "" -"In this tutorial, you will install and get to know Hatch a bit more " -"before starting to use it." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:19 -msgid "You need two things to successfully complete this tutorial:" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:21 -msgid "You need Python installed." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:22 -msgid "You need Hatch installed." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:25 -msgid "" -"If you don't already have Python installed on your computer, Hatch will " -"do it for you when you install Hatch." +"Our Python packaging tutorials use the tool Hatch. In this tutorial, you " +"will install and get to know Hatch a bit more before starting to use it." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:29 +#: ../../tutorials/get-to-know-hatch.md:6 msgid "Install Hatch" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:31 -msgid "" -"To begin, follow the operating-system-specific instructions below to " -"install Hatch." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md -msgid "MAC" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:38 -msgid "" -"Follow the instructions " -"[here](https://hatch.pypa.io/latest/install/#installers)." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:40 -msgid "" -"Download the latest GUI installer for MAC [hatch-" -"universal.pkg](https://github.com/pypa/hatch/releases/latest/download" -"/hatch-universal.pkg)." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:41 -msgid "Run the installer and follow the setup instructions." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:42 -msgid "If your terminal is open, then restart it." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md -msgid "Windows" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:48 -msgid "" -"In your browser, download the correct `.msi` file for your system: " -"[hatch-x64.msi](https://github.com/pypa/hatch/releases/latest/download/hatch-x64.msi)" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:50 -msgid "Run your downloaded installer file and follow the on-screen instructions." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md -msgid "Linux" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:56 -msgid "" -"We suggest that you install Hatch using pipx on Linux. however, if you " -"prefer another method, check out the [Hatch installation " -"documentation](https://hatch.pypa.io/latest/install/) for other methods." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:70 +#: ../../tutorials/get-to-know-hatch.md:7 msgid "" -"Hatch can also be installed directly using " -"[pip](https://hatch.pypa.io/latest/install/#pip) or " -"[conda](https://hatch.pypa.io/latest/install/#conda). We encourage you to" -" follow the instructions above because we have found that the Hatch " -"installers for Windows and Mac are the easiest and most efficient." +"To begin, install Hatch from the command line using " +"[pipx](https://pipx.pypa.io/stable/)" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:74 +#: ../../tutorials/get-to-know-hatch.md:14 msgid "" -"Our Linux users have found success installing Hatch with pipx if they " -"already use apt install." +"Hatch can also be installed directly using `pip` or `conda`, but we " +"encourage you to use `pipx`. This is because `pipx` will ensure that your" +" package is available across all of your Python environments on your " +"computer rather than just in the environment that you install it into. If" +" you install hatch this way you will have to take care that the " +"environment it is installed into is activated for the command to work." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:77 -msgid "" -"Both approaches (using a graphical installer on Windows/Mac and pipx) " -"ensure that you have Hatch installed globally. A global install means " -"that Hatch is available across all of your Python environments on your " -"computer." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:82 -msgid "Check that hatch installed correctly" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:84 +#: ../../tutorials/get-to-know-hatch.md:21 msgid "" -"Once you have completed the installation instructions above, you can open" -" your terminal, and make sure that Hatch installed correctly using the " -"command below:" +"You can check that hatch is working properly by issuing a simple command " +"to get the version" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:92 -msgid "" -"*Note the version number output of `hatch --version` will likely be " -"different from the output above in this tutorial.*" +#: ../../tutorials/get-to-know-hatch.md:28 +msgid "Note the version numbers will likely be different" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:95 -msgid "Configure Hatch" +#: ../../tutorials/get-to-know-hatch.md:30 +msgid "Configure hatch" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:97 +#: ../../tutorials/get-to-know-hatch.md:32 msgid "" -"Once you have installed Hatch, you can customize its configuration. This " -"includes setting the default name and setup for every package you create." -" While this step is not required, we suggest that you do it." +"Once you have installed Hatch, you will want to customize the " +"configuration." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:101 +#: ../../tutorials/get-to-know-hatch.md:34 msgid "" -"Hatch stores your configuration in a [`config.toml` " +"Hatch stores your configuration information in a [`config.toml` " "file](https://hatch.pypa.io/latest/config/project-templates/)." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:103 +#: ../../tutorials/get-to-know-hatch.md:36 msgid "" "While you can update the `config.toml` file through the command line, it " -"might be easier to look at and update it in a text editor if you are " +"might be easier to look at it and update it in a text editor if you are " "using it for the first time." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:107 -msgid "Step 1: Open and Edit Your `config.toml` File" +#: ../../tutorials/get-to-know-hatch.md:39 +msgid "Step 1: Open and edit your `config.toml` file" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:109 +#: ../../tutorials/get-to-know-hatch.md:41 msgid "" "To open the config file in your file browser, run the following command " "in your shell:" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:112 +#: ../../tutorials/get-to-know-hatch.md:43 msgid "`hatch config explore`" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:114 +#: ../../tutorials/get-to-know-hatch.md:45 msgid "" -"This will open up a directory window that allows you to double-click on " -"the file and open it in your favorite text editor." +"This will open up a directory window that will allow you to double click " +"on the file and open it in your favorite text editor." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:117 +#: ../../tutorials/get-to-know-hatch.md:47 msgid "" "You can also retrieve the location of the Hatch config file by running " "the following command in your shell:" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:125 +#: ../../tutorials/get-to-know-hatch.md:54 msgid "Step 2 - update your email and name" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:127 +#: ../../tutorials/get-to-know-hatch.md:56 msgid "" "Once the file is open, update the [template] table of the `config.toml` " "file with your name and email. This information will be used in any " "`pyproject.toml` metadata files that you create using Hatch." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:137 +#: ../../tutorials/get-to-know-hatch.md:64 msgid "Step 3" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:139 +#: ../../tutorials/get-to-know-hatch.md:66 msgid "Next, set tests to false in the `[template.plugins.default]` table." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:141 +#: ../../tutorials/get-to-know-hatch.md:68 msgid "" "While tests are important, setting the tests configuration in Hatch to " "`true` will create a more complex `pyproject.toml` file. You won't need " @@ -1145,11 +1030,11 @@ msgid "" " introduce it in later tutorials." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:146 +#: ../../tutorials/get-to-know-hatch.md:73 msgid "Your `config.toml` file should look something like the one below." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:184 +#: ../../tutorials/get-to-know-hatch.md:111 msgid "" "Also notice that the default license option is MIT. While we will discuss" " license in more detail in a later lesson, the MIT license is the " @@ -1158,11 +1043,11 @@ msgid "" "use it for this tutorial series." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:190 +#: ../../tutorials/get-to-know-hatch.md:116 msgid "You are of course welcome to select another license." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:192 +#: ../../tutorials/get-to-know-hatch.md:118 #: ../../tutorials/installable-code.md:22 #: ../../tutorials/installable-code.md:411 #: ../../tutorials/installable-code.md:502 ../../tutorials/intro.md:226 @@ -1171,84 +1056,84 @@ msgstr "" msgid "Todo" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:193 +#: ../../tutorials/get-to-know-hatch.md:119 msgid "" "I think we'd need the SPDX license options here if they want to chose " "bsd-3 for instance" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:196 +#: ../../tutorials/get-to-know-hatch.md:122 msgid "Step 4: Close the config file and run `hatch config show`" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:198 +#: ../../tutorials/get-to-know-hatch.md:124 msgid "" "Once you have completed the steps above run the following command in your" " shell." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:200 +#: ../../tutorials/get-to-know-hatch.md:126 msgid "`hatch config show`" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:202 +#: ../../tutorials/get-to-know-hatch.md:128 msgid "" "`hatch config show` will print out the contents of your `config.toml` " "file in your shell. look at the values and ensure that your name, email " "is set. Also make sure that `tests=false`." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:206 +#: ../../tutorials/get-to-know-hatch.md:130 msgid "Hatch features" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:208 +#: ../../tutorials/get-to-know-hatch.md:132 msgid "" "Hatch offers a suite of features that will make creating, publishing and " "maintaining your Python package easier." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:211 +#: ../../tutorials/get-to-know-hatch.md:135 msgid "Comparison to other tools" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:213 +#: ../../tutorials/get-to-know-hatch.md:137 msgid "" "[We compared Hatch to several of the other popular packaging tools in the" " ecosystem including flit, pdm and poetry. Learn more here](package-" "features)" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:216 +#: ../../tutorials/get-to-know-hatch.md:140 msgid "[More on Hatch here](hatch)" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:218 +#: ../../tutorials/get-to-know-hatch.md:142 msgid "A few features that Hatch offers" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:220 +#: ../../tutorials/get-to-know-hatch.md:145 msgid "" "it will convert metadata stored in a `setup.py` or `setup.cfg` file to a " "pyproject.toml file for you (see [Migrating setup.py to pyproject.toml " "using Hatch](setup-py-to-pyproject-toml.md ))" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:222 +#: ../../tutorials/get-to-know-hatch.md:147 msgid "" "It will help you by storing configuration information for publishing to " "PyPI after you've entered it once." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:224 +#: ../../tutorials/get-to-know-hatch.md:149 msgid "Use `hatch -h` to see all of the available commands." msgstr "" -#: ../../tutorials/get-to-know-hatch.md:226 +#: ../../tutorials/get-to-know-hatch.md:152 msgid "What's next" msgstr "" -#: ../../tutorials/get-to-know-hatch.md:228 +#: ../../tutorials/get-to-know-hatch.md:154 msgid "" "In the next lesson you'll learn how to package and make your code " "installable using Hatch." @@ -2153,10 +2038,6 @@ msgstr "" msgid "[epydoc](https://epydoc.sourceforge.net/epytext.html)" msgstr "" -#: ../../tutorials/intro.md:27 ../../tutorials/setup-py-to-pyproject-toml.md:24 -msgid "Get to know Hatch" -msgstr "" - #: ../../tutorials/intro.md:27 msgid "Python Packaging Tutorial Setup" msgstr "" @@ -5534,77 +5415,3 @@ msgid "" "existing functionality remains intact. Run any pre-existing tests to " "verify that everything still works as expected." msgstr "" - -#~ msgid "" -#~ "Our Python packaging tutorials use the" -#~ " tool Hatch. In this tutorial, you" -#~ " will install and get to know " -#~ "Hatch a bit more before starting " -#~ "to use it." -#~ msgstr "" - -#~ msgid "" -#~ "To begin, install Hatch from the " -#~ "command line using " -#~ "[pipx](https://pipx.pypa.io/stable/)" -#~ msgstr "" - -#~ msgid "" -#~ "Hatch can also be installed directly " -#~ "using `pip` or `conda`, but we " -#~ "encourage you to use `pipx`. This " -#~ "is because `pipx` will ensure that " -#~ "your package is available across all " -#~ "of your Python environments on your " -#~ "computer rather than just in the " -#~ "environment that you install it into." -#~ " If you install hatch this way " -#~ "you will have to take care that" -#~ " the environment it is installed into" -#~ " is activated for the command to " -#~ "work." -#~ msgstr "" - -#~ msgid "" -#~ "You can check that hatch is " -#~ "working properly by issuing a simple " -#~ "command to get the version" -#~ msgstr "" - -#~ msgid "Note the version numbers will likely be different" -#~ msgstr "" - -#~ msgid "Configure hatch" -#~ msgstr "" - -#~ msgid "" -#~ "Once you have installed Hatch, you " -#~ "will want to customize the " -#~ "configuration." -#~ msgstr "" - -#~ msgid "" -#~ "Hatch stores your configuration information" -#~ " in a [`config.toml` " -#~ "file](https://hatch.pypa.io/latest/config/project-templates/)." -#~ msgstr "" - -#~ msgid "" -#~ "While you can update the `config.toml`" -#~ " file through the command line, it" -#~ " might be easier to look at it" -#~ " and update it in a text editor" -#~ " if you are using it for the" -#~ " first time." -#~ msgstr "" - -#~ msgid "Step 1: Open and edit your `config.toml` file" -#~ msgstr "" - -#~ msgid "" -#~ "This will open up a directory " -#~ "window that will allow you to " -#~ "double click on the file and open" -#~ " it in your favorite text editor." -#~ msgstr "" - From dbc8206da81f758e5b089d4781554c6efe881822 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 09:13:22 +0000 Subject: [PATCH 48/65] =?UTF-8?q?'[pre-commit.ci=20=F0=9F=A4=96]=20Apply?= =?UTF-8?q?=20code=20format=20tools=20to=20PR'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja/LC_MESSAGES/CONTRIBUTING.po | 1 - locales/ja/LC_MESSAGES/TRANSLATING.po | 1 - locales/ja/LC_MESSAGES/documentation.po | 1 - locales/ja/LC_MESSAGES/index.po | 1 - locales/ja/LC_MESSAGES/package-structure-code.po | 1 - locales/ja/LC_MESSAGES/tests.po | 1 - locales/ja/LC_MESSAGES/tutorials.po | 1 - 7 files changed, 7 deletions(-) diff --git a/locales/ja/LC_MESSAGES/CONTRIBUTING.po b/locales/ja/LC_MESSAGES/CONTRIBUTING.po index 3c3eee6f..16c831c9 100644 --- a/locales/ja/LC_MESSAGES/CONTRIBUTING.po +++ b/locales/ja/LC_MESSAGES/CONTRIBUTING.po @@ -433,4 +433,3 @@ msgstr "" #: ../../CONTRIBUTING.md:203 msgid "an example could be extracted from an existing toml file" msgstr "" - diff --git a/locales/ja/LC_MESSAGES/TRANSLATING.po b/locales/ja/LC_MESSAGES/TRANSLATING.po index 707de067..13765fc7 100644 --- a/locales/ja/LC_MESSAGES/TRANSLATING.po +++ b/locales/ja/LC_MESSAGES/TRANSLATING.po @@ -715,4 +715,3 @@ msgid "" " as a way for contributors to ask for help with translations or the " "translation workflow?" msgstr "" - diff --git a/locales/ja/LC_MESSAGES/documentation.po b/locales/ja/LC_MESSAGES/documentation.po index 8a849f4a..ea6bdd72 100644 --- a/locales/ja/LC_MESSAGES/documentation.po +++ b/locales/ja/LC_MESSAGES/documentation.po @@ -2543,4 +2543,3 @@ msgstr "" #: ../../documentation/write-user-documentation/intro.md:15 msgid "sphinx gallery for tutorials." msgstr "" - diff --git a/locales/ja/LC_MESSAGES/index.po b/locales/ja/LC_MESSAGES/index.po index 6d662248..379d9450 100644 --- a/locales/ja/LC_MESSAGES/index.po +++ b/locales/ja/LC_MESSAGES/index.po @@ -481,4 +481,3 @@ msgid "" " in the Python packaging ecosystem. We will be adding new content over " "the next year." msgstr "" - diff --git a/locales/ja/LC_MESSAGES/package-structure-code.po b/locales/ja/LC_MESSAGES/package-structure-code.po index e409630c..f02e7e1e 100644 --- a/locales/ja/LC_MESSAGES/package-structure-code.po +++ b/locales/ja/LC_MESSAGES/package-structure-code.po @@ -5299,4 +5299,3 @@ msgid "" "The version number is manually updated in a configuration file such as " "`pyproject.toml` vs. in a package **\\_version.py** file." msgstr "" - diff --git a/locales/ja/LC_MESSAGES/tests.po b/locales/ja/LC_MESSAGES/tests.po index 540e03ab..1b5994c6 100644 --- a/locales/ja/LC_MESSAGES/tests.po +++ b/locales/ja/LC_MESSAGES/tests.po @@ -1000,4 +1000,3 @@ msgid "" "the user can easily understand why if failed (provides a useful error " "message)." msgstr "" - diff --git a/locales/ja/LC_MESSAGES/tutorials.po b/locales/ja/LC_MESSAGES/tutorials.po index 6f88c534..7eb0df48 100644 --- a/locales/ja/LC_MESSAGES/tutorials.po +++ b/locales/ja/LC_MESSAGES/tutorials.po @@ -5534,4 +5534,3 @@ msgid "" "existing functionality remains intact. Run any pre-existing tests to " "verify that everything still works as expected." msgstr "" - From 257d20520726b03e3dbfbb7a28b0f70680b88848 Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 18:23:48 +0900 Subject: [PATCH 49/65] Revert "Create empty translation files for Japanese" This reverts commit bcdb31abc17957425c486688a198c50df1d3fa04. --- locales/ja/LC_MESSAGES/CONTRIBUTING.po | 436 -- locales/ja/LC_MESSAGES/TRANSLATING.po | 718 --- locales/ja/LC_MESSAGES/documentation.po | 2546 -------- locales/ja/LC_MESSAGES/index.po | 484 -- .../ja/LC_MESSAGES/package-structure-code.po | 5302 ---------------- locales/ja/LC_MESSAGES/tests.po | 1003 --- locales/ja/LC_MESSAGES/tutorials.po | 5537 ----------------- noxfile.py | 2 +- 8 files changed, 1 insertion(+), 16027 deletions(-) delete mode 100644 locales/ja/LC_MESSAGES/CONTRIBUTING.po delete mode 100644 locales/ja/LC_MESSAGES/TRANSLATING.po delete mode 100644 locales/ja/LC_MESSAGES/documentation.po delete mode 100644 locales/ja/LC_MESSAGES/index.po delete mode 100644 locales/ja/LC_MESSAGES/package-structure-code.po delete mode 100644 locales/ja/LC_MESSAGES/tests.po delete mode 100644 locales/ja/LC_MESSAGES/tutorials.po diff --git a/locales/ja/LC_MESSAGES/CONTRIBUTING.po b/locales/ja/LC_MESSAGES/CONTRIBUTING.po deleted file mode 100644 index 3c3eee6f..00000000 --- a/locales/ja/LC_MESSAGES/CONTRIBUTING.po +++ /dev/null @@ -1,436 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2024, pyOpenSci -# This file is distributed under the same license as the pyOpenSci Python -# Package Guide package. -# FIRST AUTHOR , 2024. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: ja\n" -"Language-Team: ja \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" - -#: ../../CONTRIBUTING.md:4 -msgid "Contributing to the Python Packaging Guide" -msgstr "" - -#: ../../CONTRIBUTING.md:6 -msgid "The guide is a community resource." -msgstr "" - -#: ../../CONTRIBUTING.md:8 -msgid "TL;DR" -msgstr "" - -#: ../../CONTRIBUTING.md:10 -msgid "We welcome contributions in the form of issues and pull requests:" -msgstr "" - -#: ../../CONTRIBUTING.md:12 -msgid "" -"If you have an idea for something that should be included in the guide, " -"[please open an issue here](https://github.com/pyOpenSci/python-package-" -"guide/issues)." -msgstr "" - -#: ../../CONTRIBUTING.md:13 -msgid "" -"If you find a typo, feel free to [submit a pull " -"request](https://github.com/pyOpenSci/python-package-guide/pulls) to " -"modify the text directly. Or, if you are less comfortable with pull " -"requests, feel free to open an issue." -msgstr "" - -#: ../../CONTRIBUTING.md:14 -msgid "" -"If you are interested in helping translate the guide into other " -"languages, take a look at the [translation guide](./TRANSLATING.md)." -msgstr "" - -#: ../../CONTRIBUTING.md:15 -msgid "" -"If you want to see a larger change to the content of the guide book, " -"please submit an issue first!" -msgstr "" - -#: ../../CONTRIBUTING.md:17 -msgid "" -"If you are unsure about how to contribute or are not familiar with git " -"and github, this guide will help you through the process." -msgstr "" - -#: ../../CONTRIBUTING.md:19 -msgid "How the Python Packaging Guide is structured" -msgstr "" - -#: ../../CONTRIBUTING.md:21 -msgid "" -"The Python Packaging Guide is written in myST (a variant of MarkDown and " -"rST) and we use **Sphinx**, a documentation engine built in `Python` to " -"build the HTML version you see online." -msgstr "" - -#: ../../CONTRIBUTING.md:23 -msgid "We use a tool called Nox to manage the process of building the guide." -msgstr "" - -#: ../../CONTRIBUTING.md:25 -msgid "Two approaches to contributing" -msgstr "" - -#: ../../CONTRIBUTING.md:27 -msgid "You can contribute to the guide using two approaches." -msgstr "" - -#: ../../CONTRIBUTING.md:29 -msgid "" -"The first approach is using a local copy of the guide in your computer. " -"This option requires a more involved setup, but allows you to build the " -"guide locally to verify your contribution did not introduce any bugs " -"before submitting a pull request. It is the recommended approach for " -"larger contribution, like writing a whole new section." -msgstr "" - -#: ../../CONTRIBUTING.md:31 -msgid "" -"The second approach is making your contribution directly in the GitHub " -"website. This option does not require any setup on your computer and " -"while your contribution will still be tested when you submit a PR " -"(continuous integration), it will take longer for you to get any feedback" -" in case of issue. It is the best way to make small contribution, like " -"fixing typos, or if this is your first contribution to open source and " -"the first approach feels too intimidating." -msgstr "" - -#: ../../CONTRIBUTING.md:33 -msgid "Forking the repository" -msgstr "" - -#: ../../CONTRIBUTING.md:35 -msgid "" -"Independently of the approach you choose, the first step is to fork the " -"Python Packaging Guide repository into your personal GitHub space. To " -"\"fork\" a repository in GitHub means to create a copy of the main " -"repository, or repo, that you have complete control over and can modify " -"as you see fit." -msgstr "" - -#: ../../CONTRIBUTING.md:37 -msgid "To fork a repo," -msgstr "" - -#: ../../CONTRIBUTING.md:39 -msgid "Make sure you are logged into GitHub." -msgstr "" - -#: ../../CONTRIBUTING.md:41 -msgid "" -"Go to the repo you would like to fork, in this case the [Python Packaging" -" Guide](https://www.github.com/pyopensci/python-package-guide) repo." -msgstr "" - -#: ../../CONTRIBUTING.md:43 -msgid "" -"In the top right-hand corner of the page there is a 'Fork' button. Click " -"that button. You will be brought to a new page where you will 'Create a " -"new fork'. Feel free to keep all the default inputs and click 'Create " -"fork'. This will create a copy of the repo at " -"`https://github.com//python-package-guide`, where `` " -"is your GitHub username." -msgstr "" - -#: ../../CONTRIBUTING.md:47 -msgid "Contributing via the GitHub website" -msgstr "" - -#: ../../CONTRIBUTING.md:49 -msgid "How to edit a MarkDown file" -msgstr "" - -#: ../../CONTRIBUTING.md:51 -msgid "" -"*__TODO__: This section should show how to use the GitHub interface to " -"edit and previewing a Markdown file.*" -msgstr "" - -#: ../../CONTRIBUTING.md:53 -msgid "How to commit your changes" -msgstr "" - -#: ../../CONTRIBUTING.md:55 -msgid "" -"*__TODO__: This section should show how to commit changes via the GitHub " -"interface.*" -msgstr "" - -#: ../../CONTRIBUTING.md:57 -msgid "Contributing locally on your computer" -msgstr "" - -#: ../../CONTRIBUTING.md:59 -msgid "Clone your forked repository" -msgstr "" - -#: ../../CONTRIBUTING.md:61 -msgid "" -"*__TODO__: This section should show how to clone a repository from GitHub" -" into your computer.*" -msgstr "" - -#: ../../CONTRIBUTING.md:63 -msgid "Create a new branch" -msgstr "" - -#: ../../CONTRIBUTING.md:65 -msgid "*__TODO__: This section should show how to create a new branch.*" -msgstr "" - -#: ../../CONTRIBUTING.md:67 -msgid "Create a virtual environment" -msgstr "" - -#: ../../CONTRIBUTING.md:69 -msgid "" -"*__TODO__: This section should show how to create a virtual environment " -"using venv.*" -msgstr "" - -#: ../../CONTRIBUTING.md:71 -msgid "Install the development dependencies" -msgstr "" - -#: ../../CONTRIBUTING.md:73 -msgid "" -"*__TODO__: This section should show how to install the development " -"dependencies defined in pyproject.toml.*" -msgstr "" - -#: ../../CONTRIBUTING.md:75 -msgid "Commit your changes" -msgstr "" - -#: ../../CONTRIBUTING.md:77 -msgid "" -"*__TODO__: This section should describe how to commit from the command " -"line.*" -msgstr "" - -#: ../../CONTRIBUTING.md:79 -msgid "How to build the guide locally" -msgstr "" - -#: ../../CONTRIBUTING.md:81 -msgid "" -"*__TODO__: This section should describe the different sessions in nox " -"related to building the docs: docs, docs-test, docs-live. It should also " -"show how to see the guide built locally, by opening the right file in the" -" browser or using the live version from docs-live*" -msgstr "" - -#: ../../CONTRIBUTING.md:83 -msgid "Before you submit your pull request" -msgstr "" - -#: ../../CONTRIBUTING.md:85 -msgid "" -"*__TODO__: This section should describe what steps a user should follow " -"before submitting the pull request: build the docs, verify your changes " -"look correct, etc.*" -msgstr "" - -#: ../../CONTRIBUTING.md:87 -msgid "Submitting a pull request with your contribution" -msgstr "" - -#: ../../CONTRIBUTING.md:89 -msgid "How to make a pull request" -msgstr "" - -#: ../../CONTRIBUTING.md:91 -msgid "" -"*__TODO__: This section should describe how to make a pull request in " -"GitHub.*" -msgstr "" - -#: ../../CONTRIBUTING.md:93 -msgid "What happens when you submit a pull request (CI/CD)" -msgstr "" - -#: ../../CONTRIBUTING.md:95 -msgid "" -"*__TODO__: This section should describe how to see the results of the " -"CD/CI checks and how to get more information about errors*" -msgstr "" - -#: ../../CONTRIBUTING.md:97 -msgid "What to expect from the review process" -msgstr "" - -#: ../../CONTRIBUTING.md:99 -msgid "" -"*__TODO__: This section should describe how review happens in GitHub, how" -" see the comments, and how to submit changes (push a new branch)*" -msgstr "" - -#: ../../CONTRIBUTING.md:101 -msgid "Additional help" -msgstr "" - -#: ../../CONTRIBUTING.md:103 -msgid "How to get help" -msgstr "" - -#: ../../CONTRIBUTING.md:105 -msgid "" -"*__TODO__: This section should describe the options for finding more help" -" in case beginner contributors need more help (e.g., create an issue, " -"post in a forum, etc).*" -msgstr "" - -#: ../../CONTRIBUTING.md:107 -msgid "Additional resources" -msgstr "" - -#: ../../CONTRIBUTING.md:109 -msgid "" -"*__TODO__: It should also include links to beginner documentation, like " -"the GitHub docs.*" -msgstr "" - -#: ../../CONTRIBUTING.md:111 -msgid "Annex" -msgstr "" - -#: ../../CONTRIBUTING.md:113 -msgid "Code examples" -msgstr "" - -#: ../../CONTRIBUTING.md:115 -msgid "" -"This guide uses the [literalinclude Sphinx directive](https://www.sphinx-" -"doc.org/en/master/usage/restructuredtext/directives.html#directive-" -"literalinclude) whenever possible to keep code and prose separate. Code " -"for use in the documentation is kept in the `examples/` folder." -msgstr "" - -#: ../../CONTRIBUTING.md:119 -msgid "Referencing code in documentation" -msgstr "" - -#: ../../CONTRIBUTING.md:121 -msgid "" -"If an example is present elsewhere in the documentation that you want to " -"use, you can copy the `literalinclude` directive verbatim and the " -"examples will stay in sync." -msgstr "" - -#: ../../CONTRIBUTING.md:124 -msgid "" -"If you already see code in the examples folder that you can use for new " -"documentation, a new `literalinclude` can be made to extract it into the " -"site. Only a relative path to the code is required for a working " -"`literalinclude`, but you should in almost all cases also provide a " -"`:language:` and `:lines:`. The former makes code examples prettier, and " -"the later can protect your example from future modifications to the code." -msgstr "" - -#: ../../CONTRIBUTING.md:129 -msgid "" -"**Pro tip**: As an alternative to `:lines:` there are also the `:start-" -"after:`, `:start-at:`, `:end-before:`, and `:end-at:` options. And if the" -" example code is Python, `:pyobject:` can be an even more future-proof " -"way to keep the same documentation content even through code refactors." -msgstr "" - -#: ../../CONTRIBUTING.md:133 -msgid "" -"If you need example code that doesn't yet exist in `examples/` see " -"creating code for documentation](#creating-code-for-documentation)." -msgstr "" - -#: ../../CONTRIBUTING.md:136 -msgid "Creating code for documentation" -msgstr "" - -#: ../../CONTRIBUTING.md:138 -msgid "" -"Whenever you come across a place that could benefit from a code block, " -"instead of writing it in-line with a code fence (`` ``` `` blocked text) " -"you can write it as a file in its own format. Your example may even " -"already exist; [see referencing code in documentation ](#referencing-" -"code-in-documentation)." -msgstr "" - -#: ../../CONTRIBUTING.md:142 -msgid "" -"If you want to add a new example that doesn't fit into any of the " -"existing example files, you can create a new file and reference it in a " -"`literalinclude` block. If it makes sense for that file to live within " -"one of the existing example projects please add it there; otherwise " -"create a new folder in the `examples` directory." -msgstr "" - -#: ../../CONTRIBUTING.md:146 -msgid "" -"If an existing example is incomplete or a new example makes sense to be " -"added to an existing file, go ahead and add it, but take care to not " -"break the rest of the guide. Whenever possible, extend the example rather" -" that rewrite it. So for instance, add new functions to the end of the " -"file, new methods after all existing ones in a class." -msgstr "" - -#: ../../CONTRIBUTING.md:150 -msgid "" -"Example code is checked for correctness, so adding a new example may " -"require adding additional tests for coverage, and will require fixing any" -" failing tests." -msgstr "" - -#: ../../CONTRIBUTING.md:153 -msgid "" -"***⚠️ WARNING***: great care should be taken when modifying existing " -"example code, especially any modification beyond appending to the end of " -"the file. All code examples are (potentially) shared examples. This makes" -" for more consistent examples in the guide but can mean action-" -"at-a-distance when modifying the examples for one particular use case. If" -" you find yourself modifying existing examples try running this command " -"and then checking those pages in a new build." -msgstr "" - -#: ../../CONTRIBUTING.md:161 -msgid "Example:" -msgstr "" - -#: ../../CONTRIBUTING.md:163 -msgid "Instead of writing example code in markdown like this" -msgstr "" - -#: ../../CONTRIBUTING.md:174 -msgid "The python can be extracted into a `.py` file" -msgstr "" - -#: ../../CONTRIBUTING.md:188 -msgid "" -"As another example, if you only need to show part of a `pyproject.toml`, " -"we already have complete project definitions, you need only to find the " -"relevant part." -msgstr "" - -#: ../../CONTRIBUTING.md:191 -msgid "Instead of writing this" -msgstr "" - -#: ../../CONTRIBUTING.md:203 -msgid "an example could be extracted from an existing toml file" -msgstr "" - diff --git a/locales/ja/LC_MESSAGES/TRANSLATING.po b/locales/ja/LC_MESSAGES/TRANSLATING.po deleted file mode 100644 index 707de067..00000000 --- a/locales/ja/LC_MESSAGES/TRANSLATING.po +++ /dev/null @@ -1,718 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2024, pyOpenSci -# This file is distributed under the same license as the pyOpenSci Python -# Package Guide package. -# FIRST AUTHOR , 2024. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: ja\n" -"Language-Team: ja \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" - -#: ../../TRANSLATING.md:5 -msgid "Translation Guide for the Python Packaging Guide" -msgstr "" - -#: ../../TRANSLATING.md:7 -msgid "" -"This guide will help you get started contributing to the translation of " -"the Python Packaging Guide." -msgstr "" - -#: ../../TRANSLATING.md:9 -msgid "" -"The process of contributing to the translation of the guide is similar to" -" the process of contributing to the guide itself, except that instead of " -"working on the guide source files directly, you will be working on the " -"translation files." -msgstr "" - -#: ../../TRANSLATING.md:11 -msgid "Overview of the Translation Process" -msgstr "" - -#: ../../TRANSLATING.md:13 -msgid "" -"The process of adapting software to different languages is called " -"internationalization, or i18n for short. Internationalization makes sure " -"that translation can happen without having to modify the source code, or " -"in our case, the original English source files of the guide." -msgstr "" - -#: ../../TRANSLATING.md:15 -msgid "" -"Sphinx, the documentation engine we use to build the Python Package " -"Guide, has built-in support for internationalization, so the workflow is " -"very straightforward." -msgstr "" - -#: ../../TRANSLATING.md:17 -msgid "" -"The process of actually translating the guide into different languages is" -" called localization, or l10n for short. This is the step you will be " -"helping with your contribution." -msgstr "" - -#: ../../TRANSLATING.md:19 -msgid "Here is a quick overview of how the translation process works:" -msgstr "" - -#: ../../TRANSLATING.md:21 -msgid "" -"The guide is originally written in English and stored in a set of " -"MarkDown files." -msgstr "" - -#: ../../TRANSLATING.md:22 -msgid "" -"The source files are processed by Sphinx to generate a set of translation" -" files stored in a folder for each target language." -msgstr "" - -#: ../../TRANSLATING.md:23 -msgid "" -"Contributors (like you!) translate these files into the different " -"languages." -msgstr "" - -#: ../../TRANSLATING.md:24 -msgid "" -"When the guide is built, Sphinx creates a version of the guide in the " -"original language (English) and the translated versions for the languages" -" defined in the configuration." -msgstr "" - -#: ../../TRANSLATING.md:27 -msgid "" -"You don't need to understand the technical details to contribute, but if " -"you are interested in learning how Sphinx handles internationalization " -"and localization, you can find more information [here](https://www" -".sphinx-doc.org/en/master/usage/advanced/intl.html)." -msgstr "" - -#: ../../TRANSLATING.md:30 -msgid "Setting up Your Local Environment" -msgstr "" - -#: ../../TRANSLATING.md:32 -msgid "Before you start, you will need to set up your local work environment." -msgstr "" - -#: ../../TRANSLATING.md:34 -msgid "" -"First, fork the guide repository into your personal GitHub account and " -"clone the forked repository to your local computer." -msgstr "" - -#: ../../TRANSLATING.md:36 -msgid "" -"To create a virtual environment and install the development dependencies " -"for the guide, run the following commands:" -msgstr "" - -#: ../../TRANSLATING.md:45 -msgid "" -"TODO: This section needs more work or to be replaced with a reference to " -"the CONTRIBUTING guide." -msgstr "" - -#: ../../TRANSLATING.md:47 -msgid "Starting a New Language Translation" -msgstr "" - -#: ../../TRANSLATING.md:49 -msgid "" -"If you plan to work on an existing translation, you can skip this step " -"and go directly to the next section." -msgstr "" - -#: ../../TRANSLATING.md:51 ../../TRANSLATING.md:217 -msgid "Important" -msgstr "" - -#: ../../TRANSLATING.md:52 -msgid "" -"If you would like to start the translation of the guide into a new " -"language, start by [creating an issue](https://github.com/pyOpenSci" -"/python-package-guide/issues) in the repository." -msgstr "" - -#: ../../TRANSLATING.md:55 -msgid "" -"To generate the translation files for a new language, add the language to" -" the `LANGUAGES` list in the `noxfile.py` configuration file. " -"[Nox](https://nox.thea.codes/en/stable/index.html) is the tool we use to " -"manage the building of the guide and its translations." -msgstr "" - -#: ../../TRANSLATING.md:57 -msgid "" -"Inside `noxfile.py`, find the `LANGUAGES` list and add the corresponding " -"two-letter code. For example, if you want to start the translation of the" -" guide into French, you would add `'fr'`:" -msgstr "" - -#: ../../TRANSLATING.md:68 -msgid "" -"You can find a list of the two-letter ISO language codes " -"[here](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes)." -msgstr "" - -#: ../../TRANSLATING.md:71 -msgid "Preparing the Translation Files" -msgstr "" - -#: ../../TRANSLATING.md:73 -msgid "" -"The translation files contain the original English text and a space for " -"you to enter the translated text. Before starting to translate, you need " -"to make sure the translation files are up to date with the latest changes" -" to the guide." -msgstr "" - -#: ../../TRANSLATING.md:75 -msgid "You can do this by running the following command:" -msgstr "" - -#: ../../TRANSLATING.md:81 -msgid "" -"This command will create the translation files if they don't exist yet, " -"or update them with the latest changes if they already exist." -msgstr "" - -#: ../../TRANSLATING.md:83 -msgid "" -"The translation files are text files with the `.po` extension stored in " -"the `./locales`, in folders corresponding to each language. For example, " -"the translation files for Spanish are stored in the " -"`locale/es/LC_MESSAGES` directory." -msgstr "" - -#: ../../TRANSLATING.md:85 -msgid "" -"Because the translation files map the original English text to translated" -" text, they are sometimes referred to as \"catalog\" files or \"portable " -"object\" files." -msgstr "" - -#: ../../TRANSLATING.md:88 -msgid "" -"You don't need to know all the details about the PO format in order to " -"translate. If you are interested in learning more, you can find " -"additional details in the [GNU gettext " -"documentation](https://www.gnu.org/software/gettext/manual/html_node/PO-" -"Files.html)." -msgstr "" - -#: ../../TRANSLATING.md:91 -msgid "Working on a Translation" -msgstr "" - -#: ../../TRANSLATING.md:93 -msgid "" -"In order to start translating, go to the folder inside `./locales` " -"corresponding to the target language you want to translate to (for " -"example, `./locale/es/LC_MESSAGES/` for the Spanish translation)." -msgstr "" - -#: ../../TRANSLATING.md:95 -msgid "" -"In this folder you will find a set of `.po` files, corresponding to the " -"different sections of the guide:" -msgstr "" - -#: ../../TRANSLATING.md:111 -msgid "" -"You may also see some `.mo` files in the same folder. These are compiled " -"versions of the `.po` files create by Sphinx during the build process, " -"and used to generate the translated version of the guide. They are " -"intermediary files and are not meant to be edited directly or stored in " -"the repository." -msgstr "" - -#: ../../TRANSLATING.md:114 -msgid "" -"If you are working on a new translation, choose one of the `.po` files to" -" start with. If you are working on an existing translation, you can start" -" with the `.po` files that need the most work." -msgstr "" - -#: ../../TRANSLATING.md:116 -msgid "" -"To see how much of each file has been translated, use the `sphinx-intl " -"stat`. You will be able to see the number of translated, fuzzy, and " -"untranslated strings in each `.po` file." -msgstr "" - -#: ../../TRANSLATING.md:118 -msgid "" -"For example, to see the statistics for the Spanish translation, you would" -" run:" -msgstr "" - -#: ../../TRANSLATING.md:132 -msgid "What do these categories mean:" -msgstr "" - -#: ../../TRANSLATING.md:134 -msgid "" -"Translated strings are strings that have been translated into the target " -"language." -msgstr "" - -#: ../../TRANSLATING.md:135 -msgid "" -"Fuzzy strings are strings that have been translated but need to be " -"reviewed because the original English string in the guide changed." -msgstr "" - -#: ../../TRANSLATING.md:136 -msgid "Untranslated strings are strings that have not been translated yet." -msgstr "" - -#: ../../TRANSLATING.md:139 -msgid "" -"When Sphinx is building the guide in another language, it will look into " -"the corresponding folder in `./locales/` for translated strings. If the " -"translation is available, Sphinx will replace the English text with the " -"equivalent text in the target language. If the translation is not " -"available, Sphinx will use the original English strings." -msgstr "" - -#: ../../TRANSLATING.md:142 -msgid "Editing the Translation Files" -msgstr "" - -#: ../../TRANSLATING.md:144 -msgid "" -"You can use any text editor to edit the `.po` file. But if you prefer, " -"there are also tools like [Poedit](https://poedit.net/) that provide a " -"graphic use interface." -msgstr "" - -#: ../../TRANSLATING.md:146 -msgid "" -"Depending on your editor of choice, you may be able to install a plugin " -"or extension that can provide syntax highlighting and other features for " -"working with `.po` files. Like for example, the " -"[gettext](https://marketplace.visualstudio.com/items?itemName=mrorz" -".language-gettext) extension for Visual Studio Code." -msgstr "" - -#: ../../TRANSLATING.md:148 -msgid "" -"When you open a `.po` file, you will see a series of entries that look " -"like this:" -msgstr "" - -#: ../../TRANSLATING.md:158 -msgid "" -"The first line of an entry starts with `#:` and is a reference to the " -"original source file and line number from which the text was extracted. " -"This information is useful for finding the context of the text in the " -"guide." -msgstr "" - -#: ../../TRANSLATING.md:160 -msgid "" -"The `msgid` field contains the original English text that needs to be " -"translated. The `msgstr` field is where you will enter the translated " -"text. This field might contain text if someone else already translated " -"the entry." -msgstr "" - -#: ../../TRANSLATING.md:170 -msgid "" -"Sometimes the original English text may be too long for a single line, " -"and it may be split into multiple lines. In this case, you can keep the " -"same structure in the translated text. Notice that both the `msgid` and " -"`msgstr` fields in the example below start with an empty string, " -"indicating that the text continues in the next line." -msgstr "" - -#: ../../TRANSLATING.md:186 -msgid "" -"The English text will sometimes contain Markdown formatting, such as bold" -" or italic text. You should keep the formatting in the translated text, " -"making sure to translate the text inside the formatting tags." -msgstr "" - -#: ../../TRANSLATING.md:188 -msgid "" -"The English text may also contain links to other sections of the guide or" -" external resources. You should keep the links in the translated text, " -"making sure to update the link text when appropriate." -msgstr "" - -#: ../../TRANSLATING.md:196 -msgid "" -"An entry may be marked as `fuzzy`, which means that the original English " -"text has changed since the translation was made, and the translation may " -"need to be revised. When this is the case you will see an additional line" -" in the entry, starting with `#,`:" -msgstr "" - -#: ../../TRANSLATING.md:213 -msgid "" -"You can review the translation and make any necessary changes, removing " -"the `fuzzy` tag once you are satisfied with the translation." -msgstr "" - -#: ../../TRANSLATING.md:215 -msgid "" -"You can also add comments to the translation file, by adding lines that " -"start with a `#` character to the entry. This can be helpful to add " -"context to the translation for other translators or reviewers to see, but" -" this might be only necessary in special circumstances." -msgstr "" - -#: ../../TRANSLATING.md:218 -msgid "" -"When working on a translation, you **should not** modify the original " -"English text in the `msgid` field. If you see a typo or an error in the " -"original text, please consider fixing it in the original source file (use" -" the first line of the entry to locate it) and submit a separate pull " -"request." -msgstr "" - -#: ../../TRANSLATING.md:221 -msgid "Building the Translated Documentation" -msgstr "" - -#: ../../TRANSLATING.md:223 -msgid "" -"Once you finished translating or when you want to check the translation " -"in context, you can build the guide locally on your computer, using the " -"following command:" -msgstr "" - -#: ../../TRANSLATING.md:229 -msgid "" -"This command will build all the translated versions of the guide defined " -"in the `LANGUAGES` list in `noxfile.py`. These translations will be " -"stored in the `_build/html`, in folders named after the language code " -"(e.g., `es`, `fr`, etc.)." -msgstr "" - -#: ../../TRANSLATING.md:231 -msgid "" -"To view the translated version of the guide in your browser, open the " -"corresponding `index.html` file. For example, to view the Spanish " -"translation, you would open `_build/html/es/index.html`." -msgstr "" - -#: ../../TRANSLATING.md:233 -msgid "" -"You can also build a live version of the guide that updates automatically" -" as you make changes to the translation files. To do this, use the `nox " -"-s docs-live-lang` command. Note that in this case you need to specify " -"which language you want to build. For example, if you are working on the " -"Spanish translation, you would run:" -msgstr "" - -#: ../../TRANSLATING.md:239 -msgid "" -"Note the `--` before the language code, it indicates that the following " -"arguments should be passed into the nox session and not be interpreted " -"directly by nox. If you forget the `--`, nox will look instead for a " -"session named 'es' and complain that it does not exist." -msgstr "" - -#: ../../TRANSLATING.md:241 -msgid "" -"This command will use `sphinx-autobuild` to launch a local web server " -"where you can access the translated version of the guide. You can open " -"the guide in your browser by navigating to `http://localhost:8000`." -msgstr "" - -#: ../../TRANSLATING.md:243 -msgid "" -"This is a great way to see how the translated version of the guide looks " -"as you make changes to the translation files." -msgstr "" - -#: ../../TRANSLATING.md:245 -msgid "Submitting a PR for Your Contribution" -msgstr "" - -#: ../../TRANSLATING.md:247 -msgid "" -"Once you are finished translating and before you submit a pull request " -"(PR) for your translation, you need to make sure that the translated " -"version of the guide builds without any errors or warning and looks " -"correctly in the browser." -msgstr "" - -#: ../../TRANSLATING.md:249 -msgid "You can follow these steps:" -msgstr "" - -#: ../../TRANSLATING.md:251 -msgid "" -"Build the translations of the guide with same parameters that will be " -"used during the release:" -msgstr "" - -#: ../../TRANSLATING.md:257 -msgid "" -"Make sure there are no warnings or errors in the output. If there are, " -"you will need to fix them before submitting the PR." -msgstr "" - -#: ../../TRANSLATING.md:258 -msgid "" -"Make sure the translated version of the guide looks good in the browser " -"by opening the `_build/html//index.html` file, where `` is " -"the language you have been working on." -msgstr "" - -#: ../../TRANSLATING.md:260 -msgid "If everything looks good, you can submit a PR with your changes." -msgstr "" - -#: ../../TRANSLATING.md:263 -msgid "" -"When you submit a PR for a translation, you should only include changes " -"to one language. If you worked in multiple languages, please submit a " -"separate PR for each language." -msgstr "" - -#: ../../TRANSLATING.md:266 -msgid "" -"Translations PRs will be tagged with a label indicating the language to " -"make them easier to identify and review. For example, contributions to " -"the Spanish translation will be tagged with 'lang-es'." -msgstr "" - -#: ../../TRANSLATING.md:268 -msgid "TODO: This tagging could be automated with a GitHub action." -msgstr "" - -#: ../../TRANSLATING.md:270 -msgid "" -"When you submit the PR, make sure to include a short description of the " -"changes you made and any context that might be helpful for the reviewer " -"(e.g., you translated new strings, you reviewed fuzzy entries, you fixed " -"typos, etc.)" -msgstr "" - -#: ../../TRANSLATING.md:272 -msgid "The Review Process" -msgstr "" - -#: ../../TRANSLATING.md:274 -msgid "" -"The review process for a translation contribution is similar to the " -"review process for any other contribution to the guide." -msgstr "" - -#: ../../TRANSLATING.md:276 -msgid "" -"TODO: This section needs more work, depending on the review workflow we " -"decide to adopt. Other projects usually assign a coordinator/editor for " -"each language, who is responsible for reviewing and merging translation " -"contributions." -msgstr "" - -#: ../../TRANSLATING.md:278 -msgid "" -"Each language has an assigned editor who is responsible for reviewing and" -" merging translation contributions. The editor will review the changes to" -" make sure they are accurate and consistent with the style and tone of " -"the guide." -msgstr "" - -#: ../../TRANSLATING.md:280 -msgid "" -"Sometimes the editor may ask for clarification or suggest changes to " -"improve the translation. If this happens, you can make the requested " -"changes and push them to the same branch where you submitted the original" -" PR." -msgstr "" - -#: ../../TRANSLATING.md:282 -msgid "" -"When the editor is satisfied with the translation, they will merge the " -"PR. The translated version of the guide will be available on the " -"pyOpenSci website once the language is released." -msgstr "" - -#: ../../TRANSLATING.md:284 -msgid "The Release Process" -msgstr "" - -#: ../../TRANSLATING.md:286 -msgid "" -"If a language is ready to go live, the maintainers will add the language " -"code to the `RELEASE_LANGUAGES` list in the `noxfile.py` configuration " -"file." -msgstr "" - -#: ../../TRANSLATING.md:288 -msgid "" -"When the guide is built for release in CI, Sphinx will also generate the " -"translated versions of the guide for the languages in the " -"`RELEASE_LANGUAGES` list." -msgstr "" - -#: ../../TRANSLATING.md:290 -msgid "" -"Translations are released in the same way as the English version of the " -"guide, and the translated versions will be available in folders named " -"after the language code. For example, the Spanish translation will be " -"available in [https://www.pyopensci.org/python-package-" -"guide/es/](https://www.pyopensci.org/python-package-guide/es/)." -msgstr "" - -#: ../../TRANSLATING.md:292 -msgid "Frequently Asked Questions (FAQ)" -msgstr "" - -#: ../../TRANSLATING.md:294 -msgid "How do I know which strings need to be translated?" -msgstr "" - -#: ../../TRANSLATING.md:296 -msgid "" -"When you run the `sphinx-intl stat` command, you will see a list of `.po`" -" files with the number of translated, fuzzy, and untranslated strings. " -"You can start by working on the files with the most untranslated strings." -msgstr "" - -#: ../../TRANSLATING.md:298 -msgid "What happens when a string has changed in the original English text?" -msgstr "" - -#: ../../TRANSLATING.md:300 -msgid "" -"If a string has changed in the original English version, it will be " -"marked as `fuzzy` in the translation file the next time it is updated " -"(`nox -s update-translations`). Contributors working on the translation " -"can then review the fuzzy entries and make the necessary changes to " -"ensure it is accurate, before removing the `fuzzy` tag." -msgstr "" - -#: ../../TRANSLATING.md:302 -msgid "How do I handle links in the translated text?" -msgstr "" - -#: ../../TRANSLATING.md:304 -msgid "" -"You should keep the links in the translated text, but make sure to update" -" the link text if necessary. For example, if the original English text " -"contains a link to `[What is a Python package?](/tutorials/intro)`, you " -"should keep the link in the translated text but update the link text to " -"`[¿Que es un paquete de Python?](/tutorials/intro)`." -msgstr "" - -#: ../../TRANSLATING.md:306 -msgid "How do I handle formatting in the translated text?" -msgstr "" - -#: ../../TRANSLATING.md:308 -msgid "" -"You should keep the formatting in the translated text, but make sure to " -"translate the text inside the formatting tags as well. For example, if " -"the original English text is `**Test special cases:**`, you should keep " -"the bold formatting in the translated text but update the text inside the" -" formatting tags to `**Prueba casos especiales:**`." -msgstr "" - -#: ../../TRANSLATING.md:310 -msgid "How do I handle strings that are too long for a single line?" -msgstr "" - -#: ../../TRANSLATING.md:312 -msgid "" -"If the original English text is too long for a single line, it may be " -"split into multiple lines. Multiline strings in the `.po` file are " -"indicated by an empty string in the `msgid` and `msgstr` fields, followed" -" by the continuation of the text in the next line. For example:" -msgstr "" - -#: ../../TRANSLATING.md:325 -msgid "How do I translate images?" -msgstr "" - -#: ../../TRANSLATING.md:327 -msgid "" -"You should not translate images in the guide. Producing translated " -"versions of images is a complex process that requires additional tools " -"and resources, and it is not typically done unless the translated images " -"are created alongside the original images. More often, the text around " -"the image is modified to include any necessary translations." -msgstr "" - -#: ../../TRANSLATING.md:329 -msgid "" -"In some special cases, an image might be critical to the understanding of" -" the content. In those cases, the translations will be handled by the " -"maintainers and editors outside this workflow." -msgstr "" - -#: ../../TRANSLATING.md:331 -msgid "" -"I am interested in translating the guide into a language that is not " -"listed. How can I get started?" -msgstr "" - -#: ../../TRANSLATING.md:333 -msgid "" -"If you want to start a new translation of the guide into a language that " -"is not listed, you should [create an issue](https://github.com/pyOpenSci" -"/python-package-guide/issues) in the repository to let the maintainers " -"know that you intend to work on it. This will help avoid duplication of " -"effort and ensure that the maintainers are ready to review your " -"contribution when you are done." -msgstr "" - -#: ../../TRANSLATING.md:335 -msgid "How do I know when a translation is ready to be released?" -msgstr "" - -#: ../../TRANSLATING.md:337 -msgid "" -"When a translation is ready to be included in the next release of the " -"guide, the maintainers will add the language code to the " -"`RELEASE_LANGUAGES` list in the `noxfile.py` configuration file. This " -"will trigger the build of the translation during the release process, and" -" the translated version of the guide will be available on the pyOpenSci " -"website." -msgstr "" - -#: ../../TRANSLATING.md:339 -msgid "" -"TODO: There are many approaches here, some projects release a translation" -" as soon as some strings are translated, others wait until a certain " -"percentage of the content is translated." -msgstr "" - -#: ../../TRANSLATING.md:341 -msgid "How can I get help with my translation?" -msgstr "" - -#: ../../TRANSLATING.md:343 -msgid "" -"If you have any questions or need help with your translation, you can " -"create an issue in the repository if you encounter any problems or need " -"assistance." -msgstr "" - -#: ../../TRANSLATING.md:345 -msgid "" -"TODO: Maybe [Discourse](https://pyopensci.discourse.group/) could be used" -" as a way for contributors to ask for help with translations or the " -"translation workflow?" -msgstr "" - diff --git a/locales/ja/LC_MESSAGES/documentation.po b/locales/ja/LC_MESSAGES/documentation.po deleted file mode 100644 index 8a849f4a..00000000 --- a/locales/ja/LC_MESSAGES/documentation.po +++ /dev/null @@ -1,2546 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2024, pyOpenSci -# This file is distributed under the same license as the pyOpenSci Python -# Package Guide package. -# FIRST AUTHOR , 2024. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: ja\n" -"Language-Team: ja \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" - -#: ../../documentation/hosting-tools/intro.md:1 -msgid "Tools to Build and Host your Documentation" -msgstr "" - -#: ../../documentation/hosting-tools/intro.md:3 -msgid "" -"The most common tool for building documentation in the Python ecosystem " -"currently is Sphinx. However, some maintainers are using tools like " -"[mkdocs](https://www.mkdocs.org/) for documentation. It is up to you to " -"use the platform that you prefer for your documentation!" -msgstr "" - -#: ../../documentation/hosting-tools/intro.md:8 -msgid "" -"In this section, we introduce Sphinx as a common tool to build " -"documentation. We talk about various syntax options that you can use when" -" writing Sphinx documentation including mySt and rST." -msgstr "" - -#: ../../documentation/hosting-tools/intro.md:12 -msgid "" -"We also talk about ways to publish your documentation online and Sphinx " -"tools that might help you optimize your documentation website." -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:1 -msgid "Documentation syntax: markdown vs. myST vs. rst syntax to create your docs" -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:3 -msgid "There are three commonly used syntaxes for creating Python documentation:" -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:4 -msgid "" -"[markdown](https://www.markdownguide.org/): Markdown is an easy-to-learn " -"text syntax. It is the default syntax used in Jupyter Notebooks. There " -"are tools that you can add to a Sphinx website that allow it to render " -"markdown as html. However, using markdown to write documentation has " -"limitations. For instance if you want to add references, colored call out" -" blocks and other custom elements to your documentation, you will need to" -" use either **myST** or **rST**." -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:8 -msgid "" -"[rST (ReStructured Text):](https://www.sphinx-" -"doc.org/en/master/usage/restructuredtext/basics.html). **rST** is the " -"native syntax that sphinx supports. rST was the default syntax used for " -"documentation for many years. However, in recent years myST has risen to " -"the top as a favorite for documentation given the flexibility that it " -"allows." -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:9 -msgid "" -"[myST:](https://myst-parser.readthedocs.io/en/latest/intro.html) myST is " -"a combination of vanilla of `markdown` and `rST` syntax. It is a nice " -"option if you are comfortable writing markdown. `myst` is preferred by " -"many because it offers both the rich functionality of rST combined with a" -" simple-to-write markdown syntax." -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:12 -msgid "" -"While you can chose to use any of the syntaxes listed above, we suggest " -"using `myST` because:" -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:15 -msgid "It is a simpler syntax and thus easier to learn;" -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:16 -msgid "" -"The above simplicity will make it easier for more people to contribute to" -" your documentation." -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:17 -msgid "" -"Most of your core Python package text files, such as your README.md file," -" are already in `.md` format" -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:18 -msgid "" -"`GitHub` and `Jupyter Notebooks` support markdown thus it's more widely " -"used in the scientific ecosystem." -msgstr "" - -#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:22 -msgid "" -"If you are on the fence about myST vs rst, you might find that **myST** " -"is easier for more people to contribute to." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:1 -msgid "How to publish your Python package documentation online" -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:3 -msgid "" -"We suggest that you setup a hosting service for your Python package " -"documentation. Two free and commonly used ways to quickly create a " -"documentation website hosting environment are below." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:7 -msgid "" -"You can host your documentation yourself using [GitHub " -"Pages](https://pages.github.com/) or another online hosting service." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:8 -msgid "" -"You can host your documentation using [Read the " -"Docs](https://readthedocs.org/)." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:10 -msgid "What is Read the Docs ?" -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:11 -msgid "" -"[Read the Docs](https://readthedocs.org/) is a documentation hosting " -"service that supports publishing your project's documentation." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:13 -msgid "" -"Read the Docs is a fully featured, free, documentation hosting service. " -"Some of its many features include:" -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:16 -msgid "" -"Is free to host your documentation (but there are also paid tiers if you " -"wish to customize hosting)" -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:17 -msgid "Automates building your documentation" -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:18 -msgid "" -"Allows you to turn on integration with pull requests where you can view " -"documentation build progress (success vs failure)." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:19 -msgid "" -"Supports versioning of your documentation which allows users to refer to " -"older tagged versions of the docs if they are using older versions of " -"your package." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:20 -msgid "Supports downloading of documentation in PDF and other formats." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:21 -msgid "" -"You can customize the documentation build using a **.readthedocs.yaml** " -"file in your GitHub repository." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:24 -msgid "What is GitHub Pages?" -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:25 -msgid "" -"[GitHub Pages](https://docs.github.com/en/pages/getting-started-with-" -"github-pages/about-github-pages) is a free web hosting service offered by" -" GitHub. Using GitHub pages, you can build your documentation locally or " -"using a Continuous Integration setup, and then push to a branch in your " -"GitHub repository that is setup to run the GitHub Pages web build." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:33 -msgid "Read the Docs vs GitHub Pages" -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:35 -msgid "" -"GitHub pages is a great option for your documentation deployment. " -"However, you will need to do a bit more work to build and deploy your " -"documentation if you use GitHub pages." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:39 -msgid "" -"Read the Docs can be setup in your Read the Docs user account. The " -"service automates the entire process of building and deploying your " -"documentation." -msgstr "" - -#: ../../documentation/hosting-tools/publish-documentation-online.md:42 -msgid "" -"If you don't want to maintain a documentation website for your Python " -"package, we suggest using the Read the Docs website." -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:1 -msgid "Using Sphinx to Build Python Package Documentation" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:17 -msgid "" -"On this page we discuss using [Sphinx](https://www.sphinx-doc.org/) to " -"build your user-facing package documentation. While Sphinx is currently " -"the most commonly-used tool in the scientific Python ecosystem, you are " -"welcome to explore other tools to build documentation such as " -"[mkdocs](https://www.mkdocs.org/) which is gaining popularity in the " -"Python packaging ecosystem." -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:25 -msgid "Examples of documentation websites that we love:" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:27 -msgid "[GeoPandas](https://geopandas.org/en/stable/)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:28 -msgid "" -"[View rst to create landing " -"page](https://raw.githubusercontent.com/geopandas/geopandas/main/doc/source/index.rst)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:29 -msgid "[verde](https://www.fatiando.org/verde/latest/)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:30 -msgid "" -"[View verde landing page code - rst " -"file.](https://github.com/fatiando/verde/blob/main/doc/index.rst)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:31 -msgid "" -"[Here is our documentation if you want to see a myST example of a landing" -" page.](https://github.com/pyOpenSci/python-package-" -"guide/blob/main/index.md)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:34 -msgid "Sphinx - a static site generator" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:36 -msgid "" -"Sphinx is a [static-site " -"generator](https://www.cloudflare.com/learning/performance/static-site-" -"generator/). A static site generator is a tool that creates html for a " -"website based upon a set of templates. The html files are then served " -"\"Statically\" which means that there is no generation or modification of" -" the files on the fly." -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:39 -msgid "Sphinx is written using Python." -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:41 -msgid "Sphinx sites can be customized using extensions and themes" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:43 -msgid "" -"The functionality of Sphinx can be extended using extensions and themes. " -"A few examples include:" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:46 -msgid "" -"You can apply documentation themes for quick generation of beautiful " -"documentation." -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:47 -msgid "" -"You can [automatically create documentation for your package's functions " -"and classes (the package's API) from docstrings in your code using the " -"autodoc extension](https://www.sphinx-" -"doc.org/en/master/usage/extensions/autodoc.html)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:48 -msgid "" -"You can [run and test code examples in your docstrings using the doctest " -"extension](https://www.sphinx-" -"doc.org/en/master/usage/extensions/doctest.html)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:49 -msgid "" -"While Sphinx natively supports the `rST` syntax. You can add custom " -"syntax parsers to support easier-to-write syntax using tools such as [the" -" MyST parser](https://myst-parser.readthedocs.io/)." -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:51 -msgid "Commonly used Sphinx themes" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:53 -msgid "" -"You are free to use whatever Sphinx theme that you prefer. However, the " -"most common Sphinx themes used in the Python scientific community " -"include:" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:57 -msgid "[pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:58 -msgid "[sphinx-book-theme](https://sphinx-book-theme.readthedocs.io/)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:59 -msgid "[furo](https://pradyunsg.me/furo/quickstart/)" -msgstr "" - -#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:63 -msgid "This book is created using Sphinx and the `furo` theme." -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:1 -msgid "Optimizing your documentation so search engines (and other users) find it" -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:3 -msgid "" -"If you are interested in more people finding your package, you may want " -"to add some core Sphinx extensions (and theme settings) that will help " -"search engines such as Google find your documentation." -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:7 -msgid "Google Analytics" -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:11 -msgid "" -"Google analytics [is not compliant with the European General Data " -"Protection Regulation (GDPR)](https://matomo.org/blog/2022/05/google-" -"analytics-4-gdpr/). While there are many components to this regulation, " -"one of the core elements is that you have to let users know on your site " -"that you are collecting data and they have to consent. While it is " -"possible to add infrastructure around Google Analytics to make it close " -"to following GDPR regulations, the community is slowly shifting away from" -" Google using open tools such as [Plausible](https://plausible.io/), " -"[Cloudflare Web Analytics](https://www.cloudflare.com/web-analytics/) and" -" [Matomo](https://matomo.org) for web analytics." -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:13 -msgid "" -"pyOpenSci is currently looking into free options for open source " -"developers." -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:16 -msgid "" -"Some of the [sphinx themes such as the `pydata-sphinx-theme` and sphinx-" -"book-theme have built in support for Google Analytics](https://pydata-" -"sphinx-theme.readthedocs.io/en/latest/user_guide/analytics.html#google-" -"analytics). However, if the theme that you chose does not offer Google " -"Analytics support, you can use the [`sphinxcontrib-gtagjs` " -"extension](https://github.com/attakei/sphinxcontrib-gtagjs). This " -"extension will add a Google Analytics site tag to each page of your " -"documentation." -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:22 -msgid "" -"[sphinx-sitemap](https://sphinx-" -"sitemap.readthedocs.io/en/latest/index.html) for search engine " -"optimization" -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:24 -msgid "" -"While we are trying to move away from Google Analytics do to compliance " -"and privacy issues, search engine optimization is still important. Google" -" is the most popular search engine. And if your documentation is search " -"optimized, users are more likely to find your package!" -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:30 -msgid "" -"If you are interested in optimizing your documentation for search engines" -" such as Google, you want a **sitemap.xml** file. You can submit this " -"sitemap to Google and it will index your entire site. This over time can " -"make the content on your site more visible to others when they search." -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:36 -msgid "This extension is lightweight." -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:38 -msgid "" -"It [requires that you to add it to your Sphinx `conf.py` extension list " -"and site your documentation base url](https://sphinx-" -"sitemap.readthedocs.io/en/latest/getting-started.html)." -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:40 -msgid "[sphinxext.opengraph](https://github.com/wpilibsuite/sphinxext-opengraph)" -msgstr "" - -#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:42 -msgid "" -"OpenGraph is an extension that allows you to add metadata to your " -"documentation content pages. [The OpenGraph protocol allows other " -"websites to provide a useful preview of the content on your page when " -"shared](https://www.freecodecamp.org/news/what-is-open-graph-and-how-" -"can-i-use-it-for-my-website/#what-is-open-graph). This is important for " -"when the pages in your documentation are shared on social media sites " -"like Twitter and Mastodon and even for shares on tools like Slack and " -"Discourse." -msgstr "" - -#: ../../documentation/index.md:3 -msgid "Documentation Overview" -msgstr "" - -#: ../../documentation/index.md:3 ../../documentation/index.md:10 -#: ../../documentation/index.md:21 ../../documentation/index.md:42 -msgid "Intro" -msgstr "" - -#: ../../documentation/index.md:10 -msgid "Create Your Docs" -msgstr "" - -#: ../../documentation/index.md:10 -msgid "Document Your Code (API)" -msgstr "" - -#: ../../documentation/index.md:10 -msgid "Create Package Tutorials" -msgstr "" - -#: ../../documentation/index.md:10 -msgid "Write User Documentation" -msgstr "" - -#: ../../documentation/index.md:21 -msgid "Contributing File" -msgstr "" - -#: ../../documentation/index.md:21 -msgid "Development Guide" -msgstr "" - -#: ../../documentation/index.md:21 -msgid "Changelog File" -msgstr "" - -#: ../../documentation/index.md:21 -msgid "Docs for Contributors & Maintainers" -msgstr "" - -#: ../../documentation/index.md:32 -msgid "README file" -msgstr "" - -#: ../../documentation/index.md:32 -msgid "Code of Conduct File" -msgstr "" - -#: ../../documentation/index.md:32 -msgid "LICENSE files" -msgstr "" - -#: ../../documentation/index.md:32 -msgid "Community Docs" -msgstr "" - -#: ../../documentation/index.md:42 -msgid "Sphinx for Docs" -msgstr "" - -#: ../../documentation/index.md:42 -msgid "myST vs Markdown vs rst" -msgstr "" - -#: ../../documentation/index.md:42 -msgid "Publish Your Docs" -msgstr "" - -#: ../../documentation/index.md:42 -msgid "Website Hosting and Optimization" -msgstr "" - -#: ../../documentation/index.md:42 -msgid "Publication tools for your docs" -msgstr "" - -#: ../../documentation/index.md:1 -msgid "Documentation for your Open Source Python Package" -msgstr "" - -#: ../../documentation/index.md:55 -msgid "" -"Please note that the tools discussed here are those that we see commonly " -"used in the community. As tools evolve we will update this guide. If you " -"are submitting a package for pyOpenSci peer review and use other tools " -"that are not listed in our guide to build your package you can still " -"submit for review! The tools listed here are suggestions, not " -"requirements. Our requirements are focused on the documentation content " -"of your package." -msgstr "" - -#: ../../documentation/index.md:65 -msgid "Documentation is critical for your Python package's success" -msgstr "" - -#: ../../documentation/index.md:67 -msgid "" -"Documentation is as important to the success of your Python open source " -"package as the code itself." -msgstr "" - -#: ../../documentation/index.md:70 -msgid "" -"Quality code is of course valuable as its how your package gets the tasks" -" done. However, if users don't understand how to use your package in " -"their workflows, then they won't use it." -msgstr "" - -#: ../../documentation/index.md:73 -msgid "" -"Further, explicitly documenting how to contribute is important if you " -"wish to build a base of contributors to your package." -msgstr "" - -#: ../../documentation/index.md:76 -msgid "Two types of Python package users" -msgstr "" - -#: ../../documentation/index.md:78 -msgid "" -"The documentation that you write for your package should target two types" -" of users:" -msgstr "" - -#: ../../documentation/index.md:81 -msgid "1. Basic Tool Users" -msgstr "" - -#: ../../documentation/index.md:83 -msgid "" -"Basic tool users are the people who will use your package code in their " -"Python workflows. They might be new(er) to Python and/or data science. Or" -" expert programmers. But they might not have a background in software " -"development. These users need to know:" -msgstr "" - -#: ../../documentation/index.md:88 -msgid "How to install your package" -msgstr "" - -#: ../../documentation/index.md:89 -msgid "How to install dependencies that your package requires" -msgstr "" - -#: ../../documentation/index.md:90 -msgid "How to get started using the code base" -msgstr "" - -#: ../../documentation/index.md:91 -msgid "" -"Information on how to cite your code / give you credit if they are using " -"it in a research application." -msgstr "" - -#: ../../documentation/index.md:93 -msgid "" -"Information on the license that your code uses so they know how they can " -"or can't use the code in an operational setting." -msgstr "" - -#: ../../documentation/index.md:96 -msgid "2. Potential tool contributors" -msgstr "" - -#: ../../documentation/index.md:98 -msgid "" -"The other subset of users are more experienced and/or more engaged with " -"your package. As such they are potential contributors. These users:" -msgstr "" - -#: ../../documentation/index.md:102 -msgid "might have a software development background," -msgstr "" - -#: ../../documentation/index.md:103 -msgid "" -"might also be able to contribute bug fixes to your package or updates to " -"your documentation" -msgstr "" - -#: ../../documentation/index.md:104 -msgid "" -"might also just be users who will find spelling errors in your " -"documentation, or bugs in your tutorials." -msgstr "" - -#: ../../documentation/index.md:106 -msgid "" -"These users need all of the things that a basic user needs. But, they " -"also need to understand how you'd like for them to contribute to your " -"package. These potential contributors need:" -msgstr "" - -#: ../../documentation/index.md:110 -msgid "" -"A development guide to help them understand the infrastructure used in " -"your package repository." -msgstr "" - -#: ../../documentation/index.md:111 -msgid "" -"Contributing guidelines that clarify the types of contributions that you " -"welcome and how you'd prefer those contributions to be submitted." -msgstr "" - -#: ../../documentation/index.md:114 -msgid "" -"It's important to remember that the definition of what a contribution is " -"can be broad. A contribution could be something as simple as a bug " -"report. Or fixing a spelling issue in your documentation. Or it could be " -"a code fix that includes a new test that covers an edge-case that they " -"discovered." -msgstr "" - -#: ../../documentation/index.md:120 -msgid "Documentation elements that pyOpenSci looks for reviewing a Python package" -msgstr "" - -#: ../../documentation/index.md:122 -msgid "" -"In the pyOpenSci open peer review, we look for a documentation structure " -"that supports both your tool users and potential contributors. The files " -"and elements that we look for specifically can be found in our peer " -"review check list (see link below)." -msgstr "" - -#: ../../documentation/index.md:127 -msgid "" -"In this guide, we discuss each required element, and also discuss other " -"elements that you should consider in your package's documentation in more" -" detail." -msgstr "" - -#: ../../documentation/index.md:131 -msgid "View pyOpenSci peer review check list" -msgstr "" - -#: ../../documentation/index.md:138 -msgid "" -"Image showing the files in the the MovingPandas GitHub repository. Files " -"in the image include code of conduct.md contributing.md license.txt and " -"readme.md." -msgstr "" - -#: ../../documentation/index.md:144 -msgid "" -"An example from the MovingPandas GitHub repository with all of the major " -"files in it including CONTRIBUTING.md, README.md, CODE_OF_CONDUCT.md and " -"a LICENSE.txt file. *(screen shot taken Nov 23 2022)*" -msgstr "" - -#: ../../documentation/index.md:147 -msgid "What's next in this Python package documentation section?" -msgstr "" - -#: ../../documentation/index.md:149 -msgid "" -"In this section of the pyOpenSci package guide, we will walk you through " -"best practices for setting up documentation for your Python package. We " -"will also suggest tools that you can use to build your user-facing " -"documentation website." -msgstr "" - -#: ../../documentation/index.md:154 -msgid "Todo" -msgstr "" - -#: ../../documentation/index.md:156 -msgid "" -"Python version support You should always be explicit about which versions" -" of Python your package supports. Keeping compatibility with old Python " -"versions can be difficult as functionality changes. A good rule of thumb " -"is that the package should support, at least, the latest three Python " -"versions (e.g., 3.8, 3.7, 3.6)." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:1 -msgid "CHANGELOG.md Guide" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:3 -msgid "Introduction" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:5 -msgid "" -"The `CHANGELOG.md` document serves as a valuable resource for developers " -"and users alike to track the evolution of a project over time. " -"Understanding the structure and purpose of a changelog helps users and " -"contributors stay informed about new features, bug fixes, and other " -"changes introduced in each release." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:7 -msgid "What is CHANGELOG.md?" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:9 -msgid "" -"The primary purpose of `CHANGELOG.md` is to provide a record of notable " -"changes made to the project with each new release. This document helps " -"users understand what has been added, fixed, modified, or removed with " -"each version of the software." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:11 -msgid "" -"[Keep a CHAGELOG.md](https://keepachangelog.com/en/1.1.0/) is a great, " -"simple resource for understanding what a changelog is and how to create a" -" good changelog. It also includes examples of things to avoid." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:13 -msgid "Versioning your Python package and semantic versioning" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:16 -msgid "" -"An important component of a package that serves as the backbone behind " -"the changelog file is a good versioning scheme. Semantic Versioning is " -"widely used across Python packages." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:17 -msgid "" -"[Creating New Versions of Your Python Package](../../package-structure-" -"code/python-package-versions.md)" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:18 -msgid "[Semantic Versioning](https://semver.org)" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:21 -msgid "Why is it important?" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:23 -msgid "" -"A well-maintained changelog is essential for transparent communication " -"with users and developers. It serves as a centralized hub for documenting" -" changes and highlights the progress made in each release. By keeping the" -" changelog up-to-date, project maintainers can build trust with their " -"user base and demonstrate their commitment to improving the software." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:25 -msgid "What does it include?" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:27 -msgid "" -"The contents of a changelog.md file typically follow a structured format," -" detailing the changes introduced in each release. While the exact format" -" may vary depending on the project's conventions, some common elements " -"found in changelogs for Python packages include:" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:29 -msgid "" -"**Versioning**: Clear identification of each release version using " -"semantic versioning or another versioning scheme adopted by the project." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:31 -msgid "" -"**Release Date**: The date when each version was released to the public, " -"providing context for the timeline of changes." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:33 -msgid "" -"**Change Categories**: Organizing changes into categories such as " -"\"Added,\" \"Changed,\" \"Fixed,\" and \"Removed\" to facilitate " -"navigation and understanding." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:35 -msgid "" -"**Description of Changes**: A concise description of the changes made in " -"each category, including new features, enhancements, bug fixes, and " -"deprecated functionality." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:37 -msgid "" -"**Links to Issues or Pull Requests**: References to relevant issue " -"tracker items or pull requests associated with each change, enabling " -"users to access more detailed information if needed." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:39 -msgid "" -"**Upgrade Instructions**: Guidance for users on how to upgrade to the " -"latest version, including any breaking changes or migration steps they " -"need to be aware of." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:41 -msgid "" -"**Contributor Recognition**: Acknowledgment of contributors who made " -"significant contributions to the release, fostering a sense of community " -"and appreciation for their efforts." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:43 -msgid "How do maintainers use it?" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:45 -msgid "Often you will see a changelog that documents a few things:" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:47 -msgid "Unreleased Section" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:49 -msgid "" -"Unreleased commits are at the top of the changelog, commonly in an " -"`Unreleased` section. This is where you can add new fixes, updates and " -"features that have been added to the package since the last release." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:51 -msgid "This section might look something like this:" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:59 -msgid "Release Sections" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:61 -msgid "" -"When you are ready to make a new release, you can move the elements into " -"a section that is specific to that new release number." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:63 -msgid "" -"This specific release section will sit below the unreleased section and " -"can include any updates, additions, deprecations and contributors." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:65 -msgid "" -"The unreleased section then always lives at the top of the file and new " -"features continue to be added there. At the same time, after releasing a " -"version like v1.0 all of its features remain in that specific section." -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:83 -msgid "What does it look like?" -msgstr "" - -#: ../../documentation/repository-files/changelog-file.md:85 -msgid "" -"This example comes from [Devicely](https://github.com/hpi-" -"dhc/devicely/blob/main/CHANGELOG.md), a pyOpenSci accepted package." -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:1 -msgid "The CODE_OF_CONDUCT file - Python Packaging" -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:3 -msgid "Example CODE_OF_CONDUCT files" -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:6 -msgid "" -"[SciPy Code of Conduct file - notice they included theirs in their " -"documentation](https://docs.scipy.org/doc/scipy/dev/conduct/code_of_conduct.html)" -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:7 -msgid "" -"[fatiando CODE_OF_CONDUCT.md " -"file](https://github.com/fatiando/community/blob/main/CODE_OF_CONDUCT.md)" -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:10 -msgid "" -"Your package should have a `CODE_OF_CONDUCT.md` file located the root of " -"the repository. Once you have people using your package, you can consider" -" the package itself as having a community around it. Some of this " -"community uses your tool. These users may have questions or encounter " -"challenges using your package." -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:16 -msgid "" -"Others in the community might want to contribute to your tool. They might" -" fix bugs, update documentation and engage with the maintainer team." -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:20 -msgid "Why you need a CODE_OF_CONDUCT" -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:22 -msgid "" -"In order to keep this community healthy and to protect yourself, your " -"maintainer team and your users from unhealthy behavior, it is important " -"to have a [`CODE_OF_CONDUCT`](https://opensource.guide/code-of-conduct/)." -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:26 -msgid "" -"The `CODE_OF_CONDUCT` is important as it establishes what you expect in " -"terms of how users and contributors interact with maintainers and each " -"other. It also establishes rules and expectations which can then be " -"enforced if need be to protect others from harmful and/or negative " -"behaviors." -msgstr "" - -#: ../../documentation/repository-files/code-of-conduct-file.md:32 -msgid "" -"If you are not comfortable with creating your own `CODE_OF_CONDUCT` text," -" we encourage you to adopt the `CODE_OF_CONDUCT` language used in the " -"[Contributor Covenant](https://www.contributor-" -"covenant.org/version/2/1/code_of_conduct/). [Many other " -"communities](https://www.contributor-covenant.org/adopters/) have adopted" -" this `CODE_OF_CONDUCT` as their own. See the [Fatiando a Terra " -"Geoscience Python community's example " -"here.](https://github.com/fatiando/community/blob/main/CODE_OF_CONDUCT.md)" -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:1 -msgid "Contributing File in your Python Open Source Package" -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:3 -msgid "What a CONTRIBUTING.md file should contain" -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:5 -msgid "Example contributing files" -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:8 -msgid "" -"[pyGMT contributing " -"file](https://github.com/GenericMappingTools/pygmt/blob/main/CONTRIBUTING.md)" -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:9 -msgid "" -"[fatiando verde's contributing " -"file](https://github.com/fatiando/verde/blob/main/CONTRIBUTING.md)" -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:12 -msgid "" -"Your Python open source package should include a file called " -"**CONTRIBUTING.md** located in the root of your repository (with your " -"**README.md** file)." -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:15 -msgid "" -"The contributing file should include information about the types of " -"contributions that you welcome, and how you'd like to see contributions " -"happen." -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:19 -msgid "" -"This guide should also include information for someone interested in " -"asking questions, submitting issues or pull requests. It should have " -"things like:" -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:22 -msgid "" -"Any guidelines that you have in place for users submitting issues, pull " -"requests or asking questions." -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:23 -msgid "A link to your code of conduct" -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:24 -msgid "A link to licensing information found in your README file." -msgstr "" - -#: ../../documentation/repository-files/contributing-file.md:25 -msgid "A link to a development guide if you have one" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:1 -msgid "What the development guide for your Python package should contain" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:3 -msgid "" -"Ideally, your package should also have a development guide. This file may" -" live in your package documentation and should be linked to from your " -"CONTRIBUTING.md file (discussed above). A development guide should " -"clearly show technically proficient users how to:" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:7 -msgid "Set up a development environment locally to work on your package" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:8 -msgid "Run the test suite" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:9 -msgid "Build documentation locally" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:11 -msgid "The development guide should also have guidelines for:" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:12 -msgid "" -"code standards including docstring style, code format and any specific " -"code approaches that the package follows." -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:14 -msgid "" -"It's also helpful to specify the types of tests you request if a " -"contributor submits a new feature or a change to an existing feature that" -" will not be covered by your existing test suite." -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:16 -msgid "" -"If you have time to document it, it's also helpful to document your " -"maintainer workflow and release processes." -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:18 -msgid "Why a development guide is important" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:20 -msgid "It's valuable to have a development guide, in the case that you wish to:" -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:23 -msgid "Onboard new maintainers." -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:24 -msgid "" -"Allow technically inclined contributors to make thoughtful and useful " -"code based pull requests to your repository." -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:26 -msgid "" -"It also is important to pyOpenSci that the maintenance workflow is " -"documented in the case that we need to help you onboard new maintainers " -"in the future." -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:31 -msgid "" -"A well thought out continuous integration setup in your repository can " -"allow users to skip building the package locally (especially if they are " -"just updating text)." -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:36 -msgid "" -"A development guide, while strongly recommended, is not a file that " -"pyOpenSci requires a package to have in order to be eligible for review. " -"Some maintainers may also opt to include the development information in " -"their contributing guide." -msgstr "" - -#: ../../documentation/repository-files/development-guide.md:43 -msgid "" -"[The Mozilla Science Lab website has a nice outline of things to consider" -" when creating a contributing guide](https://mozillascience.github.io" -"/working-open-workshop/contributing/)" -msgstr "" - -#: ../../documentation/repository-files/intro.md:1 -msgid "Documentation Files That Should be in your Python Package Repository" -msgstr "" - -#: ../../documentation/repository-files/intro.md:3 -msgid "" -"In this section of the Python packaging guide, we review all of the files" -" that you should have in your Python package repository. Your Python " -"package should, at a minimum have the following files:" -msgstr "" - -#: ../../documentation/repository-files/intro.md:7 -msgid "" -"The files mentions above (README, Code of Conduct, license file, etc) are" -" used as a measure of package community health on many online platforms. " -"Below, you can see an example how Github evaluates community health. This" -" community health link is available for all GitHub repositories." -msgstr "" - -#: ../../documentation/repository-files/intro.md:13 -msgid "" -"Image showing that the MovingPandas GitHub repository community health " -"page with green checks next to each file including a description, README," -" code of conduct, contributing, license and issue templates. Note that " -"Security policy has a yellow circle next to it as that is missing from " -"the repo." -msgstr "" - -#: ../../documentation/repository-files/intro.md:19 -msgid "" -"GitHub community health looks for a readme file among other elements when" -" it evaluates the community level health of your repository. This example" -" is from the [MovingPandas GitHub " -"repo](https://github.com/anitagraser/movingpandas/community) *(screen " -"shot taken Nov 23 2022)*" -msgstr "" - -#: ../../documentation/repository-files/intro.md:22 -msgid "" -"[Snyk](https://snyk.io/advisor/python) is another well-known company that" -" keeps tabs on package health. Below you can see a similar evaluation of " -"files in the Github repo as a measure of community health." -msgstr "" - -#: ../../documentation/repository-files/intro.md:26 -msgid "" -"Screenshot of the Snyk page for movingpandas. It shows that the " -"repository has a README file, contributing file, code of conduct. It also" -" shows that it has 30 contributors and no funding. The package health " -"score is 78/100." -msgstr "" - -#: ../../documentation/repository-files/intro.md:32 -msgid "" -"Screenshot showing [SNYK](https://snyk.io/advisor/python/movingpandas) " -"package health for moving pandas. Notice both platforms look for a README" -" file. *(screen shot taken Nov 23 2022)*" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:1 -msgid "License files for scientific Python open source software" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:3 -msgid "" -"Want to learn how to add a license file to your GitHub repository? Check " -"out this lesson." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:10 -msgid "What is a Open Source License file?" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:12 -msgid "" -"When we talk about LICENSE files, we are referring to a file in your " -"GitHub or GitLab repository that contains legally binding language that " -"describes to your users how they can legally use (and not use) your " -"package." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:16 -msgid "Why licenses are important" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:18 -msgid "" -"A license file is important for all open source projects because it " -"protects both you as a maintainer and your users. The license file helps " -"your users and the community understand:" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:20 -msgid "How they can use your software" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:21 -msgid "Whether the software can be reused or adapted for other purposes" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:22 -msgid "How people can contribute to your project" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:24 -msgid "and more." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:26 -msgid "" -"[Read more about why license files are critical in protecting both you as" -" a maintainer and your users of your scientific Python open source " -"package.](https://opensource.guide/legal/#just-give-me-the-tldr-on-what-i" -"-need-to-protect-my-project)" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:29 -msgid "Where to store your license" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:31 -msgid "" -"Your `LICENSE` file should be stored at root of your GitHub / GitLab " -"repository." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:33 -msgid "" -"Some maintainers customize the language in their license files for " -"specific reasons. However, if you are just getting started, we suggest " -"that you select a permissive license and then use the legal language " -"templates provided both by GitHub and/or the " -"[choosealicense.com](https://choosealicense.com/) website." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:36 -msgid "" -"Licenses are legally binding, as such you should avoid trying to create " -"your own license unless you have the guidance of legal council." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:38 -msgid "Use open permissive licenses when possible" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:40 -msgid "" -"We generally suggest that you use a permissive, license that is [Open " -"Software Initiative (OSI) approved](https://opensource.org/licenses/). If" -" you are [submitting your package to pyOpenSci for peer " -"review](https://www.pyopensci.org/about-peer-review/index.html), then we " -"require an OSI approved license." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:44 -msgid "How to choose a license" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:46 -msgid "" -"To select your license, we suggest that you use GitHub's [Choose a " -"License tool ](https://choosealicense.com/)." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:49 -msgid "" -"If you choose your license when creating a new GitHub repository, you can" -" also automatically get a text copy of the license file to add to your " -"repository. However in some cases the license that you want is not " -"available through that online process." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:54 -msgid "License recommendations from the SciPy package" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:55 -msgid "" -"[The SciPy documentation has an excellent overview of " -"licenses.](https://docs.scipy.org/doc/scipy/dev/core-" -"dev/index.html#licensing). Once of the key elements that these docs " -"recommend is ensuring that the license that you select is complementary " -"to license used in the core scientific Python ecosystem. Below is a " -"highlight of this text which outlines license that are compatible with " -"the modified BSD license that SciPy uses." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:61 -msgid "" -"Other licenses that are compatible with the modified BSD license that " -"SciPy uses are 2-clause BSD, MIT and PSF. Incompatible licenses are GPL, " -"Apache and custom licenses that require attribution/citation or prohibit " -"use for commercial purposes." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:63 -msgid "" -"To coordinate with other packages in our scientific ecosystem, we also " -"recommend that you consider using either BSD or MIT as your license. If " -"you are unsure, the MIT license tends to be a simpler easier-to-" -"understand option." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:69 -msgid "" -"Important: make sure that you closely follow the guidelines outlines by " -"the License that you chose" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:71 -msgid "" -"Every license has different guidelines in terms of what code you can use " -"in your package and also how others can (or can not) use the code in your" -" package." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:74 -msgid "" -"If you borrow code from other tools or online sources, make sure that the" -" license for the code that you are using also complies with the license " -"that you selected for your package." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:78 -msgid "An example of how a license determine how code can be reused" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:81 -msgid "" -"Let's use StackOverflow as an example that highlights how a license " -"determines how code can or can not be used." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:83 -msgid "" -"[Stack overflow uses a Creative Commons Share Alike " -"license.](https://stackoverflow.com/help/licensing). The sharealike " -"license requires you to use the same sharealike license when you reuse " -"any code from StackOverflow." -msgstr "" - -#: ../../documentation/repository-files/license-files.md:85 -msgid "" -"This means that technically, if you copy code from the Stack Overflow " -"website, and use it in your package. And your packages uses a different " -"license such as a MIT license, you are violating Stack Overflow's license" -" requirements!" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:87 -msgid "🚨 Proceed with caution! 🚨" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:91 -msgid "What about software citation?" -msgstr "" - -#: ../../documentation/repository-files/license-files.md:93 -msgid "" -"While many permissive licenses do not require citation we STRONG " -"encourage that you cite all software that you use in papers, blogs and " -"other publications. You tell your users how to cite your package by using" -" a [citation.cff file](https://docs.github.com/en/repositories/managing-" -"your-repositorys-settings-and-features/customizing-your-repository/about-" -"citation-files). We will cover this topic when we talk about creating " -"DOI's for your package using zenodo." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:1 -msgid "README File Guidelines and Resources" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:3 -msgid "" -"Your **README.md** file should be located in the root of your GitHub " -"repository. The **README.md** file is important as it is often the first " -"thing that someone sees before they install your package." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:7 -msgid "The README.md file is the landing page of:" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:9 -msgid "" -"Your package as it appears on a repository site such as PyPI or " -"Anaconda.org" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:10 -msgid "Your package's GitHub repository" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:12 -msgid "" -"Your README.md file is also used as a measure of package and community " -"health on sites such as:" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:14 -msgid "" -"[GitHub community health for MovingPandas (available for all " -"repositories)](https://github.com/anitagraser/movingpandas/community) and" -" [Snyk - moving pandas " -"example](https://snyk.io/advisor/python/movingpandas)" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:17 -msgid "" -"README landing page screenshot for the Pandera package. It has the " -"Pandera logo at the top - which has two arrows in a chevron pattern " -"pointing downward within a circle. Subtitle is statistical data testing " -"toolkit. A data validation library for scientists, engineering, and " -"analytics seeking correctness. Below that are a series of badges " -"including CI tests passing, docs passing, version of Pandera on pypi " -"(0.13.4), MIT license and that it has been pyOpenSci peer reviewed. There" -" are numerous badges below that. Finally below the badges the text says, " -"Pandera provides a flexible and expressive API for performing data " -"validation on dataframe-like objects to make data processing pipelines " -"more readable and robust." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:23 -msgid "" -"Your GitHub repository landing page highlights the README.md file. Here " -"you can see the README.md file for the pyOpenSci package " -"[Pandera](https://github.com/unionai-oss/pandera). *(screen shot taken " -"Nov 23 2022)*" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:26 -msgid "" -"Thus, it is important that you spend some time up front creating a high " -"quality **README.md** file for your Python package." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:30 -msgid "" -"An editor or the editor in chief will ask you to revise your README file " -"before a review begins if it does not meet the criteria specified below." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:33 -msgid "Please go through this list before submitting your package to pyOpenSci" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:50 -msgid "What your README.md file should contain" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:52 -msgid "" -"Your **README.md** file should contain the following things (listed from " -"top to bottom):" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:54 -msgid "✔️ Your package's name" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:55 -msgid "" -"Ideally your GitHub repository's name is also the name of your package. " -"The more self explanatory that name is, the better." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:58 -msgid "" -"✔️ Badges for current package version, continuous integration and test " -"coverage" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:60 -msgid "" -"Badges are a useful way to draw attention to the quality of your project." -" Badges assure users that your package is well-designed, tested, and " -"maintained. They are also a useful maintenance tool to evaluate if things" -" are building properly. A great example of this is adding a [Read the " -"Docs status badge](https://docs.readthedocs.io/en/stable/badges.html) to " -"your README.md file to quickly see when the build on that site fails." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:66 -msgid "" -"It is common to provide a collection of badges towards the top of your " -"README file for others to quickly browse." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:69 -msgid "Some badges that you might consider adding to your README file include:" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:71 -msgid "Current version of the package on PyPI / Anaconda.org" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:73 -msgid "" -"Example: [![PyPI version " -"shields.io](https://img.shields.io/pypi/v/pandera.svg)](https://pypi.org/project/pandera/)" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:73 -msgid "PyPI version shields.io" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:75 -msgid "" -"Status of tests (pass or fail) - Example: [![CI Build](https://github.com" -"/pandera-" -"dev/pandera/workflows/CI%20Tests/badge.svg?branch=main)](https://github.com" -"/pandera-" -"dev/pandera/actions?query=workflow%3A%22CI+Tests%22+branch%3Amain)" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:75 -msgid "CI Build" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:77 -msgid "" -"Documentation build - Example: ![Docs " -"Building](https://github.com/pyOpenSci/python-package-" -"guide/actions/workflows/build-book.yml/badge.svg)" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:77 -msgid "Docs Building" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:79 -msgid "" -"DOI (for citation) Example: " -"[![DOI](https://zenodo.org/badge/556814582.svg)](https://zenodo.org/badge/latestdoi/556814582)" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:79 -msgid "DOI" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:82 -msgid "" -"Once you package is accepted to pyOpenSci, we will provide you with a " -"badge to add to your repository that shows that it has been reviewed. " -"[![pyOpenSci](https://pyopensci.org/badges/peer-" -"reviewed.svg)](https://github.com/pyOpenSci/software-review/issues/12)" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:82 -msgid "pyOpenSci" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:90 -msgid "" -"Beware of the overuse of badges! There is such a thing as too much of a " -"good thing (which can overload a potential user!)." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:93 -msgid "✔️ A short, easy-to-understand description of what your package does" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:95 -msgid "" -"At the top of your README file you should have a short, easy-to-" -"understand, 1-3 sentence description of what your package does. This " -"section should clearly state your goals for the package. The language in " -"this description should use less technical terms so that a variety of " -"users with varying scientific (and development) backgrounds can " -"understand it." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:101 -msgid "" -"In this description, it's useful to let users know how your package fits " -"within the broader scientific Python package ecosystem. If there are " -"other similar packages or complementary package mentions them here in 1-2" -" sentences." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:106 -msgid "" -"Consider writing for a high school level (or equivalent) level. This " -"level of writing is often considered an appropriate level for scientific " -"content that serves a variety of users with varying backgrounds." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:110 -msgid "" -"The goal of this description is to maximize accessibility of your " -"**README** file." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:114 -msgid "✔️ Installation instructions" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:116 -msgid "" -"Include instructions for installing your package. If you have published " -"the package on both PyPI and Anaconda.org, be sure to include " -"instructions for both." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:119 -msgid "✔️ Document any additional setup required" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:121 -msgid "" -"Add any additional setup required such as authentication tokens, to get " -"started using your package. If setup is complex, consider linking to an " -"installation page in your online documentation here rather than over " -"complicating your README file." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:126 -msgid "✔️ Brief demonstration of how to use the package" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:128 -msgid "" -"This description ideally includes a brief, quick start code example that " -"shows a user how to get started using your package." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:131 -msgid "✔️ Descriptive links to package documentation, short tutorials" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:133 -msgid "Include descriptive links to:" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:135 -msgid "The package's documentation page." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:136 -msgid "Short tutorials that demonstrate application of your package." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:138 -msgid "Too Much Of A Good Thing" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:141 -msgid "" -"Try to avoid including several tutorials in the README.md file itself. " -"This too will overwhelm the user with information." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:143 -msgid "" -"A short quick-start code example that shows someone how to use your " -"package is plenty of content for the README file. All other tutorials and" -" documentation should be presented as descriptive links." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:149 -msgid "✔️ A Community Section with Links to Contributing Guide, Code of Conduct" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:151 -msgid "Use your README.md file to direct users to more information on:" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:153 -msgid "Contributing to your package" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:154 -msgid "Development setup for more advanced technical contributors" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:155 -msgid "Your code of conduct" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:156 -msgid "Licensing information" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:158 -msgid "" -"All of the above files are important for building community around your " -"project." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:161 -msgid "✔️ Citation information" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:163 -msgid "" -"Finally be sure to include instructions on how to cite your package. " -"Citation should include the DOI that you want used when citing your " -"package, and any language that you'd like to see associated with the " -"citation." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:167 -msgid "README Resources" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:171 -msgid "" -"Below are some resources on creating great README.md files that you might" -" find helpful." -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:174 -msgid "" -"[How to Write a Great README - Bane " -"Sullivan](https://github.com/banesullivan/README)" -msgstr "" - -#: ../../documentation/repository-files/readme-file-best-practices.md:175 -msgid "" -"[Art of README - Kira (@hackergrrl)](https://github.com/hackergrrl/art-" -"of-readme)" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:1 -msgid "Create tutorials in your Python package documentation" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:6 -msgid "" -"Your package should have tutorials that make it easy for a user to get " -"started using your package. Ideally, those tutorials also can be run from" -" start to finish providing a second set of checks (on top of your test " -"suite) to your package's code base." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:11 -msgid "" -"On this page, we review two Sphinx extensions (`sphinx-gallery` and " -"`nbsphinx`) that allow you to create reproducible tutorials that are run" -" when your Sphinx documentation builds." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:15 -msgid "Create Python package tutorials that run when you build your docs" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:17 -msgid "" -"Adding well constructed tutorials to your package will make it easier for" -" someone new to begin using your package." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:20 -msgid "" -"There are two Sphinx tools that make it easy to add tutorials to your " -"package:" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:22 -msgid "[Sphinx Gallery](https://sphinx-gallery.github.io/stable/index.html) and" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:23 -msgid "[NbSphinx](https://nbsphinx.readthedocs.io/en/latest/)" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:25 -msgid "Both of these tools act as Sphinx extensions and:" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:27 -msgid "" -"Support creating a gallery type page in your Sphinx documentation where " -"users can explore tutorials via thumbnails." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:28 -msgid "" -"Run the code in your tutorials adding another level of \"testing\" for " -"your package as used." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:29 -msgid "Render your tutorials with Python code and plot outputs" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:31 -msgid "[sphinx gallery:](https://sphinx-gallery.github.io/stable/index.html)" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:33 -msgid "" -"If you prefer to write your tutorials using Python **.py** scripts, you " -"may enjoy using Sphinx gallery. Sphinx gallery uses **.py** files with " -"text and code sections that mimic the Jupyter Notebook format. When you " -"build your documentation, the gallery extension:" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:38 -msgid "" -"Runs the code in each tutorial. Running your tutorial like this acts as a" -" check to ensure your package's functions, classes, methods, and " -"attributes (ie the API) are working as they should." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:39 -msgid "" -"Creates a downloadable Jupyter Notebook **.ipynb** file and a **.py** " -"script for your tutorial that a user can quickly download and run." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:40 -msgid "" -"Creates a rendered **.html** page with the code elements and code " -"outputs in a user-friendly tutorial gallery." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:41 -msgid "" -"Creates a gallery landing page with visual thumbnails for each tutorial " -"that you create." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:44 -msgid "" -"Image showing the gallery output provided by sphinx-gallery where each " -"tutorial is in a grid and the tutorial thumbnails are created from a " -"graphic in the tutorial." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:50 -msgid "" -"`sphinx-gallery` makes it easy to create a user-friendly tutorial " -"gallery. Each tutorial has a download link where the user can download a " -"**.py** file or a Jupyter Notebook. And it renders the tutorials in a " -"user-friendly grid." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:54 -msgid "Below you can see what a tutorial looks like created with sphinx-gallery." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:56 -msgid "" -"Image showing ta single tutorial from Sphinx gallery. The tutorial shows " -"a simple matplotlib created plot and associated code." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:62 -msgid "" -"`sphinx-gallery` tutorials by default include download links for both the" -" python script (**.py** file) and a Jupyter notebook (**.ipynb** file) at" -" the bottom." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:66 -msgid "Sphinx Gallery benefits" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:67 -msgid "easy-to-download notebook and .py outputs for each tutorials." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:68 -msgid ".py files are easy to work with in the GitHub pull request environment." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:69 -msgid "Nice gridded gallery output." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:70 -msgid "" -"Build execution time data per tutorial. [Example](https://sphinx-" -"gallery.github.io/stable/auto_examples/sg_execution_times.html)" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:72 -msgid "Sphinx gallery challenges" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:74 -msgid "The downsides of using Sphinx gallery include:" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:76 -msgid "" -"the **.py** files can be finicky to configure, particularly if you have " -"matplotlib plot outputs." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:78 -msgid "" -"For example: To allow for plots to render, you need to name each file " -"with `plot_` at the beginning." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:81 -msgid "" -"Many users these days are used to working in Jupyter Notebooks. .py may " -"be slightly less user friendly to work with" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:83 -msgid "" -"These nuances can make it challenging for potential contributors to add " -"tutorials to your package. This can also present maintenance challenge." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:86 -msgid "Add about the gallery setup:" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:93 -msgid "File directory structure:" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:114 -msgid "" -"[nbsphinx - tutorials using Jupyter " -"Notebooks](https://nbsphinx.readthedocs.io/en/latest/)" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:116 -msgid "" -"If you prefer to use Jupyter Notebooks to create tutorials you can use " -"nbsphinx. nbsphinx operates similarly to Sphinx gallery in that:" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:119 -msgid "It runs your notebooks and produces outputs in the rendered tutorials" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:121 -msgid "" -"Pro/con By default it does not support downloading of **.py** and " -"**.ipynb** files. However you can add a [link to the notebook at the top " -"of the page with some additional conf.py settings (see: epilog " -"settings)](https://nbsphinx.readthedocs.io/en/0.8.10/prolog-and-" -"epilog.html)" -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:125 -msgid "" -"Image showing the gallery output provided by nbsphinx using the sphinx-" -"gallery front end interface." -msgstr "" - -#: ../../documentation/write-user-documentation/create-package-tutorials.md:131 -msgid "" -"`nbsphinx` can be combined with Sphinx gallery to create a gallery of " -"tutorials. However, rather than rendering the gallery as a grid, it lists" -" all of the gallery elements in a single column." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:1 -msgid "Document the code in your package's API using docstrings" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:3 -msgid "What is an API?" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:5 -msgid "" -"API stands for **A**pplied **P**rogramming **I**nterface. When discussed " -"in the context of a (Python) package, the API refers to the functions, " -"classes, methods, and attributes that a package maintainer creates for " -"users." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:9 -msgid "" -"A simple example of a package API element: For instance, a package might " -"have a function called `add_numbers()` that adds up a bunch of numbers. " -"To add up numbers, you as the user simply call `add_numbers(1,2,3)` and " -"the package function calculates the value and returns `6`. By calling the" -" `add_numbers` function, you are using the package's API." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:15 -msgid "" -"Package APIs consist of functions, classes, methods and attributes that " -"create a user interface." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:17 -msgid "What is a docstring and how does it relate to documentation?" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:19 -msgid "" -"In Python, a docstring refers to text in a function, method or class that" -" describes what the function does and its inputs and outputs. Python " -"programmers usually refer to the inputs to functions as " -"[\"parameters\"](https://docs.python.org/3/glossary.html#term-parameter) " -"or [\"arguments\"](https://docs.python.org/3/faq/programming.html#faq-" -"argument-vs-parameter), and the outputs are often called \"return " -"values\"" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:22 -msgid "The docstring is thus important for:" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:24 -msgid "" -"When you call `help()` in Python, for example, `help(add_numbers)` will " -"show the text of the function's docstring. The docstring thus helps a " -"user better understand how to apply the function more effectively to " -"their workflow." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:25 -msgid "" -"When you build your package's documentation, the docstrings can also be " -"used to automatically create full API documentation that provides a clean" -" view of all its functions, classes, methods, and attributes." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:28 -msgid "" -"Example API Documentation for all functions, classes, methods, and " -"attributes in a package." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:29 -msgid "" -"[View example high-level API documentation for the Verde package. This " -"page lists every function and class in the package along with a brief " -"explanation of what it " -"does](https://www.fatiando.org/verde/latest/api/index.html)" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:30 -msgid "" -"[You can further dig down to see what a specific function does within the" -" package by clicking on an API " -"element](https://www.fatiando.org/verde/latest/api/generated/verde.grid_coordinates.html#verde.grid_coordinates)" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:33 -msgid "Python package API documentation" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:35 -msgid "" -"If you have a descriptive docstring for every user-facing class, method, " -"attribute and/or function in your package (_within reason_), then your " -"package's API is considered well-documented." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:38 -msgid "" -"In Python, this means that you need to add a docstring for every user-" -"facing class, method, attribute and/or function in your package (_within " -"reason_) that:" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:42 -msgid "Explains what the function, method, attribute, or class does" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:43 -msgid "Defines the `type` inputs and outputs (ie. `string`, `int`, `np.array`)" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:44 -msgid "Explains the expected output `return` of the object, method or function." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:47 -msgid "Three Python docstring formats and why we like NumPy style" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:49 -msgid "" -"There are several Python docstring formats that you can choose to use " -"when documenting your package including:" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:52 -msgid "" -"[NumPy-style](https://numpydoc.readthedocs.io/en/latest/format.html" -"#docstring-standard)" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:53 -msgid "" -"[google style](https://sphinxcontrib-" -"napoleon.readthedocs.io/en/latest/example_google.html)" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:54 -msgid "" -"[reST style](https://sphinx-rtd-" -"tutorial.readthedocs.io/en/latest/docstrings.html)" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:58 -msgid "" -"We suggest using [NumPy-style " -"docstrings](https://numpydoc.readthedocs.io/en/latest/format.html" -"#docstring-standard) for your Python documentation because:" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:61 -msgid "" -"NumPy style docstrings are core to the scientific Python ecosystem and " -"defined in the [NumPy style " -"guide](https://numpydoc.readthedocs.io/en/latest/format.html). Thus you " -"will find them widely used there." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:62 -msgid "" -"The Numpy style docstring is simplified and thus easier to read both in " -"the code and when calling `help()` in Python. In contrast, some feel that" -" reST style docstrings are harder to quickly scan, and can take up more " -"lines of code in modules." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:65 -msgid "" -"If you are using NumPy style docstrings, be sure to include the [sphinx " -"napoleon extension](https://www.sphinx-" -"doc.org/en/master/usage/extensions/napoleon.html) in your documentation " -"`conf.py` file. This extension allows Sphinx to properly read and format " -"NumPy format docstrings." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:70 -msgid "Docstring examples Better and Best" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:72 -msgid "" -"Below is a good example of a well-documented function. Notice that this " -"function's docstring describes the function's inputs and the function's " -"output (or return value). The initial description of the function is " -"short (one line). Following that single-line description, there is a " -"slightly longer description of what the function does (2 to 3 sentences)." -" The return of the function is also specified." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:106 -msgid "Best: a docstring with example use of the function" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:108 -msgid "" -"This example contains an example of using the function that is also " -"tested in sphinx using " -"[doctest](https://docs.python.org/3/library/doctest.html)." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:159 -msgid "" -"Using the above NumPy format docstring in sphinx, the autodoc extension " -"will create the about documentation section for the `extent_to_json` " -"function. The output of the `es.extent_to_json(rmnp)` command can even be" -" tested using doctest adding another quality check to your package." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:165 -msgid "" -"Using doctest to run docstring examples in your package's methods and " -"functions" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:170 -msgid "" -"Above, we provided some examples of good, better, best docstring formats." -" If you are using Sphinx to create your docs, you can add the " -"[doctest](https://www.sphinx-" -"doc.org/en/master/usage/extensions/doctest.html) extension to your Sphinx" -" build. Doctest provides an additional check for docstrings with example " -"code in them. Doctest runs the example code in your docstring `Examples` " -"checking that the expected output is correct. Similar to running " -"tutorials in your documentation, `doctest` can be a useful step that " -"assures that your package's code (API) runs as you expect it to." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:177 -msgid "" -"It's important to keep in mind that examples in your docstrings help " -"users using your package. Running `doctest` on those examples provides a " -"check of your package's API. doctest ensures that the functions and " -"methods in your package run as you expect them to. Neither of these items" -" replace a separate, stand-alone test suite that is designed to test your" -" package's core functionality across operating systems and Python " -"versions." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:185 -msgid "" -"Below is an example of a docstring with an example. doctest will run the " -"example below and test that if you provide `add_me` with the values 1 and" -" 3 it will return 4." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:218 -msgid "Adding type hints to your docstrings" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:220 -msgid "" -"In the example above, you saw the use of numpy-style docstrings to " -"describe data types that are passed into functions as parameters or into " -"classes as attributes. In a numpy-style docstring you add those types in " -"the Parameters section of the docstring. Below you can see that the " -"parameter `num1` and `num2` should both be a Python `int` (integer) " -"value." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:235 -msgid "" -"Describing the expected data type that a function or method requires " -"helps users better understand how to call a function or method." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:238 -msgid "" -"Type-hints add another layer of type documentation to your code. Type-" -"hints make it easier for new developers, your future self or contributors" -" to get to know your code base quickly." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:242 -msgid "" -"Type hints are added to the definition of your function. In the example " -"below, the parameters aNum and aNum2 are defined as being type = int " -"(integer)." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:249 -msgid "" -"You can further describe the expected function output using `->`. Below " -"the output of the function is also an int." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:257 -msgid "Why use type hints" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:259 -msgid "Type hints:" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:261 -msgid "Make development and debugging faster," -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:262 -msgid "" -"Make it easier for a user to see the data format inputs and outputs of " -"methods and functions," -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:263 -msgid "" -"Support using static type checking tools such as [`mypy`](https://mypy-" -"lang.org/) which will check your code to ensure types are correct." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:265 -msgid "You should consider adding type hinting to your code if:" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:267 -msgid "Your package performs data processing," -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:268 -msgid "You use functions that require complex inputs" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:269 -msgid "" -"You want to lower the entrance barrier for new contributors to help you " -"with your code." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:271 -msgid "Beware of too much type hinting" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:274 -msgid "As you add type hints to your code consider that in some cases:" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:276 -msgid "" -"If you have a complex code base, type hints may make code more difficult " -"to read. This is especially true when a parameter’s input takes multiple " -"data types and you list each one." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:277 -msgid "" -"Writing type hints for simple scripts and functions that perform obvious " -"operations don't make sense." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:280 -msgid "Gradually adding type hints" -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:282 -msgid "" -"Adding type hints can take a lot of time. However, you can add type hints" -" incrementally as you work on your code." -msgstr "" - -#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:286 -msgid "" -"Adding type hints is also a great task for new contributors. It will help" -" them get to know your package's code and structure better before digging" -" into more complex contributions." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:1 -msgid "Create User Facing Documentation for your Python Package" -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:14 -msgid "Core components of user-facing Python package documentation" -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:15 -msgid "Below we break documentation into two broad types." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:17 -msgid "" -"**User-facing documentation** refers to documentation that describes the " -"way the tools within a package are broadly used in workflows. **API " -"documentation** refers to documentation of functions, classes, methods, " -"and attributes in your code and is written at a more granular level. This" -" documentation is what a user sees when they type `help(function-name)`." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:23 -msgid "" -"Your user-facing documentation for your Python package should include " -"several core components." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:26 -msgid "" -"**Documentation Website:** This refers to easy-to-read documentation that" -" helps someone use your package. This documentation should help users " -"both install and use your package." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:27 -msgid "" -"**Short Tutorials:** Your user-facing documentation should also include " -"[**short tutorials** that showcase core features of your package](create-" -"package-tutorials)." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:28 -msgid "" -"**Package Code / API documentation:** You package's functions, classes, " -"methods, and attributes (the API) should also be documented. API " -"documentation can be generated from " -"[docstrings](https://pandas.pydata.org/docs/development/contributing_docstring.html)" -" found in your code. Ideally, you have docstrings for all user-facing " -"functions, classes, and methods in your Python package. [We discuss code " -"documentation and docstrings in greater detail here.](document-your-code-" -"api-docstrings)" -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:32 -msgid "Write usable documentation" -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:34 -msgid "" -"User-facing documentation should be published on a easy-to-navigate " -"website. The documentation should be written keeping in mind that users " -"may not be developers or expert-level programmers. Rather, the language " -"that you use in your documentation should not be highly technical." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:39 -msgid "" -"To make the language of your documentation more accessible to a broader " -"audience:" -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:42 -msgid "Whenever possible, define technical terms and jargon." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:43 -msgid "Consider writing instructions for a high-school level reader." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:44 -msgid "" -"Include step-by-step code examples, tutorials or vignettes that support " -"getting started using your package." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:46 -msgid "Four elements of a good open source documentation landing page" -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:48 -msgid "" -"To make it easy for users to find what they need quickly, consider adding" -" quick links on your package's landing page to the following elements:" -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:52 -msgid "" -"**Getting started:** This section should provide the user with a quick " -"start for installing your package. A small example of how to use the " -"package is good to have here as well. Or you can link to useful tutorials" -" in the get started section." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:53 -msgid "" -"**About:** Describe your project, stating its goals and its " -"functionality." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:54 -msgid "" -"**Community:** Instructions for how to help and/or get involved. This " -"might include links to your issues (if that is where you let users ask " -"questions) or the discussion part of your GitHub repo. This section might" -" include a development guide for those who might contribute to your " -"package." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:55 -msgid "" -"**API Documentation:** This is the detailed project documentation. Here " -"you store documentation for your package's API including all user-facing " -"functions, classes, methods, and attributes as well as any additional " -"high level discussion that will help people use your package." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:58 -msgid "" -"Image showing the landing page for GeoPandas documentation which has 4 " -"sections including Getting started, Documentation, About GeoPandas, " -"Community." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:64 -msgid "" -"The documentation landing page of GeoPandas, a spatial Python library, " -"has the 4 element specified above. Notice that the landing page is simple" -" and directs users to each element using a Sphinx card." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:67 -msgid "" -"NOTE: in many cases you can include your **README** file and your " -"**CONTRIBUTING** files in your documentation given those files may have " -"some of the components listed above." -msgstr "" - -#: ../../documentation/write-user-documentation/get-started.md:71 -msgid "" -"You can include files in Sphinx using the include directive. Below is an " -"example of doing this using `myst` syntax." -msgstr "" - -#: ../../documentation/write-user-documentation/intro.md:1 -msgid "Writing user-facing documentation for your Python package" -msgstr "" - -#: ../../documentation/write-user-documentation/intro.md:3 -msgid "" -"This section walks you through best practices for with writing " -"documentation for your Python package." -msgstr "" - -#: ../../documentation/write-user-documentation/intro.md:6 -msgid "" -"We talk about the elements that you should consider adding to your " -"documentation, the different types of users who might read your " -"documentation and how to create tutorials for your package." -msgstr "" - -#: ../../documentation/write-user-documentation/intro.md:10 -msgid "" -"Here we also cover sphinx extensions that you can user to make " -"documentation easier such as:" -msgstr "" - -#: ../../documentation/write-user-documentation/intro.md:13 -msgid "" -"autodoc to automagically populate documentation for your code's " -"functions, classes, methods and attributes (API documentation) and" -msgstr "" - -#: ../../documentation/write-user-documentation/intro.md:15 -msgid "sphinx gallery for tutorials." -msgstr "" - diff --git a/locales/ja/LC_MESSAGES/index.po b/locales/ja/LC_MESSAGES/index.po deleted file mode 100644 index 6d662248..00000000 --- a/locales/ja/LC_MESSAGES/index.po +++ /dev/null @@ -1,484 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2024, pyOpenSci -# This file is distributed under the same license as the pyOpenSci Python -# Package Guide package. -# FIRST AUTHOR , 2024. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: ja\n" -"Language-Team: ja \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" - -#: ../../index.md:283 -msgid "Tutorials" -msgstr "" - -#: ../../index.md:289 -msgid "Packaging" -msgstr "" - -#: ../../index.md:139 ../../index.md:297 -msgid "Documentation" -msgstr "" - -#: ../../index.md:187 ../../index.md:305 -msgid "Tests" -msgstr "" - -#: ../../index.md:305 -msgid "Testing" -msgstr "" - -#: ../../index.md:1 -msgid "pyOpenSci Python Package Guide" -msgstr "" - -#: ../../index.md:3 -msgid "" -"We support the Python tools that scientists need to create open science " -"workflows." -msgstr "" - -#: ../../index.md:20 -msgid "" -"![GitHub release (latest by " -"date)](https://img.shields.io/github/v/release/pyopensci/python-package-" -"guide?color=purple&display_name=tag&style=plastic) " -"[![](https://img.shields.io/github/stars/pyopensci/python-package-" -"guide?style=social)](https://github.com/pyopensci/contributing-guide) " -"[![DOI](https://zenodo.org/badge/556814582.svg)](https://zenodo.org/badge/latestdoi/556814582)" -msgstr "" - -#: ../../index.md:20 -msgid "GitHub release (latest by date)" -msgstr "" - -#: ../../index.md:20 -msgid "DOI" -msgstr "" - -#: ../../index.md:27 -msgid "About this guide" -msgstr "" - -#: ../../index.md:29 -msgid "" -"Image with the pyOpenSci flower logo in the upper right hand corner. The " -"image shows the packaging lifecycle. The graphic shows a high level " -"overview of the elements of a Python package. the inside circle has 5 " -"items - user documentation, code/api, test suite, contributor " -"documentation, project metadata / license / readme. In the middle of the " -"circle is says maintainers and has a small icon with people. on the " -"outside circle there is an arrow and it says infrastructure." -msgstr "" - -#: ../../index.md:35 -msgid "This guide will help you:" -msgstr "" - -#: ../../index.md:37 -msgid "Learn how to create a Python package from start to finish" -msgstr "" - -#: ../../index.md:38 -msgid "Understand the broader Python packaging tool ecosystem" -msgstr "" - -#: ../../index.md:39 -msgid "Navigate and make decisions around tool options" -msgstr "" - -#: ../../index.md:40 -msgid "Understand all of the pieces of creating and maintaining a Python package" -msgstr "" - -#: ../../index.md:42 -msgid "" -"You will also find best practice recommendations and curated lists of " -"community resources surrounding packaging and package documentation." -msgstr "" - -#: ../../index.md:46 -msgid "Todo" -msgstr "" - -#: ../../index.md:47 -msgid "TODO: change the navigation of docs to have a" -msgstr "" - -#: ../../index.md:49 -msgid "user documentation contributor / maintainer documentation" -msgstr "" - -#: ../../index.md:51 -msgid "development guide" -msgstr "" - -#: ../../index.md:52 -msgid "contributing guide" -msgstr "" - -#: ../../index.md:54 -msgid "Community docs" -msgstr "" - -#: ../../index.md:55 -msgid "readme, coc, license" -msgstr "" - -#: ../../index.md:57 -msgid "Publish your docs" -msgstr "" - -#: ../../index.md:59 -msgid "_new_ Tutorial Series: Create a Python Package" -msgstr "" - -#: ../../index.md:61 -msgid "" -"The first round of our community-developed, how to create a Python " -"package tutorial series for scientists is complete! Join our community " -"review process or watch development of future tutorials in our [Github " -"repo here](https://github.com/pyOpenSci/python-package-guide)." -msgstr "" - -#: ../../index.md:71 -msgid "✿ Create a Package Tutorials ✿" -msgstr "" - -#: ../../index.md:75 -msgid "[What is a Python package?](/tutorials/intro)" -msgstr "" - -#: ../../index.md:76 -msgid "[Make your code installable](/tutorials/installable-code)" -msgstr "" - -#: ../../index.md:77 -msgid "[Publish your package to (test) PyPI](/tutorials/publish-pypi)" -msgstr "" - -#: ../../index.md:78 -msgid "[Publish your package to conda-forge](/tutorials/publish-conda-forge)" -msgstr "" - -#: ../../index.md:83 -msgid "✿ Package Metadata Tutorials ✿" -msgstr "" - -#: ../../index.md:87 -msgid "[How to add a README file](/tutorials/add-readme)" -msgstr "" - -#: ../../index.md:88 -msgid "" -"[How to add metadata to a pyproject.toml file for publication to " -"PyPI.](/tutorials/pyproject-toml.md)" -msgstr "" - -#: ../../index.md:93 -msgid "✿ Packaging Tool Tutorials ✿" -msgstr "" - -#: ../../index.md:97 -msgid "[Introduction to Hatch](/tutorials/get-to-know-hatch)" -msgstr "" - -#: ../../index.md:102 -msgid "Python Packaging for Scientists" -msgstr "" - -#: ../../index.md:104 -msgid "" -"Learn about Python packaging best practices. You will also get to know " -"the the vibrant ecosystem of packaging tools that are available to help " -"you with your Python packaging needs." -msgstr "" - -#: ../../index.md:113 -msgid "✨ Create your package ✨" -msgstr "" - -#: ../../index.md:117 -msgid "[Package file structure](/package-structure-code/python-package-structure)" -msgstr "" - -#: ../../index.md:118 -msgid "" -"[Package metadata / pyproject.toml](package-structure-code/pyproject-" -"toml-python-package-metadata.md)" -msgstr "" - -#: ../../index.md:119 -msgid "" -"[Build your package (sdist / wheel)](package-structure-code/python-" -"package-distribution-files-sdist-wheel.md)" -msgstr "" - -#: ../../index.md:120 -msgid "[Declare dependencies](package-structure-code/declare-dependencies.md)" -msgstr "" - -#: ../../index.md:121 -msgid "" -"[Navigate the packaging tool ecosystem](package-structure-code/python-" -"package-build-tools.md)" -msgstr "" - -#: ../../index.md:122 -msgid "" -"[Non pure Python builds](package-structure-code/complex-python-package-" -"builds.md)" -msgstr "" - -#: ../../index.md:127 -msgid "✨ Publish your package ✨" -msgstr "" - -#: ../../index.md:131 -msgid "" -"Gain a better understanding of the Python packaging ecosystem Learn about" -" best practices for:" -msgstr "" - -#: ../../index.md:134 -msgid "" -"[Package versioning & release](/package-structure-code/python-package-" -"versions.md)" -msgstr "" - -#: ../../index.md:135 -msgid "" -"[Publish to PyPI & Conda-forge](/package-structure-code/publish-python-" -"package-pypi-conda.md)" -msgstr "" - -#: ../../index.md:148 -msgid "✨ Write The Docs ✨" -msgstr "" - -#: ../../index.md:151 -msgid "" -"[Create documentation for your users](/documentation/write-user-" -"documentation/intro)" -msgstr "" - -#: ../../index.md:152 -msgid "" -"[Core files to include in your package repository](/documentation" -"/repository-files/intro)" -msgstr "" - -#: ../../index.md:153 -msgid "" -"[Write tutorials to show how your package is used](/documentation/write-" -"user-documentation/create-package-tutorials)" -msgstr "" - -#: ../../index.md:158 -msgid "✨ Developer Docs ✨" -msgstr "" - -#: ../../index.md:161 -msgid "" -"[Create documentation for collaborating developers](/documentation" -"/repository-files/contributing-file)" -msgstr "" - -#: ../../index.md:162 -msgid "" -"[Write a development guide](/documentation/repository-files/development-" -"guide)" -msgstr "" - -#: ../../index.md:167 -msgid "✨ Document For A Community ✨" -msgstr "" - -#: ../../index.md:170 -msgid "" -"[Writing a README file](/documentation/repository-files/readme-file-best-" -"practices)" -msgstr "" - -#: ../../index.md:171 -msgid "" -"[Set norms with a Code of Conduct](/documentation/repository-files/code-" -"of-conduct-file)" -msgstr "" - -#: ../../index.md:172 -msgid "[License your package](/documentation/repository-files/license-files)" -msgstr "" - -#: ../../index.md:177 -msgid "✨ Publish Your Docs ✨" -msgstr "" - -#: ../../index.md:180 -msgid "[How to publish your docs](/documentation/hosting-tools/intro)" -msgstr "" - -#: ../../index.md:181 -msgid "[Using Sphinx](/documentation/hosting-tools/intro)" -msgstr "" - -#: ../../index.md:182 -msgid "" -"[Markdown, MyST, and ReST](/documentation/hosting-tools/myst-markdown-" -"rst-doc-syntax)" -msgstr "" - -#: ../../index.md:183 -msgid "" -"[Host your docs on Read The Docs or Github Pages](/documentation/hosting-" -"tools/publish-documentation-online)" -msgstr "" - -#: ../../index.md:189 -msgid "" -"*We are actively working on this section. [Follow development " -"here.](https://github.com/pyOpenSci/python-package-guide)*" -msgstr "" - -#: ../../index.md:197 -msgid "✨ Tests for your Python package ✨" -msgstr "" - -#: ../../index.md:200 -msgid "[Intro to testing](tests/index.md)" -msgstr "" - -#: ../../index.md:201 -msgid "[Write tests](tests/write-tests)" -msgstr "" - -#: ../../index.md:202 -msgid "[Types of tests](tests/test-types)" -msgstr "" - -#: ../../index.md:207 -msgid "✨ Run your tests ✨" -msgstr "" - -#: ../../index.md:210 -msgid "[Run tests locally](tests/run-tests)" -msgstr "" - -#: ../../index.md:211 -msgid "[Run tests in CI](tests/tests-ci)" -msgstr "" - -#: ../../index.md:215 -msgid "Contributing" -msgstr "" - -#: ../../index.md:225 -msgid "✨ Code style & Format ✨" -msgstr "" - -#: ../../index.md:230 -msgid "[Code style](package-structure-code/code-style-linting-format.md)" -msgstr "" - -#: ../../index.md:235 -msgid "✨ Want to contribute? ✨" -msgstr "" - -#: ../../index.md:240 -msgid "" -"We welcome contributions to this guide. Learn more about how you can " -"contribute." -msgstr "" - -#: ../../index.md:246 -msgid "" -"xkcd comic showing a stick figure on the ground and one in the air. The " -"one on the ground is saying. `You're flying! how?` The person in the air" -" replies `Python!` Below is a 3 rectangle comic with the following text " -"in each box. box 1 - I learned it last night. Everything is so simple. " -"Hello world is just print hello world. box 2 - the person on the ground " -"says - come join us programming is fun again. it's a whole new world. But" -" how are you flying? box 3 - the person flying says - i just typed import" -" antigravity. I also sampled everything in the medicine cabinet. But i " -"think this is the python. the person on the ground is saying - that's it?" -msgstr "" - -#: ../../index.md:252 -msgid "A community-created guidebook" -msgstr "" - -#: ../../index.md:254 -msgid "" -"Every page in this guidebook goes through an extensive community review " -"process. To ensure our guidebook is both beginner-friendly and accurate, " -"we encourage reviews from a diverse set of pythonistas and scientists " -"with a wide range of skills and expertise." -msgstr "" - -#: ../../index.md:257 -msgid "View guidebook contributors" -msgstr "" - -#: ../../index.md:265 -msgid "Who this guidebook is for" -msgstr "" - -#: ../../index.md:267 -msgid "" -"This guidebook is for anyone interested in learning more about Python " -"packaging. It is beginner-friendly and will provide:" -msgstr "" - -#: ../../index.md:269 -msgid "Beginning-to-end guidance on creating a Python package." -msgstr "" - -#: ../../index.md:270 -msgid "" -"Resources to help you navigate the Python packaging ecosystem of tools " -"and approaches to packaging." -msgstr "" - -#: ../../index.md:271 -msgid "" -"A curated list of resources to help you get your package into documented," -" usable and maintainable shape." -msgstr "" - -#: ../../index.md:273 -msgid "Where this guide is headed" -msgstr "" - -#: ../../index.md:275 -msgid "" -"If you have ideas of things you'd like to see here clarified in this " -"guide, [we invite you to open an issue on " -"GitHub.](https://github.com/pyOpenSci/python-package-guide/issues)." -msgstr "" - -#: ../../index.md:278 -msgid "" -"If you have questions about our peer review process or packaging in " -"general, you are welcome to use our [pyOpenSci Discourse " -"forum](https://pyopensci.discourse.group/)." -msgstr "" - -#: ../../index.md:280 -msgid "" -"This is a living guide that is updated as tools and best practices evolve" -" in the Python packaging ecosystem. We will be adding new content over " -"the next year." -msgstr "" - diff --git a/locales/ja/LC_MESSAGES/package-structure-code.po b/locales/ja/LC_MESSAGES/package-structure-code.po deleted file mode 100644 index e409630c..00000000 --- a/locales/ja/LC_MESSAGES/package-structure-code.po +++ /dev/null @@ -1,5302 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2024, pyOpenSci -# This file is distributed under the same license as the pyOpenSci Python -# Package Guide package. -# FIRST AUTHOR , 2024. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: ja\n" -"Language-Team: ja \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" - -#: ../../package-structure-code/code-style-linting-format.md:1 -msgid "Python Package Code Style, Format and Linters" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:3 -#: ../../package-structure-code/publish-python-package-pypi-conda.md:12 -msgid "Take Aways" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:5 -msgid "pyOpenSci requires authors to follow PEP 8 code format guidelines" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:6 -msgid "" -"Setting up a code formatters like Black and isort will help you enforce " -"PEP 8 style guidelines and also consistent, readable code format" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:7 -msgid "Some commonly used tools are: Black, Isort, flake8, Ruff" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:8 -msgid "" -"You can also setup pre-commit hooks which will run code formatters " -"locally each time you make a commit." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:10 -msgid "" -"[precommit.ci](https://pre-commit.ci/) is a bot that you can add to your " -"GitHub repository. It will automagically apply code format to every PR " -"using the tools specified in your pre-commit-config.yaml file. It can " -"save significant time and make contributions easier for new contributors." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:11 -msgid "" -"Automation is good! By making code quality tools care of your code, you " -"can focus on structural and high values tasks." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:14 -msgid "" -"Consistent code format and style is useful to both your package and " -"across the scientific Python ecosystem because using similar formats " -"makes code easier to read." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:18 -msgid "" -"For instance, if you saw a sentence like this one without any spaces, or " -"punctuation, it would take your brain longer to process it." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:25 -msgid "" -"pyOpenSci peer review process requires that you to follow standard " -"[Python PEP 8 format rules](https://peps.python.org/pep-0008/) as closely" -" as you can." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:29 -msgid "" -"pyOpenSci doesn't require you to use a specific code format tool. " -"However, we do look for consistency and readability in code style. Below " -"you will find a discussion of:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:33 -msgid "The benefits of using linters and code format tools in your workflow" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:34 -msgid "Some commonly used tools in the scientific Python space" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:35 -msgid "" -"Setting up pre-commit hooks and the pre-commit.ci bot to make using code " -"format tools in daily workflows and in pull requests on GitHub easier." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:38 -msgid "Use a code format tool (or tools) to make your life easier" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:40 -msgid "" -"We suggest that you use a code format tool, or a set of format tools, " -"because manually applying all of the PEP 8 format specifications is both " -"time consuming for maintainers and can be a road block for potential new " -"contributors. Code formatters will automagically reformat your code for " -"you, adhering to PEP 8 standards and applying consistent style decisions " -"throughout." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:46 -msgid "Setting up a code format suite of tools will:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:48 -msgid "Save you and your maintainer team time in fixing PEP 8 inconsistencies." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:49 -msgid "Ensure that format and style is consistent across your entire code-base." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:50 -msgid "" -"Avoid lengthy discussions with contributors and other maintainers about " -"personalized code format preferences during reviews." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:52 -msgid "" -"Avoid pure visual edits in the code base so that code reviews focus on " -"added value" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:54 -msgid "" -"Many packages use a suite of tools to apply code format rules, taking the" -" work out of manually implementing code format requirements." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:57 -msgid "" -"Consistent code format across packages within the (scientific) Python " -"ecosystem, will also broadly make code easier to scan, understand and " -"contribute to." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:60 -msgid "Linting vs format and style" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:62 -msgid "Before we dive in let's get a few definitions out of the way." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:64 -msgid "Code Linting" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:66 -msgid "" -"A code linter is a tool that will review your code and identify errors or" -" issues. A linter typically does not modify your code. It will tell you " -"what the error is and on what line it was discovered. Flake8, discussed " -"below, is an example of a commonly-used code linter." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:71 -msgid "Code Formatters (and stylers)" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:73 -msgid "" -"Code formatters will reformat your code for you. Python focused code " -"formatters often follow PEP 8 standards. However, they also make " -"stylistic decisions about code consistency." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:77 -msgid "" -"Black is an example of a commonly-used code formatter. Black both applies" -" PEP 8 standards while also making decisions about things like consistent" -" use of double quotes for strings, and spacing of items in lists." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:81 -msgid "You will learn more about Black below." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:83 -msgid "Code linting, formatting and styling tools" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:85 -msgid "Black" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:87 -msgid "" -"[Black](https://black.readthedocs.io/en/stable/) is a code formatter. " -"Black will automagically (and _unapologetically_) fix spacing issues and " -"ensure code format is consistent throughout your package. Black also " -"generally adheres to PEP 8 style guidelines with some exceptions. A few " -"examples of those exceptions are below:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:93 -msgid "" -"Black defaults to a line length of 88 (79 + 10%) rather than the 79 " -"character `PEP 8` specification. However, line length is a setting can be" -" manually overwritten in your Black configuration." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:94 -msgid "Black will not adjust line length in your comments or docstrings." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:95 -msgid "" -"This tool will not review and fix import order (you need `isort` or " -"`ruff` to do that - see below)." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:98 -msgid "" -"If you are interested in seeing how Black will format your code, you can " -"use the [Black playground](https://black.vercel.app/)" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:102 -msgid "" -"Using a code formatter like Black will leave you more time to work on " -"code function rather than worry about format." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:105 -msgid "Flake8" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:107 -msgid "" -"To adhere to Python `pep8` format standards, you might want to add " -"[flake8](https://flake8.pycqa.org/en/latest/) to your code format " -"toolbox." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:111 -msgid "flake8 will:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:113 -msgid "" -"Flag every line in your code that extends beyond 79 characters (including" -" those in docstrings and comments)" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:114 -msgid "" -"Flag spacing issues that conflict with PEP 8 guidelines such as missing " -"spaces after commas" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:116 -msgid "" -"Flake8 also flags unused imports and unused declared variables in your " -"modules." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:119 -msgid "" -"Below you can see the output of running `flake8 filename.py` at the " -"command line for a Python file within a package called `stravalib`." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:123 -msgid "The line length standard for PEP 8 is 79 characters." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:125 -msgid "" -"Notice that flake8 returns a list of issues that it found in the model.py" -" module on the command line. The Python file itself is not modified. " -"Using this output, you can fix each issue line by line manually." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:140 -msgid "Isort" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:142 -msgid "" -"Python imports refer to the Python packages that a module in your package" -" requires. Imports should always be located at the top of each Python " -"module in your package." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:146 -msgid "" -"[PEP 8 has specific standards for the order of these " -"imports](https://peps.python.org/pep-0008/#imports). These standards are " -"listed below:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:148 -msgid "Imports should be grouped in the following order:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:150 -msgid "Standard library imports." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:151 -msgid "Related third party imports." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:152 -msgid "Local application/library specific imports." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:154 -msgid "" -"While `flake8` will identify unused imports in your code, it won't fix or" -" identify issues with the order of package imports." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:157 -msgid "" -"`isort` will identify where imports in your code are out of order. It " -"will then modify your code, automatically reordering all imports. This " -"leaves you with one less thing to think about when cleaning up your code." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:162 -msgid "Example application of isort" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:164 -msgid "Code imports before `isort` is run:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:166 -msgid "" -"Below, the `pandas` is a third party package, `typing` is a core `Python`" -" package distributed with `Python`, and `examplePy.temperature` is a " -"first-party module which means it belongs to the same package as the file" -" doing the import. Also notice that there are no spaces in the imports " -"listed below." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:176 -msgid "From the project root, run:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:182 -msgid "Python file `temporal.py` imports after `isort` has been run" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:189 -msgid "Ruff" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:191 -msgid "" -"[Ruff](https://docs.astral.sh/ruff/) is a new addition to the code " -"quality ecosystem, gaining some traction since its release. `ruff` is " -"both a linter and a code formatter for Python, aiming to replace several " -"tools behind a single interface. As such, `ruff` can be used at a " -"replacement of all other tools mentioned here, or in complement to some " -"of them." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:197 -msgid "" -"`ruff` has some interesting features that distinguish it from other " -"linters:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:199 -msgid "Linter configuration in `pyproject.toml`" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:200 -msgid "Several hundred rules included, many of which are automatically fixable" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:201 -msgid "" -"Rules explanation, see [F403](https://docs.astral.sh/ruff/rules" -"/undefined-local-with-import-star/) for an example" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:202 -msgid "" -"Fast execution time, makes a quick feedback loop possible even on large " -"projects." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:204 -msgid "" -"Here is a simple configuration to get started with `ruff`. It would go " -"into your `pyproject.toml`:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:212 -msgid "" -"Depending on your project, you might want to add the following to sort " -"imports correctly:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:219 -msgid "How to use code formatter in your local workflow" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:221 -msgid "Linters, code formatters and your favorite coding tools" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:223 -msgid "" -"Linters can be run as a command-line tool as shown above. They also can " -"be run within your favorite coding tool (e.g. VScode, pycharm, etc). For " -"example, you might prefer to have tools like Black and isort run when you" -" save a file. In some editors you can also setup shortcuts that run your " -"favorite code format tools on demand." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:229 -msgid "Use pre-commit hooks to run code formatters and linters on commits" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:231 -msgid "You can also setup a `pre-commit hook` in your Python package repository." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:233 -msgid "" -"A pre-commit hook is a tool that allows an action (or actions) to be " -"triggered when you apply a commit to your git repository." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:236 -msgid "Pre-commit hook example workflow" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:238 -msgid "The precommit workflow looks like this: You type and run:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:241 -msgid "`git commit -m \"message here\"` at the command line" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:243 -msgid "" -"Once you hit return, pre-commit will run any tools that you have " -"configured in a **.pre-commit-config.yaml** file." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:245 -msgid "" -"If the tools configured in the pre-commit hook run successfully without " -"making changes or finding errors in your code, the commit will be applied" -" to the repository." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:249 -msgid "" -"If the tools configured in the hook find errors in your files, the commit" -" will NOT be applied to the repository. Remember from the discussion " -"above that a code formatter like Black will run and reformat your code. A" -" linter like _flake8_ will provide you with some output that details " -"where there are syntax issues in your code. You will then need to fix " -"those issues, manually." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:256 -msgid "" -"Once all of the fixes are applied you can re-add (stage) the files to be " -"commit. And re-run your commit." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:260 -msgid "Diagram showing the steps of a pre-commit workflow from left to right." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:262 -msgid "" -"The pre-commit workflow begins with you adding files that have changes to" -" be staged in git. Next, you'd run git commit. when you run git commit, " -"the pre-commit hooks will then run. In this example, Black, the code " -"formatter and flake8, a linter both run. If all of the files pass Black " -"and flake8 checks, then your commit will be recorded. If they don't, the " -"commit is canceled. You will have to fix any flake8 issues, and then re-" -"add / stage the files to be committed. [_Image " -"Source_](https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-" -"using-black-and-flake8/*)" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:275 -msgid "" -"If have a Python code-base and multiple maintainers actively working on " -"the code, and you intend to run a tool like Black, be sure to coordinate " -"across your team. An initial commit that applies Black to your entire " -"package will likely change a significant amount of your code. This could " -"lead to merge conflicts on open and new PR's before the new changes are " -"merged." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:282 -msgid "General pre commit checks" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:284 -msgid "" -"In addition to calling tools, Pre-commit also has a suite of [built in " -"format hooks](https://github.com/pre-commit/pre-commit-hooks#hooks-" -"available) that you can call. Some, such as trailing-whitespace can be " -"also useful to add to your pre-commit workflow to ensure clean, " -"streamlined code files." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:289 -msgid "" -"An example pre-commit-config.yaml file is below with examples of how this" -" is all setup." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:292 -msgid "Pre-commit.ci" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:294 -msgid "" -"[Pre-commit.ci](https://pre-commit.ci) is a bot that may become your new " -"best friend. This bot, when setup on a repo can be configured to do the " -"following:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:297 -msgid "It will check every pull request using all of the pre-commit hook setting" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:298 -msgid "" -"If you wish, it will also submit a pull request to your repo with pre-" -"commit fixes, saving you, and new contributors the time of reformatting a" -" pr that has format issues." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:301 -msgid "You can also call the bot on any pull request to run / and fix the code." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:303 -msgid "" -"The pre-commit.ci bot uses the same pre-commit-config.yaml file that you " -"use to setup pre-commit locally." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:306 -msgid "Setting up a bot like this can be valuable because:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:308 -msgid "" -"It can make is easier for maintainers as they no longer have to worry at " -"allows about fixing code format. The bot will do the work for them." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:310 -msgid "" -"It can make it easier for new comers as they never have to setup pre-" -"commit locally or worry about linting their code. They can even make " -"small fixes to the code directly on GitHub without worry." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:312 -msgid "Setting up a git pre-commit hook" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:314 -msgid "To setup pre-commit locally, you need to do 3 things:" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:316 -msgid "" -"Install pre-commit (and include it as a development requirement in your " -"repository)" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:326 -msgid "" -"Create a .pre-commit-config.yaml file in the root of your package " -"directory." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:328 -msgid "" -"Below is an example **.pre-commit-cofig.yaml** file that can be used to " -"setup the pre-commit hook and the pre-commit.ci bot if you chose to " -"implement that too." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:336 -msgid "" -"This file specifies a hook that will be triggered automatically before " -"each `git commit`, in this case, it specifies a `flake8` using version " -"`6.0.0`." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:339 -msgid "" -"Install your pre-commit hook(s) using `pre-commit install`. This will " -"install all of the hooks specified in the pre-commit yaml file into your " -"environment." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:341 -msgid "" -"Once you have done the above, you are ready to start working on your " -"code. Pre-commit will run every time you run `git commit`." -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:344 -msgid "Summary" -msgstr "" - -#: ../../package-structure-code/code-style-linting-format.md:346 -msgid "" -"pyOpenSci suggests setting up a linter and a code styler for your " -"package, regardless of whether you use pre-commit hooks, CI or other " -"infrastructure to manage code format. Setting up these tools will give " -"you automatic feedback about your code's structure as you (or a " -"contributor) write it. And using a tool like black that format code for " -"you, reduce effort that you need to make surrounding decisions around " -"code format and style." -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:1 -msgid "Complex Python package builds" -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:3 -msgid "" -"This guide is focused on packages that are either pure-python or that " -"have a few simple extensions in another language such as C or C++." -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:6 -msgid "" -"In the future, we want to provide resources for packaging workflows that " -"require more complex builds. If you have questions about these types of " -"package, please [add a question to our " -"discourse](https://pyopensci.discourse.group/) or open an [issue about " -"this guide specifically in the GitHub repo for this " -"guide](https://github.com/pyOpenSci/python-package-guide/issues). There " -"are many nuances to building and distributing Python packages that have " -"compiled extensions requiring non-Python dependencies at build time. For " -"an overview and thorough discussion of these nuances, please see [this " -"site.](https://pypackaging-native.github.io/)" -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:8 -msgid "Pure Python Packages vs. packages with extensions in other languages" -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:10 -msgid "" -"You can classify Python package complexity into three general categories." -" These categories can in turn help you select the correct package " -"frontend and backend tools." -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:14 -msgid "" -"**Pure-python packages:** these are packages that only rely on Python to " -"function. Building a pure Python package is simpler. As such, you can " -"chose a tool below that has the features that you want and be done with " -"your decision!" -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:16 -msgid "" -"**Python packages with non-Python extensions:** These packages have " -"additional components called extensions written in other languages (such " -"as C or C++). If you have a package with non-Python extensions, then you " -"need to select a build backend tool that allows additional build steps " -"needed to compile your extension code. Further, if you wish to use a " -"frontend tool to support your workflow, you will need to select a tool " -"that supports additional build setups. We suggest that you chose build " -"tool that supports custom build steps like Hatch." -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:18 -msgid "" -"**Python packages that have extensions written in different languages " -"(e.g. Fortran and C++) or that have non Python dependencies that are " -"difficult to install (e.g. GDAL)** These packages often have complex " -"build steps (more complex than a package with just a few C extensions for" -" instance). As such, these packages require tools such as [scikit-" -"build](https://scikit-build.readthedocs.io/en/latest/) or [meson-" -"python](https://mesonbuild.com/Python-module.html) to build. NOTE: you " -"can use meson-python with PDM." -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:21 -msgid "Mixing frontend and backend projects" -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:23 -msgid "" -"It is sometimes necessary or desirable to use a build frontend with an " -"alternative build-backend. This is because some frontends do not have a " -"default backend (`build`), and this choice is placed on the maintainer. " -"Other backends (`hatch`) have a preferred backend (`hatchling`) but allow" -" the maintainer to migrate to another, while some backends (`poetry`) " -"only work with a single backend (`poetry-core`). Refer to (#python-" -"package-build-tools) for more information about frontend and backend " -"compatibility." -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:29 -msgid "" -"In this packaging guide we recommend using `hatch` along with its " -"preferred backend `hatchling`. While this will be suitable for most " -"packages, an alternate backend may be used with Hatch if needed when " -"creating an extension module. A Python extension module is one that is " -"made up, either in part or entirely, of compiled code. In this case the " -"backend chosen (such as `meson-python`) must know how to compile the " -"extension language and bind it to Python. `hatchling` does not know how " -"to do this all on its own and must either make use of " -"[plugins](https://hatch.pypa.io/1.9/plugins/about/) or be replaced by a " -"backend that is already capable of building extension modules." -msgstr "" - -#: ../../package-structure-code/complex-python-package-builds.md:37 -msgid "" -"In order to use a different backend you will need to edit your project's " -"`pyproject.toml`. If you have a `pyproject.toml` generated by the `hatch`" -" command, or from following the packaging tutorial, you may have to make " -"a change like this" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:8 -#: ../../package-structure-code/declare-dependencies.md:375 -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:25 -msgid "Todo" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:10 -msgid "" -"keep this comment - https://github.com/pyOpenSci/python-package-" -"guide/pull/106#issuecomment-1844278487 in this file for now - jeremiah " -"did a nice inventory of common shells and whether they need quotes or " -"not. it's really comprehensive. but do we want it in the guide?? it's " -"really useful for more advanced users i think." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:12 -msgid "" -"Following this comment: https://github.com/pyOpenSci/python-package-" -"guide/pull/106#pullrequestreview-1766663571" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:15 -msgid "Jonny will add a section that talks about:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:17 -msgid "" -"Why you specify dependencies How to specify dependencies When you use " -"different specifiers" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:22 -msgid "Python Package Dependencies" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:24 -msgid "What is a package dependency?" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:26 -msgid "" -"A Python package dependency refers to an external package or software " -"that your Python project:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:29 -msgid "needs to function properly." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:30 -msgid "" -"requires if someone wants to develop / work on improving your package " -"locally or" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:31 -msgid "" -"requires if a user wants to add additional functionality (that is not " -"core) to your package" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:33 -msgid "" -"A dependency is not part of your project's codebase. It is a package or " -"software that is called within the code of your project or during " -"development of your package." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:37 -msgid "Understanding optional vs. required dependencies" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:38 -msgid "" -"You can think about dependencies as being either optional or required. If" -" they are required, they will be listed in the `[dependency] =` table of " -"your `pyproject.toml` file. If they are optional, they will be listed in " -"the `[optional.dependencies]` table of your `pyproject.toml`." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:40 -msgid "You will learn about both below." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:46 -msgid "" -"There are two broad groups of Python package dependencies: those that are" -" optional and those that are required. Required packages are those that a" -" user needs to use your package. Optional dependencies are packages a " -"user can chose to install to add functionality to your package. Within " -"those 2 groups, there are three use cases that you can think about. 1. " -"Core dependencies are **required** for a user to use your package. 2. " -"Development dependencies are optional and only needed if someone wants to" -" work on your package locally. 3. Finally feature dependencies are " -"optional and add additional functionality to your package. Not all " -"packages will have feature dependencies." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:51 -msgid "Required (or core) dependencies" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:53 -msgid "" -"Required dependencies are called directly within your package's code. On " -"this page we refer to these dependencies as **core dependencies** as they" -" are needed in order to run your package. You should place your core or " -"required dependencies in the `[dependency]=` table of your " -"`pyproject.toml` file." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:56 -#: ../../package-structure-code/declare-dependencies.md:147 -msgid "Optional dependencies" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:58 -msgid "" -"Optional dependencies dependencies can be optionally installed by users " -"depending upon their needs. There are two broad groups of optional " -"dependencies:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:61 -msgid "" -"**Development dependencies**: These are dependencies that are required to" -" support development of your package. They include tools to run tests " -"such as `pytest`, linters (like `flake8` and `ruff`) and code formatters " -"such as `black` and even automation tools such as `nox` or `tox` that run" -" tasks." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:63 -msgid "" -"**Feature dependencies:** These are dependencies that a user can chose to" -" install to add functionality to your package." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:65 -msgid "" -"When a Python project is installed, the Python package manager (either " -"`pip` or `conda`) installs your package's dependencies automatically. " -"This ensures that when you call a function in a specific dependency, it " -"is available in your user's environment." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:70 -msgid "Dependencies can be added to your pyproject.toml file" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:72 -msgid "" -"In the [pyproject.toml overview page](pyproject-toml-python-package-" -"metadata), you learned how to set up a **pyproject.toml** file with basic" -" metadata for your package. On this page, you will learn how to specify " -"different types of dependencies in your `pyproject.toml`." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:79 -msgid "How do you declare dependencies?" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:81 -msgid "" -"We recommend that you declare your dependencies using your " -"`pyproject.toml` file. This ensures that all of the metadata associated " -"with your package is declared in a single place, making it simpler for " -"users and contributors to understand your package infrastructure." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:86 -msgid "" -"Previously, it was common to use a `requirements.txt` file to declare " -"package dependencies. However in recent years, the ecosystem has moved to" -" storing this information in your **pyproject.toml** file. You may notice" -" however that some projects still maintain a `requirements.txt` file for " -"specific local development needs." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:92 -msgid "Other ways you may see packages storing dependencies" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:95 -msgid "" -"If a project contains extensions written in other languages, you may need" -" a `setup.py` file. Or you may contribute to a package that us using " -"`setup.cfg` for dependency declaration. [Learn more about this in the " -"setuptools " -"documentation](https://setuptools.pypa.io/en/latest/userguide/dependency_management.html" -"#declaring-required-dependency)" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:100 -msgid "Add required dependencies to your pyproject.toml file" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:102 -msgid "" -"Your core project dependencies need to be installed by a package manager " -"such as `pip` or `conda` when a user installs your package. You can add " -"those dependencies to the `dependencies` array located within the " -"`[project]` table of your **pyproject.toml** file. This looks something " -"like this:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:121 -msgid "" -"Ideally, you should only list the packages that are necessary to install " -"and use your package in the `[dependencies]` section. This minimizes the " -"number of additional packages that your users must install as well as the" -" number of packages that depend upon your package must also install." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:128 -msgid "" -"Remember that fewer dependencies to install reduces the likelihood of " -"version mismatches in user environments." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:131 -msgid "A dependency example" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:133 -msgid "" -"Let's pretend you have a package called `plotMe` that creates beautiful " -"plots of data stored in `numpy` arrays. To create your plots in the " -"`plotMe` package, you use the `seaborn` package to stylize our plots and " -"also `numpy` to process array formatted data." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:135 -msgid "In the example above, the plotMe package, depends upon two packages:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:137 -msgid "seaborn" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:138 -msgid "numpy" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:140 -msgid "" -"This means that in order for plotMe to work in a user's `environment` " -"when installed, you also need to ensure that they have both of those " -"required `dependencies` installed in their environment too." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:142 -msgid "" -"Declaring a dependency in your `pyproject.toml` file will ensure that it " -"is listed as a required dependency when your package is published to PyPI" -" and that a package manager (`pip` or `conda`) will automatically install" -" it into a user's environment alongside your package:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:144 -msgid "`python -m pip install plotMe`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:149 -msgid "" -"Optional dependencies for building your documentation, running your tests" -" and building your package's distribution files are often referred to as " -"development dependencies. These are the dependencies that a user needs to" -" work on your package locally and perform tasks such as:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:151 -msgid "running your test suite" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:152 -msgid "building your documentation" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:153 -msgid "linting and other code cleanup tools" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:155 -msgid "" -"These dependencies are considered optional, because they are not required" -" to install and use your package. Feature dependencies are considered " -"optional and should also be placed in the `[optional.dependencies]` " -"table." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:158 -msgid "" -"Optional dependencies can be stored in an `[optional.dependencies]` table" -" in your **pyproject.toml** file." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:161 -msgid "" -"It's important to note that within the `[optional.dependencies]` table, " -"you can store additional, optional dependencies within named sub-groups. " -"This is a different table than the dependencies array located within the " -"`[project]` table discussed above which contains a single array with a " -"single list of required packages." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:163 -msgid "Create optional dependency groups" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:165 -msgid "To declare optional dependencies in your **pyproject.toml** file:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:167 -msgid "Add a `[optional.dependencies]` table to your **pyproject.toml** file." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:168 -msgid "Create named groups of dependencies using the syntax:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:170 -msgid "`group-name = [\"dep1\", \"dep2\"]`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:172 -msgid "Installing packages from GitHub / Gitlab" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:175 -msgid "" -"If you have dependencies that need to be installed directly from GitHub " -"using a `git+https` installation approach, you can do so using the " -"pyproject.toml file like so:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:185 -msgid "" -"IMPORTANT: For security reasons, if your library depends on a GitHub-" -"hosted project, you will need to point to a specific commit/tag/hash of " -"that repository in order to upload your project to PyPI" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:190 -msgid "" -"Below we've created three sets of optional development dependencies " -"named: tests, docs and lint. We've also added a set of feature " -"dependencies." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:213 -msgid "Additional dependency resources" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:215 -msgid "" -"[Learn more: View PyPA's overview of declaring optional " -"dependencies](https://packaging.python.org/en/latest/specifications" -"/declaring-project-metadata/#dependencies-optional-dependencies)" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:217 -msgid "" -"[Dependency " -"specifiers](https://packaging.python.org/en/latest/specifications" -"/dependency-specifiers/)" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:221 -msgid "Install dependency groups" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:226 -msgid "" -"Diagram showing a ven diagram with three sections representing the " -"dependency groups listed above - docs feature and tests. In the center it" -" says your-package and lists the core dependencies of that package " -"seaborn and numpy. To the right are two arrows. The first shows the " -"command python - m pip install your-package. it them shows how installing" -" your package that way installs only the package and the two core " -"dependencies into a users environment. Below is a second arrow with " -"python -m pip install youPackage[tests]. This leads to an environment " -"with both the package dependencies - your-package, seaborn and numpy and " -"also the tests dependencies including pytest and pytest-cov" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:228 -msgid "" -"When a user installs your package locally using python -m pip install " -"your-package only your package and it's core dependencies get installed. " -"When they install your package `[tests]` pip will install both your " -"package and its core dependencies plus any of the dependencies listed " -"within the tests array of your `[optional.dependencies]` table." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:231 -msgid "Using `python -m pip install` vs. `pip install`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:233 -msgid "" -"In all of the examples in this guide, you will notice we are calling " -"`pip` using the syntax:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:236 -msgid "`python -m pip`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:238 -msgid "" -"Calling pip using `python -m` ensures that the `pip` that you are using " -"to install your package comes from your current active Python " -"environment. We strongly suggest that you use this approach whenever you " -"call `pip` to avoid installation conflicts." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:242 -msgid "" -"To ensure this works as you want it to, activate your package's " -"development environment prior to installing anything using `pip`." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:246 -msgid "" -"You can install development dependencies using the groups that you " -"defined above using the syntax:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:249 -msgid "`python -m pip install \".[docs]\"`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:251 -msgid "Above you install:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:252 -msgid "dependencies needed for your documentation (`docs`)," -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:253 -msgid "required package dependencies in the `dependency` array and" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:254 -msgid "your package" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:256 -msgid "" -"using pip. Below you install your package, required dependencies and " -"optional test dependencies." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:259 -#: ../../package-structure-code/declare-dependencies.md:277 -msgid "`python -m pip install \".[tests]\"`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:261 -msgid "" -"You can install multiple dependency groups in the " -"`[optional.dependencies]` table using:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:263 -msgid "`python -m pip install \".[docs, tests, lint]\"`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:266 -msgid "For zsh shell users" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:270 -msgid "" -"There are different shell applications that you and your package " -"contributors might use." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:271 -msgid "zsh is the shell that comes by default on newer Mac OS computers" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:272 -msgid "Windows users may use a tool such as git bash" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:274 -msgid "" -"Some shells don't support unquoted brackets (`[tests]`) which is why we " -"add quotes to the command in this guide like this:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:279 -msgid "" -"In some cases you may see commands without the quotes in guidebooks or " -"contributing guides like the example below:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:282 -msgid "`python -m pip install your-package[tests]`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:284 -msgid "" -"Calling your-package[tests] without the double quotes will work on some " -"shells *but not all*." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:287 -msgid "Combining sets of dependencies" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:289 -msgid "" -"Above we reviewed how to install dependencies from your `pyproject.toml`." -" In some cases you may want to group sets of dependencies like so:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:302 -msgid "" -"The above allows you to install both the tests and docs dependency lists " -"using the command:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:305 -msgid "`python -m pip install \".[dev]\"`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:308 -msgid "When you install dependencies using the above syntax:" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:310 -msgid "`python -m pip install \".[tests, docs]\"`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:312 -msgid "`pip` will also install your package and its core dependencies." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:316 -msgid "Where does conda fit in?" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:319 -msgid "" -"The `pyproject.toml` file allows you to list any Python package published" -" on PyPI (or on GitHub/ GitLab) as a dependency. Once you create this " -"file, declare dependencies, [build your package](python-package-" -"distribution-files-sdist-wheel.md) and [publish your package to PyPI" -"](publish-python-package-pypi-conda.md), people can install both your " -"package and all of it's dependencies with one command." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:322 -msgid "`python -m pip install your-package`" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:324 -msgid "This works great if your package is pure-python (no other languages used)." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:326 -msgid "" -"Some packages, particularly in the scientific Python ecosystem, require " -"dependencies that are not written in Python. Conda was created to support" -" distribution of tools that have code written in both Python and " -"languages other than Python." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:329 -msgid "Support conda users with environment.yml files" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:331 -msgid "" -"The above workflow assumes that you want to publish your package on PyPI." -" And then you plan to publish to conda-forge (optionally), [by submitting" -" a recipe using grayskull](https://www.pyopensci.org/python-package-guide" -"/package-structure-code/publish-python-package-pypi-conda.html)." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:333 -msgid "" -"If you want to support conda users, you may want to also maintain a conda" -" environment that they can use to install your package. Maintaining a " -"conda environment will also help you test that your package installs as " -"you expect into a conda environment." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:336 -msgid "A note for conda users" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:339 -msgid "" -"If you use a conda environment for developing your tool, keep in mind " -"that when you install your package using `python -m pip install -e .` (or" -" using pip in general), dependencies will be installed from PyPI rather " -"than conda." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:341 -msgid "" -"Thus, if you are running a conda environment, installing your package in " -"\"editable\" mode risks dependency conflicts. This is particularly " -"important if you have a spatial package that requires geospatial system " -"libraries like GDAL or another system-level dependency." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:343 -msgid "" -"Alternatively, you can install your package using `python -m pip install " -"-e . --no-deps` to only install the package. And install the rest of your" -" dependencies using a conda environment file." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:346 -msgid "Dependencies in Read the Docs" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:348 -msgid "" -"Now that you have your dependencies specified in your project, you can " -"use them to support other workflows such as publishing to Read the Docs." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:350 -msgid "" -"[Read the Docs](https://readthedocs.org) is a documentation platform with" -" a continuous integration / continuous deployment service that " -"automatically builds and publishes your documentation." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:352 -msgid "" -"If you are using Read the Docs to build your documentation, then you may " -"need to install your dependencies using a **readthedocs.yaml** file." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:354 -msgid "" -"Below is an example of installing the **docs** section of your dependency" -" table in the pyproject.toml file within a readthedocs.yaml file." -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:366 -msgid "Read the Docs and Python packages" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:370 -msgid "" -"[Learn more about creating a `readthedocs.yaml` file here. " -"](https://docs.readthedocs.io/en/stable/config-file/index.html)" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:371 -msgid "" -"If you want to install dependencies using Poetry in Read the Docs, [you " -"can learn more here.](https://docs.readthedocs.io/en/stable/build-" -"customization.html#install-dependencies-with-poetry)" -msgstr "" - -#: ../../package-structure-code/declare-dependencies.md:376 -msgid "This is hidden. TO" -msgstr "" - -#: ../../package-structure-code/intro.md:163 -msgid "Intro" -msgstr "" - -#: ../../package-structure-code/intro.md:163 -msgid "Python package structure" -msgstr "" - -#: ../../package-structure-code/intro.md:163 -msgid "pyproject.toml Package Metadata" -msgstr "" - -#: ../../package-structure-code/intro.md:163 -msgid "Build Your Package" -msgstr "" - -#: ../../package-structure-code/intro.md:163 -msgid "Declare dependencies" -msgstr "" - -#: ../../package-structure-code/intro.md:163 -msgid "Package Build Tools" -msgstr "" - -#: ../../package-structure-code/intro.md:163 -msgid "Complex Builds" -msgstr "" - -#: ../../package-structure-code/intro.md:163 -msgid "Package structure & code style" -msgstr "" - -#: ../../package-structure-code/intro.md:177 -msgid "Publish with Conda / PyPI" -msgstr "" - -#: ../../package-structure-code/intro.md:177 -msgid "Package versions" -msgstr "" - -#: ../../package-structure-code/intro.md:177 -msgid "Code style" -msgstr "" - -#: ../../package-structure-code/intro.md:177 -msgid "Publishing a package" -msgstr "" - -#: ../../package-structure-code/intro.md:1 -msgid "Python package structure information" -msgstr "" - -#: ../../package-structure-code/intro.md:3 -msgid "" -"This section provides guidance on your Python package's structure, code " -"formats and style. It also reviews the various packaging tools that you " -"can use to support building and publishing your package." -msgstr "" - -#: ../../package-structure-code/intro.md:7 -msgid "" -"If you are confused by Python packaging, you are not alone! The good news" -" is there are some great modern packaging tools that ensure that you're " -"following best practices. Here, we review tool features and suggest tools" -" that might be best fitted for your workflow." -msgstr "" - -#: ../../package-structure-code/intro.md:19 -msgid "✨ 1. Package file structure ✨" -msgstr "" - -#: ../../package-structure-code/intro.md:23 -msgid "" -"src layout, flat layout and where should tests folders live? No matter " -"what your level of packaging knowledge is, this page will help you decide" -" upon a package structure that follows modern python best practices." -msgstr "" - -#: ../../package-structure-code/intro.md:28 -msgid "✨ 2. Learn about building your package ✨" -msgstr "" - -#: ../../package-structure-code/intro.md:32 -msgid "" -"To publish your Python package on PyPI, you will need to first build it. " -"The act of \"building\" refers to the process of placing your package " -"code and metadata into a format that can be published on PyPI. Learn more" -" about building your Python package." -msgstr "" - -#: ../../package-structure-code/intro.md:41 -msgid "✨ 4. Add metadata ✨" -msgstr "" - -#: ../../package-structure-code/intro.md:45 -msgid "" -"Learn how to add project metadata to your Python package to support both " -"filtering on PyPI and also the metadata that a package installer needs to" -" build and install your package." -msgstr "" - -#: ../../package-structure-code/intro.md:52 -msgid "✨ 3. What Python package tool should you use? ✨" -msgstr "" - -#: ../../package-structure-code/intro.md:56 -msgid "" -"Learn more about the suite of packaging tools out there. And learn which " -"tool might be best for you." -msgstr "" - -#: ../../package-structure-code/intro.md:62 -msgid "✨ 4. Publish to PyPI and Conda ✨" -msgstr "" - -#: ../../package-structure-code/intro.md:66 -msgid "" -"If you have a pure Python package, it's a straight forward process to " -"publish to both PyPI and then a Conda channel such as conda-forge. Learn " -"more here." -msgstr "" - -#: ../../package-structure-code/intro.md:73 -msgid "✨ 5. Setup package versioning ✨" -msgstr "" - -#: ../../package-structure-code/intro.md:77 -msgid "" -"Semver (numeric versioning) and Calver (versioning using the date) are 2 " -"common ways to version a package. Which one should you pick? Learn more " -"here." -msgstr "" - -#: ../../package-structure-code/intro.md:83 -msgid "✨ 6. Code style & linters ✨" -msgstr "" - -#: ../../package-structure-code/intro.md:87 -msgid "" -"Black, blue, flake8, Ruff - which tools can help you ensure your package " -"follows best practices for code format? Learn more about the options and " -"why this is important here." -msgstr "" - -#: ../../package-structure-code/intro.md:95 -msgid "" -"Figure showing a decision tree with the various packaging tool front-end " -"and back-end options." -msgstr "" - -#: ../../package-structure-code/intro.md:97 -msgid "" -"Diagram showing the various front-end build tools that you can select " -"from. See the packaging tools page to learn more about each tool." -msgstr "" - -#: ../../package-structure-code/intro.md:102 -msgid "" -"If you are considering submitting a package for peer review, have a look " -"at the bare-minimum [editor checks](https://www.pyopensci.org/software-" -"peer-review/how-to/editor-in-chief-guide.html#editor-checklist-template) " -"that pyOpenSci performs before a review begins. These checks are useful " -"to explore for both authors planning to submit a package to us for review" -" and for anyone who is just getting started with creating a Python " -"package." -msgstr "" - -#: ../../package-structure-code/intro.md:109 -msgid "What you will learn here" -msgstr "" - -#: ../../package-structure-code/intro.md:111 -msgid "In this section of our Python packaging guide, we:" -msgstr "" - -#: ../../package-structure-code/intro.md:113 -msgid "" -"Provide an overview of the options available to you when packaging your " -"tool." -msgstr "" - -#: ../../package-structure-code/intro.md:115 -msgid "" -"Suggest tools and approaches that both meet your needs and also support " -"existing standards." -msgstr "" - -#: ../../package-structure-code/intro.md:117 -msgid "" -"Suggest tools and approaches that will allow you to expand upon a " -"workflow that may begin as a pure Python tool and evolve into a tool that" -" requires addition layers of complexity in the packaging build." -msgstr "" - -#: ../../package-structure-code/intro.md:120 -msgid "" -"Align our suggestions with the most current, accepted [PEPs (Python " -"Enhancement Protocols)](https://peps.python.org/pep-0000/) and the " -"[Scientific Python community SPECs](https://scientific-" -"python.org/specs/)." -msgstr "" - -#: ../../package-structure-code/intro.md:123 -msgid "" -"In an effort to maintain consistency within our community, we also align " -"with existing best practices being implemented by developers of core " -"Scientific Python packages such as Numpy, SciPy and others." -msgstr "" - -#: ../../package-structure-code/intro.md:127 -msgid "Guidelines for pyOpenSci's packaging recommendations" -msgstr "" - -#: ../../package-structure-code/intro.md:129 -msgid "" -"The flexibility of the Python programming language lends itself to a " -"diverse range of tool options for creating a Python package. Python is so" -" flexible that it is one of the few languages that can be used to wrap " -"around other languages. The ability of Python to wrap other languages is " -"one the reasons you will often hear Python described as a [\"glue\" " -"language](https://numpy.org/doc/stable/user/c-info.python-as-glue.html)\"" -msgstr "" - -#: ../../package-structure-code/intro.md:135 -msgid "" -"If you are building a pure Python package, then your packaging setup can " -"be simple. However, some scientific packages have complex requirements as" -" they may need to support extensions or tools written in other languages " -"such as C or C++." -msgstr "" - -#: ../../package-structure-code/intro.md:139 -msgid "" -"To support the many different uses of Python, there are many ways to " -"create a Python package. In this guide, we suggest packaging approaches " -"and tools based on:" -msgstr "" - -#: ../../package-structure-code/intro.md:142 -msgid "" -"What we think will be best and easiest to adopt for those who are newer " -"to packaging." -msgstr "" - -#: ../../package-structure-code/intro.md:144 -msgid "Tools that we think are well maintained and documented." -msgstr "" - -#: ../../package-structure-code/intro.md:145 -msgid "" -"A shared goal of standardizing packaging approaches across this " -"(scientific) Python ecosystem." -msgstr "" - -#: ../../package-structure-code/intro.md:148 -msgid "" -"Here, we also try to align our suggestions with the most current, " -"accepted [Python community](https://packaging.python.org/en/latest/) and " -"[scientific community](https://scientific-python.org/specs/)." -msgstr "" - -#: ../../package-structure-code/intro.md:151 -msgid "Suggestions in this guide are not pyOpenSci review requirements" -msgstr "" - -#: ../../package-structure-code/intro.md:154 -msgid "" -"The suggestions for package layout in this section are made with the " -"intent of being helpful; they are not specific requirements for your " -"package to be reviewed and accepted into our pyOpenSci open source " -"ecosystem." -msgstr "" - -#: ../../package-structure-code/intro.md:158 -msgid "" -"Please check out our [package scope page](https://www.pyopensci.org" -"/software-peer-review/about/package-scope.html) and [review requirements " -"in our author guide](https://www.pyopensci.org/software-peer-review/how-" -"to/author-guide.html#) if you are looking for pyOpenSci's Python package " -"review requirements!" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:1 -msgid "Publishing Your Package In A Community Repository: PyPI or Anaconda.org" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:5 -msgid "" -"pyOpenSci requires that your package has an distribution that can be " -"installed from a public community repository such as PyPI or a conda " -"channel such as `bioconda` or `conda-forge` on Anaconda.org." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:9 -msgid "" -"Below you will learn more about the various publishing options for your " -"Python package." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:14 -msgid "" -"Installing packages in the same environment using both pip and conda can " -"lead to package conflicts." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:16 -msgid "" -"To minimize conflicts for users who may be using conda (or pip) to manage" -" local environments, consider publishing your package to both PyPI and " -"the conda-forge channel on Anaconda.org." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:18 -msgid "" -"Below you will learn more specifics about the differences between PyPI " -"and conda publishing of your Python package." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:24 -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:6 -msgid "" -"Image showing the progression of creating a Python package, building it " -"and then publishing to PyPI and conda-forge. You take your code and turn " -"it into distribution files (sdist and wheel) that PyPI accepts. then " -"there is an arrow towards the PyPI repository where ou publish both " -"distributions. From PyPI if you create a conda-forge recipe you can then " -"publish to conda-forge." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:26 -msgid "" -"Once you have published both package distributions (the source " -"distribution and the wheel) to PyPI, you can then publish to conda-forge." -" conda-forge requires a source distribution on PyPI in order to build " -"your package on conda-forge. You do not need to rebuild your package to " -"publish to conda-forge." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:29 -msgid "What is PyPI" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:31 -msgid "" -"[PyPI](https://pypi.org/) is an online Python package repository that you" -" can use to both find and install and publish your Python package. There " -"is also a test PyPI repository where you can test publishing your package" -" prior to the final publication on PyPI." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:36 -msgid "" -"Many if not most Python packages can be found on PyPI and are thus " -"installable using `pip`." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:38 -msgid "" -"The biggest different between using pip and conda to install a package is" -" that conda can install any package regardless of the language(s) that it" -" is written in. Whereas `pip` can only install Python packages." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:43 -msgid "Click here for a tutorial on publishing your package to PyPI." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:52 -msgid "" -"On the package build page, we discussed the [two package distribution " -"types that you will create when making a Python package](python-package-" -"distribution-files-sdist-wheel): SDist (packaged as a .tar.gz or .zip) " -"and Wheel (.whl) which is really a zip file. Both of those file " -"\"bundles\" will be published on PyPI when you use [a standard build tool" -"](python-package-build-tools) to build your package." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:60 -msgid "What is conda and Anaconda.org?" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:62 -msgid "" -"conda is an open source package and environment management tool. conda " -"can be used to install tools from the [Anaconda " -"repository](https://repo.anaconda.com/)." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:66 -msgid "" -"Anaconda.org contains public and private repositories for packages. These" -" repositories are known as channels (discussed below)." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:69 -msgid "A brief history of conda's evolution" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:72 -msgid "" -"The conda ecosystem evolved years ago to provide support for, and " -"simplify the process of, managing software dependencies in scientific " -"Python projects." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:76 -msgid "" -"Many of the core scientific Python projects depend upon or wrap around " -"tools and extensions that are written in other languages, such as C++. In" -" the early stages of the scientific ecosystem's development, these non-" -"Python extensions and tools were not well supported on PyPI, making " -"publication difficult. In recent years there is more support for complex " -"builds that allow developers to bundle non-Python code into a Python " -"distribution using the [wheel distribution format](python-wheel)." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:78 -msgid "" -"Conda provides a mechanism to manage these dependencies and ensure that " -"the required packages are installed correctly." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:82 -msgid "" -"While conda was originally created to support Python packages, it is now " -"used across all languages. This cross-language support makes it easier " -"for some packages to include and have access to tools written in other " -"languages, such as C/C++ (gdal), Julia, or R. Creating an environment " -"that mixes all of these packages is usually easier and more consistent " -"with full-fledged package managers like conda." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:90 -msgid "conda channels" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:92 -msgid "" -"conda built packages are housed within repositories that are called " -"channels. The conda package manager can install packages from different " -"channels." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:95 -msgid "" -"There are several core public channels that most people use to install " -"packages using conda, including:" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:98 -msgid "" -"**defaults:** this is a channel managed by Anaconda. It is the version of" -" the Python packages that you will install if you install the Anaconda " -"Distribution. Anaconda (the company) decides what packages live on the " -"`defaults` channel." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:99 -msgid "" -"[**conda-forge:**](https://anaconda.org/conda-forge) this is a community-" -"driven channel that focuses on scientific packages. This channel is ideal" -" for tools that support geospatial data. Anyone can publish a package to " -"this channel." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:100 -msgid "" -"[**bioconda**](https://anaconda.org/bioconda): this channel focuses on " -"biomedical tools." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:102 -msgid "" -"**conda-forge** emerged as many of the scientific packages did not exist " -"in the `defaults` Anaconda channel." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:107 -msgid "" -"Graphic with the title Python package repositories. Below it says " -"Anything hosted on PyPI can be installed using pip install. Packaging " -"hosted on a conda channel can be installed using conda install. Below " -"that there are two rows. the top row says conda channels. next to it are " -"three boxes one with conda-forge, community maintained; bioconda and then" -" default - managed by the anaconda team. Below that there is a row that " -"says PyPI servers. PyPI - anyone can publish to PyPI. and test PyPI. a " -"testbed server for you to practice." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:109 -msgid "" -"Conda channels represent various repositories that you can install " -"packages from. Because conda-forge is community maintained, anyone can " -"submit a recipe there. PyPI is also a community maintained repository. " -"Anyone can submit a package to PyPI and test PyPI. Unlike conda-forge " -"there are no manual checks of packages submitted to PyPI." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:113 -msgid "conda channels, PyPI, conda, pip - Where to publish your package" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:115 -msgid "" -"You might be wondering why there are different package repositories that " -"can be used to install Python packages." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:118 -msgid "" -"And more importantly you are likely wondering how to pick the right " -"repository to publish your Python package." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:121 -msgid "The answer to both questions relates dependency conflicts." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:125 -msgid "" -"Image showing an XKCD comic that shows a web of Python environments and " -"tools and installations. At the bottom is says - My python environment " -"has become so degraded that my laptop has been declared a superfund site." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:127 -msgid "" -"Installing Python and Python packages from different repositories can " -"lead to environment conflicts where a version of on package doesn't work " -"with a version of another package. To keep your environments clean and " -"working, it's best to install packages from the same repository. So use " -"pip to install everything. Or use conda. If you can, try to avoid " -"installing package from both pip and conda into the same environment." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:135 -msgid "Managing Python package dependency conflicts" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:137 -msgid "" -"Python environments can encounter conflicts because Python tools can be " -"installed from different repositories. Broadly speaking, Python " -"environments have a smaller chance of dependency conflicts when the tools" -" are installed from the same package repository. Thus environments that " -"contain packages installed from both pip and conda are more likely to " -"yield dependency conflicts." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:144 -msgid "" -"Similarly installing packages from the default anaconda package mixed " -"with the conda-forge channel can also lead to dependency conflicts." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:146 -msgid "" -"Many install packages directly from conda `defaults` channel. However, " -"because this channel is managed by Anaconda, the packages available on it" -" are limited to those that Anaconda decides should be core to a stable " -"installation. The conda-forge channel was created to complement the " -"`defaults` channel. It allows anyone to submit a package to be published " -"in the channel . Thus, `conda-forge` channel ensures that a broad suite " -"of user-developed community packages can be installed from conda." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:150 -msgid "" -"Take-aways: If you can, publish on both PyPI and conda-forge to " -"accommodate more users of your package" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:152 -msgid "" -"The take-away here for maintainers is that if you anticipate users " -"wanting to use conda to manage their local environments (which many do), " -"you should consider publishing to both PyPI and the conda-forge channel " -"(_more on that below_)." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:157 -msgid "Additional resources" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:158 -msgid "" -"[learn more about why conda-forge was created, here](https://conda-" -"forge.org/docs/user/introduction.html)" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:160 -msgid "" -"[To learn more about conda terminology, check out their " -"glossary.](https://docs.conda.io/projects/conda/en/latest/glossary.html )" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:165 -msgid "How to submit to conda-forge" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:167 -msgid "" -"While pyOpenSci doesn't require you to add your package to conda-forge, " -"we encourage you to consider doing so!" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:170 -msgid "" -"Once your package is on PyPI, the process to add your package to conda-" -"forge is straight forward to do. [You can follow the detailed steps " -"provided by the conda-forge maintainer team.](https://conda-" -"forge.org/docs/maintainer/adding_pkgs.html)." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:175 -msgid "Click here for a tutorial on adding your package to conda-forge." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:182 -msgid "If you want a step by step tutorial, click here." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:185 -msgid "" -"Once your package is added, you will have a feedstock repository on " -"GitHub with your packages name" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:188 -msgid "" -"[Here is an example conda-forge feedstock for the pyOpenSci approved " -"package - movingpandas](https://github.com/conda-forge/movingpandas-" -"feedstock)" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:191 -msgid "Maintaining your conda-forge package repository" -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:193 -msgid "" -"Once your package is on the conda-forge channel, maintaining it is " -"simple. Every time that you push a new version of your package to PyPI, " -"it will kick off a continuous integration build that updates your package" -" in the conda-forge repository. Once that build is complete, you will get" -" a notification to review the update." -msgstr "" - -#: ../../package-structure-code/publish-python-package-pypi-conda.md:199 -msgid "" -"You can merge the pull request for that update once you are happy with " -"it. A ready-to-merge PR usually means ensuring that your project's " -"dependencies (known as runtime requirements) listed in the updated YAML " -"file found in the pull request match the PyPI metadata of the new " -"release." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:1 -msgid "Use a pyproject.toml file for your package configuration & metadata" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:12 -msgid "Important pyproject.toml take aways" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:16 -msgid "" -"There are only two tables that are required for an installable Python " -"package: **[build-system]** and **[project]**. The **[project]** table " -"stores your package's metadata." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:17 -msgid "" -"There are only two _required_ fields in the **[project]** table: " -"**name=** and **version=**." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:18 -msgid "" -"We suggest you add additional metadata to your `pyproject.toml` file as " -"it will make it easier for users to find your project on PyPI." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:19 -msgid "" -"When you are adding classifiers to the [project] table, only use valid " -"values from [PyPI’s classifier page](https://PyPI.org/classifiers/). An " -"invalid value here will raise an error when you build your package or " -"publish to PyPI." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:20 -msgid "" -"There is no specific order for tables in the `pyproject.toml` file. " -"However fields need to be placed within the correct table sections. For " -"example `requires =` always need to be associated with the **[build-" -"system]** table." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:21 -msgid "" -"**python-requires**: is important to have in your `pyproject.toml` file " -"as it helps pip install your package." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:27 -msgid "when these are published, remove this todo" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:36 -msgid "" -"Need help creating your pyproject.toml file? This tutorial will walk you" -" through the process." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:50 -msgid "" -"Click here if need help migrating from setup.py/setup.cfg to " -"pyproject.toml" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:60 -msgid "About the pyproject.toml file" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:62 -msgid "" -"Every modern Python package should include a `pyproject.toml` file. If " -"your project is pure Python and you're using a `setup.py` or `setup.cfg` " -"file to describe its metadata, you should consider migrating your " -"metadata and build information to a `pyproject.toml` file." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:64 -msgid "" -"If your project isn’t pure-python, you might still require a `setup.py` " -"file to build the non Python extensions. However, a `pyproject.toml` file" -" should still be used to store your project’s metadata." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:66 -msgid "What happened to setup.py & how do i migrate to pyproject.toml?" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:68 -msgid "" -"Prior to August 2017, Python package metadata was stored either in the " -"`setup.py` file or a `setup.cfg` file. In recent years, there has been a " -"shift to storing Python package metadata in a much more user-readable " -"`pyproject.toml` format. Having all metadata in a single file:" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:70 -msgid "simplifies package management," -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:71 -msgid "" -"allows you to use a suite of different [build " -"backends](https://www.pyopensci.org/python-package-guide/package-" -"structure-code/python-package-build-tools.html#build-back-ends) such as " -"(flit-core, hatchling, pdm-build), and" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:72 -msgid "aligns with modern best practices." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:79 -msgid "" -"The standard file that Python packages use to [specify build requirements" -" and metadata is called a " -"**pyproject.toml**](https://packaging.python.org/en/latest/specifications" -"/declaring-project-metadata/). Adding metadata, build requirements and " -"package dependencies to a **pyproject.toml** file replaces storing that " -"information in a setup.py or setup.cfg file." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:84 -msgid "About the .toml format" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:86 -msgid "" -"The **pyproject.toml** file is written in [TOML (Tom's Obvious, Minimal " -"Language) format](https://toml.io/en/). TOML is an easy-to-read structure" -" that is founded on key/value pairs. Each section in the " -"**pyproject.toml** file contains a `[table identifier]`. Below that table" -" identifier are key/value pairs that support configuration for that " -"particular table." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:90 -msgid "Below `[build-system]` is considered a table in the toml language." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:91 -msgid "Within the `build-system` table below `requires =` is a key." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:92 -msgid "" -"The associated value for `requires` is an array containing the value " -"`\"hatchling\"`." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:100 -msgid "How the pyproject.toml is used when you build a package" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:104 -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:81 -msgid "" -"When you publish to PyPI, you will notice that each package has metadata " -"listed. Let’s have a look at [xclim](https://pypi.org/project/xclim/), " -"one of our [pyOpenSci packages](https://www.pyopensci.org/python-" -"packages.html). Notice that on the PyPI landing page you see some " -"metadata about the package including python, maintainer information and " -"more. PyPI is able to populate this metadata because it was defined using" -" correct syntax and classifiers by Xclim's maintainers, [pyproject.toml " -"file](https://github.com/Ouranosinc/xclim/blob/master/pyproject.toml). " -"This metadata when the xclim package is built, is translated into a " -"distribution file that allows PyPI to read the metadata and print it out " -"on their website." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:106 -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:83 -msgid "" -"Image showing the left side bar of PyPI for the package xclim. The " -"section at the top says Classifier. Below there is a list of items " -"including Development status, intended audience, License, natural " -"language, operating system, programming language and topic. Below each of" -" those sections are various classifier options.\" width=\"300px\">" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:111 -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:88 -msgid "" -"When you add the classifier section to your pyproject.toml and your " -"package is built, the build tool organizes the metadata into a format " -"that PyPI can understand and represent on your PyPI landing page. These " -"classifiers also allow users to sort through packages by version of " -"python they support, categories and more." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:116 -msgid "Benefits of using a pyproject.toml file" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:118 -msgid "" -"Including your package's metadata in a separate human-readable " -"**pyproject.toml** format also allows someone to view the project's " -"metadata in a GitHub repository." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:126 -msgid "Setup.py is still useful for complex package builds" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:130 -msgid "" -"Using **setup.py** to manage package builds and metadata [can cause " -"problems with package " -"development](https://blog.ganssle.io/articles/2021/10/setup-py-" -"deprecated.html). In some cases where a Python package build is complex, " -"a **setup.py** file may be required. While this guide will not cover " -"complex builds, we will provide resources working with complex builds in " -"the future." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:136 -msgid "Optional vs. Required pyproject.toml file fields" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:138 -msgid "" -"When you create your `pyproject.toml` file, there are numerous metadata " -"fields that you can use. Below we suggest specific fields to get you " -"started that support publication on PyPI and users finding your package." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:140 -msgid "" -"[An overview of all of the project metadata elements can be found " -"here.](https://packaging.python.org/en/latest/specifications/core-" -"metadata/#project-url-multiple-use)" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:142 -msgid "Required fields for the [project] table" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:144 -msgid "" -"As mentioned above, your pyproject.toml file needs to have a **name** and" -" **version** field in order to properly build your package:" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:146 -msgid "Name: This is the name of your project provided as a string" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:147 -msgid "" -"Version: This is the version of your project. If you are using a scm tool" -" for versioning (using git tags to determine versions), then the version " -"may be dynamic (more on that below)." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:149 -msgid "Optional fields to include in the `[project]` table" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:151 -msgid "" -"We strongly suggest that you also add the metadata keys below as they " -"will help users finding your package on PyPI. These fields will make it " -"clear how your package is structured, what platforms you support and what" -" dependencies your package requires." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:156 -msgid "**Description:** this is a short one-line description of your package." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:157 -msgid "" -"**Readme:** A link to your README.md file is used for the long long-" -"description. This information will be published on your packages PyPI " -"landing page." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:158 -msgid "" -"**Requires-python** (used by pip): this is a field that is used by pip. " -"Here you tell the installer whether you are using Python 2.x or 3.x. Most" -" projects will be using 3.x." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:159 -msgid "**License:** the license you are using" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:160 -msgid "" -"**Authors:** these are the original authors of the package. Sometimes the" -" authors are different from the maintainers. Other times they might be " -"the same." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:161 -msgid "" -"**Maintainers:** you can choose to populate this or not. You can populate" -" this using a list with a sub element for each author or maintainer name," -" email" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:169 -msgid "" -"**dependencies:** dependencies are optional but we strongly suggest you " -"include them in your pyproject.toml. Dependencies will be installed by " -"pip when your project is installed creating a better user-experience." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:171 -msgid "" -"**`[project.optional-dependencies]`:** the optional or development " -"dependencies will be installed if someone runs `python -m pip install " -"projectname[dev]`. This is a nice way to include your development " -"dependencies for users who may wish to contribute to your project." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:173 -msgid "" -"**keywords:** These are the keywords that will appear on your PyPI " -"landing page. Think of them as words that people might use to search for " -"your package." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:174 -msgid "" -"**classifiers:** The classifiers section of your metadata is also " -"important for the landing page of your package in PyPI and for filtering " -"of packages in PyPI. A list of [all options for classifiers can be found " -"her](https://PyPI.org/classifiers/)e. Some of the classifiers that you " -"should consider including" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:175 -msgid "Development Status" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:176 -msgid "Intended Audience" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:177 -msgid "Topic" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:178 -msgid "LIcense" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:179 -msgid "Programming language" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:181 -msgid "Advanced options in the pyproject.toml file" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:183 -msgid "The examples at the bottom of this page contain ..." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:185 -msgid "" -"**`[project.scripts]` (Entry points):** Entry points are optional. If you" -" have a command line tool that runs a specific script hosted in your " -"package, you may include an entry point to call that script directly at " -"the command line (rather than at the Python shell)." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:186 -msgid "" -"Here is an example of[ a package that has entry point " -"script](https://github.com/pyOpenSci/update-web-" -"metadata/blob/main/pyproject.toml#L60)s. Notice that there are several " -"core scripts defined in that package that perform sets of tasks. " -"pyOpenSci is using those scripts to process their metadata." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:187 -msgid "" -"**Dynamic Fields:** if you have fields that are dynamically populated. " -"One example of this is if you are using scm / version control based " -"version with tools like `setuptooms_scm`, then you might use the dynamic " -"field. such as version (using scm) **dynamic = [\"version\"]**" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:189 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Add dependencies to your pyproject.toml file" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:191 -msgid "" -"The pyproject.toml file can also be used as a replacement for the " -"requirements.txt file which has been traditionally used to store " -"development dependencies such as pytest, code formatters such as Black " -"and documentation tools such as sphinx." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:193 -msgid "" -"To add dependencies to your build, add a `[project.optional-" -"dependencies]` table to your pyproject.toml file." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:195 -msgid "Then specify dependency groups as follows:" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:202 -msgid "Following the above example, you install dependencies like this:" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:204 -msgid "`python -m pip install -e .[tests]`" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:206 -msgid "" -"The above will install both your package in editable mode and all of the " -"dependencies declared in the tests section of your `[project.optional-" -"dependencies]` table." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:208 -msgid "To install all dependencies and also your package, you'd use:" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:210 -msgid "`python -m pip install -e .[tests,lint,docs]`" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:212 -msgid "Recursive dependencies" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:216 -msgid "" -"You can also setup sets of recursive dependencies. [See this blog post " -"for more.](https://hynek.me/articles/python-recursive-optional-" -"dependencies/)" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:219 -msgid "Example pyproject.toml for building using hatchling" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:221 -msgid "" -"Below is an example build configuration for a Python project. This " -"example package setup uses **hatchling** to build the [package's sdist " -"and wheels](python-package-distribution-files-sdist-wheel)." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:229 -msgid "Notice that dependencies are specified in this file." -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:231 -msgid "Example pyproject.toml for building using setuptools" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:233 -msgid "" -"The package metadata including authors, keywords, etc is also easy to " -"read. Below you can see the same TOML file that uses a different build " -"system (setuptools). Notice how simple it is to swap out the tools needed" -" to build this package!" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:237 -msgid "In this example package setup you use:" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:239 -msgid "" -"**setuptools** to build the [package's sdist and wheels](python-package-" -"distribution-files-sdist-wheel)" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:240 -msgid "" -"**setuptools_scm** to manage package version updates using version " -"control tags" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:242 -msgid "" -"In the example below `[build-system]` is the first table of values. It " -"has two keys that specify the build backend API and containing package:" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:245 -msgid "`requires =`" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:246 -msgid "`build-back-end =`" -msgstr "" - -#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:253 -msgid "" -"[Click here to read about our packaging build tools including PDM, " -"setuptools, Poetry and Hatch.](/package-structure-code/python-package-" -"build-tools)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:1 -msgid "Python Packaging Tools" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:3 -msgid "Tools for building your package" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:5 -msgid "" -"There are a several different build tools that you can use to [create " -"your Python package's _sdist_ and _wheel_ distributions](python-package-" -"distribution-files-sdist-wheel). Below, we discuss the features, benefits" -" and limitations of the most commonly used Python packaging tools. We " -"focus on pure-python packages in this guide. However, we also highlight " -"tools that currently support packages with C/C++ and other language " -"extensions." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:13 -msgid "" -"Decision tree diagram showing the various front and back end packaging " -"tools. You can decide what packaging tool to use by thinking about what " -"features you need. PDM and Hatch are currently the most flexible tools " -"as they also using different build back-ends. As such currently PDM and " -"Hatch are the tools we think beginners might appreciate most with Poetry " -"being a close second. Poetry is nice for pure Python projects." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:15 -msgid "" -"Diagram showing the different front end build tools available to use in " -"the Python package ecosystem that you can select from. We selected tools " -"to include in this diagram based upon the PyPI survey which helped us " -"understand the most populate tools in the ecosystem. Each tool has " -"different features as highlighted below." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:18 -msgid "" -"If you want to know more about Python packages that have extensions " -"written in other languages, [check out the page on complex package builds" -".](complex-python-package-builds)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:21 -msgid "Tools that we review here" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:23 -msgid "" -"In this section we have selected tools that were returned as the most " -"popular packaging tools in the PyPA survey. You will learn more about the" -" following tools on this page:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:27 -msgid "" -"[Twine](https://twine.readthedocs.io/en/stable/), [Build](https://pypa-" -"build.readthedocs.io/en/stable/) + " -"[setuptools](https://setuptools.pypa.io/en/latest/)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:28 -msgid "[Flit](https://flit.pypa.io/en/stable/)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:29 -msgid "[Hatch](https://hatch.pypa.io/latest/)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:30 -msgid "[PDM](https://pdm.fming.dev/latest/)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:31 -msgid "[Poetry](https://python-poetry.org/docs/)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:33 -msgid "Summary of tools Hatch vs. PDM vs. Poetry (and setuptools)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:35 -msgid "If you are looking for a quick summary, read below." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:37 -msgid "" -"In general, any modern tool that you select from this page will be great " -"to build your package. Selecting a tool comes down to the features that " -"you are looking for in your workflow." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:38 -msgid "" -"We suggest that beginners start with a modern workflow tool like PDM as " -"opposed to navigating the complexities of setuptools." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:39 -msgid "" -"If you are going to use Poetry (it is the most popular tool and does have" -" the best documentation) beware of the upper bounds dependency additions " -"and consider overriding dependencies when you add them. If you do that " -"Poetry will work well for pure-python builds! Poetry also has an active " -"discord where you can ask questions." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:41 -msgid "Below are some features that Hatch and PDM offer that Poetry does not." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:43 -msgid "PDM:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:45 -msgid "" -"Supports other back-ends making it ideal for builds that are not pure " -"Python. This means PDM is a great option for both pure python and more " -"complex Python builds as it supports meson-python and other build " -"backends." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:46 -msgid "Offers flexibility in dependency management which we like" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:47 -msgid "Offers lock files if you need them" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:49 -msgid "Hatch:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:51 -msgid "" -"Offers matrix environment management that allows you to run tests across " -"Python versions. If this feature is important to you, then Hatch is a " -"clear winner." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:52 -msgid "" -"Offers a Nox / Make file like tool to streamline your build workflow. If " -"you are looking to reduce the number of tools in your workflow, Hatch " -"might be for you." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:55 -msgid "Build front-end vs. build back-end tools" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:57 -msgid "" -"To better understand your options, when it comes to building a Python " -"package, it's important to first understand the difference between a " -"build tool front-end and build back-end." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:62 -msgid "Build back-ends" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:64 -msgid "" -"Most packaging tools have a back-end build tool that builds you package " -"and creates associated [(sdist and wheel) distribution files](python-" -"package-distribution-files-sdist-wheel). Some tools, such as **Flit**, " -"only support pure-Python package builds. A pure-Python build refers to a " -"package build that does not have extensions that are written in another " -"programming language (such as `C` or `C++`)." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:71 -msgid "" -"Other packages that have C and C++ extensions (or that wrap other " -"languages such as fortran) require additional code compilation steps when" -" built. Back-ends such as **setuptools.build**, **meson.build** and " -"**scikit-build** support complex builds with custom steps. If your build " -"is particularly complex (i.e. you have more than a few `C`/`C++` " -"extensions), then we suggest you use **meson.build** or **scikit-build**." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:77 -msgid "Python package build front-ends" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:79 -msgid "" -"A packaging front-end tool refers to a tool that makes it easier for you " -"to perform common packaging tasks using similar commands. These tasks " -"include:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:82 -msgid "" -"[Build your packages (create the sdist and wheel distributions)](python-" -"package-distribution-files-sdist-wheel)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:83 -msgid "" -"Installing your package in a development mode (so it updates when you " -"update your code)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:84 -msgid "Publishing to PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:85 -msgid "Running tests" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:86 -msgid "Building documentation" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:87 -msgid "" -"Managing an environment or multiple environments in which you need to run" -" tests and develop your package" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:89 -msgid "" -"There are several Python packaging tools that you can use for pure Python" -" builds. Each front-end tool discussed below supports a slightly " -"different set of Python packaging tasks." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:93 -msgid "" -"For instance, you can use the packaging tools **Flit**, **Hatch** or " -"**PDM** to both build and publish your package to PyPI. However while " -"**Hatch** and **PDM** support versioning and environment management, " -"**Flit** does not. If you want a tool that supports dependency locking, " -"you can use **PDM** or **Poetry** but not **Hatch**. If you only need to " -"build your package's sdist and wheel distribution files, then you can " -"stick with PyPA's Build. You'd then use Twine to publish to PyPI." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:100 -msgid "" -"If you are using **Setuptools**, there is no default user-friendly build " -"front-end that performs multiple tasks. You will need to use **build** to" -" build your package and **twine** to publish to PyPI." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:103 -msgid "Example build steps that can be simplified using a front-end tool" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:105 -msgid "" -"Below, you can see how a build tool streamlines your packaging " -"experience. Example to build your package with **Hatch**:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:115 -msgid "Example build steps using the **setuptools** back-end and **build**:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:125 -msgid "Choosing a build back-end" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:127 -msgid "" -"Most front-end packaging tools have their own back-end build tool. The " -"build tool creates your package's (sdist and wheel) distribution files. " -"For pure Python packages, the main difference between the different build" -" back-ends discussed below is:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:132 -msgid "" -"How configurable they are - for example, do they allow you to add build " -"steps that support non python extensions?" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:133 -msgid "" -"How much you need to configure them to ensure the correct files are " -"included in your sdist and wheel distributions." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:135 -msgid "Build back-end support for non pure-python packages" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:137 -msgid "" -"It is important to note that some build back-ends, such as **Flit-core**," -" only support pure Python builds. Other back-ends support C and C++ " -"extensions as follows:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:140 -msgid "setuptools supports builds using C / C++ extensions" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:141 -msgid "" -"Hatchling (hatch's back-end) supports C / C++ extensions via plugins that" -" the developer creates to customize a build" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:142 -msgid "PDM's back-end supports C / C++ extensions by using setuptools" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:143 -msgid "" -"Poetry's back-end supports C/C++ extensions however this functionality is" -" currently undocumented. As such we don't recommend using Poetry for " -"complex or non pure Python builds until it is documented." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:145 -msgid "" -"While we won't discuss more complex builds below, we will identify which " -"tools have documented support for C / C++ extensions." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:148 -msgid "An ecosystem of Python build tools" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:150 -msgid "" -"Below we introduce several of the most commonly used Python packaging " -"build front-end tools. We highlight the features that each tool offers as" -" a way to help you decide what tool might be best for your workflow." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:154 -msgid "We do not suggest using setuptools" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:157 -msgid "" -"We suggest that you pick one of the modern tools listed above rather than" -" setuptools because setuptools will require some additional knowledge to " -"set up correctly." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:161 -msgid "" -"We review setuptools as a back-end because it is still popular. However " -"it is not the most user friendly option." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:165 -msgid "" -"The most commonly used tools in the ecosystem are setuptools back-end " -"(with build) and Poetry (a front end tool with numerous features and " -"excellent documentation)." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:171 -msgid "" -"Graph showing the results of the 2022 PyPA survey of Python packaging " -"tools. On the x axis is percent response and on the y axis are the tools." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:173 -msgid "" -"The Python developers survey results (n=>8,000 PyPI users) show " -"setuptools and poetry as the most commonly used Python packaging tools. " -"The core tools that we've seen being used in the scientific community are" -" included here. [You can view the full survey results by clicking " -"here.](https://drive.google.com/file/d/1U5d5SiXLVkzDpS0i1dJIA4Hu5Qg704T9/view)" -" NOTE: this data represent maintainers across domains and is likely " -"heavily represented by those in web development. So this represents a " -"snapshot across the broader Python ecosystem." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:176 -msgid "Chose a build workflow tool" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:178 -msgid "The tools that we review below include:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:180 -msgid "Twine, Build + setuptools" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:181 -#: ../../package-structure-code/python-package-build-tools.md:291 -msgid "Flit" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:182 -#: ../../package-structure-code/python-package-build-tools.md:331 -msgid "Hatch" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:183 -#: ../../package-structure-code/python-package-build-tools.md:215 -#: ../../package-structure-code/python-package-build-tools.md:230 -msgid "PDM" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:184 -#: ../../package-structure-code/python-package-build-tools.md:374 -msgid "Poetry" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:186 -msgid "" -"When you are selecting a tool, you might consider this general workflow " -"of questions:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:189 -msgid "" -"**Is your tool pure python? Yes?** You can use any tool that you wish! " -"Pick the tool that has the features that you want to use in your build " -"workflow. We suggest:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:191 -msgid "Flit, Hatch, PDM or Poetry (read below for more)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:193 -msgid "" -"**Does your tool have a few C or C++ extensions?** Great, we suggest " -"using **PDM** for the time being. It is the only tool in the list below " -"that has both documented workflow to support such extensions and support " -"for other back-ends in the case that build hooks are not enough for your " -"workflow. PDM supports other back-ends such as scikit-build and meson-" -"python that will allow you to fully customize your package's build." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:197 -msgid "" -"NOTE: You can also use Hatch for non pure python builds. Hatch, similar " -"to PDM, allows you to write your own build hooks or plugins to support " -"custom build steps. But currently, hatch does not support other build " -"back ends. Many of the core scientific packages are moving to meson-" -"python to build their packages. Thus, we appreciate that PDM can work " -"with meson-python specifically." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:199 -msgid "Python packaging tools summary" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:201 -msgid "" -"Below, we summarize features offered by the most popular build front end " -"tools. It is important to keep in mind that these front-end tools remove " -"the need to use other core tools in your workflow. For example if you use" -" setuptools, you will need to also use Build and Twine to build your " -"package and publish to PyPI. But if you use Poetry, Hatch or PDM you can " -"do all of those things using the same tool (e.g. `hatch build`, `hatch " -"publish` or `pdm build`, `pdm publish`)." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:204 -msgid "" -"Note that because setuptools does not offer a front-end interface, it is " -"not included in the table." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:208 -msgid "Package tool features table" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -msgid "Feature, Flit, Hatch, PDM, Poetry" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -msgid "Default Build Back-end" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -msgid "Flit-core" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -msgid "hatchling" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -msgid "Poetry-core" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -#: ../../package-structure-code/python-package-build-tools.md:251 -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "Use Other Build Backends" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "✖" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -#: ../../package-structure-code/python-package-build-tools.md:251 -#: ../../package-structure-code/python-package-build-tools.md:304 -#: ../../package-structure-code/python-package-build-tools.md:348 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "✅" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "Dependency management" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "Publish to PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -msgid "Version Control based versioning (using `git tags`)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -#: ../../package-structure-code/python-package-build-tools.md:251 -#: ../../package-structure-code/python-package-build-tools.md:348 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Version bumping" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "Environment Management" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:215 -msgid "More than one maintainer? (bus factor)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:225 -msgid "Notes:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:227 -msgid "_Hatch plans to support dependency management in the future_" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:228 -msgid "" -"Poetry supports semantic versioning. Thus, it will support version " -"bumping following commit messages if you use a tool such as Python " -"Semantic Release" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:232 -msgid "" -"[PDM is a Python packaging and dependency management " -"tool](https://pdm.fming.dev/latest/). PDM supports builds for pure Python" -" projects. It also provides multiple layers of support for projects that " -"have C and C++ extensions." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:236 -msgid "PDM support for C and C++ extensions" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:238 -msgid "" -"PDM supports using the PDM-back-end and setuptools at the same time. This" -" means that you can run setuptools to compile and build C extensions. " -"PDM's build back-end receives the compiled extension files (.so, .pyd) " -"and packages them with the pure Python files." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:244 -msgid "PDM Features" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "Feature, PDM, Notes" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"When you setup PDM it allows you to select one of several build back ends" -" including: PDM-core, flit-core and hatchling. PDM also can work with " -"Meson-Python which supports move complex python builds." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "Dependency specifications" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"PDM has flexible support for managing dependencies. PDM defaults to " -"using an open bound (e.g. `requests >=1.2`) approach to dependencies. " -"However you can [customize how you want to add dependencies in case you " -"prefer another approach such as that of Poetry which uses an upper bound " -"limit](https://pdm.fming.dev/latest/usage/dependency/#about-update-" -"strategy).**" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "Environment lock files" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"PDM and Poetry are currently the only tools that create environment lock " -"files. Lock files are often most useful to developers creating web apps " -"where locking the environment is critical for consistent user experience." -" For community-used packages, you will likely never want to use a lock " -"file." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Environment management" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"PDM provides environment management support. It supports Python virtual " -"environments, conda and a local `__pypackages__` environment which is a " -"newer option in the Python ecosystem. No extensions are needed for this " -"support." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "Select your environment type on install" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"When you run `PDM init`, PDM will discover environments that are already " -"on your system and allow you to select one to use for your project." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "PDM supports publishing to both test PyPI and PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -#: ../../package-structure-code/python-package-build-tools.md:348 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Version Control based versioning" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"PDM has a setuptools_scm like tool built into it which allows you to use " -"dynamic versioning that rely on git tags." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"PDM supports you bumping the version of your package using standard " -"semantic version terms patch; minor; major" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -#: ../../package-structure-code/python-package-build-tools.md:304 -#: ../../package-structure-code/python-package-build-tools.md:348 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Follows current packaging standards" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"PDM supports current packaging standards for adding metadata to the " -"**pyproject.toml** file." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -#: ../../package-structure-code/python-package-build-tools.md:304 -#: ../../package-structure-code/python-package-build-tools.md:348 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Install your package in editable mode" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "PDM supports installing your package in editable mode." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -#: ../../package-structure-code/python-package-build-tools.md:304 -#: ../../package-structure-code/python-package-build-tools.md:348 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Build your sdist and wheel distributions" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:251 -msgid "" -"Similar to all of the other tools PDM builds your packages sdist and " -"wheel files for you." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:264 -msgid "PDM vs. Poetry" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:265 -msgid "" -"The functionality of PDM is similar to Poetry. However, PDM also offers " -"additional, documented support for C extensions and version control based" -" versioning. As such, PDM is preferred for those working on non pure-" -"Python packages." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:269 -msgid "" -"If you are deciding between the Poetry and PDM, a smaller difference is " -"the default way that dependencies are added to your pyproject.toml file." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:271 -msgid "" -"Poetry by default follows strict semantic versioning adding dependencies " -"to your pyproject.toml file [using an upper bounds constraint " -"(`^`)](https://python-poetry.org/docs/dependency-specification/#version-" -"constraints). Upper bounds lock means that Poetry will never bump a " -"dependency to the next major version (i.e. from 1.2 to 2.0). However, you" -" can tell Poetry to use an open bound approach by explicitly adding the " -"package like this: `poetry add requests >= 1.2` rather than just using " -"`poetry add requests` which will result in a upper bound locked (ie Upper" -" bound locks means that requests 2.0 could never be installed even if it " -"came out and your package could benefit from it)." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:272 -msgid "" -"PDM defaults to open-bounds (`>=`) dependency additions which is the " -"preferred approach in the scientific python ecosystem. However, PDM also " -"allows you to specify the way dependencies are added by default. As such," -" you can also specify upper-bounds (`^`) using PDM if require that " -"approach." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:274 -msgid "" -"Finally there are some nuanced differences in how both tools create lock " -"files which we will not go into detail about here." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:277 -msgid "Challenges with PDM" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:279 -msgid "" -"PDM is a full-featured packaging tool. However it is not without " -"challenges:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:281 -msgid "" -"Its documentation can be confusing, especially if you are new to " -"packaging. For example, PDM doesn't provide an end to end beginning " -"workflow in its documentation." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:283 -msgid "" -"PDM also only has one maintainer currently. We consider individual " -"maintainer teams to be a potential risk. If the maintainer finds they no " -"longer have time to work on the project, it leaves users with a gap in " -"support. Hatch and Flit also have single maintainer teams." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:288 -msgid "" -"[You can view an example of a package that uses PDM " -"here](https://github.com/pyOpenSci/examplePy/tree/main/example4_pdm). The" -" README file for this directly provides you with an overview of what the " -"PDM command line interface looks like when you use it." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:293 -msgid "" -"[Flit is a no-frills, streamlined packaging " -"tool](https://flit.pypa.io/en/stable/) that supports modern Python " -"packaging standards. Flit is a great choice if you are building a basic " -"package to use in a local workflow that doesn't require any advanced " -"features. And if your package structure is already created. More on that " -"below." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:297 -msgid "Flit Features" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:304 -msgid "Feature, Flit, Notes" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:304 -#: ../../package-structure-code/python-package-build-tools.md:348 -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Publish to PyPI and test PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:304 -msgid "Flit supports publishing to both test PyPI and PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:304 -msgid "Helps you add metadata to your **pyproject.toml** file" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:304 -msgid "" -"Flit does support adding metadata to your **pyproject.toml** file " -"following modern packaging standards." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:304 -msgid "" -"Flit supports current packaging standards for adding metadata to the " -"**pyproject.toml** file." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:304 -msgid "Flit supports installing your package in editable mode.**" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:304 -msgid "Flit can be used to build your packages sdist and wheel distributions." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:311 -msgid "" -"NOTE: _If you are using the most current version of pip, it supports both" -" a symlink approach `flit install -s` and `python -m pip install -e .`_" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:313 -msgid "Learn more about flit" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:314 -msgid "[Why use flit?](https://flit.pypa.io/en/stable/rationale.html)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:317 -msgid "Why you might not want to use Flit" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:319 -msgid "" -"Because Flit is no frills, it is best for basic, quick builds. If you are" -" a beginner you may want to select Hatch or PDM which will offer you more" -" support in common operations." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:323 -msgid "You may NOT want to use flit if:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:325 -msgid "" -"You want to setup more advanced version tracking and management (using " -"version control for version bumping)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:326 -msgid "" -"You want a tool that handles dependency versions (use PDM or Poetry " -"instead)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:327 -msgid "You have a project that is not pure Python (Use Hatch, PDM or setuptools)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:328 -msgid "You want environment management (use PDM, Hatch or Poetry)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:333 -msgid "" -"[**Hatch**](https://hatch.pypa.io/latest/), similar to Poetry and PDM, " -"provides a unified command line interface. To separate Hatch from Poetry " -"and PDM, it also provides an environment manager for testing that will " -"make it easier for you to run tests locally across different versions of " -"Python. It also offers a nox / makefile like feature that allows you to " -"create custom build workflows such as building your documentation " -"locally. This means that you could potentially drop a tool like **Make** " -"or **Nox** from your workflow and use Hatch instead." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:340 -msgid "Hatch features" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "Feature, Hatch, Notes" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"Hatch is used with the backend Hatchling by default, but allows you to " -"use another backend by switching the declaration in pyproject.toml." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"Currently you have to add dependencies manually with Hatch. However a " -"feature to support dependencies management may be added in a future " -"release." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"Hatch supports Python virtual environments. If you wish to use other " -"types of environments such as Conda, you will need to [install a plugin " -"such as hatch-conda for conda support](https://github.com/OldGrumpyViking" -"/hatch-conda)." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "Hatch supports publishing to both test PyPI and PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"Hatch offers `hatch_vcs` which is a plugin that uses setuptools_scm to " -"support versioning using git tags. The workflow with `hatch_vcs` is the " -"same as that with `setuptools_scm`." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"Hatch supports you bumping the version of your package using standard " -"semantic version terms patch; minor; major" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"Hatch supports current packaging standards for adding metadata to the " -"**pyproject.toml** file." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"Hatch will install your package into any of its environments by default " -"in editable mode. You can install your package in editable mode manually " -"using `python -m pip install -e .` Hatch mentions [editable " -"installs](https://hatch.pypa.io/latest/config/build/#dev-mode) but refers" -" to pip in its documentation." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "Hatch will build the sdist and wheel distributions" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "✨Matrix environment creation to support testing across Python versions✨" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"The matrix environment creation is a feature that is unique to Hatch in " -"the packaging ecosystem. This feature is useful if you wish to test your " -"package locally across Python versions (instead of using a tool such as " -"tox)." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"✨[Nox / MAKEFILE like " -"functionality](https://hatch.pypa.io/latest/environment/#selection)✨" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"This feature is also unique to Hatch. This functionality allows you to " -"create workflows in the **pyproject.toml** configuration to do things " -"like serve docs locally and clean your package build directory. This " -"means you may have one less tool in your build workflow." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "✨A flexible build backend: **hatchling**✨" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:348 -msgid "" -"**The hatchling build backend offered by the maintainer of Hatch allows " -"developers to easily build plugins to support custom build steps when " -"packaging." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:362 -msgid "" -"_There is some argument about this approach placing a burden on " -"maintainers to create a custom build system. But others appreciate the " -"flexibility. The Hatch build hook approach is also comparable with the " -"features offered by PDM._" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:364 -msgid "Why you might not want to use Hatch" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:366 -msgid "" -"There are a few features that hatch is missing that may be important for " -"some. These include:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:369 -msgid "" -"Hatch doesn't support adding dependencies. You will have to add them " -"manually." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:370 -msgid "Hatch won't by default recognize Conda environments without a plugin." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:371 -msgid "" -"Similar to PDM, Hatch's documentation can difficult to work through, " -"particularly if you are just getting started with creating a package." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:372 -msgid "Hatch, similar to PDM and Flit currently only has one maintainer." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:376 -msgid "" -"[Poetry is a full-featured build tool.](https://python-poetry.org/) It is" -" also the second most popular front-end packaging tool (based upon the " -"PyPA survey). Poetry is user-friendly and has clean and easy-to-read " -"documentation." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:381 -msgid "" -"While some have used Poetry for Python builds with C/C++ extensions, this" -" support is currently undocumented. Thus, we don't recommend using Poetry" -" for more complex builds." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:385 -msgid "Poetry features" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Feature, Poetry, Notes" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "" -"Poetry helps you add dependencies to your `pyproject.toml` metadata. " -"_NOTE: currently Poetry adds dependencies using an approach that is " -"slightly out of alignment with current Python peps - however there is a " -"plan to fix this in an upcoming release._ Poetry also allows you to " -"organize dependencies in groups such as documentation, packaging and " -"tests." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Dependency specification" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "" -"Poetry allows you to be specific about version of dependencies that you " -"add to your package's pyproject.toml file. However, it's default upper " -"bound approach can be problematic for some packages (We suggest you " -"override the default setting when adding dependencies). Read below for " -"more." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "" -"Poetry allows you to either use its built in environment or you can " -"select the environment type that you want to use for managing your " -"package. [Read more about its built in environment management " -"options](https://python-poetry.org/docs/basic-usage/#using-your-virtual-" -"environment)." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Lock files" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "" -"Poetry creates a **poetry.lock** file that you can use if you need a lock" -" file for your build." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Poetry supports publishing to both test PyPI and PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "" -"The plugin [Poetry dynamic versioning](https://github.com/mtkennerly" -"/poetry-dynamic-versioning) supports versioning using git tags with " -"Poetry." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "" -"Poetry supports you bumping the version of your package using standard " -"semantic version terms patch; minor; major" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "✖✅" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "" -"Poetry does not quite support current packaging standards for adding " -"metadata to the **pyproject.toml** file but plans to fix this in an " -"upcoming release." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "" -"Poetry supports installing your package in editable mode using " -"`--editable`" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:392 -msgid "Poetry will build your sdist and wheel distributions using `poetry build`" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:407 -msgid "Challenges with Poetry" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:409 -msgid "Some challenges of Poetry include:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:411 -msgid "" -"Poetry, by default, pins dependencies using an \"upper bound\" limit " -"specified with the `^` symbol by default. However, this behavior can be " -"over-written by specifying the dependency when you use `Poetry add` as " -"follows: `poetry add \"requests>=2.1\"` See breakout below for more " -"discussion on issues surrounding upper-bounds pinning." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:412 -msgid "" -"_Minor Challenge:_ The way Poetry currently adds metadata to your " -"pyproject.toml file does not follow current Python standards. However, " -"this is going to be addressed with Poetry release version 2.0." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:414 -msgid "" -"Poetry is an excellent tool. Use caution when using it to pin " -"dependencies as Poetry's approach to pinning can be problematic for many " -"builds. If you use Poetry, we strongly suggest that you override the " -"default upper bound dependency option." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:420 -msgid "Challenges with Poetry dependency pinning" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:423 -msgid "" -"By default, Poetry pins dependencies using `^` by default. This `^` " -"symbol means that there is an \"upper bound\" to the dependency. Thus " -"poetry won't bump a dependency version to a new major version. Thus, if " -"your package uses a dependency that is at version 1.2.3, Poetry will " -"never bump the dependency to 2.0 even if there is a new major version of " -"the package. Poetry will instead bump up to 1.9.x." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:429 -msgid "" -"Poetry does this because it adheres to strict semantic versioning which " -"states that a major version bump (from 1.0 to 2.0 for example) means " -"there are breaking changes in the tool. However, not all tools follow " -"strict semantic versioning. [This approach has been found to be " -"problematic by many of our core scientific " -"packages.](https://iscinumpy.dev/post/bound-version-constraints/)" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:434 -msgid "" -"This approach also won't support others ways of versioning tools, for " -"instance, some tools use [calver](https://calver.org/) which creates new " -"versions based on the date." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:438 -msgid "Using Setuptools Back-end for Python Packaging with Build Front-end" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:440 -msgid "" -"[Setuptools](https://setuptools.pypa.io/en/latest/) is the most mature " -"Python packaging build tool with [development dating back to 2009 and " -"earlier](https://setuptools.pypa.io/en/latest/history.html#). Setuptools " -"also has the largest number of community users (according to the PyPA " -"survey). Setuptools does not offer a user front-end like Flit, Poetry and" -" Hatch offer. As such you will need to use other tools such as **build** " -"to create your package distributions and **twine** to publish to PyPI." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:448 -msgid "" -"While setuptools is the most commonly used tool, we encourage package " -"maintainers to consider using a more modern tool for packaging such as " -"Poetry, Hatch or PDM." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:451 -msgid "" -"We discuss setuptools here because it's commonly found in the ecosystem " -"and contributors may benefit from understanding it." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:454 -msgid "Setuptools Features" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:456 -msgid "Some of features of setuptools include:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:458 -msgid "Fully customizable build workflow" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:459 -msgid "Many scientific Python packages use it." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:460 -msgid "" -"It offers version control based package versioning using " -"**setuptools_scm**" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:461 -msgid "It supports modern packaging using **pyproject.toml** for metadata" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:462 -msgid "Supports backwards compatibly for older packaging approaches." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:464 -msgid "Challenges using setuptools" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:468 -msgid "Setuptools has a few challenges:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:470 -msgid "" -"Setuptools does not support interactive features such as auto / tab " -"completion by default if you are working in an IDE like VSCODE and using " -"an editable install for development. [See notes here about pylance " -"support](https://github.com/microsoft/pylance-" -"release/blob/main/TROUBLESHOOTING.md#editable-install-modules-not-found)." -" In comparison, tools such as flit, hatch, PDM support interactive " -"features such as tab / auto completion when using an IDE like VSCODE or " -"pycharm (as long as your version of pip is current!)." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:471 -msgid "" -"Because **setuptools** has to maintain backwards compatibility across a " -"range of packages, it is not as flexible in its adoption of modern Python" -" packaging standards." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:474 -msgid "" -"The above-mentioned backwards compatibility makes for a more complex " -"code-base." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:475 -msgid "" -"Your experience as a user will be less streamlined and simple using " -"setuptools compared to other tools discussed on this page." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:477 -msgid "" -"There are also some problematic default settings that users should be " -"aware of when using setuptools. For instance:" -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:480 -msgid "" -"setuptools will build a project without a name or version if you are not " -"using a **pyproject.toml** file to store metadata." -msgstr "" - -#: ../../package-structure-code/python-package-build-tools.md:482 -msgid "" -"setuptools also will include all of the files in your package repository " -"if you do not explicitly tell it to exclude files using a **MANIFEST.in**" -" file" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:1 -msgid "Learn about Building a Python Package" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:8 -msgid "" -"Once you have published both package distributions (the source " -"distribution and the wheel) to PyPI, you can then publish to conda-forge." -" conda-forge requires an source distribution on PyPI in order to build " -"your package on conda-forge. You do not need to rebuild your package to " -"publish to conda-forge." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:11 -msgid "" -"You need to build your Python package in order to publish it to PyPI (or " -"a conda channel). The build process organizes your code and metadata into" -" a distribution format that can be uploaded to PyPI and subsequently " -"downloaded and installed by users. NOTE: you need to publish a sdist to " -"PyPI in order for conda-forge to properly build your package " -"automatically." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:14 -msgid "What is building a Python package?" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:16 -msgid "" -"To [publish your Python package](publish-python-package-pypi-conda) and " -"make it easy for anyone to install, you first need to build it." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:18 -msgid "But, what does it mean to build a Python package?" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:20 -msgid "" -"[As shown in the figure above](#pypi-conda-channels), when you build your" -" Python package, you convert the source files into something called a " -"distribution package. A distribution package contains your source code " -"and metadata about the package, in the format required by the Python " -"Package Index, so that it can be installed by tools like pip." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:23 -msgid "" -"The term package used to mean many different things in Python and other " -"languages. On this page, we adapt the convention of the [Python Packaging" -" Authority](https://www.pypa.io/en/latest/) and refer to the product of " -"the build step as a **distribution package**." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:27 -msgid "" -"This process of organizing and formatting your code, documentation, tests" -" and metadata into a format that both pip and PyPI can use, is called a " -"build step." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:31 -msgid "Project metadata and PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:33 -msgid "" -"The metadata that both build tools and PyPI uses to describe and " -"understand your package is generally stored in a [pyproject.toml file" -"](pyproject-toml-python-package-metadata). This metadata is used for " -"several purposes:" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:35 -msgid "" -"It helps whatever tool you use to build your package (pip, [pypa's " -"Build](https://pypi.org/project/build/) or an end-to-end tool such as " -"poetry, PDM or Hatch) understand how to build your package. Information " -"it provides to your build tool includes:" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:37 -msgid "" -"The `[build-system]` table in your pyproject.toml file tells pip what " -"[build backend tool](build_backends) you wish to use for creating your " -"sdist and wheel distributions." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:45 -msgid "" -"And the dependencies section of your project table tells the build tool " -"and PyPI what dependencies your project requires." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:54 -msgid "" -"When the build tool creates your package distribution file (the file that" -" you publish on PyPI), it also creates a METADATA file which PyPI can " -"read and use to help users find your package. For example:" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:56 -msgid "" -"The `classifiers = ` section of your `[project]` table in the " -"pyproject.toml file provides information that users on PyPI can use to " -"filter for packages that contain specific licenses or that support " -"specific versions of python." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:73 -msgid "What happened to setup.py and setup.cfg for metadata?" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:76 -msgid "" -"Project metadata used to be stored in either a setup.py file or a " -"setup.cfg file. The current recommended practice for storing package " -"metadata is to use a pyproject.toml file. [Learn more about the " -"pyproject.toml file here.](pyproject-toml-python-package-metadata)" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:79 -msgid "An example - xclim" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:94 -msgid "" -"Graphic showing the high level packaging workflow. On the left you see a " -"graphic with code, metadata and tests in it. those items all go into your" -" package. Documentation and data are below that box because they aren't " -"normally published in your packaging wheel distribution. an arrow to the " -"right takes you to a build distribution files box. that box leads you to " -"either publishing to TestPyPI or the real PyPI. from PyPI you can then " -"connect to conda-forge for an automated build that sends distributions " -"from PyPI to conda-forge." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:96 -msgid "" -"You need to build your Python package in order to publish it to PyPI (or " -"Conda). The build process organizes your code and metadata into a " -"distribution format that can be uploaded to PyPI and subsequently " -"downloaded and installed by users. NOTE: you need to publish a sdist to " -"PyPI in order for conda-forge to properly build your package " -"automatically." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:101 -msgid "" -"This screenshot shows the metadata on PyPI for the xclim package. on it " -"you can see the name of the license, the author and maintainer names " -"keywords associated with the package and the base python version it " -"requires which is 3.8." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:103 -msgid "PyPI screenshot showing metadata for the xclim package." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:110 -msgid "" -"Here you see the maintinaer metadata as it is displayed on PyPI. for " -"xclim there are three maintainers listed with their profile pictures and " -"github user names to the right." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:112 -msgid "" -"Maintainer names and GitHub usernames for the xclim package as they are " -"displayed on PyPI. This information is recorded in your pyproject.toml " -"and then processed by your build tool and stored in your packages sdist " -"and wheel distributions." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:115 -msgid "How to create the distribution format that PyPI and Pip expects?" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:117 -msgid "" -"You could in theory create your own scripts to organize your code the way" -" PyPI wants it to be. However, just like there are packages that handle " -"known structures such as Pandas for data frames and Numpy for arrays, " -"there are packages and tools that help you create package build " -"distribution files." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:121 -msgid "" -"There are a suite of packaging tools that can either help you with the " -"entire packaging process or just one step of the process. For instance " -"setuptools is a commonly used build back end that can be used to create " -"your sdist and wheel. Whereas tools like Hatch, PDM, Poetry and flit help" -" with other parts of the packaging process." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:127 -msgid "" -"While this can cause some confusion and complexity in the packaging " -"ecosystem - for the most part, each tool provides the same distribution " -"output (with minor differences that most users may not care about). Learn" -" more about those tools on this page." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:133 -msgid "" -"Below, you will learn about the two distribution files that PyPI expects " -"you to publish: sdist and wheel. You will learn about their structure and" -" what files belong in each." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:136 -msgid "" -"There are two core distribution files that you need to create to publish " -"your Python package to PyPI source distribution (often called an sdist) " -"and wheel. The sdist contains the raw source code for your package. The " -"wheel (.whl) contains the built / compiled files that can be directly " -"installed onto anyones' computer." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:142 -msgid "Learn more about both distributions below." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:145 -msgid "" -"If your package is a pure python package with no additional build / " -"compilation steps then the sdist and wheel distributions will have " -"similar content. However if your package has extensions in other " -"languages or is more complex in its build, the two distributions will be " -"very different." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:150 -msgid "" -"Also note that we are not discussing conda build workflows in this " -"section. [You can learn more about conda builds " -"here.](https://conda.io/projects/conda-build/en/latest/user-" -"guide/tutorials/index.html)" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:155 -msgid "Source Distribution (sdist)" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:157 -msgid "" -"**Source files** are the unbuilt files needed to build your package. " -"These are the \"raw / as-is\" files that you store on GitHub or whatever " -"platform you use to manage your code." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:161 -msgid "" -"Source Distributions (**S** + **Dist**) are referred to as sdist. As the " -"name implies, a SDIST contains the source code; it has not been built or " -"compiled in any way. Thus, when a user installs your source distribution " -"using pip, pip needs to run a build step first. For this reason, you " -"could define a source distribution as a compressed archive that contains " -"everything required to build a wheel (except for project dependencies) " -"without network access." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:165 -msgid "" -"Sdist is normally stored as a `.tar.gz` archive (often called a " -"\"tarball\"). Thus, when a user installs your source distribution using " -"pip, pip needs to run a build step first." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:167 -msgid "Below is an example sdist for the stravalib Python package:" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:219 -msgid "GitHub archive vs sdist" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:221 -msgid "" -"When you make a release on GitHub, it creates a `git archive` that " -"contains all of the files in your GitHub repository. While these files " -"are similar to an sdist, these two archives are not the same. The sdist " -"contains a few other items including a metadata directory and if you use " -"`setuptools_scm` or `hatch_vcs` the sdist may also contain a file that " -"stores the version." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:229 -msgid "Wheel (.whl files):" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:231 -msgid "" -"A wheel file is a ZIP-format archive whose filename follows a specific " -"format (below) and has the extension `.whl`. The `.whl` archive contains " -"a specific set of files, including metadata that are generated from your " -"project's pyproject.toml file. The pyproject.toml and other files that " -"may be included in source distributions are not included in wheels " -"because it is a built distribution." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:238 -msgid "" -"The wheel (.whl) is your built binary distribution. **Binary files** are " -"the built / compiled source files. These files are ready to be installed." -" A wheel (**.whl**) is a **zip** file containing all of the files needed " -"to directly install your package. All of the files in a wheel are " -"binaries - this means that code is already compiled / built. Wheels are " -"thus faster to install - particularly if you have a package that requires" -" build steps." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:240 -msgid "" -"The wheel does not contain any of your package's configuration files such" -" as **setup.cfg** or **pyproject.toml**. This distribution is already " -"built so it's ready to install." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:244 -msgid "" -"Because it is built, the wheel file will be faster to install for pure " -"Python projects and can lead to consistent installs across machines." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:252 -msgid "" -"Wheels are also useful in the case that a package needs a **setup.py** " -"file to support a more complex build. In this case, because the files in " -"the wheel bundle are pre built, the user installing doesn't have to worry" -" about malicious code injections when it is installed." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:259 -msgid "The filename of a wheel contains important metadata about your package." -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:261 -msgid "Example: **stravalib-1.1.0.post2-py3-none.whl**" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:263 -msgid "name: stravalib" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:264 -msgid "version: 1.1.0" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:265 -msgid "" -"build-number: 2 (post2) [(read more about post " -"here)](https://peps.python.org/pep-0440/#post-release-separators)" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:266 -msgid "py3: supports Python 3.x" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:267 -msgid "none: is not operating system specific (runs on windows, mac, linux)" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:268 -msgid "any: runs on any computer processor / architecture" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:270 -msgid "What a wheel file looks like when unpacked (unzipped):" -msgstr "" - -#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:304 -msgid "[Read more about the wheel format here](https://pythonwheels.com/)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:1 -msgid "Python Package Structure for Scientific Python Projects" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:3 -msgid "" -"There are two different layouts that you will commonly see within the " -"Python packaging ecosystem: [src and flat " -"layouts.](https://packaging.python.org/en/latest/discussions/src-layout-" -"vs-flat-layout/) Both layouts have advantages for different groups of " -"maintainers." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:8 -msgid "" -"We strongly suggest, but do not require, that you use the **src/** layout" -" (discussed below) for creating your Python package. This layout is also " -"recommended in the [PyPA packaging " -"guide](https://packaging.python.org/en/latest/tutorials/packaging-" -"projects/)." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:12 -msgid "pyOpenSci will never require a specific package structure for peer review" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:15 -msgid "" -"We understand that it would be tremendous effort for existing maintainers" -" to move to a new layout." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:18 -msgid "" -"The overview on this page presents recommendations that we think are best" -" for someone getting started with Python packaging or someone who's " -"package has a simple build and might be open to moving to a more fail-" -"proof approach." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:23 -msgid "An example of the **src/package** layout structure can be seen below." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:45 -msgid "Note the location of the following directories in the example above:" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:47 -msgid "" -"**docs/:** discussed in our docs chapter, this directory contains your " -"user-facing documentation website. In a **src/** layout docs/ are " -"normally included at the same directory level of the **src/** folder." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:48 -msgid "" -"**tests/** this directory contains the tests for your project code. In a " -"**src/** layout tests are normally included at the same directory level " -"of the **src/** folder." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:49 -msgid "" -"**src/package/**: this is the directory that contains the code for your " -"Python project. \"Package\" is normally your project's name." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:51 -msgid "" -"Also in the above example, notice that all of the core documentation " -"files that pyOpenSci requires live in the root of your project directory." -" These files include:" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:55 -msgid "CHANGELOG.md" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:56 -msgid "CODE_OF_CONDUCT.md" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:57 -msgid "CONTRIBUTING.md" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:58 -msgid "LICENSE.txt" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:59 -msgid "README.md" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:63 -msgid "Click here to read about our packaging documentation requirements." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:70 -msgid "" -"While we recommend the **src/** layout we also review the **flat** layout" -" here. Both are used in the Python ecosystem." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:72 -msgid "Example scientific packages that use **src/package** layout" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:74 -msgid "[Sourmash](https://github.com/sourmash-bio/sourmash)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:75 -msgid "[bokeh](https://github.com/bokeh/bokeh)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:76 -msgid "[openscm](https://github.com/openscm/openscm-runner)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:77 -msgid "[awkward](https://github.com/scikit-hep/awkward)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:78 -msgid "[poliastro](https://github.com/poliastro/poliastro/)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:82 -msgid "The src/ layout and testing" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:84 -msgid "" -"The benefit of using the **src/package** layout, particularly if you are " -"creating a new package, is that it ensures tests are run against the " -"installed version of your package rather than the files in your package " -"working directory. If you run your tests on your files rather than the " -"installed version, you may be missing issues that users encounter when " -"your package is installed." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:91 -msgid "" -"If `tests/` are outside of the **src/package** directory, they aren't " -"included in the package wheel. This makes your package size slightly " -"smaller which then places places a smaller storage burden on PyPI which " -"has over 400,000 packages to support." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:93 -msgid "" -"[Read more about reasons to use the **src/package** " -"layout](https://hynek.me/articles/testing-packaging/)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:95 -msgid "How Python discovers and prioritizes importing modules" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:97 -msgid "" -"By default, Python adds a module in your current working directory to the" -" front of the Python module search path." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:99 -msgid "" -"This means that if you run your tests in your package's working " -"directory, using a flat layout, `/package/module.py`, Python will " -"discover `package/module.py` file before it discovers the installed " -"package." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:101 -msgid "" -"However, if your package lives in a src/ directory structure " -"**src/package** then it won't be, by default, added to the Python path. " -"This means that when you import your package, Python will be forced to " -"search the active environment (which has your package installed)." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:103 -msgid "" -"Note: Python versions 3.11 and above have a path setting that can be " -"adjusted to ensure the priority is to use installed packages first (e.g. " -"`PYTHONSAFEPATH`)." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:106 -msgid "Sometimes tests are needed in a distribution" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:108 -msgid "" -"We do not recommend including tests as part of your package wheel by " -"default. However, not including tests in your package distribution will " -"make it harder for people other than yourself to test whether your " -"package is functioning correctly on their system. If you have a small " -"test suite (Python files + data), and think your users may want to run " -"tests locally on their systems, you can include tests by moving the " -"`tests/` directory into the **src/package** directory (see example " -"below)." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:117 -msgid "" -"Including the **tests/** directory in your **src/package** directory " -"ensures that tests will be included in your package's wheel." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:119 -msgid "" -"Be sure to read the [pytest documentation for more about including tests " -"in your package " -"distribution](https://docs.pytest.org/en/7.2.x/explanation/goodpractices.html#choosing-a" -"-test-layout-import-rules)." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:121 -msgid "Challenges with including tests and data in a package wheel" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:124 -msgid "" -"Tests, especially when accompanied by test data can create a few small " -"challenges including:" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:126 -msgid "" -"Take up space in your distribution which will build up over time as " -"storage space on PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:127 -msgid "Large file sizes can also slow down package install." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:129 -msgid "" -"However, in some cases, particularly in the scientific Python ecosystems " -"you may need to include tests." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:132 -msgid "**Don't include test suite datasets in your package**" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:134 -msgid "" -"If you do include your tests in your package distribution, we strongly " -"discourage you from including data in your test suite directory. Rather, " -"host your test data in a repository such as Figshare or Zenodo. Use a " -"tool such as [Pooch](https://www.fatiando.org/pooch/latest/) to access " -"the data when you (or a user) runs tests." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:140 -msgid "" -"Check out the testing section of our guide for more information about " -"tests." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:142 -msgid "" -"The **src/package** layout is semantically more clear. Code is always " -"found in the **src/package** directory, `tests/` and `docs/`are in the " -"root directory." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:146 -msgid "" -"If your package tests require data, we suggest that you do NOT include " -"that data within your package structure. We will discuss this in more " -"detail in a tutorial. Include data in your package structure increases " -"the size of your distribution files. This places a maintenance toll on " -"repositories like PyPI and Anaconda.org that have to deal with thousands " -"of package uploads." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:153 -msgid "About the flat Python package layout" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:155 -msgid "Currently most scientific packages use the **flat-layout** given:" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:157 -msgid "" -"It's the most commonly found layout with the scientific Python ecosystem " -"and people tend to look to other packages / maintainers that they respect" -" for examples of how to build Python packages." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:160 -msgid "" -"Many Python tools depend upon tools in other language and / or complex " -"builds with compilation steps. Many developers thus appreciate / are used" -" to features of the flat layout." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:164 -msgid "" -"While we present this layout here in our guide, we suggest that those " -"just getting started with python packaging start with the src/package " -"layout discussed above. Numerous packages in the ecosystem [have had to " -"move to a src/ layout](https://github.com/scikit-build/cmake-python-" -"distributions/pull/145)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:169 -msgid "Why most scientific Python packages do not use source" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:172 -msgid "" -"In most cases the advantages of using the **src/package** layout for " -"larger scientific packages that already use flat approach are not worth " -"it. Moving from a flat layout to a **src/package** layout would come at a" -" significant cost to maintainers." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:177 -msgid "" -"However, the advantages of using the **src/package** layout for a " -"beginner are significant. As such, we recommend that if you are getting " -"started with creating a package, that you consider using a " -"**src/package** layout." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:182 -msgid "What does the flat layout structure look like?" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:184 -msgid "The flat layout's primary characteristics are:" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:186 -msgid "" -"The source code for your package lives in a directory with your package's" -" name in the root of your directory" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:188 -msgid "" -"Often the `tests/` directory also lives within that same `package` " -"directory." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:190 -msgid "" -"Below you can see the recommended structure of a scientific Python " -"package using the flat layout." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:212 -msgid "Benefits of using the flat layout in your Python package" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:214 -msgid "" -"There are some benefits to the scientific community in using the flat " -"layout." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:216 -msgid "" -"This structure has historically been used across the ecosystem and " -"packages using it are unlikely to change." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:218 -msgid "" -"You can import the package directly from the root directory. For some " -"this is engrained in their respective workflows. However, for a beginner " -"the danger of doing this is that you are not developing and testing " -"against the installed version of your package. Rather, you are working " -"directly with the flat files." -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:224 -msgid "Core scientific Python packages that use the flat layout" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:227 -msgid "[numpy](https://github.com/numpy/numpy)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:228 -msgid "[scipy](https://github.com/scipy/scipy)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:229 -msgid "[pandas](https://github.com/pandas-dev/pandas)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:230 -msgid "[xarray](https://github.com/pydata/xarray)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:231 -msgid "[Jupyter-core](https://github.com/jupyter/jupyter_core)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:232 -msgid "[Jupyter notebook](https://github.com/jupyter/notebook)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:233 -msgid "[scikit-learn](https://github.com/scikit-learn/scikit-learn)" -msgstr "" - -#: ../../package-structure-code/python-package-structure.md:235 -msgid "" -"It would be a significant maintenance cost and burden to move all of " -"these packages to a different layout. The potential benefits of the " -"source layout for these tools is not worth the maintenance investment." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:1 -msgid "Creating New Versions of Your Python Package" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:6 -msgid "Key Takeways" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:8 -msgid "" -"Follow [semantic versioning guidelines (SemVer) " -"rules](https://semver.org/) when bumping (increasing) your Python's " -"package version; for example a major version bump (version 1.0 --> 2.0) " -"equates to breaking changes in your package's code for a user." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:9 -msgid "" -"You may want to consider using a plugin like hatch_vsc for managing " -"versions of your package - if you want to have a GitHub only release " -"workflow." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:10 -msgid "" -"Otherwise most major package build tools such as Hatch, Flit and PDM have" -" a version feature that will help you update your package's version" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:11 -msgid "Avoid updating your packages version number manually by hand in your code!" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:14 -msgid "" -"pyOpenSci recommends that you follow the [Python PEP " -"440](https://peps.python.org/pep-0440) which recommends using [semantic " -"versioning guidelines](https://www.python.org/dev/peps/pep-0440" -"/#semantic-versioning) when assigning release values to new versions of " -"your Python package." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:18 -msgid "" -"[Semantic versioning](https://semver.org/) is an approach to updating " -"package versions that considers the type and extent of a change that you " -"are making to the package code. Being consistent with how and when you " -"update your package versions is important as:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:23 -msgid "" -"It helps your users (which might include other developers that depend on " -"your package) understand the extent of changes to a package." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:24 -msgid "" -"It helps your development team make decisions about when to bump a " -"package version based on standard rules." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:26 -msgid "" -"Consistent version increases following semver rules mean that values of " -"your package version explain the extent of the changes made in the code " -"base from version to version. thus your package version numbers become " -"\"expressive\" in the same way that naming code variables well can [make " -"code expressive](https://medium.com/@daniel.oliver.king/writing-" -"expressive-code-b69ef7a5a2fa)." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:28 -msgid "A note about versioning" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:29 -msgid "" -"In some cases even small version changes can turn a package update into a" -" breaking change for some users. What is also important is that you " -"document how you version your code and if you can, also document your " -"deprecation policy for code." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:37 -msgid "SemVer rules" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:39 -msgid "Following SemVer, your bump your package version to a:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:41 -msgid "patch (1.1.1 --> 1.1.**2**)" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:42 -msgid "minor (1.1.1 --> 1.**2**.1)" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:43 -msgid "major (1.1.1 --> **2**.1.1)" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:45 -msgid "version number change based on the following rules:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:47 -msgid "Given a version number MAJOR.MINOR.PATCH, increment the:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:49 -msgid "**MAJOR version** when you make incompatible API changes" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:50 -msgid "" -"**MINOR version** when you add functionality in a backwards compatible " -"manner" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:51 -msgid "" -"**PATCH version** when you make backwards compatible bug fixes Additional" -" labels for pre-release and build metadata are available as extensions to" -" the MAJOR.MINOR.PATCH format." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:56 -msgid "" -"Some people prefer to use [calver](https://calver.org/index.html) for " -"versioning. It may be a simpler-to-use system given it relies upon date " -"values associated with released versions. However, calver does not " -"provide a user with a sense of when a new version might break an existing" -" build. As such we still suggest semver." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:59 -msgid "" -"pyOpenSci will never require semver in a peer review as long as a package" -" has a reasonable approach to versioning!" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:63 -msgid "Avoid manually updating Python package version numbers if you can" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:65 -msgid "" -"Often times you may want to have your package version value in multiple " -"locations. One example of this is that it might be both an attribute in " -"your package **version** and also called in your documentation." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:70 -msgid "" -"We recommend that you avoid manual updates of your package version number" -" to avoid human-error. It is better practice to keep your version number " -"in one location." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:74 -msgid "" -"If you can't implement a single location version, then consider using a " -"tool like hatch, PDM or bump2version that will update the version values " -"for you - throughout your package." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:78 -msgid "" -"Below we discuss some tools that you can use to manage updating Python " -"package versions." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:83 -msgid "Tools to manage versions for your Python package" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:85 -msgid "" -"There are a handful of tools that are widely used in the scientific " -"ecosystem that you can use to manage your package versions. Some of these" -" tools are built into or work with your chosen [packaging build tools " -"that discussed in this chapter.](python-package-build-tools)" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:91 -msgid "Below, we provide an overview of these tools." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:97 -msgid "" -"There are three general groups of tools that you can use to manage " -"package versions:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:100 -msgid "" -"**semantic release tools:** These tools will automagically determine what" -" type of version bump to use using the text in your commit messages. " -"Below we discuss [Python Semantic Release](https://python-semantic-" -"release.readthedocs.io/en/latest/) as a Python tool that implements a " -"semantic versioning approach." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:102 -msgid "" -"**Manual incremental bump tools:** Tools like " -"[Hatch](https://hatch.pypa.io/latest/version/) offer version bumping " -"within your package. Normally this is implemented at the command link for" -" instance `hatch version major` would bump your project from 0.x to 1.0." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:103 -msgid "" -"**Version Control System tools:** Finally there are tools that rely on " -"your version control system to track versions. These tools often are " -"plugins to your package build tool (ex: setuptools build or hatchling). " -"We discuss this option below assuming that you are using **.git tags** " -"and **GitHub** to manage your package repository." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:105 -msgid "Semantic release, vs version control based vs manual version bumping" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:107 -msgid "" -"Generally semantic release and version control system tools can be setup " -"to run automatically on GitHub using GitHub actions. This means that you " -"can create a workflow where a GitHub release and associated new version " -"tag is used to trigger an automated build that:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:113 -msgid "Builds your package and updates the version following the new tag" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:114 -msgid "Tests the build and publishes to test PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:115 -msgid "Publishes the package to PyPI" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:118 -msgid "" -"Bumping a package version refers to the step of increasing the package " -"version after a set number of changes have been made to it. For example, " -"you might bump from version 0.8 to 0.9 of a package. or from 0.9 to 1.0." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:122 -msgid "" -"Using semantic versioning, there are three main \"levels\" of versions " -"that you might consider:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:125 -msgid "Major, minor and patch. These are described in more detail below." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:128 -msgid "Tools for bumping Python package versions" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:130 -msgid "" -"In this section we discuss the following tools for managing your Python " -"package's version:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:133 -msgid "hatch &" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:134 -msgid "hatch_vcs plugin for hatchling" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:135 -msgid "setuptools-scm" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:136 -msgid "python-semantic-version" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:138 -msgid "Tool 1: Hatch and other build tools that offer incremental versioning" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:140 -msgid "" -"Many of the modern build tool front end tools offer version support that " -"follow semantic versioning rules. These tools are different from Python " -"Semantic Version in that they do not require specific commit messages to " -"implement version. Rather, they allow you to update the version at the " -"command line using commands such as:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:146 -msgid "`tool-name version update major`" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:147 -msgid "`tool-name version update minor`" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:149 -msgid "" -"[Hatch](https://hatch.pypa.io/latest/version/), for instance offers " -"`hatch version minor` which will modify the version of your package " -"incrementally. With **Hatch** the version value will be found in your " -"`pyproject.toml` file. " -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:152 -msgid "Hatch (or other tools like PDM) Pros" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:154 -msgid "Easy to use version updates locally using a single tool!" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:156 -msgid "Hatch (or other tools like PDM) Cons" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:158 -msgid "" -"There will be some setup involved to ensure package version is updated " -"throughout your package" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:160 -msgid "Tool 2: Hatch_vcs & hatchling build back-end" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:162 -msgid "" -"[hatch_vcs](https://github.com/ofek/hatch-vcs) is a versioning tool that " -"allows you to manage package versions using **git tags**. Hatch_vcs " -"creates a **\\_version.py** file in your package ecosystem that keeps " -"track of the package's current version." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:167 -msgid "" -"Hatch keeps track of your package's version in a `_version.py` file. " -"Storing the version in a single file managed by Hatch provides your " -"package with a \"single source of truth\" value for the version number. " -"This in turn eliminates potential error associated with manually updating" -" your package's version." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:173 -msgid "" -"When you (or your CI system) build your package, hatch checks the current" -" tag number for your package. if it has increased, it will update the " -"**\\_version.py** file with the new value." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:176 -msgid "" -"Thus, when you create a new tag or a new release with a tag and build " -"your package, Hatch will access the new tag value and use it to update " -"your package version." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:179 -msgid "" -"To use **hatch_vcs** you will need to use the **hatchling** build back " -"end." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:182 -msgid "" -"Hatchling can also be used with any of the modern build tools including " -"**Flit** and **PDM** if you prefer those for your day to day workflow." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:187 -msgid "Hatch example setup in your pyproject.toml" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:196 -msgid "" -"**Hatch_vcs** supports a fully automated package release and build, and " -"push to PyPI workflow on GitHub." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:206 -msgid "" -"If you use **setuptools_scm**, then you might find **hatch_vcs** and " -"**hatchling** to be the modern equivalent to your current setuptools / " -"build workflow." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:209 -msgid "hatch_vcs Pros" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:211 -msgid "Hatch supports modern Python packaging standards" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:212 -#: ../../package-structure-code/python-package-versions.md:238 -msgid "It creates a single-source file that contains your package version." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:213 -#: ../../package-structure-code/python-package-versions.md:239 -msgid "You never manually update the package version" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:214 -#: ../../package-structure-code/python-package-versions.md:240 -msgid "" -"You can automate writing the version anywhere in your package including " -"your documentation!" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:215 -#: ../../package-structure-code/python-package-versions.md:241 -msgid "" -"It supports a purely GitHub based release workflow. This simplifies " -"maintenance workflows." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:216 -#: ../../package-structure-code/python-package-versions.md:242 -msgid "" -"Version number is updated in your package via a hidden `_version.py` " -"file. There is no manual configuration updates required." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:217 -#: ../../package-structure-code/python-package-versions.md:243 -msgid "" -"While we like detailed commit messages (See Python Semantic Version " -"below), we know that sometimes when maintaining a package specific " -"guidelines around commit messages can be hard to apply and manage." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:219 -msgid "hatch_vcs Cons" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:221 -msgid "" -"In a CI workflow you will end up manually entering or creating the " -"version number via a tag on GitHub. But you could locally develop a build" -" to \"bump\" tag versions" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:224 -msgid "Tool 3: setuptools-scm versioning using git tags" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:226 -msgid "" -"[`Setuptools_scm`](https://github.com/pypa/setuptools_scm/) is an " -"extension that you can use with setuptools to manage package versions. " -"**Setuptools_scm** operates the same way that **hatch_vcs** (discussed " -"above) does. It stores a version in a **\\_version.py** file and relies " -"on (**git**) tags to determine the package's current version." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:232 -msgid "" -"If you are using **setuptools** as your primary build tool, then " -"`*setuptools-scm` is a good choice as:" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:236 -msgid "setuptools_scm Pros" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:244 -msgid "**setuptools** is still the most commonly used Python packaging build tool" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:246 -msgid "setuptools_scm Cons" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:248 -msgid "" -"In a CI workflow you will end up manually entering or creating the " -"version number via a tag on GitHub." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:249 -msgid "Not well documented" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:250 -msgid "" -"Because setuptools will always have to support backwards compatibility it" -" will always be slower in adopting modern Python packaging conventions." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:252 -msgid "" -"As such you might consider using a more modern tool such as **hatch_vcs**" -" and **hatchling** to build your package and manage package versions." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:264 -msgid "" -"Tool 4: [Python semantic release](https://python-semantic-" -"release.readthedocs.io/en/latest/)" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:266 -msgid "" -"Python semantic release uses a commit message workflow that updates the " -"version of your package based on keywords found in your commit messages. " -"As the name implies, Python Semantic Release follows semver release " -"rules." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:271 -msgid "" -"With Python Semantic Release, versions are triggered using specific " -"language found in a git commit message." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:274 -msgid "" -"For example, the words `fix(attribute_warning):` trigger Python Semantic " -"Release to implement a **patch** version bump. For instance if your " -"package was at version 1.1.0 and you made the commit below with the words" -" fix(text-here), Python Semantic Release would bump your package to " -"version 1.1.1." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:284 -msgid "" -"Similarly a feature (`feat()`) triggers a minor version bump. For example" -" from version 1.1 to version 1.2" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:292 -msgid "" -"You can find a thoughtful discussion of python semantic version [in this " -"Python package guide](https://py-pkgs.org/07-releasing-versioning" -"#automatic-version-bumping). Note that the guide hasn't been updated " -"since 2020 and will potentially be updated in the future! But for now, " -"some of the commands are dated but the content is still excellent." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:295 -msgid "Python Semantic Release Pros" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:297 -msgid "Follows semver versioning closely" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:298 -msgid "" -"Enforces maintainers using descriptive commit messages which can simplify" -" troubleshooting and ensure a cleaner and more self-describing git " -"history." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:300 -msgid "Python Semantic Release Cons" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:302 -msgid "" -"Requires very specific commit language to work. In practice some " -"maintainers and contributors may not be able to maintain that level of " -"specificity in commit messages (NOTE: there are bots that will check git " -"commit messages in a repo)" -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:303 -msgid "" -"Release happens at the command line. This makes is harder to implement a " -"GitHub based release workflow as the wrong commit message could trigger a" -" release." -msgstr "" - -#: ../../package-structure-code/python-package-versions.md:304 -msgid "" -"The version number is manually updated in a configuration file such as " -"`pyproject.toml` vs. in a package **\\_version.py** file." -msgstr "" - diff --git a/locales/ja/LC_MESSAGES/tests.po b/locales/ja/LC_MESSAGES/tests.po deleted file mode 100644 index 540e03ab..00000000 --- a/locales/ja/LC_MESSAGES/tests.po +++ /dev/null @@ -1,1003 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2024, pyOpenSci -# This file is distributed under the same license as the pyOpenSci Python -# Package Guide package. -# FIRST AUTHOR , 2024. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: ja\n" -"Language-Team: ja \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" - -#: ../../tests/index.md:72 -msgid "Intro" -msgstr "" - -#: ../../tests/index.md:72 -msgid "Write tests" -msgstr "" - -#: ../../tests/index.md:72 -msgid "Test types" -msgstr "" - -#: ../../tests/index.md:72 -msgid "Run tests locally" -msgstr "" - -#: ../../tests/index.md:72 -msgid "Run tests online (using CI)" -msgstr "" - -#: ../../tests/index.md:72 -msgid "Create & Run Tests" -msgstr "" - -#: ../../tests/index.md:1 -msgid "Tests and data for your Python package" -msgstr "" - -#: ../../tests/index.md:3 -msgid "" -"Tests are an important part of your Python package because they provide a" -" set of checks that ensure that your package is functioning how you " -"expect it to." -msgstr "" - -#: ../../tests/index.md:7 -msgid "" -"In this section you will learn more about the importance of writing tests" -" for your Python package and how you can setup infrastructure to run your" -" tests both locally and on GitHub." -msgstr "" - -#: ../../tests/index.md:19 -msgid "✨ Why write tests ✨" -msgstr "" - -#: ../../tests/index.md:24 -msgid "" -"Learn more about the art of writing tests for your Python package. Learn " -"about why you should write tests and how they can help you and potential " -"contributors to your project." -msgstr "" - -#: ../../tests/index.md:31 -msgid "✨ Types of tests ✨" -msgstr "" - -#: ../../tests/index.md:36 -msgid "" -"There are three general types of tests that you can write for your Python" -" package: unit tests, integration tests and end-to-end (or functional) " -"tests. Learn about all three." -msgstr "" - -#: ../../tests/index.md:42 -msgid "✨ Run tests locally ✨" -msgstr "" - -#: ../../tests/index.md:47 -msgid "" -"If you expect your users to use your package across different versions of" -" Python, then using an automation tool such as nox to run your tests is " -"useful. Learn about the various tools that you can use to run your tests " -"across python versions here." -msgstr "" - -#: ../../tests/index.md:53 -msgid "✨ Run tests online (using CI) ✨" -msgstr "" - -#: ../../tests/index.md:58 -msgid "" -"Continuous integration platforms such as GitHub actions can be useful for" -" running your tests across both different Python versions and different " -"operating systems. Learn about setting up tests to run in Continuous " -"Integration here." -msgstr "" - -#: ../../tests/index.md:69 -msgid "Graphic showing the elements of the packaging process." -msgstr "" - -#: ../../tests/run-tests.md:6 -msgid "Run Python package tests" -msgstr "" - -#: ../../tests/run-tests.md:8 -msgid "" -"Running your tests is important to ensure that your package is working as" -" expected. It's good practice to consider that tests will run on your " -"computer and your users' computers that may be running a different Python" -" version and operating systems. Think about the following when running " -"your tests:" -msgstr "" - -#: ../../tests/run-tests.md:11 -msgid "" -"Run your test suite in a matrix of environments that represent the Python" -" versions and operating systems your users are likely to have." -msgstr "" - -#: ../../tests/run-tests.md:12 -msgid "" -"Running your tests in an isolated environment provides confidence in the " -"tests and their reproducibility. This ensures that tests do not pass " -"randomly due to your computer's specific setup. For instance, you might " -"have unexpectedly installed dependencies on your local system that are " -"not declared in your package's dependency list. This oversight could lead" -" to issues when others try to install or run your package on their " -"computers." -msgstr "" - -#: ../../tests/run-tests.md:14 -msgid "" -"On this page, you will learn about the tools that you can use to both run" -" tests in isolated environments and across Python versions." -msgstr "" - -#: ../../tests/run-tests.md:19 -msgid "Tools to run your tests" -msgstr "" - -#: ../../tests/run-tests.md:21 -msgid "" -"There are three categories of tools that will make is easier to setup and" -" run your tests in various environments:" -msgstr "" - -#: ../../tests/run-tests.md:24 -msgid "" -"A **test framework**, is a package that provides a particular syntax and " -"set of tools for _both writing and running your tests_. Some test " -"frameworks also have plugins that add additional features such as " -"evaluating how much of your code the tests cover. Below you will learn " -"about the **pytest** framework which is one of the most commonly used " -"Python testing frameworks in the scientific ecosystem. Testing frameworks" -" are essential but they only serve to run your tests. These frameworks " -"don't provide a way to easily run tests across Python versions without " -"the aid of additional automation tools." -msgstr "" - -#: ../../tests/run-tests.md:25 -msgid "" -"**Automation tools** allow you to automate running workflows such as " -"tests in specific ways using user-defined commands. For instance it's " -"useful to be able to run tests across different Python versions with a " -"single command. Tools such as " -"[**nox**](https://nox.thea.codes/en/stable/index.html) and " -"[**tox**](https://tox.wiki/en/latest/index.html) also allow you to run " -"tests across Python versions. However, it will be difficult to test your " -"build on different operating systems using only nox and tox - this is " -"where continuous integration (CI) comes into play." -msgstr "" - -#: ../../tests/run-tests.md:26 -msgid "" -"**Continuous Integration (CI):** is the last tool that you'll need to run" -" your tests. CI will not only allow you to replicate any automated builds" -" you create using nox or tox to run your package in different Python " -"environments. It will also allow you to run your tests on different " -"operating systems (Windows, Mac and Linux). [We discuss using CI to run " -"tests here](tests-ci)." -msgstr "" - -#: ../../tests/run-tests.md:28 -msgid "Table: Testing & Automation Tool" -msgstr "" - -#: ../../tests/run-tests.md:35 -msgid "Features" -msgstr "" - -#: ../../tests/run-tests.md:36 -msgid "Testing Framework (pytest)" -msgstr "" - -#: ../../tests/run-tests.md:37 -msgid "Test Runner (Tox)" -msgstr "" - -#: ../../tests/run-tests.md:38 -msgid "Automation Tools (Nox)" -msgstr "" - -#: ../../tests/run-tests.md:39 -msgid "Continuous Integration (GitHub Actions)" -msgstr "" - -#: ../../tests/run-tests.md:40 -msgid "Run Tests Locally" -msgstr "" - -#: ../../tests/run-tests.md:41 ../../tests/run-tests.md:42 -#: ../../tests/run-tests.md:43 ../../tests/run-tests.md:49 -#: ../../tests/run-tests.md:52 ../../tests/run-tests.md:53 -#: ../../tests/run-tests.md:54 ../../tests/run-tests.md:57 -#: ../../tests/run-tests.md:58 ../../tests/run-tests.md:59 -#: ../../tests/run-tests.md:64 ../../tests/run-tests.md:68 -#: ../../tests/run-tests.md:69 -msgid "" -msgstr "" - -#: ../../tests/run-tests.md:44 ../../tests/run-tests.md:46 -#: ../../tests/run-tests.md:47 ../../tests/run-tests.md:48 -#: ../../tests/run-tests.md:51 ../../tests/run-tests.md:56 -#: ../../tests/run-tests.md:61 ../../tests/run-tests.md:62 -#: ../../tests/run-tests.md:63 ../../tests/run-tests.md:66 -#: ../../tests/run-tests.md:67 -msgid "" -msgstr "" - -#: ../../tests/run-tests.md:45 -msgid "Run Tests Online" -msgstr "" - -#: ../../tests/run-tests.md:50 -msgid "Run Tests Across Python Versions" -msgstr "" - -#: ../../tests/run-tests.md:55 -msgid "Run Tests In Isolated Environments" -msgstr "" - -#: ../../tests/run-tests.md:60 -msgid "Run Tests Across Operating Systems (Windows, MacOS, Linux)" -msgstr "" - -#: ../../tests/run-tests.md:65 -msgid "Use for other automation tasks (e.g. building docs)" -msgstr "" - -#: ../../tests/run-tests.md:73 -msgid "What testing framework / package should I use to run tests?" -msgstr "" - -#: ../../tests/run-tests.md:75 -msgid "" -"We recommend using `Pytest` to build and run your package tests. Pytest " -"is the most common testing tool used in the Python ecosystem." -msgstr "" - -#: ../../tests/run-tests.md:77 -msgid "" -"[The Pytest package](https://docs.pytest.org/en/latest/) also has a " -"number of extensions that can be used to add functionality such as:" -msgstr "" - -#: ../../tests/run-tests.md:80 -msgid "" -"[pytest-cov](https://pytest-cov.readthedocs.io/en/latest/) allows you to " -"analyze the code coverage of your package during your tests, and " -"generates a report that you can [upload to codecov](https://codecov.io/)." -msgstr "" - -#: ../../tests/run-tests.md:82 ../../tests/run-tests.md:174 -#: ../../tests/test-types.md:14 ../../tests/tests-ci.md:7 -msgid "Todo" -msgstr "" - -#: ../../tests/run-tests.md:83 -msgid "Learn more about code coverage here. (add link)" -msgstr "" - -#: ../../tests/run-tests.md:87 -msgid "" -"Your editor or IDE may add additional convenience for running tests, " -"setting breakpoints, and toggling the `–no-cov` flag. Check your editor's" -" documentation for more information." -msgstr "" - -#: ../../tests/run-tests.md:90 -msgid "Run tests using pytest" -msgstr "" - -#: ../../tests/run-tests.md:92 -msgid "If you are using **pytest**, you can run your tests locally by calling:" -msgstr "" - -#: ../../tests/run-tests.md:95 -msgid "`pytest`" -msgstr "" - -#: ../../tests/run-tests.md:97 -msgid "" -"Or if you want to run a specific test file - let's call this file " -"\"`test_module.py`\" - you can run:" -msgstr "" - -#: ../../tests/run-tests.md:99 -msgid "`pytest test_module.py`" -msgstr "" - -#: ../../tests/run-tests.md:101 -msgid "" -"Learn more from the [get started docs](https://docs.pytest.org/en/7.1.x" -"/getting-started.html)." -msgstr "" - -#: ../../tests/run-tests.md:103 -msgid "" -"Running pytest on your computer is going to run your tests in whatever " -"Python environment you currently have activated. This means that tests " -"will be run on a single version of Python and only on the operating " -"system that you are running locally." -msgstr "" - -#: ../../tests/run-tests.md:108 -msgid "" -"An automation tool can simplify the process of running tests in various " -"Python environments." -msgstr "" - -#: ../../tests/run-tests.md:111 -msgid "Tests across operating systems" -msgstr "" - -#: ../../tests/run-tests.md:112 -msgid "" -"If you want to run your tests across different operating systems you can " -"[continuous integration. Learn more here](tests-ci)." -msgstr "" - -#: ../../tests/run-tests.md:115 -msgid "Tools to automate running your tests" -msgstr "" - -#: ../../tests/run-tests.md:117 -msgid "" -"To run tests on various Python versions or in various specific " -"environments with a single command, you can use an automation tool such " -"as `nox` or `tox`. Both `nox` and `tox` can create an isolated virtual " -"environments. This allows you to easily run your tests in multiple " -"environments and across Python versions." -msgstr "" - -#: ../../tests/run-tests.md:120 -msgid "" -"We will focus on [Nox](https://nox.thea.codes/) in this guide. `nox` is a" -" Python-based automation tool that builds upon the features of both " -"`make` and `tox`. `nox` is designed to simplify and streamline testing " -"and development workflows. Everything that you do with `nox` can be " -"implemented using a Python-based interface." -msgstr "" - -#: ../../tests/run-tests.md:122 -msgid "Other automation tools you'll see in the wild" -msgstr "" - -#: ../../tests/run-tests.md:125 -msgid "" -"**[Tox](https://tox.wiki/en/latest/index.html#useful-links)** is an " -"automation tool that supports common steps such as building " -"documentation, running tests across various versions of Python, and more." -" You can find [a nice overview of tox in the plasmaPy " -"documentation](https://docs.plasmapy.org/en/stable/contributing/testing_guide.html" -"#using-tox)." -msgstr "" - -#: ../../tests/run-tests.md:127 -msgid "" -"**[Hatch](https://github.com/ofek/hatch)** is a modern end-to-end " -"packaging tool that works with the popular build backend called " -"hatchling. `hatch` offers a `tox`-like setup where you can run tests " -"locally using different Python versions. If you are using `hatch` to " -"support your packaging workflow, you may want to also use its testing " -"capabilities rather than using `nox`." -msgstr "" - -#: ../../tests/run-tests.md:129 -msgid "" -"[**make:**](https://www.gnu.org/software/make/manual/make.html) Some " -"developers use Make, which is a build automation tool, for running tests " -"due to its versatility; it's not tied to a specific language and can be " -"used to run various build processes. However, Make's unique syntax and " -"approach can make it more challenging to learn, particularly if you're " -"not already familiar with it. Make also won't manage environments for you" -" like **nox** will do." -msgstr "" - -#: ../../tests/run-tests.md:136 -msgid "Run tests across Python versions with nox" -msgstr "" - -#: ../../tests/run-tests.md:138 -msgid "**Nox** is a great automation tool to learn because it:" -msgstr "" - -#: ../../tests/run-tests.md:140 -msgid "Is Python-based making it accessible if you already know Python and" -msgstr "" - -#: ../../tests/run-tests.md:141 -msgid "Will create isolated environments to run workflows." -msgstr "" - -#: ../../tests/run-tests.md:143 -msgid "" -"`nox` simplifies creating and managing testing environments. With `nox`, " -"you can set up virtual environments, and run tests across Python versions" -" using the environment manager of your choice with a single command." -msgstr "" - -#: ../../tests/run-tests.md:148 -msgid "Nox Installations" -msgstr "" - -#: ../../tests/run-tests.md:150 -msgid "" -"When you install and use nox to run tests across different Python " -"versions, nox will create and manage individual `venv` environments for " -"each Python version that you specify in the nox function." -msgstr "" - -#: ../../tests/run-tests.md:152 -msgid "Nox will manage each environment on its own." -msgstr "" - -#: ../../tests/run-tests.md:154 -msgid "" -"Nox can also be used for other development tasks such as building " -"documentation, creating your package distribution, and testing " -"installations across both PyPI related environments (e.g. venv, " -"virtualenv) and `conda` (e.g. `conda-forge`)." -msgstr "" - -#: ../../tests/run-tests.md:158 -msgid "" -"To get started with nox, you create a `noxfile.py` file at the root of " -"your project directory. You then define commands using Python functions. " -"Some examples of that are below." -msgstr "" - -#: ../../tests/run-tests.md:162 -msgid "Test Environments" -msgstr "" - -#: ../../tests/run-tests.md:164 -msgid "" -"By default, `nox` uses the Python built in `venv` environment manager. A " -"virtual environment (`venv`) is a self-contained Python environment that " -"allows you to isolate and manage dependencies for different Python " -"projects. It helps ensure that project-specific libraries and packages do" -" not interfere with each other, promoting a clean and organized " -"development environment." -msgstr "" - -#: ../../tests/run-tests.md:166 -msgid "" -"An example of using nox to run tests in `venv` environments for Python " -"versions 3.9, 3.10, 3.11 and 3.12 is below." -msgstr "" - -#: ../../tests/run-tests.md:169 -msgid "" -"Note that for the code below to work, you need to have all 4 versions of " -"Python installed on your computer for `nox` to find." -msgstr "" - -#: ../../tests/run-tests.md:172 -msgid "Nox with venv environments" -msgstr "" - -#: ../../tests/run-tests.md:175 -msgid "" -"TODO: add some tests above and show what the output would look like in " -"the examples below..." -msgstr "" - -#: ../../tests/run-tests.md:178 -msgid "" -"Below is an example of setting up nox to run tests using `venv` which is " -"the built in environment manager that comes with base Python." -msgstr "" - -#: ../../tests/run-tests.md:180 -msgid "" -"Note that the example below assumes that you have [setup your " -"`pyproject.toml` to declare test dependencies in a way that pip can " -"understand](../package-structure-code/declare-dependencies.md). An " -"example of that setup is below." -msgstr "" - -#: ../../tests/run-tests.md:201 -msgid "" -"If you have the above setup, then you can use " -"`session.install(\".[tests]\")` to install your test dependencies. Notice" -" that below one single nox session allows you to run your tests on 4 " -"different Python environments (Python 3.9, 3.10, 3.11, and 3.12)." -msgstr "" - -#: ../../tests/run-tests.md:222 -msgid "" -"Above you create a nox session in the form of a function with a " -"`@nox.session` decorator. Notice that within the decorator you declare " -"the versions of python that you wish to run." -msgstr "" - -#: ../../tests/run-tests.md:226 -msgid "" -"To run the above you'd execute the following command, specifying which " -"session with `--session` (sometimes shortened to `-s`). Your function " -"above is called test, therefore the session name is test." -msgstr "" - -#: ../../tests/run-tests.md:234 -msgid "Nox with conda / mamba" -msgstr "" - -#: ../../tests/run-tests.md:236 -msgid "" -"Below is an example for setting up nox to use mamba (or conda) for your " -"environment manager. Note that unlike venv, conda can automatically " -"install the various versions of Python that you need. You won't need to " -"install all four Python versions if you use conda/mamba, like you do with" -" `venv`." -msgstr "" - -#: ../../tests/run-tests.md:242 -msgid "" -"For `conda` to work with `nox`, you will need to ensure that either " -"`conda` or `mamba` is installed on your computer." -msgstr "" - -#: ../../tests/run-tests.md:264 -msgid "To run the above session you'd use:" -msgstr "" - -#: ../../tests/test-types.md:1 -msgid "Test Types for Python packages" -msgstr "" - -#: ../../tests/test-types.md:3 -msgid "Three types of tests: Unit, Integration & Functional Tests" -msgstr "" - -#: ../../tests/test-types.md:5 -msgid "" -"There are different types of tests that you want to consider when " -"creating your test suite:" -msgstr "" - -#: ../../tests/test-types.md:8 -msgid "Unit tests" -msgstr "" - -#: ../../tests/test-types.md:9 -msgid "Integration" -msgstr "" - -#: ../../tests/test-types.md:10 -msgid "End-to-end (also known as Functional) tests" -msgstr "" - -#: ../../tests/test-types.md:12 -msgid "" -"Each type of test has a different purpose. Here, you will learn about all" -" three types of tests." -msgstr "" - -#: ../../tests/test-types.md:15 -msgid "" -"I think this page would be stronger if we did have some examples from our" -" package here: https://github.com/pyOpenSci/pyosPackage" -msgstr "" - -#: ../../tests/test-types.md:20 -msgid "Unit Tests" -msgstr "" - -#: ../../tests/test-types.md:22 -msgid "" -"A unit test involves testing individual components or units of code in " -"isolation to ensure that they work correctly. The goal of unit testing is" -" to verify that each part of the software, typically at the function or " -"method level, performs its intended task correctly." -msgstr "" - -#: ../../tests/test-types.md:24 -msgid "" -"Unit tests can be compared to examining each piece of your puzzle to " -"ensure parts of it are not broken. If all of the pieces of your puzzle " -"don’t fit together, you will never complete it. Similarly, when working " -"with code, tests ensure that each function, attribute, class, method " -"works properly when isolated." -msgstr "" - -#: ../../tests/test-types.md:26 -msgid "" -"**Unit test example:** Pretend that you have a function that converts a " -"temperature value from Celsius to Fahrenheit. A test for that function " -"might ensure that when provided with a value in Celsius, the function " -"returns the correct value in degrees Fahrenheit. That function is a unit " -"test. It checks a single unit (function) in your code." -msgstr "" - -#: ../../tests/test-types.md:44 -msgid "" -"Example unit test for the above function. You'd run this test using the " -"`pytest` command in your **tests/** directory." -msgstr "" - -#: ../../tests/test-types.md:65 ../../tests/test-types.md:115 -msgid "" -"image of puzzle pieces that all fit together nicely. The puzzle pieces " -"are colorful - purple, green and teal." -msgstr "" - -#: ../../tests/test-types.md:69 -msgid "" -"Your unit tests should ensure each part of your code works as expected on" -" its own." -msgstr "" - -#: ../../tests/test-types.md:72 -msgid "Integration tests" -msgstr "" - -#: ../../tests/test-types.md:74 -msgid "" -"Integration tests involve testing how parts of your package work together" -" or integrate. Integration tests can be compared to connecting a bunch of" -" puzzle pieces together to form a whole picture. Integration tests focus " -"on how different pieces of your code fit and work together." -msgstr "" - -#: ../../tests/test-types.md:76 -msgid "" -"For example, if you had a series of steps that collected temperature data" -" in a spreadsheet, converted it from degrees celsius to Fahrenheit and " -"then provided an average temperature for a particular time period. An " -"integration test would ensure that all parts of that workflow behaved as " -"expected." -msgstr "" - -#: ../../tests/test-types.md:107 -msgid "" -"image of two puzzle pieces with some missing parts. The puzzle pieces are" -" purple teal yellow and blue. The shapes of each piece don’t fit " -"together." -msgstr "" - -#: ../../tests/test-types.md:112 -msgid "" -"If puzzle pieces have missing ends, they can’t work together with other " -"elements in the puzzle. The same is true with individual functions, " -"methods and classes in your software. The code needs to work both " -"individually and together to perform certain sets of tasks." -msgstr "" - -#: ../../tests/test-types.md:120 -msgid "" -"Your integration tests should ensure that parts of your code that are " -"expected to work together, do so as expected." -msgstr "" - -#: ../../tests/test-types.md:124 -msgid "End-to-end (functional) tests" -msgstr "" - -#: ../../tests/test-types.md:126 -msgid "" -"End-to-end tests (also referred to as functional tests) in Python are " -"like comprehensive checklists for your software. They simulate real user " -"end-to-end workflows to make sure the code base supports real life " -"applications and use-cases from start to finish. These tests help catch " -"issues that might not show up in smaller tests and ensure your entire " -"application or program behaves correctly. Think of them as a way to give " -"your software a final check before it's put into action, making sure it's" -" ready to deliver a smooth experience to its users." -msgstr "" - -#: ../../tests/test-types.md:128 -msgid "Image of a completed puzzle showing a daisy" -msgstr "" - -#: ../../tests/test-types.md:133 -msgid "" -"End-to-end or functional tests represent an entire workflow that you " -"expect your package to support." -msgstr "" - -#: ../../tests/test-types.md:137 -msgid "" -"End-to-end test also test how a program runs from start to finish. A " -"tutorial that you add to your documentation that runs in CI in an " -"isolated environment is another example of an end-to-end test." -msgstr "" - -#: ../../tests/test-types.md:140 -msgid "" -"For scientific packages, creating short tutorials that highlight core " -"workflows that your package supports, that are run when your " -"documentation is built could also serve as end-to-end tests." -msgstr "" - -#: ../../tests/test-types.md:143 -msgid "Comparing unit, integration and end-to-end tests" -msgstr "" - -#: ../../tests/test-types.md:145 -msgid "" -"Unit tests, integration tests, and end-to-end tests have complementary " -"advantages and disadvantages. The fine-grained nature of unit tests make " -"them well-suited for isolating where errors are occurring. However, unit " -"tests are not useful for verifying that different sections of code work " -"together." -msgstr "" - -#: ../../tests/test-types.md:147 -msgid "" -"Integration and end-to-end tests verify that the different portions of " -"the program work together, but are less well-suited for isolating where " -"errors are occurring. For example, when you refactor your code, it is " -"possible that that your end-to-end tests will break. But if the refactor " -"didn't introduce new behavior to your existing code, then you can rely on" -" your unit tests to continue to pass, testing the original functionality " -"of your code." -msgstr "" - -#: ../../tests/test-types.md:152 -msgid "" -"It is important to note that you don't need to spend energy worrying " -"about the specifics surrounding the different types of tests. When you " -"begin to work on your test suite, consider what your package does and how" -" you may need to test parts of your package. Bring familiar with the " -"different types of tests can provides a framework to help you think about" -" writing tests and how different types of tests can complement each " -"other." -msgstr "" - -#: ../../tests/tests-ci.md:1 -msgid "Run tests with Continuous Integration" -msgstr "" - -#: ../../tests/tests-ci.md:3 -msgid "" -"Running your [test suite locally](run-tests) is useful as you develop " -"code and also test new features or changes to the code base. However, you" -" also will want to setup Continuous Integration (CI) to run your tests " -"online. CI allows you to run all of your tests in the cloud. While you " -"may only be able to run tests locally on a specific operating system, " -"using CI you can specify tests to run both on various versions of Python " -"and across different operating systems." -msgstr "" - -#: ../../tests/tests-ci.md:5 -msgid "" -"CI can also be triggered for pull requests and pushes to your repository." -" This means that every pull request that you, your maintainer team or a " -"contributor submit, can be tested. In the end CI testing ensures your " -"code continues to run as expected even as changes are made to the code " -"base." -msgstr "" - -#: ../../tests/tests-ci.md:9 -msgid "" -"Learn more about Continuous Integration and how it can be used, here. " -"(add link)" -msgstr "" - -#: ../../tests/tests-ci.md:13 -msgid "CI & pull requests" -msgstr "" - -#: ../../tests/tests-ci.md:15 -msgid "" -"CI is invaluable if you have outside people contributing to your " -"software. You can setup CI to run on all pull requests submitted to your " -"repository. CI can make your repository more friendly to new potential " -"contributors. It allows users to contribute code, documentation fixes and" -" more without having to create development environments, run tests and " -"build documentation locally." -msgstr "" - -#: ../../tests/tests-ci.md:22 -msgid "Example GitHub action that runs tests" -msgstr "" - -#: ../../tests/tests-ci.md:24 -msgid "" -"Below is an example GitHub action that runs tests using nox across both " -"Windows, Mac and Linux and on Python versions 3.9-3.11." -msgstr "" - -#: ../../tests/tests-ci.md:28 -msgid "" -"To work properly, this file should be located in a root directory of your" -" GitHub repository:" -msgstr "" - -#: ../../tests/write-tests.md:1 -msgid "Write tests for your Python package" -msgstr "" - -#: ../../tests/write-tests.md:3 -msgid "" -"Writing code that tests your package code, also known as test suites, is " -"important for you as a maintainer, your users, and package contributors. " -"Test suites consist of sets of functions, methods, and classes that are " -"written with the intention of making sure a specific part of your code " -"works as you expected it to." -msgstr "" - -#: ../../tests/write-tests.md:7 -msgid "Why write tests for your package?" -msgstr "" - -#: ../../tests/write-tests.md:9 -msgid "" -"Tests act as a safety net for code changes. They help you spot and " -"rectify bugs before they affect users. Tests also instill confidence that" -" code alterations from contributors won't breaking existing " -"functionality." -msgstr "" - -#: ../../tests/write-tests.md:13 -msgid "Writing tests for your Python package is important because:" -msgstr "" - -#: ../../tests/write-tests.md:15 -msgid "" -"**Catch Mistakes:** Tests are a safety net. When you make changes or add " -"new features to your package, tests can quickly tell you if you " -"accidentally broke something that was working fine before." -msgstr "" - -#: ../../tests/write-tests.md:16 -msgid "" -"**Save Time:** Imagine you have a magic button that can automatically " -"check if your package is still working properly. Tests are like that " -"magic button! They can run all those checks for you saving you time." -msgstr "" - -#: ../../tests/write-tests.md:17 -msgid "" -"**Easier Collaboration:** If you're working with others, or have outside " -"contributors, tests help everyone stay on the same page. Your tests " -"explain how your package is supposed to work, making it easier for others" -" to understand and contribute to your project." -msgstr "" - -#: ../../tests/write-tests.md:18 -msgid "" -"**Fearless Refactoring:** Refactoring means making improvements to your " -"code structure without changing its behavior. Tests empower you to make " -"these changes as if you break something, test failures will let you know." -msgstr "" - -#: ../../tests/write-tests.md:19 -msgid "" -"**Documentation:** Tests serve as technical examples of how to use your " -"package. This can be helpful for a new technical contributor that wants " -"to contribute code to your package. They can look at your tests to " -"understand how parts of your code functionality fits together." -msgstr "" - -#: ../../tests/write-tests.md:20 -msgid "" -"**Long-Term ease of maintenance:** As your package evolves, tests ensure " -"that your code continues to behave as expected, even as you make changes " -"over time. Thus you are helping your future self when writing tests." -msgstr "" - -#: ../../tests/write-tests.md:21 -msgid "" -"**Easier pull request reviews:** By running your tests in a CI framework " -"such as GitHub actions, each time you or a contributor makes a change to " -"your code-base, you can catch issues and things that may have changed in " -"your code base. This ensures that your software behaves the way you " -"expect it to." -msgstr "" - -#: ../../tests/write-tests.md:23 -msgid "Tests for user edge cases" -msgstr "" - -#: ../../tests/write-tests.md:25 -msgid "" -"Edge cases refer to unexpected or \"outlier\" ways that some users may " -"use your package. Tests enable you to address various edge cases that " -"could impair your package's functionality. For example, what occurs if a " -"function expects a pandas `dataframe` but a user supplies a numpy " -"`array`? Does your code gracefully handle this situation, providing clear" -" feedback, or does it leave users frustrated by an unexplained failure?" -msgstr "" - -#: ../../tests/write-tests.md:33 -msgid "" -"For a good introduction to testing, see [this Software Carpentry " -"lesson](https://swcarpentry.github.io/python-novice-" -"inflammation/10-defensive.html)" -msgstr "" - -#: ../../tests/write-tests.md:41 -msgid "" -"Imagine you're working on a puzzle where each puzzle piece represents a " -"function, method, class or attribute in your Python package that you want" -" other people to be able to use. Would you want to give someone a puzzle " -"that has missing pieces or pieces that don't fit together? Providing " -"people with the right puzzle pieces that work together can be compared to" -" writing tests for your Python package." -msgstr "" - -#: ../../tests/write-tests.md:44 -msgid "Test examples" -msgstr "" - -#: ../../tests/write-tests.md:47 -msgid "" -"Let’s say you have a Python function that adds two numbers a and b " -"together." -msgstr "" - -#: ../../tests/write-tests.md:54 -msgid "" -"A test to ensure that function runs as you might expect when provided " -"with different numbers might look like this:" -msgstr "" - -#: ../../tests/write-tests.md:72 -msgid "🧩🐍" -msgstr "" - -#: ../../tests/write-tests.md:74 -msgid "How do I know what type of tests to write?" -msgstr "" - -#: ../../tests/write-tests.md:77 -msgid "" -"This section has been adapted from [a presentation by Nick " -"Murphy](https://zenodo.org/record/8185113)." -msgstr "" - -#: ../../tests/write-tests.md:80 -msgid "" -"At this point, you may be wondering - what should you be testing in your " -"package? Below are a few examples:" -msgstr "" - -#: ../../tests/write-tests.md:82 -msgid "" -"**Test some typical cases:** Test that the package functions as you " -"expect it to when users use it. For instance, if your package is supposed" -" to add two numbers, test that the outcome value of adding those two " -"numbers is correct." -msgstr "" - -#: ../../tests/write-tests.md:84 -msgid "" -"**Test special cases:** Sometimes there are special or outlier cases. For" -" instance, if a function performs a specific calculation that may become " -"problematic closer to the value = 0, test it with the input of both 0 and" -msgstr "" - -#: ../../tests/write-tests.md:86 -msgid "" -"**Test at and near the expected boundaries:** If a function requires a " -"value that is greater than or equal to 1, make sure that the function " -"still works with both the values 1 and less than one and 1.001 as well " -"(something close to the constraint value).." -msgstr "" - -#: ../../tests/write-tests.md:88 -msgid "" -"**Test that code fails correctly:** If a function requires a value " -"greater than or equal to 1, then test at 0.999. Make sure that the " -"function fails gracefully when given unexpected values and help and that " -"the user can easily understand why if failed (provides a useful error " -"message)." -msgstr "" - diff --git a/locales/ja/LC_MESSAGES/tutorials.po b/locales/ja/LC_MESSAGES/tutorials.po deleted file mode 100644 index 6f88c534..00000000 --- a/locales/ja/LC_MESSAGES/tutorials.po +++ /dev/null @@ -1,5537 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2024, pyOpenSci -# This file is distributed under the same license as the pyOpenSci Python -# Package Guide package. -# FIRST AUTHOR , 2024. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: pyOpenSci Python Package Guide \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-02 18:04+0900\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: ja\n" -"Language-Team: ja \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" - -#: ../../tutorials/add-license-coc.md:1 -msgid "Add a `LICENSE` & `CODE_OF_CONDUCT` to your Python package" -msgstr "" - -#: ../../tutorials/add-license-coc.md:3 -msgid "In the [previous lesson](add-readme) you:" -msgstr "" - -#: ../../tutorials/add-license-coc.md:5 -msgid "" -" " -"Created a basic `README.md` file for your scientific Python package" -msgstr "" - -#: ../../tutorials/add-license-coc.md:7 -msgid "" -" " -"Learned about the core components that are useful to have in a `README` " -"file." -msgstr "" - -#: ../../tutorials/add-license-coc.md:9 ../../tutorials/add-readme.md:10 -msgid "Learning objectives" -msgstr "" - -#: ../../tutorials/add-license-coc.md:12 ../../tutorials/add-readme.md:12 -#: ../../tutorials/installable-code.md:41 ../../tutorials/pyproject-toml.md:22 -#: ../../tutorials/setup-py-to-pyproject-toml.md:15 -msgid "In this lesson you will learn:" -msgstr "" - -#: ../../tutorials/add-license-coc.md:14 -msgid "" -"How to select a license and add a `LICENSE` file to your package " -"repository, with a focus on the GitHub interface." -msgstr "" - -#: ../../tutorials/add-license-coc.md:15 -msgid "How to add a `CODE_OF_CONDUCT` file to your package repository." -msgstr "" - -#: ../../tutorials/add-license-coc.md:16 -msgid "" -"How you can use the Contributors Covenant website to add generic language" -" as a starting place for your `CODE_OF_CONDUCT`." -msgstr "" - -#: ../../tutorials/add-license-coc.md:19 -msgid "What is a license?" -msgstr "" - -#: ../../tutorials/add-license-coc.md:21 -msgid "" -"A license contains legal language about how users can use and reuse your " -"software. To set the `LICENSE` for your project, you:" -msgstr "" - -#: ../../tutorials/add-license-coc.md:23 -msgid "" -"create a `LICENSE` file in your project directory that specifies the " -"license that you choose for your package and" -msgstr "" - -#: ../../tutorials/add-license-coc.md:24 -msgid "reference that file in your `pyproject.toml` data where metadata are set." -msgstr "" - -#: ../../tutorials/add-license-coc.md:26 -msgid "" -"By adding the `LICENSE` file to your `pyproject.toml` file, the `LICENSE`" -" will be included in your package's metadata which is used to populate " -"your package's PyPI landing page. The `LICENSE` is also used in your " -"GitHub repository's landing page interface." -msgstr "" - -#: ../../tutorials/add-license-coc.md:28 -msgid "What license should you use?" -msgstr "" - -#: ../../tutorials/add-license-coc.md:30 -msgid "" -"We suggest that you use a permissive license that accommodates the other " -"most commonly used licenses in the scientific Python ecosystem (MIT[^mit]" -" and BSD-3[^bsd3]). If you are unsure, use MIT given it's the generally " -"recommended license on [choosealicense.com](https://choosealicense.com/)." -msgstr "" - -#: ../../tutorials/add-license-coc.md:33 -msgid "Licenses for the scientific Python ecosystem" -msgstr "" - -#: ../../tutorials/add-license-coc.md:34 -msgid "" -"[We discuss licenses for the scientific Python ecosystem in more detail " -"here in our guidebook.](../documentation/repository-files/license-files)" -msgstr "" - -#: ../../tutorials/add-license-coc.md:37 -msgid "Where should the `LICENSE` file live" -msgstr "" - -#: ../../tutorials/add-license-coc.md:39 -msgid "" -"Your `LICENSE` file should be placed at the root of your package's " -"repository. When you add the `LICENSE` at the root, GitHub will " -"automagically discover it and provide users with a direct link to your " -"`LICENSE` file within your GitHub repository." -msgstr "" - -#: ../../tutorials/add-license-coc.md:45 -msgid "" -"Image showing the GitHub repository for SunPy an accepted pyOpenSci " -"package." -msgstr "" - -#: ../../tutorials/add-license-coc.md:47 -msgid "" -"Notice at the top of the README portion of the GitHub landing page, there" -" are three tabs directly linking to the `README` file which is visible, " -"the `CODE_OF_CONDUCT` file and one that specifies the license that SunPy " -"uses. These files are discovered by GitHub because they are placed in the" -" root of the project directory using standard naming conventions." -msgstr "" - -#: ../../tutorials/add-license-coc.md:54 -msgid "How to add a `LICENSE` file to your package directory" -msgstr "" - -#: ../../tutorials/add-license-coc.md:56 -msgid "There are several ways to add a `LICENSE` file:" -msgstr "" - -#: ../../tutorials/add-license-coc.md:58 -msgid "" -"When you create a new repository on GitHub, it will ask you if you wish " -"to add a `LICENSE` file at that time. If you select yes, it will create " -"the file for you." -msgstr "" - -#: ../../tutorials/add-license-coc.md:59 -msgid "" -"You can add a `LICENSE` through the GitHub gui following the [ instructions " -"here](https://docs.github.com/en/communities/setting-up-your-project-for-" -"healthy-contributions/adding-a-license-to-a-repository)." -msgstr "" - -#: ../../tutorials/add-license-coc.md:60 -msgid "You can add the file manually as we are doing in this lesson." -msgstr "" - -#: ../../tutorials/add-license-coc.md:63 -msgid "If you completed the past lessons including" -msgstr "" - -#: ../../tutorials/add-license-coc.md:65 -msgid "[Making your code installable](installable-code.md) and" -msgstr "" - -#: ../../tutorials/add-license-coc.md:66 -msgid "[publishing your package to PyPI](publish-pypi.md)" -msgstr "" - -#: ../../tutorials/add-license-coc.md:68 -msgid "" -"then you already have a `LICENSE` file containing text for the MIT " -"license in your Python package. Thus you can skip to the next section of " -"this tutorial which walks you through adding a `CODE_OF_CONDUCT`." -msgstr "" - -#: ../../tutorials/add-license-coc.md:70 -msgid "" -"If you don't yet have a `LICENSE` file in your directory, then continue " -"reading." -msgstr "" - -#: ../../tutorials/add-license-coc.md:73 -msgid "How to add a `LICENSE` to your package - the manual way" -msgstr "" - -#: ../../tutorials/add-license-coc.md:75 -msgid "" -"If you don't already have a `LICENSE` file, and you are not yet using a " -"platform such as GitHub or GitLab, then you can create a `LICENSE` file " -"by" -msgstr "" - -#: ../../tutorials/add-license-coc.md:77 -msgid "Create a new file called `LICENSE`. If you are using shell you can type:" -msgstr "" - -#: ../../tutorials/add-license-coc.md:84 -msgid "Go to [choosealicense.com](https://choosealicense.com/)" -msgstr "" - -#: ../../tutorials/add-license-coc.md:85 -msgid "Select permissive license" -msgstr "" - -#: ../../tutorials/add-license-coc.md:86 -msgid "" -"It will suggest that you use the [MIT " -"license](https://choosealicense.com/licenses/mit/)." -msgstr "" - -#: ../../tutorials/add-license-coc.md:87 -msgid "" -"Copy the license text that it provides into your `LICENSE` file that you " -"created above." -msgstr "" - -#: ../../tutorials/add-license-coc.md:88 -msgid "Save your file. You're all done!" -msgstr "" - -#: ../../tutorials/add-license-coc.md:90 -msgid "An overview of licenses in the scientific Python ecosystem" -msgstr "" - -#: ../../tutorials/add-license-coc.md:93 -msgid "" -"In the pyOpenSci [packaging guidebook](../documentation/repository-files" -"/license-files), we provide an overview of licenses in the scientific " -"Python ecosystem. We review why license files are important, which ones " -"are most commonly used for scientific software and how to select the " -"correct license." -msgstr "" - -#: ../../tutorials/add-license-coc.md:95 -msgid "" -"If you want a broad overview of why licenses are important for protecting" -" open source software, [check out this blog post that overviews the legal" -" side of things.](https://opensource.guide/legal/#just-give-me-the-tldr-" -"on-what-i-need-to-protect-my-project)" -msgstr "" - -#: ../../tutorials/add-license-coc.md -msgid "Instructions for adding a `LICENSE` file within the GitHub interface" -msgstr "" - -#: ../../tutorials/add-license-coc.md -msgid "Add license: new GitHub repository" -msgstr "" - -#: ../../tutorials/add-license-coc.md:106 -msgid "" -"When you create a new GitHub repository you can add a `LICENSE` file " -"through the GitHub interface." -msgstr "" - -#: ../../tutorials/add-license-coc.md:111 -msgid "" -"Screenshot of the create new repository interface that GitHub provides. " -"The elements of this are the owner and repository name for the new repo. " -"Below that you can add a description of the repository. Below that you " -"can set it to be public or private. At the bottom of the interface there " -"is an Add a README checkbox where it will add a blank readme file for " -"you. At the very bottom there is a line to add a .gitignore file and " -"another to choose a license." -msgstr "" - -#: ../../tutorials/add-license-coc.md:113 -msgid "" -"Image showing the GitHub interface that allows you to add a `LICENSE` and" -" `README` file when you create a new repository." -msgstr "" - -#: ../../tutorials/add-license-coc.md -msgid "Add `LICENSE`: Existing GitHub repository" -msgstr "" - -#: ../../tutorials/add-license-coc.md:119 -msgid "" -"If you already have a GitHub repository for your package, then you can " -"add a `LICENSE` using the GitHub interface by adding a new file to the " -"repository." -msgstr "" - -#: ../../tutorials/add-license-coc.md:121 -msgid "" -"Follow the instructions to select and add a license to your repository on" -" the [GitHub LICENSE page](https://docs.github.com/en/communities" -"/setting-up-your-project-for-healthy-contributions/adding-a-license-" -"to-a-repository) ." -msgstr "" - -#: ../../tutorials/add-license-coc.md:122 -msgid "" -"Once you have added your `LICENSE` file, be sure to sync your git local " -"repository with the repository on GitHub.com. This means running `git " -"pull` to update your local branch." -msgstr "" - -#: ../../tutorials/add-license-coc.md:125 -msgid "" -"Image showing what the LICENSE file looks like in the GItHub interface. " -"At the top you can see the actual license which in this image is BSD " -"3-clause New or revised license. Then there is some text describing both " -"what the license is and the associated permissions for that specific " -"license. At the bottom of the image, the actual text for the license is " -"shown in the LICENSE file." -msgstr "" - -#: ../../tutorials/add-license-coc.md:127 -msgid "" -"You can view a summary of the `LICENSE` chosen on your project's GitHub " -"landing page." -msgstr "" - -#: ../../tutorials/add-license-coc.md:134 -msgid "" -"Now you know how to add a `LICENSE` to your project. Next, you'll learn " -"about the `CODE_OF_CONDUCT.md` file and how to add it to your package " -"directory." -msgstr "" - -#: ../../tutorials/add-license-coc.md:139 -msgid "What is a code of conduct file?" -msgstr "" - -#: ../../tutorials/add-license-coc.md:141 -msgid "" -"A `CODE_OF_CONDUCT` file is used to establish guidelines for how people " -"in your community interact." -msgstr "" - -#: ../../tutorials/add-license-coc.md:143 -msgid "" -"This file is critical to supporting your community as it grows. The " -"`CODE_OF_CONDUCT`:" -msgstr "" - -#: ../../tutorials/add-license-coc.md:146 -msgid "" -"Establishes guidelines for how users and contributors interact with each " -"other and you in your software repository." -msgstr "" - -#: ../../tutorials/add-license-coc.md:147 -msgid "Identifies negative behaviors that you don't want in your interactions." -msgstr "" - -#: ../../tutorials/add-license-coc.md:149 -msgid "" -"You can use your code of conduct as a tool that can be referenced when " -"moderating challenging conversations." -msgstr "" - -#: ../../tutorials/add-license-coc.md:151 -msgid "What to put in your `CODE_OF_CONDUCT` file" -msgstr "" - -#: ../../tutorials/add-license-coc.md:153 -msgid "" -"If you are unsure of what language to add to your `CODE_OF_CONDUCT` file," -" we suggest that you adopt the [contributor covenant " -"language](https://www.contributor-" -"covenant.org/version/2/1/code_of_conduct/) as a starting place." -msgstr "" - -#: ../../tutorials/add-license-coc.md:156 -msgid "" -"![Contributor " -"Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)" -msgstr "" - -#: ../../tutorials/add-license-coc.md:156 -msgid "Contributor Covenant" -msgstr "" - -#: ../../tutorials/add-license-coc.md:158 -msgid "" -"The `CODE_OF_CONDUCT.md` should be placed at the root of your project " -"directory, similar to the `LICENSE` file." -msgstr "" - -#: ../../tutorials/add-license-coc.md:160 -msgid "How to add a `CODE_OF_CONDUCT` file to your package directory" -msgstr "" - -#: ../../tutorials/add-license-coc.md:162 -msgid "" -"Add a `CODE_OF_CONDUCT.md` file to the root of your repository if it " -"doesn't already exist." -msgstr "" - -#: ../../tutorials/add-license-coc.md:168 -msgid "" -"Visit the [contributor covenant website](https://www.contributor-" -"covenant.org/) and add [the markdown version of their code of " -"conduct](https://www.contributor-" -"covenant.org/version/2/1/code_of_conduct/code_of_conduct.md) to your " -"`CODE_OF_CONDUCT.md` file. Be sure to fill in any placeholder " -"information. Read the text closely to ensure you both understand it and " -"also agree with its contents!" -msgstr "" - -#: ../../tutorials/add-license-coc.md:170 -msgid "That's it - you've now added a code of conduct to your package directory." -msgstr "" - -#: ../../tutorials/add-license-coc.md:172 -msgid "Additional Code of Conduct resources" -msgstr "" - -#: ../../tutorials/add-license-coc.md:175 -msgid "" -"[ Guide: `CODE_OF_CONDUCT.md` " -"files](https://docs.github.com/en/communities/setting-up-your-project-" -"for-healthy-contributions/adding-a-code-of-conduct-to-your-project)" -msgstr "" - -#: ../../tutorials/add-license-coc.md:176 -msgid "" -"[pyOpenSci package guide `CODE_OF_CONDUCT.md` " -"overview](https://www.pyopensci.org/python-package-guide/documentation" -"/repository-files/code-of-conduct-file.html)" -msgstr "" - -#: ../../tutorials/add-license-coc.md:179 ../../tutorials/add-readme.md:233 -#: ../../tutorials/publish-conda-forge.md:463 -#: ../../tutorials/pyproject-toml.md:673 -msgid " Wrap up" -msgstr "" - -#: ../../tutorials/add-license-coc.md:181 -msgid "In this lesson and the [last lesson](add-readme), you have added a:" -msgstr "" - -#: ../../tutorials/add-license-coc.md:183 -msgid "`README` file;" -msgstr "" - -#: ../../tutorials/add-license-coc.md:184 -msgid "`LICENSE` file and a" -msgstr "" - -#: ../../tutorials/add-license-coc.md:185 -msgid "`CODE_OF_CONDUCT` file." -msgstr "" - -#: ../../tutorials/add-license-coc.md:187 -msgid "" -"These are fundamental files needed for every scientific Python package " -"repository. These files help users understand how to use your package and" -" interact with package maintainers." -msgstr "" - -#: ../../tutorials/add-license-coc.md:191 -msgid "In the upcoming lessons, you will:" -msgstr "" - -#: ../../tutorials/add-license-coc.md:193 -msgid "" -"[Add more metadata to your `pyproject.toml` file](pyproject-toml) to " -"support building and publishing your package on PyPI." -msgstr "" - -#: ../../tutorials/add-license-coc.md:194 -msgid "" -"Publish a new version of your Python package to the test PyPI to preview " -"the updated metadata landing page." -msgstr "" - -#: ../../tutorials/add-license-coc.md:199 -#: ../../tutorials/installable-code.md:642 -#: ../../tutorials/publish-conda-forge.md:475 -#: ../../tutorials/publish-pypi.md:394 -msgid "Footnotes" -msgstr "" - -#: ../../tutorials/add-license-coc.md:201 -msgid "https://opensource.org/license/mit/" -msgstr "" - -#: ../../tutorials/add-license-coc.md:202 -msgid "https://opensource.org/license/bsd-3-clause/" -msgstr "" - -#: ../../tutorials/add-readme.md:1 -msgid "Add a README file to your Python package" -msgstr "" - -#: ../../tutorials/add-readme.md:3 -msgid "In the previous lessons you learned:" -msgstr "" - -#: ../../tutorials/add-readme.md:5 -msgid "[What a Python package is](intro.md)" -msgstr "" - -#: ../../tutorials/add-readme.md:6 -msgid "[How to make your code installable](installable-code)" -msgstr "" - -#: ../../tutorials/add-readme.md:7 -msgid "[How to publish your package to (test) PyPI](publish-pypi.md)" -msgstr "" - -#: ../../tutorials/add-readme.md:8 -msgid "[How to publish your package to conda-forge](publish-conda-forge.md)" -msgstr "" - -#: ../../tutorials/add-readme.md:14 -msgid "How to add a **README.md** file to your package." -msgstr "" - -#: ../../tutorials/add-readme.md:15 -msgid "What the core elements of a **README.md** file are." -msgstr "" - -#: ../../tutorials/add-readme.md:18 -msgid "What is a README file?" -msgstr "" - -#: ../../tutorials/add-readme.md:20 -msgid "" -"The `README.md` file is a markdown file located at the root of your " -"project directory that helps a user understand:" -msgstr "" - -#: ../../tutorials/add-readme.md:23 -msgid "You package's name" -msgstr "" - -#: ../../tutorials/add-readme.md:24 -msgid "" -"What the package does. Your README file should clearly state the " -"problem(s) that your software is designed to solve and its target " -"audience." -msgstr "" - -#: ../../tutorials/add-readme.md:25 -msgid "The current development \"state\" of the package (through badges)" -msgstr "" - -#: ../../tutorials/add-readme.md:26 -msgid "How to get started with using your package." -msgstr "" - -#: ../../tutorials/add-readme.md:27 -msgid "How to contribute to your package" -msgstr "" - -#: ../../tutorials/add-readme.md:28 -msgid "How to cite your package" -msgstr "" - -#: ../../tutorials/add-readme.md:30 -msgid "" -"Your **README.md** file is important as it is often the first thing that " -"someone sees before they install your package. The README file is also " -"used to populate your PyPI landing page." -msgstr "" - -#: ../../tutorials/add-readme.md:32 -msgid "" -"Note that there is no specific content structure for README files. " -"However, this tutorial outlines the sections that we suggest that you " -"include in your README file." -msgstr "" - -#: ../../tutorials/add-readme.md:36 -msgid "Create a README.md file for your package" -msgstr "" - -#: ../../tutorials/add-readme.md:38 -msgid "It's time to add a `README.md` file to your project directory." -msgstr "" - -#: ../../tutorials/add-readme.md:40 -msgid "Step 0: Create a README file" -msgstr "" - -#: ../../tutorials/add-readme.md:41 -msgid "" -"To get started, if you don't already have a README.md file in your " -"project directory, create one." -msgstr "" - -#: ../../tutorials/add-readme.md:44 -msgid "If you created your project directory from" -msgstr "" - -#: ../../tutorials/add-readme.md:46 -msgid "a GitHub repository online" -msgstr "" - -#: ../../tutorials/add-readme.md:47 -msgid "using `hatch init`" -msgstr "" - -#: ../../tutorials/add-readme.md:49 -msgid "Then you may already have a README.MD file in your project directory." -msgstr "" - -#: ../../tutorials/add-readme.md:55 -msgid "Step 1: Add the name of your package as the README title" -msgstr "" - -#: ../../tutorials/add-readme.md:57 -msgid "At the top of the `README.md` file, add the name of your package." -msgstr "" - -#: ../../tutorials/add-readme.md:59 -msgid "" -"If you are using markdown it should be a header 1 (H1) tag which is " -"denoted with a single `#` sign." -msgstr "" - -#: ../../tutorials/add-readme.md:61 -msgid "`# Package-title-here`" -msgstr "" - -#: ../../tutorials/add-readme.md:63 -msgid "Step 2: add badges to the top of your README file" -msgstr "" - -#: ../../tutorials/add-readme.md:65 -msgid "" -"It's common for maintainers to add badges to the top of their README " -"files. Badges allow you and your package users to track things like:" -msgstr "" - -#: ../../tutorials/add-readme.md:67 -msgid "Broken documentation and test builds." -msgstr "" - -#: ../../tutorials/add-readme.md:68 -msgid "Versions of your package that are on PyPI and conda." -msgstr "" - -#: ../../tutorials/add-readme.md:69 -msgid "" -"Whether your package has been reviewed and vetted by an organization such" -" as pyOpenSci and/or JOSS." -msgstr "" - -#: ../../tutorials/add-readme.md:71 -msgid "" -"If you have already published your package to pypi.org you can use " -"[shields.io to create a package version badge](https://shields.io/badges" -"/py-pi-version). This badge will dynamically update as you release new " -"versions of your package to PyPI." -msgstr "" - -#: ../../tutorials/add-readme.md:73 -msgid "" -"If not, you can leave the top empty for now and add badges to your README" -" at a later point as they make sense." -msgstr "" - -#: ../../tutorials/add-readme.md:75 -msgid "Step 3: Add a description of what your package does" -msgstr "" - -#: ../../tutorials/add-readme.md:77 -msgid "" -"Below the badges (if you have them), add a section of text that provides " -"an easy-to-understand overview of what your package does." -msgstr "" - -#: ../../tutorials/add-readme.md:81 -msgid "Keep this section short." -msgstr "" - -#: ../../tutorials/add-readme.md:82 -msgid "Try to avoid jargon." -msgstr "" - -#: ../../tutorials/add-readme.md:83 -msgid "" -"Define technical terms that you use to make the description accessible to" -" more people." -msgstr "" - -#: ../../tutorials/add-readme.md:85 -msgid "" -"Remember that the more people understand what your package does, the more" -" people will use it." -msgstr "" - -#: ../../tutorials/add-readme.md:87 -msgid "Step 4: Add package installation instructions" -msgstr "" - -#: ../../tutorials/add-readme.md:89 -msgid "Next, add instructions that tell users how to install your package." -msgstr "" - -#: ../../tutorials/add-readme.md:91 -msgid "" -"For example, can they use pip to install your package? `python -m pip " -"install packagename`" -msgstr "" - -#: ../../tutorials/add-readme.md:94 -msgid "or conda?" -msgstr "" - -#: ../../tutorials/add-readme.md:96 -msgid "`conda install -c conda-forge packagename`." -msgstr "" - -#: ../../tutorials/add-readme.md:98 -msgid "" -"If you haven't yet published your package to pypi.org then you can skip " -"this section and come back and add these instructions later." -msgstr "" - -#: ../../tutorials/add-readme.md:102 -msgid "Step 5: Any additional setup" -msgstr "" - -#: ../../tutorials/add-readme.md:104 -msgid "" -"In some cases, your package users may need to manually install other " -"tools in order to use your package. If that is the case, be sure to add a" -" section on additional setup to your README file." -msgstr "" - -#: ../../tutorials/add-readme.md:109 -msgid "" -"Here, briefly document (or link to documentation for) any additional " -"setup that is required to use your package. This might include:" -msgstr "" - -#: ../../tutorials/add-readme.md:113 -msgid "authentication information, if it is applicable to your package." -msgstr "" - -#: ../../tutorials/add-readme.md:114 -msgid "additional tool installations, such as GDAL." -msgstr "" - -#: ../../tutorials/add-readme.md:117 -msgid "" -"Many packages won't need an additional setup section in their README. In " -"that case you can always skip this section." -msgstr "" - -#: ../../tutorials/add-readme.md:122 -msgid "Step 6: Add a get started section" -msgstr "" - -#: ../../tutorials/add-readme.md:124 -msgid "" -"Next add a get-started section. Within this section, add a small code " -"example that demonstrates importing and using some of the functionality " -"in your package." -msgstr "" - -#: ../../tutorials/add-readme.md:127 -msgid "Provide a fully functional code snippet if possible" -msgstr "" - -#: ../../tutorials/add-readme.md:130 -msgid "" -"It is important to try to make the code examples that you provide your " -"users as useful as possible." -msgstr "" - -#: ../../tutorials/add-readme.md:132 -msgid "" -"Be sure to provide a copy/paste code example that will work as-is when " -"pasted into a Jupyter Notebook or .py file if that is possible." -msgstr "" - -#: ../../tutorials/add-readme.md:134 -msgid "" -"If there are tokens and other steps needed to run your package, be sure " -"to be clear about what those steps are." -msgstr "" - -#: ../../tutorials/add-readme.md:137 -msgid "For the pyosPackage, a short get started demo might look like this:" -msgstr "" - -#: ../../tutorials/add-readme.md:145 -msgid "" -"Or it could simply be a link to a getting started tutorial that you have " -"created. If you don't have this yet, you can leave it empty for the time " -"being." -msgstr "" - -#: ../../tutorials/add-readme.md:148 -msgid "" -"This would also be a great place to add links to tutorials that help " -"users understand how to use your package for common workflows." -msgstr "" - -#: ../../tutorials/add-readme.md:153 -msgid "Step 7: Community section" -msgstr "" - -#: ../../tutorials/add-readme.md:155 -msgid "" -"The community section of your README file is a place to include " -"information for users who may want to engage with your project. This " -"engagement will likely happen on a platform like GitHub or GitLab." -msgstr "" - -#: ../../tutorials/add-readme.md:157 -msgid "" -"In the community section, you will add links to your contributing guide " -"and `CODE_OF_CONDUCT.md`. You will create a [`CODE_OF_CONDUCT.md` file in" -" the next lesson](add-license-coc)." -msgstr "" - -#: ../../tutorials/add-readme.md:160 -msgid "" -"As your package grows you may also have a link to a development guide " -"that contributors and your maintainer team will follow. The development " -"guide outlines how to perform maintenance tasks such as:" -msgstr "" - -#: ../../tutorials/add-readme.md:163 -msgid "running tests" -msgstr "" - -#: ../../tutorials/add-readme.md:164 -msgid "making package releases" -msgstr "" - -#: ../../tutorials/add-readme.md:165 -msgid "building documentation" -msgstr "" - -#: ../../tutorials/add-readme.md:166 -msgid "and more." -msgstr "" - -#: ../../tutorials/add-readme.md:170 -msgid "Step 8: Citation information" -msgstr "" - -#: ../../tutorials/add-readme.md:172 -msgid "" -"Finally it is important to let users know how to cite your package. You " -"can communicate citation information in a few different ways." -msgstr "" - -#: ../../tutorials/add-readme.md:175 -msgid "" -"You can use a tool such as zenodo to create a DOI and associated citation" -" information for your package if it is hosted on a platform such as " -"GitHub. [Check out this short tutorial that covers setting that " -"up.](https://coderefinery.github.io/github-without-command-line/doi/)" -msgstr "" - -#: ../../tutorials/add-readme.md:179 -msgid "" -"Alternatively if you send your package through a peer review process such" -" as the [one lead by pyOpenSci](https://www.pyopensci.org/about-peer-" -"review/index.html). After being accepted by pyOpenSci, if your package is" -" in scope, you can be accepted by the Journal of Open Source Software and" -" get a cross-ref DOI through [our partnership with the Journal of Open " -"Source Software.](https://www.pyopensci.org/about-peer-review/index.html)" -msgstr "" - -#: ../../tutorials/add-readme.md:183 -msgid "The finished README file" -msgstr "" - -#: ../../tutorials/add-readme.md:185 -msgid "Your finished `README.md` file should look something like this:" -msgstr "" - -#: ../../tutorials/add-readme.md:235 -msgid "" -"It's important to consider the information that a new user or contributor" -" might need when creating your `README.md` file. While there is no " -"perfect template, above is a set of recommendations as you are just " -"getting started. You may find the need for other elements to be added to " -"this file as you further develop your package and as a community begins " -"to use your package." -msgstr "" - -#: ../../tutorials/add-readme.md:241 -msgid "" -"In the [next lesson](add-license-coc.md), you will add a LICENSE file to " -"your Python package. A license file is critical as it tells users how " -"they legally can (and can't) use your package. It also:" -msgstr "" - -#: ../../tutorials/add-readme.md:245 -msgid "Builds trust with your users" -msgstr "" - -#: ../../tutorials/add-readme.md:246 -msgid "Discourages misuse of your package and associated code" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:1 -msgid "Get to Know Hatch" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:3 -msgid "" -"Our Python packaging tutorials use the tool " -"[Hatch](https://hatch.pypa.io/latest/). While there are [many great " -"packaging tools](/package-structure-code/python-package-build-tools) out " -"there, we have selected Hatch because:" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:8 -msgid "" -"It is an end-to-end tool that supports most of the steps required to " -"create a quality Python package. Beginners will have fewer tools to learn" -" if they use Hatch." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:11 -msgid "" -"It supports different build back-ends if you ever need to compile code in" -" other languages." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:13 -msgid "" -"As a community, pyOpenSci has decided that Hatch is a user-friendly tool " -"that supports many different scientific Python use cases." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:16 -msgid "" -"In this tutorial, you will install and get to know Hatch a bit more " -"before starting to use it." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:19 -msgid "You need two things to successfully complete this tutorial:" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:21 -msgid "You need Python installed." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:22 -msgid "You need Hatch installed." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:25 -msgid "" -"If you don't already have Python installed on your computer, Hatch will " -"do it for you when you install Hatch." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:29 -msgid "Install Hatch" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:31 -msgid "" -"To begin, follow the operating-system-specific instructions below to " -"install Hatch." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md -msgid "MAC" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:38 -msgid "" -"Follow the instructions " -"[here](https://hatch.pypa.io/latest/install/#installers)." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:40 -msgid "" -"Download the latest GUI installer for MAC [hatch-" -"universal.pkg](https://github.com/pypa/hatch/releases/latest/download" -"/hatch-universal.pkg)." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:41 -msgid "Run the installer and follow the setup instructions." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:42 -msgid "If your terminal is open, then restart it." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md -msgid "Windows" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:48 -msgid "" -"In your browser, download the correct `.msi` file for your system: " -"[hatch-x64.msi](https://github.com/pypa/hatch/releases/latest/download/hatch-x64.msi)" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:50 -msgid "Run your downloaded installer file and follow the on-screen instructions." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md -msgid "Linux" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:56 -msgid "" -"We suggest that you install Hatch using pipx on Linux. however, if you " -"prefer another method, check out the [Hatch installation " -"documentation](https://hatch.pypa.io/latest/install/) for other methods." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:70 -msgid "" -"Hatch can also be installed directly using " -"[pip](https://hatch.pypa.io/latest/install/#pip) or " -"[conda](https://hatch.pypa.io/latest/install/#conda). We encourage you to" -" follow the instructions above because we have found that the Hatch " -"installers for Windows and Mac are the easiest and most efficient." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:74 -msgid "" -"Our Linux users have found success installing Hatch with pipx if they " -"already use apt install." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:77 -msgid "" -"Both approaches (using a graphical installer on Windows/Mac and pipx) " -"ensure that you have Hatch installed globally. A global install means " -"that Hatch is available across all of your Python environments on your " -"computer." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:82 -msgid "Check that hatch installed correctly" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:84 -msgid "" -"Once you have completed the installation instructions above, you can open" -" your terminal, and make sure that Hatch installed correctly using the " -"command below:" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:92 -msgid "" -"*Note the version number output of `hatch --version` will likely be " -"different from the output above in this tutorial.*" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:95 -msgid "Configure Hatch" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:97 -msgid "" -"Once you have installed Hatch, you can customize its configuration. This " -"includes setting the default name and setup for every package you create." -" While this step is not required, we suggest that you do it." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:101 -msgid "" -"Hatch stores your configuration in a [`config.toml` " -"file](https://hatch.pypa.io/latest/config/project-templates/)." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:103 -msgid "" -"While you can update the `config.toml` file through the command line, it " -"might be easier to look at and update it in a text editor if you are " -"using it for the first time." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:107 -msgid "Step 1: Open and Edit Your `config.toml` File" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:109 -msgid "" -"To open the config file in your file browser, run the following command " -"in your shell:" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:112 -msgid "`hatch config explore`" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:114 -msgid "" -"This will open up a directory window that allows you to double-click on " -"the file and open it in your favorite text editor." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:117 -msgid "" -"You can also retrieve the location of the Hatch config file by running " -"the following command in your shell:" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:125 -msgid "Step 2 - update your email and name" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:127 -msgid "" -"Once the file is open, update the [template] table of the `config.toml` " -"file with your name and email. This information will be used in any " -"`pyproject.toml` metadata files that you create using Hatch." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:137 -msgid "Step 3" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:139 -msgid "Next, set tests to false in the `[template.plugins.default]` table." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:141 -msgid "" -"While tests are important, setting the tests configuration in Hatch to " -"`true` will create a more complex `pyproject.toml` file. You won't need " -"to use this feature in this beginner friendly tutorial series but we will" -" introduce it in later tutorials." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:146 -msgid "Your `config.toml` file should look something like the one below." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:184 -msgid "" -"Also notice that the default license option is MIT. While we will discuss" -" license in more detail in a later lesson, the MIT license is the " -"recommended permissive license from " -"[choosealicense.com](https://www.choosealicense.com) and as such we will " -"use it for this tutorial series." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:190 -msgid "You are of course welcome to select another license." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:192 -#: ../../tutorials/installable-code.md:22 -#: ../../tutorials/installable-code.md:411 -#: ../../tutorials/installable-code.md:502 ../../tutorials/intro.md:226 -#: ../../tutorials/publish-pypi.md:3 ../../tutorials/publish-pypi.md:178 -#: ../../tutorials/publish-pypi.md:350 ../../tutorials/pyproject-toml.md:718 -msgid "Todo" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:193 -msgid "" -"I think we'd need the SPDX license options here if they want to chose " -"bsd-3 for instance" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:196 -msgid "Step 4: Close the config file and run `hatch config show`" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:198 -msgid "" -"Once you have completed the steps above run the following command in your" -" shell." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:200 -msgid "`hatch config show`" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:202 -msgid "" -"`hatch config show` will print out the contents of your `config.toml` " -"file in your shell. look at the values and ensure that your name, email " -"is set. Also make sure that `tests=false`." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:206 -msgid "Hatch features" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:208 -msgid "" -"Hatch offers a suite of features that will make creating, publishing and " -"maintaining your Python package easier." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:211 -msgid "Comparison to other tools" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:213 -msgid "" -"[We compared Hatch to several of the other popular packaging tools in the" -" ecosystem including flit, pdm and poetry. Learn more here](package-" -"features)" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:216 -msgid "[More on Hatch here](hatch)" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:218 -msgid "A few features that Hatch offers" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:220 -msgid "" -"it will convert metadata stored in a `setup.py` or `setup.cfg` file to a " -"pyproject.toml file for you (see [Migrating setup.py to pyproject.toml " -"using Hatch](setup-py-to-pyproject-toml.md ))" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:222 -msgid "" -"It will help you by storing configuration information for publishing to " -"PyPI after you've entered it once." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:224 -msgid "Use `hatch -h` to see all of the available commands." -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:226 -msgid "What's next" -msgstr "" - -#: ../../tutorials/get-to-know-hatch.md:228 -msgid "" -"In the next lesson you'll learn how to package and make your code " -"installable using Hatch." -msgstr "" - -#: ../../tutorials/installable-code.md:6 -msgid "Make your Python code installable" -msgstr "" - -#: ../../tutorials/installable-code.md:8 -msgid "What we previously covered" -msgstr "" - -#: ../../tutorials/installable-code.md:9 -msgid "" -"[In the previous lesson](intro), you learned about what a Python package " -"is. You also learned about the [benefits of creating a Python package" -"](package-benefits)." -msgstr "" - -#: ../../tutorials/installable-code.md:13 -msgid "" -"Your next step in our packaging tutorial series is to create a Python " -"package that is installable both locally and remotely from a website such" -" as GitHub (or GitLab). The package that you create in this lesson will " -"have the bare minimum elements needed to be installable into a Python " -"environment." -msgstr "" - -#: ../../tutorials/installable-code.md:18 -msgid "" -"Making your code installable is an important steps towards creating a " -"full Python package that is directly installable from PyPI." -msgstr "" - -#: ../../tutorials/installable-code.md:23 -msgid "" -"Is it clear where to add commands? Bash vs. Python console Bash vs. Zsh " -"is different" -msgstr "" - -#: ../../tutorials/installable-code.md:25 -msgid "Does this lesson run as expected on windows and mac?" -msgstr "" - -#: ../../tutorials/installable-code.md:26 -msgid "" -"ADD: note about what makes something \"package worthy\", with a common " -"misconception being that a package should be production-ready code that's" -" valuable to a broad audience. this may not be a pervasive misconception " -"in Python, but a quick break-out with an explanation of what a package " -"can consist of would be helpful." -msgstr "" - -#: ../../tutorials/installable-code.md:31 -msgid "" -"Diagram showing the basic steps to creating an installable package. There" -" are 4 boxes with arrows pointing towards the right. The boxes read, your" -" code, create package structure, add metadata to pyproject.toml and pip " -"install package." -msgstr "" - -#: ../../tutorials/installable-code.md:33 -msgid "" -"A basic installable package needs a few things: code, a [specific package" -" file structure](https://www.pyopensci.org/python-package-guide/package-" -"structure-code/python-package-structure.html) and a `pyproject.toml` " -"containing your package's name and version. Once you have these items in " -"the correct directory structure, you can pip install your package into " -"any environment on your computer. You will learn how to create a basic " -"installable package in this lesson." -msgstr "" - -#: ../../tutorials/installable-code.md:37 -msgid "About this lesson" -msgstr "" - -#: ../../tutorials/installable-code.md:43 -msgid "" -"How to make your code installable into any Python environment both " -"locally and from GitHub" -msgstr "" - -#: ../../tutorials/installable-code.md:44 -msgid "" -"How to create a basic `pyproject.toml` file that includes package " -"dependencies and metadata. This file is required to make your package " -"installable." -msgstr "" - -#: ../../tutorials/installable-code.md:45 -msgid "" -"How to declare a [build backend](build_backends) which will be used to " -"[build](build-package) and install your package" -msgstr "" - -#: ../../tutorials/installable-code.md:46 -msgid "How to install your package in editable mode for interactive development" -msgstr "" - -#: ../../tutorials/installable-code.md:48 -msgid "**What you need to complete this lesson**" -msgstr "" - -#: ../../tutorials/installable-code.md:50 -msgid "" -"To complete this lesson you will need a local Python environment and " -"shell on your computer. You will also need to have [Hatch installed](get-" -"to-know-hatch)." -msgstr "" - -#: ../../tutorials/installable-code.md:53 -msgid "" -"If you are using Windows or are not familiar with Shell, you may want to " -"check out the Carpentries shell lesson[^shell-lesson]. Windows users will" -" likely need to configure a tool for any Shell and git related steps." -msgstr "" - -#: ../../tutorials/installable-code.md:55 -msgid "**What comes next**" -msgstr "" - -#: ../../tutorials/installable-code.md:57 -msgid "In the upcoming lessons you will learn how to:" -msgstr "" - -#: ../../tutorials/installable-code.md:59 -msgid "[Publish your package to PyPI](publish-pypi)" -msgstr "" - -#: ../../tutorials/installable-code.md:60 -msgid "Add a README file to your package to support community use" -msgstr "" - -#: ../../tutorials/installable-code.md:61 -msgid "" -"Add additional project metadata to your package to support PyPI " -"publication" -msgstr "" - -#: ../../tutorials/installable-code.md:67 -msgid "" -"This diagram has two smaller boxes with arrows pointing to the right to a" -" Python environment. The small boxes read your-package and pip install " -"package. The environment box on the right reads - your Python " -"environment. It them lists your-package along with a few other core " -"packages such as Matplotlib, NumPy, Pandas, Xarray and GeoPandas." -msgstr "" - -#: ../../tutorials/installable-code.md:69 -msgid "" -"Making your code installable is the first step towards creating a " -"publishable Python package. Once your code is installable, it is a Python" -" package and can be added to any Python environment on your computer and " -"imported in the same way that you might import a package such as Pandas " -"or GeoPandas. If your code is on GitHub or GitLab you can also install it" -" directly from there." -msgstr "" - -#: ../../tutorials/installable-code.md:74 -msgid "About the Python package directory structure" -msgstr "" - -#: ../../tutorials/installable-code.md:76 -msgid "" -"To make your Python code installable you need to create a specific " -"directory structure with the following elements:" -msgstr "" - -#: ../../tutorials/installable-code.md:78 -msgid "A `pyproject.toml` file." -msgstr "" - -#: ../../tutorials/installable-code.md:79 -msgid "A specific directory structure." -msgstr "" - -#: ../../tutorials/installable-code.md:80 -msgid "Some code." -msgstr "" - -#: ../../tutorials/installable-code.md:81 -msgid "An `__init__.py` file in your code directory." -msgstr "" - -#: ../../tutorials/installable-code.md:83 -msgid "The directory structure you’ll create in this lesson will look like this:" -msgstr "" - -#: ../../tutorials/installable-code.md:95 -msgid "About the basic package directory structure" -msgstr "" - -#: ../../tutorials/installable-code.md:97 -msgid "Notice a few things about the above layout:" -msgstr "" - -#: ../../tutorials/installable-code.md:99 -msgid "" -"Your package code lives within a `src/packagename` directory. We suggest " -"that you use `src` (short for **source code**) directory as it [ensures " -"that you are running tests on the installed version of your " -"code](https://www.pyopensci.org/python-package-guide/package-structure-" -"code/python-package-structure.html#the-src-layout-and-testing)." -msgstr "" - -#: ../../tutorials/installable-code.md:100 -msgid "" -"Within the `src` directory you have a package directory called " -"`pyospackage`. Use the name of your package for that directory name. This" -" will be the name for importing your package in Python code once " -"installed." -msgstr "" - -#: ../../tutorials/installable-code.md:101 -msgid "" -"In your package directory, you have an `__init__.py` file and all of your" -" Python modules. You will learn more about the `__init__.py` file below." -msgstr "" - -#: ../../tutorials/installable-code.md:102 -msgid "The `pyproject.toml` file lives at the root directory of your package." -msgstr "" - -#: ../../tutorials/installable-code.md:103 -msgid "" -"The name of the root directory for the package is **pyospackage** which " -"is the name of the package. This is not a requirement but you will often " -"see that the GitHub / GitLab repository and the root directory name are " -"the same as the package name." -msgstr "" - -#: ../../tutorials/installable-code.md:105 -msgid "What is an `__init__.py` file?" -msgstr "" - -#: ../../tutorials/installable-code.md:107 -msgid "" -"The `__init__.py` file tells Python that a directory should be treated as" -" a Python package. As such, a directory with an `__init__.py` file can be" -" imported directly into Python. The `__init__.py` file does not need to " -"contain any code in order for Python to recognize it; it can be empty." -msgstr "" - -#: ../../tutorials/installable-code.md:111 -msgid "" -"For example, following the file structure example above which has an " -"`__init__.py` file within it, you can run:" -msgstr "" - -#: ../../tutorials/installable-code.md:117 ../../tutorials/pyproject-toml.md:48 -msgid "What is a pyproject.toml file?" -msgstr "" - -#: ../../tutorials/installable-code.md:119 -msgid "The **pyproject.toml** file is:" -msgstr "" - -#: ../../tutorials/installable-code.md:121 -msgid "" -"Where you define your project’s metadata (including its name, authors, " -"license, etc)" -msgstr "" - -#: ../../tutorials/installable-code.md:122 -msgid "Where you define dependencies (the packages that it depends on)" -msgstr "" - -#: ../../tutorials/installable-code.md:123 -msgid "" -"Used to specify and configure what build backend you want to use to " -"[build your package](../package-structure-code/python-package-" -"distribution-files-sdist-wheel)." -msgstr "" - -#: ../../tutorials/installable-code.md:125 -msgid "" -"After the `__init__.py` and `pyproject.toml` files have been added, your " -"package can be built and distributed as an installable Python package " -"using tools such as pip. Note that the `pyproject.toml` file needs to " -"have a few basic items defined for the package to be installable " -"including:" -msgstr "" - -#: ../../tutorials/installable-code.md:131 -msgid "The `build-backend` that you want to use," -msgstr "" - -#: ../../tutorials/installable-code.md:132 -msgid "The project `name` and `version`." -msgstr "" - -#: ../../tutorials/installable-code.md:134 -msgid "Why the pyproject.toml file is important" -msgstr "" - -#: ../../tutorials/installable-code.md:138 -msgid "" -"The `pyproject.toml` file replaces some of the functionality of both the " -"`setup.py` file and `setup.cfg` files. If you try to pip install a " -"package with no `pyproject.toml` you will get the following error:" -msgstr "" - -#: ../../tutorials/installable-code.md:150 -msgid "Note about `setup.py`" -msgstr "" - -#: ../../tutorials/installable-code.md:154 -msgid "" -"If your project already defines a `setup.py` file, Hatch can be used to " -"automatically create the `pyproject.toml`." -msgstr "" - -#: ../../tutorials/installable-code.md:155 -msgid "" -"See [Using Hatch to Migrate setup.py to a pyproject.toml ](setup-py-to-" -"pyproject-toml.md)" -msgstr "" - -#: ../../tutorials/installable-code.md:161 -msgid "Time to create your Python package!" -msgstr "" - -#: ../../tutorials/installable-code.md:163 -msgid "" -"Now that you understand the basics of the Python package directory " -"structure, and associated key files (`__init__.py` and `pyproject.toml`)," -" it's time to create your Python package! Below you will create a " -"directory structure similar to the structure described above using Hatch." -msgstr "" - -#: ../../tutorials/installable-code.md:167 -msgid "Step 1: Set Up the Package Directory Structure" -msgstr "" - -#: ../../tutorials/installable-code.md:169 -msgid "Open your shell or preferred terminal." -msgstr "" - -#: ../../tutorials/installable-code.md:170 -msgid "" -"Use the shell `cd` command to navigate in your shell to the location " -"where you'd like your package directory to live. Hatch will create the " -"package directory for you" -msgstr "" - -#: ../../tutorials/installable-code.md:171 -msgid "Choose a name for your package. The name should:" -msgstr "" - -#: ../../tutorials/installable-code.md:172 -msgid "Have no spaces (*Required*)" -msgstr "" - -#: ../../tutorials/installable-code.md:173 -msgid "" -"Use all lowercase characters (*Recommended*). For this tutorial we will " -"use `pyospackage`." -msgstr "" - -#: ../../tutorials/installable-code.md:174 -msgid "" -"Only use letter and the characters _ or - in the name. This means that " -"the name `pyos*package` is not an acceptable name. However, the names " -"`pyos_package` or `pyos-package` both are ok" -msgstr "" - -#: ../../tutorials/installable-code.md:176 -msgid "Hatch and project names" -msgstr "" - -#: ../../tutorials/installable-code.md:177 -msgid "" -"Hatch makes some decisions for your project's name when you run `hatch " -"new`" -msgstr "" - -#: ../../tutorials/installable-code.md:179 -msgid "These include using:" -msgstr "" - -#: ../../tutorials/installable-code.md:180 -msgid "dashes for the top level directory" -msgstr "" - -#: ../../tutorials/installable-code.md:181 -msgid "dashes for the project name in the pyproject.toml" -msgstr "" - -#: ../../tutorials/installable-code.md:182 -msgid "underscores for the package directory name" -msgstr "" - -#: ../../tutorials/installable-code.md:196 -msgid "If you use a name with underscores, Hatch will return the same thing:" -msgstr "" - -#: ../../tutorials/installable-code.md:209 -msgid "" -"In both of the examples above the project name in the pyproject.toml file" -" that hatch creates is `pyos-package`." -msgstr "" - -#: ../../tutorials/installable-code.md:213 -msgid "Next run:" -msgstr "" - -#: ../../tutorials/installable-code.md:228 -msgid "Your final project directory structure should look like this:" -msgstr "" - -#: ../../tutorials/installable-code.md:243 -msgid "Step 2: Add module to your package" -msgstr "" - -#: ../../tutorials/installable-code.md:245 -msgid "" -"A Python module refers to a `.py` file containing the code that you want " -"your package to access and run. Within the `pyospackage` subdirectory, " -"add at least one Python modules (.py files)." -msgstr "" - -#: ../../tutorials/installable-code.md:247 -msgid "" -"If you don't have code already and are just learning how to create a " -"Python package, then create an empty `add_numbers.py` file. You will " -"populate the `add_numbers.py` file with code provided below." -msgstr "" - -#: ../../tutorials/installable-code.md:250 -msgid "Python modules and the `__init__.py` file" -msgstr "" - -#: ../../tutorials/installable-code.md:254 -msgid "" -"When you see the word module, we are referring to a `.py` file containing" -" Python code." -msgstr "" - -#: ../../tutorials/installable-code.md:257 -msgid "" -"The `__init__.py` allows Python to recognize that a directory contains " -"at least one module that may be imported and used in your code. A package" -" can have multiple modules[^python-modules]." -msgstr "" - -#: ../../tutorials/installable-code.md:261 -msgid "Your project directory should now look like this:" -msgstr "" - -#: ../../tutorials/installable-code.md:271 -msgid "Step 3: Add code to your module" -msgstr "" - -#: ../../tutorials/installable-code.md:273 -msgid "" -"If you are following along and making a Python package from scratch then " -"you can add the code below to your `add_numbers.py` module. The function " -"below adds two integers together and returns the result. Notice that the " -"code below has a few features that we will review in future tutorials:" -msgstr "" - -#: ../../tutorials/installable-code.md:275 -msgid "It has a [numpy-style docstring](numpy-docstring)" -msgstr "" - -#: ../../tutorials/installable-code.md:276 -msgid "It uses [typing](type-hints)" -msgstr "" - -#: ../../tutorials/installable-code.md:278 -msgid "" -"Python can support many different docstrings formats depending on the " -"documentation build system you wish to use. The most popular supported " -"formats for documenting Python objects are NumPy Style " -"Docstring[^numpydoc], Google Style Docstring[^googledoc], and the Epytext" -" Style Docstrings[^epytextdoc]." -msgstr "" - -#: ../../tutorials/installable-code.md:280 -msgid "**pyOpenSci recommends using the NumPy Docstring convention.**" -msgstr "" - -#: ../../tutorials/installable-code.md:282 -msgid "" -"If you aren’t familiar with docstrings or typing yet, that is ok. You can" -" review [this page in the pyOpenSci packaging " -"guide](https://www.pyopensci.org/python-package-guide/documentation" -"/write-user-documentation/document-your-code-api-docstrings.html) for an " -"overview of both topics." -msgstr "" - -#: ../../tutorials/installable-code.md:311 -msgid "Step 4: Modify metadata in your `pyproject.toml` file" -msgstr "" - -#: ../../tutorials/installable-code.md:313 -msgid "" -"Next, you will modify some of the metadata (information) that Hatch adds " -"to your `pyproject.toml` file. You are are welcome to copy the file we " -"have in our [example pyospackage GitHub " -"repository](https://github.com/pyOpenSci/pyosPackage)." -msgstr "" - -#: ../../tutorials/installable-code.md:317 -msgid "Brief overview of the TOML file" -msgstr "" - -#: ../../tutorials/installable-code.md:320 -msgid "" -"[The TOML format](https://toml.io/en/) consists of tables and variables. " -"Tables are sections of information denoted by square brackets:" -msgstr "" - -#: ../../tutorials/installable-code.md:322 -msgid "`[this-is-a-table]`." -msgstr "" - -#: ../../tutorials/installable-code.md:324 -msgid "" -"Tables can contain variables within them defined by an variable name and " -"an `=` sign. For instance, a `build-system` table most often holds two " -"(2) variables:" -msgstr "" - -#: ../../tutorials/installable-code.md:327 -msgid "" -"`requires = `, which tells a build tool what tools it needs to install " -"prior to building your package. In this case " -"[hatchling](https://pypi.org/project/hatchling/)" -msgstr "" - -#: ../../tutorials/installable-code.md:329 -msgid "" -"`build-backend = `, which is used to define the specific build-backend " -"name, (in this example we are using `hatchling.build`)." -msgstr "" - -#: ../../tutorials/installable-code.md:338 -msgid "" -"TOML organizes data structures, defining relationships within a " -"configuration file." -msgstr "" - -#: ../../tutorials/installable-code.md:341 -msgid "" -"[Learn more about the pyproject.toml format here.](../package-structure-" -"code/pyproject-toml-python-package-metadata)" -msgstr "" - -#: ../../tutorials/installable-code.md:345 -msgid "" -"You will learn more about the `pyproject.toml` format in the [next lesson" -" when you add additional metadata / information to this file.](pyproject-" -"toml.md)" -msgstr "" - -#: ../../tutorials/installable-code.md:348 -msgid "" -"Open up the `pyproject.toml` file that Hatch created in your favorite " -"text editor. It should look something like the example below." -msgstr "" - -#: ../../tutorials/installable-code.md:390 -msgid "Edit the file as follows:" -msgstr "" - -#: ../../tutorials/installable-code.md:392 -msgid "" -"Delete `dynamic = [\"version\"]`: This sets up dynamic versioning based " -"on tags stored in your git commit history. We will walk through " -"implementing this in a later lesson." -msgstr "" - -#: ../../tutorials/installable-code.md:393 -msgid "" -"Add `version = \"0.1\"` in the place of `dynamic = [\"version\"]` which " -"you just deleted. This sets up manual versioning." -msgstr "" - -#: ../../tutorials/installable-code.md:394 -msgid "Fill in the description if it doesn't already exist." -msgstr "" - -#: ../../tutorials/installable-code.md:404 -msgid "Remove the `[tool.hatch.version]` table from the bottom of the file." -msgstr "" - -#: ../../tutorials/installable-code.md:412 -msgid "" -"When this lesson exists, uncomment this admonition You will learn how to " -"automate defining a package version using git tags in the version and " -"release your package lesson." -msgstr "" - -#: ../../tutorials/installable-code.md:417 -msgid "OPTIONAL: Adjust project classifiers" -msgstr "" - -#: ../../tutorials/installable-code.md:419 -msgid "" -"Hatch by default provides a list of classifiers that define what Python " -"versions your package supports. These classifiers do not in any way " -"impact your package's build and are primarily intended to be used when " -"you publish your package to PyPI." -msgstr "" - -#: ../../tutorials/installable-code.md:424 -msgid "" -"If you don't plan on publishing to PyPI, you can skip this section. " -"However, if you wish, you can clean it up a bit." -msgstr "" - -#: ../../tutorials/installable-code.md:427 -msgid "To begin:" -msgstr "" - -#: ../../tutorials/installable-code.md:429 -msgid "Remove support for Python 3.8" -msgstr "" - -#: ../../tutorials/installable-code.md:430 -msgid "" -"Within the `[project]` table, update `requires-python = \">3.8\"` to " -"`requires-python = \">3.9\"`" -msgstr "" - -#: ../../tutorials/installable-code.md:432 -msgid "" -"Since you are creating a pure Python package in this lesson, you can " -"remove the following classifiers:" -msgstr "" - -#: ../../tutorials/installable-code.md:442 -msgid "Your new pyproject.toml file should now look something like this:" -msgstr "" - -#: ../../tutorials/installable-code.md:477 -msgid "The bare minimum needed in a pyproject.toml file" -msgstr "" - -#: ../../tutorials/installable-code.md:480 -msgid "" -"The core information that you need in a `pyproject.toml` file in order to" -" publish on PyPI is your **package's name** and the **version**. " -"However, we suggest that you flesh out your metadata early on in the " -"`pyproject.toml` file." -msgstr "" - -#: ../../tutorials/installable-code.md:482 -msgid "" -"Once you have your project metadata in the pyproject.toml file, you will " -"rarely update it. In the next lesson you’ll add more metadata and " -"structure to this file." -msgstr "" - -#: ../../tutorials/installable-code.md:486 -msgid "Step 5: Install your package locally" -msgstr "" - -#: ../../tutorials/installable-code.md:488 -msgid "At this point you should have:" -msgstr "" - -#: ../../tutorials/installable-code.md:490 -msgid "A project directory structure with a `pyproject.toml` file at the root" -msgstr "" - -#: ../../tutorials/installable-code.md:491 -msgid "A package directory containing an empty `__init__.py` file and" -msgstr "" - -#: ../../tutorials/installable-code.md:492 -msgid "At least one Python module (e.g. `add_numbers.py`)" -msgstr "" - -#: ../../tutorials/installable-code.md:494 -msgid "You are now ready to install (and build) your Python package!" -msgstr "" - -#: ../../tutorials/installable-code.md:496 -msgid "" -"While you can do this using hatch, we are going to use pip for this " -"lesson, so you can see how to install your tool into your preferred " -"environment." -msgstr "" - -#: ../../tutorials/installable-code.md:498 -msgid "" -"First open your preferred shell (Windows users may be using something " -"like gitbash) and `cd` into your project directory if you are not already" -" there." -msgstr "" - -#: ../../tutorials/installable-code.md:499 -msgid "Activate the Python environment that you wish to use." -msgstr "" - -#: ../../tutorials/installable-code.md:500 -msgid "Run `python -m pip install -e .`" -msgstr "" - -#: ../../tutorials/installable-code.md:503 -msgid "Add this back in when the lesson is published" -msgstr "" - -#: ../../tutorials/installable-code.md:504 -msgid "" -"Activate the Python environment that you wish to use. If you need help " -"with working with virtual environments check out this lesson (add link)." -msgstr "" - -#: ../../tutorials/installable-code.md:530 -msgid "What does `python -m pip install -e .` do?" -msgstr "" - -#: ../../tutorials/installable-code.md:533 -msgid "Let's break down `python -m pip install -e .`" -msgstr "" - -#: ../../tutorials/installable-code.md:535 -msgid "" -"`python -m pip install -e .` installs your package into the current " -"active Python environment in **editable mode** (`-e`). Installing your " -"package in editable mode, allows you to work on your code and then test " -"the updates interactively in your favorite Python interface. One " -"important caveat of editable mode is that every time you update your " -"code, you may need to restart Python." -msgstr "" - -#: ../../tutorials/installable-code.md:540 -msgid "" -"If you wish to install the package regularly (not in editable mode) you " -"can use:" -msgstr "" - -#: ../../tutorials/installable-code.md:543 -msgid "`python -m pip install . `" -msgstr "" - -#: ../../tutorials/installable-code.md:545 -msgid "**Using `python -m` when calling `pip`**" -msgstr "" - -#: ../../tutorials/installable-code.md:547 -msgid "" -"Above, you use`python -m` to call the version of pip installed into your " -"current active environment. `python -m` is important to ensure that you " -"are calling the version of pip installed in your current environment." -msgstr "" - -#: ../../tutorials/installable-code.md:552 -msgid "Look for pyospackage in your environment" -msgstr "" - -#: ../../tutorials/installable-code.md:554 -msgid "" -"Once you have installed your package, you can view it in your current " -"environment. If you are using `venv` or `conda`, `pip` list will allow " -"you to see your current package installations." -msgstr "" - -#: ../../tutorials/installable-code.md:558 -msgid "" -"Note that because pyospackage is installed in editable mode (`-e`) pip " -"will show you the directory path to your project's code" -msgstr "" - -#: ../../tutorials/installable-code.md:586 -msgid "Step 6: Test out your new package" -msgstr "" - -#: ../../tutorials/installable-code.md:588 -msgid "" -"After installing your package, type “python” at the command prompt in " -"your chosen terminal to start a Python session in your active Python " -"environment." -msgstr "" - -#: ../../tutorials/installable-code.md:591 -msgid "You can now import your package and access the `add_num` function." -msgstr "" - -#: ../../tutorials/installable-code.md:603 -msgid "Installing packages from GitHub" -msgstr "" - -#: ../../tutorials/installable-code.md:605 -msgid "" -"If you wish to share your code without publishing to PyPI you can always " -"install packages directly from GitHub using the syntax:" -msgstr "" - -#: ../../tutorials/installable-code.md:612 -msgid "To make your package GitHub installable, you can:" -msgstr "" - -#: ../../tutorials/installable-code.md:614 -msgid "Create a new GitHub repository" -msgstr "" - -#: ../../tutorials/installable-code.md:615 -msgid "" -"Push the contents of the project directory that you created above, to " -"GitHub" -msgstr "" - -#: ../../tutorials/installable-code.md:616 -msgid "" -"Finally install the package from GitHub using the command above. When you" -" use the command above, don't forget to substitute the user, repo, and " -"branch_or_tag with your specific values." -msgstr "" - -#: ../../tutorials/installable-code.md:618 -msgid "" -"For instance below you install the pyospackage from the main branch of " -"the pyOpenSci repository." -msgstr "" - -#: ../../tutorials/installable-code.md:621 -msgid "`python -m pip install git+https://github.com/user/repo.git@branch_or_tag`" -msgstr "" - -#: ../../tutorials/installable-code.md:625 -msgid "Congratulations! You created your first Python package" -msgstr "" - -#: ../../tutorials/installable-code.md:627 -msgid "" -"You did it! You have now created a Python package that you can install " -"into any Python environment." -msgstr "" - -#: ../../tutorials/installable-code.md:630 -msgid "In the upcoming lessons you will:" -msgstr "" - -#: ../../tutorials/installable-code.md:632 -msgid "" -"Learn how to [build and publish your Python package to (test) PyPI" -"](publish-pypi)" -msgstr "" - -#: ../../tutorials/installable-code.md:633 -msgid "Add a README file and LICENSE to your package" -msgstr "" - -#: ../../tutorials/installable-code.md:634 -msgid "" -"Add more metadata to your `pyproject.toml` file to support PyPI " -"publication." -msgstr "" - -#: ../../tutorials/installable-code.md:635 -msgid "learn how to publish to **conda-forge** from **PyPI**." -msgstr "" - -#: ../../tutorials/installable-code.md:637 -msgid "" -"Add a [README file](add-readme.md) and [LICENSE](add-license-coc.md) to " -"your package" -msgstr "" - -#: ../../tutorials/installable-code.md:638 -msgid "" -"[Add more metadata to your `pyproject.toml`](pyproject-toml.md) file to " -"support PyPI publication." -msgstr "" - -#: ../../tutorials/installable-code.md:639 -msgid "" -"[Learn how to build your package distribution](publish-pypi) files " -"(**sdist** and **wheel**) and publish to **test PyPI**." -msgstr "" - -#: ../../tutorials/installable-code.md:640 -msgid "" -"Finally you will learn how to [publish to **conda-forge**](publish-conda-" -"forge) from **PyPI**." -msgstr "" - -#: ../../tutorials/installable-code.md:644 -msgid "[Carpentries shell lesson](https://swcarpentry.github.io/shell-novice/)" -msgstr "" - -#: ../../tutorials/installable-code.md:646 -msgid "" -"[Python module " -"docs](https://docs.python.org/3/tutorial/modules.html#packages)" -msgstr "" - -#: ../../tutorials/installable-code.md:648 -msgid "[Numpy style docs](https://numpydoc.readthedocs.io/en/latest/format.html)" -msgstr "" - -#: ../../tutorials/installable-code.md:647 -msgid "[Google docstring style](https://google.github.io/styleguide/pyguide.html)" -msgstr "" - -#: ../../tutorials/installable-code.md:649 -msgid "[epydoc](https://epydoc.sourceforge.net/epytext.html)" -msgstr "" - -#: ../../tutorials/intro.md:27 ../../tutorials/setup-py-to-pyproject-toml.md:24 -msgid "Get to know Hatch" -msgstr "" - -#: ../../tutorials/intro.md:27 -msgid "Python Packaging Tutorial Setup" -msgstr "" - -#: ../../tutorials/intro.md:34 ../../tutorials/intro.md:71 -msgid "What is a Python package?" -msgstr "" - -#: ../../tutorials/intro.md:34 -msgid "Make your code installable" -msgstr "" - -#: ../../tutorials/intro.md:34 -msgid "Publish to PyPI" -msgstr "" - -#: ../../tutorials/intro.md:34 -msgid "Publish to conda-forge" -msgstr "" - -#: ../../tutorials/intro.md:34 -msgid "Create and publish a Python Package" -msgstr "" - -#: ../../tutorials/intro.md:44 -msgid "Add README file" -msgstr "" - -#: ../../tutorials/intro.md:44 -msgid "Add a license & code of conduct" -msgstr "" - -#: ../../tutorials/intro.md:44 -msgid "Update metadata in pyproject.toml" -msgstr "" - -#: ../../tutorials/intro.md:44 -msgid "Project information files & metadata" -msgstr "" - -#: ../../tutorials/intro.md:53 -msgid "Migrate setup.py to a pyproject.toml using Hatch" -msgstr "" - -#: ../../tutorials/intro.md:53 -msgid "Hatch for Existing Packages" -msgstr "" - -#: ../../tutorials/intro.md:1 -msgid "Python packaging 101" -msgstr "" - -#: ../../tutorials/intro.md:3 -msgid "_A start to finish beginner-friendly tutorial_" -msgstr "" - -#: ../../tutorials/intro.md:5 -msgid "" -"Welcome to the pyOpenSci Python packaging tutorial series. The lessons on" -" the upcoming pages walk you through the core steps needed to create a " -"Python package." -msgstr "" - -#: ../../tutorials/intro.md:11 -msgid "" -"Diagram showing the lessons in our packaging tutorial. There are 6 total " -"- what is a Python package, make code pip installable, publish your " -"package to PyPI, add a README and LICENSE file, add metadata for PyPI and" -" finally publish to conda forge." -msgstr "" - -#: ../../tutorials/intro.md:13 -msgid "" -"This lesson is the first in a series of lessons to help you get started " -"with Python packaging." -msgstr "" - -#: ../../tutorials/intro.md:16 -msgid "Who are these tutorials for?" -msgstr "" - -#: ../../tutorials/intro.md:18 -msgid "" -"The content in this tutorial series is beginner friendly and assumes that" -" you have not created a Python package before. However, the content will " -"still be valuable if you are interested in better understanding the steps" -" involved in creating a Python package." -msgstr "" - -#: ../../tutorials/intro.md:23 -msgid "" -"In this series you will learn about the core elements that you need to " -"publish your package to the [Python Package Index " -"(PyPI)](https://pypi.org/)." -msgstr "" - -#: ../../tutorials/intro.md:25 -msgid "" -"In the second series, you will learn about infrastructure and " -"documentation needed to support package maintenance." -msgstr "" - -#: ../../tutorials/intro.md:60 ../../tutorials/publish-conda-forge.md:15 -#: ../../tutorials/publish-pypi.md:13 ../../tutorials/pyproject-toml.md:19 -#: ../../tutorials/setup-py-to-pyproject-toml.md:12 -msgid "Learning Objectives" -msgstr "" - -#: ../../tutorials/intro.md:62 -msgid "" -"This lesson introduces you to the basic components of a Python package. " -"After reading this lesson you will:" -msgstr "" - -#: ../../tutorials/intro.md:65 -msgid "Understand what a Python package is" -msgstr "" - -#: ../../tutorials/intro.md:66 -msgid "Be able to list the 5 core components of a Python package" -msgstr "" - -#: ../../tutorials/intro.md:67 -msgid "" -"Be able to explain the difference between generalizable code and code " -"that supports a specific scientific application" -msgstr "" - -#: ../../tutorials/intro.md:73 -msgid "" -"At a high level, you can think about a Python package as a toolbox that " -"you can use to perform various tasks." -msgstr "" - -#: ../../tutorials/intro.md:76 -msgid "" -"A Python package is basically a directory with a specific file structure." -" Within the package directory structure, there are modules which are " -"files that end in `.py` (the same extension you'd see in a Python " -"script). These modules allow you to group and structure your Python code." -" Each module contains functions and classes, that you can think about as " -"the tools in your toolbox." -msgstr "" - -#: ../../tutorials/intro.md:85 -msgid "" -"Diagram showing a sketch of a toolbox filled with different tools " -"including a hammer and a saw." -msgstr "" - -#: ../../tutorials/intro.md:87 -msgid "" -"You can think about a package as a toolbox filled with coding tools. A " -"tool may be a function or a class. Each tool does a specific thing well." -msgstr "" - -#: ../../tutorials/intro.md:92 -msgid "Python packages are installable" -msgstr "" - -#: ../../tutorials/intro.md:94 -msgid "" -"A package is installable, which means that you can add the functionality " -"within the package's code to any Python environment and import that " -"functionality like you would import core scientific Python packages such " -"as NumPy or Matplotlib." -msgstr "" - -#: ../../tutorials/intro.md:103 -msgid "" -"Installing a package into an environment makes it easier to manage and " -"reuse your code across different projects. Structuring your code as a " -"package is the first step you need to take so you can share the tools in " -"the toolbox you've created and let others build with it." -msgstr "" - -#: ../../tutorials/intro.md:108 -msgid "Why create a Python package?" -msgstr "" - -#: ../../tutorials/intro.md:110 -msgid "You might create a Python package because you want to:" -msgstr "" - -#: ../../tutorials/intro.md:112 -msgid "" -"**Use your code across different projects:** At its most basic level, " -"creating a package allows you to install your code into a Python " -"environment. This allows you to then import functions and classes into " -"any workflows both locally and in the cloud." -msgstr "" - -#: ../../tutorials/intro.md:113 -msgid "" -"**Share your code:** If you publish a package on a public repository such" -" as PyPI or conda, your package can be installed on any machine using pip" -" or conda with a single command." -msgstr "" - -#: ../../tutorials/intro.md:114 -msgid "" -"**Build community around your code:** Packages make it easier for " -"multiple people to work on the same project (particularly when published " -"on GitHub). A version control system such as git (the system used by " -"GitHub), further makes it easier to track changes to the codebase over " -"time. Tools such as issues and pull requests make it easier for outside " -"users to contribute bug fixes and to establish review processes for " -"accepting changes to the code base." -msgstr "" - -#: ../../tutorials/intro.md:115 -msgid "" -"**Organize your code:** Packages can be used to organize large code " -"projects, dividing them into smaller, more manageable components. This " -"structure can help with both maintaining the codebase and with making it " -"easier to understand." -msgstr "" - -#: ../../tutorials/intro.md:117 -msgid "What to consider before you create a package" -msgstr "" - -#: ../../tutorials/intro.md:119 -msgid "" -"Creating a Python package that others use takes considerable time and " -"effort. Before you begin, think about your goals including:" -msgstr "" - -#: ../../tutorials/intro.md:122 -msgid "Who you think will use your package" -msgstr "" - -#: ../../tutorials/intro.md:123 -msgid "How people might use your package and on what data (if data are relevant)" -msgstr "" - -#: ../../tutorials/intro.md:124 -msgid "Whether you have time to add things such as documentation and tests" -msgstr "" - -#: ../../tutorials/intro.md:125 -msgid "" -"How long you might be able to maintain it: remember that once people " -"begin using your package they will depend on your maintainer team to " -"update it, fix bugs and answer questions." -msgstr "" - -#: ../../tutorials/intro.md:127 -msgid "" -"Before creating a user-facing package, it's important to consider all of " -"the above." -msgstr "" - -#: ../../tutorials/intro.md:129 -msgid "The elements of a Python package" -msgstr "" - -#: ../../tutorials/intro.md:133 ../../tutorials/intro.md:211 -msgid "Diagram showing .. more here if this stays." -msgstr "" - -#: ../../tutorials/intro.md:135 -msgid "" -"The elements of a Python package include code, documentation, tests, an " -"OSI-approved license and infrastructure. Maintainers are at the core " -"making sure everything works and is up to date while fixing bugs and " -"addressing user concerns." -msgstr "" - -#: ../../tutorials/intro.md:141 -msgid "The core elements of Python package include:" -msgstr "" - -#: ../../tutorials/intro.md:143 -msgid "" -"**Code:** Functions and classes that provide functionality for a user of " -"your package" -msgstr "" - -#: ../../tutorials/intro.md:144 -msgid "" -"**Documentation:** Installation instructions, tutorials, and examples " -"that both help users get started using your package and contributors and " -"maintainers fix bugs and maintain the package." -msgstr "" - -#: ../../tutorials/intro.md:145 -msgid "" -"Contributor Documentation in the form of a **CONTRIBUTING.md** file is " -"useful to help people to contribute to your package." -msgstr "" - -#: ../../tutorials/intro.md:146 -msgid "" -"Development Documentation helps both maintainers and contributors " -"understand how to maintain a package's infrastructure." -msgstr "" - -#: ../../tutorials/intro.md:147 -msgid "" -"**Tests:** that make sure your code works as it should and makes it " -"easier for you and others to contribute to, modify and update the code in" -" the future" -msgstr "" - -#: ../../tutorials/intro.md:148 -msgid "" -"**License:** An open source license, or license that is [OSI " -"approved](https://opensource.org/licenses/), refers to an license that " -"allows others to use your package. It also provides legal direction " -"regarding how elements of the package can and can't be reused." -msgstr "" - -#: ../../tutorials/intro.md:149 -msgid "" -"**Infrastructure** that automates updates, publication workflows and runs" -" test suites. Infrastructure includes a suite of things such as platforms" -" like GitHub and GitLab, tools to run tests and tools locally such as nox" -" and tox and continuous integration that automates package maintenance " -"steps." -msgstr "" - -#: ../../tutorials/intro.md:151 -msgid "What pyOpenSci looks for in a package" -msgstr "" - -#: ../../tutorials/intro.md:154 -msgid "" -"pyOpenSci performs an [initial set of editor " -"checks](https://www.pyopensci.org/software-peer-review/how-to/editor-in-" -"chief-guide.html#editor-checklist-template) for any package submitted to " -"us for peer review. You may find these checks useful as you create your " -"package as a baseline for things that you package should have." -msgstr "" - -#: ../../tutorials/intro.md:160 -msgid "Packages are more than just code - Infrastructure" -msgstr "" - -#: ../../tutorials/intro.md:162 -msgid "" -"A package in any language is more than just code. If you expect other " -"people to use your package, besides yourself, you should consider not " -"only writing high quality code, but also the various elements of a " -"package that make it a useful community resource." -msgstr "" - -#: ../../tutorials/intro.md:167 -msgid "Version control and storing your package on GitHub or GitLab" -msgstr "" - -#: ../../tutorials/intro.md:169 -msgid "" -"Most Python packages live in an online version control platform such as " -"GitHub or GitLab. GitHub and GitLab both run [git](https://git-scm.com/) " -"for version control. Having your software under version control is " -"important because it allows you to both track changes over time while " -"also going back in history and undoing changes in the case that a change " -"to the code base unexpectedly breaks something." -msgstr "" - -#: ../../tutorials/intro.md:174 -msgid "" -"By publishing your package on GitHub or GitLab, you are making your code " -"public facing. This means that others can both see your code and also " -"make contributions using a pull request (GitHub) / merge request (GitLab)" -" / code review workflow." -msgstr "" - -#: ../../tutorials/intro.md:176 -msgid "GitHub & GitLab vs. Git" -msgstr "" - -#: ../../tutorials/intro.md:179 -msgid "" -"GitHub and GitLab are online (cloud) platforms that run `git` (version " -"control software) on the backend. Running git locally on your computer " -"allows you to upload (`git push`) and download (`git pull`) files to " -"GitHub and GitLab." -msgstr "" - -#: ../../tutorials/intro.md:184 -msgid "Issues or Ticket Trackers" -msgstr "" - -#: ../../tutorials/intro.md:186 -msgid "" -"GitHub and GitLab also both offer community features such as issues that " -"allow:" -msgstr "" - -#: ../../tutorials/intro.md:188 -msgid "you to communicate with your maintainers and contributor community" -msgstr "" - -#: ../../tutorials/intro.md:189 -msgid "users to report bugs, ask questions and request new features" -msgstr "" - -#: ../../tutorials/intro.md:190 -msgid "" -"you to publicly keep track of enhancements and features you want to work " -"on for your package." -msgstr "" - -#: ../../tutorials/intro.md:192 -msgid "Continuous integration and continuous deployment" -msgstr "" - -#: ../../tutorials/intro.md:194 -msgid "" -"GitHub and GitLab also provide continuous integration and continuous " -"deployment (CI/CD). Continuous integration (CI) refers to a platform that" -" automatically runs a specific job when a certain event occurs, whereas " -"continuous deployment (CD) is an extension of CI that refers to not only " -"running or building but also to publishing the final outputs somewhere." -msgstr "" - -#: ../../tutorials/intro.md:196 -msgid "**An example of Continuous integration:**" -msgstr "" - -#: ../../tutorials/intro.md:198 -msgid "" -"When someone submits a change to your code, your tests will run across " -"different operating systems and the code will be checked for format " -"issues." -msgstr "" - -#: ../../tutorials/intro.md:200 -msgid "**An example of Continuous deployment:**" -msgstr "" - -#: ../../tutorials/intro.md:202 -msgid "" -"When you are ready to release your package to PyPI, a continuous " -"deployment operation might be triggered on release to publish your " -"package to PyPI." -msgstr "" - -#: ../../tutorials/intro.md:204 -msgid "" -"Integrated CI/CD will help you maintain your software, ensuring that " -"changes to the code don't break things unexpectedly. They can also help " -"you maintain code style and format consistency for every new change to " -"your code." -msgstr "" - -#: ../../tutorials/intro.md:213 -msgid "The lifecycle of a scientific Python package." -msgstr "" - -#: ../../tutorials/intro.md:216 -msgid "When should you turn your code into a Python package?" -msgstr "" - -#: ../../tutorials/intro.md:218 -msgid "" -"You may be wondering, what types of code should become a Python package " -"that is both on GitHub and published to PyPI and/or conda-forge." -msgstr "" - -#: ../../tutorials/intro.md:220 -msgid "There are a few use cases to consider:" -msgstr "" - -#: ../../tutorials/intro.md:222 -msgid "" -"**Creating a basic package for yourself:** Sometimes you want create a " -"package for your own personal use. This might mean making your code " -"locally pip installable and you may also want to publish it to GitHub. In" -" that case you don't expect others to use your code, and as such you may " -"only have documentation for you and your future self if you need to " -"update the package." -msgstr "" - -#: ../../tutorials/intro.md:224 -msgid "" -"An example of this type of package might be a set of functions that you " -"write that are useful across several of your projects. It could be useful" -" to have those functions available to all of your projects." -msgstr "" - -#: ../../tutorials/intro.md:227 -msgid "LINK to pip installable lesson when it's published - it's in review now" -msgstr "" - -#: ../../tutorials/intro.md:230 -msgid "" -"**Creating a package for the community:** In other cases, you may create " -"some code that you soon realize might also be useful to not just you, but" -" to other people as well. In that case, you might consider both creating " -"the package, publishing it on GitHub, and because other users may be " -"using it, you may make use of GitHub's infrastructure including CI/CD " -"pipelines and issue trackers. Because you want other people to use your " -"package, you will want to also include LICENSE information, documentation" -" for users and contributors and tests. This type of package is most often" -" published to PyPI." -msgstr "" - -#: ../../tutorials/intro.md:233 -msgid "" -"For example, all of the [pyOpenSci packages](https://www.pyopensci.org" -"/python-packages.html) are public facing with an intended audience beyond" -" just the maintainers." -msgstr "" - -#: ../../tutorials/intro.md:235 -msgid "Packages that you expect others to use should be well-scoped" -msgstr "" - -#: ../../tutorials/intro.md:237 -msgid "" -"Ideally the code in your Python package is focused on a specific theme or" -" use case. This theme is important as it's a way to scope the content of " -"your package." -msgstr "" - -#: ../../tutorials/intro.md:239 -msgid "" -"It can be tricky to decide when your code becomes something that might be" -" more broadly useful to others. But one question you can ask yourself is " -"- is your code written specifically for a single research project? Or " -"could it have a broader application across multiple projects in your " -"domain?" -msgstr "" - -#: ../../tutorials/intro.md:241 -msgid "How does this relate to code for a research project?" -msgstr "" - -#: ../../tutorials/intro.md:244 -msgid "" -"A [Research Compendium](https://the-turing-way.netlify.app/reproducible-" -"research/compendia.html) is an organized set of code, data and " -"documentation that supports a specific research project. It aims to " -"enhance the reproducibility and transparency of research by providing a " -"comprehensive record of the methods, data, and analyses used in a study." -msgstr "" - -#: ../../tutorials/intro.md:249 -msgid "" -"A Python package is a collection of modules that can be used to perform a" -" specific set of tasks. These tasks should be applicable to numerous " -"workflows. As such a Python package is more generalizable than a Research" -" Compendium which supports a specific project." -msgstr "" - -#: ../../tutorials/intro.md:254 -msgid "" -"[Read about `Good enough practices in scientific " -"computing`](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005510)" -msgstr "" - -#: ../../tutorials/intro.md:255 -msgid "" -"[Learn more about research compendia (also called repo-packs) in this " -"blog post.](https://lorenabarba.com/blog/how-repro-packs-can-save-your-" -"future-self/)" -msgstr "" - -#: ../../tutorials/intro.md:258 -msgid "Below are a few examples well scoped pyOpenSci packages:" -msgstr "" - -#: ../../tutorials/intro.md:260 -msgid "" -"[Crowsetta](https://crowsetta.readthedocs.io/en/latest/): is a package " -"designed to work with annotating animal vocalizations and bioacoustics " -"data. This package helps scientists process different types of " -"bioacoustic data rather than focusing on a specific individual research " -"application associated with a user-specific research workflow." -msgstr "" - -#: ../../tutorials/intro.md:261 -msgid "" -"[Pandera](https://www.union.ai/pandera) is another more broadly used " -"Python package. Pandera supports data testing and thus also has a broader" -" research application." -msgstr "" - -#: ../../tutorials/intro.md:263 -msgid "Matplotlib as an example" -msgstr "" - -#: ../../tutorials/intro.md:265 -msgid "" -"At the larger end of the user spectrum, Matplotlib is a great example. " -"Matplotlib does one thing really well:" -msgstr "" - -#: ../../tutorials/intro.md:268 -msgid "_It creates visual plots of data._" -msgstr "" - -#: ../../tutorials/intro.md:270 -msgid "" -"Thousands of people use Matplotlib for different plotting applications " -"using different types of data. While few scientific packages will have " -"the same broad application and large user base that Matplotlib has, the " -"idea of scoping out what your package does is still important." -msgstr "" - -#: ../../tutorials/intro.md:276 -msgid "Code should also be clean & readable & documented" -msgstr "" - -#: ../../tutorials/intro.md:278 -msgid "" -"The code in your package should also be clean, readable, and well " -"documented." -msgstr "" - -#: ../../tutorials/intro.md:280 -msgid "" -"**Clean code:** Clean code refers to code that uses expressive variable " -"names, is concise and doesn't repeat itself. You can learn about best " -"practices for clean code in future pyOpenSci tutorials." -msgstr "" - -#: ../../tutorials/intro.md:284 -msgid "" -"**Readable code:** readable code is code written with a consistent style." -" You can use linters and code formatters such as black and flake8 to " -"ensure this consistency throughout your entire package. [Learn more about" -" code formatters here.](../package-structure-code/code-style-linting-" -"format)" -msgstr "" - -#: ../../tutorials/intro.md:288 -msgid "" -"**Documented code:** documented code is written using docstrings that " -"help a user understand both what the functions and methods in your code " -"do and also what the input and output elements of each function are. [You" -" can learn more about docstrings in our guide, here.](../documentation" -"/write-user-documentation/document-your-code-api-docstrings)" -msgstr "" - -#: ../../tutorials/intro.md:292 -msgid "Making your package installable - publishing to PyPI & conda-forge" -msgstr "" - -#: ../../tutorials/intro.md:294 -msgid "Python packages and environments" -msgstr "" - -#: ../../tutorials/intro.md:296 -msgid "" -"You can install a Python package into a Python environment in the same " -"way you might install NumPy or Pandas. Installing your package into an " -"environment allows you to access it from any code run with that specific " -"Python environment activated." -msgstr "" - -#: ../../tutorials/intro.md:302 -msgid "" -"Diagram showing the steps associated with creating a package and then " -"installing it. The first arrow says your package and the second says pip " -"install package. The second arrow leads to a box that represents a Python" -" environment that already has some packages installed such as Pandas and " -"NumPy. Your package will also get installed into that same environment " -"when you pip install it." -msgstr "" - -#: ../../tutorials/intro.md:304 -msgid "" -"You don't have to publish to PyPI to make your code installable. With the" -" correct file structure and project metadata you can make your code " -"installable locally on your computer and use it for projects that you are" -" working on without having to ever publish to PyPI. Publishing to PyPI is" -" useful when you want to make your code public-facing and share it with " -"others." -msgstr "" - -#: ../../tutorials/intro.md:311 -msgid "Publishing a package to PyPI / Conda-Forge" -msgstr "" - -#: ../../tutorials/intro.md:313 -msgid "" -"If you want to make your package directly installable without having to " -"download the code to your computer locally then you need to publish it in" -" a repository such as **PyPI** or **conda-forge**." -msgstr "" - -#: ../../tutorials/intro.md:317 -msgid "" -"Learn [how to publish your package to PyPI in this tutorial.](publish-" -"pypi.md)" -msgstr "" - -#: ../../tutorials/intro.md:319 -msgid "" -"Then you can create a conda-forge recipe using the " -"[Grayskull](https://github.com/conda/grayskull) tool. You can then submit" -" this recipe to conda-forge." -msgstr "" - -#: ../../tutorials/intro.md:321 -msgid "" -"[You will learn more about the conda-forge publication process here" -".](publish-conda-forge.md)" -msgstr "" - -#: ../../tutorials/intro.md:324 -msgid "" -"Graphic showing the high level packaging workflow. On the left you see a " -"graphic with code, metadata and tests in it. Those items all go into your" -" package. Documentation and data are below that box because they aren't " -"normally published in your packaging wheel distribution. an arrow to the " -"right takes you to a build distribution files box. that box leads you to " -"either publishing to TestPyPI or the real PyPI. From PyPI you can then " -"connect to conda-forge for an automated build that sends distributions " -"from PyPI to conda-forge." -msgstr "" - -#: ../../tutorials/intro.md:326 -msgid "" -"In the image above, you can see the steps associated with publishing your" -" package on PyPI and conda-forge. Note that the distribution files that " -"PyPI requires are the [sdist](#python-source-distribution) and [wheel" -"](#python-wheel) files. Once you are ready to make your code publicly " -"installable, you can publish it on PyPI. Once your code is on PyPI it is " -"straight forward to then publish to conda-forge. You create a recipe " -"using the Grayskull package and then you open a pr in the conda-forge " -"recipe repository. You will learn more about this process in the [conda-" -"forge lesson](/tutorials/publish-conda-forge)." -msgstr "" - -#: ../../tutorials/intro.md:330 -msgid "Yay, your package has users! Now what?" -msgstr "" - -#: ../../tutorials/intro.md:332 -msgid "" -"As the community using your package grows, you may also find yourself " -"managing users, contributors, and others who want to interact with your " -"package. It’s important to consider all this before you dive into " -"development. Once you have a user base in the community, people will " -"depend upon your code to work and will need direction regarding how to " -"use it." -msgstr "" - -#: ../../tutorials/intro.md:334 -msgid "To support your community, you'll want to add things like:" -msgstr "" - -#: ../../tutorials/intro.md:336 -msgid "" -"[a development guide that documents your maintainer workflow process " -"](/documentation/repository-files/development-guide.md)" -msgstr "" - -#: ../../tutorials/intro.md:337 -msgid "" -"[a code of conduct to defines community interaction standards and " -"expectations](/documentation/repository-files/code-of-conduct-file.md)" -msgstr "" - -#: ../../tutorials/intro.md:338 -msgid "" -"[a contributing guide that helps users understand expectations associated" -" with making contributions to your project](/documentation/repository-" -"files/contributing-file.md)" -msgstr "" - -#: ../../tutorials/intro.md:340 -msgid "Support for contributors and maintainers" -msgstr "" - -#: ../../tutorials/intro.md:342 -msgid "" -"If you intend for others to use and contribute to your code, consider who" -" will maintain it over time. You will want a **contributing and " -"development** guide to help new potential contributors get started with " -"contributing to your package, as well as a **code of conduct** to ensure " -"community interactions remain healthy both for you and your contributors " -"and maintainer team." -msgstr "" - -#: ../../tutorials/intro.md:344 -msgid "" -"The elements above are also important for future maintenance of your " -"package. In the case that you are no long able to maintain it or simply " -"want extra help, development, and contributing documentation will help " -"you onboard new maintainers." -msgstr "" - -#: ../../tutorials/intro.md:349 -msgid "What's next?" -msgstr "" - -#: ../../tutorials/intro.md:351 -msgid "" -"In future lessons you will learn more about the infrastructure around a " -"published Python package that makes it both easier to maintain, easier " -"for others to contribute to and easier for other scientists to use. " -"However, first we want to get you to your initial goal of publishing a " -"Python package." -msgstr "" - -#: ../../tutorials/intro.md:353 -msgid "" -"In this next lesson you will learn how to create a basic installable " -"Python package. Make your code pip installable " -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:1 -msgid "Publish your Python package that is on PyPI to conda-forge" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:3 -msgid "In the previous lessons, you've learned:" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:5 -msgid "" -"How to [create the most basic version of a Python package](installable-" -"code.md). This entailed making your code installable." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:6 -msgid "[How to publish your Python package to PyPI](publish-pypi)" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:7 -msgid "How to add a `README` and `LICENSE` file to your package" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:8 -msgid "" -"How to setup your `pyproject.toml` file with all of the metadata that " -"PyPI requires and also metadata that will be helpful for users to find " -"your package." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:10 -msgid "" -"If you have gone through all of the above lessons, you are now ready to " -"publish your package on conda-forge." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:13 -msgid "" -"**IMPORTANT:** Please do not practice publishing your package to conda-" -"forge. You should only publish to conda-forge when you have a package on " -"pypi.org that you plan to maintain." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:19 ../../tutorials/publish-pypi.md:17 -msgid "In this lesson you will learn how to:" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:21 -msgid "Create a conda-forge yaml recipe for your package using Grayskull" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:22 -msgid "" -"Submit the recipe (yaml file) to the conda-forge staged recipes " -"repository as a pull request" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:23 -msgid "" -"Maintain your conda-forge package by creating new releases for your " -"package on PyPI" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:26 -msgid "" -"Once your package is on PyPI you can then easily publish it to conda-" -"forge using the [grayskull](https://conda.github.io/grayskull/) tool. You" -" do not need to build the package specifically for conda, conda-forge " -"will build from your PyPI source distribution file (sdist)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:33 -msgid "" -"Image showing the progression of creating a Python package, building it " -"and then publishing to PyPI and conda-forge. You take your code and turn " -"it into distribution files (sdist and wheel) that PyPI accepts. then " -"there is an arrow towards the PyPI repository where ou publish both " -"distributions. From PyPI if you create a conda-forge recipe you can then " -"publish to conda-forge." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:35 -msgid "" -"Once you have published both package distributions (the source " -"distribution and the wheel) to PyPI, you can then publish to conda-forge." -" Conda-forge requires a source distribution on PyPI in order to build " -"your package on conda-forge. You do not need to rebuild your package to " -"publish to conda-forge." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:38 -msgid "What is conda-forge?" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:40 -msgid "" -"conda is an open source package and environment management tool that can " -"be used to install tools from the different channels on Anaconda.org." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:43 -msgid "" -"You can think about a channel as a specific location where a group of " -"packages are stored and can be installed from using a command such as " -"`conda install packagename`. In the case of conda channels, some of these" -" channels such as the `defaults` channel, is managed by Anaconda (the " -"company). Only Anaconda can decide what packages are available in the " -"`defaults` channel. However, the conda-forge (and bioconda) channel are " -"community-managed channels. Anyone can submit a package to these channels" -" however they must pass a technical review in the [staged-recipes GitHub " -"repository](https://github.com/conda-forge/staged-recipes) to be " -"published." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:46 -msgid "[Learn more about conda channels here.](#about-conda)" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:50 -msgid "" -"Graphic with the title Python package repositories. Below it says " -"anything hosted on PyPI can be installed using pip install. Packaging " -"hosted on a conda channel can be installed using conda install. Below " -"that there are two rows. The top row says conda channels. Next to it are " -"three boxes one with conda-forge, community maintained; bioconda and then" -" default - managed by the Anaconda team. Below that there is a row that " -"says PyPI servers. PyPI - anyone can publish to PyPI and test PyPI (a " -"testbed server for you to practice)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:52 -msgid "" -"Conda channels represent various repositories that you can install " -"packages from. Because conda-forge is community maintained, anyone can " -"submit a recipe there. PyPI is also a community maintained repository. " -"Anyone can submit a package to PyPI and test PyPI. Unlike conda-forge " -"there are no manual checks of packages submitted to PyPI." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:55 -msgid "Why publish to conda-forge" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:57 -msgid "" -"There are many users, especially in the scientific Python ecosystem that " -"use conda as their primary package manager / environment tool. Thus, " -"having packages available to these users on the conda-forge channel is " -"useful. In some cases packages on conda-forge can minimize dependency " -"conflicts that can occur when mixing installations using pip and conda. " -"This is particularly important for the spatial ecosystem." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:59 -msgid "How publishing to conda-forge works" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:61 -msgid "" -"Once you have built and published your package to PyPI, you have " -"everything that you need to publish to conda-forge. There is no " -"additional build step needed to publish to conda-forge." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:63 -msgid "" -"Conda-forge will build your package from the source distribution which " -"you [published to PyPI in the previous lesson](publish-pypi) using the " -"recipe that you will create below." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:65 -msgid "Conda-forge publication steps" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:68 -msgid "" -"Image showing the steps associated with publishing to conda-forge. Check " -"out the caption below for a detailed description." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:70 -msgid "" -"The steps for publishing to conda-forge begin with publishing your Python" -" package to PyPI. Once you have published to PyPI you can then create a " -"yaml file recipe that can be submitted to the conda-forge staged recipes " -"repository for review. Once that recipe is accepted, your package will " -"get it's on repository (known as a feedstock) on conda-forge." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:73 -msgid "The steps to publish to conda-forge are:" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:75 -msgid "Publish your Python package distribution files (sdist & wheel) to PyPI" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:76 -msgid "" -"Create a conda-forge recipe, which is a yaml file with instructions on " -"how to build your package on conda-forge, using the grayskull[^grayskull]" -" package." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:77 -msgid "" -"Submit the recipe (yaml file) to the conda-forge staged recipes " -"repository as a pull request for review. [Click here for an example " -"submission from pyOpenSci.](https://github.com/conda-forge/staged-" -"recipes/pull/25173)" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:79 -msgid "" -"Once someone from the conda-forge team reviews your pull request, you may" -" need to make some changes. Eventually the pull request will be approved " -"and merged." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:81 -msgid "" -"Once your recipe is accepted and merged on conda-forge, users can install" -" your package using:" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:83 -msgid "`conda install -c conda-forge your-package`" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:85 -msgid "" -"You only create the recipe once. Once the recipe is accepted and merged, " -"you only need to maintain the repository." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:87 -msgid "Maintaining a conda-forge package" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:89 -msgid "" -"Once your package is on conda-forge, the repository will track release " -"activity on the package's PyPI repository. Any time you make a new PyPI " -"release with a new source distribution, conda-forge will build and update" -" your conda-forge repository (also known as a feedstock)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:91 -msgid "" -"When the update is processed, the friendly conda-forge bot will create a " -"new pull request with an updated distribution recipe in your feedstock." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:93 -msgid "" -"You can review that pull request and then merge it once all of the " -"continuous integration tests pass." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:95 -msgid "" -" How to Publish your package" -" on conda-forge" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:97 -msgid "" -"It's time to add your package to the conda-forge channel. Remember that " -"your package needs to be on PyPI before the steps below will work. And " -"also remember that the team managing conda-forge are all volunteers." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:100 -msgid "" -"Be sure that your package is on PyPI.org (not test.pypi.org) before you " -"attempt to publish to conda-forge." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:103 -msgid "" -"Only submit your package to conda-forge if you intend to maintain it over" -" time." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:106 -msgid "" -"Note - this is a tutorial aimed to help you get your package onto conda-" -"forge. The official conda documentation for this processed [is " -"here](https://conda-forge.org/docs/maintainer/adding_pkgs.html)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:108 -msgid "Step 1: Install grayskull" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:110 -msgid "" -"First, [install " -"grayskull](https://conda.github.io/grayskull/user_guide.html). You can " -"install it using either pip:" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:116 -msgid "or conda" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:122 -msgid "" -"To run this command, use the same shell / terminal that you have been " -"using to run hatch commands in the previous tutorials." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:127 -msgid "" -"You can also install grayskull using pipx[^pipx]. pipx is a tool that " -"allows you to install commonly used tools that you might want to have " -"available across multiple Python environments rather than installing the " -"package into every Python environment that ou create." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:130 -msgid "Step 2: Fork and clone the conda-forge staged-recipes repository" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:132 -msgid "" -"Next, open your shell and `cd` to a location where you want to clone the " -"**conda-forge/staged-recipes** repository." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:133 -msgid "" -"fork and clone the [conda-forge/staged-recipes GitHub " -"repository](https://github.com/conda-forge/staged-recipes)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:134 -msgid "" -"Create a new branch in your fork rather than submitting from the main " -"branch of your fork. We suggest naming the branch your package's name." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:136 -msgid "`git checkout -b your-package-name `" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:138 -msgid "In bash, `cd` into the `staged-recipes/recipes` folder" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:146 -msgid "" -"Next, create a new branch in your `conda-forge/staged-recipes` cloned " -"repository. You might want to make that branch the same name as your " -"package." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:157 -msgid "Step 3: Create your conda-forge recipe" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:159 -msgid "Next, navigate to the recipes directory" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:161 -msgid "" -"If you run `ls` here, you will notice there is an example directory with " -"an example recipe for you to look at." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:173 -msgid "Next, run `grayskull pypi your-package-name` to generate a recipe." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:217 -msgid "" -"Grayskull will pull metadata about your package from PyPI. It does not " -"use your local installation of the package." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:218 -msgid "" -"An internet connection is needed to run the `grayskull pypi your-package-" -"name` step." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:221 -msgid "" -"When you run grayskull, it will grab the latest distribution of your " -"package from PyPI and will use that to create a new recipe." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:223 -msgid "" -"The recipe will be saved in a directory named after your package's name, " -"wherever you run the command." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:225 -msgid "`recipes/packagename/meta.yaml`" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:227 -msgid "" -"At the very bottom of the grayskull output, it will also tell you where " -"it saved the recipe file." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:230 -msgid "" -"Open the meta.yaml file. The finished `meta.yaml` file that grayskull " -"creates should look like the example below:" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:277 -msgid "Step 3b: Bug fix - add a home url to the about: section" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:279 -msgid "" -"There is currently a small bug in Grayskull where it doesn't populate the" -" home: element of the recipe. if you don't include this, [you will " -"receive an error message](https://github.com/conda-forge/staged-" -"recipes/pull/25173#issuecomment-1917916528) from the friendly conda-forge" -" linter bot." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:293 -msgid "to fix this, open your meta.yaml file in your favorite text editor." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:294 -msgid "and add a home: element to the about section" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:296 -msgid "The about section will look like this after you create your recipe." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:306 -msgid "" -"Below you add a home: element. If you have a project home page / website " -"you can use that url. Otherwise, you can also use your PyPI landing page." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:317 -msgid "Step 4: tests for conda-forge" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:319 -msgid "" -"Next, have a look at the tests section in your **meta.yaml** file. At a " -"minimum you should import your package or the main modules associated " -"with your package and run `pip check`." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:321 -msgid "" -"`pip check` will ensure that your package installs properly with all of " -"the proper dependencies." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:333 -msgid "" -"If you have more advanced tests that you wish to run, you can add them " -"here. However, you can also simply leave the tests section as it is." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:335 -msgid "Step 4: Submit a pull request to the staged-recipes repository" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:337 -msgid "" -"Once you have completed all of the above, you are ready to open up a pull" -" request in the `conda-forge/staged-recipes repository`." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:339 -msgid "" -"Submit a pull request from your fork/branch of the staged-recipes " -"repository." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:340 -msgid "" -"Remember that the conda-forge maintainers are volunteers. Be patient for " -"someone to respond and supportive in your communication with them." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md -msgid "Conda-forge checklist help" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:346 -msgid "Conda-forge Staged-recipes Pull Request Checklist" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:348 -msgid "" -"When you submit your package to conda-forge, the pull request template " -"includes a list of checks that you want to ensure you have covered." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:350 -msgid "Below we break down each element of that list." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:352 -msgid "Pull request template checklist tips" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:355 -msgid "" -"-[x] Title of this PR is meaningful: e.g. \"Adding my_nifty_package\", " -"not \"updated meta.yaml\"." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:357 -msgid "" -"**Translation:** Make sure that your pull request title is specific. We " -"suggest something like: `Add recipe for `" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:360 -msgid "" -"-[x] License file is packaged (see [here](https://github.com/conda-forge" -"/staged-" -"recipes/blob/5eddbd7fc9d1502169089da06c3688d9759be978/recipes/example/meta.yaml#L64-L73)" -" for an example)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:362 -msgid "" -"**Translation:** You should have a LICENSE file included in your " -"package's source distribution. If you have followed the pyOpenSci " -"tutorials then you already have a LICENSE file and are likely using the " -"MIT license. When you run `hatch build`, it will bundle that file into " -"the output [source distribution file (which is the tar.gz file)](python-" -"source-distribution) that conda-forge will use to build your package." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:364 -msgid "[x] Source is from official source." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:366 -msgid "" -"**Translation:** If your package is on PyPI as you learned in the " -"[previous lesson on publishing your Python package](publish-pypi) then " -"you are in good shape. conda-forge prefers that your distribution is " -"published to a known repository." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:368 -msgid "" -"-[x] Package does not vendor other packages. (If a package uses the " -"source of another package, they should be separate packages or the " -"licenses of all packages need to be packaged)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:370 -msgid "" -"**Translation:** If the code base in your package is your own and it all " -"shares the same LICENSE then you are in good shape. If you have code " -"taken from other packages then you may need to declare that and include " -"licenses for that code if it is different. If you followed these " -"tutorials then you do not have any vendored code." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:372 -msgid "" -"-[x] If static libraries are linked in, the license of the static library" -" is packaged." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:374 -msgid "" -"-[x] Package does not ship static libraries. If static libraries are " -"needed, [follow CFEP-18](https://github.com/conda-" -"forge/cfep/blob/main/cfep-18.md)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:376 -msgid "" -"**Translation:** A static library refers to a copy of a package built " -"into your package. If your package is a pure Python package, then you can" -" check that your package does not ship static libraries as this does not " -"apply to you." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:378 -msgid "" -"The pyOpenSci tutorials are all pure Python and as such do not use static" -" libraries in a linked or shipped (included in the package distribution) " -"format." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:380 -msgid "" -"If your package has a more complex build that includes links to " -"extensions written in other languages such as C++, then be sure to " -"include the proper licenses for those extensions in your metadata." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:385 -msgid "" -"If you want to learn more about static libraries, then [this " -"overview](https://pypackaging-" -"native.github.io/background/compilation_concepts/#shared-vs-static-" -"libraries) might help." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:388 -msgid "-[ ] Build number is 0." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:390 -msgid "" -"**Translation:** The build number in your recipe is right below the " -"source location of your package's source distribution. `number: 0` is " -"what you should see in that section of your recipe." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:403 -msgid "" -"[x] A tarball (`url`) rather than a repo (e.g. `git_url`) is used in your" -" recipe (see [here](https://conda-" -"forge.org/docs/maintainer/adding_pkgs.html) for more details)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:405 -msgid "" -"**Translation:** Here conda wants you to provide a link to the source " -"distribution on PyPI rather than a link to your GitHub repository " -"distribution. Notice above in the Source section of your recipe there is " -"a `url:` section that provides a PyPI url that ends in tar.gz. That is a " -"link to your source distribution that conda-forge will use." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:411 -msgid "" -"[x] GitHub users listed in the maintainer section have posted a comment " -"confirming they are willing to be listed there." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:413 -msgid "" -"**Translation** Once you have submitted your recipe, be sure that all " -"maintainers listed in your recipe respond acknowledging that they are ok " -"with being listed as a maintainer for the conda-forge version of your " -"package." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:415 -msgid "" -"[x] When in trouble, please check our [knowledge base " -"documentation](https://conda-" -"forge.org/docs/maintainer/knowledge_base.html) before pinging a team." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:417 -msgid "" -"**Translation** The conda team are volunteers who spend their time " -"supporting our community. Please try to troubleshoot on your own first " -"before tagging one of them for help." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:419 -msgid "" -"This is also why we don't suggest you publish to conda-forge as a " -"practice run." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:423 -msgid "" -"Once you create your pull request, a suite of CI actions will run that " -"build and test the build of your package. A conda-forge maintainer will " -"work with you to get your recipe in good shape and merged." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:427 -msgid "" -"Image showing the 5 CI tasks that will run against your package in the " -"GitHub interface after you'ce created a pull request." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:429 -msgid "" -"Wait until all of the CI steps in your pull request have run. At that " -"point your pull request is ready for review by a conda-forge maintainer." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:432 -msgid "" -"In some cases getting all of the checks to run successfully in CI might " -"take a bit of work. If you are struggling to get your recipe to build " -"properly, you can ping the conda-forge maintainer team for help." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:434 -msgid "Please be patient and wait for them to respond." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:436 -msgid "conda-forge staged recipes and CI failures" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:439 -msgid "" -"If your package is a pure Python package that can be installed on any " -"type of computer (Windows, mac, linux) and has no architecture " -"requirements (known as noarch: Python or no architecture requirements) " -"then the conda-forge team only requires tests for Linux CI to pass." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:441 -msgid "" -"So if tests for Windows and MAC OS fail, that is to be expected. In this " -"case, don't worry about failing tests, the maintainer team can help you " -"get your package published." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:444 -msgid "" -"Once you have submitted your recipe, you can wait for the CI build to " -"pass. If it's not passing, and you aren't sure why, a conda-forge " -"maintainer can likely help you figure things out." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:446 -msgid "" -"Once your recipe is built and merged, the conda team will create a new " -"package repository for you similar to [this one for the GemGIS " -"package](https://github.com/conda-forge/gemgis-feedstock)." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:448 -msgid "" -" Congratulations - you " -"have added your package to conda-forge." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:450 -msgid "" -"The last part of this process is maintaining the repository. We cover " -"that next." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:453 -msgid "Maintaining your conda-forge feedstock" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:455 -msgid "" -"Every time you create a new release on PyPI, the conda-forge bots will " -"recognize the release and will rebuild the newly released version of your" -" package. This process may take a day or two to complete so be patient." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:457 -msgid "" -"Once the conda-forge build is complete, all of the maintainers of your " -"conda-forge feedstock will get a ping on GitHub that a new pull request " -"has been opened." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:459 -msgid "" -"Review the pull request. If all tests are passing, you can merge it. " -"Shortly after merging your pull request, the conda-forge release will be " -"available for users to install:" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:461 -msgid "`conda install -c conda-forge yourpackage`" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:465 -msgid "If you have walked through this entire tutorial series you will now:" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:467 -msgid "Understand [what a Python package is ](intro.md)" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:468 -msgid "" -"Know how to [make your code installable](installable-code.md) into Python" -" environments" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:469 -msgid "" -"Know how to create a `pyproject.toml` file, a `README` file, and a " -"`LICENSE` and code of conduct." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:470 -msgid "Know how to [publish your package to PyPI](publish-pypi.md) and" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:471 -msgid "Know how to publish your package to conda-forge" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:473 -msgid "" -"The above are the basic steps that you need to take to create and publish" -" a Python package. In a future tutorial series we will cover that basics " -"of maintaining your package." -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:477 -msgid "[Grayskull blogpost](https://conda-forge.org/blog/2020/03/05/grayskull/)" -msgstr "" - -#: ../../tutorials/publish-conda-forge.md:478 -msgid "[Pipx documentation](https://pipx.pypa.io/stable/)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:1 -msgid "Publish your Python package to PyPI" -msgstr "" - -#: ../../tutorials/publish-pypi.md:4 -msgid "" -"Make sure they add /dist to their .gitignore file. We have not discussed " -"GitHub workflows anywhere yet. Where does that fit?" -msgstr "" - -#: ../../tutorials/publish-pypi.md:8 -msgid "In the previous Python packaging lessons, you've learned:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:10 -msgid "What a Python package is" -msgstr "" - -#: ../../tutorials/publish-pypi.md:11 -msgid "How to make your code installable." -msgstr "" - -#: ../../tutorials/publish-pypi.md:19 -msgid "Build your package's source (sdist) and wheel distributions" -msgstr "" - -#: ../../tutorials/publish-pypi.md:20 -msgid "Setup an account on TestPyPI (the process is similar for PyPI)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:21 -msgid "Publish your package to TestPyPI and PyPI" -msgstr "" - -#: ../../tutorials/publish-pypi.md:23 -msgid "" -"You will do all of your development work in this lesson using " -"[Hatch](https://hatch.pypa.io/latest/)." -msgstr "" - -#: ../../tutorials/publish-pypi.md:25 -msgid "" -"Once your package is on PyPI you can publish it to conda-forge (which is " -"a channel on conda) using " -"[Grayskull](https://conda.github.io/grayskull/)." -msgstr "" - -#: ../../tutorials/publish-pypi.md:28 -msgid "" -"You will learn how to publish to conda-forge in the [next lesson" -"](publish-conda-forge)." -msgstr "" - -#: ../../tutorials/publish-pypi.md:32 -msgid "" -"Graphic showing the high level packaging workflow. On the left you see a " -"graphic with code, metadata and tests in it. Those items all go into your" -" package. An arrow to the right takes you to a build distribution files " -"box. Another arrow to the right takes you to a publish to PyPI box which " -"has an arrow containing sdist and wheel that notes those files go to PyPI" -" for hosting. From PyPI is an arrow containing sdist since you can then " -"connect to conda-forge for an automated build that sends distributions " -"from PyPI to conda-forge." -msgstr "" - -#: ../../tutorials/publish-pypi.md:34 -msgid "" -"You need to build your Python package in order to publish it to PyPI (or " -"Conda). The build process organizes your code and metadata into a " -"distribution format that can be uploaded to PyPI and subsequently " -"downloaded and installed by users." -msgstr "" - -#: ../../tutorials/publish-pypi.md:37 -msgid "TestPyPI vs PyPI" -msgstr "" - -#: ../../tutorials/publish-pypi.md:39 -msgid "" -"There are two repositories associated with PyPI to which you can upload " -"your Python package." -msgstr "" - -#: ../../tutorials/publish-pypi.md:42 -msgid "" -"**[TestPyPI](https://test.pypi.org):** TestPyPI is a package repository " -"provided by PyPI that you can use for testing that your package can be " -"uploaded, downloaded, and installed correctly. This is a great place to " -"practice and learn how to publish a package without exposing your " -"incomplete package on the real PyPI service." -msgstr "" - -#: ../../tutorials/publish-pypi.md:43 -msgid "" -"**[PyPI](https://pypi.org):** This is the live, production PyPI " -"repository where you can officially publish your Python package, and from" -" which users will get your package. IMPORTANT: Only publish your package " -"to PyPI when you are ready for it to be used by others and/or confident " -"that it will become a package that you will maintain. PyPI is not a place" -" to practice learning how to publish a Python package." -msgstr "" - -#: ../../tutorials/publish-pypi.md:45 -msgid "" -"The steps for publishing on TestPyPI vs. PyPI are similar with the " -"exception of a different url. We will point out where they differ." -msgstr "" - -#: ../../tutorials/publish-pypi.md:48 -msgid "4 Steps for publishing a Python package on TestPyPI (or PyPI)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:50 -msgid "" -"In this lesson you will learn how to publish your package to TestPyPI " -"using [Hatch](https://hatch.pypa.io/latest/). There are 4 things that you" -" need to do to publish your Python package: to TestPyPI. You need to:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:55 -msgid "**Create a package development environment**" -msgstr "" - -#: ../../tutorials/publish-pypi.md:56 -msgid "" -"[**Build your package using `hatch build`**](../package-structure-code" -"/python-package-distribution-files-sdist-wheel). Building a package is " -"the process of turning your code into two types of distribution files: " -"sdist and wheel. The wheel distribution file is particularly important " -"for users who will `pip install` your package." -msgstr "" - -#: ../../tutorials/publish-pypi.md:57 -msgid "" -"**Create an account on TestPyPI (or PyPI)**: You will need to create a " -"TestPyPI account and associated token which provides permissions for you " -"to upload your package. When you later publish your package to PyPI, you " -"will need a separate PyPI account and token." -msgstr "" - -#: ../../tutorials/publish-pypi.md:58 -msgid "**Publish to TestPyPI using `hatch publish`**" -msgstr "" - -#: ../../tutorials/publish-pypi.md:60 -msgid "" -"In a future lesson, you will learn how to create an automated GitHub " -"action workflow that publishes an updated version of your package to PyPI" -" every time you create a GitHub release." -msgstr "" - -#: ../../tutorials/publish-pypi.md:64 -msgid "Learn more about building Python packages in our guide" -msgstr "" - -#: ../../tutorials/publish-pypi.md:68 -msgid "" -"[Learn more about what building a Python package is](../package-" -"structure-code/python-package-distribution-files-sdist-wheel)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:69 -msgid "" -"[Learn more about the package distribution file that PyPI needs called " -"the wheel](#python-wheel)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:70 -msgid "" -"[Learn more about the package distribution file that conda-forge will " -"need on PyPI called the sdist (source distribution)](#python-source-" -"distribution)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:73 -msgid "Step 1: Create a Python package development environment" -msgstr "" - -#: ../../tutorials/publish-pypi.md:75 -msgid "" -"The first step in building your package is to create a development " -"environment. The Python environment will contain all of the dependencies " -"needed to both install and work on your package." -msgstr "" - -#: ../../tutorials/publish-pypi.md:77 -msgid "Use Hatch to create your environment." -msgstr "" - -#: ../../tutorials/publish-pypi.md:85 -msgid "Then view all of the current environments that hatch has access to:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:97 -msgid "" -"Then activate the environment. Note that when you call a shell from a " -"Hatch environment, it will automatically install your package into the " -"environment in development or editable mode." -msgstr "" - -#: ../../tutorials/publish-pypi.md:107 -msgid "View what's in the environment using `pip list`:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:123 -msgid "At any time you can exit the environment using `exit`." -msgstr "" - -#: ../../tutorials/publish-pypi.md:137 -msgid "Hatch and environments" -msgstr "" - -#: ../../tutorials/publish-pypi.md:139 -msgid "" -"Behind the scenes when hatch creates a new virtual environment, by " -"default it uses venv[^venv] which is the default environment management " -"tool that comes with Python installations." -msgstr "" - -#: ../../tutorials/publish-pypi.md:142 -msgid "Hatch will:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:144 -msgid "Create a new virtualenv (venv) that is located on your computer." -msgstr "" - -#: ../../tutorials/publish-pypi.md:145 -msgid "" -"Install your package into the environment in editable mode (similar to " -"`python -m pip install -e`). This means it installs both your project and" -" your project's dependencies as declared in your pyproject.toml file." -msgstr "" - -#: ../../tutorials/publish-pypi.md:147 -msgid "Step 2: Build your package's sdist and wheel distributions" -msgstr "" - -#: ../../tutorials/publish-pypi.md:149 -msgid "" -"Once you have your development environment setup, you are ready to build " -"your package using Hatch. Remember that building is the process of " -"turning your Python package file structure into two distribution files:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:151 -msgid "" -"The [wheel distribution](#python-wheel) is a pre-built version of your " -"package. It useful for users as it can be directly installed using a tool" -" such as `pip`. This file has the extension `.whl`." -msgstr "" - -#: ../../tutorials/publish-pypi.md:152 -msgid "" -"The [source distribution](#python-source-distribution) contains the files" -" that make up your package in an unbuilt format. This file will have the " -"extension `.tar.gz`." -msgstr "" - -#: ../../tutorials/publish-pypi.md:154 -msgid "" -"You will use Hatch as a **Front end** tool that builds your package's " -"sdist and wheel using the [hatchling](https://hatch.pypa.io/latest/) " -"build back-end. The hatchling build back-end is used because you declared" -" it in your pyproject.toml file in the [previous lesson](installable-" -"code)." -msgstr "" - -#: ../../tutorials/publish-pypi.md:158 -msgid "To build your package run `hatch build`:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:169 -msgid "Learn more about building a Python package" -msgstr "" - -#: ../../tutorials/publish-pypi.md:171 -msgid "" -"You can learn more about building in the [build page of our packaging " -"guide](../package-structure-code/python-package-distribution-files-sdist-" -"wheel)." -msgstr "" - -#: ../../tutorials/publish-pypi.md:175 -msgid "" -"The sdist is important if you wish to [publish your package to conda-" -"forge](publish-conda-forge). You will learn about this in a later lesson." -msgstr "" - -#: ../../tutorials/publish-pypi.md:179 -msgid "" -"➜ hatch build ────────────────────────────────────── sdist " -"────────────────────────────────────── dist/pyospackage-0.1.tar.gz " -"────────────────────────────────────── wheel " -"────────────────────────────────────── dist/pyospackage-0.1-py3-none-" -"any.whl" -msgstr "" - -#: ../../tutorials/publish-pypi.md:186 -msgid "" -" Congratulations - " -"you've created your Python package distribution files " -msgstr "" - -#: ../../tutorials/publish-pypi.md:188 -msgid "" -"You've now built your Python package and created your package " -"distribution files. The next step is to setup your account on TestPyPI so" -" you can publish your package." -msgstr "" - -#: ../../tutorials/publish-pypi.md:191 -msgid "Step 3. Setup your TestPyPI account" -msgstr "" - -#: ../../tutorials/publish-pypi.md:193 -msgid "" -"Next, you'll setup an account on TestPyPI. Remember that you are using " -"TestPyPI here instead of the real PyPI as a way to safely learn how to " -"publish a package without accidentally \"releasing\" your package before " -"it's ready." -msgstr "" - -#: ../../tutorials/publish-pypi.md:197 -msgid "TestPyPI vs. PyPI" -msgstr "" - -#: ../../tutorials/publish-pypi.md:198 -msgid "" -"If you have a package that you are confident belongs on PyPI, all of the " -"steps below will also work for you. When you publish using Hatch, you " -"will call `hatch publish` to publish directly to PyPI instead of `hatch " -"publish -r test` which publishes to TestPyPI." -msgstr "" - -#: ../../tutorials/publish-pypi.md:201 -msgid "" -"[Open up a web browser and go to the TestPyPI " -"website](https://test.pypi.org/)." -msgstr "" - -#: ../../tutorials/publish-pypi.md:202 -msgid "" -"[Create an account](https://test.pypi.org/account/register/) if you don't" -" already have one. Be sure to store your password in a safe place!" -msgstr "" - -#: ../../tutorials/publish-pypi.md:203 -msgid "Once you have an account setup, login to it." -msgstr "" - -#: ../../tutorials/publish-pypi.md:204 -msgid "" -"Search on [https://test.pypi.org/](https://test.pypi.org/) (and also on " -"[https://pypi.org/](https://pypi.org/)) to ensure that the package name " -"that you have selected doesn't already exist. If you are using our test " -"pyosPackage, then we suggest that you add your name or GitHub username to" -" the end of the package name to ensure it's unique." -msgstr "" - -#: ../../tutorials/publish-pypi.md:206 -msgid "Example: `pyosPackage_yourNameHere`." -msgstr "" - -#: ../../tutorials/publish-pypi.md -msgid "Renaming your project before publishing" -msgstr "" - -#: ../../tutorials/publish-pypi.md:211 -msgid "Required" -msgstr "" - -#: ../../tutorials/publish-pypi.md:213 -msgid "" -"Search your publishing location(s) to make sure your new name isn't taken" -" ([TestPyPI](https://test.pypi.org/), [PyPI](https://pypi.org/), [conda-" -"forge](https://conda-forge.org/packages/))" -msgstr "" - -#: ../../tutorials/publish-pypi.md:214 -msgid "" -"Update the project name in your pyproject.toml file (e.g. `name = " -"\"pyospackage_yourNameHere\"`)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:215 -msgid "" -"Update the module folder name to be the same (e.g. " -"`src/pyospackage_yourNameHere`)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:216 -msgid "Rebuild your project (`hatch build`)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:217 -msgid "Publish your package to capture the name (continue this tutorial!)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:219 -msgid "Recommended" -msgstr "" - -#: ../../tutorials/publish-pypi.md:221 -msgid "Update the Github repository name to align with the new package name" -msgstr "" - -#: ../../tutorials/publish-pypi.md:222 -msgid "" -"Update your local project folder to match the new package name (e.g. " -"`pyospackage_yourNameHere/src`)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:223 -msgid "Update mentions of your repository name in other files (e.g. `README.md`)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:227 -msgid "" -"This is a screenshot of the TestPyPI website. At the top in the search " -"bar, you can see the search for pyosPackage. The search return says there" -" were no results for pyosPackage Did you mean probpackage" -msgstr "" - -#: ../../tutorials/publish-pypi.md:229 -msgid "" -"Before you try to upload to TestPyPI, check to see if the name of your " -"package is already taken. You can do that using the search box at the top" -" of the TestPyPI website." -msgstr "" - -#: ../../tutorials/publish-pypi.md:233 -msgid "Setup 2-factor (2FA) authentication" -msgstr "" - -#: ../../tutorials/publish-pypi.md:235 -msgid "" -"2-factor authentication is a secure login process that allows you to use " -"a backup device that only you can access to validate that the person " -"logging in is really you. It addresses the issue of password phishing " -"where someone else gains access to a password and can login to your " -"account." -msgstr "" - -#: ../../tutorials/publish-pypi.md:238 -msgid "" -"This matters on PyPI because someone could login to your account and " -"upload a version of your package that has security issues. These issues " -"will then impact all of your users when they download and install that " -"version of the package." -msgstr "" - -#: ../../tutorials/publish-pypi.md:240 -msgid "" -"2-factor authentication is required for PyPI authentication as of 1 " -"January 2024." -msgstr "" - -#: ../../tutorials/publish-pypi.md:244 -msgid "Step 4. Create a package upload token" -msgstr "" - -#: ../../tutorials/publish-pypi.md:246 -msgid "" -"To upload your package to TestPyPI (or PyPI), you will need to create a " -"token for your account first, and should then create a package-specific " -"token. (If you completed this step previously, you can reuse the tokens " -"when you upload your package again.)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:248 -msgid "Why create package-specific tokens?" -msgstr "" - -#: ../../tutorials/publish-pypi.md:250 -msgid "" -"It's ideal to create a package-specific token. When you create an " -"account-wide token this allows anyone with access to the account to then " -"access all of your TestPyPI (or PyPI) projects. By creating a package-" -"specific token, you are limiting the scope of the token to only your " -"specific package. This is just a safe way to set things up for you " -"particularly if you are collaborating with others on package development." -msgstr "" - -#: ../../tutorials/publish-pypi.md:253 -msgid "Follow the steps below to create your token." -msgstr "" - -#: ../../tutorials/publish-pypi.md:255 -msgid "Login to TestPyPI and go to your account settings" -msgstr "" - -#: ../../tutorials/publish-pypi.md:256 -msgid "Scroll down to the **API tokens** section" -msgstr "" - -#: ../../tutorials/publish-pypi.md:257 -msgid "Click on the **Add API Token** button" -msgstr "" - -#: ../../tutorials/publish-pypi.md:258 -msgid "" -"If you are new to using TestPyPI and don't have any packages there yet, " -"OR if you have other packages on TestPyPI but are uploading a new " -"package, you will need to create an account-wide token." -msgstr "" - -#: ../../tutorials/publish-pypi.md:259 -msgid "" -"When you create your token, be sure to copy the token value and store it " -"in a secure place before closing that browser." -msgstr "" - -#: ../../tutorials/publish-pypi.md:261 -msgid "Your token should look something like this:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:263 -msgid "`pypi-abunchofrandomcharactershere...`" -msgstr "" - -#: ../../tutorials/publish-pypi.md:265 -msgid "It should start with `pypi` followed by a dash and a bunch of characters." -msgstr "" - -#: ../../tutorials/publish-pypi.md:267 -msgid "Upload to TestPyPI using Hatch" -msgstr "" - -#: ../../tutorials/publish-pypi.md:269 -msgid "Once you have your token, you are ready to publish to TestPyPI." -msgstr "" - -#: ../../tutorials/publish-pypi.md:272 -msgid "Run `hatch publish -r test`" -msgstr "" - -#: ../../tutorials/publish-pypi.md:274 -msgid "" -"`-r` stands for repository. In this case because you are publishing to " -"TestPyPI you will use `-r test`. Hatch will then ask for a username and " -"credentials." -msgstr "" - -#: ../../tutorials/publish-pypi.md:276 -msgid "" -"Add the word `__token__` for your username. This tells TestPyPI that you " -"are using a token value rather than a username." -msgstr "" - -#: ../../tutorials/publish-pypi.md:277 -msgid "Paste your TestPyPI token value in at the `Enter your credentials` prompt:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:288 -msgid "" -"If your credentials are valid, and you have already run `hatch build` and" -" thus have your 2 distribution files in a `dist/` directory then Hatch " -"will publish your package to TestPyPI." -msgstr "" - -#: ../../tutorials/publish-pypi.md:292 -msgid "" -"Hatch also has a caching system so once you enter your credentials it " -"will remember them." -msgstr "" - -#: ../../tutorials/publish-pypi.md:295 -msgid "Install your package from TestPyPI" -msgstr "" - -#: ../../tutorials/publish-pypi.md:297 -msgid "" -"Once your package upload is complete, you can install it from TestPyPI. " -"You can find the installation instructions on the TestPyPI landing page " -"for your newly uploaded package." -msgstr "" - -#: ../../tutorials/publish-pypi.md:302 -msgid "" -"A screenshot of the TestPyPI page for pyosPackage. It says pyosPackage " -"0.1.0 at the top with the pip install instructions below. The landing " -"page of the package has information from the package's README file." -msgstr "" - -#: ../../tutorials/publish-pypi.md:304 -msgid "" -"This is an example landing page for the pyosPackage that was just " -"uploaded. Notice at the top of the page there are instructions for how to" -" install the package from TestPyPI. You can simply copy that code and use" -" it to install your package from TestPyPI locally." -msgstr "" - -#: ../../tutorials/publish-pypi.md:307 -msgid "" -"As an example, [check out our pyOpenSci pyosPackage landing page on " -"TestPyPI](https://test.pypi.org/project/pyosPackage/). Notice that the " -"page has information about the current package version and also " -"installation instructions as follows:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:311 -msgid "`python -m pip install -i https://test.pypi.org/simple/ pyosPackage`" -msgstr "" - -#: ../../tutorials/publish-pypi.md:314 -msgid "" -"Publishing to TestPyPI vs PyPI While you can install from TestPyPI it's " -"not recommended that you publish to TestPyPI as a permanent way to " -"install your package. In fact, you cannot, because TestPyPI may delete " -"accounts after a time. TestPyPI is a perfect place to learn how to " -"publish your package and test the installation process. But your end goal" -" should be to publish to PyPI once you have figured out your workflow and" -" your package is ready to deploy." -msgstr "" - -#: ../../tutorials/publish-pypi.md:318 -msgid "Time to install your package" -msgstr "" - -#: ../../tutorials/publish-pypi.md:320 -msgid "" -"On your computer, activate the development environment that you wish to " -"install your newly published package in." -msgstr "" - -#: ../../tutorials/publish-pypi.md:322 -msgid "Run the installation instructions for your package from TestPyPI." -msgstr "" - -#: ../../tutorials/publish-pypi.md -msgid "Conda" -msgstr "" - -#: ../../tutorials/publish-pypi.md -msgid "venv Mac / Linux" -msgstr "" - -#: ../../tutorials/publish-pypi.md:346 -msgid "The value of end-to-end tools like hatch, flit and poetry" -msgstr "" - -#: ../../tutorials/publish-pypi.md:347 -msgid "" -"In this lesson you are using Hatch and hatchling to create, build and " -"publish your Python package. [Click here to learn about other packaging " -"tools in the ecosystem.](../package-structure-code/python-package-build-" -"tools.md)" -msgstr "" - -#: ../../tutorials/publish-pypi.md:351 -msgid "" -"teach them to setup trusted publisher for actions... in the actions " -"lesson https://pypi.org/help/#twofa" -msgstr "" - -#: ../../tutorials/publish-pypi.md:354 -msgid "" -"from PyPI: https://pypi.org/help/#apitoken - You can create a token for " -"an entire PyPI account, in which case, the token will work for all " -"projects associated with that account. Alternatively, you can limit a " -"token's scope to a specific project." -msgstr "" - -#: ../../tutorials/publish-pypi.md:357 -msgid "Package-specific token vs trusted publisher" -msgstr "" - -#: ../../tutorials/publish-pypi.md:359 -msgid "" -"For long run maintenance of your package, you have two options related to" -" PyPI publication." -msgstr "" - -#: ../../tutorials/publish-pypi.md:362 -msgid "" -"You can create a package-specific token which you will use to publish " -"your package (manually) to PyPI. This is a great option if you don't wish" -" to automate your PyPI publication workflow." -msgstr "" - -#: ../../tutorials/publish-pypi.md:363 -msgid "" -"You can also create an automated publication workflow on GitHub using " -"GitHub actions. This is a great way to make the publication process " -"easier and it also supports a growing maintainer team. In this case we " -"suggest you don't worry about the token and instead setup a specific " -"GitHub action that publishes your package when you make a release. You " -"can then create a \"trusted publisher\" workflow on PyPI." -msgstr "" - -#: ../../tutorials/publish-pypi.md:365 -msgid "" -"You will learn how to create the automated trusted publisher workflow in " -"a followup lesson." -msgstr "" - -#: ../../tutorials/publish-pypi.md:368 -msgid "OPTIONAL: If you want to use a manual token-based publication workflow" -msgstr "" - -#: ../../tutorials/publish-pypi.md:370 -msgid "" -"If you plan to use your token regularly to publish to PyPI, we strongly " -"recommend going through the above steps again to create a token specific " -"to your new package." -msgstr "" - -#: ../../tutorials/publish-pypi.md:373 -msgid "To do this:" -msgstr "" - -#: ../../tutorials/publish-pypi.md:374 -msgid "Go to TestPyPI." -msgstr "" - -#: ../../tutorials/publish-pypi.md:375 -msgid "Navigate to the \"Your Projects\" section of your account" -msgstr "" - -#: ../../tutorials/publish-pypi.md:376 -msgid "" -"Click on the manage button for the project that you wish to add a token " -"for" -msgstr "" - -#: ../../tutorials/publish-pypi.md:377 -msgid "Go to settings" -msgstr "" - -#: ../../tutorials/publish-pypi.md:378 -msgid "Click on \"Create a token for your-package-name-here\"" -msgstr "" - -#: ../../tutorials/publish-pypi.md:379 -msgid "" -"Create the token and follow the steps above publish your package using " -"the repository specific token." -msgstr "" - -#: ../../tutorials/publish-pypi.md:381 -msgid "And you're all done!" -msgstr "" - -#: ../../tutorials/publish-pypi.md:383 -msgid "You have published your package to TestPyPI!" -msgstr "" - -#: ../../tutorials/publish-pypi.md:385 -msgid "" -"Congratulations. You have now successfully published your package to " -"TestPyPI. If you have a package that is ready for real-world use on the " -"real PyPI, then you can follow the same steps (with the differences noted" -" above) to publish it on PyPI." -msgstr "" - -#: ../../tutorials/publish-pypi.md:387 -msgid "" -"Once you publish on PyPI, you can then easily add your package to the " -"conda-forge ecosystem using the [grayskull](https://conda-" -"forge.org/blog/posts/2020-03-05-grayskull/) tool." -msgstr "" - -#: ../../tutorials/publish-pypi.md:389 -msgid "You will learn how to do that in the next lesson." -msgstr "" - -#: ../../tutorials/publish-pypi.md:396 -msgid "https://docs.python.org/3/library/venv.html" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:1 -msgid "Make your Python package PyPI ready - pyproject.toml" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:3 -msgid "" -"In [the installable code lesson](installable-code), you learned how to " -"add the bare minimum information to a `pyproject.toml` file to make it " -"installable. You then learned how to [publish a bare minimum version of " -"your package to PyPI](publish-pypi.md)." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:5 -msgid "Following that you learned how to add a:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:6 -msgid "[README.md](add-readme)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:7 -msgid "[LICENSE](add-license-coc) and" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:8 -msgid "[CODE_OF_CONDUCT](add-coc)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:10 -msgid "to the root of your project directory." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:12 -msgid "" -"To enhance the visibility of your package on PyPI and provide more " -"information about its compatibility with Python versions, project " -"development status, and project maintainers, you should add additional " -"metadata to your `pyproject.toml` file. This lesson will guide you " -"through the process." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:24 -msgid "" -"More about the `pyproject.toml` file and how it's used to store different" -" types of metadata about your package" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:25 -msgid "" -"How to declare information (metadata) about your project to help users " -"find and understand it on PyPI." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:27 -msgid "" -"If you wish to learn more about the `pyproject.toml` format, [check out " -"this page. ](../package-structure-code/pyproject-toml-python-package-" -"metadata.md)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md -msgid "Click for lesson takeaways" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:34 -msgid "When creating your pyproject.toml file, consider the following:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:36 -msgid "" -"There are only two required metadata tables that you need to install and " -"publish your Python package:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:37 -msgid "**[build-system]**" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:38 -msgid "**[project]**." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:39 -msgid "" -"The **[project]** table stores your package's metadata. Within the " -"**[project]** table, There are only two _required_ fields:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:40 -msgid "**name=**" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:41 -msgid "**version=**" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:42 -msgid "" -"You should add more metadata to the `[project]` table as it will make it " -"easier for users to find your project on PyPI. And it will also make it " -"easier for installers to understand how to install your package." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:43 -msgid "" -"When you are adding classifiers to the **[project]** table, only use " -"valid values from [PyPI’s classifier " -"page](https://PyPI.org/classifiers/). An invalid value here will raise an" -" error when you build and publish your package on PyPI." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:44 -msgid "" -"There is no specific order for tables in the `pyproject.toml` file. " -"However, fields need to be placed within the correct tables. For example " -"`requires =` always need to be in the **[build-system]** table." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:45 -msgid "" -"We suggest that you include your **[build-system]** table at the top of " -"your `pyproject.toml` file." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:50 -msgid "" -"The `pyproject.toml` file is a human and machine-readable file that " -"serves as the primary configuration file for your Python package." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:54 -msgid "" -"[Building your package](build-package) is the step that created the " -"distribution files that are required for you to publish to PyPI." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:58 -msgid "About the .toml format" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:60 -msgid "" -"The **pyproject.toml** file is written in [TOML (Tom's Obvious, Minimal " -"Language) format](https://toml.io/en/). TOML is an easy-to-read structure" -" that is based on key/value pairs. Each section in the **pyproject.toml**" -" file contains a `[table identifier]`. The TOML format can be compared to" -" other structured formats such as`.json`. However, the TOML format was " -"designed to be easier to read for humans." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:62 -msgid "" -"Below you can see the `[build-system]` table. Within that table there are" -" two required key/value pairs." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:65 -msgid "" -"`requires =` is the key and the value is `[\"hatchling\"]` within the " -"`[build-system]` array specified by square brackets `[]`." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:75 -msgid "What is the pyproject.toml used for?" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:77 -msgid "The pyproject.toml file tells your build tool:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:79 -msgid "" -"What build backend to use to build your package (we are using `hatchling`" -" in this tutorial but there are [many others to choose from](/package-" -"structure-code/python-package-build-tools))." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:80 -msgid "How and where to retrieve your package's version:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:81 -msgid "**statically** where you declare the version `version = \"0.1.0\"` or" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:82 -msgid "" -"**dynamically** where the tool looks to the most recent tag in your " -"history to determine the current version." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:83 -msgid "What dependencies your package needs" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:84 -msgid "What versions of Python your package supports (important for your users)." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:86 -msgid "" -"The `pyproject.toml` file also makes it easy for anyone browsing your " -"GitHub repository to quickly understand your package's structure such as:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:89 -msgid "How your package is built," -msgstr "" - -#: ../../tutorials/pyproject-toml.md:90 -msgid "What Python versions and operating systems it supports" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:91 -msgid "What it does," -msgstr "" - -#: ../../tutorials/pyproject-toml.md:92 -msgid "Who maintains it" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:94 -msgid "" -"Finally, the pyproject.toml file is also often used to configure tools " -"such as static type checkers (e.g. mypy) and code formatters/linters " -"(e.g. black, ruff)." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:97 -msgid "" -"Check out the [PyPA " -"documentation](https://packaging.python.org/en/latest/tutorials" -"/packaging-projects/#choosing-a-build-backend) if you are interested in " -"setting build configurations for other tools." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:99 -msgid "" -"Note that some build tools may deviate in how they store project " -"metadata. As such you may want to refer to their documentation if you " -"decide to use a tool other than Hatch and hatchling. We have selected " -"hatchling and hatch as our tool of choice for this tutorial as it adheres" -" to PyPA rules and guidelines." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:103 -msgid "How is pyproject.toml metadata used?" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:105 -msgid "" -"The pyproject.toml file is the file that your build tool uses to populate" -" a `METADATA` that is included in your Python distribution files that get" -" published to PyPI. This `METADATA` file is then used by PyPI to populate" -" your package's PyPI landing page and help users filter through the tens " -"of thousands of packages published there." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:108 -msgid "" -"Image showing the left side bar of PyPI for the package xclim. The " -"section at the top says Classifier. Below there is a list of items " -"including Development status, intended audience, License, natural " -"language, operating system, programming language and topic. Below each of" -" those sections are various classifier options.\" width=\"300px\">" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:113 -msgid "" -"When you add the classifier section to your pyproject.toml and your " -"package is built, the build tool organizes the metadata into a format " -"that PyPI can understand and represent on your PyPI landing page. These " -"classifiers also allow users to sort through packages by version of " -"python they support, categories and more." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:119 -msgid "A more in-depth overview of pyproject.toml files" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:121 -msgid "" -"[Our guidebook page has a more in depth overview of this file" -"](../package-structure-code/pyproject-toml-python-package-metadata/)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:124 -msgid "How to update your pyproject.toml file" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:126 -msgid "" -"In the last lesson, you created a bare-bones pyproject.toml file that " -"contained the core elements needed to build your package:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:130 -msgid "" -"A `[build-system]` table where you defined your project's backend build " -"tool (`hatchling`)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:131 -msgid "A `[project]` table where you defined your project's version and name." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:133 -msgid "The `pyproject.toml` file that you created, looked like this:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:145 -msgid "" -"Your next step is to add additional recommended metadata fields that will" -" both help users find your package on PyPI and also better describe the " -"scope of your package. Once you add this metadata, you don't have to do " -"it again. These metadata fields will only be updated periodically when " -"you do something such as:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:148 -msgid "drop a package dependency" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:149 -msgid "modify what Python versions your package supports." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:151 -msgid "More on hatchling" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:154 -msgid "" -"The documentation for the hatchling back-end is " -"[here](https://hatch.pypa.io/latest/config/metadata/)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:157 -msgid "Step 1: Add Author, maintainer and project description" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:159 -msgid "" -"After completing the [installable code tutorial](installable-code), you " -"should have a pyproject.toml file with a project name and a version in " -"the `[project]` table." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:167 -msgid "Add the following to your table:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:169 -msgid "" -"A **description** of your package. This should be a single line and " -"should briefly describe the goal of your package using non technical " -"terms if as all possible!" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:170 -msgid "package **authors**" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:171 -msgid "package **maintainers**" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:173 -msgid "The `description` is just a string like the other values you've set:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:184 -msgid "" -"When you add authors and maintainers you need to use a format that will " -"look like a Python list with a dictionary within it:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:198 -msgid "Author names & emails" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:202 -msgid "" -"There is a quirk with PyPI for authors that have names but not emails in " -"the pyproject.toml. If you are missing the email for one or more authors " -"or maintainers, like this:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:211 -msgid "" -"Then we suggest that you only provide names in your list of names to " -"ensure that everything renders properly on your PyPI page - like this:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:220 -msgid "don't have emails for everyone, we suggest that you only add names." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:223 -msgid "" -"Your `pyproject.toml` file now should look like the example below. It is " -"OK if you only have 1 author and the same author is also maintainer of " -"your package:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md -msgid "" -"Learn More: What's the difference between author and maintainer in open " -"source?" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:251 -msgid "" -"When adding maintainers and authors, you may want to think about the " -"difference between the two." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:253 -msgid "Authors generally include people who:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:254 -msgid "originally created / designed developed the package and" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:255 -msgid "people who add new functionality to the package." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:257 -msgid "" -"Whereas maintainers are the people that are currently, actively working " -"on the project. It is often the case that there is overlap in authors and" -" maintainers. As such these lists may be similar or the same." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:259 -msgid "" -"A good example of when the lists might diverge is sometimes you have a " -"package where an initial author developed it and then stepped down as a " -"maintainer to move on to other things. This person may continue to be " -"considered an author but no longer actively maintains the package." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:261 -msgid "" -"It is important to note that there are many ways to define author vs " -"maintainer and we don't prescribe a single approach in this tutorial." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:263 -msgid "" -"However, we encourage you to consider carefully, for PyPI publication, " -"who you want to have listed as authors and maintainers on your PyPI " -"landing page." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:267 -msgid "Step 2: Add README and license" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:269 -msgid "" -"In the previous lessons, you added both a [README.md](add-readme) file " -"and a [LICENSE](add-license-coc) to your package repository. Once you " -"have those files, you can add them to your pyproject.toml file as links " -"following the example below." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:297 -msgid "Step 3: Specify Python version with `requires-python`" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:299 -msgid "" -"Add the `requires-python` field to your `pyproject.toml` `[project]` " -"table. The `requires-python` field helps pip identify which Python " -"versions that your package supports. It is set to a single value. The " -"[packaging " -"specification](https://packaging.python.org/en/latest/specifications" -"/core-metadata/#core-metadata-requires-python) defines`requires-python` " -"as a string that uses version specifiers. Most projects will specify the " -"oldest Python version supported by the package. In some advanced cases, " -"an upper bound is set to indicate which future Python versions, if any, " -"will be supported." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:331 -msgid "Step 4: Specify Dependencies" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:333 -msgid "" -"Next add your dependencies table to the project table. The `dependencies " -"=` section contains a list (or array in the toml language) of the Python " -"packages that your package requires to run properly in a Python " -"environment. Similar to the requirements listed in the `[build-system]` " -"table above:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:341 -msgid "dependencies are added in an array (similar to a Python list) structure." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:347 -msgid "" -"A dependency can be limited to specific versions using a **version " -"specifier.** If the dependency has no version specifier after the " -"dependency name, your package can use any version of the dependent " -"package. Code changes over time, bugs are fixed, APIs change, and so it's" -" good to be clear about which version of the dependency you wrote your " -"code to be compatible with - a package you wrote this year probably isn't" -" compatible with numpy v0.0.1!" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:351 -msgid "" -"[Learn more about various ways to specify ranges of package versions " -"here.](https://packaging.python.org/en/latest/specifications/version-" -"specifiers/#id5)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:353 -msgid "" -"The most common version specifier is a **lower bound,** allowing any " -"version higher than the specified version. Ideally you should set this to" -" the lowest version that is still compatible with your package, but in " -"practice for new packages this is often set at the version that was " -"current at the time the package was written[^lowerbound]." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:358 -msgid "Lower bounds look like this:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:364 -msgid "" -"Commas are used to separate individual dependencies, and each package in " -"your `dependencies` section can use different types of version " -"specifiers:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:375 -msgid "Your `pyproject.toml` file will now look like this:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:405 -msgid "Pin dependencies with caution" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:406 -msgid "" -"\"Pinning\" a dependency means setting it to a specific version, like " -"this:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:408 -msgid "`numpy == 1.0`." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:410 -msgid "" -"If you are building a library package that other developers will depend " -"upon, you must be cautious before pinning to a precise dependency " -"version. Applications, such as production websites, will often pin their " -"dependencies since other packages will not depend on their project. This " -"is because users will be installing your package into various " -"environments. A dependency pinned to a single specific version can make " -"resolving a Python environment more challenging. As such only pin " -"dependencies to a specific version if you absolutely need to do so." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:418 -msgid "" -"Similarly, you should be cautious when specifying an upper bound on a " -"package. These two specifications are equivalent:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:426 -msgid "" -"One build tool that you should be aware of that pins dependencies to an " -"upper bound by default is Poetry. [Read more about how to safely add " -"dependencies with Poetry, here.](challenges-with-poetry)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:429 -msgid "Step 5: Add PyPI classifiers" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:431 -msgid "" -"Next you will add classifiers to your `pyproject.toml` file. The value " -"for each classifier that you add to your `pyproject.toml` file must come " -"from the list of [PyPI accepted classifier values found " -"here](https://PyPI.org/classifiers/). Any deviations in spelling and " -"format will cause issues when you publish to PyPI." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:433 -msgid "What happens when you use incorrect classifiers?" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:436 -msgid "" -"If you do not [use standard classifier " -"values](https://PyPI.org/classifiers/), when you try to publish your " -"package on PyPI it will be rejected. 😔 Don't worry if PyPI rejects you on" -" your first try! It has happened to all of us." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:439 -msgid "Review that list and add items below to your `pyproject.toml` file:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:441 -msgid "development status" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:442 -msgid "intended audiences" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:443 -msgid "topic" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:444 -msgid "license and" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:445 -msgid "programming language support" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:447 -msgid "" -"The classifier key should look something like the example below. A few " -"notes:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:449 -msgid "" -"Your classifier values might be different depending upon the license you " -"have selected for your package, your intended audience, development " -"status of your package and the Python versions that you support" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:450 -msgid "" -"You can add as many classifiers as you wish as long as you use the " -"[designated PyPI classifier values](https://PyPI.org/classifiers/)." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:490 -msgid "" -"Note that while classifiers are not required in your `pyproject.toml` " -"file, they will help users find your package. As such we strongly " -"recommend that you add them." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:492 -msgid "Step 6: Add the `[project.urls]` table" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:494 -msgid "Finally, add the project.urls table to your pyproject.toml file." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:496 -msgid "" -"`project.urls` contains links that are relevant for your project. You " -"might want to include:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:498 -msgid "" -"**Homepage:** A link to your published documentation for your project. If" -" you are working through this tutorial, then you may not have this link " -"yet. That's ok, you can skip it for the time being." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:499 -msgid "" -"**Bug reports:** a link to your issues / discussions or wherever you want" -" users to report bugs." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:500 -msgid "**Source:** the GitHub / GitLab link for your project." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:546 -msgid "" -"There are many other urls that you can add here. Check out the [README " -"file here for an overview](https://github.com/patrick91/links-demo)." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:549 -msgid "Putting it all together - your completed pyproject.toml file" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:551 -msgid "" -"Below is an example of a complete `pyproject.toml` file that is commented" -" with all of the sections we discussed above." -msgstr "" - -#: ../../tutorials/pyproject-toml.md -msgid "Appendix - Click for a fully commented pyproject.toml file" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:601 -msgid "" -"Below is a fully commented pyproject.toml file if you want to use it for " -"reference." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:666 -msgid "Example `pyproject.toml` files" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:668 -msgid "" -"Below are some examples of `pyproject.toml` files from various packages " -"in the scientific and pyOpenSci ecosystem." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:669 -msgid "" -"[PyPA's fully documented example pyproject.toml " -"file](https://github.com/pypa/sampleproject/blob/main/pyproject.toml)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:670 -msgid "" -"[taxpasta has a nicely organized pyproject.toml file and is a pyOpenSci " -"approved " -"package](https://github.com/taxprofiler/taxpasta/blob/f9f6eea2ae7dd08bb60a53dd49ad77e4cf143573/pyproject.toml)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:676 -msgid "At this point you've created:" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:678 -msgid "A [README.md](add-readme) file for your package" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:679 -msgid "A [CODE_OF_CONDUCT.md](add-coc) file to support your user community" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:680 -msgid "" -"And a [LICENSE](add-license-coc) file which provides legal boundaries " -"around how people can and can't use your software" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:682 -msgid "" -"You also learned [how to publish your package to (test)PyPI](publish-" -"pypi)." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:684 -msgid "Publish a new version of your package to PyPI" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:686 -msgid "" -"You are now ready to publish a new version of your Python package to " -"(test) PyPI. When you do this you will see that the landing page for your" -" package now contains a lot more information." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:688 -msgid "Try to republish now." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:690 -msgid "" -"First, update the version of your package in your pyproject toml file. " -"Below version is updated from `0.1` to `0.1.1`." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:703 -msgid "Now use hatch to publish the new version of your package to test.PyPI.org." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:710 -msgid "Next (optional) step - publishing to conda-forge" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:712 -msgid "" -"You now have all of the skills that you need to publish your package to " -"PyPI." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:715 -msgid "" -"If you also want to publish your package on conda-forge (which is a " -"channel within the conda ecosystem), you will learn how to do that in the" -" next lesson." -msgstr "" - -#: ../../tutorials/pyproject-toml.md:719 -msgid "" -"Really good resources from jeremiah " -"https://daniel.feldroy.com/posts/2023-08-pypi-project-urls-cheatsheet " -"useful (and the linked links-demo even more so)" -msgstr "" - -#: ../../tutorials/pyproject-toml.md:356 -msgid "" -"Some packaging tools will do this for you when you add a dependency using" -" their cli interface. For example [`poetry add`](https://python-" -"poetry.org/docs/cli/#add) will add the most recent version with a `^` " -"specifier, and [`pdm add`](https://pdm-" -"project.org/latest/reference/cli/#add) will add the most recent version " -"with `>=`." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:1 -msgid "Using Hatch to Migrate setup.py to a pyproject.toml" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:3 -msgid "" -"Hatch can be particularly useful to generate your project's " -"`pyproject.toml` if your project already has a `setup.py`." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:5 -msgid "Note" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:8 -msgid "" -"This step is not necessary and is only useful if your project already has" -" a `setup.py` file defined." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:9 -msgid "" -"If your project does not already define a `setup.py` see [Make your " -"Python code installable](installable-code.md)" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:17 -msgid "" -"The process of using Hatch to transition to using `pyproject.toml` for " -"projects that already have a `setup.py` defined." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:20 -msgid "What is Hatch?" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:22 -msgid "" -"Hatch is a Python package manager designed to streamline the process of " -"creating, managing, and distributing Python packages. It provides a " -"convenient CLI (Command-Line Interface) for tasks such as creating new " -"projects, managing dependencies, building distributions, and publishing " -"packages to repositories like PyPI." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:28 -msgid "See [Get to know Hatch](get-to-know-hatch.md) for more information." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:31 -msgid "Prerequisites" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:33 -msgid "" -"Before we begin, ensure that you have Hatch installed on your system. You" -" can install it via pip:" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:39 -msgid "Sample Directory Tree" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:41 -msgid "" -"Let's take a look at a sample directory tree structure before and after " -"using `hatch init`:" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:43 -msgid "Before `hatch init`" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:59 -msgid "After `hatch init`" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:77 -msgid "" -"As you can see, the main change after running `hatch init` is the " -"addition of the `pyproject.toml` file in the project directory." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:79 -msgid "Step-by-Step Guide" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:81 -msgid "" -"Now, let's walk through the steps to use Hatch to create a " -"`pyproject.toml` file for your project." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:83 -msgid "" -"**Navigate to Your Project Directory**: Open your terminal or command " -"prompt and navigate to the directory where your Python project is " -"located." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:85 -msgid "" -"**Initialize Hatch**: Run the following command to initialize Hatch in " -"your project directory:" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:91 -msgid "" -"**Review and Customize**: After running the previous command, Hatch will " -"automatically generate a `pyproject.toml` file based on your existing " -"project configuration. Take some time to review the contents of the " -"generated `pyproject.toml` file. You may want to customize certain " -"settings or dependencies based on your project's requirements (see " -"[pyproject.toml tutorial](pyproject-toml.md) for more information about " -"the `pyproject.toml`)." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:93 -msgid "" -"**Verify**: Verify that the `pyproject.toml` file accurately reflects " -"your project configuration and dependencies. You can manually edit the " -"file if needed, but be cautious and ensure that the syntax is correct." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:95 -msgid "" -"**Delete setup.py**: Since we're migrating to using `pyproject.toml` " -"exclusively, the `setup.py` file becomes unnecessary. You can safely " -"delete it from your project directory." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:97 -msgid "" -"**Test Build**: Before proceeding further, it's essential to ensure that " -"your project builds successfully using only the `pyproject.toml` file. " -"Run the following command to build your project:" -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:103 -msgid "" -"This command will build your project based on the specifications in the " -"`pyproject.toml` file. Make sure to check for any errors or warnings " -"during the build process." -msgstr "" - -#: ../../tutorials/setup-py-to-pyproject-toml.md:105 -msgid "" -"**Test Existing Functionality**: After successfully building your project" -" with `pyproject.toml`, it's crucial to ensure that your project's " -"existing functionality remains intact. Run any pre-existing tests to " -"verify that everything still works as expected." -msgstr "" - diff --git a/noxfile.py b/noxfile.py index ee44f29c..4a0ea835 100644 --- a/noxfile.py +++ b/noxfile.py @@ -43,7 +43,7 @@ ## Localization options (translations) # List of languages for which locales will be generated in (/locales/) -LANGUAGES = ["es", "ja"] +LANGUAGES = ["es"] # List of languages that should be built when releasing the guide (docs or docs-test sessions) RELEASE_LANGUAGES = [] From a5d8e4d34439a3abe9d2b849317eb1e6776f5427 Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 18:24:53 +0900 Subject: [PATCH 50/65] Preparing the Translation Files for Japanese --- locales/jp/LC_MESSAGES/CONTRIBUTING.po | 435 ++ locales/jp/LC_MESSAGES/TRANSLATING.po | 717 +++ locales/jp/LC_MESSAGES/documentation.po | 2545 ++++++++ locales/jp/LC_MESSAGES/index.po | 483 ++ .../jp/LC_MESSAGES/package-structure-code.po | 5301 ++++++++++++++++ locales/jp/LC_MESSAGES/tests.po | 1002 +++ locales/jp/LC_MESSAGES/tutorials.po | 5536 +++++++++++++++++ 7 files changed, 16019 insertions(+) create mode 100644 locales/jp/LC_MESSAGES/CONTRIBUTING.po create mode 100644 locales/jp/LC_MESSAGES/TRANSLATING.po create mode 100644 locales/jp/LC_MESSAGES/documentation.po create mode 100644 locales/jp/LC_MESSAGES/index.po create mode 100644 locales/jp/LC_MESSAGES/package-structure-code.po create mode 100644 locales/jp/LC_MESSAGES/tests.po create mode 100644 locales/jp/LC_MESSAGES/tutorials.po diff --git a/locales/jp/LC_MESSAGES/CONTRIBUTING.po b/locales/jp/LC_MESSAGES/CONTRIBUTING.po new file mode 100644 index 00000000..8c6af5ff --- /dev/null +++ b/locales/jp/LC_MESSAGES/CONTRIBUTING.po @@ -0,0 +1,435 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: jp\n" +"Language-Team: jp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../CONTRIBUTING.md:4 +msgid "Contributing to the Python Packaging Guide" +msgstr "" + +#: ../../CONTRIBUTING.md:6 +msgid "The guide is a community resource." +msgstr "" + +#: ../../CONTRIBUTING.md:8 +msgid "TL;DR" +msgstr "" + +#: ../../CONTRIBUTING.md:10 +msgid "We welcome contributions in the form of issues and pull requests:" +msgstr "" + +#: ../../CONTRIBUTING.md:12 +msgid "" +"If you have an idea for something that should be included in the guide, " +"[please open an issue here](https://github.com/pyOpenSci/python-package-" +"guide/issues)." +msgstr "" + +#: ../../CONTRIBUTING.md:13 +msgid "" +"If you find a typo, feel free to [submit a pull " +"request](https://github.com/pyOpenSci/python-package-guide/pulls) to " +"modify the text directly. Or, if you are less comfortable with pull " +"requests, feel free to open an issue." +msgstr "" + +#: ../../CONTRIBUTING.md:14 +msgid "" +"If you are interested in helping translate the guide into other " +"languages, take a look at the [translation guide](./TRANSLATING.md)." +msgstr "" + +#: ../../CONTRIBUTING.md:15 +msgid "" +"If you want to see a larger change to the content of the guide book, " +"please submit an issue first!" +msgstr "" + +#: ../../CONTRIBUTING.md:17 +msgid "" +"If you are unsure about how to contribute or are not familiar with git " +"and github, this guide will help you through the process." +msgstr "" + +#: ../../CONTRIBUTING.md:19 +msgid "How the Python Packaging Guide is structured" +msgstr "" + +#: ../../CONTRIBUTING.md:21 +msgid "" +"The Python Packaging Guide is written in myST (a variant of MarkDown and " +"rST) and we use **Sphinx**, a documentation engine built in `Python` to " +"build the HTML version you see online." +msgstr "" + +#: ../../CONTRIBUTING.md:23 +msgid "We use a tool called Nox to manage the process of building the guide." +msgstr "" + +#: ../../CONTRIBUTING.md:25 +msgid "Two approaches to contributing" +msgstr "" + +#: ../../CONTRIBUTING.md:27 +msgid "You can contribute to the guide using two approaches." +msgstr "" + +#: ../../CONTRIBUTING.md:29 +msgid "" +"The first approach is using a local copy of the guide in your computer. " +"This option requires a more involved setup, but allows you to build the " +"guide locally to verify your contribution did not introduce any bugs " +"before submitting a pull request. It is the recommended approach for " +"larger contribution, like writing a whole new section." +msgstr "" + +#: ../../CONTRIBUTING.md:31 +msgid "" +"The second approach is making your contribution directly in the GitHub " +"website. This option does not require any setup on your computer and " +"while your contribution will still be tested when you submit a PR " +"(continuous integration), it will take longer for you to get any feedback" +" in case of issue. It is the best way to make small contribution, like " +"fixing typos, or if this is your first contribution to open source and " +"the first approach feels too intimidating." +msgstr "" + +#: ../../CONTRIBUTING.md:33 +msgid "Forking the repository" +msgstr "" + +#: ../../CONTRIBUTING.md:35 +msgid "" +"Independently of the approach you choose, the first step is to fork the " +"Python Packaging Guide repository into your personal GitHub space. To " +"\"fork\" a repository in GitHub means to create a copy of the main " +"repository, or repo, that you have complete control over and can modify " +"as you see fit." +msgstr "" + +#: ../../CONTRIBUTING.md:37 +msgid "To fork a repo," +msgstr "" + +#: ../../CONTRIBUTING.md:39 +msgid "Make sure you are logged into GitHub." +msgstr "" + +#: ../../CONTRIBUTING.md:41 +msgid "" +"Go to the repo you would like to fork, in this case the [Python Packaging" +" Guide](https://www.github.com/pyopensci/python-package-guide) repo." +msgstr "" + +#: ../../CONTRIBUTING.md:43 +msgid "" +"In the top right-hand corner of the page there is a 'Fork' button. Click " +"that button. You will be brought to a new page where you will 'Create a " +"new fork'. Feel free to keep all the default inputs and click 'Create " +"fork'. This will create a copy of the repo at " +"`https://github.com//python-package-guide`, where `` " +"is your GitHub username." +msgstr "" + +#: ../../CONTRIBUTING.md:47 +msgid "Contributing via the GitHub website" +msgstr "" + +#: ../../CONTRIBUTING.md:49 +msgid "How to edit a MarkDown file" +msgstr "" + +#: ../../CONTRIBUTING.md:51 +msgid "" +"*__TODO__: This section should show how to use the GitHub interface to " +"edit and previewing a Markdown file.*" +msgstr "" + +#: ../../CONTRIBUTING.md:53 +msgid "How to commit your changes" +msgstr "" + +#: ../../CONTRIBUTING.md:55 +msgid "" +"*__TODO__: This section should show how to commit changes via the GitHub " +"interface.*" +msgstr "" + +#: ../../CONTRIBUTING.md:57 +msgid "Contributing locally on your computer" +msgstr "" + +#: ../../CONTRIBUTING.md:59 +msgid "Clone your forked repository" +msgstr "" + +#: ../../CONTRIBUTING.md:61 +msgid "" +"*__TODO__: This section should show how to clone a repository from GitHub" +" into your computer.*" +msgstr "" + +#: ../../CONTRIBUTING.md:63 +msgid "Create a new branch" +msgstr "" + +#: ../../CONTRIBUTING.md:65 +msgid "*__TODO__: This section should show how to create a new branch.*" +msgstr "" + +#: ../../CONTRIBUTING.md:67 +msgid "Create a virtual environment" +msgstr "" + +#: ../../CONTRIBUTING.md:69 +msgid "" +"*__TODO__: This section should show how to create a virtual environment " +"using venv.*" +msgstr "" + +#: ../../CONTRIBUTING.md:71 +msgid "Install the development dependencies" +msgstr "" + +#: ../../CONTRIBUTING.md:73 +msgid "" +"*__TODO__: This section should show how to install the development " +"dependencies defined in pyproject.toml.*" +msgstr "" + +#: ../../CONTRIBUTING.md:75 +msgid "Commit your changes" +msgstr "" + +#: ../../CONTRIBUTING.md:77 +msgid "" +"*__TODO__: This section should describe how to commit from the command " +"line.*" +msgstr "" + +#: ../../CONTRIBUTING.md:79 +msgid "How to build the guide locally" +msgstr "" + +#: ../../CONTRIBUTING.md:81 +msgid "" +"*__TODO__: This section should describe the different sessions in nox " +"related to building the docs: docs, docs-test, docs-live. It should also " +"show how to see the guide built locally, by opening the right file in the" +" browser or using the live version from docs-live*" +msgstr "" + +#: ../../CONTRIBUTING.md:83 +msgid "Before you submit your pull request" +msgstr "" + +#: ../../CONTRIBUTING.md:85 +msgid "" +"*__TODO__: This section should describe what steps a user should follow " +"before submitting the pull request: build the docs, verify your changes " +"look correct, etc.*" +msgstr "" + +#: ../../CONTRIBUTING.md:87 +msgid "Submitting a pull request with your contribution" +msgstr "" + +#: ../../CONTRIBUTING.md:89 +msgid "How to make a pull request" +msgstr "" + +#: ../../CONTRIBUTING.md:91 +msgid "" +"*__TODO__: This section should describe how to make a pull request in " +"GitHub.*" +msgstr "" + +#: ../../CONTRIBUTING.md:93 +msgid "What happens when you submit a pull request (CI/CD)" +msgstr "" + +#: ../../CONTRIBUTING.md:95 +msgid "" +"*__TODO__: This section should describe how to see the results of the " +"CD/CI checks and how to get more information about errors*" +msgstr "" + +#: ../../CONTRIBUTING.md:97 +msgid "What to expect from the review process" +msgstr "" + +#: ../../CONTRIBUTING.md:99 +msgid "" +"*__TODO__: This section should describe how review happens in GitHub, how" +" see the comments, and how to submit changes (push a new branch)*" +msgstr "" + +#: ../../CONTRIBUTING.md:101 +msgid "Additional help" +msgstr "" + +#: ../../CONTRIBUTING.md:103 +msgid "How to get help" +msgstr "" + +#: ../../CONTRIBUTING.md:105 +msgid "" +"*__TODO__: This section should describe the options for finding more help" +" in case beginner contributors need more help (e.g., create an issue, " +"post in a forum, etc).*" +msgstr "" + +#: ../../CONTRIBUTING.md:107 +msgid "Additional resources" +msgstr "" + +#: ../../CONTRIBUTING.md:109 +msgid "" +"*__TODO__: It should also include links to beginner documentation, like " +"the GitHub docs.*" +msgstr "" + +#: ../../CONTRIBUTING.md:111 +msgid "Annex" +msgstr "" + +#: ../../CONTRIBUTING.md:113 +msgid "Code examples" +msgstr "" + +#: ../../CONTRIBUTING.md:115 +msgid "" +"This guide uses the [literalinclude Sphinx directive](https://www.sphinx-" +"doc.org/en/master/usage/restructuredtext/directives.html#directive-" +"literalinclude) whenever possible to keep code and prose separate. Code " +"for use in the documentation is kept in the `examples/` folder." +msgstr "" + +#: ../../CONTRIBUTING.md:119 +msgid "Referencing code in documentation" +msgstr "" + +#: ../../CONTRIBUTING.md:121 +msgid "" +"If an example is present elsewhere in the documentation that you want to " +"use, you can copy the `literalinclude` directive verbatim and the " +"examples will stay in sync." +msgstr "" + +#: ../../CONTRIBUTING.md:124 +msgid "" +"If you already see code in the examples folder that you can use for new " +"documentation, a new `literalinclude` can be made to extract it into the " +"site. Only a relative path to the code is required for a working " +"`literalinclude`, but you should in almost all cases also provide a " +"`:language:` and `:lines:`. The former makes code examples prettier, and " +"the later can protect your example from future modifications to the code." +msgstr "" + +#: ../../CONTRIBUTING.md:129 +msgid "" +"**Pro tip**: As an alternative to `:lines:` there are also the `:start-" +"after:`, `:start-at:`, `:end-before:`, and `:end-at:` options. And if the" +" example code is Python, `:pyobject:` can be an even more future-proof " +"way to keep the same documentation content even through code refactors." +msgstr "" + +#: ../../CONTRIBUTING.md:133 +msgid "" +"If you need example code that doesn't yet exist in `examples/` see " +"creating code for documentation](#creating-code-for-documentation)." +msgstr "" + +#: ../../CONTRIBUTING.md:136 +msgid "Creating code for documentation" +msgstr "" + +#: ../../CONTRIBUTING.md:138 +msgid "" +"Whenever you come across a place that could benefit from a code block, " +"instead of writing it in-line with a code fence (`` ``` `` blocked text) " +"you can write it as a file in its own format. Your example may even " +"already exist; [see referencing code in documentation ](#referencing-" +"code-in-documentation)." +msgstr "" + +#: ../../CONTRIBUTING.md:142 +msgid "" +"If you want to add a new example that doesn't fit into any of the " +"existing example files, you can create a new file and reference it in a " +"`literalinclude` block. If it makes sense for that file to live within " +"one of the existing example projects please add it there; otherwise " +"create a new folder in the `examples` directory." +msgstr "" + +#: ../../CONTRIBUTING.md:146 +msgid "" +"If an existing example is incomplete or a new example makes sense to be " +"added to an existing file, go ahead and add it, but take care to not " +"break the rest of the guide. Whenever possible, extend the example rather" +" that rewrite it. So for instance, add new functions to the end of the " +"file, new methods after all existing ones in a class." +msgstr "" + +#: ../../CONTRIBUTING.md:150 +msgid "" +"Example code is checked for correctness, so adding a new example may " +"require adding additional tests for coverage, and will require fixing any" +" failing tests." +msgstr "" + +#: ../../CONTRIBUTING.md:153 +msgid "" +"***⚠️ WARNING***: great care should be taken when modifying existing " +"example code, especially any modification beyond appending to the end of " +"the file. All code examples are (potentially) shared examples. This makes" +" for more consistent examples in the guide but can mean action-" +"at-a-distance when modifying the examples for one particular use case. If" +" you find yourself modifying existing examples try running this command " +"and then checking those pages in a new build." +msgstr "" + +#: ../../CONTRIBUTING.md:161 +msgid "Example:" +msgstr "" + +#: ../../CONTRIBUTING.md:163 +msgid "Instead of writing example code in markdown like this" +msgstr "" + +#: ../../CONTRIBUTING.md:174 +msgid "The python can be extracted into a `.py` file" +msgstr "" + +#: ../../CONTRIBUTING.md:188 +msgid "" +"As another example, if you only need to show part of a `pyproject.toml`, " +"we already have complete project definitions, you need only to find the " +"relevant part." +msgstr "" + +#: ../../CONTRIBUTING.md:191 +msgid "Instead of writing this" +msgstr "" + +#: ../../CONTRIBUTING.md:203 +msgid "an example could be extracted from an existing toml file" +msgstr "" + diff --git a/locales/jp/LC_MESSAGES/TRANSLATING.po b/locales/jp/LC_MESSAGES/TRANSLATING.po new file mode 100644 index 00000000..85a36658 --- /dev/null +++ b/locales/jp/LC_MESSAGES/TRANSLATING.po @@ -0,0 +1,717 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: jp\n" +"Language-Team: jp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../TRANSLATING.md:5 +msgid "Translation Guide for the Python Packaging Guide" +msgstr "" + +#: ../../TRANSLATING.md:7 +msgid "" +"This guide will help you get started contributing to the translation of " +"the Python Packaging Guide." +msgstr "" + +#: ../../TRANSLATING.md:9 +msgid "" +"The process of contributing to the translation of the guide is similar to" +" the process of contributing to the guide itself, except that instead of " +"working on the guide source files directly, you will be working on the " +"translation files." +msgstr "" + +#: ../../TRANSLATING.md:11 +msgid "Overview of the Translation Process" +msgstr "" + +#: ../../TRANSLATING.md:13 +msgid "" +"The process of adapting software to different languages is called " +"internationalization, or i18n for short. Internationalization makes sure " +"that translation can happen without having to modify the source code, or " +"in our case, the original English source files of the guide." +msgstr "" + +#: ../../TRANSLATING.md:15 +msgid "" +"Sphinx, the documentation engine we use to build the Python Package " +"Guide, has built-in support for internationalization, so the workflow is " +"very straightforward." +msgstr "" + +#: ../../TRANSLATING.md:17 +msgid "" +"The process of actually translating the guide into different languages is" +" called localization, or l10n for short. This is the step you will be " +"helping with your contribution." +msgstr "" + +#: ../../TRANSLATING.md:19 +msgid "Here is a quick overview of how the translation process works:" +msgstr "" + +#: ../../TRANSLATING.md:21 +msgid "" +"The guide is originally written in English and stored in a set of " +"MarkDown files." +msgstr "" + +#: ../../TRANSLATING.md:22 +msgid "" +"The source files are processed by Sphinx to generate a set of translation" +" files stored in a folder for each target language." +msgstr "" + +#: ../../TRANSLATING.md:23 +msgid "" +"Contributors (like you!) translate these files into the different " +"languages." +msgstr "" + +#: ../../TRANSLATING.md:24 +msgid "" +"When the guide is built, Sphinx creates a version of the guide in the " +"original language (English) and the translated versions for the languages" +" defined in the configuration." +msgstr "" + +#: ../../TRANSLATING.md:27 +msgid "" +"You don't need to understand the technical details to contribute, but if " +"you are interested in learning how Sphinx handles internationalization " +"and localization, you can find more information [here](https://www" +".sphinx-doc.org/en/master/usage/advanced/intl.html)." +msgstr "" + +#: ../../TRANSLATING.md:30 +msgid "Setting up Your Local Environment" +msgstr "" + +#: ../../TRANSLATING.md:32 +msgid "Before you start, you will need to set up your local work environment." +msgstr "" + +#: ../../TRANSLATING.md:34 +msgid "" +"First, fork the guide repository into your personal GitHub account and " +"clone the forked repository to your local computer." +msgstr "" + +#: ../../TRANSLATING.md:36 +msgid "" +"To create a virtual environment and install the development dependencies " +"for the guide, run the following commands:" +msgstr "" + +#: ../../TRANSLATING.md:45 +msgid "" +"TODO: This section needs more work or to be replaced with a reference to " +"the CONTRIBUTING guide." +msgstr "" + +#: ../../TRANSLATING.md:47 +msgid "Starting a New Language Translation" +msgstr "" + +#: ../../TRANSLATING.md:49 +msgid "" +"If you plan to work on an existing translation, you can skip this step " +"and go directly to the next section." +msgstr "" + +#: ../../TRANSLATING.md:51 ../../TRANSLATING.md:217 +msgid "Important" +msgstr "" + +#: ../../TRANSLATING.md:52 +msgid "" +"If you would like to start the translation of the guide into a new " +"language, start by [creating an issue](https://github.com/pyOpenSci" +"/python-package-guide/issues) in the repository." +msgstr "" + +#: ../../TRANSLATING.md:55 +msgid "" +"To generate the translation files for a new language, add the language to" +" the `LANGUAGES` list in the `noxfile.py` configuration file. " +"[Nox](https://nox.thea.codes/en/stable/index.html) is the tool we use to " +"manage the building of the guide and its translations." +msgstr "" + +#: ../../TRANSLATING.md:57 +msgid "" +"Inside `noxfile.py`, find the `LANGUAGES` list and add the corresponding " +"two-letter code. For example, if you want to start the translation of the" +" guide into French, you would add `'fr'`:" +msgstr "" + +#: ../../TRANSLATING.md:68 +msgid "" +"You can find a list of the two-letter ISO language codes " +"[here](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes)." +msgstr "" + +#: ../../TRANSLATING.md:71 +msgid "Preparing the Translation Files" +msgstr "" + +#: ../../TRANSLATING.md:73 +msgid "" +"The translation files contain the original English text and a space for " +"you to enter the translated text. Before starting to translate, you need " +"to make sure the translation files are up to date with the latest changes" +" to the guide." +msgstr "" + +#: ../../TRANSLATING.md:75 +msgid "You can do this by running the following command:" +msgstr "" + +#: ../../TRANSLATING.md:81 +msgid "" +"This command will create the translation files if they don't exist yet, " +"or update them with the latest changes if they already exist." +msgstr "" + +#: ../../TRANSLATING.md:83 +msgid "" +"The translation files are text files with the `.po` extension stored in " +"the `./locales`, in folders corresponding to each language. For example, " +"the translation files for Spanish are stored in the " +"`locale/es/LC_MESSAGES` directory." +msgstr "" + +#: ../../TRANSLATING.md:85 +msgid "" +"Because the translation files map the original English text to translated" +" text, they are sometimes referred to as \"catalog\" files or \"portable " +"object\" files." +msgstr "" + +#: ../../TRANSLATING.md:88 +msgid "" +"You don't need to know all the details about the PO format in order to " +"translate. If you are interested in learning more, you can find " +"additional details in the [GNU gettext " +"documentation](https://www.gnu.org/software/gettext/manual/html_node/PO-" +"Files.html)." +msgstr "" + +#: ../../TRANSLATING.md:91 +msgid "Working on a Translation" +msgstr "" + +#: ../../TRANSLATING.md:93 +msgid "" +"In order to start translating, go to the folder inside `./locales` " +"corresponding to the target language you want to translate to (for " +"example, `./locale/es/LC_MESSAGES/` for the Spanish translation)." +msgstr "" + +#: ../../TRANSLATING.md:95 +msgid "" +"In this folder you will find a set of `.po` files, corresponding to the " +"different sections of the guide:" +msgstr "" + +#: ../../TRANSLATING.md:111 +msgid "" +"You may also see some `.mo` files in the same folder. These are compiled " +"versions of the `.po` files create by Sphinx during the build process, " +"and used to generate the translated version of the guide. They are " +"intermediary files and are not meant to be edited directly or stored in " +"the repository." +msgstr "" + +#: ../../TRANSLATING.md:114 +msgid "" +"If you are working on a new translation, choose one of the `.po` files to" +" start with. If you are working on an existing translation, you can start" +" with the `.po` files that need the most work." +msgstr "" + +#: ../../TRANSLATING.md:116 +msgid "" +"To see how much of each file has been translated, use the `sphinx-intl " +"stat`. You will be able to see the number of translated, fuzzy, and " +"untranslated strings in each `.po` file." +msgstr "" + +#: ../../TRANSLATING.md:118 +msgid "" +"For example, to see the statistics for the Spanish translation, you would" +" run:" +msgstr "" + +#: ../../TRANSLATING.md:132 +msgid "What do these categories mean:" +msgstr "" + +#: ../../TRANSLATING.md:134 +msgid "" +"Translated strings are strings that have been translated into the target " +"language." +msgstr "" + +#: ../../TRANSLATING.md:135 +msgid "" +"Fuzzy strings are strings that have been translated but need to be " +"reviewed because the original English string in the guide changed." +msgstr "" + +#: ../../TRANSLATING.md:136 +msgid "Untranslated strings are strings that have not been translated yet." +msgstr "" + +#: ../../TRANSLATING.md:139 +msgid "" +"When Sphinx is building the guide in another language, it will look into " +"the corresponding folder in `./locales/` for translated strings. If the " +"translation is available, Sphinx will replace the English text with the " +"equivalent text in the target language. If the translation is not " +"available, Sphinx will use the original English strings." +msgstr "" + +#: ../../TRANSLATING.md:142 +msgid "Editing the Translation Files" +msgstr "" + +#: ../../TRANSLATING.md:144 +msgid "" +"You can use any text editor to edit the `.po` file. But if you prefer, " +"there are also tools like [Poedit](https://poedit.net/) that provide a " +"graphic use interface." +msgstr "" + +#: ../../TRANSLATING.md:146 +msgid "" +"Depending on your editor of choice, you may be able to install a plugin " +"or extension that can provide syntax highlighting and other features for " +"working with `.po` files. Like for example, the " +"[gettext](https://marketplace.visualstudio.com/items?itemName=mrorz" +".language-gettext) extension for Visual Studio Code." +msgstr "" + +#: ../../TRANSLATING.md:148 +msgid "" +"When you open a `.po` file, you will see a series of entries that look " +"like this:" +msgstr "" + +#: ../../TRANSLATING.md:158 +msgid "" +"The first line of an entry starts with `#:` and is a reference to the " +"original source file and line number from which the text was extracted. " +"This information is useful for finding the context of the text in the " +"guide." +msgstr "" + +#: ../../TRANSLATING.md:160 +msgid "" +"The `msgid` field contains the original English text that needs to be " +"translated. The `msgstr` field is where you will enter the translated " +"text. This field might contain text if someone else already translated " +"the entry." +msgstr "" + +#: ../../TRANSLATING.md:170 +msgid "" +"Sometimes the original English text may be too long for a single line, " +"and it may be split into multiple lines. In this case, you can keep the " +"same structure in the translated text. Notice that both the `msgid` and " +"`msgstr` fields in the example below start with an empty string, " +"indicating that the text continues in the next line." +msgstr "" + +#: ../../TRANSLATING.md:186 +msgid "" +"The English text will sometimes contain Markdown formatting, such as bold" +" or italic text. You should keep the formatting in the translated text, " +"making sure to translate the text inside the formatting tags." +msgstr "" + +#: ../../TRANSLATING.md:188 +msgid "" +"The English text may also contain links to other sections of the guide or" +" external resources. You should keep the links in the translated text, " +"making sure to update the link text when appropriate." +msgstr "" + +#: ../../TRANSLATING.md:196 +msgid "" +"An entry may be marked as `fuzzy`, which means that the original English " +"text has changed since the translation was made, and the translation may " +"need to be revised. When this is the case you will see an additional line" +" in the entry, starting with `#,`:" +msgstr "" + +#: ../../TRANSLATING.md:213 +msgid "" +"You can review the translation and make any necessary changes, removing " +"the `fuzzy` tag once you are satisfied with the translation." +msgstr "" + +#: ../../TRANSLATING.md:215 +msgid "" +"You can also add comments to the translation file, by adding lines that " +"start with a `#` character to the entry. This can be helpful to add " +"context to the translation for other translators or reviewers to see, but" +" this might be only necessary in special circumstances." +msgstr "" + +#: ../../TRANSLATING.md:218 +msgid "" +"When working on a translation, you **should not** modify the original " +"English text in the `msgid` field. If you see a typo or an error in the " +"original text, please consider fixing it in the original source file (use" +" the first line of the entry to locate it) and submit a separate pull " +"request." +msgstr "" + +#: ../../TRANSLATING.md:221 +msgid "Building the Translated Documentation" +msgstr "" + +#: ../../TRANSLATING.md:223 +msgid "" +"Once you finished translating or when you want to check the translation " +"in context, you can build the guide locally on your computer, using the " +"following command:" +msgstr "" + +#: ../../TRANSLATING.md:229 +msgid "" +"This command will build all the translated versions of the guide defined " +"in the `LANGUAGES` list in `noxfile.py`. These translations will be " +"stored in the `_build/html`, in folders named after the language code " +"(e.g., `es`, `fr`, etc.)." +msgstr "" + +#: ../../TRANSLATING.md:231 +msgid "" +"To view the translated version of the guide in your browser, open the " +"corresponding `index.html` file. For example, to view the Spanish " +"translation, you would open `_build/html/es/index.html`." +msgstr "" + +#: ../../TRANSLATING.md:233 +msgid "" +"You can also build a live version of the guide that updates automatically" +" as you make changes to the translation files. To do this, use the `nox " +"-s docs-live-lang` command. Note that in this case you need to specify " +"which language you want to build. For example, if you are working on the " +"Spanish translation, you would run:" +msgstr "" + +#: ../../TRANSLATING.md:239 +msgid "" +"Note the `--` before the language code, it indicates that the following " +"arguments should be passed into the nox session and not be interpreted " +"directly by nox. If you forget the `--`, nox will look instead for a " +"session named 'es' and complain that it does not exist." +msgstr "" + +#: ../../TRANSLATING.md:241 +msgid "" +"This command will use `sphinx-autobuild` to launch a local web server " +"where you can access the translated version of the guide. You can open " +"the guide in your browser by navigating to `http://localhost:8000`." +msgstr "" + +#: ../../TRANSLATING.md:243 +msgid "" +"This is a great way to see how the translated version of the guide looks " +"as you make changes to the translation files." +msgstr "" + +#: ../../TRANSLATING.md:245 +msgid "Submitting a PR for Your Contribution" +msgstr "" + +#: ../../TRANSLATING.md:247 +msgid "" +"Once you are finished translating and before you submit a pull request " +"(PR) for your translation, you need to make sure that the translated " +"version of the guide builds without any errors or warning and looks " +"correctly in the browser." +msgstr "" + +#: ../../TRANSLATING.md:249 +msgid "You can follow these steps:" +msgstr "" + +#: ../../TRANSLATING.md:251 +msgid "" +"Build the translations of the guide with same parameters that will be " +"used during the release:" +msgstr "" + +#: ../../TRANSLATING.md:257 +msgid "" +"Make sure there are no warnings or errors in the output. If there are, " +"you will need to fix them before submitting the PR." +msgstr "" + +#: ../../TRANSLATING.md:258 +msgid "" +"Make sure the translated version of the guide looks good in the browser " +"by opening the `_build/html//index.html` file, where `` is " +"the language you have been working on." +msgstr "" + +#: ../../TRANSLATING.md:260 +msgid "If everything looks good, you can submit a PR with your changes." +msgstr "" + +#: ../../TRANSLATING.md:263 +msgid "" +"When you submit a PR for a translation, you should only include changes " +"to one language. If you worked in multiple languages, please submit a " +"separate PR for each language." +msgstr "" + +#: ../../TRANSLATING.md:266 +msgid "" +"Translations PRs will be tagged with a label indicating the language to " +"make them easier to identify and review. For example, contributions to " +"the Spanish translation will be tagged with 'lang-es'." +msgstr "" + +#: ../../TRANSLATING.md:268 +msgid "TODO: This tagging could be automated with a GitHub action." +msgstr "" + +#: ../../TRANSLATING.md:270 +msgid "" +"When you submit the PR, make sure to include a short description of the " +"changes you made and any context that might be helpful for the reviewer " +"(e.g., you translated new strings, you reviewed fuzzy entries, you fixed " +"typos, etc.)" +msgstr "" + +#: ../../TRANSLATING.md:272 +msgid "The Review Process" +msgstr "" + +#: ../../TRANSLATING.md:274 +msgid "" +"The review process for a translation contribution is similar to the " +"review process for any other contribution to the guide." +msgstr "" + +#: ../../TRANSLATING.md:276 +msgid "" +"TODO: This section needs more work, depending on the review workflow we " +"decide to adopt. Other projects usually assign a coordinator/editor for " +"each language, who is responsible for reviewing and merging translation " +"contributions." +msgstr "" + +#: ../../TRANSLATING.md:278 +msgid "" +"Each language has an assigned editor who is responsible for reviewing and" +" merging translation contributions. The editor will review the changes to" +" make sure they are accurate and consistent with the style and tone of " +"the guide." +msgstr "" + +#: ../../TRANSLATING.md:280 +msgid "" +"Sometimes the editor may ask for clarification or suggest changes to " +"improve the translation. If this happens, you can make the requested " +"changes and push them to the same branch where you submitted the original" +" PR." +msgstr "" + +#: ../../TRANSLATING.md:282 +msgid "" +"When the editor is satisfied with the translation, they will merge the " +"PR. The translated version of the guide will be available on the " +"pyOpenSci website once the language is released." +msgstr "" + +#: ../../TRANSLATING.md:284 +msgid "The Release Process" +msgstr "" + +#: ../../TRANSLATING.md:286 +msgid "" +"If a language is ready to go live, the maintainers will add the language " +"code to the `RELEASE_LANGUAGES` list in the `noxfile.py` configuration " +"file." +msgstr "" + +#: ../../TRANSLATING.md:288 +msgid "" +"When the guide is built for release in CI, Sphinx will also generate the " +"translated versions of the guide for the languages in the " +"`RELEASE_LANGUAGES` list." +msgstr "" + +#: ../../TRANSLATING.md:290 +msgid "" +"Translations are released in the same way as the English version of the " +"guide, and the translated versions will be available in folders named " +"after the language code. For example, the Spanish translation will be " +"available in [https://www.pyopensci.org/python-package-" +"guide/es/](https://www.pyopensci.org/python-package-guide/es/)." +msgstr "" + +#: ../../TRANSLATING.md:292 +msgid "Frequently Asked Questions (FAQ)" +msgstr "" + +#: ../../TRANSLATING.md:294 +msgid "How do I know which strings need to be translated?" +msgstr "" + +#: ../../TRANSLATING.md:296 +msgid "" +"When you run the `sphinx-intl stat` command, you will see a list of `.po`" +" files with the number of translated, fuzzy, and untranslated strings. " +"You can start by working on the files with the most untranslated strings." +msgstr "" + +#: ../../TRANSLATING.md:298 +msgid "What happens when a string has changed in the original English text?" +msgstr "" + +#: ../../TRANSLATING.md:300 +msgid "" +"If a string has changed in the original English version, it will be " +"marked as `fuzzy` in the translation file the next time it is updated " +"(`nox -s update-translations`). Contributors working on the translation " +"can then review the fuzzy entries and make the necessary changes to " +"ensure it is accurate, before removing the `fuzzy` tag." +msgstr "" + +#: ../../TRANSLATING.md:302 +msgid "How do I handle links in the translated text?" +msgstr "" + +#: ../../TRANSLATING.md:304 +msgid "" +"You should keep the links in the translated text, but make sure to update" +" the link text if necessary. For example, if the original English text " +"contains a link to `[What is a Python package?](/tutorials/intro)`, you " +"should keep the link in the translated text but update the link text to " +"`[¿Que es un paquete de Python?](/tutorials/intro)`." +msgstr "" + +#: ../../TRANSLATING.md:306 +msgid "How do I handle formatting in the translated text?" +msgstr "" + +#: ../../TRANSLATING.md:308 +msgid "" +"You should keep the formatting in the translated text, but make sure to " +"translate the text inside the formatting tags as well. For example, if " +"the original English text is `**Test special cases:**`, you should keep " +"the bold formatting in the translated text but update the text inside the" +" formatting tags to `**Prueba casos especiales:**`." +msgstr "" + +#: ../../TRANSLATING.md:310 +msgid "How do I handle strings that are too long for a single line?" +msgstr "" + +#: ../../TRANSLATING.md:312 +msgid "" +"If the original English text is too long for a single line, it may be " +"split into multiple lines. Multiline strings in the `.po` file are " +"indicated by an empty string in the `msgid` and `msgstr` fields, followed" +" by the continuation of the text in the next line. For example:" +msgstr "" + +#: ../../TRANSLATING.md:325 +msgid "How do I translate images?" +msgstr "" + +#: ../../TRANSLATING.md:327 +msgid "" +"You should not translate images in the guide. Producing translated " +"versions of images is a complex process that requires additional tools " +"and resources, and it is not typically done unless the translated images " +"are created alongside the original images. More often, the text around " +"the image is modified to include any necessary translations." +msgstr "" + +#: ../../TRANSLATING.md:329 +msgid "" +"In some special cases, an image might be critical to the understanding of" +" the content. In those cases, the translations will be handled by the " +"maintainers and editors outside this workflow." +msgstr "" + +#: ../../TRANSLATING.md:331 +msgid "" +"I am interested in translating the guide into a language that is not " +"listed. How can I get started?" +msgstr "" + +#: ../../TRANSLATING.md:333 +msgid "" +"If you want to start a new translation of the guide into a language that " +"is not listed, you should [create an issue](https://github.com/pyOpenSci" +"/python-package-guide/issues) in the repository to let the maintainers " +"know that you intend to work on it. This will help avoid duplication of " +"effort and ensure that the maintainers are ready to review your " +"contribution when you are done." +msgstr "" + +#: ../../TRANSLATING.md:335 +msgid "How do I know when a translation is ready to be released?" +msgstr "" + +#: ../../TRANSLATING.md:337 +msgid "" +"When a translation is ready to be included in the next release of the " +"guide, the maintainers will add the language code to the " +"`RELEASE_LANGUAGES` list in the `noxfile.py` configuration file. This " +"will trigger the build of the translation during the release process, and" +" the translated version of the guide will be available on the pyOpenSci " +"website." +msgstr "" + +#: ../../TRANSLATING.md:339 +msgid "" +"TODO: There are many approaches here, some projects release a translation" +" as soon as some strings are translated, others wait until a certain " +"percentage of the content is translated." +msgstr "" + +#: ../../TRANSLATING.md:341 +msgid "How can I get help with my translation?" +msgstr "" + +#: ../../TRANSLATING.md:343 +msgid "" +"If you have any questions or need help with your translation, you can " +"create an issue in the repository if you encounter any problems or need " +"assistance." +msgstr "" + +#: ../../TRANSLATING.md:345 +msgid "" +"TODO: Maybe [Discourse](https://pyopensci.discourse.group/) could be used" +" as a way for contributors to ask for help with translations or the " +"translation workflow?" +msgstr "" + diff --git a/locales/jp/LC_MESSAGES/documentation.po b/locales/jp/LC_MESSAGES/documentation.po new file mode 100644 index 00000000..c9534283 --- /dev/null +++ b/locales/jp/LC_MESSAGES/documentation.po @@ -0,0 +1,2545 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: jp\n" +"Language-Team: jp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../documentation/hosting-tools/intro.md:1 +msgid "Tools to Build and Host your Documentation" +msgstr "" + +#: ../../documentation/hosting-tools/intro.md:3 +msgid "" +"The most common tool for building documentation in the Python ecosystem " +"currently is Sphinx. However, some maintainers are using tools like " +"[mkdocs](https://www.mkdocs.org/) for documentation. It is up to you to " +"use the platform that you prefer for your documentation!" +msgstr "" + +#: ../../documentation/hosting-tools/intro.md:8 +msgid "" +"In this section, we introduce Sphinx as a common tool to build " +"documentation. We talk about various syntax options that you can use when" +" writing Sphinx documentation including mySt and rST." +msgstr "" + +#: ../../documentation/hosting-tools/intro.md:12 +msgid "" +"We also talk about ways to publish your documentation online and Sphinx " +"tools that might help you optimize your documentation website." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:1 +msgid "Documentation syntax: markdown vs. myST vs. rst syntax to create your docs" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:3 +msgid "There are three commonly used syntaxes for creating Python documentation:" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:4 +msgid "" +"[markdown](https://www.markdownguide.org/): Markdown is an easy-to-learn " +"text syntax. It is the default syntax used in Jupyter Notebooks. There " +"are tools that you can add to a Sphinx website that allow it to render " +"markdown as html. However, using markdown to write documentation has " +"limitations. For instance if you want to add references, colored call out" +" blocks and other custom elements to your documentation, you will need to" +" use either **myST** or **rST**." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:8 +msgid "" +"[rST (ReStructured Text):](https://www.sphinx-" +"doc.org/en/master/usage/restructuredtext/basics.html). **rST** is the " +"native syntax that sphinx supports. rST was the default syntax used for " +"documentation for many years. However, in recent years myST has risen to " +"the top as a favorite for documentation given the flexibility that it " +"allows." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:9 +msgid "" +"[myST:](https://myst-parser.readthedocs.io/en/latest/intro.html) myST is " +"a combination of vanilla of `markdown` and `rST` syntax. It is a nice " +"option if you are comfortable writing markdown. `myst` is preferred by " +"many because it offers both the rich functionality of rST combined with a" +" simple-to-write markdown syntax." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:12 +msgid "" +"While you can chose to use any of the syntaxes listed above, we suggest " +"using `myST` because:" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:15 +msgid "It is a simpler syntax and thus easier to learn;" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:16 +msgid "" +"The above simplicity will make it easier for more people to contribute to" +" your documentation." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:17 +msgid "" +"Most of your core Python package text files, such as your README.md file," +" are already in `.md` format" +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:18 +msgid "" +"`GitHub` and `Jupyter Notebooks` support markdown thus it's more widely " +"used in the scientific ecosystem." +msgstr "" + +#: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:22 +msgid "" +"If you are on the fence about myST vs rst, you might find that **myST** " +"is easier for more people to contribute to." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:1 +msgid "How to publish your Python package documentation online" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:3 +msgid "" +"We suggest that you setup a hosting service for your Python package " +"documentation. Two free and commonly used ways to quickly create a " +"documentation website hosting environment are below." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:7 +msgid "" +"You can host your documentation yourself using [GitHub " +"Pages](https://pages.github.com/) or another online hosting service." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:8 +msgid "" +"You can host your documentation using [Read the " +"Docs](https://readthedocs.org/)." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:10 +msgid "What is Read the Docs ?" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:11 +msgid "" +"[Read the Docs](https://readthedocs.org/) is a documentation hosting " +"service that supports publishing your project's documentation." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:13 +msgid "" +"Read the Docs is a fully featured, free, documentation hosting service. " +"Some of its many features include:" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:16 +msgid "" +"Is free to host your documentation (but there are also paid tiers if you " +"wish to customize hosting)" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:17 +msgid "Automates building your documentation" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:18 +msgid "" +"Allows you to turn on integration with pull requests where you can view " +"documentation build progress (success vs failure)." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:19 +msgid "" +"Supports versioning of your documentation which allows users to refer to " +"older tagged versions of the docs if they are using older versions of " +"your package." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:20 +msgid "Supports downloading of documentation in PDF and other formats." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:21 +msgid "" +"You can customize the documentation build using a **.readthedocs.yaml** " +"file in your GitHub repository." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:24 +msgid "What is GitHub Pages?" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:25 +msgid "" +"[GitHub Pages](https://docs.github.com/en/pages/getting-started-with-" +"github-pages/about-github-pages) is a free web hosting service offered by" +" GitHub. Using GitHub pages, you can build your documentation locally or " +"using a Continuous Integration setup, and then push to a branch in your " +"GitHub repository that is setup to run the GitHub Pages web build." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:33 +msgid "Read the Docs vs GitHub Pages" +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:35 +msgid "" +"GitHub pages is a great option for your documentation deployment. " +"However, you will need to do a bit more work to build and deploy your " +"documentation if you use GitHub pages." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:39 +msgid "" +"Read the Docs can be setup in your Read the Docs user account. The " +"service automates the entire process of building and deploying your " +"documentation." +msgstr "" + +#: ../../documentation/hosting-tools/publish-documentation-online.md:42 +msgid "" +"If you don't want to maintain a documentation website for your Python " +"package, we suggest using the Read the Docs website." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:1 +msgid "Using Sphinx to Build Python Package Documentation" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:17 +msgid "" +"On this page we discuss using [Sphinx](https://www.sphinx-doc.org/) to " +"build your user-facing package documentation. While Sphinx is currently " +"the most commonly-used tool in the scientific Python ecosystem, you are " +"welcome to explore other tools to build documentation such as " +"[mkdocs](https://www.mkdocs.org/) which is gaining popularity in the " +"Python packaging ecosystem." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:25 +msgid "Examples of documentation websites that we love:" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:27 +msgid "[GeoPandas](https://geopandas.org/en/stable/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:28 +msgid "" +"[View rst to create landing " +"page](https://raw.githubusercontent.com/geopandas/geopandas/main/doc/source/index.rst)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:29 +msgid "[verde](https://www.fatiando.org/verde/latest/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:30 +msgid "" +"[View verde landing page code - rst " +"file.](https://github.com/fatiando/verde/blob/main/doc/index.rst)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:31 +msgid "" +"[Here is our documentation if you want to see a myST example of a landing" +" page.](https://github.com/pyOpenSci/python-package-" +"guide/blob/main/index.md)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:34 +msgid "Sphinx - a static site generator" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:36 +msgid "" +"Sphinx is a [static-site " +"generator](https://www.cloudflare.com/learning/performance/static-site-" +"generator/). A static site generator is a tool that creates html for a " +"website based upon a set of templates. The html files are then served " +"\"Statically\" which means that there is no generation or modification of" +" the files on the fly." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:39 +msgid "Sphinx is written using Python." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:41 +msgid "Sphinx sites can be customized using extensions and themes" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:43 +msgid "" +"The functionality of Sphinx can be extended using extensions and themes. " +"A few examples include:" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:46 +msgid "" +"You can apply documentation themes for quick generation of beautiful " +"documentation." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:47 +msgid "" +"You can [automatically create documentation for your package's functions " +"and classes (the package's API) from docstrings in your code using the " +"autodoc extension](https://www.sphinx-" +"doc.org/en/master/usage/extensions/autodoc.html)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:48 +msgid "" +"You can [run and test code examples in your docstrings using the doctest " +"extension](https://www.sphinx-" +"doc.org/en/master/usage/extensions/doctest.html)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:49 +msgid "" +"While Sphinx natively supports the `rST` syntax. You can add custom " +"syntax parsers to support easier-to-write syntax using tools such as [the" +" MyST parser](https://myst-parser.readthedocs.io/)." +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:51 +msgid "Commonly used Sphinx themes" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:53 +msgid "" +"You are free to use whatever Sphinx theme that you prefer. However, the " +"most common Sphinx themes used in the Python scientific community " +"include:" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:57 +msgid "[pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:58 +msgid "[sphinx-book-theme](https://sphinx-book-theme.readthedocs.io/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:59 +msgid "[furo](https://pradyunsg.me/furo/quickstart/)" +msgstr "" + +#: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:63 +msgid "This book is created using Sphinx and the `furo` theme." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:1 +msgid "Optimizing your documentation so search engines (and other users) find it" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:3 +msgid "" +"If you are interested in more people finding your package, you may want " +"to add some core Sphinx extensions (and theme settings) that will help " +"search engines such as Google find your documentation." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:7 +msgid "Google Analytics" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:11 +msgid "" +"Google analytics [is not compliant with the European General Data " +"Protection Regulation (GDPR)](https://matomo.org/blog/2022/05/google-" +"analytics-4-gdpr/). While there are many components to this regulation, " +"one of the core elements is that you have to let users know on your site " +"that you are collecting data and they have to consent. While it is " +"possible to add infrastructure around Google Analytics to make it close " +"to following GDPR regulations, the community is slowly shifting away from" +" Google using open tools such as [Plausible](https://plausible.io/), " +"[Cloudflare Web Analytics](https://www.cloudflare.com/web-analytics/) and" +" [Matomo](https://matomo.org) for web analytics." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:13 +msgid "" +"pyOpenSci is currently looking into free options for open source " +"developers." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:16 +msgid "" +"Some of the [sphinx themes such as the `pydata-sphinx-theme` and sphinx-" +"book-theme have built in support for Google Analytics](https://pydata-" +"sphinx-theme.readthedocs.io/en/latest/user_guide/analytics.html#google-" +"analytics). However, if the theme that you chose does not offer Google " +"Analytics support, you can use the [`sphinxcontrib-gtagjs` " +"extension](https://github.com/attakei/sphinxcontrib-gtagjs). This " +"extension will add a Google Analytics site tag to each page of your " +"documentation." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:22 +msgid "" +"[sphinx-sitemap](https://sphinx-" +"sitemap.readthedocs.io/en/latest/index.html) for search engine " +"optimization" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:24 +msgid "" +"While we are trying to move away from Google Analytics do to compliance " +"and privacy issues, search engine optimization is still important. Google" +" is the most popular search engine. And if your documentation is search " +"optimized, users are more likely to find your package!" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:30 +msgid "" +"If you are interested in optimizing your documentation for search engines" +" such as Google, you want a **sitemap.xml** file. You can submit this " +"sitemap to Google and it will index your entire site. This over time can " +"make the content on your site more visible to others when they search." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:36 +msgid "This extension is lightweight." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:38 +msgid "" +"It [requires that you to add it to your Sphinx `conf.py` extension list " +"and site your documentation base url](https://sphinx-" +"sitemap.readthedocs.io/en/latest/getting-started.html)." +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:40 +msgid "[sphinxext.opengraph](https://github.com/wpilibsuite/sphinxext-opengraph)" +msgstr "" + +#: ../../documentation/hosting-tools/website-hosting-optimizing-your-docs.md:42 +msgid "" +"OpenGraph is an extension that allows you to add metadata to your " +"documentation content pages. [The OpenGraph protocol allows other " +"websites to provide a useful preview of the content on your page when " +"shared](https://www.freecodecamp.org/news/what-is-open-graph-and-how-" +"can-i-use-it-for-my-website/#what-is-open-graph). This is important for " +"when the pages in your documentation are shared on social media sites " +"like Twitter and Mastodon and even for shares on tools like Slack and " +"Discourse." +msgstr "" + +#: ../../documentation/index.md:3 +msgid "Documentation Overview" +msgstr "" + +#: ../../documentation/index.md:3 ../../documentation/index.md:10 +#: ../../documentation/index.md:21 ../../documentation/index.md:42 +msgid "Intro" +msgstr "" + +#: ../../documentation/index.md:10 +msgid "Create Your Docs" +msgstr "" + +#: ../../documentation/index.md:10 +msgid "Document Your Code (API)" +msgstr "" + +#: ../../documentation/index.md:10 +msgid "Create Package Tutorials" +msgstr "" + +#: ../../documentation/index.md:10 +msgid "Write User Documentation" +msgstr "" + +#: ../../documentation/index.md:21 +msgid "Contributing File" +msgstr "" + +#: ../../documentation/index.md:21 +msgid "Development Guide" +msgstr "" + +#: ../../documentation/index.md:21 +msgid "Changelog File" +msgstr "" + +#: ../../documentation/index.md:21 +msgid "Docs for Contributors & Maintainers" +msgstr "" + +#: ../../documentation/index.md:32 +msgid "README file" +msgstr "" + +#: ../../documentation/index.md:32 +msgid "Code of Conduct File" +msgstr "" + +#: ../../documentation/index.md:32 +msgid "LICENSE files" +msgstr "" + +#: ../../documentation/index.md:32 +msgid "Community Docs" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "Sphinx for Docs" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "myST vs Markdown vs rst" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "Publish Your Docs" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "Website Hosting and Optimization" +msgstr "" + +#: ../../documentation/index.md:42 +msgid "Publication tools for your docs" +msgstr "" + +#: ../../documentation/index.md:1 +msgid "Documentation for your Open Source Python Package" +msgstr "" + +#: ../../documentation/index.md:55 +msgid "" +"Please note that the tools discussed here are those that we see commonly " +"used in the community. As tools evolve we will update this guide. If you " +"are submitting a package for pyOpenSci peer review and use other tools " +"that are not listed in our guide to build your package you can still " +"submit for review! The tools listed here are suggestions, not " +"requirements. Our requirements are focused on the documentation content " +"of your package." +msgstr "" + +#: ../../documentation/index.md:65 +msgid "Documentation is critical for your Python package's success" +msgstr "" + +#: ../../documentation/index.md:67 +msgid "" +"Documentation is as important to the success of your Python open source " +"package as the code itself." +msgstr "" + +#: ../../documentation/index.md:70 +msgid "" +"Quality code is of course valuable as its how your package gets the tasks" +" done. However, if users don't understand how to use your package in " +"their workflows, then they won't use it." +msgstr "" + +#: ../../documentation/index.md:73 +msgid "" +"Further, explicitly documenting how to contribute is important if you " +"wish to build a base of contributors to your package." +msgstr "" + +#: ../../documentation/index.md:76 +msgid "Two types of Python package users" +msgstr "" + +#: ../../documentation/index.md:78 +msgid "" +"The documentation that you write for your package should target two types" +" of users:" +msgstr "" + +#: ../../documentation/index.md:81 +msgid "1. Basic Tool Users" +msgstr "" + +#: ../../documentation/index.md:83 +msgid "" +"Basic tool users are the people who will use your package code in their " +"Python workflows. They might be new(er) to Python and/or data science. Or" +" expert programmers. But they might not have a background in software " +"development. These users need to know:" +msgstr "" + +#: ../../documentation/index.md:88 +msgid "How to install your package" +msgstr "" + +#: ../../documentation/index.md:89 +msgid "How to install dependencies that your package requires" +msgstr "" + +#: ../../documentation/index.md:90 +msgid "How to get started using the code base" +msgstr "" + +#: ../../documentation/index.md:91 +msgid "" +"Information on how to cite your code / give you credit if they are using " +"it in a research application." +msgstr "" + +#: ../../documentation/index.md:93 +msgid "" +"Information on the license that your code uses so they know how they can " +"or can't use the code in an operational setting." +msgstr "" + +#: ../../documentation/index.md:96 +msgid "2. Potential tool contributors" +msgstr "" + +#: ../../documentation/index.md:98 +msgid "" +"The other subset of users are more experienced and/or more engaged with " +"your package. As such they are potential contributors. These users:" +msgstr "" + +#: ../../documentation/index.md:102 +msgid "might have a software development background," +msgstr "" + +#: ../../documentation/index.md:103 +msgid "" +"might also be able to contribute bug fixes to your package or updates to " +"your documentation" +msgstr "" + +#: ../../documentation/index.md:104 +msgid "" +"might also just be users who will find spelling errors in your " +"documentation, or bugs in your tutorials." +msgstr "" + +#: ../../documentation/index.md:106 +msgid "" +"These users need all of the things that a basic user needs. But, they " +"also need to understand how you'd like for them to contribute to your " +"package. These potential contributors need:" +msgstr "" + +#: ../../documentation/index.md:110 +msgid "" +"A development guide to help them understand the infrastructure used in " +"your package repository." +msgstr "" + +#: ../../documentation/index.md:111 +msgid "" +"Contributing guidelines that clarify the types of contributions that you " +"welcome and how you'd prefer those contributions to be submitted." +msgstr "" + +#: ../../documentation/index.md:114 +msgid "" +"It's important to remember that the definition of what a contribution is " +"can be broad. A contribution could be something as simple as a bug " +"report. Or fixing a spelling issue in your documentation. Or it could be " +"a code fix that includes a new test that covers an edge-case that they " +"discovered." +msgstr "" + +#: ../../documentation/index.md:120 +msgid "Documentation elements that pyOpenSci looks for reviewing a Python package" +msgstr "" + +#: ../../documentation/index.md:122 +msgid "" +"In the pyOpenSci open peer review, we look for a documentation structure " +"that supports both your tool users and potential contributors. The files " +"and elements that we look for specifically can be found in our peer " +"review check list (see link below)." +msgstr "" + +#: ../../documentation/index.md:127 +msgid "" +"In this guide, we discuss each required element, and also discuss other " +"elements that you should consider in your package's documentation in more" +" detail." +msgstr "" + +#: ../../documentation/index.md:131 +msgid "View pyOpenSci peer review check list" +msgstr "" + +#: ../../documentation/index.md:138 +msgid "" +"Image showing the files in the the MovingPandas GitHub repository. Files " +"in the image include code of conduct.md contributing.md license.txt and " +"readme.md." +msgstr "" + +#: ../../documentation/index.md:144 +msgid "" +"An example from the MovingPandas GitHub repository with all of the major " +"files in it including CONTRIBUTING.md, README.md, CODE_OF_CONDUCT.md and " +"a LICENSE.txt file. *(screen shot taken Nov 23 2022)*" +msgstr "" + +#: ../../documentation/index.md:147 +msgid "What's next in this Python package documentation section?" +msgstr "" + +#: ../../documentation/index.md:149 +msgid "" +"In this section of the pyOpenSci package guide, we will walk you through " +"best practices for setting up documentation for your Python package. We " +"will also suggest tools that you can use to build your user-facing " +"documentation website." +msgstr "" + +#: ../../documentation/index.md:154 +msgid "Todo" +msgstr "" + +#: ../../documentation/index.md:156 +msgid "" +"Python version support You should always be explicit about which versions" +" of Python your package supports. Keeping compatibility with old Python " +"versions can be difficult as functionality changes. A good rule of thumb " +"is that the package should support, at least, the latest three Python " +"versions (e.g., 3.8, 3.7, 3.6)." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:1 +msgid "CHANGELOG.md Guide" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:3 +msgid "Introduction" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:5 +msgid "" +"The `CHANGELOG.md` document serves as a valuable resource for developers " +"and users alike to track the evolution of a project over time. " +"Understanding the structure and purpose of a changelog helps users and " +"contributors stay informed about new features, bug fixes, and other " +"changes introduced in each release." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:7 +msgid "What is CHANGELOG.md?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:9 +msgid "" +"The primary purpose of `CHANGELOG.md` is to provide a record of notable " +"changes made to the project with each new release. This document helps " +"users understand what has been added, fixed, modified, or removed with " +"each version of the software." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:11 +msgid "" +"[Keep a CHAGELOG.md](https://keepachangelog.com/en/1.1.0/) is a great, " +"simple resource for understanding what a changelog is and how to create a" +" good changelog. It also includes examples of things to avoid." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:13 +msgid "Versioning your Python package and semantic versioning" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:16 +msgid "" +"An important component of a package that serves as the backbone behind " +"the changelog file is a good versioning scheme. Semantic Versioning is " +"widely used across Python packages." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:17 +msgid "" +"[Creating New Versions of Your Python Package](../../package-structure-" +"code/python-package-versions.md)" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:18 +msgid "[Semantic Versioning](https://semver.org)" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:21 +msgid "Why is it important?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:23 +msgid "" +"A well-maintained changelog is essential for transparent communication " +"with users and developers. It serves as a centralized hub for documenting" +" changes and highlights the progress made in each release. By keeping the" +" changelog up-to-date, project maintainers can build trust with their " +"user base and demonstrate their commitment to improving the software." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:25 +msgid "What does it include?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:27 +msgid "" +"The contents of a changelog.md file typically follow a structured format," +" detailing the changes introduced in each release. While the exact format" +" may vary depending on the project's conventions, some common elements " +"found in changelogs for Python packages include:" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:29 +msgid "" +"**Versioning**: Clear identification of each release version using " +"semantic versioning or another versioning scheme adopted by the project." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:31 +msgid "" +"**Release Date**: The date when each version was released to the public, " +"providing context for the timeline of changes." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:33 +msgid "" +"**Change Categories**: Organizing changes into categories such as " +"\"Added,\" \"Changed,\" \"Fixed,\" and \"Removed\" to facilitate " +"navigation and understanding." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:35 +msgid "" +"**Description of Changes**: A concise description of the changes made in " +"each category, including new features, enhancements, bug fixes, and " +"deprecated functionality." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:37 +msgid "" +"**Links to Issues or Pull Requests**: References to relevant issue " +"tracker items or pull requests associated with each change, enabling " +"users to access more detailed information if needed." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:39 +msgid "" +"**Upgrade Instructions**: Guidance for users on how to upgrade to the " +"latest version, including any breaking changes or migration steps they " +"need to be aware of." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:41 +msgid "" +"**Contributor Recognition**: Acknowledgment of contributors who made " +"significant contributions to the release, fostering a sense of community " +"and appreciation for their efforts." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:43 +msgid "How do maintainers use it?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:45 +msgid "Often you will see a changelog that documents a few things:" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:47 +msgid "Unreleased Section" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:49 +msgid "" +"Unreleased commits are at the top of the changelog, commonly in an " +"`Unreleased` section. This is where you can add new fixes, updates and " +"features that have been added to the package since the last release." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:51 +msgid "This section might look something like this:" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:59 +msgid "Release Sections" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:61 +msgid "" +"When you are ready to make a new release, you can move the elements into " +"a section that is specific to that new release number." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:63 +msgid "" +"This specific release section will sit below the unreleased section and " +"can include any updates, additions, deprecations and contributors." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:65 +msgid "" +"The unreleased section then always lives at the top of the file and new " +"features continue to be added there. At the same time, after releasing a " +"version like v1.0 all of its features remain in that specific section." +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:83 +msgid "What does it look like?" +msgstr "" + +#: ../../documentation/repository-files/changelog-file.md:85 +msgid "" +"This example comes from [Devicely](https://github.com/hpi-" +"dhc/devicely/blob/main/CHANGELOG.md), a pyOpenSci accepted package." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:1 +msgid "The CODE_OF_CONDUCT file - Python Packaging" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:3 +msgid "Example CODE_OF_CONDUCT files" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:6 +msgid "" +"[SciPy Code of Conduct file - notice they included theirs in their " +"documentation](https://docs.scipy.org/doc/scipy/dev/conduct/code_of_conduct.html)" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:7 +msgid "" +"[fatiando CODE_OF_CONDUCT.md " +"file](https://github.com/fatiando/community/blob/main/CODE_OF_CONDUCT.md)" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:10 +msgid "" +"Your package should have a `CODE_OF_CONDUCT.md` file located the root of " +"the repository. Once you have people using your package, you can consider" +" the package itself as having a community around it. Some of this " +"community uses your tool. These users may have questions or encounter " +"challenges using your package." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:16 +msgid "" +"Others in the community might want to contribute to your tool. They might" +" fix bugs, update documentation and engage with the maintainer team." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:20 +msgid "Why you need a CODE_OF_CONDUCT" +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:22 +msgid "" +"In order to keep this community healthy and to protect yourself, your " +"maintainer team and your users from unhealthy behavior, it is important " +"to have a [`CODE_OF_CONDUCT`](https://opensource.guide/code-of-conduct/)." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:26 +msgid "" +"The `CODE_OF_CONDUCT` is important as it establishes what you expect in " +"terms of how users and contributors interact with maintainers and each " +"other. It also establishes rules and expectations which can then be " +"enforced if need be to protect others from harmful and/or negative " +"behaviors." +msgstr "" + +#: ../../documentation/repository-files/code-of-conduct-file.md:32 +msgid "" +"If you are not comfortable with creating your own `CODE_OF_CONDUCT` text," +" we encourage you to adopt the `CODE_OF_CONDUCT` language used in the " +"[Contributor Covenant](https://www.contributor-" +"covenant.org/version/2/1/code_of_conduct/). [Many other " +"communities](https://www.contributor-covenant.org/adopters/) have adopted" +" this `CODE_OF_CONDUCT` as their own. See the [Fatiando a Terra " +"Geoscience Python community's example " +"here.](https://github.com/fatiando/community/blob/main/CODE_OF_CONDUCT.md)" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:1 +msgid "Contributing File in your Python Open Source Package" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:3 +msgid "What a CONTRIBUTING.md file should contain" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:5 +msgid "Example contributing files" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:8 +msgid "" +"[pyGMT contributing " +"file](https://github.com/GenericMappingTools/pygmt/blob/main/CONTRIBUTING.md)" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:9 +msgid "" +"[fatiando verde's contributing " +"file](https://github.com/fatiando/verde/blob/main/CONTRIBUTING.md)" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:12 +msgid "" +"Your Python open source package should include a file called " +"**CONTRIBUTING.md** located in the root of your repository (with your " +"**README.md** file)." +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:15 +msgid "" +"The contributing file should include information about the types of " +"contributions that you welcome, and how you'd like to see contributions " +"happen." +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:19 +msgid "" +"This guide should also include information for someone interested in " +"asking questions, submitting issues or pull requests. It should have " +"things like:" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:22 +msgid "" +"Any guidelines that you have in place for users submitting issues, pull " +"requests or asking questions." +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:23 +msgid "A link to your code of conduct" +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:24 +msgid "A link to licensing information found in your README file." +msgstr "" + +#: ../../documentation/repository-files/contributing-file.md:25 +msgid "A link to a development guide if you have one" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:1 +msgid "What the development guide for your Python package should contain" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:3 +msgid "" +"Ideally, your package should also have a development guide. This file may" +" live in your package documentation and should be linked to from your " +"CONTRIBUTING.md file (discussed above). A development guide should " +"clearly show technically proficient users how to:" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:7 +msgid "Set up a development environment locally to work on your package" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:8 +msgid "Run the test suite" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:9 +msgid "Build documentation locally" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:11 +msgid "The development guide should also have guidelines for:" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:12 +msgid "" +"code standards including docstring style, code format and any specific " +"code approaches that the package follows." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:14 +msgid "" +"It's also helpful to specify the types of tests you request if a " +"contributor submits a new feature or a change to an existing feature that" +" will not be covered by your existing test suite." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:16 +msgid "" +"If you have time to document it, it's also helpful to document your " +"maintainer workflow and release processes." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:18 +msgid "Why a development guide is important" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:20 +msgid "It's valuable to have a development guide, in the case that you wish to:" +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:23 +msgid "Onboard new maintainers." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:24 +msgid "" +"Allow technically inclined contributors to make thoughtful and useful " +"code based pull requests to your repository." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:26 +msgid "" +"It also is important to pyOpenSci that the maintenance workflow is " +"documented in the case that we need to help you onboard new maintainers " +"in the future." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:31 +msgid "" +"A well thought out continuous integration setup in your repository can " +"allow users to skip building the package locally (especially if they are " +"just updating text)." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:36 +msgid "" +"A development guide, while strongly recommended, is not a file that " +"pyOpenSci requires a package to have in order to be eligible for review. " +"Some maintainers may also opt to include the development information in " +"their contributing guide." +msgstr "" + +#: ../../documentation/repository-files/development-guide.md:43 +msgid "" +"[The Mozilla Science Lab website has a nice outline of things to consider" +" when creating a contributing guide](https://mozillascience.github.io" +"/working-open-workshop/contributing/)" +msgstr "" + +#: ../../documentation/repository-files/intro.md:1 +msgid "Documentation Files That Should be in your Python Package Repository" +msgstr "" + +#: ../../documentation/repository-files/intro.md:3 +msgid "" +"In this section of the Python packaging guide, we review all of the files" +" that you should have in your Python package repository. Your Python " +"package should, at a minimum have the following files:" +msgstr "" + +#: ../../documentation/repository-files/intro.md:7 +msgid "" +"The files mentions above (README, Code of Conduct, license file, etc) are" +" used as a measure of package community health on many online platforms. " +"Below, you can see an example how Github evaluates community health. This" +" community health link is available for all GitHub repositories." +msgstr "" + +#: ../../documentation/repository-files/intro.md:13 +msgid "" +"Image showing that the MovingPandas GitHub repository community health " +"page with green checks next to each file including a description, README," +" code of conduct, contributing, license and issue templates. Note that " +"Security policy has a yellow circle next to it as that is missing from " +"the repo." +msgstr "" + +#: ../../documentation/repository-files/intro.md:19 +msgid "" +"GitHub community health looks for a readme file among other elements when" +" it evaluates the community level health of your repository. This example" +" is from the [MovingPandas GitHub " +"repo](https://github.com/anitagraser/movingpandas/community) *(screen " +"shot taken Nov 23 2022)*" +msgstr "" + +#: ../../documentation/repository-files/intro.md:22 +msgid "" +"[Snyk](https://snyk.io/advisor/python) is another well-known company that" +" keeps tabs on package health. Below you can see a similar evaluation of " +"files in the Github repo as a measure of community health." +msgstr "" + +#: ../../documentation/repository-files/intro.md:26 +msgid "" +"Screenshot of the Snyk page for movingpandas. It shows that the " +"repository has a README file, contributing file, code of conduct. It also" +" shows that it has 30 contributors and no funding. The package health " +"score is 78/100." +msgstr "" + +#: ../../documentation/repository-files/intro.md:32 +msgid "" +"Screenshot showing [SNYK](https://snyk.io/advisor/python/movingpandas) " +"package health for moving pandas. Notice both platforms look for a README" +" file. *(screen shot taken Nov 23 2022)*" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:1 +msgid "License files for scientific Python open source software" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:3 +msgid "" +"Want to learn how to add a license file to your GitHub repository? Check " +"out this lesson." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:10 +msgid "What is a Open Source License file?" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:12 +msgid "" +"When we talk about LICENSE files, we are referring to a file in your " +"GitHub or GitLab repository that contains legally binding language that " +"describes to your users how they can legally use (and not use) your " +"package." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:16 +msgid "Why licenses are important" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:18 +msgid "" +"A license file is important for all open source projects because it " +"protects both you as a maintainer and your users. The license file helps " +"your users and the community understand:" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:20 +msgid "How they can use your software" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:21 +msgid "Whether the software can be reused or adapted for other purposes" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:22 +msgid "How people can contribute to your project" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:24 +msgid "and more." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:26 +msgid "" +"[Read more about why license files are critical in protecting both you as" +" a maintainer and your users of your scientific Python open source " +"package.](https://opensource.guide/legal/#just-give-me-the-tldr-on-what-i" +"-need-to-protect-my-project)" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:29 +msgid "Where to store your license" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:31 +msgid "" +"Your `LICENSE` file should be stored at root of your GitHub / GitLab " +"repository." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:33 +msgid "" +"Some maintainers customize the language in their license files for " +"specific reasons. However, if you are just getting started, we suggest " +"that you select a permissive license and then use the legal language " +"templates provided both by GitHub and/or the " +"[choosealicense.com](https://choosealicense.com/) website." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:36 +msgid "" +"Licenses are legally binding, as such you should avoid trying to create " +"your own license unless you have the guidance of legal council." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:38 +msgid "Use open permissive licenses when possible" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:40 +msgid "" +"We generally suggest that you use a permissive, license that is [Open " +"Software Initiative (OSI) approved](https://opensource.org/licenses/). If" +" you are [submitting your package to pyOpenSci for peer " +"review](https://www.pyopensci.org/about-peer-review/index.html), then we " +"require an OSI approved license." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:44 +msgid "How to choose a license" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:46 +msgid "" +"To select your license, we suggest that you use GitHub's [Choose a " +"License tool ](https://choosealicense.com/)." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:49 +msgid "" +"If you choose your license when creating a new GitHub repository, you can" +" also automatically get a text copy of the license file to add to your " +"repository. However in some cases the license that you want is not " +"available through that online process." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:54 +msgid "License recommendations from the SciPy package" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:55 +msgid "" +"[The SciPy documentation has an excellent overview of " +"licenses.](https://docs.scipy.org/doc/scipy/dev/core-" +"dev/index.html#licensing). Once of the key elements that these docs " +"recommend is ensuring that the license that you select is complementary " +"to license used in the core scientific Python ecosystem. Below is a " +"highlight of this text which outlines license that are compatible with " +"the modified BSD license that SciPy uses." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:61 +msgid "" +"Other licenses that are compatible with the modified BSD license that " +"SciPy uses are 2-clause BSD, MIT and PSF. Incompatible licenses are GPL, " +"Apache and custom licenses that require attribution/citation or prohibit " +"use for commercial purposes." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:63 +msgid "" +"To coordinate with other packages in our scientific ecosystem, we also " +"recommend that you consider using either BSD or MIT as your license. If " +"you are unsure, the MIT license tends to be a simpler easier-to-" +"understand option." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:69 +msgid "" +"Important: make sure that you closely follow the guidelines outlines by " +"the License that you chose" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:71 +msgid "" +"Every license has different guidelines in terms of what code you can use " +"in your package and also how others can (or can not) use the code in your" +" package." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:74 +msgid "" +"If you borrow code from other tools or online sources, make sure that the" +" license for the code that you are using also complies with the license " +"that you selected for your package." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:78 +msgid "An example of how a license determine how code can be reused" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:81 +msgid "" +"Let's use StackOverflow as an example that highlights how a license " +"determines how code can or can not be used." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:83 +msgid "" +"[Stack overflow uses a Creative Commons Share Alike " +"license.](https://stackoverflow.com/help/licensing). The sharealike " +"license requires you to use the same sharealike license when you reuse " +"any code from StackOverflow." +msgstr "" + +#: ../../documentation/repository-files/license-files.md:85 +msgid "" +"This means that technically, if you copy code from the Stack Overflow " +"website, and use it in your package. And your packages uses a different " +"license such as a MIT license, you are violating Stack Overflow's license" +" requirements!" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:87 +msgid "🚨 Proceed with caution! 🚨" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:91 +msgid "What about software citation?" +msgstr "" + +#: ../../documentation/repository-files/license-files.md:93 +msgid "" +"While many permissive licenses do not require citation we STRONG " +"encourage that you cite all software that you use in papers, blogs and " +"other publications. You tell your users how to cite your package by using" +" a [citation.cff file](https://docs.github.com/en/repositories/managing-" +"your-repositorys-settings-and-features/customizing-your-repository/about-" +"citation-files). We will cover this topic when we talk about creating " +"DOI's for your package using zenodo." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:1 +msgid "README File Guidelines and Resources" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:3 +msgid "" +"Your **README.md** file should be located in the root of your GitHub " +"repository. The **README.md** file is important as it is often the first " +"thing that someone sees before they install your package." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:7 +msgid "The README.md file is the landing page of:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:9 +msgid "" +"Your package as it appears on a repository site such as PyPI or " +"Anaconda.org" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:10 +msgid "Your package's GitHub repository" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:12 +msgid "" +"Your README.md file is also used as a measure of package and community " +"health on sites such as:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:14 +msgid "" +"[GitHub community health for MovingPandas (available for all " +"repositories)](https://github.com/anitagraser/movingpandas/community) and" +" [Snyk - moving pandas " +"example](https://snyk.io/advisor/python/movingpandas)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:17 +msgid "" +"README landing page screenshot for the Pandera package. It has the " +"Pandera logo at the top - which has two arrows in a chevron pattern " +"pointing downward within a circle. Subtitle is statistical data testing " +"toolkit. A data validation library for scientists, engineering, and " +"analytics seeking correctness. Below that are a series of badges " +"including CI tests passing, docs passing, version of Pandera on pypi " +"(0.13.4), MIT license and that it has been pyOpenSci peer reviewed. There" +" are numerous badges below that. Finally below the badges the text says, " +"Pandera provides a flexible and expressive API for performing data " +"validation on dataframe-like objects to make data processing pipelines " +"more readable and robust." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:23 +msgid "" +"Your GitHub repository landing page highlights the README.md file. Here " +"you can see the README.md file for the pyOpenSci package " +"[Pandera](https://github.com/unionai-oss/pandera). *(screen shot taken " +"Nov 23 2022)*" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:26 +msgid "" +"Thus, it is important that you spend some time up front creating a high " +"quality **README.md** file for your Python package." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:30 +msgid "" +"An editor or the editor in chief will ask you to revise your README file " +"before a review begins if it does not meet the criteria specified below." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:33 +msgid "Please go through this list before submitting your package to pyOpenSci" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:50 +msgid "What your README.md file should contain" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:52 +msgid "" +"Your **README.md** file should contain the following things (listed from " +"top to bottom):" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:54 +msgid "✔️ Your package's name" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:55 +msgid "" +"Ideally your GitHub repository's name is also the name of your package. " +"The more self explanatory that name is, the better." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:58 +msgid "" +"✔️ Badges for current package version, continuous integration and test " +"coverage" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:60 +msgid "" +"Badges are a useful way to draw attention to the quality of your project." +" Badges assure users that your package is well-designed, tested, and " +"maintained. They are also a useful maintenance tool to evaluate if things" +" are building properly. A great example of this is adding a [Read the " +"Docs status badge](https://docs.readthedocs.io/en/stable/badges.html) to " +"your README.md file to quickly see when the build on that site fails." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:66 +msgid "" +"It is common to provide a collection of badges towards the top of your " +"README file for others to quickly browse." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:69 +msgid "Some badges that you might consider adding to your README file include:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:71 +msgid "Current version of the package on PyPI / Anaconda.org" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:73 +msgid "" +"Example: [![PyPI version " +"shields.io](https://img.shields.io/pypi/v/pandera.svg)](https://pypi.org/project/pandera/)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:73 +msgid "PyPI version shields.io" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:75 +msgid "" +"Status of tests (pass or fail) - Example: [![CI Build](https://github.com" +"/pandera-" +"dev/pandera/workflows/CI%20Tests/badge.svg?branch=main)](https://github.com" +"/pandera-" +"dev/pandera/actions?query=workflow%3A%22CI+Tests%22+branch%3Amain)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:75 +msgid "CI Build" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:77 +msgid "" +"Documentation build - Example: ![Docs " +"Building](https://github.com/pyOpenSci/python-package-" +"guide/actions/workflows/build-book.yml/badge.svg)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:77 +msgid "Docs Building" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:79 +msgid "" +"DOI (for citation) Example: " +"[![DOI](https://zenodo.org/badge/556814582.svg)](https://zenodo.org/badge/latestdoi/556814582)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:79 +msgid "DOI" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:82 +msgid "" +"Once you package is accepted to pyOpenSci, we will provide you with a " +"badge to add to your repository that shows that it has been reviewed. " +"[![pyOpenSci](https://pyopensci.org/badges/peer-" +"reviewed.svg)](https://github.com/pyOpenSci/software-review/issues/12)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:82 +msgid "pyOpenSci" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:90 +msgid "" +"Beware of the overuse of badges! There is such a thing as too much of a " +"good thing (which can overload a potential user!)." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:93 +msgid "✔️ A short, easy-to-understand description of what your package does" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:95 +msgid "" +"At the top of your README file you should have a short, easy-to-" +"understand, 1-3 sentence description of what your package does. This " +"section should clearly state your goals for the package. The language in " +"this description should use less technical terms so that a variety of " +"users with varying scientific (and development) backgrounds can " +"understand it." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:101 +msgid "" +"In this description, it's useful to let users know how your package fits " +"within the broader scientific Python package ecosystem. If there are " +"other similar packages or complementary package mentions them here in 1-2" +" sentences." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:106 +msgid "" +"Consider writing for a high school level (or equivalent) level. This " +"level of writing is often considered an appropriate level for scientific " +"content that serves a variety of users with varying backgrounds." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:110 +msgid "" +"The goal of this description is to maximize accessibility of your " +"**README** file." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:114 +msgid "✔️ Installation instructions" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:116 +msgid "" +"Include instructions for installing your package. If you have published " +"the package on both PyPI and Anaconda.org, be sure to include " +"instructions for both." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:119 +msgid "✔️ Document any additional setup required" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:121 +msgid "" +"Add any additional setup required such as authentication tokens, to get " +"started using your package. If setup is complex, consider linking to an " +"installation page in your online documentation here rather than over " +"complicating your README file." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:126 +msgid "✔️ Brief demonstration of how to use the package" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:128 +msgid "" +"This description ideally includes a brief, quick start code example that " +"shows a user how to get started using your package." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:131 +msgid "✔️ Descriptive links to package documentation, short tutorials" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:133 +msgid "Include descriptive links to:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:135 +msgid "The package's documentation page." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:136 +msgid "Short tutorials that demonstrate application of your package." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:138 +msgid "Too Much Of A Good Thing" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:141 +msgid "" +"Try to avoid including several tutorials in the README.md file itself. " +"This too will overwhelm the user with information." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:143 +msgid "" +"A short quick-start code example that shows someone how to use your " +"package is plenty of content for the README file. All other tutorials and" +" documentation should be presented as descriptive links." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:149 +msgid "✔️ A Community Section with Links to Contributing Guide, Code of Conduct" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:151 +msgid "Use your README.md file to direct users to more information on:" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:153 +msgid "Contributing to your package" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:154 +msgid "Development setup for more advanced technical contributors" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:155 +msgid "Your code of conduct" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:156 +msgid "Licensing information" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:158 +msgid "" +"All of the above files are important for building community around your " +"project." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:161 +msgid "✔️ Citation information" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:163 +msgid "" +"Finally be sure to include instructions on how to cite your package. " +"Citation should include the DOI that you want used when citing your " +"package, and any language that you'd like to see associated with the " +"citation." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:167 +msgid "README Resources" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:171 +msgid "" +"Below are some resources on creating great README.md files that you might" +" find helpful." +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:174 +msgid "" +"[How to Write a Great README - Bane " +"Sullivan](https://github.com/banesullivan/README)" +msgstr "" + +#: ../../documentation/repository-files/readme-file-best-practices.md:175 +msgid "" +"[Art of README - Kira (@hackergrrl)](https://github.com/hackergrrl/art-" +"of-readme)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:1 +msgid "Create tutorials in your Python package documentation" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:6 +msgid "" +"Your package should have tutorials that make it easy for a user to get " +"started using your package. Ideally, those tutorials also can be run from" +" start to finish providing a second set of checks (on top of your test " +"suite) to your package's code base." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:11 +msgid "" +"On this page, we review two Sphinx extensions (`sphinx-gallery` and " +"`nbsphinx`) that allow you to create reproducible tutorials that are run" +" when your Sphinx documentation builds." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:15 +msgid "Create Python package tutorials that run when you build your docs" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:17 +msgid "" +"Adding well constructed tutorials to your package will make it easier for" +" someone new to begin using your package." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:20 +msgid "" +"There are two Sphinx tools that make it easy to add tutorials to your " +"package:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:22 +msgid "[Sphinx Gallery](https://sphinx-gallery.github.io/stable/index.html) and" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:23 +msgid "[NbSphinx](https://nbsphinx.readthedocs.io/en/latest/)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:25 +msgid "Both of these tools act as Sphinx extensions and:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:27 +msgid "" +"Support creating a gallery type page in your Sphinx documentation where " +"users can explore tutorials via thumbnails." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:28 +msgid "" +"Run the code in your tutorials adding another level of \"testing\" for " +"your package as used." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:29 +msgid "Render your tutorials with Python code and plot outputs" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:31 +msgid "[sphinx gallery:](https://sphinx-gallery.github.io/stable/index.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:33 +msgid "" +"If you prefer to write your tutorials using Python **.py** scripts, you " +"may enjoy using Sphinx gallery. Sphinx gallery uses **.py** files with " +"text and code sections that mimic the Jupyter Notebook format. When you " +"build your documentation, the gallery extension:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:38 +msgid "" +"Runs the code in each tutorial. Running your tutorial like this acts as a" +" check to ensure your package's functions, classes, methods, and " +"attributes (ie the API) are working as they should." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:39 +msgid "" +"Creates a downloadable Jupyter Notebook **.ipynb** file and a **.py** " +"script for your tutorial that a user can quickly download and run." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:40 +msgid "" +"Creates a rendered **.html** page with the code elements and code " +"outputs in a user-friendly tutorial gallery." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:41 +msgid "" +"Creates a gallery landing page with visual thumbnails for each tutorial " +"that you create." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:44 +msgid "" +"Image showing the gallery output provided by sphinx-gallery where each " +"tutorial is in a grid and the tutorial thumbnails are created from a " +"graphic in the tutorial." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:50 +msgid "" +"`sphinx-gallery` makes it easy to create a user-friendly tutorial " +"gallery. Each tutorial has a download link where the user can download a " +"**.py** file or a Jupyter Notebook. And it renders the tutorials in a " +"user-friendly grid." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:54 +msgid "Below you can see what a tutorial looks like created with sphinx-gallery." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:56 +msgid "" +"Image showing ta single tutorial from Sphinx gallery. The tutorial shows " +"a simple matplotlib created plot and associated code." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:62 +msgid "" +"`sphinx-gallery` tutorials by default include download links for both the" +" python script (**.py** file) and a Jupyter notebook (**.ipynb** file) at" +" the bottom." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:66 +msgid "Sphinx Gallery benefits" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:67 +msgid "easy-to-download notebook and .py outputs for each tutorials." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:68 +msgid ".py files are easy to work with in the GitHub pull request environment." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:69 +msgid "Nice gridded gallery output." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:70 +msgid "" +"Build execution time data per tutorial. [Example](https://sphinx-" +"gallery.github.io/stable/auto_examples/sg_execution_times.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:72 +msgid "Sphinx gallery challenges" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:74 +msgid "The downsides of using Sphinx gallery include:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:76 +msgid "" +"the **.py** files can be finicky to configure, particularly if you have " +"matplotlib plot outputs." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:78 +msgid "" +"For example: To allow for plots to render, you need to name each file " +"with `plot_` at the beginning." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:81 +msgid "" +"Many users these days are used to working in Jupyter Notebooks. .py may " +"be slightly less user friendly to work with" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:83 +msgid "" +"These nuances can make it challenging for potential contributors to add " +"tutorials to your package. This can also present maintenance challenge." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:86 +msgid "Add about the gallery setup:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:93 +msgid "File directory structure:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:114 +msgid "" +"[nbsphinx - tutorials using Jupyter " +"Notebooks](https://nbsphinx.readthedocs.io/en/latest/)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:116 +msgid "" +"If you prefer to use Jupyter Notebooks to create tutorials you can use " +"nbsphinx. nbsphinx operates similarly to Sphinx gallery in that:" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:119 +msgid "It runs your notebooks and produces outputs in the rendered tutorials" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:121 +msgid "" +"Pro/con By default it does not support downloading of **.py** and " +"**.ipynb** files. However you can add a [link to the notebook at the top " +"of the page with some additional conf.py settings (see: epilog " +"settings)](https://nbsphinx.readthedocs.io/en/0.8.10/prolog-and-" +"epilog.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:125 +msgid "" +"Image showing the gallery output provided by nbsphinx using the sphinx-" +"gallery front end interface." +msgstr "" + +#: ../../documentation/write-user-documentation/create-package-tutorials.md:131 +msgid "" +"`nbsphinx` can be combined with Sphinx gallery to create a gallery of " +"tutorials. However, rather than rendering the gallery as a grid, it lists" +" all of the gallery elements in a single column." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:1 +msgid "Document the code in your package's API using docstrings" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:3 +msgid "What is an API?" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:5 +msgid "" +"API stands for **A**pplied **P**rogramming **I**nterface. When discussed " +"in the context of a (Python) package, the API refers to the functions, " +"classes, methods, and attributes that a package maintainer creates for " +"users." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:9 +msgid "" +"A simple example of a package API element: For instance, a package might " +"have a function called `add_numbers()` that adds up a bunch of numbers. " +"To add up numbers, you as the user simply call `add_numbers(1,2,3)` and " +"the package function calculates the value and returns `6`. By calling the" +" `add_numbers` function, you are using the package's API." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:15 +msgid "" +"Package APIs consist of functions, classes, methods and attributes that " +"create a user interface." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:17 +msgid "What is a docstring and how does it relate to documentation?" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:19 +msgid "" +"In Python, a docstring refers to text in a function, method or class that" +" describes what the function does and its inputs and outputs. Python " +"programmers usually refer to the inputs to functions as " +"[\"parameters\"](https://docs.python.org/3/glossary.html#term-parameter) " +"or [\"arguments\"](https://docs.python.org/3/faq/programming.html#faq-" +"argument-vs-parameter), and the outputs are often called \"return " +"values\"" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:22 +msgid "The docstring is thus important for:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:24 +msgid "" +"When you call `help()` in Python, for example, `help(add_numbers)` will " +"show the text of the function's docstring. The docstring thus helps a " +"user better understand how to apply the function more effectively to " +"their workflow." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:25 +msgid "" +"When you build your package's documentation, the docstrings can also be " +"used to automatically create full API documentation that provides a clean" +" view of all its functions, classes, methods, and attributes." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:28 +msgid "" +"Example API Documentation for all functions, classes, methods, and " +"attributes in a package." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:29 +msgid "" +"[View example high-level API documentation for the Verde package. This " +"page lists every function and class in the package along with a brief " +"explanation of what it " +"does](https://www.fatiando.org/verde/latest/api/index.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:30 +msgid "" +"[You can further dig down to see what a specific function does within the" +" package by clicking on an API " +"element](https://www.fatiando.org/verde/latest/api/generated/verde.grid_coordinates.html#verde.grid_coordinates)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:33 +msgid "Python package API documentation" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:35 +msgid "" +"If you have a descriptive docstring for every user-facing class, method, " +"attribute and/or function in your package (_within reason_), then your " +"package's API is considered well-documented." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:38 +msgid "" +"In Python, this means that you need to add a docstring for every user-" +"facing class, method, attribute and/or function in your package (_within " +"reason_) that:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:42 +msgid "Explains what the function, method, attribute, or class does" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:43 +msgid "Defines the `type` inputs and outputs (ie. `string`, `int`, `np.array`)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:44 +msgid "Explains the expected output `return` of the object, method or function." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:47 +msgid "Three Python docstring formats and why we like NumPy style" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:49 +msgid "" +"There are several Python docstring formats that you can choose to use " +"when documenting your package including:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:52 +msgid "" +"[NumPy-style](https://numpydoc.readthedocs.io/en/latest/format.html" +"#docstring-standard)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:53 +msgid "" +"[google style](https://sphinxcontrib-" +"napoleon.readthedocs.io/en/latest/example_google.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:54 +msgid "" +"[reST style](https://sphinx-rtd-" +"tutorial.readthedocs.io/en/latest/docstrings.html)" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:58 +msgid "" +"We suggest using [NumPy-style " +"docstrings](https://numpydoc.readthedocs.io/en/latest/format.html" +"#docstring-standard) for your Python documentation because:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:61 +msgid "" +"NumPy style docstrings are core to the scientific Python ecosystem and " +"defined in the [NumPy style " +"guide](https://numpydoc.readthedocs.io/en/latest/format.html). Thus you " +"will find them widely used there." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:62 +msgid "" +"The Numpy style docstring is simplified and thus easier to read both in " +"the code and when calling `help()` in Python. In contrast, some feel that" +" reST style docstrings are harder to quickly scan, and can take up more " +"lines of code in modules." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:65 +msgid "" +"If you are using NumPy style docstrings, be sure to include the [sphinx " +"napoleon extension](https://www.sphinx-" +"doc.org/en/master/usage/extensions/napoleon.html) in your documentation " +"`conf.py` file. This extension allows Sphinx to properly read and format " +"NumPy format docstrings." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:70 +msgid "Docstring examples Better and Best" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:72 +msgid "" +"Below is a good example of a well-documented function. Notice that this " +"function's docstring describes the function's inputs and the function's " +"output (or return value). The initial description of the function is " +"short (one line). Following that single-line description, there is a " +"slightly longer description of what the function does (2 to 3 sentences)." +" The return of the function is also specified." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:106 +msgid "Best: a docstring with example use of the function" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:108 +msgid "" +"This example contains an example of using the function that is also " +"tested in sphinx using " +"[doctest](https://docs.python.org/3/library/doctest.html)." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:159 +msgid "" +"Using the above NumPy format docstring in sphinx, the autodoc extension " +"will create the about documentation section for the `extent_to_json` " +"function. The output of the `es.extent_to_json(rmnp)` command can even be" +" tested using doctest adding another quality check to your package." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:165 +msgid "" +"Using doctest to run docstring examples in your package's methods and " +"functions" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:170 +msgid "" +"Above, we provided some examples of good, better, best docstring formats." +" If you are using Sphinx to create your docs, you can add the " +"[doctest](https://www.sphinx-" +"doc.org/en/master/usage/extensions/doctest.html) extension to your Sphinx" +" build. Doctest provides an additional check for docstrings with example " +"code in them. Doctest runs the example code in your docstring `Examples` " +"checking that the expected output is correct. Similar to running " +"tutorials in your documentation, `doctest` can be a useful step that " +"assures that your package's code (API) runs as you expect it to." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:177 +msgid "" +"It's important to keep in mind that examples in your docstrings help " +"users using your package. Running `doctest` on those examples provides a " +"check of your package's API. doctest ensures that the functions and " +"methods in your package run as you expect them to. Neither of these items" +" replace a separate, stand-alone test suite that is designed to test your" +" package's core functionality across operating systems and Python " +"versions." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:185 +msgid "" +"Below is an example of a docstring with an example. doctest will run the " +"example below and test that if you provide `add_me` with the values 1 and" +" 3 it will return 4." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:218 +msgid "Adding type hints to your docstrings" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:220 +msgid "" +"In the example above, you saw the use of numpy-style docstrings to " +"describe data types that are passed into functions as parameters or into " +"classes as attributes. In a numpy-style docstring you add those types in " +"the Parameters section of the docstring. Below you can see that the " +"parameter `num1` and `num2` should both be a Python `int` (integer) " +"value." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:235 +msgid "" +"Describing the expected data type that a function or method requires " +"helps users better understand how to call a function or method." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:238 +msgid "" +"Type-hints add another layer of type documentation to your code. Type-" +"hints make it easier for new developers, your future self or contributors" +" to get to know your code base quickly." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:242 +msgid "" +"Type hints are added to the definition of your function. In the example " +"below, the parameters aNum and aNum2 are defined as being type = int " +"(integer)." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:249 +msgid "" +"You can further describe the expected function output using `->`. Below " +"the output of the function is also an int." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:257 +msgid "Why use type hints" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:259 +msgid "Type hints:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:261 +msgid "Make development and debugging faster," +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:262 +msgid "" +"Make it easier for a user to see the data format inputs and outputs of " +"methods and functions," +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:263 +msgid "" +"Support using static type checking tools such as [`mypy`](https://mypy-" +"lang.org/) which will check your code to ensure types are correct." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:265 +msgid "You should consider adding type hinting to your code if:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:267 +msgid "Your package performs data processing," +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:268 +msgid "You use functions that require complex inputs" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:269 +msgid "" +"You want to lower the entrance barrier for new contributors to help you " +"with your code." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:271 +msgid "Beware of too much type hinting" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:274 +msgid "As you add type hints to your code consider that in some cases:" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:276 +msgid "" +"If you have a complex code base, type hints may make code more difficult " +"to read. This is especially true when a parameter’s input takes multiple " +"data types and you list each one." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:277 +msgid "" +"Writing type hints for simple scripts and functions that perform obvious " +"operations don't make sense." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:280 +msgid "Gradually adding type hints" +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:282 +msgid "" +"Adding type hints can take a lot of time. However, you can add type hints" +" incrementally as you work on your code." +msgstr "" + +#: ../../documentation/write-user-documentation/document-your-code-api-docstrings.md:286 +msgid "" +"Adding type hints is also a great task for new contributors. It will help" +" them get to know your package's code and structure better before digging" +" into more complex contributions." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:1 +msgid "Create User Facing Documentation for your Python Package" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:14 +msgid "Core components of user-facing Python package documentation" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:15 +msgid "Below we break documentation into two broad types." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:17 +msgid "" +"**User-facing documentation** refers to documentation that describes the " +"way the tools within a package are broadly used in workflows. **API " +"documentation** refers to documentation of functions, classes, methods, " +"and attributes in your code and is written at a more granular level. This" +" documentation is what a user sees when they type `help(function-name)`." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:23 +msgid "" +"Your user-facing documentation for your Python package should include " +"several core components." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:26 +msgid "" +"**Documentation Website:** This refers to easy-to-read documentation that" +" helps someone use your package. This documentation should help users " +"both install and use your package." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:27 +msgid "" +"**Short Tutorials:** Your user-facing documentation should also include " +"[**short tutorials** that showcase core features of your package](create-" +"package-tutorials)." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:28 +msgid "" +"**Package Code / API documentation:** You package's functions, classes, " +"methods, and attributes (the API) should also be documented. API " +"documentation can be generated from " +"[docstrings](https://pandas.pydata.org/docs/development/contributing_docstring.html)" +" found in your code. Ideally, you have docstrings for all user-facing " +"functions, classes, and methods in your Python package. [We discuss code " +"documentation and docstrings in greater detail here.](document-your-code-" +"api-docstrings)" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:32 +msgid "Write usable documentation" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:34 +msgid "" +"User-facing documentation should be published on a easy-to-navigate " +"website. The documentation should be written keeping in mind that users " +"may not be developers or expert-level programmers. Rather, the language " +"that you use in your documentation should not be highly technical." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:39 +msgid "" +"To make the language of your documentation more accessible to a broader " +"audience:" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:42 +msgid "Whenever possible, define technical terms and jargon." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:43 +msgid "Consider writing instructions for a high-school level reader." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:44 +msgid "" +"Include step-by-step code examples, tutorials or vignettes that support " +"getting started using your package." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:46 +msgid "Four elements of a good open source documentation landing page" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:48 +msgid "" +"To make it easy for users to find what they need quickly, consider adding" +" quick links on your package's landing page to the following elements:" +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:52 +msgid "" +"**Getting started:** This section should provide the user with a quick " +"start for installing your package. A small example of how to use the " +"package is good to have here as well. Or you can link to useful tutorials" +" in the get started section." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:53 +msgid "" +"**About:** Describe your project, stating its goals and its " +"functionality." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:54 +msgid "" +"**Community:** Instructions for how to help and/or get involved. This " +"might include links to your issues (if that is where you let users ask " +"questions) or the discussion part of your GitHub repo. This section might" +" include a development guide for those who might contribute to your " +"package." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:55 +msgid "" +"**API Documentation:** This is the detailed project documentation. Here " +"you store documentation for your package's API including all user-facing " +"functions, classes, methods, and attributes as well as any additional " +"high level discussion that will help people use your package." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:58 +msgid "" +"Image showing the landing page for GeoPandas documentation which has 4 " +"sections including Getting started, Documentation, About GeoPandas, " +"Community." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:64 +msgid "" +"The documentation landing page of GeoPandas, a spatial Python library, " +"has the 4 element specified above. Notice that the landing page is simple" +" and directs users to each element using a Sphinx card." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:67 +msgid "" +"NOTE: in many cases you can include your **README** file and your " +"**CONTRIBUTING** files in your documentation given those files may have " +"some of the components listed above." +msgstr "" + +#: ../../documentation/write-user-documentation/get-started.md:71 +msgid "" +"You can include files in Sphinx using the include directive. Below is an " +"example of doing this using `myst` syntax." +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:1 +msgid "Writing user-facing documentation for your Python package" +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:3 +msgid "" +"This section walks you through best practices for with writing " +"documentation for your Python package." +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:6 +msgid "" +"We talk about the elements that you should consider adding to your " +"documentation, the different types of users who might read your " +"documentation and how to create tutorials for your package." +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:10 +msgid "" +"Here we also cover sphinx extensions that you can user to make " +"documentation easier such as:" +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:13 +msgid "" +"autodoc to automagically populate documentation for your code's " +"functions, classes, methods and attributes (API documentation) and" +msgstr "" + +#: ../../documentation/write-user-documentation/intro.md:15 +msgid "sphinx gallery for tutorials." +msgstr "" + diff --git a/locales/jp/LC_MESSAGES/index.po b/locales/jp/LC_MESSAGES/index.po new file mode 100644 index 00000000..d7c8cb33 --- /dev/null +++ b/locales/jp/LC_MESSAGES/index.po @@ -0,0 +1,483 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: jp\n" +"Language-Team: jp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../index.md:283 +msgid "Tutorials" +msgstr "" + +#: ../../index.md:289 +msgid "Packaging" +msgstr "" + +#: ../../index.md:139 ../../index.md:297 +msgid "Documentation" +msgstr "" + +#: ../../index.md:187 ../../index.md:305 +msgid "Tests" +msgstr "" + +#: ../../index.md:305 +msgid "Testing" +msgstr "" + +#: ../../index.md:1 +msgid "pyOpenSci Python Package Guide" +msgstr "" + +#: ../../index.md:3 +msgid "" +"We support the Python tools that scientists need to create open science " +"workflows." +msgstr "" + +#: ../../index.md:20 +msgid "" +"![GitHub release (latest by " +"date)](https://img.shields.io/github/v/release/pyopensci/python-package-" +"guide?color=purple&display_name=tag&style=plastic) " +"[![](https://img.shields.io/github/stars/pyopensci/python-package-" +"guide?style=social)](https://github.com/pyopensci/contributing-guide) " +"[![DOI](https://zenodo.org/badge/556814582.svg)](https://zenodo.org/badge/latestdoi/556814582)" +msgstr "" + +#: ../../index.md:20 +msgid "GitHub release (latest by date)" +msgstr "" + +#: ../../index.md:20 +msgid "DOI" +msgstr "" + +#: ../../index.md:27 +msgid "About this guide" +msgstr "" + +#: ../../index.md:29 +msgid "" +"Image with the pyOpenSci flower logo in the upper right hand corner. The " +"image shows the packaging lifecycle. The graphic shows a high level " +"overview of the elements of a Python package. the inside circle has 5 " +"items - user documentation, code/api, test suite, contributor " +"documentation, project metadata / license / readme. In the middle of the " +"circle is says maintainers and has a small icon with people. on the " +"outside circle there is an arrow and it says infrastructure." +msgstr "" + +#: ../../index.md:35 +msgid "This guide will help you:" +msgstr "" + +#: ../../index.md:37 +msgid "Learn how to create a Python package from start to finish" +msgstr "" + +#: ../../index.md:38 +msgid "Understand the broader Python packaging tool ecosystem" +msgstr "" + +#: ../../index.md:39 +msgid "Navigate and make decisions around tool options" +msgstr "" + +#: ../../index.md:40 +msgid "Understand all of the pieces of creating and maintaining a Python package" +msgstr "" + +#: ../../index.md:42 +msgid "" +"You will also find best practice recommendations and curated lists of " +"community resources surrounding packaging and package documentation." +msgstr "" + +#: ../../index.md:46 +msgid "Todo" +msgstr "" + +#: ../../index.md:47 +msgid "TODO: change the navigation of docs to have a" +msgstr "" + +#: ../../index.md:49 +msgid "user documentation contributor / maintainer documentation" +msgstr "" + +#: ../../index.md:51 +msgid "development guide" +msgstr "" + +#: ../../index.md:52 +msgid "contributing guide" +msgstr "" + +#: ../../index.md:54 +msgid "Community docs" +msgstr "" + +#: ../../index.md:55 +msgid "readme, coc, license" +msgstr "" + +#: ../../index.md:57 +msgid "Publish your docs" +msgstr "" + +#: ../../index.md:59 +msgid "_new_ Tutorial Series: Create a Python Package" +msgstr "" + +#: ../../index.md:61 +msgid "" +"The first round of our community-developed, how to create a Python " +"package tutorial series for scientists is complete! Join our community " +"review process or watch development of future tutorials in our [Github " +"repo here](https://github.com/pyOpenSci/python-package-guide)." +msgstr "" + +#: ../../index.md:71 +msgid "✿ Create a Package Tutorials ✿" +msgstr "" + +#: ../../index.md:75 +msgid "[What is a Python package?](/tutorials/intro)" +msgstr "" + +#: ../../index.md:76 +msgid "[Make your code installable](/tutorials/installable-code)" +msgstr "" + +#: ../../index.md:77 +msgid "[Publish your package to (test) PyPI](/tutorials/publish-pypi)" +msgstr "" + +#: ../../index.md:78 +msgid "[Publish your package to conda-forge](/tutorials/publish-conda-forge)" +msgstr "" + +#: ../../index.md:83 +msgid "✿ Package Metadata Tutorials ✿" +msgstr "" + +#: ../../index.md:87 +msgid "[How to add a README file](/tutorials/add-readme)" +msgstr "" + +#: ../../index.md:88 +msgid "" +"[How to add metadata to a pyproject.toml file for publication to " +"PyPI.](/tutorials/pyproject-toml.md)" +msgstr "" + +#: ../../index.md:93 +msgid "✿ Packaging Tool Tutorials ✿" +msgstr "" + +#: ../../index.md:97 +msgid "[Introduction to Hatch](/tutorials/get-to-know-hatch)" +msgstr "" + +#: ../../index.md:102 +msgid "Python Packaging for Scientists" +msgstr "" + +#: ../../index.md:104 +msgid "" +"Learn about Python packaging best practices. You will also get to know " +"the the vibrant ecosystem of packaging tools that are available to help " +"you with your Python packaging needs." +msgstr "" + +#: ../../index.md:113 +msgid "✨ Create your package ✨" +msgstr "" + +#: ../../index.md:117 +msgid "[Package file structure](/package-structure-code/python-package-structure)" +msgstr "" + +#: ../../index.md:118 +msgid "" +"[Package metadata / pyproject.toml](package-structure-code/pyproject-" +"toml-python-package-metadata.md)" +msgstr "" + +#: ../../index.md:119 +msgid "" +"[Build your package (sdist / wheel)](package-structure-code/python-" +"package-distribution-files-sdist-wheel.md)" +msgstr "" + +#: ../../index.md:120 +msgid "[Declare dependencies](package-structure-code/declare-dependencies.md)" +msgstr "" + +#: ../../index.md:121 +msgid "" +"[Navigate the packaging tool ecosystem](package-structure-code/python-" +"package-build-tools.md)" +msgstr "" + +#: ../../index.md:122 +msgid "" +"[Non pure Python builds](package-structure-code/complex-python-package-" +"builds.md)" +msgstr "" + +#: ../../index.md:127 +msgid "✨ Publish your package ✨" +msgstr "" + +#: ../../index.md:131 +msgid "" +"Gain a better understanding of the Python packaging ecosystem Learn about" +" best practices for:" +msgstr "" + +#: ../../index.md:134 +msgid "" +"[Package versioning & release](/package-structure-code/python-package-" +"versions.md)" +msgstr "" + +#: ../../index.md:135 +msgid "" +"[Publish to PyPI & Conda-forge](/package-structure-code/publish-python-" +"package-pypi-conda.md)" +msgstr "" + +#: ../../index.md:148 +msgid "✨ Write The Docs ✨" +msgstr "" + +#: ../../index.md:151 +msgid "" +"[Create documentation for your users](/documentation/write-user-" +"documentation/intro)" +msgstr "" + +#: ../../index.md:152 +msgid "" +"[Core files to include in your package repository](/documentation" +"/repository-files/intro)" +msgstr "" + +#: ../../index.md:153 +msgid "" +"[Write tutorials to show how your package is used](/documentation/write-" +"user-documentation/create-package-tutorials)" +msgstr "" + +#: ../../index.md:158 +msgid "✨ Developer Docs ✨" +msgstr "" + +#: ../../index.md:161 +msgid "" +"[Create documentation for collaborating developers](/documentation" +"/repository-files/contributing-file)" +msgstr "" + +#: ../../index.md:162 +msgid "" +"[Write a development guide](/documentation/repository-files/development-" +"guide)" +msgstr "" + +#: ../../index.md:167 +msgid "✨ Document For A Community ✨" +msgstr "" + +#: ../../index.md:170 +msgid "" +"[Writing a README file](/documentation/repository-files/readme-file-best-" +"practices)" +msgstr "" + +#: ../../index.md:171 +msgid "" +"[Set norms with a Code of Conduct](/documentation/repository-files/code-" +"of-conduct-file)" +msgstr "" + +#: ../../index.md:172 +msgid "[License your package](/documentation/repository-files/license-files)" +msgstr "" + +#: ../../index.md:177 +msgid "✨ Publish Your Docs ✨" +msgstr "" + +#: ../../index.md:180 +msgid "[How to publish your docs](/documentation/hosting-tools/intro)" +msgstr "" + +#: ../../index.md:181 +msgid "[Using Sphinx](/documentation/hosting-tools/intro)" +msgstr "" + +#: ../../index.md:182 +msgid "" +"[Markdown, MyST, and ReST](/documentation/hosting-tools/myst-markdown-" +"rst-doc-syntax)" +msgstr "" + +#: ../../index.md:183 +msgid "" +"[Host your docs on Read The Docs or Github Pages](/documentation/hosting-" +"tools/publish-documentation-online)" +msgstr "" + +#: ../../index.md:189 +msgid "" +"*We are actively working on this section. [Follow development " +"here.](https://github.com/pyOpenSci/python-package-guide)*" +msgstr "" + +#: ../../index.md:197 +msgid "✨ Tests for your Python package ✨" +msgstr "" + +#: ../../index.md:200 +msgid "[Intro to testing](tests/index.md)" +msgstr "" + +#: ../../index.md:201 +msgid "[Write tests](tests/write-tests)" +msgstr "" + +#: ../../index.md:202 +msgid "[Types of tests](tests/test-types)" +msgstr "" + +#: ../../index.md:207 +msgid "✨ Run your tests ✨" +msgstr "" + +#: ../../index.md:210 +msgid "[Run tests locally](tests/run-tests)" +msgstr "" + +#: ../../index.md:211 +msgid "[Run tests in CI](tests/tests-ci)" +msgstr "" + +#: ../../index.md:215 +msgid "Contributing" +msgstr "" + +#: ../../index.md:225 +msgid "✨ Code style & Format ✨" +msgstr "" + +#: ../../index.md:230 +msgid "[Code style](package-structure-code/code-style-linting-format.md)" +msgstr "" + +#: ../../index.md:235 +msgid "✨ Want to contribute? ✨" +msgstr "" + +#: ../../index.md:240 +msgid "" +"We welcome contributions to this guide. Learn more about how you can " +"contribute." +msgstr "" + +#: ../../index.md:246 +msgid "" +"xkcd comic showing a stick figure on the ground and one in the air. The " +"one on the ground is saying. `You're flying! how?` The person in the air" +" replies `Python!` Below is a 3 rectangle comic with the following text " +"in each box. box 1 - I learned it last night. Everything is so simple. " +"Hello world is just print hello world. box 2 - the person on the ground " +"says - come join us programming is fun again. it's a whole new world. But" +" how are you flying? box 3 - the person flying says - i just typed import" +" antigravity. I also sampled everything in the medicine cabinet. But i " +"think this is the python. the person on the ground is saying - that's it?" +msgstr "" + +#: ../../index.md:252 +msgid "A community-created guidebook" +msgstr "" + +#: ../../index.md:254 +msgid "" +"Every page in this guidebook goes through an extensive community review " +"process. To ensure our guidebook is both beginner-friendly and accurate, " +"we encourage reviews from a diverse set of pythonistas and scientists " +"with a wide range of skills and expertise." +msgstr "" + +#: ../../index.md:257 +msgid "View guidebook contributors" +msgstr "" + +#: ../../index.md:265 +msgid "Who this guidebook is for" +msgstr "" + +#: ../../index.md:267 +msgid "" +"This guidebook is for anyone interested in learning more about Python " +"packaging. It is beginner-friendly and will provide:" +msgstr "" + +#: ../../index.md:269 +msgid "Beginning-to-end guidance on creating a Python package." +msgstr "" + +#: ../../index.md:270 +msgid "" +"Resources to help you navigate the Python packaging ecosystem of tools " +"and approaches to packaging." +msgstr "" + +#: ../../index.md:271 +msgid "" +"A curated list of resources to help you get your package into documented," +" usable and maintainable shape." +msgstr "" + +#: ../../index.md:273 +msgid "Where this guide is headed" +msgstr "" + +#: ../../index.md:275 +msgid "" +"If you have ideas of things you'd like to see here clarified in this " +"guide, [we invite you to open an issue on " +"GitHub.](https://github.com/pyOpenSci/python-package-guide/issues)." +msgstr "" + +#: ../../index.md:278 +msgid "" +"If you have questions about our peer review process or packaging in " +"general, you are welcome to use our [pyOpenSci Discourse " +"forum](https://pyopensci.discourse.group/)." +msgstr "" + +#: ../../index.md:280 +msgid "" +"This is a living guide that is updated as tools and best practices evolve" +" in the Python packaging ecosystem. We will be adding new content over " +"the next year." +msgstr "" + diff --git a/locales/jp/LC_MESSAGES/package-structure-code.po b/locales/jp/LC_MESSAGES/package-structure-code.po new file mode 100644 index 00000000..fe7f0e4a --- /dev/null +++ b/locales/jp/LC_MESSAGES/package-structure-code.po @@ -0,0 +1,5301 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: jp\n" +"Language-Team: jp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../package-structure-code/code-style-linting-format.md:1 +msgid "Python Package Code Style, Format and Linters" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:3 +#: ../../package-structure-code/publish-python-package-pypi-conda.md:12 +msgid "Take Aways" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:5 +msgid "pyOpenSci requires authors to follow PEP 8 code format guidelines" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:6 +msgid "" +"Setting up a code formatters like Black and isort will help you enforce " +"PEP 8 style guidelines and also consistent, readable code format" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:7 +msgid "Some commonly used tools are: Black, Isort, flake8, Ruff" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:8 +msgid "" +"You can also setup pre-commit hooks which will run code formatters " +"locally each time you make a commit." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:10 +msgid "" +"[precommit.ci](https://pre-commit.ci/) is a bot that you can add to your " +"GitHub repository. It will automagically apply code format to every PR " +"using the tools specified in your pre-commit-config.yaml file. It can " +"save significant time and make contributions easier for new contributors." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:11 +msgid "" +"Automation is good! By making code quality tools care of your code, you " +"can focus on structural and high values tasks." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:14 +msgid "" +"Consistent code format and style is useful to both your package and " +"across the scientific Python ecosystem because using similar formats " +"makes code easier to read." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:18 +msgid "" +"For instance, if you saw a sentence like this one without any spaces, or " +"punctuation, it would take your brain longer to process it." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:25 +msgid "" +"pyOpenSci peer review process requires that you to follow standard " +"[Python PEP 8 format rules](https://peps.python.org/pep-0008/) as closely" +" as you can." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:29 +msgid "" +"pyOpenSci doesn't require you to use a specific code format tool. " +"However, we do look for consistency and readability in code style. Below " +"you will find a discussion of:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:33 +msgid "The benefits of using linters and code format tools in your workflow" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:34 +msgid "Some commonly used tools in the scientific Python space" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:35 +msgid "" +"Setting up pre-commit hooks and the pre-commit.ci bot to make using code " +"format tools in daily workflows and in pull requests on GitHub easier." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:38 +msgid "Use a code format tool (or tools) to make your life easier" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:40 +msgid "" +"We suggest that you use a code format tool, or a set of format tools, " +"because manually applying all of the PEP 8 format specifications is both " +"time consuming for maintainers and can be a road block for potential new " +"contributors. Code formatters will automagically reformat your code for " +"you, adhering to PEP 8 standards and applying consistent style decisions " +"throughout." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:46 +msgid "Setting up a code format suite of tools will:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:48 +msgid "Save you and your maintainer team time in fixing PEP 8 inconsistencies." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:49 +msgid "Ensure that format and style is consistent across your entire code-base." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:50 +msgid "" +"Avoid lengthy discussions with contributors and other maintainers about " +"personalized code format preferences during reviews." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:52 +msgid "" +"Avoid pure visual edits in the code base so that code reviews focus on " +"added value" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:54 +msgid "" +"Many packages use a suite of tools to apply code format rules, taking the" +" work out of manually implementing code format requirements." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:57 +msgid "" +"Consistent code format across packages within the (scientific) Python " +"ecosystem, will also broadly make code easier to scan, understand and " +"contribute to." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:60 +msgid "Linting vs format and style" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:62 +msgid "Before we dive in let's get a few definitions out of the way." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:64 +msgid "Code Linting" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:66 +msgid "" +"A code linter is a tool that will review your code and identify errors or" +" issues. A linter typically does not modify your code. It will tell you " +"what the error is and on what line it was discovered. Flake8, discussed " +"below, is an example of a commonly-used code linter." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:71 +msgid "Code Formatters (and stylers)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:73 +msgid "" +"Code formatters will reformat your code for you. Python focused code " +"formatters often follow PEP 8 standards. However, they also make " +"stylistic decisions about code consistency." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:77 +msgid "" +"Black is an example of a commonly-used code formatter. Black both applies" +" PEP 8 standards while also making decisions about things like consistent" +" use of double quotes for strings, and spacing of items in lists." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:81 +msgid "You will learn more about Black below." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:83 +msgid "Code linting, formatting and styling tools" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:85 +msgid "Black" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:87 +msgid "" +"[Black](https://black.readthedocs.io/en/stable/) is a code formatter. " +"Black will automagically (and _unapologetically_) fix spacing issues and " +"ensure code format is consistent throughout your package. Black also " +"generally adheres to PEP 8 style guidelines with some exceptions. A few " +"examples of those exceptions are below:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:93 +msgid "" +"Black defaults to a line length of 88 (79 + 10%) rather than the 79 " +"character `PEP 8` specification. However, line length is a setting can be" +" manually overwritten in your Black configuration." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:94 +msgid "Black will not adjust line length in your comments or docstrings." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:95 +msgid "" +"This tool will not review and fix import order (you need `isort` or " +"`ruff` to do that - see below)." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:98 +msgid "" +"If you are interested in seeing how Black will format your code, you can " +"use the [Black playground](https://black.vercel.app/)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:102 +msgid "" +"Using a code formatter like Black will leave you more time to work on " +"code function rather than worry about format." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:105 +msgid "Flake8" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:107 +msgid "" +"To adhere to Python `pep8` format standards, you might want to add " +"[flake8](https://flake8.pycqa.org/en/latest/) to your code format " +"toolbox." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:111 +msgid "flake8 will:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:113 +msgid "" +"Flag every line in your code that extends beyond 79 characters (including" +" those in docstrings and comments)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:114 +msgid "" +"Flag spacing issues that conflict with PEP 8 guidelines such as missing " +"spaces after commas" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:116 +msgid "" +"Flake8 also flags unused imports and unused declared variables in your " +"modules." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:119 +msgid "" +"Below you can see the output of running `flake8 filename.py` at the " +"command line for a Python file within a package called `stravalib`." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:123 +msgid "The line length standard for PEP 8 is 79 characters." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:125 +msgid "" +"Notice that flake8 returns a list of issues that it found in the model.py" +" module on the command line. The Python file itself is not modified. " +"Using this output, you can fix each issue line by line manually." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:140 +msgid "Isort" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:142 +msgid "" +"Python imports refer to the Python packages that a module in your package" +" requires. Imports should always be located at the top of each Python " +"module in your package." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:146 +msgid "" +"[PEP 8 has specific standards for the order of these " +"imports](https://peps.python.org/pep-0008/#imports). These standards are " +"listed below:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:148 +msgid "Imports should be grouped in the following order:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:150 +msgid "Standard library imports." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:151 +msgid "Related third party imports." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:152 +msgid "Local application/library specific imports." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:154 +msgid "" +"While `flake8` will identify unused imports in your code, it won't fix or" +" identify issues with the order of package imports." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:157 +msgid "" +"`isort` will identify where imports in your code are out of order. It " +"will then modify your code, automatically reordering all imports. This " +"leaves you with one less thing to think about when cleaning up your code." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:162 +msgid "Example application of isort" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:164 +msgid "Code imports before `isort` is run:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:166 +msgid "" +"Below, the `pandas` is a third party package, `typing` is a core `Python`" +" package distributed with `Python`, and `examplePy.temperature` is a " +"first-party module which means it belongs to the same package as the file" +" doing the import. Also notice that there are no spaces in the imports " +"listed below." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:176 +msgid "From the project root, run:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:182 +msgid "Python file `temporal.py` imports after `isort` has been run" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:189 +msgid "Ruff" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:191 +msgid "" +"[Ruff](https://docs.astral.sh/ruff/) is a new addition to the code " +"quality ecosystem, gaining some traction since its release. `ruff` is " +"both a linter and a code formatter for Python, aiming to replace several " +"tools behind a single interface. As such, `ruff` can be used at a " +"replacement of all other tools mentioned here, or in complement to some " +"of them." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:197 +msgid "" +"`ruff` has some interesting features that distinguish it from other " +"linters:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:199 +msgid "Linter configuration in `pyproject.toml`" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:200 +msgid "Several hundred rules included, many of which are automatically fixable" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:201 +msgid "" +"Rules explanation, see [F403](https://docs.astral.sh/ruff/rules" +"/undefined-local-with-import-star/) for an example" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:202 +msgid "" +"Fast execution time, makes a quick feedback loop possible even on large " +"projects." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:204 +msgid "" +"Here is a simple configuration to get started with `ruff`. It would go " +"into your `pyproject.toml`:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:212 +msgid "" +"Depending on your project, you might want to add the following to sort " +"imports correctly:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:219 +msgid "How to use code formatter in your local workflow" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:221 +msgid "Linters, code formatters and your favorite coding tools" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:223 +msgid "" +"Linters can be run as a command-line tool as shown above. They also can " +"be run within your favorite coding tool (e.g. VScode, pycharm, etc). For " +"example, you might prefer to have tools like Black and isort run when you" +" save a file. In some editors you can also setup shortcuts that run your " +"favorite code format tools on demand." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:229 +msgid "Use pre-commit hooks to run code formatters and linters on commits" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:231 +msgid "You can also setup a `pre-commit hook` in your Python package repository." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:233 +msgid "" +"A pre-commit hook is a tool that allows an action (or actions) to be " +"triggered when you apply a commit to your git repository." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:236 +msgid "Pre-commit hook example workflow" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:238 +msgid "The precommit workflow looks like this: You type and run:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:241 +msgid "`git commit -m \"message here\"` at the command line" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:243 +msgid "" +"Once you hit return, pre-commit will run any tools that you have " +"configured in a **.pre-commit-config.yaml** file." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:245 +msgid "" +"If the tools configured in the pre-commit hook run successfully without " +"making changes or finding errors in your code, the commit will be applied" +" to the repository." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:249 +msgid "" +"If the tools configured in the hook find errors in your files, the commit" +" will NOT be applied to the repository. Remember from the discussion " +"above that a code formatter like Black will run and reformat your code. A" +" linter like _flake8_ will provide you with some output that details " +"where there are syntax issues in your code. You will then need to fix " +"those issues, manually." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:256 +msgid "" +"Once all of the fixes are applied you can re-add (stage) the files to be " +"commit. And re-run your commit." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:260 +msgid "Diagram showing the steps of a pre-commit workflow from left to right." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:262 +msgid "" +"The pre-commit workflow begins with you adding files that have changes to" +" be staged in git. Next, you'd run git commit. when you run git commit, " +"the pre-commit hooks will then run. In this example, Black, the code " +"formatter and flake8, a linter both run. If all of the files pass Black " +"and flake8 checks, then your commit will be recorded. If they don't, the " +"commit is canceled. You will have to fix any flake8 issues, and then re-" +"add / stage the files to be committed. [_Image " +"Source_](https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-" +"using-black-and-flake8/*)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:275 +msgid "" +"If have a Python code-base and multiple maintainers actively working on " +"the code, and you intend to run a tool like Black, be sure to coordinate " +"across your team. An initial commit that applies Black to your entire " +"package will likely change a significant amount of your code. This could " +"lead to merge conflicts on open and new PR's before the new changes are " +"merged." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:282 +msgid "General pre commit checks" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:284 +msgid "" +"In addition to calling tools, Pre-commit also has a suite of [built in " +"format hooks](https://github.com/pre-commit/pre-commit-hooks#hooks-" +"available) that you can call. Some, such as trailing-whitespace can be " +"also useful to add to your pre-commit workflow to ensure clean, " +"streamlined code files." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:289 +msgid "" +"An example pre-commit-config.yaml file is below with examples of how this" +" is all setup." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:292 +msgid "Pre-commit.ci" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:294 +msgid "" +"[Pre-commit.ci](https://pre-commit.ci) is a bot that may become your new " +"best friend. This bot, when setup on a repo can be configured to do the " +"following:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:297 +msgid "It will check every pull request using all of the pre-commit hook setting" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:298 +msgid "" +"If you wish, it will also submit a pull request to your repo with pre-" +"commit fixes, saving you, and new contributors the time of reformatting a" +" pr that has format issues." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:301 +msgid "You can also call the bot on any pull request to run / and fix the code." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:303 +msgid "" +"The pre-commit.ci bot uses the same pre-commit-config.yaml file that you " +"use to setup pre-commit locally." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:306 +msgid "Setting up a bot like this can be valuable because:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:308 +msgid "" +"It can make is easier for maintainers as they no longer have to worry at " +"allows about fixing code format. The bot will do the work for them." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:310 +msgid "" +"It can make it easier for new comers as they never have to setup pre-" +"commit locally or worry about linting their code. They can even make " +"small fixes to the code directly on GitHub without worry." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:312 +msgid "Setting up a git pre-commit hook" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:314 +msgid "To setup pre-commit locally, you need to do 3 things:" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:316 +msgid "" +"Install pre-commit (and include it as a development requirement in your " +"repository)" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:326 +msgid "" +"Create a .pre-commit-config.yaml file in the root of your package " +"directory." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:328 +msgid "" +"Below is an example **.pre-commit-cofig.yaml** file that can be used to " +"setup the pre-commit hook and the pre-commit.ci bot if you chose to " +"implement that too." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:336 +msgid "" +"This file specifies a hook that will be triggered automatically before " +"each `git commit`, in this case, it specifies a `flake8` using version " +"`6.0.0`." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:339 +msgid "" +"Install your pre-commit hook(s) using `pre-commit install`. This will " +"install all of the hooks specified in the pre-commit yaml file into your " +"environment." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:341 +msgid "" +"Once you have done the above, you are ready to start working on your " +"code. Pre-commit will run every time you run `git commit`." +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:344 +msgid "Summary" +msgstr "" + +#: ../../package-structure-code/code-style-linting-format.md:346 +msgid "" +"pyOpenSci suggests setting up a linter and a code styler for your " +"package, regardless of whether you use pre-commit hooks, CI or other " +"infrastructure to manage code format. Setting up these tools will give " +"you automatic feedback about your code's structure as you (or a " +"contributor) write it. And using a tool like black that format code for " +"you, reduce effort that you need to make surrounding decisions around " +"code format and style." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:1 +msgid "Complex Python package builds" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:3 +msgid "" +"This guide is focused on packages that are either pure-python or that " +"have a few simple extensions in another language such as C or C++." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:6 +msgid "" +"In the future, we want to provide resources for packaging workflows that " +"require more complex builds. If you have questions about these types of " +"package, please [add a question to our " +"discourse](https://pyopensci.discourse.group/) or open an [issue about " +"this guide specifically in the GitHub repo for this " +"guide](https://github.com/pyOpenSci/python-package-guide/issues). There " +"are many nuances to building and distributing Python packages that have " +"compiled extensions requiring non-Python dependencies at build time. For " +"an overview and thorough discussion of these nuances, please see [this " +"site.](https://pypackaging-native.github.io/)" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:8 +msgid "Pure Python Packages vs. packages with extensions in other languages" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:10 +msgid "" +"You can classify Python package complexity into three general categories." +" These categories can in turn help you select the correct package " +"frontend and backend tools." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:14 +msgid "" +"**Pure-python packages:** these are packages that only rely on Python to " +"function. Building a pure Python package is simpler. As such, you can " +"chose a tool below that has the features that you want and be done with " +"your decision!" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:16 +msgid "" +"**Python packages with non-Python extensions:** These packages have " +"additional components called extensions written in other languages (such " +"as C or C++). If you have a package with non-Python extensions, then you " +"need to select a build backend tool that allows additional build steps " +"needed to compile your extension code. Further, if you wish to use a " +"frontend tool to support your workflow, you will need to select a tool " +"that supports additional build setups. We suggest that you chose build " +"tool that supports custom build steps like Hatch." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:18 +msgid "" +"**Python packages that have extensions written in different languages " +"(e.g. Fortran and C++) or that have non Python dependencies that are " +"difficult to install (e.g. GDAL)** These packages often have complex " +"build steps (more complex than a package with just a few C extensions for" +" instance). As such, these packages require tools such as [scikit-" +"build](https://scikit-build.readthedocs.io/en/latest/) or [meson-" +"python](https://mesonbuild.com/Python-module.html) to build. NOTE: you " +"can use meson-python with PDM." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:21 +msgid "Mixing frontend and backend projects" +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:23 +msgid "" +"It is sometimes necessary or desirable to use a build frontend with an " +"alternative build-backend. This is because some frontends do not have a " +"default backend (`build`), and this choice is placed on the maintainer. " +"Other backends (`hatch`) have a preferred backend (`hatchling`) but allow" +" the maintainer to migrate to another, while some backends (`poetry`) " +"only work with a single backend (`poetry-core`). Refer to (#python-" +"package-build-tools) for more information about frontend and backend " +"compatibility." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:29 +msgid "" +"In this packaging guide we recommend using `hatch` along with its " +"preferred backend `hatchling`. While this will be suitable for most " +"packages, an alternate backend may be used with Hatch if needed when " +"creating an extension module. A Python extension module is one that is " +"made up, either in part or entirely, of compiled code. In this case the " +"backend chosen (such as `meson-python`) must know how to compile the " +"extension language and bind it to Python. `hatchling` does not know how " +"to do this all on its own and must either make use of " +"[plugins](https://hatch.pypa.io/1.9/plugins/about/) or be replaced by a " +"backend that is already capable of building extension modules." +msgstr "" + +#: ../../package-structure-code/complex-python-package-builds.md:37 +msgid "" +"In order to use a different backend you will need to edit your project's " +"`pyproject.toml`. If you have a `pyproject.toml` generated by the `hatch`" +" command, or from following the packaging tutorial, you may have to make " +"a change like this" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:8 +#: ../../package-structure-code/declare-dependencies.md:375 +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:25 +msgid "Todo" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:10 +msgid "" +"keep this comment - https://github.com/pyOpenSci/python-package-" +"guide/pull/106#issuecomment-1844278487 in this file for now - jeremiah " +"did a nice inventory of common shells and whether they need quotes or " +"not. it's really comprehensive. but do we want it in the guide?? it's " +"really useful for more advanced users i think." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:12 +msgid "" +"Following this comment: https://github.com/pyOpenSci/python-package-" +"guide/pull/106#pullrequestreview-1766663571" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:15 +msgid "Jonny will add a section that talks about:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:17 +msgid "" +"Why you specify dependencies How to specify dependencies When you use " +"different specifiers" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:22 +msgid "Python Package Dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:24 +msgid "What is a package dependency?" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:26 +msgid "" +"A Python package dependency refers to an external package or software " +"that your Python project:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:29 +msgid "needs to function properly." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:30 +msgid "" +"requires if someone wants to develop / work on improving your package " +"locally or" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:31 +msgid "" +"requires if a user wants to add additional functionality (that is not " +"core) to your package" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:33 +msgid "" +"A dependency is not part of your project's codebase. It is a package or " +"software that is called within the code of your project or during " +"development of your package." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:37 +msgid "Understanding optional vs. required dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:38 +msgid "" +"You can think about dependencies as being either optional or required. If" +" they are required, they will be listed in the `[dependency] =` table of " +"your `pyproject.toml` file. If they are optional, they will be listed in " +"the `[optional.dependencies]` table of your `pyproject.toml`." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:40 +msgid "You will learn about both below." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:46 +msgid "" +"There are two broad groups of Python package dependencies: those that are" +" optional and those that are required. Required packages are those that a" +" user needs to use your package. Optional dependencies are packages a " +"user can chose to install to add functionality to your package. Within " +"those 2 groups, there are three use cases that you can think about. 1. " +"Core dependencies are **required** for a user to use your package. 2. " +"Development dependencies are optional and only needed if someone wants to" +" work on your package locally. 3. Finally feature dependencies are " +"optional and add additional functionality to your package. Not all " +"packages will have feature dependencies." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:51 +msgid "Required (or core) dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:53 +msgid "" +"Required dependencies are called directly within your package's code. On " +"this page we refer to these dependencies as **core dependencies** as they" +" are needed in order to run your package. You should place your core or " +"required dependencies in the `[dependency]=` table of your " +"`pyproject.toml` file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:56 +#: ../../package-structure-code/declare-dependencies.md:147 +msgid "Optional dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:58 +msgid "" +"Optional dependencies dependencies can be optionally installed by users " +"depending upon their needs. There are two broad groups of optional " +"dependencies:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:61 +msgid "" +"**Development dependencies**: These are dependencies that are required to" +" support development of your package. They include tools to run tests " +"such as `pytest`, linters (like `flake8` and `ruff`) and code formatters " +"such as `black` and even automation tools such as `nox` or `tox` that run" +" tasks." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:63 +msgid "" +"**Feature dependencies:** These are dependencies that a user can chose to" +" install to add functionality to your package." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:65 +msgid "" +"When a Python project is installed, the Python package manager (either " +"`pip` or `conda`) installs your package's dependencies automatically. " +"This ensures that when you call a function in a specific dependency, it " +"is available in your user's environment." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:70 +msgid "Dependencies can be added to your pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:72 +msgid "" +"In the [pyproject.toml overview page](pyproject-toml-python-package-" +"metadata), you learned how to set up a **pyproject.toml** file with basic" +" metadata for your package. On this page, you will learn how to specify " +"different types of dependencies in your `pyproject.toml`." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:79 +msgid "How do you declare dependencies?" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:81 +msgid "" +"We recommend that you declare your dependencies using your " +"`pyproject.toml` file. This ensures that all of the metadata associated " +"with your package is declared in a single place, making it simpler for " +"users and contributors to understand your package infrastructure." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:86 +msgid "" +"Previously, it was common to use a `requirements.txt` file to declare " +"package dependencies. However in recent years, the ecosystem has moved to" +" storing this information in your **pyproject.toml** file. You may notice" +" however that some projects still maintain a `requirements.txt` file for " +"specific local development needs." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:92 +msgid "Other ways you may see packages storing dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:95 +msgid "" +"If a project contains extensions written in other languages, you may need" +" a `setup.py` file. Or you may contribute to a package that us using " +"`setup.cfg` for dependency declaration. [Learn more about this in the " +"setuptools " +"documentation](https://setuptools.pypa.io/en/latest/userguide/dependency_management.html" +"#declaring-required-dependency)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:100 +msgid "Add required dependencies to your pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:102 +msgid "" +"Your core project dependencies need to be installed by a package manager " +"such as `pip` or `conda` when a user installs your package. You can add " +"those dependencies to the `dependencies` array located within the " +"`[project]` table of your **pyproject.toml** file. This looks something " +"like this:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:121 +msgid "" +"Ideally, you should only list the packages that are necessary to install " +"and use your package in the `[dependencies]` section. This minimizes the " +"number of additional packages that your users must install as well as the" +" number of packages that depend upon your package must also install." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:128 +msgid "" +"Remember that fewer dependencies to install reduces the likelihood of " +"version mismatches in user environments." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:131 +msgid "A dependency example" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:133 +msgid "" +"Let's pretend you have a package called `plotMe` that creates beautiful " +"plots of data stored in `numpy` arrays. To create your plots in the " +"`plotMe` package, you use the `seaborn` package to stylize our plots and " +"also `numpy` to process array formatted data." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:135 +msgid "In the example above, the plotMe package, depends upon two packages:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:137 +msgid "seaborn" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:138 +msgid "numpy" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:140 +msgid "" +"This means that in order for plotMe to work in a user's `environment` " +"when installed, you also need to ensure that they have both of those " +"required `dependencies` installed in their environment too." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:142 +msgid "" +"Declaring a dependency in your `pyproject.toml` file will ensure that it " +"is listed as a required dependency when your package is published to PyPI" +" and that a package manager (`pip` or `conda`) will automatically install" +" it into a user's environment alongside your package:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:144 +msgid "`python -m pip install plotMe`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:149 +msgid "" +"Optional dependencies for building your documentation, running your tests" +" and building your package's distribution files are often referred to as " +"development dependencies. These are the dependencies that a user needs to" +" work on your package locally and perform tasks such as:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:151 +msgid "running your test suite" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:152 +msgid "building your documentation" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:153 +msgid "linting and other code cleanup tools" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:155 +msgid "" +"These dependencies are considered optional, because they are not required" +" to install and use your package. Feature dependencies are considered " +"optional and should also be placed in the `[optional.dependencies]` " +"table." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:158 +msgid "" +"Optional dependencies can be stored in an `[optional.dependencies]` table" +" in your **pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:161 +msgid "" +"It's important to note that within the `[optional.dependencies]` table, " +"you can store additional, optional dependencies within named sub-groups. " +"This is a different table than the dependencies array located within the " +"`[project]` table discussed above which contains a single array with a " +"single list of required packages." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:163 +msgid "Create optional dependency groups" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:165 +msgid "To declare optional dependencies in your **pyproject.toml** file:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:167 +msgid "Add a `[optional.dependencies]` table to your **pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:168 +msgid "Create named groups of dependencies using the syntax:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:170 +msgid "`group-name = [\"dep1\", \"dep2\"]`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:172 +msgid "Installing packages from GitHub / Gitlab" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:175 +msgid "" +"If you have dependencies that need to be installed directly from GitHub " +"using a `git+https` installation approach, you can do so using the " +"pyproject.toml file like so:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:185 +msgid "" +"IMPORTANT: For security reasons, if your library depends on a GitHub-" +"hosted project, you will need to point to a specific commit/tag/hash of " +"that repository in order to upload your project to PyPI" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:190 +msgid "" +"Below we've created three sets of optional development dependencies " +"named: tests, docs and lint. We've also added a set of feature " +"dependencies." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:213 +msgid "Additional dependency resources" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:215 +msgid "" +"[Learn more: View PyPA's overview of declaring optional " +"dependencies](https://packaging.python.org/en/latest/specifications" +"/declaring-project-metadata/#dependencies-optional-dependencies)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:217 +msgid "" +"[Dependency " +"specifiers](https://packaging.python.org/en/latest/specifications" +"/dependency-specifiers/)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:221 +msgid "Install dependency groups" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:226 +msgid "" +"Diagram showing a ven diagram with three sections representing the " +"dependency groups listed above - docs feature and tests. In the center it" +" says your-package and lists the core dependencies of that package " +"seaborn and numpy. To the right are two arrows. The first shows the " +"command python - m pip install your-package. it them shows how installing" +" your package that way installs only the package and the two core " +"dependencies into a users environment. Below is a second arrow with " +"python -m pip install youPackage[tests]. This leads to an environment " +"with both the package dependencies - your-package, seaborn and numpy and " +"also the tests dependencies including pytest and pytest-cov" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:228 +msgid "" +"When a user installs your package locally using python -m pip install " +"your-package only your package and it's core dependencies get installed. " +"When they install your package `[tests]` pip will install both your " +"package and its core dependencies plus any of the dependencies listed " +"within the tests array of your `[optional.dependencies]` table." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:231 +msgid "Using `python -m pip install` vs. `pip install`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:233 +msgid "" +"In all of the examples in this guide, you will notice we are calling " +"`pip` using the syntax:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:236 +msgid "`python -m pip`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:238 +msgid "" +"Calling pip using `python -m` ensures that the `pip` that you are using " +"to install your package comes from your current active Python " +"environment. We strongly suggest that you use this approach whenever you " +"call `pip` to avoid installation conflicts." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:242 +msgid "" +"To ensure this works as you want it to, activate your package's " +"development environment prior to installing anything using `pip`." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:246 +msgid "" +"You can install development dependencies using the groups that you " +"defined above using the syntax:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:249 +msgid "`python -m pip install \".[docs]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:251 +msgid "Above you install:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:252 +msgid "dependencies needed for your documentation (`docs`)," +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:253 +msgid "required package dependencies in the `dependency` array and" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:254 +msgid "your package" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:256 +msgid "" +"using pip. Below you install your package, required dependencies and " +"optional test dependencies." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:259 +#: ../../package-structure-code/declare-dependencies.md:277 +msgid "`python -m pip install \".[tests]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:261 +msgid "" +"You can install multiple dependency groups in the " +"`[optional.dependencies]` table using:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:263 +msgid "`python -m pip install \".[docs, tests, lint]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:266 +msgid "For zsh shell users" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:270 +msgid "" +"There are different shell applications that you and your package " +"contributors might use." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:271 +msgid "zsh is the shell that comes by default on newer Mac OS computers" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:272 +msgid "Windows users may use a tool such as git bash" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:274 +msgid "" +"Some shells don't support unquoted brackets (`[tests]`) which is why we " +"add quotes to the command in this guide like this:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:279 +msgid "" +"In some cases you may see commands without the quotes in guidebooks or " +"contributing guides like the example below:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:282 +msgid "`python -m pip install your-package[tests]`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:284 +msgid "" +"Calling your-package[tests] without the double quotes will work on some " +"shells *but not all*." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:287 +msgid "Combining sets of dependencies" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:289 +msgid "" +"Above we reviewed how to install dependencies from your `pyproject.toml`." +" In some cases you may want to group sets of dependencies like so:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:302 +msgid "" +"The above allows you to install both the tests and docs dependency lists " +"using the command:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:305 +msgid "`python -m pip install \".[dev]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:308 +msgid "When you install dependencies using the above syntax:" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:310 +msgid "`python -m pip install \".[tests, docs]\"`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:312 +msgid "`pip` will also install your package and its core dependencies." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:316 +msgid "Where does conda fit in?" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:319 +msgid "" +"The `pyproject.toml` file allows you to list any Python package published" +" on PyPI (or on GitHub/ GitLab) as a dependency. Once you create this " +"file, declare dependencies, [build your package](python-package-" +"distribution-files-sdist-wheel.md) and [publish your package to PyPI" +"](publish-python-package-pypi-conda.md), people can install both your " +"package and all of it's dependencies with one command." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:322 +msgid "`python -m pip install your-package`" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:324 +msgid "This works great if your package is pure-python (no other languages used)." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:326 +msgid "" +"Some packages, particularly in the scientific Python ecosystem, require " +"dependencies that are not written in Python. Conda was created to support" +" distribution of tools that have code written in both Python and " +"languages other than Python." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:329 +msgid "Support conda users with environment.yml files" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:331 +msgid "" +"The above workflow assumes that you want to publish your package on PyPI." +" And then you plan to publish to conda-forge (optionally), [by submitting" +" a recipe using grayskull](https://www.pyopensci.org/python-package-guide" +"/package-structure-code/publish-python-package-pypi-conda.html)." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:333 +msgid "" +"If you want to support conda users, you may want to also maintain a conda" +" environment that they can use to install your package. Maintaining a " +"conda environment will also help you test that your package installs as " +"you expect into a conda environment." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:336 +msgid "A note for conda users" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:339 +msgid "" +"If you use a conda environment for developing your tool, keep in mind " +"that when you install your package using `python -m pip install -e .` (or" +" using pip in general), dependencies will be installed from PyPI rather " +"than conda." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:341 +msgid "" +"Thus, if you are running a conda environment, installing your package in " +"\"editable\" mode risks dependency conflicts. This is particularly " +"important if you have a spatial package that requires geospatial system " +"libraries like GDAL or another system-level dependency." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:343 +msgid "" +"Alternatively, you can install your package using `python -m pip install " +"-e . --no-deps` to only install the package. And install the rest of your" +" dependencies using a conda environment file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:346 +msgid "Dependencies in Read the Docs" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:348 +msgid "" +"Now that you have your dependencies specified in your project, you can " +"use them to support other workflows such as publishing to Read the Docs." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:350 +msgid "" +"[Read the Docs](https://readthedocs.org) is a documentation platform with" +" a continuous integration / continuous deployment service that " +"automatically builds and publishes your documentation." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:352 +msgid "" +"If you are using Read the Docs to build your documentation, then you may " +"need to install your dependencies using a **readthedocs.yaml** file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:354 +msgid "" +"Below is an example of installing the **docs** section of your dependency" +" table in the pyproject.toml file within a readthedocs.yaml file." +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:366 +msgid "Read the Docs and Python packages" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:370 +msgid "" +"[Learn more about creating a `readthedocs.yaml` file here. " +"](https://docs.readthedocs.io/en/stable/config-file/index.html)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:371 +msgid "" +"If you want to install dependencies using Poetry in Read the Docs, [you " +"can learn more here.](https://docs.readthedocs.io/en/stable/build-" +"customization.html#install-dependencies-with-poetry)" +msgstr "" + +#: ../../package-structure-code/declare-dependencies.md:376 +msgid "This is hidden. TO" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Intro" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Python package structure" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "pyproject.toml Package Metadata" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Build Your Package" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Declare dependencies" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Package Build Tools" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Complex Builds" +msgstr "" + +#: ../../package-structure-code/intro.md:163 +msgid "Package structure & code style" +msgstr "" + +#: ../../package-structure-code/intro.md:177 +msgid "Publish with Conda / PyPI" +msgstr "" + +#: ../../package-structure-code/intro.md:177 +msgid "Package versions" +msgstr "" + +#: ../../package-structure-code/intro.md:177 +msgid "Code style" +msgstr "" + +#: ../../package-structure-code/intro.md:177 +msgid "Publishing a package" +msgstr "" + +#: ../../package-structure-code/intro.md:1 +msgid "Python package structure information" +msgstr "" + +#: ../../package-structure-code/intro.md:3 +msgid "" +"This section provides guidance on your Python package's structure, code " +"formats and style. It also reviews the various packaging tools that you " +"can use to support building and publishing your package." +msgstr "" + +#: ../../package-structure-code/intro.md:7 +msgid "" +"If you are confused by Python packaging, you are not alone! The good news" +" is there are some great modern packaging tools that ensure that you're " +"following best practices. Here, we review tool features and suggest tools" +" that might be best fitted for your workflow." +msgstr "" + +#: ../../package-structure-code/intro.md:19 +msgid "✨ 1. Package file structure ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:23 +msgid "" +"src layout, flat layout and where should tests folders live? No matter " +"what your level of packaging knowledge is, this page will help you decide" +" upon a package structure that follows modern python best practices." +msgstr "" + +#: ../../package-structure-code/intro.md:28 +msgid "✨ 2. Learn about building your package ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:32 +msgid "" +"To publish your Python package on PyPI, you will need to first build it. " +"The act of \"building\" refers to the process of placing your package " +"code and metadata into a format that can be published on PyPI. Learn more" +" about building your Python package." +msgstr "" + +#: ../../package-structure-code/intro.md:41 +msgid "✨ 4. Add metadata ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:45 +msgid "" +"Learn how to add project metadata to your Python package to support both " +"filtering on PyPI and also the metadata that a package installer needs to" +" build and install your package." +msgstr "" + +#: ../../package-structure-code/intro.md:52 +msgid "✨ 3. What Python package tool should you use? ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:56 +msgid "" +"Learn more about the suite of packaging tools out there. And learn which " +"tool might be best for you." +msgstr "" + +#: ../../package-structure-code/intro.md:62 +msgid "✨ 4. Publish to PyPI and Conda ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:66 +msgid "" +"If you have a pure Python package, it's a straight forward process to " +"publish to both PyPI and then a Conda channel such as conda-forge. Learn " +"more here." +msgstr "" + +#: ../../package-structure-code/intro.md:73 +msgid "✨ 5. Setup package versioning ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:77 +msgid "" +"Semver (numeric versioning) and Calver (versioning using the date) are 2 " +"common ways to version a package. Which one should you pick? Learn more " +"here." +msgstr "" + +#: ../../package-structure-code/intro.md:83 +msgid "✨ 6. Code style & linters ✨" +msgstr "" + +#: ../../package-structure-code/intro.md:87 +msgid "" +"Black, blue, flake8, Ruff - which tools can help you ensure your package " +"follows best practices for code format? Learn more about the options and " +"why this is important here." +msgstr "" + +#: ../../package-structure-code/intro.md:95 +msgid "" +"Figure showing a decision tree with the various packaging tool front-end " +"and back-end options." +msgstr "" + +#: ../../package-structure-code/intro.md:97 +msgid "" +"Diagram showing the various front-end build tools that you can select " +"from. See the packaging tools page to learn more about each tool." +msgstr "" + +#: ../../package-structure-code/intro.md:102 +msgid "" +"If you are considering submitting a package for peer review, have a look " +"at the bare-minimum [editor checks](https://www.pyopensci.org/software-" +"peer-review/how-to/editor-in-chief-guide.html#editor-checklist-template) " +"that pyOpenSci performs before a review begins. These checks are useful " +"to explore for both authors planning to submit a package to us for review" +" and for anyone who is just getting started with creating a Python " +"package." +msgstr "" + +#: ../../package-structure-code/intro.md:109 +msgid "What you will learn here" +msgstr "" + +#: ../../package-structure-code/intro.md:111 +msgid "In this section of our Python packaging guide, we:" +msgstr "" + +#: ../../package-structure-code/intro.md:113 +msgid "" +"Provide an overview of the options available to you when packaging your " +"tool." +msgstr "" + +#: ../../package-structure-code/intro.md:115 +msgid "" +"Suggest tools and approaches that both meet your needs and also support " +"existing standards." +msgstr "" + +#: ../../package-structure-code/intro.md:117 +msgid "" +"Suggest tools and approaches that will allow you to expand upon a " +"workflow that may begin as a pure Python tool and evolve into a tool that" +" requires addition layers of complexity in the packaging build." +msgstr "" + +#: ../../package-structure-code/intro.md:120 +msgid "" +"Align our suggestions with the most current, accepted [PEPs (Python " +"Enhancement Protocols)](https://peps.python.org/pep-0000/) and the " +"[Scientific Python community SPECs](https://scientific-" +"python.org/specs/)." +msgstr "" + +#: ../../package-structure-code/intro.md:123 +msgid "" +"In an effort to maintain consistency within our community, we also align " +"with existing best practices being implemented by developers of core " +"Scientific Python packages such as Numpy, SciPy and others." +msgstr "" + +#: ../../package-structure-code/intro.md:127 +msgid "Guidelines for pyOpenSci's packaging recommendations" +msgstr "" + +#: ../../package-structure-code/intro.md:129 +msgid "" +"The flexibility of the Python programming language lends itself to a " +"diverse range of tool options for creating a Python package. Python is so" +" flexible that it is one of the few languages that can be used to wrap " +"around other languages. The ability of Python to wrap other languages is " +"one the reasons you will often hear Python described as a [\"glue\" " +"language](https://numpy.org/doc/stable/user/c-info.python-as-glue.html)\"" +msgstr "" + +#: ../../package-structure-code/intro.md:135 +msgid "" +"If you are building a pure Python package, then your packaging setup can " +"be simple. However, some scientific packages have complex requirements as" +" they may need to support extensions or tools written in other languages " +"such as C or C++." +msgstr "" + +#: ../../package-structure-code/intro.md:139 +msgid "" +"To support the many different uses of Python, there are many ways to " +"create a Python package. In this guide, we suggest packaging approaches " +"and tools based on:" +msgstr "" + +#: ../../package-structure-code/intro.md:142 +msgid "" +"What we think will be best and easiest to adopt for those who are newer " +"to packaging." +msgstr "" + +#: ../../package-structure-code/intro.md:144 +msgid "Tools that we think are well maintained and documented." +msgstr "" + +#: ../../package-structure-code/intro.md:145 +msgid "" +"A shared goal of standardizing packaging approaches across this " +"(scientific) Python ecosystem." +msgstr "" + +#: ../../package-structure-code/intro.md:148 +msgid "" +"Here, we also try to align our suggestions with the most current, " +"accepted [Python community](https://packaging.python.org/en/latest/) and " +"[scientific community](https://scientific-python.org/specs/)." +msgstr "" + +#: ../../package-structure-code/intro.md:151 +msgid "Suggestions in this guide are not pyOpenSci review requirements" +msgstr "" + +#: ../../package-structure-code/intro.md:154 +msgid "" +"The suggestions for package layout in this section are made with the " +"intent of being helpful; they are not specific requirements for your " +"package to be reviewed and accepted into our pyOpenSci open source " +"ecosystem." +msgstr "" + +#: ../../package-structure-code/intro.md:158 +msgid "" +"Please check out our [package scope page](https://www.pyopensci.org" +"/software-peer-review/about/package-scope.html) and [review requirements " +"in our author guide](https://www.pyopensci.org/software-peer-review/how-" +"to/author-guide.html#) if you are looking for pyOpenSci's Python package " +"review requirements!" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:1 +msgid "Publishing Your Package In A Community Repository: PyPI or Anaconda.org" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:5 +msgid "" +"pyOpenSci requires that your package has an distribution that can be " +"installed from a public community repository such as PyPI or a conda " +"channel such as `bioconda` or `conda-forge` on Anaconda.org." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:9 +msgid "" +"Below you will learn more about the various publishing options for your " +"Python package." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:14 +msgid "" +"Installing packages in the same environment using both pip and conda can " +"lead to package conflicts." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:16 +msgid "" +"To minimize conflicts for users who may be using conda (or pip) to manage" +" local environments, consider publishing your package to both PyPI and " +"the conda-forge channel on Anaconda.org." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:18 +msgid "" +"Below you will learn more specifics about the differences between PyPI " +"and conda publishing of your Python package." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:24 +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:6 +msgid "" +"Image showing the progression of creating a Python package, building it " +"and then publishing to PyPI and conda-forge. You take your code and turn " +"it into distribution files (sdist and wheel) that PyPI accepts. then " +"there is an arrow towards the PyPI repository where ou publish both " +"distributions. From PyPI if you create a conda-forge recipe you can then " +"publish to conda-forge." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:26 +msgid "" +"Once you have published both package distributions (the source " +"distribution and the wheel) to PyPI, you can then publish to conda-forge." +" conda-forge requires a source distribution on PyPI in order to build " +"your package on conda-forge. You do not need to rebuild your package to " +"publish to conda-forge." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:29 +msgid "What is PyPI" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:31 +msgid "" +"[PyPI](https://pypi.org/) is an online Python package repository that you" +" can use to both find and install and publish your Python package. There " +"is also a test PyPI repository where you can test publishing your package" +" prior to the final publication on PyPI." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:36 +msgid "" +"Many if not most Python packages can be found on PyPI and are thus " +"installable using `pip`." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:38 +msgid "" +"The biggest different between using pip and conda to install a package is" +" that conda can install any package regardless of the language(s) that it" +" is written in. Whereas `pip` can only install Python packages." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:43 +msgid "Click here for a tutorial on publishing your package to PyPI." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:52 +msgid "" +"On the package build page, we discussed the [two package distribution " +"types that you will create when making a Python package](python-package-" +"distribution-files-sdist-wheel): SDist (packaged as a .tar.gz or .zip) " +"and Wheel (.whl) which is really a zip file. Both of those file " +"\"bundles\" will be published on PyPI when you use [a standard build tool" +"](python-package-build-tools) to build your package." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:60 +msgid "What is conda and Anaconda.org?" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:62 +msgid "" +"conda is an open source package and environment management tool. conda " +"can be used to install tools from the [Anaconda " +"repository](https://repo.anaconda.com/)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:66 +msgid "" +"Anaconda.org contains public and private repositories for packages. These" +" repositories are known as channels (discussed below)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:69 +msgid "A brief history of conda's evolution" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:72 +msgid "" +"The conda ecosystem evolved years ago to provide support for, and " +"simplify the process of, managing software dependencies in scientific " +"Python projects." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:76 +msgid "" +"Many of the core scientific Python projects depend upon or wrap around " +"tools and extensions that are written in other languages, such as C++. In" +" the early stages of the scientific ecosystem's development, these non-" +"Python extensions and tools were not well supported on PyPI, making " +"publication difficult. In recent years there is more support for complex " +"builds that allow developers to bundle non-Python code into a Python " +"distribution using the [wheel distribution format](python-wheel)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:78 +msgid "" +"Conda provides a mechanism to manage these dependencies and ensure that " +"the required packages are installed correctly." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:82 +msgid "" +"While conda was originally created to support Python packages, it is now " +"used across all languages. This cross-language support makes it easier " +"for some packages to include and have access to tools written in other " +"languages, such as C/C++ (gdal), Julia, or R. Creating an environment " +"that mixes all of these packages is usually easier and more consistent " +"with full-fledged package managers like conda." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:90 +msgid "conda channels" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:92 +msgid "" +"conda built packages are housed within repositories that are called " +"channels. The conda package manager can install packages from different " +"channels." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:95 +msgid "" +"There are several core public channels that most people use to install " +"packages using conda, including:" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:98 +msgid "" +"**defaults:** this is a channel managed by Anaconda. It is the version of" +" the Python packages that you will install if you install the Anaconda " +"Distribution. Anaconda (the company) decides what packages live on the " +"`defaults` channel." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:99 +msgid "" +"[**conda-forge:**](https://anaconda.org/conda-forge) this is a community-" +"driven channel that focuses on scientific packages. This channel is ideal" +" for tools that support geospatial data. Anyone can publish a package to " +"this channel." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:100 +msgid "" +"[**bioconda**](https://anaconda.org/bioconda): this channel focuses on " +"biomedical tools." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:102 +msgid "" +"**conda-forge** emerged as many of the scientific packages did not exist " +"in the `defaults` Anaconda channel." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:107 +msgid "" +"Graphic with the title Python package repositories. Below it says " +"Anything hosted on PyPI can be installed using pip install. Packaging " +"hosted on a conda channel can be installed using conda install. Below " +"that there are two rows. the top row says conda channels. next to it are " +"three boxes one with conda-forge, community maintained; bioconda and then" +" default - managed by the anaconda team. Below that there is a row that " +"says PyPI servers. PyPI - anyone can publish to PyPI. and test PyPI. a " +"testbed server for you to practice." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:109 +msgid "" +"Conda channels represent various repositories that you can install " +"packages from. Because conda-forge is community maintained, anyone can " +"submit a recipe there. PyPI is also a community maintained repository. " +"Anyone can submit a package to PyPI and test PyPI. Unlike conda-forge " +"there are no manual checks of packages submitted to PyPI." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:113 +msgid "conda channels, PyPI, conda, pip - Where to publish your package" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:115 +msgid "" +"You might be wondering why there are different package repositories that " +"can be used to install Python packages." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:118 +msgid "" +"And more importantly you are likely wondering how to pick the right " +"repository to publish your Python package." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:121 +msgid "The answer to both questions relates dependency conflicts." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:125 +msgid "" +"Image showing an XKCD comic that shows a web of Python environments and " +"tools and installations. At the bottom is says - My python environment " +"has become so degraded that my laptop has been declared a superfund site." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:127 +msgid "" +"Installing Python and Python packages from different repositories can " +"lead to environment conflicts where a version of on package doesn't work " +"with a version of another package. To keep your environments clean and " +"working, it's best to install packages from the same repository. So use " +"pip to install everything. Or use conda. If you can, try to avoid " +"installing package from both pip and conda into the same environment." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:135 +msgid "Managing Python package dependency conflicts" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:137 +msgid "" +"Python environments can encounter conflicts because Python tools can be " +"installed from different repositories. Broadly speaking, Python " +"environments have a smaller chance of dependency conflicts when the tools" +" are installed from the same package repository. Thus environments that " +"contain packages installed from both pip and conda are more likely to " +"yield dependency conflicts." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:144 +msgid "" +"Similarly installing packages from the default anaconda package mixed " +"with the conda-forge channel can also lead to dependency conflicts." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:146 +msgid "" +"Many install packages directly from conda `defaults` channel. However, " +"because this channel is managed by Anaconda, the packages available on it" +" are limited to those that Anaconda decides should be core to a stable " +"installation. The conda-forge channel was created to complement the " +"`defaults` channel. It allows anyone to submit a package to be published " +"in the channel . Thus, `conda-forge` channel ensures that a broad suite " +"of user-developed community packages can be installed from conda." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:150 +msgid "" +"Take-aways: If you can, publish on both PyPI and conda-forge to " +"accommodate more users of your package" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:152 +msgid "" +"The take-away here for maintainers is that if you anticipate users " +"wanting to use conda to manage their local environments (which many do), " +"you should consider publishing to both PyPI and the conda-forge channel " +"(_more on that below_)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:157 +msgid "Additional resources" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:158 +msgid "" +"[learn more about why conda-forge was created, here](https://conda-" +"forge.org/docs/user/introduction.html)" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:160 +msgid "" +"[To learn more about conda terminology, check out their " +"glossary.](https://docs.conda.io/projects/conda/en/latest/glossary.html )" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:165 +msgid "How to submit to conda-forge" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:167 +msgid "" +"While pyOpenSci doesn't require you to add your package to conda-forge, " +"we encourage you to consider doing so!" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:170 +msgid "" +"Once your package is on PyPI, the process to add your package to conda-" +"forge is straight forward to do. [You can follow the detailed steps " +"provided by the conda-forge maintainer team.](https://conda-" +"forge.org/docs/maintainer/adding_pkgs.html)." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:175 +msgid "Click here for a tutorial on adding your package to conda-forge." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:182 +msgid "If you want a step by step tutorial, click here." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:185 +msgid "" +"Once your package is added, you will have a feedstock repository on " +"GitHub with your packages name" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:188 +msgid "" +"[Here is an example conda-forge feedstock for the pyOpenSci approved " +"package - movingpandas](https://github.com/conda-forge/movingpandas-" +"feedstock)" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:191 +msgid "Maintaining your conda-forge package repository" +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:193 +msgid "" +"Once your package is on the conda-forge channel, maintaining it is " +"simple. Every time that you push a new version of your package to PyPI, " +"it will kick off a continuous integration build that updates your package" +" in the conda-forge repository. Once that build is complete, you will get" +" a notification to review the update." +msgstr "" + +#: ../../package-structure-code/publish-python-package-pypi-conda.md:199 +msgid "" +"You can merge the pull request for that update once you are happy with " +"it. A ready-to-merge PR usually means ensuring that your project's " +"dependencies (known as runtime requirements) listed in the updated YAML " +"file found in the pull request match the PyPI metadata of the new " +"release." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:1 +msgid "Use a pyproject.toml file for your package configuration & metadata" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:12 +msgid "Important pyproject.toml take aways" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:16 +msgid "" +"There are only two tables that are required for an installable Python " +"package: **[build-system]** and **[project]**. The **[project]** table " +"stores your package's metadata." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:17 +msgid "" +"There are only two _required_ fields in the **[project]** table: " +"**name=** and **version=**." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:18 +msgid "" +"We suggest you add additional metadata to your `pyproject.toml` file as " +"it will make it easier for users to find your project on PyPI." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:19 +msgid "" +"When you are adding classifiers to the [project] table, only use valid " +"values from [PyPI’s classifier page](https://PyPI.org/classifiers/). An " +"invalid value here will raise an error when you build your package or " +"publish to PyPI." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:20 +msgid "" +"There is no specific order for tables in the `pyproject.toml` file. " +"However fields need to be placed within the correct table sections. For " +"example `requires =` always need to be associated with the **[build-" +"system]** table." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:21 +msgid "" +"**python-requires**: is important to have in your `pyproject.toml` file " +"as it helps pip install your package." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:27 +msgid "when these are published, remove this todo" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:36 +msgid "" +"Need help creating your pyproject.toml file? This tutorial will walk you" +" through the process." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:50 +msgid "" +"Click here if need help migrating from setup.py/setup.cfg to " +"pyproject.toml" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:60 +msgid "About the pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:62 +msgid "" +"Every modern Python package should include a `pyproject.toml` file. If " +"your project is pure Python and you're using a `setup.py` or `setup.cfg` " +"file to describe its metadata, you should consider migrating your " +"metadata and build information to a `pyproject.toml` file." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:64 +msgid "" +"If your project isn’t pure-python, you might still require a `setup.py` " +"file to build the non Python extensions. However, a `pyproject.toml` file" +" should still be used to store your project’s metadata." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:66 +msgid "What happened to setup.py & how do i migrate to pyproject.toml?" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:68 +msgid "" +"Prior to August 2017, Python package metadata was stored either in the " +"`setup.py` file or a `setup.cfg` file. In recent years, there has been a " +"shift to storing Python package metadata in a much more user-readable " +"`pyproject.toml` format. Having all metadata in a single file:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:70 +msgid "simplifies package management," +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:71 +msgid "" +"allows you to use a suite of different [build " +"backends](https://www.pyopensci.org/python-package-guide/package-" +"structure-code/python-package-build-tools.html#build-back-ends) such as " +"(flit-core, hatchling, pdm-build), and" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:72 +msgid "aligns with modern best practices." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:79 +msgid "" +"The standard file that Python packages use to [specify build requirements" +" and metadata is called a " +"**pyproject.toml**](https://packaging.python.org/en/latest/specifications" +"/declaring-project-metadata/). Adding metadata, build requirements and " +"package dependencies to a **pyproject.toml** file replaces storing that " +"information in a setup.py or setup.cfg file." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:84 +msgid "About the .toml format" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:86 +msgid "" +"The **pyproject.toml** file is written in [TOML (Tom's Obvious, Minimal " +"Language) format](https://toml.io/en/). TOML is an easy-to-read structure" +" that is founded on key/value pairs. Each section in the " +"**pyproject.toml** file contains a `[table identifier]`. Below that table" +" identifier are key/value pairs that support configuration for that " +"particular table." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:90 +msgid "Below `[build-system]` is considered a table in the toml language." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:91 +msgid "Within the `build-system` table below `requires =` is a key." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:92 +msgid "" +"The associated value for `requires` is an array containing the value " +"`\"hatchling\"`." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:100 +msgid "How the pyproject.toml is used when you build a package" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:104 +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:81 +msgid "" +"When you publish to PyPI, you will notice that each package has metadata " +"listed. Let’s have a look at [xclim](https://pypi.org/project/xclim/), " +"one of our [pyOpenSci packages](https://www.pyopensci.org/python-" +"packages.html). Notice that on the PyPI landing page you see some " +"metadata about the package including python, maintainer information and " +"more. PyPI is able to populate this metadata because it was defined using" +" correct syntax and classifiers by Xclim's maintainers, [pyproject.toml " +"file](https://github.com/Ouranosinc/xclim/blob/master/pyproject.toml). " +"This metadata when the xclim package is built, is translated into a " +"distribution file that allows PyPI to read the metadata and print it out " +"on their website." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:106 +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:83 +msgid "" +"Image showing the left side bar of PyPI for the package xclim. The " +"section at the top says Classifier. Below there is a list of items " +"including Development status, intended audience, License, natural " +"language, operating system, programming language and topic. Below each of" +" those sections are various classifier options.\" width=\"300px\">" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:111 +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:88 +msgid "" +"When you add the classifier section to your pyproject.toml and your " +"package is built, the build tool organizes the metadata into a format " +"that PyPI can understand and represent on your PyPI landing page. These " +"classifiers also allow users to sort through packages by version of " +"python they support, categories and more." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:116 +msgid "Benefits of using a pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:118 +msgid "" +"Including your package's metadata in a separate human-readable " +"**pyproject.toml** format also allows someone to view the project's " +"metadata in a GitHub repository." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:126 +msgid "Setup.py is still useful for complex package builds" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:130 +msgid "" +"Using **setup.py** to manage package builds and metadata [can cause " +"problems with package " +"development](https://blog.ganssle.io/articles/2021/10/setup-py-" +"deprecated.html). In some cases where a Python package build is complex, " +"a **setup.py** file may be required. While this guide will not cover " +"complex builds, we will provide resources working with complex builds in " +"the future." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:136 +msgid "Optional vs. Required pyproject.toml file fields" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:138 +msgid "" +"When you create your `pyproject.toml` file, there are numerous metadata " +"fields that you can use. Below we suggest specific fields to get you " +"started that support publication on PyPI and users finding your package." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:140 +msgid "" +"[An overview of all of the project metadata elements can be found " +"here.](https://packaging.python.org/en/latest/specifications/core-" +"metadata/#project-url-multiple-use)" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:142 +msgid "Required fields for the [project] table" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:144 +msgid "" +"As mentioned above, your pyproject.toml file needs to have a **name** and" +" **version** field in order to properly build your package:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:146 +msgid "Name: This is the name of your project provided as a string" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:147 +msgid "" +"Version: This is the version of your project. If you are using a scm tool" +" for versioning (using git tags to determine versions), then the version " +"may be dynamic (more on that below)." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:149 +msgid "Optional fields to include in the `[project]` table" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:151 +msgid "" +"We strongly suggest that you also add the metadata keys below as they " +"will help users finding your package on PyPI. These fields will make it " +"clear how your package is structured, what platforms you support and what" +" dependencies your package requires." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:156 +msgid "**Description:** this is a short one-line description of your package." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:157 +msgid "" +"**Readme:** A link to your README.md file is used for the long long-" +"description. This information will be published on your packages PyPI " +"landing page." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:158 +msgid "" +"**Requires-python** (used by pip): this is a field that is used by pip. " +"Here you tell the installer whether you are using Python 2.x or 3.x. Most" +" projects will be using 3.x." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:159 +msgid "**License:** the license you are using" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:160 +msgid "" +"**Authors:** these are the original authors of the package. Sometimes the" +" authors are different from the maintainers. Other times they might be " +"the same." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:161 +msgid "" +"**Maintainers:** you can choose to populate this or not. You can populate" +" this using a list with a sub element for each author or maintainer name," +" email" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:169 +msgid "" +"**dependencies:** dependencies are optional but we strongly suggest you " +"include them in your pyproject.toml. Dependencies will be installed by " +"pip when your project is installed creating a better user-experience." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:171 +msgid "" +"**`[project.optional-dependencies]`:** the optional or development " +"dependencies will be installed if someone runs `python -m pip install " +"projectname[dev]`. This is a nice way to include your development " +"dependencies for users who may wish to contribute to your project." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:173 +msgid "" +"**keywords:** These are the keywords that will appear on your PyPI " +"landing page. Think of them as words that people might use to search for " +"your package." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:174 +msgid "" +"**classifiers:** The classifiers section of your metadata is also " +"important for the landing page of your package in PyPI and for filtering " +"of packages in PyPI. A list of [all options for classifiers can be found " +"her](https://PyPI.org/classifiers/)e. Some of the classifiers that you " +"should consider including" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:175 +msgid "Development Status" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:176 +msgid "Intended Audience" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:177 +msgid "Topic" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:178 +msgid "LIcense" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:179 +msgid "Programming language" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:181 +msgid "Advanced options in the pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:183 +msgid "The examples at the bottom of this page contain ..." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:185 +msgid "" +"**`[project.scripts]` (Entry points):** Entry points are optional. If you" +" have a command line tool that runs a specific script hosted in your " +"package, you may include an entry point to call that script directly at " +"the command line (rather than at the Python shell)." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:186 +msgid "" +"Here is an example of[ a package that has entry point " +"script](https://github.com/pyOpenSci/update-web-" +"metadata/blob/main/pyproject.toml#L60)s. Notice that there are several " +"core scripts defined in that package that perform sets of tasks. " +"pyOpenSci is using those scripts to process their metadata." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:187 +msgid "" +"**Dynamic Fields:** if you have fields that are dynamically populated. " +"One example of this is if you are using scm / version control based " +"version with tools like `setuptooms_scm`, then you might use the dynamic " +"field. such as version (using scm) **dynamic = [\"version\"]**" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:189 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Add dependencies to your pyproject.toml file" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:191 +msgid "" +"The pyproject.toml file can also be used as a replacement for the " +"requirements.txt file which has been traditionally used to store " +"development dependencies such as pytest, code formatters such as Black " +"and documentation tools such as sphinx." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:193 +msgid "" +"To add dependencies to your build, add a `[project.optional-" +"dependencies]` table to your pyproject.toml file." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:195 +msgid "Then specify dependency groups as follows:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:202 +msgid "Following the above example, you install dependencies like this:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:204 +msgid "`python -m pip install -e .[tests]`" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:206 +msgid "" +"The above will install both your package in editable mode and all of the " +"dependencies declared in the tests section of your `[project.optional-" +"dependencies]` table." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:208 +msgid "To install all dependencies and also your package, you'd use:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:210 +msgid "`python -m pip install -e .[tests,lint,docs]`" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:212 +msgid "Recursive dependencies" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:216 +msgid "" +"You can also setup sets of recursive dependencies. [See this blog post " +"for more.](https://hynek.me/articles/python-recursive-optional-" +"dependencies/)" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:219 +msgid "Example pyproject.toml for building using hatchling" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:221 +msgid "" +"Below is an example build configuration for a Python project. This " +"example package setup uses **hatchling** to build the [package's sdist " +"and wheels](python-package-distribution-files-sdist-wheel)." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:229 +msgid "Notice that dependencies are specified in this file." +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:231 +msgid "Example pyproject.toml for building using setuptools" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:233 +msgid "" +"The package metadata including authors, keywords, etc is also easy to " +"read. Below you can see the same TOML file that uses a different build " +"system (setuptools). Notice how simple it is to swap out the tools needed" +" to build this package!" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:237 +msgid "In this example package setup you use:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:239 +msgid "" +"**setuptools** to build the [package's sdist and wheels](python-package-" +"distribution-files-sdist-wheel)" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:240 +msgid "" +"**setuptools_scm** to manage package version updates using version " +"control tags" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:242 +msgid "" +"In the example below `[build-system]` is the first table of values. It " +"has two keys that specify the build backend API and containing package:" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:245 +msgid "`requires =`" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:246 +msgid "`build-back-end =`" +msgstr "" + +#: ../../package-structure-code/pyproject-toml-python-package-metadata.md:253 +msgid "" +"[Click here to read about our packaging build tools including PDM, " +"setuptools, Poetry and Hatch.](/package-structure-code/python-package-" +"build-tools)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:1 +msgid "Python Packaging Tools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:3 +msgid "Tools for building your package" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:5 +msgid "" +"There are a several different build tools that you can use to [create " +"your Python package's _sdist_ and _wheel_ distributions](python-package-" +"distribution-files-sdist-wheel). Below, we discuss the features, benefits" +" and limitations of the most commonly used Python packaging tools. We " +"focus on pure-python packages in this guide. However, we also highlight " +"tools that currently support packages with C/C++ and other language " +"extensions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:13 +msgid "" +"Decision tree diagram showing the various front and back end packaging " +"tools. You can decide what packaging tool to use by thinking about what " +"features you need. PDM and Hatch are currently the most flexible tools " +"as they also using different build back-ends. As such currently PDM and " +"Hatch are the tools we think beginners might appreciate most with Poetry " +"being a close second. Poetry is nice for pure Python projects." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:15 +msgid "" +"Diagram showing the different front end build tools available to use in " +"the Python package ecosystem that you can select from. We selected tools " +"to include in this diagram based upon the PyPI survey which helped us " +"understand the most populate tools in the ecosystem. Each tool has " +"different features as highlighted below." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:18 +msgid "" +"If you want to know more about Python packages that have extensions " +"written in other languages, [check out the page on complex package builds" +".](complex-python-package-builds)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:21 +msgid "Tools that we review here" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:23 +msgid "" +"In this section we have selected tools that were returned as the most " +"popular packaging tools in the PyPA survey. You will learn more about the" +" following tools on this page:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:27 +msgid "" +"[Twine](https://twine.readthedocs.io/en/stable/), [Build](https://pypa-" +"build.readthedocs.io/en/stable/) + " +"[setuptools](https://setuptools.pypa.io/en/latest/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:28 +msgid "[Flit](https://flit.pypa.io/en/stable/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:29 +msgid "[Hatch](https://hatch.pypa.io/latest/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:30 +msgid "[PDM](https://pdm.fming.dev/latest/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:31 +msgid "[Poetry](https://python-poetry.org/docs/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:33 +msgid "Summary of tools Hatch vs. PDM vs. Poetry (and setuptools)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:35 +msgid "If you are looking for a quick summary, read below." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:37 +msgid "" +"In general, any modern tool that you select from this page will be great " +"to build your package. Selecting a tool comes down to the features that " +"you are looking for in your workflow." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:38 +msgid "" +"We suggest that beginners start with a modern workflow tool like PDM as " +"opposed to navigating the complexities of setuptools." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:39 +msgid "" +"If you are going to use Poetry (it is the most popular tool and does have" +" the best documentation) beware of the upper bounds dependency additions " +"and consider overriding dependencies when you add them. If you do that " +"Poetry will work well for pure-python builds! Poetry also has an active " +"discord where you can ask questions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:41 +msgid "Below are some features that Hatch and PDM offer that Poetry does not." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:43 +msgid "PDM:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:45 +msgid "" +"Supports other back-ends making it ideal for builds that are not pure " +"Python. This means PDM is a great option for both pure python and more " +"complex Python builds as it supports meson-python and other build " +"backends." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:46 +msgid "Offers flexibility in dependency management which we like" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:47 +msgid "Offers lock files if you need them" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:49 +msgid "Hatch:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:51 +msgid "" +"Offers matrix environment management that allows you to run tests across " +"Python versions. If this feature is important to you, then Hatch is a " +"clear winner." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:52 +msgid "" +"Offers a Nox / Make file like tool to streamline your build workflow. If " +"you are looking to reduce the number of tools in your workflow, Hatch " +"might be for you." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:55 +msgid "Build front-end vs. build back-end tools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:57 +msgid "" +"To better understand your options, when it comes to building a Python " +"package, it's important to first understand the difference between a " +"build tool front-end and build back-end." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:62 +msgid "Build back-ends" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:64 +msgid "" +"Most packaging tools have a back-end build tool that builds you package " +"and creates associated [(sdist and wheel) distribution files](python-" +"package-distribution-files-sdist-wheel). Some tools, such as **Flit**, " +"only support pure-Python package builds. A pure-Python build refers to a " +"package build that does not have extensions that are written in another " +"programming language (such as `C` or `C++`)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:71 +msgid "" +"Other packages that have C and C++ extensions (or that wrap other " +"languages such as fortran) require additional code compilation steps when" +" built. Back-ends such as **setuptools.build**, **meson.build** and " +"**scikit-build** support complex builds with custom steps. If your build " +"is particularly complex (i.e. you have more than a few `C`/`C++` " +"extensions), then we suggest you use **meson.build** or **scikit-build**." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:77 +msgid "Python package build front-ends" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:79 +msgid "" +"A packaging front-end tool refers to a tool that makes it easier for you " +"to perform common packaging tasks using similar commands. These tasks " +"include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:82 +msgid "" +"[Build your packages (create the sdist and wheel distributions)](python-" +"package-distribution-files-sdist-wheel)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:83 +msgid "" +"Installing your package in a development mode (so it updates when you " +"update your code)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:84 +msgid "Publishing to PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:85 +msgid "Running tests" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:86 +msgid "Building documentation" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:87 +msgid "" +"Managing an environment or multiple environments in which you need to run" +" tests and develop your package" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:89 +msgid "" +"There are several Python packaging tools that you can use for pure Python" +" builds. Each front-end tool discussed below supports a slightly " +"different set of Python packaging tasks." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:93 +msgid "" +"For instance, you can use the packaging tools **Flit**, **Hatch** or " +"**PDM** to both build and publish your package to PyPI. However while " +"**Hatch** and **PDM** support versioning and environment management, " +"**Flit** does not. If you want a tool that supports dependency locking, " +"you can use **PDM** or **Poetry** but not **Hatch**. If you only need to " +"build your package's sdist and wheel distribution files, then you can " +"stick with PyPA's Build. You'd then use Twine to publish to PyPI." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:100 +msgid "" +"If you are using **Setuptools**, there is no default user-friendly build " +"front-end that performs multiple tasks. You will need to use **build** to" +" build your package and **twine** to publish to PyPI." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:103 +msgid "Example build steps that can be simplified using a front-end tool" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:105 +msgid "" +"Below, you can see how a build tool streamlines your packaging " +"experience. Example to build your package with **Hatch**:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:115 +msgid "Example build steps using the **setuptools** back-end and **build**:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:125 +msgid "Choosing a build back-end" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:127 +msgid "" +"Most front-end packaging tools have their own back-end build tool. The " +"build tool creates your package's (sdist and wheel) distribution files. " +"For pure Python packages, the main difference between the different build" +" back-ends discussed below is:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:132 +msgid "" +"How configurable they are - for example, do they allow you to add build " +"steps that support non python extensions?" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:133 +msgid "" +"How much you need to configure them to ensure the correct files are " +"included in your sdist and wheel distributions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:135 +msgid "Build back-end support for non pure-python packages" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:137 +msgid "" +"It is important to note that some build back-ends, such as **Flit-core**," +" only support pure Python builds. Other back-ends support C and C++ " +"extensions as follows:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:140 +msgid "setuptools supports builds using C / C++ extensions" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:141 +msgid "" +"Hatchling (hatch's back-end) supports C / C++ extensions via plugins that" +" the developer creates to customize a build" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:142 +msgid "PDM's back-end supports C / C++ extensions by using setuptools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:143 +msgid "" +"Poetry's back-end supports C/C++ extensions however this functionality is" +" currently undocumented. As such we don't recommend using Poetry for " +"complex or non pure Python builds until it is documented." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:145 +msgid "" +"While we won't discuss more complex builds below, we will identify which " +"tools have documented support for C / C++ extensions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:148 +msgid "An ecosystem of Python build tools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:150 +msgid "" +"Below we introduce several of the most commonly used Python packaging " +"build front-end tools. We highlight the features that each tool offers as" +" a way to help you decide what tool might be best for your workflow." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:154 +msgid "We do not suggest using setuptools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:157 +msgid "" +"We suggest that you pick one of the modern tools listed above rather than" +" setuptools because setuptools will require some additional knowledge to " +"set up correctly." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:161 +msgid "" +"We review setuptools as a back-end because it is still popular. However " +"it is not the most user friendly option." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:165 +msgid "" +"The most commonly used tools in the ecosystem are setuptools back-end " +"(with build) and Poetry (a front end tool with numerous features and " +"excellent documentation)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:171 +msgid "" +"Graph showing the results of the 2022 PyPA survey of Python packaging " +"tools. On the x axis is percent response and on the y axis are the tools." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:173 +msgid "" +"The Python developers survey results (n=>8,000 PyPI users) show " +"setuptools and poetry as the most commonly used Python packaging tools. " +"The core tools that we've seen being used in the scientific community are" +" included here. [You can view the full survey results by clicking " +"here.](https://drive.google.com/file/d/1U5d5SiXLVkzDpS0i1dJIA4Hu5Qg704T9/view)" +" NOTE: this data represent maintainers across domains and is likely " +"heavily represented by those in web development. So this represents a " +"snapshot across the broader Python ecosystem." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:176 +msgid "Chose a build workflow tool" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:178 +msgid "The tools that we review below include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:180 +msgid "Twine, Build + setuptools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:181 +#: ../../package-structure-code/python-package-build-tools.md:291 +msgid "Flit" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:182 +#: ../../package-structure-code/python-package-build-tools.md:331 +msgid "Hatch" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:183 +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:230 +msgid "PDM" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:184 +#: ../../package-structure-code/python-package-build-tools.md:374 +msgid "Poetry" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:186 +msgid "" +"When you are selecting a tool, you might consider this general workflow " +"of questions:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:189 +msgid "" +"**Is your tool pure python? Yes?** You can use any tool that you wish! " +"Pick the tool that has the features that you want to use in your build " +"workflow. We suggest:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:191 +msgid "Flit, Hatch, PDM or Poetry (read below for more)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:193 +msgid "" +"**Does your tool have a few C or C++ extensions?** Great, we suggest " +"using **PDM** for the time being. It is the only tool in the list below " +"that has both documented workflow to support such extensions and support " +"for other back-ends in the case that build hooks are not enough for your " +"workflow. PDM supports other back-ends such as scikit-build and meson-" +"python that will allow you to fully customize your package's build." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:197 +msgid "" +"NOTE: You can also use Hatch for non pure python builds. Hatch, similar " +"to PDM, allows you to write your own build hooks or plugins to support " +"custom build steps. But currently, hatch does not support other build " +"back ends. Many of the core scientific packages are moving to meson-" +"python to build their packages. Thus, we appreciate that PDM can work " +"with meson-python specifically." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:199 +msgid "Python packaging tools summary" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:201 +msgid "" +"Below, we summarize features offered by the most popular build front end " +"tools. It is important to keep in mind that these front-end tools remove " +"the need to use other core tools in your workflow. For example if you use" +" setuptools, you will need to also use Build and Twine to build your " +"package and publish to PyPI. But if you use Poetry, Hatch or PDM you can " +"do all of those things using the same tool (e.g. `hatch build`, `hatch " +"publish` or `pdm build`, `pdm publish`)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:204 +msgid "" +"Note that because setuptools does not offer a front-end interface, it is " +"not included in the table." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:208 +msgid "Package tool features table" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Feature, Flit, Hatch, PDM, Poetry" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Default Build Back-end" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Flit-core" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "hatchling" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Poetry-core" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Use Other Build Backends" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "✖" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "✅" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Dependency management" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Publish to PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "Version Control based versioning (using `git tags`)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Version bumping" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Environment Management" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:215 +msgid "More than one maintainer? (bus factor)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:225 +msgid "Notes:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:227 +msgid "_Hatch plans to support dependency management in the future_" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:228 +msgid "" +"Poetry supports semantic versioning. Thus, it will support version " +"bumping following commit messages if you use a tool such as Python " +"Semantic Release" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:232 +msgid "" +"[PDM is a Python packaging and dependency management " +"tool](https://pdm.fming.dev/latest/). PDM supports builds for pure Python" +" projects. It also provides multiple layers of support for projects that " +"have C and C++ extensions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:236 +msgid "PDM support for C and C++ extensions" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:238 +msgid "" +"PDM supports using the PDM-back-end and setuptools at the same time. This" +" means that you can run setuptools to compile and build C extensions. " +"PDM's build back-end receives the compiled extension files (.so, .pyd) " +"and packages them with the pure Python files." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:244 +msgid "PDM Features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Feature, PDM, Notes" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"When you setup PDM it allows you to select one of several build back ends" +" including: PDM-core, flit-core and hatchling. PDM also can work with " +"Meson-Python which supports move complex python builds." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Dependency specifications" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM has flexible support for managing dependencies. PDM defaults to " +"using an open bound (e.g. `requests >=1.2`) approach to dependencies. " +"However you can [customize how you want to add dependencies in case you " +"prefer another approach such as that of Poetry which uses an upper bound " +"limit](https://pdm.fming.dev/latest/usage/dependency/#about-update-" +"strategy).**" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Environment lock files" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM and Poetry are currently the only tools that create environment lock " +"files. Lock files are often most useful to developers creating web apps " +"where locking the environment is critical for consistent user experience." +" For community-used packages, you will likely never want to use a lock " +"file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Environment management" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM provides environment management support. It supports Python virtual " +"environments, conda and a local `__pypackages__` environment which is a " +"newer option in the Python ecosystem. No extensions are needed for this " +"support." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "Select your environment type on install" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"When you run `PDM init`, PDM will discover environments that are already " +"on your system and allow you to select one to use for your project." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "PDM supports publishing to both test PyPI and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Version Control based versioning" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM has a setuptools_scm like tool built into it which allows you to use " +"dynamic versioning that rely on git tags." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM supports you bumping the version of your package using standard " +"semantic version terms patch; minor; major" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Follows current packaging standards" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"PDM supports current packaging standards for adding metadata to the " +"**pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Install your package in editable mode" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "PDM supports installing your package in editable mode." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Build your sdist and wheel distributions" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:251 +msgid "" +"Similar to all of the other tools PDM builds your packages sdist and " +"wheel files for you." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:264 +msgid "PDM vs. Poetry" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:265 +msgid "" +"The functionality of PDM is similar to Poetry. However, PDM also offers " +"additional, documented support for C extensions and version control based" +" versioning. As such, PDM is preferred for those working on non pure-" +"Python packages." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:269 +msgid "" +"If you are deciding between the Poetry and PDM, a smaller difference is " +"the default way that dependencies are added to your pyproject.toml file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:271 +msgid "" +"Poetry by default follows strict semantic versioning adding dependencies " +"to your pyproject.toml file [using an upper bounds constraint " +"(`^`)](https://python-poetry.org/docs/dependency-specification/#version-" +"constraints). Upper bounds lock means that Poetry will never bump a " +"dependency to the next major version (i.e. from 1.2 to 2.0). However, you" +" can tell Poetry to use an open bound approach by explicitly adding the " +"package like this: `poetry add requests >= 1.2` rather than just using " +"`poetry add requests` which will result in a upper bound locked (ie Upper" +" bound locks means that requests 2.0 could never be installed even if it " +"came out and your package could benefit from it)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:272 +msgid "" +"PDM defaults to open-bounds (`>=`) dependency additions which is the " +"preferred approach in the scientific python ecosystem. However, PDM also " +"allows you to specify the way dependencies are added by default. As such," +" you can also specify upper-bounds (`^`) using PDM if require that " +"approach." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:274 +msgid "" +"Finally there are some nuanced differences in how both tools create lock " +"files which we will not go into detail about here." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:277 +msgid "Challenges with PDM" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:279 +msgid "" +"PDM is a full-featured packaging tool. However it is not without " +"challenges:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:281 +msgid "" +"Its documentation can be confusing, especially if you are new to " +"packaging. For example, PDM doesn't provide an end to end beginning " +"workflow in its documentation." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:283 +msgid "" +"PDM also only has one maintainer currently. We consider individual " +"maintainer teams to be a potential risk. If the maintainer finds they no " +"longer have time to work on the project, it leaves users with a gap in " +"support. Hatch and Flit also have single maintainer teams." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:288 +msgid "" +"[You can view an example of a package that uses PDM " +"here](https://github.com/pyOpenSci/examplePy/tree/main/example4_pdm). The" +" README file for this directly provides you with an overview of what the " +"PDM command line interface looks like when you use it." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:293 +msgid "" +"[Flit is a no-frills, streamlined packaging " +"tool](https://flit.pypa.io/en/stable/) that supports modern Python " +"packaging standards. Flit is a great choice if you are building a basic " +"package to use in a local workflow that doesn't require any advanced " +"features. And if your package structure is already created. More on that " +"below." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:297 +msgid "Flit Features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Feature, Flit, Notes" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +#: ../../package-structure-code/python-package-build-tools.md:348 +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Publish to PyPI and test PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Flit supports publishing to both test PyPI and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Helps you add metadata to your **pyproject.toml** file" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "" +"Flit does support adding metadata to your **pyproject.toml** file " +"following modern packaging standards." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "" +"Flit supports current packaging standards for adding metadata to the " +"**pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Flit supports installing your package in editable mode.**" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:304 +msgid "Flit can be used to build your packages sdist and wheel distributions." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:311 +msgid "" +"NOTE: _If you are using the most current version of pip, it supports both" +" a symlink approach `flit install -s` and `python -m pip install -e .`_" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:313 +msgid "Learn more about flit" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:314 +msgid "[Why use flit?](https://flit.pypa.io/en/stable/rationale.html)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:317 +msgid "Why you might not want to use Flit" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:319 +msgid "" +"Because Flit is no frills, it is best for basic, quick builds. If you are" +" a beginner you may want to select Hatch or PDM which will offer you more" +" support in common operations." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:323 +msgid "You may NOT want to use flit if:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:325 +msgid "" +"You want to setup more advanced version tracking and management (using " +"version control for version bumping)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:326 +msgid "" +"You want a tool that handles dependency versions (use PDM or Poetry " +"instead)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:327 +msgid "You have a project that is not pure Python (Use Hatch, PDM or setuptools)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:328 +msgid "You want environment management (use PDM, Hatch or Poetry)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:333 +msgid "" +"[**Hatch**](https://hatch.pypa.io/latest/), similar to Poetry and PDM, " +"provides a unified command line interface. To separate Hatch from Poetry " +"and PDM, it also provides an environment manager for testing that will " +"make it easier for you to run tests locally across different versions of " +"Python. It also offers a nox / makefile like feature that allows you to " +"create custom build workflows such as building your documentation " +"locally. This means that you could potentially drop a tool like **Make** " +"or **Nox** from your workflow and use Hatch instead." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:340 +msgid "Hatch features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Feature, Hatch, Notes" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch is used with the backend Hatchling by default, but allows you to " +"use another backend by switching the declaration in pyproject.toml." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Currently you have to add dependencies manually with Hatch. However a " +"feature to support dependencies management may be added in a future " +"release." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch supports Python virtual environments. If you wish to use other " +"types of environments such as Conda, you will need to [install a plugin " +"such as hatch-conda for conda support](https://github.com/OldGrumpyViking" +"/hatch-conda)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Hatch supports publishing to both test PyPI and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch offers `hatch_vcs` which is a plugin that uses setuptools_scm to " +"support versioning using git tags. The workflow with `hatch_vcs` is the " +"same as that with `setuptools_scm`." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch supports you bumping the version of your package using standard " +"semantic version terms patch; minor; major" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch supports current packaging standards for adding metadata to the " +"**pyproject.toml** file." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"Hatch will install your package into any of its environments by default " +"in editable mode. You can install your package in editable mode manually " +"using `python -m pip install -e .` Hatch mentions [editable " +"installs](https://hatch.pypa.io/latest/config/build/#dev-mode) but refers" +" to pip in its documentation." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "Hatch will build the sdist and wheel distributions" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "✨Matrix environment creation to support testing across Python versions✨" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"The matrix environment creation is a feature that is unique to Hatch in " +"the packaging ecosystem. This feature is useful if you wish to test your " +"package locally across Python versions (instead of using a tool such as " +"tox)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"✨[Nox / MAKEFILE like " +"functionality](https://hatch.pypa.io/latest/environment/#selection)✨" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"This feature is also unique to Hatch. This functionality allows you to " +"create workflows in the **pyproject.toml** configuration to do things " +"like serve docs locally and clean your package build directory. This " +"means you may have one less tool in your build workflow." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "✨A flexible build backend: **hatchling**✨" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:348 +msgid "" +"**The hatchling build backend offered by the maintainer of Hatch allows " +"developers to easily build plugins to support custom build steps when " +"packaging." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:362 +msgid "" +"_There is some argument about this approach placing a burden on " +"maintainers to create a custom build system. But others appreciate the " +"flexibility. The Hatch build hook approach is also comparable with the " +"features offered by PDM._" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:364 +msgid "Why you might not want to use Hatch" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:366 +msgid "" +"There are a few features that hatch is missing that may be important for " +"some. These include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:369 +msgid "" +"Hatch doesn't support adding dependencies. You will have to add them " +"manually." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:370 +msgid "Hatch won't by default recognize Conda environments without a plugin." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:371 +msgid "" +"Similar to PDM, Hatch's documentation can difficult to work through, " +"particularly if you are just getting started with creating a package." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:372 +msgid "Hatch, similar to PDM and Flit currently only has one maintainer." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:376 +msgid "" +"[Poetry is a full-featured build tool.](https://python-poetry.org/) It is" +" also the second most popular front-end packaging tool (based upon the " +"PyPA survey). Poetry is user-friendly and has clean and easy-to-read " +"documentation." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:381 +msgid "" +"While some have used Poetry for Python builds with C/C++ extensions, this" +" support is currently undocumented. Thus, we don't recommend using Poetry" +" for more complex builds." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:385 +msgid "Poetry features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Feature, Poetry, Notes" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry helps you add dependencies to your `pyproject.toml` metadata. " +"_NOTE: currently Poetry adds dependencies using an approach that is " +"slightly out of alignment with current Python peps - however there is a " +"plan to fix this in an upcoming release._ Poetry also allows you to " +"organize dependencies in groups such as documentation, packaging and " +"tests." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Dependency specification" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry allows you to be specific about version of dependencies that you " +"add to your package's pyproject.toml file. However, it's default upper " +"bound approach can be problematic for some packages (We suggest you " +"override the default setting when adding dependencies). Read below for " +"more." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry allows you to either use its built in environment or you can " +"select the environment type that you want to use for managing your " +"package. [Read more about its built in environment management " +"options](https://python-poetry.org/docs/basic-usage/#using-your-virtual-" +"environment)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Lock files" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry creates a **poetry.lock** file that you can use if you need a lock" +" file for your build." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Poetry supports publishing to both test PyPI and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"The plugin [Poetry dynamic versioning](https://github.com/mtkennerly" +"/poetry-dynamic-versioning) supports versioning using git tags with " +"Poetry." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry supports you bumping the version of your package using standard " +"semantic version terms patch; minor; major" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "✖✅" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry does not quite support current packaging standards for adding " +"metadata to the **pyproject.toml** file but plans to fix this in an " +"upcoming release." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "" +"Poetry supports installing your package in editable mode using " +"`--editable`" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:392 +msgid "Poetry will build your sdist and wheel distributions using `poetry build`" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:407 +msgid "Challenges with Poetry" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:409 +msgid "Some challenges of Poetry include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:411 +msgid "" +"Poetry, by default, pins dependencies using an \"upper bound\" limit " +"specified with the `^` symbol by default. However, this behavior can be " +"over-written by specifying the dependency when you use `Poetry add` as " +"follows: `poetry add \"requests>=2.1\"` See breakout below for more " +"discussion on issues surrounding upper-bounds pinning." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:412 +msgid "" +"_Minor Challenge:_ The way Poetry currently adds metadata to your " +"pyproject.toml file does not follow current Python standards. However, " +"this is going to be addressed with Poetry release version 2.0." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:414 +msgid "" +"Poetry is an excellent tool. Use caution when using it to pin " +"dependencies as Poetry's approach to pinning can be problematic for many " +"builds. If you use Poetry, we strongly suggest that you override the " +"default upper bound dependency option." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:420 +msgid "Challenges with Poetry dependency pinning" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:423 +msgid "" +"By default, Poetry pins dependencies using `^` by default. This `^` " +"symbol means that there is an \"upper bound\" to the dependency. Thus " +"poetry won't bump a dependency version to a new major version. Thus, if " +"your package uses a dependency that is at version 1.2.3, Poetry will " +"never bump the dependency to 2.0 even if there is a new major version of " +"the package. Poetry will instead bump up to 1.9.x." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:429 +msgid "" +"Poetry does this because it adheres to strict semantic versioning which " +"states that a major version bump (from 1.0 to 2.0 for example) means " +"there are breaking changes in the tool. However, not all tools follow " +"strict semantic versioning. [This approach has been found to be " +"problematic by many of our core scientific " +"packages.](https://iscinumpy.dev/post/bound-version-constraints/)" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:434 +msgid "" +"This approach also won't support others ways of versioning tools, for " +"instance, some tools use [calver](https://calver.org/) which creates new " +"versions based on the date." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:438 +msgid "Using Setuptools Back-end for Python Packaging with Build Front-end" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:440 +msgid "" +"[Setuptools](https://setuptools.pypa.io/en/latest/) is the most mature " +"Python packaging build tool with [development dating back to 2009 and " +"earlier](https://setuptools.pypa.io/en/latest/history.html#). Setuptools " +"also has the largest number of community users (according to the PyPA " +"survey). Setuptools does not offer a user front-end like Flit, Poetry and" +" Hatch offer. As such you will need to use other tools such as **build** " +"to create your package distributions and **twine** to publish to PyPI." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:448 +msgid "" +"While setuptools is the most commonly used tool, we encourage package " +"maintainers to consider using a more modern tool for packaging such as " +"Poetry, Hatch or PDM." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:451 +msgid "" +"We discuss setuptools here because it's commonly found in the ecosystem " +"and contributors may benefit from understanding it." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:454 +msgid "Setuptools Features" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:456 +msgid "Some of features of setuptools include:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:458 +msgid "Fully customizable build workflow" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:459 +msgid "Many scientific Python packages use it." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:460 +msgid "" +"It offers version control based package versioning using " +"**setuptools_scm**" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:461 +msgid "It supports modern packaging using **pyproject.toml** for metadata" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:462 +msgid "Supports backwards compatibly for older packaging approaches." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:464 +msgid "Challenges using setuptools" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:468 +msgid "Setuptools has a few challenges:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:470 +msgid "" +"Setuptools does not support interactive features such as auto / tab " +"completion by default if you are working in an IDE like VSCODE and using " +"an editable install for development. [See notes here about pylance " +"support](https://github.com/microsoft/pylance-" +"release/blob/main/TROUBLESHOOTING.md#editable-install-modules-not-found)." +" In comparison, tools such as flit, hatch, PDM support interactive " +"features such as tab / auto completion when using an IDE like VSCODE or " +"pycharm (as long as your version of pip is current!)." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:471 +msgid "" +"Because **setuptools** has to maintain backwards compatibility across a " +"range of packages, it is not as flexible in its adoption of modern Python" +" packaging standards." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:474 +msgid "" +"The above-mentioned backwards compatibility makes for a more complex " +"code-base." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:475 +msgid "" +"Your experience as a user will be less streamlined and simple using " +"setuptools compared to other tools discussed on this page." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:477 +msgid "" +"There are also some problematic default settings that users should be " +"aware of when using setuptools. For instance:" +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:480 +msgid "" +"setuptools will build a project without a name or version if you are not " +"using a **pyproject.toml** file to store metadata." +msgstr "" + +#: ../../package-structure-code/python-package-build-tools.md:482 +msgid "" +"setuptools also will include all of the files in your package repository " +"if you do not explicitly tell it to exclude files using a **MANIFEST.in**" +" file" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:1 +msgid "Learn about Building a Python Package" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:8 +msgid "" +"Once you have published both package distributions (the source " +"distribution and the wheel) to PyPI, you can then publish to conda-forge." +" conda-forge requires an source distribution on PyPI in order to build " +"your package on conda-forge. You do not need to rebuild your package to " +"publish to conda-forge." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:11 +msgid "" +"You need to build your Python package in order to publish it to PyPI (or " +"a conda channel). The build process organizes your code and metadata into" +" a distribution format that can be uploaded to PyPI and subsequently " +"downloaded and installed by users. NOTE: you need to publish a sdist to " +"PyPI in order for conda-forge to properly build your package " +"automatically." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:14 +msgid "What is building a Python package?" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:16 +msgid "" +"To [publish your Python package](publish-python-package-pypi-conda) and " +"make it easy for anyone to install, you first need to build it." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:18 +msgid "But, what does it mean to build a Python package?" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:20 +msgid "" +"[As shown in the figure above](#pypi-conda-channels), when you build your" +" Python package, you convert the source files into something called a " +"distribution package. A distribution package contains your source code " +"and metadata about the package, in the format required by the Python " +"Package Index, so that it can be installed by tools like pip." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:23 +msgid "" +"The term package used to mean many different things in Python and other " +"languages. On this page, we adapt the convention of the [Python Packaging" +" Authority](https://www.pypa.io/en/latest/) and refer to the product of " +"the build step as a **distribution package**." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:27 +msgid "" +"This process of organizing and formatting your code, documentation, tests" +" and metadata into a format that both pip and PyPI can use, is called a " +"build step." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:31 +msgid "Project metadata and PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:33 +msgid "" +"The metadata that both build tools and PyPI uses to describe and " +"understand your package is generally stored in a [pyproject.toml file" +"](pyproject-toml-python-package-metadata). This metadata is used for " +"several purposes:" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:35 +msgid "" +"It helps whatever tool you use to build your package (pip, [pypa's " +"Build](https://pypi.org/project/build/) or an end-to-end tool such as " +"poetry, PDM or Hatch) understand how to build your package. Information " +"it provides to your build tool includes:" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:37 +msgid "" +"The `[build-system]` table in your pyproject.toml file tells pip what " +"[build backend tool](build_backends) you wish to use for creating your " +"sdist and wheel distributions." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:45 +msgid "" +"And the dependencies section of your project table tells the build tool " +"and PyPI what dependencies your project requires." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:54 +msgid "" +"When the build tool creates your package distribution file (the file that" +" you publish on PyPI), it also creates a METADATA file which PyPI can " +"read and use to help users find your package. For example:" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:56 +msgid "" +"The `classifiers = ` section of your `[project]` table in the " +"pyproject.toml file provides information that users on PyPI can use to " +"filter for packages that contain specific licenses or that support " +"specific versions of python." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:73 +msgid "What happened to setup.py and setup.cfg for metadata?" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:76 +msgid "" +"Project metadata used to be stored in either a setup.py file or a " +"setup.cfg file. The current recommended practice for storing package " +"metadata is to use a pyproject.toml file. [Learn more about the " +"pyproject.toml file here.](pyproject-toml-python-package-metadata)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:79 +msgid "An example - xclim" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:94 +msgid "" +"Graphic showing the high level packaging workflow. On the left you see a " +"graphic with code, metadata and tests in it. those items all go into your" +" package. Documentation and data are below that box because they aren't " +"normally published in your packaging wheel distribution. an arrow to the " +"right takes you to a build distribution files box. that box leads you to " +"either publishing to TestPyPI or the real PyPI. from PyPI you can then " +"connect to conda-forge for an automated build that sends distributions " +"from PyPI to conda-forge." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:96 +msgid "" +"You need to build your Python package in order to publish it to PyPI (or " +"Conda). The build process organizes your code and metadata into a " +"distribution format that can be uploaded to PyPI and subsequently " +"downloaded and installed by users. NOTE: you need to publish a sdist to " +"PyPI in order for conda-forge to properly build your package " +"automatically." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:101 +msgid "" +"This screenshot shows the metadata on PyPI for the xclim package. on it " +"you can see the name of the license, the author and maintainer names " +"keywords associated with the package and the base python version it " +"requires which is 3.8." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:103 +msgid "PyPI screenshot showing metadata for the xclim package." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:110 +msgid "" +"Here you see the maintinaer metadata as it is displayed on PyPI. for " +"xclim there are three maintainers listed with their profile pictures and " +"github user names to the right." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:112 +msgid "" +"Maintainer names and GitHub usernames for the xclim package as they are " +"displayed on PyPI. This information is recorded in your pyproject.toml " +"and then processed by your build tool and stored in your packages sdist " +"and wheel distributions." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:115 +msgid "How to create the distribution format that PyPI and Pip expects?" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:117 +msgid "" +"You could in theory create your own scripts to organize your code the way" +" PyPI wants it to be. However, just like there are packages that handle " +"known structures such as Pandas for data frames and Numpy for arrays, " +"there are packages and tools that help you create package build " +"distribution files." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:121 +msgid "" +"There are a suite of packaging tools that can either help you with the " +"entire packaging process or just one step of the process. For instance " +"setuptools is a commonly used build back end that can be used to create " +"your sdist and wheel. Whereas tools like Hatch, PDM, Poetry and flit help" +" with other parts of the packaging process." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:127 +msgid "" +"While this can cause some confusion and complexity in the packaging " +"ecosystem - for the most part, each tool provides the same distribution " +"output (with minor differences that most users may not care about). Learn" +" more about those tools on this page." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:133 +msgid "" +"Below, you will learn about the two distribution files that PyPI expects " +"you to publish: sdist and wheel. You will learn about their structure and" +" what files belong in each." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:136 +msgid "" +"There are two core distribution files that you need to create to publish " +"your Python package to PyPI source distribution (often called an sdist) " +"and wheel. The sdist contains the raw source code for your package. The " +"wheel (.whl) contains the built / compiled files that can be directly " +"installed onto anyones' computer." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:142 +msgid "Learn more about both distributions below." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:145 +msgid "" +"If your package is a pure python package with no additional build / " +"compilation steps then the sdist and wheel distributions will have " +"similar content. However if your package has extensions in other " +"languages or is more complex in its build, the two distributions will be " +"very different." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:150 +msgid "" +"Also note that we are not discussing conda build workflows in this " +"section. [You can learn more about conda builds " +"here.](https://conda.io/projects/conda-build/en/latest/user-" +"guide/tutorials/index.html)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:155 +msgid "Source Distribution (sdist)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:157 +msgid "" +"**Source files** are the unbuilt files needed to build your package. " +"These are the \"raw / as-is\" files that you store on GitHub or whatever " +"platform you use to manage your code." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:161 +msgid "" +"Source Distributions (**S** + **Dist**) are referred to as sdist. As the " +"name implies, a SDIST contains the source code; it has not been built or " +"compiled in any way. Thus, when a user installs your source distribution " +"using pip, pip needs to run a build step first. For this reason, you " +"could define a source distribution as a compressed archive that contains " +"everything required to build a wheel (except for project dependencies) " +"without network access." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:165 +msgid "" +"Sdist is normally stored as a `.tar.gz` archive (often called a " +"\"tarball\"). Thus, when a user installs your source distribution using " +"pip, pip needs to run a build step first." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:167 +msgid "Below is an example sdist for the stravalib Python package:" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:219 +msgid "GitHub archive vs sdist" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:221 +msgid "" +"When you make a release on GitHub, it creates a `git archive` that " +"contains all of the files in your GitHub repository. While these files " +"are similar to an sdist, these two archives are not the same. The sdist " +"contains a few other items including a metadata directory and if you use " +"`setuptools_scm` or `hatch_vcs` the sdist may also contain a file that " +"stores the version." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:229 +msgid "Wheel (.whl files):" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:231 +msgid "" +"A wheel file is a ZIP-format archive whose filename follows a specific " +"format (below) and has the extension `.whl`. The `.whl` archive contains " +"a specific set of files, including metadata that are generated from your " +"project's pyproject.toml file. The pyproject.toml and other files that " +"may be included in source distributions are not included in wheels " +"because it is a built distribution." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:238 +msgid "" +"The wheel (.whl) is your built binary distribution. **Binary files** are " +"the built / compiled source files. These files are ready to be installed." +" A wheel (**.whl**) is a **zip** file containing all of the files needed " +"to directly install your package. All of the files in a wheel are " +"binaries - this means that code is already compiled / built. Wheels are " +"thus faster to install - particularly if you have a package that requires" +" build steps." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:240 +msgid "" +"The wheel does not contain any of your package's configuration files such" +" as **setup.cfg** or **pyproject.toml**. This distribution is already " +"built so it's ready to install." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:244 +msgid "" +"Because it is built, the wheel file will be faster to install for pure " +"Python projects and can lead to consistent installs across machines." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:252 +msgid "" +"Wheels are also useful in the case that a package needs a **setup.py** " +"file to support a more complex build. In this case, because the files in " +"the wheel bundle are pre built, the user installing doesn't have to worry" +" about malicious code injections when it is installed." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:259 +msgid "The filename of a wheel contains important metadata about your package." +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:261 +msgid "Example: **stravalib-1.1.0.post2-py3-none.whl**" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:263 +msgid "name: stravalib" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:264 +msgid "version: 1.1.0" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:265 +msgid "" +"build-number: 2 (post2) [(read more about post " +"here)](https://peps.python.org/pep-0440/#post-release-separators)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:266 +msgid "py3: supports Python 3.x" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:267 +msgid "none: is not operating system specific (runs on windows, mac, linux)" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:268 +msgid "any: runs on any computer processor / architecture" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:270 +msgid "What a wheel file looks like when unpacked (unzipped):" +msgstr "" + +#: ../../package-structure-code/python-package-distribution-files-sdist-wheel.md:304 +msgid "[Read more about the wheel format here](https://pythonwheels.com/)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:1 +msgid "Python Package Structure for Scientific Python Projects" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:3 +msgid "" +"There are two different layouts that you will commonly see within the " +"Python packaging ecosystem: [src and flat " +"layouts.](https://packaging.python.org/en/latest/discussions/src-layout-" +"vs-flat-layout/) Both layouts have advantages for different groups of " +"maintainers." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:8 +msgid "" +"We strongly suggest, but do not require, that you use the **src/** layout" +" (discussed below) for creating your Python package. This layout is also " +"recommended in the [PyPA packaging " +"guide](https://packaging.python.org/en/latest/tutorials/packaging-" +"projects/)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:12 +msgid "pyOpenSci will never require a specific package structure for peer review" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:15 +msgid "" +"We understand that it would be tremendous effort for existing maintainers" +" to move to a new layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:18 +msgid "" +"The overview on this page presents recommendations that we think are best" +" for someone getting started with Python packaging or someone who's " +"package has a simple build and might be open to moving to a more fail-" +"proof approach." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:23 +msgid "An example of the **src/package** layout structure can be seen below." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:45 +msgid "Note the location of the following directories in the example above:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:47 +msgid "" +"**docs/:** discussed in our docs chapter, this directory contains your " +"user-facing documentation website. In a **src/** layout docs/ are " +"normally included at the same directory level of the **src/** folder." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:48 +msgid "" +"**tests/** this directory contains the tests for your project code. In a " +"**src/** layout tests are normally included at the same directory level " +"of the **src/** folder." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:49 +msgid "" +"**src/package/**: this is the directory that contains the code for your " +"Python project. \"Package\" is normally your project's name." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:51 +msgid "" +"Also in the above example, notice that all of the core documentation " +"files that pyOpenSci requires live in the root of your project directory." +" These files include:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:55 +msgid "CHANGELOG.md" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:56 +msgid "CODE_OF_CONDUCT.md" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:57 +msgid "CONTRIBUTING.md" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:58 +msgid "LICENSE.txt" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:59 +msgid "README.md" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:63 +msgid "Click here to read about our packaging documentation requirements." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:70 +msgid "" +"While we recommend the **src/** layout we also review the **flat** layout" +" here. Both are used in the Python ecosystem." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:72 +msgid "Example scientific packages that use **src/package** layout" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:74 +msgid "[Sourmash](https://github.com/sourmash-bio/sourmash)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:75 +msgid "[bokeh](https://github.com/bokeh/bokeh)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:76 +msgid "[openscm](https://github.com/openscm/openscm-runner)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:77 +msgid "[awkward](https://github.com/scikit-hep/awkward)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:78 +msgid "[poliastro](https://github.com/poliastro/poliastro/)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:82 +msgid "The src/ layout and testing" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:84 +msgid "" +"The benefit of using the **src/package** layout, particularly if you are " +"creating a new package, is that it ensures tests are run against the " +"installed version of your package rather than the files in your package " +"working directory. If you run your tests on your files rather than the " +"installed version, you may be missing issues that users encounter when " +"your package is installed." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:91 +msgid "" +"If `tests/` are outside of the **src/package** directory, they aren't " +"included in the package wheel. This makes your package size slightly " +"smaller which then places places a smaller storage burden on PyPI which " +"has over 400,000 packages to support." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:93 +msgid "" +"[Read more about reasons to use the **src/package** " +"layout](https://hynek.me/articles/testing-packaging/)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:95 +msgid "How Python discovers and prioritizes importing modules" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:97 +msgid "" +"By default, Python adds a module in your current working directory to the" +" front of the Python module search path." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:99 +msgid "" +"This means that if you run your tests in your package's working " +"directory, using a flat layout, `/package/module.py`, Python will " +"discover `package/module.py` file before it discovers the installed " +"package." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:101 +msgid "" +"However, if your package lives in a src/ directory structure " +"**src/package** then it won't be, by default, added to the Python path. " +"This means that when you import your package, Python will be forced to " +"search the active environment (which has your package installed)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:103 +msgid "" +"Note: Python versions 3.11 and above have a path setting that can be " +"adjusted to ensure the priority is to use installed packages first (e.g. " +"`PYTHONSAFEPATH`)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:106 +msgid "Sometimes tests are needed in a distribution" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:108 +msgid "" +"We do not recommend including tests as part of your package wheel by " +"default. However, not including tests in your package distribution will " +"make it harder for people other than yourself to test whether your " +"package is functioning correctly on their system. If you have a small " +"test suite (Python files + data), and think your users may want to run " +"tests locally on their systems, you can include tests by moving the " +"`tests/` directory into the **src/package** directory (see example " +"below)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:117 +msgid "" +"Including the **tests/** directory in your **src/package** directory " +"ensures that tests will be included in your package's wheel." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:119 +msgid "" +"Be sure to read the [pytest documentation for more about including tests " +"in your package " +"distribution](https://docs.pytest.org/en/7.2.x/explanation/goodpractices.html#choosing-a" +"-test-layout-import-rules)." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:121 +msgid "Challenges with including tests and data in a package wheel" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:124 +msgid "" +"Tests, especially when accompanied by test data can create a few small " +"challenges including:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:126 +msgid "" +"Take up space in your distribution which will build up over time as " +"storage space on PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:127 +msgid "Large file sizes can also slow down package install." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:129 +msgid "" +"However, in some cases, particularly in the scientific Python ecosystems " +"you may need to include tests." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:132 +msgid "**Don't include test suite datasets in your package**" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:134 +msgid "" +"If you do include your tests in your package distribution, we strongly " +"discourage you from including data in your test suite directory. Rather, " +"host your test data in a repository such as Figshare or Zenodo. Use a " +"tool such as [Pooch](https://www.fatiando.org/pooch/latest/) to access " +"the data when you (or a user) runs tests." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:140 +msgid "" +"Check out the testing section of our guide for more information about " +"tests." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:142 +msgid "" +"The **src/package** layout is semantically more clear. Code is always " +"found in the **src/package** directory, `tests/` and `docs/`are in the " +"root directory." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:146 +msgid "" +"If your package tests require data, we suggest that you do NOT include " +"that data within your package structure. We will discuss this in more " +"detail in a tutorial. Include data in your package structure increases " +"the size of your distribution files. This places a maintenance toll on " +"repositories like PyPI and Anaconda.org that have to deal with thousands " +"of package uploads." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:153 +msgid "About the flat Python package layout" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:155 +msgid "Currently most scientific packages use the **flat-layout** given:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:157 +msgid "" +"It's the most commonly found layout with the scientific Python ecosystem " +"and people tend to look to other packages / maintainers that they respect" +" for examples of how to build Python packages." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:160 +msgid "" +"Many Python tools depend upon tools in other language and / or complex " +"builds with compilation steps. Many developers thus appreciate / are used" +" to features of the flat layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:164 +msgid "" +"While we present this layout here in our guide, we suggest that those " +"just getting started with python packaging start with the src/package " +"layout discussed above. Numerous packages in the ecosystem [have had to " +"move to a src/ layout](https://github.com/scikit-build/cmake-python-" +"distributions/pull/145)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:169 +msgid "Why most scientific Python packages do not use source" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:172 +msgid "" +"In most cases the advantages of using the **src/package** layout for " +"larger scientific packages that already use flat approach are not worth " +"it. Moving from a flat layout to a **src/package** layout would come at a" +" significant cost to maintainers." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:177 +msgid "" +"However, the advantages of using the **src/package** layout for a " +"beginner are significant. As such, we recommend that if you are getting " +"started with creating a package, that you consider using a " +"**src/package** layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:182 +msgid "What does the flat layout structure look like?" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:184 +msgid "The flat layout's primary characteristics are:" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:186 +msgid "" +"The source code for your package lives in a directory with your package's" +" name in the root of your directory" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:188 +msgid "" +"Often the `tests/` directory also lives within that same `package` " +"directory." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:190 +msgid "" +"Below you can see the recommended structure of a scientific Python " +"package using the flat layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:212 +msgid "Benefits of using the flat layout in your Python package" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:214 +msgid "" +"There are some benefits to the scientific community in using the flat " +"layout." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:216 +msgid "" +"This structure has historically been used across the ecosystem and " +"packages using it are unlikely to change." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:218 +msgid "" +"You can import the package directly from the root directory. For some " +"this is engrained in their respective workflows. However, for a beginner " +"the danger of doing this is that you are not developing and testing " +"against the installed version of your package. Rather, you are working " +"directly with the flat files." +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:224 +msgid "Core scientific Python packages that use the flat layout" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:227 +msgid "[numpy](https://github.com/numpy/numpy)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:228 +msgid "[scipy](https://github.com/scipy/scipy)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:229 +msgid "[pandas](https://github.com/pandas-dev/pandas)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:230 +msgid "[xarray](https://github.com/pydata/xarray)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:231 +msgid "[Jupyter-core](https://github.com/jupyter/jupyter_core)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:232 +msgid "[Jupyter notebook](https://github.com/jupyter/notebook)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:233 +msgid "[scikit-learn](https://github.com/scikit-learn/scikit-learn)" +msgstr "" + +#: ../../package-structure-code/python-package-structure.md:235 +msgid "" +"It would be a significant maintenance cost and burden to move all of " +"these packages to a different layout. The potential benefits of the " +"source layout for these tools is not worth the maintenance investment." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:1 +msgid "Creating New Versions of Your Python Package" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:6 +msgid "Key Takeways" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:8 +msgid "" +"Follow [semantic versioning guidelines (SemVer) " +"rules](https://semver.org/) when bumping (increasing) your Python's " +"package version; for example a major version bump (version 1.0 --> 2.0) " +"equates to breaking changes in your package's code for a user." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:9 +msgid "" +"You may want to consider using a plugin like hatch_vsc for managing " +"versions of your package - if you want to have a GitHub only release " +"workflow." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:10 +msgid "" +"Otherwise most major package build tools such as Hatch, Flit and PDM have" +" a version feature that will help you update your package's version" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:11 +msgid "Avoid updating your packages version number manually by hand in your code!" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:14 +msgid "" +"pyOpenSci recommends that you follow the [Python PEP " +"440](https://peps.python.org/pep-0440) which recommends using [semantic " +"versioning guidelines](https://www.python.org/dev/peps/pep-0440" +"/#semantic-versioning) when assigning release values to new versions of " +"your Python package." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:18 +msgid "" +"[Semantic versioning](https://semver.org/) is an approach to updating " +"package versions that considers the type and extent of a change that you " +"are making to the package code. Being consistent with how and when you " +"update your package versions is important as:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:23 +msgid "" +"It helps your users (which might include other developers that depend on " +"your package) understand the extent of changes to a package." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:24 +msgid "" +"It helps your development team make decisions about when to bump a " +"package version based on standard rules." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:26 +msgid "" +"Consistent version increases following semver rules mean that values of " +"your package version explain the extent of the changes made in the code " +"base from version to version. thus your package version numbers become " +"\"expressive\" in the same way that naming code variables well can [make " +"code expressive](https://medium.com/@daniel.oliver.king/writing-" +"expressive-code-b69ef7a5a2fa)." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:28 +msgid "A note about versioning" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:29 +msgid "" +"In some cases even small version changes can turn a package update into a" +" breaking change for some users. What is also important is that you " +"document how you version your code and if you can, also document your " +"deprecation policy for code." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:37 +msgid "SemVer rules" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:39 +msgid "Following SemVer, your bump your package version to a:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:41 +msgid "patch (1.1.1 --> 1.1.**2**)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:42 +msgid "minor (1.1.1 --> 1.**2**.1)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:43 +msgid "major (1.1.1 --> **2**.1.1)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:45 +msgid "version number change based on the following rules:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:47 +msgid "Given a version number MAJOR.MINOR.PATCH, increment the:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:49 +msgid "**MAJOR version** when you make incompatible API changes" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:50 +msgid "" +"**MINOR version** when you add functionality in a backwards compatible " +"manner" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:51 +msgid "" +"**PATCH version** when you make backwards compatible bug fixes Additional" +" labels for pre-release and build metadata are available as extensions to" +" the MAJOR.MINOR.PATCH format." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:56 +msgid "" +"Some people prefer to use [calver](https://calver.org/index.html) for " +"versioning. It may be a simpler-to-use system given it relies upon date " +"values associated with released versions. However, calver does not " +"provide a user with a sense of when a new version might break an existing" +" build. As such we still suggest semver." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:59 +msgid "" +"pyOpenSci will never require semver in a peer review as long as a package" +" has a reasonable approach to versioning!" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:63 +msgid "Avoid manually updating Python package version numbers if you can" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:65 +msgid "" +"Often times you may want to have your package version value in multiple " +"locations. One example of this is that it might be both an attribute in " +"your package **version** and also called in your documentation." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:70 +msgid "" +"We recommend that you avoid manual updates of your package version number" +" to avoid human-error. It is better practice to keep your version number " +"in one location." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:74 +msgid "" +"If you can't implement a single location version, then consider using a " +"tool like hatch, PDM or bump2version that will update the version values " +"for you - throughout your package." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:78 +msgid "" +"Below we discuss some tools that you can use to manage updating Python " +"package versions." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:83 +msgid "Tools to manage versions for your Python package" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:85 +msgid "" +"There are a handful of tools that are widely used in the scientific " +"ecosystem that you can use to manage your package versions. Some of these" +" tools are built into or work with your chosen [packaging build tools " +"that discussed in this chapter.](python-package-build-tools)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:91 +msgid "Below, we provide an overview of these tools." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:97 +msgid "" +"There are three general groups of tools that you can use to manage " +"package versions:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:100 +msgid "" +"**semantic release tools:** These tools will automagically determine what" +" type of version bump to use using the text in your commit messages. " +"Below we discuss [Python Semantic Release](https://python-semantic-" +"release.readthedocs.io/en/latest/) as a Python tool that implements a " +"semantic versioning approach." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:102 +msgid "" +"**Manual incremental bump tools:** Tools like " +"[Hatch](https://hatch.pypa.io/latest/version/) offer version bumping " +"within your package. Normally this is implemented at the command link for" +" instance `hatch version major` would bump your project from 0.x to 1.0." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:103 +msgid "" +"**Version Control System tools:** Finally there are tools that rely on " +"your version control system to track versions. These tools often are " +"plugins to your package build tool (ex: setuptools build or hatchling). " +"We discuss this option below assuming that you are using **.git tags** " +"and **GitHub** to manage your package repository." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:105 +msgid "Semantic release, vs version control based vs manual version bumping" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:107 +msgid "" +"Generally semantic release and version control system tools can be setup " +"to run automatically on GitHub using GitHub actions. This means that you " +"can create a workflow where a GitHub release and associated new version " +"tag is used to trigger an automated build that:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:113 +msgid "Builds your package and updates the version following the new tag" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:114 +msgid "Tests the build and publishes to test PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:115 +msgid "Publishes the package to PyPI" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:118 +msgid "" +"Bumping a package version refers to the step of increasing the package " +"version after a set number of changes have been made to it. For example, " +"you might bump from version 0.8 to 0.9 of a package. or from 0.9 to 1.0." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:122 +msgid "" +"Using semantic versioning, there are three main \"levels\" of versions " +"that you might consider:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:125 +msgid "Major, minor and patch. These are described in more detail below." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:128 +msgid "Tools for bumping Python package versions" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:130 +msgid "" +"In this section we discuss the following tools for managing your Python " +"package's version:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:133 +msgid "hatch &" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:134 +msgid "hatch_vcs plugin for hatchling" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:135 +msgid "setuptools-scm" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:136 +msgid "python-semantic-version" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:138 +msgid "Tool 1: Hatch and other build tools that offer incremental versioning" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:140 +msgid "" +"Many of the modern build tool front end tools offer version support that " +"follow semantic versioning rules. These tools are different from Python " +"Semantic Version in that they do not require specific commit messages to " +"implement version. Rather, they allow you to update the version at the " +"command line using commands such as:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:146 +msgid "`tool-name version update major`" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:147 +msgid "`tool-name version update minor`" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:149 +msgid "" +"[Hatch](https://hatch.pypa.io/latest/version/), for instance offers " +"`hatch version minor` which will modify the version of your package " +"incrementally. With **Hatch** the version value will be found in your " +"`pyproject.toml` file. " +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:152 +msgid "Hatch (or other tools like PDM) Pros" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:154 +msgid "Easy to use version updates locally using a single tool!" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:156 +msgid "Hatch (or other tools like PDM) Cons" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:158 +msgid "" +"There will be some setup involved to ensure package version is updated " +"throughout your package" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:160 +msgid "Tool 2: Hatch_vcs & hatchling build back-end" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:162 +msgid "" +"[hatch_vcs](https://github.com/ofek/hatch-vcs) is a versioning tool that " +"allows you to manage package versions using **git tags**. Hatch_vcs " +"creates a **\\_version.py** file in your package ecosystem that keeps " +"track of the package's current version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:167 +msgid "" +"Hatch keeps track of your package's version in a `_version.py` file. " +"Storing the version in a single file managed by Hatch provides your " +"package with a \"single source of truth\" value for the version number. " +"This in turn eliminates potential error associated with manually updating" +" your package's version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:173 +msgid "" +"When you (or your CI system) build your package, hatch checks the current" +" tag number for your package. if it has increased, it will update the " +"**\\_version.py** file with the new value." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:176 +msgid "" +"Thus, when you create a new tag or a new release with a tag and build " +"your package, Hatch will access the new tag value and use it to update " +"your package version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:179 +msgid "" +"To use **hatch_vcs** you will need to use the **hatchling** build back " +"end." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:182 +msgid "" +"Hatchling can also be used with any of the modern build tools including " +"**Flit** and **PDM** if you prefer those for your day to day workflow." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:187 +msgid "Hatch example setup in your pyproject.toml" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:196 +msgid "" +"**Hatch_vcs** supports a fully automated package release and build, and " +"push to PyPI workflow on GitHub." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:206 +msgid "" +"If you use **setuptools_scm**, then you might find **hatch_vcs** and " +"**hatchling** to be the modern equivalent to your current setuptools / " +"build workflow." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:209 +msgid "hatch_vcs Pros" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:211 +msgid "Hatch supports modern Python packaging standards" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:212 +#: ../../package-structure-code/python-package-versions.md:238 +msgid "It creates a single-source file that contains your package version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:213 +#: ../../package-structure-code/python-package-versions.md:239 +msgid "You never manually update the package version" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:214 +#: ../../package-structure-code/python-package-versions.md:240 +msgid "" +"You can automate writing the version anywhere in your package including " +"your documentation!" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:215 +#: ../../package-structure-code/python-package-versions.md:241 +msgid "" +"It supports a purely GitHub based release workflow. This simplifies " +"maintenance workflows." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:216 +#: ../../package-structure-code/python-package-versions.md:242 +msgid "" +"Version number is updated in your package via a hidden `_version.py` " +"file. There is no manual configuration updates required." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:217 +#: ../../package-structure-code/python-package-versions.md:243 +msgid "" +"While we like detailed commit messages (See Python Semantic Version " +"below), we know that sometimes when maintaining a package specific " +"guidelines around commit messages can be hard to apply and manage." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:219 +msgid "hatch_vcs Cons" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:221 +msgid "" +"In a CI workflow you will end up manually entering or creating the " +"version number via a tag on GitHub. But you could locally develop a build" +" to \"bump\" tag versions" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:224 +msgid "Tool 3: setuptools-scm versioning using git tags" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:226 +msgid "" +"[`Setuptools_scm`](https://github.com/pypa/setuptools_scm/) is an " +"extension that you can use with setuptools to manage package versions. " +"**Setuptools_scm** operates the same way that **hatch_vcs** (discussed " +"above) does. It stores a version in a **\\_version.py** file and relies " +"on (**git**) tags to determine the package's current version." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:232 +msgid "" +"If you are using **setuptools** as your primary build tool, then " +"`*setuptools-scm` is a good choice as:" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:236 +msgid "setuptools_scm Pros" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:244 +msgid "**setuptools** is still the most commonly used Python packaging build tool" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:246 +msgid "setuptools_scm Cons" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:248 +msgid "" +"In a CI workflow you will end up manually entering or creating the " +"version number via a tag on GitHub." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:249 +msgid "Not well documented" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:250 +msgid "" +"Because setuptools will always have to support backwards compatibility it" +" will always be slower in adopting modern Python packaging conventions." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:252 +msgid "" +"As such you might consider using a more modern tool such as **hatch_vcs**" +" and **hatchling** to build your package and manage package versions." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:264 +msgid "" +"Tool 4: [Python semantic release](https://python-semantic-" +"release.readthedocs.io/en/latest/)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:266 +msgid "" +"Python semantic release uses a commit message workflow that updates the " +"version of your package based on keywords found in your commit messages. " +"As the name implies, Python Semantic Release follows semver release " +"rules." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:271 +msgid "" +"With Python Semantic Release, versions are triggered using specific " +"language found in a git commit message." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:274 +msgid "" +"For example, the words `fix(attribute_warning):` trigger Python Semantic " +"Release to implement a **patch** version bump. For instance if your " +"package was at version 1.1.0 and you made the commit below with the words" +" fix(text-here), Python Semantic Release would bump your package to " +"version 1.1.1." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:284 +msgid "" +"Similarly a feature (`feat()`) triggers a minor version bump. For example" +" from version 1.1 to version 1.2" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:292 +msgid "" +"You can find a thoughtful discussion of python semantic version [in this " +"Python package guide](https://py-pkgs.org/07-releasing-versioning" +"#automatic-version-bumping). Note that the guide hasn't been updated " +"since 2020 and will potentially be updated in the future! But for now, " +"some of the commands are dated but the content is still excellent." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:295 +msgid "Python Semantic Release Pros" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:297 +msgid "Follows semver versioning closely" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:298 +msgid "" +"Enforces maintainers using descriptive commit messages which can simplify" +" troubleshooting and ensure a cleaner and more self-describing git " +"history." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:300 +msgid "Python Semantic Release Cons" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:302 +msgid "" +"Requires very specific commit language to work. In practice some " +"maintainers and contributors may not be able to maintain that level of " +"specificity in commit messages (NOTE: there are bots that will check git " +"commit messages in a repo)" +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:303 +msgid "" +"Release happens at the command line. This makes is harder to implement a " +"GitHub based release workflow as the wrong commit message could trigger a" +" release." +msgstr "" + +#: ../../package-structure-code/python-package-versions.md:304 +msgid "" +"The version number is manually updated in a configuration file such as " +"`pyproject.toml` vs. in a package **\\_version.py** file." +msgstr "" + diff --git a/locales/jp/LC_MESSAGES/tests.po b/locales/jp/LC_MESSAGES/tests.po new file mode 100644 index 00000000..b0efcaa7 --- /dev/null +++ b/locales/jp/LC_MESSAGES/tests.po @@ -0,0 +1,1002 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: jp\n" +"Language-Team: jp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../tests/index.md:72 +msgid "Intro" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Write tests" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Test types" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Run tests locally" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Run tests online (using CI)" +msgstr "" + +#: ../../tests/index.md:72 +msgid "Create & Run Tests" +msgstr "" + +#: ../../tests/index.md:1 +msgid "Tests and data for your Python package" +msgstr "" + +#: ../../tests/index.md:3 +msgid "" +"Tests are an important part of your Python package because they provide a" +" set of checks that ensure that your package is functioning how you " +"expect it to." +msgstr "" + +#: ../../tests/index.md:7 +msgid "" +"In this section you will learn more about the importance of writing tests" +" for your Python package and how you can setup infrastructure to run your" +" tests both locally and on GitHub." +msgstr "" + +#: ../../tests/index.md:19 +msgid "✨ Why write tests ✨" +msgstr "" + +#: ../../tests/index.md:24 +msgid "" +"Learn more about the art of writing tests for your Python package. Learn " +"about why you should write tests and how they can help you and potential " +"contributors to your project." +msgstr "" + +#: ../../tests/index.md:31 +msgid "✨ Types of tests ✨" +msgstr "" + +#: ../../tests/index.md:36 +msgid "" +"There are three general types of tests that you can write for your Python" +" package: unit tests, integration tests and end-to-end (or functional) " +"tests. Learn about all three." +msgstr "" + +#: ../../tests/index.md:42 +msgid "✨ Run tests locally ✨" +msgstr "" + +#: ../../tests/index.md:47 +msgid "" +"If you expect your users to use your package across different versions of" +" Python, then using an automation tool such as nox to run your tests is " +"useful. Learn about the various tools that you can use to run your tests " +"across python versions here." +msgstr "" + +#: ../../tests/index.md:53 +msgid "✨ Run tests online (using CI) ✨" +msgstr "" + +#: ../../tests/index.md:58 +msgid "" +"Continuous integration platforms such as GitHub actions can be useful for" +" running your tests across both different Python versions and different " +"operating systems. Learn about setting up tests to run in Continuous " +"Integration here." +msgstr "" + +#: ../../tests/index.md:69 +msgid "Graphic showing the elements of the packaging process." +msgstr "" + +#: ../../tests/run-tests.md:6 +msgid "Run Python package tests" +msgstr "" + +#: ../../tests/run-tests.md:8 +msgid "" +"Running your tests is important to ensure that your package is working as" +" expected. It's good practice to consider that tests will run on your " +"computer and your users' computers that may be running a different Python" +" version and operating systems. Think about the following when running " +"your tests:" +msgstr "" + +#: ../../tests/run-tests.md:11 +msgid "" +"Run your test suite in a matrix of environments that represent the Python" +" versions and operating systems your users are likely to have." +msgstr "" + +#: ../../tests/run-tests.md:12 +msgid "" +"Running your tests in an isolated environment provides confidence in the " +"tests and their reproducibility. This ensures that tests do not pass " +"randomly due to your computer's specific setup. For instance, you might " +"have unexpectedly installed dependencies on your local system that are " +"not declared in your package's dependency list. This oversight could lead" +" to issues when others try to install or run your package on their " +"computers." +msgstr "" + +#: ../../tests/run-tests.md:14 +msgid "" +"On this page, you will learn about the tools that you can use to both run" +" tests in isolated environments and across Python versions." +msgstr "" + +#: ../../tests/run-tests.md:19 +msgid "Tools to run your tests" +msgstr "" + +#: ../../tests/run-tests.md:21 +msgid "" +"There are three categories of tools that will make is easier to setup and" +" run your tests in various environments:" +msgstr "" + +#: ../../tests/run-tests.md:24 +msgid "" +"A **test framework**, is a package that provides a particular syntax and " +"set of tools for _both writing and running your tests_. Some test " +"frameworks also have plugins that add additional features such as " +"evaluating how much of your code the tests cover. Below you will learn " +"about the **pytest** framework which is one of the most commonly used " +"Python testing frameworks in the scientific ecosystem. Testing frameworks" +" are essential but they only serve to run your tests. These frameworks " +"don't provide a way to easily run tests across Python versions without " +"the aid of additional automation tools." +msgstr "" + +#: ../../tests/run-tests.md:25 +msgid "" +"**Automation tools** allow you to automate running workflows such as " +"tests in specific ways using user-defined commands. For instance it's " +"useful to be able to run tests across different Python versions with a " +"single command. Tools such as " +"[**nox**](https://nox.thea.codes/en/stable/index.html) and " +"[**tox**](https://tox.wiki/en/latest/index.html) also allow you to run " +"tests across Python versions. However, it will be difficult to test your " +"build on different operating systems using only nox and tox - this is " +"where continuous integration (CI) comes into play." +msgstr "" + +#: ../../tests/run-tests.md:26 +msgid "" +"**Continuous Integration (CI):** is the last tool that you'll need to run" +" your tests. CI will not only allow you to replicate any automated builds" +" you create using nox or tox to run your package in different Python " +"environments. It will also allow you to run your tests on different " +"operating systems (Windows, Mac and Linux). [We discuss using CI to run " +"tests here](tests-ci)." +msgstr "" + +#: ../../tests/run-tests.md:28 +msgid "Table: Testing & Automation Tool" +msgstr "" + +#: ../../tests/run-tests.md:35 +msgid "Features" +msgstr "" + +#: ../../tests/run-tests.md:36 +msgid "Testing Framework (pytest)" +msgstr "" + +#: ../../tests/run-tests.md:37 +msgid "Test Runner (Tox)" +msgstr "" + +#: ../../tests/run-tests.md:38 +msgid "Automation Tools (Nox)" +msgstr "" + +#: ../../tests/run-tests.md:39 +msgid "Continuous Integration (GitHub Actions)" +msgstr "" + +#: ../../tests/run-tests.md:40 +msgid "Run Tests Locally" +msgstr "" + +#: ../../tests/run-tests.md:41 ../../tests/run-tests.md:42 +#: ../../tests/run-tests.md:43 ../../tests/run-tests.md:49 +#: ../../tests/run-tests.md:52 ../../tests/run-tests.md:53 +#: ../../tests/run-tests.md:54 ../../tests/run-tests.md:57 +#: ../../tests/run-tests.md:58 ../../tests/run-tests.md:59 +#: ../../tests/run-tests.md:64 ../../tests/run-tests.md:68 +#: ../../tests/run-tests.md:69 +msgid "" +msgstr "" + +#: ../../tests/run-tests.md:44 ../../tests/run-tests.md:46 +#: ../../tests/run-tests.md:47 ../../tests/run-tests.md:48 +#: ../../tests/run-tests.md:51 ../../tests/run-tests.md:56 +#: ../../tests/run-tests.md:61 ../../tests/run-tests.md:62 +#: ../../tests/run-tests.md:63 ../../tests/run-tests.md:66 +#: ../../tests/run-tests.md:67 +msgid "" +msgstr "" + +#: ../../tests/run-tests.md:45 +msgid "Run Tests Online" +msgstr "" + +#: ../../tests/run-tests.md:50 +msgid "Run Tests Across Python Versions" +msgstr "" + +#: ../../tests/run-tests.md:55 +msgid "Run Tests In Isolated Environments" +msgstr "" + +#: ../../tests/run-tests.md:60 +msgid "Run Tests Across Operating Systems (Windows, MacOS, Linux)" +msgstr "" + +#: ../../tests/run-tests.md:65 +msgid "Use for other automation tasks (e.g. building docs)" +msgstr "" + +#: ../../tests/run-tests.md:73 +msgid "What testing framework / package should I use to run tests?" +msgstr "" + +#: ../../tests/run-tests.md:75 +msgid "" +"We recommend using `Pytest` to build and run your package tests. Pytest " +"is the most common testing tool used in the Python ecosystem." +msgstr "" + +#: ../../tests/run-tests.md:77 +msgid "" +"[The Pytest package](https://docs.pytest.org/en/latest/) also has a " +"number of extensions that can be used to add functionality such as:" +msgstr "" + +#: ../../tests/run-tests.md:80 +msgid "" +"[pytest-cov](https://pytest-cov.readthedocs.io/en/latest/) allows you to " +"analyze the code coverage of your package during your tests, and " +"generates a report that you can [upload to codecov](https://codecov.io/)." +msgstr "" + +#: ../../tests/run-tests.md:82 ../../tests/run-tests.md:174 +#: ../../tests/test-types.md:14 ../../tests/tests-ci.md:7 +msgid "Todo" +msgstr "" + +#: ../../tests/run-tests.md:83 +msgid "Learn more about code coverage here. (add link)" +msgstr "" + +#: ../../tests/run-tests.md:87 +msgid "" +"Your editor or IDE may add additional convenience for running tests, " +"setting breakpoints, and toggling the `–no-cov` flag. Check your editor's" +" documentation for more information." +msgstr "" + +#: ../../tests/run-tests.md:90 +msgid "Run tests using pytest" +msgstr "" + +#: ../../tests/run-tests.md:92 +msgid "If you are using **pytest**, you can run your tests locally by calling:" +msgstr "" + +#: ../../tests/run-tests.md:95 +msgid "`pytest`" +msgstr "" + +#: ../../tests/run-tests.md:97 +msgid "" +"Or if you want to run a specific test file - let's call this file " +"\"`test_module.py`\" - you can run:" +msgstr "" + +#: ../../tests/run-tests.md:99 +msgid "`pytest test_module.py`" +msgstr "" + +#: ../../tests/run-tests.md:101 +msgid "" +"Learn more from the [get started docs](https://docs.pytest.org/en/7.1.x" +"/getting-started.html)." +msgstr "" + +#: ../../tests/run-tests.md:103 +msgid "" +"Running pytest on your computer is going to run your tests in whatever " +"Python environment you currently have activated. This means that tests " +"will be run on a single version of Python and only on the operating " +"system that you are running locally." +msgstr "" + +#: ../../tests/run-tests.md:108 +msgid "" +"An automation tool can simplify the process of running tests in various " +"Python environments." +msgstr "" + +#: ../../tests/run-tests.md:111 +msgid "Tests across operating systems" +msgstr "" + +#: ../../tests/run-tests.md:112 +msgid "" +"If you want to run your tests across different operating systems you can " +"[continuous integration. Learn more here](tests-ci)." +msgstr "" + +#: ../../tests/run-tests.md:115 +msgid "Tools to automate running your tests" +msgstr "" + +#: ../../tests/run-tests.md:117 +msgid "" +"To run tests on various Python versions or in various specific " +"environments with a single command, you can use an automation tool such " +"as `nox` or `tox`. Both `nox` and `tox` can create an isolated virtual " +"environments. This allows you to easily run your tests in multiple " +"environments and across Python versions." +msgstr "" + +#: ../../tests/run-tests.md:120 +msgid "" +"We will focus on [Nox](https://nox.thea.codes/) in this guide. `nox` is a" +" Python-based automation tool that builds upon the features of both " +"`make` and `tox`. `nox` is designed to simplify and streamline testing " +"and development workflows. Everything that you do with `nox` can be " +"implemented using a Python-based interface." +msgstr "" + +#: ../../tests/run-tests.md:122 +msgid "Other automation tools you'll see in the wild" +msgstr "" + +#: ../../tests/run-tests.md:125 +msgid "" +"**[Tox](https://tox.wiki/en/latest/index.html#useful-links)** is an " +"automation tool that supports common steps such as building " +"documentation, running tests across various versions of Python, and more." +" You can find [a nice overview of tox in the plasmaPy " +"documentation](https://docs.plasmapy.org/en/stable/contributing/testing_guide.html" +"#using-tox)." +msgstr "" + +#: ../../tests/run-tests.md:127 +msgid "" +"**[Hatch](https://github.com/ofek/hatch)** is a modern end-to-end " +"packaging tool that works with the popular build backend called " +"hatchling. `hatch` offers a `tox`-like setup where you can run tests " +"locally using different Python versions. If you are using `hatch` to " +"support your packaging workflow, you may want to also use its testing " +"capabilities rather than using `nox`." +msgstr "" + +#: ../../tests/run-tests.md:129 +msgid "" +"[**make:**](https://www.gnu.org/software/make/manual/make.html) Some " +"developers use Make, which is a build automation tool, for running tests " +"due to its versatility; it's not tied to a specific language and can be " +"used to run various build processes. However, Make's unique syntax and " +"approach can make it more challenging to learn, particularly if you're " +"not already familiar with it. Make also won't manage environments for you" +" like **nox** will do." +msgstr "" + +#: ../../tests/run-tests.md:136 +msgid "Run tests across Python versions with nox" +msgstr "" + +#: ../../tests/run-tests.md:138 +msgid "**Nox** is a great automation tool to learn because it:" +msgstr "" + +#: ../../tests/run-tests.md:140 +msgid "Is Python-based making it accessible if you already know Python and" +msgstr "" + +#: ../../tests/run-tests.md:141 +msgid "Will create isolated environments to run workflows." +msgstr "" + +#: ../../tests/run-tests.md:143 +msgid "" +"`nox` simplifies creating and managing testing environments. With `nox`, " +"you can set up virtual environments, and run tests across Python versions" +" using the environment manager of your choice with a single command." +msgstr "" + +#: ../../tests/run-tests.md:148 +msgid "Nox Installations" +msgstr "" + +#: ../../tests/run-tests.md:150 +msgid "" +"When you install and use nox to run tests across different Python " +"versions, nox will create and manage individual `venv` environments for " +"each Python version that you specify in the nox function." +msgstr "" + +#: ../../tests/run-tests.md:152 +msgid "Nox will manage each environment on its own." +msgstr "" + +#: ../../tests/run-tests.md:154 +msgid "" +"Nox can also be used for other development tasks such as building " +"documentation, creating your package distribution, and testing " +"installations across both PyPI related environments (e.g. venv, " +"virtualenv) and `conda` (e.g. `conda-forge`)." +msgstr "" + +#: ../../tests/run-tests.md:158 +msgid "" +"To get started with nox, you create a `noxfile.py` file at the root of " +"your project directory. You then define commands using Python functions. " +"Some examples of that are below." +msgstr "" + +#: ../../tests/run-tests.md:162 +msgid "Test Environments" +msgstr "" + +#: ../../tests/run-tests.md:164 +msgid "" +"By default, `nox` uses the Python built in `venv` environment manager. A " +"virtual environment (`venv`) is a self-contained Python environment that " +"allows you to isolate and manage dependencies for different Python " +"projects. It helps ensure that project-specific libraries and packages do" +" not interfere with each other, promoting a clean and organized " +"development environment." +msgstr "" + +#: ../../tests/run-tests.md:166 +msgid "" +"An example of using nox to run tests in `venv` environments for Python " +"versions 3.9, 3.10, 3.11 and 3.12 is below." +msgstr "" + +#: ../../tests/run-tests.md:169 +msgid "" +"Note that for the code below to work, you need to have all 4 versions of " +"Python installed on your computer for `nox` to find." +msgstr "" + +#: ../../tests/run-tests.md:172 +msgid "Nox with venv environments" +msgstr "" + +#: ../../tests/run-tests.md:175 +msgid "" +"TODO: add some tests above and show what the output would look like in " +"the examples below..." +msgstr "" + +#: ../../tests/run-tests.md:178 +msgid "" +"Below is an example of setting up nox to run tests using `venv` which is " +"the built in environment manager that comes with base Python." +msgstr "" + +#: ../../tests/run-tests.md:180 +msgid "" +"Note that the example below assumes that you have [setup your " +"`pyproject.toml` to declare test dependencies in a way that pip can " +"understand](../package-structure-code/declare-dependencies.md). An " +"example of that setup is below." +msgstr "" + +#: ../../tests/run-tests.md:201 +msgid "" +"If you have the above setup, then you can use " +"`session.install(\".[tests]\")` to install your test dependencies. Notice" +" that below one single nox session allows you to run your tests on 4 " +"different Python environments (Python 3.9, 3.10, 3.11, and 3.12)." +msgstr "" + +#: ../../tests/run-tests.md:222 +msgid "" +"Above you create a nox session in the form of a function with a " +"`@nox.session` decorator. Notice that within the decorator you declare " +"the versions of python that you wish to run." +msgstr "" + +#: ../../tests/run-tests.md:226 +msgid "" +"To run the above you'd execute the following command, specifying which " +"session with `--session` (sometimes shortened to `-s`). Your function " +"above is called test, therefore the session name is test." +msgstr "" + +#: ../../tests/run-tests.md:234 +msgid "Nox with conda / mamba" +msgstr "" + +#: ../../tests/run-tests.md:236 +msgid "" +"Below is an example for setting up nox to use mamba (or conda) for your " +"environment manager. Note that unlike venv, conda can automatically " +"install the various versions of Python that you need. You won't need to " +"install all four Python versions if you use conda/mamba, like you do with" +" `venv`." +msgstr "" + +#: ../../tests/run-tests.md:242 +msgid "" +"For `conda` to work with `nox`, you will need to ensure that either " +"`conda` or `mamba` is installed on your computer." +msgstr "" + +#: ../../tests/run-tests.md:264 +msgid "To run the above session you'd use:" +msgstr "" + +#: ../../tests/test-types.md:1 +msgid "Test Types for Python packages" +msgstr "" + +#: ../../tests/test-types.md:3 +msgid "Three types of tests: Unit, Integration & Functional Tests" +msgstr "" + +#: ../../tests/test-types.md:5 +msgid "" +"There are different types of tests that you want to consider when " +"creating your test suite:" +msgstr "" + +#: ../../tests/test-types.md:8 +msgid "Unit tests" +msgstr "" + +#: ../../tests/test-types.md:9 +msgid "Integration" +msgstr "" + +#: ../../tests/test-types.md:10 +msgid "End-to-end (also known as Functional) tests" +msgstr "" + +#: ../../tests/test-types.md:12 +msgid "" +"Each type of test has a different purpose. Here, you will learn about all" +" three types of tests." +msgstr "" + +#: ../../tests/test-types.md:15 +msgid "" +"I think this page would be stronger if we did have some examples from our" +" package here: https://github.com/pyOpenSci/pyosPackage" +msgstr "" + +#: ../../tests/test-types.md:20 +msgid "Unit Tests" +msgstr "" + +#: ../../tests/test-types.md:22 +msgid "" +"A unit test involves testing individual components or units of code in " +"isolation to ensure that they work correctly. The goal of unit testing is" +" to verify that each part of the software, typically at the function or " +"method level, performs its intended task correctly." +msgstr "" + +#: ../../tests/test-types.md:24 +msgid "" +"Unit tests can be compared to examining each piece of your puzzle to " +"ensure parts of it are not broken. If all of the pieces of your puzzle " +"don’t fit together, you will never complete it. Similarly, when working " +"with code, tests ensure that each function, attribute, class, method " +"works properly when isolated." +msgstr "" + +#: ../../tests/test-types.md:26 +msgid "" +"**Unit test example:** Pretend that you have a function that converts a " +"temperature value from Celsius to Fahrenheit. A test for that function " +"might ensure that when provided with a value in Celsius, the function " +"returns the correct value in degrees Fahrenheit. That function is a unit " +"test. It checks a single unit (function) in your code." +msgstr "" + +#: ../../tests/test-types.md:44 +msgid "" +"Example unit test for the above function. You'd run this test using the " +"`pytest` command in your **tests/** directory." +msgstr "" + +#: ../../tests/test-types.md:65 ../../tests/test-types.md:115 +msgid "" +"image of puzzle pieces that all fit together nicely. The puzzle pieces " +"are colorful - purple, green and teal." +msgstr "" + +#: ../../tests/test-types.md:69 +msgid "" +"Your unit tests should ensure each part of your code works as expected on" +" its own." +msgstr "" + +#: ../../tests/test-types.md:72 +msgid "Integration tests" +msgstr "" + +#: ../../tests/test-types.md:74 +msgid "" +"Integration tests involve testing how parts of your package work together" +" or integrate. Integration tests can be compared to connecting a bunch of" +" puzzle pieces together to form a whole picture. Integration tests focus " +"on how different pieces of your code fit and work together." +msgstr "" + +#: ../../tests/test-types.md:76 +msgid "" +"For example, if you had a series of steps that collected temperature data" +" in a spreadsheet, converted it from degrees celsius to Fahrenheit and " +"then provided an average temperature for a particular time period. An " +"integration test would ensure that all parts of that workflow behaved as " +"expected." +msgstr "" + +#: ../../tests/test-types.md:107 +msgid "" +"image of two puzzle pieces with some missing parts. The puzzle pieces are" +" purple teal yellow and blue. The shapes of each piece don’t fit " +"together." +msgstr "" + +#: ../../tests/test-types.md:112 +msgid "" +"If puzzle pieces have missing ends, they can’t work together with other " +"elements in the puzzle. The same is true with individual functions, " +"methods and classes in your software. The code needs to work both " +"individually and together to perform certain sets of tasks." +msgstr "" + +#: ../../tests/test-types.md:120 +msgid "" +"Your integration tests should ensure that parts of your code that are " +"expected to work together, do so as expected." +msgstr "" + +#: ../../tests/test-types.md:124 +msgid "End-to-end (functional) tests" +msgstr "" + +#: ../../tests/test-types.md:126 +msgid "" +"End-to-end tests (also referred to as functional tests) in Python are " +"like comprehensive checklists for your software. They simulate real user " +"end-to-end workflows to make sure the code base supports real life " +"applications and use-cases from start to finish. These tests help catch " +"issues that might not show up in smaller tests and ensure your entire " +"application or program behaves correctly. Think of them as a way to give " +"your software a final check before it's put into action, making sure it's" +" ready to deliver a smooth experience to its users." +msgstr "" + +#: ../../tests/test-types.md:128 +msgid "Image of a completed puzzle showing a daisy" +msgstr "" + +#: ../../tests/test-types.md:133 +msgid "" +"End-to-end or functional tests represent an entire workflow that you " +"expect your package to support." +msgstr "" + +#: ../../tests/test-types.md:137 +msgid "" +"End-to-end test also test how a program runs from start to finish. A " +"tutorial that you add to your documentation that runs in CI in an " +"isolated environment is another example of an end-to-end test." +msgstr "" + +#: ../../tests/test-types.md:140 +msgid "" +"For scientific packages, creating short tutorials that highlight core " +"workflows that your package supports, that are run when your " +"documentation is built could also serve as end-to-end tests." +msgstr "" + +#: ../../tests/test-types.md:143 +msgid "Comparing unit, integration and end-to-end tests" +msgstr "" + +#: ../../tests/test-types.md:145 +msgid "" +"Unit tests, integration tests, and end-to-end tests have complementary " +"advantages and disadvantages. The fine-grained nature of unit tests make " +"them well-suited for isolating where errors are occurring. However, unit " +"tests are not useful for verifying that different sections of code work " +"together." +msgstr "" + +#: ../../tests/test-types.md:147 +msgid "" +"Integration and end-to-end tests verify that the different portions of " +"the program work together, but are less well-suited for isolating where " +"errors are occurring. For example, when you refactor your code, it is " +"possible that that your end-to-end tests will break. But if the refactor " +"didn't introduce new behavior to your existing code, then you can rely on" +" your unit tests to continue to pass, testing the original functionality " +"of your code." +msgstr "" + +#: ../../tests/test-types.md:152 +msgid "" +"It is important to note that you don't need to spend energy worrying " +"about the specifics surrounding the different types of tests. When you " +"begin to work on your test suite, consider what your package does and how" +" you may need to test parts of your package. Bring familiar with the " +"different types of tests can provides a framework to help you think about" +" writing tests and how different types of tests can complement each " +"other." +msgstr "" + +#: ../../tests/tests-ci.md:1 +msgid "Run tests with Continuous Integration" +msgstr "" + +#: ../../tests/tests-ci.md:3 +msgid "" +"Running your [test suite locally](run-tests) is useful as you develop " +"code and also test new features or changes to the code base. However, you" +" also will want to setup Continuous Integration (CI) to run your tests " +"online. CI allows you to run all of your tests in the cloud. While you " +"may only be able to run tests locally on a specific operating system, " +"using CI you can specify tests to run both on various versions of Python " +"and across different operating systems." +msgstr "" + +#: ../../tests/tests-ci.md:5 +msgid "" +"CI can also be triggered for pull requests and pushes to your repository." +" This means that every pull request that you, your maintainer team or a " +"contributor submit, can be tested. In the end CI testing ensures your " +"code continues to run as expected even as changes are made to the code " +"base." +msgstr "" + +#: ../../tests/tests-ci.md:9 +msgid "" +"Learn more about Continuous Integration and how it can be used, here. " +"(add link)" +msgstr "" + +#: ../../tests/tests-ci.md:13 +msgid "CI & pull requests" +msgstr "" + +#: ../../tests/tests-ci.md:15 +msgid "" +"CI is invaluable if you have outside people contributing to your " +"software. You can setup CI to run on all pull requests submitted to your " +"repository. CI can make your repository more friendly to new potential " +"contributors. It allows users to contribute code, documentation fixes and" +" more without having to create development environments, run tests and " +"build documentation locally." +msgstr "" + +#: ../../tests/tests-ci.md:22 +msgid "Example GitHub action that runs tests" +msgstr "" + +#: ../../tests/tests-ci.md:24 +msgid "" +"Below is an example GitHub action that runs tests using nox across both " +"Windows, Mac and Linux and on Python versions 3.9-3.11." +msgstr "" + +#: ../../tests/tests-ci.md:28 +msgid "" +"To work properly, this file should be located in a root directory of your" +" GitHub repository:" +msgstr "" + +#: ../../tests/write-tests.md:1 +msgid "Write tests for your Python package" +msgstr "" + +#: ../../tests/write-tests.md:3 +msgid "" +"Writing code that tests your package code, also known as test suites, is " +"important for you as a maintainer, your users, and package contributors. " +"Test suites consist of sets of functions, methods, and classes that are " +"written with the intention of making sure a specific part of your code " +"works as you expected it to." +msgstr "" + +#: ../../tests/write-tests.md:7 +msgid "Why write tests for your package?" +msgstr "" + +#: ../../tests/write-tests.md:9 +msgid "" +"Tests act as a safety net for code changes. They help you spot and " +"rectify bugs before they affect users. Tests also instill confidence that" +" code alterations from contributors won't breaking existing " +"functionality." +msgstr "" + +#: ../../tests/write-tests.md:13 +msgid "Writing tests for your Python package is important because:" +msgstr "" + +#: ../../tests/write-tests.md:15 +msgid "" +"**Catch Mistakes:** Tests are a safety net. When you make changes or add " +"new features to your package, tests can quickly tell you if you " +"accidentally broke something that was working fine before." +msgstr "" + +#: ../../tests/write-tests.md:16 +msgid "" +"**Save Time:** Imagine you have a magic button that can automatically " +"check if your package is still working properly. Tests are like that " +"magic button! They can run all those checks for you saving you time." +msgstr "" + +#: ../../tests/write-tests.md:17 +msgid "" +"**Easier Collaboration:** If you're working with others, or have outside " +"contributors, tests help everyone stay on the same page. Your tests " +"explain how your package is supposed to work, making it easier for others" +" to understand and contribute to your project." +msgstr "" + +#: ../../tests/write-tests.md:18 +msgid "" +"**Fearless Refactoring:** Refactoring means making improvements to your " +"code structure without changing its behavior. Tests empower you to make " +"these changes as if you break something, test failures will let you know." +msgstr "" + +#: ../../tests/write-tests.md:19 +msgid "" +"**Documentation:** Tests serve as technical examples of how to use your " +"package. This can be helpful for a new technical contributor that wants " +"to contribute code to your package. They can look at your tests to " +"understand how parts of your code functionality fits together." +msgstr "" + +#: ../../tests/write-tests.md:20 +msgid "" +"**Long-Term ease of maintenance:** As your package evolves, tests ensure " +"that your code continues to behave as expected, even as you make changes " +"over time. Thus you are helping your future self when writing tests." +msgstr "" + +#: ../../tests/write-tests.md:21 +msgid "" +"**Easier pull request reviews:** By running your tests in a CI framework " +"such as GitHub actions, each time you or a contributor makes a change to " +"your code-base, you can catch issues and things that may have changed in " +"your code base. This ensures that your software behaves the way you " +"expect it to." +msgstr "" + +#: ../../tests/write-tests.md:23 +msgid "Tests for user edge cases" +msgstr "" + +#: ../../tests/write-tests.md:25 +msgid "" +"Edge cases refer to unexpected or \"outlier\" ways that some users may " +"use your package. Tests enable you to address various edge cases that " +"could impair your package's functionality. For example, what occurs if a " +"function expects a pandas `dataframe` but a user supplies a numpy " +"`array`? Does your code gracefully handle this situation, providing clear" +" feedback, or does it leave users frustrated by an unexplained failure?" +msgstr "" + +#: ../../tests/write-tests.md:33 +msgid "" +"For a good introduction to testing, see [this Software Carpentry " +"lesson](https://swcarpentry.github.io/python-novice-" +"inflammation/10-defensive.html)" +msgstr "" + +#: ../../tests/write-tests.md:41 +msgid "" +"Imagine you're working on a puzzle where each puzzle piece represents a " +"function, method, class or attribute in your Python package that you want" +" other people to be able to use. Would you want to give someone a puzzle " +"that has missing pieces or pieces that don't fit together? Providing " +"people with the right puzzle pieces that work together can be compared to" +" writing tests for your Python package." +msgstr "" + +#: ../../tests/write-tests.md:44 +msgid "Test examples" +msgstr "" + +#: ../../tests/write-tests.md:47 +msgid "" +"Let’s say you have a Python function that adds two numbers a and b " +"together." +msgstr "" + +#: ../../tests/write-tests.md:54 +msgid "" +"A test to ensure that function runs as you might expect when provided " +"with different numbers might look like this:" +msgstr "" + +#: ../../tests/write-tests.md:72 +msgid "🧩🐍" +msgstr "" + +#: ../../tests/write-tests.md:74 +msgid "How do I know what type of tests to write?" +msgstr "" + +#: ../../tests/write-tests.md:77 +msgid "" +"This section has been adapted from [a presentation by Nick " +"Murphy](https://zenodo.org/record/8185113)." +msgstr "" + +#: ../../tests/write-tests.md:80 +msgid "" +"At this point, you may be wondering - what should you be testing in your " +"package? Below are a few examples:" +msgstr "" + +#: ../../tests/write-tests.md:82 +msgid "" +"**Test some typical cases:** Test that the package functions as you " +"expect it to when users use it. For instance, if your package is supposed" +" to add two numbers, test that the outcome value of adding those two " +"numbers is correct." +msgstr "" + +#: ../../tests/write-tests.md:84 +msgid "" +"**Test special cases:** Sometimes there are special or outlier cases. For" +" instance, if a function performs a specific calculation that may become " +"problematic closer to the value = 0, test it with the input of both 0 and" +msgstr "" + +#: ../../tests/write-tests.md:86 +msgid "" +"**Test at and near the expected boundaries:** If a function requires a " +"value that is greater than or equal to 1, make sure that the function " +"still works with both the values 1 and less than one and 1.001 as well " +"(something close to the constraint value).." +msgstr "" + +#: ../../tests/write-tests.md:88 +msgid "" +"**Test that code fails correctly:** If a function requires a value " +"greater than or equal to 1, then test at 0.999. Make sure that the " +"function fails gracefully when given unexpected values and help and that " +"the user can easily understand why if failed (provides a useful error " +"message)." +msgstr "" + diff --git a/locales/jp/LC_MESSAGES/tutorials.po b/locales/jp/LC_MESSAGES/tutorials.po new file mode 100644 index 00000000..2f77b15f --- /dev/null +++ b/locales/jp/LC_MESSAGES/tutorials.po @@ -0,0 +1,5536 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, pyOpenSci +# This file is distributed under the same license as the pyOpenSci Python +# Package Guide package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: pyOpenSci Python Package Guide \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 18:04+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: jp\n" +"Language-Team: jp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../tutorials/add-license-coc.md:1 +msgid "Add a `LICENSE` & `CODE_OF_CONDUCT` to your Python package" +msgstr "" + +#: ../../tutorials/add-license-coc.md:3 +msgid "In the [previous lesson](add-readme) you:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:5 +msgid "" +" " +"Created a basic `README.md` file for your scientific Python package" +msgstr "" + +#: ../../tutorials/add-license-coc.md:7 +msgid "" +" " +"Learned about the core components that are useful to have in a `README` " +"file." +msgstr "" + +#: ../../tutorials/add-license-coc.md:9 ../../tutorials/add-readme.md:10 +msgid "Learning objectives" +msgstr "" + +#: ../../tutorials/add-license-coc.md:12 ../../tutorials/add-readme.md:12 +#: ../../tutorials/installable-code.md:41 ../../tutorials/pyproject-toml.md:22 +#: ../../tutorials/setup-py-to-pyproject-toml.md:15 +msgid "In this lesson you will learn:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:14 +msgid "" +"How to select a license and add a `LICENSE` file to your package " +"repository, with a focus on the GitHub interface." +msgstr "" + +#: ../../tutorials/add-license-coc.md:15 +msgid "How to add a `CODE_OF_CONDUCT` file to your package repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md:16 +msgid "" +"How you can use the Contributors Covenant website to add generic language" +" as a starting place for your `CODE_OF_CONDUCT`." +msgstr "" + +#: ../../tutorials/add-license-coc.md:19 +msgid "What is a license?" +msgstr "" + +#: ../../tutorials/add-license-coc.md:21 +msgid "" +"A license contains legal language about how users can use and reuse your " +"software. To set the `LICENSE` for your project, you:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:23 +msgid "" +"create a `LICENSE` file in your project directory that specifies the " +"license that you choose for your package and" +msgstr "" + +#: ../../tutorials/add-license-coc.md:24 +msgid "reference that file in your `pyproject.toml` data where metadata are set." +msgstr "" + +#: ../../tutorials/add-license-coc.md:26 +msgid "" +"By adding the `LICENSE` file to your `pyproject.toml` file, the `LICENSE`" +" will be included in your package's metadata which is used to populate " +"your package's PyPI landing page. The `LICENSE` is also used in your " +"GitHub repository's landing page interface." +msgstr "" + +#: ../../tutorials/add-license-coc.md:28 +msgid "What license should you use?" +msgstr "" + +#: ../../tutorials/add-license-coc.md:30 +msgid "" +"We suggest that you use a permissive license that accommodates the other " +"most commonly used licenses in the scientific Python ecosystem (MIT[^mit]" +" and BSD-3[^bsd3]). If you are unsure, use MIT given it's the generally " +"recommended license on [choosealicense.com](https://choosealicense.com/)." +msgstr "" + +#: ../../tutorials/add-license-coc.md:33 +msgid "Licenses for the scientific Python ecosystem" +msgstr "" + +#: ../../tutorials/add-license-coc.md:34 +msgid "" +"[We discuss licenses for the scientific Python ecosystem in more detail " +"here in our guidebook.](../documentation/repository-files/license-files)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:37 +msgid "Where should the `LICENSE` file live" +msgstr "" + +#: ../../tutorials/add-license-coc.md:39 +msgid "" +"Your `LICENSE` file should be placed at the root of your package's " +"repository. When you add the `LICENSE` at the root, GitHub will " +"automagically discover it and provide users with a direct link to your " +"`LICENSE` file within your GitHub repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md:45 +msgid "" +"Image showing the GitHub repository for SunPy an accepted pyOpenSci " +"package." +msgstr "" + +#: ../../tutorials/add-license-coc.md:47 +msgid "" +"Notice at the top of the README portion of the GitHub landing page, there" +" are three tabs directly linking to the `README` file which is visible, " +"the `CODE_OF_CONDUCT` file and one that specifies the license that SunPy " +"uses. These files are discovered by GitHub because they are placed in the" +" root of the project directory using standard naming conventions." +msgstr "" + +#: ../../tutorials/add-license-coc.md:54 +msgid "How to add a `LICENSE` file to your package directory" +msgstr "" + +#: ../../tutorials/add-license-coc.md:56 +msgid "There are several ways to add a `LICENSE` file:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:58 +msgid "" +"When you create a new repository on GitHub, it will ask you if you wish " +"to add a `LICENSE` file at that time. If you select yes, it will create " +"the file for you." +msgstr "" + +#: ../../tutorials/add-license-coc.md:59 +msgid "" +"You can add a `LICENSE` through the GitHub gui following the [ instructions " +"here](https://docs.github.com/en/communities/setting-up-your-project-for-" +"healthy-contributions/adding-a-license-to-a-repository)." +msgstr "" + +#: ../../tutorials/add-license-coc.md:60 +msgid "You can add the file manually as we are doing in this lesson." +msgstr "" + +#: ../../tutorials/add-license-coc.md:63 +msgid "If you completed the past lessons including" +msgstr "" + +#: ../../tutorials/add-license-coc.md:65 +msgid "[Making your code installable](installable-code.md) and" +msgstr "" + +#: ../../tutorials/add-license-coc.md:66 +msgid "[publishing your package to PyPI](publish-pypi.md)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:68 +msgid "" +"then you already have a `LICENSE` file containing text for the MIT " +"license in your Python package. Thus you can skip to the next section of " +"this tutorial which walks you through adding a `CODE_OF_CONDUCT`." +msgstr "" + +#: ../../tutorials/add-license-coc.md:70 +msgid "" +"If you don't yet have a `LICENSE` file in your directory, then continue " +"reading." +msgstr "" + +#: ../../tutorials/add-license-coc.md:73 +msgid "How to add a `LICENSE` to your package - the manual way" +msgstr "" + +#: ../../tutorials/add-license-coc.md:75 +msgid "" +"If you don't already have a `LICENSE` file, and you are not yet using a " +"platform such as GitHub or GitLab, then you can create a `LICENSE` file " +"by" +msgstr "" + +#: ../../tutorials/add-license-coc.md:77 +msgid "Create a new file called `LICENSE`. If you are using shell you can type:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:84 +msgid "Go to [choosealicense.com](https://choosealicense.com/)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:85 +msgid "Select permissive license" +msgstr "" + +#: ../../tutorials/add-license-coc.md:86 +msgid "" +"It will suggest that you use the [MIT " +"license](https://choosealicense.com/licenses/mit/)." +msgstr "" + +#: ../../tutorials/add-license-coc.md:87 +msgid "" +"Copy the license text that it provides into your `LICENSE` file that you " +"created above." +msgstr "" + +#: ../../tutorials/add-license-coc.md:88 +msgid "Save your file. You're all done!" +msgstr "" + +#: ../../tutorials/add-license-coc.md:90 +msgid "An overview of licenses in the scientific Python ecosystem" +msgstr "" + +#: ../../tutorials/add-license-coc.md:93 +msgid "" +"In the pyOpenSci [packaging guidebook](../documentation/repository-files" +"/license-files), we provide an overview of licenses in the scientific " +"Python ecosystem. We review why license files are important, which ones " +"are most commonly used for scientific software and how to select the " +"correct license." +msgstr "" + +#: ../../tutorials/add-license-coc.md:95 +msgid "" +"If you want a broad overview of why licenses are important for protecting" +" open source software, [check out this blog post that overviews the legal" +" side of things.](https://opensource.guide/legal/#just-give-me-the-tldr-" +"on-what-i-need-to-protect-my-project)" +msgstr "" + +#: ../../tutorials/add-license-coc.md +msgid "Instructions for adding a `LICENSE` file within the GitHub interface" +msgstr "" + +#: ../../tutorials/add-license-coc.md +msgid "Add license: new GitHub repository" +msgstr "" + +#: ../../tutorials/add-license-coc.md:106 +msgid "" +"When you create a new GitHub repository you can add a `LICENSE` file " +"through the GitHub interface." +msgstr "" + +#: ../../tutorials/add-license-coc.md:111 +msgid "" +"Screenshot of the create new repository interface that GitHub provides. " +"The elements of this are the owner and repository name for the new repo. " +"Below that you can add a description of the repository. Below that you " +"can set it to be public or private. At the bottom of the interface there " +"is an Add a README checkbox where it will add a blank readme file for " +"you. At the very bottom there is a line to add a .gitignore file and " +"another to choose a license." +msgstr "" + +#: ../../tutorials/add-license-coc.md:113 +msgid "" +"Image showing the GitHub interface that allows you to add a `LICENSE` and" +" `README` file when you create a new repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md +msgid "Add `LICENSE`: Existing GitHub repository" +msgstr "" + +#: ../../tutorials/add-license-coc.md:119 +msgid "" +"If you already have a GitHub repository for your package, then you can " +"add a `LICENSE` using the GitHub interface by adding a new file to the " +"repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md:121 +msgid "" +"Follow the instructions to select and add a license to your repository on" +" the [GitHub LICENSE page](https://docs.github.com/en/communities" +"/setting-up-your-project-for-healthy-contributions/adding-a-license-" +"to-a-repository) ." +msgstr "" + +#: ../../tutorials/add-license-coc.md:122 +msgid "" +"Once you have added your `LICENSE` file, be sure to sync your git local " +"repository with the repository on GitHub.com. This means running `git " +"pull` to update your local branch." +msgstr "" + +#: ../../tutorials/add-license-coc.md:125 +msgid "" +"Image showing what the LICENSE file looks like in the GItHub interface. " +"At the top you can see the actual license which in this image is BSD " +"3-clause New or revised license. Then there is some text describing both " +"what the license is and the associated permissions for that specific " +"license. At the bottom of the image, the actual text for the license is " +"shown in the LICENSE file." +msgstr "" + +#: ../../tutorials/add-license-coc.md:127 +msgid "" +"You can view a summary of the `LICENSE` chosen on your project's GitHub " +"landing page." +msgstr "" + +#: ../../tutorials/add-license-coc.md:134 +msgid "" +"Now you know how to add a `LICENSE` to your project. Next, you'll learn " +"about the `CODE_OF_CONDUCT.md` file and how to add it to your package " +"directory." +msgstr "" + +#: ../../tutorials/add-license-coc.md:139 +msgid "What is a code of conduct file?" +msgstr "" + +#: ../../tutorials/add-license-coc.md:141 +msgid "" +"A `CODE_OF_CONDUCT` file is used to establish guidelines for how people " +"in your community interact." +msgstr "" + +#: ../../tutorials/add-license-coc.md:143 +msgid "" +"This file is critical to supporting your community as it grows. The " +"`CODE_OF_CONDUCT`:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:146 +msgid "" +"Establishes guidelines for how users and contributors interact with each " +"other and you in your software repository." +msgstr "" + +#: ../../tutorials/add-license-coc.md:147 +msgid "Identifies negative behaviors that you don't want in your interactions." +msgstr "" + +#: ../../tutorials/add-license-coc.md:149 +msgid "" +"You can use your code of conduct as a tool that can be referenced when " +"moderating challenging conversations." +msgstr "" + +#: ../../tutorials/add-license-coc.md:151 +msgid "What to put in your `CODE_OF_CONDUCT` file" +msgstr "" + +#: ../../tutorials/add-license-coc.md:153 +msgid "" +"If you are unsure of what language to add to your `CODE_OF_CONDUCT` file," +" we suggest that you adopt the [contributor covenant " +"language](https://www.contributor-" +"covenant.org/version/2/1/code_of_conduct/) as a starting place." +msgstr "" + +#: ../../tutorials/add-license-coc.md:156 +msgid "" +"![Contributor " +"Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:156 +msgid "Contributor Covenant" +msgstr "" + +#: ../../tutorials/add-license-coc.md:158 +msgid "" +"The `CODE_OF_CONDUCT.md` should be placed at the root of your project " +"directory, similar to the `LICENSE` file." +msgstr "" + +#: ../../tutorials/add-license-coc.md:160 +msgid "How to add a `CODE_OF_CONDUCT` file to your package directory" +msgstr "" + +#: ../../tutorials/add-license-coc.md:162 +msgid "" +"Add a `CODE_OF_CONDUCT.md` file to the root of your repository if it " +"doesn't already exist." +msgstr "" + +#: ../../tutorials/add-license-coc.md:168 +msgid "" +"Visit the [contributor covenant website](https://www.contributor-" +"covenant.org/) and add [the markdown version of their code of " +"conduct](https://www.contributor-" +"covenant.org/version/2/1/code_of_conduct/code_of_conduct.md) to your " +"`CODE_OF_CONDUCT.md` file. Be sure to fill in any placeholder " +"information. Read the text closely to ensure you both understand it and " +"also agree with its contents!" +msgstr "" + +#: ../../tutorials/add-license-coc.md:170 +msgid "That's it - you've now added a code of conduct to your package directory." +msgstr "" + +#: ../../tutorials/add-license-coc.md:172 +msgid "Additional Code of Conduct resources" +msgstr "" + +#: ../../tutorials/add-license-coc.md:175 +msgid "" +"[ Guide: `CODE_OF_CONDUCT.md` " +"files](https://docs.github.com/en/communities/setting-up-your-project-" +"for-healthy-contributions/adding-a-code-of-conduct-to-your-project)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:176 +msgid "" +"[pyOpenSci package guide `CODE_OF_CONDUCT.md` " +"overview](https://www.pyopensci.org/python-package-guide/documentation" +"/repository-files/code-of-conduct-file.html)" +msgstr "" + +#: ../../tutorials/add-license-coc.md:179 ../../tutorials/add-readme.md:233 +#: ../../tutorials/publish-conda-forge.md:463 +#: ../../tutorials/pyproject-toml.md:673 +msgid " Wrap up" +msgstr "" + +#: ../../tutorials/add-license-coc.md:181 +msgid "In this lesson and the [last lesson](add-readme), you have added a:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:183 +msgid "`README` file;" +msgstr "" + +#: ../../tutorials/add-license-coc.md:184 +msgid "`LICENSE` file and a" +msgstr "" + +#: ../../tutorials/add-license-coc.md:185 +msgid "`CODE_OF_CONDUCT` file." +msgstr "" + +#: ../../tutorials/add-license-coc.md:187 +msgid "" +"These are fundamental files needed for every scientific Python package " +"repository. These files help users understand how to use your package and" +" interact with package maintainers." +msgstr "" + +#: ../../tutorials/add-license-coc.md:191 +msgid "In the upcoming lessons, you will:" +msgstr "" + +#: ../../tutorials/add-license-coc.md:193 +msgid "" +"[Add more metadata to your `pyproject.toml` file](pyproject-toml) to " +"support building and publishing your package on PyPI." +msgstr "" + +#: ../../tutorials/add-license-coc.md:194 +msgid "" +"Publish a new version of your Python package to the test PyPI to preview " +"the updated metadata landing page." +msgstr "" + +#: ../../tutorials/add-license-coc.md:199 +#: ../../tutorials/installable-code.md:642 +#: ../../tutorials/publish-conda-forge.md:475 +#: ../../tutorials/publish-pypi.md:394 +msgid "Footnotes" +msgstr "" + +#: ../../tutorials/add-license-coc.md:201 +msgid "https://opensource.org/license/mit/" +msgstr "" + +#: ../../tutorials/add-license-coc.md:202 +msgid "https://opensource.org/license/bsd-3-clause/" +msgstr "" + +#: ../../tutorials/add-readme.md:1 +msgid "Add a README file to your Python package" +msgstr "" + +#: ../../tutorials/add-readme.md:3 +msgid "In the previous lessons you learned:" +msgstr "" + +#: ../../tutorials/add-readme.md:5 +msgid "[What a Python package is](intro.md)" +msgstr "" + +#: ../../tutorials/add-readme.md:6 +msgid "[How to make your code installable](installable-code)" +msgstr "" + +#: ../../tutorials/add-readme.md:7 +msgid "[How to publish your package to (test) PyPI](publish-pypi.md)" +msgstr "" + +#: ../../tutorials/add-readme.md:8 +msgid "[How to publish your package to conda-forge](publish-conda-forge.md)" +msgstr "" + +#: ../../tutorials/add-readme.md:14 +msgid "How to add a **README.md** file to your package." +msgstr "" + +#: ../../tutorials/add-readme.md:15 +msgid "What the core elements of a **README.md** file are." +msgstr "" + +#: ../../tutorials/add-readme.md:18 +msgid "What is a README file?" +msgstr "" + +#: ../../tutorials/add-readme.md:20 +msgid "" +"The `README.md` file is a markdown file located at the root of your " +"project directory that helps a user understand:" +msgstr "" + +#: ../../tutorials/add-readme.md:23 +msgid "You package's name" +msgstr "" + +#: ../../tutorials/add-readme.md:24 +msgid "" +"What the package does. Your README file should clearly state the " +"problem(s) that your software is designed to solve and its target " +"audience." +msgstr "" + +#: ../../tutorials/add-readme.md:25 +msgid "The current development \"state\" of the package (through badges)" +msgstr "" + +#: ../../tutorials/add-readme.md:26 +msgid "How to get started with using your package." +msgstr "" + +#: ../../tutorials/add-readme.md:27 +msgid "How to contribute to your package" +msgstr "" + +#: ../../tutorials/add-readme.md:28 +msgid "How to cite your package" +msgstr "" + +#: ../../tutorials/add-readme.md:30 +msgid "" +"Your **README.md** file is important as it is often the first thing that " +"someone sees before they install your package. The README file is also " +"used to populate your PyPI landing page." +msgstr "" + +#: ../../tutorials/add-readme.md:32 +msgid "" +"Note that there is no specific content structure for README files. " +"However, this tutorial outlines the sections that we suggest that you " +"include in your README file." +msgstr "" + +#: ../../tutorials/add-readme.md:36 +msgid "Create a README.md file for your package" +msgstr "" + +#: ../../tutorials/add-readme.md:38 +msgid "It's time to add a `README.md` file to your project directory." +msgstr "" + +#: ../../tutorials/add-readme.md:40 +msgid "Step 0: Create a README file" +msgstr "" + +#: ../../tutorials/add-readme.md:41 +msgid "" +"To get started, if you don't already have a README.md file in your " +"project directory, create one." +msgstr "" + +#: ../../tutorials/add-readme.md:44 +msgid "If you created your project directory from" +msgstr "" + +#: ../../tutorials/add-readme.md:46 +msgid "a GitHub repository online" +msgstr "" + +#: ../../tutorials/add-readme.md:47 +msgid "using `hatch init`" +msgstr "" + +#: ../../tutorials/add-readme.md:49 +msgid "Then you may already have a README.MD file in your project directory." +msgstr "" + +#: ../../tutorials/add-readme.md:55 +msgid "Step 1: Add the name of your package as the README title" +msgstr "" + +#: ../../tutorials/add-readme.md:57 +msgid "At the top of the `README.md` file, add the name of your package." +msgstr "" + +#: ../../tutorials/add-readme.md:59 +msgid "" +"If you are using markdown it should be a header 1 (H1) tag which is " +"denoted with a single `#` sign." +msgstr "" + +#: ../../tutorials/add-readme.md:61 +msgid "`# Package-title-here`" +msgstr "" + +#: ../../tutorials/add-readme.md:63 +msgid "Step 2: add badges to the top of your README file" +msgstr "" + +#: ../../tutorials/add-readme.md:65 +msgid "" +"It's common for maintainers to add badges to the top of their README " +"files. Badges allow you and your package users to track things like:" +msgstr "" + +#: ../../tutorials/add-readme.md:67 +msgid "Broken documentation and test builds." +msgstr "" + +#: ../../tutorials/add-readme.md:68 +msgid "Versions of your package that are on PyPI and conda." +msgstr "" + +#: ../../tutorials/add-readme.md:69 +msgid "" +"Whether your package has been reviewed and vetted by an organization such" +" as pyOpenSci and/or JOSS." +msgstr "" + +#: ../../tutorials/add-readme.md:71 +msgid "" +"If you have already published your package to pypi.org you can use " +"[shields.io to create a package version badge](https://shields.io/badges" +"/py-pi-version). This badge will dynamically update as you release new " +"versions of your package to PyPI." +msgstr "" + +#: ../../tutorials/add-readme.md:73 +msgid "" +"If not, you can leave the top empty for now and add badges to your README" +" at a later point as they make sense." +msgstr "" + +#: ../../tutorials/add-readme.md:75 +msgid "Step 3: Add a description of what your package does" +msgstr "" + +#: ../../tutorials/add-readme.md:77 +msgid "" +"Below the badges (if you have them), add a section of text that provides " +"an easy-to-understand overview of what your package does." +msgstr "" + +#: ../../tutorials/add-readme.md:81 +msgid "Keep this section short." +msgstr "" + +#: ../../tutorials/add-readme.md:82 +msgid "Try to avoid jargon." +msgstr "" + +#: ../../tutorials/add-readme.md:83 +msgid "" +"Define technical terms that you use to make the description accessible to" +" more people." +msgstr "" + +#: ../../tutorials/add-readme.md:85 +msgid "" +"Remember that the more people understand what your package does, the more" +" people will use it." +msgstr "" + +#: ../../tutorials/add-readme.md:87 +msgid "Step 4: Add package installation instructions" +msgstr "" + +#: ../../tutorials/add-readme.md:89 +msgid "Next, add instructions that tell users how to install your package." +msgstr "" + +#: ../../tutorials/add-readme.md:91 +msgid "" +"For example, can they use pip to install your package? `python -m pip " +"install packagename`" +msgstr "" + +#: ../../tutorials/add-readme.md:94 +msgid "or conda?" +msgstr "" + +#: ../../tutorials/add-readme.md:96 +msgid "`conda install -c conda-forge packagename`." +msgstr "" + +#: ../../tutorials/add-readme.md:98 +msgid "" +"If you haven't yet published your package to pypi.org then you can skip " +"this section and come back and add these instructions later." +msgstr "" + +#: ../../tutorials/add-readme.md:102 +msgid "Step 5: Any additional setup" +msgstr "" + +#: ../../tutorials/add-readme.md:104 +msgid "" +"In some cases, your package users may need to manually install other " +"tools in order to use your package. If that is the case, be sure to add a" +" section on additional setup to your README file." +msgstr "" + +#: ../../tutorials/add-readme.md:109 +msgid "" +"Here, briefly document (or link to documentation for) any additional " +"setup that is required to use your package. This might include:" +msgstr "" + +#: ../../tutorials/add-readme.md:113 +msgid "authentication information, if it is applicable to your package." +msgstr "" + +#: ../../tutorials/add-readme.md:114 +msgid "additional tool installations, such as GDAL." +msgstr "" + +#: ../../tutorials/add-readme.md:117 +msgid "" +"Many packages won't need an additional setup section in their README. In " +"that case you can always skip this section." +msgstr "" + +#: ../../tutorials/add-readme.md:122 +msgid "Step 6: Add a get started section" +msgstr "" + +#: ../../tutorials/add-readme.md:124 +msgid "" +"Next add a get-started section. Within this section, add a small code " +"example that demonstrates importing and using some of the functionality " +"in your package." +msgstr "" + +#: ../../tutorials/add-readme.md:127 +msgid "Provide a fully functional code snippet if possible" +msgstr "" + +#: ../../tutorials/add-readme.md:130 +msgid "" +"It is important to try to make the code examples that you provide your " +"users as useful as possible." +msgstr "" + +#: ../../tutorials/add-readme.md:132 +msgid "" +"Be sure to provide a copy/paste code example that will work as-is when " +"pasted into a Jupyter Notebook or .py file if that is possible." +msgstr "" + +#: ../../tutorials/add-readme.md:134 +msgid "" +"If there are tokens and other steps needed to run your package, be sure " +"to be clear about what those steps are." +msgstr "" + +#: ../../tutorials/add-readme.md:137 +msgid "For the pyosPackage, a short get started demo might look like this:" +msgstr "" + +#: ../../tutorials/add-readme.md:145 +msgid "" +"Or it could simply be a link to a getting started tutorial that you have " +"created. If you don't have this yet, you can leave it empty for the time " +"being." +msgstr "" + +#: ../../tutorials/add-readme.md:148 +msgid "" +"This would also be a great place to add links to tutorials that help " +"users understand how to use your package for common workflows." +msgstr "" + +#: ../../tutorials/add-readme.md:153 +msgid "Step 7: Community section" +msgstr "" + +#: ../../tutorials/add-readme.md:155 +msgid "" +"The community section of your README file is a place to include " +"information for users who may want to engage with your project. This " +"engagement will likely happen on a platform like GitHub or GitLab." +msgstr "" + +#: ../../tutorials/add-readme.md:157 +msgid "" +"In the community section, you will add links to your contributing guide " +"and `CODE_OF_CONDUCT.md`. You will create a [`CODE_OF_CONDUCT.md` file in" +" the next lesson](add-license-coc)." +msgstr "" + +#: ../../tutorials/add-readme.md:160 +msgid "" +"As your package grows you may also have a link to a development guide " +"that contributors and your maintainer team will follow. The development " +"guide outlines how to perform maintenance tasks such as:" +msgstr "" + +#: ../../tutorials/add-readme.md:163 +msgid "running tests" +msgstr "" + +#: ../../tutorials/add-readme.md:164 +msgid "making package releases" +msgstr "" + +#: ../../tutorials/add-readme.md:165 +msgid "building documentation" +msgstr "" + +#: ../../tutorials/add-readme.md:166 +msgid "and more." +msgstr "" + +#: ../../tutorials/add-readme.md:170 +msgid "Step 8: Citation information" +msgstr "" + +#: ../../tutorials/add-readme.md:172 +msgid "" +"Finally it is important to let users know how to cite your package. You " +"can communicate citation information in a few different ways." +msgstr "" + +#: ../../tutorials/add-readme.md:175 +msgid "" +"You can use a tool such as zenodo to create a DOI and associated citation" +" information for your package if it is hosted on a platform such as " +"GitHub. [Check out this short tutorial that covers setting that " +"up.](https://coderefinery.github.io/github-without-command-line/doi/)" +msgstr "" + +#: ../../tutorials/add-readme.md:179 +msgid "" +"Alternatively if you send your package through a peer review process such" +" as the [one lead by pyOpenSci](https://www.pyopensci.org/about-peer-" +"review/index.html). After being accepted by pyOpenSci, if your package is" +" in scope, you can be accepted by the Journal of Open Source Software and" +" get a cross-ref DOI through [our partnership with the Journal of Open " +"Source Software.](https://www.pyopensci.org/about-peer-review/index.html)" +msgstr "" + +#: ../../tutorials/add-readme.md:183 +msgid "The finished README file" +msgstr "" + +#: ../../tutorials/add-readme.md:185 +msgid "Your finished `README.md` file should look something like this:" +msgstr "" + +#: ../../tutorials/add-readme.md:235 +msgid "" +"It's important to consider the information that a new user or contributor" +" might need when creating your `README.md` file. While there is no " +"perfect template, above is a set of recommendations as you are just " +"getting started. You may find the need for other elements to be added to " +"this file as you further develop your package and as a community begins " +"to use your package." +msgstr "" + +#: ../../tutorials/add-readme.md:241 +msgid "" +"In the [next lesson](add-license-coc.md), you will add a LICENSE file to " +"your Python package. A license file is critical as it tells users how " +"they legally can (and can't) use your package. It also:" +msgstr "" + +#: ../../tutorials/add-readme.md:245 +msgid "Builds trust with your users" +msgstr "" + +#: ../../tutorials/add-readme.md:246 +msgid "Discourages misuse of your package and associated code" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:1 +msgid "Get to Know Hatch" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:3 +msgid "" +"Our Python packaging tutorials use the tool " +"[Hatch](https://hatch.pypa.io/latest/). While there are [many great " +"packaging tools](/package-structure-code/python-package-build-tools) out " +"there, we have selected Hatch because:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:8 +msgid "" +"It is an end-to-end tool that supports most of the steps required to " +"create a quality Python package. Beginners will have fewer tools to learn" +" if they use Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:11 +msgid "" +"It supports different build back-ends if you ever need to compile code in" +" other languages." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:13 +msgid "" +"As a community, pyOpenSci has decided that Hatch is a user-friendly tool " +"that supports many different scientific Python use cases." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:16 +msgid "" +"In this tutorial, you will install and get to know Hatch a bit more " +"before starting to use it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:19 +msgid "You need two things to successfully complete this tutorial:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:21 +msgid "You need Python installed." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:22 +msgid "You need Hatch installed." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:25 +msgid "" +"If you don't already have Python installed on your computer, Hatch will " +"do it for you when you install Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:29 +msgid "Install Hatch" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:31 +msgid "" +"To begin, follow the operating-system-specific instructions below to " +"install Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "MAC" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:38 +msgid "" +"Follow the instructions " +"[here](https://hatch.pypa.io/latest/install/#installers)." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:40 +msgid "" +"Download the latest GUI installer for MAC [hatch-" +"universal.pkg](https://github.com/pypa/hatch/releases/latest/download" +"/hatch-universal.pkg)." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:41 +msgid "Run the installer and follow the setup instructions." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:42 +msgid "If your terminal is open, then restart it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "Windows" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:48 +msgid "" +"In your browser, download the correct `.msi` file for your system: " +"[hatch-x64.msi](https://github.com/pypa/hatch/releases/latest/download/hatch-x64.msi)" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:50 +msgid "Run your downloaded installer file and follow the on-screen instructions." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md +msgid "Linux" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:56 +msgid "" +"We suggest that you install Hatch using pipx on Linux. however, if you " +"prefer another method, check out the [Hatch installation " +"documentation](https://hatch.pypa.io/latest/install/) for other methods." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:70 +msgid "" +"Hatch can also be installed directly using " +"[pip](https://hatch.pypa.io/latest/install/#pip) or " +"[conda](https://hatch.pypa.io/latest/install/#conda). We encourage you to" +" follow the instructions above because we have found that the Hatch " +"installers for Windows and Mac are the easiest and most efficient." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:74 +msgid "" +"Our Linux users have found success installing Hatch with pipx if they " +"already use apt install." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:77 +msgid "" +"Both approaches (using a graphical installer on Windows/Mac and pipx) " +"ensure that you have Hatch installed globally. A global install means " +"that Hatch is available across all of your Python environments on your " +"computer." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:82 +msgid "Check that hatch installed correctly" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:84 +msgid "" +"Once you have completed the installation instructions above, you can open" +" your terminal, and make sure that Hatch installed correctly using the " +"command below:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:92 +msgid "" +"*Note the version number output of `hatch --version` will likely be " +"different from the output above in this tutorial.*" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:95 +msgid "Configure Hatch" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:97 +msgid "" +"Once you have installed Hatch, you can customize its configuration. This " +"includes setting the default name and setup for every package you create." +" While this step is not required, we suggest that you do it." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:101 +msgid "" +"Hatch stores your configuration in a [`config.toml` " +"file](https://hatch.pypa.io/latest/config/project-templates/)." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:103 +msgid "" +"While you can update the `config.toml` file through the command line, it " +"might be easier to look at and update it in a text editor if you are " +"using it for the first time." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:107 +msgid "Step 1: Open and Edit Your `config.toml` File" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:109 +msgid "" +"To open the config file in your file browser, run the following command " +"in your shell:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:112 +msgid "`hatch config explore`" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:114 +msgid "" +"This will open up a directory window that allows you to double-click on " +"the file and open it in your favorite text editor." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:117 +msgid "" +"You can also retrieve the location of the Hatch config file by running " +"the following command in your shell:" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:125 +msgid "Step 2 - update your email and name" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:127 +msgid "" +"Once the file is open, update the [template] table of the `config.toml` " +"file with your name and email. This information will be used in any " +"`pyproject.toml` metadata files that you create using Hatch." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:137 +msgid "Step 3" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:139 +msgid "Next, set tests to false in the `[template.plugins.default]` table." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:141 +msgid "" +"While tests are important, setting the tests configuration in Hatch to " +"`true` will create a more complex `pyproject.toml` file. You won't need " +"to use this feature in this beginner friendly tutorial series but we will" +" introduce it in later tutorials." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:146 +msgid "Your `config.toml` file should look something like the one below." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:184 +msgid "" +"Also notice that the default license option is MIT. While we will discuss" +" license in more detail in a later lesson, the MIT license is the " +"recommended permissive license from " +"[choosealicense.com](https://www.choosealicense.com) and as such we will " +"use it for this tutorial series." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:190 +msgid "You are of course welcome to select another license." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:192 +#: ../../tutorials/installable-code.md:22 +#: ../../tutorials/installable-code.md:411 +#: ../../tutorials/installable-code.md:502 ../../tutorials/intro.md:226 +#: ../../tutorials/publish-pypi.md:3 ../../tutorials/publish-pypi.md:178 +#: ../../tutorials/publish-pypi.md:350 ../../tutorials/pyproject-toml.md:718 +msgid "Todo" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:193 +msgid "" +"I think we'd need the SPDX license options here if they want to chose " +"bsd-3 for instance" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:196 +msgid "Step 4: Close the config file and run `hatch config show`" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:198 +msgid "" +"Once you have completed the steps above run the following command in your" +" shell." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:200 +msgid "`hatch config show`" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:202 +msgid "" +"`hatch config show` will print out the contents of your `config.toml` " +"file in your shell. look at the values and ensure that your name, email " +"is set. Also make sure that `tests=false`." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:206 +msgid "Hatch features" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:208 +msgid "" +"Hatch offers a suite of features that will make creating, publishing and " +"maintaining your Python package easier." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:211 +msgid "Comparison to other tools" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:213 +msgid "" +"[We compared Hatch to several of the other popular packaging tools in the" +" ecosystem including flit, pdm and poetry. Learn more here](package-" +"features)" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:216 +msgid "[More on Hatch here](hatch)" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:218 +msgid "A few features that Hatch offers" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:220 +msgid "" +"it will convert metadata stored in a `setup.py` or `setup.cfg` file to a " +"pyproject.toml file for you (see [Migrating setup.py to pyproject.toml " +"using Hatch](setup-py-to-pyproject-toml.md ))" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:222 +msgid "" +"It will help you by storing configuration information for publishing to " +"PyPI after you've entered it once." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:224 +msgid "Use `hatch -h` to see all of the available commands." +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:226 +msgid "What's next" +msgstr "" + +#: ../../tutorials/get-to-know-hatch.md:228 +msgid "" +"In the next lesson you'll learn how to package and make your code " +"installable using Hatch." +msgstr "" + +#: ../../tutorials/installable-code.md:6 +msgid "Make your Python code installable" +msgstr "" + +#: ../../tutorials/installable-code.md:8 +msgid "What we previously covered" +msgstr "" + +#: ../../tutorials/installable-code.md:9 +msgid "" +"[In the previous lesson](intro), you learned about what a Python package " +"is. You also learned about the [benefits of creating a Python package" +"](package-benefits)." +msgstr "" + +#: ../../tutorials/installable-code.md:13 +msgid "" +"Your next step in our packaging tutorial series is to create a Python " +"package that is installable both locally and remotely from a website such" +" as GitHub (or GitLab). The package that you create in this lesson will " +"have the bare minimum elements needed to be installable into a Python " +"environment." +msgstr "" + +#: ../../tutorials/installable-code.md:18 +msgid "" +"Making your code installable is an important steps towards creating a " +"full Python package that is directly installable from PyPI." +msgstr "" + +#: ../../tutorials/installable-code.md:23 +msgid "" +"Is it clear where to add commands? Bash vs. Python console Bash vs. Zsh " +"is different" +msgstr "" + +#: ../../tutorials/installable-code.md:25 +msgid "Does this lesson run as expected on windows and mac?" +msgstr "" + +#: ../../tutorials/installable-code.md:26 +msgid "" +"ADD: note about what makes something \"package worthy\", with a common " +"misconception being that a package should be production-ready code that's" +" valuable to a broad audience. this may not be a pervasive misconception " +"in Python, but a quick break-out with an explanation of what a package " +"can consist of would be helpful." +msgstr "" + +#: ../../tutorials/installable-code.md:31 +msgid "" +"Diagram showing the basic steps to creating an installable package. There" +" are 4 boxes with arrows pointing towards the right. The boxes read, your" +" code, create package structure, add metadata to pyproject.toml and pip " +"install package." +msgstr "" + +#: ../../tutorials/installable-code.md:33 +msgid "" +"A basic installable package needs a few things: code, a [specific package" +" file structure](https://www.pyopensci.org/python-package-guide/package-" +"structure-code/python-package-structure.html) and a `pyproject.toml` " +"containing your package's name and version. Once you have these items in " +"the correct directory structure, you can pip install your package into " +"any environment on your computer. You will learn how to create a basic " +"installable package in this lesson." +msgstr "" + +#: ../../tutorials/installable-code.md:37 +msgid "About this lesson" +msgstr "" + +#: ../../tutorials/installable-code.md:43 +msgid "" +"How to make your code installable into any Python environment both " +"locally and from GitHub" +msgstr "" + +#: ../../tutorials/installable-code.md:44 +msgid "" +"How to create a basic `pyproject.toml` file that includes package " +"dependencies and metadata. This file is required to make your package " +"installable." +msgstr "" + +#: ../../tutorials/installable-code.md:45 +msgid "" +"How to declare a [build backend](build_backends) which will be used to " +"[build](build-package) and install your package" +msgstr "" + +#: ../../tutorials/installable-code.md:46 +msgid "How to install your package in editable mode for interactive development" +msgstr "" + +#: ../../tutorials/installable-code.md:48 +msgid "**What you need to complete this lesson**" +msgstr "" + +#: ../../tutorials/installable-code.md:50 +msgid "" +"To complete this lesson you will need a local Python environment and " +"shell on your computer. You will also need to have [Hatch installed](get-" +"to-know-hatch)." +msgstr "" + +#: ../../tutorials/installable-code.md:53 +msgid "" +"If you are using Windows or are not familiar with Shell, you may want to " +"check out the Carpentries shell lesson[^shell-lesson]. Windows users will" +" likely need to configure a tool for any Shell and git related steps." +msgstr "" + +#: ../../tutorials/installable-code.md:55 +msgid "**What comes next**" +msgstr "" + +#: ../../tutorials/installable-code.md:57 +msgid "In the upcoming lessons you will learn how to:" +msgstr "" + +#: ../../tutorials/installable-code.md:59 +msgid "[Publish your package to PyPI](publish-pypi)" +msgstr "" + +#: ../../tutorials/installable-code.md:60 +msgid "Add a README file to your package to support community use" +msgstr "" + +#: ../../tutorials/installable-code.md:61 +msgid "" +"Add additional project metadata to your package to support PyPI " +"publication" +msgstr "" + +#: ../../tutorials/installable-code.md:67 +msgid "" +"This diagram has two smaller boxes with arrows pointing to the right to a" +" Python environment. The small boxes read your-package and pip install " +"package. The environment box on the right reads - your Python " +"environment. It them lists your-package along with a few other core " +"packages such as Matplotlib, NumPy, Pandas, Xarray and GeoPandas." +msgstr "" + +#: ../../tutorials/installable-code.md:69 +msgid "" +"Making your code installable is the first step towards creating a " +"publishable Python package. Once your code is installable, it is a Python" +" package and can be added to any Python environment on your computer and " +"imported in the same way that you might import a package such as Pandas " +"or GeoPandas. If your code is on GitHub or GitLab you can also install it" +" directly from there." +msgstr "" + +#: ../../tutorials/installable-code.md:74 +msgid "About the Python package directory structure" +msgstr "" + +#: ../../tutorials/installable-code.md:76 +msgid "" +"To make your Python code installable you need to create a specific " +"directory structure with the following elements:" +msgstr "" + +#: ../../tutorials/installable-code.md:78 +msgid "A `pyproject.toml` file." +msgstr "" + +#: ../../tutorials/installable-code.md:79 +msgid "A specific directory structure." +msgstr "" + +#: ../../tutorials/installable-code.md:80 +msgid "Some code." +msgstr "" + +#: ../../tutorials/installable-code.md:81 +msgid "An `__init__.py` file in your code directory." +msgstr "" + +#: ../../tutorials/installable-code.md:83 +msgid "The directory structure you’ll create in this lesson will look like this:" +msgstr "" + +#: ../../tutorials/installable-code.md:95 +msgid "About the basic package directory structure" +msgstr "" + +#: ../../tutorials/installable-code.md:97 +msgid "Notice a few things about the above layout:" +msgstr "" + +#: ../../tutorials/installable-code.md:99 +msgid "" +"Your package code lives within a `src/packagename` directory. We suggest " +"that you use `src` (short for **source code**) directory as it [ensures " +"that you are running tests on the installed version of your " +"code](https://www.pyopensci.org/python-package-guide/package-structure-" +"code/python-package-structure.html#the-src-layout-and-testing)." +msgstr "" + +#: ../../tutorials/installable-code.md:100 +msgid "" +"Within the `src` directory you have a package directory called " +"`pyospackage`. Use the name of your package for that directory name. This" +" will be the name for importing your package in Python code once " +"installed." +msgstr "" + +#: ../../tutorials/installable-code.md:101 +msgid "" +"In your package directory, you have an `__init__.py` file and all of your" +" Python modules. You will learn more about the `__init__.py` file below." +msgstr "" + +#: ../../tutorials/installable-code.md:102 +msgid "The `pyproject.toml` file lives at the root directory of your package." +msgstr "" + +#: ../../tutorials/installable-code.md:103 +msgid "" +"The name of the root directory for the package is **pyospackage** which " +"is the name of the package. This is not a requirement but you will often " +"see that the GitHub / GitLab repository and the root directory name are " +"the same as the package name." +msgstr "" + +#: ../../tutorials/installable-code.md:105 +msgid "What is an `__init__.py` file?" +msgstr "" + +#: ../../tutorials/installable-code.md:107 +msgid "" +"The `__init__.py` file tells Python that a directory should be treated as" +" a Python package. As such, a directory with an `__init__.py` file can be" +" imported directly into Python. The `__init__.py` file does not need to " +"contain any code in order for Python to recognize it; it can be empty." +msgstr "" + +#: ../../tutorials/installable-code.md:111 +msgid "" +"For example, following the file structure example above which has an " +"`__init__.py` file within it, you can run:" +msgstr "" + +#: ../../tutorials/installable-code.md:117 ../../tutorials/pyproject-toml.md:48 +msgid "What is a pyproject.toml file?" +msgstr "" + +#: ../../tutorials/installable-code.md:119 +msgid "The **pyproject.toml** file is:" +msgstr "" + +#: ../../tutorials/installable-code.md:121 +msgid "" +"Where you define your project’s metadata (including its name, authors, " +"license, etc)" +msgstr "" + +#: ../../tutorials/installable-code.md:122 +msgid "Where you define dependencies (the packages that it depends on)" +msgstr "" + +#: ../../tutorials/installable-code.md:123 +msgid "" +"Used to specify and configure what build backend you want to use to " +"[build your package](../package-structure-code/python-package-" +"distribution-files-sdist-wheel)." +msgstr "" + +#: ../../tutorials/installable-code.md:125 +msgid "" +"After the `__init__.py` and `pyproject.toml` files have been added, your " +"package can be built and distributed as an installable Python package " +"using tools such as pip. Note that the `pyproject.toml` file needs to " +"have a few basic items defined for the package to be installable " +"including:" +msgstr "" + +#: ../../tutorials/installable-code.md:131 +msgid "The `build-backend` that you want to use," +msgstr "" + +#: ../../tutorials/installable-code.md:132 +msgid "The project `name` and `version`." +msgstr "" + +#: ../../tutorials/installable-code.md:134 +msgid "Why the pyproject.toml file is important" +msgstr "" + +#: ../../tutorials/installable-code.md:138 +msgid "" +"The `pyproject.toml` file replaces some of the functionality of both the " +"`setup.py` file and `setup.cfg` files. If you try to pip install a " +"package with no `pyproject.toml` you will get the following error:" +msgstr "" + +#: ../../tutorials/installable-code.md:150 +msgid "Note about `setup.py`" +msgstr "" + +#: ../../tutorials/installable-code.md:154 +msgid "" +"If your project already defines a `setup.py` file, Hatch can be used to " +"automatically create the `pyproject.toml`." +msgstr "" + +#: ../../tutorials/installable-code.md:155 +msgid "" +"See [Using Hatch to Migrate setup.py to a pyproject.toml ](setup-py-to-" +"pyproject-toml.md)" +msgstr "" + +#: ../../tutorials/installable-code.md:161 +msgid "Time to create your Python package!" +msgstr "" + +#: ../../tutorials/installable-code.md:163 +msgid "" +"Now that you understand the basics of the Python package directory " +"structure, and associated key files (`__init__.py` and `pyproject.toml`)," +" it's time to create your Python package! Below you will create a " +"directory structure similar to the structure described above using Hatch." +msgstr "" + +#: ../../tutorials/installable-code.md:167 +msgid "Step 1: Set Up the Package Directory Structure" +msgstr "" + +#: ../../tutorials/installable-code.md:169 +msgid "Open your shell or preferred terminal." +msgstr "" + +#: ../../tutorials/installable-code.md:170 +msgid "" +"Use the shell `cd` command to navigate in your shell to the location " +"where you'd like your package directory to live. Hatch will create the " +"package directory for you" +msgstr "" + +#: ../../tutorials/installable-code.md:171 +msgid "Choose a name for your package. The name should:" +msgstr "" + +#: ../../tutorials/installable-code.md:172 +msgid "Have no spaces (*Required*)" +msgstr "" + +#: ../../tutorials/installable-code.md:173 +msgid "" +"Use all lowercase characters (*Recommended*). For this tutorial we will " +"use `pyospackage`." +msgstr "" + +#: ../../tutorials/installable-code.md:174 +msgid "" +"Only use letter and the characters _ or - in the name. This means that " +"the name `pyos*package` is not an acceptable name. However, the names " +"`pyos_package` or `pyos-package` both are ok" +msgstr "" + +#: ../../tutorials/installable-code.md:176 +msgid "Hatch and project names" +msgstr "" + +#: ../../tutorials/installable-code.md:177 +msgid "" +"Hatch makes some decisions for your project's name when you run `hatch " +"new`" +msgstr "" + +#: ../../tutorials/installable-code.md:179 +msgid "These include using:" +msgstr "" + +#: ../../tutorials/installable-code.md:180 +msgid "dashes for the top level directory" +msgstr "" + +#: ../../tutorials/installable-code.md:181 +msgid "dashes for the project name in the pyproject.toml" +msgstr "" + +#: ../../tutorials/installable-code.md:182 +msgid "underscores for the package directory name" +msgstr "" + +#: ../../tutorials/installable-code.md:196 +msgid "If you use a name with underscores, Hatch will return the same thing:" +msgstr "" + +#: ../../tutorials/installable-code.md:209 +msgid "" +"In both of the examples above the project name in the pyproject.toml file" +" that hatch creates is `pyos-package`." +msgstr "" + +#: ../../tutorials/installable-code.md:213 +msgid "Next run:" +msgstr "" + +#: ../../tutorials/installable-code.md:228 +msgid "Your final project directory structure should look like this:" +msgstr "" + +#: ../../tutorials/installable-code.md:243 +msgid "Step 2: Add module to your package" +msgstr "" + +#: ../../tutorials/installable-code.md:245 +msgid "" +"A Python module refers to a `.py` file containing the code that you want " +"your package to access and run. Within the `pyospackage` subdirectory, " +"add at least one Python modules (.py files)." +msgstr "" + +#: ../../tutorials/installable-code.md:247 +msgid "" +"If you don't have code already and are just learning how to create a " +"Python package, then create an empty `add_numbers.py` file. You will " +"populate the `add_numbers.py` file with code provided below." +msgstr "" + +#: ../../tutorials/installable-code.md:250 +msgid "Python modules and the `__init__.py` file" +msgstr "" + +#: ../../tutorials/installable-code.md:254 +msgid "" +"When you see the word module, we are referring to a `.py` file containing" +" Python code." +msgstr "" + +#: ../../tutorials/installable-code.md:257 +msgid "" +"The `__init__.py` allows Python to recognize that a directory contains " +"at least one module that may be imported and used in your code. A package" +" can have multiple modules[^python-modules]." +msgstr "" + +#: ../../tutorials/installable-code.md:261 +msgid "Your project directory should now look like this:" +msgstr "" + +#: ../../tutorials/installable-code.md:271 +msgid "Step 3: Add code to your module" +msgstr "" + +#: ../../tutorials/installable-code.md:273 +msgid "" +"If you are following along and making a Python package from scratch then " +"you can add the code below to your `add_numbers.py` module. The function " +"below adds two integers together and returns the result. Notice that the " +"code below has a few features that we will review in future tutorials:" +msgstr "" + +#: ../../tutorials/installable-code.md:275 +msgid "It has a [numpy-style docstring](numpy-docstring)" +msgstr "" + +#: ../../tutorials/installable-code.md:276 +msgid "It uses [typing](type-hints)" +msgstr "" + +#: ../../tutorials/installable-code.md:278 +msgid "" +"Python can support many different docstrings formats depending on the " +"documentation build system you wish to use. The most popular supported " +"formats for documenting Python objects are NumPy Style " +"Docstring[^numpydoc], Google Style Docstring[^googledoc], and the Epytext" +" Style Docstrings[^epytextdoc]." +msgstr "" + +#: ../../tutorials/installable-code.md:280 +msgid "**pyOpenSci recommends using the NumPy Docstring convention.**" +msgstr "" + +#: ../../tutorials/installable-code.md:282 +msgid "" +"If you aren’t familiar with docstrings or typing yet, that is ok. You can" +" review [this page in the pyOpenSci packaging " +"guide](https://www.pyopensci.org/python-package-guide/documentation" +"/write-user-documentation/document-your-code-api-docstrings.html) for an " +"overview of both topics." +msgstr "" + +#: ../../tutorials/installable-code.md:311 +msgid "Step 4: Modify metadata in your `pyproject.toml` file" +msgstr "" + +#: ../../tutorials/installable-code.md:313 +msgid "" +"Next, you will modify some of the metadata (information) that Hatch adds " +"to your `pyproject.toml` file. You are are welcome to copy the file we " +"have in our [example pyospackage GitHub " +"repository](https://github.com/pyOpenSci/pyosPackage)." +msgstr "" + +#: ../../tutorials/installable-code.md:317 +msgid "Brief overview of the TOML file" +msgstr "" + +#: ../../tutorials/installable-code.md:320 +msgid "" +"[The TOML format](https://toml.io/en/) consists of tables and variables. " +"Tables are sections of information denoted by square brackets:" +msgstr "" + +#: ../../tutorials/installable-code.md:322 +msgid "`[this-is-a-table]`." +msgstr "" + +#: ../../tutorials/installable-code.md:324 +msgid "" +"Tables can contain variables within them defined by an variable name and " +"an `=` sign. For instance, a `build-system` table most often holds two " +"(2) variables:" +msgstr "" + +#: ../../tutorials/installable-code.md:327 +msgid "" +"`requires = `, which tells a build tool what tools it needs to install " +"prior to building your package. In this case " +"[hatchling](https://pypi.org/project/hatchling/)" +msgstr "" + +#: ../../tutorials/installable-code.md:329 +msgid "" +"`build-backend = `, which is used to define the specific build-backend " +"name, (in this example we are using `hatchling.build`)." +msgstr "" + +#: ../../tutorials/installable-code.md:338 +msgid "" +"TOML organizes data structures, defining relationships within a " +"configuration file." +msgstr "" + +#: ../../tutorials/installable-code.md:341 +msgid "" +"[Learn more about the pyproject.toml format here.](../package-structure-" +"code/pyproject-toml-python-package-metadata)" +msgstr "" + +#: ../../tutorials/installable-code.md:345 +msgid "" +"You will learn more about the `pyproject.toml` format in the [next lesson" +" when you add additional metadata / information to this file.](pyproject-" +"toml.md)" +msgstr "" + +#: ../../tutorials/installable-code.md:348 +msgid "" +"Open up the `pyproject.toml` file that Hatch created in your favorite " +"text editor. It should look something like the example below." +msgstr "" + +#: ../../tutorials/installable-code.md:390 +msgid "Edit the file as follows:" +msgstr "" + +#: ../../tutorials/installable-code.md:392 +msgid "" +"Delete `dynamic = [\"version\"]`: This sets up dynamic versioning based " +"on tags stored in your git commit history. We will walk through " +"implementing this in a later lesson." +msgstr "" + +#: ../../tutorials/installable-code.md:393 +msgid "" +"Add `version = \"0.1\"` in the place of `dynamic = [\"version\"]` which " +"you just deleted. This sets up manual versioning." +msgstr "" + +#: ../../tutorials/installable-code.md:394 +msgid "Fill in the description if it doesn't already exist." +msgstr "" + +#: ../../tutorials/installable-code.md:404 +msgid "Remove the `[tool.hatch.version]` table from the bottom of the file." +msgstr "" + +#: ../../tutorials/installable-code.md:412 +msgid "" +"When this lesson exists, uncomment this admonition You will learn how to " +"automate defining a package version using git tags in the version and " +"release your package lesson." +msgstr "" + +#: ../../tutorials/installable-code.md:417 +msgid "OPTIONAL: Adjust project classifiers" +msgstr "" + +#: ../../tutorials/installable-code.md:419 +msgid "" +"Hatch by default provides a list of classifiers that define what Python " +"versions your package supports. These classifiers do not in any way " +"impact your package's build and are primarily intended to be used when " +"you publish your package to PyPI." +msgstr "" + +#: ../../tutorials/installable-code.md:424 +msgid "" +"If you don't plan on publishing to PyPI, you can skip this section. " +"However, if you wish, you can clean it up a bit." +msgstr "" + +#: ../../tutorials/installable-code.md:427 +msgid "To begin:" +msgstr "" + +#: ../../tutorials/installable-code.md:429 +msgid "Remove support for Python 3.8" +msgstr "" + +#: ../../tutorials/installable-code.md:430 +msgid "" +"Within the `[project]` table, update `requires-python = \">3.8\"` to " +"`requires-python = \">3.9\"`" +msgstr "" + +#: ../../tutorials/installable-code.md:432 +msgid "" +"Since you are creating a pure Python package in this lesson, you can " +"remove the following classifiers:" +msgstr "" + +#: ../../tutorials/installable-code.md:442 +msgid "Your new pyproject.toml file should now look something like this:" +msgstr "" + +#: ../../tutorials/installable-code.md:477 +msgid "The bare minimum needed in a pyproject.toml file" +msgstr "" + +#: ../../tutorials/installable-code.md:480 +msgid "" +"The core information that you need in a `pyproject.toml` file in order to" +" publish on PyPI is your **package's name** and the **version**. " +"However, we suggest that you flesh out your metadata early on in the " +"`pyproject.toml` file." +msgstr "" + +#: ../../tutorials/installable-code.md:482 +msgid "" +"Once you have your project metadata in the pyproject.toml file, you will " +"rarely update it. In the next lesson you’ll add more metadata and " +"structure to this file." +msgstr "" + +#: ../../tutorials/installable-code.md:486 +msgid "Step 5: Install your package locally" +msgstr "" + +#: ../../tutorials/installable-code.md:488 +msgid "At this point you should have:" +msgstr "" + +#: ../../tutorials/installable-code.md:490 +msgid "A project directory structure with a `pyproject.toml` file at the root" +msgstr "" + +#: ../../tutorials/installable-code.md:491 +msgid "A package directory containing an empty `__init__.py` file and" +msgstr "" + +#: ../../tutorials/installable-code.md:492 +msgid "At least one Python module (e.g. `add_numbers.py`)" +msgstr "" + +#: ../../tutorials/installable-code.md:494 +msgid "You are now ready to install (and build) your Python package!" +msgstr "" + +#: ../../tutorials/installable-code.md:496 +msgid "" +"While you can do this using hatch, we are going to use pip for this " +"lesson, so you can see how to install your tool into your preferred " +"environment." +msgstr "" + +#: ../../tutorials/installable-code.md:498 +msgid "" +"First open your preferred shell (Windows users may be using something " +"like gitbash) and `cd` into your project directory if you are not already" +" there." +msgstr "" + +#: ../../tutorials/installable-code.md:499 +msgid "Activate the Python environment that you wish to use." +msgstr "" + +#: ../../tutorials/installable-code.md:500 +msgid "Run `python -m pip install -e .`" +msgstr "" + +#: ../../tutorials/installable-code.md:503 +msgid "Add this back in when the lesson is published" +msgstr "" + +#: ../../tutorials/installable-code.md:504 +msgid "" +"Activate the Python environment that you wish to use. If you need help " +"with working with virtual environments check out this lesson (add link)." +msgstr "" + +#: ../../tutorials/installable-code.md:530 +msgid "What does `python -m pip install -e .` do?" +msgstr "" + +#: ../../tutorials/installable-code.md:533 +msgid "Let's break down `python -m pip install -e .`" +msgstr "" + +#: ../../tutorials/installable-code.md:535 +msgid "" +"`python -m pip install -e .` installs your package into the current " +"active Python environment in **editable mode** (`-e`). Installing your " +"package in editable mode, allows you to work on your code and then test " +"the updates interactively in your favorite Python interface. One " +"important caveat of editable mode is that every time you update your " +"code, you may need to restart Python." +msgstr "" + +#: ../../tutorials/installable-code.md:540 +msgid "" +"If you wish to install the package regularly (not in editable mode) you " +"can use:" +msgstr "" + +#: ../../tutorials/installable-code.md:543 +msgid "`python -m pip install . `" +msgstr "" + +#: ../../tutorials/installable-code.md:545 +msgid "**Using `python -m` when calling `pip`**" +msgstr "" + +#: ../../tutorials/installable-code.md:547 +msgid "" +"Above, you use`python -m` to call the version of pip installed into your " +"current active environment. `python -m` is important to ensure that you " +"are calling the version of pip installed in your current environment." +msgstr "" + +#: ../../tutorials/installable-code.md:552 +msgid "Look for pyospackage in your environment" +msgstr "" + +#: ../../tutorials/installable-code.md:554 +msgid "" +"Once you have installed your package, you can view it in your current " +"environment. If you are using `venv` or `conda`, `pip` list will allow " +"you to see your current package installations." +msgstr "" + +#: ../../tutorials/installable-code.md:558 +msgid "" +"Note that because pyospackage is installed in editable mode (`-e`) pip " +"will show you the directory path to your project's code" +msgstr "" + +#: ../../tutorials/installable-code.md:586 +msgid "Step 6: Test out your new package" +msgstr "" + +#: ../../tutorials/installable-code.md:588 +msgid "" +"After installing your package, type “python” at the command prompt in " +"your chosen terminal to start a Python session in your active Python " +"environment." +msgstr "" + +#: ../../tutorials/installable-code.md:591 +msgid "You can now import your package and access the `add_num` function." +msgstr "" + +#: ../../tutorials/installable-code.md:603 +msgid "Installing packages from GitHub" +msgstr "" + +#: ../../tutorials/installable-code.md:605 +msgid "" +"If you wish to share your code without publishing to PyPI you can always " +"install packages directly from GitHub using the syntax:" +msgstr "" + +#: ../../tutorials/installable-code.md:612 +msgid "To make your package GitHub installable, you can:" +msgstr "" + +#: ../../tutorials/installable-code.md:614 +msgid "Create a new GitHub repository" +msgstr "" + +#: ../../tutorials/installable-code.md:615 +msgid "" +"Push the contents of the project directory that you created above, to " +"GitHub" +msgstr "" + +#: ../../tutorials/installable-code.md:616 +msgid "" +"Finally install the package from GitHub using the command above. When you" +" use the command above, don't forget to substitute the user, repo, and " +"branch_or_tag with your specific values." +msgstr "" + +#: ../../tutorials/installable-code.md:618 +msgid "" +"For instance below you install the pyospackage from the main branch of " +"the pyOpenSci repository." +msgstr "" + +#: ../../tutorials/installable-code.md:621 +msgid "`python -m pip install git+https://github.com/user/repo.git@branch_or_tag`" +msgstr "" + +#: ../../tutorials/installable-code.md:625 +msgid "Congratulations! You created your first Python package" +msgstr "" + +#: ../../tutorials/installable-code.md:627 +msgid "" +"You did it! You have now created a Python package that you can install " +"into any Python environment." +msgstr "" + +#: ../../tutorials/installable-code.md:630 +msgid "In the upcoming lessons you will:" +msgstr "" + +#: ../../tutorials/installable-code.md:632 +msgid "" +"Learn how to [build and publish your Python package to (test) PyPI" +"](publish-pypi)" +msgstr "" + +#: ../../tutorials/installable-code.md:633 +msgid "Add a README file and LICENSE to your package" +msgstr "" + +#: ../../tutorials/installable-code.md:634 +msgid "" +"Add more metadata to your `pyproject.toml` file to support PyPI " +"publication." +msgstr "" + +#: ../../tutorials/installable-code.md:635 +msgid "learn how to publish to **conda-forge** from **PyPI**." +msgstr "" + +#: ../../tutorials/installable-code.md:637 +msgid "" +"Add a [README file](add-readme.md) and [LICENSE](add-license-coc.md) to " +"your package" +msgstr "" + +#: ../../tutorials/installable-code.md:638 +msgid "" +"[Add more metadata to your `pyproject.toml`](pyproject-toml.md) file to " +"support PyPI publication." +msgstr "" + +#: ../../tutorials/installable-code.md:639 +msgid "" +"[Learn how to build your package distribution](publish-pypi) files " +"(**sdist** and **wheel**) and publish to **test PyPI**." +msgstr "" + +#: ../../tutorials/installable-code.md:640 +msgid "" +"Finally you will learn how to [publish to **conda-forge**](publish-conda-" +"forge) from **PyPI**." +msgstr "" + +#: ../../tutorials/installable-code.md:644 +msgid "[Carpentries shell lesson](https://swcarpentry.github.io/shell-novice/)" +msgstr "" + +#: ../../tutorials/installable-code.md:646 +msgid "" +"[Python module " +"docs](https://docs.python.org/3/tutorial/modules.html#packages)" +msgstr "" + +#: ../../tutorials/installable-code.md:648 +msgid "[Numpy style docs](https://numpydoc.readthedocs.io/en/latest/format.html)" +msgstr "" + +#: ../../tutorials/installable-code.md:647 +msgid "[Google docstring style](https://google.github.io/styleguide/pyguide.html)" +msgstr "" + +#: ../../tutorials/installable-code.md:649 +msgid "[epydoc](https://epydoc.sourceforge.net/epytext.html)" +msgstr "" + +#: ../../tutorials/intro.md:27 ../../tutorials/setup-py-to-pyproject-toml.md:24 +msgid "Get to know Hatch" +msgstr "" + +#: ../../tutorials/intro.md:27 +msgid "Python Packaging Tutorial Setup" +msgstr "" + +#: ../../tutorials/intro.md:34 ../../tutorials/intro.md:71 +msgid "What is a Python package?" +msgstr "" + +#: ../../tutorials/intro.md:34 +msgid "Make your code installable" +msgstr "" + +#: ../../tutorials/intro.md:34 +msgid "Publish to PyPI" +msgstr "" + +#: ../../tutorials/intro.md:34 +msgid "Publish to conda-forge" +msgstr "" + +#: ../../tutorials/intro.md:34 +msgid "Create and publish a Python Package" +msgstr "" + +#: ../../tutorials/intro.md:44 +msgid "Add README file" +msgstr "" + +#: ../../tutorials/intro.md:44 +msgid "Add a license & code of conduct" +msgstr "" + +#: ../../tutorials/intro.md:44 +msgid "Update metadata in pyproject.toml" +msgstr "" + +#: ../../tutorials/intro.md:44 +msgid "Project information files & metadata" +msgstr "" + +#: ../../tutorials/intro.md:53 +msgid "Migrate setup.py to a pyproject.toml using Hatch" +msgstr "" + +#: ../../tutorials/intro.md:53 +msgid "Hatch for Existing Packages" +msgstr "" + +#: ../../tutorials/intro.md:1 +msgid "Python packaging 101" +msgstr "" + +#: ../../tutorials/intro.md:3 +msgid "_A start to finish beginner-friendly tutorial_" +msgstr "" + +#: ../../tutorials/intro.md:5 +msgid "" +"Welcome to the pyOpenSci Python packaging tutorial series. The lessons on" +" the upcoming pages walk you through the core steps needed to create a " +"Python package." +msgstr "" + +#: ../../tutorials/intro.md:11 +msgid "" +"Diagram showing the lessons in our packaging tutorial. There are 6 total " +"- what is a Python package, make code pip installable, publish your " +"package to PyPI, add a README and LICENSE file, add metadata for PyPI and" +" finally publish to conda forge." +msgstr "" + +#: ../../tutorials/intro.md:13 +msgid "" +"This lesson is the first in a series of lessons to help you get started " +"with Python packaging." +msgstr "" + +#: ../../tutorials/intro.md:16 +msgid "Who are these tutorials for?" +msgstr "" + +#: ../../tutorials/intro.md:18 +msgid "" +"The content in this tutorial series is beginner friendly and assumes that" +" you have not created a Python package before. However, the content will " +"still be valuable if you are interested in better understanding the steps" +" involved in creating a Python package." +msgstr "" + +#: ../../tutorials/intro.md:23 +msgid "" +"In this series you will learn about the core elements that you need to " +"publish your package to the [Python Package Index " +"(PyPI)](https://pypi.org/)." +msgstr "" + +#: ../../tutorials/intro.md:25 +msgid "" +"In the second series, you will learn about infrastructure and " +"documentation needed to support package maintenance." +msgstr "" + +#: ../../tutorials/intro.md:60 ../../tutorials/publish-conda-forge.md:15 +#: ../../tutorials/publish-pypi.md:13 ../../tutorials/pyproject-toml.md:19 +#: ../../tutorials/setup-py-to-pyproject-toml.md:12 +msgid "Learning Objectives" +msgstr "" + +#: ../../tutorials/intro.md:62 +msgid "" +"This lesson introduces you to the basic components of a Python package. " +"After reading this lesson you will:" +msgstr "" + +#: ../../tutorials/intro.md:65 +msgid "Understand what a Python package is" +msgstr "" + +#: ../../tutorials/intro.md:66 +msgid "Be able to list the 5 core components of a Python package" +msgstr "" + +#: ../../tutorials/intro.md:67 +msgid "" +"Be able to explain the difference between generalizable code and code " +"that supports a specific scientific application" +msgstr "" + +#: ../../tutorials/intro.md:73 +msgid "" +"At a high level, you can think about a Python package as a toolbox that " +"you can use to perform various tasks." +msgstr "" + +#: ../../tutorials/intro.md:76 +msgid "" +"A Python package is basically a directory with a specific file structure." +" Within the package directory structure, there are modules which are " +"files that end in `.py` (the same extension you'd see in a Python " +"script). These modules allow you to group and structure your Python code." +" Each module contains functions and classes, that you can think about as " +"the tools in your toolbox." +msgstr "" + +#: ../../tutorials/intro.md:85 +msgid "" +"Diagram showing a sketch of a toolbox filled with different tools " +"including a hammer and a saw." +msgstr "" + +#: ../../tutorials/intro.md:87 +msgid "" +"You can think about a package as a toolbox filled with coding tools. A " +"tool may be a function or a class. Each tool does a specific thing well." +msgstr "" + +#: ../../tutorials/intro.md:92 +msgid "Python packages are installable" +msgstr "" + +#: ../../tutorials/intro.md:94 +msgid "" +"A package is installable, which means that you can add the functionality " +"within the package's code to any Python environment and import that " +"functionality like you would import core scientific Python packages such " +"as NumPy or Matplotlib." +msgstr "" + +#: ../../tutorials/intro.md:103 +msgid "" +"Installing a package into an environment makes it easier to manage and " +"reuse your code across different projects. Structuring your code as a " +"package is the first step you need to take so you can share the tools in " +"the toolbox you've created and let others build with it." +msgstr "" + +#: ../../tutorials/intro.md:108 +msgid "Why create a Python package?" +msgstr "" + +#: ../../tutorials/intro.md:110 +msgid "You might create a Python package because you want to:" +msgstr "" + +#: ../../tutorials/intro.md:112 +msgid "" +"**Use your code across different projects:** At its most basic level, " +"creating a package allows you to install your code into a Python " +"environment. This allows you to then import functions and classes into " +"any workflows both locally and in the cloud." +msgstr "" + +#: ../../tutorials/intro.md:113 +msgid "" +"**Share your code:** If you publish a package on a public repository such" +" as PyPI or conda, your package can be installed on any machine using pip" +" or conda with a single command." +msgstr "" + +#: ../../tutorials/intro.md:114 +msgid "" +"**Build community around your code:** Packages make it easier for " +"multiple people to work on the same project (particularly when published " +"on GitHub). A version control system such as git (the system used by " +"GitHub), further makes it easier to track changes to the codebase over " +"time. Tools such as issues and pull requests make it easier for outside " +"users to contribute bug fixes and to establish review processes for " +"accepting changes to the code base." +msgstr "" + +#: ../../tutorials/intro.md:115 +msgid "" +"**Organize your code:** Packages can be used to organize large code " +"projects, dividing them into smaller, more manageable components. This " +"structure can help with both maintaining the codebase and with making it " +"easier to understand." +msgstr "" + +#: ../../tutorials/intro.md:117 +msgid "What to consider before you create a package" +msgstr "" + +#: ../../tutorials/intro.md:119 +msgid "" +"Creating a Python package that others use takes considerable time and " +"effort. Before you begin, think about your goals including:" +msgstr "" + +#: ../../tutorials/intro.md:122 +msgid "Who you think will use your package" +msgstr "" + +#: ../../tutorials/intro.md:123 +msgid "How people might use your package and on what data (if data are relevant)" +msgstr "" + +#: ../../tutorials/intro.md:124 +msgid "Whether you have time to add things such as documentation and tests" +msgstr "" + +#: ../../tutorials/intro.md:125 +msgid "" +"How long you might be able to maintain it: remember that once people " +"begin using your package they will depend on your maintainer team to " +"update it, fix bugs and answer questions." +msgstr "" + +#: ../../tutorials/intro.md:127 +msgid "" +"Before creating a user-facing package, it's important to consider all of " +"the above." +msgstr "" + +#: ../../tutorials/intro.md:129 +msgid "The elements of a Python package" +msgstr "" + +#: ../../tutorials/intro.md:133 ../../tutorials/intro.md:211 +msgid "Diagram showing .. more here if this stays." +msgstr "" + +#: ../../tutorials/intro.md:135 +msgid "" +"The elements of a Python package include code, documentation, tests, an " +"OSI-approved license and infrastructure. Maintainers are at the core " +"making sure everything works and is up to date while fixing bugs and " +"addressing user concerns." +msgstr "" + +#: ../../tutorials/intro.md:141 +msgid "The core elements of Python package include:" +msgstr "" + +#: ../../tutorials/intro.md:143 +msgid "" +"**Code:** Functions and classes that provide functionality for a user of " +"your package" +msgstr "" + +#: ../../tutorials/intro.md:144 +msgid "" +"**Documentation:** Installation instructions, tutorials, and examples " +"that both help users get started using your package and contributors and " +"maintainers fix bugs and maintain the package." +msgstr "" + +#: ../../tutorials/intro.md:145 +msgid "" +"Contributor Documentation in the form of a **CONTRIBUTING.md** file is " +"useful to help people to contribute to your package." +msgstr "" + +#: ../../tutorials/intro.md:146 +msgid "" +"Development Documentation helps both maintainers and contributors " +"understand how to maintain a package's infrastructure." +msgstr "" + +#: ../../tutorials/intro.md:147 +msgid "" +"**Tests:** that make sure your code works as it should and makes it " +"easier for you and others to contribute to, modify and update the code in" +" the future" +msgstr "" + +#: ../../tutorials/intro.md:148 +msgid "" +"**License:** An open source license, or license that is [OSI " +"approved](https://opensource.org/licenses/), refers to an license that " +"allows others to use your package. It also provides legal direction " +"regarding how elements of the package can and can't be reused." +msgstr "" + +#: ../../tutorials/intro.md:149 +msgid "" +"**Infrastructure** that automates updates, publication workflows and runs" +" test suites. Infrastructure includes a suite of things such as platforms" +" like GitHub and GitLab, tools to run tests and tools locally such as nox" +" and tox and continuous integration that automates package maintenance " +"steps." +msgstr "" + +#: ../../tutorials/intro.md:151 +msgid "What pyOpenSci looks for in a package" +msgstr "" + +#: ../../tutorials/intro.md:154 +msgid "" +"pyOpenSci performs an [initial set of editor " +"checks](https://www.pyopensci.org/software-peer-review/how-to/editor-in-" +"chief-guide.html#editor-checklist-template) for any package submitted to " +"us for peer review. You may find these checks useful as you create your " +"package as a baseline for things that you package should have." +msgstr "" + +#: ../../tutorials/intro.md:160 +msgid "Packages are more than just code - Infrastructure" +msgstr "" + +#: ../../tutorials/intro.md:162 +msgid "" +"A package in any language is more than just code. If you expect other " +"people to use your package, besides yourself, you should consider not " +"only writing high quality code, but also the various elements of a " +"package that make it a useful community resource." +msgstr "" + +#: ../../tutorials/intro.md:167 +msgid "Version control and storing your package on GitHub or GitLab" +msgstr "" + +#: ../../tutorials/intro.md:169 +msgid "" +"Most Python packages live in an online version control platform such as " +"GitHub or GitLab. GitHub and GitLab both run [git](https://git-scm.com/) " +"for version control. Having your software under version control is " +"important because it allows you to both track changes over time while " +"also going back in history and undoing changes in the case that a change " +"to the code base unexpectedly breaks something." +msgstr "" + +#: ../../tutorials/intro.md:174 +msgid "" +"By publishing your package on GitHub or GitLab, you are making your code " +"public facing. This means that others can both see your code and also " +"make contributions using a pull request (GitHub) / merge request (GitLab)" +" / code review workflow." +msgstr "" + +#: ../../tutorials/intro.md:176 +msgid "GitHub & GitLab vs. Git" +msgstr "" + +#: ../../tutorials/intro.md:179 +msgid "" +"GitHub and GitLab are online (cloud) platforms that run `git` (version " +"control software) on the backend. Running git locally on your computer " +"allows you to upload (`git push`) and download (`git pull`) files to " +"GitHub and GitLab." +msgstr "" + +#: ../../tutorials/intro.md:184 +msgid "Issues or Ticket Trackers" +msgstr "" + +#: ../../tutorials/intro.md:186 +msgid "" +"GitHub and GitLab also both offer community features such as issues that " +"allow:" +msgstr "" + +#: ../../tutorials/intro.md:188 +msgid "you to communicate with your maintainers and contributor community" +msgstr "" + +#: ../../tutorials/intro.md:189 +msgid "users to report bugs, ask questions and request new features" +msgstr "" + +#: ../../tutorials/intro.md:190 +msgid "" +"you to publicly keep track of enhancements and features you want to work " +"on for your package." +msgstr "" + +#: ../../tutorials/intro.md:192 +msgid "Continuous integration and continuous deployment" +msgstr "" + +#: ../../tutorials/intro.md:194 +msgid "" +"GitHub and GitLab also provide continuous integration and continuous " +"deployment (CI/CD). Continuous integration (CI) refers to a platform that" +" automatically runs a specific job when a certain event occurs, whereas " +"continuous deployment (CD) is an extension of CI that refers to not only " +"running or building but also to publishing the final outputs somewhere." +msgstr "" + +#: ../../tutorials/intro.md:196 +msgid "**An example of Continuous integration:**" +msgstr "" + +#: ../../tutorials/intro.md:198 +msgid "" +"When someone submits a change to your code, your tests will run across " +"different operating systems and the code will be checked for format " +"issues." +msgstr "" + +#: ../../tutorials/intro.md:200 +msgid "**An example of Continuous deployment:**" +msgstr "" + +#: ../../tutorials/intro.md:202 +msgid "" +"When you are ready to release your package to PyPI, a continuous " +"deployment operation might be triggered on release to publish your " +"package to PyPI." +msgstr "" + +#: ../../tutorials/intro.md:204 +msgid "" +"Integrated CI/CD will help you maintain your software, ensuring that " +"changes to the code don't break things unexpectedly. They can also help " +"you maintain code style and format consistency for every new change to " +"your code." +msgstr "" + +#: ../../tutorials/intro.md:213 +msgid "The lifecycle of a scientific Python package." +msgstr "" + +#: ../../tutorials/intro.md:216 +msgid "When should you turn your code into a Python package?" +msgstr "" + +#: ../../tutorials/intro.md:218 +msgid "" +"You may be wondering, what types of code should become a Python package " +"that is both on GitHub and published to PyPI and/or conda-forge." +msgstr "" + +#: ../../tutorials/intro.md:220 +msgid "There are a few use cases to consider:" +msgstr "" + +#: ../../tutorials/intro.md:222 +msgid "" +"**Creating a basic package for yourself:** Sometimes you want create a " +"package for your own personal use. This might mean making your code " +"locally pip installable and you may also want to publish it to GitHub. In" +" that case you don't expect others to use your code, and as such you may " +"only have documentation for you and your future self if you need to " +"update the package." +msgstr "" + +#: ../../tutorials/intro.md:224 +msgid "" +"An example of this type of package might be a set of functions that you " +"write that are useful across several of your projects. It could be useful" +" to have those functions available to all of your projects." +msgstr "" + +#: ../../tutorials/intro.md:227 +msgid "LINK to pip installable lesson when it's published - it's in review now" +msgstr "" + +#: ../../tutorials/intro.md:230 +msgid "" +"**Creating a package for the community:** In other cases, you may create " +"some code that you soon realize might also be useful to not just you, but" +" to other people as well. In that case, you might consider both creating " +"the package, publishing it on GitHub, and because other users may be " +"using it, you may make use of GitHub's infrastructure including CI/CD " +"pipelines and issue trackers. Because you want other people to use your " +"package, you will want to also include LICENSE information, documentation" +" for users and contributors and tests. This type of package is most often" +" published to PyPI." +msgstr "" + +#: ../../tutorials/intro.md:233 +msgid "" +"For example, all of the [pyOpenSci packages](https://www.pyopensci.org" +"/python-packages.html) are public facing with an intended audience beyond" +" just the maintainers." +msgstr "" + +#: ../../tutorials/intro.md:235 +msgid "Packages that you expect others to use should be well-scoped" +msgstr "" + +#: ../../tutorials/intro.md:237 +msgid "" +"Ideally the code in your Python package is focused on a specific theme or" +" use case. This theme is important as it's a way to scope the content of " +"your package." +msgstr "" + +#: ../../tutorials/intro.md:239 +msgid "" +"It can be tricky to decide when your code becomes something that might be" +" more broadly useful to others. But one question you can ask yourself is " +"- is your code written specifically for a single research project? Or " +"could it have a broader application across multiple projects in your " +"domain?" +msgstr "" + +#: ../../tutorials/intro.md:241 +msgid "How does this relate to code for a research project?" +msgstr "" + +#: ../../tutorials/intro.md:244 +msgid "" +"A [Research Compendium](https://the-turing-way.netlify.app/reproducible-" +"research/compendia.html) is an organized set of code, data and " +"documentation that supports a specific research project. It aims to " +"enhance the reproducibility and transparency of research by providing a " +"comprehensive record of the methods, data, and analyses used in a study." +msgstr "" + +#: ../../tutorials/intro.md:249 +msgid "" +"A Python package is a collection of modules that can be used to perform a" +" specific set of tasks. These tasks should be applicable to numerous " +"workflows. As such a Python package is more generalizable than a Research" +" Compendium which supports a specific project." +msgstr "" + +#: ../../tutorials/intro.md:254 +msgid "" +"[Read about `Good enough practices in scientific " +"computing`](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005510)" +msgstr "" + +#: ../../tutorials/intro.md:255 +msgid "" +"[Learn more about research compendia (also called repo-packs) in this " +"blog post.](https://lorenabarba.com/blog/how-repro-packs-can-save-your-" +"future-self/)" +msgstr "" + +#: ../../tutorials/intro.md:258 +msgid "Below are a few examples well scoped pyOpenSci packages:" +msgstr "" + +#: ../../tutorials/intro.md:260 +msgid "" +"[Crowsetta](https://crowsetta.readthedocs.io/en/latest/): is a package " +"designed to work with annotating animal vocalizations and bioacoustics " +"data. This package helps scientists process different types of " +"bioacoustic data rather than focusing on a specific individual research " +"application associated with a user-specific research workflow." +msgstr "" + +#: ../../tutorials/intro.md:261 +msgid "" +"[Pandera](https://www.union.ai/pandera) is another more broadly used " +"Python package. Pandera supports data testing and thus also has a broader" +" research application." +msgstr "" + +#: ../../tutorials/intro.md:263 +msgid "Matplotlib as an example" +msgstr "" + +#: ../../tutorials/intro.md:265 +msgid "" +"At the larger end of the user spectrum, Matplotlib is a great example. " +"Matplotlib does one thing really well:" +msgstr "" + +#: ../../tutorials/intro.md:268 +msgid "_It creates visual plots of data._" +msgstr "" + +#: ../../tutorials/intro.md:270 +msgid "" +"Thousands of people use Matplotlib for different plotting applications " +"using different types of data. While few scientific packages will have " +"the same broad application and large user base that Matplotlib has, the " +"idea of scoping out what your package does is still important." +msgstr "" + +#: ../../tutorials/intro.md:276 +msgid "Code should also be clean & readable & documented" +msgstr "" + +#: ../../tutorials/intro.md:278 +msgid "" +"The code in your package should also be clean, readable, and well " +"documented." +msgstr "" + +#: ../../tutorials/intro.md:280 +msgid "" +"**Clean code:** Clean code refers to code that uses expressive variable " +"names, is concise and doesn't repeat itself. You can learn about best " +"practices for clean code in future pyOpenSci tutorials." +msgstr "" + +#: ../../tutorials/intro.md:284 +msgid "" +"**Readable code:** readable code is code written with a consistent style." +" You can use linters and code formatters such as black and flake8 to " +"ensure this consistency throughout your entire package. [Learn more about" +" code formatters here.](../package-structure-code/code-style-linting-" +"format)" +msgstr "" + +#: ../../tutorials/intro.md:288 +msgid "" +"**Documented code:** documented code is written using docstrings that " +"help a user understand both what the functions and methods in your code " +"do and also what the input and output elements of each function are. [You" +" can learn more about docstrings in our guide, here.](../documentation" +"/write-user-documentation/document-your-code-api-docstrings)" +msgstr "" + +#: ../../tutorials/intro.md:292 +msgid "Making your package installable - publishing to PyPI & conda-forge" +msgstr "" + +#: ../../tutorials/intro.md:294 +msgid "Python packages and environments" +msgstr "" + +#: ../../tutorials/intro.md:296 +msgid "" +"You can install a Python package into a Python environment in the same " +"way you might install NumPy or Pandas. Installing your package into an " +"environment allows you to access it from any code run with that specific " +"Python environment activated." +msgstr "" + +#: ../../tutorials/intro.md:302 +msgid "" +"Diagram showing the steps associated with creating a package and then " +"installing it. The first arrow says your package and the second says pip " +"install package. The second arrow leads to a box that represents a Python" +" environment that already has some packages installed such as Pandas and " +"NumPy. Your package will also get installed into that same environment " +"when you pip install it." +msgstr "" + +#: ../../tutorials/intro.md:304 +msgid "" +"You don't have to publish to PyPI to make your code installable. With the" +" correct file structure and project metadata you can make your code " +"installable locally on your computer and use it for projects that you are" +" working on without having to ever publish to PyPI. Publishing to PyPI is" +" useful when you want to make your code public-facing and share it with " +"others." +msgstr "" + +#: ../../tutorials/intro.md:311 +msgid "Publishing a package to PyPI / Conda-Forge" +msgstr "" + +#: ../../tutorials/intro.md:313 +msgid "" +"If you want to make your package directly installable without having to " +"download the code to your computer locally then you need to publish it in" +" a repository such as **PyPI** or **conda-forge**." +msgstr "" + +#: ../../tutorials/intro.md:317 +msgid "" +"Learn [how to publish your package to PyPI in this tutorial.](publish-" +"pypi.md)" +msgstr "" + +#: ../../tutorials/intro.md:319 +msgid "" +"Then you can create a conda-forge recipe using the " +"[Grayskull](https://github.com/conda/grayskull) tool. You can then submit" +" this recipe to conda-forge." +msgstr "" + +#: ../../tutorials/intro.md:321 +msgid "" +"[You will learn more about the conda-forge publication process here" +".](publish-conda-forge.md)" +msgstr "" + +#: ../../tutorials/intro.md:324 +msgid "" +"Graphic showing the high level packaging workflow. On the left you see a " +"graphic with code, metadata and tests in it. Those items all go into your" +" package. Documentation and data are below that box because they aren't " +"normally published in your packaging wheel distribution. an arrow to the " +"right takes you to a build distribution files box. that box leads you to " +"either publishing to TestPyPI or the real PyPI. From PyPI you can then " +"connect to conda-forge for an automated build that sends distributions " +"from PyPI to conda-forge." +msgstr "" + +#: ../../tutorials/intro.md:326 +msgid "" +"In the image above, you can see the steps associated with publishing your" +" package on PyPI and conda-forge. Note that the distribution files that " +"PyPI requires are the [sdist](#python-source-distribution) and [wheel" +"](#python-wheel) files. Once you are ready to make your code publicly " +"installable, you can publish it on PyPI. Once your code is on PyPI it is " +"straight forward to then publish to conda-forge. You create a recipe " +"using the Grayskull package and then you open a pr in the conda-forge " +"recipe repository. You will learn more about this process in the [conda-" +"forge lesson](/tutorials/publish-conda-forge)." +msgstr "" + +#: ../../tutorials/intro.md:330 +msgid "Yay, your package has users! Now what?" +msgstr "" + +#: ../../tutorials/intro.md:332 +msgid "" +"As the community using your package grows, you may also find yourself " +"managing users, contributors, and others who want to interact with your " +"package. It’s important to consider all this before you dive into " +"development. Once you have a user base in the community, people will " +"depend upon your code to work and will need direction regarding how to " +"use it." +msgstr "" + +#: ../../tutorials/intro.md:334 +msgid "To support your community, you'll want to add things like:" +msgstr "" + +#: ../../tutorials/intro.md:336 +msgid "" +"[a development guide that documents your maintainer workflow process " +"](/documentation/repository-files/development-guide.md)" +msgstr "" + +#: ../../tutorials/intro.md:337 +msgid "" +"[a code of conduct to defines community interaction standards and " +"expectations](/documentation/repository-files/code-of-conduct-file.md)" +msgstr "" + +#: ../../tutorials/intro.md:338 +msgid "" +"[a contributing guide that helps users understand expectations associated" +" with making contributions to your project](/documentation/repository-" +"files/contributing-file.md)" +msgstr "" + +#: ../../tutorials/intro.md:340 +msgid "Support for contributors and maintainers" +msgstr "" + +#: ../../tutorials/intro.md:342 +msgid "" +"If you intend for others to use and contribute to your code, consider who" +" will maintain it over time. You will want a **contributing and " +"development** guide to help new potential contributors get started with " +"contributing to your package, as well as a **code of conduct** to ensure " +"community interactions remain healthy both for you and your contributors " +"and maintainer team." +msgstr "" + +#: ../../tutorials/intro.md:344 +msgid "" +"The elements above are also important for future maintenance of your " +"package. In the case that you are no long able to maintain it or simply " +"want extra help, development, and contributing documentation will help " +"you onboard new maintainers." +msgstr "" + +#: ../../tutorials/intro.md:349 +msgid "What's next?" +msgstr "" + +#: ../../tutorials/intro.md:351 +msgid "" +"In future lessons you will learn more about the infrastructure around a " +"published Python package that makes it both easier to maintain, easier " +"for others to contribute to and easier for other scientists to use. " +"However, first we want to get you to your initial goal of publishing a " +"Python package." +msgstr "" + +#: ../../tutorials/intro.md:353 +msgid "" +"In this next lesson you will learn how to create a basic installable " +"Python package. Make your code pip installable " +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:1 +msgid "Publish your Python package that is on PyPI to conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:3 +msgid "In the previous lessons, you've learned:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:5 +msgid "" +"How to [create the most basic version of a Python package](installable-" +"code.md). This entailed making your code installable." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:6 +msgid "[How to publish your Python package to PyPI](publish-pypi)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:7 +msgid "How to add a `README` and `LICENSE` file to your package" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:8 +msgid "" +"How to setup your `pyproject.toml` file with all of the metadata that " +"PyPI requires and also metadata that will be helpful for users to find " +"your package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:10 +msgid "" +"If you have gone through all of the above lessons, you are now ready to " +"publish your package on conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:13 +msgid "" +"**IMPORTANT:** Please do not practice publishing your package to conda-" +"forge. You should only publish to conda-forge when you have a package on " +"pypi.org that you plan to maintain." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:19 ../../tutorials/publish-pypi.md:17 +msgid "In this lesson you will learn how to:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:21 +msgid "Create a conda-forge yaml recipe for your package using Grayskull" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:22 +msgid "" +"Submit the recipe (yaml file) to the conda-forge staged recipes " +"repository as a pull request" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:23 +msgid "" +"Maintain your conda-forge package by creating new releases for your " +"package on PyPI" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:26 +msgid "" +"Once your package is on PyPI you can then easily publish it to conda-" +"forge using the [grayskull](https://conda.github.io/grayskull/) tool. You" +" do not need to build the package specifically for conda, conda-forge " +"will build from your PyPI source distribution file (sdist)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:33 +msgid "" +"Image showing the progression of creating a Python package, building it " +"and then publishing to PyPI and conda-forge. You take your code and turn " +"it into distribution files (sdist and wheel) that PyPI accepts. then " +"there is an arrow towards the PyPI repository where ou publish both " +"distributions. From PyPI if you create a conda-forge recipe you can then " +"publish to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:35 +msgid "" +"Once you have published both package distributions (the source " +"distribution and the wheel) to PyPI, you can then publish to conda-forge." +" Conda-forge requires a source distribution on PyPI in order to build " +"your package on conda-forge. You do not need to rebuild your package to " +"publish to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:38 +msgid "What is conda-forge?" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:40 +msgid "" +"conda is an open source package and environment management tool that can " +"be used to install tools from the different channels on Anaconda.org." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:43 +msgid "" +"You can think about a channel as a specific location where a group of " +"packages are stored and can be installed from using a command such as " +"`conda install packagename`. In the case of conda channels, some of these" +" channels such as the `defaults` channel, is managed by Anaconda (the " +"company). Only Anaconda can decide what packages are available in the " +"`defaults` channel. However, the conda-forge (and bioconda) channel are " +"community-managed channels. Anyone can submit a package to these channels" +" however they must pass a technical review in the [staged-recipes GitHub " +"repository](https://github.com/conda-forge/staged-recipes) to be " +"published." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:46 +msgid "[Learn more about conda channels here.](#about-conda)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:50 +msgid "" +"Graphic with the title Python package repositories. Below it says " +"anything hosted on PyPI can be installed using pip install. Packaging " +"hosted on a conda channel can be installed using conda install. Below " +"that there are two rows. The top row says conda channels. Next to it are " +"three boxes one with conda-forge, community maintained; bioconda and then" +" default - managed by the Anaconda team. Below that there is a row that " +"says PyPI servers. PyPI - anyone can publish to PyPI and test PyPI (a " +"testbed server for you to practice)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:52 +msgid "" +"Conda channels represent various repositories that you can install " +"packages from. Because conda-forge is community maintained, anyone can " +"submit a recipe there. PyPI is also a community maintained repository. " +"Anyone can submit a package to PyPI and test PyPI. Unlike conda-forge " +"there are no manual checks of packages submitted to PyPI." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:55 +msgid "Why publish to conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:57 +msgid "" +"There are many users, especially in the scientific Python ecosystem that " +"use conda as their primary package manager / environment tool. Thus, " +"having packages available to these users on the conda-forge channel is " +"useful. In some cases packages on conda-forge can minimize dependency " +"conflicts that can occur when mixing installations using pip and conda. " +"This is particularly important for the spatial ecosystem." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:59 +msgid "How publishing to conda-forge works" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:61 +msgid "" +"Once you have built and published your package to PyPI, you have " +"everything that you need to publish to conda-forge. There is no " +"additional build step needed to publish to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:63 +msgid "" +"Conda-forge will build your package from the source distribution which " +"you [published to PyPI in the previous lesson](publish-pypi) using the " +"recipe that you will create below." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:65 +msgid "Conda-forge publication steps" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:68 +msgid "" +"Image showing the steps associated with publishing to conda-forge. Check " +"out the caption below for a detailed description." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:70 +msgid "" +"The steps for publishing to conda-forge begin with publishing your Python" +" package to PyPI. Once you have published to PyPI you can then create a " +"yaml file recipe that can be submitted to the conda-forge staged recipes " +"repository for review. Once that recipe is accepted, your package will " +"get it's on repository (known as a feedstock) on conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:73 +msgid "The steps to publish to conda-forge are:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:75 +msgid "Publish your Python package distribution files (sdist & wheel) to PyPI" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:76 +msgid "" +"Create a conda-forge recipe, which is a yaml file with instructions on " +"how to build your package on conda-forge, using the grayskull[^grayskull]" +" package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:77 +msgid "" +"Submit the recipe (yaml file) to the conda-forge staged recipes " +"repository as a pull request for review. [Click here for an example " +"submission from pyOpenSci.](https://github.com/conda-forge/staged-" +"recipes/pull/25173)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:79 +msgid "" +"Once someone from the conda-forge team reviews your pull request, you may" +" need to make some changes. Eventually the pull request will be approved " +"and merged." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:81 +msgid "" +"Once your recipe is accepted and merged on conda-forge, users can install" +" your package using:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:83 +msgid "`conda install -c conda-forge your-package`" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:85 +msgid "" +"You only create the recipe once. Once the recipe is accepted and merged, " +"you only need to maintain the repository." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:87 +msgid "Maintaining a conda-forge package" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:89 +msgid "" +"Once your package is on conda-forge, the repository will track release " +"activity on the package's PyPI repository. Any time you make a new PyPI " +"release with a new source distribution, conda-forge will build and update" +" your conda-forge repository (also known as a feedstock)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:91 +msgid "" +"When the update is processed, the friendly conda-forge bot will create a " +"new pull request with an updated distribution recipe in your feedstock." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:93 +msgid "" +"You can review that pull request and then merge it once all of the " +"continuous integration tests pass." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:95 +msgid "" +" How to Publish your package" +" on conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:97 +msgid "" +"It's time to add your package to the conda-forge channel. Remember that " +"your package needs to be on PyPI before the steps below will work. And " +"also remember that the team managing conda-forge are all volunteers." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:100 +msgid "" +"Be sure that your package is on PyPI.org (not test.pypi.org) before you " +"attempt to publish to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:103 +msgid "" +"Only submit your package to conda-forge if you intend to maintain it over" +" time." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:106 +msgid "" +"Note - this is a tutorial aimed to help you get your package onto conda-" +"forge. The official conda documentation for this processed [is " +"here](https://conda-forge.org/docs/maintainer/adding_pkgs.html)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:108 +msgid "Step 1: Install grayskull" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:110 +msgid "" +"First, [install " +"grayskull](https://conda.github.io/grayskull/user_guide.html). You can " +"install it using either pip:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:116 +msgid "or conda" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:122 +msgid "" +"To run this command, use the same shell / terminal that you have been " +"using to run hatch commands in the previous tutorials." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:127 +msgid "" +"You can also install grayskull using pipx[^pipx]. pipx is a tool that " +"allows you to install commonly used tools that you might want to have " +"available across multiple Python environments rather than installing the " +"package into every Python environment that ou create." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:130 +msgid "Step 2: Fork and clone the conda-forge staged-recipes repository" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:132 +msgid "" +"Next, open your shell and `cd` to a location where you want to clone the " +"**conda-forge/staged-recipes** repository." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:133 +msgid "" +"fork and clone the [conda-forge/staged-recipes GitHub " +"repository](https://github.com/conda-forge/staged-recipes)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:134 +msgid "" +"Create a new branch in your fork rather than submitting from the main " +"branch of your fork. We suggest naming the branch your package's name." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:136 +msgid "`git checkout -b your-package-name `" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:138 +msgid "In bash, `cd` into the `staged-recipes/recipes` folder" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:146 +msgid "" +"Next, create a new branch in your `conda-forge/staged-recipes` cloned " +"repository. You might want to make that branch the same name as your " +"package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:157 +msgid "Step 3: Create your conda-forge recipe" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:159 +msgid "Next, navigate to the recipes directory" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:161 +msgid "" +"If you run `ls` here, you will notice there is an example directory with " +"an example recipe for you to look at." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:173 +msgid "Next, run `grayskull pypi your-package-name` to generate a recipe." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:217 +msgid "" +"Grayskull will pull metadata about your package from PyPI. It does not " +"use your local installation of the package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:218 +msgid "" +"An internet connection is needed to run the `grayskull pypi your-package-" +"name` step." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:221 +msgid "" +"When you run grayskull, it will grab the latest distribution of your " +"package from PyPI and will use that to create a new recipe." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:223 +msgid "" +"The recipe will be saved in a directory named after your package's name, " +"wherever you run the command." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:225 +msgid "`recipes/packagename/meta.yaml`" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:227 +msgid "" +"At the very bottom of the grayskull output, it will also tell you where " +"it saved the recipe file." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:230 +msgid "" +"Open the meta.yaml file. The finished `meta.yaml` file that grayskull " +"creates should look like the example below:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:277 +msgid "Step 3b: Bug fix - add a home url to the about: section" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:279 +msgid "" +"There is currently a small bug in Grayskull where it doesn't populate the" +" home: element of the recipe. if you don't include this, [you will " +"receive an error message](https://github.com/conda-forge/staged-" +"recipes/pull/25173#issuecomment-1917916528) from the friendly conda-forge" +" linter bot." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:293 +msgid "to fix this, open your meta.yaml file in your favorite text editor." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:294 +msgid "and add a home: element to the about section" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:296 +msgid "The about section will look like this after you create your recipe." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:306 +msgid "" +"Below you add a home: element. If you have a project home page / website " +"you can use that url. Otherwise, you can also use your PyPI landing page." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:317 +msgid "Step 4: tests for conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:319 +msgid "" +"Next, have a look at the tests section in your **meta.yaml** file. At a " +"minimum you should import your package or the main modules associated " +"with your package and run `pip check`." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:321 +msgid "" +"`pip check` will ensure that your package installs properly with all of " +"the proper dependencies." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:333 +msgid "" +"If you have more advanced tests that you wish to run, you can add them " +"here. However, you can also simply leave the tests section as it is." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:335 +msgid "Step 4: Submit a pull request to the staged-recipes repository" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:337 +msgid "" +"Once you have completed all of the above, you are ready to open up a pull" +" request in the `conda-forge/staged-recipes repository`." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:339 +msgid "" +"Submit a pull request from your fork/branch of the staged-recipes " +"repository." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:340 +msgid "" +"Remember that the conda-forge maintainers are volunteers. Be patient for " +"someone to respond and supportive in your communication with them." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md +msgid "Conda-forge checklist help" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:346 +msgid "Conda-forge Staged-recipes Pull Request Checklist" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:348 +msgid "" +"When you submit your package to conda-forge, the pull request template " +"includes a list of checks that you want to ensure you have covered." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:350 +msgid "Below we break down each element of that list." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:352 +msgid "Pull request template checklist tips" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:355 +msgid "" +"-[x] Title of this PR is meaningful: e.g. \"Adding my_nifty_package\", " +"not \"updated meta.yaml\"." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:357 +msgid "" +"**Translation:** Make sure that your pull request title is specific. We " +"suggest something like: `Add recipe for `" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:360 +msgid "" +"-[x] License file is packaged (see [here](https://github.com/conda-forge" +"/staged-" +"recipes/blob/5eddbd7fc9d1502169089da06c3688d9759be978/recipes/example/meta.yaml#L64-L73)" +" for an example)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:362 +msgid "" +"**Translation:** You should have a LICENSE file included in your " +"package's source distribution. If you have followed the pyOpenSci " +"tutorials then you already have a LICENSE file and are likely using the " +"MIT license. When you run `hatch build`, it will bundle that file into " +"the output [source distribution file (which is the tar.gz file)](python-" +"source-distribution) that conda-forge will use to build your package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:364 +msgid "[x] Source is from official source." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:366 +msgid "" +"**Translation:** If your package is on PyPI as you learned in the " +"[previous lesson on publishing your Python package](publish-pypi) then " +"you are in good shape. conda-forge prefers that your distribution is " +"published to a known repository." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:368 +msgid "" +"-[x] Package does not vendor other packages. (If a package uses the " +"source of another package, they should be separate packages or the " +"licenses of all packages need to be packaged)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:370 +msgid "" +"**Translation:** If the code base in your package is your own and it all " +"shares the same LICENSE then you are in good shape. If you have code " +"taken from other packages then you may need to declare that and include " +"licenses for that code if it is different. If you followed these " +"tutorials then you do not have any vendored code." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:372 +msgid "" +"-[x] If static libraries are linked in, the license of the static library" +" is packaged." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:374 +msgid "" +"-[x] Package does not ship static libraries. If static libraries are " +"needed, [follow CFEP-18](https://github.com/conda-" +"forge/cfep/blob/main/cfep-18.md)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:376 +msgid "" +"**Translation:** A static library refers to a copy of a package built " +"into your package. If your package is a pure Python package, then you can" +" check that your package does not ship static libraries as this does not " +"apply to you." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:378 +msgid "" +"The pyOpenSci tutorials are all pure Python and as such do not use static" +" libraries in a linked or shipped (included in the package distribution) " +"format." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:380 +msgid "" +"If your package has a more complex build that includes links to " +"extensions written in other languages such as C++, then be sure to " +"include the proper licenses for those extensions in your metadata." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:385 +msgid "" +"If you want to learn more about static libraries, then [this " +"overview](https://pypackaging-" +"native.github.io/background/compilation_concepts/#shared-vs-static-" +"libraries) might help." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:388 +msgid "-[ ] Build number is 0." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:390 +msgid "" +"**Translation:** The build number in your recipe is right below the " +"source location of your package's source distribution. `number: 0` is " +"what you should see in that section of your recipe." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:403 +msgid "" +"[x] A tarball (`url`) rather than a repo (e.g. `git_url`) is used in your" +" recipe (see [here](https://conda-" +"forge.org/docs/maintainer/adding_pkgs.html) for more details)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:405 +msgid "" +"**Translation:** Here conda wants you to provide a link to the source " +"distribution on PyPI rather than a link to your GitHub repository " +"distribution. Notice above in the Source section of your recipe there is " +"a `url:` section that provides a PyPI url that ends in tar.gz. That is a " +"link to your source distribution that conda-forge will use." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:411 +msgid "" +"[x] GitHub users listed in the maintainer section have posted a comment " +"confirming they are willing to be listed there." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:413 +msgid "" +"**Translation** Once you have submitted your recipe, be sure that all " +"maintainers listed in your recipe respond acknowledging that they are ok " +"with being listed as a maintainer for the conda-forge version of your " +"package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:415 +msgid "" +"[x] When in trouble, please check our [knowledge base " +"documentation](https://conda-" +"forge.org/docs/maintainer/knowledge_base.html) before pinging a team." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:417 +msgid "" +"**Translation** The conda team are volunteers who spend their time " +"supporting our community. Please try to troubleshoot on your own first " +"before tagging one of them for help." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:419 +msgid "" +"This is also why we don't suggest you publish to conda-forge as a " +"practice run." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:423 +msgid "" +"Once you create your pull request, a suite of CI actions will run that " +"build and test the build of your package. A conda-forge maintainer will " +"work with you to get your recipe in good shape and merged." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:427 +msgid "" +"Image showing the 5 CI tasks that will run against your package in the " +"GitHub interface after you'ce created a pull request." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:429 +msgid "" +"Wait until all of the CI steps in your pull request have run. At that " +"point your pull request is ready for review by a conda-forge maintainer." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:432 +msgid "" +"In some cases getting all of the checks to run successfully in CI might " +"take a bit of work. If you are struggling to get your recipe to build " +"properly, you can ping the conda-forge maintainer team for help." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:434 +msgid "Please be patient and wait for them to respond." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:436 +msgid "conda-forge staged recipes and CI failures" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:439 +msgid "" +"If your package is a pure Python package that can be installed on any " +"type of computer (Windows, mac, linux) and has no architecture " +"requirements (known as noarch: Python or no architecture requirements) " +"then the conda-forge team only requires tests for Linux CI to pass." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:441 +msgid "" +"So if tests for Windows and MAC OS fail, that is to be expected. In this " +"case, don't worry about failing tests, the maintainer team can help you " +"get your package published." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:444 +msgid "" +"Once you have submitted your recipe, you can wait for the CI build to " +"pass. If it's not passing, and you aren't sure why, a conda-forge " +"maintainer can likely help you figure things out." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:446 +msgid "" +"Once your recipe is built and merged, the conda team will create a new " +"package repository for you similar to [this one for the GemGIS " +"package](https://github.com/conda-forge/gemgis-feedstock)." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:448 +msgid "" +" Congratulations - you " +"have added your package to conda-forge." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:450 +msgid "" +"The last part of this process is maintaining the repository. We cover " +"that next." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:453 +msgid "Maintaining your conda-forge feedstock" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:455 +msgid "" +"Every time you create a new release on PyPI, the conda-forge bots will " +"recognize the release and will rebuild the newly released version of your" +" package. This process may take a day or two to complete so be patient." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:457 +msgid "" +"Once the conda-forge build is complete, all of the maintainers of your " +"conda-forge feedstock will get a ping on GitHub that a new pull request " +"has been opened." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:459 +msgid "" +"Review the pull request. If all tests are passing, you can merge it. " +"Shortly after merging your pull request, the conda-forge release will be " +"available for users to install:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:461 +msgid "`conda install -c conda-forge yourpackage`" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:465 +msgid "If you have walked through this entire tutorial series you will now:" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:467 +msgid "Understand [what a Python package is ](intro.md)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:468 +msgid "" +"Know how to [make your code installable](installable-code.md) into Python" +" environments" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:469 +msgid "" +"Know how to create a `pyproject.toml` file, a `README` file, and a " +"`LICENSE` and code of conduct." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:470 +msgid "Know how to [publish your package to PyPI](publish-pypi.md) and" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:471 +msgid "Know how to publish your package to conda-forge" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:473 +msgid "" +"The above are the basic steps that you need to take to create and publish" +" a Python package. In a future tutorial series we will cover that basics " +"of maintaining your package." +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:477 +msgid "[Grayskull blogpost](https://conda-forge.org/blog/2020/03/05/grayskull/)" +msgstr "" + +#: ../../tutorials/publish-conda-forge.md:478 +msgid "[Pipx documentation](https://pipx.pypa.io/stable/)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:1 +msgid "Publish your Python package to PyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:4 +msgid "" +"Make sure they add /dist to their .gitignore file. We have not discussed " +"GitHub workflows anywhere yet. Where does that fit?" +msgstr "" + +#: ../../tutorials/publish-pypi.md:8 +msgid "In the previous Python packaging lessons, you've learned:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:10 +msgid "What a Python package is" +msgstr "" + +#: ../../tutorials/publish-pypi.md:11 +msgid "How to make your code installable." +msgstr "" + +#: ../../tutorials/publish-pypi.md:19 +msgid "Build your package's source (sdist) and wheel distributions" +msgstr "" + +#: ../../tutorials/publish-pypi.md:20 +msgid "Setup an account on TestPyPI (the process is similar for PyPI)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:21 +msgid "Publish your package to TestPyPI and PyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:23 +msgid "" +"You will do all of your development work in this lesson using " +"[Hatch](https://hatch.pypa.io/latest/)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:25 +msgid "" +"Once your package is on PyPI you can publish it to conda-forge (which is " +"a channel on conda) using " +"[Grayskull](https://conda.github.io/grayskull/)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:28 +msgid "" +"You will learn how to publish to conda-forge in the [next lesson" +"](publish-conda-forge)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:32 +msgid "" +"Graphic showing the high level packaging workflow. On the left you see a " +"graphic with code, metadata and tests in it. Those items all go into your" +" package. An arrow to the right takes you to a build distribution files " +"box. Another arrow to the right takes you to a publish to PyPI box which " +"has an arrow containing sdist and wheel that notes those files go to PyPI" +" for hosting. From PyPI is an arrow containing sdist since you can then " +"connect to conda-forge for an automated build that sends distributions " +"from PyPI to conda-forge." +msgstr "" + +#: ../../tutorials/publish-pypi.md:34 +msgid "" +"You need to build your Python package in order to publish it to PyPI (or " +"Conda). The build process organizes your code and metadata into a " +"distribution format that can be uploaded to PyPI and subsequently " +"downloaded and installed by users." +msgstr "" + +#: ../../tutorials/publish-pypi.md:37 +msgid "TestPyPI vs PyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:39 +msgid "" +"There are two repositories associated with PyPI to which you can upload " +"your Python package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:42 +msgid "" +"**[TestPyPI](https://test.pypi.org):** TestPyPI is a package repository " +"provided by PyPI that you can use for testing that your package can be " +"uploaded, downloaded, and installed correctly. This is a great place to " +"practice and learn how to publish a package without exposing your " +"incomplete package on the real PyPI service." +msgstr "" + +#: ../../tutorials/publish-pypi.md:43 +msgid "" +"**[PyPI](https://pypi.org):** This is the live, production PyPI " +"repository where you can officially publish your Python package, and from" +" which users will get your package. IMPORTANT: Only publish your package " +"to PyPI when you are ready for it to be used by others and/or confident " +"that it will become a package that you will maintain. PyPI is not a place" +" to practice learning how to publish a Python package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:45 +msgid "" +"The steps for publishing on TestPyPI vs. PyPI are similar with the " +"exception of a different url. We will point out where they differ." +msgstr "" + +#: ../../tutorials/publish-pypi.md:48 +msgid "4 Steps for publishing a Python package on TestPyPI (or PyPI)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:50 +msgid "" +"In this lesson you will learn how to publish your package to TestPyPI " +"using [Hatch](https://hatch.pypa.io/latest/). There are 4 things that you" +" need to do to publish your Python package: to TestPyPI. You need to:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:55 +msgid "**Create a package development environment**" +msgstr "" + +#: ../../tutorials/publish-pypi.md:56 +msgid "" +"[**Build your package using `hatch build`**](../package-structure-code" +"/python-package-distribution-files-sdist-wheel). Building a package is " +"the process of turning your code into two types of distribution files: " +"sdist and wheel. The wheel distribution file is particularly important " +"for users who will `pip install` your package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:57 +msgid "" +"**Create an account on TestPyPI (or PyPI)**: You will need to create a " +"TestPyPI account and associated token which provides permissions for you " +"to upload your package. When you later publish your package to PyPI, you " +"will need a separate PyPI account and token." +msgstr "" + +#: ../../tutorials/publish-pypi.md:58 +msgid "**Publish to TestPyPI using `hatch publish`**" +msgstr "" + +#: ../../tutorials/publish-pypi.md:60 +msgid "" +"In a future lesson, you will learn how to create an automated GitHub " +"action workflow that publishes an updated version of your package to PyPI" +" every time you create a GitHub release." +msgstr "" + +#: ../../tutorials/publish-pypi.md:64 +msgid "Learn more about building Python packages in our guide" +msgstr "" + +#: ../../tutorials/publish-pypi.md:68 +msgid "" +"[Learn more about what building a Python package is](../package-" +"structure-code/python-package-distribution-files-sdist-wheel)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:69 +msgid "" +"[Learn more about the package distribution file that PyPI needs called " +"the wheel](#python-wheel)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:70 +msgid "" +"[Learn more about the package distribution file that conda-forge will " +"need on PyPI called the sdist (source distribution)](#python-source-" +"distribution)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:73 +msgid "Step 1: Create a Python package development environment" +msgstr "" + +#: ../../tutorials/publish-pypi.md:75 +msgid "" +"The first step in building your package is to create a development " +"environment. The Python environment will contain all of the dependencies " +"needed to both install and work on your package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:77 +msgid "Use Hatch to create your environment." +msgstr "" + +#: ../../tutorials/publish-pypi.md:85 +msgid "Then view all of the current environments that hatch has access to:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:97 +msgid "" +"Then activate the environment. Note that when you call a shell from a " +"Hatch environment, it will automatically install your package into the " +"environment in development or editable mode." +msgstr "" + +#: ../../tutorials/publish-pypi.md:107 +msgid "View what's in the environment using `pip list`:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:123 +msgid "At any time you can exit the environment using `exit`." +msgstr "" + +#: ../../tutorials/publish-pypi.md:137 +msgid "Hatch and environments" +msgstr "" + +#: ../../tutorials/publish-pypi.md:139 +msgid "" +"Behind the scenes when hatch creates a new virtual environment, by " +"default it uses venv[^venv] which is the default environment management " +"tool that comes with Python installations." +msgstr "" + +#: ../../tutorials/publish-pypi.md:142 +msgid "Hatch will:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:144 +msgid "Create a new virtualenv (venv) that is located on your computer." +msgstr "" + +#: ../../tutorials/publish-pypi.md:145 +msgid "" +"Install your package into the environment in editable mode (similar to " +"`python -m pip install -e`). This means it installs both your project and" +" your project's dependencies as declared in your pyproject.toml file." +msgstr "" + +#: ../../tutorials/publish-pypi.md:147 +msgid "Step 2: Build your package's sdist and wheel distributions" +msgstr "" + +#: ../../tutorials/publish-pypi.md:149 +msgid "" +"Once you have your development environment setup, you are ready to build " +"your package using Hatch. Remember that building is the process of " +"turning your Python package file structure into two distribution files:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:151 +msgid "" +"The [wheel distribution](#python-wheel) is a pre-built version of your " +"package. It useful for users as it can be directly installed using a tool" +" such as `pip`. This file has the extension `.whl`." +msgstr "" + +#: ../../tutorials/publish-pypi.md:152 +msgid "" +"The [source distribution](#python-source-distribution) contains the files" +" that make up your package in an unbuilt format. This file will have the " +"extension `.tar.gz`." +msgstr "" + +#: ../../tutorials/publish-pypi.md:154 +msgid "" +"You will use Hatch as a **Front end** tool that builds your package's " +"sdist and wheel using the [hatchling](https://hatch.pypa.io/latest/) " +"build back-end. The hatchling build back-end is used because you declared" +" it in your pyproject.toml file in the [previous lesson](installable-" +"code)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:158 +msgid "To build your package run `hatch build`:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:169 +msgid "Learn more about building a Python package" +msgstr "" + +#: ../../tutorials/publish-pypi.md:171 +msgid "" +"You can learn more about building in the [build page of our packaging " +"guide](../package-structure-code/python-package-distribution-files-sdist-" +"wheel)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:175 +msgid "" +"The sdist is important if you wish to [publish your package to conda-" +"forge](publish-conda-forge). You will learn about this in a later lesson." +msgstr "" + +#: ../../tutorials/publish-pypi.md:179 +msgid "" +"➜ hatch build ────────────────────────────────────── sdist " +"────────────────────────────────────── dist/pyospackage-0.1.tar.gz " +"────────────────────────────────────── wheel " +"────────────────────────────────────── dist/pyospackage-0.1-py3-none-" +"any.whl" +msgstr "" + +#: ../../tutorials/publish-pypi.md:186 +msgid "" +" Congratulations - " +"you've created your Python package distribution files " +msgstr "" + +#: ../../tutorials/publish-pypi.md:188 +msgid "" +"You've now built your Python package and created your package " +"distribution files. The next step is to setup your account on TestPyPI so" +" you can publish your package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:191 +msgid "Step 3. Setup your TestPyPI account" +msgstr "" + +#: ../../tutorials/publish-pypi.md:193 +msgid "" +"Next, you'll setup an account on TestPyPI. Remember that you are using " +"TestPyPI here instead of the real PyPI as a way to safely learn how to " +"publish a package without accidentally \"releasing\" your package before " +"it's ready." +msgstr "" + +#: ../../tutorials/publish-pypi.md:197 +msgid "TestPyPI vs. PyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:198 +msgid "" +"If you have a package that you are confident belongs on PyPI, all of the " +"steps below will also work for you. When you publish using Hatch, you " +"will call `hatch publish` to publish directly to PyPI instead of `hatch " +"publish -r test` which publishes to TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:201 +msgid "" +"[Open up a web browser and go to the TestPyPI " +"website](https://test.pypi.org/)." +msgstr "" + +#: ../../tutorials/publish-pypi.md:202 +msgid "" +"[Create an account](https://test.pypi.org/account/register/) if you don't" +" already have one. Be sure to store your password in a safe place!" +msgstr "" + +#: ../../tutorials/publish-pypi.md:203 +msgid "Once you have an account setup, login to it." +msgstr "" + +#: ../../tutorials/publish-pypi.md:204 +msgid "" +"Search on [https://test.pypi.org/](https://test.pypi.org/) (and also on " +"[https://pypi.org/](https://pypi.org/)) to ensure that the package name " +"that you have selected doesn't already exist. If you are using our test " +"pyosPackage, then we suggest that you add your name or GitHub username to" +" the end of the package name to ensure it's unique." +msgstr "" + +#: ../../tutorials/publish-pypi.md:206 +msgid "Example: `pyosPackage_yourNameHere`." +msgstr "" + +#: ../../tutorials/publish-pypi.md +msgid "Renaming your project before publishing" +msgstr "" + +#: ../../tutorials/publish-pypi.md:211 +msgid "Required" +msgstr "" + +#: ../../tutorials/publish-pypi.md:213 +msgid "" +"Search your publishing location(s) to make sure your new name isn't taken" +" ([TestPyPI](https://test.pypi.org/), [PyPI](https://pypi.org/), [conda-" +"forge](https://conda-forge.org/packages/))" +msgstr "" + +#: ../../tutorials/publish-pypi.md:214 +msgid "" +"Update the project name in your pyproject.toml file (e.g. `name = " +"\"pyospackage_yourNameHere\"`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:215 +msgid "" +"Update the module folder name to be the same (e.g. " +"`src/pyospackage_yourNameHere`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:216 +msgid "Rebuild your project (`hatch build`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:217 +msgid "Publish your package to capture the name (continue this tutorial!)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:219 +msgid "Recommended" +msgstr "" + +#: ../../tutorials/publish-pypi.md:221 +msgid "Update the Github repository name to align with the new package name" +msgstr "" + +#: ../../tutorials/publish-pypi.md:222 +msgid "" +"Update your local project folder to match the new package name (e.g. " +"`pyospackage_yourNameHere/src`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:223 +msgid "Update mentions of your repository name in other files (e.g. `README.md`)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:227 +msgid "" +"This is a screenshot of the TestPyPI website. At the top in the search " +"bar, you can see the search for pyosPackage. The search return says there" +" were no results for pyosPackage Did you mean probpackage" +msgstr "" + +#: ../../tutorials/publish-pypi.md:229 +msgid "" +"Before you try to upload to TestPyPI, check to see if the name of your " +"package is already taken. You can do that using the search box at the top" +" of the TestPyPI website." +msgstr "" + +#: ../../tutorials/publish-pypi.md:233 +msgid "Setup 2-factor (2FA) authentication" +msgstr "" + +#: ../../tutorials/publish-pypi.md:235 +msgid "" +"2-factor authentication is a secure login process that allows you to use " +"a backup device that only you can access to validate that the person " +"logging in is really you. It addresses the issue of password phishing " +"where someone else gains access to a password and can login to your " +"account." +msgstr "" + +#: ../../tutorials/publish-pypi.md:238 +msgid "" +"This matters on PyPI because someone could login to your account and " +"upload a version of your package that has security issues. These issues " +"will then impact all of your users when they download and install that " +"version of the package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:240 +msgid "" +"2-factor authentication is required for PyPI authentication as of 1 " +"January 2024." +msgstr "" + +#: ../../tutorials/publish-pypi.md:244 +msgid "Step 4. Create a package upload token" +msgstr "" + +#: ../../tutorials/publish-pypi.md:246 +msgid "" +"To upload your package to TestPyPI (or PyPI), you will need to create a " +"token for your account first, and should then create a package-specific " +"token. (If you completed this step previously, you can reuse the tokens " +"when you upload your package again.)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:248 +msgid "Why create package-specific tokens?" +msgstr "" + +#: ../../tutorials/publish-pypi.md:250 +msgid "" +"It's ideal to create a package-specific token. When you create an " +"account-wide token this allows anyone with access to the account to then " +"access all of your TestPyPI (or PyPI) projects. By creating a package-" +"specific token, you are limiting the scope of the token to only your " +"specific package. This is just a safe way to set things up for you " +"particularly if you are collaborating with others on package development." +msgstr "" + +#: ../../tutorials/publish-pypi.md:253 +msgid "Follow the steps below to create your token." +msgstr "" + +#: ../../tutorials/publish-pypi.md:255 +msgid "Login to TestPyPI and go to your account settings" +msgstr "" + +#: ../../tutorials/publish-pypi.md:256 +msgid "Scroll down to the **API tokens** section" +msgstr "" + +#: ../../tutorials/publish-pypi.md:257 +msgid "Click on the **Add API Token** button" +msgstr "" + +#: ../../tutorials/publish-pypi.md:258 +msgid "" +"If you are new to using TestPyPI and don't have any packages there yet, " +"OR if you have other packages on TestPyPI but are uploading a new " +"package, you will need to create an account-wide token." +msgstr "" + +#: ../../tutorials/publish-pypi.md:259 +msgid "" +"When you create your token, be sure to copy the token value and store it " +"in a secure place before closing that browser." +msgstr "" + +#: ../../tutorials/publish-pypi.md:261 +msgid "Your token should look something like this:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:263 +msgid "`pypi-abunchofrandomcharactershere...`" +msgstr "" + +#: ../../tutorials/publish-pypi.md:265 +msgid "It should start with `pypi` followed by a dash and a bunch of characters." +msgstr "" + +#: ../../tutorials/publish-pypi.md:267 +msgid "Upload to TestPyPI using Hatch" +msgstr "" + +#: ../../tutorials/publish-pypi.md:269 +msgid "Once you have your token, you are ready to publish to TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:272 +msgid "Run `hatch publish -r test`" +msgstr "" + +#: ../../tutorials/publish-pypi.md:274 +msgid "" +"`-r` stands for repository. In this case because you are publishing to " +"TestPyPI you will use `-r test`. Hatch will then ask for a username and " +"credentials." +msgstr "" + +#: ../../tutorials/publish-pypi.md:276 +msgid "" +"Add the word `__token__` for your username. This tells TestPyPI that you " +"are using a token value rather than a username." +msgstr "" + +#: ../../tutorials/publish-pypi.md:277 +msgid "Paste your TestPyPI token value in at the `Enter your credentials` prompt:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:288 +msgid "" +"If your credentials are valid, and you have already run `hatch build` and" +" thus have your 2 distribution files in a `dist/` directory then Hatch " +"will publish your package to TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:292 +msgid "" +"Hatch also has a caching system so once you enter your credentials it " +"will remember them." +msgstr "" + +#: ../../tutorials/publish-pypi.md:295 +msgid "Install your package from TestPyPI" +msgstr "" + +#: ../../tutorials/publish-pypi.md:297 +msgid "" +"Once your package upload is complete, you can install it from TestPyPI. " +"You can find the installation instructions on the TestPyPI landing page " +"for your newly uploaded package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:302 +msgid "" +"A screenshot of the TestPyPI page for pyosPackage. It says pyosPackage " +"0.1.0 at the top with the pip install instructions below. The landing " +"page of the package has information from the package's README file." +msgstr "" + +#: ../../tutorials/publish-pypi.md:304 +msgid "" +"This is an example landing page for the pyosPackage that was just " +"uploaded. Notice at the top of the page there are instructions for how to" +" install the package from TestPyPI. You can simply copy that code and use" +" it to install your package from TestPyPI locally." +msgstr "" + +#: ../../tutorials/publish-pypi.md:307 +msgid "" +"As an example, [check out our pyOpenSci pyosPackage landing page on " +"TestPyPI](https://test.pypi.org/project/pyosPackage/). Notice that the " +"page has information about the current package version and also " +"installation instructions as follows:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:311 +msgid "`python -m pip install -i https://test.pypi.org/simple/ pyosPackage`" +msgstr "" + +#: ../../tutorials/publish-pypi.md:314 +msgid "" +"Publishing to TestPyPI vs PyPI While you can install from TestPyPI it's " +"not recommended that you publish to TestPyPI as a permanent way to " +"install your package. In fact, you cannot, because TestPyPI may delete " +"accounts after a time. TestPyPI is a perfect place to learn how to " +"publish your package and test the installation process. But your end goal" +" should be to publish to PyPI once you have figured out your workflow and" +" your package is ready to deploy." +msgstr "" + +#: ../../tutorials/publish-pypi.md:318 +msgid "Time to install your package" +msgstr "" + +#: ../../tutorials/publish-pypi.md:320 +msgid "" +"On your computer, activate the development environment that you wish to " +"install your newly published package in." +msgstr "" + +#: ../../tutorials/publish-pypi.md:322 +msgid "Run the installation instructions for your package from TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md +msgid "Conda" +msgstr "" + +#: ../../tutorials/publish-pypi.md +msgid "venv Mac / Linux" +msgstr "" + +#: ../../tutorials/publish-pypi.md:346 +msgid "The value of end-to-end tools like hatch, flit and poetry" +msgstr "" + +#: ../../tutorials/publish-pypi.md:347 +msgid "" +"In this lesson you are using Hatch and hatchling to create, build and " +"publish your Python package. [Click here to learn about other packaging " +"tools in the ecosystem.](../package-structure-code/python-package-build-" +"tools.md)" +msgstr "" + +#: ../../tutorials/publish-pypi.md:351 +msgid "" +"teach them to setup trusted publisher for actions... in the actions " +"lesson https://pypi.org/help/#twofa" +msgstr "" + +#: ../../tutorials/publish-pypi.md:354 +msgid "" +"from PyPI: https://pypi.org/help/#apitoken - You can create a token for " +"an entire PyPI account, in which case, the token will work for all " +"projects associated with that account. Alternatively, you can limit a " +"token's scope to a specific project." +msgstr "" + +#: ../../tutorials/publish-pypi.md:357 +msgid "Package-specific token vs trusted publisher" +msgstr "" + +#: ../../tutorials/publish-pypi.md:359 +msgid "" +"For long run maintenance of your package, you have two options related to" +" PyPI publication." +msgstr "" + +#: ../../tutorials/publish-pypi.md:362 +msgid "" +"You can create a package-specific token which you will use to publish " +"your package (manually) to PyPI. This is a great option if you don't wish" +" to automate your PyPI publication workflow." +msgstr "" + +#: ../../tutorials/publish-pypi.md:363 +msgid "" +"You can also create an automated publication workflow on GitHub using " +"GitHub actions. This is a great way to make the publication process " +"easier and it also supports a growing maintainer team. In this case we " +"suggest you don't worry about the token and instead setup a specific " +"GitHub action that publishes your package when you make a release. You " +"can then create a \"trusted publisher\" workflow on PyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:365 +msgid "" +"You will learn how to create the automated trusted publisher workflow in " +"a followup lesson." +msgstr "" + +#: ../../tutorials/publish-pypi.md:368 +msgid "OPTIONAL: If you want to use a manual token-based publication workflow" +msgstr "" + +#: ../../tutorials/publish-pypi.md:370 +msgid "" +"If you plan to use your token regularly to publish to PyPI, we strongly " +"recommend going through the above steps again to create a token specific " +"to your new package." +msgstr "" + +#: ../../tutorials/publish-pypi.md:373 +msgid "To do this:" +msgstr "" + +#: ../../tutorials/publish-pypi.md:374 +msgid "Go to TestPyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:375 +msgid "Navigate to the \"Your Projects\" section of your account" +msgstr "" + +#: ../../tutorials/publish-pypi.md:376 +msgid "" +"Click on the manage button for the project that you wish to add a token " +"for" +msgstr "" + +#: ../../tutorials/publish-pypi.md:377 +msgid "Go to settings" +msgstr "" + +#: ../../tutorials/publish-pypi.md:378 +msgid "Click on \"Create a token for your-package-name-here\"" +msgstr "" + +#: ../../tutorials/publish-pypi.md:379 +msgid "" +"Create the token and follow the steps above publish your package using " +"the repository specific token." +msgstr "" + +#: ../../tutorials/publish-pypi.md:381 +msgid "And you're all done!" +msgstr "" + +#: ../../tutorials/publish-pypi.md:383 +msgid "You have published your package to TestPyPI!" +msgstr "" + +#: ../../tutorials/publish-pypi.md:385 +msgid "" +"Congratulations. You have now successfully published your package to " +"TestPyPI. If you have a package that is ready for real-world use on the " +"real PyPI, then you can follow the same steps (with the differences noted" +" above) to publish it on PyPI." +msgstr "" + +#: ../../tutorials/publish-pypi.md:387 +msgid "" +"Once you publish on PyPI, you can then easily add your package to the " +"conda-forge ecosystem using the [grayskull](https://conda-" +"forge.org/blog/posts/2020-03-05-grayskull/) tool." +msgstr "" + +#: ../../tutorials/publish-pypi.md:389 +msgid "You will learn how to do that in the next lesson." +msgstr "" + +#: ../../tutorials/publish-pypi.md:396 +msgid "https://docs.python.org/3/library/venv.html" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:1 +msgid "Make your Python package PyPI ready - pyproject.toml" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:3 +msgid "" +"In [the installable code lesson](installable-code), you learned how to " +"add the bare minimum information to a `pyproject.toml` file to make it " +"installable. You then learned how to [publish a bare minimum version of " +"your package to PyPI](publish-pypi.md)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:5 +msgid "Following that you learned how to add a:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:6 +msgid "[README.md](add-readme)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:7 +msgid "[LICENSE](add-license-coc) and" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:8 +msgid "[CODE_OF_CONDUCT](add-coc)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:10 +msgid "to the root of your project directory." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:12 +msgid "" +"To enhance the visibility of your package on PyPI and provide more " +"information about its compatibility with Python versions, project " +"development status, and project maintainers, you should add additional " +"metadata to your `pyproject.toml` file. This lesson will guide you " +"through the process." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:24 +msgid "" +"More about the `pyproject.toml` file and how it's used to store different" +" types of metadata about your package" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:25 +msgid "" +"How to declare information (metadata) about your project to help users " +"find and understand it on PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:27 +msgid "" +"If you wish to learn more about the `pyproject.toml` format, [check out " +"this page. ](../package-structure-code/pyproject-toml-python-package-" +"metadata.md)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md +msgid "Click for lesson takeaways" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:34 +msgid "When creating your pyproject.toml file, consider the following:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:36 +msgid "" +"There are only two required metadata tables that you need to install and " +"publish your Python package:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:37 +msgid "**[build-system]**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:38 +msgid "**[project]**." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:39 +msgid "" +"The **[project]** table stores your package's metadata. Within the " +"**[project]** table, There are only two _required_ fields:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:40 +msgid "**name=**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:41 +msgid "**version=**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:42 +msgid "" +"You should add more metadata to the `[project]` table as it will make it " +"easier for users to find your project on PyPI. And it will also make it " +"easier for installers to understand how to install your package." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:43 +msgid "" +"When you are adding classifiers to the **[project]** table, only use " +"valid values from [PyPI’s classifier " +"page](https://PyPI.org/classifiers/). An invalid value here will raise an" +" error when you build and publish your package on PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:44 +msgid "" +"There is no specific order for tables in the `pyproject.toml` file. " +"However, fields need to be placed within the correct tables. For example " +"`requires =` always need to be in the **[build-system]** table." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:45 +msgid "" +"We suggest that you include your **[build-system]** table at the top of " +"your `pyproject.toml` file." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:50 +msgid "" +"The `pyproject.toml` file is a human and machine-readable file that " +"serves as the primary configuration file for your Python package." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:54 +msgid "" +"[Building your package](build-package) is the step that created the " +"distribution files that are required for you to publish to PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:58 +msgid "About the .toml format" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:60 +msgid "" +"The **pyproject.toml** file is written in [TOML (Tom's Obvious, Minimal " +"Language) format](https://toml.io/en/). TOML is an easy-to-read structure" +" that is based on key/value pairs. Each section in the **pyproject.toml**" +" file contains a `[table identifier]`. The TOML format can be compared to" +" other structured formats such as`.json`. However, the TOML format was " +"designed to be easier to read for humans." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:62 +msgid "" +"Below you can see the `[build-system]` table. Within that table there are" +" two required key/value pairs." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:65 +msgid "" +"`requires =` is the key and the value is `[\"hatchling\"]` within the " +"`[build-system]` array specified by square brackets `[]`." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:75 +msgid "What is the pyproject.toml used for?" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:77 +msgid "The pyproject.toml file tells your build tool:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:79 +msgid "" +"What build backend to use to build your package (we are using `hatchling`" +" in this tutorial but there are [many others to choose from](/package-" +"structure-code/python-package-build-tools))." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:80 +msgid "How and where to retrieve your package's version:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:81 +msgid "**statically** where you declare the version `version = \"0.1.0\"` or" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:82 +msgid "" +"**dynamically** where the tool looks to the most recent tag in your " +"history to determine the current version." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:83 +msgid "What dependencies your package needs" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:84 +msgid "What versions of Python your package supports (important for your users)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:86 +msgid "" +"The `pyproject.toml` file also makes it easy for anyone browsing your " +"GitHub repository to quickly understand your package's structure such as:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:89 +msgid "How your package is built," +msgstr "" + +#: ../../tutorials/pyproject-toml.md:90 +msgid "What Python versions and operating systems it supports" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:91 +msgid "What it does," +msgstr "" + +#: ../../tutorials/pyproject-toml.md:92 +msgid "Who maintains it" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:94 +msgid "" +"Finally, the pyproject.toml file is also often used to configure tools " +"such as static type checkers (e.g. mypy) and code formatters/linters " +"(e.g. black, ruff)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:97 +msgid "" +"Check out the [PyPA " +"documentation](https://packaging.python.org/en/latest/tutorials" +"/packaging-projects/#choosing-a-build-backend) if you are interested in " +"setting build configurations for other tools." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:99 +msgid "" +"Note that some build tools may deviate in how they store project " +"metadata. As such you may want to refer to their documentation if you " +"decide to use a tool other than Hatch and hatchling. We have selected " +"hatchling and hatch as our tool of choice for this tutorial as it adheres" +" to PyPA rules and guidelines." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:103 +msgid "How is pyproject.toml metadata used?" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:105 +msgid "" +"The pyproject.toml file is the file that your build tool uses to populate" +" a `METADATA` that is included in your Python distribution files that get" +" published to PyPI. This `METADATA` file is then used by PyPI to populate" +" your package's PyPI landing page and help users filter through the tens " +"of thousands of packages published there." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:108 +msgid "" +"Image showing the left side bar of PyPI for the package xclim. The " +"section at the top says Classifier. Below there is a list of items " +"including Development status, intended audience, License, natural " +"language, operating system, programming language and topic. Below each of" +" those sections are various classifier options.\" width=\"300px\">" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:113 +msgid "" +"When you add the classifier section to your pyproject.toml and your " +"package is built, the build tool organizes the metadata into a format " +"that PyPI can understand and represent on your PyPI landing page. These " +"classifiers also allow users to sort through packages by version of " +"python they support, categories and more." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:119 +msgid "A more in-depth overview of pyproject.toml files" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:121 +msgid "" +"[Our guidebook page has a more in depth overview of this file" +"](../package-structure-code/pyproject-toml-python-package-metadata/)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:124 +msgid "How to update your pyproject.toml file" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:126 +msgid "" +"In the last lesson, you created a bare-bones pyproject.toml file that " +"contained the core elements needed to build your package:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:130 +msgid "" +"A `[build-system]` table where you defined your project's backend build " +"tool (`hatchling`)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:131 +msgid "A `[project]` table where you defined your project's version and name." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:133 +msgid "The `pyproject.toml` file that you created, looked like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:145 +msgid "" +"Your next step is to add additional recommended metadata fields that will" +" both help users find your package on PyPI and also better describe the " +"scope of your package. Once you add this metadata, you don't have to do " +"it again. These metadata fields will only be updated periodically when " +"you do something such as:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:148 +msgid "drop a package dependency" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:149 +msgid "modify what Python versions your package supports." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:151 +msgid "More on hatchling" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:154 +msgid "" +"The documentation for the hatchling back-end is " +"[here](https://hatch.pypa.io/latest/config/metadata/)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:157 +msgid "Step 1: Add Author, maintainer and project description" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:159 +msgid "" +"After completing the [installable code tutorial](installable-code), you " +"should have a pyproject.toml file with a project name and a version in " +"the `[project]` table." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:167 +msgid "Add the following to your table:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:169 +msgid "" +"A **description** of your package. This should be a single line and " +"should briefly describe the goal of your package using non technical " +"terms if as all possible!" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:170 +msgid "package **authors**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:171 +msgid "package **maintainers**" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:173 +msgid "The `description` is just a string like the other values you've set:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:184 +msgid "" +"When you add authors and maintainers you need to use a format that will " +"look like a Python list with a dictionary within it:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:198 +msgid "Author names & emails" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:202 +msgid "" +"There is a quirk with PyPI for authors that have names but not emails in " +"the pyproject.toml. If you are missing the email for one or more authors " +"or maintainers, like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:211 +msgid "" +"Then we suggest that you only provide names in your list of names to " +"ensure that everything renders properly on your PyPI page - like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:220 +msgid "don't have emails for everyone, we suggest that you only add names." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:223 +msgid "" +"Your `pyproject.toml` file now should look like the example below. It is " +"OK if you only have 1 author and the same author is also maintainer of " +"your package:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md +msgid "" +"Learn More: What's the difference between author and maintainer in open " +"source?" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:251 +msgid "" +"When adding maintainers and authors, you may want to think about the " +"difference between the two." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:253 +msgid "Authors generally include people who:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:254 +msgid "originally created / designed developed the package and" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:255 +msgid "people who add new functionality to the package." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:257 +msgid "" +"Whereas maintainers are the people that are currently, actively working " +"on the project. It is often the case that there is overlap in authors and" +" maintainers. As such these lists may be similar or the same." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:259 +msgid "" +"A good example of when the lists might diverge is sometimes you have a " +"package where an initial author developed it and then stepped down as a " +"maintainer to move on to other things. This person may continue to be " +"considered an author but no longer actively maintains the package." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:261 +msgid "" +"It is important to note that there are many ways to define author vs " +"maintainer and we don't prescribe a single approach in this tutorial." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:263 +msgid "" +"However, we encourage you to consider carefully, for PyPI publication, " +"who you want to have listed as authors and maintainers on your PyPI " +"landing page." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:267 +msgid "Step 2: Add README and license" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:269 +msgid "" +"In the previous lessons, you added both a [README.md](add-readme) file " +"and a [LICENSE](add-license-coc) to your package repository. Once you " +"have those files, you can add them to your pyproject.toml file as links " +"following the example below." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:297 +msgid "Step 3: Specify Python version with `requires-python`" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:299 +msgid "" +"Add the `requires-python` field to your `pyproject.toml` `[project]` " +"table. The `requires-python` field helps pip identify which Python " +"versions that your package supports. It is set to a single value. The " +"[packaging " +"specification](https://packaging.python.org/en/latest/specifications" +"/core-metadata/#core-metadata-requires-python) defines`requires-python` " +"as a string that uses version specifiers. Most projects will specify the " +"oldest Python version supported by the package. In some advanced cases, " +"an upper bound is set to indicate which future Python versions, if any, " +"will be supported." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:331 +msgid "Step 4: Specify Dependencies" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:333 +msgid "" +"Next add your dependencies table to the project table. The `dependencies " +"=` section contains a list (or array in the toml language) of the Python " +"packages that your package requires to run properly in a Python " +"environment. Similar to the requirements listed in the `[build-system]` " +"table above:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:341 +msgid "dependencies are added in an array (similar to a Python list) structure." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:347 +msgid "" +"A dependency can be limited to specific versions using a **version " +"specifier.** If the dependency has no version specifier after the " +"dependency name, your package can use any version of the dependent " +"package. Code changes over time, bugs are fixed, APIs change, and so it's" +" good to be clear about which version of the dependency you wrote your " +"code to be compatible with - a package you wrote this year probably isn't" +" compatible with numpy v0.0.1!" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:351 +msgid "" +"[Learn more about various ways to specify ranges of package versions " +"here.](https://packaging.python.org/en/latest/specifications/version-" +"specifiers/#id5)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:353 +msgid "" +"The most common version specifier is a **lower bound,** allowing any " +"version higher than the specified version. Ideally you should set this to" +" the lowest version that is still compatible with your package, but in " +"practice for new packages this is often set at the version that was " +"current at the time the package was written[^lowerbound]." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:358 +msgid "Lower bounds look like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:364 +msgid "" +"Commas are used to separate individual dependencies, and each package in " +"your `dependencies` section can use different types of version " +"specifiers:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:375 +msgid "Your `pyproject.toml` file will now look like this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:405 +msgid "Pin dependencies with caution" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:406 +msgid "" +"\"Pinning\" a dependency means setting it to a specific version, like " +"this:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:408 +msgid "`numpy == 1.0`." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:410 +msgid "" +"If you are building a library package that other developers will depend " +"upon, you must be cautious before pinning to a precise dependency " +"version. Applications, such as production websites, will often pin their " +"dependencies since other packages will not depend on their project. This " +"is because users will be installing your package into various " +"environments. A dependency pinned to a single specific version can make " +"resolving a Python environment more challenging. As such only pin " +"dependencies to a specific version if you absolutely need to do so." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:418 +msgid "" +"Similarly, you should be cautious when specifying an upper bound on a " +"package. These two specifications are equivalent:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:426 +msgid "" +"One build tool that you should be aware of that pins dependencies to an " +"upper bound by default is Poetry. [Read more about how to safely add " +"dependencies with Poetry, here.](challenges-with-poetry)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:429 +msgid "Step 5: Add PyPI classifiers" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:431 +msgid "" +"Next you will add classifiers to your `pyproject.toml` file. The value " +"for each classifier that you add to your `pyproject.toml` file must come " +"from the list of [PyPI accepted classifier values found " +"here](https://PyPI.org/classifiers/). Any deviations in spelling and " +"format will cause issues when you publish to PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:433 +msgid "What happens when you use incorrect classifiers?" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:436 +msgid "" +"If you do not [use standard classifier " +"values](https://PyPI.org/classifiers/), when you try to publish your " +"package on PyPI it will be rejected. 😔 Don't worry if PyPI rejects you on" +" your first try! It has happened to all of us." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:439 +msgid "Review that list and add items below to your `pyproject.toml` file:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:441 +msgid "development status" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:442 +msgid "intended audiences" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:443 +msgid "topic" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:444 +msgid "license and" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:445 +msgid "programming language support" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:447 +msgid "" +"The classifier key should look something like the example below. A few " +"notes:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:449 +msgid "" +"Your classifier values might be different depending upon the license you " +"have selected for your package, your intended audience, development " +"status of your package and the Python versions that you support" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:450 +msgid "" +"You can add as many classifiers as you wish as long as you use the " +"[designated PyPI classifier values](https://PyPI.org/classifiers/)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:490 +msgid "" +"Note that while classifiers are not required in your `pyproject.toml` " +"file, they will help users find your package. As such we strongly " +"recommend that you add them." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:492 +msgid "Step 6: Add the `[project.urls]` table" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:494 +msgid "Finally, add the project.urls table to your pyproject.toml file." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:496 +msgid "" +"`project.urls` contains links that are relevant for your project. You " +"might want to include:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:498 +msgid "" +"**Homepage:** A link to your published documentation for your project. If" +" you are working through this tutorial, then you may not have this link " +"yet. That's ok, you can skip it for the time being." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:499 +msgid "" +"**Bug reports:** a link to your issues / discussions or wherever you want" +" users to report bugs." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:500 +msgid "**Source:** the GitHub / GitLab link for your project." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:546 +msgid "" +"There are many other urls that you can add here. Check out the [README " +"file here for an overview](https://github.com/patrick91/links-demo)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:549 +msgid "Putting it all together - your completed pyproject.toml file" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:551 +msgid "" +"Below is an example of a complete `pyproject.toml` file that is commented" +" with all of the sections we discussed above." +msgstr "" + +#: ../../tutorials/pyproject-toml.md +msgid "Appendix - Click for a fully commented pyproject.toml file" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:601 +msgid "" +"Below is a fully commented pyproject.toml file if you want to use it for " +"reference." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:666 +msgid "Example `pyproject.toml` files" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:668 +msgid "" +"Below are some examples of `pyproject.toml` files from various packages " +"in the scientific and pyOpenSci ecosystem." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:669 +msgid "" +"[PyPA's fully documented example pyproject.toml " +"file](https://github.com/pypa/sampleproject/blob/main/pyproject.toml)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:670 +msgid "" +"[taxpasta has a nicely organized pyproject.toml file and is a pyOpenSci " +"approved " +"package](https://github.com/taxprofiler/taxpasta/blob/f9f6eea2ae7dd08bb60a53dd49ad77e4cf143573/pyproject.toml)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:676 +msgid "At this point you've created:" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:678 +msgid "A [README.md](add-readme) file for your package" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:679 +msgid "A [CODE_OF_CONDUCT.md](add-coc) file to support your user community" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:680 +msgid "" +"And a [LICENSE](add-license-coc) file which provides legal boundaries " +"around how people can and can't use your software" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:682 +msgid "" +"You also learned [how to publish your package to (test)PyPI](publish-" +"pypi)." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:684 +msgid "Publish a new version of your package to PyPI" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:686 +msgid "" +"You are now ready to publish a new version of your Python package to " +"(test) PyPI. When you do this you will see that the landing page for your" +" package now contains a lot more information." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:688 +msgid "Try to republish now." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:690 +msgid "" +"First, update the version of your package in your pyproject toml file. " +"Below version is updated from `0.1` to `0.1.1`." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:703 +msgid "Now use hatch to publish the new version of your package to test.PyPI.org." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:710 +msgid "Next (optional) step - publishing to conda-forge" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:712 +msgid "" +"You now have all of the skills that you need to publish your package to " +"PyPI." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:715 +msgid "" +"If you also want to publish your package on conda-forge (which is a " +"channel within the conda ecosystem), you will learn how to do that in the" +" next lesson." +msgstr "" + +#: ../../tutorials/pyproject-toml.md:719 +msgid "" +"Really good resources from jeremiah " +"https://daniel.feldroy.com/posts/2023-08-pypi-project-urls-cheatsheet " +"useful (and the linked links-demo even more so)" +msgstr "" + +#: ../../tutorials/pyproject-toml.md:356 +msgid "" +"Some packaging tools will do this for you when you add a dependency using" +" their cli interface. For example [`poetry add`](https://python-" +"poetry.org/docs/cli/#add) will add the most recent version with a `^` " +"specifier, and [`pdm add`](https://pdm-" +"project.org/latest/reference/cli/#add) will add the most recent version " +"with `>=`." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:1 +msgid "Using Hatch to Migrate setup.py to a pyproject.toml" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:3 +msgid "" +"Hatch can be particularly useful to generate your project's " +"`pyproject.toml` if your project already has a `setup.py`." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:5 +msgid "Note" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:8 +msgid "" +"This step is not necessary and is only useful if your project already has" +" a `setup.py` file defined." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:9 +msgid "" +"If your project does not already define a `setup.py` see [Make your " +"Python code installable](installable-code.md)" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:17 +msgid "" +"The process of using Hatch to transition to using `pyproject.toml` for " +"projects that already have a `setup.py` defined." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:20 +msgid "What is Hatch?" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:22 +msgid "" +"Hatch is a Python package manager designed to streamline the process of " +"creating, managing, and distributing Python packages. It provides a " +"convenient CLI (Command-Line Interface) for tasks such as creating new " +"projects, managing dependencies, building distributions, and publishing " +"packages to repositories like PyPI." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:28 +msgid "See [Get to know Hatch](get-to-know-hatch.md) for more information." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:31 +msgid "Prerequisites" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:33 +msgid "" +"Before we begin, ensure that you have Hatch installed on your system. You" +" can install it via pip:" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:39 +msgid "Sample Directory Tree" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:41 +msgid "" +"Let's take a look at a sample directory tree structure before and after " +"using `hatch init`:" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:43 +msgid "Before `hatch init`" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:59 +msgid "After `hatch init`" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:77 +msgid "" +"As you can see, the main change after running `hatch init` is the " +"addition of the `pyproject.toml` file in the project directory." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:79 +msgid "Step-by-Step Guide" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:81 +msgid "" +"Now, let's walk through the steps to use Hatch to create a " +"`pyproject.toml` file for your project." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:83 +msgid "" +"**Navigate to Your Project Directory**: Open your terminal or command " +"prompt and navigate to the directory where your Python project is " +"located." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:85 +msgid "" +"**Initialize Hatch**: Run the following command to initialize Hatch in " +"your project directory:" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:91 +msgid "" +"**Review and Customize**: After running the previous command, Hatch will " +"automatically generate a `pyproject.toml` file based on your existing " +"project configuration. Take some time to review the contents of the " +"generated `pyproject.toml` file. You may want to customize certain " +"settings or dependencies based on your project's requirements (see " +"[pyproject.toml tutorial](pyproject-toml.md) for more information about " +"the `pyproject.toml`)." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:93 +msgid "" +"**Verify**: Verify that the `pyproject.toml` file accurately reflects " +"your project configuration and dependencies. You can manually edit the " +"file if needed, but be cautious and ensure that the syntax is correct." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:95 +msgid "" +"**Delete setup.py**: Since we're migrating to using `pyproject.toml` " +"exclusively, the `setup.py` file becomes unnecessary. You can safely " +"delete it from your project directory." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:97 +msgid "" +"**Test Build**: Before proceeding further, it's essential to ensure that " +"your project builds successfully using only the `pyproject.toml` file. " +"Run the following command to build your project:" +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:103 +msgid "" +"This command will build your project based on the specifications in the " +"`pyproject.toml` file. Make sure to check for any errors or warnings " +"during the build process." +msgstr "" + +#: ../../tutorials/setup-py-to-pyproject-toml.md:105 +msgid "" +"**Test Existing Functionality**: After successfully building your project" +" with `pyproject.toml`, it's crucial to ensure that your project's " +"existing functionality remains intact. Run any pre-existing tests to " +"verify that everything still works as expected." +msgstr "" + From 9a4c4a112ab1f5a5995797e04f555fb7ccfb26d9 Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 18:25:20 +0900 Subject: [PATCH 51/65] Preparing the Translation Files for Japanese --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 4a0ea835..8ce321c4 100644 --- a/noxfile.py +++ b/noxfile.py @@ -43,7 +43,7 @@ ## Localization options (translations) # List of languages for which locales will be generated in (/locales/) -LANGUAGES = ["es"] +LANGUAGES = ["es", "jp"] # List of languages that should be built when releasing the guide (docs or docs-test sessions) RELEASE_LANGUAGES = [] From cd9004e222f02ee283d15c4b7dd8ca15db4170c9 Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 19:12:24 +0900 Subject: [PATCH 52/65] Following IETF language tag --- locales/{jp => ja}/LC_MESSAGES/CONTRIBUTING.po | 6 ++++-- locales/{jp => ja}/LC_MESSAGES/TRANSLATING.po | 6 ++++-- locales/{jp => ja}/LC_MESSAGES/documentation.po | 6 ++++-- locales/{jp => ja}/LC_MESSAGES/index.po | 6 ++++-- locales/{jp => ja}/LC_MESSAGES/package-structure-code.po | 6 ++++-- locales/{jp => ja}/LC_MESSAGES/tests.po | 6 ++++-- locales/{jp => ja}/LC_MESSAGES/tutorials.po | 6 ++++-- noxfile.py | 2 +- 8 files changed, 29 insertions(+), 15 deletions(-) rename locales/{jp => ja}/LC_MESSAGES/CONTRIBUTING.po (99%) rename locales/{jp => ja}/LC_MESSAGES/TRANSLATING.po (99%) rename locales/{jp => ja}/LC_MESSAGES/documentation.po (99%) rename locales/{jp => ja}/LC_MESSAGES/index.po (99%) rename locales/{jp => ja}/LC_MESSAGES/package-structure-code.po (99%) rename locales/{jp => ja}/LC_MESSAGES/tests.po (99%) rename locales/{jp => ja}/LC_MESSAGES/tutorials.po (99%) diff --git a/locales/jp/LC_MESSAGES/CONTRIBUTING.po b/locales/ja/LC_MESSAGES/CONTRIBUTING.po similarity index 99% rename from locales/jp/LC_MESSAGES/CONTRIBUTING.po rename to locales/ja/LC_MESSAGES/CONTRIBUTING.po index c30496e6..3c3eee6f 100644 --- a/locales/jp/LC_MESSAGES/CONTRIBUTING.po +++ b/locales/ja/LC_MESSAGES/CONTRIBUTING.po @@ -12,8 +12,9 @@ msgstr "" "POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language: jp\n" -"Language-Team: jp \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -432,3 +433,4 @@ msgstr "" #: ../../CONTRIBUTING.md:203 msgid "an example could be extracted from an existing toml file" msgstr "" + diff --git a/locales/jp/LC_MESSAGES/TRANSLATING.po b/locales/ja/LC_MESSAGES/TRANSLATING.po similarity index 99% rename from locales/jp/LC_MESSAGES/TRANSLATING.po rename to locales/ja/LC_MESSAGES/TRANSLATING.po index 08fd6165..707de067 100644 --- a/locales/jp/LC_MESSAGES/TRANSLATING.po +++ b/locales/ja/LC_MESSAGES/TRANSLATING.po @@ -12,8 +12,9 @@ msgstr "" "POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language: jp\n" -"Language-Team: jp \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -714,3 +715,4 @@ msgid "" " as a way for contributors to ask for help with translations or the " "translation workflow?" msgstr "" + diff --git a/locales/jp/LC_MESSAGES/documentation.po b/locales/ja/LC_MESSAGES/documentation.po similarity index 99% rename from locales/jp/LC_MESSAGES/documentation.po rename to locales/ja/LC_MESSAGES/documentation.po index 110015b6..8a849f4a 100644 --- a/locales/jp/LC_MESSAGES/documentation.po +++ b/locales/ja/LC_MESSAGES/documentation.po @@ -12,8 +12,9 @@ msgstr "" "POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language: jp\n" -"Language-Team: jp \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -2542,3 +2543,4 @@ msgstr "" #: ../../documentation/write-user-documentation/intro.md:15 msgid "sphinx gallery for tutorials." msgstr "" + diff --git a/locales/jp/LC_MESSAGES/index.po b/locales/ja/LC_MESSAGES/index.po similarity index 99% rename from locales/jp/LC_MESSAGES/index.po rename to locales/ja/LC_MESSAGES/index.po index 6a5d16e1..6d662248 100644 --- a/locales/jp/LC_MESSAGES/index.po +++ b/locales/ja/LC_MESSAGES/index.po @@ -12,8 +12,9 @@ msgstr "" "POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language: jp\n" -"Language-Team: jp \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -480,3 +481,4 @@ msgid "" " in the Python packaging ecosystem. We will be adding new content over " "the next year." msgstr "" + diff --git a/locales/jp/LC_MESSAGES/package-structure-code.po b/locales/ja/LC_MESSAGES/package-structure-code.po similarity index 99% rename from locales/jp/LC_MESSAGES/package-structure-code.po rename to locales/ja/LC_MESSAGES/package-structure-code.po index 5848b446..e409630c 100644 --- a/locales/jp/LC_MESSAGES/package-structure-code.po +++ b/locales/ja/LC_MESSAGES/package-structure-code.po @@ -12,8 +12,9 @@ msgstr "" "POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language: jp\n" -"Language-Team: jp \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -5298,3 +5299,4 @@ msgid "" "The version number is manually updated in a configuration file such as " "`pyproject.toml` vs. in a package **\\_version.py** file." msgstr "" + diff --git a/locales/jp/LC_MESSAGES/tests.po b/locales/ja/LC_MESSAGES/tests.po similarity index 99% rename from locales/jp/LC_MESSAGES/tests.po rename to locales/ja/LC_MESSAGES/tests.po index dfea8e3f..540e03ab 100644 --- a/locales/jp/LC_MESSAGES/tests.po +++ b/locales/ja/LC_MESSAGES/tests.po @@ -12,8 +12,9 @@ msgstr "" "POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language: jp\n" -"Language-Team: jp \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -999,3 +1000,4 @@ msgid "" "the user can easily understand why if failed (provides a useful error " "message)." msgstr "" + diff --git a/locales/jp/LC_MESSAGES/tutorials.po b/locales/ja/LC_MESSAGES/tutorials.po similarity index 99% rename from locales/jp/LC_MESSAGES/tutorials.po rename to locales/ja/LC_MESSAGES/tutorials.po index e162ef1e..6f88c534 100644 --- a/locales/jp/LC_MESSAGES/tutorials.po +++ b/locales/ja/LC_MESSAGES/tutorials.po @@ -12,8 +12,9 @@ msgstr "" "POT-Creation-Date: 2024-08-02 18:04+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" -"Language: jp\n" -"Language-Team: jp \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -5533,3 +5534,4 @@ msgid "" "existing functionality remains intact. Run any pre-existing tests to " "verify that everything still works as expected." msgstr "" + diff --git a/noxfile.py b/noxfile.py index 8ce321c4..ee44f29c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -43,7 +43,7 @@ ## Localization options (translations) # List of languages for which locales will be generated in (/locales/) -LANGUAGES = ["es", "jp"] +LANGUAGES = ["es", "ja"] # List of languages that should be built when releasing the guide (docs or docs-test sessions) RELEASE_LANGUAGES = [] From 0a1db30b2a06cfcf28a6ba6f2e7e5d5ccc07dd9b Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 19:15:04 +0900 Subject: [PATCH 53/65] Flags are not languages --- TRANSLATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATING.md b/TRANSLATING.md index 9481da77..6a2f168b 100644 --- a/TRANSLATING.md +++ b/TRANSLATING.md @@ -65,7 +65,7 @@ LANGUAGES = ["es", "fr"] ``` ```{note} -You can find a list of the two-letter ISO language codes [here](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes). +You can find a list of the two-letter IETF language tag [here](https://en.m.wikipedia.org/wiki/IETF_language_tag). ``` ## Preparing the Translation Files From b336a4ee910da4be8b53f40dce60e9b1b32b569d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 10:25:13 +0000 Subject: [PATCH 54/65] =?UTF-8?q?'[pre-commit.ci=20=F0=9F=A4=96]=20Apply?= =?UTF-8?q?=20code=20format=20tools=20to=20PR'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja/LC_MESSAGES/CONTRIBUTING.po | 1 - locales/ja/LC_MESSAGES/TRANSLATING.po | 1 - locales/ja/LC_MESSAGES/documentation.po | 1 - locales/ja/LC_MESSAGES/index.po | 1 - locales/ja/LC_MESSAGES/package-structure-code.po | 1 - locales/ja/LC_MESSAGES/tests.po | 1 - locales/ja/LC_MESSAGES/tutorials.po | 1 - 7 files changed, 7 deletions(-) diff --git a/locales/ja/LC_MESSAGES/CONTRIBUTING.po b/locales/ja/LC_MESSAGES/CONTRIBUTING.po index 3c3eee6f..16c831c9 100644 --- a/locales/ja/LC_MESSAGES/CONTRIBUTING.po +++ b/locales/ja/LC_MESSAGES/CONTRIBUTING.po @@ -433,4 +433,3 @@ msgstr "" #: ../../CONTRIBUTING.md:203 msgid "an example could be extracted from an existing toml file" msgstr "" - diff --git a/locales/ja/LC_MESSAGES/TRANSLATING.po b/locales/ja/LC_MESSAGES/TRANSLATING.po index 707de067..13765fc7 100644 --- a/locales/ja/LC_MESSAGES/TRANSLATING.po +++ b/locales/ja/LC_MESSAGES/TRANSLATING.po @@ -715,4 +715,3 @@ msgid "" " as a way for contributors to ask for help with translations or the " "translation workflow?" msgstr "" - diff --git a/locales/ja/LC_MESSAGES/documentation.po b/locales/ja/LC_MESSAGES/documentation.po index 8a849f4a..ea6bdd72 100644 --- a/locales/ja/LC_MESSAGES/documentation.po +++ b/locales/ja/LC_MESSAGES/documentation.po @@ -2543,4 +2543,3 @@ msgstr "" #: ../../documentation/write-user-documentation/intro.md:15 msgid "sphinx gallery for tutorials." msgstr "" - diff --git a/locales/ja/LC_MESSAGES/index.po b/locales/ja/LC_MESSAGES/index.po index 6d662248..379d9450 100644 --- a/locales/ja/LC_MESSAGES/index.po +++ b/locales/ja/LC_MESSAGES/index.po @@ -481,4 +481,3 @@ msgid "" " in the Python packaging ecosystem. We will be adding new content over " "the next year." msgstr "" - diff --git a/locales/ja/LC_MESSAGES/package-structure-code.po b/locales/ja/LC_MESSAGES/package-structure-code.po index e409630c..f02e7e1e 100644 --- a/locales/ja/LC_MESSAGES/package-structure-code.po +++ b/locales/ja/LC_MESSAGES/package-structure-code.po @@ -5299,4 +5299,3 @@ msgid "" "The version number is manually updated in a configuration file such as " "`pyproject.toml` vs. in a package **\\_version.py** file." msgstr "" - diff --git a/locales/ja/LC_MESSAGES/tests.po b/locales/ja/LC_MESSAGES/tests.po index 540e03ab..1b5994c6 100644 --- a/locales/ja/LC_MESSAGES/tests.po +++ b/locales/ja/LC_MESSAGES/tests.po @@ -1000,4 +1000,3 @@ msgid "" "the user can easily understand why if failed (provides a useful error " "message)." msgstr "" - diff --git a/locales/ja/LC_MESSAGES/tutorials.po b/locales/ja/LC_MESSAGES/tutorials.po index 6f88c534..7eb0df48 100644 --- a/locales/ja/LC_MESSAGES/tutorials.po +++ b/locales/ja/LC_MESSAGES/tutorials.po @@ -5534,4 +5534,3 @@ msgid "" "existing functionality remains intact. Run any pre-existing tests to " "verify that everything still works as expected." msgstr "" - From 546aded14f2a861a5e9d3465686aeea2a309eaab Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 19:28:59 +0900 Subject: [PATCH 55/65] Apply suggestions from code review --- TRANSLATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATING.md b/TRANSLATING.md index 6a2f168b..b18a374f 100644 --- a/TRANSLATING.md +++ b/TRANSLATING.md @@ -65,7 +65,7 @@ LANGUAGES = ["es", "fr"] ``` ```{note} -You can find a list of the two-letter IETF language tag [here](https://en.m.wikipedia.org/wiki/IETF_language_tag). +You can find a list of the two-letter IETF language tag [here](https://en.wikipedia.org/wiki/IETF_language_tag). ``` ## Preparing the Translation Files From 156e2fdd029c01ed317e2856f22f4c0f11e1ef3a Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 19:44:36 +0900 Subject: [PATCH 56/65] Apply suggestions from code review --- TRANSLATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATING.md b/TRANSLATING.md index b18a374f..ea5f37f4 100644 --- a/TRANSLATING.md +++ b/TRANSLATING.md @@ -65,7 +65,7 @@ LANGUAGES = ["es", "fr"] ``` ```{note} -You can find a list of the two-letter IETF language tag [here](https://en.wikipedia.org/wiki/IETF_language_tag). +You can find a list of the two-letter sphinx language option [here](https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language). ``` ## Preparing the Translation Files From fd4a0b6995b5a231208fd47e2a84b385663aec65 Mon Sep 17 00:00:00 2001 From: Tetsuo Koyama Date: Fri, 2 Aug 2024 19:45:41 +0900 Subject: [PATCH 57/65] Apply suggestions from code review --- TRANSLATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATING.md b/TRANSLATING.md index ea5f37f4..9fb5e5b2 100644 --- a/TRANSLATING.md +++ b/TRANSLATING.md @@ -65,7 +65,7 @@ LANGUAGES = ["es", "fr"] ``` ```{note} -You can find a list of the two-letter sphinx language option [here](https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language). +You can find a list of the two-letter Sphinx language option [here](https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language). ``` ## Preparing the Translation Files From 6e2377168e5110d936b8754f6153d2e857bd1c60 Mon Sep 17 00:00:00 2001 From: Revathy Venugopal <104772255+Revathyvenugopal162@users.noreply.github.com> Date: Mon, 5 Aug 2024 17:04:40 +0200 Subject: [PATCH 58/65] fix: Rename pull-requests-tab.PNG to pull-requests-tab.png --- ...{pull-requests-tab.PNG => pull-requests-tab.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename images/contributing/{pull-requests-tab.PNG => pull-requests-tab.png} (100%) diff --git a/images/contributing/pull-requests-tab.PNG b/images/contributing/pull-requests-tab.png similarity index 100% rename from images/contributing/pull-requests-tab.PNG rename to images/contributing/pull-requests-tab.png From b8fd0276be4e1526c3f14f5869cc7a845c9f9ea9 Mon Sep 17 00:00:00 2001 From: Carol Willing Date: Mon, 5 Aug 2024 10:49:35 -0700 Subject: [PATCH 59/65] Fix link for tox in run-tests.md which plasmapy no longer offers --- tests/run-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run-tests.md b/tests/run-tests.md index 036caa46..6adb5925 100644 --- a/tests/run-tests.md +++ b/tests/run-tests.md @@ -122,7 +122,7 @@ We will focus on [Nox](https://nox.thea.codes/) in this guide. `nox` is a Python ```{admonition} Other automation tools you'll see in the wild :class: note -- **[Tox](https://tox.wiki/en/latest/index.html#useful-links)** is an automation tool that supports common steps such as building documentation, running tests across various versions of Python, and more. You can find [a nice overview of tox in the plasmaPy documentation](https://docs.plasmapy.org/en/stable/contributing/testing_guide.html#using-tox). +- **[Tox](https://tox.wiki/en/latest/index.html#useful-links)** is an automation tool that supports common steps such as building documentation, running tests across various versions of Python, and more. - **[Hatch](https://github.com/ofek/hatch)** is a modern end-to-end packaging tool that works with the popular build backend called hatchling. `hatch` offers a `tox`-like setup where you can run tests locally using different Python versions. If you are using `hatch` to support your packaging workflow, you may want to also use its testing capabilities rather than using `nox`. From 3969c9333dd1fd461c8d8ddf4443fff471273c1e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:31:22 -0600 Subject: [PATCH 60/65] docs: add tkoyama010 as a contributor for code, and review (#357) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ README.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 23c7719a..12c7eaae 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -749,6 +749,16 @@ "code", "review" ] + }, + { + "login": "tkoyama010", + "name": "Tetsuo Koyama", + "avatar_url": "https://avatars.githubusercontent.com/u/7513610?v=4", + "profile": "https://github.com/tkoyama010", + "contributions": [ + "code", + "review" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 9cfb2dda..adc8f6f7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pyOpenSci scientific Python Packaging Guide -[![All Contributors](https://img.shields.io/badge/all_contributors-73-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-74-orange.svg?style=flat-square)](#contributors-) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/pyopensci/python-package-guide?color=purple&display_name=tag&style=plastic) @@ -168,6 +168,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Naty Clementi
    Naty Clementi

    💻 👀 John Drake
    John Drake

    💻 👀 Revathy Venugopal
    Revathy Venugopal

    💻 👀 + Tetsuo Koyama
    Tetsuo Koyama

    💻 👀 From 40db447ea832eae913cda15357aa96437601c06d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:37:18 -0600 Subject: [PATCH 61/65] [pre-commit.ci] pre-commit autoupdate (#355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/errata-ai/vale: v3.6.0 → v3.7.0](https://github.com/errata-ai/vale/compare/v3.6.0...v3.7.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Carol Willing --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 50974219..de0e2e73 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: )$ - repo: https://github.com/errata-ai/vale - rev: v3.6.0 + rev: v3.7.0 hooks: - id: vale From 4c4db75c9efc9a02a1b612afc561b90f9dafa552 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 02:18:56 +0000 Subject: [PATCH 62/65] docs: update README.md [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index adc8f6f7..57c2f4dd 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Cheng H. Lee
    Cheng H. Lee

    💻 👀 Vaunty
    Vaunty

    💻 👀 Zack Weinberg
    Zack Weinberg

    👀 - Felipe Moreno
    Felipe Moreno

    👀 💻 + Felipe Moreno
    Felipe Moreno

    👀 💻 🌍 Sneha Yadav
    Sneha Yadav

    💻 👀 Stefano Rivera
    Stefano Rivera

    👀 Stefanie Molin
    Stefanie Molin

    💻 👀 From 8332bf7528b659e5be51010eea44dda6803409ec Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 02:18:57 +0000 Subject: [PATCH 63/65] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 12c7eaae..ca755e44 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -620,7 +620,8 @@ "profile": "http://flpm.dev", "contributions": [ "review", - "code" + "code", + "translation" ] }, { From dd02916c8c88b02bd123cfd513cb9cb6bd4a5dc6 Mon Sep 17 00:00:00 2001 From: Felipe Moreno Date: Sat, 10 Aug 2024 19:21:30 +0200 Subject: [PATCH 64/65] Apply suggestions from code review Co-authored-by: Roberto Pastor Muela <37798125+RobPasMue@users.noreply.github.com> --- locales/es/LC_MESSAGES/documentation.po | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 8b5a3f47..0d7dbca9 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -221,7 +221,7 @@ msgid "" "Allows you to turn on integration with pull requests where you can view " "documentation build progress (success vs failure)." msgstr "" -"Te permite usar integractión con pull requests para ver el progreso del build " +"Te permite integrar solicitudes de cambio para ver el progreso de construcción " "de la documentación (éxito vs error)" #: ../../documentation/hosting-tools/publish-documentation-online.md:19 @@ -231,8 +231,7 @@ msgid "" "your package." msgstr "" "Permite versionar tu documentación, lo que permite a los usuarios acceder a " -"versiones antiguas etiquetadas del docs si están utilizando versiones " -"antiguas de tu paquete." +"versiones antiguas de la documentación en caso de que las estén usando en su paquete. " #: ../../documentation/hosting-tools/publish-documentation-online.md:20 msgid "Supports downloading of documentation in PDF and other formats." @@ -259,10 +258,10 @@ msgid "" "GitHub repository that is setup to run the GitHub Pages web build." msgstr "" "[GitHub Pages](https://docs.github.com/en/pages/getting-started-with-" -"github-pages/about-github-pages) es un servicio de web hosting gratis " +"github-pages/about-github-pages) es un servicio web gratuito " "de GitHub. Con GitHub Pages, puedes construir tu documentación localmente " -"o utilizando Continuous Integration, y push a un branch en tu repositorio " -"de GitHub que está configurado ejecutar web build de GitHub Pages." +"o utilizando Continuous Integration, y empujar a una rama de tu repositorio " +"de GitHub que esté configurada para construir la web en GitHub Pages." #: ../../documentation/hosting-tools/publish-documentation-online.md:33 msgid "Read the Docs vs GitHub Pages" @@ -369,7 +368,7 @@ msgstr "" "generator/). Un generador de sitios estáticos es una herramienta que crea " "HTML para un sitio web basado en plantillas. Los archivos HTML " "se sirven \"estáticamente\", lo que significa que no hay generación ni modificación " -"de lo archivos instantánea." +"de los archivos en línea." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:39 msgid "Sphinx is written using Python." From b6de69953d93612f7b4eaa6c9a021598956d9501 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 10 Aug 2024 17:28:23 +0000 Subject: [PATCH 65/65] =?UTF-8?q?'[pre-commit.ci=20=F0=9F=A4=96]=20Apply?= =?UTF-8?q?=20code=20format=20tools=20to=20PR'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/es/LC_MESSAGES/documentation.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locales/es/LC_MESSAGES/documentation.po b/locales/es/LC_MESSAGES/documentation.po index 0d7dbca9..978a48ad 100644 --- a/locales/es/LC_MESSAGES/documentation.po +++ b/locales/es/LC_MESSAGES/documentation.po @@ -34,7 +34,7 @@ msgstr "" "Sphinx es la herramienta más común para construir documentación en el " "ecosistema de Python. Sin embargo, algunos mantenedores están usando " "herramientas como [mkdocs](https://www.mkdocs.org/) para generar la documentación. ¡Es tu " -"decisión usar la herramienta que prefieras para tu documentación!" +"decisión usar la herramienta que prefieras para tu documentación!" #: ../../documentation/hosting-tools/intro.md:8 msgid "" @@ -42,7 +42,7 @@ msgid "" "documentation. We talk about various syntax options that you can use when" " writing Sphinx documentation including mySt and rST." msgstr "" -"En esta sección introducimos Sphinx como herramienta para construir " +"En esta sección introducimos Sphinx como herramienta para construir " "documentación. Hablamos sobre varias opciones de sintaxis que puedes usar " "para escribir documentación de Sphinx incluyendo myST and rST." @@ -53,7 +53,7 @@ msgid "" msgstr "" "Hablamos también sobre methodos para publicar tu documentación en línea " "y herramientas de Sphinx que pueda ayudarte optimizar tu sitio web para " -"documentación." +"documentación." #: ../../documentation/hosting-tools/myst-markdown-rst-doc-syntax.md:1 msgid "Documentation syntax: markdown vs. myST vs. rst syntax to create your docs" @@ -231,7 +231,7 @@ msgid "" "your package." msgstr "" "Permite versionar tu documentación, lo que permite a los usuarios acceder a " -"versiones antiguas de la documentación en caso de que las estén usando en su paquete. " +"versiones antiguas de la documentación en caso de que las estén usando en su paquete. " #: ../../documentation/hosting-tools/publish-documentation-online.md:20 msgid "Supports downloading of documentation in PDF and other formats." @@ -315,7 +315,7 @@ msgstr "" "ecosistema de empaquetado de Python." #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:25 msgid "Examples of documentation websites that we love:" -msgstr "Ejemplos de sitios del web de documentación que nos gustan:" +msgstr "Ejemplos de sitios del web de documentación que nos gustan:" #: ../../documentation/hosting-tools/sphinx-python-package-documentation-tools.md:27 msgid "[GeoPandas](https://geopandas.org/en/stable/)"