diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..98751adf3 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,6 @@ +/src/basics/ @shorodilov @Bandydan @Jules57 +/src/vcs/ @shorodilov @Bandydan +/src/rdbms/ @shorodilov @Bandydan +/src/oop/ @shorodilov +/src/django/ @PonomaryovVladyslav @shorodilov +/src/deploy/ @PonomaryovVladyslav @shorodilov diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..85c89ea42 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,77 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our +project and our community a harassment-free experience for everyone, +regardless of age, body size, disability, ethnicity, gender identity and +expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual + attention or advances +- Trolling, insulting/derogatory comments, and personal or political + attacks +- Public or private harassment +- Publishing others' private information, such as a physical or + electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in + a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of +acceptable behavior and are expected to take appropriate and fair +corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, +or reject comments, commits, code, wiki edits, issues, and other +contributions that are not aligned to this Code of Conduct, or to ban +temporarily or permanently any contributor for other behaviors that they +deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public +spaces when an individual is representing the project or its community. +Examples of representing a project or community include using an +official project e-mail address, posting via an official social media +account, or acting as an appointed representative at an online or +offline event. Representation of a project may be further defined and +clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may +be reported by contacting the project team at {{ email }}. All +complaints will be reviewed and investigated and will result in a +response that is deemed necessary and appropriate to the circumstances. +The project team is obligated to maintain confidentiality with regard to +the reporter of an incident. Further details of specific enforcement +policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in +good faith may face temporary or permanent repercussions as determined +by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor +Covenant](https://www.contributor-covenant.org), version 1.4, available +at + diff --git a/.github/CODE_OF_CONDUCT.rst b/.github/CODE_OF_CONDUCT.rst new file mode 100644 index 000000000..09a3169df --- /dev/null +++ b/.github/CODE_OF_CONDUCT.rst @@ -0,0 +1,84 @@ +Contributor Covenant Code of Conduct +==================================== + +Our Pledge +---------- + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our +project and our community a harassment-free experience for everyone, +regardless of age, body size, disability, ethnicity, gender identity and +expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +Our Standards +------------- + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual + attention or advances +- Trolling, insulting/derogatory comments, and personal or political + attacks +- Public or private harassment +- Publishing others’ private information, such as a physical or + electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +Our Responsibilities +-------------------- + +Project maintainers are responsible for clarifying the standards of +acceptable behavior and are expected to take appropriate and fair +corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, +or reject comments, commits, code, wiki edits, issues, and other +contributions that are not aligned to this Code of Conduct, or to ban +temporarily or permanently any contributor for other behaviors that they +deem inappropriate, threatening, offensive, or harmful. + +Scope +----- + +This Code of Conduct applies both within project spaces and in public +spaces when an individual is representing the project or its community. +Examples of representing a project or community include using an +official project e-mail address, posting via an official social media +account, or acting as an appointed representative at an online or +offline event. Representation of a project may be further defined and +clarified by project maintainers. + +Enforcement +----------- + +Instances of abusive, harassing, or otherwise unacceptable behavior may +be reported by contacting the project team at {{ email }}. All +complaints will be reviewed and investigated and will result in a +response that is deemed necessary and appropriate to the circumstances. +The project team is obligated to maintain confidentiality with regard to +the reporter of an incident. Further details of specific enforcement +policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in +good faith may face temporary or permanent repercussions as determined +by other members of the project’s leadership. + +Attribution +----------- + +This Code of Conduct is adapted from the `Contributor +Covenant `__, version 1.4, +available at +https://www.contributor-covenant.org/version/1/4/code-of-conduct.html diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 000000000..e225529f0 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,233 @@ +# CONTRIBUTING GUIDES + +Welcome and thank you for considering contributing to our project! Here +we have an ecosystem of documentation tools, what helps us to deliver +valuable knowledge about Python programming language to the public. + +Collaborating with us means delving into this, which this guide will +help you navigate. From the intricacies of Sphinx to the fluidity of +Mermaid diagrams, we aim to provide you with all the insights you need. + +Let\'s dive in! + +## Documentation tools + +[Sphinx](https://www.sphinx-doc.org/) makes it easy to create +intelligent and beautiful documentation. This is the main documentation +generator used on this project. There are also some 3rd-party +dependencies, like `sphinxcontrib-mermaid` or `MyST markdown` installed, +that makes it possible to use some extended syntax. Just install all +project dependencies (including development). + +``` shell +poetry install --with dev +``` + +**requirements.txt** file does not split general and development deps, +just do: + +``` shell +pip install -r requirements.txt +``` + +### Other useful tools + +We found [poedit](https://poedit.net/) software very useful for working +with translations. It can be used for documents automatic translation, +storing translation memories, proofreading etc. + +## Repository structure + + / + |-- assets/ + |-- src/ + |-- index.txt + |---- index.txt + |---- / + +**assets** directory contains various static content for the +documentation, like CSS, images etc. + +**src** directory is the main documentation source, and it\'s considered +to be a *content-root*. It means you may refer this directory as `/` for +the Sphinx documentation builder. + +The **src/index.txt** is the master document. It combines all the +content together. All topics are described in their own \"topic\" +directories, each with its own *index.txt*. Topic index file is the +`TOC (Table of Content)`{.interpreted-text role="abbr"} for the topic, +and it should be added to the master TOC. + +### Submodules + +There are two major approaches in the code base organization: monorepo +and multirepo. + +This repository uses **hybrid poly-as-mono** approach. It includes +several other repositories as its submodules to glue the content from +different repos together. + +Make sure submodules are pulled from the `devel` branch. + +## Documentation markup syntax + +The documentation build system supports: + +- [reStructuredText](https://docutils.sourceforge.io/rst.html) +- [MarkDown](https://daringfireball.net/projects/markdown/) +- [mermaid](https://mermaid.js.org/) + +The main documentation syntax is \"reST\", since it provides more +flexibility while working with docs. + +### reStructuredText syntax + +#### Headings + +Here we use structure \"part \> chapter \> section \> subsection\". + + #### + Part + #### + + ******* + Chapter + ******* + + Section + ======= + + Subsection + ---------- + +All of these above will be added to +`TOC (Table of Content)`{.interpreted-text role="abbr"}. In case you +want to avoid this use `rubric` directive to mark a heading without +adding it to the TOC. + + .. rubric:: Rubric heading + + And the content goes here. + +#### Mermaid diagrams + +The build system supports `mermaid` syntax via `.. mermaid::` directive. +This is done using +[sphinxcontrib-mermaid](https://pypi.org/project/sphinxcontrib-mermaid/) +extension. + +There are two main approaches to include mermaid diagrams to the +documentation: + +- integrate a file containing the diagram + + .. mermaid:: /../assets/mermaid// + +- integrate the mermaid block itself + + .. mermaid:: + + flowchart LR + id + +### MarkDown + +MarkDown is not the main markup language, but it is supported as well. + +#### Headings + +Just place a hash symbol before the heading. The number of hashes +controls the heading\'s level. + + # Part + ## Chapter + ### Section + #### Subsection + +#### Mermaid diagrams + +Mermaid support for MarkDown source is limited with just including +mermaid blocks: + + ```mermaid + flowchart LR + id + ``` + +## Branching + +### Branches explanation + +This repo comes with two main branches: `master` and `devel`. `master` +branch contains some stable releases of the documentation, while `devel` +aggregates works for the future releases. + +### Working with topic branch(es) + +We use GitFlow approach on this project. This means you would not commit +to `master` or `devel` branches directly. Instead you are to create a +topic branch to work with. + +For example, if you want to describe \"Django middleware\", you will +create a new branch `[topic/|feature/]django-middleware`, and you will +commit all your work to this branch. + +Once you consider the work is done - just open a pull request from your +topic branch to `devel`. + +## Working with documents + +Do not make changes in **src** directory directly, except changes to +\"conf.py\" and \"index.txt\" files. Keep your documents in dedicated +topic directories instead. This project has some predefined topics +already, so you can work inside of an existing topic directory. + +### How to add new document(s) + +Locate the corresponding topic and create a new text file. Use `.txt` +extension for the reStructuredText documents, and `.md` for the Markdown +markup. Keep filename meaningful. + +To attach the newly created document to the documentation builds, just +add its name to the `toctree` directive content in the **index.txt** +file within the appropriate topic directory. Do not add file extension +while adding file to the `toctree`. + +In rare cases, when the new document should not be a part of any +toctree, you are to `:orphan:` mark at its begging. + +### How to add new topic(s) + +Most of the topics are already present in the documents root. However, +in case of need to add a new topic - you are to create a new directory +inside of *src* folder. Create a file called `index.txt` within a new +directory, and add it to the master doc (toctree): **src/index.txt**. + +### How to translate + +There is a target defined in Makefile to build and/or update +translations called `locales`. To gather newly added or updated strings +and prepare portable object files, do: + +``` shell +make locales +``` + +This will create/update po files in *src/\_locales* directory. Navigate +to the file and perform translations. + +Original strings are marked as `msgid`, and the translated versions are +marked as `msgstr`. + +Using software like [poedit](https://poedit.net/) can make the +translation process more efficient. + +In case, you don\'t have cmake/make installed on your computer, you may +use the full commands to gather the text, and prepare po file: + +``` shell +sphinx-build -b gettext src _build/gettext +sphinx-intl -c src/conf.py update -p _build/gettext +``` + +Actually, `make locales` is the shortcut to the same set of commands. diff --git a/.github/CONTRIBUTING.rst b/.github/CONTRIBUTING.rst new file mode 100644 index 000000000..66323e278 --- /dev/null +++ b/.github/CONTRIBUTING.rst @@ -0,0 +1,268 @@ +.. _Sphinx: https://www.sphinx-doc.org/ +.. _sphinxcontrib-mermaid: https://pypi.org/project/sphinxcontrib-mermaid/ +.. _poedit: https://poedit.net/ + +############################################################################### + CONTRIBUTING GUIDES +############################################################################### + +Welcome and thank you for considering contributing to our project! Here we have +an ecosystem of documentation tools, what helps us to deliver valuable +knowledge about Python programming language to the public. + +Collaborating with us means delving into this, which this guide will help you +navigate. From the intricacies of Sphinx to the fluidity of Mermaid diagrams, +we aim to provide you with all the insights you need. + +Let's dive in! + +******************* +Documentation tools +******************* + +`Sphinx`_ makes it easy to create intelligent and beautiful documentation. +This is the main documentation generator used on this project. There are also +some 3rd-party dependencies, like ``sphinxcontrib-mermaid`` or +``MyST markdown`` installed, that makes it possible to use some extended +syntax. Just install all project dependencies (including development). + +.. code-block:: shell + + poetry install --with dev + +**requirements.txt** file does not split general and development deps, just do: + +.. code-block:: shell + + pip install -r requirements.txt + +Other useful tools +================== + +We found `poedit`_ software very useful for working with translations. +It can be used for documents automatic translation, storing translation +memories, proofreading etc. + +******************** +Repository structure +******************** + +:: + + / + |-- assets/ + |-- src/ + |-- index.txt + |---- index.txt + |---- / + +**assets** directory contains various static content for the documentation, +like CSS, images etc. + +**src** directory is the main documentation source, and it's considered to be +a *content-root*. It means you may refer this directory as ``/`` for the Sphinx +documentation builder. + +The **src/index.txt** is the master document. It combines all the content +together. All topics are described in their own "topic" directories, each with +its own *index.txt*. Topic index file is the :abbr:`TOC (Table of Content)` for +the topic, and it should be added to the master TOC. + +Submodules +========== + +There are two major approaches in the code base organization: monorepo and +multirepo. + +This repository uses **hybrid poly-as-mono** approach. It includes several +other repositories as its submodules to glue the content from different repos +together. + +Make sure submodules are pulled from the ``devel`` branch. + +*************************** +Documentation markup syntax +*************************** + +The documentation build system supports: + +- `reStructuredText `_ +- `MarkDown `_ +- `mermaid `_ + +The main documentation syntax is "reST", since it provides more flexibility +while working with docs. + +reStructuredText syntax +======================= + +Headings +-------- + +Here we use structure "part > chapter > section > subsection". + +:: + + #### + Part + #### + + ******* + Chapter + ******* + + Section + ======= + + Subsection + ---------- + +All of these above will be added to :abbr:`TOC (Table of Content)`. +In case you want to avoid this use ``rubric`` directive to mark a heading +without adding it to the TOC. + +:: + + .. rubric:: Rubric heading + + And the content goes here. + +Mermaid diagrams +---------------- + +The build system supports ``mermaid`` syntax via ``.. mermaid::`` directive. +This is done using `sphinxcontrib-mermaid`_ extension. + +There are two main approaches to include mermaid diagrams to the documentation: + +- integrate a file containing the diagram + + :: + + .. mermaid:: /../assets/mermaid// + +- integrate the mermaid block itself + + :: + + .. mermaid:: + + flowchart LR + id + +MarkDown +======== + +MarkDown is not the main markup language, but it is supported as well. + +Headings +-------- + +Just place a hash symbol before the heading. The number of hashes controls +the heading's level. + +:: + + # Part + ## Chapter + ### Section + #### Subsection + +Mermaid diagrams +---------------- + +Mermaid support for MarkDown source is limited with just including mermaid +blocks: + +:: + + ```mermaid + flowchart LR + id + ``` + +********* +Branching +********* + +Branches explanation +==================== + +This repo comes with two main branches: ``master`` and ``devel``. +``master`` branch contains some stable releases of the documentation, while +``devel`` aggregates works for the future releases. + +Working with topic branch(es) +============================= + +We use GitFlow approach on this project. This means you would not commit to +``master`` or ``devel`` branches directly. Instead you are to create a topic +branch to work with. + +For example, if you want to describe "Django middleware", you will create +a new branch ``[topic/|feature/]django-middleware``, and you will commit all +your work to this branch. + +Once you consider the work is done - just open a pull request from your topic +branch to ``devel``. + +********************** +Working with documents +********************** + +Do not make changes in **src** directory directly, except changes to "conf.py" +and "index.txt" files. Keep your documents in dedicated topic directories +instead. This project has some predefined topics already, so you can work +inside of an existing topic directory. + +How to add new document(s) +========================== + +Locate the corresponding topic and create a new text file. +Use ``.txt`` extension for the reStructuredText documents, and ``.md`` for +the Markdown markup. Keep filename meaningful. + +To attach the newly created document to the documentation builds, just add +its name to the ``toctree`` directive content in the **index.txt** file +within the appropriate topic directory. Do not add file extension while adding +file to the ``toctree``. + +In rare cases, when the new document should not be a part of any toctree, you +are to ``:orphan:`` mark at its begging. + +How to add new topic(s) +======================= + +Most of the topics are already present in the documents root. However, in case +of need to add a new topic - you are to create a new directory inside of *src* +folder. Create a file called ``index.txt`` within a new directory, and add it +to the master doc (toctree): **src/index.txt**. + +How to translate +================ + +There is a target defined in Makefile to build and/or update translations +called ``locales``. To gather newly added or updated strings and prepare +portable object files, do: + +.. code-block:: shell + + make locales + +This will create/update po files in *src/_locales* directory. Navigate to +the file and perform translations. + +Original strings are marked as ``msgid``, and the translated versions are +marked as ``msgstr``. + +Using software like `poedit`_ can make the translation process more efficient. + +In case, you don't have cmake/make installed on your computer, you may use +the full commands to gather the text, and prepare po file: + +.. code-block:: shell + + sphinx-build -b gettext src _build/gettext + sphinx-intl -c src/conf.py update -p _build/gettext + +Actually, ``make locales`` is the shortcut to the same set of commands. diff --git a/.github/workflows/deploy_pages.yml b/.github/workflows/deploy_pages.yml new file mode 100644 index 000000000..73eee7ee3 --- /dev/null +++ b/.github/workflows/deploy_pages.yml @@ -0,0 +1,67 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch +# push: +# branches: +# - devel + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + + - name: Set up Python + uses: actions/setup-python@v4 + + - name: Set up NodeJS + uses: actions/setup-node@v4 + + - name: Install dependencies + run: | + pip install -r requirements.txt + npm install + + - name: Build documents + run: | + LANGUAGE=en make html + LANGUAGE=uk make html + npm run build + + - name: Setup Pages + uses: actions/configure-pages@v2 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + # Upload entire repository + path: "." + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.github/workflows/test_build.yml b/.github/workflows/test_build.yml new file mode 100644 index 000000000..59efeb7eb --- /dev/null +++ b/.github/workflows/test_build.yml @@ -0,0 +1,63 @@ +name: Check Sphinx Builds + +on: + # Runs on pushes targeting the default branch and changes in the Sphinx-related files + pull_request: + branches: + - devel + paths: + - "src/**/*" + - "src/conf.py" + - "Makefile" + - "requirements.txt" + +jobs: + build-docs: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ ubuntu-latest, macos-latest, windows-latest ] + python-version: [ "3.9", "3.10", "3.11", "3.12" ] + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + pip install -r requirements.txt + + - name: Build documents + run: | + LANGUAGE=en make html + LANGUAGE=uk make html + + build-pres: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ ubuntu-latest, macos-latest, windows-latest ] + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + + - name: Set up NodeJS + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Install dependencies + run: npm install + + - name: Build presentations + run: npm run build diff --git a/.gitignore b/.gitignore index 744eb8cad..18a74fbf5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,33 @@ +# virtual environemt +/.venv/ +/.env/ +/venv/ +/env/ + +# python byte-compiled +__pycache__ + +# node packages +/node_modules/ + +# ide configs +/.vscode/ /.idea/ -.vscode + +# emacs cache and backup files +\#* +*~ + +# temporary files storage +/temp/ +/tmp/ + +# documentation builds +_builds/ +_build/ +builds/ +build/ + +# translation object files +*.pot +*.mo diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..d9c4a24cb --- /dev/null +++ b/.gitmodules @@ -0,0 +1,18 @@ +[submodule "problem-sets"] + path = problem-sets + url = git@github.com:edu-python-course/problem-sets +[submodule "blog-spec"] + path = src/spec/blog + url = git@github.com:edu-python-course/blog-spec +[submodule "libms-db"] + path = libms-db + url = git@github.com:edu-python-course/libms-db +[submodule "libms-spec"] + path = src/spec/libms + url = git@github.com:edu-python-course/libms-spec +[submodule "giver-spec"] + path = src/spec/giver + url = git@github.com:edu-python-course/giver-spec +[submodule "impress.js"] + path = assets/impress.js + url = https://github.com/impress/impress.js diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..efdbef95a --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# Python training course makefile for builds automation + +# Sphinx settings +SPHINX_SRC = src +SPHINX_CONFIG = $(SPHINX_SRC)/conf.py + +# Internationalization +SPHINXINTL_LANGUAGE ?= uk +LANGUAGE ?= en + +# Sphinx build directories +_SPHINX_OUT_BASE = _build +GETTEXT_DIR = $(_SPHINX_OUT_BASE)/gettext +LATEX_DIR = $(_SPHINX_OUT_BASE)/latex/$(LANGUAGE) +HTML_DIR = $(_SPHINX_OUT_BASE)/html/$(LANGUAGE) + +# Sphinx builders +SPHINX_BUILD = sphinx-build -q -D language=$(LANGUAGE) + +# Makefile targets +all : clean + @make LANGUAGE=en html + @make LANGUAGE=uk html + +clean : + @echo "Cleaning existing builds at $(_SPHINX_OUT_BASE)" + @rm -rf $(_SPHINX_OUT_BASE) + +html : + @echo "LANGUAGE=$(LANGUAGE): generating HTML output at $(HTML_DIR)" + @$(SPHINX_BUILD) -b html $(SPHINX_SRC) $(HTML_DIR) + +latex : + @echo "LANGUAGE=$(LANGUAGE): generating LaTeX output at $(LATEX_DIR)" + @$(SPHINX_BUILD) -b latex $(SPHINX_SRC) $(LATEX_DIR) + +pdf : latex + @make -C "$(LATEX_DIR)" + +gettext : + @$(SPHINX_BUILD) -b gettext $(SPHINX_SRC) $(GETTEXT_DIR) + +locales : gettext + @sphinx-intl -c $(SPHINX_CONFIG) update -p $(GETTEXT_DIR) diff --git a/README.rst b/README.rst new file mode 100644 index 000000000..a9e2ae98d --- /dev/null +++ b/README.rst @@ -0,0 +1,103 @@ +############################################################################### + PYTHON TRAINING COURSE +############################################################################### + +This is the training course to master the Python programming language. This +includes the very basics programming topics like data types, variables and +object-oriented programming and advanced topics like multithreading and +web-frameworks for Python. + +Getting started +=============== + +Getting the sources +------------------- + +Current repository is dependent on some other repos (is **multi-repo**). +You may clone it, but this would not download the source of other repos. +To get the full content, do: + +.. code-block:: shell + + git clone [local_repository] + # cd into cloned repo and switch to devel branch + git switch devel + # clone submodules content + git submodule update --init --recursive + +Installing dependencies +----------------------- + +This project comes with dependencies listed in formats suitable for `pip`_ +and `poetry`_ package managers. It's recommended to use virtual environment +while working with this project. + +To install dependencies via pip do: + +.. code-block:: + + pip install -r requirements.txt + +To do the same using poetry: + +.. code-block:: + + poetry install + +.. _pip: https://pip.pypa.io +.. _poetry: https://python-poetry.org + +Building documentation +====================== + +This repository comes with *Makefile*. For now this is the easiest way to do +anything within this source code. There are several targets defined: + +- ``clean`` will clean up the documentation builds +- ``html`` will create HTML pages +- ``locales`` will create/update translations + +Just do: + +.. code-block:: shell + + make # e.g. make html + +By default all builds are done for english locale. +Define ``LANGUAGE`` environment variable to build documents for other locales. + +.. code-block:: shell + + LANGUAGE=uk make html + +Using ``make`` without arguments (targets) will clean up documentation and +build HTML pages for *en* and *uk* locales. + +.. code-block:: shell + + make + +This command is equal to: + +.. code-block:: shell + + make clean + LANGUAGE=en make html + LANGUAGE=uk make html + +Building without make +--------------------- + +``make`` just automates the build process, however in case you don't have it +installed, you can run builds manually: + +.. code-block:: shell + + sphinx-build -b html -D language=en src _build/html/en + sphinx-build -b html -D language=uk src _build/html/uk + +Contributing to the project +=========================== + +This is an open-source project, so anyone is welcome to contribute to it. +Please see `contributing guide <./.github/CONTRIBUTING.rst>`_ for more details. diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 000000000..26727d476 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/icons/check-mark-svgrepo-com.svg b/assets/icons/check-mark-svgrepo-com.svg new file mode 100644 index 000000000..a0c183ef7 --- /dev/null +++ b/assets/icons/check-mark-svgrepo-com.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/cross-mark-svgrepo-com.svg b/assets/icons/cross-mark-svgrepo-com.svg new file mode 100644 index 000000000..3143825c7 --- /dev/null +++ b/assets/icons/cross-mark-svgrepo-com.svg @@ -0,0 +1,37 @@ + + + + \ No newline at end of file diff --git a/assets/icons/moon-svgrepo-com.svg b/assets/icons/moon-svgrepo-com.svg new file mode 100644 index 000000000..af27a3ec1 --- /dev/null +++ b/assets/icons/moon-svgrepo-com.svg @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/assets/icons/sun-svgrepo-com.svg b/assets/icons/sun-svgrepo-com.svg new file mode 100644 index 000000000..a744c8f8e --- /dev/null +++ b/assets/icons/sun-svgrepo-com.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + diff --git a/assets/img/aggregate-function.svg b/assets/img/aggregate-function.svg new file mode 100644 index 000000000..2fc73e3b1 --- /dev/null +++ b/assets/img/aggregate-function.svg @@ -0,0 +1,554 @@ + + + + + Aggregate functions + + + + + + + aggregate-func + + + + ( + + + + + + DISTINCT + + + + + + + + expr + + + + ) + + + + filter-clause + + + + + + + + + + + + + , + + + + + + * + + + + + + + + + + + + ORDER + + + + BY + + + + ordering-term + + , + + + + + + + + + Aggregate functions + + + + diff --git a/assets/img/celebrate.svg b/assets/img/celebrate.svg new file mode 100644 index 000000000..16e474cfb --- /dev/null +++ b/assets/img/celebrate.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/cmd-python.png b/assets/img/cmd-python.png new file mode 100644 index 000000000..1f8113576 Binary files /dev/null and b/assets/img/cmd-python.png differ diff --git a/assets/img/construction.svg b/assets/img/construction.svg new file mode 100644 index 000000000..2c600d548 --- /dev/null +++ b/assets/img/construction.svg @@ -0,0 +1,183 @@ + + + + + + diff --git a/assets/img/dropbox.svg b/assets/img/dropbox.svg new file mode 100644 index 000000000..7158acaea --- /dev/null +++ b/assets/img/dropbox.svg @@ -0,0 +1,70 @@ + + + + + + Dropbox Logo + Created with Sketch. + + + + + + + + + + Dropbox Logo + + + + diff --git a/assets/img/emacs.svg b/assets/img/emacs.svg new file mode 100644 index 000000000..811768de9 --- /dev/null +++ b/assets/img/emacs.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + Emacs Logo + + + + + + Emacs Logo + + + + diff --git a/assets/img/facebook.svg b/assets/img/facebook.svg new file mode 100644 index 000000000..09541f3a9 --- /dev/null +++ b/assets/img/facebook.svg @@ -0,0 +1,70 @@ + + + + + + Facebook Logo + Created with Sketch. + + + + + + + + + + Facebook Logo + + + + diff --git a/assets/img/geany.svg b/assets/img/geany.svg new file mode 100644 index 000000000..1c16320a0 --- /dev/null +++ b/assets/img/geany.svg @@ -0,0 +1,71 @@ + + + + + Geany Logo + + + + + + + + + + Geany Logo + + + + diff --git a/assets/img/george_boole.jpg b/assets/img/george_boole.jpg new file mode 100644 index 000000000..be533e303 Binary files /dev/null and b/assets/img/george_boole.jpg differ diff --git a/assets/img/git-commits.svg b/assets/img/git-commits.svg new file mode 100644 index 000000000..b08ab4f08 --- /dev/null +++ b/assets/img/git-commits.svg @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + 383a7630 + + + + + + + 1c060f79 + + + + + + + 1fe791ec + + + + + + + 01cda149 + + + + + + + testing + + + + + + + master + + + + + + + develop + + + + + + + + + + + + + + diff --git a/assets/img/git-snapshots.svg b/assets/img/git-snapshots.svg new file mode 100644 index 000000000..adef343c7 --- /dev/null +++ b/assets/img/git-snapshots.svg @@ -0,0 +1,1092 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Version 1 + + + + + + File A + + + + + + File B + + + + + + File C + + + + + + + + + Version 2 + + + + + + + A1 + + + + + + B + + + + + + + C1 + + + + + + + + + Version 3 + + + + + + A1 + + + + + + B + + + + + + + C2 + + + + + + + + + Version 4 + + + + + + + A2 + + + + + + + B1 + + + + + + C2 + + + + + + + + + Version 5 + + + + + + A2 + + + + + + + B2 + + + + + + + C3 + + + + + + + + + + + + + + + Checkins Over Time + + + + + + diff --git a/assets/img/google.svg b/assets/img/google.svg new file mode 100644 index 000000000..370e3945b --- /dev/null +++ b/assets/img/google.svg @@ -0,0 +1,86 @@ + + + + + + Google Logo + Created with Sketch. + + + + + + + + + + + + + + + Google Logo + + + + diff --git a/assets/img/guido-headshot-2019.jpg b/assets/img/guido-headshot-2019.jpg new file mode 100644 index 000000000..28b0e9bd6 Binary files /dev/null and b/assets/img/guido-headshot-2019.jpg differ diff --git a/assets/img/instagram.svg b/assets/img/instagram.svg new file mode 100644 index 000000000..64fe33f14 --- /dev/null +++ b/assets/img/instagram.svg @@ -0,0 +1,159 @@ + + + + + Instagram Logo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Instagram Logo + + + + diff --git a/assets/img/microsoft-store-get.png b/assets/img/microsoft-store-get.png new file mode 100644 index 000000000..34921faa5 Binary files /dev/null and b/assets/img/microsoft-store-get.png differ diff --git a/assets/img/microsoft-store-search.png b/assets/img/microsoft-store-search.png new file mode 100644 index 000000000..7ca927db3 Binary files /dev/null and b/assets/img/microsoft-store-search.png differ diff --git a/assets/img/mysql.svg b/assets/img/mysql.svg new file mode 100644 index 000000000..8ea6ac83e --- /dev/null +++ b/assets/img/mysql.svg @@ -0,0 +1,97 @@ + + + + + + MySQL Logo + Created with Sketch. + + + + + + + + + + + + + + + + + + MySQL Logo + + + + diff --git a/assets/img/netflix.svg b/assets/img/netflix.svg new file mode 100644 index 000000000..0c8ae03b1 --- /dev/null +++ b/assets/img/netflix.svg @@ -0,0 +1,105 @@ + + + + + Netflix Logo + + + + + + + + + + + + + + + + + + + + + + + Netflix Logo + + + + diff --git a/assets/img/npp.svg b/assets/img/npp.svg new file mode 100644 index 000000000..961beba83 --- /dev/null +++ b/assets/img/npp.svg @@ -0,0 +1,408 @@ + + + +NotepadPlusPlus Logo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NotepadPlusPlus Logo diff --git a/assets/img/postgres.svg b/assets/img/postgres.svg new file mode 100644 index 000000000..ed52d291f --- /dev/null +++ b/assets/img/postgres.svg @@ -0,0 +1,77 @@ + + + + + PostgreSQL Logo + + + + + + + + + + + + + PostgreSQL Logo + + + + diff --git a/assets/img/pycharm.svg b/assets/img/pycharm.svg new file mode 100644 index 000000000..f1e6dc34e --- /dev/null +++ b/assets/img/pycharm.svg @@ -0,0 +1,272 @@ + + + + + PyCharm Logo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PyCharm Logo + + + + diff --git a/assets/img/python.svg b/assets/img/python.svg new file mode 100644 index 000000000..af0b2040f --- /dev/null +++ b/assets/img/python.svg @@ -0,0 +1,97 @@ + + + + + Python Logo + + + + + + + + + + + + + + + + + Python Logo + + + + diff --git a/assets/img/quora.svg b/assets/img/quora.svg new file mode 100644 index 000000000..2698b5e47 --- /dev/null +++ b/assets/img/quora.svg @@ -0,0 +1,60 @@ + + + + + Quora Logo + + + + + + + Quora Logo + + + + diff --git a/assets/img/reddit.svg b/assets/img/reddit.svg new file mode 100644 index 000000000..962dbb8c8 --- /dev/null +++ b/assets/img/reddit.svg @@ -0,0 +1,70 @@ + + + + + + Reddit Logo + Created with Sketch. + + + + + + + + + + Reddit Logo + + + + diff --git a/assets/img/spotify.svg b/assets/img/spotify.svg new file mode 100644 index 000000000..b55a3cd2b --- /dev/null +++ b/assets/img/spotify.svg @@ -0,0 +1,70 @@ + + + + + + Spotify Logo + Created with Sketch. + + + + + + + + + + Spotify Logo + + + + diff --git a/assets/img/sqlite.svg b/assets/img/sqlite.svg new file mode 100644 index 000000000..b9f64884e --- /dev/null +++ b/assets/img/sqlite.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + SQLite Logo + + + + + + + SQLite Logo + + + + diff --git a/assets/img/start-menu-python.png b/assets/img/start-menu-python.png new file mode 100644 index 000000000..419ae72b4 Binary files /dev/null and b/assets/img/start-menu-python.png differ diff --git a/assets/img/terminal-python.png b/assets/img/terminal-python.png new file mode 100644 index 000000000..1d86fe5a8 Binary files /dev/null and b/assets/img/terminal-python.png differ diff --git a/assets/img/vcs-dvcs.svg b/assets/img/vcs-dvcs.svg new file mode 100644 index 000000000..9f7b20543 --- /dev/null +++ b/assets/img/vcs-dvcs.svg @@ -0,0 +1,1064 @@ + + + + + + + + + + + + + + + + + + + + + + Local Repository A + + + + + + + + + + File + + + + + + + Version Database + + + + + + + + + + Version 3 + + + + + + + Version 2 + + + + + + + Version 1 + + + + + + + + + + + Local Repository B + + + + + + + + + + File + + + + + + + + + + Version Database + + + + + + + + + + Version 3 + + + + + + + Version 2 + + + + + + + Version 1 + + + + + + + + + + + Remote Repository + + + + + + + + + + + + + + + + Version Database + + + + + + + + + + Version 3 + + + + + + + Version 2 + + + + + + + Version 1 + + + + + diff --git a/assets/img/vim.svg b/assets/img/vim.svg new file mode 100644 index 000000000..731422858 --- /dev/null +++ b/assets/img/vim.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + Vim Logo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vim Logo + + + + diff --git a/assets/img/vscode.svg b/assets/img/vscode.svg new file mode 100644 index 000000000..d88acc9e3 --- /dev/null +++ b/assets/img/vscode.svg @@ -0,0 +1,57 @@ + + + + + + + VSCode Logo + + + + + VSCode Logo + + + + diff --git a/assets/img/wy_ban.jpg b/assets/img/wy_ban.jpg new file mode 100644 index 000000000..fb8122c69 Binary files /dev/null and b/assets/img/wy_ban.jpg differ diff --git a/assets/impress.js b/assets/impress.js new file mode 160000 index 000000000..fd945d557 --- /dev/null +++ b/assets/impress.js @@ -0,0 +1 @@ +Subproject commit fd945d557498b9310d1d9ba20690b492578e0e15 diff --git a/assets/mermaid/git/cherry-pick.mmd b/assets/mermaid/git/cherry-pick.mmd new file mode 100644 index 000000000..683c2fdf9 --- /dev/null +++ b/assets/mermaid/git/cherry-pick.mmd @@ -0,0 +1,19 @@ +%%{init: {'gitGraph': {'mainBranchName': 'master'}} }%% +gitGraph + commit id: "Initial commit" + branch develop + checkout master + commit + checkout develop + commit + checkout master + commit + checkout develop + commit id: "Important commit" + checkout master + commit + checkout develop + commit + checkout master + cherry-pick id: "Important commit" + commit diff --git a/assets/mermaid/git/cherry-pick.mmd.png b/assets/mermaid/git/cherry-pick.mmd.png new file mode 100644 index 000000000..2a18add47 Binary files /dev/null and b/assets/mermaid/git/cherry-pick.mmd.png differ diff --git a/assets/mermaid/git/commits.mmd b/assets/mermaid/git/commits.mmd new file mode 100644 index 000000000..66263b0f9 --- /dev/null +++ b/assets/mermaid/git/commits.mmd @@ -0,0 +1,10 @@ +%%{init: {'gitGraph': {'mainBranchName': 'master'}} }%% +gitGraph: + commit id: "Initial commit" + commit id: "383a7630" type: HIGHLIGHT + branch develop + commit id: "1fe791ec" + branch testing + commit id: "01cda149" + checkout master + commit id: "1c060f79" diff --git a/assets/mermaid/git/commits.mmd.png b/assets/mermaid/git/commits.mmd.png new file mode 100644 index 000000000..345cb97a0 Binary files /dev/null and b/assets/mermaid/git/commits.mmd.png differ diff --git a/assets/mermaid/git/gitflow.mmd b/assets/mermaid/git/gitflow.mmd new file mode 100644 index 000000000..2cfcb61ca --- /dev/null +++ b/assets/mermaid/git/gitflow.mmd @@ -0,0 +1,56 @@ +%%{init: {'gitGraph': {'mainBranchName': 'master'}} }%% +gitGraph +%% initialize repository + commit id: "Initial commit" + +%% define development branch + branch develop + commit + +%% define hotfix branch + checkout master + commit id: "Buggy commit" type: REVERSE + branch hotfix + +%% define feature branches + checkout develop + branch feature/A + branch feature/B + checkout develop + commit + branch feature/C + commit + +%% working with hotfix branch + checkout hotfix + commit id: "Fix bugs" type:HIGHLIGHT + +%% merge hotfix commits into main and develop + checkout master + merge hotfix + checkout develop + merge hotfix + +%% working with feature-b branch + checkout feature/A + commit + checkout develop + merge feature/A +%% work with feature-a branch + checkout feature/B + commit + checkout develop + +%% define release branch + checkout develop + branch release/v1.0 + commit id: "Work on release" tag: "v1.0" + checkout master + merge release/v1.0 + checkout develop + commit + merge release/v1.0 + +%% merging previous feature branch + commit + merge feature/B \ No newline at end of file diff --git a/assets/mermaid/git/gitflow.mmd.png b/assets/mermaid/git/gitflow.mmd.png new file mode 100644 index 000000000..8a0ef24de Binary files /dev/null and b/assets/mermaid/git/gitflow.mmd.png differ diff --git a/assets/mermaid/git/lifecycle.mmd b/assets/mermaid/git/lifecycle.mmd new file mode 100644 index 000000000..a43c1f615 --- /dev/null +++ b/assets/mermaid/git/lifecycle.mmd @@ -0,0 +1,11 @@ +sequenceDiagram + participant Untracked + participant Unmodified + participant Modified + participant Staged + + Untracked ->> Staged: Add the file + Unmodified ->> Modified: Edit the file + Modified ->> Staged: Stage the file + Unmodified ->> Untracked: Remove the file + Staged ->> Unmodified: Commit diff --git a/assets/mermaid/git/lifecycle.mmd.png b/assets/mermaid/git/lifecycle.mmd.png new file mode 100644 index 000000000..b1c37e23d Binary files /dev/null and b/assets/mermaid/git/lifecycle.mmd.png differ diff --git a/assets/mermaid/git/merge-1.mmd b/assets/mermaid/git/merge-1.mmd new file mode 100644 index 000000000..fa93e1433 --- /dev/null +++ b/assets/mermaid/git/merge-1.mmd @@ -0,0 +1,8 @@ +%%{init: {'gitGraph': {'mainBranchName': 'master'}} }%% +gitGraph + commit id: "Initial commit" + branch feature/GH-53 + commit + commit + checkout master + merge feature/GH-53 diff --git a/assets/mermaid/git/merge-1.mmd.png b/assets/mermaid/git/merge-1.mmd.png new file mode 100644 index 000000000..e394a7e30 Binary files /dev/null and b/assets/mermaid/git/merge-1.mmd.png differ diff --git a/assets/mermaid/git/merge-2.mmd b/assets/mermaid/git/merge-2.mmd new file mode 100644 index 000000000..9f5c65eb7 --- /dev/null +++ b/assets/mermaid/git/merge-2.mmd @@ -0,0 +1,15 @@ +%%{init: {'gitGraph': {'mainBranchName': 'master'}} }%% +gitGraph + commit id: "Initial commit" + branch feature/GH-53 + branch feature/GH-54 + checkout feature/GH-53 + commit + commit + checkout master + merge feature/GH-53 + checkout feature/GH-54 + commit + checkout master + commit + merge feature/GH-54 type:NORMAL id: "merge commit" \ No newline at end of file diff --git a/assets/mermaid/git/merge-2.mmd.png b/assets/mermaid/git/merge-2.mmd.png new file mode 100644 index 000000000..73e8c6fa7 Binary files /dev/null and b/assets/mermaid/git/merge-2.mmd.png differ diff --git a/assets/mermaid/git/rebase-1.mmd b/assets/mermaid/git/rebase-1.mmd new file mode 100644 index 000000000..f5476ddc2 --- /dev/null +++ b/assets/mermaid/git/rebase-1.mmd @@ -0,0 +1,9 @@ +%%{init: {'gitGraph': {'mainBranchName': 'master'}} }%% +gitGraph + commit id: "Initial commit" + branch feature + checkout master + commit id: "Second commit" + checkout feature + commit id: "1st commit on feature" + commit id: "2nd commit on feature" \ No newline at end of file diff --git a/assets/mermaid/git/rebase-1.mmd.png b/assets/mermaid/git/rebase-1.mmd.png new file mode 100644 index 000000000..bb030e5a8 Binary files /dev/null and b/assets/mermaid/git/rebase-1.mmd.png differ diff --git a/assets/mermaid/git/rebase-2.mmd b/assets/mermaid/git/rebase-2.mmd new file mode 100644 index 000000000..5103a9f3d --- /dev/null +++ b/assets/mermaid/git/rebase-2.mmd @@ -0,0 +1,8 @@ +%%{init: {'gitGraph': {'mainBranchName': 'master'}} }%% +gitGraph + commit id: "Initial commit" + commit id: "Second commit" + branch feature + checkout feature + commit id: "1st commit on feature" + commit id: "2nd commit on feature" \ No newline at end of file diff --git a/assets/mermaid/git/rebase-2.mmd.png b/assets/mermaid/git/rebase-2.mmd.png new file mode 100644 index 000000000..c71e1f790 Binary files /dev/null and b/assets/mermaid/git/rebase-2.mmd.png differ diff --git a/assets/mermaid/git/states.mmd b/assets/mermaid/git/states.mmd new file mode 100644 index 000000000..edf400dbb --- /dev/null +++ b/assets/mermaid/git/states.mmd @@ -0,0 +1,8 @@ +sequenceDiagram + participant Working directory + participant Stage area + participant .git directory (Repository) + + .git directory (Repository) ->> Working directory: Checkout + Working directory ->> Stage area: Stage fixes + Stage area ->> .git directory (Repository): Commit diff --git a/assets/mermaid/git/states.mmd.png b/assets/mermaid/git/states.mmd.png new file mode 100644 index 000000000..138a637b8 Binary files /dev/null and b/assets/mermaid/git/states.mmd.png differ diff --git a/index.html b/index.html new file mode 100644 index 000000000..7e33dcaca --- /dev/null +++ b/index.html @@ -0,0 +1,28 @@ + + + + + + + + + + Python Training Course + + +
+

Python Training Course

+

Course Materials

+ +
+ + diff --git a/lesson29.md b/lesson29.md index 0f29f7922..b9df03eaf 100644 --- a/lesson29.md +++ b/lesson29.md @@ -652,7 +652,7 @@ def index(request): Продолжаем собирать блог -https://edu-python-course.github.io/_build/html/uk/appx/blog.html#challenge-templates +https://edu-python-course.github.io/_build/html/uk/appx/blog/spec.html#challenge-templates На данном этапе мы пока не можем реализовать все, что указанно в спецификации, поэтому на текущем моменте надо реализовать следующие страницы: diff --git a/lesson30.md b/lesson30.md index b7153097c..f22aa1969 100644 --- a/lesson30.md +++ b/lesson30.md @@ -527,7 +527,7 @@ class Membership(models.Model): # Домашнее задание / Практика: -https://edu-python-course.github.io/_build/html/uk/appx/blog.html#challenge-data-models +https://edu-python-course.github.io/_build/html/uk/appx/blog/spec.html#challenge-data-models topic <--> blogpost = m2m: у blogpost должен быть хотя бы 1 topic diff --git a/lesson40.md b/lesson40.md index e7e86d189..4a9389255 100644 --- a/lesson40.md +++ b/lesson40.md @@ -1161,4 +1161,4 @@ class TestCalculator(TestCase): 2. Напишите интеграционные тесты для логина и для покупки товара. -3. (Задание до выдачи задания на диплом) Покройте тестами весь остальной код. +3. Покройте тестами весь остальной код. diff --git a/lesson44.md b/lesson44.md index c9d5f341d..86783a73d 100644 --- a/lesson44.md +++ b/lesson44.md @@ -766,4 +766,4 @@ class ChatConsumer(AsyncWebsocketConsumer): 1. Повторите туториал из этого занятия. -2. Давайте разбирать задания на диплом! \ No newline at end of file +2. Давайте разбирать задания на диплом! diff --git a/lesson45.md b/lesson45.md index 1e8505008..bb1c44223 100644 --- a/lesson45.md +++ b/lesson45.md @@ -8,7 +8,7 @@ обеспечением на компьютере. Операционная система, также известная как **ОС**, взаимодействует с аппаратным обеспечением компьютера и предоставляет службы, которые могут использовать приложения. -![](http://img2.joyreactor.cc/pics/comment/%D0%B1%D0%B5%D0%B7-%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B0-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B-windows-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0-3799042.jpeg))) +![](https://media.discordapp.net/attachments/943973009788641300/1190088341186686976/b573ad7c999d7443.jpg?ex=65a9c1a3&is=65974ca3&hm=636f2c77d679a1ec82586745dcf0ef683a91604196cd41c7b8365919ee943a3d&=&format=webp&width=745&height=621) ### Что делает операционная система? diff --git a/libms-db b/libms-db new file mode 160000 index 000000000..6aded892f --- /dev/null +++ b/libms-db @@ -0,0 +1 @@ +Subproject commit 6aded892faa6b5aa6d130e8737b1bf8291e61f73 diff --git a/mindmaps/basics-function.mmd b/mindmaps/basics-function.mmd new file mode 100644 index 000000000..fc7de8e9d --- /dev/null +++ b/mindmaps/basics-function.mmd @@ -0,0 +1,25 @@ +--- +Python functions +--- + +mindmap + root(Python functions) + term)Definition( + def[Function definition syntax] + example + scope{{Variables scopes}} + ::[Arguments] + positional arguments + keyword arguments + ::{{Special cases}} + default values + ::[Variable number of arguments] + pos(Positional arguments) + kw(Keyword arguments) + m_args{{Mutable arguments}} + ::{{special case: default values}} + return[return statement] + lambda(Lambda functions) + recursion)Resive functions( + base case + recursive case diff --git a/mindmaps/django-intro.mmd b/mindmaps/django-intro.mmd new file mode 100644 index 000000000..94da25b99 --- /dev/null +++ b/mindmaps/django-intro.mmd @@ -0,0 +1,40 @@ +--- +Introduction to Django web framework +--- + +mindmap + root(Django Introduction) + about)About( + Frameworks + Libraries + hiw))How
internet
works(( + diagram[Request-Response cycle
diagram] + response)What is
RESPONSE?( + request)What is
REQUEST?( + methods{{Request methods}} + mvc(Model, View, Controller
design pattern) + mvc_m[Model] + ::{{Data manipulation}} + mvc_v[View] + ::{{Data representation}} + mvc_c[Controller] + ::{{Model-to-view mapper}} + mvt(Model, View, Template
design pattern) + dj_m[Model] + ::{{Data manipulation}} + dj_v[View] + ::{{Request-response handlers}} + dj_t[Template] + ::{{Data representation}} + how_to)How to( + Install Django + Create project + Run project for the first time + structure[Django project structure] + ::{{Entry points}} + ::{{Settings}} + ::{{URL Configurations}} + apps[Django applications] + Create app + ::{{AppConfig}} + Install app diff --git a/mindmaps/django-models.mmd b/mindmaps/django-models.mmd new file mode 100644 index 000000000..5fcc5f0f4 --- /dev/null +++ b/mindmaps/django-models.mmd @@ -0,0 +1,62 @@ +--- +Django models +--- + +mindmap + root(Django models) + ::)Definition( + settings + ::icon(fas fa-gear) + ::{{connect to DB}} + dbs[sqlite
postgres
mysql] + ::icon(fas fa-database) + ::[Define a model] + models.Field + null + blank + choices + editable + help_text + primary_key + unique + verbose_name + validators + fields[Fields] + txt(Text fields) + CharField + max_length + SlugField + TextField + ::{{special cases}} + FileField + ImageField + URLField + num(Numeric fields) + IntegerField + DecimalField + datetime(Date/time fields) + DateField + TimeField + DateTimeField + rel(Relationships) + ::[1-to-1] + ::[1-to-N: foreign key] + ::[m2m: many to many] + through + ::icon(fas fa-table) + migrations + makemigrations[Make migrations] + migrate[Migrate] + ::{{Schema migrations}} + ::{{Data migrations}} + admin(Site admin) + register model to admin site + admin site configuration + ::icon(fas fa-user-tie) + usage + add + ::icon(fas fa-plus) + remove + ::icon(fas fa-trash) + modify + ::icon(fas fa-edit) diff --git a/mindmaps/django-templates.mmd b/mindmaps/django-templates.mmd new file mode 100644 index 000000000..07cea9539 --- /dev/null +++ b/mindmaps/django-templates.mmd @@ -0,0 +1,26 @@ +--- +Django templates +--- + +mindmap + root(Django templates) + settings + ::icon(fas fa-gear) + ::[Template directories] + ::icon(fas fa-folder) + ::{{Apps templates}} + render(render function) + ctx[context] + dtl)Django
template
language( + syntax((Syntax)) + tags + variables + filters + comments + ::(access data) + ::(conditions) + ::(loops) + ::(include) + ::(templates
inheritance) + ctg{{Custom template tags}} + templatetags diff --git a/mindmaps/rdbms-acid.mmd b/mindmaps/rdbms-acid.mmd new file mode 100644 index 000000000..3b724e8ad --- /dev/null +++ b/mindmaps/rdbms-acid.mmd @@ -0,0 +1,17 @@ +--- +ACID - Atomicity, Consistency, Isolation, Durability +--- + +mindmap + root((ACID)) + term)transactions( + A(Atomicity) + Individual operations + ::[All or nothing] + C(Consistency) + ::{{valid state}} + From valid state to another valid state + I(Isolation) + Isolation principle + levels[Isolation levels] + D(Durability) diff --git a/mindmaps/rdbms-normalization.mmd b/mindmaps/rdbms-normalization.mmd new file mode 100644 index 000000000..7b62dd095 --- /dev/null +++ b/mindmaps/rdbms-normalization.mmd @@ -0,0 +1,23 @@ +--- +Database normalization +--- + +mindmap + root((Normalization)) + def)Definition( + anomalies[Anomalies] + ins{{Insertion anomaly}} + table + upd{{Update anomaly}} + table + del{{Deletion anomaly}} + table + 1nf(1st Normal Form) + 1nfReq)requirements( + table + 2nf(2nd Normal Form) + 2nfReq)requirements( + table + 3nf(3rd Normal Form) + 3nfReq)requirements( + table diff --git a/mindmaps/rdbms-relationship.mmd b/mindmaps/rdbms-relationship.mmd new file mode 100644 index 000000000..1fb216d65 --- /dev/null +++ b/mindmaps/rdbms-relationship.mmd @@ -0,0 +1,29 @@ +--- +Database relationships +--- + +mindmap + root(Relationships) + ::{{Constraints}} + pk[Primary key] + ::icon(fas fa-key) + fk[Foreigh key] + ::(1-to-1) + ::{{unique foreign key}} + ::[table] + ::icon(fas fa-a) + ::[table] + ::icon(fas fa-b) + ::(1-to-N) + ::{{foreign key}} + ::[table] + ::icon(fas fa-a) + ::[table] + ::icon(fas fa-b) + m2m(Many-to-many) + ::[relation table] + ::icon(fas fa-table) + ::[table] + ::icon(fas fa-a) + ::[table] + ::icon(fas fa-b) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..5a97c5a6e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6808 @@ +{ + "name": "python-course", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "python-course", + "dependencies": { + "@mermaid-js/mermaid-cli": "^10.8.0", + "mermaid": "^10.8.0" + }, + "devDependencies": { + "css-loader": "^6.10.0", + "handlebars": "^4.7.8", + "handlebars-loader": "^1.7.3", + "html-loader": "^5.0.0", + "html-webpack-plugin": "^5.6.0", + "mini-css-extract-plugin": "^2.8.0", + "sass": "^1.71.1", + "sass-loader": "^14.1.1", + "webpack": "^5.90.3", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@mermaid-js/mermaid-cli": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/mermaid-cli/-/mermaid-cli-10.8.0.tgz", + "integrity": "sha512-xZsGR88RsP72SAXyvjU23HzsKHsq6b7/kbnmQrEuIcPrJGPOckFiP9nzHvPh3Z04MjvpDJVjtbIspt2ZQwUzzA==", + "dependencies": { + "chalk": "^5.0.1", + "commander": "^10.0.0", + "puppeteer": "^19.0.0" + }, + "bin": { + "mmdc": "src/cli.js" + }, + "engines": { + "node": "^14.13 || >=16.0" + } + }, + "node_modules/@mermaid-js/mermaid-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.5.0.tgz", + "integrity": "sha512-Uw6oB7VvmPRLE4iKsjuOh8zgDabhNX67dzo8U/BB0f9527qx+4eeUs+korU98OhG5C4ubg7ufBgVi63XYwS6TQ==", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=14.1.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.3.tgz", + "integrity": "sha512-PvSf1wfv2wJpVIFUMSb+i4PvqNYkB9Rkp9ZDO3oaWzq4SKhsQk4mrMBr3ZH06I0hKrVGLBacmgl8JM4WVjb9dg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "devOptional": true + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001589", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", + "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-bidi": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.7.tgz", + "integrity": "sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ==", + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cytoscape": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.28.1.tgz", + "integrity": "sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==", + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/devtools-protocol": { + "version": "0.0.1107588", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz", + "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.9.tgz", + "integrity": "sha512-uyb4NDIvQ3hRn6NiC+SIFaP4mJ/MdXlvtunaqK9Bn6dD3RuB/1S/gasEjDHD8eiaqdSael2vBv+hOs7Y+jhYOQ==" + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.681", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz", + "integrity": "sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==", + "dev": true + }, + "node_modules/elkjs": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.2.tgz", + "integrity": "sha512-2Y/RaA1pdgSHpY0YG4TYuYCD2wh97CRvu22eLG3Kz0pgQ/6KbIFTxsTnDc4MH/6hFlg2L/9qXrDMG0nMjP63iw==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars-loader": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/handlebars-loader/-/handlebars-loader-1.7.3.tgz", + "integrity": "sha512-dDb+8D51vE3OTSE2wuGPWRAegtsEuw8Mk8hCjtRu/pNcBfN5q+M8ZG3kVJxBuOeBrVElpFStipGmaxSBTRR1mQ==", + "dev": true, + "dependencies": { + "async": "^3.2.2", + "fastparse": "^1.0.0", + "loader-utils": "1.4.x", + "object-assign": "^4.1.0" + }, + "peerDependencies": { + "handlebars": ">= 1.3.0 < 5" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-5.0.0.tgz", + "integrity": "sha512-puaGKdjdVVIFRtgIC2n5dt5bt0N5j6heXlAQZ4Do1MLjHmOT1gCE1Ogg7XZNeJlnOVHHsrZKGs5dfh+XwZ3XPw==", + "dev": true, + "dependencies": { + "html-minifier-terser": "^7.2.0", + "parse5": "^7.1.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/html-loader/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/html-loader/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/html-loader/node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immutable": { + "version": "4.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.0.1.tgz", + "integrity": "sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.7.7.tgz", + "integrity": "sha512-x9qc6k88J/VVwnfTkJV8pRRswJ2156Rc4w5rciRqKceFDZ0y1MqsNL9pkg5sE0GOcDzZYbonreALhaHzg1siFw==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mermaid": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.8.0.tgz", + "integrity": "sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.1", + "@types/d3-scale": "^4.0.3", + "@types/d3-scale-chromatic": "^3.0.0", + "cytoscape": "^3.28.1", + "cytoscape-cose-bilkent": "^4.1.0", + "d3": "^7.4.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "^3.0.5", + "elkjs": "^0.9.0", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.0.tgz", + "integrity": "sha512-CxmUYPFcTgET1zImteG/LZOy/4T5rTojesQXkSNBiquhydn78tfbCE9sjIjnJ/UcjNjOC1bphTCCW5rrS7cXAg==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-10.0.3.tgz", + "integrity": "sha512-dtbI5oW7987hwC9qjJTyABldTaa19SuyJse1QboWv3b0qCcrrLNVDqBx1XgELAjh9QTVQaP/C5b1nhQebd1H2A==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "19.11.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.11.1.tgz", + "integrity": "sha512-39olGaX2djYUdhaQQHDZ0T0GwEp+5f9UB9HmEP0qHfdQHIq0xGQZuAZ5TLnJIc/88SrPLpEflPC+xUqOTv3c5g==", + "deprecated": "< 21.5.0 is no longer supported", + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "0.5.0", + "cosmiconfig": "8.1.3", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "puppeteer-core": "19.11.1" + } + }, + "node_modules/puppeteer-core": { + "version": "19.11.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.11.1.tgz", + "integrity": "sha512-qcuC2Uf0Fwdj9wNtaTZ2OvYRraXpAK+puwwVW8ofOhOgLPZyz1c68tsorfIZyCUOpyBisjr+xByu7BMbEYMepA==", + "dependencies": { + "@puppeteer/browsers": "0.5.0", + "chromium-bidi": "0.4.7", + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1107588", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "proxy-from-env": "1.1.0", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.13.0" + }, + "engines": { + "node": ">=14.14.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", + "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz", + "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-worker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", + "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack": { + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.0.0.tgz", + "integrity": "sha512-tZ5hqsWwww/8DislmrzXE3x+4f+v10H1z57mA2dWFrILb4i3xX+dPhTkcdR0DLyQztrhF2AUmO5nN085UYjd/Q==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.2.tgz", + "integrity": "sha512-IVj3qsQhiLJR82zVg3QdPtngMD05CYP/Am+9NG5QSl+XwUR/UPtFwllRBKrMwM9ttzFsC6Zj3DMgniPyn/Z0hQ==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.0.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..e1094b63d --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "python-course", + "private": true, + "scripts": { + "start": "webpack serve", + "build": "webpack build" + }, + "devDependencies": { + "css-loader": "^6.10.0", + "handlebars": "^4.7.8", + "handlebars-loader": "^1.7.3", + "html-loader": "^5.0.0", + "html-webpack-plugin": "^5.6.0", + "mini-css-extract-plugin": "^2.8.0", + "sass": "^1.71.1", + "sass-loader": "^14.1.1", + "webpack": "^5.90.3", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.2" + }, + "dependencies": { + "@mermaid-js/mermaid-cli": "^10.8.0", + "mermaid": "^10.8.0" + } +} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 000000000..4e0fde41c --- /dev/null +++ b/poetry.lock @@ -0,0 +1,913 @@ +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. + +[[package]] +name = "alabaster" +version = "0.7.16" +description = "A light, configurable Sphinx theme" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, +] + +[[package]] +name = "babel" +version = "2.14.0" +description = "Internationalization utilities" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "docutils" +version = "0.18.1" +description = "Docutils -- Python Documentation Utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.0.1" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "latexcodec" +version = "2.0.1" +description = "A lexer and codec to work with LaTeX code in Python." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"}, + {file = "latexcodec-2.0.1.tar.gz", hash = "sha256:2aa2551c373261cefe2ad3a8953a6d6533e68238d180eb4bb91d7964adb3fe9a"}, +] + +[package.dependencies] +six = ">=1.4.1" + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.3.5" +description = "Collection of plugins for markdown-it-py" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, + {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<3.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "myst-parser" +version = "1.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "myst-parser-1.0.0.tar.gz", hash = "sha256:502845659313099542bd38a2ae62f01360e7dd4b1310f025dd014dfc0439cdae"}, + {file = "myst_parser-1.0.0-py3-none-any.whl", hash = "sha256:69fb40a586c6fa68995e6521ac0a525793935db7e724ca9bac1d33be51be9a4c"}, +] + +[package.dependencies] +docutils = ">=0.15,<0.20" +jinja2 = "*" +markdown-it-py = ">=1.0.0,<3.0.0" +mdit-py-plugins = ">=0.3.4,<0.4.0" +pyyaml = "*" +sphinx = ">=5,<7" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.7.5,<0.8.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pybtex" +version = "0.24.0" +description = "A BibTeX-compatible bibliography processor in Python" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "pybtex-0.24.0-py2.py3-none-any.whl", hash = "sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f"}, + {file = "pybtex-0.24.0.tar.gz", hash = "sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755"}, +] + +[package.dependencies] +latexcodec = ">=1.0.4" +PyYAML = ">=3.01" +six = "*" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "pybtex-docutils" +version = "1.0.3" +description = "A docutils backend for pybtex." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pybtex-docutils-1.0.3.tar.gz", hash = "sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b"}, + {file = "pybtex_docutils-1.0.3-py3-none-any.whl", hash = "sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9"}, +] + +[package.dependencies] +docutils = ">=0.14" +pybtex = ">=0.16" + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "69.1.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, + {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "sphinx" +version = "6.2.1" +description = "Python documentation generator" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Sphinx-6.2.1.tar.gz", hash = "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b"}, + {file = "sphinx-6.2.1-py3-none-any.whl", hash = "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.20" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.13" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +description = "Add a copy button to each of your code cells." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, + {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, +] + +[package.dependencies] +sphinx = ">=1.8" + +[package.extras] +code-style = ["pre-commit (==2.12.1)"] +rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] + +[[package]] +name = "sphinx-intl" +version = "2.1.0" +description = "Sphinx utility that make it easy to translate and to apply translation." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-intl-2.1.0.tar.gz", hash = "sha256:9d9849ae42515b39786824e99f1e30db0404c377b01bb022690fc932b0221c02"}, + {file = "sphinx_intl-2.1.0-py3-none-any.whl", hash = "sha256:9798946b995989de691387651d70c3fc191275b587e2e519655541edfd7bbd68"}, +] + +[package.dependencies] +babel = "*" +click = "*" +setuptools = "*" +sphinx = "*" + +[package.extras] +test = ["mock", "pytest", "six"] + +[[package]] +name = "sphinx-reredirects" +version = "0.1.3" +description = "Handles redirects for moved pages in Sphinx documentation projects" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinx_reredirects-0.1.3-py3-none-any.whl", hash = "sha256:02c53437c467cf9ed89863eff3addedc01d129624b2f03ab6302518fb77a2c89"}, + {file = "sphinx_reredirects-0.1.3.tar.gz", hash = "sha256:56e222d285f76c944fd370f36ad3a1a66103a88b552e97d3d24a622bb9465de8"}, +] + +[package.dependencies] +sphinx = "*" + +[[package]] +name = "sphinx-rtd-theme" +version = "1.3.0" +description = "Read the Docs theme for Sphinx" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "sphinx_rtd_theme-1.3.0-py2.py3-none-any.whl", hash = "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0"}, + {file = "sphinx_rtd_theme-1.3.0.tar.gz", hash = "sha256:590b030c7abb9cf038ec053b95e5380b5c70d61591eb0b552063fbe7c41f0931"}, +] + +[package.dependencies] +docutils = "<0.19" +sphinx = ">=1.6,<8" +sphinxcontrib-jquery = ">=4,<5" + +[package.extras] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.8" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-bibtex" +version = "2.5.0" +description = "Sphinx extension for BibTeX style citations." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-bibtex-2.5.0.tar.gz", hash = "sha256:71b42e5db0e2e284f243875326bf9936aa9a763282277d75048826fef5b00eaa"}, + {file = "sphinxcontrib_bibtex-2.5.0-py3-none-any.whl", hash = "sha256:748f726eaca6efff7731012103417ef130ecdcc09501b4d0c54283bf5f059f76"}, +] + +[package.dependencies] +docutils = ">=0.8" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +pybtex = ">=0.24" +pybtex-docutils = ">=1.0.0" +Sphinx = ">=2.1" + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.6" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.5" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +category = "main" +optional = false +python-versions = ">=2.7" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-mermaid" +version = "0.8.1" +description = "Mermaid diagrams in yours Sphinx powered docs" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinxcontrib-mermaid-0.8.1.tar.gz", hash = "sha256:fa3e5325d4ba395336e6137d113f55026b1a03ccd115dc54113d1d871a580466"}, + {file = "sphinxcontrib_mermaid-0.8.1-py3-none-any.whl", hash = "sha256:15491c24ec78cf1626b1e79e797a9ce87cb7959cf38f955eb72dd5512aeb6ce9"}, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.7" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.10" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-svg2pdfconverter" +version = "1.2.2" +description = "Sphinx SVG to PDF converter extension" +category = "main" +optional = false +python-versions = "~=3.4" +files = [ + {file = "sphinxcontrib-svg2pdfconverter-1.2.2.tar.gz", hash = "sha256:80a55ca61f70eae93efc65f3814f2f177c86ba55934a9f6c5022f1778b62146b"}, + {file = "sphinxcontrib_svg2pdfconverter-1.2.2-py3-none-any.whl", hash = "sha256:04ec767b55780a6b18d89cc1a8ada6d900c6efde9d1683abdb98a49b144465ca"}, +] + +[package.dependencies] +Sphinx = ">=1.6.3" + +[package.extras] +cairosvg = ["cairosvg (>=1.0)"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "f5c86228397ade865057c3a908f9ab397b846cce48f7ad0cd432e0002227f5ed" diff --git a/problem-sets b/problem-sets new file mode 160000 index 000000000..78e4d6fe5 --- /dev/null +++ b/problem-sets @@ -0,0 +1 @@ +Subproject commit 78e4d6fe5389dbb512ed31c4edeb51ee36e5b734 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..4efc9306d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,49 @@ +[tool.poetry] +name = "python-course" +version = "2024.03.dev" +description = "Python training course materials" +license = "MIT" +authors = [ + "Vladyslav Ponomaryov", + "Serhii Horodilov " +] +maintainers = [ + "Serhii Horodilov " +] +readme = "README.rst" +homepage = "https://edu-python-course.github.io" +repository = "https://github.com/edu-python-course/edu-python-course.github.io" +keywords = [ + "python", + "training", + "course", + "education" +] +classifiers = [ + "License :: OSI Approved :: MIT License", + "Natural Language :: English", + "Natural Language :: Ukrainian", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Topic :: Documentation", + "Topic :: Documentation :: Sphinx", + "Topic :: Education" +] + +[tool.poetry.dependencies] +python = "^3.9" +Sphinx = "^6.1.3" +sphinx-intl = "^2.1.0" +sphinx-rtd-theme = "^1.2.0" +myst-parser = "^1.0.0" +sphinxcontrib-bibtex = "^2.5.0" +sphinxcontrib-mermaid = "^0.8.1" +sphinx-copybutton = "^0.5.2" +toml = "^0.10.2" +sphinx-reredirects = "^0.1.3" +sphinxcontrib-svg2pdfconverter = "^1.2.2" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..1d3e35ea9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,44 @@ +alabaster==0.7.16 ; python_version >= "3.9" and python_version < "4.0" +babel==2.14.0 ; python_version >= "3.9" and python_version < "4.0" +certifi==2024.2.2 ; python_version >= "3.9" and python_version < "4.0" +charset-normalizer==3.3.2 ; python_version >= "3.9" and python_version < "4.0" +click==8.1.7 ; python_version >= "3.9" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "win32" or python_version >= "3.9" and python_version < "4.0" and platform_system == "Windows" +docutils==0.18.1 ; python_version >= "3.9" and python_version < "4.0" +idna==3.6 ; python_version >= "3.9" and python_version < "4.0" +imagesize==1.4.1 ; python_version >= "3.9" and python_version < "4.0" +importlib-metadata==7.0.1 ; python_version >= "3.9" and python_version < "3.10" +jinja2==3.1.3 ; python_version >= "3.9" and python_version < "4.0" +latexcodec==2.0.1 ; python_version >= "3.9" and python_version < "4.0" +markdown-it-py==2.2.0 ; python_version >= "3.9" and python_version < "4.0" +markupsafe==2.1.5 ; python_version >= "3.9" and python_version < "4.0" +mdit-py-plugins==0.3.5 ; python_version >= "3.9" and python_version < "4.0" +mdurl==0.1.2 ; python_version >= "3.9" and python_version < "4.0" +myst-parser==1.0.0 ; python_version >= "3.9" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.9" and python_version < "4.0" +pybtex-docutils==1.0.3 ; python_version >= "3.9" and python_version < "4.0" +pybtex==0.24.0 ; python_version >= "3.9" and python_version < "4.0" +pygments==2.17.2 ; python_version >= "3.9" and python_version < "4.0" +pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "4.0" +requests==2.31.0 ; python_version >= "3.9" and python_version < "4.0" +setuptools==69.1.1 ; python_version >= "3.9" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.9" and python_version < "4.0" +snowballstemmer==2.2.0 ; python_version >= "3.9" and python_version < "4.0" +sphinx-copybutton==0.5.2 ; python_version >= "3.9" and python_version < "4.0" +sphinx-intl==2.1.0 ; python_version >= "3.9" and python_version < "4.0" +sphinx-reredirects==0.1.3 ; python_version >= "3.9" and python_version < "4.0" +sphinx-rtd-theme==1.3.0 ; python_version >= "3.9" and python_version < "4.0" +sphinx==6.2.1 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-applehelp==1.0.8 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-bibtex==2.5.0 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-devhelp==1.0.6 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-htmlhelp==2.0.5 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-jquery==4.1 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-mermaid==0.8.1 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-qthelp==1.0.7 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-serializinghtml==1.1.10 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-svg2pdfconverter==1.2.2 ; python_version >= "3.9" and python_version < "4.0" +toml==0.10.2 ; python_version >= "3.9" and python_version < "4.0" +urllib3==2.2.1 ; python_version >= "3.9" and python_version < "4.0" +zipp==3.17.0 ; python_version >= "3.9" and python_version < "3.10" diff --git a/src/_locales/uk/LC_MESSAGES/appx/_keywords.po b/src/_locales/uk/LC_MESSAGES/appx/_keywords.po new file mode 100644 index 000000000..119daae8c --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/_keywords.po @@ -0,0 +1,166 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.09.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-24 21:59+0100\n" +"PO-Revision-Date: 2023-10-25 00:01+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/appx/_keywords.txt:1 +msgid "Python Keywords" +msgstr "Ключові слова мови Python" + +#: ../../src/appx/_keywords.txt:5 +msgid "``False``" +msgstr "``False``" + +#: ../../src/appx/_keywords.txt:5 +msgid "``await``" +msgstr "``await``" + +#: ../../src/appx/_keywords.txt:5 +msgid "``else``" +msgstr "``else``" + +#: ../../src/appx/_keywords.txt:5 +msgid "``import``" +msgstr "``import``" + +#: ../../src/appx/_keywords.txt:5 +msgid "``pass``" +msgstr "``pass``" + +#: ../../src/appx/_keywords.txt:7 +msgid "``None``" +msgstr "``None``" + +#: ../../src/appx/_keywords.txt:7 +msgid "``break``" +msgstr "``break``" + +#: ../../src/appx/_keywords.txt:7 +msgid "``except``" +msgstr "``except``" + +#: ../../src/appx/_keywords.txt:7 +msgid "``in``" +msgstr "``in``" + +#: ../../src/appx/_keywords.txt:7 +msgid "``raise``" +msgstr "``raise``" + +#: ../../src/appx/_keywords.txt:9 +msgid "``True``" +msgstr "``True``" + +#: ../../src/appx/_keywords.txt:9 +msgid "``class``" +msgstr "``class``" + +#: ../../src/appx/_keywords.txt:9 +msgid "``finally``" +msgstr "``finally``" + +#: ../../src/appx/_keywords.txt:9 +msgid "``is``" +msgstr "``is``" + +#: ../../src/appx/_keywords.txt:9 +msgid "``return``" +msgstr "``return``" + +#: ../../src/appx/_keywords.txt:11 +msgid "``and``" +msgstr "``and``" + +#: ../../src/appx/_keywords.txt:11 +msgid "``continue``" +msgstr "``continue``" + +#: ../../src/appx/_keywords.txt:11 +msgid "``for``" +msgstr "``for``" + +#: ../../src/appx/_keywords.txt:11 +msgid "``lambda``" +msgstr "``lambda``" + +#: ../../src/appx/_keywords.txt:11 +msgid "``try``" +msgstr "``try``" + +#: ../../src/appx/_keywords.txt:13 +msgid "``as``" +msgstr "``as``" + +#: ../../src/appx/_keywords.txt:13 +msgid "``def``" +msgstr "``def``" + +#: ../../src/appx/_keywords.txt:13 +msgid "``from``" +msgstr "``from``" + +#: ../../src/appx/_keywords.txt:13 +msgid "``nonlocal``" +msgstr "``nonlocal``" + +#: ../../src/appx/_keywords.txt:13 +msgid "``while``" +msgstr "``while``" + +#: ../../src/appx/_keywords.txt:15 +msgid "``assert``" +msgstr "``assert``" + +#: ../../src/appx/_keywords.txt:15 +msgid "``del``" +msgstr "``del``" + +#: ../../src/appx/_keywords.txt:15 +msgid "``global``" +msgstr "``global``" + +#: ../../src/appx/_keywords.txt:15 +msgid "``not``" +msgstr "``not``" + +#: ../../src/appx/_keywords.txt:15 +msgid "``with``" +msgstr "``with``" + +#: ../../src/appx/_keywords.txt:17 +msgid "``async``" +msgstr "``async``" + +#: ../../src/appx/_keywords.txt:17 +msgid "``elif``" +msgstr "``elif``" + +#: ../../src/appx/_keywords.txt:17 +msgid "``if``" +msgstr "``if``" + +#: ../../src/appx/_keywords.txt:17 +msgid "``or``" +msgstr "``or``" + +#: ../../src/appx/_keywords.txt:17 +msgid "``yield``" +msgstr "``yield``" diff --git a/src/_locales/uk/LC_MESSAGES/appx/assignments.po b/src/_locales/uk/LC_MESSAGES/appx/assignments.po new file mode 100644 index 000000000..a9c6abeb4 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/assignments.po @@ -0,0 +1,433 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:03+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/appx/assignments.txt:-1 +msgid "How-to handle in assignments via GitHub pull request(s)" +msgstr "Як працювати з призначеннями через GitHub pull request(и)" + +#: ../../src/appx/assignments.txt:-1 +msgid "Vladyslav Ponomaryov" +msgstr "Vladyslav Ponomaryov" + +#: ../../src/appx/assignments.txt:-1 +msgid "Serhii Horodilov sgorodil@gmail.com" +msgstr "Serhii Horodilov sgorodil@gmail.com" + +#: ../../src/appx/assignments.txt:-1 +msgid "git, github, pull request, review, merge, howto" +msgstr "git, github, pull request, review, merge, howto" + +#: ../../src/appx/assignments.txt:9 +msgid "Handing in Homework Assignments" +msgstr "Здача домашніх завдань" + +#: ../../src/appx/assignments.txt:13 +msgid "Repository content description" +msgstr "Опис вмісту репозиторію" + +#: ../../src/appx/assignments.txt:16 +msgid "What to include" +msgstr "Що потрібно включити" + +#: ../../src/appx/assignments.txt:18 +msgid "Code base" +msgstr "Кодова база" + +#: ../../src/appx/assignments.txt:19 +msgid "Project dependencies (if applicable)" +msgstr "Залежності проекту (якщо застосовно)" + +#: ../../src/appx/assignments.txt:20 +msgid "" +"*(Optional)* Additional project information: README, CONTRIBUTING, LICENSE " +"etc." +msgstr "" +"*(Додаткова)* інформація про проєкт: README, CONTRIBUTING, LICENSE тощо." + +#: ../../src/appx/assignments.txt:24 +msgid "" +"Always start new repository from creating ``README`` and ``.gitignore`` " +"files." +msgstr "" +"Завжди починайте новий репозиторій зі створення файлів ``README`` та ``." +"gitignore``." + +#: ../../src/appx/assignments.txt:28 +msgid "What to exclude" +msgstr "Що потрібно виключити" + +#: ../../src/appx/assignments.txt:30 +msgid "Virtual environment, typically ``venv`` or ``env`` folder" +msgstr "Віртуальне середовище, зазвичай папка ``venv`` або ``env``" + +#: ../../src/appx/assignments.txt:31 +msgid "Byte compiled Python code (``__pycache__``)" +msgstr "Байтовий скомпільований код Python (``__pycache__``)" + +#: ../../src/appx/assignments.txt:32 +msgid "IDE configurations, typically ``.vscode`` or ``.idea`` folder" +msgstr "Конфігурації IDE, зазвичай папка ``.vscode`` або ``.idea``" + +#: ../../src/appx/assignments.txt:33 +msgid "Database files, like ``db.sqlite3``" +msgstr "Файли баз даних, такі як ``db.sqlite3``" + +#: ../../src/appx/assignments.txt:34 +msgid "Other stuff not related to the assignment directly" +msgstr "Інші речі, не пов'язані з завданням безпосередньо" + +#: ../../src/appx/assignments.txt:37 +msgid "" +"Set up **.gitignore** to exclude all name patterns from appending to the " +"stage area. Common content of this file may look like:" +msgstr "" +"Налаштуйте **.gitignore**, щоб виключити всі шаблони назв з додавання до " +"області сцени. Типовий вміст цього файлу може виглядати так:" + +#: ../../src/appx/assignments.txt:48 +msgid "Repository initialization" +msgstr "Ініціалізація репозиторію" + +#: ../../src/appx/assignments.txt:50 +msgid "Create and activate virtual environment." +msgstr "Створіть та активуйте віртуальне середовище." + +#: ../../src/appx/assignments.txt:51 +msgid "Create common repository files:" +msgstr "Створіть загальні файли репозиторію:" + +#: ../../src/appx/assignments.txt:53 +msgid "README" +msgstr "README" + +#: ../../src/appx/assignments.txt:54 +msgid ".gitignore" +msgstr ".gitignore" + +#: ../../src/appx/assignments.txt:55 +msgid "requirements.txt *(if applicable)*" +msgstr "requirements.txt *(якщо застосовно)*" + +#: ../../src/appx/assignments.txt:57 +msgid "" +"*(Optional)* Create a code base draft. This can be an empty module like " +"**main.py** or an empty :ref:`Django project `." +msgstr "" +"*(Додатково)* Створіть чорновий варіант кодової бази. Це може бути порожній " +"модуль типу **main.py** або порожній :ref:`проект Django `." + +#: ../../src/appx/assignments.txt:59 +msgid "Initialize a new repository using ``git init`` command." +msgstr "Ініціалізуйте новий репозиторій за допомогою команди ``git init``." + +#: ../../src/appx/assignments.txt:60 +msgid "Set up **.gitignore** name patterns." +msgstr "Налаштуйте шаблони імен **.gitignore**." + +#: ../../src/appx/assignments.txt:61 +msgid "Stage your changes." +msgstr "Додайте зміни до stage-простору." + +#: ../../src/appx/assignments.txt:62 +msgid "Commit your changes." +msgstr "Зафіксуйте зміни." + +#: ../../src/appx/assignments.txt:63 +msgid "Set up remote repository." +msgstr "Налаштуйте віддалений репозиторій." + +#: ../../src/appx/assignments.txt:64 +msgid "Push changes from local branch to remote." +msgstr "Перенесіть зміни з локальної гілки на віддалену." + +#: ../../src/appx/assignments.txt:69 +msgid "Initializing new Django project" +msgstr "Ініціалізація нового проекту Django" + +#: ../../src/appx/assignments.txt:71 +msgid "" +"Base Django project may be added to the repository with the first commit. " +"Initialize Django project in current repository root to avoid directories " +"nesting." +msgstr "" +"Базовий проект Django може бути доданий до сховища з першим коммітом. " +"Ініціалізуйте проект Django у корені поточного сховища, щоб уникнути " +"вкладеності каталогів." + +#: ../../src/appx/assignments.txt:80 +msgid "Do not forget to create **requirements.txt**." +msgstr "Не забудьте створити **requirements.txt**." + +#: ../../src/appx/assignments.txt:82 +msgid "After that, you may proceed with \"staging\" and \"commit\" steps." +msgstr "Після цього ви можете перейти до етапів \"stage\" та \"commit\"." + +#: ../../src/appx/assignments.txt:86 +msgid "Sharing project dependencies" +msgstr "Спільний доступ до залежностей проекту" + +#: ../../src/appx/assignments.txt:88 +msgid "" +"The **requirements.txt** file is a plain text file that lists all the Python " +"packages required for a specific project. This file is used to specify " +"dependencies in a version-controlled and easily shareable manner. It allows " +"for a consistent environment across different team members' local setups." +msgstr "" +"Файл **requirements.txt** -- це звичайний текстовий файл, який містить " +"список усіх пакунків Python, необхідних для конкретного проекту. Цей файл " +"використовується для вказівки залежностей у спосіб, що дозволяє контролювати " +"версії та легко ділитися ними. Це дозволяє забезпечити узгодженість " +"середовища в локальних налаштуваннях різних членів команди." + +#: ../../src/appx/assignments.txt:94 +msgid "Where to place \"requirements.txt\" file" +msgstr "Де розмістити файл \"requirements.txt\"" + +#: ../../src/appx/assignments.txt:96 +msgid "" +"The **requirements.txt** file is generally placed in the root directory of " +"the project." +msgstr "" +"Файл **requirements.txt** зазвичай розміщується у кореневому каталозі " +"проекту." + +#: ../../src/appx/assignments.txt:100 +msgid "Creating \"requirements.txt\" file" +msgstr "Створення файлу \"requirements.txt\"" + +#: ../../src/appx/assignments.txt:102 +msgid "" +"To generate file use ``pip freeze`` command and place its output to a file:" +msgstr "" +"Щоб згенерувати файл, скористайтеся командою ``pip freeze`` і помістіть його " +"вивід у файл:" + +#: ../../src/appx/assignments.txt:108 +msgid "This will create **requirements.txt** file. Its content may look like:" +msgstr "" +"В результаті буде створено файл **requirements.txt**. Його вміст може мати " +"вигляд:" + +#: ../../src/appx/assignments.txt:119 +msgid "Installing dependencies from \"requirements.txt\" file" +msgstr "Встановлення залежностей з файлу \"requirements.txt\"" + +#: ../../src/appx/assignments.txt:121 +msgid "" +"Another team member may easily install all the requirements for the project " +"by using ``pip install`` command:" +msgstr "" +"Інший член команди може легко встановити всі вимоги до проекту за допомогою " +"команди ``pip install``:" + +#: ../../src/appx/assignments.txt:130 +msgid "Dealing with home tasks (challenges)" +msgstr "Вирішення домашніх завдань (викликів)" + +#: ../../src/appx/assignments.txt:132 +msgid "Create a new topic branch" +msgstr "Створити нову гілку завдання" + +#: ../../src/appx/assignments.txt:133 +msgid "Switch to a topic branch" +msgstr "Перейдіть до гілки завдання" + +#: ../../src/appx/assignments.txt:134 +msgid "Do the work and commit changes" +msgstr "Виконайте роботу та зафіксуйте зміни" + +#: ../../src/appx/assignments.txt:137 +msgid "You can create a new branch and immediately switch to it:" +msgstr "Ви можете створити нову гілку і одразу перейти до неї:" + +#: ../../src/appx/assignments.txt:144 +msgid "Creating a pull request" +msgstr "Створення запиту на злиття" + +#: ../../src/appx/assignments.txt:146 +msgid "" +"Make sure your working branch is up-to-date with the default one. You can " +"pull changes for the default branch and rebase your feature branch onto it." +msgstr "" +"Переконайтеся, що ваша робоча гілка оновлена ​​до стандартної. Ви можете " +"отримати зміни для гілки за замовчуванням і перебазувати свою гілку функції " +"на неї." + +#: ../../src/appx/assignments.txt:149 +msgid "" +"Push feature branch to the remote repository. By default, the current active " +"branch is pushed via ``git push`` command. You may need to set upstream " +"branch if it isn't yet." +msgstr "" +"Перенести гілку функції до віддаленого сховища. За замовчуванням, поточна " +"активна гілка виштовхується командою ``git push``. Можливо, вам доведеться " +"створити нову гілку, якщо вона ще не створена." + +#: ../../src/appx/assignments.txt:157 +msgid "" +"Navigate to your remote repository homepage on GitHub and switch to **Pull " +"requests** tab." +msgstr "" +"Перейдіть на головну сторінку вашого віддаленого сховища на GitHub і " +"перейдіть на вкладку **Pull requests**." + +#: ../../src/appx/assignments.txt:159 +msgid "Click **New pull request** button." +msgstr "Натисніть кнопку **New pull request**." + +#: ../../src/appx/assignments.txt:160 +msgid "" +"Select your default branch as *target* and your feature branch as *source*." +msgstr "Виберіть гілку за умовчанням як *ціль*, а робочу гілку як *джерело*." + +#: ../../src/appx/assignments.txt:162 +msgid "Click **Create pull request** button." +msgstr "Натисніть кнопку **Create pull request**." + +#: ../../src/appx/assignments.txt:163 +msgid "Provide meaningful title and a brief description for your pull request." +msgstr "Надайте змістовну назву та короткий опис вашого запиту." + +#: ../../src/appx/assignments.txt:164 +msgid "Submit pull request creation." +msgstr "Підтвердіть створення запиту." + +#: ../../src/appx/assignments.txt:165 +msgid "*(Optional)* Select reviewer(s) in **Reviewers** section." +msgstr "*(Необов'язково)* Виберіть рецензента(ів) у розділі **Reviewers**." + +#: ../../src/appx/assignments.txt:166 +msgid "Wait until your pull request is reviewed." +msgstr "Зачекайте, поки ваш запит буде розглянуто." + +#: ../../src/appx/assignments.txt:169 +msgid "Set up reviewers" +msgstr "Налаштування рецензентів" + +#: ../../src/appx/assignments.txt:171 +msgid "" +"You may share a link to pull request to a reviewer directly, but it's better " +"to set reviewer(s) on the pull request's page. Before you can select " +"reviewers, you need to add them as project contributors." +msgstr "" +"Ви можете надіслати посилання на запит безпосередньо рецензенту, але краще " +"вказати рецензента(ів) на сторінці запиту. Перш ніж ви зможете вибрати " +"рецензентів, вам потрібно додати їх як учасників проекту." + +#: ../../src/appx/assignments.txt:176 +msgid "Append collaborators" +msgstr "Додавання співавторів" + +#: ../../src/appx/assignments.txt:178 +msgid "" +"Reviews allow collaborators to comment on the changes proposed in pull " +"requests, approve the changes, or request further changes before the pull " +"request is merged. Repository administrators can require that pull requests " +"are approved before being merged." +msgstr "" +"Рецензії дозволяють учасникам коментувати зміни, запропоновані у запитах, " +"затверджувати їх або вимагати подальших змін до того, як запит буде " +"об'єднано. Адміністратори сховища можуть вимагати, щоб запити на вилучення " +"були затверджені перед об'єднанням." + +#: ../../src/appx/assignments.txt:183 +msgid "" +"Navigate to your repository homepage on GitHub and switch to **Settings** " +"tab." +msgstr "" +"Перейдіть на головну сторінку вашого сховища на GitHub і перейдіть на " +"вкладку **Налаштування**." + +#: ../../src/appx/assignments.txt:185 +msgid "Select **Collaborators and teams** menu item." +msgstr "Виберіть пункт меню **Collaborators and teams**." + +#: ../../src/appx/assignments.txt:186 +msgid "Under **Manage access** section click **Add people** button." +msgstr "У розділі **Manage access** натисніть кнопку ``Add people``." + +#: ../../src/appx/assignments.txt:187 +msgid "In modal window start typing GitHub username." +msgstr "У модальному вікні почніть вводити ім'я користувача GitHub." + +#: ../../src/appx/assignments.txt:188 +msgid "Select a contributor from the dropdown menu." +msgstr "Виберіть учасника зі спадного меню." + +#: ../../src/appx/assignments.txt:190 +msgid "This will send a *contributing request* to a specified user." +msgstr "Це надішле *запит* вказаному користувачеві." + +#: ../../src/appx/assignments.txt:193 +msgid "Merging changes" +msgstr "Об'єднання змін" + +#: ../../src/appx/assignments.txt:195 +msgid "" +"In case your pull request is **approved** - merge it to the trunk branch. " +"Select one of the options available:" +msgstr "" +"Якщо ваш pull request буде **схвалено** - об'єднайте його в основну гілку. " +"Виберіть один з доступних варіантів:" + +#: ../../src/appx/assignments.txt:198 +msgid "Create a merge commit" +msgstr "Create a merge commit" + +#: ../../src/appx/assignments.txt:199 +msgid "Rebase and merge" +msgstr "Rebase and merge" + +#: ../../src/appx/assignments.txt:200 +msgid "Squash and merge" +msgstr "Squash and merge" + +#: ../../src/appx/assignments.txt:202 +msgid "**Create a merge commit** suits in most of the cases." +msgstr "**Create a merge commit** підходить у більшості випадків." + +#: ../../src/appx/assignments.txt:205 +msgid "Making changes" +msgstr "Внесення змін" + +#: ../../src/appx/assignments.txt:207 +msgid "" +"In case your pull request is **rejected** or has comments - you may need to " +"provide some fixes." +msgstr "" +"Якщо ваш pull request буде **відхилено** або він матиме зауваження - вам " +"може знадобитися надати деякі виправлення." + +#: ../../src/appx/assignments.txt:210 +msgid "Do the work in your local topic branch" +msgstr "Виконайте роботу у вашій місцевій тематичній гілці" + +#: ../../src/appx/assignments.txt:211 +msgid "Push these changes to remote" +msgstr "Надішліть їх до гілки віддаленого репозиторію" + +#: ../../src/appx/assignments.txt:212 +msgid "Re-request review (if applicable)" +msgstr "Зробіть повторний запит на перегляд (за необхідності)" + +#: ../../src/appx/assignments.txt:213 +msgid "Wait until review is done" +msgstr "Дочекайтеся завершення перевірки" diff --git a/src/_locales/uk/LC_MESSAGES/appx/code_edit.po b/src/_locales/uk/LC_MESSAGES/appx/code_edit.po new file mode 100644 index 000000000..a7d577e57 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/code_edit.po @@ -0,0 +1,54 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:03+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/appx/code_edit.txt:-1 +msgid "Code editors and IDEs for Python" +msgstr "Редактори коду та IDE для Python" + +#: ../../src/appx/code_edit.txt:-1 +msgid "Serhii Horodilov sgorodil@gmail.com" +msgstr "Serhii Horodilov sgorodil@gmail.com" + +#: ../../src/appx/code_edit.txt:-1 +msgid "python, editor, ide" +msgstr "python, editor, ide" + +#: ../../src/appx/code_edit.txt:8 +msgid "Page is under construction" +msgstr "Сторінка в розробці" + +#: ../../src/appx/code_edit.txt:16 +msgid "Code Editors" +msgstr "Редактори Коду" + +#: ../../src/appx/code_edit.txt:18 +msgid "" +"Writing Python using IDLE or the Python Shell is great for simple things, " +"but those tools quickly turn larger programming projects into frustrating " +"pits of despair. Using an IDE, or even just a good dedicated code editor, " +"makes coding fun — but which one is best for you? :cite:`realpython:code-" +"edit`" +msgstr "" +"Написання на Python за допомогою IDLE або оболонки Python чудово підходить " +"для простих речей, але ці інструменти швидко перетворюють великі проекти " +"програмування на розчаровуючу яму відчаю. Використання IDE або навіть просто " +"хорошого спеціального редактора коду робить кодування цікавим — але який з " +"них найкращий для вас? :cite:`realpython:code-edit`" diff --git a/src/_locales/uk/LC_MESSAGES/appx/conv_store.po b/src/_locales/uk/LC_MESSAGES/appx/conv_store.po new file mode 100644 index 000000000..d402ef2d2 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/conv_store.po @@ -0,0 +1,558 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:02+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/appx/conv_store.txt:-1 +msgid "Convenience store challenge" +msgstr "Завдання: продуктовий магазин" + +#: ../../src/appx/conv_store.txt:-1 +msgid "Serhii Horodilov sgorodil@gmail.com" +msgstr "Serhii Horodilov sgorodil@gmail.com" + +#: ../../src/appx/conv_store.txt:-1 +msgid "python, basics, oop, object-oriented programming" +msgstr "python, basics, oop, object-oriented programming" + +#: ../../problem-sets/src/conv_store/challenge.rst:3 +msgid "Convenience Store Challenge" +msgstr "Convenience Store Challenge" + +#: ../../problem-sets/src/conv_store/challenge.rst:5 +msgid "" +"The local store is struggling with their payment registry system. The owner " +"asked you to take a look at it and to propose some ideas about the upgrade. " +"While looking on a wooden frames with rows of beads you think that this will " +"be a challenging task to bring a modern approach into this place and " +"reorganize the processes. Fortunately, you are a Python developer who knows " +"how to work with various data incomes and outcomes. After some time the " +"scope of works and timelines were discussed and wrote some notes to split " +"the entire project into individual pieces to implement step-by-step." +msgstr "" +"Місцевий магазин має проблеми з системою реєстрації платежів. Власник " +"попросив вас поглянути на нього та запропонувати деякі ідеї щодо оновлення. " +"Дивлячись на дерев'яні рами з рядами намистин, ви думаєте, це буде складним " +"завданням застосувати сучасний підхід до цього місця та реорганізувати " +"процеси. На щастя, ви розробник Python, який знає, як працювати з різними " +"доходами та результатами даних. Через деякий час обговорювалися обсяги робіт " +"і часові рамки та були написані деякі примітки, щоб розділити весь проект на " +"окремі частини для поетапної реалізації." + +#: ../../problem-sets/src/conv_store/challenge.rst:14 +msgid "Your notes are here," +msgstr "Ваші нотатки ось," + +#: ../../problem-sets/src/conv_store/challenge.rst:18 +msgid "Products and Carts" +msgstr "Товари та кошик" + +#: ../../problem-sets/src/conv_store/challenge.rst:20 +msgid "" +"It's a good idea to start with basics - the objects you're going to work " +"with. At stage one the main goal is to implement data models - classes to " +"work around data in the future." +msgstr "" +"Бажано почати з основ - об'єктів, з якими ви збираєтеся працювати. На " +"першому етапі головною метою є впровадження моделей даних - класів для " +"роботи з даними в майбутньому." + +#: ../../problem-sets/src/conv_store/challenge.rst:25 +msgid "Product" +msgstr "Товар" + +#: ../../problem-sets/src/conv_store/challenge.rst:27 +msgid "This class represents goods available to purchase in the store." +msgstr "Цей клас представляє товари, які можна придбати в магазині." + +#: ../../problem-sets/src/conv_store/challenge.rst:29 +msgid "Each product instance should have next attributes:" +msgstr "Кожен екземпляр продукту повинен мати такі атрибути:" + +#: ../../problem-sets/src/conv_store/challenge.rst:31 +msgid "``name`` - a product title (e.g. \"apple\", \"juice\")" +msgstr "``name`` - назва товару (прик. \"apple\", \"juice\")" + +#: ../../problem-sets/src/conv_store/challenge.rst:32 +msgid "``price`` - a price for a single product unit (e.g. 3655, 500, 12999)" +msgstr "``price`` - ціна за одну одиницю товару (прик. 3655, 500, 12999)" + +#: ../../problem-sets/src/conv_store/challenge.rst:33 +msgid "``unit`` - a size of a single product's unit (e.g. 1, 0.500, 12)" +msgstr "``unit`` - розмір одиниці окремого товару (прик. 1, 0.500, 12)" + +#: ../../problem-sets/src/conv_store/challenge.rst:35 +msgid "" +"For example: **apple** costs 1059 for each 0.1 kg. This means ``name`` will " +"store ``\"apple\"``, ``price`` is ``1059`` and ``unit`` is equal to ``0.1``." +msgstr "" +"Наприклад: **яблуко** коштує 1059 за кожні 0,1 кг. Це означає, що ``name`` " +"зберігає ``\"apple\"``, ``price`` є ``1059`` і `` unit`` дорівнює ``0,1``." + +#: ../../problem-sets/src/conv_store/challenge.rst:39 +msgid "" +"``Product`` class should implement ``get_total`` method to calculate a total " +"price for a specified quantity of a product to purchase. Desired quantity " +"will be passed as an optional argument of a numeric type (``int`` or " +"``float``). In case quantity argument is omitted - just use ``unit`` " +"attribute value instead." +msgstr "" +"Клас ``Product`` повинен реалізовувати метод ``get_total`` для обчислення " +"загальної ціни на вказану кількість товару для покупки. Бажану кількість " +"буде передано як необов'язковий аргумент числового типу (``int`` або " +"``float``). Якщо аргумент кількості пропущено, просто використовуйте " +"значення атрибута ``unit``." + +#: ../../problem-sets/src/conv_store/challenge.rst:46 +#: ../../problem-sets/src/conv_store/challenge.rst:77 +msgid "Code explanation" +msgstr "Пояснення коду" + +#: conv_store.models.Product:1 of +msgid "Product model implementation" +msgstr "Реалізація моделі товару" + +#: conv_store.models.Product conv_store.models.ShoppingCart of +msgid "Variables" +msgstr "Змінні" + +#: conv_store.models.Product:3 of +msgid "the name of a product" +msgstr "назва товару" + +#: conv_store.models.Product:5 of +msgid "the price for a single product unit" +msgstr "вартість однієї одиниці товару (прик. 3655, 500, 12999)" + +#: conv_store.models.Product:7 of +msgid "the size of a single product unit" +msgstr "розмір одиниці окремого товару (прик. 1, 0.500, 12)" + +#: conv_store.models.Product:10 of +msgid "Instances of this class represent a product available for purchase." +msgstr "Цей клас представляє товари, які можна придбати в магазині." + +#: conv_store.models.Product.get_total:1 of +msgid "Return the total price for a specified amount of a product" +msgstr "Повертає загальну ціну за вказану кількість товару" + +#: conv_store.models.Product.get_total +#: conv_store.models.ShoppingCart.add_product of +msgid "Parameters" +msgstr "Параметри" + +#: conv_store.models.Product.get_total:3 of +msgid "a quantity to purchase, defaults to None" +msgstr "кількість для покупки, за замовчуванням None" + +#: conv_store.models.Product.get_total conv_store.models.ShoppingCart.get_total +#: of +msgid "Returns" +msgstr "Повертає" + +#: conv_store.models.Product.get_total:6 of +msgid "total price for a specified amount of a product" +msgstr "вартість вказаної кількості товару" + +#: conv_store.models.Product.get_total conv_store.models.ShoppingCart.get_total +#: of +msgid "Return type" +msgstr "Тип повернення" + +#: conv_store.models.Product.get_total:9 of +msgid "" +"If the quantity argument is omitted, unit attribute value should be used " +"instead." +msgstr "" +"Якщо аргумент кількості пропущено, замість нього слід використовувати " +"значення атрибута одиниці." + +#: ../../problem-sets/src/conv_store/challenge.rst:51 +#: ../../problem-sets/src/conv_store/challenge.rst:82 +#: ../../problem-sets/src/conv_store/challenge.rst:126 +#: ../../problem-sets/src/conv_store/challenge.rst:189 +#: ../../problem-sets/src/conv_store/challenge.rst:224 +msgid "Test cases" +msgstr "Тестові приклади" + +#: ../../problem-sets/src/conv_store/challenge.rst:63 +msgid "Shopping Cart" +msgstr "Кошик для покупок" + +#: ../../problem-sets/src/conv_store/challenge.rst:65 +msgid "" +"This class represents the container for the products. It's main " +"responsibility is to store information about the purchases and their amount " +"(quantities)." +msgstr "" +"Цей клас представляє контейнер для продуктів. Його основна відповідальність " +"- зберігати інформацію про покупки та їх кількість." + +#: ../../problem-sets/src/conv_store/challenge.rst:68 +msgid "" +"Each cart instance should store data about ``Product`` objects in it and " +"corresponding quantity value for each individual product." +msgstr "" +"Кожен екземпляр кошика повинен зберігати дані про об'єкти ``Продукт`` у " +"ньому та відповідне значення кількості для кожного окремого продукту." + +#: ../../problem-sets/src/conv_store/challenge.rst:70 +msgid "" +"``ShoppingCart`` should implement ``add_product`` method to put a specified " +"quantity into a cart. ``quantity`` argument is optional, if omitted just " +"uses ``Product.unit`` value instead." +msgstr "" +"``ShoppingCart`` має реалізувати метод ``add_product``, щоб помістити " +"вказану кількість у кошик. Аргумент ``quantity`` є необов'язковим, якщо " +"пропущено, просто використовує натомість значення ``Product.unit``." + +#: ../../problem-sets/src/conv_store/challenge.rst:73 +msgid "" +"``ShoppingCart`` should implement ``get_total`` method to calculate the " +"total price for the entire cart contents." +msgstr "" +"``ShoppingCart`` має застосувати метод ``get_total`` для обчислення " +"загальної ціни всього вмісту кошика." + +#: conv_store.models.ShoppingCart:1 of +msgid "Shopping cart model implementation" +msgstr "Реалізація моделі кошика" + +#: conv_store.models.ShoppingCart:3 of +msgid "product appended to the shopping cart instance" +msgstr "товар, доданий до екземпляра кошика" + +#: conv_store.models.ShoppingCart:5 of +msgid "corresponding quantities for each product in cart" +msgstr "відповідна кількість для товару у кошику" + +#: conv_store.models.ShoppingCart:8 of +msgid "" +"In general shopping cart is a container for products. Instances of this " +"class handle product and corresponding quantity for each item inside a " +"shopping cart instance." +msgstr "" +"Загалом кошик для покупок – це контейнер для продуктів. Екземпляри цього " +"класу обробляють продукт і відповідну кількість для кожного товару в " +"екземплярі кошика для покупок." + +#: conv_store.models.ShoppingCart.add_product:1 of +msgid "Add product to the shopping cart" +msgstr "Додає товар до кошика" + +#: conv_store.models.ShoppingCart.add_product:3 of +msgid "a product instance to add to cart" +msgstr "екземпляр товару, щоб додати до кошика" + +#: conv_store.models.ShoppingCart.add_product:5 of +msgid "a quantity of a product to add. Defaults to the product unit value." +msgstr "" +"кількість продукту для додавання. За замовчуванням значення одиниці продукту." + +#: conv_store.models.ShoppingCart.add_product:9 of +msgid "" +"This method adds a product instance and corresponding quantity value to the " +"cart." +msgstr "" +"Цей метод додає екземпляр продукту та відповідне значення кількості до " +"кошика." + +#: conv_store.models.ShoppingCart.get_total:1 of +msgid "Return the total price for all the product in the cart" +msgstr "Повертає загальну вартість усіх товарів у кошику" + +#: conv_store.models.ShoppingCart.get_total:3 of +msgid "total cart price" +msgstr "загальна вартість кошика" + +#: ../../problem-sets/src/conv_store/challenge.rst:97 +msgid "Initialization, Representation and Type Casting" +msgstr "Ініціалізація, представлення та приведення типів" + +#: ../../problem-sets/src/conv_store/challenge.rst:99 +msgid "" +"It's difficult to set properties one-by-one, also it's not informative to " +"get default objects string representations. It's time to fix this." +msgstr "" +"Важко встановлювати властивості одну за одною, також " +"неінформативноотримувати представлення рядків об'єктів за замовчуванням. " +"Настав час це виправити." + +#: ../../problem-sets/src/conv_store/challenge.rst:102 +msgid "``Product`` should be initialized with all required data, no defaults." +msgstr "" +"``Product`` має бути ініціалізований усіма необхідними даними, без значень " +"за замовчуванням." + +#: ../../problem-sets/src/conv_store/challenge.rst:103 +msgid "" +"Apply ``ShoppingCart.__init__`` to separate products and quantities between " +"different carts." +msgstr "" +"Застосуйте ``ShoppingCart.__init__``, щоб розділити продукти та кількість " +"між різними візками." + +#: ../../problem-sets/src/conv_store/challenge.rst:105 +msgid "Provide a human readable representations. For example:" +msgstr "Надайте представлення, зрозумілі людині. Наприклад:" + +#: ../../problem-sets/src/conv_store/challenge.rst:107 +msgid "``Product('juice', 35.66, 1)``" +msgstr "``Product('juice', 35.66, 1)``" + +#: ../../problem-sets/src/conv_store/challenge.rst:108 +msgid "````" +msgstr "````" + +#: ../../problem-sets/src/conv_store/challenge.rst:110 +msgid "" +"While casting product instance to ``str`` type it should be equal to its " +"``name`` attribute value." +msgstr "" +"Під час приведення екземпляра продукту до типу ``str`` він повинен " +"дорівнювати значенню атрибута ``name``." + +#: ../../problem-sets/src/conv_store/challenge.rst:112 +msgid "" +"While casting product instance to ``float`` type it should be equal to its " +"``price`` attribute value." +msgstr "" +"Під час приведення екземпляра продукту до типу ``float`` він має дорівнювати " +"значенню його атрибута ``price``." + +#: ../../problem-sets/src/conv_store/challenge.rst:114 +msgid "" +"While casting shopping cart instance to ``float`` type it should be equal to " +"its total price value." +msgstr "" +"Під час приведення екземпляра кошика для покупок до типу ``float`` він має " +"дорівнювати загальному значенню ціни." + +#: ../../problem-sets/src/conv_store/challenge.rst:116 +msgid "" +"While casting shopping cart instance to ``bool`` consider it ``True`` if at " +"least one product is attach to current cart." +msgstr "" +"Під час трансляції екземпляра кошика для покупок до ``bool`` вважайте його " +"``True``, якщо принаймні один продукт приєднаний до поточного кошика." + +#: ../../problem-sets/src/conv_store/challenge.rst:119 +msgid "Implement equality operator support for your objects:" +msgstr "Запровадити підтримку оператора рівності для ваших об'єктів:" + +#: ../../problem-sets/src/conv_store/challenge.rst:121 +msgid "consider products equal if all their properties are the same" +msgstr "вважати продукти рівними, якщо всі їхні властивості однакові" + +#: ../../problem-sets/src/conv_store/challenge.rst:122 +msgid "" +"consider carts equal if products and corresponding quantities are the same" +msgstr "вважати кошики рівними, якщо продукти та відповідна кількість однакові" + +#: ../../problem-sets/src/conv_store/challenge.rst:148 +msgid "Payment Processors" +msgstr "Опрацювання платежів" + +#: ../../problem-sets/src/conv_store/challenge.rst:150 +msgid "" +"The owner asked you to implement a flexible payment system. Purchasing the " +"shopping card consists of several steps:" +msgstr "" +"Власник попросив вас запровадити гнучку платіжну систему. Придбання картки " +"покупок складається з кількох кроків:" + +#: ../../problem-sets/src/conv_store/challenge.rst:153 +msgid "cart validation - it should not be empty or already purchased" +msgstr "перевірка кошика - він не повинен бути порожнім або вже придбаним" + +#: ../../problem-sets/src/conv_store/challenge.rst:154 +msgid "payment validation - various payment types requires various validations" +msgstr "підтвердження платежу - різні типи платежу вимагають різних перевірок" + +#: ../../problem-sets/src/conv_store/challenge.rst:155 +msgid "purchasing the cart" +msgstr "купівля кошика" + +#: ../../problem-sets/src/conv_store/challenge.rst:157 +msgid "" +"For now there are two payment types available in the store: cash and credit " +"card, but they maybe extended at any time." +msgstr "" +"Наразі в магазині доступні два типи оплати: готівка та кредитна картка, але " +"їх можна продовжити в будь-який час." + +#: ../../problem-sets/src/conv_store/challenge.rst:160 +msgid "" +"Update the ``ShoppingCart`` class to handle ``purchased`` state. Make this " +"property *protected*, since it should not be accessed outside the card " +"instance." +msgstr "" +"Оновіть клас ``ShoppingCart`` для обробки стану ``purchased``. Зробіть цю " +"властивість *protected*, оскільки до неї не слід звертатися поза екземпляром " +"картки." + +#: ../../problem-sets/src/conv_store/challenge.rst:163 +msgid "" +"Implement ``PaymentValidator`` class with ``is_valid`` that takes no " +"arguments and return a value of a boolean type. This is an abstract class " +"for the future usage." +msgstr "" +"Реалізуйте клас ``PaymentValidator`` з ``is_valid``, який не приймає " +"аргументів і повертає значення логічного типу. Це абстрактний клас для " +"майбутнього використання." + +#: ../../problem-sets/src/conv_store/challenge.rst:166 +msgid "" +"Implement ``PaymentProcessor`` class with ``purchase`` method that takes a " +"``ShoppingCart`` object and returns nothing. This is an abstract class for " +"the future usage." +msgstr "" +"Реалізуйте клас ``PaymentProcessor`` з методом ``purchase``, який бере " +"об'єкт ``ShoppingCart`` і нічого не повертає. Це абстрактний клас для " +"майбутнього використання." + +#: ../../problem-sets/src/conv_store/challenge.rst:169 +msgid "" +"Inherit ``CashPaymentValidator`` from the base validator. The instances of " +"this class are considered to be always valid." +msgstr "" +"Успадкувати ``CashPaymentValidator`` від базового валідатора. Екземпляри " +"цього класу вважаються завжди дійсними." + +#: ../../problem-sets/src/conv_store/challenge.rst:171 +msgid "Inherit ``CodeValidator`` from the base validator." +msgstr "Успадкувати ``CodeValidator`` від основного валідатора." + +#: ../../problem-sets/src/conv_store/challenge.rst:173 +msgid "" +"The instances of this class are created with ``security_code`` argument." +msgstr "" +"Екземпляри цього класу створено за допомогою аргументу ``security_code``." + +#: ../../problem-sets/src/conv_store/challenge.rst:174 +msgid "" +"``is_valid`` method should ask a customer for a security code and check it " +"against the stored value. In case codes are equal payment considered to be " +"valid." +msgstr "" +"Метод ``is_valid`` має запитати у клієнта код безпеки та перевірити його зі " +"збереженим значенням. Якщо коди однакові, оплата вважається дійсною." + +#: ../../problem-sets/src/conv_store/challenge.rst:178 +msgid "" +"Create ``CashPaymentProcessor`` that combines ``CashValidator`` and " +"``PaymentProcessor`` behaviors. While purchasing the cart the messages " +"\"Processing cash payment...\" and \"Cart bill: {float total}\" should be " +"printed out." +msgstr "" +"Створіть ``CashPaymentProcessor``, який поєднує поведінку ``CashValidator`` " +"і ``PaymentProcessor``. Під час купівлі в кошику з'являються повідомлення " +"\"Обробка готівкового платежу...\" і \"Рахунок у кошику : {float total}\" " +"слід роздрукувати." + +#: ../../problem-sets/src/conv_store/challenge.rst:183 +msgid "" +"Create ``CardPaymentProcessor`` that combines ``CodeValidator`` and " +"``PaymentProcessor`` behaviors. While purchasing the cart the messages " +"\"Processing card payment...\" and \"Security code: {code}\" should be " +"printed out." +msgstr "" +"Створіть ``CardPaymentProcessor``, який поєднує поведінку ``CodeValidator`` " +"і ``PaymentProcessor``. Під час купівлі кошику слід роздрукувати " +"повідомлення \"Обробка платежу карткою...\" і \"Код безпеки : {code}\"." + +#: ../../problem-sets/src/conv_store/challenge.rst:203 +msgid "More Enhancements for Shopping Carts" +msgstr "Більше покращень для кошиків для покупок" + +#: ../../problem-sets/src/conv_store/challenge.rst:205 +msgid "Make your ``ShoppingCart`` an actual container" +msgstr "Зробіть ваш ``ShoppingCart`` справжнім контейнером" + +#: ../../problem-sets/src/conv_store/challenge.rst:207 +msgid "" +"Implement ``len(cart_obj)`` and make it return the number of products in the " +"cart." +msgstr "" +"Реалізуйте ``len(cart_obj)`` і змусьте його повертати кількість продуктів у " +"кошику." + +#: ../../problem-sets/src/conv_store/challenge.rst:209 +msgid "" +"Implement ``cart[...]`` behavior to take a ``tuple`` containing product and " +"corresponding quantity (type hint: ``Tuple[Product, Union[int, float]]``)." +msgstr "" +"Реалізуйте поведінку ``cart[...]``, щоб повертати ``tuple``, що містить " +"товар та відповідну кількість (type hint: ``Tuple[Product, Union[int, " +"float]]``)." + +#: ../../problem-sets/src/conv_store/challenge.rst:213 +msgid "" +"Make your ``ShoppingCart`` iterable - let it provide the product instance " +"and corresponding quantity for each iteration." +msgstr "" +"Зробіть ваш ``ShoppingCart`` повторюваним - дозвольте йому надавати " +"примірник продукту та відповідну кількість для кожної ітерації." + +#: ../../problem-sets/src/conv_store/challenge.rst:215 +msgid "" +"Avoid products duplication. In case someone tries to put the product into a " +"cart and this product already is present there, do not it for the second " +"time - adjust corresponding quantity value instead." +msgstr "" +"Уникайте дублювання продуктів. Якщо хтось намагається покласти продукт у " +"кошик, і цей продукт уже там присутній, не робіть цього вдруге - змініть " +"натомість відповідне значення кількості." + +#: ../../problem-sets/src/conv_store/challenge.rst:218 +msgid "" +"Implement ``remove_product`` method to completely remove some product from " +"the cart." +msgstr "" +"Застосуйте метод ``remove_product``, щоб повністю видалити деякі продукти з " +"кошика." + +#: ../../problem-sets/src/conv_store/challenge.rst:220 +msgid "" +"Implement ``sub_product`` to decrease some product quantity. If quantity is " +"equal to 0 (zero) or less - remove product from the cart." +msgstr "" +"Застосуйте ``sub_product``, щоб зменшити кількість продукту. Якщо кількість " +"дорівнює 0 (нуль) або менше - вилучіть продукт із кошика." + +#: ../../problem-sets/src/conv_store/challenge.rst:249 +msgid "Testing Software" +msgstr "Тестування програмного забезпечення" + +#: ../../problem-sets/src/conv_store/challenge.rst:251 +msgid "Add autotests for ``ShoppingCart`` and ``Product`` models." +msgstr "Додати автотести для моделей ``ShoppingCart`` і ``Product``." + +#: ../../problem-sets/src/conv_store/challenge.rst:253 +msgid "Tests should be located inside of \"tests\" directory." +msgstr "Тести мають бути розташовані всередині каталогу \"tests\"." + +#: ../../problem-sets/src/conv_store/challenge.rst:254 +msgid "``pytest`` and ``coverage`` libraries will be used for testing." +msgstr "" +"Для тестування використовуватимуться бібліотеки ``pytest`` і ``coverage``." + +#: ../../problem-sets/src/conv_store/challenge.rst:255 +msgid "Project dependencies are to be updated." +msgstr "Залежності проекту потрібно оновити." diff --git a/src/_locales/uk/LC_MESSAGES/appx/env_path.po b/src/_locales/uk/LC_MESSAGES/appx/env_path.po new file mode 100644 index 000000000..1a071966c --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/env_path.po @@ -0,0 +1,40 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:02+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/appx/env_path.txt:-1 +msgid "Setting up environment variables" +msgstr "Встановлення змінних середовища" + +#: ../../src/appx/env_path.txt:-1 +msgid "Serhii Horodilov sgorodil@gmail.com" +msgstr "Serhii Horodilov sgorodil@gmail.com" + +#: ../../src/appx/env_path.txt:-1 +msgid "settings, environment, variables" +msgstr "settings, environment, variables" + +#: ../../src/appx/env_path.txt:8 +msgid "Page is under construction" +msgstr "Сторінка в розробці" + +#: ../../src/appx/env_path.txt:16 +msgid "Issue - System Environment PATH" +msgstr "Проблема - System Environment PATH" diff --git a/src/_locales/uk/LC_MESSAGES/appx/pg_func_ops.po b/src/_locales/uk/LC_MESSAGES/appx/pg_func_ops.po new file mode 100644 index 000000000..b22c1cb1b --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/pg_func_ops.po @@ -0,0 +1,190 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-16 13:55+0000\n" +"PO-Revision-Date: 2023-12-22 14:26+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Poedit 3.4.1\n" + +#: ../../src/appx/pg_func_ops.txt:4 +msgid "Comparison" +msgstr "Порівняння" + +#: ../../src/appx/pg_func_ops.txt:7 +msgid "Comparison predicates" +msgstr "Предикати порівняння" + +#: ../../src/appx/pg_func_ops.txt:11 +msgid "Test if a value is within the range endpoints (inclusive)" +msgstr "" +"Перевірка, чи знаходиться значення в межах кінцевих точок діапазону (включно)" + +#: ../../src/appx/pg_func_ops.txt:20 +msgid "Not between (the negation of BETWEEN)." +msgstr "Не між (заперечення ПОМІЖ)." + +#: ../../src/appx/pg_func_ops.txt:28 +msgid "Between, after sorting the two endpoint values." +msgstr "Між, після сортування двох кінцевих значень." + +#: ../../src/appx/pg_func_ops.txt:36 +msgid "Not between, after sorting the two endpoint values." +msgstr "Не між, після сортування двох кінцевих значень." + +#: ../../src/appx/pg_func_ops.txt:44 +msgid "Not equal, treating null as a comparable value." +msgstr "Не дорівнює, розглядаючи нуль як порівнянне значення." + +#: ../../src/appx/pg_func_ops.txt:53 +msgid "Equal, treating null as a comparable value." +msgstr "Дорівнює, розглядаючи нуль як порівнянне значення." + +#: ../../src/appx/pg_func_ops.txt:62 +msgid "Test whether value is null." +msgstr "Перевірити, чи значення рівне нулю." + +#: ../../src/appx/pg_func_ops.txt:70 +msgid "Test whether value is not null." +msgstr "Перевірити, чи значення не рівне нулю." + +#: ../../src/appx/pg_func_ops.txt:78 +msgid "Test whether value is null (nonstandard syntax)." +msgstr "Перевірити, чи значення рівне нулю (нестандартний синтаксис)." + +#: ../../src/appx/pg_func_ops.txt:82 +msgid "Test whether value is not null (nonstandard syntax)." +msgstr "Перевірити, чи значення не є null (нестандартний синтаксис)." + +#: ../../src/appx/pg_func_ops.txt:86 +msgid "Test whether boolean expression yields true." +msgstr "Перевірте, чи дає булевий вираз значення true." + +#: ../../src/appx/pg_func_ops.txt:95 +msgid "Test whether boolean expression yields false or unknown." +msgstr "Перевірте, чи дає булевий вираз значення false або невідоме." + +#: ../../src/appx/pg_func_ops.txt:104 +msgid "Test whether boolean expression yields false." +msgstr "Перевірте, чи дає булевий вираз значення false." + +#: ../../src/appx/pg_func_ops.txt:113 +msgid "Test whether boolean expression yields true or unknown." +msgstr "Перевірте, чи дає булевий вираз значення true або unknown." + +#: ../../src/appx/pg_func_ops.txt:122 +msgid "Test whether boolean expression yields unknown." +msgstr "Перевірити, чи дає булевий вираз невідоме." + +#: ../../src/appx/pg_func_ops.txt:131 +msgid "Test whether boolean expression yields true or false." +msgstr "Перевірте, чи дає булевий вираз значення true або false." + +#: ../../src/appx/pg_func_ops.txt:139 +msgid "Comparison functions" +msgstr "Функції порівняння" + +#: ../../src/appx/pg_func_ops.txt:143 +msgid "Returns the number of non-null arguments" +msgstr "Повертає кількість ненульових аргументів" + +#: ../../src/appx/pg_func_ops.txt:151 +msgid "Returns the number of null arguments" +msgstr "Повертає кількість нульових аргументів" + +#: ../../src/appx/pg_func_ops.txt:158 +msgid "Mathematical functions and operators" +msgstr "Математичні функції та оператори" + +#: ../../src/appx/pg_func_ops.txt:162 +msgid "Addition" +msgstr "Додавання" + +#: ../../src/appx/pg_func_ops.txt:170 +msgid "Unary plus (no operation)" +msgstr "Унарний плюс (без операції)" + +#: ../../src/appx/pg_func_ops.txt:178 +msgid "Subtraction" +msgstr "Віднімання" + +#: ../../src/appx/pg_func_ops.txt:186 +msgid "Negation" +msgstr "Заперечення" + +#: ../../src/appx/pg_func_ops.txt:194 +msgid "Multiplication" +msgstr "Множення" + +#: ../../src/appx/pg_func_ops.txt:202 +msgid "" +"Division (for integral types, division truncates the result towards zero)" +msgstr "Ділення (для інтегральних типів ділення усікає результат до нуля)" + +#: ../../src/appx/pg_func_ops.txt:214 +msgid "" +"Modulo (remainder); available for smallint, integer, bigint, and numeric" +msgstr "" +"За модулем (залишок); доступний для smallint, integer, bigint та numeric" + +#: ../../src/appx/pg_func_ops.txt:223 +msgid "Exponentiation" +msgstr "Піднесення до степеня" + +#: ../../src/appx/pg_func_ops.txt:229 +msgid "" +"Unlike typical mathematical practice, multiple uses of ``^`` will associate " +"left to right by default:" +msgstr "" +"На відміну від типової математичної практики, багаторазове використання " +"``^`` за замовчуванням асоціюється зліва направо:" + +#: ../../src/appx/pg_func_ops.txt:239 +msgid "Square root" +msgstr "Квадратний корінь" + +#: ../../src/appx/pg_func_ops.txt:247 +msgid "Cube root" +msgstr "Кубічний корінь" + +#: ../../src/appx/pg_func_ops.txt:255 +msgid "Absolute value" +msgstr "Абсолютне значення" + +#: ../../src/appx/pg_func_ops.txt:263 +msgid "Bitwise AND" +msgstr "Побітове І" + +#: ../../src/appx/pg_func_ops.txt:271 +msgid "Bitwise OR" +msgstr "Порозрядне АБО" + +#: ../../src/appx/pg_func_ops.txt:279 +msgid "Bitwise exclusive OR" +msgstr "Побітове виключне АБО" + +#: ../../src/appx/pg_func_ops.txt:287 +msgid "Bitwise NOT" +msgstr "Побітове НІ" + +#: ../../src/appx/pg_func_ops.txt:295 +msgid "Bitwise shift left" +msgstr "Порозрядний зсув вліво" + +#: ../../src/appx/pg_func_ops.txt:303 +msgid "Bitwise shift right" +msgstr "Порозрядний зсув вправо" diff --git a/src/_locales/uk/LC_MESSAGES/appx/pg_local.po b/src/_locales/uk/LC_MESSAGES/appx/pg_local.po new file mode 100644 index 000000000..ce3c85b48 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/pg_local.po @@ -0,0 +1,26 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-16 13:55+0000\n" +"PO-Revision-Date: 2023-12-21 04:02+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Poedit 3.4.1\n" + +#: ../../src/appx/pg_local.txt:11 +msgid "PostgreSQL server binaries" +msgstr "Бінарні файли сервера PostgreSQL" diff --git a/src/_locales/uk/LC_MESSAGES/appx/postgres.po b/src/_locales/uk/LC_MESSAGES/appx/postgres.po new file mode 100644 index 000000000..2a2af66f9 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/postgres.po @@ -0,0 +1,94 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-16 13:55+0000\n" +"PO-Revision-Date: 2023-12-22 14:19+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Poedit 3.4.1\n" + +#: ../../src/appx/postgres.txt:5 +msgid "PostgreSQL" +msgstr "PostgreSQL" + +#: ../../src/appx/postgres.txt:8 +msgid "Overview" +msgstr "Огляд" + +#: ../../src/appx/postgres.txt:10 +msgid "" +"PostgreSQL is a powerful, open source object-relational database system that " +"uses and extends the SQL language combined with many features that safely " +"store and scale the most complicated data workloads." +msgstr "" +"PostgreSQL - це потужна об'єктно-реляційна система баз даних з відкритим " +"вихідним кодом, яка використовує і розширює мову SQL у поєднанні з багатьма " +"функціями, що дозволяють безпечно зберігати і масштабувати найскладніші " +"структури даних." + +#: ../../src/appx/postgres.txt:14 +msgid "" +"PostgreSQL has earned a strong reputation for its proven architecture, " +"reliability, data integrity, robust feature set, extensibility, and the " +"dedication of the open source community behind the software to consistently " +"deliver performant and innovative solutions." +msgstr "" +"PostgreSQL завоювала міцну репутацію завдяки своїй перевіреній архітектурі, " +"надійності, цілісності даних, потужному набору функцій, розширюваності та " +"прагненню спільноти розробників програмного забезпечення з відкритим " +"вихідним кодом постійно створювати ефективні та інноваційні рішення." + +#: ../../src/appx/postgres.txt:21 +msgid "" +"PostgreSQL runs on **all major operating systems**, and is ACID compliant." +msgstr "" +"PostgreSQL працює на **всіх основних операційних системах** і сумісна з ACID." + +#: ../../src/appx/postgres.txt:25 +msgid "Installation" +msgstr "Встановлення" + +#: ../../src/appx/postgres.txt:27 +msgid "" +"If you are not able to install postgres to your local computer, it is " +"possible to use binaries distributions. Refer :doc:`Local PostgreSQL server " +"using binaries <./pg_local>` for more information." +msgstr "" +"Якщо ви не можете встановити postgres на ваш локальний комп'ютер, ви можете " +"скористатися бінарними дистрибутивами. Зверніться до :doc:`Локальний сервер " +"PostgreSQL за допомогою двійкових файлів <./pg_local>` для отримання " +"додаткової інформації." + +#: ../../src/appx/postgres.txt:32 +msgid "" +"PostgreSQL is available for download as ready-to-use packages or installers " +"for various platforms, as well as a source code archive if you want to build " +"it yourself." +msgstr "" +"PostgreSQL доступна для завантаження у вигляді готових до використання " +"пакетів або інсталяторів для різних платформ, а також у вигляді архіву " +"вихідного коду, якщо ви хочете зібрати її самостійно." + +#: ../../src/appx/postgres.txt:36 +msgid "" +"Refer to `PostgreSQL downloads`_ page to get the installer for your " +"operating system. Follow the installation process instruction to get " +"postgres server running on your local computer." +msgstr "" +"Зверніться до сторінки `Завантаження PostgreSQL`_, щоб отримати інсталятор " +"для вашої операційної системи. Дотримуйтесь інструкцій процесу встановлення, " +"щоб запустити сервер postgres на вашому локальному комп'ютері." diff --git a/src/_locales/uk/LC_MESSAGES/appx/precedence.po b/src/_locales/uk/LC_MESSAGES/appx/precedence.po new file mode 100644 index 000000000..e94075d6c --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/precedence.po @@ -0,0 +1,231 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:02+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/appx/precedence.txt:-1 +msgid "Operator precedence in Python" +msgstr "Пріоритет операторів в Python" + +#: ../../src/appx/precedence.txt:-1 +msgid "Serhii Horodilov sgorodil@gmail.com" +msgstr "Serhii Horodilov sgorodil@gmail.com" + +#: ../../src/appx/precedence.txt:-1 +msgid "python, basics, operator, precedence" +msgstr "python, basics, operator, precedence" + +#: ../../src/appx/precedence.txt:8 +msgid "Operator Precedence" +msgstr "Пріоритет Операторів" + +#: ../../src/appx/precedence.txt:10 +msgid "" +"The following table summarizes the operator precedence in Python, from " +"highest precedence (most binding) to lowest precedence (least binding) :cite:" +"`docs-python:operator-precedence`. Operators in the same cell have the same " +"precedence (use left-to-right precedence)." +msgstr "" +"У наведеній нижче таблиці підсумовано пріоритет операторів у Python від " +"найвищого пріоритету (найбільш обов'язковий) до найнижчого пріоритету " +"(найменший обов'язковий) :cite:`docs-python:operator-precedence`. Оператори " +"в одній клітинці мають однаковий пріоритет (використовуйте пріоритет зліва " +"направо)." + +#: ../../src/appx/precedence.txt:16 +msgid "Operator" +msgstr "Оператор" + +#: ../../src/appx/precedence.txt:16 +msgid "Description" +msgstr "Опис" + +#: ../../src/appx/precedence.txt:18 +msgid "" +"``(expressions...)``, ``[expressions...]``, ``{key: value...}``, " +"``{expressions...}``" +msgstr "" +"``(expressions...)``, ``[expressions...]``, ``{key: value...}``, " +"``{expressions...}``" + +#: ../../src/appx/precedence.txt:18 +msgid "" +"Binding or parenthesized expression, list display, dictionary display, set " +"display" +msgstr "" +"Прив'язка або вираз у дужках, відображення списку, відображення словника, " +"відображення набору" + +#: ../../src/appx/precedence.txt:23 +msgid "``x[index]``, ``x[index:index]``, ``x(arguments...)``, ``x.attribute``" +msgstr "``x[index]``, ``x[index:index]``, ``x(arguments...)``, ``x.attribute``" + +#: ../../src/appx/precedence.txt:23 +msgid "Subscription, slicing, call, attribute reference" +msgstr "Підписка, нарізка, виклик, посилання на атрибути" + +#: ../../src/appx/precedence.txt:28 +msgid "``await x``" +msgstr "``await x``" + +#: ../../src/appx/precedence.txt:28 +msgid "Await expression" +msgstr "Вираз Await" + +#: ../../src/appx/precedence.txt:30 +msgid "``**``" +msgstr "``**``" + +#: ../../src/appx/precedence.txt:30 +msgid "Exponentiation [#]_" +msgstr "Піднесення до степеня [#]_" + +#: ../../src/appx/precedence.txt:32 +msgid "``+x``, ``-x``, ``~x``" +msgstr "``+x``, ``-x``, ``~x``" + +#: ../../src/appx/precedence.txt:32 +msgid "Positive, negative, bitwise NOT" +msgstr "Позитивне, негативне, побітове НІ" + +#: ../../src/appx/precedence.txt:34 +msgid "``*``, ``@``, ``/``, ``//``, ``%``" +msgstr "``*``, ``@``, ``/``, ``//``, ``%``" + +#: ../../src/appx/precedence.txt:34 +msgid "" +"Multiplication, matrix multiplication, division, floor division, remainder " +"[#]_" +msgstr "Множення, матричне множення, ділення, поверхове ділення, залишок [#]_" + +#: ../../src/appx/precedence.txt:37 +msgid "``+``, ``-``" +msgstr "``+``, ``-``" + +#: ../../src/appx/precedence.txt:37 +msgid "Addition and subtraction" +msgstr "Додавання і віднімання" + +#: ../../src/appx/precedence.txt:39 +msgid "``<<``, ``>>``" +msgstr "``<<``, ``>>``" + +#: ../../src/appx/precedence.txt:39 +msgid "Shifts" +msgstr "Зсуви" + +#: ../../src/appx/precedence.txt:41 +msgid "``&``" +msgstr "``&``" + +#: ../../src/appx/precedence.txt:41 +msgid "Bitwise AND" +msgstr "Побітове І" + +#: ../../src/appx/precedence.txt:43 +msgid "``^``" +msgstr "``^``" + +#: ../../src/appx/precedence.txt:43 +msgid "Bitwise XOR" +msgstr "Побітове XOR" + +#: ../../src/appx/precedence.txt:45 +msgid "``|``" +msgstr "``|``" + +#: ../../src/appx/precedence.txt:45 +msgid "Bitwise OR" +msgstr "Порозрядне АБО" + +#: ../../src/appx/precedence.txt:47 +msgid "" +"``in``, ``not in``, ``is``, ``is not``, ``<``, ``<=``, ``>``, ``>=``, " +"``==``, ``!=``" +msgstr "" +"``in``, ``not in``, ``is``, ``is not``, ``<``, ``<=``, ``>``, ``>=``, " +"``==``, ``!=``" + +#: ../../src/appx/precedence.txt:47 +msgid "Comparisons, including membership tests and identity tests" +msgstr "Порівняння, включаючи тести на приналежність і тести на ідентифікацію" + +#: ../../src/appx/precedence.txt:52 +msgid "``not x``" +msgstr "``not x``" + +#: ../../src/appx/precedence.txt:52 +msgid "Boolean NOT" +msgstr "Логічне НІ" + +#: ../../src/appx/precedence.txt:54 +msgid "``and``" +msgstr "``and``" + +#: ../../src/appx/precedence.txt:54 +msgid "Boolean AND" +msgstr "Логічне І" + +#: ../../src/appx/precedence.txt:56 +msgid "``or``" +msgstr "``or``" + +#: ../../src/appx/precedence.txt:56 +msgid "Boolean OR" +msgstr "Логічне АБО" + +#: ../../src/appx/precedence.txt:58 +msgid "``if - else``" +msgstr "``if - else``" + +#: ../../src/appx/precedence.txt:58 +msgid "Conditional expression (ternary ``if``)" +msgstr "Умовний вираз (трійковий ``if``)" + +#: ../../src/appx/precedence.txt:60 +msgid "``lambda``" +msgstr "``lambda``" + +#: ../../src/appx/precedence.txt:60 +msgid "Lambda expression" +msgstr "Lambda вирази" + +#: ../../src/appx/precedence.txt:62 +msgid "``=``, ``:=``" +msgstr "``=``, ``:=``" + +#: ../../src/appx/precedence.txt:62 +msgid "Assignment expression" +msgstr "Оперетор присвоєння" + +#: ../../src/appx/precedence.txt:65 +msgid "" +"the power operator binds less tightly than an arithmetic or bitwise unary " +"operator on its right (``2 ** -1`` is ``0.5``)." +msgstr "" +"оператор степені прив'язує менш тісно, ніж арифметичний або порозрядний " +"унарний оператор праворуч (``2 ** -1`` це ``0,5``)." + +#: ../../src/appx/precedence.txt:67 +msgid "" +"the ``%`` operator is also used for string formatting; the same precedence " +"applies." +msgstr "" +"оператор ``%`` також використовується для форматування рядків; " +"застосовується той самий пріоритет." diff --git a/src/_locales/uk/LC_MESSAGES/appx/printf.po b/src/_locales/uk/LC_MESSAGES/appx/printf.po new file mode 100644 index 000000000..f80d80ef8 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/printf.po @@ -0,0 +1,244 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-26 23:58+0200\n" +"PO-Revision-Date: 2023-12-27 00:02+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.14.0\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/appx/printf.txt:-1 +msgid "Formatted strings usage in Python" +msgstr "Використання форматованих рядків в Python" + +#: ../../src/appx/printf.txt:-1 +msgid "Serhii Horodilov sgorodil@gmail.com" +msgstr "Serhii Horodilov sgorodil@gmail.com" + +#: ../../src/appx/printf.txt:-1 +msgid "python, string, formatting" +msgstr "python, string, formatting" + +#: ../../src/appx/printf.txt:10 +msgid "String Formatting: printf-style" +msgstr "Форматування рядка: стиль printf" + +#: ../../src/appx/printf.txt:12 +msgid "" +"String objects have one unique built-in operation: the ``%`` operator " +"(modulo). This is also known as the string *formatting* or *interpolation* " +"operator :cite:`docs-python:printf-formatting`. Given ``format % values`` " +"(where *format* is a string), ``%`` conversion specifications in *format* " +"are replaced with zero or more elements of *values*. If *format* requires a " +"single argument, *values* may be a single non-tuple object." +msgstr "" +"Рядкові об'єкти мають одну унікальну вбудовану операцію: оператор ``%`` (по " +"модулю). Це також відоме як оператор *форматування* рядка або " +"*інтерполяції* :cite:`docs-python:printf-formatting`. Враховуючи ``формат % " +"значень`` (де *format* є рядком), ``%`` специфікації перетворення у *format* " +"замінюються нулем або більше елементами *значень*. Якщо для *format* " +"потрібен один аргумент, *values* може бути одним некортежним об'єктом." + +#: ../../src/appx/printf.txt:19 +msgid "The conversion flag characters are:" +msgstr "Символи перетворення:" + +#: ../../src/appx/printf.txt:22 +msgid "Flag" +msgstr "Символ" + +#: ../../src/appx/printf.txt:22 ../../src/appx/printf.txt:40 +msgid "Meaning" +msgstr "Значення" + +#: ../../src/appx/printf.txt:24 +msgid "``#``" +msgstr "``#``" + +#: ../../src/appx/printf.txt:24 +msgid "The value conversion will use the \"alternative form\"" +msgstr "Перетворення значень використовуватиме \"альтернативну форму\"" + +#: ../../src/appx/printf.txt:26 +msgid "``0``" +msgstr "``0``" + +#: ../../src/appx/printf.txt:26 +msgid "The conversion will be zero padded for numeric values" +msgstr "Перетворення буде доповнено нулем для числових значень" + +#: ../../src/appx/printf.txt:28 +msgid "``'-'``" +msgstr "``'-'``" + +#: ../../src/appx/printf.txt:28 +msgid "" +"The converted value is left adjusted (override the ``'0'`` if both are given)" +msgstr "" +"Перетворене значення коригується зліва (замініть ``'0'``, якщо надано обидва)" + +#: ../../src/appx/printf.txt:31 +msgid "``' '``" +msgstr "``' '``" + +#: ../../src/appx/printf.txt:31 +msgid "(a space) A blank should be left before a positive number" +msgstr "(пробіл) Перед додатним числом слід залишити пробіл" + +#: ../../src/appx/printf.txt:33 +msgid "``'+'``" +msgstr "``'+'``" + +#: ../../src/appx/printf.txt:33 +msgid "" +"A sign character (``'+'`` or ``'-'``) will precede the conversion (overrides " +"a \"space\" flag)" +msgstr "" +"Символ знака (``'+'`` або ``'-'``) передуватиме перетворенню (перевизначає " +"прапор \"пробіл\")" + +#: ../../src/appx/printf.txt:37 +msgid "The conversion types are:" +msgstr "Типи перетворення:" + +#: ../../src/appx/printf.txt:40 +msgid "Conversion" +msgstr "Перетворення" + +#: ../../src/appx/printf.txt:42 +msgid "``'d'``" +msgstr "``'d'``" + +#: ../../src/appx/printf.txt:42 ../../src/appx/printf.txt:44 +msgid "Signed integer decimal" +msgstr "Ціле десяткове число зі знаком" + +#: ../../src/appx/printf.txt:44 +msgid "``'i'``" +msgstr "``'i'``" + +#: ../../src/appx/printf.txt:46 +msgid "``'o'``" +msgstr "``'o'``" + +#: ../../src/appx/printf.txt:46 +msgid "Signed octal value" +msgstr "Вісімкове значення зі знаком" + +#: ../../src/appx/printf.txt:48 +msgid "``'u'``" +msgstr "``'u'``" + +#: ../../src/appx/printf.txt:48 +msgid "Obsolete type - it is identical to ``'d'``" +msgstr "Застарілий тип - ідентичний ``'d``" + +#: ../../src/appx/printf.txt:50 +msgid "``'x'``" +msgstr "``'x'``" + +#: ../../src/appx/printf.txt:50 +msgid "Signed hexadecimal (lowercase)" +msgstr "Шістнадцяткове число зі знаком (маленький регістр)" + +#: ../../src/appx/printf.txt:52 +msgid "``'X'``" +msgstr "``'X'``" + +#: ../../src/appx/printf.txt:52 +msgid "Signed hexadecimal (uppercase)" +msgstr "Шістнадцяткове число зі знаком (верхній регістр)" + +#: ../../src/appx/printf.txt:54 +msgid "``'e'``" +msgstr "``'e'``" + +#: ../../src/appx/printf.txt:54 +msgid "Floating point exponential format (lowercase)" +msgstr "Експоненціальний формат із плаваючою комою (нижній регістр)" + +#: ../../src/appx/printf.txt:56 +msgid "``'E'``" +msgstr "``'E'``" + +#: ../../src/appx/printf.txt:56 +msgid "Floating point exponential format (uppercase)" +msgstr "Експоненціальний формат із плаваючою комою (верхній регістр)" + +#: ../../src/appx/printf.txt:58 +msgid "``'f'`` ``'F'``" +msgstr "``'f'`` ``'F'``" + +#: ../../src/appx/printf.txt:58 +msgid "Floating point decimal format" +msgstr "Десятковий формат із плаваючою комою" + +#: ../../src/appx/printf.txt:61 +msgid "``'g'``" +msgstr "``'g'``" + +#: ../../src/appx/printf.txt:64 +msgid "``'G'``" +msgstr "``'G'``" + +#: ../../src/appx/printf.txt:61 +msgid "" +"Floating point format. Uses lowercase exponential format if exponent is less " +"that -4 or not less than precision, decimal format otherwise." +msgstr "" +"Формат з плаваючою комою. Використовує нижній регістр експоненціального " +"формату, якщо показник степеня менший за -4 або не менший за точність, " +"десятковий формат інакше." + +#: ../../src/appx/printf.txt:66 +msgid "``'c'``" +msgstr "``'c'``" + +#: ../../src/appx/printf.txt:66 +msgid "Single character (accepts integer or single character string)" +msgstr "Один символ (приймає ціле число або рядок з одним символом)" + +#: ../../src/appx/printf.txt:68 +msgid "``'r'``" +msgstr "``'r'``" + +#: ../../src/appx/printf.txt:68 +msgid "Converts any Python object using ``repr()``" +msgstr "Перетворює будь-який об'єкт Python за допомогою ``repr()``" + +#: ../../src/appx/printf.txt:70 +msgid "``'s'``" +msgstr "``'s'``" + +#: ../../src/appx/printf.txt:70 +msgid "Converts any Python object using ``str()``" +msgstr "Перетворює будь-який об'єкт Python за допомогою ``str()``" + +#: ../../src/appx/printf.txt:72 +msgid "``'a'``" +msgstr "``'a'``" + +#: ../../src/appx/printf.txt:72 +msgid "Converts any Python object using ``ascii()``" +msgstr "Перетворює будь-який об'єкт Python за допомогою ``ascii()``" + +#: ../../src/appx/printf.txt:74 +msgid "``'%'``" +msgstr "``'%'``" + +#: ../../src/appx/printf.txt:74 +msgid "" +"No arguments is converted, results in a ``'%'`` character in the result." +msgstr "Жодні аргументи не перетворюються, результатом є символ ``'%'``." diff --git a/src/_locales/uk/LC_MESSAGES/appx/software_list.po b/src/_locales/uk/LC_MESSAGES/appx/software_list.po new file mode 100644 index 000000000..feb15d794 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/software_list.po @@ -0,0 +1,305 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-01-08 18:40+0200\n" +"PO-Revision-Date: 2024-01-08 18:43+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.14.0\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/appx/software_list.rst:-1 +msgid "Useful software list" +msgstr "Список корисного програмного забезпечення" + +#: ../../src/appx/software_list.rst:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/appx/software_list.rst:-1 +msgid "software" +msgstr "software" + +#: ../../src/appx/software_list.rst:7 +msgid "Software List" +msgstr "Список Програмного Забезпечення" + +#: ../../src/appx/software_list.rst:10 +msgid "yEd - Graph editor" +msgstr "yEd - Graph editor" + +#: ../../src/appx/software_list.rst:12 +msgid "" +"yEd is a powerful desktop application that can be used to quickly and " +"effectively generate high-quality diagrams. Create diagrams manually, or " +"import your external data for analysis. Our automatic layout algorithms " +"arrange even large data sets with just the press of a button. yEd is freely " +"available and runs on all major platforms: Windows, Unix/Linux, and macOS." +msgstr "" +"yEd - це потужний застосунок, який можна використовувати для швидкого та " +"ефективного створення високоякісних діаграм. Створюйте діаграми вручну або " +"імпортуйте зовнішні дані для аналізу. Алгоритми автоматичної побудови " +"впорядковують навіть великі набори даних одним натисканням кнопки. yEd є " +"вільно доступним і працює на всіх основних платформах: Windows, Unix/Linux " +"та macOS." + +#: ../../src/appx/software_list.rst:19 +msgid "https://www.yworks.com/products/yed" +msgstr "https://www.yworks.com/products/yed" + +#: ../../src/appx/software_list.rst:21 +msgid "" +"`Online live version `_ is also " +"available." +msgstr "" +"Також доступна `онлайн-версія `_." + +#: ../../src/appx/software_list.rst:25 +msgid "7zip" +msgstr "7zip" + +#: ../../src/appx/software_list.rst:27 +msgid "**7-Zip** is **free software** with **open source**." +msgstr "" +"**7-Zip** — це **вільне програмне забезпечення** з **відкритим кодом**." + +#: ../../src/appx/software_list.rst:29 +msgid "" +"High compression ratio in `7z format `__ with " +"**LZMA** and **LZMA2** compression" +msgstr "" +"Високий ступінь стиснення у `7z format `__ зі " +"стисненням **LZMA** і **LZMA2**" + +#: ../../src/appx/software_list.rst:31 +msgid "Supported formats:" +msgstr "Підтримувані формати:" + +#: ../../src/appx/software_list.rst:33 +msgid "Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM" +msgstr "Пакування / розпакування: 7z, XZ, BZIP2, GZIP, TAR, ZIP і WIM" + +#: ../../src/appx/software_list.rst:34 +msgid "" +"Unpacking only: APFS, AR, ARJ, CAB, CHM, CPIO, CramFS, DMG, EXT, FAT, GPT, " +"HFS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, RAR, RPM, SquashFS, " +"UDF, UEFI, VDI, VHD, VHDX, VMDK, XAR and Z." +msgstr "" +"Лише розпакування: APFS, AR, ARJ, CAB, CHM, CPIO, CramFS, DMG, EXT, FAT, " +"GPT, HFS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, RAR, RPM, " +"SquashFS , UDF, UEFI, VDI, VHD, VHDX, VMDK, XAR і Z." + +#: ../../src/appx/software_list.rst:38 +msgid "Self-extracting capability for 7z format" +msgstr "Можливість саморозпакування для формату 7z" + +#: ../../src/appx/software_list.rst:39 +msgid "Integration with Windows Shell" +msgstr "Інтеграція з Windows Shell" + +#: ../../src/appx/software_list.rst:41 +msgid "https://7-zip.org/" +msgstr "https://7-zip.org/" + +#: ../../src/appx/software_list.rst:44 +msgid "cygwin" +msgstr "cygwin" + +#: ../../src/appx/software_list.rst:46 +msgid "" +"It is a large collection of GNU and Open Source tools which provide " +"functionality similar to a `Linux distribution `__ on Windows and a DLL (cygwin1.dll) which " +"provides substantial POSIX API functionality." +msgstr "" +"Це велика колекція інструментів GNU та Open Source, які забезпечують " +"функціональність, подібну до `дистрибутива Linux `__ у Windows та DLL (cygwin1.dll), яка забезпечує " +"значний POSIX Функціонал API." + +#: ../../src/appx/software_list.rst:52 +msgid "**Cygwin is not**:" +msgstr "**Сygwin це не**:" + +#: ../../src/appx/software_list.rst:54 +msgid "" +"a way to run native Linux apps on Windows. You must rebuild your application " +"*from source* if you want it to run on Windows." +msgstr "" +"спосіб запуску рідних програм Linux у Windows. Ви повинні перебудувати свою " +"програму *з вихідного коду*, якщо ви хочете, щоб вона запускалася в Windows." + +#: ../../src/appx/software_list.rst:56 +msgid "" +"a way to magically make native Windows apps aware of UNIX® functionality " +"like ``signals``, ``ptys`` etc. Again, you need to build your apps *from " +"source* if you want to take advantage of Cygwin functionality." +msgstr "" +"спосіб чарівним чином зробити рідні програми Windows відомими " +"функціональності UNIX®, як-от `signals`, `ptys` тощо. Знову ж таки, вам " +"потрібно створити свої програми *з джерела*, якщо ви хочете скористатися " +"перевагами функціональності Cygwin." + +#: ../../src/appx/software_list.rst:61 +msgid "https://www.cygwin.com/" +msgstr "https://www.cygwin.com/" + +#: ../../src/appx/software_list.rst:64 +msgid "git [#cygwin]_" +msgstr "git [#cygwin]_" + +#: ../../src/appx/software_list.rst:66 +msgid "" +"Git is a `free and open source `__ distributed version control system designed to handle everything " +"from small to very large projects with speed and efficiency." +msgstr "" +"Git — це `безкоштовна система з відкритим вихідним кодом `__ розподілена система контролю версій, " +"призначена для швидкого та ефективного керування всіма проектами, від малих " +"до дуже великих." + +#: ../../src/appx/software_list.rst:71 +msgid "https://git-scm.com/" +msgstr "https://git-scm.com/" + +#: ../../src/appx/software_list.rst:74 +msgid "Docker" +msgstr "Docker" + +#: ../../src/appx/software_list.rst:76 +msgid "The most-loved Tool in Stack Overflow’s 2022 Developer Survey." +msgstr "" +"Найулюбленіший інструмент в опитуванні розробників Stack Overflow за 2022 " +"рік." + +#: ../../src/appx/software_list.rst:78 +msgid "" +"Docker helps developers bring their ideas to life by conquering the " +"complexity of app development. We simplify and accelerate development " +"workflows with an integrated dev pipeline and through the consolidation of " +"application components. Actively used by millions of developers around the " +"world, Docker Desktop and Docker Hub provide unmatched simplicity, agility " +"and choice." +msgstr "" +"Docker допомагає розробникам втілювати свої ідеї в життя, долаючи складність " +"розробки програм. Ми спрощуємо та прискорюємо робочі процеси розробки за " +"допомогою інтегрованого конвеєра розробників і консолідації компонентів " +"програми. Активно використовувані мільйонами розробників у всьому світі " +"Docker Desktop і Docker Hub забезпечують неперевершену простоту, гнучкість і " +"вибір." + +#: ../../src/appx/software_list.rst:85 +msgid "https://www.docker.com/" +msgstr "https://www.docker.com/" + +#: ../../src/appx/software_list.rst:88 +msgid "PostgreSQL [#cygwin]_" +msgstr "PostgreSQL [#cygwin]_" + +#: ../../src/appx/software_list.rst:90 +msgid "" +"PostgreSQL is a powerful, open source object-relational database system with " +"over 35 years of active development that has earned it a strong reputation " +"for reliability, feature robustness, and performance." +msgstr "" +"PostgreSQL — це потужна об'єктно-реляційна база даних з відкритим вихідним " +"кодом, активна розробка якої триває понад 35 років, завдяки чому вона " +"заслужила міцну репутацію надійності, надійності функцій і продуктивності." + +#: ../../src/appx/software_list.rst:94 +msgid "https://www.postgresql.org/" +msgstr "https://www.postgresql.org/" + +#: ../../src/appx/software_list.rst:97 +msgid "psql [#cygwin]_" +msgstr "psql [#cygwin]_" + +#: ../../src/appx/software_list.rst:99 +msgid "" +"A terminal-based front-end to PostgreSQL. It enables you to type in queries " +"interactively, issue them to PostgreSQL, and see the query results. " +"Alternatively, input can be from a file or from command line arguments. In " +"addition, psql provides a number of meta-commands and various shell-like " +"features to facilitate writing scripts and automating a wide variety of " +"tasks." +msgstr "" +"Термінальний інтерфейс для PostgreSQL. Це дозволяє вводити запити в " +"інтерактивному режимі, надсилати їх у PostgreSQL і переглядати результати " +"запиту. Крім того, введення може бути з файлу або з аргументів командного " +"рядка. Крім того, psql надає низку мета-команд і різноманітних функцій, " +"подібних до оболонки, для полегшення написання сценаріїв і автоматизації " +"різноманітних завдань." + +#: ../../src/appx/software_list.rst:106 +msgid "" +"On Windows it will be installed within PostgreSQL RDBMS. For macOS and Linux " +"look for ``postgresql-client`` package." +msgstr "" +"У Windows його буде встановлено в СУБД PostgreSQL. Для macOS і Linux " +"знайдіть пакет ``postgresql-client``." + +#: ../../src/appx/software_list.rst:109 +msgid "https://www.postgresql.org/docs/current/app-psql.html" +msgstr "https://www.postgresql.org/docs/current/app-psql.html" + +#: ../../src/appx/software_list.rst:112 +msgid "pgAdmin" +msgstr "pgAdmin" + +#: ../../src/appx/software_list.rst:114 +msgid "" +"pgAdmin is the most popular and feature rich Open Source administration and " +"development platform for PostgreSQL, the most advanced Open Source database " +"in the world." +msgstr "" +"pgAdmin — це найпопулярніша та багатофункціональна платформа адміністрування " +"та розробки з відкритим кодом для PostgreSQL, найдосконалішої бази даних з " +"відкритим кодом у світі." + +#: ../../src/appx/software_list.rst:118 +msgid "It is a PostgreSQL client (like a ``psql``), but with web based GUI." +msgstr "" +"Це клієнт PostgreSQL (як ``psql``), але з графічним інтерфейсом на основі " +"веб-інтерфейсу." + +#: ../../src/appx/software_list.rst:120 +msgid "https://pgadmin.org/" +msgstr "https://pgadmin.org/" + +#: ../../src/appx/software_list.rst:123 +msgid "SQLite [#cygwin]_" +msgstr "SQLite [#cygwin]_" + +#: ../../src/appx/software_list.rst:125 +msgid "" +"SQLite is a C-language library that implements a `small `__, `fast `__, `self-" +"contained `__, `high-reliability " +"`__, `full-featured `__, SQL database engine." +msgstr "" +"SQLite — це бібліотека мовою C, яка реалізує `маленьку `__, `швидку `__, " +"`самодостатню `__, `висока надійність " +"`__, `повнофункціональний `__, двигун бази даних SQL." + +#: ../../src/appx/software_list.rst:133 +msgid "https://sqlite.org/" +msgstr "https://sqlite.org/" + +#: ../../src/appx/software_list.rst:136 +msgid "available for installation as a cygwin package" +msgstr "доступно для встановлення як пакет cygwin" diff --git a/src/_locales/uk/LC_MESSAGES/appx/wtk.po b/src/_locales/uk/LC_MESSAGES/appx/wtk.po new file mode 100644 index 000000000..036e269b7 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/appx/wtk.po @@ -0,0 +1,575 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:01+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/appx/wtk.txt:-1 +msgid "Knights, thieves and wizards game project" +msgstr "Проект гри рицарі, злодії та чарівники" + +#: ../../src/appx/wtk.txt:-1 +msgid "Serhii Horodilov sgorodil@gmail.com" +msgstr "Serhii Horodilov sgorodil@gmail.com" + +#: ../../src/appx/wtk.txt:-1 +msgid "python, game, oop, object-oriented programming" +msgstr "python, game, oop, object-oriented programming" + +#: ../../problem-sets/src/wtk/challenge.rst:3 +msgid "Wizards, Thieves and Knights" +msgstr "Чарівники, Злодії та Рицарі" + +#: ../../problem-sets/src/wtk/challenge.rst:5 +msgid "" +"\"Wizards, Thieves and Knights\" (:abbr:`WTK (Wizards, Thieves and " +"Knights)`) game is a \"Paper, Rock and Scissors\" clone but in a fantasy " +"setting. It comes with a simple command line interface where the use must " +"type in his or her choice. The enemy is controlled by the script. The " +"player's goal is to gain as many score points, as it possible." +msgstr "" +"Гра \"Чарівники, Злодії та Рицарі\" (:abbr:`WTK (Wizards, Thieves and " +"Knights)`) — це клон \"Камень, ножиці, бумага\", але у фентезійному " +"сеттингу. Вона має простий інтерфейс командного рядка, де користувач повинен " +"ввести свій вибір. Ворогом керує скрипт. Мета гравця - набрати якомога " +"більше очок." + +#: ../../problem-sets/src/wtk/challenge.rst:13 +msgid "Code organization" +msgstr "Організація коду" + +#: ../../problem-sets/src/wtk/challenge.rst:15 +msgid "Use separate modules to maintain your code base. For example:" +msgstr "" +"Використовуйте окремі модулі для підтримки вашої кодової бази. Наприклад:" + +#: ../../problem-sets/src/wtk/challenge.rst:27 +msgid "General playground description" +msgstr "Загальний опис ігрового процесу" + +#: ../../problem-sets/src/wtk/challenge.rst:29 +msgid "" +"The game process is divided into rounds. Each round consists of **attack** " +"and **defence** stages. Rounds are repeated, until player is defeated." +msgstr "" +"Процес гри поділено на раунди. Кожен раунд складається з етапів атаки та " +"захисту. Раунди повторюються, поки гравець не буде переможений." + +#: ../../problem-sets/src/wtk/challenge.rst:33 +msgid "Fight rules" +msgstr "Правила боротьби" + +#: ../../problem-sets/src/wtk/challenge.rst:35 +msgid "It's simple..." +msgstr "Це просто..." + +#: ../../problem-sets/src/wtk/challenge.rst:37 +msgid "**Wizard** beats **Knight**" +msgstr "**Чарівник** перемагає **Рицаря**" + +#: ../../problem-sets/src/wtk/challenge.rst:38 +msgid "**Thief** beats **Wizard**" +msgstr "**Злодій** перемагає **Чарівника**" + +#: ../../problem-sets/src/wtk/challenge.rst:39 +msgid "**Knight** beats **Thief**" +msgstr "**Рицар** перемагає **Злодія**" + +#: ../../problem-sets/src/wtk/challenge.rst:42 +msgid "Attack stage" +msgstr "Стадія атаки" + +#: ../../problem-sets/src/wtk/challenge.rst:44 +msgid "" +"Player selects the choice to attack from **wizard**, **thief** or " +"**knight**, enemy selects the choice for defence from the same options by " +"random. If the attack is successful:" +msgstr "" +"Гравець обирає для атаки **чарівника**, **злодія** або **лицаря**, ворог " +"обирає захист з тих самих варіантів випадковим чином. Якщо атака успішна:" + +#: ../../problem-sets/src/wtk/challenge.rst:48 +msgid "enemy health is decreased" +msgstr "здоров'я ворога зменшено" + +#: ../../problem-sets/src/wtk/challenge.rst:49 +msgid "player gains score points" +msgstr "гравець отримує очки" + +#: ../../problem-sets/src/wtk/challenge.rst:51 +msgid "In case enemy is defeated:" +msgstr "Якщо ворог переможений:" + +#: ../../problem-sets/src/wtk/challenge.rst:53 +msgid "a new enemy instance is initialized using higher level" +msgstr "новий екземпляр ворога ініціалізовано з використанням вищого рівня" + +#: ../../problem-sets/src/wtk/challenge.rst:54 +msgid "player gains some extra score points" +msgstr "гравець отримує додаткові очки" + +#: ../../problem-sets/src/wtk/challenge.rst:55 +msgid "next defence stage is skipped, and player attacks again" +msgstr "наступний етап захисту пропущено, і гравець атакує знову" + +#: ../../problem-sets/src/wtk/challenge.rst:58 +msgid "Defence stage" +msgstr "Стадія захисту" + +#: ../../problem-sets/src/wtk/challenge.rst:60 +msgid "" +"Player selects the choice to defend from **wizard**, **thief** or " +"**knight**, enemy selects the choice to attack from the same options by " +"random. If the attack is successful:" +msgstr "" +"Гравець вибір для захисту **чарівника**, **злодія** або **рицаря**, ворог " +"обирає для атаки з тих же варіантів випадковим чином. Якщо атака успішна:" + +#: ../../problem-sets/src/wtk/challenge.rst:64 +msgid "player health is decreased" +msgstr "здоров'я гравця знижено" + +#: ../../problem-sets/src/wtk/challenge.rst:66 +msgid "If player is defeated:" +msgstr "Якщо гравець переможений:" + +#: ../../problem-sets/src/wtk/challenge.rst:68 +msgid "report the message about gained score points to the terminal" +msgstr "повідомляти повідомлення про набрані бали на термінал" + +#: ../../problem-sets/src/wtk/challenge.rst:69 +msgid "write down player's name and score points to \"scores.txt\" file" +msgstr "запишіть ім'я гравця та наберіть очки до файлу \"scores.txt\"" + +#: ../../problem-sets/src/wtk/challenge.rst:73 +msgid "Exceptions" +msgstr "Винятки" + +#: ../../problem-sets/src/wtk/challenge.rst:76 +msgid "Enemy down" +msgstr "Ворога переможено" + +#: ../../problem-sets/src/wtk/challenge.rst:78 +msgid "" +"This is an exceptional scenario when enemy is defeated. A custom exception " +"``EnemyDown`` should be used to track these cases. Exception should provide " +"the details on the enemy's instance, especially its level." +msgstr "" +"Це винятковий сценарій, коли ворог зазнає поразки. Щоб відстежувати ці " +"випадки, слід використовувати налаштований виняток ``EnemyDown``. Виняток " +"повинен надавати деталі про екземпляр ворога, особливо його рівень." + +#: of wtk.exceptions.EnemyDown:1 +msgid "Raised when an enemy is defeated" +msgstr "Виникає, коли ворог переможений" + +#: ../../problem-sets/src/wtk/challenge.rst:85 +msgid "Game over" +msgstr "Гра завершена" + +#: ../../problem-sets/src/wtk/challenge.rst:87 +msgid "" +"This is an exceptional scenario when player is defeated. A custom exception " +"``GameOver`` should be used to track these cases. Exception should provide " +"the details on the player's instance, especially its score points." +msgstr "" +"Це винятковий сценарій, коли гравець зазнає поразки. Щоб відстежувати ці " +"випадки, слід використовувати спеціальний виняток ``GameOver``. Виняток " +"повинен надавати деталі про екземпляр гравця, особливо його результати бали." + +#: of wtk.exceptions.GameOver:1 +msgid "Raised when a player is defeated" +msgstr "Виникає, коли гравця переможено" + +#: ../../problem-sets/src/wtk/challenge.rst:95 +msgid "Models" +msgstr "Моделі" + +#: ../../problem-sets/src/wtk/challenge.rst:98 +msgid "Enemy" +msgstr "Ворог" + +#: of wtk.models.Enemy:1 +msgid "Enemy model" +msgstr "Модель супротивника" + +#: of wtk.models.Enemy wtk.models.Player +msgid "Variables" +msgstr "Змінні" + +#: of wtk.models.Enemy:3 +msgid "enemy's level value" +msgstr "значення рівня противника" + +#: of wtk.models.Enemy:5 +msgid "enemy's instance health points" +msgstr "очки здоров'я ворога" + +#: of wtk.models.Enemy:8 +msgid "Represents the playing enemy-bot." +msgstr "Представляє граючого ворога-бота." + +#: of wtk.models.Enemy.__init__:1 wtk.models.Player.__init__:1 +msgid "Initialize instance" +msgstr "Ініціалізувати екземпляр" + +#: of wtk.models.Enemy.__init__ wtk.models.Player.__init__ +msgid "Parameters" +msgstr "Параметри" + +#: of wtk.models.Enemy.__init__:3 +msgid "an enemy's level indicator" +msgstr "індикатор рівня противника" + +#: of wtk.models.Enemy.__init__:6 +msgid "Health value is equal to the level value." +msgstr "Значення здоров'я дорівнює значенню рівня." + +#: of wtk.models.Enemy.decrease_health:1 wtk.models.Player.decrease_health:1 +msgid "Decrease health points" +msgstr "Зменшує очоки здоров'я" + +#: of wtk.models.Enemy.decrease_health wtk.models.Player.decrease_health +msgid "raise" +msgstr "raise" + +#: of wtk.models.Enemy.decrease_health:3 +msgid "EnemyDown" +msgstr "EnemyDown" + +#: of wtk.models.Enemy.decrease_health:5 +msgid "" +"This method decreases the health meter value. When it comes to be less than " +"1 (one) an ``EnemyDown`` exception is raised." +msgstr "" +"Цей метод зменшує значення індикатора працездатності. Коли значення менше 1 " +"(одного), виникає виняток ``EnemyDown``." + +#: of wtk.models.Enemy.select_attack:1 wtk.models.Enemy.select_defence:1 +msgid "Return a random fight choice" +msgstr "Повертає випадковий варіант для бою" + +#: of wtk.engine.get_player_name wtk.models.Enemy.select_attack +#: wtk.models.Enemy.select_defence wtk.models.Player.select_attack +#: wtk.models.Player.select_defence +msgid "Returns" +msgstr "Повертає" + +#: of wtk.models.Enemy.select_attack:3 wtk.models.Enemy.select_defence:3 +#: wtk.models.Player.select_attack:3 wtk.models.Player.select_defence:3 +msgid "a fight choice" +msgstr "варіант для бою" + +#: of wtk.models.Enemy.select_attack:5 wtk.models.Enemy.select_defence:5 +msgid "Choices made by an enemy are random." +msgstr "Вибори, зроблені супротивником, випадкові." + +#: ../../problem-sets/src/wtk/challenge.rst:104 +msgid "You are free to implement other methods you like, if needed." +msgstr "" +"Ви можете використовувати інші методи, які вам подобаються, якщо потрібно." + +#: ../../problem-sets/src/wtk/challenge.rst:107 +msgid "Player" +msgstr "Гравець" + +#: of wtk.models.Player:1 +msgid "Player model" +msgstr "Модель гравця" + +#: of wtk.models.Player:3 +msgid "player's name" +msgstr "ім'я гравця" + +#: of wtk.models.Player:5 +msgid "player's instance health points" +msgstr "очки здоров'я гравця" + +#: of wtk.models.Player:7 +msgid "player's instance gained score points" +msgstr "очки, зароблені гравцем" + +#: of wtk.models.Player:10 +msgid "This model is controlled by the player." +msgstr "Ця модель керується гравцем." + +#: of wtk.models.Player.__init__:3 +msgid "a player's name" +msgstr "ім'я гравця" + +#: of wtk.models.Player.__init__:6 +msgid "" +"This method performs player instance initialization. It set instance name, " +"initial score points value and health." +msgstr "" +"Цей метод виконує ініціалізацію примірника програвача. Він встановлює назву " +"екземпляра, значення початкових балів і здоров'я." + +#: of wtk.models.Player.attack:1 +msgid "Attack an enemy" +msgstr "Атакує ворога" + +#: of wtk.models.Player.attack:3 +msgid "" +"Perform attack on an enemy instance. This method takes an enemy instance as " +"an argument. After that, it takes attack choice from the player model and " +"the defence choice from an enemy model. After fight result calculation " +"required operation are to be performed (decrease enemy health, assign score " +"points etc.). Based on fight result should print out a message:" +msgstr "" +"Виконати атаку на екземпляр противника. Цей метод приймає екземпляр " +"противника як аргумент. Після цього він приймає вибір атаки з моделі гравця " +"та вибір захисту з моделі противника. Після результату битви потрібно " +"виконати обчислення, необхідні операції (зменшити здоров'я ворога, " +"призначити очки тощо). На основі результату бою має видрукувати\" " +"\"повідомлення:" + +#: of wtk.models.Player.attack:10 +msgid "\"YOUR ATTACK IS SUCCESSFUL!\"" +msgstr "\"YOUR ATTACK IS SUCCESSFUL!\"" + +#: of wtk.models.Player.attack:11 +msgid "\"YOUR ATTACK IS FAILED!\"" +msgstr "\"YOUR ATTACK IS FAILED!\"" + +#: of wtk.models.Player.attack:12 wtk.models.Player.defence:12 +msgid "\"IT'S A DRAW!\"" +msgstr "\"IT'S A DRAW!\"" + +#: of wtk.models.Player.decrease_health:3 +msgid "GameOver" +msgstr "GameOver" + +#: of wtk.models.Player.decrease_health:5 +msgid "" +"This method decreases the health meter value. When it comes to be less than " +"1 (one) an ``GameOver`` exception is raised." +msgstr "" +"Цей метод зменшує значення індикатора працездатності. Коли значення менше 1 " +"(одного), виникає виняток ``GameOver``." + +#: of wtk.models.Player.defence:1 +msgid "Defend from an enemy's attack" +msgstr "Захист від атаки супротивника" + +#: of wtk.models.Player.defence:3 +msgid "" +"Perform defence from an enemy attack. This method takes an enemy instance as " +"an argument. After that, it takes defence choice from the player model and " +"the attack choice from an enemy model. After fight result calculation " +"required operation are to be performed (decrease player health). Based on " +"fight result should print out a message:" +msgstr "" +"Виконайте захист від атаки ворога. Цей метод приймає екземпляр ворога як " +"аргумент. Після цього він приймає вибір захисту від моделі гравця та вибір " +"атаки від моделі ворога. Після результату бою необхідно виконати операцію " +"обчислення (зменшити здоров'я гравця). За результатами бою повинно вийти " +"повідомлення:" + +#: of wtk.models.Player.defence:10 +msgid "\"YOUR DEFENCE IS SUCCESSFUL!\"" +msgstr "\"YOUR DEFENCE IS SUCCESSFUL!\"" + +#: of wtk.models.Player.defence:11 +msgid "\"YOUR DEFENCE IS FAILED!\"" +msgstr "\"YOUR DEFENCE IS FAILED!\"" + +#: of wtk.models.Player.fight:1 +msgid "Fight result calculation interface" +msgstr "Інтерфейс для вирахування результатів двобою" + +#: of wtk.models.Player.fight:3 +msgid "The method calculates the fight result based on the game rules:" +msgstr "Метод розраховує результат бою за правилами гри:" + +#: of wtk.models.Player.fight:5 +msgid "**wizard** beats **knight**" +msgstr "**чарівник** перемагає **рицаря**" + +#: of wtk.models.Player.fight:6 +msgid "**thief** beats **wizard**" +msgstr "**злодій** перемагає **чарівника**" + +#: of wtk.models.Player.fight:7 +msgid "**knight** beats **thief**" +msgstr "**рицар** перемагає **злодія**" + +#: of wtk.models.Player.select_attack:1 wtk.models.Player.select_defence:1 +msgid "Return fight choice from the user's prompt" +msgstr "Повертає варіант для поєдинку з вводу користувача" + +#: of wtk.models.Player.select_attack:5 wtk.models.Player.select_defence:5 +msgid "" +"The player is asked to make their decision for the upcoming fight. The " +"chosen value is validated and if it is invalid the question is repeated." +msgstr "" +"Гравця просять прийняти рішення щодо майбутнього бою. Вибране значення " +"перевіряється, і якщо воно недійсне, запитання повторюється." + +#: ../../problem-sets/src/wtk/challenge.rst:116 +msgid "Settings" +msgstr "Налаштування" + +#: ../../problem-sets/src/wtk/challenge.rst:118 +msgid "Settings module contains constants values for the game." +msgstr "Модуль налаштувань містить значення констант для гри." + +#: ../../problem-sets/src/wtk/challenge.rst:120 +msgid "For example," +msgstr "Наприклад," + +#: ../../docstring of wtk.settings.INITIAL_PLAYER_HEALTH:1 +msgid "Initial player health value" +msgstr "Початкове значення здоров'я гравця" + +#: ../../docstring of wtk.settings.INITIAL_ENEMY_LEVEL:1 +msgid "Initial enemy level value" +msgstr "Початкове значення рівня ворога" + +#: ../../docstring of wtk.settings.SCORE_SUCCESS_ATTACK:1 +msgid "Score points value to assign when player's attack is successful" +msgstr "Вартість очок, які призначаються, коли атака гравця успішна" + +#: ../../docstring of wtk.settings.SCORE_ENEMY_DOWN:1 +msgid "Score points value to assign when enemy is defeated" +msgstr "Вартість очок, які призначаються, коли ворог переможений" + +#: ../../problem-sets/src/wtk/challenge.rst:131 +msgid "You may also define messages with this module, for example:" +msgstr "" +"Ви також можете визначити повідомлення за допомогою цього модуля, наприклад:" + +#: ../../docstring of wtk.settings.MSG_SUCCESS_ATTACK:1 +msgid "Successful attack message" +msgstr "Повідомлення про успішну атаку" + +#: ../../docstring of wtk.settings.MSG_SUCCESS_DEFENCE:1 +msgid "Successful defence message" +msgstr "Повідомлення про успішний захист" + +#: ../../docstring of wtk.settings.MSG_FAILURE_ATTACK:1 +msgid "Failed attack message" +msgstr "Повідомлення про невдалу атаку" + +#: ../../docstring of wtk.settings.MSG_FAILURE_DEFENCE:1 +msgid "Failed defence message" +msgstr "Повідомлення про невдалий захист" + +#: ../../docstring of wtk.settings.MSG_DRAW:1 +msgid "Draw fight message" +msgstr "Повідомлення про нічию" + +#: ../../problem-sets/src/wtk/challenge.rst:141 +msgid "Engine" +msgstr "Ігровий рушій" + +#: ../../problem-sets/src/wtk/challenge.rst:143 +msgid "Engine module should provide two functions:" +msgstr "Модуль двигуна має забезпечувати дві функції:" + +#: ../../problem-sets/src/wtk/challenge.rst:145 +msgid "``get_player_name``" +msgstr "``get_player_name``" + +#: ../../problem-sets/src/wtk/challenge.rst:146 +msgid "``play``" +msgstr "``play``" + +#: ../../problem-sets/src/wtk/challenge.rst:149 +msgid "Player name getter" +msgstr "Отримання імені гравця" + +#: ../../problem-sets/src/wtk/challenge.rst:151 +msgid "" +"Asks the user to type in his or her name and return it back. Leading and " +"trailing whitespaces are to be trimmed. Name should contain at least one " +"character." +msgstr "" +"Просить користувача ввести своє ім'я та повернути його назад. Пробіли на " +"початку та в кінці мають бути вирізані. Ім'я має містити принаймні один " +"символ." + +#: of wtk.engine.get_player_name:1 +msgid "Return a player's name from the user prompt" +msgstr "Повертає ім'я гравця з вводу користувача" + +#: of wtk.engine.get_player_name:3 +msgid "a player defined name" +msgstr "ім'я визначене гравцем" + +#: of wtk.engine.get_player_name:5 +msgid "" +"A validation process is performed as well. The player name cannot be an " +"empty string." +msgstr "" +"Також виконується процес перевірки. Ім'я гравця не може бути порожнім рядком." + +#: ../../problem-sets/src/wtk/challenge.rst:158 +msgid "Play" +msgstr "Гра" + +#: ../../problem-sets/src/wtk/challenge.rst:160 +msgid "" +"This function initializes player and enemy instance. It processes game " +"rounds inside of an endless loop stage by stage. If an enemy is defeated - a " +"new one should be initialized with level increased by 1 (one). This case " +"should be reported to the terminal. If a player is defeated - the \"Game " +"Over\" message should be reported to the terminal. ``KeyboardInterrupt`` " +"should be handled as well - it's behavior is similar to \"Game Over\" event, " +"but \"game over\" message should be omitted." +msgstr "" +"Ця функція ініціалізує екземпляр гравця та ворога. Вона обробляє ігрові " +"раунди в нескінченному циклі поетапно. Якщо ворога переможено - нового слід " +"ініціалізувати з рівнем, збільшеним на 1 (один). Про цей випадок слід " +"повідомити на термінал. Якщо гравець зазнає поразки - повідомлення \"Game " +"Over\" має бути повідомлено на термінал. ``KeyboardInterrupt`` також слід " +"обробити - це поведінка подібно до події \"Game Over\", але повідомлення " +"\"Game Over\" має бути пропущено." + +#: of wtk.engine.play:1 +msgid "Run the game" +msgstr "Запускає гру" + +#: of wtk.engine.play:3 +msgid "" +"The function initializes player and enemy instances. After that it runs the " +"game process in an endless loop. Once the player is defeated - it stops the " +"execution." +msgstr "" +"Функція ініціалізує екземпляри гравця та ворога. Після цього він запускає " +"ігровий процес у нескінченному циклі. Як тільки гравець переможений - це " +"зупиняє виконання." + +#: ../../problem-sets/src/wtk/challenge.rst:173 +msgid "Optional Enhancements" +msgstr "Додаткові Вдосконалення" + +#: ../../problem-sets/src/wtk/challenge.rst:175 +msgid "Add scores processor to show top-10 scores from a record table." +msgstr "" +"Додайте процесор оцінок, щоб показати 10 найкращих результатів із таблиці " +"записів." + +#: ../../problem-sets/src/wtk/challenge.rst:176 +msgid "Create game menu, for example: ::" +msgstr "Створити меню гри, наприклад: ::" + +#: ../../problem-sets/src/wtk/challenge.rst:182 +msgid "Store score table to the database instead of using text file." +msgstr "" +"Зберігайте таблицю балів у базі даних замість використання текстового файлу." diff --git a/src/_locales/uk/LC_MESSAGES/basics/bool_logic.po b/src/_locales/uk/LC_MESSAGES/basics/bool_logic.po new file mode 100644 index 000000000..708b3b35f --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/bool_logic.po @@ -0,0 +1,505 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-18 00:17+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/bool_logic.txt:-1 +msgid "this document covers usage of logic and comparison operators in Python" +msgstr "" +"у цьому документі розглядається використання логічних операторів та " +"операторів порівняння у Python" + +#: ../../src/basics/bool_logic.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/bool_logic.txt:-1 +msgid "python, boolean, logic, comparison, operator" +msgstr "python, boolean, logic, comparison, operator" + +#: ../../src/basics/bool_logic.txt:14 +msgid "Boolean Logic" +msgstr "Булева Логіка" + +#: ../../src/basics/bool_logic.txt:20 +msgid "" +"`George Boole`_ put together what is now known as `Boolean algebra`_, which " +"relies on **true** and **false** values and define a set of boolean " +"operations: **not**, **and**, and **or**." +msgstr "" +"`Джордж Буль`_ створив те, що зараз відоме як `булева алгебра`_, яка " +"спирається на значення **істина** та **хибність** і визначає набір булевих " +"операцій: **not**, **and** та **or**." + +#: ../../src/basics/bool_logic.txt:24 +msgid "" +"These Boolean values and operators are helpful in programming because they " +"help you decide the course of action in your programs." +msgstr "" +"Ці булеві значення та оператори корисні у програмуванні, оскільки вони " +"допомагають вам визначати порядок дій у ваших програмах." + +#: ../../src/basics/bool_logic.txt:27 +msgid "" +"The **Python boolean** type is one of Python's built-in data types. It's " +"used to represent the truth value of an expression. For example, the " +"expression ``1 < 2`` is ``True``, while the expression ``0 == 1`` is " +"``False``. Understanding how Python Boolean values behave is important to " +"programming well in Python." +msgstr "" +"Тип **Python boolean** є одним із вбудованих типів даних Python. Він " +"використовується для представлення значення істинності виразу. Наприклад, " +"вираз ``1 < 2`` є ``True`` (істина), тоді як вираз ``0 == 1`` є ``False`` " +"(хибний). Розуміння того, як поводяться булеві значення у Python, є важливим " +"для якісного програмування на Python." + +#: ../../src/basics/bool_logic.txt:34 +msgid "Understanding Boolean" +msgstr "Розуміння булевих функцій" + +#: ../../src/basics/bool_logic.txt:36 +msgid "The Boolean type has only two possible values:" +msgstr "Тип Boolean має лише два можливих значення:" + +#: ../../src/basics/bool_logic.txt:38 ../../src/basics/bool_logic.txt:119 +#: ../../src/basics/bool_logic.txt:121 ../../src/basics/bool_logic.txt:147 +#: ../../src/basics/bool_logic.txt:151 ../../src/basics/bool_logic.txt:153 +#: ../../src/basics/bool_logic.txt:189 ../../src/basics/bool_logic.txt:193 +#: ../../src/basics/bool_logic.txt:195 +msgid "``True``" +msgstr "``True``" + +#: ../../src/basics/bool_logic.txt:39 ../../src/basics/bool_logic.txt:119 +#: ../../src/basics/bool_logic.txt:121 ../../src/basics/bool_logic.txt:149 +#: ../../src/basics/bool_logic.txt:151 ../../src/basics/bool_logic.txt:153 +#: ../../src/basics/bool_logic.txt:191 ../../src/basics/bool_logic.txt:193 +#: ../../src/basics/bool_logic.txt:195 +msgid "``False``" +msgstr "``False``" + +#: ../../src/basics/bool_logic.txt:41 +msgid "No other value will have ``bool`` as it type." +msgstr "Жодне інше значення не буде мати тип ``bool``." + +#: ../../src/basics/bool_logic.txt:50 +msgid "" +"The type ``bool`` is **built-in**, meaning it's always available in Python. " +"``True`` and ``False`` are keywords in Python and can't be used as variable " +"names. but ``bool`` type isn't and it's possible assign to the name " +"``bool``, however this is considered bad style." +msgstr "" +"Тип ``bool`` є **вбудованим**, тобто він завжди доступний у Python. ``True`` " +"та ``False`` є ключовими словами у Python і не можуть використовуватися як " +"імена змінних, але тип ``bool`` не є таким, і можна зробити змінну ``bool``, " +"однак це вважається поганим стилем." + +#: ../../src/basics/bool_logic.txt:56 +msgid "Boolean as numbers" +msgstr "Булеві як числа" + +#: ../../src/basics/bool_logic.txt:58 +msgid "" +"Booleans are a subtype of **numeric** type in Python. This means they're " +"numbers for all intents and purposes. In other words, you can apply " +"arithmetic operations to Boolean, and you can also compare them to numbers. " +"``True`` value is treated to be 1, and ``False`` value is treated to be 0." +msgstr "" +"Булеві вирази є підтипом **числового** типу у Python. Це означає, що вони є " +"числами за всіма ознаками. Іншими словами, до булевих типів можна " +"застосовувати арифметичні операції, а також порівнювати їх з числами. " +"Значення ``True`` розглядається як 1, а значення ``False`` розглядається як " +"0." + +#: ../../src/basics/bool_logic.txt:63 +msgid "There aren't many uses of the numerical nature of Boolean values." +msgstr "Існує не так багато застосувань числової природи булевих значень." + +#: ../../src/basics/bool_logic.txt:66 +msgid "Truth value testing" +msgstr "Перевірка істинності" + +#: ../../src/basics/bool_logic.txt:68 +msgid "" +"Any object can be tested for truth value. By default an object considered " +"``True``, unless its class defines either. Here are most of built-in objects " +"considered ``False``:" +msgstr "" +"Будь-який об'єкт можна перевірити на істинність. За замовчуванням об'єкт " +"вважається ``True``, якщо його клас не визначає іншого значення. Ось " +"більшість вбудованих об'єктів, що мають значення ``False``:" + +#: ../../src/basics/bool_logic.txt:72 +msgid "constant values: ``None`` and ``False``" +msgstr "константні значення: ``None`` та ``False``" + +#: ../../src/basics/bool_logic.txt:73 +msgid "" +"zero of any numeric type: ``0``, ``0.0``, ``0j``, ``Decimal(0)``, " +"``Fraction(0, 1)``" +msgstr "" +"нуль будь-якого числового типу: ``0``, ``0.0``, ``0j``, ``Decimal(0)``, " +"``Fraction(0, 1)``" + +#: ../../src/basics/bool_logic.txt:75 +msgid "" +"empty sequences and collections: ``''``, ``[]``, ``()``, ``{}``, ``set()``, " +"``range(0)``." +msgstr "" +"порожні послідовності та колекції: ``''``, ``[]``, ``()``, ``{}``, " +"``set()``, ``range(0)``." + +#: ../../src/basics/bool_logic.txt:80 +msgid "" +"If ``len(something)`` is equal to 0, than ``something`` is cast to ``bool`` " +"as ``False``." +msgstr "" +"Якщо ``len(something)`` дорівнює 0, то ``something`` приводиться до ``bool`` " +"як ``False``." + +#: ../../src/basics/bool_logic.txt:84 +msgid "Boolean comparison" +msgstr "Логічне порівняння" + +#: ../../src/basics/bool_logic.txt:86 +msgid "Python provides 3 logical operators:" +msgstr "У мові Python передбачено 3 логічних оператори:" + +#: ../../src/basics/bool_logic.txt:92 ../../src/basics/bool_logic.txt:226 +msgid "Operator" +msgstr "Оператор" + +#: ../../src/basics/bool_logic.txt:92 +msgid "Logic operator" +msgstr "Логічний оператор" + +#: ../../src/basics/bool_logic.txt:94 +msgid "``not``" +msgstr "``not``" + +#: ../../src/basics/bool_logic.txt:94 +msgid "Negation" +msgstr "Заперечення" + +#: ../../src/basics/bool_logic.txt:96 +msgid "``and``" +msgstr "``and``" + +#: ../../src/basics/bool_logic.txt:96 +msgid "Conjunction" +msgstr "Кон'юнкція" + +#: ../../src/basics/bool_logic.txt:98 +msgid "``or``" +msgstr "``or``" + +#: ../../src/basics/bool_logic.txt:98 +msgid "Disjunction" +msgstr "Диз'юнкція" + +#: ../../src/basics/bool_logic.txt:101 +msgid "" +"With these operators, you can build expressions by connecting Boolean " +"expressions with each other. These operators are **keywords** of the " +"language, so you cannot use them as identifiers without causing a " +"*SyntaxError*." +msgstr "" +"За допомогою цих операторів ви можете створювати вирази, з'єднуючи булеві " +"вирази один з одним. Ці оператори є **ключовими словами** мови, тому ви не " +"можете використовувати їх як ідентифікатори, не викликавши *SyntaxError*." + +#: ../../src/basics/bool_logic.txt:106 +msgid "Getting started with ``not`` operator" +msgstr "Початок роботи з оператором ``not``" + +#: ../../src/basics/bool_logic.txt:108 +msgid "" +"The ``not`` operator is the Boolean or logic operator that implements " +"negation in Python. It's **unary**, which means that it takes only one " +"**operand**. The operand can be a Boolean expression or any Python object. " +"The task of ``not`` is to reverse the truth value of its operand." +msgstr "" +"Оператор ``not`` - це булевий або логічний оператор, який реалізує " +"заперечення у Python. Він є **унарним**, що означає, що він приймає лише " +"один **операнд**. Операндом може бути булевий вираз або будь-який об'єкт " +"Python. Завдання ``not`` полягає в тому, щоб змінити значення істинності " +"свого операнда на протилежне." + +#: ../../src/basics/bool_logic.txt:113 +msgid "not operator truth table" +msgstr "таблиця істинності оператора not" + +#: ../../src/basics/bool_logic.txt:117 +msgid "``operand``" +msgstr "``операнд``" + +#: ../../src/basics/bool_logic.txt:117 +msgid "``not operand``" +msgstr "``not операнд``" + +#: ../../src/basics/bool_logic.txt:124 +msgid "This functionality makes it worthwhile in several situations:" +msgstr "Ця функціональність робить його корисним у кількох ситуаціях:" + +#: ../../src/basics/bool_logic.txt:127 +msgid "" +"Checking **unmet conditions** in the context of ``if`` statements and " +"``while`` loops" +msgstr "" +"Перевірка **невиконання умов** у контексті операторів ``if`` та циклів " +"``while``" + +#: ../../src/basics/bool_logic.txt:129 +msgid "**Inverting the truth value** of an object or expression" +msgstr "**Інвертування значення істинності** об'єкта або виразу" + +#: ../../src/basics/bool_logic.txt:130 +msgid "Checking if a **value is not in a given container**" +msgstr "Перевірка, чи **значення не знаходиться у заданому контейнері**" + +#: ../../src/basics/bool_logic.txt:131 +msgid "Checking for an **object's identity**" +msgstr "Перевірка **ідентичності об'єкта**" + +#: ../../src/basics/bool_logic.txt:134 +msgid "Getting started with ``and`` operator" +msgstr "Початок роботи з оператором ``and``" + +#: ../../src/basics/bool_logic.txt:136 +msgid "" +"Python's ``and`` operator is **binary**, which means it takes two " +"**operands**. The operands in an ``and`` expression are commonly known as " +"*conditions*. The result of the operator depends on the truth values of its " +"operands. It'll be ``True`` if **both** are true." +msgstr "" +"Оператор ``and`` у мові Python є **двійковим**, що означає, що він приймає " +"два **операнди**. Операнди у виразі ``and`` зазвичай називають *умовами*. " +"Результат оператора залежить від значень істинності його операндів. " +"Результат буде ``True``, якщо **обоє** є істинними." + +#: ../../src/basics/bool_logic.txt:141 +msgid "and operator truth table" +msgstr "таблиця істинності оператора and" + +#: ../../src/basics/bool_logic.txt:145 ../../src/basics/bool_logic.txt:187 +msgid "``operand_1``" +msgstr "``operand_1``" + +#: ../../src/basics/bool_logic.txt:145 ../../src/basics/bool_logic.txt:187 +msgid "``operand_2``" +msgstr "``operand_2``" + +#: ../../src/basics/bool_logic.txt:145 +msgid "``operand_1 and operand_2``" +msgstr "``operand_1 and operand_2``" + +#: ../../src/basics/bool_logic.txt:156 +msgid "" +"``and`` operator works not only with operands of Boolean type. It's behavior:" +msgstr "``and`` працює не тільки з операндами булевого типу. Ось алгоритм:" + +#: ../../src/basics/bool_logic.txt:159 +msgid "evaluate 1st operand; return it, if it's ``False`` and finish" +msgstr "обчислити 1-й операнд; повернути його, якщо він ``False`` і завершити" + +#: ../../src/basics/bool_logic.txt:160 +msgid "evaluate 2nd operand; return it, if it's ``False`` and finish" +msgstr "обчислити 2-й операнд; повернути його, якщо він ``False`` і завершити" + +#: ../../src/basics/bool_logic.txt:161 ../../src/basics/bool_logic.txt:203 +msgid "return 2nd operand" +msgstr "повернути 2-й операнд" + +#: ../../src/basics/bool_logic.txt:175 +msgid "Getting started with ``or`` operator" +msgstr "Початок роботи з оператором ``or``" + +#: ../../src/basics/bool_logic.txt:177 +msgid "" +"With Boolean ``or`` operator, you can connect two Boolean expressions into " +"one compound expression. This makes ``or`` the **binary** operator. At least " +"one subexpression must be ``True`` for the compound expression to be " +"considered ``True``, and it doesn't matter which. If both subexpressions are " +"``False``, then the expression is ``False``." +msgstr "" +"За допомогою булевого оператора ``or`` ви можете об'єднати два булевих " +"вирази в один складений вираз. Це робить ``or`` **бінарним** оператором. " +"Принаймні один з підвиразів має бути ``True``, щоб складений вираз вважався " +"``True``, і не має значення, який саме. Якщо обидва під-вирази мають " +"значення ``False``, то вираз буде вважатися ``False``." + +#: ../../src/basics/bool_logic.txt:183 +msgid "or operator truth table" +msgstr "таблиця істинності оператора or" + +#: ../../src/basics/bool_logic.txt:187 +msgid "``operand_1 or operand_2``" +msgstr "``operand_1 or operand_2``" + +#: ../../src/basics/bool_logic.txt:198 +msgid "" +"``or`` operator works not only with operands of Boolean type. It's behavior:" +msgstr "``or`` працює не тільки з операндами булевого типу. Ось алгоритм:" + +#: ../../src/basics/bool_logic.txt:201 +msgid "evaluate 1st operand; return it, if it's ``True`` and finish" +msgstr "обчислити 1-й операнд; повернути його, якщо він ``True`` і завершити" + +#: ../../src/basics/bool_logic.txt:202 +msgid "evaluate 2nd operand; return it, if it's ``True`` and finish" +msgstr "обчислити 2-й операнд; повернути його, якщо він ``True`` і завершити" + +#: ../../src/basics/bool_logic.txt:217 +msgid "Comparison" +msgstr "Порівняння" + +#: ../../src/basics/bool_logic.txt:219 +msgid "" +"There are eight comparison operations in Python. They all have the same " +"priority (which is higher than that of the Boolean operations)." +msgstr "" +"У мові Python існує вісім операцій порівняння. Всі вони мають однаковий " +"пріоритет (вищий, ніж у булевих операцій)." + +#: ../../src/basics/bool_logic.txt:222 +msgid "Comparison operators" +msgstr "Оператори порівняння" + +#: ../../src/basics/bool_logic.txt:226 +msgid "Meaning" +msgstr "Значення" + +#: ../../src/basics/bool_logic.txt:228 +msgid "``<``" +msgstr "``<``" + +#: ../../src/basics/bool_logic.txt:228 +msgid "strictly less than" +msgstr "строго менше, ніж" + +#: ../../src/basics/bool_logic.txt:230 +msgid "``<=``" +msgstr "``<=``" + +#: ../../src/basics/bool_logic.txt:230 +msgid "less than or equal" +msgstr "менше або дорівнює" + +#: ../../src/basics/bool_logic.txt:232 +msgid "``>``" +msgstr "``>``" + +#: ../../src/basics/bool_logic.txt:232 +msgid "strictly greater than" +msgstr "строго більше, ніж" + +#: ../../src/basics/bool_logic.txt:234 +msgid "``>=``" +msgstr "``>=``" + +#: ../../src/basics/bool_logic.txt:234 +msgid "greater or equal" +msgstr "більше або дорівнює" + +#: ../../src/basics/bool_logic.txt:236 +msgid "``==``" +msgstr "``==``" + +#: ../../src/basics/bool_logic.txt:236 +msgid "equal (aka *equality* comparison)" +msgstr "дорівнює (також відоме як *equality* порівняння)" + +#: ../../src/basics/bool_logic.txt:238 +msgid "``!=``" +msgstr "``!=``" + +#: ../../src/basics/bool_logic.txt:238 +msgid "not equal" +msgstr "не дорівнює" + +#: ../../src/basics/bool_logic.txt:240 +msgid "``is``" +msgstr "``is``" + +#: ../../src/basics/bool_logic.txt:240 +msgid "object identity" +msgstr "ідентичність об'єктів" + +#: ../../src/basics/bool_logic.txt:242 +msgid "``is not``" +msgstr "``is not``" + +#: ../../src/basics/bool_logic.txt:242 +msgid "negated object identity" +msgstr "заперечення ідентичності об'єкта" + +#: ../../src/basics/bool_logic.txt:245 +msgid "" +"Each of these comparison operators return a Boolean value, it's always " +"``True`` or ``False``." +msgstr "" +"Кожен з цих операторів порівняння повертає булеве значення, завжди ``True`` " +"або ``False``." + +#: ../../src/basics/bool_logic.txt:248 +msgid "" +"You can chain comparison operators together: ``x < y < z`` is equal to ``x < " +"y and y < z``." +msgstr "" +"Ви можете з'єднувати оператори порівняння ланцюжком: ``x < y < z`` " +"еквівалентне ``x < y and y < z``." + +#: ../../src/basics/bool_logic.txt:252 +msgid "Equality vs Identity" +msgstr "Рівність та Ідентичність" + +#: ../../src/basics/bool_logic.txt:254 +msgid "" +"It's easier to understand the difference between those by asking the " +"question each answers to." +msgstr "" +"Зрозуміти різницю між ними простіше, задавши питання, на яке відповідає " +"кожна з них." + +#: ../../src/basics/bool_logic.txt:257 +msgid "The question for ``==`` (*equality*) is:" +msgstr "Питання для ``==`` (*рівності*) полягає у наступному:" + +#: ../../src/basics/bool_logic.txt:259 +msgid "Is object on the left **equal** to the object on the right" +msgstr "Чи є об'єкт зліва **рівним** об'єкту справа" + +#: ../../src/basics/bool_logic.txt:261 +msgid "The question for ``is`` (*identity*) is:" +msgstr "Питання для ``is`` (*ідентичність*) полягає в наступному:" + +#: ../../src/basics/bool_logic.txt:263 +msgid "Is object on the left **the same** as the object on the right" +msgstr "Чи є об'єкт ліворуч **тим самим**, як і об'єкт праворуч" + +#: ../../src/basics/bool_logic.txt:265 +msgid "" +"For example, if there are two cars of the same model, same color etc. in " +"front of you - these cars are equal, but they aren't ident to each other. " +"But if you are shown two pictures of the same car, you understand that the " +"cars on those pictures are the same object." +msgstr "" +"Наприклад, якщо перед вами стоять два автомобілі однієї моделі, одного " +"кольору і т.д. - ці автомобілі рівні, але вони не ідентичні один одному. Але " +"якщо вам показують дві фотографії однієї і тієї ж машини, ви розумієте, що " +"машини на цих фотографіях - це один і той же об'єкт." diff --git a/src/_locales/uk/LC_MESSAGES/basics/controlflow.po b/src/_locales/uk/LC_MESSAGES/basics/controlflow.po new file mode 100644 index 000000000..14e3f63dd --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/controlflow.po @@ -0,0 +1,177 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:09+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/controlflow.txt:-1 +msgid "Control flow in Python" +msgstr "Контроль потоку в Python" + +#: ../../src/basics/controlflow.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/controlflow.txt:-1 +msgid "python, basics, control, if, for, while, condition, loop" +msgstr "python, basics, control, if, for, while, condition, loop" + +#: ../../src/basics/controlflow.txt:8 +msgid "Control Flow" +msgstr "Керування виконанням" + +#: ../../src/basics/controlflow.txt:13 +msgid "``if`` statement" +msgstr "Вираз ``if``" + +#: ../../src/basics/controlflow.txt:15 +msgid "" +"Perhaps the most well-known statement type is ``if`` statement. For example:" +msgstr "Мабуть, найвідомішим типом оператора є оператор ``if``. Наприклад:" + +#: ../../src/basics/controlflow.txt:17 +msgid "if statement base example" +msgstr "базовий приклад оператора if" + +#: ../../src/basics/controlflow.txt:31 +msgid "But let's dive into ``if`` statement with more simple examples." +msgstr "" +"Але давайте зануримося в інструкцію ``if`` з більш простими прикладами." + +#: ../../src/basics/controlflow.txt:34 +msgid "How it works" +msgstr "Як це працює" + +#: ../../src/basics/controlflow.txt:36 +msgid "" +"**if** statement is defined with a keyword ``if`` followed by a Boolean " +"expression or any object and finished with colon. The statement requires a " +"*body*: other statements to execute, also called an *if block*. The body is " +"indented at the same distance from the left (in Python we use 4 spaces to " +"indent a single block of code)." +msgstr "" +"Оператор **if** визначається ключовим словом ``if``, за яким слідує логічний " +"вираз або будь-який об'єкт і завершується двокрапкою. Оператор потребує " +"*тіло*: інші оператори для виконання, які також називають блоком *if*. Тіло " +"має відступ на однаковій відстані зліва (у Python ми використовуємо 4 " +"пробіли для відступу одного блоку коду)." + +#: ../../src/basics/controlflow.txt:42 +msgid "" +"The body's statements will be executed only in case **if** expression is " +"``True``." +msgstr "" +"Оператори тіла виконуватимуться лише у випадку, якщо вираз **if** має " +"значення ``True``." + +#: ../../src/basics/controlflow.txt:55 +msgid "" +"The ``print`` statement on line #6 will be executed only for even value of " +"``number`` variable." +msgstr "" +"Оператор ``print`` у рядку #6 буде виконано лише для парного значення " +"змінної ``number``." + +#: ../../src/basics/controlflow.txt:59 +msgid "``else`` block" +msgstr "Блок ``else``" + +#: ../../src/basics/controlflow.txt:61 +msgid "" +"``if`` can be used by its own, it can extend its behavior with ``else`` " +"block. The general syntax for ``else`` body is the same: at least one " +"indented statement. But ``else`` doesn't take any expression after it. This " +"block of code will be executed only that the ``if`` statement truth check " +"fails." +msgstr "" +"``if`` може використовуватися самостійно, він може розширити свою поведінку " +"за допомогою блоку ``else``. Загальний синтаксис для тіла ``else`` той " +"самий: принаймні один оператор із відступом. Але ``else`` не приймає жодного " +"виразу після нього. Цей блок коду буде виконано лише тоді, коли перевірка " +"істинності оператора ``if`` буде невдалою." + +#: ../../src/basics/controlflow.txt:78 +msgid "" +"You can attach **only one** else block to **if statement**. And you cannot " +"use ``else`` statement on its own - this will cause *SyntaxError*." +msgstr "" +"Ви можете приєднати **лише один** блок else до **інструкції if**. І ви не " +"можете використовувати оператор ``else`` сам по собі - це спричинить " +"*SyntaxError*." + +#: ../../src/basics/controlflow.txt:82 +msgid "``elif`` block(s)" +msgstr "Блок(и) ``elif``" + +#: ../../src/basics/controlflow.txt:84 +msgid "" +"``elif`` (*else if*) statement may be considered as semi-statement between " +"``if`` and ``else`` statements. In case your program has more than two " +"dedicated choices you are able to extends control flow by appending ``elif`` " +"blocks after ``if`` statement. The syntax is pretty similar to ``if`` " +"statement. Each ``elif`` has its own boolean expression or an object to test " +"for the truth value." +msgstr "" +"Оператор ``elif`` (*else if*) можна розглядати як напівоператор між ``if`` " +"та ``else``. Якщо у вашій програмі є більше двох виділених варіантів, ви " +"можете розширити потік керування, додавши блоки ``elif`` після оператора " +"``if``. Синтаксис дуже схожий на оператор if. Кожен ``elif`` має свій " +"власний логічний вираз або об'єкт для перевірки значення істинності." + +#: ../../src/basics/controlflow.txt:91 +msgid "" +"You can attach as many ``elif`` statements as it needed. But you cannot use " +"``elif`` without ``if`` statement." +msgstr "" +"Ви можете додати скільки завгодно операторів ``elif``. Але ви не можете " +"використовувати ``elif`` без оператора ``if``." + +#: ../../src/basics/controlflow.txt:94 +msgid "" +"Python will test conditions in ``if`` and ``elif`` statements from top to " +"bottom. The first one, which considered to be ``True`` will be executed. All " +"others will be skipped." +msgstr "" +"Python перевірить умови в операторах ``if`` та ``elif`` зверху вниз. Буде " +"виконано перший, який вважається ``True``. Усі інші будуть проігноровано." + +#: ../../src/basics/controlflow.txt:98 +msgid "" +"If there were no truth conditions ``else`` block will be executed (if " +"exists)." +msgstr "Якщо не було істиних умов, буде виконано блок ``else`` (якщо існує)." + +#: ../../src/basics/controlflow.txt:114 +msgid "" +"The order conditions appears matter. The truth test goes from top to bottom " +"and stops at first expression which is ``True``." +msgstr "" +"Порядок у якому визначено умови має значення. Перевірка істинності йде " +"зверху вниз і зупиняється на першому виразі, який є ``True``." + +#: ../../src/basics/controlflow.txt:119 +msgid "Usage" +msgstr "Використання" + +#: ../../src/basics/controlflow.txt:121 +msgid "" +"``if/elif/else`` statements help you to control which portion of your code " +"is executed based on conditions from outer scope." +msgstr "" +"Оператори ``if/elif/else`` допомагають вам контролювати, яка частина вашого " +"коду виконується на основі умов ззовні." diff --git a/src/_locales/uk/LC_MESSAGES/basics/decorators.po b/src/_locales/uk/LC_MESSAGES/basics/decorators.po new file mode 100644 index 000000000..368055a22 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/decorators.po @@ -0,0 +1,392 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-18 12:57+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/decorators.txt:-1 +msgid "Python decorators" +msgstr "Декоратори в Python" + +#: ../../src/basics/decorators.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/decorators.txt:-1 +msgid "python, basics, decorators" +msgstr "python, basics, decorators" + +#: ../../src/basics/decorators.txt:11 +msgid "Decorators" +msgstr "Декоратори" + +#: ../../src/basics/decorators.txt:13 +msgid "" +"Decorators provide a simple syntax for calling higher-order functions :cite:" +"`realpython:decorators`." +msgstr "" +"Декоратори надають простий синтаксис для виклику функцій вищого порядку :" +"cite:`realpython:decorators`." + +#: ../../src/basics/decorators.txt:18 +msgid "There is some kind of misunderstanding in definitions." +msgstr "Існує певне непорозуміння у визначеннях." + +#: ../../src/basics/decorators.txt:20 +#, fuzzy +msgid "" +"**Decorator** is a function returning another function, usually applied as a " +"function transformation using the ``@wrapper`` syntax :cite:`docs-python:" +"term-decorator`." +msgstr "" +"**Декоратор** - це функція, що повертає іншу функцію, зазвичай " +"застосовується як перетворення функції за допомогою синтаксису ``@wrapper`` :" +"cite:`docs-python:term-decorator`." + +#: ../../src/basics/decorators.txt:24 +#, fuzzy +msgid "" +"However, that's no quit enough to describe it. The more complete definition " +"is:" +msgstr "Однак цього недостатньо, щоб описати його. Більш повне визначення:" + +#: ../../src/basics/decorators.txt:27 +#, fuzzy +msgid "" +"**Decorator** is a structural design pattern that lets you attach new " +"behaviors to objects by placing these objects inside special wrapper objects " +"that contain the behaviors :cite:`refactoring.guru:decorator`." +msgstr "" +"**Декоратор** -- це патерн структурного дизайну, який дозволяє додавати нові " +"поведінки до об'єктів, розміщуючи ці об'єкти всередині спеціальних обгорток, " +"які містять поведінку :cite:`refactoring.guru:decorator`." + +#: ../../src/basics/decorators.txt:31 +msgid "" +"Before you understand decorators, you must first understand how functions " +"work." +msgstr "" +"Перш ніж розбиратися в декораторах, потрібно зрозуміти, як працюють функції." + +#: ../../src/basics/decorators.txt:35 +msgid "First-class objects" +msgstr "Об'єкти першого класу" + +#: ../../src/basics/decorators.txt:37 +msgid "" +"In Python functions are `first-class objects`_. Everything in Python is an " +"object. Functions are objects too." +msgstr "" +"У Python функції є `об'єктами першого класу`_. Усе в Python є об'єктом. " +"Функції також є об'єктами." + +#: ../../src/basics/decorators.txt:41 +msgid "Inner functions" +msgstr "Внутрішні функції" + +#: ../../src/basics/decorators.txt:43 +msgid "" +"Functions can be nested. This means it is possible to define functions " +"inside other functions." +msgstr "" +"Функції можуть бути вкладеними. Це означає, що можна визначати функції " +"всередині інших функцій." + +#: ../../src/basics/decorators.txt:46 +msgid "Nested functions example" +msgstr "Приклад вкладених функцій" + +#: ../../src/basics/decorators.txt:60 +msgid "" +"The order in which inner functions are defined no matters. The function " +"definition does not execute the function body; this gets executed only when " +"the function is called. Furthermore, the inner functions are not defined " +"until the parent function is called. They are locally scoped to their " +"parent. Trying to call ``heapify`` function outside of ``heap_sort`` will " +"cause ``NameError`` exception." +msgstr "" +"Порядок визначення внутрішніх функцій не має значення. Визначення функції не " +"виконує тіло функції; воно виконується лише під час виклику функції. Крім " +"того, внутрішні функції не визначаються до виклику батьківської функції. " +"Вони локально масштабуються до свого батька. Спроба викликати функцію " +"``heapify`` поза ``heap_sort`` призведе до виключення ``NameError``." + +#: ../../src/basics/decorators.txt:68 +msgid "Functions are objects" +msgstr "Функції є об'єктами" + +#: ../../src/basics/decorators.txt:70 +msgid "" +"This means functions can be passed around and used as arguments, just like " +"any other object (e.g. *int*, *str* etc.)." +msgstr "" +"Це означає, що функції можна передавати і використовувати як аргументи так " +"само, як і будь-які інші об'єкти (наприклад, *int*, *str* тощо)." + +#: ../../src/basics/decorators.txt:95 +msgid "Returning functions" +msgstr "Повернення функцій" + +#: ../../src/basics/decorators.txt:97 +msgid "" +"Since function can be passed as an argument, it may be returned from another " +"function." +msgstr "" +"Оскільки функція може бути передана як аргумент, вона може бути повернута з " +"іншої функції." + +#: ../../src/basics/decorators.txt:120 +msgid "``parent`` returns functions themselves, there are no parentheses." +msgstr "``parent`` повертає самі функції, дужок немає." + +#: ../../src/basics/decorators.txt:122 +msgid "" +"After running the code snippet above, ``first`` refers the ``first_child`` " +"function from the inner ``parent`` scope. From now it can be used to call " +"the target function it refers." +msgstr "" +"Після виконання наведеного вище фрагмента коду, ``first`` звертається до " +"функції ``first_child`` з внутрішньої області видимості ``parent``. Тепер її " +"можна використовувати для виклику цільової функції, на яку вона посилається." + +#: ../../src/basics/decorators.txt:134 +msgid "Simple decorators" +msgstr "Прості декоратори" + +#: ../../src/basics/decorators.txt:136 +msgid "" +"Now you're ready to move on and see the magical beast that is the Python " +"decorators. Let's start with a simple example:" +msgstr "" +"Тепер ви готові рухатися далі і побачити чарівного звіра, яким є декоратори " +"Python. Почнемо з простого прикладу:" + +#: ../../src/basics/decorators.txt:154 +msgid "Running function:" +msgstr "Запуск функцій:" + +#: ../../src/basics/decorators.txt:165 +msgid "" +"The common way to use decorators is to replace the original function with a " +"decorated one:" +msgstr "" +"Найпоширеніший спосіб використання декораторів - це заміна оригінальної " +"функції на декоровану:" + +#: ../../src/basics/decorators.txt:176 +msgid "" +"``say_hello`` function is the reference to the ``decorator.." +"wrapper``, which itself is bound to the original ``say_hello`` function. " +"There is a syntactic sugar to do this, called *pie-syntax*. The following " +"example does exact the same things as the first decorator example:" +msgstr "" +"Функція ``say_hello`` є посиланням на ``decorator..wrapper``, яка " +"сама зв'язана з оригінальною функцією ``say_hello``. Для цього існує " +"синтаксичний цукор, який називається *pie-синтаксис*. Наступний приклад " +"робить те саме, що і перший приклад декоратора:" + +#: ../../src/basics/decorators.txt:198 +msgid "" +"There is no way to *undecorate* object in Python. Once something is bound to " +"the decorator's wrapper - it is decorated forever." +msgstr "" +"У Python не існує способу *роздекорувати* об'єкт. Як тільки щось прив'язано " +"до обгортки декоратора - воно прикрашене назавжди." + +#: ../../src/basics/decorators.txt:201 +msgid "" +"A decorated function still remains a **function**. So, it can be decorated " +"once more time again, and again, and again..." +msgstr "" +"Прикрашена функція все одно залишається **функцією**. Отже, її можна " +"прикрасити ще раз, і ще раз, і ще раз, і ще раз..." + +#: ../../src/basics/decorators.txt:253 +msgid "" +"\"Wrapper\" is the alternative nickname for the Decorator pattern that " +"clearly expresses the main idea of the pattern. A wrapper is an object that " +"can be linked with some target object. The wrapper contains the same set of " +"methods as the target and delegates to it all requests it receives. However, " +"the wrapper may alter the result by doing something either before or after " +"it passes the request to the target." +msgstr "" +"\"Обгортка\" - це альтернативна назва шаблону \"Декоратор\", яка чітко " +"виражає основну ідею шаблону. Обгортка - це об'єкт, який можна зв'язати з " +"деяким цільовим об'єктом. Обгортка містить той самий набір методів, що й " +"цільовий об'єкт, і делегує йому всі запити, які він отримує. Однак обгортка " +"може змінити результат, виконавши щось до або після передачі запиту " +"цільовому об'єкту." + +#: ../../src/basics/decorators.txt:261 +msgid "Passing arguments to the wrapper" +msgstr "Передача аргументів в обгортку" + +#: ../../src/basics/decorators.txt:263 +msgid "" +"Until now the examples use *simple* decorators. But what if the decorated " +"function gets some arguments? This will cause ``TypeError`` exception that " +"tell that \"arguments are missed\". This can be fixed with just passing " +"arguments to the ``wrapper`` inner function." +msgstr "" +"Досі у прикладах використовувались *прості* декоратори. Але що, якщо " +"декорована функція отримає якісь аргументи? Це викличе виключення " +"``TypeError``, яке скаже, що \"аргументи пропущено\". Це можна виправити, " +"просто передавши аргументи у внутрішню функцію ``wrapper``." + +#: ../../src/basics/decorators.txt:289 +msgid "" +"If case you're trying to make a generic decorator, you may pass ``*args`` " +"and ``**kwargs`` instead of exact arguments:" +msgstr "" +"Якщо ви намагаєтеся створити узагальнений декоратор, ви можете передати " +"``*args`` і ``**kwargs`` замість точних аргументів:" + +#: ../../src/basics/decorators.txt:308 +msgid "Passing arguments to decorator" +msgstr "Передача аргументів до декоратора" + +#: ../../src/basics/decorators.txt:310 +msgid "" +"At last it's time to know how to pass arguments to the decorator. Here is a " +"simple implementation of ``defer`` decorator which deferred the function " +"execution for some time:" +msgstr "" +"Нарешті прийшов час дізнатися, як передавати аргументи декоратору. Ось " +"проста реалізація декоратора ``defer``, який відкладає виконання функції на " +"деякий час:" + +#: ../../src/basics/decorators.txt:353 +msgid "Class decorators" +msgstr "Декоратори класів" + +#: ../../src/basics/decorators.txt:355 +msgid "" +"There are some pre-defined decorators exists for usage together with " +"classes. They are:" +msgstr "" +"Існує декілька попередньо визначених декораторів для використання разом з " +"класами. Ось вони:" + +#: ../../src/basics/decorators.txt:358 +msgid "``classmethod``" +msgstr "``classmethod``" + +#: ../../src/basics/decorators.txt:359 +msgid "``staticmethod``" +msgstr "``staticmethod``" + +#: ../../src/basics/decorators.txt:360 +msgid "``property``" +msgstr "``property``" + +#: ../../src/basics/decorators.txt:362 +msgid "" +"If you develop an intuitive understanding for their differences you'll be " +"able to write object-oriented Python that communicates its intent more " +"clearly and will be easier to maintain in the long run :cite:`realpython:" +"methods-demystified`." +msgstr "" +"Якщо ви розвинете інтуїтивне розуміння їх відмінностей, ви зможете писати " +"об'єктно-орієнтований Python, який більш чітко передає свої наміри і який " +"буде легше підтримувати в довгостроковій перспективі :cite:`realpython:" +"methods-demystified`." + +#: ../../src/basics/decorators.txt:368 +msgid "Class methods" +msgstr "Методи класу" + +#: ../../src/basics/decorators.txt:370 +msgid "" +"Instead of accepting a ``self`` parameter, class methods take a ``cls`` " +"parameter that points to the class — and not the object instance — when the " +"method is called." +msgstr "" +"Замість того, щоб приймати параметр ``self``, методи класу приймають " +"параметр ``cls``, який вказує на клас - а не на екземпляр об'єкта - під час " +"виклику методу." + +#: ../../src/basics/decorators.txt:374 +msgid "" +"Because the class method only has access to this ``cls`` argument, it can't " +"modify object instance state. That would require access to ``self``. " +"However, class methods can still modify class state that applies across all " +"instances of the class." +msgstr "" +"Оскільки метод класу має доступ лише до цього аргументу ``cls``, він не може " +"змінювати стан екземпляра об'єкта. Для цього потрібен доступ до ``self``. " +"Однак, методи класу все ще можуть змінювати стан класу, який застосовується " +"до всіх екземплярів класу." + +#: ../../src/basics/decorators.txt:379 +msgid "" +"The common usage for ``classmethod`` is provide alternative initializers." +msgstr "" +"Загальноприйнятим використанням ``classmethod`` є надання альтернативних " +"ініціалізаторів." + +#: ../../src/basics/decorators.txt:382 +msgid "Static methods" +msgstr "Статичні методи" + +#: ../../src/basics/decorators.txt:384 +msgid "" +"This type of method takes neither a ``self`` nor a ``cls`` parameter (but of " +"course it's free to accept an arbitrary number of other parameters)." +msgstr "" +"Цей тип методів не приймає ні параметра ``self``, ні параметра ``cls`` (але, " +"звичайно, він може приймати довільну кількість інших параметрів)." + +#: ../../src/basics/decorators.txt:387 +msgid "" +"Therefore a static method can neither modify object state nor class state. " +"Static methods are restricted in what data they can access - and they're " +"primarily a way to namespace your methods." +msgstr "" +"Тому статичний метод не може змінювати стан об'єкта або класу. Статичні " +"методи обмежені в доступі до даних, до яких вони можуть отримати доступ - і " +"це, насамперед, спосіб організації простору імен ваших методів." + +#: ../../src/basics/decorators.txt:391 +msgid "" +"It's tricky to explain ``staticmethod`` usage. Almost always you can create " +"a dedicated function instead of static method. But sometimes you need to " +"bind some logic independent from class itself or its instances to a class - " +"it common to encapsulate it with ``staticmethod``." +msgstr "" +"Пояснити використання ``staticmethod`` досить складно. Майже завжди замість " +"статичного методу можна створити спеціальну функцію. Але іноді вам потрібно " +"прив'язати до класу деяку логіку, незалежну від самого класу або його " +"екземплярів, і тоді прийнято інкапсулювати її за допомогою ``staticmethod``." + +#: ../../src/basics/decorators.txt:397 +msgid "Properties" +msgstr "Властивості" + +#: ../../src/basics/decorators.txt:399 +msgid "" +"It's a way to bind a method name to access it as an attribute. Properties " +"are **read-only** by default. This means a value cannot be assigned to " +"``property member``." +msgstr "" +"Це спосіб зв'язати ім'я методу для доступу до нього як до атрибуту. За " +"замовчуванням властивості доступні лише для читання. Це означає, що члену " +"властивості не можна присвоїти значення." + +#: ../../src/basics/decorators.txt:404 +msgid "Some examples" +msgstr "Деякі приклади" diff --git a/src/_locales/uk/LC_MESSAGES/basics/exceptions.po b/src/_locales/uk/LC_MESSAGES/basics/exceptions.po new file mode 100644 index 000000000..7a9c165bc --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/exceptions.po @@ -0,0 +1,380 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:09+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/exceptions.txt:-1 +msgid "Handling exceptions in Python" +msgstr "Опрацювання винятків в Python" + +#: ../../src/basics/exceptions.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/exceptions.txt:-1 +msgid "python, exceptions, handling, try, except, finally" +msgstr "python, exceptions, handling, try, except, finally" + +#: ../../src/basics/exceptions.txt:11 +msgid "Errors and Exceptions" +msgstr "Помилки та винятки" + +#: ../../src/basics/exceptions.txt:13 +msgid "" +"There are (at least) two distinguishable kinds of errors: *syntax errors* " +"and *exceptions* :cite:`docs-python:errors`." +msgstr "" +"Існує (принаймні) два типи помилок: *синтаксичні помилки* та *виключення* :" +"cite:`docs-python:errors`." + +#: ../../src/basics/exceptions.txt:17 +msgid "Syntax errors" +msgstr "Синтаксичні помилки" + +#: ../../src/basics/exceptions.txt:19 +msgid "Syntax errors are also known as parsing errors." +msgstr "Синтаксичні помилки також відомі як помилки Python парсера." + +#: ../../src/basics/exceptions.txt:29 +msgid "" +"The parser repeats the offending line and displays a little \"arrow\" " +"pointing at the earliest point in the line where the error was detected. The " +"error is caused by (or at least detected at) the token preceding the arrow." +msgstr "" +"Синтаксичний аналізатор повторює неправильний рядок і відображає маленьку " +"\"стрілку\", яка вказує на найперший символ рядка, де було виявлено помилку. " +"Помилка спричинена (або принаймні виявлена) символом(а) перед стрілкою." + +#: ../../src/basics/exceptions.txt:34 +msgid "Exceptions" +msgstr "Винятки" + +#: ../../src/basics/exceptions.txt:36 +msgid "" +"Even if a statement or expression is syntactically correct, it may cause an " +"error when an attempt is made to execute it. Errors detected during " +"execution are called exceptions and are not unconditionally fatal: you will " +"soon learn how to handle them in Python programs." +msgstr "" +"Навіть якщо оператор або вираз синтаксично правильний, це може спричинити " +"помилку під час спроби його виконання. Помилки, виявлені під час виконання, " +"називаються винятками і не є фатальними: незабаром ви дізнаєтеся, як їх " +"обробляти в програмах на Python." + +#: ../../src/basics/exceptions.txt:41 +msgid "" +"Exceptions come in different types, and the type is printed as part of the " +"message." +msgstr "" +"Винятки бувають різних типів, і тип друкується як частина повідомлення." + +#: ../../src/basics/exceptions.txt:44 +msgid "For example, the ``div`` function implemented as" +msgstr "Наприклад, функція ``div``, реалізована як" + +#: ../../src/basics/exceptions.txt:53 +msgid "" +"may cause a ``ZeroDivisionError`` exception in case 0 is passed as ``y`` " +"parameter." +msgstr "" +"може викликати виняток ``ZeroDivisionError``, якщо 0 передається як параметр " +"``y``." + +#: ../../src/basics/exceptions.txt:56 +msgid "" +"Standard exception names are built-in identifiers (not reserved keywords)." +msgstr "" +"Стандартні назви винятків є вбудованими ідентифікаторами (а не " +"зарезервованими ключовими словами)." + +#: ../../src/basics/exceptions.txt:58 +msgid "The list of `built-in exceptions`_" +msgstr "Список `вбудованих винятків`_" + +#: ../../src/basics/exceptions.txt:61 +msgid "Tracebacks" +msgstr "Відстеження" + +#: ../../src/basics/exceptions.txt:63 +msgid "\"File\" is replaced with a *dummy string* within the examples." +msgstr "У наведених прикладах \"Файл\" замінено на *фіктивний рядок*." + +#: ../../src/basics/exceptions.txt:65 +msgid "Let's assume the following modules structure:" +msgstr "Припустимо наступну структуру модулів:" + +#: ../../src/basics/exceptions.txt:73 +msgid "" +"The **main** module imports a ``div`` function implemented above from the " +"**func** module. The code in main is implemented as follows:" +msgstr "" +"Модуль **main** імпортує функцію ``div``, реалізовану вище, з модуля " +"**func**. Основний код реалізовано наступним чином:" + +#: ../../src/basics/exceptions.txt:85 +msgid "" +"While running the code with correct inputs it will work fine. But there are " +"at two exceptions for this script." +msgstr "" +"Під час виконання коду з правильними введеннями він працюватиме нормально. " +"Але для цього сценарію є два винятки." + +#: ../../src/basics/exceptions.txt:88 +msgid "" +"The first one is related on type conversion. While running the main script " +"there is case of invalid input." +msgstr "" +"Перший пов'язаний з перетворенням типів. Під час виконання основного " +"сценарію є випадок неправильного введення." + +#: ../../src/basics/exceptions.txt:100 +msgid "" +"Note the **traceback** indicates the module and the exact line of code that " +"causes the exception." +msgstr "" +"Зауважте, що **traceback** вказує на модуль і точний рядок коду, який " +"викликає виняток." + +#: ../../src/basics/exceptions.txt:103 +msgid "" +"The second one exception occurs when a 0 is passed as the second parameter " +"to ``div`` function. The traceback would look like:" +msgstr "" +"Другий виняток виникає, коли 0 передається як другий параметр функції " +"``div``. Трасування виглядатиме так:" + +#: ../../src/basics/exceptions.txt:117 +msgid "" +"The traceback indicates all calls (top to bottom) that cause an exception." +msgstr "" +"Зворотне відстеження вказує на всі виклики (зверху вниз), які викликають " +"виняток." + +#: ../../src/basics/exceptions.txt:120 +msgid "Exception handling" +msgstr "Обробка винятків" + +#: ../../src/basics/exceptions.txt:122 +msgid "" +"It is possible to write programs that handle selected exceptions. The " +"``try`` statement is used to do that." +msgstr "" +"Можна писати програми, які оброблятимуть вибрані винятки. Для цього " +"використовується інструкція ``try``." + +#: ../../src/basics/exceptions.txt:125 +msgid "The try statement works as follows." +msgstr "Інструкція try працює наступним чином." + +#: ../../src/basics/exceptions.txt:127 +msgid "" +"First, the try clause (the statement(s) between the try and except keywords) " +"is executed." +msgstr "" +"Спочатку виконується речення try (вираз(и) між ключовими словами try і " +"except)." + +#: ../../src/basics/exceptions.txt:129 +msgid "" +"If no exception occurs, the except clause is skipped and execution of the " +"try statement is finished." +msgstr "" +"Якщо винятків не відбувається, пропозиція винятку пропускається, і виконання " +"оператора try завершується." + +#: ../../src/basics/exceptions.txt:131 +msgid "" +"If an exception occurs during execution of the try clause, the rest of the " +"clause is skipped. Then, if its type matches the exception named after the " +"except keyword, the except clause is executed, and then execution continues " +"after the try/except block." +msgstr "" +"Якщо під час виконання try виникає виняток, решта пропозиції пропускається. " +"Потім, якщо його тип збігається з винятком, названим за ключовим словом " +"osim, виконується пропозиція, а потім виконання продовжується після блоку " +"try/except." + +#: ../../src/basics/exceptions.txt:135 +msgid "" +"If an exception occurs which does not match the exception named in the " +"except clause, it is passed on to outer try statements; if no handler is " +"found, it is an unhandled exception and execution stops with a message as " +"shown above." +msgstr "" +"Якщо виникає виняток, який не збігається з винятком, названим у реченні " +"винятку, він передається зовнішнім операторам try; якщо обробник не " +"знайдено, це необроблена виняткова ситуація, і виконання зупиняється з " +"повідомленням, як показано вище." + +#: ../../src/basics/exceptions.txt:152 +msgid "" +"A try statement may have more than one except clause, to specify handlers " +"for different exceptions." +msgstr "" +"Інструкція try може мати більше однієї пропозиції, щоб вказати обробники для " +"різних винятків." + +#: ../../src/basics/exceptions.txt:182 +msgid "Handling ALL exception" +msgstr "Опрацювання усіх винятків" + +#: ../../src/basics/exceptions.txt:184 +msgid "It's a bad practice to handle **all** exceptions." +msgstr "Обробляти **всі** винятки – це погана практика." + +#: ../../src/basics/exceptions.txt:186 +msgid "" +"When indicating an ``except`` block without specifying an exception to catch " +"it will work for any exception, that occurs in ``try`` block. The same is " +"relevant for handling ``BaseException`` and ``Exception``. But you can never " +"say what exact goes wrong." +msgstr "" +"Якщо вказати блок ``except`` без визначення винятку для перехоплення, він " +"працюватиме для будь-якого винятку, який виникає в блоці ``try``. Те саме " +"стосується обробки ``BaseException`` і ``Exception``. Проте ніколи не " +"можливо сказати, який саме виняток стався." + +#: ../../src/basics/exceptions.txt:191 +msgid "" +"However, this scenario may work for logging an exception and raising it " +"again to be handled on upper levels." +msgstr "" +"Проте, такий сценарій може працювати для логування винятків, після чого вони " +"підійматься заново, щоб бути опрацьованими на вищих рівнях програми." + +#: ../../src/basics/exceptions.txt:213 +msgid "" +"All exceptions are inherited from ``Exception`` class, which is subclass of " +"``BaseException``. So, you can never know what exactly goes wrong with your " +"code." +msgstr "" +"Усі винятки успадковуються від класу ``Exception``, який є підкласом " +"``BaseException``. Отже, ви ніколи не можете знати, що саме пішло не так із " +"вашим кодом." + +#: ../../src/basics/exceptions.txt:218 +msgid "``finally`` statement" +msgstr "Вираз ``finally``" + +#: ../../src/basics/exceptions.txt:220 +msgid "" +"The ``try`` statement cannot be used itself. This will cause " +"``SyntaxError``. Either ``except`` or ``finally`` block is required to be " +"included." +msgstr "" +"Оператор ``try`` не може бути використаний сам по собі. Це спричинить " +"``SyntaxError``. Необхідно включити блок ``except`` або ``finally``." + +#: ../../src/basics/exceptions.txt:223 +msgid "" +"While the ``except`` block tries to catch the exceptions if any, the " +"``finally`` block will be always executed regardless of the exception occurs." +msgstr "" +"У той час як блок ``except`` намагається перехопити винятки, якщо такі є, " +"блок ``finally`` завжди виконуватиметься незалежно від виникнення винятку." + +#: ../../src/basics/exceptions.txt:249 +msgid "``else`` statement" +msgstr "Вираз ``else``" + +#: ../../src/basics/exceptions.txt:251 +msgid "" +"The ``try`` statement can also use ``else`` (which is optional). The " +"statements within this block will be execute only in case there were no " +"exceptions raised while running the ``try``." +msgstr "" +"Оператор ``try`` також може використовувати ``else`` (який є " +"необов'язковим). Інструкції в цьому блоці виконуватимуться лише у випадку, " +"якщо під час виконання ``try`` не було викликано винятків." + +#: ../../src/basics/exceptions.txt:273 +msgid "Raising exceptions" +msgstr "Винятки: raising" + +#: ../../src/basics/exceptions.txt:275 +msgid "" +"The ``raise`` statement allows the programmer to force a specified exception " +"to occur. The sole argument to raise indicates the exception to be raised. " +"This must be either an exception instance or an exception class (a class " +"that derives from ``BaseException``, such as ``Exception`` or one of its " +"subclasses). If an exception class is passed, it will be implicitly " +"instantiated by calling its constructor with no arguments." +msgstr "" +"Інструкція ``raise`` дозволяє програмісту примусово викликати певний " +"виняток. Єдиний аргумент, який потрібно викликати, вказує на виняток, який " +"потрібно викликати. Це має бути екземпляр винятку або клас винятку (клас, " +"який походить від ``BaseException``, наприклад ``Exception`` або один із " +"його підкласів). Якщо передано клас винятків, він буде неявно створений " +"шляхом виклику його конструктора без аргументів." + +#: ../../src/basics/exceptions.txt:287 +msgid "" +"``raise`` statement itself will re-raise all the exceptions within the " +"context. Also exceptions can be raised again from the ``except`` block. It's " +"a common pattern to catch the exception for loggers and when re-raise it." +msgstr "" +"Сам оператор ``raise`` повторно викличе всі винятки в контексті опрацювання. " +"Крім того, винятки можуть бути викликані знову з блоку ``except``. Це " +"загальний шаблон для перехоплення винятку для реєстрації повідомлення про " +"виняткову ситуацію і повторного його підняття." + +#: ../../src/basics/exceptions.txt:300 +msgid "Creating custom exceptions" +msgstr "Створення винятків" + +#: ../../src/basics/exceptions.txt:302 +msgid "" +"Programs may name their own exceptions by creating a new exception class. " +"Exceptions should typically be derived from the Exception class, either " +"directly or indirectly." +msgstr "" +"Програми можуть називати власні винятки, створюючи новий клас винятків. " +"Винятки зазвичай мають бути похідними від класу Exception, прямо чи " +"опосередковано." + +#: ../../src/basics/exceptions.txt:306 +msgid "" +"Exception classes can be defined which do anything any other class can do, " +"but are usually kept simple, often only offering a number of attributes that " +"allow information about the error to be extracted by handlers for the " +"exception." +msgstr "" +"Можна визначити класи винятків, які роблять усе, що може зробити будь-який " +"інший клас, але зазвичай вони прості, часто пропонують лише ряд атрибутів, " +"які дозволяють обробникам витягувати інформацію про помилку для винятку." + +#: ../../src/basics/exceptions.txt:311 +msgid "" +"Most exceptions are defined with names that end in \"Error\", similar to the " +"naming of the standard exceptions." +msgstr "" +"Більшість винятків визначено з іменами, які закінчуються на \"Error\", " +"подібно до назв стандартних винятків." + +#: ../../src/basics/exceptions.txt:314 +msgid "" +"Many standard modules define their own exceptions to report errors that may " +"occur in functions they define." +msgstr "" +"Багато стандартних модулів визначають власні винятки, щоб повідомляти про " +"помилки, які можуть виникнути у функціях, які вони визначають." + +#: ../../src/basics/exceptions.txt:317 +msgid "User-defined exception" +msgstr "Виняток, визначений користувачем" diff --git a/src/_locales/uk/LC_MESSAGES/basics/functions.po b/src/_locales/uk/LC_MESSAGES/basics/functions.po new file mode 100644 index 000000000..56f5900e6 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/functions.po @@ -0,0 +1,751 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.10.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-24 02:19+0300\n" +"PO-Revision-Date: 2023-10-24 02:21+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/functions.txt:-1 +msgid "Python functions" +msgstr "Функції в Python" + +#: ../../src/basics/functions.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/functions.txt:-1 +msgid "python, basics, functions" +msgstr "python, basics, functions" + +#: ../../src/basics/functions.txt:8 +msgid "Functions" +msgstr "Функції" + +#: ../../src/basics/functions.txt:10 +msgid "" +"You may be familiar with the mathematical concept of a **function**. It is a " +"relationship or mapping between one or more inputs and a set of outputs." +msgstr "" +"Можливо, ви знайомі з математичним поняттям **функція**. Це відношення між " +"одним або декількома вхідними параметрами та набором результатів." + +#: ../../src/basics/functions.txt:13 +msgid "z = f(x, y)" +msgstr "z = f(x, y)" + +#: ../../src/basics/functions.txt:17 +msgid "" +"Here ``f`` is a function that operates on the inputs ``x`` and ``y``, and " +"its output is bind to ``z``." +msgstr "" +"Тут ``f`` - це функція, яка оперує параметрами ``x`` та ``y``, а її " +"результат прив'язаний до ``z``." + +#: ../../src/basics/functions.txt:20 +msgid "" +"In programming a **function** is a self-contained block of code that " +"encapsulate a specific task or related group of tasks." +msgstr "" +"У програмуванні **функція** - це автономний блок коду, який інкапсулює певну " +"задачу або пов'язану групу задач." + +#: ../../src/basics/functions.txt:23 +msgid "" +"You may be familiar with some built-in functions like ``max``, ``min``, " +"``len`` etc." +msgstr "" +"Ви можете бути знайомі з деякими вбудованими функціями, такими як ``max``, " +"``min``, ``len`` тощо." + +#: ../../src/basics/functions.txt:28 +msgid "The usual syntax for defining a Python function is as follows:" +msgstr "Звичайний синтаксис для визначення функції Python наступний:" + +#: ../../src/basics/functions.txt:36 ../../src/basics/functions.txt:483 +msgid "Component" +msgstr "Компонент" + +#: ../../src/basics/functions.txt:36 ../../src/basics/functions.txt:483 +msgid "Meaning" +msgstr "Значення" + +#: ../../src/basics/functions.txt:38 +msgid "``def``" +msgstr "``def``" + +#: ../../src/basics/functions.txt:38 ../../src/basics/functions.txt:485 +msgid "The keyword that informs Python that a function is being defined" +msgstr "Ключове слово, яке інформує Python про те, що визначається функція" + +#: ../../src/basics/functions.txt:41 +msgid "````" +msgstr "````" + +#: ../../src/basics/functions.txt:41 +msgid "A valid Python identifier that names the function" +msgstr "Валідний ідентифікатор Python, який називає функцію" + +#: ../../src/basics/functions.txt:43 ../../src/basics/functions.txt:488 +msgid "````" +msgstr "````" + +#: ../../src/basics/functions.txt:43 ../../src/basics/functions.txt:488 +msgid "" +"An optional, comma-separated list of parameters that may be passed to the " +"function" +msgstr "" +"Необов'язковий список параметрів через кому, які можуть бути передані у " +"функцію" + +#: ../../src/basics/functions.txt:46 +msgid "````" +msgstr "````" + +#: ../../src/basics/functions.txt:46 +msgid "A block of valid Python statements; **body** of the function" +msgstr "Блок допустимих операторів Python; **тіло** функції" + +#: ../../src/basics/functions.txt:50 +msgid "The syntax for calling a Python function is as follows:" +msgstr "Синтаксис виклику функції Python наступний:" + +#: ../../src/basics/functions.txt:56 +msgid "" +"The ```` are the values passed into the function. They correspond " +"to the ```` in the function definition. You can define a " +"function that doesn't take any arguments, but the parentheses are still " +"required. Both a function definition and a function call must always include " +"parentheses, even if they're empty." +msgstr "" +"Значення ```` - це значення, що передаються у функцію. Вони " +"відповідають ```` у визначенні функції. Ви можете визначити " +"функцію, яка не приймає жодних аргументів, але дужки все одно є " +"обов'язковими. І визначення функції, і її виклик завжди повинні містити " +"дужки, навіть якщо вони порожні." + +#: ../../src/basics/functions.txt:63 +msgid "Argument passing" +msgstr "Передача аргументів" + +#: ../../src/basics/functions.txt:66 +msgid "More often, you want to **pass data into a function**." +msgstr "Найчастіше вам потрібно **передати дані у функцію**." + +#: ../../src/basics/functions.txt:69 +msgid "Positional arguments" +msgstr "Позиційні аргументи" + +#: ../../src/basics/functions.txt:73 +msgid "" +"Because of the way they're defined and used, positional arguments are also " +"called *required arguments*." +msgstr "" +"Через те, як вони визначаються і використовуються, позиційні аргументи також " +"називають *обов'язковими аргументами*." + +#: ../../src/basics/functions.txt:76 +msgid "" +"The most straightforward way to pass arguments to a function is with " +"**positional arguments**. In the function definition, you specify a comma-" +"separated list of parameters inside the parentheses. When the function is " +"called, you specify a corresponding list of arguments." +msgstr "" +"Найпростіший спосіб передачі аргументів у функцію - за допомогою " +"**позиційних аргументів**. У визначенні функції ви вказуєте список " +"параметрів, розділених комами, всередині круглих дужок. Коли функція " +"викликається, ви вказуєте відповідний список аргументів." + +#: ../../src/basics/functions.txt:82 +msgid "" +"The parameters behave like **variables** that are defined locally to the " +"function." +msgstr "Параметри поводяться як **змінні**, визначені локально у функції." + +#: ../../src/basics/functions.txt:85 +msgid "" +"Although positional arguments are the most straightforward way to pass data " +"to a function, they also afford the least flexibility. For starters, the " +"**order** of the arguments in the call must match the order of the " +"parameters in the definition." +msgstr "" +"Хоча позиційні аргументи є найпростішим способом передачі даних у функцію, " +"вони також забезпечують найменшу гнучкість. Для початку, **порядок** " +"аргументів у виклику повинен відповідати порядку параметрів у визначенні." + +#: ../../src/basics/functions.txt:90 +msgid "" +"There's nothing to stop you from specifying positional arguments out of " +"order. The function even may still run, but it's very unlikely to produce " +"the correct results." +msgstr "" +"Ніщо не заважає вам вказати позиційні аргументи в неправильному порядку. " +"Функція навіть може запуститися, але навряд чи видасть правильні результати." + +#: ../../src/basics/functions.txt:96 +msgid "" +"It's responsibility of the programmer who defines the function to document " +"what the appropriate arguments should be, and it's the responsibility of the " +"user of the function to be aware of that information and abide by it." +msgstr "" +"Програміст, який визначає функцію, зобов'язаний задокументувати, якими мають " +"бути відповідні аргументи, а користувач функції зобов'язаний знати цю " +"інформацію і дотримуватися її." + +#: ../../src/basics/functions.txt:100 +msgid "" +"With positional arguments, the arguments in the call and the parameters in " +"the definition must agree not only in order, but in number as well." +msgstr "" +"З позиційними аргументами аргументи у виклику та параметри у визначенні " +"повинні узгоджуватися не тільки за порядком, але й за кількістю." + +#: ../../src/basics/functions.txt:104 +msgid "Keyword arguments" +msgstr "Аргументи за ключовими словами" + +#: ../../src/basics/functions.txt:106 +msgid "" +"When calling a function, you can specify arguments in the form " +"``=``. In that case, each ```` must match a " +"parameter in the function definition. Referencing a keyword that doesn't " +"match any of these declared parameters generates an exception." +msgstr "" +"При виклику функції можна вказувати аргументи у вигляді " +"``=``. У цьому випадку кожен ```` повинен " +"відповідати параметру у визначенні функції. Звернення до ключового слова, " +"яке не відповідає жодному з цих оголошених параметрів, генерує виключення." + +#: ../../src/basics/functions.txt:111 +msgid "" +"Using keyword arguments lifts the restriction on arguments order. Each " +"keyword argument explicitly designates a specific parameter by name, so you " +"can specify them in any order and Python will still know which argument goes " +"with which parameter." +msgstr "" +"Використання аргументів з ключовими словами знімає обмеження на порядок " +"аргументів. Кожне ключове слово-аргумент явно вказує на конкретний параметр " +"за назвою, тому ви можете вказати їх у довільному порядку, і Python все одно " +"знатиме, який аргумент йде з яким параметром." + +#: ../../src/basics/functions.txt:116 +msgid "" +"Like with positional arguments, though, the number of arguments and " +"parameters must still match." +msgstr "" +"Як і у випадку з позиційними аргументами, кількість аргументів і параметрів " +"має збігатися." + +#: ../../src/basics/functions.txt:119 +msgid "" +"You can call a function using both positional and keyword arguments. Once " +"you've specified a keyword argument, there can't be any positional arguments " +"to the right of it." +msgstr "" +"Ви можете викликати функцію, використовуючи як позиційні, так і ключові " +"аргументи. Після того, як ви вказали ключове слово, праворуч від нього не " +"може бути жодних позиційних аргументів." + +#: ../../src/basics/functions.txt:124 +msgid "Default values" +msgstr "Значення за замовчуванням" + +#: ../../src/basics/functions.txt:126 +msgid "" +"If a parameter specified in the function definition has the form of " +"``==``, then ```` becomes a default value for that " +"parameter. Parameters defined this way are referred to as **default or " +"optional parameters**." +msgstr "" +"Якщо параметр, вказаний у визначенні функції, має вигляд " +"``==``, то значенням за замовчуванням для цього параметра стає " +"````. Параметри, визначені таким чином, називаються **параметрами за " +"замовчуванням або необов'язковими параметрами**." + +#: ../../src/basics/functions.txt:132 +msgid "Mutable default parameter values" +msgstr "Змінювані значення параметрів за замовчуванням" + +#: ../../src/basics/functions.txt:133 +msgid "" +"Things can get weird if you specify a default parameter value that is a " +"mutable object." +msgstr "" +"Ситуація може ускладнитися, якщо ви вкажете значення параметра за " +"замовчуванням, який є змінюваним об'єктом." + +#: ../../src/basics/functions.txt:151 +msgid "" +"In Python default parameter values are **defined only once** when the " +"function is defined. The default value isn't re-defined each time the " +"function is called. For the example above, each time the " +"``add_to_container`` function is called without passing ``container`` " +"argument, the ``.append`` statement is performed on the same list." +msgstr "" +"У Python значення параметрів за замовчуванням **визначаються лише один раз** " +"під час визначення функції. Значення за замовчуванням не перевизначається " +"при кожному виклику функції. У наведеному вище прикладі кожного разу, коли " +"функція ``add_to_container`` викликається без передачі аргументу " +"``container``, оператор ``.append`` виконується над тим самим списком." + +#: ../../src/basics/functions.txt:158 +msgid "Mutable and immutable arguments" +msgstr "Змінні та незмінні аргументи" + +#: ../../src/basics/functions.txt:162 +msgid "" +"Roughly, you may consider immutable object as passed-by-value, and mutable " +"objects as passed-by-reference. However, that's not actual true." +msgstr "" +"Грубо кажучи, ви можете вважати незмінний об'єкт переданим значенням, а " +"змінювані об'єкти - переданим посиланням. Однак, це не зовсім так." + +#: ../../src/basics/functions.txt:166 +msgid "" +"In programming language design, there are two common paradigms for passing " +"an argument to a function:" +msgstr "" +"У мові програмування існує дві поширені парадигми передачі аргументу у " +"функцію:" + +#: ../../src/basics/functions.txt:169 +msgid "" +"**pass-by-value** means a copy of the argument is passed to the function." +msgstr "" +"**передати-за-значенням** означає, що у функцію передається копія аргументу." + +#: ../../src/basics/functions.txt:170 +msgid "" +"**pass-by-reference** means a reference to the argument is passed to the " +"function." +msgstr "" +"**передати-за-посиланням** означає, що у функцію передається посилання на " +"аргумент." + +#: ../../src/basics/functions.txt:173 +msgid "" +"Are parameters in Python pass-by-value or pass-by-reference? They're " +"neither, exactly. That's because a reference doesn't mean quite the same " +"thing in Python as it does in C-like languages." +msgstr "" +"Чи є параметри в Python переданими за значенням або за посиланням? Вони не є " +"ні тими, ні іншими. Це тому, що посилання в Python означає не зовсім те " +"саме, що в C-подібних мовах." + +#: ../../src/basics/functions.txt:177 +msgid "" +"Recall that in Python, every piece of data is an **object**. A reference " +"points to an object, not a specific memory location." +msgstr "" +"Нагадаємо, що у Python кожен фрагмент даних є **об'єктом**. Посилання вказує " +"на об'єкт, а не на конкретну ділянку пам'яті." + +#: ../../src/basics/functions.txt:180 +msgid "Take a look on the code below:" +msgstr "Погляньте на код нижче:" + +#: ../../src/basics/functions.txt:188 +msgid "These assignment statements have the following meaning:" +msgstr "Ці оператори присвоювання мають наступне значення:" + +#: ../../src/basics/functions.txt:190 +msgid "**Line 1** cause ``value`` to point to an object whose value is ``24``." +msgstr "" +"**Рядок 1** призводить до того, що ``value`` вказує на об'єкт, значенням " +"якого є ``24``." + +#: ../../src/basics/functions.txt:191 +msgid "" +"**Line 2** reassign ``value`` as a new reference to a different object whose " +"value is ``42``." +msgstr "" +"**Рядок 2** перепризначає ``value`` як нове посилання на інший об'єкт, " +"значенням якого є ``42``." + +#: ../../src/basics/functions.txt:194 +msgid "" +"In Python, when you pass an argument to a function, a similar *rebinding* " +"occurs." +msgstr "" +"У Python, коли ви передаєте аргумент у функцію, відбувається аналогічне " +"*переприв'язування*." + +#: ../../src/basics/functions.txt:207 +msgid "" +"In the main program, the statement ``x = 5`` on line 5 creates a reference " +"named ``x`` bound to an object whose value is ``5``. ``reassign`` is then " +"called on line 6 with ``x`` as its argument. When a function first starts, a " +"new reference called ``fx`` is created, which initially points to the same " +"``5`` object. However, when the statement ``fx = 10`` on line 2 is executed, " +"``reassign`` rebinds ``fx`` to a new object whose value is ``10``. From now, " +"the two references ``x`` and ``fx`` are uncoupled one from another. Nothing " +"else that function does will affect ``x``, and when function terminates, " +"``x`` will still point to the object ``5``, as it did prior to the function " +"call." +msgstr "" +"В основній програмі оператор ``x = 5`` у рядку 5 створює посилання з іменем " +"``x``, пов'язане з об'єктом, значенням якого є ``5``. потім у рядку 6 " +"викликається функція ``reassign`` з ``x`` як аргументом. При першому запуску " +"функції створюється нове посилання ``fx``, яке спочатку вказує на той самий " +"об'єкт ``5``. Однак, коли виконується оператор ``fx = 10`` у рядку 2, " +"``reassign`` перепризначає ``fx`` на новий об'єкт, значенням якого є ``10``. " +"Відтепер два посилання ``x`` і ``fx`` від'єднано одне від одного. Ніякі інші " +"дії функції не вплинуть на ``x``, і коли функція завершиться, ``x`` все ще " +"вказуватиме на об'єкт ``5``, як це було до виклику функції." + +#: ../../src/basics/functions.txt:218 +msgid "" +"You can confirm all this using ``id()``. Here's a slightly augmented version " +"of the code above:" +msgstr "" +"Ви можете підтвердити все це за допомогою ``id()``. Ось дещо доповнена " +"версія коду вище:" + +#: ../../src/basics/functions.txt:235 +msgid "The outputs will look like:" +msgstr "Результати будуть виглядати так:" + +#: ../../src/basics/functions.txt:246 +msgid "" +"Python's argument-passing mechanism has been called **pass-by-assignment**. " +"You may also see terms pass-by-object, pass-by-object-reference, or pass-by-" +"sharing. This is because parameter names are bound to objects on function " +"entry in Python, and assignment is also the process of binding a name to an " +"object." +msgstr "" +"Механізм передачі аргументів у Python називається **передача-за-" +"присвоєнням** (**pass-by-assignment**). Ви також можете зустріти терміни " +"pass-by-object, pass-by-object-reference або pass-by-sharing. Це пов'язано з " +"тим, що імена параметрів прив'язуються до об'єктів під час виклику функції у " +"Python, а присвоювання - це також процес прив'язки імені до об'єкта." + +#: ../../src/basics/functions.txt:252 +msgid "" +"The key takeaway here is that Python function can't change the value of an " +"argument by reassigning the corresponding parameter to something else." +msgstr "" +"Ключовим моментом тут є те, що функція Python не може змінити значення " +"аргументу, перепризначивши відповідний параметр на щось інше." + +#: ../../src/basics/functions.txt:255 +msgid "" +"However, functions can use references to make modifications inside of a " +"mutable objects." +msgstr "" +"Однак, функції можуть використовувати посилання для модифікацій всередині " +"змінюваних об'єктів." + +#: ../../src/basics/functions.txt:271 +msgid "The return statement" +msgstr "Оператор повернення" + +#: ../../src/basics/functions.txt:273 +msgid "It serves two purposes:" +msgstr "Він служить двом цілям:" + +#: ../../src/basics/functions.txt:275 +msgid "" +"It immediately terminates the function and passes execution control back to " +"the caller." +msgstr "" +"Він негайно завершує функцію і передає керування виконанням назад тому, хто " +"її викликав." + +#: ../../src/basics/functions.txt:277 +msgid "" +"It provides a mechanism by which the function can pass data back to the " +"caller." +msgstr "" +"Він надає механізм, за допомогою якого функція може передавати дані назад " +"тому, хто її викликає." + +#: ../../src/basics/functions.txt:280 +msgid "" +"The return statement can be used inside of a function or a method to send " +"the result back to the caller. It consists of the ``return`` Python keyword " +"and an optional return value." +msgstr "" +"Оператор return можна використовувати всередині функції або методу, щоб " +"відправити результат назад тому, хто його викликає. Він складається з " +"ключового слова ``return`` та необов'язкового значення, що повертається." + +#: ../../src/basics/functions.txt:284 +msgid "" +"The return value of a Python function can be any Python object (and you " +"should remember - everything in Python is an object)." +msgstr "" +"Значенням, що повертається функцією, може бути будь-який об'єкт Python (і ви " +"повинні пам'ятати - все в Python є об'єктом)." + +#: ../../src/basics/functions.txt:287 +msgid "" +"You can omit the return value and use bare ``return`` without a return " +"value. You can also omit the entire ``return`` statement. In both cases, the " +"return value will be ``None``. So, Python functions always have the return " +"value; in case it hasn't been specified - it's ``None``." +msgstr "" +"Ви можете опустити значення, що повертається, і використовувати просто " +"``return`` без значення, що повертається. Ви також можете опустити всю " +"інструкцію ``return``. В обох випадках значенням, що повертається, буде " +"``None``. Отже, функції Python завжди мають значення, що повертається, а " +"якщо його не вказано - це ``None``." + +#: ../../src/basics/functions.txt:292 +msgid "**Returning vs Printing**" +msgstr "**return проти print**" + +#: ../../src/basics/functions.txt:294 +msgid "" +"If you're working in an interactive session, then you might think that " +"printing a value and returning a value are equivalent. Consider the " +"following two functions:" +msgstr "" +"Якщо ви працюєте в інтерактивному сеансі, ви можете подумати, що виведення " +"значення і повернення значення еквівалентні. Розглянемо дві наступні функції:" + +#: ../../src/basics/functions.txt:310 +msgid "And their output:" +msgstr "Та результати їх викликів:" + +#: ../../src/basics/functions.txt:319 +msgid "" +"Both functions seems to do the same thing. But only the second one function " +"actually returns a value, when the first one returns nothing (or **NoneType " +"object**)." +msgstr "" +"Здається, що обидві функції роблять одне й те саме. Але тільки друга функція " +"насправді повертає значення, тоді як перша не повертає нічого (або " +"**NoneType об'єкт**)." + +#: ../../src/basics/functions.txt:324 +msgid "Return multiple values" +msgstr "Повернення декількох значень" + +#: ../../src/basics/functions.txt:326 +msgid "" +"You can use a return statement to return multiple values from a function. To " +"do that, you just need to supply several return values separated by commas. " +"The function will return a tuple of values." +msgstr "" +"Ви можете використовувати інструкцію return для повернення декількох значень " +"з функції. Для цього вам просто потрібно вказати декілька значень, що " +"повертаються, розділених комами. Функція поверне їх як кортеж." + +#: ../../src/basics/functions.txt:342 +msgid "" +"The built-in ``divmod`` function is also an example of a function that " +"returns multiple values. The function takes two (non-complex) numbers as " +"arguments and returns two numbers, the quotient of the two input values and " +"the remainder of the division." +msgstr "" +"Вбудована функція ``divmod`` також є прикладом функції, яка повертає " +"декілька значень. Функція отримує два (нескладних) числа як аргументи і " +"повертає два числа - частку від ділення двох вхідних значень і залишок від " +"ділення." + +#: ../../src/basics/functions.txt:348 +msgid "Variable-length argument list" +msgstr "Список аргументів змінної довжини" + +#: ../../src/basics/functions.txt:350 +msgid "" +"In some cases, when you're defining a function, you may not know beforehand " +"how many arguments you'll want it to take." +msgstr "" +"У деяких випадках, коли ви визначаєте функцію, ви можете не знати " +"заздалегідь, скільки аргументів ви хочете, щоб вона приймала." + +#: ../../src/basics/functions.txt:353 +msgid "" +"For example, a function that computes an average of several values may look " +"something like this:" +msgstr "" +"Наприклад, функція, яка обчислює середнє арифметичне декількох значень, може " +"виглядати приблизно так:" + +#: ../../src/basics/functions.txt:361 +msgid "" +"However, as you're already seen, when positional arguments are used, the " +"number of arguments passed must match the number of parameters declared." +msgstr "" +"Однак, як ви вже бачили, коли використовуються позиційні аргументи, " +"кількість переданих аргументів повинна відповідати кількості оголошених " +"параметрів." + +#: ../../src/basics/functions.txt:365 +msgid "Argument tuple packing" +msgstr "Пакування аргументів до кортежа" + +#: ../../src/basics/functions.txt:367 +msgid "" +"When a parameter name in a function definition is preceded by an asterisk " +"(\\*), it indicates **argument tuple packing**. Any corresponding arguments " +"in a function call are packed into a tuple that the function can refer to by " +"the given parameter name." +msgstr "" +"Коли імені параметра у визначенні функції передує зірочка (\\*), це означає " +"**упакування кортежу аргументів**. Будь-які відповідні аргументи у виклику " +"функції упаковуються у кортеж, на який функція може посилатися за вказаним " +"іменем параметра." + +#: ../../src/basics/functions.txt:377 +msgid "" +"Any name can be used, but *args* is so commonly chosen that it's practically " +"a standard." +msgstr "" +"Можна використовувати будь-яке ім'я, але *args* є настільки поширеним, що " +"стало практично стандартом." + +#: ../../src/basics/functions.txt:381 +msgid "Argument tuple unpacking" +msgstr "Розпакування кортежу аргументів" + +#: ../../src/basics/functions.txt:383 +msgid "" +"An analogous operation is available on the other side of the equation in a " +"function call. When an argument in a function call is preceded by an " +"asterisk, it indicates that the argument is a tuple that should be " +"**unpacked** and passed to the function as separate values." +msgstr "" +"Аналогічна операція доступна з іншого боку рівняння у виклику функції. Якщо " +"перед аргументом у виклику функції стоїть зірочка, це означає, що аргумент є " +"кортежем, який слід **розпакувати** і передати у функцію як окремі значення." + +#: ../../src/basics/functions.txt:399 +msgid "" +"Although this type of unpacking is called **tuple** unpacking, it doesn't " +"only work with tuples. The asterisk can be applied to any iterable in a " +"function call." +msgstr "" +"Хоча цей тип розпакування називається **розпакуванням кортежів**, він працює " +"не лише з кортежами. Зірочка може бути застосована до будь-якого ітеруємого " +"об'єкта у виклику функції." + +#: ../../src/basics/functions.txt:414 +msgid "You can even do tuple packing and unpacking at the same time." +msgstr "Ви навіть можете одночасно пакувати та розпаковувати кортежі." + +#: ../../src/basics/functions.txt:426 +msgid "Argument dictionary packing" +msgstr "Пакування аргументів до словника" + +#: ../../src/basics/functions.txt:428 +msgid "" +"Python has a similar operator, the double asterisk (\\*\\*), which can be " +"used with function parameters to specify **dictionary packing**. Preceding " +"parameter in a function definition be a double asterisk indicates that the " +"corresponding arguments, which are expected to be keyword arguments " +"(``key=value`` pairs), should be packed into a dictionary." +msgstr "" +"У мові Python є подібний оператор, подвійна зірочка (\\*\\*), який можна " +"використовувати з параметрами функції для вказівки **пакування словників**. " +"Передування параметру у визначенні функції подвійною зірочкою вказує на те, " +"що відповідні аргументи, які, як очікується, є аргументами ключових слів " +"(пари ``ключ=значення``), мають бути упаковані у словник." + +#: ../../src/basics/functions.txt:444 +msgid "" +"Again, any name can be used, but the peculiar *kwargs* (which is short for " +"*keyword args*) is nearly standard." +msgstr "" +"Знову ж таки, можна використовувати будь-яке ім'я, але особливе *kwargs* (що " +"є скороченням від *keyword args*) є майже стандартним." + +#: ../../src/basics/functions.txt:448 +msgid "Argument dictionary unpacking" +msgstr "Розапакування аргументів зі словника" + +#: ../../src/basics/functions.txt:450 +msgid "" +"This is analogous to argument tuple unpacking. When the double asterisk " +"precedes an argument in a function call, it specifies that the argument is a " +"dictionary that should be unpacked, with the resulting items passed to the " +"function as keyword arguments." +msgstr "" +"Це аналогічно розпакуванню кортежу аргументів. Коли подвійна зірочка стоїть " +"перед аргументом у виклику функції, вона вказує на те, що аргумент є " +"словником, який слід розпакувати, а отримані елементи передати у функцію як " +"аргументи ключових слів." + +#: ../../src/basics/functions.txt:468 +msgid "Lambda functions" +msgstr "Лямбда функції" + +#: ../../src/basics/functions.txt:470 +msgid "" +"Lambda expressions in Python and other programming languages have their " +"roots in lambda calculus, a model of computation invented by Alonzo Church. " +"Python is not inherently a functional language, but it adopted some " +"functional concepts early on. In January 1994, ``map()``, ``filter()``, " +"``reduce()``, and the lambda operator were added to the language." +msgstr "" +"Лямбда-вирази в Python та інших мовах програмування беруть свій початок у " +"лямбда-обчисленні - моделі обчислень, винайденій Алонзо Черчем. За своєю " +"суттю Python не є функціональною мовою, але вона рано перейняла деякі " +"функціональні концепції. У січні 1994 року до мови було додано ``map()``, " +"``filter()``, ``reduce()`` та лямбда-оператор." + +#: ../../src/basics/functions.txt:476 +msgid "General lambda function syntax is:" +msgstr "Загальний синтаксис лямбда-функції такий:" + +#: ../../src/basics/functions.txt:485 +msgid "``lambda``" +msgstr "``lambda``" + +#: ../../src/basics/functions.txt:491 +msgid "````" +msgstr "````" + +#: ../../src/basics/functions.txt:491 +msgid "A valid Python expression; return statement" +msgstr "Валідний вираз Python; оператор повернення" + +#: ../../src/basics/functions.txt:502 +msgid "" +"The code sample above demonstrates the ``get_fullname`` Python function and " +"its lambda version. A lambda form presents syntactic distinctions from a " +"normal function. In particular, a lambda function has the following " +"characteristics:" +msgstr "" +"Наведений вище приклад коду демонструє функцію Python ``get_fullname`` та її " +"лямбда-версію. Лямбда-форма має синтаксичні відмінності від звичайної " +"функції. Зокрема, лямбда-функція має наступні характеристики:" + +#: ../../src/basics/functions.txt:506 +msgid "" +"It can only contain expressions and can’t include statements in its body." +msgstr "Він може містити лише вирази і не може включати в себе оператори." + +#: ../../src/basics/functions.txt:507 +msgid "It is written as a single line of execution." +msgstr "Він написаний у вигляді одного рядка виконання." + +#: ../../src/basics/functions.txt:508 +msgid "It does not support type annotations." +msgstr "Він не підтримує анотації типів." + +#: ../../src/basics/functions.txt:509 +msgid "" +"It can be immediately invoked (:abbr:`IIFE (Immediately Invoked Function " +"Execution)`)." +msgstr "" +"Її можна негайно викликати (:abbr:`IIFE (Immediately Invoked Function " +"Execution)`)." + +#: ../../src/basics/functions.txt:517 +msgid "Classic functional constructs" +msgstr "Класичні функціональні конструкції" diff --git a/src/_locales/uk/LC_MESSAGES/basics/index.po b/src/_locales/uk/LC_MESSAGES/basics/index.po new file mode 100644 index 000000000..6775d1adb --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/index.po @@ -0,0 +1,36 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:08+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/index.txt:-1 +msgid "Python course - Basics" +msgstr "Курс Python - Основи" + +#: ../../src/basics/index.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/index.txt:-1 +msgid "python, basics, index" +msgstr "python, basics, index" + +#: ../../src/basics/index.txt:8 +msgid "Python Basics" +msgstr "Основи Python" diff --git a/src/_locales/uk/LC_MESSAGES/basics/modules.po b/src/_locales/uk/LC_MESSAGES/basics/modules.po new file mode 100644 index 000000000..01c1fb384 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/modules.po @@ -0,0 +1,40 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:08+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/modules.txt:-1 +msgid "Modules and imports in Python" +msgstr "Модулі та імпорти в Pythons" + +#: ../../src/basics/modules.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/modules.txt:-1 +msgid "python, basics, modules, import" +msgstr "python, basics, modules, import" + +#: ../../src/basics/modules.txt:6 +msgid "Page is under construction" +msgstr "Сторінка в розробці" + +#: ../../src/basics/modules.txt:14 +msgid "Pythons Modules and Imports" +msgstr "Модулі та імпорт Pythons" diff --git a/src/_locales/uk/LC_MESSAGES/basics/pep8.po b/src/_locales/uk/LC_MESSAGES/basics/pep8.po new file mode 100644 index 000000000..737ef49d8 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/pep8.po @@ -0,0 +1,40 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:08+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/pep8.txt:-1 +msgid "PEP-8 style guide" +msgstr "Керівництво по стилю PEP8" + +#: ../../src/basics/pep8.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/pep8.txt:-1 +msgid "python, style, guide" +msgstr "python, style, guide" + +#: ../../src/basics/pep8.txt:8 +msgid "Page is under construction" +msgstr "Сторінка в розробці" + +#: ../../src/basics/pep8.txt:16 +msgid "Style Guides: PEP8" +msgstr "Керівництво по стилю: PEP8" diff --git a/src/_locales/uk/LC_MESSAGES/basics/stdtypes.po b/src/_locales/uk/LC_MESSAGES/basics/stdtypes.po new file mode 100644 index 000000000..ce7bc7a62 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/stdtypes.po @@ -0,0 +1,727 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-24 23:41+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/stdtypes.txt:-1 +msgid "Python built-in types" +msgstr "Вбудовані типи даних в Python" + +#: ../../src/basics/stdtypes.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/stdtypes.txt:-1 +msgid "python, basics" +msgstr "python, basics" + +#: ../../src/basics/stdtypes.txt:11 +msgid "Built-in Types" +msgstr "Вбудовані Типи" + +#: ../../src/basics/stdtypes.txt:13 +msgid "" +"The principal built-in types are numerics, sequences, mappings, classes, " +"instances and exceptions :cite:`docs-python:stdtypes`. This section covers " +"only the most base of them. Others will be discussed in the future within " +"their own topics." +msgstr "" +"Основними вбудованими типами є числа, послідовності, словники, класи, " +"екземпляри та винятки :cite:`docs-python:stdtypes`. У цьому розділі " +"розглянуто лише найпростіші з них. Інші будуть розглянуті в майбутньому у " +"відповідних темах." + +#: ../../src/basics/stdtypes.txt:19 +msgid "Numeric types" +msgstr "Числові типи" + +#: ../../src/basics/stdtypes.txt:21 +msgid "" +"There are 3 distinct numeric types: *integers*, *floating point numbers*, " +"and *complex numbers*. In addition, Booleans are a subtype of integers. " +"Integers have unlimited precision. Floating point numbers are usually " +"implemented using ``double`` in C. Complex numbers have a real and imaginary " +"part, which are each a floating point number." +msgstr "" +"Існує 3 різних числових типи: *цілі числа*, *числа з плаваючою комою* та " +"*комплексні числа*. Крім того, булеві значення є підтипом цілих чисел. Цілі " +"числа мають необмежену точність. Числа з плаваючою комою зазвичай " +"реалізуються за допомогою ``double`` у C. Комплексні числа мають дійсну та " +"уявну частини, кожна з яких є числом з плаваючою комою." + +#: ../../src/basics/stdtypes.txt:27 +msgid "" +"Numbers are created by numeric literals or as the result of built-in " +"functions and operators. Unadorned integer literals (including hex, octal " +"and binary numbers) yield integers. Numeric literals containing a decimal " +"point or an exponent sign yield floating point numbers. Appending ``j`` or " +"``J`` to a numeric literal yields an imaginary number (a complex number with " +"a zero real part) which you can add to an integer or float to get a complex " +"number with real and imaginary parts." +msgstr "" +"Числа створюються за допомогою числових літералів або як результат " +"вбудованих функцій та операторів. Цілочислені літерали без додатків " +"(включаючи шістнадцяткові, вісімкові та двійкові числа) створюють цілі " +"числа. Числові літерали, що містять десяткову крапку або знак експоненти, " +"дають числа з плаваючою комою. Додавання ``j`` або ``J`` до числового " +"літерала дає уявне число (комплексне число з нульовою дійсною частиною), яке " +"ви можете додати до цілого числа або числа з плаваючою комою, щоб отримати " +"комплексне число з дійсною та уявною частинами." + +#: ../../src/basics/stdtypes.txt:36 +msgid "Supported operations" +msgstr "Операції, які підтримуються" + +#: ../../src/basics/stdtypes.txt:39 ../../src/basics/stdtypes.txt:159 +#: ../../src/basics/stdtypes.txt:209 +msgid "Operation" +msgstr "Операція" + +#: ../../src/basics/stdtypes.txt:39 ../../src/basics/stdtypes.txt:159 +#: ../../src/basics/stdtypes.txt:209 +msgid "Result" +msgstr "Результат" + +#: ../../src/basics/stdtypes.txt:41 +msgid "``x + y``" +msgstr "``x + y``" + +#: ../../src/basics/stdtypes.txt:41 +msgid "sum of *x* and *y*" +msgstr "сума *x* і *y*" + +#: ../../src/basics/stdtypes.txt:43 +msgid "``x - y``" +msgstr "``x - y``" + +#: ../../src/basics/stdtypes.txt:43 +msgid "difference of *x* and *y*" +msgstr "різниця *x* і *y*" + +#: ../../src/basics/stdtypes.txt:45 +msgid "``x * y``" +msgstr "``x * y``" + +#: ../../src/basics/stdtypes.txt:45 +msgid "product of *x* and *y*" +msgstr "добуток *x* і *y*" + +#: ../../src/basics/stdtypes.txt:47 +msgid "``x / y``" +msgstr "``x / y``" + +#: ../../src/basics/stdtypes.txt:47 +msgid "quotient of *x* and *y*" +msgstr "частка *x* і *y*" + +#: ../../src/basics/stdtypes.txt:49 +msgid "``x // y``" +msgstr "``x // y``" + +#: ../../src/basics/stdtypes.txt:49 +msgid "floored quotient of *x* and *y*" +msgstr "поділ націло *x* і *y*" + +#: ../../src/basics/stdtypes.txt:51 +msgid "``x % y``" +msgstr "``x % y``" + +#: ../../src/basics/stdtypes.txt:51 +msgid "remainder of ``x / y``" +msgstr "залишок від ділення ``x / y``" + +#: ../../src/basics/stdtypes.txt:53 +msgid "``-x``" +msgstr "``-x``" + +#: ../../src/basics/stdtypes.txt:53 +msgid "*x* negated" +msgstr "*x* від'ємне" + +#: ../../src/basics/stdtypes.txt:55 +msgid "``+x``" +msgstr "``+x``" + +#: ../../src/basics/stdtypes.txt:55 +msgid "*x* unchanged" +msgstr "*x* без змін" + +#: ../../src/basics/stdtypes.txt:57 +msgid "``abs(x)``" +msgstr "``abs(x)``" + +#: ../../src/basics/stdtypes.txt:57 +msgid "absolute value or magnitude of *x*" +msgstr "абсолютне значення або величина *x*" + +#: ../../src/basics/stdtypes.txt:59 +msgid "``int(x)``" +msgstr "``int(x)``" + +#: ../../src/basics/stdtypes.txt:59 +msgid "*x* converted to integer" +msgstr "*x* перетворене в ціле число" + +#: ../../src/basics/stdtypes.txt:61 +msgid "``float(x)``" +msgstr "``float(x)``" + +#: ../../src/basics/stdtypes.txt:61 +msgid "*x* converted to floating point" +msgstr "*x* перетворене у число з плаваючою комою" + +#: ../../src/basics/stdtypes.txt:63 +msgid "``complex(re, im)``" +msgstr "``complex(re, im)``" + +#: ../../src/basics/stdtypes.txt:63 +msgid "" +"a complex number with real part *re*, imaginary part *im*. *im* defaults to " +"zero." +msgstr "" +"комплексне число з дійсною частиною *re* та уявною частиною *im*. За " +"замовчуванням *im* дорівнює нулю." + +#: ../../src/basics/stdtypes.txt:66 +msgid "``divmod(x, y)``" +msgstr "``divmod(x, y)``" + +#: ../../src/basics/stdtypes.txt:66 +msgid "the pair ``(x // y, x % y)``" +msgstr "об'єднує ``(x // y, x % y)``" + +#: ../../src/basics/stdtypes.txt:68 +msgid "``pow(x, y)`` ``x ** y``" +msgstr "``pow(x, y)`` ``x ** y``" + +#: ../../src/basics/stdtypes.txt:68 +msgid "*x* to the power *y*" +msgstr "*x* у степені *y*" + +#: ../../src/basics/stdtypes.txt:72 +msgid "" +"``x // y`` also referred to as integer division. The resultant value is a " +"whole integer, through the result's type is not necessarily int. The result " +"is always rounded towards minus infinity: ``1 // 2`` is ``0``" +msgstr "" +"``x // y`` також називається цілочисельним діленням. Значення результату є " +"цілим числом, оскільки тип результату не обов'язково int. Результат завжди " +"округлюється до мінус нескінченності: ``1 // 2`` є ``0``" + +#: ../../src/basics/stdtypes.txt:77 +msgid "" +"``float(x)`` also accepts the strings ``\"nan\"`` and ``\"inf\"`` with an " +"optional prefix \"+\" or \"-\" for :abbr:`NaN(Not a Number)` and positive " +"and negative infinity." +msgstr "" +"``float(x)`` також приймає рядки ``\"nan\"`` та ``\"inf\"`` з необов'язковим " +"префіксом \"+\" або \"-\" для :abbr:`NaN(Not a Number)`` та додатної і " +"від'ємної нескінченності." + +#: ../../src/basics/stdtypes.txt:82 +msgid "Code examples" +msgstr "Приклади коду" + +#: ../../src/basics/stdtypes.txt:84 +msgid "Integer numbers" +msgstr "Цілі числа" + +#: ../../src/basics/stdtypes.txt:98 +msgid "Floating point numbers" +msgstr "Числа з плаваючою комою" + +#: ../../src/basics/stdtypes.txt:114 ../../src/basics/stdtypes.txt:187 +#: ../../src/basics/stdtypes.txt:295 ../../src/basics/stdtypes.txt:304 +#: ../../src/basics/stdtypes.txt:333 +msgid "Value comparisons" +msgstr "Порівняння значень" + +#: ../../src/basics/stdtypes.txt:116 +msgid "" +"Numbers of built-in numeric types can be compared within and across their " +"types (with the restriction that complex numbers do not support order " +"comparison). Within the limits of the types involved, they compare " +"mathematically correct without loss of precision." +msgstr "" +"Числа вбудованих числових типів можна порівнювати всередині та між типами (з " +"обмеженням, що комплексні числа не підтримують порівняння порядків). У межах " +"відповідних типів вони порівнюються математично коректно без втрати точності." + +#: ../../src/basics/stdtypes.txt:121 +msgid "" +"The \"not-a-number\" values ``float(\"NaN\")`` and ``decimal." +"Decimal('NaN')`` are special. Any ordered comparison of a number to a not-a-" +"number value is false." +msgstr "" +"Значення \"не-число\" ``float(\"NaN\")`` та ``decimal.Decimal('NaN')`` є " +"спеціальними. Будь-яке впорядковане порівняння числа зі значенням \"не-" +"число\" є хибним." + +#: ../../src/basics/stdtypes.txt:125 +msgid "Sequence types" +msgstr "Типи послідовностей" + +#: ../../src/basics/stdtypes.txt:127 +msgid "" +"There are 3 basic sequence types: *lists*, *tuples*, and *range objects*. " +"Additional sequence types tailored for processing of binary data and text " +"strings are described in dedicated sections." +msgstr "" +"Існує 3 основних типи послідовностей: *списки*, *кортежі* та *об'єкти " +"діапазону*. Додаткові типи послідовностей, призначені для обробки двійкових " +"даних і текстових рядків, описано у відповідних розділах." + +#: ../../src/basics/stdtypes.txt:132 +msgid "Lists" +msgstr "Списки" + +#: ../../src/basics/stdtypes.txt:134 +msgid "" +"Lists are mutable sequences, typically used to store collections of items. " +"They may be constructed in several ways:" +msgstr "" +"Списки - це змінні послідовності, які зазвичай використовуються для " +"зберігання колекцій елементів. Вони можуть бути побудовані кількома " +"способами:" + +#: ../../src/basics/stdtypes.txt:137 +msgid "using a pair of square brackets to denote the empty list: ``[]``" +msgstr "" +"використовуючи пару квадратних дужок для позначення порожнього списку: ``[]``" + +#: ../../src/basics/stdtypes.txt:138 +msgid "" +"using square brackets, separating items with commas: ``[a]``, ``[a, b, c]``" +msgstr "" +"використовуючи квадратні дужки, розділяючи елементи комами: ``[a]``, ``[a, " +"b, c]``" + +#: ../../src/basics/stdtypes.txt:139 +msgid "using a list comprehension: ``[x for x in iterable]``" +msgstr "використовуючи генератори списків: ``[x for x in iterable]``" + +#: ../../src/basics/stdtypes.txt:140 +msgid "using the type constructor: ``list()`` or ``list(iterable)``" +msgstr "використовуючи конструктор типу: ``list()`` або ``list(iterable)``" + +#: ../../src/basics/stdtypes.txt:143 +msgid "Tuples" +msgstr "Кортежі" + +#: ../../src/basics/stdtypes.txt:145 +msgid "" +"Tuples are immutable sequences, typically used to store collections of data " +"or for cases where an immutable sequence of data is needed (such as allowing " +"storage in a ``set`` or ``dict`` instances). They may be constructed in a " +"number of ways:" +msgstr "" +"Кортежі - це незмінні послідовності, які зазвичай використовуються для " +"зберігання наборів даних або у випадках, коли потрібна незмінна " +"послідовність даних (наприклад, для зберігання в екземплярах ``set`` або " +"``dict``). Вони можуть бути побудовані кількома способами:" + +#: ../../src/basics/stdtypes.txt:150 +msgid "using a pair of parentheses to denote the empty tuple: ``()``" +msgstr "" +"використовуючи пару круглих дужок для позначення порожнього кортежу: ``()``" + +#: ../../src/basics/stdtypes.txt:151 +msgid "using a trailing comma for a singleton tuple: ``a,`` or ``(a, b, c)``" +msgstr "" +"з використанням кінцевої коми для одиночного кортежу: ``a,`` або ``(a, b, " +"c)``" + +#: ../../src/basics/stdtypes.txt:152 +msgid "separating items with commas: ``a, b, c`` or ``(a, b, c)``" +msgstr "розділення елементів комами: ``a, b, c`` або ``(a, b, c)``" + +#: ../../src/basics/stdtypes.txt:153 +msgid "using the type constructor: ``tuple()`` or ``tuple(iterable)``" +msgstr "з використанням конструктора типу: ``tuple()`` або ``tuple(iterable)``" + +#: ../../src/basics/stdtypes.txt:156 +msgid "Common operations" +msgstr "Спільні операції" + +#: ../../src/basics/stdtypes.txt:161 +msgid "``x in s`` ``x not in s``" +msgstr "``x in s`` ``x not in s``" + +#: ../../src/basics/stdtypes.txt:161 +msgid "" +"``True`` if an item of *s* equal to *x* ``False`` if an item of *s* equal to " +"*x*" +msgstr "" +"``True``, якщо елемент *s* дорівнює *x* ``False``, якщо елемент *s* дорівнює " +"*x*" + +#: ../../src/basics/stdtypes.txt:164 +msgid "``s + t``" +msgstr "``s + t``" + +#: ../../src/basics/stdtypes.txt:164 +msgid "the concatenation of *s* and *t*" +msgstr "конкатенація *s* та *t*" + +#: ../../src/basics/stdtypes.txt:166 +msgid "``s * n``" +msgstr "``s * n``" + +#: ../../src/basics/stdtypes.txt:166 +msgid "equivalent to adding *s* to itself *n* times" +msgstr "еквівалентно додаванню *s* до самого себе *n* разів" + +#: ../../src/basics/stdtypes.txt:168 +msgid "``s[i]``" +msgstr "``s[i]``" + +#: ../../src/basics/stdtypes.txt:168 +msgid "*i*-th item of *s*, origin 0" +msgstr "*i*-й елемент з *s*, походження 0" + +#: ../../src/basics/stdtypes.txt:170 +msgid "``s[i:j]`` ``s[i:j:k]``" +msgstr "``s[i:j]`` ``s[i:j:k]``" + +#: ../../src/basics/stdtypes.txt:170 +msgid "" +"slice of *s* from *i* to *j* with step *k*. any of these (or even all 3) may " +"be omitted." +msgstr "" +"фрагмент *s* від *i* до *j* з кроком *k*. будь-який з них (або навіть всі 3) " +"можна опустити." + +#: ../../src/basics/stdtypes.txt:173 +msgid "``len(s)``" +msgstr "``len(s)``" + +#: ../../src/basics/stdtypes.txt:173 +msgid "length of *s*" +msgstr "довжина *s*" + +#: ../../src/basics/stdtypes.txt:175 +msgid "``min(s)``" +msgstr "``min(s)``" + +#: ../../src/basics/stdtypes.txt:175 +msgid "smallest item of *s*" +msgstr "найменший елемент *s*" + +#: ../../src/basics/stdtypes.txt:177 +msgid "``max(s)``" +msgstr "``max(s)``" + +#: ../../src/basics/stdtypes.txt:177 +msgid "largest item of *s*" +msgstr "найбільший елемент *s*" + +#: ../../src/basics/stdtypes.txt:179 +msgid "``s.count(x)``" +msgstr "``s.count(x)``" + +#: ../../src/basics/stdtypes.txt:179 +msgid "total number of occurrences of *x* in *s*" +msgstr "загальна кількість входжень *x* у *s*" + +#: ../../src/basics/stdtypes.txt:181 +msgid "``s.index(x)`` ``s.index(x, i)`` ``s.index(x, i, j)``" +msgstr "``s.index(x)`` ``s.index(x, i)`` ``s.index(x, i, j)``" + +#: ../../src/basics/stdtypes.txt:181 +msgid "" +"index of the first occurrence of *x* in *s* at or after index *i* and before " +"index *j*" +msgstr "" +"індекс першого входження *x* у *s* на або після індексу *i* та перед " +"індексом *j*" + +#: ../../src/basics/stdtypes.txt:189 +msgid "" +"Sequences can be compared only within each of their types, with the " +"restriction that ranges do not support order comparison. Equality comparison " +"across these types results in inequality, and ordering comparison across " +"these types raises ``TypeError``." +msgstr "" +"Послідовності можна порівнювати лише в межах кожного типу, з обмеженням, що " +"діапазони не підтримують порівняння за порядком. Порівняння рівності між " +"цими типами призводить до нерівності, а порівняння порядку між цими типами " +"викликає ``TypeError``." + +#: ../../src/basics/stdtypes.txt:194 +msgid "" +"Sequences compare lexicographically using comparison of corresponding " +"elements. The built-in containers typically assume identical objects are " +"equal to themselves. Lexicographical comparison between built-in collections " +"works as follows:" +msgstr "" +"Послідовності порівнюються лексикографічно за допомогою порівняння " +"відповідних елементів. Вбудовані контейнери зазвичай вважають ідентичні " +"об'єкти рівними собі. Лексикографічне порівняння між вбудованими колекціями " +"працює наступним чином:" + +#: ../../src/basics/stdtypes.txt:199 +msgid "" +"For two collections to compare equal, they must be of the same type, have " +"the same length, and each pair of corresponding elements must compare equal." +msgstr "" +"Для того, щоб дві колекції були рівними, вони повинні бути одного типу, мати " +"однакову довжину і кожна пара відповідних елементів повинна порівнюватися " +"однаково." + +#: ../../src/basics/stdtypes.txt:201 +msgid "" +"Collections that supports order comparison are ordered the same as their " +"first unequal elements. If corresponding element does not exist, the shorter " +"collection is ordered first." +msgstr "" +"Колекції, що підтримують порівняння порядків, впорядковуються так само, як і " +"їх перші нерівні елементи. Якщо відповідного елемента не існує, то спочатку " +"впорядковується коротша колекція." + +#: ../../src/basics/stdtypes.txt:206 +msgid "Mutable sequence types" +msgstr "Типи змінних послідовностей" + +#: ../../src/basics/stdtypes.txt:211 +msgid "``s[i] = x``" +msgstr "``s[i] = x``" + +#: ../../src/basics/stdtypes.txt:211 +msgid "item *i* of *s* is replaced by *x*" +msgstr "елемент *i* в *s* замінюється на *x*" + +#: ../../src/basics/stdtypes.txt:213 +msgid "``s[i:j] = t``" +msgstr "``s[i:j] = t``" + +#: ../../src/basics/stdtypes.txt:213 +msgid "slice of *s* from *i* to *j* replaced by the contents of *t*" +msgstr "фрагмент *s* від *i* до *j*, замінений вмістом *t*" + +#: ../../src/basics/stdtypes.txt:216 +msgid "``del s[i:j]``" +msgstr "``del s[i:j]``" + +#: ../../src/basics/stdtypes.txt:216 +msgid "same as ``s[i:j] = []``" +msgstr "те саме, що ``s[i:j] = []``" + +#: ../../src/basics/stdtypes.txt:218 +msgid "``s[i:j:k] = t``" +msgstr "``s[i:j:k] = t``" + +#: ../../src/basics/stdtypes.txt:218 +msgid "the elements of *s* are replaced by those of *t* [#]_" +msgstr "елементи *s* замінюються елементами *t* [#]_" + +#: ../../src/basics/stdtypes.txt:220 +msgid "``del s[i:j:k]``" +msgstr "``del s[i:j:k]``" + +#: ../../src/basics/stdtypes.txt:220 +msgid "removes the elements of ``s[i:j:k]`` from the list" +msgstr "видаляє елементи ``s[i:j:k]`` зі списку" + +#: ../../src/basics/stdtypes.txt:222 +msgid "``s.append(x)``" +msgstr "``s.append(x)``" + +#: ../../src/basics/stdtypes.txt:222 +msgid "" +"appends *x* to the end of the sequence; the same as ``s[len(s):len(s)] = " +"[x]``" +msgstr "" +"додає *x* до кінця послідовності; те саме, що ``s[len(s):len(s)] = [x]``" + +#: ../../src/basics/stdtypes.txt:225 +msgid "``s.clear()``" +msgstr "``s.clear()``" + +#: ../../src/basics/stdtypes.txt:225 +msgid "removes all items from *s* (``del s[:]``) [#py33]_" +msgstr "видаляє всі елементи з *s* (``del s[:]``) [#py33]_" + +#: ../../src/basics/stdtypes.txt:227 +msgid "``s.copy()``" +msgstr "``s.copy()``" + +#: ../../src/basics/stdtypes.txt:227 +msgid "creates a shallow copy of *s* (``s[:]``) [#py33]_" +msgstr "створює поверхневу копію *s* (``s[:]``) [#py33]_" + +#: ../../src/basics/stdtypes.txt:229 +msgid "``s.extend(t)`` ``s += t``" +msgstr "``s.extend(t)`` ``s += t``" + +#: ../../src/basics/stdtypes.txt:229 +msgid "extends *s* with the contents of *t*" +msgstr "розширює *s* вмістом *t*" + +#: ../../src/basics/stdtypes.txt:232 +msgid "``s.insert(i, x)``" +msgstr "``s.insert(i, x)``" + +#: ../../src/basics/stdtypes.txt:232 +msgid "inserts *x* into *s* at the index *i*; same as ``s[i:i] = [x]``" +msgstr "вставляє *x* у *s* за індексом *i*; те саме, що ``s[i:i] = [x]``" + +#: ../../src/basics/stdtypes.txt:235 +msgid "``s.pop()``, ``s.pop(i)``" +msgstr "``s.pop()``, ``s.pop(i)``" + +#: ../../src/basics/stdtypes.txt:235 +msgid "" +"retrieves the item at *i* and also removes it from *s* (if *i* is omitted - " +"use the last one available index)" +msgstr "" +"отримує елемент за адресою *i*, а також видаляє його з *s* (якщо *i* " +"пропущено - використовуйте останній доступний індекс)" + +#: ../../src/basics/stdtypes.txt:238 +msgid "``s.remove(x)``" +msgstr "``s.remove(x)``" + +#: ../../src/basics/stdtypes.txt:238 +msgid "remove the first item that is equal to *x* from *s*" +msgstr "видалити перший елемент, який дорівнює *x*, із *s*" + +#: ../../src/basics/stdtypes.txt:240 +msgid "``s.reverse()``" +msgstr "``s.reverse()``" + +#: ../../src/basics/stdtypes.txt:240 +msgid "reverses the items of *s* in place" +msgstr "перевертає елементи *s* на місце" + +#: ../../src/basics/stdtypes.txt:243 +msgid "*t* must have the same length as the slice it is replacing" +msgstr "*t* повинен мати таку ж довжину, як і фрагмент, який він замінює" + +#: ../../src/basics/stdtypes.txt:244 +msgid "new in Python version 3.3" +msgstr "нове в Python версії 3.3" + +#: ../../src/basics/stdtypes.txt:247 +msgid "Text sequence type" +msgstr "Тип текстової послідовності" + +#: ../../src/basics/stdtypes.txt:250 +msgid "String methods" +msgstr "Методи рядків" + +#: ../../src/basics/stdtypes.txt:252 +msgid "" +"Strings implement all of the common sequence operations, along with the " +"additional methods." +msgstr "" +"Рядки реалізують всі звичайні операції з послідовністю, а також додаткові " +"методи." + +#: ../../src/basics/stdtypes.txt:297 +msgid "" +"Strings compare lexicographically using the numerical Unicode code points of " +"their characters." +msgstr "" +"Рядки порівнюються лексикографічно, використовуючи числові кодові точки " +"символів у Юнікоді." + +#: ../../src/basics/stdtypes.txt:301 +msgid "Set types" +msgstr "Типи множин" + +#: ../../src/basics/stdtypes.txt:306 +msgid "" +"Sets (instances of ``set`` or ``frozenset``) can be compared within and " +"across their types. They define order comparison operators to mean subset " +"and superset tests. Those relations do not define total ordering (e.g. two " +"sets ``{1, 2}`` and ``{2, 3}`` are not equal, nor subsets of one another, " +"nor supersets of one another)." +msgstr "" +"Множини (екземпляри ``set`` або ``frozenset``) можна порівнювати всередині " +"та між їхніми типами. Вони визначають оператори порівняння порядку, які " +"означають тести підмножин та надмножин. Ці відношення не визначають повного " +"впорядкування (наприклад, дві множини ``{1, 2}`` і ``{2, 3}`` не є рівними, " +"не є підмножинами одна одної і не є надмножинами одна одної)." + +#: ../../src/basics/stdtypes.txt:313 +msgid "Mapping type" +msgstr "Тип відображення" + +#: ../../src/basics/stdtypes.txt:315 +msgid "" +"A mapping object maps hashable values to arbitrary objects. Mappings are " +"mutable objects. There is currently ony one standard mapping type, the " +"*dictionary*. In few words mappings are collections of keys and their values." +msgstr "" +"Об'єкт зіставлення зіставляє хешовані значення з довільними об'єктами. " +"Відображення є змінними об'єктами. Наразі існує лише один стандартний тип " +"відображення, *dictionary*. Якщо кількома словами, то відображення - це " +"набори ключів та їхніх значень." + +#: ../../src/basics/stdtypes.txt:319 +msgid "" +"A dictionary's keys are almost arbitrary values. Values that are not " +"hashable may not be used as keys. Values that compare equal (such as ``1``, " +"``1.0`` and ``True``) can be used interchangeably to index the same " +"dictionary entry." +msgstr "" +"Ключі словника - це майже довільні значення. Значення, які не піддаються " +"хешуванню, не можна використовувати як ключі. Значення, які порівнюються як " +"рівні (наприклад, ``1``, ``1.0`` і ``True``), можуть використовуватися як " +"взаємозамінні для індексації однієї і тієї ж словникової статті." + +#: ../../src/basics/stdtypes.txt:323 +msgid "Dictionaries can be created by several means:" +msgstr "Словники можна створювати кількома способами:" + +#: ../../src/basics/stdtypes.txt:325 +msgid "Use braces to denote the empty dictionary: ``{}``" +msgstr "Використовуйте дужки для позначення порожнього словника: ``{}``" + +#: ../../src/basics/stdtypes.txt:326 +msgid "" +"Use a comma-separated list of ``key: value`` pairs with braces: " +"``{'first_name': 'Serhii', 'last_name': 'Horodilov', 'age': 34}``" +msgstr "" +"Використовуйте список пар ``key: value`` через кому з дужками: " +"``{'first_name': 'Serhii', 'last_name': 'Horodilov', 'age': 34}``" + +#: ../../src/basics/stdtypes.txt:328 +msgid "Use a dict comprehension: ``{x: x ** 2 for x in range(10)}``" +msgstr "Використовуючи генератори списків: ``{x: x 2 for x in range(10)}``" + +#: ../../src/basics/stdtypes.txt:329 +msgid "" +"Use the type constructor: ``dict()``, ``dict([('key', 100)])``, " +"``dict(key=100)``" +msgstr "" +"Використовуйте конструктор типу: ``dict()``, ``dict([('key', 100)])``, " +"``dict(key=100)``" + +#: ../../src/basics/stdtypes.txt:335 +msgid "" +"Instances of ``dict`` compare equal if and only if they have equal key-value " +"pairs." +msgstr "" +"Екземпляри ``dict`` порівнюються однаково тоді і тільки тоді, коли вони " +"мають однакові пари ключ-значення." + +#: ../../src/basics/stdtypes.txt:338 +msgid "Order comparisons raise ``TypeError``." +msgstr "Порівняння порядку викликає ``TypeError``." diff --git a/src/_locales/uk/LC_MESSAGES/basics/syntax.po b/src/_locales/uk/LC_MESSAGES/basics/syntax.po new file mode 100644 index 000000000..1342ff13f --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/syntax.po @@ -0,0 +1,263 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:08+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/syntax.txt:-1 +msgid "Python syntax" +msgstr "Синтаксис Python" + +#: ../../src/basics/syntax.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/syntax.txt:-1 +msgid "python, basics, syntax" +msgstr "python, basics, syntax" + +#: ../../src/basics/syntax.txt:8 +msgid "Python Syntax" +msgstr "Синтаксис Python" + +#: ../../src/basics/syntax.txt:10 +msgid "" +"As a natural language like English or Ukrainian has its own rules to write " +"down something, programming languages do. This makes them programming " +"**languages**." +msgstr "" +"Оскільки природна мова, як-от англійська чи українська, має власні правила " +"запису чогось, так і мови програмування роблять схожі речі. Це і робить їх " +"мовами програмування." + +#: ../../src/basics/syntax.txt:14 +msgid "" +"A programming language syntax is the set of rules and principles that govern " +"how code is written and structured in a given programming language. Syntax " +"encompasses the rules for writing statements, expressions, variables, data " +"types, control structures, and other constructs that make up the language." +msgstr "" +"Синтаксис мови програмування - це набір правил і принципів, які регулюють " +"написання та структурування коду даною мовою програмування. Синтаксис " +"охоплює правила написання операторів, виразів, змінних, типів даних, " +"керуючих структур та інших конструкцій, які складають мову." + +#: ../../src/basics/syntax.txt:19 +msgid "" +"The syntax of a programming language defines how code is organized and " +"interpreted by a compiler or interpreter. It defines the rules for writing " +"valid statements and expressions that can be understood and executed by the " +"language's runtime system." +msgstr "" +"Синтаксис мови програмування визначає, як код організовується та " +"інтерпретується компілятором або інтерпретатором. Він визначає правила " +"написання дійсних операторів і виразів, які можуть бути зрозумілі та " +"виконані системою виконання мови." + +#: ../../src/basics/syntax.txt:24 +msgid "" +"A programming language's syntax is designed to be both readable and " +"expressive, allowing programmers to write code that is easy to understand " +"and modify. Syntax often influences the style and structure of code, as well " +"as its maintainability and performance." +msgstr "" +"Синтаксис мови програмування розроблено таким чином, щоб він був читабельним " +"і виразним, дозволяючи програмістам писати код, який легко зрозуміти та " +"змінювати. Синтаксис часто впливає на стиль і структуру коду, а також на " +"його зручність обслуговування та продуктивність." + +#: ../../src/basics/syntax.txt:29 +msgid "" +"Different programming languages have different syntax, with some languages " +"being more concise and expressive than others. While syntax is an important " +"aspect of a programming language, it is only one of several factors that " +"determine its ease of use, flexibility, and suitability for different " +"programming tasks." +msgstr "" +"Різні мови програмування мають різний синтаксис, при цьому деякі мови є " +"більш лаконічними та виразнішими, ніж інші. Хоча синтаксис є важливим " +"аспектом мови програмування, він є лише одним із кількох факторів, які " +"визначають її легкість у використанні, гнучкість і придатність для різних " +"завдань програмування." + +#: ../../src/basics/syntax.txt:35 +msgid "" +"In the case of Python, the language's syntax defines how code is written and " +"structured in a way that is consistent, readable, and easy to understand. A " +"general overview is provided below, no need to dive deep in this now. All of " +"the following is to be discussed during the course. So, some of the key " +"aspects of Python's syntax include:" +msgstr "" +"У випадку Python синтаксис мови визначає, як код буде написаний і " +"структурований таким чином, щоб він був послідовним, читабельним і легким " +"для розуміння. Нижче наведено загальний огляд, немає потреби глибоко " +"занурюватися в це зараз. Усе наведене нижче має бути обговорено під час " +"курсу. Отже, деякі з ключових аспектів синтаксису Python включають:" + +#: ../../src/basics/syntax.txt +msgid "Indentation" +msgstr "Відступ" + +#: ../../src/basics/syntax.txt:42 +msgid "" +"Python uses whitespace, specifically indentation, to delimit blocks of code, " +"such as loops, conditionals, and functions. This means that the indentation " +"level of a line determines which block of code it belongs to." +msgstr "" +"Python використовує пробіли, зокрема відступи, для розмежування блоків коду, " +"таких як цикли, умови та функції. Це означає, що рівень відступу рядка " +"визначає, до якого блоку коду він належить." + +#: ../../src/basics/syntax.txt +msgid "Statement structure" +msgstr "Структура коду" + +#: ../../src/basics/syntax.txt:48 +msgid "" +"Python statements are typically written on one line, with the end of the " +"line indicating the end of the statement. However, if a statement is too " +"long to fit on one line, it can be continued across multiple lines using " +"backslashes." +msgstr "" +"Інструкції Python зазвичай пишуться в один рядок, причому кінець рядка " +"вказує на кінець інструкції. Проте, якщо оператор занадто довгий, щоб " +"поміститися в один рядок, його можна продовжити в кількох рядках, " +"використовуючи зворотні похилі риски." + +#: ../../src/basics/syntax.txt +msgid "Variables" +msgstr "Змінні" + +#: ../../src/basics/syntax.txt:54 +msgid "" +"In Python, variables are created automatically when a value is assigned to " +"them, and their type is inferred from the value. Variables can be assigned " +"values of different types, including integers, floats, strings, and more " +"complex data structures like lists and dictionaries." +msgstr "" +"У Python змінні створюються автоматично, якщо їм присвоюється значення, і " +"їхній тип визначається на основі значення. Змінним можна присвоювати " +"значення різних типів, включаючи цілі числа, числа з плаваючою комою, рядки " +"та складніші структури даних, такі як списки та словники." + +#: ../../src/basics/syntax.txt +msgid "Operators" +msgstr "Оператори" + +#: ../../src/basics/syntax.txt:60 +msgid "" +"Python supports a wide range of operators for performing arithmetic, " +"comparison, and logical operations. These include arithmetic operators like " +"``+``, ``-``, ``*``, and ``/``, as well as comparison operators like ``<``, " +"``>``, ``==``, and ``!=``." +msgstr "" +"Python підтримує широкий спектр операторів для виконання арифметичних, " +"порівнянь і логічних операцій. До них належать арифметичні оператори, такі " +"як ``+``, ``-``, ``*`` і ``/``, а також оператори порівняння, такі як " +"``<`` , ``>``, ``==`` і ``!=``." + +#: ../../src/basics/syntax.txt +msgid "Control flow" +msgstr "Контроль потоку" + +#: ../../src/basics/syntax.txt:66 +msgid "" +"Python provides control flow statements like if, else, elif, for, and while " +"to control the flow of execution in a program. These statements are used to " +"make decisions, repeat code, or perform actions based on conditions." +msgstr "" +"Python надає оператори потоку керування, як-от if, else, elif, for та while, " +"для керування потоком виконання в програмі. Ці оператори використовуються " +"для прийняття рішень, повторення коду або виконання дій на основі заданих " +"умов." + +#: ../../src/basics/syntax.txt +msgid "Functions" +msgstr "Функції" + +#: ../../src/basics/syntax.txt:72 +msgid "" +"In Python, functions are defined using the def keyword and can take " +"arguments and return values. The body of a function is defined using a block " +"of indented code." +msgstr "" +"У Python функції визначаються за допомогою ключового слова def і можуть " +"отримувати аргументи та повертати значення. Тіло функції визначається за " +"допомогою блоку коду з відступами." + +#: ../../src/basics/syntax.txt +msgid "Modules" +msgstr "Модулі" + +#: ../../src/basics/syntax.txt:77 +msgid "" +"Python has a large library of modules that provide pre-written code for a " +"variety of tasks. Modules can be imported into a program using the import " +"statement." +msgstr "" +"Python має велику бібліотеку модулів, які містять попередньо написаний код " +"для різноманітних завдань. Модулі можна імпортувати в програму за допомогою " +"оператора імпорту." + +#: ../../src/basics/syntax.txt +msgid "Exception handling" +msgstr "Обробка винятків" + +#: ../../src/basics/syntax.txt:82 +msgid "" +"Python provides a way to handle errors and exceptions in a program using the " +"try, except, else, and finally keywords. These statements allow a program to " +"gracefully recover from errors and continue executing." +msgstr "" +"Python надає спосіб обробки помилок і винятків у програмі за допомогою " +"ключових слів try, except, else і finally. Ці оператори дозволяють програмі " +"плавно відновлюватися після помилок і продовжувати виконання." + +#: ../../src/basics/syntax.txt:86 +msgid "In few words:" +msgstr "У кількох словах:" + +#: ../../src/basics/syntax.txt:88 +msgid "Input/Output example script" +msgstr "Приклад сценарію Input/Output" + +#: ../../src/basics/syntax.txt:107 +msgid "" +"The code snippet above demonstrates some basics abilities of Python to " +"gather data from the user, process it and print out back. Note the words " +"starting with a # (hash) symbol. This is a comment. Any sequence of " +"characters after the hash and till the line end are considered to be a " +"comment. These are for those people, who see the code and they are ignored " +"by the interpreter." +msgstr "" +"Наведений вище фрагмент коду демонструє деякі основні можливості Python " +"збирати дані від користувача, обробляти їх і друкувати назад. Зверніть увагу " +"на слова, що починаються символом #(решітка). Це коментар. Будь-яка " +"послідовність символів після хеша і до кінця рядка вважається коментарем. Це " +"необхідно, щоб люди які бачать код могли його зрозуміти, при цьому " +"інтерпретатор їх ігнорує." + +#: ../../src/basics/syntax.txt:113 +msgid "" +"On the other hand each individual line is the instruction for the " +"interpreter to perform some action, like gather inputs, do math, store data " +"in memory etc." +msgstr "" +"З іншого боку, кожен окремий рядок є вказівкою для інтерпретатора виконати " +"певну дію, як-от збір вхідних даних, виконання математичних розрахунків, " +"збереження даних у пам'яті тощо." diff --git a/src/_locales/uk/LC_MESSAGES/basics/testing.po b/src/_locales/uk/LC_MESSAGES/basics/testing.po new file mode 100644 index 000000000..a90022728 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/testing.po @@ -0,0 +1,40 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:07+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/testing.txt:-1 +msgid "Testing software in Python" +msgstr "Тестування в Python" + +#: ../../src/basics/testing.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/testing.txt:-1 +msgid "python, testing, unittest, pytest" +msgstr "python, testing, unittest, pytest" + +#: ../../src/basics/testing.txt:8 +msgid "Page is under construction" +msgstr "Сторінка в розробці" + +#: ../../src/basics/testing.txt:16 +msgid "Testing" +msgstr "Тестування" diff --git a/src/_locales/uk/LC_MESSAGES/basics/variables.po b/src/_locales/uk/LC_MESSAGES/basics/variables.po new file mode 100644 index 000000000..95b1e5a98 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/basics/variables.po @@ -0,0 +1,136 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# OLEKSANDR YEROMIN , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-18 00:01+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/basics/variables.txt:-1 +msgid "Variables in programming" +msgstr "Змінні в програмуванні" + +#: ../../src/basics/variables.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/basics/variables.txt:-1 +msgid "programming, basics, variables" +msgstr "programming, basics, variables" + +#: ../../src/basics/variables.txt:8 +msgid "Variables" +msgstr "Змінні" + +#: ../../src/basics/variables.txt:10 +msgid "" +"In computer science a **variable** is a named storage location in memory " +"that can hold a value (*data*). The value stored in a variable can be " +"changed or accessed by the program during its execution." +msgstr "" +"У комп'ютерних науках **змінна** - це іменована комірка пам'яті, яка може " +"зберігати значення (*дані*). Значення, що зберігається у змінній, може бути " +"змінене або доступне програмі під час її виконання." + +#: ../../src/basics/variables.txt:14 +msgid "" +"In Python, variables are created dynamically once a value is assigned to " +"them. This makes Python a dynamically typed language, which means that the " +"data type of a variable is inferred from the value assigned to it. So, you " +"do not need to declare a variable before using it, as in statically typed " +"languages." +msgstr "" +"У Python змінні створюються динамічно, щойно їм присвоюється значення. Це " +"робить Python динамічно типізованою мовою, що означає, що тип даних змінної " +"виводиться з присвоєного їй значення. Отже, вам не потрібно оголошувати " +"змінну перед її використанням, як у мовах зі статичною типізацією." + +#: ../../src/basics/variables.txt:19 +msgid "" +"The ability to create variables dynamically and infer their data type makes " +"Python code more concise and easier to read. However, it also requires " +"careful attention to variable naming and assignment to avoid unexpected " +"behavior." +msgstr "" +"Можливість динамічно створювати змінні та визначати тип їхніх даних робить " +"код Python лаконічнішим і легшим для читання. Однак, це також вимагає " +"ретельної уваги до іменування та присвоєння змінних, щоб уникнути " +"неочікуваної поведінки." + +#: ../../src/basics/variables.txt:23 +msgid "" +"In Python ``=`` (assignment operator) is used to set a value to some " +"variable, the portion on the left of the operator is a *variable name* and " +"the portion on the right is a *value* to assign to a variable." +msgstr "" +"У Python ``=`` (оператор присвоювання) використовується для присвоєння " +"значення деякій змінній, частина ліворуч від оператора - це *ім'я змінної*, " +"а частина праворуч - це *значення*, яке потрібно присвоїти змінній." + +#: ../../src/basics/variables.txt:27 +msgid "Variable assignment in Python" +msgstr "Присвоєння змінних у Python" + +#: ../../src/basics/variables.txt:34 +msgid "Variable assignment in Java" +msgstr "Присвоєння змінних у Java" + +#: ../../src/basics/variables.txt:42 +msgid "Naming" +msgstr "Іменування" + +#: ../../src/basics/variables.txt:44 +msgid "" +"In Python there are several rules that describe how to name your variables. " +"Some of these are requirements and cannot be ignored, others are rather " +"recommended than required and can be omitted. For now note, that a variable " +"name **cannot**:" +msgstr "" +"У Python є кілька правил, які описують, як називати ваші змінні. Деякі з них " +"є обов'язковими і не можуть бути проігноровані, інші є скоріше " +"рекомендаціями, і їх можна опустити. Наразі зауважте, що ім'я змінної **не " +"може**:" + +#: ../../src/basics/variables.txt:49 +msgid "a language keyword (like ``pass``, ``def`` or ``class``)" +msgstr "ключовим словом мови (наприклад, ``pass``, ``def`` або ``class``)" + +#: ../../src/basics/variables.txt:50 +msgid "start with a number (e.g. ``123``, ``1_something``)" +msgstr "починатись з числа (наприклад, ``123``, ``1_something``)" + +#: ../../src/basics/variables.txt:51 +msgid "contain special operators in it (``+``, ``-``, ``=`` etc.)" +msgstr "містити спеціальні оператори (``+``, ``-``, ``=`` тощо)." + +#: ../../src/basics/variables.txt:52 +msgid "contain white spaces" +msgstr "містити пробіли" + +#: ../../src/basics/variables.txt:54 +msgid "Also here are some general recommendation on naming anything:" +msgstr "" +"Також тут є кілька загальних рекомендацій щодо того, як називати будь-що:" + +#: ../../src/basics/variables.txt:56 +msgid "do not use built-in functions as a variable name (e.g. ``len = 42``)" +msgstr "" +"не використовуйте вбудовані функції як ім'я змінної (наприклад, ``len = 42``)" + +#: ../../src/basics/variables.txt:57 +msgid "keep names meaningful (``x = 10`` vs ``number_of_student = 100``)" +msgstr "" +"зберігайте змістовність імен (``x = 10`` проти ``number_of_student = 100``)" diff --git a/src/_locales/uk/LC_MESSAGES/deploy/index.po b/src/_locales/uk/LC_MESSAGES/deploy/index.po new file mode 100644 index 000000000..a54aa873e --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/deploy/index.po @@ -0,0 +1,38 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.04.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-21 05:50+0300\n" +"PO-Revision-Date: 2023-10-05 20:11+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: ua\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/deploy/index.txt:-1 +msgid "Deploy Python application" +msgstr "Розгортання застосунків Python" + +#: ../../src/deploy/index.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/deploy/index.txt:-1 +msgid "python, deployment, index" +msgstr "python, deployment, index" + +#: ../../src/deploy/index.txt:8 +msgid "Page is under construction" +msgstr "Сторінка в розробці" + +#: ../../src/deploy/index.txt:16 +msgid "Application Deployment" +msgstr "Розгортання Застосунків" diff --git a/src/_locales/uk/LC_MESSAGES/django/index.po b/src/_locales/uk/LC_MESSAGES/django/index.po new file mode 100644 index 000000000..3d1c09e26 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/django/index.po @@ -0,0 +1,38 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.04.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-21 05:50+0300\n" +"PO-Revision-Date: 2023-10-05 20:11+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: ua\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/django/index.txt:-1 +msgid "Django web-framework" +msgstr "Веб-фреймворк Django" + +#: ../../src/django/index.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/django/index.txt:-1 +msgid "python, web, django, index" +msgstr "python, web, django, index" + +#: ../../src/django/index.txt:8 +msgid "Page is under construction" +msgstr "Сторінка в розробці" + +#: ../../src/django/index.txt:16 +msgid "Django Framework" +msgstr "Фреймворк Django" diff --git a/src/_locales/uk/LC_MESSAGES/index.po b/src/_locales/uk/LC_MESSAGES/index.po new file mode 100644 index 000000000..5303a5129 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/index.po @@ -0,0 +1,34 @@ +# PYTHON TRAINING COURSE TRANSLATION. +# +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# +# SERHII HORODILOV +# +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.04.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-14 01:49+0300\n" +"PO-Revision-Date: 2023-04-14 02:09+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: ua\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.2.2\n" + +#: ../../src/index.txt:21 +msgid "Additional materials" +msgstr "Додаткові матеріали" + +#: ../../src/index.txt:5 +msgid "PYTHON TRAINING COURSE" +msgstr "НАВЧАЛЬНИЙ КУРС PYTHON" + +#: ../../src/index.txt:35 +msgid "References" +msgstr "Посилання" diff --git a/src/_locales/uk/LC_MESSAGES/intro/index.po b/src/_locales/uk/LC_MESSAGES/intro/index.po new file mode 100644 index 000000000..a45f16a8a --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/intro/index.po @@ -0,0 +1,446 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.04.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:13+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/intro/index.txt:123 +msgid "Contents" +msgstr "Зміст" + +#: ../../src/intro/index.txt:2 +msgid "" +"There are a whole bunch of common programming tasks that are easy in Python. " +"For someone who is not yet a programmer, who wants to become a programmer, " +"for those people Python is particularly easy to get. In Python, every symbol " +"you type is essential." +msgstr "" +"Існує ціла купа звичайних програмних завдань, які легко виконати на Python. " +"Для тих, хто ще не програміст, хто хоче стати програмістом, для цих людей " +"Python особливо легко отримати. У Python кожен символ, який ви вводите, є " +"важливим." + +#: ../../src/intro/index.txt:7 +msgid "|guido| Guido van Rossum" +msgstr "|guido| Гвідо ван Россум" + +#: ../../src/intro/index.txt:175 +msgid "guido" +msgstr "guido" + +#: ../../src/intro/index.txt:11 +msgid "Introduction to Python" +msgstr "Введення в Python" + +#: ../../src/intro/index.txt:13 +msgid "" +"|python| **Python** is a high-level, interpreted scripting language. It was " +"created in the early 1990s by Guido van Rossum at Stichting Mathematisch " +"Centrum (CWI, see https://www.cwi.nl/) in the Netherlands as a successor of " +"a language called ABC. Guido remains Python’s principal author, although it " +"includes many contributions from others." +msgstr "" +"|python| **Python** — це інтерпретована скриптова мова високого рівня. Її " +"було створено на початку 1990-х років Гвідо ван Россумом у Stichting " +"Mathematisch Centrum (CWI, див. https://www.cwi.nl/) у Нідерландах як " +"наступника мови під назвою ABC. Гвідо залишається головним автором Python, " +"хоча мова містить багато внесків від інших авторів." + +#: ../../src/intro/index.txt:132 +msgid "python" +msgstr "python" + +#: ../../src/intro/index.txt:19 +msgid "" +"Python 2.0 was released in 2000, and the 2.x versions were the prevalent " +"releases until December 2008. At that time, the development team made the " +"decision to release version 3.0, which contained a few relatively small but " +"significant changes that were not backward compatible with the 2.x versions. " +"Python 2 and 3 are very similar, and some features of Python 3 have been " +"backported to Python 2. But in general, they remain not quite compatible." +msgstr "" +"Python 2.0 був випущений у 2000 році, а версії 2.x були поширеними випусками " +"до грудня 2008 року. У той час команда розробників прийняла рішення " +"випустити версію 3.0, яка містила кілька відносно невеликих, але значних " +"змін, які не були зворотно сумісними. з версіями 2.x. Python 2 і 3 дуже " +"схожі, і деякі функції Python 3 були перенесені в Python 2. Але загалом вони " +"залишаються не зовсім сумісними." + +#: ../../src/intro/index.txt:26 +msgid "" +"Both Python 2 and 3 have continued to be maintained and developed, with " +"periodic release updates for both. However, an official End Of Life date of " +"January 1, 2020 has been established for Python 2, after which time it will " +"no longer be maintained." +msgstr "" +"І Python 2, і 3 продовжували підтримуватися та розроблятися з періодичними " +"оновленнями для обох. Однак для Python 2 було встановлено офіційну дату " +"завершення життя 1 січня 2020 року, після якої він більше не " +"підтримуватиметься." + +#: ../../src/intro/index.txt:31 +msgid "" +"Python is still maintained by a core development team at the Institute, and " +"Guido is still in charge, having been given the title of BDFL (Benevolent " +"Dictator For Life) by the Python community. The name Python, by the way, " +"derives not from the snake, but from the British comedy troupe Monty " +"Python’s Flying Circus, of which Guido was, and presumably still is, a fan. " +"It is common to find references to Monty Python sketches and movies " +"scattered throughout the Python documentation." +msgstr "" +"Python все ще підтримується основною командою розробників в Інституті, і " +"Гвідо все ще керує, отримавши звання BDFL (Доброзичливий диктатор на все " +"життя) від спільноти Python. Назва Python, до речі, походить не від імені " +"змії, а від британської комедійної трупи Monty Python’s Flying Circus, " +"шанувальником якої був і, мабуть, залишається Гвідо. Посилання на ескізи та " +"фільми Monty Python часто можна знайти в документації Python." + +#: ../../src/intro/index.txt:39 +msgid "Here are some significant facts about Python." +msgstr "Ось кілька важливих фактів про Python." + +#: ../../src/intro/index.txt:42 +msgid "Python is popular" +msgstr "Python популярний" + +#: ../../src/intro/index.txt:43 +msgid "" +"Python has been growing in popularity over the last few years. The 2018 " +"Stack Overflow Developer Survey ranked Python as the 7th most popular and " +"the number one most wanted technology of the year. By the end of Q-4 in 2022 " +"Python is the **top** language on all GitHut metrics :cite:`github:stats`." +msgstr "" +"Python набирає популярності протягом останніх кількох років. Опитування " +"розробників Stack Overflow 2018 року поставило Python на сьоме місце за " +"популярністю та на перше місце серед найпопулярніших технологій року. До " +"кінця четвертого кварталу 2022 року Python є **найпопулярнішою** мовою за " +"всіма показниками GitHut :cite:`github:stats`." + +#: ../../src/intro/index.txt:49 +msgid "" +"Here are some logos of unknown companies across the globe who uses Python:" +msgstr "" +"Ось кілька логотипів невідомих компаній по всьому світі, які використовують " +"Python:" + +#: ../../src/intro/index.txt:54 +msgid "google facebook instagram spotify quora netflix dropbox reddit" +msgstr "google facebook instagram spotify quora netflix dropbox reddit" + +#: ../../src/intro/index.txt +msgid "Google" +msgstr "Google" + +#: ../../src/intro/index.txt +msgid "Facebook" +msgstr "Facebook" + +#: ../../src/intro/index.txt +msgid "Instagram" +msgstr "Instagram" + +#: ../../src/intro/index.txt +msgid "Spotify" +msgstr "Spotify" + +#: ../../src/intro/index.txt +msgid "Quora" +msgstr "Quora" + +#: ../../src/intro/index.txt +msgid "Netflix" +msgstr "Netflix" + +#: ../../src/intro/index.txt +msgid "Dropbox" +msgstr "Dropbox" + +#: ../../src/intro/index.txt +msgid "Reddit" +msgstr "Reddit" + +#: ../../src/intro/index.txt:56 +msgid "Python is interpreted" +msgstr "Python інтерпретується" + +#: ../../src/intro/index.txt:57 +msgid "" +"Many languages are compiled, meaning the source code you create needs to be " +"translated into machine code, the language of your computer’s processor, " +"before it can be run. Programs written in an interpreted language are passed " +"straight to an interpreter that runs them directly." +msgstr "" +"Багато мов компілюється, тобто вихідний код, який ви створюєте, має бути " +"переведений у машинний код, мовою процесора вашого комп’ютера, перш ніж його " +"можна буде запустити. Програми, написані на інтерпретованій мові, " +"передаються прямо до інтерпретатора, який їх безпосередньо запускає." + +#: ../../src/intro/index.txt:62 +msgid "" +"This makes for a quicker development cycle because you just type in your " +"code and run it, without the intermediate compilation step." +msgstr "" +"Це забезпечує швидший цикл розробки, оскільки ви просто вводите код і " +"запускаєте його без проміжного етапу компіляції." + +#: ../../src/intro/index.txt:66 +msgid "Python is free" +msgstr "Python безкоштовний" + +#: ../../src/intro/index.txt:67 +msgid "" +"The Python interpreter is developed under an OSI-approved open-source " +"license, making it free to install, use, and distribute, even for commercial " +"purposes." +msgstr "" +"Інтерпретатор Python розроблено відповідно до схваленої OSI ліцензії з " +"відкритим вихідним кодом, що робить його безкоштовним для встановлення, " +"використання та розповсюдження навіть у комерційних цілях." + +#: ../../src/intro/index.txt:71 +msgid "Python is portable" +msgstr "Python портативний" + +#: ../../src/intro/index.txt:72 +msgid "" +"Because Python code is interpreted and not compiled into native machine " +"instructions, code written for one platform will work on any other platform " +"that has the Python interpreter installed. This is true of any interpreted " +"language, not just Python." +msgstr "" +"Оскільки код Python інтерпретується, а не компілюється у власні машинні " +"інструкції, код, написаний для однієї платформи, працюватиме на будь-якій " +"іншій платформі, де встановлено інтерпретатор Python. Це стосується будь-" +"якої інтерпретованої мови, а не лише Python." + +#: ../../src/intro/index.txt:78 +msgid "Python is simple" +msgstr "Python простий" + +#: ../../src/intro/index.txt:79 +msgid "" +"As programming languages go, Python is relatively uncluttered, and the " +"developers have deliberately kept it that way. A rough estimate of the " +"complexity of a language can be gleaned from the number of keywords or " +"reserved words in the language. These are words that are reserved for " +"special meaning by the compiler or interpreter because they designate " +"specific built-in functionality of the language. There are only 35 :cite:" +"`docs-python:keywords` in Python and they are:" +msgstr "" +"Що стосується мов програмування, Python є відносно незавантаженим, і " +"розробники навмисно залишили його таким. Приблизну оцінку складності мови " +"можна отримати з кількості ключових або зарезервованих слів у мові. Це " +"слова, які зарезервовані для спеціального значення компілятором або " +"інтерпретатором, оскільки вони позначають конкретні вбудовані функції мови. " +"У Python лише 35 :cite:`docs-python:keywords`, і вони:" + +#: ../../src/intro/index.txt:87 +msgid "Python Keywords" +msgstr "Ключові слова Python" + +#: ../../src/intro/index.txt:91 +msgid "``False``" +msgstr "``False``" + +#: ../../src/intro/index.txt:91 +msgid "``await``" +msgstr "``await``" + +#: ../../src/intro/index.txt:91 +msgid "``else``" +msgstr "``else``" + +#: ../../src/intro/index.txt:91 +msgid "``import``" +msgstr "``import``" + +#: ../../src/intro/index.txt:91 +msgid "``pass``" +msgstr "``pass``" + +#: ../../src/intro/index.txt:93 +msgid "``None``" +msgstr "``None``" + +#: ../../src/intro/index.txt:93 +msgid "``break``" +msgstr "``break``" + +#: ../../src/intro/index.txt:93 +msgid "``except``" +msgstr "``except``" + +#: ../../src/intro/index.txt:93 +msgid "``in``" +msgstr "``in``" + +#: ../../src/intro/index.txt:93 +msgid "``raise``" +msgstr "``raise``" + +#: ../../src/intro/index.txt:95 +msgid "``True``" +msgstr "``True``" + +#: ../../src/intro/index.txt:95 +msgid "``class``" +msgstr "``class``" + +#: ../../src/intro/index.txt:95 +msgid "``finally``" +msgstr "``finally``" + +#: ../../src/intro/index.txt:95 +msgid "``is``" +msgstr "``is``" + +#: ../../src/intro/index.txt:95 +msgid "``return``" +msgstr "``return``" + +#: ../../src/intro/index.txt:97 +msgid "``and``" +msgstr "``and``" + +#: ../../src/intro/index.txt:97 +msgid "``continue``" +msgstr "``continue``" + +#: ../../src/intro/index.txt:97 +msgid "``for``" +msgstr "``for``" + +#: ../../src/intro/index.txt:97 +msgid "``lambda``" +msgstr "``lambda``" + +#: ../../src/intro/index.txt:97 +msgid "``try``" +msgstr "``try``" + +#: ../../src/intro/index.txt:99 +msgid "``as``" +msgstr "``as``" + +#: ../../src/intro/index.txt:99 +msgid "``def``" +msgstr "``def``" + +#: ../../src/intro/index.txt:99 +msgid "``from``" +msgstr "``from``" + +#: ../../src/intro/index.txt:99 +msgid "``nonlocal``" +msgstr "``nonlocal``" + +#: ../../src/intro/index.txt:99 +msgid "``while``" +msgstr "``while``" + +#: ../../src/intro/index.txt:101 +msgid "``assert``" +msgstr "``assert``" + +#: ../../src/intro/index.txt:101 +msgid "``del``" +msgstr "``del``" + +#: ../../src/intro/index.txt:101 +msgid "``global``" +msgstr "``global``" + +#: ../../src/intro/index.txt:101 +msgid "``not``" +msgstr "``not``" + +#: ../../src/intro/index.txt:101 +msgid "``with``" +msgstr "``with``" + +#: ../../src/intro/index.txt:103 +msgid "``async``" +msgstr "``async``" + +#: ../../src/intro/index.txt:103 +msgid "``elif``" +msgstr "``elif``" + +#: ../../src/intro/index.txt:103 +msgid "``if``" +msgstr "``if``" + +#: ../../src/intro/index.txt:103 +msgid "``or``" +msgstr "``or``" + +#: ../../src/intro/index.txt:103 +msgid "``yield``" +msgstr "``yield``" + +#: ../../src/intro/index.txt:107 +msgid "Python is general purpose" +msgstr "Python є універсальним" + +#: ../../src/intro/index.txt:108 +msgid "" +"Python is everywhere. Talking more specific common scopes for Python " +"developers are :cite:`python-usage`:" +msgstr "" +"Python всюди. Говорячи про більш конкретні загальні області для розробників " +"Python, це :cite:`python-usage`:" + +#: ../../src/intro/index.txt:111 +msgid "Web Scraping Applications" +msgstr "Програми для сканування веб-сторінок" + +#: ../../src/intro/index.txt:112 +msgid "Data Science Solutions" +msgstr "Рішення для Data Science" + +#: ../../src/intro/index.txt:113 +msgid "Machine Learning Applications" +msgstr "Програми машинного навчання" + +#: ../../src/intro/index.txt:114 +msgid "Web Development" +msgstr "Веб-розробка" + +#: ../../src/intro/index.txt:115 +msgid "Game Development" +msgstr "Розробка ігор" + +#: ../../src/intro/index.txt:116 +msgid "Scientific and Numeric Applications" +msgstr "Наукові та обчислювальні програми" + +#: ../../src/intro/index.txt:117 +msgid "Image Design and Graphic Design Applications" +msgstr "Програми для обробки зображень та графіки" + +#: ../../src/intro/index.txt:118 +msgid "Finance Fintech Platform" +msgstr "Банківські та фінансові сервіси" + +#: ../../src/intro/index.txt:119 +msgid "Language Development" +msgstr "Language Development" + +#: ../../src/intro/index.txt:120 +msgid "Operating Systems" +msgstr "Операційні системи" diff --git a/src/_locales/uk/LC_MESSAGES/intro/install.po b/src/_locales/uk/LC_MESSAGES/intro/install.po new file mode 100644 index 000000000..4dd9b4c3c --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/intro/install.po @@ -0,0 +1,250 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.04.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:12+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/intro/install.txt:3 ../../src/intro/install.txt:21 +msgid "Install Python" +msgstr "Встановлення Python" + +#: ../../src/intro/install.txt:5 +msgid "" +"The `Python wiki `_ " +"briefly describes the installation process." +msgstr "" +"`Вікі Python `_ " +"коротко описує процес встановлення." + +#: ../../src/intro/install.txt:8 +msgid "" +"To become a **true** professional, you need a special software called :abbr:" +"`IDE (Integrated Development Environment)` or at least a code editor " +"supporting syntax highlight. Refer :doc:`/appx/code_edit` for more " +"information." +msgstr "" +"Щоб стати **справжнім** професіоналом, вам потрібне спеціальне програмне " +"забезпечення під назвою :abbr:`IDE (Integrated Development Environment)` або " +"принаймні редактор коду, який підтримує підсвічування синтаксису. Зверніться " +"до :doc:`/appx/code_edit` для отримання додаткової інформації." + +#: ../../src/intro/install.txt:14 +msgid "Linux" +msgstr "Linux" + +#: ../../src/intro/install.txt:16 +msgid "" +"On most Linux distros Python comes pre-installed and/or all distro have it " +"available in their package repository (I haven't seen the one which does " +"have). The installation process depends on the distro, but here are some " +"examples how you can install it:" +msgstr "" +"У більшості дистрибутивів Linux Python постачається попередньо встановленим " +"і/або в усіх дистрибутивах він доступний у сховищі пакетів (я не бачив того, " +"у якому є). Процес встановлення залежить від дистрибутива, але ось кілька " +"прикладів того, як його можна встановити:" + +#: ../../src/intro/install.txt:37 +msgid "MacOS" +msgstr "MacOS" + +#: ../../src/intro/install.txt:39 +msgid "" +"For newer versions of MacOS Python is no longer included by default and you " +"will have to download and install it." +msgstr "" +"Для нових версій MacOS Python більше не включено за замовчуванням, і вам " +"доведеться завантажити та встановити його." + +#: ../../src/intro/install.txt:42 +msgid "The process is described at: `Using Python on a Mac`_." +msgstr "Процес описано в: `Використання Python на Mac`_." + +#: ../../src/intro/install.txt:44 +msgid "" +"Briefly, you are invited to visit `downloads`_ and download the latest " +"stable version of Python. A \"universal binary\" build of Python runs " +"natively on Mac's new Intel and legacy PPC CPUs." +msgstr "" +"Коротко, вас запрошують відвідати `завантаження`_ та завантажити останню " +"стабільну версію Python. \"Універсальна двійкова\" збірка Python працює " +"нативно на нових процесорах Intel і застарілих процесорах PPC від Mac." + +#: ../../src/intro/install.txt:48 +msgid "After the installation you would get:" +msgstr "Після встановлення ви отримаєте:" + +#: ../../src/intro/install.txt:50 +msgid "" +"`Python 3.x` folder in `Applications` folder. Standard development " +"environment (`IDLE`) and `PythonLauncher` included." +msgstr "" +"Папка `Python 3.x` в папці `Програми`. Включено стандартне середовище " +"розробки (`IDLE`) і `PythonLauncher`." + +#: ../../src/intro/install.txt:52 +msgid "" +"A framework `/Library/Frameworks/Python.framework` included libraries and " +"executables." +msgstr "" +"Фреймворк `/Library/Frameworks/Python.framework` що включає бібліотеки та " +"виконувані файли." + +#: ../../src/intro/install.txt:56 +msgid "Install from Homebrew" +msgstr "Встановити з Homebrew" + +#: ../../src/intro/install.txt:58 +msgid "" +"Python for MacOS is available via Homebrew. You are to search `formulae`_ " +"for the latest available version. In general, it's as easy as:" +msgstr "" +"Python для MacOS доступний через Homebrew. Ви повинні шукати `формули`_ для " +"останньої доступної версії. Загалом, це так само просто:" + +#: ../../src/intro/install.txt:66 +msgid "Windows" +msgstr "Windows" + +#: ../../src/intro/install.txt:68 +msgid "" +"As for MacOS, here is the official documentation: `Using Python on Windows`_." +msgstr "" +"Що стосується MacOS, ось офіційна документація: `Using Python on Windows`_." + +#: ../../src/intro/install.txt:70 +msgid "" +"For Windows' users the stable release is available from `downloads`_. Just " +"download the installer and proceed to common steps to install software." +msgstr "" +"Для користувачів Windows стабільний випуск доступний із `завантажень`_. " +"Просто завантажте програму встановлення та перейдіть до стандартних кроків " +"для встановлення програмного забезпечення." + +#: ../../src/intro/install.txt:73 +msgid "" +"It's recommended to **Add Python3.x to PATH**, this will avoid problems at " +"the beginning of your journey with Python" +msgstr "" +"Рекомендовано **Додати Python3.x до PATH**, це дозволить уникнути проблем на " +"початку вашого шляху з Python" + +#: ../../src/intro/install.txt:80 +msgid "Python installer first page" +msgstr "Перша сторінка інсталятора Python" + +#: ../../src/intro/install.txt:82 +msgid "Going on with **Install Now**:" +msgstr "Продовжуємо з **Встановити зараз**:" + +#: ../../src/intro/install.txt:84 +msgid "Python will be installed to your user directory" +msgstr "Python буде встановлено у ваш каталог користувача" + +#: ../../src/intro/install.txt:85 +msgid "" +"Python Launcher will be installed according to the option at the bottom of " +"the page" +msgstr "Python Launcher буде встановлено відповідно до опції внизу сторінки" + +#: ../../src/intro/install.txt:88 +msgid "" +"Using **Customize installation** will perform an *all-users* installation." +msgstr "" +"Використання **Налаштувати інсталяцію** виконає інсталяцію *для всіх " +"користувачів*." + +#: ../../src/intro/install.txt:91 +msgid "Removing the MAX_PATH Limitation" +msgstr "Видалення обмеження MAX_PATH" + +#: ../../src/intro/install.txt:93 +msgid "" +"Windows historically has limited path lengths to 260 characters. This meant " +"that paths longer than this would not resolve and errors would result. In " +"the latest versions of Windows, this limitation can be expanded to " +"approximately 32,000 characters. This allows the open() function, the os " +"module and most other path functionality to accept and return paths longer " +"than 260 characters." +msgstr "" +"Історично у Windows довжина шляху обмежена 260 символами. Це означало, що " +"шляхи, довші за цей, не вирішуватимуться, і спричинятимуться помилки. В " +"останніх версіях Windows це обмеження можна розширити приблизно до 32 000 " +"символів. Це дозволяє функції open(), модулю os і більшості інших функцій " +"шляху приймати та повертати шляхи, довші за 260 символів." + +#: ../../src/intro/install.txt:99 +msgid "You will need PC administrator assistance to perform this action." +msgstr "Для виконання цієї дії вам знадобиться допомога адміністратора ПК." + +#: ../../src/intro/install.txt:102 +msgid "Install from the Microsoft Store" +msgstr "Встановити з Microsoft Store" + +#: ../../src/intro/install.txt:104 +msgid "You can install from the Microsoft Store in two steps:" +msgstr "Ви можете встановити з Microsoft Store у два кроки:" + +#: ../../src/intro/install.txt:106 +msgid "" +"Open the Microsoft Store app and search for ``Python`` The result should " +"look like:" +msgstr "" +"Відкрийте програму Microsoft Store і знайдіть ``Python``. Результат має " +"виглядати так:" + +#: ../../src/intro/install.txt:112 +msgid "Microsoft Store - search results for \"Python\"" +msgstr "Microsoft Store - результати пошуку для \"Python\"" + +#: ../../src/intro/install.txt:114 +msgid "Select ``Python 3.9`` or the higher available version." +msgstr "Виберіть ``Python 3.9`` або вищу доступну версію." + +#: ../../src/intro/install.txt:116 +msgid "" +"Click **GET** and wait until the installer is downloaded. The installation " +"process should run automatically. Follow the installer's instructions." +msgstr "" +"Натисніть **GET** і дочекайтеся завантаження інсталятора. Процес " +"встановлення має запуститися автоматично. Дотримуйтесь інструкцій " +"інсталятора." + +#: ../../src/intro/install.txt:124 +msgid "Online Interpreters" +msgstr "Онлайн Інтерпретатори" + +#: ../../src/intro/install.txt:126 +msgid "" +"Installing or updating Python on your computer is the first step to becoming " +"a Python programmer :cite:`realpython:install-and-setup`." +msgstr "" +"Встановлення або оновлення Python на вашому комп’ютері – це перший крок до " +"того, щоб стати програмістом Python :cite:`realpython:install-and-setup`." + +#: ../../src/intro/install.txt:129 +msgid "" +"But if you cannot install Python at the moment for some reason, are can go " +"with online interpreters. `repl.it `_ provides the " +"ability to create and store Python scripts (they are called *repl* here) for " +"free." +msgstr "" +"Але якщо ви не можете встановити Python на даний момент з якоїсь причини, " +"можна скористатися онлайн-інтерпретаторами. `repl.it `_ " +"надає можливість безкоштовно створювати та зберігати сценарії Python (тут " +"вони називаються *repl*)." diff --git a/src/_locales/uk/LC_MESSAGES/intro/interact.po b/src/_locales/uk/LC_MESSAGES/intro/interact.po new file mode 100644 index 000000000..51ba6623e --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/intro/interact.po @@ -0,0 +1,267 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.04.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:12+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/intro/interact.txt:3 +msgid "Interacting with Python Interpreter" +msgstr "Взаємодія з інтерпретатором Python" + +#: ../../src/intro/interact.txt:5 +msgid "It’s time to write some Python code!" +msgstr "Настав час написати код на Python!" + +#: ../../src/intro/interact.txt:7 +msgid ":cite:t:`realpython:interact`" +msgstr ":cite:t:`realpython:interact`" + +#: ../../src/intro/interact.txt:9 +msgid "In short there are three major ways to do something with Python:" +msgstr "Коротше кажучи, є три основні способи зробити щось з Python:" + +#: ../../src/intro/interact.txt:11 +msgid "interactive Python console" +msgstr "інтерактивна консоль Python" + +#: ../../src/intro/interact.txt:12 +msgid "running code from file [#]_" +msgstr "запуск коду з файлу [#]_" + +#: ../../src/intro/interact.txt:13 +msgid "use online editors (like `repl.it `_)" +msgstr "" +"використовувати онлайн-редактори (наприклад, `repl.it `_)" + +#: ../../src/intro/interact.txt:16 +msgid "Using Python interpreter interactively" +msgstr "Використання інтерпретатора Python в інтерактивному режимі" + +#: ../../src/intro/interact.txt:18 +msgid "" +"Using :abbr:`REPL (Read-Eval-Print-Loop)` environment is the most straight " +"forward way to start talking to Python. This simply means starting up the " +"interpreter and typing commands to it directly :cite:`realpython:interact`. " +"The interpreter:" +msgstr "" +"Використання середовища :abbr:`REPL (Read-Eval-Print-Loop)` є найпростішим " +"способом почати спілкування з Python. Це просто означає запуск " +"інтерпретатора та введення команд безпосередньо в нього :cite:`realpython:" +"interact`. Перекладач:" + +#: ../../src/intro/interact.txt:23 +msgid "Reads the command you enter" +msgstr "Читає введену команду" + +#: ../../src/intro/interact.txt:24 +msgid "Evaluates and executes it" +msgstr "Оцінює та виконує її" + +#: ../../src/intro/interact.txt:25 +msgid "Prints the output (if any) back to the console" +msgstr "Друкує результат (якщо є) назад на консоль" + +#: ../../src/intro/interact.txt:26 +msgid "Loops back and repeats" +msgstr "Повертається назад та повторює" + +#: ../../src/intro/interact.txt:29 +msgid "Starting the interpreter" +msgstr "Запуск інтерпретатора" + +#: ../../src/intro/interact.txt:31 +msgid "" +"In :abbr:`GUI (Graphic User Interface)` environment, it's likely that the " +"installer placed a shortcut on the desktop to launch the Python." +msgstr "" +"У середовищі :abbr:`GUI (Graphic User Interface)`, імовірно, інсталятор " +"розмістив ярлик на робочому столі для запуску Python." + +#: ../../src/intro/interact.txt:34 +msgid "" +"For example in Windows the interpreter can be found in the **Start** menu " +"labeled **Python 3.x**:" +msgstr "" +"Наприклад, у Windows інтерпретатор можна знайти в меню **Пуск** з позначкою " +"**Python 3.x**:" + +#: ../../src/intro/interact.txt:40 +msgid "Windows start menu Python group" +msgstr "Меню Пуск Windows Група Python" + +#: ../../src/intro/interact.txt:42 +msgid "" +"In case you are getting error saying python is not installed, but you are " +"sure that the interpreter **is installed** - this means you have no Python " +"in your ``PATH``. Message may look like: ``'python' is not recognized as an " +"internal or external command`` / ``python: command not found``" +msgstr "" +"Якщо ви отримуєте повідомлення про те, що python не встановлено, але ви " +"впевнені, що інтерпретатор **встановлено**, це означає, що у вашому ``PATH`` " +"немає Python. Повідомлення може виглядати так: ``'python' не розпізнається " +"як внутрішня або зовнішня команда`` / ``python: команда не знайдена``" + +#: ../../src/intro/interact.txt:48 +msgid "Refer :doc:`/appx/env_path` for problem solution." +msgstr "Зверніться до :doc:`/appx/env_path` для вирішення проблеми." + +#: ../../src/intro/interact.txt:50 +msgid "The alternative is to launch from a terminal window:" +msgstr "Альтернативою є запуск із вікна терміналу:" + +#: ../../src/intro/interact.txt:52 +msgid "**Command Prompt** in Windows" +msgstr "**Командний рядок** у Windows" + +#: ../../src/intro/interact.txt:53 +msgid "**Terminal** both in macOS and Linux" +msgstr "**Термінал** в macOS і Linux" + +#: ../../src/intro/interact.txt:58 +msgid "Start Python via Command Prompt" +msgstr "Запуск Python через командний рядок" + +#: ../../src/intro/interact.txt:63 +msgid "Start Python via Terminal" +msgstr "Запуск Python через термінал" + +#: ../../src/intro/interact.txt:66 +msgid "Running code" +msgstr "Запускаємо код" + +#: ../../src/intro/interact.txt:68 +msgid "" +"Put the Python code in interactive console and press enter to execute it." +msgstr "" +"Помістіть код Python в інтерактивну консоль і натисніть enter, щоб виконати " +"його." + +#: ../../src/intro/interact.txt:70 +msgid "" +"Ensure that the ``>>>`` prompt is displayed and the cursor is pointed after " +"it" +msgstr "" +"Переконайтеся, що підказка ``>>>`` відображається, а курсор знаходиться " +"після неї" + +#: ../../src/intro/interact.txt:72 +msgid "Type the command ``print(\"Hello, World!\")``" +msgstr "Введіть команду ``print(\"Hello, World!\")``" + +#: ../../src/intro/interact.txt:73 +msgid "Press enter" +msgstr "Натисніть enter" + +#: ../../src/intro/interact.txt:79 +msgid "Your session should look like:" +msgstr "Ваш сеанс має виглядати так:" + +#: ../../src/intro/interact.txt:86 +msgid "" +"If you've seen string \"Hello, World!\" printed back, congrats - you've run " +"your first program in Python." +msgstr "" +"Якщо ви бачили рядок \"Hello, World!\" надруковано, вітаємо - ви запустили " +"свою першу програму на Python." + +#: ../../src/intro/interact.txt:94 +msgid "Exiting the interpreter" +msgstr "Вихід з інтерпретатора" + +#: ../../src/intro/interact.txt:96 +msgid "To exit the interactive console type \"exit\" and hit enter." +msgstr "Щоб вийти з інтерактивної консолі, введіть \"exit\" і натисніть Enter." + +#: ../../src/intro/interact.txt:103 +msgid "Running code from file" +msgstr "Запуск коду з файлу" + +#: ../../src/intro/interact.txt:105 +msgid "" +"A Python script is a reusable set of code. It is essentially a Python " +"program - a sequence of Python instructions - contained in a file. You can " +"run the program by specifying the name of the script file to the interpreter." +msgstr "" +"Сценарій Python — це багаторазовий набір коду. По суті, це програма на " +"Python – послідовність інструкцій Python, які містяться у файлі. Ви можете " +"запустити програму, вказавши інтерпретатору назву файлу сценарію." + +#: ../../src/intro/interact.txt:109 +msgid "" +"Python scripts are just plain text, so you can edit them with any text " +"editor. If you have a favorite programmer’s editor that operates on text " +"files, it should be fine to use. Otherwise here are some options for the " +"first time:" +msgstr "" +"Сценарії Python — це звичайний текст, тому ви можете редагувати їх у будь-" +"якому текстовому редакторі. Якщо у вас є улюблений програмістський редактор, " +"який працює з текстовими файлами, його цілком можна використовувати. Інакше " +"ось кілька варіантів для першого разу:" + +#: ../../src/intro/interact.txt:113 +msgid "Windows: |npp| `Notepad++ `_" +msgstr "Windows: |npp| `Notepad++ `_" + +#: ../../src/intro/interact.txt:148 +msgid "npp" +msgstr "npp" + +#: ../../src/intro/interact.txt:114 +msgid "Linux: |geany| `Geany `_" +msgstr "Linux: |geany| `Geany `_" + +#: ../../src/intro/interact.txt:150 +msgid "geany" +msgstr "geany" + +#: ../../src/intro/interact.txt:116 +msgid "" +"Using whatever editor create a script file called ``hello.py`` and put the " +"code in it:" +msgstr "" +"Використовуючи будь-який редактор, створіть файл сценарію під назвою ``hello." +"py`` і помістіть у нього код:" + +#: ../../src/intro/interact.txt:123 +msgid "" +"Save file keeping track on the directory you choose to save into. Now, open " +"the terminal or command prompt in this directory." +msgstr "" +"Збережіть файл, відстежуючи його в каталозі, який ви вибрали для збереження. " +"Тепер відкрийте термінал або командний рядок у цьому каталозі." + +#: ../../src/intro/interact.txt:126 +msgid "" +"In window you may open Command Prompt in the directory by typing \"cmd\" to " +"the address bar in explorer." +msgstr "" +"У вікні ви можете відкрити командний рядок у каталозі, ввівши \"cmd\" в " +"адресний рядок провідника." + +#: ../../src/intro/interact.txt:129 +msgid "In the terminal (or command prompt) type:" +msgstr "У терміналі (або командному рядку) введіть:" + +#: ../../src/intro/interact.txt:135 +msgid "" +"Python will print string \"Hello, World!\". Your session should look like:" +msgstr "Python надрукує рядок \"Hello, World!\". Ваш сеанс має виглядати так:" + +#: ../../src/intro/interact.txt:144 +msgid "Files containing Python code are called *modules*." +msgstr "Файли, що містять код Python, називаються *модулями*." diff --git a/src/_locales/uk/LC_MESSAGES/linux/index.po b/src/_locales/uk/LC_MESSAGES/linux/index.po new file mode 100644 index 000000000..5e917e0a9 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/linux/index.po @@ -0,0 +1,38 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.04.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-21 05:50+0300\n" +"PO-Revision-Date: 2023-10-05 20:12+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: ua\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/linux/index.txt:-1 +msgid "Linux basics for Python developers" +msgstr "Основи Linux для Python розробників" + +#: ../../src/linux/index.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/linux/index.txt:-1 +msgid "linux, basics, index" +msgstr "linux, basics, index" + +#: ../../src/linux/index.txt:8 +msgid "Page is under construction" +msgstr "Сторінка в розробці" + +#: ../../src/linux/index.txt:16 +msgid "Linux Basics" +msgstr "Основи Linux" diff --git a/src/_locales/uk/LC_MESSAGES/oop/index.po b/src/_locales/uk/LC_MESSAGES/oop/index.po new file mode 100644 index 000000000..fc84bf980 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/oop/index.po @@ -0,0 +1,46 @@ +# Copyright (C) 2022, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:15+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/oop/index.txt:-1 +msgid "Object-oriented programming in Python" +msgstr "Об'єктно-орієнтоване програмування" + +#: ../../src/oop/index.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/oop/index.txt:-1 +msgid "python, oop, object-oriented programming, index" +msgstr "python, oop, object-oriented programming, index" + +#: ../../src/oop/index.txt:8 +msgid "Object-Oriented Programming" +msgstr "Об'єктно-орієнтоване програмування" + +#: ../../src/oop/index.txt:10 +msgid "" +"Object-oriented programming (OOP) is one of the biggest and most important " +"subjects in all of programming. It is a method of structuring a program by " +"bundling related properties and behavior into individual objects." +msgstr "" +"Об'єктно-орієнтоване програмування (ООП) є однією з найбільших і " +"найважливіших тем у всьому програмуванні. Це метод структуруванняпрограми " +"шляхом об'єднання пов'язаних властивостей і поведінки в окремі об'єкти." diff --git a/src/_locales/uk/LC_MESSAGES/oop/inheritance.po b/src/_locales/uk/LC_MESSAGES/oop/inheritance.po new file mode 100644 index 000000000..d196a6b63 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/oop/inheritance.po @@ -0,0 +1,36 @@ +# Copyright (C) 2022, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:15+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/oop/inheritance.txt:-1 +msgid "Inheritance in Python" +msgstr "Наслідування в Python" + +#: ../../src/oop/inheritance.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/oop/inheritance.txt:-1 +msgid "python, inheritance, oop, object-oriented programming" +msgstr "python, inheritance, oop, object-oriented programming" + +#: ../../src/oop/inheritance.txt:8 +msgid "Inheritance" +msgstr "Наслідування" diff --git a/src/_locales/uk/LC_MESSAGES/oop/intro.po b/src/_locales/uk/LC_MESSAGES/oop/intro.po new file mode 100644 index 000000000..3c9da1ba5 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/oop/intro.po @@ -0,0 +1,476 @@ +# Copyright (C) 2022, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:14+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/oop/intro.txt:-1 +msgid "Introduction to OOP" +msgstr "Введення в ООП" + +#: ../../src/oop/intro.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/oop/intro.txt:-1 +msgid "python, intro, introduction, oop, object-oriented programming" +msgstr "python, intro, introduction, oop, object-oriented programming" + +#: ../../src/oop/intro.txt:8 +msgid "Classes and Objects" +msgstr "Класи та Об'єкти" + +#: ../../src/oop/intro.txt:10 +msgid "" +"Conceptually, objects are like the components of a system. Think of a " +"program as a factory assembly line of sorts. At each step of the assembly " +"line a system component processes some material, ultimately transforming raw " +"material into a finished product." +msgstr "" +"Концептуально об'єкти схожі на компоненти системи. Думайте про програму як " +"про заводську конвеєрну лінію. На кожному кроці складання системний " +"компонент обробляє певний матеріал, остаточно перетворюючи сировину на " +"закінчений продукт." + +#: ../../src/oop/intro.txt:15 +msgid "" +"An object contains data, like the raw or preprocessed materials at each step " +"on an assembly line, and behavior, like the action each assembly line " +"component performs." +msgstr "" +"Об'єкт містить дані, як-от необроблені або попередньо оброблені матеріали на " +"кожному кроці складальної лінії, і поведінку, як-от дію, яку виконує кожен " +"компонент складальної лінії." + +#: ../../src/oop/intro.txt:20 +msgid "Paradigm of Object-Oriented Programming" +msgstr "Парадигма Об'єктно-Орієнтованого Програмування" + +#: ../../src/oop/intro.txt:22 +msgid "" +"Object-oriented programming is a programming paradigm that provides a means " +"of structuring programs so that properties and behaviors are bundled " +"together into individual **objects**." +msgstr "" +"Об'єктно-орієнтоване програмування - це парадигма програмування, яка надає " +"засоби структурування програм так, що властивості та поведінка об'єднуються " +"в окремі **об'єкти**." + +#: ../../src/oop/intro.txt:26 +msgid "" +"For instance, an object could represent a person with **properties** like a " +"name, age, and address and **behaviors** such as walking, talking, running. " +"Or it could represent an email with properties like a recipient list, " +"subject, and body and behaviors like adding attachments and sending." +msgstr "" +"Наприклад, об'єкт може представляти особу з такими **властивостями**, як " +"ім'я, вік та адреса, а також такими **поведінками**, як ходьба, розмова, " +"біг. Або він може представляти електронний лист із такими властивостями, як " +"список одержувачів, тема , а також тіло та поведінку, як-от додавання " +"вкладень і надсилання." + +#: ../../src/oop/intro.txt:31 +msgid "" +"Put another way, object-oriented programming is an approach for modeling " +"concrete, real-world things, like cars, as well as relations between things, " +"like companies and employees, students and teachers, and so on. OOP models " +"real-world entities as software objects that have some data associated with " +"them and can perform certain functions." +msgstr "" +"Інакше кажучи, об'єктно-орієнтоване програмування - це підхід до моделювання " +"конкретних речей реального світу, таких як автомобілі, а також відносин між " +"речами, такими як компанії та працівники, студенти та викладачі тощо. ООП " +"моделює сутності реального світу як програмні об'єкти, які мають деякі дані, " +"пов'язані з ними та можуть виконувати певні функції." + +#: ../../src/oop/intro.txt:39 +msgid "Object-Oriented Programming Concepts" +msgstr "Концепції Об'єктно-Орієнтованого Програмування" + +#: ../../src/oop/intro.txt:41 +msgid "" +"So far, we can discuss the major concepts within the OOP paradigm. And they " +"are:" +msgstr "Поки що ми можемо обговорити основні концепції парадигми ООП. І вони:" + +#: ../../src/oop/intro.txt +msgid "**encapsulation**" +msgstr "**інкапсуляція**" + +#: ../../src/oop/intro.txt:46 +msgid "" +"In OOP refers to the bundling of data with methods that operate that data, " +"or restricting of direct access to some of an object's components." +msgstr "" +"В ООП означає об'єднання даних із методами, які обробляють ці дані, або " +"обмеження прямого доступу до деяких компонентів об'єкта." + +#: ../../src/oop/intro.txt:49 +msgid "" +"Encapsulation mechanism is often confused with *hiding*. It's not actually " +"that encapsulation does, but data hiding is available to us due to the " +"encapsulation." +msgstr "" +"Механізм інкапсуляції часто плутають із приховуванням. Насправді " +"інкапсуляція це не робить, але приховування даних доступне для нас завдяки " +"інкапсуляції." + +#: ../../src/oop/intro.txt +msgid "**inheritance**" +msgstr "**наслідування**" + +#: ../../src/oop/intro.txt:55 +msgid "" +"It's a mechanism of basing an object or a class upon another object " +"(prototype-based inheritance) or class (class-based inheritance), retaining " +"similar implementation. Also defined as deriving new classes (subclasses) " +"from existing ones such as a super class or base class and forming them into " +"a hierarchy of classes." +msgstr "" +"Це механізм базування об'єкта або класу на іншому об'єкті (успадкування на " +"основі прототипу) або класу (успадкування на основі класу), зберігаючи " +"подібну реалізацію. Також визначається як отримання нових класів (підкласів) " +"із існуючих такі як суперклас або базовий клас і формування їх у ієрархію " +"класів." + +#: ../../src/oop/intro.txt +msgid "**polymorphism**" +msgstr "**поліморфізм**" + +#: ../../src/oop/intro.txt:63 +msgid "" +"It's a provision of a single interface to entities of different types or the " +"use of a single symbol to represent multiple different types. The concept is " +"borrowed from a principle in biology where an organism or species can have " +"many different forms or stages." +msgstr "" +"Це надання єдиного інтерфейсу для сутностей різних типів або використання " +"одного символу для представлення кількох різних типів. Концепція запозичена " +"з принципу в біології, згідно з яким організм або вид може мати багато " +"різних форми чи етапи." + +#: ../../src/oop/intro.txt +msgid "**abstraction**" +msgstr "**абстракція**" + +#: ../../src/oop/intro.txt:70 +msgid "" +"The process of removing or generalizing details or attributes in the study " +"of objects or systems to focus attention on details of greater importance, " +"it is similar in nature to the process of generalization. The creation of " +"abstract concept-objects by mirroring common features or attributes of " +"various non-abstract objects or systems of study is the result of the " +"process of abstraction." +msgstr "" +"Процес видалення або узагальнення деталей або атрибутів під час дослідження " +"об'єктів або систем, щоб зосередити увагу на деталях більшої важливості, " +"подібний за своєю природою до процесу узагальнення. Створення абстрактних " +"понять-об'єктів шляхом віддзеркалення спільних рис або атрибутів різних " +"неабстрактних об'єктів або систем дослідження є результатом процесу " +"абстрагування." + +#: ../../src/oop/intro.txt:78 +msgid "Define a Class in Python" +msgstr "Визначення Классу в Python" + +#: ../../src/oop/intro.txt:80 +msgid "" +"Primitive data-structures - like numbers, strings, lists etc. - are designed " +"to represent simple pieces of information, such as the cost of a product, " +"the name of a novel, or someone's favorite colors. What if you want to " +"represent things that are more complex?" +msgstr "" +"Примітивні структури даних - як-от числа, рядки, списки тощо - призначені " +"для представлення простих фрагментів інформації, таких як вартість продукту, " +"назва роману чи чиїсь улюблені кольори. Що, якщо ви бажаєте представити " +"складніші речі?" + +#: ../../src/oop/intro.txt:85 +msgid "" +"For example, let's say you want to track employees in an organization. You " +"need to store some basic information about each employee. Let's start from a " +"very beginning and try to represent an individual employee as a bunch of " +"variables:" +msgstr "" +"Наприклад, скажімо, ви хочете відслідковувати співробітників в організації. " +"Вам потрібно зберегти деяку базову інформацію про кожного працівника. " +"Давайте почнемо з самого початку та спробуємо представити окремого " +"працівника як групу змінних:" + +#: ../../src/oop/intro.txt:95 +msgid "" +"This approach has number of issues. Once it's required to store information " +"for more that one person, you are to create another set of variables: " +"``first_name_1``, ``first_name_2`` etc. The most terrifying issue is that " +"these portions of data have no relations to each other. Let's try to use " +"``list`` for this purpose:" +msgstr "" +"Цей підхід має низку проблем. Після того, як буде потрібно зберігати " +"інформацію про більше ніж одну особу, ви повинні створити інший набір " +"змінних: ``first_name_1``, ``first_name_2`` тощо. Найжахливіше проблема в " +"тому, що ці частини даних не мають жодного відношення одна до одної. Давайте " +"спробуємо використати ``список`` для цієї мети:" + +#: ../../src/oop/intro.txt:106 +msgid "There are number of issues with this approach as well." +msgstr "З цим підходом також виникає ряд проблем." + +#: ../../src/oop/intro.txt:108 +msgid "" +"First, it can make larger code files more difficult to manage. If you " +"reference ``serhii[0]`` several lines away from where ``serhii`` list is " +"declared, will you remember that the element with ``index 0`` is the " +"person's name? Of course, you can use ``dict`` structure, but..." +msgstr "" +"По-перше, це може ускладнити керування великими файлами коду. Якщо ви " +"посилаєтеся на ``serhii[0]`` на кілька рядків від місця, де оголошено список " +"``serhii``, ви пам'ятаєте, що елемент з ``index 0`` - це ім'я \" \"особи? " +"Звичайно, ви можете використовувати структуру ``dict``, але..." + +#: ../../src/oop/intro.txt:113 +msgid "" +"Second, it can introduce errors if not every person has the same number of " +"properties." +msgstr "" +"По-друге, це може призвести до помилок, якщо не кожна особа має однакову " +"кількість властивостей." + +#: ../../src/oop/intro.txt:116 +msgid "" +"A great way to make this type of code more manageable and more maintainable " +"is to use **classes**." +msgstr "" +"Чудовий спосіб зробити цей тип коду більш керованим і придатним для " +"обслуговування - це використання **класів**." + +#: ../../src/oop/intro.txt:119 +msgid "" +"All classes definitions in Python start with the keyword ``class``, which is " +"followed by the name of the class and a colon. Any code that is indented " +"below the class definition is considered the part of the class's body." +msgstr "" +"Усі визначення класів у Python починаються з ключового слова ``class``, за " +"яким йдуть ім'я класу та двокрапка. Будь-який код, який має відступ під " +"визначенням класу, вважається частиною тіла класу." + +#: ../../src/oop/intro.txt:129 +msgid "Classes vs Instances" +msgstr "Класи та Екземпляри Класу" + +#: ../../src/oop/intro.txt:131 +msgid "" +"Classes are used to create user-defined data structures. As it was mentioned " +"above OOP is about bundling data and behaviors. Classes define data " +"structures; each portion of data bundled within a classes is called " +"**property** or **field**. Classes also define functions called **methods**, " +"which identify the behavior and actions that an object created from the " +"class can perform with its data." +msgstr "" +"Класи використовуються для створення визначених користувачем структур даних. " +"Як було зазначено вище, ООП стосується об'єднання даних і поведінки. Класи " +"визначають структури даних; кожна частина даних, об'єднаних у класи, " +"називається властивістю або полем. Класи також визначають функції, які " +"називаються методами, які ідентифікують поведінку та дії, які об'єкт, " +"створений з класу, може виконувати зі своїми даними." + +#: ../../src/oop/intro.txt:147 +msgid "" +"A class is a blueprint for how something should be defined. It doesn't " +"actually contain any data. The person class above specifies that " +"``first_name`` and ``last_name`` properties are bundled within this class, " +"but it don't actually contain the person's name." +msgstr "" +"Клас - це схема того, як щось має бути визначено. Він насправді не містить " +"жодних даних. Клас person вище вказує, що властивості \" \"first_name`` і " +"``last_name`` об'єднані в цей класу, але насправді він не містить імені " +"людини." + +#: ../../src/oop/intro.txt:152 +msgid "" +"While classes are blueprints, an **instance** is an **object** that is built " +"from a form has been filled out with information. Just like many people can " +"fill out the same form with their own unique information, many instances can " +"be created from a single class." +msgstr "" +"Хоча класи є кресленнями, екземпляр - це об'єкт, створений із форми, " +"заповненої інформацією. Подібно до того, як багато людей можуть заповнювати " +"ту саму форму своєю унікальною інформацією, багато екземплярів можуть бути " +"створений з одного класу." + +#: ../../src/oop/intro.txt:170 +msgid "Methods" +msgstr "Методи" + +#: ../../src/oop/intro.txt:172 +msgid "" +"A function bundled within a class is called **method**. There are several " +"ways to define a class method. For now it's needed to know, that each method " +"will get a special argument at the first position. This argument is a " +"reference to an actual object. By convention, this argument is called " +"``self``." +msgstr "" +"Функція, об'єднана в клас, називається методом. Існує кілька способів " +"визначення методу класу. Наразі необхідно знати, що кожен метод отримає " +"спеціальний аргумент у першій позиції. Цей аргумент є посилання на реальний " +"об'єкт. За домовленістю цей аргумент називається ``self``." + +#: ../../src/oop/intro.txt:192 +msgid "Initializing Instance with Data" +msgstr "Ініціалізація Екземпляру з Даними" + +#: ../../src/oop/intro.txt:194 +msgid "" +"There are several methods surrounded with double underscores " +"(``__method__``) that are called **dunder methods** or **magic methods**. " +"We'll take a closer look at these methods in the future. For now, it's ok to " +"just one of these special methods: ``__init__``. It initializes an instance " +"with some specific data." +msgstr "" +"Є кілька методів, позначених подвійним підкресленням (``__method__``), які " +"називаються методами dunder або магічними методами. Ми детальніше розглянемо " +"ці методи в майбутньому. Наразі можна використовувати лише один із цих " +"спеціальних методів: ``__init__``. Він ініціалізує примірник певними даними." + +#: ../../src/oop/intro.txt:228 +msgid "" +"Note, this call definition has a property called ``programming_language`` " +"defined outside of the ``__init__`` method. This property is shared across " +"all the class instances." +msgstr "" +"Зверніть увагу, що це визначення виклику має властивість під назвою " +"``programming_language``, визначену за межами методу ``__init__``. Ця " +"властивість є спільною для всіх екземплярів класу." + +#: ../../src/oop/intro.txt:233 +msgid "Some More Details on ``self``" +msgstr "Дещо Більше про ``self``" + +#: ../../src/oop/intro.txt:235 +msgid "" +"``self`` is nothing except the convention. Instance methods will receive a " +"pointer to the instance itself as the first argument. In two words: it is " +"the actual object to call the method with. For example, the student class " +"defines attributes (student's name and scores) and methods available for " +"each student instance: complete the challenge or skip classes. While the " +"actual student instance contains data and methods related to the exact one " +"student. The ``self`` is a referer to this exact object." +msgstr "" +"``self`` - це не що інше, як конвенція. Методи екземпляра отримають " +"вказівник на сам екземпляр як перший аргумент. У двох словах: це фактичний " +"об'єкт для виклику методу. Наприклад, Клас студента визначає атрибути (ім'я " +"студента та бали) і методи, доступні для кожного екземпляра студента: " +"виконайте завдання або пропустіть заняття. Тоді як фактичний екземпляр " +"студента містить дані та методи, пов'язані з одним студентом. ``self`` є " +"посиланням саме на цей об'єкт." + +#: ../../src/oop/intro.txt:244 +msgid "Data Hiding" +msgstr "Приховання Даних" + +#: ../../src/oop/intro.txt:246 +msgid "" +"Many programming languages has *access modifiers* implemented. The Python " +"has also." +msgstr "" +"У багатьох мовах програмування реалізовані *модифікатори доступу*. Python " +"також має." + +#: ../../src/oop/intro.txt:252 +msgid "" +"\"Private\" instance variables that cannot be accessed except from inside an " +"object don't exist in Python :cite:`docs-python:private-variables`. It's " +"implemented as a convention-level." +msgstr "" +"\"Приватні\" змінні екземплярів, до яких можна отримати доступ лише " +"зсередини об’єкта, не існують у Python :cite:`docs-python:private-" +"variables`. Це реалізовано на рівні домовленності." + +#: ../../src/oop/intro.txt:256 +msgid "" +"A name prefixed with an underscore (e.g. ``_spam``) should be treated as a " +"non-public part of the API (whether it is a function, a method or a data " +"member). These should not be used outside the class itself and can be " +"changed without notice." +msgstr "" +"Ім’я з префіксом підкреслення (наприклад, ``_spam``) слід розглядати як " +"закриту частину API (незалежно від того, чи це функція, метод або елемент " +"даних). Вони не повинні використовуватися поза межами самого класу та можуть " +"бути змінені без попередження." + +#: ../../src/oop/intro.txt:261 +msgid "" +"Since there is a valid use case for class-private members (namely to avoid " +"name clashes of names with names defined by subclasses), there is limited " +"support for such a mechanism, called *name mangling*. Any identifier with at " +"least two leading underscore (e.g. ``__spam``) is textually replaced with " +"``_classname__spam``, where ``_classname`` is the current class name with " +"leading underscore stripped." +msgstr "" +"Оскільки існує дійсний варіант використання для приватних членів класу (а " +"саме, щоб уникнути зіткнень імен з іменами, визначеними підкласами), існує " +"обмежена підтримка такого механізму, що називається *викривлення імен*. Будь-" +"який ідентифікатор із принаймні двома символами підкреслення на початку " +"(наприклад, ``__spam``) текстово замінюється на ``_classname__spam``, де " +"``_classname`` є поточною назвою класу з видаленням підкреслення на початку." + +#: ../../src/oop/intro.txt:300 +msgid "Few Words about Inheritance" +msgstr "Кілька Слів про Наслідування" + +#: ../../src/oop/intro.txt:302 +msgid "Just in two words. This topic is discovered in the future articles." +msgstr "Всього в двох словах. Ця тема розкривається в наступних статтях." + +#: ../../src/oop/intro.txt:304 +msgid "" +"You can derive your classes from a super class. Derived classes are called " +"*sub classes* and the class used to inherit from is called *super class*. " +"Other terms are *child* class and *parent* class, but they are not common " +"(this is author's personal opinion)." +msgstr "" +"Ви можете отримати свої класи від суперкласу. Похідні класи називаються " +"*підкласами*, а клас, який використовується для успадкування, називається " +"*суперкласом*. Іншими термінами є *дочірній* клас і *батьківський* клас, але " +"вони не є поширеними ( це особиста думка автора)." + +#: ../../src/oop/intro.txt:309 +msgid "Just put a super class in parenthesis two inherit from it:" +msgstr "Просто помістіть суперклас у дужки, які успадковують від нього два:" + +#: ../../src/oop/intro.txt:321 +msgid "Few Words about Polymorphism" +msgstr "Кілька Слів про Поліморфізм" + +#: ../../src/oop/intro.txt:323 +msgid "" +"You've already use this. The most simple explanation is **addition " +"operator**. For different types of data it would produce different types of " +"output:" +msgstr "" +"Ви вже використовували це. Найпростішим поясненням є **оператор додавання**. " +"Для різних типів даних він створюватиме різні типи виводу:" + +#: ../../src/oop/intro.txt:331 +msgid "" +"For example you may have various classes inherited from a base class, that " +"provides a common interface, but each derived class may implement the method " +"in its own way." +msgstr "" +"Наприклад, у вас можуть бути різні класи, успадковані від базового класу, " +"який забезпечує загальний інтерфейс, але кожен похідний клас може " +"реалізовувати метод по-своєму." diff --git a/src/_locales/uk/LC_MESSAGES/oop/patterns.po b/src/_locales/uk/LC_MESSAGES/oop/patterns.po new file mode 100644 index 000000000..2e406dc76 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/oop/patterns.po @@ -0,0 +1,36 @@ +# Copyright (C) 2022, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:14+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/oop/patterns.txt:-1 +msgid "Design patterns" +msgstr "Патерни проектування" + +#: ../../src/oop/patterns.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/oop/patterns.txt:-1 +msgid "python, programming, design, patterns" +msgstr "python, programming, design, patterns" + +#: ../../src/oop/patterns.txt:8 +msgid "Design Patterns" +msgstr "Патерни Проектування" diff --git a/src/_locales/uk/LC_MESSAGES/oop/solid.po b/src/_locales/uk/LC_MESSAGES/oop/solid.po new file mode 100644 index 000000000..0ca410450 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/oop/solid.po @@ -0,0 +1,42 @@ +# Copyright (C) 2022, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:13+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/oop/solid.txt:-1 +msgid "SOLID principles" +msgstr "Принципи SOLID" + +#: ../../src/oop/solid.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/oop/solid.txt:-1 +msgid "" +"python, solid, single, responsibility, open, closed, liskov, substitution, " +"interface, segregation, dependency, inversion, oop, object-oriented " +"programming" +msgstr "" +"python, solid, single, responsibility, open, closed, liskov, substitution, " +"interface, segregation, dependency, inversion, oop, object-oriented " +"programming" + +#: ../../src/oop/solid.txt:10 +msgid "SOLID Principles" +msgstr "Принципи SOLID" diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/acid.po b/src/_locales/uk/LC_MESSAGES/rdbms/acid.po new file mode 100644 index 000000000..684341331 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/acid.po @@ -0,0 +1,239 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2024, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2024.02.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-02-18 16:48+0200\n" +"PO-Revision-Date: 2024-02-18 16:59+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.14.0\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/rdbms/acid.txt:-1 +msgid "Database normalization" +msgstr "Нормалізація бази даних" + +#: ../../src/rdbms/acid.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/rdbms/acid.txt:-1 +msgid "sql, db, database, acid, atomic, consistent, isolated, durable" +msgstr "sql, db, database, acid, atomic, consistent, isolated, durable" + +#: ../../src/rdbms/acid.txt:8 +msgid "ACID" +msgstr "ACID" + +#: ../../src/rdbms/acid.txt:10 +msgid "" +":abbr:`ACID (Atomicity, Consistency, Isolation, Durability)` is a set of " +"properties of database transactions intended to guarantee data validity " +"despite errors, power failures, and other mishaps. In the context of " +"databases, a sequence of database operations that satisfies the ACID " +"properties is called a transaction." +msgstr "" +":abbr:`ACID (Atomicity, Consistency, Isolation, Durability - атомарність, " +"узгодженість, ізоляція, довговічність)` - це набір властивостей транзакцій " +"бази даних, призначених для гарантування дійсності даних, незважаючи на " +"помилки, збої в електропостачанні та інші непередбачувані ситуації. У " +"контексті баз даних послідовність операцій з базою даних, яка задовольняє " +"властивості ACID, називається транзакцією." + +#: ../../src/rdbms/acid.txt:17 +msgid "Atomicity" +msgstr "Атомарність" + +#: ../../src/rdbms/acid.txt:19 +msgid "" +"Transactions are often composed of multiple statements. Atomicity guarantees " +"that each transaction is treated as a single \"unit\", which either succeeds " +"completely, or fails completely: if any of the statements constituting a " +"transaction fails to complete, the entire transaction fails and the database " +"left unchanged. A guarantee of atomicity prevents updates to the database " +"from occurring only partially, which can cause greater problems, than " +"rejecting the whole series outright." +msgstr "" +"Транзакції часто складаються з декількох операцій. Атомарність гарантує, що " +"кожна транзакція розглядається як одна \"одиниця\", яка або повністю " +"завершується успішно, або повністю провалюється: якщо будь-який з " +"операторів, що складають транзакцію, не завершується, вся транзакція " +"провалюється, а база даних залишається незмінною. Гарантія атомарності " +"запобігає частковому оновленню бази даних, що може спричинити більші " +"проблеми, ніж повна відмова від усієї серії оновлень даних." + +#: ../../src/rdbms/acid.txt:27 +msgid "As an example, there are few rows in an accounting table:" +msgstr "Наприклад, в бухгалтерській таблиці є кілька рядків:" + +#: ../../src/rdbms/acid.txt:29 +msgid "accounting" +msgstr "accounting" + +#: ../../src/rdbms/acid.txt:32 +msgid "person_id" +msgstr "person_id" + +#: ../../src/rdbms/acid.txt:32 +msgid "name" +msgstr "name" + +#: ../../src/rdbms/acid.txt:32 +msgid "balance" +msgstr "balance" + +#: ../../src/rdbms/acid.txt:34 ../../src/rdbms/acid.txt:40 +msgid "..." +msgstr "..." + +#: ../../src/rdbms/acid.txt:36 ../../src/rdbms/acid.txt:53 +msgid "529" +msgstr "529" + +#: ../../src/rdbms/acid.txt:36 ../../src/rdbms/acid.txt:53 +msgid "Dora Headstrong" +msgstr "Dora Headstrong" + +#: ../../src/rdbms/acid.txt:36 +msgid "$1,000" +msgstr "$1,000" + +#: ../../src/rdbms/acid.txt:38 ../../src/rdbms/acid.txt:55 +msgid "402" +msgstr "402" + +#: ../../src/rdbms/acid.txt:38 ../../src/rdbms/acid.txt:55 +msgid "Toby Mugwort" +msgstr "Toby Mugwort" + +#: ../../src/rdbms/acid.txt:38 ../../src/rdbms/acid.txt:55 +msgid "$100" +msgstr "$100" + +#: ../../src/rdbms/acid.txt:43 +msgid "" +"In case, Dora wants to transfer $100 to Toby, this can be split into 3 " +"statements:" +msgstr "Якщо Дора хоче переказати $100 Тобі, це можна розбити на 3 операції:" + +#: ../../src/rdbms/acid.txt:46 +msgid "Check if $100 is available" +msgstr "Перевірити, чи доступні $100" + +#: ../../src/rdbms/acid.txt:47 +msgid "Deduct $100 from Dora's balance" +msgstr "Відняти $100 з балансу Дори" + +#: ../../src/rdbms/acid.txt:48 +msgid "Add $100 to Toby's balance" +msgstr "Додати $100 на баланс Тобі" + +#: ../../src/rdbms/acid.txt:50 +msgid "In case the 3rd statement fails, the data may stay as:" +msgstr "Якщо 3-й оператор не спрацює, дані можуть залишитися у вигляді:" + +#: ../../src/rdbms/acid.txt:53 +msgid "$900" +msgstr "$900" + +#: ../../src/rdbms/acid.txt:58 +msgid "" +"Atomicity guarantee reverting database to an old state, in case any " +"statement fails." +msgstr "" +"Атомарність гарантує повернення бази даних до старого стану, якщо якийсь " +"оператор зазнає невдачі." + +#: ../../src/rdbms/acid.txt:62 +msgid "Consistency" +msgstr "Узгодженість" + +#: ../../src/rdbms/acid.txt:64 +msgid "" +"You can think \"consistency\" as \"correctness\". It ensures that a " +"transaction can only bring the database from one consistent state to " +"another, preserving database invariants: any data written to the database " +"must be valid according to all defined rules, including constraints, " +"cascades, triggers, and any combination of thereof. This prevents database " +"corruption by an illegal transaction. As example, referential integrity " +"guarantees the primary key -- foreign key relationship." +msgstr "" +"Ви можете думати про \"узгодженість\" як про \"правильність\". Вона " +"гарантує, що транзакція може лише переводити базу даних з одного узгодженого " +"стану в інший: будь-які дані, записані в базу даних, повинні бути дійсними " +"згідно з усіма визначеними правилами, включаючи обмеження, каскади, тригери " +"та будь-яку їх комбінацію. Це запобігає пошкодженню бази даних неправильною " +"транзакцією. Наприклад, цілісність посилань гарантує зв'язок між первинним і " +"зовнішнім ключами." + +#: ../../src/rdbms/acid.txt:73 +msgid "Isolation" +msgstr "Ізоляція" + +#: ../../src/rdbms/acid.txt:75 +msgid "" +"Transactions are often executed concurrently (e.g. multiple transactions " +"reading and writing to a table at the same time). Isolation ensures that " +"concurrent execution of transactions leaves the database in the state that " +"would have been obtained if the transactions were executed sequentially. " +"Isolation is the main goal of concurrency control; depending on the " +"isolation level used, the effects of an incomplete transaction might not be " +"visible to other transaction." +msgstr "" +"Транзакції часто виконуються паралельно (наприклад, декілька транзакцій " +"одночасно читають і записують дані в таблицю). Ізоляція гарантує, що " +"одночасне виконання транзакцій залишає базу даних у стані, який був би " +"отриманий, якби транзакції виконувалися послідовно. Ізоляція є основною " +"метою контролю паралелізму; залежно від рівня ізоляції, що використовується, " +"наслідки незавершеної транзакції можуть бути невидимими для інших транзакцій." + +#: ../../src/rdbms/acid.txt:83 +msgid "" +"For example, two persons have access to the same account having $1,000 on " +"it, and both persons tries to get the money out of this account. Dora tries " +"to get $1,000, and Toby tries to get $100." +msgstr "" +"Наприклад, дві особи мають доступ до одного рахунку, на якому є $1,000, і " +"обидві особи намагаються зняти гроші з цього рахунку. Дора намагається зняти " +"$1,000, а Тобі - $100." + +#: ../../src/rdbms/acid.txt:87 +msgid "" +"The sum of the money to get out of the account is $1,100, which cause an " +"issue of leaving negative amount of money. So, one of these transactions " +"fails." +msgstr "" +"Сума грошей, яку потрібно зняти з рахунку, становить $1,100, що призводить " +"до проблеми від'ємної суми. Отже, одна з цих транзакцій не вдається." + +#: ../../src/rdbms/acid.txt:90 +msgid "Isolation ensures the concurrent executions are safe." +msgstr "Ізоляція забезпечує безпеку конкурентного виконання." + +#: ../../src/rdbms/acid.txt:93 +msgid "Durability" +msgstr "Довговічність" + +#: ../../src/rdbms/acid.txt:95 +msgid "" +"The durability means once the transaction has been committed, the data must " +"be writen to non-volatile memory. So, even if a crash happens, or something " +"wrong with the database, the data must be where, and must not be corrupted." +msgstr "" +"Довговічність означає, що як тільки транзакція була здійснена, дані повинні " +"бути записані в енергонезалежну пам'ять. Таким чином, навіть якщо трапиться " +"збій або щось не так з базою даних, дані повинні бути на місці і не повинні " +"бути пошкоджені." diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/aggregation.po b/src/_locales/uk/LC_MESSAGES/rdbms/aggregation.po new file mode 100644 index 000000000..1858c50b4 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/aggregation.po @@ -0,0 +1,479 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: https://github.com/edu-python-course/edu-python-course." +"github.io/issues\n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-12-21 03:52+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: ua\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4.1\n" + +#: ../../src/rdbms/aggregation.txt:-1 +msgid "Data aggregation" +msgstr "Агрегація даних" + +#: ../../src/rdbms/aggregation.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/rdbms/aggregation.txt:-1 +msgid "sql, db, database, data, aggregation, functions" +msgstr "sql, db, database, data, aggregation, functions" + +#: ../../src/rdbms/aggregation.txt:8 +msgid "Data Aggregation" +msgstr "Агрегація даних" + +#: ../../src/rdbms/aggregation.txt:10 +msgid "Here is some dummy data, that will be used as example in this section." +msgstr "" +"Ось деякі фіктивні дані, які будуть використані як приклад у цьому розділі." + +#: ../../src/rdbms/aggregation.txt:12 +msgid "product" +msgstr "product" + +#: ../../src/rdbms/products_table.csv:1 +msgid "id" +msgstr "id" + +#: ../../src/rdbms/products_table.csv:1 +msgid "name" +msgstr "name" + +#: ../../src/rdbms/products_table.csv:1 +msgid "price" +msgstr "price" + +#: ../../src/rdbms/aggregation.txt:174 ../../src/rdbms/aggregation.txt:215 +#: ../../src/rdbms/products_table.csv:1 +msgid "category" +msgstr "category" + +#: ../../src/rdbms/aggregation.txt:174 ../../src/rdbms/aggregation.txt:215 +#: ../../src/rdbms/products_table.csv:1 +msgid "sold" +msgstr "sold" + +#: ../../src/rdbms/products_table.csv:1 +msgid "1" +msgstr "1" + +#: ../../src/rdbms/products_table.csv:1 +msgid "Samsung Galaxy" +msgstr "Samsung Galaxy" + +#: ../../src/rdbms/products_table.csv:1 +msgid "100000" +msgstr "100000" + +#: ../../src/rdbms/aggregation.txt:181 ../../src/rdbms/products_table.csv:1 +msgid "Phones" +msgstr "Phones" + +#: ../../src/rdbms/products_table.csv:1 +msgid "500" +msgstr "500" + +#: ../../src/rdbms/products_table.csv:1 +msgid "2" +msgstr "2" + +#: ../../src/rdbms/products_table.csv:1 +msgid "iPhone 13 Pro" +msgstr "iPhone 13 Pro" + +#: ../../src/rdbms/products_table.csv:1 +msgid "120000" +msgstr "120000" + +#: ../../src/rdbms/aggregation.txt:180 ../../src/rdbms/aggregation.txt:219 +#: ../../src/rdbms/products_table.csv:1 +msgid "300" +msgstr "300" + +#: ../../src/rdbms/products_table.csv:1 +msgid "3" +msgstr "3" + +#: ../../src/rdbms/products_table.csv:1 +msgid "MacBook Pro" +msgstr "MacBook Pro" + +#: ../../src/rdbms/products_table.csv:1 +msgid "350000" +msgstr "350000" + +#: ../../src/rdbms/aggregation.txt:180 ../../src/rdbms/aggregation.txt:219 +#: ../../src/rdbms/products_table.csv:1 +msgid "Laptops" +msgstr "Laptops" + +#: ../../src/rdbms/products_table.csv:1 +msgid "100" +msgstr "100" + +#: ../../src/rdbms/products_table.csv:1 +msgid "4" +msgstr "4" + +#: ../../src/rdbms/products_table.csv:1 +msgid "Lenovo ThinkPad" +msgstr "Lenovo ThinkPad" + +#: ../../src/rdbms/products_table.csv:1 +msgid "150000" +msgstr "150000" + +#: ../../src/rdbms/products_table.csv:1 +msgid "200" +msgstr "200" + +#: ../../src/rdbms/products_table.csv:1 +msgid "5" +msgstr "5" + +#: ../../src/rdbms/products_table.csv:1 +msgid "HP Printer" +msgstr "HP Printer" + +#: ../../src/rdbms/products_table.csv:1 +msgid "20000" +msgstr "20000" + +#: ../../src/rdbms/aggregation.txt:177 ../../src/rdbms/products_table.csv:1 +msgid "Printers" +msgstr "Printers" + +#: ../../src/rdbms/aggregation.txt:177 ../../src/rdbms/aggregation.txt:181 +#: ../../src/rdbms/products_table.csv:1 +msgid "800" +msgstr "800" + +#: ../../src/rdbms/products_table.csv:1 +msgid "6" +msgstr "6" + +#: ../../src/rdbms/products_table.csv:1 +msgid "Dell Monitor" +msgstr "Dell Monitor" + +#: ../../src/rdbms/products_table.csv:1 +msgid "50000" +msgstr "50000" + +#: ../../src/rdbms/aggregation.txt:179 ../../src/rdbms/aggregation.txt:218 +#: ../../src/rdbms/products_table.csv:1 +msgid "Monitors" +msgstr "Monitors" + +#: ../../src/rdbms/aggregation.txt:179 ../../src/rdbms/aggregation.txt:218 +#: ../../src/rdbms/products_table.csv:1 +msgid "400" +msgstr "400" + +#: ../../src/rdbms/products_table.csv:1 +msgid "7" +msgstr "7" + +#: ../../src/rdbms/products_table.csv:1 +msgid "Sony Headphones" +msgstr "Sony Headphones" + +#: ../../src/rdbms/products_table.csv:1 +msgid "30000" +msgstr "30000" + +#: ../../src/rdbms/aggregation.txt:176 ../../src/rdbms/aggregation.txt:217 +#: ../../src/rdbms/products_table.csv:1 +msgid "Audio" +msgstr "Audio" + +#: ../../src/rdbms/aggregation.txt:176 ../../src/rdbms/aggregation.txt:217 +#: ../../src/rdbms/products_table.csv:1 +msgid "0" +msgstr "0" + +#: ../../src/rdbms/products_table.csv:1 +msgid "8" +msgstr "8" + +#: ../../src/rdbms/products_table.csv:1 +msgid "Bose Soundbar" +msgstr "Bose Soundbar" + +#: ../../src/rdbms/products_table.csv:1 +msgid "70000" +msgstr "70000" + +#: ../../src/rdbms/products_table.csv:1 +msgid "9" +msgstr "9" + +#: ../../src/rdbms/products_table.csv:1 +msgid "Xbox Series X" +msgstr "Xbox Series X" + +#: ../../src/rdbms/products_table.csv:1 +msgid "60000" +msgstr "60000" + +#: ../../src/rdbms/aggregation.txt:178 ../../src/rdbms/products_table.csv:1 +msgid "Gaming" +msgstr "Gaming" + +#: ../../src/rdbms/products_table.csv:1 +msgid "250" +msgstr "250" + +#: ../../src/rdbms/products_table.csv:1 +msgid "10" +msgstr "10" + +#: ../../src/rdbms/products_table.csv:1 +msgid "PlayStation 5" +msgstr "PlayStation 5" + +#: ../../src/rdbms/products_table.csv:1 +msgid "55000" +msgstr "55000" + +#: ../../src/rdbms/products_table.csv:1 +msgid "350" +msgstr "350" + +#: ../../src/rdbms/aggregation.txt:19 +msgid "The same dataset is available as:" +msgstr "The same dataset is available as:" + +#: ../../src/rdbms/aggregation.txt:21 +msgid ":download:`csv file <./products_table.csv>`" +msgstr ":download:`csv file <./products_table.csv>`" + +#: ../../src/rdbms/aggregation.txt:22 +msgid "" +":download:`postgres dump file `" +msgstr "" +":download:`postgres dump file `" + +#: ../../src/rdbms/aggregation.txt:25 +msgid "Aggregate functions" +msgstr "Агрегуючі функції" + +#: ../../src/rdbms/aggregation.txt:27 +msgid "" +"*Aggregate functions* compute a single result from a set of input values. " +"Various RDBMS implement various built-in aggregate functions. In this " +"section we will review 5 basic functions that are available in all RDBMS." +msgstr "" +"*Агрегатні функції* обчислюють один результат із набору вхідних значень. " +"Різні RDBMS реалізують різноманітні вбудовані агрегатні функції. У цьому " +"розділі ми розглянемо 5 основних функцій, доступних у всіх RDBMS." + +#: ../../src/rdbms/aggregation.txt:34 +msgid "Count" +msgstr "Підрахунок" + +#: ../../src/rdbms/aggregation.txt:36 +msgid "" +"The ``count(field)`` function returns a count of the number of times that " +"``field`` is not ``NULL`` in a group. The ``count(*)`` function (with no " +"arguments) returns the total number of rows in the group." +msgstr "" +"Функція ``count(field)`` повертає кількість разів, коли ``field`` не є " +"``NULL`` у групі. Функція ``count()`` (без аргументів) повертає загальну " +"кількість рядків у групі." + +#: ../../src/rdbms/aggregation.txt:52 +msgid "Maximum value" +msgstr "Максимальне значення" + +#: ../../src/rdbms/aggregation.txt:54 +msgid "" +"The ``max()`` aggregate function returns the maximum value of all values in " +"the group. The maximum value is the value that would be returned last in an " +"ORDER BY on the same column. Aggregate function returns ``NULL`` if and only " +"if there are no non-NULL values in the group." +msgstr "" +"Агрегатна функція ``max()`` повертає максимальне значення з усіх значень у " +"групі. Максимальне значення - це значення, яке буде повернуто останнім у " +"ORDER BY для того самого стовпця. Агрегатна функція повертає ` `NULL``, якщо " +"і лише якщо в групі немає значень, відмінних від NULL." + +#: ../../src/rdbms/aggregation.txt:71 +msgid "Minimum value" +msgstr "Мінімальне значення" + +#: ../../src/rdbms/aggregation.txt:73 +msgid "" +"The ``min()`` aggregate function returns the minimum non-NULL value of all " +"values in the group. The minimum value is the first non-NULL value that " +"would appear in an ORDER BY of the column. Aggregate function returns " +"``NULL`` if and only if there are no non-NULL values in the group." +msgstr "" +"Агрегатна функція ``min()`` повертає мінімальне значення не NULL для всіх " +"значень у групі. Мінімальне значення - це перше значення не NULL, яке " +"з'явиться в ORDER BY з Агрегатна функція повертає ``NULL`` тоді і тільки " +"якщо в групі немає значень, відмінних від NULL." + +#: ../../src/rdbms/aggregation.txt:90 +msgid "Average value" +msgstr "Середнє значення" + +#: ../../src/rdbms/aggregation.txt:92 +msgid "" +"The ``avg()`` function returns the average value of all non-NULL inputs " +"within a group. String and BLOB values that do not look like numbers are " +"interpreted as 0. The result is always a floating point value whenever there " +"is at least one non-NULL input even if all inputs are integers. The result " +"is ``NULL`` if and only if there are no non-NULL inputs." +msgstr "" +"Функція ``avg()`` повертає середнє значення всіх не-NULL вхідних даних у " +"групі. Рядкові та BLOB-значення, які не виглядають як числа, інтерпретуються " +"як 0. Результат завжди значення з плаваючою комою щоразу, коли є принаймні " +"один не-NULL-вхід, навіть якщо всі вхідні дані є цілими числами. Результатом " +"є ``NULL`` тоді і тільки якщо немає не-NULL-вхідних даних." + +#: ../../src/rdbms/aggregation.txt:110 +msgid "Sum of values" +msgstr "Сума значень" + +#: ../../src/rdbms/aggregation.txt:112 +msgid "" +"The ``sum()`` aggregate functions return the sum of all non-NULL values in " +"the group. If there are no non-NULL input rows then function returns " +"``NULL``." +msgstr "" +"Агрегатні функції ``sum()`` повертають суму всіх значень, відмінних від " +"NULL, у групі. Якщо вхідних рядків немає, функція повертає ``NULL``." + +#: ../../src/rdbms/aggregation.txt:117 +msgid "" +"NULL is not normally a helpful result for the sum of no rows but the SQL " +"standard requires it." +msgstr "" +"NULL зазвичай не є корисним результатом для суми відсутності рядків, але " +"стандарт SQL вимагає цього." + +#: ../../src/rdbms/aggregation.txt:120 +msgid "" +"SQLite implements ``total`` aggregate function, that is similar to ``sum``, " +"but returns ``0.0`` (always floating point) if there are no non-NULL input " +"rows." +msgstr "" +"SQLite реалізує агрегатну функцію ``total``, подібну до ``sum``, але " +"повертає ``0.0`` (завжди з плаваючою точкою), якщо немає вхідних рядків, " +"відмінних від NULL." + +#: ../../src/rdbms/aggregation.txt:135 +msgid "Grouping data" +msgstr "Групування даних" + +#: ../../src/rdbms/aggregation.txt:137 +msgid "" +"Getting some aggregated values is not very helpful itself. Most cases " +"require to group outputs in some specific manner." +msgstr "" +"Отримання деяких агрегованих значень не є дуже корисним саме по собі. " +"Більшість випадків вимагають згрупувати виходи певним чином." + +#: ../../src/rdbms/aggregation.txt:140 +msgid "" +"For example, if the task is to count number of registered categories it is " +"simple to solve as:" +msgstr "" +"Наприклад, якщо завдання полягає в підрахунку кількості зареєстрованих " +"категорій, його просто вирішити так:" + +#: ../../src/rdbms/aggregation.txt:153 +msgid "" +"But in case, the task is to count **sold** items for each category, this " +"becomes impossible to solve without grouping items. ``GROUP BY`` clause " +"provides the ability to group rows based on some field(s) values." +msgstr "" +"Але у випадку, якщо завдання полягає в підрахунку проданих товарів для " +"кожної категорії, це стає неможливим вирішити без групування товарів. Пункт " +"``GROUP BY`` надає можливість групувати рядки на основі певного значення " +"поля(ів)." + +#: ../../src/rdbms/aggregation.txt:157 +msgid "General syntax is:" +msgstr "Загальний синтаксис:" + +#: ../../src/rdbms/aggregation.txt:178 +msgid "600" +msgstr "600" + +#: ../../src/rdbms/aggregation.txt:184 +msgid "" +"If the ``SELECT`` statement is an aggregate query with a ``GROUP BY`` " +"clause, then each of the expressions specified as part of the GROUP BY " +"clause is evaluated for each row of the dataset according to the processing " +"rules stated below for ORDER BY expressions. Each row is then assigned to a " +"\"group\" based on the results; rows for which the results of evaluating the " +"GROUP BY expressions are the same get assigned to the same group. For the " +"purposes of grouping rows, ``NULL`` values are considered equal. The usual " +"rules for selecting a collation sequence with which to compare text values " +"apply when evaluating expressions in a GROUP BY clause. The expressions in " +"the GROUP BY clause do not have to be expressions that appear in the result. " +"The expressions in a GROUP BY clause may not be aggregate expressions." +msgstr "" +"Якщо інструкція ``SELECT`` є сукупним запитом із пропозицією ``GROUP BY``, " +"тоді кожен із виразів, указаних як частина пропозиції GROUP BY, оцінюється " +"для кожного рядка набір даних згідно з правилами обробки, викладеними нижче " +"для виразів ORDER BY. Кожен рядок потім призначається \"групі\" на основі " +"результатів; рядки, для яких результати оцінювання виразів GROUP BY однакові " +"призначаються до однієї групи. Для цілей групування рядків значення ``NULL`` " +"вважаються рівними. Звичайні правила для вибору послідовності порівняння, з " +"якою порівнюються текстові значення, застосовуються під час оцінювання " +"виразів у Речення GROUP BY. Вирази в пункті GROUP BY не обов'язково повинні " +"бути виразами, які з'являються в результаті. Вирази в пункті GROUP BY не " +"можуть бути сукупними виразами." + +#: ../../src/rdbms/aggregation.txt:197 +msgid "HAVING clause" +msgstr "Вираз HAVING" + +#: ../../src/rdbms/aggregation.txt:199 +msgid "" +"But what, if the task is to filter categories, that have less than 500 sold " +"items in it? ``WHERE`` clause will be useless, cause it's evaluated before " +"grouping output. In other words, only rows that suite WHERE filter will be " +"selected." +msgstr "" +"Але що, якщо завдання полягає у фільтруванні категорій, які містять менше " +"500 проданих товарів? Речення ``WHERE`` буде марним, тому що воно оцінюється " +"перед групуванням виводу. Іншими словами, лише рядки, які набір WHERE буде " +"вибрано фільтр." + +#: ../../src/rdbms/aggregation.txt:222 +msgid "" +"If a ``HAVING`` clause is specified, it is evaluated once for each group of " +"rows as a boolean expression. If the result of evaluating the HAVING clause " +"is false, the group is discarded. If the HAVING clause is an aggregate " +"expression, it is evaluated across all rows in the group." +msgstr "" +"Якщо вказано пропозицію ``HAVING``, вона оцінюється один раз для кожної " +"групи рядків як логічний вираз. Якщо результат обчислення пропозиції HAVING " +"хибний, групу відкидають. Якщо речення HAVING є агрегатним виразом, воно " +"обчислюється в усіх рядках у групі." + +#: ../../src/rdbms/aggregation.txt:227 +msgid "" +"If a HAVING clause is a non-aggregate expression, it is evaluated with " +"respect to an arbitrarily selected row from the group. The HAVING expression " +"may refer to values, even aggregate functions, that are not in the result." +msgstr "" +"Якщо речення HAVING є неагрегатним виразом, воно оцінюється щодо довільно " +"вибраного рядка з групи. Вираз HAVING може посилатися на значення, навіть " +"агрегатні функції, яких немає в результат." diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/datatypes.po b/src/_locales/uk/LC_MESSAGES/rdbms/datatypes.po new file mode 100644 index 000000000..d4bf1c56b --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/datatypes.po @@ -0,0 +1,1298 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-22 13:15+0000\n" +"PO-Revision-Date: 2023-12-22 15:15+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.4.1\n" + +#: ../../src/rdbms/datatypes.txt:3 +msgid "PostgreSQL RDBMS: Data types" +msgstr "СУБД PostgreSQL: Типи даних" + +#: ../../src/rdbms/datatypes.txt:5 +msgid "PostgreSQL has a rich set of data types available to users." +msgstr "PostgreSQL має багатий набір типів даних, доступних для користувачів." + +#: ../../src/rdbms/datatypes.txt:7 +msgid "" +"Users can add new types to PostgreSQL using the ``CREATE TYPE`` command." +msgstr "" +"Користувачі можуть додавати нові типи до PostgreSQL за допомогою команди " +"``CREATE TYPE``." + +#: ../../src/rdbms/datatypes.txt:9 +msgid "Custom data type definition" +msgstr "Визначення користувацького типу даних" + +#: ../../src/rdbms/datatypes.txt:15 ../../src/rdbms/datatypes.txt:132 +#: ../../src/rdbms/datatypes.txt:163 +msgid "Name" +msgstr "Назва" + +#: ../../src/rdbms/datatypes.txt:15 +msgid "Aliases" +msgstr "Псевдоніми" + +#: ../../src/rdbms/datatypes.txt:15 ../../src/rdbms/datatypes.txt:132 +#: ../../src/rdbms/datatypes.txt:163 ../../src/rdbms/datatypes.txt:233 +#: ../../src/rdbms/datatypes.txt:274 ../../src/rdbms/datatypes.txt:305 +#: ../../src/rdbms/datatypes.txt:330 +msgid "Description" +msgstr "Опис" + +#: ../../src/rdbms/datatypes.txt:17 +msgid "``bigint``" +msgstr "``bigint``" + +#: ../../src/rdbms/datatypes.txt:17 +msgid "``int8``" +msgstr "``int8``" + +#: ../../src/rdbms/datatypes.txt:17 +msgid "signed eight-byte integer" +msgstr "знакове восьмибайтне ціле число" + +#: ../../src/rdbms/datatypes.txt:19 +msgid "``bigserial``" +msgstr "``bigserial``" + +#: ../../src/rdbms/datatypes.txt:19 +msgid "``serial8``" +msgstr "``serial8``" + +#: ../../src/rdbms/datatypes.txt:19 +msgid "auto incrementing eight-byte integer" +msgstr "автоінкрементоване восьмибайтне ціле число" + +#: ../../src/rdbms/datatypes.txt:21 +msgid "``bit``" +msgstr "``bit``" + +#: ../../src/rdbms/datatypes.txt:21 +msgid "fixed-length bit string" +msgstr "бітовий рядок фіксованої довжини" + +#: ../../src/rdbms/datatypes.txt:23 +msgid "``bit varying``" +msgstr "``bit varying``" + +#: ../../src/rdbms/datatypes.txt:23 +msgid "``varbit``" +msgstr "``varbit``" + +#: ../../src/rdbms/datatypes.txt:23 +msgid "variable-length bit string" +msgstr "бітовий рядок змінної довжини" + +#: ../../src/rdbms/datatypes.txt:25 +msgid "``boolean``" +msgstr "``boolean``" + +#: ../../src/rdbms/datatypes.txt:25 +msgid "``bool``" +msgstr "``bool``" + +#: ../../src/rdbms/datatypes.txt:25 +msgid "logical Boolean (true/false)" +msgstr "логічний тип даних (true/false)" + +#: ../../src/rdbms/datatypes.txt:27 +msgid "``box``" +msgstr "``box``" + +#: ../../src/rdbms/datatypes.txt:27 +msgid "rectangular box on a plane" +msgstr "прямокутник на площині" + +#: ../../src/rdbms/datatypes.txt:29 +msgid "``bytea``" +msgstr "``bytea``" + +#: ../../src/rdbms/datatypes.txt:29 +msgid "binary data (“byte array”)" +msgstr "двійкові дані (\"байтовий масив\")" + +#: ../../src/rdbms/datatypes.txt:31 +msgid "``character``" +msgstr "``character``" + +#: ../../src/rdbms/datatypes.txt:31 +msgid "``char``" +msgstr "``char``" + +#: ../../src/rdbms/datatypes.txt:31 +msgid "fixed-length character string" +msgstr "символьний рядок фіксованої довжини" + +#: ../../src/rdbms/datatypes.txt:33 +msgid "``character varying``" +msgstr "``character varying``" + +#: ../../src/rdbms/datatypes.txt:33 +msgid "``varchar``" +msgstr "``varchar``" + +#: ../../src/rdbms/datatypes.txt:33 ../../src/rdbms/datatypes.txt:83 +msgid "variable-length character string" +msgstr "символьний рядок змінної довжини" + +#: ../../src/rdbms/datatypes.txt:35 +msgid "``cidr``" +msgstr "``cidr``" + +#: ../../src/rdbms/datatypes.txt:35 +msgid "IPv4 or IPv6 network address" +msgstr "Мережева адреса IPv4 або IPv6" + +#: ../../src/rdbms/datatypes.txt:37 +msgid "``circle``" +msgstr "``circle``" + +#: ../../src/rdbms/datatypes.txt:37 +msgid "circle on a plane" +msgstr "коло на площині" + +#: ../../src/rdbms/datatypes.txt:39 +msgid "``double precision``" +msgstr "``double precision``" + +#: ../../src/rdbms/datatypes.txt:39 +msgid "``float8``" +msgstr "``float8``" + +#: ../../src/rdbms/datatypes.txt:39 +msgid "double precision floating-point number (8 bytes)" +msgstr "число з плаваючою комою подвійної точності (8 байт)" + +#: ../../src/rdbms/datatypes.txt:41 +msgid "``date``" +msgstr "``date``" + +#: ../../src/rdbms/datatypes.txt:41 +msgid "calendar date (year, month, day)" +msgstr "календарна дата (рік, місяць, день)" + +#: ../../src/rdbms/datatypes.txt:43 +msgid "``inet``" +msgstr "``inet``" + +#: ../../src/rdbms/datatypes.txt:43 +msgid "IPv4 or IPv6 host address" +msgstr "IPv4 або IPv6 адреса хосту" + +#: ../../src/rdbms/datatypes.txt:45 +msgid "``integer``" +msgstr "``integer``" + +#: ../../src/rdbms/datatypes.txt:45 +msgid "``int``, ``int4``" +msgstr "``int``, ``int4``" + +#: ../../src/rdbms/datatypes.txt:45 +msgid "signed four-byte integer" +msgstr "знакове чотирибайтне ціле число" + +#: ../../src/rdbms/datatypes.txt:47 +msgid "``interval``" +msgstr "``interval``" + +#: ../../src/rdbms/datatypes.txt:47 +msgid "time span" +msgstr "проміжок часу" + +#: ../../src/rdbms/datatypes.txt:49 +msgid "``json``" +msgstr "``json``" + +#: ../../src/rdbms/datatypes.txt:49 +msgid "textual JSON data" +msgstr "текстові дані JSON" + +#: ../../src/rdbms/datatypes.txt:51 +msgid "``jsonb``" +msgstr "``jsonb``" + +#: ../../src/rdbms/datatypes.txt:51 +msgid "binary JSON data, decomposed" +msgstr "двійкові дані JSON, декомпоновані" + +#: ../../src/rdbms/datatypes.txt:53 +msgid "``line``" +msgstr "``line``" + +#: ../../src/rdbms/datatypes.txt:53 +msgid "infinite line on a plane" +msgstr "нескінченна пряма на площині" + +#: ../../src/rdbms/datatypes.txt:55 +msgid "``lseg``" +msgstr "``lseg``" + +#: ../../src/rdbms/datatypes.txt:55 +msgid "line segment on a plane" +msgstr "відрізок прямої на площині" + +#: ../../src/rdbms/datatypes.txt:57 +msgid "``macaddr``" +msgstr "``macaddr``" + +#: ../../src/rdbms/datatypes.txt:57 +msgid "MAC (Media Access Control) address" +msgstr "MAC-адреса (Media Access Control)" + +#: ../../src/rdbms/datatypes.txt:59 +msgid "``macaddr8``" +msgstr "``macaddr8``" + +#: ../../src/rdbms/datatypes.txt:59 +msgid "MAC (Media Access Control) address (EUI-64 format)" +msgstr "MAC-адреса (Media Access Control) (формат EUI-64)" + +#: ../../src/rdbms/datatypes.txt:61 +msgid "``money``" +msgstr "``money``" + +#: ../../src/rdbms/datatypes.txt:61 +msgid "currency amount" +msgstr "сума валюти" + +#: ../../src/rdbms/datatypes.txt:63 +msgid "``numeric``" +msgstr "``numeric``" + +#: ../../src/rdbms/datatypes.txt:63 +msgid "``decimal``" +msgstr "``decimal``" + +#: ../../src/rdbms/datatypes.txt:63 +msgid "exact numeric of selectable precision" +msgstr "точне число з обраною точністю" + +#: ../../src/rdbms/datatypes.txt:65 +msgid "``path``" +msgstr "``path``" + +#: ../../src/rdbms/datatypes.txt:65 +msgid "geometric path on a plane" +msgstr "геометричний шлях на площині" + +#: ../../src/rdbms/datatypes.txt:67 +msgid "``pg_lsn``" +msgstr "``pg_lsn``" + +#: ../../src/rdbms/datatypes.txt:67 +msgid "PostgreSQL Log Sequence Number" +msgstr "Номер послідовності журналу PostgreSQL" + +#: ../../src/rdbms/datatypes.txt:69 +msgid "``pg_snapshot``" +msgstr "``pg_snapshot``" + +#: ../../src/rdbms/datatypes.txt:69 +msgid "user-level transaction ID snapshot" +msgstr "знімок ідентифікатора транзакції на рівні користувача" + +#: ../../src/rdbms/datatypes.txt:71 +msgid "``point``" +msgstr "``point``" + +#: ../../src/rdbms/datatypes.txt:71 +msgid "geometric point on a plane" +msgstr "геометрична точка на площині" + +#: ../../src/rdbms/datatypes.txt:73 +msgid "``polygon``" +msgstr "``polygon``" + +#: ../../src/rdbms/datatypes.txt:73 +msgid "closed geometric path on a plane" +msgstr "замкнений геометричний шлях на площині" + +#: ../../src/rdbms/datatypes.txt:75 +msgid "``real``" +msgstr "``real``" + +#: ../../src/rdbms/datatypes.txt:75 +msgid "``float4``" +msgstr "``float4``" + +#: ../../src/rdbms/datatypes.txt:75 +msgid "single precision floating-point number (4 bytes)" +msgstr "число з плаваючою комою одинарної точності (4 байти)" + +#: ../../src/rdbms/datatypes.txt:77 +msgid "``smallint``" +msgstr "``smallint``" + +#: ../../src/rdbms/datatypes.txt:77 +msgid "``int2``" +msgstr "``int2``" + +#: ../../src/rdbms/datatypes.txt:77 +msgid "signed two-byte integer" +msgstr "знакове двобайтне ціле число" + +#: ../../src/rdbms/datatypes.txt:79 +msgid "``smallserial``" +msgstr "``smallserial``" + +#: ../../src/rdbms/datatypes.txt:79 +msgid "``serial2``" +msgstr "``serial2``" + +#: ../../src/rdbms/datatypes.txt:79 +msgid "auto incrementing two-byte integer" +msgstr "автоінкрементоване двобайтне ціле число" + +#: ../../src/rdbms/datatypes.txt:81 +msgid "``serial``" +msgstr "``serial``" + +#: ../../src/rdbms/datatypes.txt:81 +msgid "``serial4``" +msgstr "``serial4``" + +#: ../../src/rdbms/datatypes.txt:81 +msgid "auto incrementing four-byte integer" +msgstr "автоінкрементоване чотирибайтне ціле число" + +#: ../../src/rdbms/datatypes.txt:83 ../../src/rdbms/datatypes.txt:172 +msgid "``text``" +msgstr "``text``" + +#: ../../src/rdbms/datatypes.txt:85 ../../src/rdbms/datatypes.txt:354 +msgid "``time``" +msgstr "``time``" + +#: ../../src/rdbms/datatypes.txt:85 +msgid "time of day (no time zone)" +msgstr "час доби (без часового поясу)" + +#: ../../src/rdbms/datatypes.txt:87 +msgid "``time with time zone``" +msgstr "``time with time zone``" + +#: ../../src/rdbms/datatypes.txt:87 +msgid "``timetz``" +msgstr "``timetz``" + +#: ../../src/rdbms/datatypes.txt:87 +msgid "time of day, including time zone" +msgstr "час доби, включаючи часовий пояс" + +#: ../../src/rdbms/datatypes.txt:89 +msgid "``timestamp``" +msgstr "``timestamp``" + +#: ../../src/rdbms/datatypes.txt:89 +msgid "date and time (no time zone)" +msgstr "дата і час (без часового поясу)" + +#: ../../src/rdbms/datatypes.txt:91 +msgid "``timestamp with time zone``" +msgstr "``timestamp with time zone``" + +#: ../../src/rdbms/datatypes.txt:91 +msgid "``timestamptz``" +msgstr "``timestamptz``" + +#: ../../src/rdbms/datatypes.txt:91 +msgid "date and time, including time zone" +msgstr "дата і час, включаючи часовий пояс" + +#: ../../src/rdbms/datatypes.txt:93 +msgid "``tsquery``" +msgstr "``tsquery``" + +#: ../../src/rdbms/datatypes.txt:93 +msgid "text search query" +msgstr "текстовий пошуковий запит" + +#: ../../src/rdbms/datatypes.txt:95 +msgid "``tsvector``" +msgstr "``tsvector``" + +#: ../../src/rdbms/datatypes.txt:95 +msgid "text search document" +msgstr "текстовий пошуковий документ" + +#: ../../src/rdbms/datatypes.txt:97 +msgid "``txid_snapshot``" +msgstr "``txid_snapshot``" + +#: ../../src/rdbms/datatypes.txt:97 +msgid "user-level transaction ID snapshot (deprecated; see pg_snapshot)" +msgstr "" +"знімок ідентифікатора транзакції на рівні користувача (застарілий; див. " +"pg_snapshot)" + +#: ../../src/rdbms/datatypes.txt:99 +msgid "``uuid``" +msgstr "``uuid``" + +#: ../../src/rdbms/datatypes.txt:99 +msgid "universally unique identifier" +msgstr "універсальний унікальний ідентифікатор" + +#: ../../src/rdbms/datatypes.txt:101 +msgid "``xml``" +msgstr "``xml``" + +#: ../../src/rdbms/datatypes.txt:101 +msgid "XML data" +msgstr "XML-дані" + +#: ../../src/rdbms/datatypes.txt:105 +msgid "Types casting" +msgstr "Перетворення типів" + +#: ../../src/rdbms/datatypes.txt:107 +msgid "" +"SQL is a strong type language. That is, every data item has an associated " +"data type which determines its behavior and allowed usage. PostgreSQL has an " +"extensible type system that is more general and flexible than other SQL " +"implementations." +msgstr "" +"SQL - це мова сильних типів. Це означає, що кожен елемент даних має " +"асоційований тип даних, який визначає його поведінку та дозволене " +"використання. PostgreSQL має розширювану систему типів, яка є більш " +"загальною і гнучкою, ніж інші реалізації SQL." + +#: ../../src/rdbms/datatypes.txt:112 +msgid "You can cast some types in place using ``::`` notation, like:" +msgstr "" +"Ви можете приводити деякі типи на місці, використовуючи нотацію ``::``, " +"наприклад:" + +#: ../../src/rdbms/datatypes.txt:122 +msgid "Numeric types" +msgstr "Числові типи" + +#: ../../src/rdbms/datatypes.txt:124 +msgid "" +"Numeric types consist of two-, four-, and eight-byte integers, four- and " +"eight-byte floating-point numbers, and selectable-precision decimals." +msgstr "" +"Числові типи складаються з двох-, чотирьох- і восьмибайтових цілих чисел, " +"чотирьох- і восьмибайтових чисел з плаваючою комою та десяткових чисел з " +"довільною точністю." + +#: ../../src/rdbms/datatypes.txt:127 +msgid "" +"Type types ``smallint``, ``integer`` and ``bigint`` store whole numbers, " +"that is, numbers without fractional component, of various ranges. Attempts " +"to store values outside of the allowed range will result an error." +msgstr "" +"Типи ``smallint``, ``integer`` і ``bigint`` зберігають цілі числа, тобто " +"числа без дробової частини, різних діапазонів. Спроби зберігати значення, що " +"виходять за межі допустимого діапазону, призведуть до помилки." + +#: ../../src/rdbms/datatypes.txt:132 +msgid "Storage Size" +msgstr "Розмір" + +#: ../../src/rdbms/datatypes.txt:132 +msgid "Range" +msgstr "Діапазон" + +#: ../../src/rdbms/datatypes.txt:134 +msgid "smallint" +msgstr "smallint" + +#: ../../src/rdbms/datatypes.txt:134 ../../src/rdbms/datatypes.txt:152 +msgid "2 bytes" +msgstr "2 байти" + +#: ../../src/rdbms/datatypes.txt:134 +msgid "small-range integer" +msgstr "ціле число малого діапазону" + +#: ../../src/rdbms/datatypes.txt:134 +msgid "-32768 to +32767" +msgstr "-32768 до +32767" + +#: ../../src/rdbms/datatypes.txt:136 +msgid "integer" +msgstr "integer" + +#: ../../src/rdbms/datatypes.txt:136 ../../src/rdbms/datatypes.txt:146 +#: ../../src/rdbms/datatypes.txt:154 +msgid "4 bytes" +msgstr "4 байти" + +#: ../../src/rdbms/datatypes.txt:136 +msgid "typical choice for integer" +msgstr "типовий вибір для цілого числа" + +#: ../../src/rdbms/datatypes.txt:136 +msgid "-2147483648 to +2147483647" +msgstr "-2147483648 до +2147483647" + +#: ../../src/rdbms/datatypes.txt:138 +msgid "bigint" +msgstr "bigint" + +#: ../../src/rdbms/datatypes.txt:138 ../../src/rdbms/datatypes.txt:149 +#: ../../src/rdbms/datatypes.txt:156 +msgid "8 bytes" +msgstr "8 байт" + +#: ../../src/rdbms/datatypes.txt:138 +msgid "large-range integer" +msgstr "ціле число великого діапазону" + +#: ../../src/rdbms/datatypes.txt:138 +msgid "-9223372036854775808 to +9223372036854775807" +msgstr "-9223372036854775808 до +9223372036854775807" + +#: ../../src/rdbms/datatypes.txt:140 +msgid "decimal" +msgstr "decimal" + +#: ../../src/rdbms/datatypes.txt:140 ../../src/rdbms/datatypes.txt:143 +msgid "variable" +msgstr "змінна" + +#: ../../src/rdbms/datatypes.txt:140 ../../src/rdbms/datatypes.txt:143 +msgid "user-specified precision, exact" +msgstr "задана користувачем точність, точна" + +#: ../../src/rdbms/datatypes.txt:140 ../../src/rdbms/datatypes.txt:143 +msgid "" +"up to 131072 digits before the decimal point; up to 16383 digits after the " +"decimal point" +msgstr "" +"до 131072 знаків до десяткової крапки; до 16383 знаків після десяткової " +"крапки" + +#: ../../src/rdbms/datatypes.txt:143 +msgid "numeric" +msgstr "numeric" + +#: ../../src/rdbms/datatypes.txt:146 +msgid "real" +msgstr "real" + +#: ../../src/rdbms/datatypes.txt:146 ../../src/rdbms/datatypes.txt:149 +msgid "variable-precision, inexact" +msgstr "змінної точності, неточний" + +#: ../../src/rdbms/datatypes.txt:146 +msgid "6 decimal digits precision" +msgstr "6 десяткових знаків після коми" + +#: ../../src/rdbms/datatypes.txt:149 +msgid "double precision" +msgstr "double precision" + +#: ../../src/rdbms/datatypes.txt:149 +msgid "15 decimal digits precision" +msgstr "точність до 15 знаків після коми" + +#: ../../src/rdbms/datatypes.txt:152 +msgid "smallserial" +msgstr "smallserial" + +#: ../../src/rdbms/datatypes.txt:152 +msgid "small auto incrementing integer" +msgstr "невелике ціле число, що автоматично збільшується" + +#: ../../src/rdbms/datatypes.txt:152 +msgid "1 to 32767" +msgstr "1 до 32767" + +#: ../../src/rdbms/datatypes.txt:154 +msgid "serial" +msgstr "serial" + +#: ../../src/rdbms/datatypes.txt:154 +msgid "auto incrementing integer" +msgstr "автоінкрементоване ціле число" + +#: ../../src/rdbms/datatypes.txt:154 +msgid "1 to 2147483647" +msgstr "1 до 2147483647" + +#: ../../src/rdbms/datatypes.txt:156 +msgid "bigserial" +msgstr "bigserial" + +#: ../../src/rdbms/datatypes.txt:156 +msgid "large auto incrementing integer" +msgstr "велике ціле число, що автоматично збільшується" + +#: ../../src/rdbms/datatypes.txt:156 +msgid "1 to 9223372036854775807" +msgstr "1 до 9223372036854775807" + +#: ../../src/rdbms/datatypes.txt:160 +msgid "Character types" +msgstr "Символьні типи" + +#: ../../src/rdbms/datatypes.txt:165 +msgid "``character varying``, ``varchar``" +msgstr "``character varying``, ``varchar``" + +#: ../../src/rdbms/datatypes.txt:165 +msgid "variable-length with limit" +msgstr "змінної довжини з обмеженням" + +#: ../../src/rdbms/datatypes.txt:167 +msgid "``character``, ``char``, ``bpchar``" +msgstr "``character``, ``char``, ``bpchar``" + +#: ../../src/rdbms/datatypes.txt:167 +msgid "fixed-length, blank-padded" +msgstr "фіксованої довжини, пустотілі" + +#: ../../src/rdbms/datatypes.txt:169 +msgid "``bpchar`` without length specifier" +msgstr "``bpchar`` без специфікатора довжини" + +#: ../../src/rdbms/datatypes.txt:169 +msgid "variable unlimited length, blank-trimmed" +msgstr "змінна необмеженої довжини, без обрізів" + +#: ../../src/rdbms/datatypes.txt:172 +msgid "variable-unlimited length" +msgstr "змінна необмеженої довжини" + +#: ../../src/rdbms/datatypes.txt:175 +msgid "" +"SQL defines two primary character types: ``character varying(n)`` and " +"``character(n)``, where ``n`` is a positive integer. Both of these types can " +"store string up to ``n`` characters length. An attempt to store a longer " +"string into a column of these types will result an error, unless all the " +"excess characters are all spaces, in which case the string will be truncated " +"to the maximum length. However, if one explicitly casts a value to " +"``varchar(n)`` or ``char(n)``, then an over-length value will be truncated " +"to ``n`` characters without raising an error. If the string to be stored is " +"shorter than the declared length, value of type ``char`` will be space-" +"padded; values of ``varchar`` will simply store the shorter string." +msgstr "" +"У мові SQL визначено два основних типи символів: ``character varying(n)`` та " +"``character(n)``, де ``n`` - натуральне число. Обидва ці типи можуть " +"зберігати рядок довжиною до ``n`` символів. Спроба зберегти довший рядок у " +"стовпці цих типів призведе до помилки, якщо тільки всі надлишкові символи не " +"є пробілами, у цьому випадку рядок буде урізано до максимальної довжини. " +"Однак, якщо явно привести значення до ``varchar(n)`` або ``char(n)``, то " +"значення надмірної довжини буде урізано до ``n`` символів без виникнення " +"помилки. Якщо рядок, що зберігається, коротший за оголошену довжину, " +"значення типу ``char`` буде доповнено пробілами; значення типу ``varchar`` " +"просто збереже коротший рядок." + +#: ../../src/rdbms/datatypes.txt:186 +msgid "" +"In addition postgres provides the ``text`` type, which stores strings of any " +"length." +msgstr "" +"Крім того, у postgres передбачено тип ``text``, який зберігає рядки " +"довільної довжини." + +#: ../../src/rdbms/datatypes.txt:189 +msgid "" +"If specified, the length ``n`` must be greater than 0 and cannot exceed " +"10,485,760. If ``character varying`` is used without length specifier, the " +"type accepts strings of any length. If ``bpchar`` lacks a length specifier, " +"it also accepts strings of any length, but trailing spaces are semantically " +"insignificant. If ``character`` lacks a specifier, it is equivalent to " +"``character(1)``." +msgstr "" +"Якщо вказано, довжина ``n`` повинна бути більшою за 0 і не може перевищувати " +"10 485 760 символів. Якщо ``character varying`` використовується без " +"специфікатора довжини, тип приймає рядки будь-якої довжини. Якщо ``bpchar`` " +"не має специфікатора довжини, він також приймає рядки будь-якої довжини, але " +"кінцеві пробіли є семантично несуттєвими. Якщо ``character`` не має " +"специфікатора, він еквівалентний до ``character(1)``." + +#: ../../src/rdbms/datatypes.txt:197 +msgid "Date/Time types" +msgstr "Типи дати/часу" + +#: ../../src/rdbms/datatypes.txt:199 +msgid "" +"PostgreSQL supports the full set of SQL date and time types. Dates are " +"counted according to the Gregorian calendar, even in years before that " +"calendar was introduced." +msgstr "" +"PostgreSQL підтримує повний набір типів дати і часу SQL. Дати відраховуються " +"за григоріанським календарем, навіть у роки, коли цей календар ще не було " +"запроваджено." + +#: ../../src/rdbms/datatypes.txt:203 +msgid "" +"``time``, ``timestamp``, and ``interval`` accept an optional precision " +"value, which specifies the number of fractional digits retained in the " +"seconds field. By default, there is no explicit bound on precision. The " +"allowed of this value is from 0 to 6." +msgstr "" +"``time``, ``timestamp`` та ``interval`` приймають необов'язкове значення " +"точності, яке визначає кількість дробових знаків, що зберігаються у полі " +"секунд. За замовчуванням, немає явного обмеження на точність. Допустиме " +"значення цього параметра - від 0 до 6." + +#: ../../src/rdbms/datatypes.txt:208 +msgid "" +"The ``interval`` type has an additional option, which is to restrict the of " +"stored fields by writing one of these phrases:" +msgstr "" +"Тип ``інтервал`` має додаткову опцію, яка полягає в обмеженні полів, що " +"зберігаються, шляхом написання однієї з цих фраз:" + +#: ../../src/rdbms/datatypes.txt:228 +msgid "Dates" +msgstr "Дати" + +#: ../../src/rdbms/datatypes.txt:230 +msgid "Some possible inputs for the ``date`` type." +msgstr "Деякі можливі вхідні дані для типу ``date``." + +#: ../../src/rdbms/datatypes.txt:233 ../../src/rdbms/datatypes.txt:274 +#: ../../src/rdbms/datatypes.txt:305 +msgid "Example" +msgstr "Приклад" + +#: ../../src/rdbms/datatypes.txt:235 +msgid "``1999-01-08``" +msgstr "``1999-01-08``" + +#: ../../src/rdbms/datatypes.txt:235 +msgid "ISO 8601; January 8 in any mode (**recommended format**)" +msgstr "ISO 8601; 8 січня в будь-якому режимі (**рекомендований формат**)" + +#: ../../src/rdbms/datatypes.txt:238 +msgid "``January 8, 1999``" +msgstr "``January 8, 1999``" + +#: ../../src/rdbms/datatypes.txt:238 +msgid "unambiguous in any date style input mode" +msgstr "однозначний у будь-якому режимі введення стилю дати" + +#: ../../src/rdbms/datatypes.txt:240 +msgid "``1/8/1999``" +msgstr "``1/8/1999``" + +#: ../../src/rdbms/datatypes.txt:240 +msgid "January 8 in MDY mode; August 1 in DMY mode" +msgstr "8 січня в режимі MDY; 1 серпня в режимі DMY" + +#: ../../src/rdbms/datatypes.txt:242 +msgid "``1/18/1999``" +msgstr "``1/18/1999``" + +#: ../../src/rdbms/datatypes.txt:242 +msgid "January 18 in MDY mode; rejected in other modes" +msgstr "18 січня в режимі MDY; відхилено в інших режимах" + +#: ../../src/rdbms/datatypes.txt:245 +msgid "``01/02/03``" +msgstr "``01/02/03``" + +#: ../../src/rdbms/datatypes.txt:245 +msgid "" +"January 2, 2003 in MDY mode; February 1, 2003 in DMY mode; February 3, 2001 " +"in YMD mode" +msgstr "" +"2 січня 2003 року в режимі MDY; 1 лютого 2003 року в режимі DMY; 3 лютого " +"2001 року в режимі YMD" + +#: ../../src/rdbms/datatypes.txt:249 +msgid "``1999-Jan-08`` ``Jan-08-1999`` ``08-Jan-1999``" +msgstr "``1999-Jan-08`` ``Jan-08-1999`` ``08-Jan-1999``" + +#: ../../src/rdbms/datatypes.txt:249 +msgid "January 8 in any mode" +msgstr "8 січня в будь-якому режимі" + +#: ../../src/rdbms/datatypes.txt:253 +msgid "``99-Jan-08``" +msgstr "``99-Jan-08``" + +#: ../../src/rdbms/datatypes.txt:253 +msgid "January 8 in YMD mode, else error" +msgstr "8 січня в режимі YMD, інакше помилка" + +#: ../../src/rdbms/datatypes.txt:255 +msgid "``08-Jan-99`` ``Jan-08-99``" +msgstr "``08-Jan-99`` ``Jan-08-99``" + +#: ../../src/rdbms/datatypes.txt:255 +msgid "January 8, except error in YMD mode" +msgstr "8 січня, крім помилки в режимі YMD" + +#: ../../src/rdbms/datatypes.txt:258 +msgid "``19990108`` ``990108``" +msgstr "``19990108`` ``990108``" + +#: ../../src/rdbms/datatypes.txt:258 +msgid "ISO 8601; January 8, 1999 in any mode" +msgstr "ISO 8601; 8 січня 1999 року в будь-якому режимі" + +#: ../../src/rdbms/datatypes.txt:261 +msgid "``1999.008``" +msgstr "``1999.008``" + +#: ../../src/rdbms/datatypes.txt:261 +msgid "year and day of year" +msgstr "рік та день року" + +#: ../../src/rdbms/datatypes.txt:263 +msgid "``J2451187``" +msgstr "``J2451187``" + +#: ../../src/rdbms/datatypes.txt:263 +msgid "Julian date" +msgstr "Дата за юліанським календарем" + +#: ../../src/rdbms/datatypes.txt:265 +msgid "``January 8, 99 BC``" +msgstr "``January 8, 99 BC``" + +#: ../../src/rdbms/datatypes.txt:265 +msgid "year 99 BC" +msgstr "99 рік до н.е" + +#: ../../src/rdbms/datatypes.txt:269 +msgid "Times" +msgstr "Час" + +#: ../../src/rdbms/datatypes.txt:271 +msgid "Some possible inputs for the ``time`` type." +msgstr "Деякі можливі вхідні дані для типу ``time``." + +#: ../../src/rdbms/datatypes.txt:276 +msgid "``04:05:06.789`` ``04:05:06`` ``04:05`` ``040506``" +msgstr "``04:05:06.789`` ``04:05:06`` ``04:05`` ``040506``" + +#: ../../src/rdbms/datatypes.txt:276 +msgid "ISO 8601" +msgstr "ISO 8601" + +#: ../../src/rdbms/datatypes.txt:281 +msgid "``04:05 AM``" +msgstr "``04:05 AM``" + +#: ../../src/rdbms/datatypes.txt:281 +msgid "same as 04:05; AM does not affect value" +msgstr "те саме, що і 04:05; AM не впливає на значення" + +#: ../../src/rdbms/datatypes.txt:283 +msgid "``04:05 PM``" +msgstr "``04:05 PM``" + +#: ../../src/rdbms/datatypes.txt:283 +msgid "same as 16:05; input hour must be <= 12" +msgstr "збігається з 16:05; вхідна година повинна бути <= 12" + +#: ../../src/rdbms/datatypes.txt:285 +msgid "``04:05:06.789-8`` ``04:05:06-08:00`` ``04:05-08:00`` ``040506-08``" +msgstr "``04:05:06.789-8`` ``04:05:06-08:00`` ``04:05-08:00`` ``040506-08``" + +#: ../../src/rdbms/datatypes.txt:285 +msgid "ISO 8601, with time zone as UTC offset" +msgstr "ISO 8601, з часовим поясом відносно UTC" + +#: ../../src/rdbms/datatypes.txt:290 +msgid "``040506+0730``" +msgstr "``040506+0730``" + +#: ../../src/rdbms/datatypes.txt:290 +msgid "ISO 8601, with fractional-hour time zone as UTC offset" +msgstr "ISO 8601, з часовим поясом у дробових годинах відносно UTC" + +#: ../../src/rdbms/datatypes.txt:293 +msgid "``040506+07:30:00``" +msgstr "``040506+07:30:00``" + +#: ../../src/rdbms/datatypes.txt:293 +msgid "UTC offset specified to seconds (not allowed in ISO 8601)" +msgstr "Зміщення UTC вказано в секундах (не дозволено в ISO 8601)" + +#: ../../src/rdbms/datatypes.txt:296 +msgid "``04:05:06 PST``" +msgstr "``04:05:06 PST``" + +#: ../../src/rdbms/datatypes.txt:296 +msgid "time zone specified by abbreviation" +msgstr "часовий пояс, вказаний абревіатурою" + +#: ../../src/rdbms/datatypes.txt:298 +msgid "``2003-04-12 04:05:06 America/New_York``" +msgstr "``2003-04-12 04:05:06 America/New_York``" + +#: ../../src/rdbms/datatypes.txt:298 +msgid "time zone specified by full" +msgstr "часовий пояс вказано повністю" + +#: ../../src/rdbms/datatypes.txt:303 +msgid "Time zone input" +msgstr "Введення часового поясу" + +#: ../../src/rdbms/datatypes.txt:307 +msgid "``PST``" +msgstr "``PST``" + +#: ../../src/rdbms/datatypes.txt:307 +msgid "Abbreviation (for Pacific Standard Time)" +msgstr "Скорочення (для Тихоокеанського стандартного часу)" + +#: ../../src/rdbms/datatypes.txt:309 +msgid "``America/New_York``" +msgstr "``America/New_York``" + +#: ../../src/rdbms/datatypes.txt:309 +msgid "Full time zone name" +msgstr "Повна назва часового поясу" + +#: ../../src/rdbms/datatypes.txt:311 +msgid "``PST8PDT``" +msgstr "``PST8PDT``" + +#: ../../src/rdbms/datatypes.txt:311 +msgid "POSIX-style time zone specification" +msgstr "Специфікація часових поясів у стилі POSIX" + +#: ../../src/rdbms/datatypes.txt:313 +msgid "``-8:00:00``" +msgstr "``-8:00:00``" + +#: ../../src/rdbms/datatypes.txt:313 +msgid "UTC offset for PST" +msgstr "Зміщення відносно UTC для PST" + +#: ../../src/rdbms/datatypes.txt:315 +msgid "``-8:00``" +msgstr "``-8:00``" + +#: ../../src/rdbms/datatypes.txt:315 +msgid "UTC offset for PST (ISO 8601 extended format)" +msgstr "Зміщення відносно UTC для PST (розширений формат ISO 8601)" + +#: ../../src/rdbms/datatypes.txt:317 +msgid "``-800``" +msgstr "``-800``" + +#: ../../src/rdbms/datatypes.txt:317 ../../src/rdbms/datatypes.txt:319 +msgid "UTC offset for PST (ISO 8601 basic format)" +msgstr "Зміщення відносно UTC для PST (базовий формат ISO 8601)" + +#: ../../src/rdbms/datatypes.txt:319 +msgid "``-8``" +msgstr "``-8``" + +#: ../../src/rdbms/datatypes.txt:321 +msgid "``zulu``" +msgstr "``zulu``" + +#: ../../src/rdbms/datatypes.txt:321 +msgid "Military abbreviation for UTC" +msgstr "Військове скорочення UTC" + +#: ../../src/rdbms/datatypes.txt:323 +msgid "``z``" +msgstr "``z``" + +#: ../../src/rdbms/datatypes.txt:323 +msgid "Short form of zulu (also in ISO 8601)" +msgstr "Коротка форма зулу (також в ISO 8601)" + +#: ../../src/rdbms/datatypes.txt:327 +msgid "Special date/time inputs" +msgstr "Спеціальне введення дати/часу" + +#: ../../src/rdbms/datatypes.txt:330 +msgid "Input String" +msgstr "Вхідний Рядок" + +#: ../../src/rdbms/datatypes.txt:330 +msgid "Valid Types" +msgstr "Допустимі Типи" + +#: ../../src/rdbms/datatypes.txt:332 +msgid "epoch" +msgstr "epoch" + +#: ../../src/rdbms/datatypes.txt:332 ../../src/rdbms/datatypes.txt:335 +#: ../../src/rdbms/datatypes.txt:345 ../../src/rdbms/datatypes.txt:348 +#: ../../src/rdbms/datatypes.txt:351 +msgid "``date``, ``timestamp``" +msgstr "``date``, ``timestamp``" + +#: ../../src/rdbms/datatypes.txt:332 +msgid "1970-01-01 00:00:00+00 (Unix system time zero)" +msgstr "1970-01-01 00:00:00+00 (нульовий системний час Unix)" + +#: ../../src/rdbms/datatypes.txt:335 +msgid "infinity" +msgstr "infinity" + +#: ../../src/rdbms/datatypes.txt:335 +msgid "later than all other time stamps" +msgstr "пізніше за всі інші часові мітки" + +#: ../../src/rdbms/datatypes.txt:338 +msgid "-infinity" +msgstr "-infinity" + +#: ../../src/rdbms/datatypes.txt:338 +msgid "``date, ``timestamp``" +msgstr "``date, ``timestamp``" + +#: ../../src/rdbms/datatypes.txt:338 +msgid "earlier than all other time stamps" +msgstr "раніше за всі інші мітки часу" + +#: ../../src/rdbms/datatypes.txt:341 +msgid "now" +msgstr "now" + +#: ../../src/rdbms/datatypes.txt:341 +msgid "``date``, ``time``, ``timestamp``" +msgstr "``date``, ``time``, ``timestamp``" + +#: ../../src/rdbms/datatypes.txt:341 +msgid "current transaction's start time" +msgstr "час початку поточної транзакції" + +#: ../../src/rdbms/datatypes.txt:345 +msgid "today" +msgstr "today" + +#: ../../src/rdbms/datatypes.txt:345 +msgid "midnight (00:00) today" +msgstr "опівночі (00:00) сьогодні" + +#: ../../src/rdbms/datatypes.txt:348 +msgid "tomorrow" +msgstr "tomorrow" + +#: ../../src/rdbms/datatypes.txt:348 +msgid "midnight (00:00) tomorrow" +msgstr "опівночі (00:00) завтра" + +#: ../../src/rdbms/datatypes.txt:351 +msgid "yesterday" +msgstr "yesterday" + +#: ../../src/rdbms/datatypes.txt:351 +msgid "midnight (00:00) yesterday" +msgstr "опівночі (00:00) вчора" + +#: ../../src/rdbms/datatypes.txt:354 +msgid "allballs" +msgstr "allballs" + +#: ../../src/rdbms/datatypes.txt:354 +msgid "00:00:00.00 UTC" +msgstr "00:00:00.00 UTC" + +#: ../../src/rdbms/datatypes.txt:358 +msgid "Intervals" +msgstr "Інтервали" + +#: ../../src/rdbms/datatypes.txt:360 +msgid "``interval`` values can be written using the following verbose syntax:" +msgstr "" +"значення ``interval`` можна записати, використовуючи наступний розгорнутий " +"синтаксис:" + +#: ../../src/rdbms/datatypes.txt:366 +msgid "" +"Intervals are useful when you need to move timestamp back in past or to the " +"future." +msgstr "" +"Інтервали корисні, коли вам потрібно перемістити мітку часу в минуле або в " +"майбутнє." + +#: ../../src/rdbms/datatypes.txt:370 +msgid "Abbreviation" +msgstr "Абревіатура" + +#: ../../src/rdbms/datatypes.txt:370 +msgid "Meaning" +msgstr "Значення" + +#: ../../src/rdbms/datatypes.txt:372 +msgid "Y" +msgstr "Y" + +#: ../../src/rdbms/datatypes.txt:372 +msgid "Years" +msgstr "Роки" + +#: ../../src/rdbms/datatypes.txt:374 ../../src/rdbms/datatypes.txt:382 +msgid "M" +msgstr "M" + +#: ../../src/rdbms/datatypes.txt:374 +msgid "Months" +msgstr "Місяці" + +#: ../../src/rdbms/datatypes.txt:376 +msgid "W" +msgstr "W" + +#: ../../src/rdbms/datatypes.txt:376 +msgid "Weeks" +msgstr "Тижні" + +#: ../../src/rdbms/datatypes.txt:378 +msgid "D" +msgstr "D" + +#: ../../src/rdbms/datatypes.txt:378 +msgid "Days" +msgstr "Дні" + +#: ../../src/rdbms/datatypes.txt:380 +msgid "H" +msgstr "H" + +#: ../../src/rdbms/datatypes.txt:380 +msgid "Hours" +msgstr "Години" + +#: ../../src/rdbms/datatypes.txt:382 +msgid "Minutes" +msgstr "Хвилини" + +#: ../../src/rdbms/datatypes.txt:384 +msgid "S" +msgstr "S" + +#: ../../src/rdbms/datatypes.txt:384 +msgid "Seconds" +msgstr "Секунди" + +#: ../../src/rdbms/datatypes.txt:387 +msgid "7 days before yesterday" +msgstr "7 днів перед вчора" + +#: ../../src/rdbms/datatypes.txt:394 +msgid "Boolean type" +msgstr "Логічний тип" + +#: ../../src/rdbms/datatypes.txt:396 +msgid "" +"PostgreSQL provides the standard SQL type ``boolean``. The ``boolean`` type " +"can have several states: **true**, **false**, and a third state, " +"**unknown**, which is represented by the SQL ``NULL`` value." +msgstr "" +"PostgreSQL надає стандартний тип SQL ``boolean``. Тип ``boolean`` може мати " +"декілька станів: **true**, **false** і третій стан, **unknown**, який " +"представляється значенням SQL ``NULL``." + +#: ../../src/rdbms/datatypes.txt:400 +msgid "" +"The datetype input function for type ``boolean`` accepts these strings " +"representations for the **true** state:" +msgstr "" +"Функція введення типу даних для типу ``boolean`` приймає ці представлення " +"рядків для стану **true**:" + +#: ../../src/rdbms/datatypes.txt:403 +msgid "``true``" +msgstr "``true``" + +#: ../../src/rdbms/datatypes.txt:404 +msgid "``yes``" +msgstr "``yes``" + +#: ../../src/rdbms/datatypes.txt:405 +msgid "``on``" +msgstr "``on``" + +#: ../../src/rdbms/datatypes.txt:406 +msgid "``1``" +msgstr "``1``" + +#: ../../src/rdbms/datatypes.txt:408 +msgid "and these representations for the **false** state:" +msgstr "і ці представлення для стану **false**:" + +#: ../../src/rdbms/datatypes.txt:410 +msgid "``false``" +msgstr "``false``" + +#: ../../src/rdbms/datatypes.txt:411 +msgid "``no``" +msgstr "``no``" + +#: ../../src/rdbms/datatypes.txt:412 +msgid "``off``" +msgstr "``off``" + +#: ../../src/rdbms/datatypes.txt:413 +msgid "``0``" +msgstr "``0``" + +#: ../../src/rdbms/datatypes.txt:415 +msgid "" +"The key words ``TRUE`` or ``FALSE`` are preferred (SQL-compliant) method for " +"writing Boolean constants in SQL queries. But, you can also use string " +"representations by following the generic string-literal constant syntax, for " +"example ``'yes'::boolean``." +msgstr "" +"Ключові слова ``TRUE`` або ``FALSE`` є найкращим (SQL-сумісним) методом " +"запису булевих констант у SQL-запитах. Але ви також можете використовувати " +"рядкові представлення, дотримуючись загального синтаксису рядково-літерних " +"констант, наприклад, ``'yes'::boolean``." + +#: ../../src/rdbms/datatypes.txt:421 +msgid "Enumerated types" +msgstr "Перераховані типи" + +#: ../../src/rdbms/datatypes.txt:423 +msgid "" +"Enumerated (enums) types are data types that comprise a static, ordered set " +"of values. They are equivalent to the ``enum`` types supported in a number " +"of programming languages. An example of an enum might be the days of the " +"week, or a set of status values for a piece of data." +msgstr "" +"Перечислювальні типи - це типи даних, які складаються зі статичного, " +"впорядкованого набору значень. Вони еквівалентні типам ``список``, що " +"підтримуються у багатьох мовах програмування. Прикладом перечислення можуть " +"бути дні тижня або набір значень статусу елемента даних." + +#: ../../src/rdbms/datatypes.txt:428 +msgid "" +"Enum types are created using the ``CREATE TYPE`` command; and once created, " +"the enum type can be used in table in function definitions, much like other " +"types:" +msgstr "" +"Типи перечислення створюються за допомогою команди ``CREATE TYPE``; і після " +"створення тип перечислення можна використовувати у таблицях та визначеннях " +"функцій, як і інші типи:" + +#: ../../src/rdbms/datatypes.txt:443 +msgid "Ordering" +msgstr "Упорядкування" + +#: ../../src/rdbms/datatypes.txt:445 +msgid "" +"The ordering of the values in an enum type is the order in which the values " +"were listed when the type was created. All standard comparison operators and " +"related aggregate functions are supported for enums. However, remember that " +"each enumerated data type is separated and cannot be compared with other " +"enumerated types." +msgstr "" +"Порядок значень у типі enum - це порядок, у якому значення були перераховані " +"при створенні типу. Усі стандартні оператори порівняння та пов'язані з ними " +"агрегатні функції підтримуються для перелічуваних типів. Однак пам'ятайте, " +"що кожен перелічуваний тип даних є окремим і не може порівнюватися з іншими " +"перелічуваними типами." diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/ddl.po b/src/_locales/uk/LC_MESSAGES/rdbms/ddl.po new file mode 100644 index 000000000..cc6529918 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/ddl.po @@ -0,0 +1,581 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-22 13:19+0000\n" +"PO-Revision-Date: 2024-02-18 17:39+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/rdbms/ddl.txt:-1 +msgid "Data definition language, DDL" +msgstr "Мова визначення даних, DDL" + +#: ../../src/rdbms/ddl.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/rdbms/ddl.txt:-1 +msgid "sql, db, database, ddl, create, alter, drop" +msgstr "sql, db, database, ddl, create, alter, drop" + +#: ../../src/rdbms/ddl.txt:8 +msgid "Data Definition Language" +msgstr "Мова Визначення Даних" + +#: ../../src/rdbms/ddl.txt:10 +msgid "" +":abbr:`DDL (Data Definition Language)` is a subset of SQL used for defining " +"and modifying the database structure. Understanding DDL is fundamental to " +"working with RDBMS. It allows you to define the structure of your data and " +"make necessary changes as your requirements evolve." +msgstr "" +":abbr:`DDL (Data Definition Language)` - це підмножина мови SQL, яка " +"використовується для визначення та модифікації структури бази даних. " +"Розуміння DDL є фундаментальним для роботи з СКБД. Це дозволяє вам визначати " +"структуру ваших даних і вносити необхідні зміни в міру розвитку ваших вимог." + +#: ../../src/rdbms/ddl.txt:15 +msgid "``CREATE`` used to create new objects within a RDBMS" +msgstr "``CREATE`` використовується для створення нових об'єктів у СКБД" + +#: ../../src/rdbms/ddl.txt:16 +msgid "``ALTER`` used to modify existing objects" +msgstr "``ALTER`` використовується для зміни існуючих об'єктів" + +#: ../../src/rdbms/ddl.txt:17 +msgid "``DROP`` used to delete database objects" +msgstr "``DROP`` використовується для видалення об'єктів бази даних" + +#: ../../src/rdbms/ddl.txt:18 +msgid "``TRUNCATE`` used to remove all records from a table" +msgstr "``TRUNCATE`` використовується для видалення всіх записів з таблиці" + +#: ../../src/rdbms/ddl.txt:25 +msgid "Create objects" +msgstr "Створення об'єктів" + +#: ../../src/rdbms/ddl.txt:28 +msgid "Creating database roles" +msgstr "Створення ролей бази даних" + +#: ../../src/rdbms/ddl.txt:32 +msgid "" +"SQLite is a small database in a single file and it doesn't implement role " +"based access to data. Any user who have access to DB file will have access " +"to data within the database as well." +msgstr "" +"SQLite - це невелика база даних в одному файлі, і вона не реалізує рольовий " +"доступ до даних. Будь-який користувач, який має доступ до файлу бази даних, " +"також має доступ до даних всередині бази даних." + +#: ../../src/rdbms/ddl.txt:36 +msgid "" +"In RDBMS, roles are used to manage database permissions. They are an " +"essential part of database security and user management." +msgstr "" +"У СКБД ролі використовуються для керування правами доступу до бази даних. " +"Вони є невід'ємною частиною безпеки бази даних та управління користувачами." + +#: ../../src/rdbms/ddl.txt:39 +msgid "" +"In PostgreSQL a **role** is an entity that can own database objects and have " +"database privileges; a role can be considered a *user*, a *group*, or both " +"depending on how it is used." +msgstr "" +"У PostgreSQL **роль** - це сутність, яка може володіти об'єктами бази даних " +"і мати привілеї до бази даних; роль може розглядатися як *користувач*, " +"*група* або і те, і інше, залежно від того, як вона використовується." + +#: ../../src/rdbms/ddl.txt:43 +msgid "``CREATE ROLE`` statement defines a new database role." +msgstr "Оператор ``CREATE ROLE`` визначає нову роль бази даних." + +#: ../../src/rdbms/ddl.txt:49 +msgid "This statement also can have options:" +msgstr "Це твердження також може мати варіанти:" + +#: ../../src/rdbms/ddl.txt:55 +msgid "" +"Options clarify if a role can login to the database server, connect to " +"specific databases, create other roles etc. The full list of options is " +"available in the official postgres documentation." +msgstr "" +"Опції пояснюють, чи може роль входити на сервер бази даних, підключатися до " +"певних баз даних, створювати інші ролі тощо. Повний список опцій доступний в " +"офіційній документації postgres." + +#: ../../src/rdbms/ddl.txt:60 +msgid "Creating databases" +msgstr "Створення баз даних" + +#: ../../src/rdbms/ddl.txt:62 +msgid "" +"``CREATE DATABASE`` statement creates a new PostgreSQL database. To create a " +"database, you must be a superuser or have ``CREATEDB`` privilege." +msgstr "" +"Оператор ``CREATE DATABASE`` створює нову базу даних PostgreSQL. Для " +"створення бази даних ви повинні бути супер-користувачем або мати привілей " +"``CREATEDB``." + +#: ../../src/rdbms/ddl.txt:69 +msgid "" +"Databases within a PostgreSQL server have owners. By default a user who " +"creates a database is assigned as its owner. To specify another user as a " +"database owner options may be used:" +msgstr "" +"Бази даних на сервері PostgreSQL мають власників. За замовчуванням власником " +"бази даних призначається користувач, який її створив. Щоб вказати іншого " +"користувача як власника бази даних, можна скористатися опціями:" + +#: ../../src/rdbms/ddl.txt:77 +msgid "" +"There are lots of options for this statement available in the official " +"postgres documentation." +msgstr "" +"В офіційній документації postgres є багато варіантів цього твердження, " +"доступних в офіційній документації postgres." + +#: ../../src/rdbms/ddl.txt:81 +msgid "Creating tables" +msgstr "Створення таблиць" + +#: ../../src/rdbms/ddl.txt:83 +msgid "" +"To create a table, you use the aptly names ``CREATE TABLE`` command. In this " +"command you specify at least a name for the new table, the names of the " +"columns and the data type of each column." +msgstr "" +"Для створення таблиці використовується команда ``CREATE TABLE``, яка має " +"влучну назву. У цій команді ви вказуєте принаймні назву нової таблиці, назви " +"стовпців і тип даних для кожного стовпця." + +#: ../../src/rdbms/ddl.txt:98 +msgid "Default value" +msgstr "Значення за замовчуванням" + +#: ../../src/rdbms/ddl.txt:99 +msgid "" +"Constraints also can be applied for columns while creating a table. In this " +"section, only most notable constraints will be described." +msgstr "" +"Обмеження також можуть бути застосовані до стовпців під час створення " +"таблиці. У цьому розділі буде описано лише найпоширеніші обмеження." + +#: ../../src/rdbms/ddl.txt:102 +msgid "" +"A column can be assigned a default value. When a new row is created and no " +"values are specified for some of the columns, those columns will be filled " +"with their respective default values. If no default value is declared " +"explicitly, the default value is the ``NULL`` value. This usually makes " +"sense because a null value can be considered to represent unknown data." +msgstr "" +"Стовпчику можна призначити значення за замовчуванням. Коли створюється новий " +"рядок і для деяких стовпців не вказано жодних значень, ці стовпці буде " +"заповнено відповідними значеннями за замовчуванням. Якщо значення за " +"замовчуванням не вказано явно, значенням за замовчуванням буде значення " +"``NULL``. Зазвичай це має сенс, оскільки нульове значення можна вважати " +"таким, що представляє невідомі дані." + +#: ../../src/rdbms/ddl.txt:108 +msgid "" +"In a table definition the default values are listed after the data type." +msgstr "" +"У визначенні таблиці значення за замовчуванням перераховані після типу даних." + +#: ../../src/rdbms/ddl.txt:119 +msgid "" +"The default value can be an expression, which will be evaluated whenever the " +"default value is inserted (**not when the table is created**). A common " +"example are timestamps columns representing the time a record was created " +"and a \"serial number\" generator." +msgstr "" +"Значення за замовчуванням може бути виразом, який буде обчислюватися щоразу, " +"коли вставляється значення за замовчуванням (**не під час створення " +"таблиці**). Типовим прикладом є стовпці з позначками часу, що відображають " +"час створення запису, та генератор \"серійних номерів\"." + +#: ../../src/rdbms/ddl.txt:132 +msgid "There is a shorthand to generate serial numbers:" +msgstr "Існує скорочення для генерації серійних номерів:" + +#: ../../src/rdbms/ddl.txt:139 +msgid "Generated Columns" +msgstr "Згенеровані стовпці" + +#: ../../src/rdbms/ddl.txt:140 +msgid "" +"In case you need to calculate some column value based on other columns, you " +"may use generated columns. A generated column is a special column that is " +"always computed from other columns. Thus, it is for columns what a view is " +"for tables. There are two kinds of generated columns: stored and virtual." +msgstr "" +"Якщо вам потрібно обчислити значення якогось стовпця на основі інших " +"стовпців, ви можете використовувати згенеровані стовпці. Згенерований " +"стовпець - це спеціальний стовпець, який завжди обчислюється на основі інших " +"стовпців. Таким чином, для стовпців це те саме, що подання для таблиць. " +"Існує два типи згенерованих стовпців: збережені та віртуальні." + +#: ../../src/rdbms/ddl.txt:145 +msgid "" +"A stored generated column is computed when it is written (inserted or " +"updated) and occupies storage as if it were a normal column. A virtual " +"generated column occupies no storage and is computed when it is read." +msgstr "" +"Збережений згенерований стовпець обчислюється, коли він записується " +"(вставляється або оновлюється) і займає пам'ять, як звичайний стовпець. " +"Віртуальний згенерований стовпець не займає місця в пам'яті і обчислюється " +"під час читання." + +#: ../../src/rdbms/ddl.txt:159 +msgid "" +"There are several restrictions applied to the definitions of generated " +"columns and tables involving generated columns (not all listed):" +msgstr "" +"Існує кілька обмежень, що застосовуються до визначень згенерованих стовпців " +"і таблиць, що містять згенеровані стовпці (не всі з них перераховані):" + +#: ../../src/rdbms/ddl.txt:162 +msgid "" +"The generation expression can only use immutable functions and cannot use " +"sub-queries or reference anything other than the current row." +msgstr "" +"Вираз генерації може використовувати лише незмінні функції і не може " +"використовувати підзапити або посилатися на щось, крім поточного рядка." + +#: ../../src/rdbms/ddl.txt:164 +msgid "The generation expression cannot reference another generated column." +msgstr "Вираз генерації не може посилатися на інший згенерований стовпець." + +#: ../../src/rdbms/ddl.txt:165 +msgid "A generated column cannot have column default." +msgstr "Створений стовпець не може мати стовпець за замовчуванням." + +#: ../../src/rdbms/ddl.txt:168 +msgid "Constraints" +msgstr "Обмеження" + +#: ../../src/rdbms/ddl.txt:169 +msgid "" +"A check constraint is the most generic constraint type. It allows you to " +"specify that the value in a certain column must satisfy a Boolean (truth-" +"value) expression." +msgstr "" +"Обмеження перевірки є найбільш загальним типом обмежень. Воно дозволяє " +"вказати, що значення в певному стовпчику має задовольняти булевому (істинно-" +"неістинному) виразу." + +#: ../../src/rdbms/ddl.txt:184 +msgid "" +"A not-null constraint simply specifies that a column must not assume the " +"null value." +msgstr "" +"Обмеження не-нуль просто вказує, що стовпець не повинен приймати нульове " +"значення." + +#: ../../src/rdbms/ddl.txt:195 +msgid "" +"Unique constraints ensure that the data contained in a column, or a group of " +"columns, is unique among all the rows in the table." +msgstr "" +"Унікальні обмеження гарантують, що дані, які містяться у стовпчику або групі " +"стовпчиків, є унікальними серед усіх рядків таблиці." + +#: ../../src/rdbms/ddl.txt:209 +msgid "System columns" +msgstr "Системні колонки" + +#: ../../src/rdbms/ddl.txt:210 +msgid "" +"Every table has several system columns that are implicitly defined by the " +"system. Therefore, these names cannot be used as names of user-defined " +"columns. These columns cannot be used in the generated columns (except " +"``tableoid``). Columns are:" +msgstr "" +"Кожна таблиця має декілька системних стовпців, які неявно визначені " +"системою. Тому ці назви не можуть бути використані як назви стовпців, " +"визначених користувачем. Ці стовпці не можуть бути використані у створених " +"стовпцях (крім ``tableoid``). Стовпці можна:" + +#: ../../src/rdbms/ddl.txt:215 +msgid "``tableoid``" +msgstr "``tableoid``" + +#: ../../src/rdbms/ddl.txt:216 +msgid "``xmin``" +msgstr "``xmin``" + +#: ../../src/rdbms/ddl.txt:217 +msgid "``cmin``" +msgstr "``cmin``" + +#: ../../src/rdbms/ddl.txt:218 +msgid "``xmax``" +msgstr "``xmax``" + +#: ../../src/rdbms/ddl.txt:219 +msgid "``cmax``" +msgstr "``cmax``" + +#: ../../src/rdbms/ddl.txt:220 +msgid "``ctid``" +msgstr "``ctid``" + +#: ../../src/rdbms/ddl.txt:223 +msgid "Modify objects" +msgstr "Модифікація об'єктів" + +#: ../../src/rdbms/ddl.txt:225 +msgid "" +"When you create a table and you realize that you made a mistake, or the " +"requirements of the application change, you can drop the table and create it " +"again. But this is not a convenient option if the table is already filled " +"with data, or if the table is referenced by other database objects." +msgstr "" +"Коли ви створюєте таблицю і розумієте, що зробили помилку, або вимоги " +"програми змінюються, ви можете видалити таблицю і створити її заново. Але це " +"не дуже зручний варіант, якщо таблиця вже заповнена даними або якщо на неї " +"посилаються інші об'єкти бази даних." + +#: ../../src/rdbms/ddl.txt:230 +msgid "" +"PostgreSQL provides a family of commands to make modifications to existing " +"tables. You can:" +msgstr "" +"PostgreSQL надає сімейство команд для внесення змін до існуючих таблиць. Ви " +"можете це робити:" + +#: ../../src/rdbms/ddl.txt:233 +msgid "add columns" +msgstr "додати стовпці" + +#: ../../src/rdbms/ddl.txt:234 +msgid "remove columns" +msgstr "видалити стовпці" + +#: ../../src/rdbms/ddl.txt:235 +msgid "add constraints" +msgstr "додати обмеження" + +#: ../../src/rdbms/ddl.txt:236 +msgid "remove constraints" +msgstr "зняти обмеження" + +#: ../../src/rdbms/ddl.txt:237 +msgid "change default values" +msgstr "змінити значення за замовчуванням" + +#: ../../src/rdbms/ddl.txt:238 +msgid "change column data types" +msgstr "змінити типи даних стовпців" + +#: ../../src/rdbms/ddl.txt:239 +msgid "rename columns" +msgstr "перейменувати стовпці" + +#: ../../src/rdbms/ddl.txt:240 +msgid "rename tables" +msgstr "перейменовувати таблиці" + +#: ../../src/rdbms/ddl.txt:242 +msgid "All these actions are performed using the ``ALTER TABLE`` command." +msgstr "Всі ці дії виконуються за допомогою команди ``ALTER TABLE``." + +#: ../../src/rdbms/ddl.txt:245 +msgid "Adding a column" +msgstr "Додавання стовпця" + +#: ../../src/rdbms/ddl.txt:247 +msgid "To add a column, use a command like:" +msgstr "Щоб додати стовпець, використовуйте команду накшатл:" + +#: ../../src/rdbms/ddl.txt:259 +msgid "" +"Constraints can be also defined on the column at the same time, using " +"general syntax." +msgstr "" +"Обмеження можуть бути визначені для стовпця одночасно, використовуючи " +"загальний синтаксис." + +#: ../../src/rdbms/ddl.txt:262 +msgid "" +"In fact all the options that can be applied to a column description in " +"``CREATE TABLE`` can be used here. Keep in mind however that the default " +"value must satisfy the given constraints, or the ``ADD`` will fail." +msgstr "" +"Фактично, тут можна використовувати всі опції, які можна застосувати до " +"опису стовпця у ``CREATE TABLE``. Однак майте на увазі, що значення за " +"замовчуванням має задовольняти заданим обмеженням, інакше команда ``ADD`` не " +"спрацює." + +#: ../../src/rdbms/ddl.txt:267 +msgid "Adding a constraint" +msgstr "Додавання обмеження" + +#: ../../src/rdbms/ddl.txt:269 +msgid "To add a constraint, the table constraint syntax is used." +msgstr "Для додавання обмеження використовується синтаксис обмеження таблиці." + +#: ../../src/rdbms/ddl.txt:276 +msgid "Other examples:" +msgstr "Інші приклади:" + +#: ../../src/rdbms/ddl.txt:286 +msgid "" +"To add a non-null constraint, which cannot be written as a table constraint, " +"use this syntax:" +msgstr "" +"Щоб додати ненульове обмеження, яке не можна записати як обмеження таблиці, " +"використовуйте цей синтаксис:" + +#: ../../src/rdbms/ddl.txt:295 +msgid "Changing a column's default value" +msgstr "Зміна значення стовпця за замовчуванням" + +#: ../../src/rdbms/ddl.txt:297 +msgid "To set a new default for a column, use command like this:" +msgstr "" +"Щоб встановити нове значення за замовчуванням для стовпця, скористайтеся " +"такою командою:" + +#: ../../src/rdbms/ddl.txt:304 +msgid "To remove any default value, use:" +msgstr "Щоб видалити будь-яке значення за замовчуванням, використовуйте:" + +#: ../../src/rdbms/ddl.txt:311 +msgid "This is effectively the same as settings the default to ``NULL``." +msgstr "Це фактично те саме, що встановити значення за замовчуванням ``NULL``." + +#: ../../src/rdbms/ddl.txt:314 +msgid "Changing a column's data type" +msgstr "Зміна типу даних стовпця" + +#: ../../src/rdbms/ddl.txt:316 +msgid "To convert a column to a different data type, use a command like this:" +msgstr "" +"Щоб перетворити стовпець в інший тип даних, скористайтеся такою командою:" + +#: ../../src/rdbms/ddl.txt:323 +msgid "" +"This will succeed only if each existing entry in the column can be converted " +"to the new type by an implicit cast. If a more complex conversion is needed, " +"you can add a ``USING`` clause that specifies how to compute the new values " +"from old ones." +msgstr "" +"Це вдасться лише у тому випадку, якщо кожен існуючий запис у стовпчику може " +"бути перетворено до нового типу неявним приведенням. Якщо потрібне більш " +"складне перетворення, ви можете додати речення ``ВИКОРИСТАННЯ``, яке вказує, " +"як обчислювати нові значення зі старих." + +#: ../../src/rdbms/ddl.txt:328 +msgid "" +"PostgreSQL will attempt to convert the column's default value (if any) to " +"the new type, as well as any constraint that involve the column. But these " +"conversions might fail, or might produce surprising results. It's often best " +"to drop any constraints on the column before altering its type, and then add " +"back suitably modified constraints afterwards." +msgstr "" +"PostgreSQL спробує перетворити значення стовпця за замовчуванням (якщо таке " +"є) до нового типу, а також будь-які обмеження, пов'язані зі стовпцем. Але ці " +"перетворення можуть виявитися невдалими або призвести до несподіваних " +"результатів. Часто краще зняти будь-які обмеження зі стовпця перед зміною " +"його типу, а потім додати назад відповідним чином змінені обмеження." + +#: ../../src/rdbms/ddl.txt:335 +msgid "Renaming objects" +msgstr "Перейменування об'єктів" + +#: ../../src/rdbms/ddl.txt:337 +msgid "To rename objects use ``RENAME`` command, like this:" +msgstr "" +"Для перейменування об'єктів використовуйте команду ``RENAME``, наприклад, " +"так:" + +#: ../../src/rdbms/ddl.txt:346 +msgid "To rename a table:" +msgstr "Перейменувати таблицю:" + +#: ../../src/rdbms/ddl.txt:354 +msgid "Remove objects" +msgstr "Видалення об'єктів" + +#: ../../src/rdbms/ddl.txt:357 +msgid "Removing tables" +msgstr "Видалення столів" + +#: ../../src/rdbms/ddl.txt:359 +msgid "``DROP`` command is used to remove objects." +msgstr "Команда ``DROP`` використовується для видалення об'єктів." + +#: ../../src/rdbms/ddl.txt:365 +msgid "" +"Remember, attempting to remove a table that does not exist is an error. " +"Nevertheless, it is common in SQL script files to unconditionally try to " +"drop each table before creating it, ignoring any error message, so that the " +"script works whether or not the table exists. ``IF EXISTS`` variant can be " +"used to avoid the error message, but this is not standard SQL." +msgstr "" +"Пам'ятайте, що спроба видалити неіснуючу таблицю є помилкою. Тим не менш, у " +"файлах скриптів SQL часто зустрічається безумовна спроба видалити кожну " +"таблицю перед її створенням, ігноруючи будь-які повідомлення про помилки, " +"щоб скрипт працював незалежно від того, чи існує таблиця чи ні. варіант " +"``ЯКЩО ІСНУЄ`` можна використовувати для уникнення повідомлення про помилку, " +"але це не є стандартним для SQL." + +#: ../../src/rdbms/ddl.txt:375 +msgid "" +"In case there are other objects referencing the object to drop ``CASCADE`` " +"may be used to also remove any referencing objects." +msgstr "" +"Якщо є інші об'єкти, що посилаються на об'єкт, який потрібно вилучити, " +"``CASCADE`` може бути використано для вилучення всіх об'єктів, що " +"посилаються на об'єкт, який потрібно вилучити." + +#: ../../src/rdbms/ddl.txt:379 +msgid "Removing a column" +msgstr "Видалення стовпця" + +#: ../../src/rdbms/ddl.txt:381 +msgid "To remove a column, use ``DROP`` command like this:" +msgstr "Щоб видалити стовпець, використовуйте команду ``DROP`` ось так:" + +#: ../../src/rdbms/ddl.txt:388 +msgid "" +"Whatever data was in the column disappears. Table constraints involving the " +"column are dropped, too. However, if the column is referenced by a foreign " +"key constraint of another table, PostgreSQL will not silently drop that " +"constraint. You can authorize dropping everything that depends on the column " +"by adding ``CASCADE``:" +msgstr "" +"Усі дані, що були у стовпчику, зникають. Обмеження таблиці, що стосуються " +"стовпця, також зникають. Однак, якщо на стовпець посилається обмеження " +"зовнішнього ключа іншої таблиці, PostgreSQL не буде мовчки вилучати це " +"обмеження. Ви можете дозволити вилучення всього, що залежить від стовпця, " +"додавши ``CASCADE``:" + +#: ../../src/rdbms/ddl.txt:400 +msgid "Removing a constraint" +msgstr "Зняття обмеження" + +#: ../../src/rdbms/ddl.txt:402 +msgid "" +"To remove a constraint you need to know its name. The **psql** command ``\\d " +"table_name`` can be helpful to get the detailed information on a specific " +"table, including all constraints' names assigned to it." +msgstr "" +"Щоб видалити обмеження, вам потрібно знати його ім'я. Команда **psql** ``\\d " +"table_name`` може бути корисною для отримання детальної інформації про " +"конкретну таблицю, включно з іменами всіх обмежень, призначених для неї." diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/dml.po b/src/_locales/uk/LC_MESSAGES/rdbms/dml.po new file mode 100644 index 000000000..5f67e064d --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/dml.po @@ -0,0 +1,243 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-16 13:55+0000\n" +"PO-Revision-Date: 2024-02-18 17:33+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/rdbms/dml.txt:-1 +msgid "Data manipulation language, DML" +msgstr "Мова маніпулювання даними, DML" + +#: ../../src/rdbms/dml.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/rdbms/dml.txt:-1 +msgid "sql, db, database, dml, insert, update, delete" +msgstr "sql, db, database, dml, insert, update, delete" + +#: ../../src/rdbms/dml.txt:8 +msgid "Data Manipulation Language" +msgstr "Мова Маніпулювання Даними" + +#: ../../src/rdbms/dml.txt:10 +msgid "" +":abbr:`DML (Data Manipulation Language)` is a subset of SQL used for adding, " +"updating, and deleting data within database tables." +msgstr "" +":abbr:`DML (Data Manipulation Language)` - це підмножина мови SQL, яка " +"використовується для додавання, оновлення та видалення даних у таблицях бази " +"даних." + +#: ../../src/rdbms/dml.txt:13 +msgid "``SELECT`` used to query data from the database" +msgstr "``SELECT`` використовується для запиту даних з бази даних" + +#: ../../src/rdbms/dml.txt:14 +msgid "``INSERT`` used to insert new data into a table" +msgstr "``INSERT`` використовується для вставки нових даних у таблицю" + +#: ../../src/rdbms/dml.txt:15 +msgid "``UPDATE`` used to modify existing data" +msgstr "''UPDATE'' використовується для зміни існуючих даних" + +#: ../../src/rdbms/dml.txt:16 +msgid "``DELETE`` used to remove data from a table" +msgstr "``DELETE`` використовується для видалення даних з таблиці" + +#: ../../src/rdbms/dml.txt:23 +msgid "Creating new records" +msgstr "Створення нових записів" + +#: ../../src/rdbms/dml.txt:25 +msgid "" +"When a table is created, it contains no data. Inserting data will populate a " +"table with values. Data is inserted one row at a time. You can also insert " +"multiple rows with a single command. But it impossible to insert something " +"that is not a complete row." +msgstr "" +"Коли таблицю створено, вона не містить даних. Вставлення даних заповнить " +"таблицю значеннями. Дані вставляються по одному рядку за раз. Ви також " +"можете вставити кілька рядків за допомогою однієї команди. Але неможливо " +"вставити щось, що не є повним рядком." + +#: ../../src/rdbms/dml.txt:30 +msgid "To create a new row use ``INSERT`` command." +msgstr "Для створення нового рядка використовується команда ``INSERT``." + +#: ../../src/rdbms/dml.txt:32 +msgid "" +"The data values are listed in the order in which the columns appear in the " +"table, separated by commas. This syntax has the drawback that you need to " +"know the order of the columns in the table. To avoid this you can also list " +"the columns explicitly. If you don't have values for all the columns, you " +"can omit some of them. In that case, the columns will be filled with their " +"default values." +msgstr "" +"Значення даних перераховані в порядку, в якому стовпці з'являються в " +"таблиці, розділені комами. Цей синтаксис має той недолік, що вам потрібно " +"знати порядок стовпців у таблиці. Щоб уникнути цього, ви також можете " +"перерахувати стовпці явно. Якщо ви не маєте значень для всіх стовпців, ви " +"можете опустити деякі з них. У цьому випадку стовпці будуть заповнені " +"значеннями за замовчуванням." + +#: ../../src/rdbms/dml.txt:39 +msgid "Create publisher table" +msgstr "Створення таблиці видавців" + +#: ../../src/rdbms/dml.txt:45 +msgid "Insert data to publisher table" +msgstr "Вставка даних до таблиці видавця" + +#: ../../src/rdbms/dml.txt:51 +msgid "You can insert multiple rows in a single command." +msgstr "Ви можете вставити кілька рядків однією командою." + +#: ../../src/rdbms/dml.txt:53 +msgid "Create author table" +msgstr "Створення таблиці авторів" + +#: ../../src/rdbms/dml.txt:59 +msgid "Inserting multiple values at a time" +msgstr "Додавання декількох значень одночасно" + +#: ../../src/rdbms/dml.txt:66 +msgid "" +"There is a reference to the \"publisher\" table present below. Think of it " +"like placing the publisher information directly into \"book\" table for now." +msgstr "" +"Нижче є посилання на таблицю \"видавництво\". Подумайте про це, як про " +"розміщення інформації про видавця безпосередньо в таблиці \"книга\"." + +#: ../../src/rdbms/dml.txt:69 +msgid "Create book table" +msgstr "Створити таблицю книг" + +#: ../../src/rdbms/dml.txt:75 +msgid "Inserting records from file" +msgstr "Вставка записів з файлу" + +#: ../../src/rdbms/dml.txt:82 +msgid "Modifying records" +msgstr "Змінення записів" + +#: ../../src/rdbms/dml.txt:84 +msgid "" +"The modification of data that is already in the database is referred as " +"updating. To update the existing rows, use the ``UPDATE`` command. This " +"requires three pieces of information:" +msgstr "" +"Зміна даних, які вже є в базі даних, називається оновленням. Щоб оновити " +"існуючі рядки, скористайтеся командою ``UPDATE``. Для цього потрібні три " +"частини інформації:" + +#: ../../src/rdbms/dml.txt:88 +msgid "The name of the table and column(s) to update" +msgstr "Назва таблиці та стовпця(ів) для оновлення" + +#: ../../src/rdbms/dml.txt:89 +msgid "The new value of the column(s)" +msgstr "Нове значення стовпця(ів)" + +#: ../../src/rdbms/dml.txt:90 +msgid "Which row(s) to update" +msgstr "Який(і) рядок(и) оновити" + +#: ../../src/rdbms/dml.txt:96 +msgid "" +"This might cause zero, one, or many rows to be updated. The update syntax is " +"pretty straightforward. First the key word ``UPDATE`` followed by the table " +"name. Next is the key word ``SET`` followed by the column name, an equal " +"sign, and the new column value. The new column value can be any scalar " +"expression, not just a constant. More than one column can be updated at a " +"time by listing more than one assignment in the ``SET`` clause." +msgstr "" +"Це може призвести до оновлення нульового, одного або багатьох рядків. " +"Синтаксис оновлення досить простий. Спочатку ключове слово ``UPDATE``, за " +"яким слідує назва таблиці. Далі йде ключове слово ``SET``, за яким слідує " +"назва стовпця, знак рівності і нове значення стовпця. Нове значення стовпця " +"може бути будь-яким скалярним виразом, а не лише константою. Більш ніж один " +"стовпчик можна оновити за один раз, вказавши більше ніж одне присвоєння у " +"реченні ``SET``." + +#: ../../src/rdbms/dml.txt:105 +msgid "" +"``WHERE`` clause is optional, but it limits the rows affected by ``UPDATE`` " +"command. If there is no limitations all the records within a table will be " +"updated with new values." +msgstr "" +"``WHERE`` є необов'язковим, але воно обмежує рядки, на які впливає команда " +"``UPDATE``. Якщо обмежень не вказано, то всі записи в таблиці буде оновлено " +"новими значеннями." + +#: ../../src/rdbms/dml.txt:114 +msgid "Removing data" +msgstr "Видалення даних" + +#: ../../src/rdbms/dml.txt:116 +msgid "" +"So far we have explained how to add data to tables and how to change data. " +"What remains to discuss how to remove data that is no longer needed. Just as " +"adding data is only possible in whole rows, you can only remove entire rows " +"from a table." +msgstr "" +"Досі ми пояснювали, як додавати дані до таблиць і як їх змінювати. " +"Залишилося обговорити, як видалити дані, які більше не потрібні. Так само, " +"як додавання даних можливе лише цілими рядками, ви можете видаляти дані з " +"таблиці лише цілими рядками." + +#: ../../src/rdbms/dml.txt:121 +msgid "" +"You use ``DELETE`` command to remove rows; the syntax is very similar to the " +"``UPDATE`` command." +msgstr "" +"Для видалення рядків використовується команда ``DELETE``, синтаксис якої " +"дуже схожий на команду ``UPDATE``." + +#: ../../src/rdbms/dml.txt:128 +msgid "If you simply write:" +msgstr "Якщо просто писати:" + +#: ../../src/rdbms/dml.txt:134 +msgid "then all rows in the table will be deleted!" +msgstr "то всі рядки в таблиці будуть видалені!" + +#: ../../src/rdbms/dml.txt:137 +msgid "Returning data from modified rows" +msgstr "Повернення даних зі змінених рядків" + +#: ../../src/rdbms/dml.txt:139 +msgid "" +"Sometimes it is useful to obtain data from modified rows while they are " +"being manipulated. The ``INSERT``, ``UPDATE`` and ``DELETE`` commands all " +"have an optional ``RETURNING`` clause that supports this. Use of " +"``RETURNING`` avoids performing an extra database query to collect the data, " +"and is especially valuable when it would otherwise be difficult to identify " +"the modified rows reliably." +msgstr "" +"Іноді буває корисно отримати дані зі змінених рядків під час маніпуляцій з " +"ними. Команди ``INSERT``, ``UPDATE`` і ``DELETE`` мають необов'язковий " +"параметр ``RETURNING``, який підтримує цю можливість. Використання " +"``RETURNING`` дозволяє уникнути виконання додаткового запиту до бази даних " +"для збору даних і є особливо цінним, коли інакше було б важко достовірно " +"ідентифікувати змінені рядки." + +#: ../../src/rdbms/dml.txt:155 +msgid "For example the query above provides the identifiers to new rows." +msgstr "Наприклад, наведений вище запит надає ідентифікатори для нових рядків." diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/functions.po b/src/_locales/uk/LC_MESSAGES/rdbms/functions.po new file mode 100644 index 000000000..500699963 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/functions.po @@ -0,0 +1,1091 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2024.03.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-16 13:55+0000\n" +"PO-Revision-Date: 2024-03-05 16:23+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk_UA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/rdbms/functions.txt:3 +msgid "Functions and operators" +msgstr "Функції та оператори" + +#: ../../src/rdbms/functions.txt:6 +msgid "Logical and comparison operators" +msgstr "Логічні оператори та оператори порівняння" + +#: ../../src/rdbms/functions.txt:8 +msgid "The usual logical operators are still available:" +msgstr "Звичні логічні оператори все ще доступні:" + +#: ../../src/rdbms/functions.txt:16 +msgid "" +"SQL uses a three-valued logic system with ``true``, ``false``, and ``null``, " +"which represents *unknown*." +msgstr "" +"SQL використовує тризначну логічну систему з ``істиною``, ``хибністю`` і " +"``нулем``, який представляє собою *невідоме*." + +#: ../../src/rdbms/functions.txt:19 +msgid "Truth table" +msgstr "Таблиця істини" + +#: ../../src/rdbms/functions.txt:22 +msgid "``a``" +msgstr "``a``" + +#: ../../src/rdbms/functions.txt:22 +msgid "``b``" +msgstr "``b``" + +#: ../../src/rdbms/functions.txt:22 +msgid "``a AND b``" +msgstr "``a AND b``" + +#: ../../src/rdbms/functions.txt:22 +msgid "``a OR b``" +msgstr "``a OR b``" + +#: ../../src/rdbms/functions.txt:22 +msgid "``NOT a``" +msgstr "``NOT a``" + +#: ../../src/rdbms/functions.txt:24 ../../src/rdbms/functions.txt:26 +#: ../../src/rdbms/functions.txt:28 ../../src/rdbms/functions.txt:30 +#: ../../src/rdbms/functions.txt:32 +msgid "``TRUE``" +msgstr "``TRUE``" + +#: ../../src/rdbms/functions.txt:24 ../../src/rdbms/functions.txt:26 +#: ../../src/rdbms/functions.txt:28 ../../src/rdbms/functions.txt:30 +#: ../../src/rdbms/functions.txt:32 +msgid "``FALSE``" +msgstr "``FALSE``" + +#: ../../src/rdbms/functions.txt:28 ../../src/rdbms/functions.txt:32 +#: ../../src/rdbms/functions.txt:34 +msgid "``NULL``" +msgstr "``NULL``" + +#: ../../src/rdbms/functions.txt:37 +msgid "" +"The operators ``AND`` and ``OR`` are commutative, that is, you can switch " +"the left and right operands without affecting the result. However, it is not " +"guaranteed that the left operand is evaluated before the right operand." +msgstr "" +"Оператори ``AND`` і ``OR`` є комутативними, тобто ви можете міняти місцями " +"лівий і правий операнди без впливу на результат. Однак не гарантується, що " +"лівий операнд буде обчислено раніше правого." + +#: ../../src/rdbms/functions.txt:42 +msgid "Comparison operators" +msgstr "Оператори порівняння" + +#: ../../src/rdbms/functions.txt:44 +msgid "The usual comparison operators are available." +msgstr "Доступні звичайні оператори порівняння." + +#: ../../src/rdbms/functions.txt:47 +msgid "Operator" +msgstr "Оператор" + +#: ../../src/rdbms/functions.txt:47 ../../src/rdbms/functions.txt:70 +msgid "Description" +msgstr "Опис" + +#: ../../src/rdbms/functions.txt:49 +msgid "``datatype < datatype -> boolean``" +msgstr "``datatype < datatype -> boolean``" + +#: ../../src/rdbms/functions.txt:49 +msgid "Less than" +msgstr "Менше ніж" + +#: ../../src/rdbms/functions.txt:51 +msgid "``datatype > datatype -> boolean``" +msgstr "``datatype > datatype -> boolean``" + +#: ../../src/rdbms/functions.txt:51 +msgid "Greater than" +msgstr "Більше ніж" + +#: ../../src/rdbms/functions.txt:53 +msgid "``datatype <= datatype -> boolean``" +msgstr "``datatype <= datatype -> boolean``" + +#: ../../src/rdbms/functions.txt:53 +msgid "Less than or equal to" +msgstr "Менше ніж або дорівнює" + +#: ../../src/rdbms/functions.txt:55 +msgid "``datatype >= datatype -> boolean``" +msgstr "``datatype >= datatype -> boolean``" + +#: ../../src/rdbms/functions.txt:55 +msgid "Greater than or equal to" +msgstr "Більше або дорівнює" + +#: ../../src/rdbms/functions.txt:57 +msgid "``datatype = datatype -> boolean``" +msgstr "``datatype = datatype -> boolean``" + +#: ../../src/rdbms/functions.txt:57 +msgid "Equal" +msgstr "Дорівнює" + +#: ../../src/rdbms/functions.txt:59 +msgid "``datatype <> datatype -> boolean``" +msgstr "``datatype <> datatype -> boolean``" + +#: ../../src/rdbms/functions.txt:59 ../../src/rdbms/functions.txt:61 +msgid "Not equal" +msgstr "Не дорівнює" + +#: ../../src/rdbms/functions.txt:61 +msgid "``datatype != datatype -> boolean``" +msgstr "``datatype != datatype -> boolean``" + +#: ../../src/rdbms/functions.txt:65 +msgid "Mathematical functions and operators" +msgstr "Математичні функції та оператори" + +#: ../../src/rdbms/functions.txt:67 +msgid "Mathematical operators and provided for many PostgreSQL types." +msgstr "Математичні оператори і передбачені для багатьох типів PostgreSQL." + +#: ../../src/rdbms/functions.txt:70 +msgid "Operation" +msgstr "Операція" + +#: ../../src/rdbms/functions.txt:72 +msgid "``numeric_type + numeric_type``" +msgstr "``numeric_type + numeric_type``" + +#: ../../src/rdbms/functions.txt:72 +msgid "Addition" +msgstr "Додавання" + +#: ../../src/rdbms/functions.txt:74 +msgid "``+ numeric_type``" +msgstr "``+ numeric_type``" + +#: ../../src/rdbms/functions.txt:74 +msgid "Unary plus (no operation)" +msgstr "Унарний плюс (без операції)" + +#: ../../src/rdbms/functions.txt:76 +msgid "``numeric_type - numeric_type``" +msgstr "``numeric_type - numeric_type``" + +#: ../../src/rdbms/functions.txt:76 +msgid "Subtraction" +msgstr "Віднімання" + +#: ../../src/rdbms/functions.txt:78 +msgid "``- numeric_type``" +msgstr "``- numeric_type``" + +#: ../../src/rdbms/functions.txt:78 +msgid "Negation" +msgstr "Заперечення" + +#: ../../src/rdbms/functions.txt:80 +msgid "``numeric_type * numeric_type``" +msgstr "``numeric_type * numeric_type``" + +#: ../../src/rdbms/functions.txt:80 +msgid "Multiplication" +msgstr "Множення" + +#: ../../src/rdbms/functions.txt:82 +msgid "``numeric_type / numeric_type``" +msgstr "``numeric_type / numeric_type``" + +#: ../../src/rdbms/functions.txt:82 +msgid "" +"Division (for integral types, division truncates the result towards zero)" +msgstr "Ділення (для інтегральних типів ділення усікає результат до нуля)" + +#: ../../src/rdbms/functions.txt:86 +msgid "``numeric_type % numeric_type``" +msgstr "``numeric_type % numeric_type``" + +#: ../../src/rdbms/functions.txt:86 +msgid "" +"Modulo (remainder); available for ``smallint``, ``integer``, ``bigint``, and " +"``numeric``" +msgstr "" +"За модулем (залишок); доступний для ``smallint``, ``integer``, ``bigint`` та " +"``numeric``" + +#: ../../src/rdbms/functions.txt:90 +msgid "``numeric ^ numeric`` ``double precision ^ double precision``" +msgstr "``numeric ^ numeric`` ``double precision ^ double precision``" + +#: ../../src/rdbms/functions.txt:90 +msgid "Exponentiation" +msgstr "Піднесення до степеня" + +#: ../../src/rdbms/functions.txt:93 +msgid "``|/ double precision``" +msgstr "``|/ double precision``" + +#: ../../src/rdbms/functions.txt:93 +msgid "Square root" +msgstr "Квадратний корінь" + +#: ../../src/rdbms/functions.txt:95 +msgid "``||/ double precision``" +msgstr "``||/ double precision``" + +#: ../../src/rdbms/functions.txt:95 +msgid "Cube root" +msgstr "Кубічний корінь" + +#: ../../src/rdbms/functions.txt:97 +msgid "``@ numeric_type``" +msgstr "``@ numeric_type``" + +#: ../../src/rdbms/functions.txt:97 +msgid "Absolute value" +msgstr "Абсолютне значення" + +#: ../../src/rdbms/functions.txt:99 +msgid "``integral_type & integral_type``" +msgstr "``integral_type & integral_type``" + +#: ../../src/rdbms/functions.txt:99 +msgid "Bitwise AND" +msgstr "Побітове І" + +#: ../../src/rdbms/functions.txt:101 +msgid "``integral_type | integral_type``" +msgstr "``integral_type | integral_type``" + +#: ../../src/rdbms/functions.txt:101 +msgid "Bitwise OR" +msgstr "Порозрядне АБО" + +#: ../../src/rdbms/functions.txt:103 +msgid "``integral_type # integral_type``" +msgstr "``integral_type # integral_type``" + +#: ../../src/rdbms/functions.txt:103 +msgid "Bitwise exclusive OR" +msgstr "Побітове виключне АБО" + +#: ../../src/rdbms/functions.txt:105 +msgid "``~ integral_type``" +msgstr "``~ integral_type``" + +#: ../../src/rdbms/functions.txt:105 +msgid "Bitwise NOT" +msgstr "Побітове І" + +#: ../../src/rdbms/functions.txt:107 +msgid "``integral_type << integer``" +msgstr "``integral_type << integer``" + +#: ../../src/rdbms/functions.txt:107 +msgid "Bitwise shift left" +msgstr "Порозрядний зсув вліво" + +#: ../../src/rdbms/functions.txt:109 +msgid "``integral_type >> integer``" +msgstr "``integral_type >> integer``" + +#: ../../src/rdbms/functions.txt:109 +msgid "Bitwise shift right" +msgstr "Порозрядний зсув вправо" + +#: ../../src/rdbms/functions.txt:113 +msgid "String functions" +msgstr "Рядкові функції" + +#: ../../src/rdbms/functions.txt:115 +msgid "" +"*Strings* in this context include values of the types ``character``, " +"``text`` and ``character varying``." +msgstr "" +"*Рядки* у цьому контексті включають значення типів ``символ``, ``текст`` та " +"``символьна змінна``." + +#: ../../src/rdbms/functions.txt:120 +msgid "Concatenates the two strings." +msgstr "З'єднує два рядки." + +#: ../../src/rdbms/functions.txt:122 +msgid "``'Post' || 'greSQL' -> PostgreSQL``" +msgstr "``'Post' || 'greSQL' -> PostgreSQL``" + +#: ../../src/rdbms/functions.txt:127 +msgid "" +"Converts the non-string input to text, then concatenates the two strings. " +"(The non-string input cannot be of an array type, because that would create " +"ambiguity with the array ``||`` operators. If you want to concatenate an " +"array's text equivalent, cast it to text explicitly.)" +msgstr "" +"Перетворює нестрокове введення у текст, а потім об'єднує два рядки. " +"(Нестроковий ввід не може бути типом масиву, оскільки це створить " +"неоднозначність з операторами масиву ``||``. Якщо ви хочете об'єднати " +"текстовий еквівалент масиву, перетворіть його у текст явно)" + +#: ../../src/rdbms/functions.txt:132 +msgid "``'Value: ' || 42 -> Value: 42``" +msgstr "``'Value: ' || 42 -> Value: 42``" + +#: ../../src/rdbms/functions.txt:137 +msgid "Returns number of characters in the string." +msgstr "Повертає кількість символів у рядку." + +#: ../../src/rdbms/functions.txt:139 +msgid "``char_length('josé') -> 4``" +msgstr "``char_length('josé') -> 4``" + +#: ../../src/rdbms/functions.txt:143 +msgid "" +"Converts the string to all lower case, according to the rules of the " +"database's locale." +msgstr "" +"Перетворює рядок у всі регістри нижнього регістру відповідно до правил " +"локалі бази даних." + +#: ../../src/rdbms/functions.txt:146 +msgid "``lower('TOM') -> tom``" +msgstr "``lower('TOM') -> tom``" + +#: ../../src/rdbms/functions.txt:150 +msgid "" +"Removes the longest string containing only characters in characters (a space " +"by default) from the start of string." +msgstr "" +"Видаляє найдовший рядок, що містить лише символи (за замовчуванням пробіл) з " +"початку рядка." + +#: ../../src/rdbms/functions.txt:153 +msgid "``ltrim('zzzytest', 'xyz') -> test``" +msgstr "``ltrim('zzzytest', 'xyz') -> test``" + +#: ../../src/rdbms/functions.txt:157 +msgid "" +"Removes the longest string containing only characters in characters (a space " +"by default) from the end of string." +msgstr "" +"Видаляє з кінця рядка найдовший рядок, що містить лише символи (за " +"замовчуванням пробіл)." + +#: ../../src/rdbms/functions.txt:160 +msgid "``rtrim('testxxzx', 'xyz') -> test``" +msgstr "``rtrim('testxxzx', 'xyz') -> test``" + +#: ../../src/rdbms/functions.txt:164 +msgid "" +"Removes the longest string containing only characters in characters (a space " +"by default) from the start, end, or both ends (BOTH is the default) of " +"string." +msgstr "" +"Видаляє найдовший рядок, що містить лише символи (за замовчуванням пробіл) з " +"початку, кінця або обох кінців рядка (за замовчуванням BOTH)." + +#: ../../src/rdbms/functions.txt:168 +msgid "``trim(both 'xyz' from 'yxTomxx') -> Tom``" +msgstr "``trim(both 'xyz' from 'yxTomxx') -> Tom``" + +#: ../../src/rdbms/functions.txt:171 +msgid "Pattern matching" +msgstr "Зіставлення шаблонів" + +#: ../../src/rdbms/functions.txt:173 +msgid "" +"There are three separate approaches to pattern matching provided by " +"PostgreSQL: the traditional ``LIKE`` operator, the most recent ``SIMILAR " +"TO`` operator, and POSIX-style regular expressions." +msgstr "" +"У PostgreSQL існує три окремі підходи до зіставлення шаблонів: традиційний " +"оператор ``LIKE``, найновіший оператор ``SIMILAR TO`` та регулярні вирази у " +"стилі POSIX." + +#: ../../src/rdbms/functions.txt:177 +msgid "This section will focus on ``LIKE`` operator only." +msgstr "У цьому розділі буде розглянуто лише оператор ``LIKE``." + +#: ../../src/rdbms/functions.txt:184 +msgid "" +"The ``LIKE`` expression returns ``true`` if the ``string`` matches the " +"supplied ``pattern`` (as expected, the ``NOT LIKE`` expression returns " +"``false`` if ``LIKE`` returns ``true``, and vice versa)." +msgstr "" +"Вираз ``LIKE`` повертає значення ``true``, якщо ``рядок`` відповідає " +"заданому ``шаблону`` (як і очікувалося, вираз ``NOT LIKE`` повертає значення " +"``false``, якщо ``LIKE`` повертає значення ``true``, і навпаки)." + +#: ../../src/rdbms/functions.txt:188 +msgid "" +"If ``pattern`` does not contain percent signs or underscores, then the " +"pattern only represents the string itself; in than case ``LIKE`` acts like " +"the equals operator. An underscore (``_``) in ``pattern`` stands for " +"(matches) any single character; a percent sign (``%``) matches any sequence " +"of zero or more characters." +msgstr "" +"Якщо ``шаблон`` не містить знаків відсотків або підкреслень, то шаблон " +"представляє лише сам рядок; у цьому випадку ``LIKE`` діє як оператор " +"рівності. Підкреслення (``_``) у ``шаблоні`` означає (відповідає) будь-якому " +"окремому символу; знак відсотка (``%``) відповідає будь-якій послідовності з " +"нуля або більше символів." + +#: ../../src/rdbms/functions.txt:194 +msgid "Some examples:" +msgstr "Деякі приклади:" + +#: ../../src/rdbms/functions.txt:203 +msgid "" +"``LIKE`` patterns matching always covers the entire string. Therefore, if " +"it's desired to match a sequence anywhere within a string, the pattern must " +"start and end with a percent sign." +msgstr "" +"шаблони ``LIKE`` завжди збігаються з усім рядком. Тому, якщо потрібно знайти " +"послідовність у будь-якому місці рядка, шаблон повинен починатися і " +"закінчуватися знаком відсотка." + +#: ../../src/rdbms/functions.txt:207 +msgid "" +"To match a literal underscore or percent sing without matching other " +"characters the respective character in ``pattern`` must be preceded by the " +"escape character. The default escape character is backslash but a different " +"one can be selected by using the ``ESCAPE`` clause. To match the escape " +"character itself, write two escape characters." +msgstr "" +"Для відповідності буквеному підкресленню або відсотковому знаку без " +"відповідності іншим символам перед відповідним символом у ``шаблоні`` має " +"стояти екранований символ. Типовим символом за замовчуванням є зворотна коса " +"риска, але ви можете вибрати інший символ за допомогою пункту ``ESCAPE``. " +"Щоб відповідати самому символу екранування, напишіть два символи екранування." + +#: ../../src/rdbms/functions.txt:213 +msgid "" +"The key word ``ILIKE`` can be used instead of ``LIKE`` to make the match " +"case-insensitive according to the active locale. This is not in the SQL " +"standard but is a PostgreSQL extension." +msgstr "" +"Ключове слово ``ILIKE`` можна використовувати замість ``LIKE``, щоб зробити " +"збіг нечутливим до регістру відповідно до активної локалі. Це не передбачено " +"стандартом SQL, але є розширенням PostgreSQL." + +#: ../../src/rdbms/functions.txt:218 +msgid "Date/Time functions and operators" +msgstr "Функції та оператори дати/часу" + +#: ../../src/rdbms/functions.txt:221 +msgid "Extract" +msgstr "Вилучення" + +#: ../../src/rdbms/functions.txt:225 +msgid "" +"The ``extract`` function retrieves subfields such as year or hour from date/" +"time value. The ``source`` must be a value expression of type ``timestamp``, " +"``time``, or ``interval``. Expressions of type ``date`` are cast to " +"``timestamp`` and can therefore be used as well. ``field`` is an identifier " +"or string that selects what field to extract from the source value. The " +"extract function returns value of type ``numeric``. The following are valid " +"field names:" +msgstr "" +"Функція ``extract`` витягує підполя, такі як рік або година, зі значення " +"дати/часу. Джерело має бути виразом типу ``timestamp``, ``time`` або " +"``interval``. Вирази типу ``date`` приводяться до ``timestamp``, тому їх " +"також можна використовувати. ``field`` - це ідентифікатор або рядок, який " +"вказує, яке саме поле потрібно витягти з вихідного значення. Функція extract " +"повертає значення типу ``numeric``. Нижче наведено припустимі імена полів:" + +#: ../../src/rdbms/functions.txt:233 +msgid "``centurty``" +msgstr "``centurty``" + +#: ../../src/rdbms/functions.txt:234 +msgid "``day``" +msgstr "``day``" + +#: ../../src/rdbms/functions.txt:235 +msgid "``decade``" +msgstr "``decade``" + +#: ../../src/rdbms/functions.txt:236 +msgid "``dow``" +msgstr "``dow``" + +#: ../../src/rdbms/functions.txt:237 +msgid "``doy``" +msgstr "``doy``" + +#: ../../src/rdbms/functions.txt:238 +msgid "``epoch``" +msgstr "``epoch``" + +#: ../../src/rdbms/functions.txt:239 +msgid "``hour``" +msgstr "``hour``" + +#: ../../src/rdbms/functions.txt:240 +msgid "``isodow``" +msgstr "``isodow``" + +#: ../../src/rdbms/functions.txt:241 +msgid "``isoyear``" +msgstr "``isoyear``" + +#: ../../src/rdbms/functions.txt:242 +msgid "``julian``" +msgstr "``julian``" + +#: ../../src/rdbms/functions.txt:243 +msgid "``microseconds``" +msgstr "``microseconds``" + +#: ../../src/rdbms/functions.txt:244 +msgid "``millennium``" +msgstr "``millennium``" + +#: ../../src/rdbms/functions.txt:245 +msgid "``milliseconds``" +msgstr "``milliseconds``" + +#: ../../src/rdbms/functions.txt:246 +msgid "``minute``" +msgstr "``minute``" + +#: ../../src/rdbms/functions.txt:247 +msgid "``month``" +msgstr "``month``" + +#: ../../src/rdbms/functions.txt:248 +msgid "``quarter``" +msgstr "``quarter``" + +#: ../../src/rdbms/functions.txt:249 +msgid "``second``" +msgstr "``second``" + +#: ../../src/rdbms/functions.txt:250 +msgid "``timezone``" +msgstr "``timezone``" + +#: ../../src/rdbms/functions.txt:251 +msgid "``timezone_hour``" +msgstr "``timezone_hour``" + +#: ../../src/rdbms/functions.txt:252 +msgid "``timezone_minute``" +msgstr "``timezone_minute``" + +#: ../../src/rdbms/functions.txt:253 +msgid "``week``" +msgstr "``week``" + +#: ../../src/rdbms/functions.txt:254 +msgid "``year``" +msgstr "``year``" + +#: ../../src/rdbms/functions.txt:256 +msgid "" +"The ``date_part`` function is modeled on the traditional Ingres equivalent " +"to the SQL-standard function ``extract``:" +msgstr "" +"Функція ``date_part`` змодельована на основі традиційного для Ingres " +"еквівалента стандартної функції SQL ``extract``:" + +#: ../../src/rdbms/functions.txt:262 +msgid "Current date/time" +msgstr "Поточна дата/час" + +#: ../../src/rdbms/functions.txt:264 +msgid "" +"PostgreSQL provides a number of functions that return values related to the " +"current date and time. These SQL-standard functions all return values based " +"on the start time of the current transaction:" +msgstr "" +"PostgreSQL надає ряд функцій, які повертають значення, пов'язані з поточною " +"датою і часом. Всі ці стандартні функції SQL повертають значення на основі " +"часу початку поточної транзакції:" + +#: ../../src/rdbms/functions.txt:272 +msgid "Deliver current time value with time zone." +msgstr "Надавати поточне значення часу з часовим поясом." + +#: ../../src/rdbms/functions.txt +msgid "precision" +msgstr "точність" + +#: ../../src/rdbms/functions.txt:275 ../../src/rdbms/functions.txt:285 +#: ../../src/rdbms/functions.txt:295 ../../src/rdbms/functions.txt:305 +msgid "" +"An optional parameter, which causes the result to be rounded to that many " +"fractional digits in the second field. Without a precision, the result is " +"given to the full available precision." +msgstr "" +"Необов'язковий параметр, який призводить до округлення результату до такої " +"кількості дробових цифр у другому полі. Якщо параметр не вказано, результат " +"буде надано з повною доступною точністю." + +#: ../../src/rdbms/functions.txt:282 +msgid "Deliver current timestamp value with time zone." +msgstr "Видавати поточне значення мітки часу з часовим поясом." + +#: ../../src/rdbms/functions.txt:292 ../../src/rdbms/functions.txt:302 +msgid "Deliver current time value without time zone." +msgstr "Надавати поточне значення часу без часового поясу." + +#: ../../src/rdbms/functions.txt:310 +msgid "Formatting functions" +msgstr "Функції форматування" + +#: ../../src/rdbms/functions.txt:314 +msgid "" +"The PostgreSQL formatting functions provide a powerful set of tools for " +"converting various data types (date/time, integer, floatting point, " +"numeric) to formatted strings and for converting from formatted strings to " +"specific data types." +msgstr "" +"Функції форматування PostgreSQL надають потужний набір інструментів для " +"перетворення різних типів даних (дата/час, цілі числа, числа з плаваючою " +"комою, числові) у відформатовані рядки і для перетворення з відформатованих " +"рядків у певні типи даних." + +#: ../../src/rdbms/functions.txt:319 +msgid "" +"These functions all follow a common calling convention: the first argument " +"is the value to be formatted and the second argument is a template that " +"defines the output or input format." +msgstr "" +"Всі ці функції мають загальну схему виклику: перший аргумент - це значення, " +"яке потрібно відформатувати, а другий аргумент - шаблон, який визначає " +"формат виводу або вводу." + +#: ../../src/rdbms/functions.txt:326 +msgid "Converts time stamp to string according to the given format." +msgstr "Конвертує мітку часу в рядок відповідно до заданого формату." + +#: ../../src/rdbms/functions.txt:328 +msgid "" +"``to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS') → 05:31:12``" +msgstr "" +"``to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS') → 05:31:12``" + +#: ../../src/rdbms/functions.txt:332 +msgid "Converts interval to string according to the given format." +msgstr "Перетворює інтервал у рядок відповідно до заданого формату." + +#: ../../src/rdbms/functions.txt:334 +msgid "``to_char(interval '15h 2m 12s', 'HH24:MI:SS') → 15:02:12``" +msgstr "``to_char(interval '15h 2m 12s', 'HH24:MI:SS') → 15:02:12``" + +#: ../../src/rdbms/functions.txt:338 +msgid "" +"Converts number to string according to the given format; available for " +"integer, bigint, numeric, real, double precision." +msgstr "" +"Перетворює число в рядок відповідно до заданого формату; доступний для " +"цілих, біґінтових, числових, дійсних, подвійної точності." + +#: ../../src/rdbms/functions.txt:341 +msgid "``to_char(125, '999') → 125``" +msgstr "``to_char(125, '999') → 125``" + +#: ../../src/rdbms/functions.txt:342 +msgid "``to_char(125.8::real, '999D9') → 125.8``" +msgstr "``to_char(125.8::real, '999D9') → 125.8``" + +#: ../../src/rdbms/functions.txt:343 +msgid "``to_char(-125.8, '999D99S') → 125.80-``" +msgstr "``to_char(-125.8, '999D99S') → 125.80-``" + +#: ../../src/rdbms/functions.txt:347 +msgid "Converts string to date according to the given format." +msgstr "Конвертує рядок у дату відповідно до заданого формату." + +#: ../../src/rdbms/functions.txt:349 +msgid "``to_date('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05``" +msgstr "``to_date('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05``" + +#: ../../src/rdbms/functions.txt:353 +msgid "Converts string to numeric according to the given format." +msgstr "Перетворює рядок у число відповідно до заданого формату." + +#: ../../src/rdbms/functions.txt:355 +msgid "``to_number('12,454.8-', '99G999D9S') → -12454.8``" +msgstr "``to_number('12,454.8-', '99G999D9S') → -12454.8``" + +#: ../../src/rdbms/functions.txt:359 +msgid "Converts string to time stamp according to the given format." +msgstr "Перетворює рядок у мітку часу відповідно до заданого формату." + +#: ../../src/rdbms/functions.txt:361 +msgid "``to_timestamp('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05 00:00:00-05``" +msgstr "" +"``to_timestamp('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05 00:00:00-05``" + +#: ../../src/rdbms/functions.txt:366 +msgid "Conditional expressions" +msgstr "Умовні вирази" + +#: ../../src/rdbms/functions.txt:369 +msgid "CASE" +msgstr "CASE" + +#: ../../src/rdbms/functions.txt:371 +msgid "" +"The SQL ``CASE`` expression is a generic conditional expression, similar to " +"if/else statements in other programming languages." +msgstr "" +"Вираз SQL ``CASE`` - це загальний умовний вираз, подібний до операторів if/" +"else в інших мовах програмування." + +#: ../../src/rdbms/functions.txt:377 +msgid "COALESCE" +msgstr "COALESCE" + +#: ../../src/rdbms/functions.txt:379 +msgid "" +"The ``COALESCE`` function returns the first of its arguments that is not " +"null. Null is returned only if all arguments are null. It is often used to " +"substitute a default value for null values when data is retrieved for " +"display:" +msgstr "" +"Функція ``COALESCE`` повертає перший з аргументів, який не є нульовим. Null " +"повертається лише у випадку, якщо всі аргументи є нульовими. Вона часто " +"використовується для заміни значення за замовчуванням на нульові значення, " +"коли дані отримуються для відображення:" + +#: ../../src/rdbms/functions.txt:387 +msgid "" +"This returns ``description`` if it is not null, otherwise " +"``short_description`` if it is not null, otherwise ``(none)``." +msgstr "" +"Повертає ``description``, якщо він не є нульовим, інакше " +"``short_description``, якщо він не є нульовим, інакше ``(none)``." + +#: ../../src/rdbms/functions.txt:390 +msgid "" +"Like the ``CASE`` expression, ``COALESCE`` only evaluates the arguments that " +"are needed to determine the result; that is, arguments to the right of the " +"first non-null argument are not evaluated." +msgstr "" +"Як і вираз ``CASE``, ``COALESCE`` обчислює тільки ті аргументи, які потрібні " +"для визначення результату; тобто аргументи праворуч від першого ненульового " +"аргументу не обчислюються." + +#: ../../src/rdbms/functions.txt:395 +msgid "NULLIF" +msgstr "NULLIF" + +#: ../../src/rdbms/functions.txt:401 +msgid "" +"The ``NULLIF`` function returns a null ``value_1`` equals ``value_2``; " +"otherwise it returns ``value_1``. This can be used to perform the inverse " +"operation of the ``COALESCE``." +msgstr "" +"Функція ``NULLIF`` повертає нульове ``значення_1``, що дорівнює " +"``значенню_2``; інакше повертає ``значення_1``. Це може бути використано для " +"виконання оберненої операції до ``COALESCE``." + +#: ../../src/rdbms/functions.txt:409 +msgid "" +"In the example above, if ``value`` is ``(none)``, null is returned, " +"otherwise the value of ``value`` is returned." +msgstr "" +"У наведеному вище прикладі, якщо ``value`` дорівнює ``(none)``, повертається " +"нуль, інакше повертається значення ``value``." + +#: ../../src/rdbms/functions.txt:412 +msgid "" +"The two arguments must be of comparable types. To be specific, they are " +"compared exactly as if you had written ``value_1 = value_2``, so there must " +"be a suitable ``=`` operator available." +msgstr "" +"Два аргументи повинні бути порівнянних типів. Якщо бути точним, вони " +"порівнюються так само, як якщо б ви написали ``value_1 = value_2``, тому має " +"бути відповідний оператор ``=``." + +#: ../../src/rdbms/functions.txt:416 +msgid "" +"The result has the same type as the first argument -- but there is a " +"subtlety. What is actual returned is the first argument of the implied ``=`` " +"operator, and in some cases that will have been promoted to match the second " +"argument's type." +msgstr "" +"Результат має той самий тип, що і перший аргумент - але є один нюанс. " +"Насправді повертається перший аргумент неявного оператора ``=``, і в деяких " +"випадках він буде приведений до типу другого аргументу." + +#: ../../src/rdbms/functions.txt:422 +msgid "Aggregate functions" +msgstr "Агрегатні функції" + +#: ../../src/rdbms/functions.txt:424 +msgid "" +"*Aggregate functions* compute a single result from a set of input values. " +"There are lots of these, and different RDBMS implement different aggregation " +"functions. In this section, we will focus on the most wide spread and often " +"used aggregate functions only." +msgstr "" +"*Агрегатні функції* обчислюють один результат з набору вхідних значень. Їх " +"існує багато, і різні СКБД реалізують різні функції агрегації. У цьому " +"розділі ми зосередимося лише на найбільш поширених і часто використовуваних " +"агрегатних функціях." + +#: ../../src/rdbms/functions.txt:429 +msgid "The general schema of using is presented below:" +msgstr "Загальна схема використання представлена нижче:" + +#: ../../src/rdbms/functions.txt:434 +msgid "Average value" +msgstr "Середнє значення" + +#: ../../src/rdbms/functions.txt:444 +msgid "" +"Computes the average (arithmetic mean) of all the non-null input values " +"within a group" +msgstr "" +"Обчислює середнє значення (середнє арифметичне) всіх ненульових вхідних " +"значень у групі" + +#: ../../src/rdbms/functions.txt:449 +msgid "" +"SQLite implements ``avg`` function in a manner to return ``NULL`` if and " +"only if all the inputs are nulls. On the other hand PostgreSQL will raise an " +"error in this scenario." +msgstr "" +"SQLite реалізує функцію ``avg`` таким чином, що вона повертає ``NULL`` тоді " +"і тільки тоді, коли всі вхідні дані є нулями. З іншого боку, PostgreSQL " +"видасть помилку у цьому випадку." + +#: ../../src/rdbms/functions.txt:464 ../../src/rdbms/functions.txt:500 +#: ../../src/rdbms/functions.txt:532 ../../src/rdbms/functions.txt:564 +#: ../../src/rdbms/functions.txt:602 +msgid "year" +msgstr "year" + +#: ../../src/rdbms/functions.txt:464 ../../src/rdbms/functions.txt:500 +#: ../../src/rdbms/functions.txt:532 ../../src/rdbms/functions.txt:564 +#: ../../src/rdbms/functions.txt:602 +msgid "month" +msgstr "month" + +#: ../../src/rdbms/functions.txt:464 +msgid "avg" +msgstr "avg" + +#: ../../src/rdbms/functions.txt:466 ../../src/rdbms/functions.txt:468 +#: ../../src/rdbms/functions.txt:502 ../../src/rdbms/functions.txt:504 +#: ../../src/rdbms/functions.txt:534 ../../src/rdbms/functions.txt:536 +#: ../../src/rdbms/functions.txt:566 ../../src/rdbms/functions.txt:568 +#: ../../src/rdbms/functions.txt:604 ../../src/rdbms/functions.txt:606 +msgid "2013" +msgstr "2013" + +#: ../../src/rdbms/functions.txt:466 ../../src/rdbms/functions.txt:502 +#: ../../src/rdbms/functions.txt:534 ../../src/rdbms/functions.txt:566 +#: ../../src/rdbms/functions.txt:604 +msgid "11" +msgstr "11" + +#: ../../src/rdbms/functions.txt:466 +msgid "7798" +msgstr "7798" + +#: ../../src/rdbms/functions.txt:468 ../../src/rdbms/functions.txt:504 +#: ../../src/rdbms/functions.txt:536 ../../src/rdbms/functions.txt:568 +#: ../../src/rdbms/functions.txt:606 +msgid "12" +msgstr "12" + +#: ../../src/rdbms/functions.txt:468 +msgid "6709" +msgstr "6709" + +#: ../../src/rdbms/functions.txt:470 ../../src/rdbms/functions.txt:472 +#: ../../src/rdbms/functions.txt:474 ../../src/rdbms/functions.txt:506 +#: ../../src/rdbms/functions.txt:508 ../../src/rdbms/functions.txt:510 +#: ../../src/rdbms/functions.txt:538 ../../src/rdbms/functions.txt:540 +#: ../../src/rdbms/functions.txt:542 ../../src/rdbms/functions.txt:570 +#: ../../src/rdbms/functions.txt:572 ../../src/rdbms/functions.txt:574 +#: ../../src/rdbms/functions.txt:608 ../../src/rdbms/functions.txt:610 +#: ../../src/rdbms/functions.txt:612 +msgid "2014" +msgstr "2014" + +#: ../../src/rdbms/functions.txt:470 ../../src/rdbms/functions.txt:506 +#: ../../src/rdbms/functions.txt:538 ../../src/rdbms/functions.txt:570 +#: ../../src/rdbms/functions.txt:608 +msgid "1" +msgstr "1" + +#: ../../src/rdbms/functions.txt:470 +msgid "6523" +msgstr "6523" + +#: ../../src/rdbms/functions.txt:472 ../../src/rdbms/functions.txt:508 +#: ../../src/rdbms/functions.txt:540 ../../src/rdbms/functions.txt:572 +#: ../../src/rdbms/functions.txt:610 +msgid "2" +msgstr "2" + +#: ../../src/rdbms/functions.txt:472 +msgid "6832" +msgstr "6832" + +#: ../../src/rdbms/functions.txt:474 ../../src/rdbms/functions.txt:510 +#: ../../src/rdbms/functions.txt:542 ../../src/rdbms/functions.txt:574 +#: ../../src/rdbms/functions.txt:612 +msgid "3" +msgstr "3" + +#: ../../src/rdbms/functions.txt:474 +msgid "10218" +msgstr "10218" + +#: ../../src/rdbms/functions.txt:478 +msgid "Count" +msgstr "Кількість" + +#: ../../src/rdbms/functions.txt:482 +msgid "Computes the number of input rows" +msgstr "Обчислює кількість вхідних рядків" + +#: ../../src/rdbms/functions.txt:487 +msgid "Computes the number of input rows in which the input value is not null" +msgstr "" +"Обчислює кількість вхідних рядків, в яких вхідне значення не дорівнює нулю" + +#: ../../src/rdbms/functions.txt:500 +msgid "count" +msgstr "count" + +#: ../../src/rdbms/functions.txt:502 ../../src/rdbms/functions.txt:506 +#: ../../src/rdbms/functions.txt:510 +msgid "5" +msgstr "5" + +#: ../../src/rdbms/functions.txt:504 +msgid "7" +msgstr "7" + +#: ../../src/rdbms/functions.txt:508 +msgid "8" +msgstr "8" + +#: ../../src/rdbms/functions.txt:514 +msgid "Maximum value" +msgstr "Максимальне значення" + +#: ../../src/rdbms/functions.txt:518 +msgid "" +"Computes the maximum of the non-null input values. Available for any " +"numeric, string, date/time or enum type." +msgstr "" +"Обчислює максимальне з ненульових вхідних значень. Доступно для будь-яких " +"чисел, рядків, дати/часу або перелічуваних типів." + +#: ../../src/rdbms/functions.txt:532 +msgid "max" +msgstr "max" + +#: ../../src/rdbms/functions.txt:534 +msgid "12383" +msgstr "12383" + +#: ../../src/rdbms/functions.txt:536 +msgid "12264" +msgstr "12264" + +#: ../../src/rdbms/functions.txt:538 +msgid "8853" +msgstr "8853" + +#: ../../src/rdbms/functions.txt:540 +msgid "12919" +msgstr "12919" + +#: ../../src/rdbms/functions.txt:542 +msgid "14661" +msgstr "14661" + +#: ../../src/rdbms/functions.txt:546 +msgid "Minimum value" +msgstr "Мінімальне значення" + +#: ../../src/rdbms/functions.txt:550 +msgid "" +"Computes the minimum of the non-null inpout values. Available for any " +"numeric, string, date/time or enum type." +msgstr "" +"Обчислює мінімальне з ненульових вхідних значень. Доступно для будь-якого " +"числового, рядкового, дати/часу або перелічуваного типу." + +#: ../../src/rdbms/functions.txt:564 +msgid "min" +msgstr "min" + +#: ../../src/rdbms/functions.txt:566 +msgid "3365" +msgstr "3365" + +#: ../../src/rdbms/functions.txt:568 +msgid "3564" +msgstr "3564" + +#: ../../src/rdbms/functions.txt:570 +msgid "2636" +msgstr "2636" + +#: ../../src/rdbms/functions.txt:572 +msgid "3442" +msgstr "3442" + +#: ../../src/rdbms/functions.txt:574 +msgid "2654" +msgstr "2654" + +#: ../../src/rdbms/functions.txt:578 +msgid "Sum of values" +msgstr "Сума значень" + +#: ../../src/rdbms/functions.txt:589 +msgid "Computes the sum of the non-null values" +msgstr "Обчислює суму ненульових значень" + +#: ../../src/rdbms/functions.txt:602 +msgid "sum" +msgstr "сума" + +#: ../../src/rdbms/functions.txt:604 +msgid "38988" +msgstr "38988" + +#: ../../src/rdbms/functions.txt:606 +msgid "46958" +msgstr "46958" + +#: ../../src/rdbms/functions.txt:608 +msgid "32611" +msgstr "32611" + +#: ../../src/rdbms/functions.txt:610 +msgid "54652" +msgstr "54652" + +#: ../../src/rdbms/functions.txt:612 +msgid "51087" +msgstr "51087" diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/index.po b/src/_locales/uk/LC_MESSAGES/rdbms/index.po new file mode 100644 index 000000000..fff4021eb --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/index.po @@ -0,0 +1,155 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2024.03.dev\n" +"Report-Msgid-Bugs-To: https://github.com/edu-python-course/edu-python-course." +"github.io/issues\n" +"POT-Creation-Date: 2023-12-16 13:55+0000\n" +"PO-Revision-Date: 2024-03-05 16:17+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk_UA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/rdbms/index.txt:-1 +msgid "Relational databases" +msgstr "Реляційні бази даних" + +#: ../../src/rdbms/index.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/rdbms/index.txt:-1 +msgid "sql, db, database, intro, introduction, index" +msgstr "sql, db, database, intro, introduction, index" + +#: ../../src/rdbms/index.txt +msgid "PostgreSQL" +msgstr "PostgreSQL" + +#: ../../src/rdbms/index.txt +msgid "SQLite" +msgstr "SQLite" + +#: ../../src/rdbms/index.txt +msgid "MySQL" +msgstr "MySQL" + +#: ../../src/rdbms/index.txt:23 +msgid "Relational Database" +msgstr "Реляційні бази даних" + +#: ../../src/rdbms/index.txt:25 +msgid "" +":abbr:`RDBMS (Relational Database Management System)` is a type of software " +"that helps users to create, update, manage, and access relational databases. " +"Relational databases organize data into tables, which consist of rows and " +"columns. Each column represents a specific attribute of the data, while each " +"row represents a specific instance of that data." +msgstr "" +":abbr:`RDBMS (Relational Database Management System)` - це тип програмного " +"забезпечення, яке допомагає користувачам створювати, оновлювати, керувати та " +"отримувати доступ до реляційних баз даних. Реляційні бази даних " +"організовують дані в таблиці, які складаються з рядків і стовпців. Кожен " +"стовпець представляє певний атрибут даних, тоді як кожен рядок представляє " +"конкретний екземпляр цих даних." + +#: ../../src/rdbms/index.txt:31 +msgid "" +"RDBMS allow users to interact with the database using :abbr:`SQL (Structured " +"Query Language)`, which is a standard language for managing and manipulating " +"relational databases. SQL allows users to perform a variety of operations on " +"the database, including adding, updating, and deleting data, as well as " +"retrieving data based on specific criteria." +msgstr "" +"СУБД дозволяє користувачам взаємодіяти з базою даних за допомогою :abbr:`SQL " +"(Structured Query Language)`, яка є стандартною мовою для керування і " +"маніпулювання реляційними базами даних. SQL дозволяє користувачам виконувати " +"різноманітність операцій з базою даних, включаючи додавання, оновлення та " +"видалення даних, а також отримання даних на основі певних критеріїв." + +#: ../../src/rdbms/index.txt:37 +msgid "" +"RDBMS also provide a range of features to ensure data integrity, such as " +"enforcing data constraints, supporting transactions, and providing backup " +"and recovery capabilities. Additionally, RDBMS systems often provide tools " +"for managing the database, such as user interfaces for creating and " +"modifying tables and views, and monitoring tools for optimizing database " +"performance." +msgstr "" +"СУБД також надає низку функцій для забезпечення цілісності даних, таких як " +"дотримання обмежень даних, підтримка транзакцій та забезпечення можливостей " +"резервного копіюванняі відновлення. Крім того, системи РСУБД часто надають " +"інструменти для керування базою даних, такі як інтерфейси користувача для " +"створення та модифікації таблиць і представлень, а також інструменти " +"моніторингу для оптимізації продуктивності бази даних." + +#: ../../src/rdbms/index.txt:43 +msgid "" +"Security is a paramount aspect of managing databases. Even at the " +"introductory level, it's crucial to be aware of the basic security measures:" +msgstr "" +"Безпека - найважливіший аспект управління базами даних. Навіть на " +"початковому рівні важливо знати основні заходи безпеки:" + +#: ../../src/rdbms/index.txt:46 +msgid "" +"**Authentication and Authorization**: Ensuring that only authorized users " +"have access to the database." +msgstr "" +"**Аутентифікація та авторизація**: Забезпечення доступу до бази даних лише " +"авторизованим користувачам." + +#: ../../src/rdbms/index.txt:48 +msgid "" +"**Role-Based Access Control**: Assigning permissions based on roles within " +"the organization." +msgstr "" +"**Контроль доступу на основі ролей**: Призначення дозволів на основі ролей в " +"організації." + +#: ../../src/rdbms/index.txt:50 +msgid "" +"**Data Encryption**: Protecting sensitive data both at rest and in transit." +msgstr "" +"**Шифрування даних**: Захист конфіденційних даних як у стані спокою, так і " +"під час передачі." + +#: ../../src/rdbms/index.txt:52 +msgid "" +"There are dozens of RDBMS, used in nowadays projects. But most widespread " +"are:" +msgstr "" +"Існують десятки СУБД, які використовуються в сучасних проектах. Але " +"найпоширенішими є наступні:" + +#: ../../src/rdbms/index.txt:54 +msgid "" +"|postgres| **PostgreSQL**: A Powerful, open source object-relational " +"database system." +msgstr "" +"|postgres| **PostgreSQL**: Потужна об'єктно-реляційна система баз даних з " +"відкритим вихідним кодом." + +#: ../../src/rdbms/index.txt:56 +msgid "" +"|sqlite| **SQLite**: A C-library that implements a small, full featured SQL " +"database engine." +msgstr "" +"|sqlite| **SQLite**: C-бібліотека, яка реалізує невеликий, проте " +"повнофункціональний рушій баз даних SQL." + +#: ../../src/rdbms/index.txt:58 +msgid "" +"|mysql| **MySQL**: A fast, multithread, multi-user, and robust SQL database " +"server." +msgstr "" +"|mysql| **MySQL**: Швидкий, багатопотоковий, багатокористувацький і надійний " +"сервер баз даних SQL." diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/normalization.po b/src/_locales/uk/LC_MESSAGES/rdbms/normalization.po new file mode 100644 index 000000000..5bc6b1167 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/normalization.po @@ -0,0 +1,788 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2024.02.dev\n" +"Report-Msgid-Bugs-To: https://github.com/edu-python-course/edu-python-course." +"github.io/issues\n" +"POT-Creation-Date: 2024-02-18 16:49+0200\n" +"PO-Revision-Date: 2024-02-18 17:26+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/rdbms/normalization.txt:-1 +msgid "Database normalization" +msgstr "Нормалізація баз даних" + +#: ../../src/rdbms/normalization.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/rdbms/normalization.txt:-1 +msgid "sql, db, database, normalization" +msgstr "sql, db, database, normalization" + +#: ../../src/rdbms/normalization.txt:8 +msgid "Database Normalization" +msgstr "Нормалізація баз даних" + +#: ../../src/rdbms/normalization.txt:10 +msgid "" +"Normalization is a process of organizing data in a database so that it is " +"free from redundancy and dependency. It helps to eliminate data " +"inconsistencies and anomalies, thereby improving data integrity. " +"Normalization is a set of rules or guidelines to design a database schema in " +"such a way that it avoids data duplication, data redundancy, and data " +"inconsistency." +msgstr "" +"Нормалізація - це процес упорядкування даних у базі даних таким чином, щоб " +"вона була вільна від надлишковості та залежності. Це допомагає усунути " +"невідповідності та аномалії даних, тим самим покращуючи цілісність даних. " +"Нормалізація - це набір правил або вказівки щодо розробки схеми бази даних " +"таким чином, щоб уникнути дублювання даних, надмірності даних і " +"неузгодженості даних." + +#: ../../src/rdbms/normalization.txt:16 +msgid "" +"The main purpose of database normalization is to avoid complexities, " +"eliminate duplicates, and organize data in a consistent way. Normalization " +"reduces data redundancy and dependency, making the database more efficient, " +"flexible, and scalable. It also helps in maintaining data consistency and " +"accuracy, and ensures that updates and deletions are properly handled." +msgstr "" +"Нормалізація зменшує надлишковість даних і залежність, роблячи базу даних " +"більш ефективною, гнучкою та масштабованою. Це також допомагає підтримувати " +"узгодженість і точність даних, а також гарантує належну обробку оновлень і " +"видалень." + +#: ../../src/rdbms/normalization.txt:22 +msgid "" +"There are 6 + 3 **normal forms**, but this chapter focuses on the first 3 " +"only, since the commonest normal form you'll see out there is *3NF* (third " +"normal form)." +msgstr "" +"Існує 6 + 3 **нормальних форми**, але у цій главі ми розглянемо лише перші " +"3, оскільки найпоширенішою нормальною формою, яку ви побачите, є *3НФ* " +"(третя нормальна форма)." + +#: ../../src/rdbms/normalization.txt:26 +msgid "Normalized tables are:" +msgstr "Нормалізовані таблиці:" + +#: ../../src/rdbms/normalization.txt:28 +msgid "Easier to understand" +msgstr "Легше зрозуміти" + +#: ../../src/rdbms/normalization.txt:29 +msgid "Easier to enhance and extend" +msgstr "Легше вдосконалювати та розширювати" + +#: ../../src/rdbms/normalization.txt:30 +msgid "Protected from:" +msgstr "Захищені від:" + +#: ../../src/rdbms/normalization.txt:32 +msgid "insertion anomalies" +msgstr "аномалій вставки" + +#: ../../src/rdbms/normalization.txt:33 +msgid "update anomalies" +msgstr "аномалій оновлення" + +#: ../../src/rdbms/normalization.txt:34 +msgid "deletion anomalies" +msgstr "аномалій видалення" + +#: ../../src/rdbms/normalization.txt:37 +msgid "Anomalies" +msgstr "Аномалії" + +#: ../../src/rdbms/normalization.txt:40 +msgid "Insertion anomalies" +msgstr "Аномалії вставки" + +#: ../../src/rdbms/normalization.txt:42 +msgid "" +"There are circumstances in which certain facts cannot be recorded at all. " +"For example, each record in the \"Faculty and Their Courses\" relation might " +"contain a *Faculty ID*, *Faculty Name* and *Course Code*. Therefore, the " +"details of any faculty member who teaches at least one course can be " +"recorded, but a newly hired faculty member who has not yet been assigned to " +"teach any courses cannot be recorded, except by setting the course code to " +"``null``." +msgstr "" +"Існують обставини, за яких певні факти взагалі не можуть бути записані. " +"Наприклад, кожен запис у відношенні \"Викладачі та їхні курси\" може містити " +"*ідентифікатор викладача*, *ім'я викладача* та *код курсу*. Таким чином, " +"можна записати інформацію про будь-якого викладача, який викладає хоча б " +"один курс, але не можна записати інформацію про новоприйнятого викладача, " +"якому ще не було призначено викладання жодного курсу, окрім як встановивши " +"код курсу на ``нуль``." + +#: ../../src/rdbms/normalization.txt:50 ../../src/rdbms/normalization.txt:60 +msgid "Faculty ID" +msgstr "Faculty ID" + +#: ../../src/rdbms/normalization.txt:50 ../../src/rdbms/normalization.txt:60 +msgid "Faculty Name" +msgstr "Faculty Name" + +#: ../../src/rdbms/normalization.txt:50 ../../src/rdbms/normalization.txt:60 +msgid "Course Code" +msgstr "Course Code" + +#: ../../src/rdbms/normalization.txt:52 ../../src/rdbms/normalization.txt:62 +msgid "389" +msgstr "389" + +#: ../../src/rdbms/normalization.txt:52 +msgid "Dr. Headstrong" +msgstr "Dr. Headstrong" + +#: ../../src/rdbms/normalization.txt:52 +msgid "ENG-206" +msgstr "ENG-206" + +#: ../../src/rdbms/normalization.txt:54 ../../src/rdbms/normalization.txt:56 +msgid "407" +msgstr "407" + +#: ../../src/rdbms/normalization.txt:54 ../../src/rdbms/normalization.txt:56 +msgid "Dr. Mugwort" +msgstr "Dr. Mugwort" + +#: ../../src/rdbms/normalization.txt:54 +msgid "CMP-101" +msgstr "CMP-101" + +#: ../../src/rdbms/normalization.txt:56 +msgid "CMP-201" +msgstr "CMP-201" + +#: ../../src/rdbms/normalization.txt:62 +msgid "Dr. Newone" +msgstr "Dr. Newone" + +#: ../../src/rdbms/normalization.txt:62 +msgid "???" +msgstr "???" + +#: ../../src/rdbms/normalization.txt:66 +msgid "Update anomalies" +msgstr "Анамолії оновлення" + +#: ../../src/rdbms/normalization.txt:68 +msgid "" +"The same information can be expressed on multiple rows; therefore updates to " +"the relation may result in logical inconsistencies. For example, each record " +"in an \"Employees' Skills\" relation might contain ah *Employee ID*, " +"*Employee Address*, and *Skill*; thus a charge of address for a particular " +"employee may need to be applied to multiple records (one for each skill). If " +"the update is only partially successful -- the employee's address is updated " +"on some records but not others -- then the relation is left in an " +"inconsistent state. Specifically, the relation provides conflicting answers " +"to the question of what this particular employee's address is." +msgstr "" +"Одна й та сама інформація може бути виражена в декількох рядках, тому " +"оновлення відношення може призвести до логічної неузгодженості. Наприклад, " +"кожен запис у відношенні \"Навички працівників\" може містити ах " +"*Ідентифікатор працівника*, *Адреса працівника* та *Навичка*; таким чином, " +"може виникнути потреба в оновленні адреси для певного працівника в декількох " +"записах (по одному для кожної навички). Якщо оновлення відбувається лише " +"частково - адреса працівника оновлюється в одних записах, але не в інших - " +"то відношення залишається в неузгодженому стані. Зокрема, відношення надає " +"суперечливі відповіді на питання про те, якою є адреса конкретного " +"працівника." + +#: ../../src/rdbms/normalization.txt:79 +msgid "Employee ID" +msgstr "Employee ID" + +#: ../../src/rdbms/normalization.txt:79 +msgid "Employee Address" +msgstr "Employee Address" + +#: ../../src/rdbms/normalization.txt:79 +msgid "Skill" +msgstr "Skill" + +#: ../../src/rdbms/normalization.txt:81 ../../src/rdbms/normalization.txt:83 +msgid "426" +msgstr "426" + +#: ../../src/rdbms/normalization.txt:81 ../../src/rdbms/normalization.txt:83 +msgid "230 Parkland Crescent" +msgstr "230 Parkland Crescent" + +#: ../../src/rdbms/normalization.txt:81 +msgid "typing" +msgstr "typing" + +#: ../../src/rdbms/normalization.txt:83 +msgid "shorthand" +msgstr "shorthand" + +#: ../../src/rdbms/normalization.txt:85 ../../src/rdbms/normalization.txt:87 +msgid "529" +msgstr "529" + +#: ../../src/rdbms/normalization.txt:85 +msgid "158 Watkins Place" +msgstr "158 Watkins Place" + +#: ../../src/rdbms/normalization.txt:85 +msgid "public speaking" +msgstr "public speaking" + +#: ../../src/rdbms/normalization.txt:87 +msgid "108 Church Street" +msgstr "108 Church Street" + +#: ../../src/rdbms/normalization.txt:87 +msgid "carpentry" +msgstr "carpentry" + +#: ../../src/rdbms/normalization.txt:91 +msgid "Deletion anomalies" +msgstr "Аномалії видалення" + +#: ../../src/rdbms/normalization.txt:93 +msgid "" +"Under certain circumstances, the deletion of data representing certain facts " +"necessitates the deletion of data representing completely different facts. " +"The \"Faculty and Their Courses\" relation described in the previous example " +"suffers from this type of anomaly, for if a faculty member temporary ceases " +"to be assigned to any courses, the last of the records on which that faculty " +"member appears must be deleted, effectively also deleting the faculty " +"member, unless the *Course Code* field is set to ``null``." +msgstr "" +"За певних обставин видалення даних, що представляють певні факти, призводить " +"до видалення даних, що представляють зовсім інші факти. Відношення " +"\"Викладачі та їхні курси\", описане в попередньому прикладі, страждає від " +"цього типу аномалії, тому що якщо викладач тимчасово перестає бути " +"призначеним на будь-який курс, останній запис, в якому він з'являється, має " +"бути видалений, фактично видаляючи і самого викладача, якщо тільки поле *Код " +"курсу* не встановлено в ``нуль``." + +#: ../../src/rdbms/normalization.txt:102 +msgid "First normal form (1NF)" +msgstr "Перша нормальна форма (1NF)" + +#: ../../src/rdbms/normalization.txt:105 +msgid "Data example" +msgstr "Приклад даних" + +#: ../../src/rdbms/normalization.txt:106 +msgid "" +"The table below represents players and their characters inventory, ordered " +"by their characters' levels." +msgstr "" +"У таблиці нижче представлені гравці та інвентар їхніх персонажів, " +"впорядковані за рівнями персонажів." + +#: ../../src/rdbms/normalization.txt:110 ../../src/rdbms/normalization.txt:144 +#: ../../src/rdbms/normalization.txt:162 +msgid "username" +msgstr "username" + +#: ../../src/rdbms/normalization.txt:110 ../../src/rdbms/normalization.txt:144 +#: ../../src/rdbms/normalization.txt:162 +msgid "inventory" +msgstr "inventory" + +#: ../../src/rdbms/normalization.txt:112 ../../src/rdbms/normalization.txt:146 +#: ../../src/rdbms/normalization.txt:164 ../../src/rdbms/normalization.txt:180 +#: ../../src/rdbms/normalization.txt:182 ../../src/rdbms/normalization.txt:209 +#: ../../src/rdbms/normalization.txt:211 ../../src/rdbms/normalization.txt:266 +#: ../../src/rdbms/normalization.txt:278 ../../src/rdbms/normalization.txt:280 +#: ../../src/rdbms/normalization.txt:313 ../../src/rdbms/normalization.txt:364 +msgid "prombery87" +msgstr "prombery87" + +#: ../../src/rdbms/normalization.txt:112 ../../src/rdbms/normalization.txt:146 +#: ../../src/rdbms/normalization.txt:164 +msgid "2 amulets, 3 rings" +msgstr "2 амулети, 3 каблучки" + +#: ../../src/rdbms/normalization.txt:114 ../../src/rdbms/normalization.txt:148 +#: ../../src/rdbms/normalization.txt:166 ../../src/rdbms/normalization.txt:168 +#: ../../src/rdbms/normalization.txt:184 ../../src/rdbms/normalization.txt:186 +#: ../../src/rdbms/normalization.txt:188 ../../src/rdbms/normalization.txt:213 +#: ../../src/rdbms/normalization.txt:215 ../../src/rdbms/normalization.txt:217 +#: ../../src/rdbms/normalization.txt:268 ../../src/rdbms/normalization.txt:282 +#: ../../src/rdbms/normalization.txt:284 ../../src/rdbms/normalization.txt:286 +#: ../../src/rdbms/normalization.txt:315 ../../src/rdbms/normalization.txt:366 +msgid "wheed1997" +msgstr "wheed1997" + +#: ../../src/rdbms/normalization.txt:114 ../../src/rdbms/normalization.txt:148 +#: ../../src/rdbms/normalization.txt:166 ../../src/rdbms/normalization.txt:168 +msgid "18 copper coins, 1 bow, 5 arrows" +msgstr "18 мідних монет, 1 лук, 5 стріл" + +#: ../../src/rdbms/normalization.txt:116 ../../src/rdbms/normalization.txt:150 +#: ../../src/rdbms/normalization.txt:170 ../../src/rdbms/normalization.txt:190 +#: ../../src/rdbms/normalization.txt:192 ../../src/rdbms/normalization.txt:194 +#: ../../src/rdbms/normalization.txt:219 ../../src/rdbms/normalization.txt:221 +#: ../../src/rdbms/normalization.txt:223 ../../src/rdbms/normalization.txt:270 +#: ../../src/rdbms/normalization.txt:288 ../../src/rdbms/normalization.txt:290 +#: ../../src/rdbms/normalization.txt:292 ../../src/rdbms/normalization.txt:317 +#: ../../src/rdbms/normalization.txt:335 ../../src/rdbms/normalization.txt:368 +msgid "acen1999" +msgstr "acen1999" + +#: ../../src/rdbms/normalization.txt:116 ../../src/rdbms/normalization.txt:150 +#: ../../src/rdbms/normalization.txt:170 +msgid "1 sword, 1 shield, 4 rings" +msgstr "1 меч, 1 щит, 4 персні" + +#: ../../src/rdbms/normalization.txt:120 ../../src/rdbms/normalization.txt:230 +#: ../../src/rdbms/normalization.txt:339 +msgid "Requirements" +msgstr "Вимоги" + +#: ../../src/rdbms/normalization.txt:122 +msgid "Row order should not be used to convey information." +msgstr "Порядок рядків не повинен використовуватися для передачі інформації." + +#: ../../src/rdbms/normalization.txt:123 +msgid "" +"Data types should not be mixed within the same column (and the RDBMS won't " +"let you do in anyway)." +msgstr "" +"Типи даних не повинні змішуватися в одному стовпчику (і СУБД не дозволить " +"вам цього зробити в будь-якому випадку)." + +#: ../../src/rdbms/normalization.txt:125 +msgid "Tables should have their primary keys." +msgstr "Таблиці повинні мати первинні ключі." + +#: ../../src/rdbms/normalization.txt:126 +msgid "Repeating groups should be eliminated." +msgstr "Групи, що повторюються, мають бути виключені." + +#: ../../src/rdbms/normalization.txt:129 +msgid "Applying 1NF" +msgstr "Застосування 1NF" + +#: ../../src/rdbms/normalization.txt:131 +msgid "" +"First of all, using the rows order to represent the information violates " +"1NF. This can be easily fixed by adding additional column *level* to store " +"the info about the character's level. From this, the ordered sequences can " +"be fetched by using the query:" +msgstr "" +"Перш за все, використання порядку рядків для представлення інформації " +"порушує 1NF. Це можна легко виправити, додавши додатковий стовпець *level* " +"для зберігання інформації про рівень персонажа. Звідси впорядковані " +"послідовності можуть бути отримані за допомогою запиту:" + +#: ../../src/rdbms/normalization.txt:140 +msgid "" +"The second rule is **do not** mix data types within the same column. As " +"example, the characters' level might be described as follows:" +msgstr "" +"Друге правило - не змішувати типи даних в одному стовпчику. Наприклад, " +"рівень символів можна описати наступним чином:" + +#: ../../src/rdbms/normalization.txt:144 ../../src/rdbms/normalization.txt:162 +msgid "level" +msgstr "level" + +#: ../../src/rdbms/normalization.txt:146 ../../src/rdbms/normalization.txt:164 +#: ../../src/rdbms/normalization.txt:209 ../../src/rdbms/normalization.txt:211 +#: ../../src/rdbms/normalization.txt:266 ../../src/rdbms/normalization.txt:305 +#: ../../src/rdbms/normalization.txt:313 ../../src/rdbms/normalization.txt:364 +#: ../../src/rdbms/normalization.txt:376 +msgid "9" +msgstr "9" + +#: ../../src/rdbms/normalization.txt:148 +msgid "almost 8" +msgstr "almost 8" + +#: ../../src/rdbms/normalization.txt:150 +msgid "5.5" +msgstr "5.5" + +#: ../../src/rdbms/normalization.txt:153 +msgid "" +"The data types are mixed in *level* column, which violates 1NF; and " +"normally, RDBMS won't let you do this." +msgstr "" +"У стовпчику *level* змішано типи даних, що порушує 1NF; і зазвичай СУБД не " +"дозволяє цього робити." + +#: ../../src/rdbms/normalization.txt:156 +msgid "" +"The tables without a **primary key** violates 1NF as well. *username* field " +"may be used as **PK** for the players relation example. This would prevent " +"the data duplication, like having both ``wheed1997`` players at level 7 and " +"8 at the same time, which makes no sense." +msgstr "" +"Таблиці без **первинного ключа** також порушують 1NF. *поле username* можна " +"використовувати як **PK** для прикладу відношення гравців. Це запобігатиме " +"дублюванню даних, наприклад, наявності обох гравців ``wheed1997`` на 7 і 8 " +"рівнях одночасно, що не має сенсу." + +#: ../../src/rdbms/normalization.txt:166 ../../src/rdbms/normalization.txt:305 +#: ../../src/rdbms/normalization.txt:378 +msgid "8" +msgstr "8" + +#: ../../src/rdbms/normalization.txt:168 ../../src/rdbms/normalization.txt:305 +#: ../../src/rdbms/normalization.txt:380 +msgid "7" +msgstr "7" + +#: ../../src/rdbms/normalization.txt:170 ../../src/rdbms/normalization.txt:188 +#: ../../src/rdbms/normalization.txt:217 ../../src/rdbms/normalization.txt:286 +#: ../../src/rdbms/normalization.txt:305 ../../src/rdbms/normalization.txt:384 +msgid "5" +msgstr "5" + +#: ../../src/rdbms/normalization.txt:173 +msgid "" +"At last, *inventory* column contains repeating groups of data (also called " +"*non-atomic data*), which violates 1NF. To normalize the table, it should be " +"altered in a way, to represent only one inventory item per row." +msgstr "" +"Нарешті, стовпчик *інвентар* містить групи даних, що повторюються (також " +"звані *неатомними даними*), що порушує 1НФ. Щоб нормалізувати таблицю, її " +"слід змінити таким чином, щоб у кожному рядку було представлено лише одну " +"інвентарну одиницю." + +#: ../../src/rdbms/normalization.txt:178 ../../src/rdbms/normalization.txt:207 +#: ../../src/rdbms/normalization.txt:264 ../../src/rdbms/normalization.txt:276 +#: ../../src/rdbms/normalization.txt:311 ../../src/rdbms/normalization.txt:362 +msgid "player_id" +msgstr "player_id" + +#: ../../src/rdbms/normalization.txt:178 ../../src/rdbms/normalization.txt:207 +#: ../../src/rdbms/normalization.txt:276 +msgid "item_type" +msgstr "item_type" + +#: ../../src/rdbms/normalization.txt:178 ../../src/rdbms/normalization.txt:207 +#: ../../src/rdbms/normalization.txt:276 +msgid "item_quantity" +msgstr "item_quantity" + +#: ../../src/rdbms/normalization.txt:180 ../../src/rdbms/normalization.txt:209 +#: ../../src/rdbms/normalization.txt:278 +msgid "amulet" +msgstr "амулет" + +#: ../../src/rdbms/normalization.txt:180 ../../src/rdbms/normalization.txt:209 +#: ../../src/rdbms/normalization.txt:278 ../../src/rdbms/normalization.txt:305 +#: ../../src/rdbms/normalization.txt:390 +msgid "2" +msgstr "2" + +#: ../../src/rdbms/normalization.txt:182 ../../src/rdbms/normalization.txt:194 +#: ../../src/rdbms/normalization.txt:211 ../../src/rdbms/normalization.txt:223 +#: ../../src/rdbms/normalization.txt:280 ../../src/rdbms/normalization.txt:292 +msgid "ring" +msgstr "каблучка" + +#: ../../src/rdbms/normalization.txt:182 ../../src/rdbms/normalization.txt:211 +#: ../../src/rdbms/normalization.txt:219 ../../src/rdbms/normalization.txt:221 +#: ../../src/rdbms/normalization.txt:223 ../../src/rdbms/normalization.txt:270 +#: ../../src/rdbms/normalization.txt:280 ../../src/rdbms/normalization.txt:305 +#: ../../src/rdbms/normalization.txt:317 ../../src/rdbms/normalization.txt:368 +#: ../../src/rdbms/normalization.txt:388 +msgid "3" +msgstr "3" + +#: ../../src/rdbms/normalization.txt:184 ../../src/rdbms/normalization.txt:213 +#: ../../src/rdbms/normalization.txt:282 +msgid "copper coin" +msgstr "мідна монета" + +#: ../../src/rdbms/normalization.txt:184 ../../src/rdbms/normalization.txt:213 +#: ../../src/rdbms/normalization.txt:282 +msgid "18" +msgstr "18" + +#: ../../src/rdbms/normalization.txt:186 ../../src/rdbms/normalization.txt:215 +#: ../../src/rdbms/normalization.txt:284 +msgid "bow" +msgstr "лук" + +#: ../../src/rdbms/normalization.txt:186 ../../src/rdbms/normalization.txt:190 +#: ../../src/rdbms/normalization.txt:192 ../../src/rdbms/normalization.txt:215 +#: ../../src/rdbms/normalization.txt:219 ../../src/rdbms/normalization.txt:221 +#: ../../src/rdbms/normalization.txt:284 ../../src/rdbms/normalization.txt:288 +#: ../../src/rdbms/normalization.txt:290 ../../src/rdbms/normalization.txt:305 +#: ../../src/rdbms/normalization.txt:392 +msgid "1" +msgstr "1" + +#: ../../src/rdbms/normalization.txt:188 ../../src/rdbms/normalization.txt:217 +#: ../../src/rdbms/normalization.txt:286 +msgid "arrow" +msgstr "стріла" + +#: ../../src/rdbms/normalization.txt:190 ../../src/rdbms/normalization.txt:219 +#: ../../src/rdbms/normalization.txt:288 +msgid "sword" +msgstr "меч" + +#: ../../src/rdbms/normalization.txt:192 ../../src/rdbms/normalization.txt:221 +#: ../../src/rdbms/normalization.txt:290 +msgid "shield" +msgstr "щит" + +#: ../../src/rdbms/normalization.txt:194 ../../src/rdbms/normalization.txt:223 +#: ../../src/rdbms/normalization.txt:292 ../../src/rdbms/normalization.txt:305 +#: ../../src/rdbms/normalization.txt:335 ../../src/rdbms/normalization.txt:386 +msgid "4" +msgstr "4" + +#: ../../src/rdbms/normalization.txt:197 +msgid "" +"The primary key for this table is the combination of *player_id* and " +"*item_type* -- a composite primary key." +msgstr "" +"Первинним ключем для цієї таблиці є комбінація *player_id* та *item_type* - " +"складений первинний ключ." + +#: ../../src/rdbms/normalization.txt:201 +msgid "Second normal form (2NF)" +msgstr "Друга нормальна форма (2NF)" + +#: ../../src/rdbms/normalization.txt:203 +msgid "" +"Here, 2NF starts. For example, let's bring back *level* info to the table, " +"representing players and theirs inventory." +msgstr "" +"Тут починається 2NF. Наприклад, давайте повернемо до таблиці інформацію про " +"*рівень*, що представляє гравців та їхній інвентар." + +#: ../../src/rdbms/normalization.txt:207 ../../src/rdbms/normalization.txt:264 +#: ../../src/rdbms/normalization.txt:311 ../../src/rdbms/normalization.txt:362 +#: ../../src/rdbms/normalization.txt:374 +msgid "player_level" +msgstr "player_level" + +#: ../../src/rdbms/normalization.txt:213 ../../src/rdbms/normalization.txt:215 +#: ../../src/rdbms/normalization.txt:217 ../../src/rdbms/normalization.txt:268 +#: ../../src/rdbms/normalization.txt:305 ../../src/rdbms/normalization.txt:315 +#: ../../src/rdbms/normalization.txt:366 ../../src/rdbms/normalization.txt:382 +msgid "6" +msgstr "6" + +#: ../../src/rdbms/normalization.txt:226 +msgid "" +"The player's *level* should be duplicated for each row. This table design " +"keeps the doors open for **insertion**, **update** and **deletion** " +"anomalies." +msgstr "" +"Рівень гравця повинен дублюватися в кожному рядку. Такий дизайн таблиці " +"залишає двері відкритими для **вставки**, **оновлення** та **видалення** " +"аномалій." + +#: ../../src/rdbms/normalization.txt:232 +msgid "Each non-key attribute must depend on the entire primary key" +msgstr "Кожен неключовий атрибут повинен залежати від усього первинного ключа" + +#: ../../src/rdbms/normalization.txt:235 +msgid "Applying 2NF" +msgstr "Застосування 2NF" + +#: ../../src/rdbms/normalization.txt:237 +msgid "" +"The 2NF is all about \"how non-key columns related to the primary key\". The " +"example above has *non-key attributes* (which is another term for the \"non-" +"key columns\") are: *item_quantity* and *player_level*." +msgstr "" +"2NF - це все про те, \"як неключові стовпці пов'язані з первинним ключем\". " +"У наведеному вище прикладі *неключові атрибути* (що є іншим терміном для " +"\"неключових стовпців\") є: *item_quantity* та *player_level*." + +#: ../../src/rdbms/normalization.txt:241 +msgid "" +"The relations between the *primary key* and *non-key attributes* can be " +"described as:" +msgstr "" +"Відношення між *первинним ключем* та *неключовими атрибутами* можна описати " +"так:" + +#: ../../src/rdbms/normalization.txt:249 +msgid "" +"The *item_quantity* column depends on the *player_id* and *item_type* " +"columns, which creates a 1-to-1 dependency for this column on the entire " +"primary key. This means, there is no way to place different values in the " +"*item_quantity* column for the same primary key." +msgstr "" +"Стовпець *item_quantity* залежить від стовпців *player_id* і *item_type*, що " +"створює залежність 1 до 1 для цього стовпця від усього первинного ключа. Це " +"означає, що не існує способу розмістити різні значення у стовпці " +"*item_quantity* для одного первинного ключа." + +#: ../../src/rdbms/normalization.txt:254 +msgid "" +"But, the *player_level* column depends on the *player_id* only. It's a " +"problem, because the *player_id* is not the primary key, but a part of a " +"primary key. This violates the 2NF, and what's why the table is vulnerable " +"to the problems." +msgstr "" +"Але стовпець *player_level* залежить тільки від *player_id*. Це проблема, " +"тому що *player_id* не є первинним ключем, але є частиною первинного ключа. " +"Це порушує 2НФ, і саме тому таблиця вразлива до проблем." + +#: ../../src/rdbms/normalization.txt:258 +msgid "" +"The **player** is the important concept for representing the data. So, it's " +"the best solution to store player related data in a separate table." +msgstr "" +"Важливим поняттям для представлення даних є **гравець**. Тому найкращим " +"рішенням буде зберігати дані, пов'язані з гравцями, в окремій таблиці." + +#: ../../src/rdbms/normalization.txt:261 ../../src/rdbms/normalization.txt:308 +#: ../../src/rdbms/normalization.txt:359 +msgid "player" +msgstr "player" + +#: ../../src/rdbms/normalization.txt:273 +msgid "player_inventory" +msgstr "player_inventory" + +#: ../../src/rdbms/normalization.txt:296 +msgid "Third normal form (3NF)" +msgstr "3-тя нормальна форма (3NF)" + +#: ../../src/rdbms/normalization.txt:298 +msgid "" +"Let's assume, the player table is extended with the *player_rating* column, " +"which describes the players' skills as \"beginner\", \"intermediate\", or " +"\"advanced\". And let's assume, the skills are arranged in some like:" +msgstr "" +"Припустимо, таблиця гравців доповнена стовпчиком *рейтинг гравця*, який " +"описує навички гравців як \"початківець\", \"середній\" або \"просунутий\". " +"І припустимо, що навички впорядковані за типом \"like\":" + +#: ../../src/rdbms/normalization.txt:303 +msgid "Skill Level" +msgstr "Skill Level" + +#: ../../src/rdbms/normalization.txt:303 +msgid "Beginner" +msgstr "Beginner" + +#: ../../src/rdbms/normalization.txt:303 +msgid "Intermediate" +msgstr "Intermediate" + +#: ../../src/rdbms/normalization.txt:303 +msgid "Advanced" +msgstr "Advanced" + +#: ../../src/rdbms/normalization.txt:305 +msgid "Player Level" +msgstr "Player Level" + +#: ../../src/rdbms/normalization.txt:311 ../../src/rdbms/normalization.txt:374 +msgid "player_rating" +msgstr "player_rating" + +#: ../../src/rdbms/normalization.txt:313 ../../src/rdbms/normalization.txt:376 +#: ../../src/rdbms/normalization.txt:378 ../../src/rdbms/normalization.txt:380 +msgid "advanced" +msgstr "advanced" + +#: ../../src/rdbms/normalization.txt:315 ../../src/rdbms/normalization.txt:382 +#: ../../src/rdbms/normalization.txt:384 ../../src/rdbms/normalization.txt:386 +msgid "intermediate" +msgstr "intermediate" + +#: ../../src/rdbms/normalization.txt:317 ../../src/rdbms/normalization.txt:335 +#: ../../src/rdbms/normalization.txt:388 ../../src/rdbms/normalization.txt:390 +#: ../../src/rdbms/normalization.txt:392 +msgid "beginner" +msgstr "beginner" + +#: ../../src/rdbms/normalization.txt:320 +msgid "The *non-key attributes* dependencies can be described as follows:" +msgstr "Залежності *неключових атрибутів* можна описати наступним чином:" + +#: ../../src/rdbms/normalization.txt:327 +msgid "" +"The *player_rating* does not depend on the primary key, but it depends on " +"the *player_level* attribute, which is dependent on the primary key. These " +"type of dependencies is called **transitive dependency**. Having these in a " +"table opens a way for having data in an inconsistent form. E.g. let's assume " +"player \"acen1999\" have increase their level to 4, but something went " +"wrong, and *player_rating* has not been updated." +msgstr "" +"Атрибут *рейтинг_гравця* не залежить від первинного ключа, але залежить від " +"атрибута *рівень_гравця*, який залежить від первинного ключа. Цей тип " +"залежностей називається **транзитивною залежністю**. Наявність таких " +"залежностей у таблиці відкриває шлях до отримання даних у непослідовній " +"формі. Наприклад, припустимо, що гравець \"acen1999\" підвищив свій рівень " +"до 4, але щось пішло не так, і *рейтинг_гравця* не було оновлено." + +#: ../../src/rdbms/normalization.txt:341 +msgid "" +"Every non-key attribute in a table should depend on the key, the whole key, " +"and nothing but the key (no transitive dependency)." +msgstr "" +"Кожен неключовий атрибут у таблиці повинен залежати від ключа, всього ключа " +"і ні від чого, крім ключа (без транзитивної залежності)." + +#: ../../src/rdbms/normalization.txt:346 +msgid "**Boyce-Codd normal form**" +msgstr "**Нормальна форма Бойса-Кодда**" + +#: ../../src/rdbms/normalization.txt:348 +msgid "" +":abbr:`BCNF (Boyce-Codd Normal Form)` is the stronger version of 3NF. It " +"also is called as 3.5NF (three-and-a-half normal form)." +msgstr "" +":abbr:`BCNF (нормальна форма Бойса-Кодда)` - це сильніша версія 3NF. Її також " +"називають 3.5NF (третя з половиною нормальна форма)." + +#: ../../src/rdbms/normalization.txt:351 +msgid "" +"**Every attribute** in a table should depend on the key, the whole key, and " +"nothing but the key." +msgstr "" +"**Кожен атрибут** у таблиці повинен залежати від ключа, всього ключа і ні " +"від чого, крім ключа." + +#: ../../src/rdbms/normalization.txt:355 +msgid "Applying 3NF" +msgstr "Застосування 3NF" + +#: ../../src/rdbms/normalization.txt:357 +msgid "Introducing the \"player_rating_levels\" will fix the problem." +msgstr "Використання таблиці \"player_rating_levels\" вирішить цю проблему." + +#: ../../src/rdbms/normalization.txt:371 +msgid "player_rating_levels" +msgstr "player_rating_levels" + +#: ../../src/rdbms/normalization.txt:396 +msgid "Conclusion" +msgstr "Висновок" + +#: ../../src/rdbms/normalization.txt:398 +msgid "" +"Each next normal form includes all the requirements for the previous one." +msgstr "Кожна наступна нормальна форма включає всі вимоги до попередньої." + +#: ../../src/rdbms/normalization.txt:400 +msgid "" +"Following the rules above will lead you to having a fully normalized tables " +"in 99% of time." +msgstr "" +"Дотримуючись наведених вище правил, ви отримаєте повністю нормалізовані " +"таблиці у 99% випадків." diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/query.po b/src/_locales/uk/LC_MESSAGES/rdbms/query.po new file mode 100644 index 000000000..79f1f1430 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/query.po @@ -0,0 +1,1055 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2024.03.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-03-05 14:17+0200\n" +"PO-Revision-Date: 2024-03-05 16:26+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.14.0\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/rdbms/query.txt:-1 +msgid "Query data from database" +msgstr "Запит даних з бази даних" + +#: ../../src/rdbms/query.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/rdbms/query.txt:-1 +msgid "sql, db, database, query, select, fetch" +msgstr "sql, db, database, query, select, fetch" + +#: ../../src/rdbms/query.txt:8 +msgid "Querying data" +msgstr "Запит даних" + +#: ../../src/rdbms/query.txt:10 +msgid "" +"The process of retrieving or the command to retrieve data from a database is " +"called a *query*. In SQL the ``SELECT`` command is used to specify queries." +msgstr "" +"Процес отримання або команда для отримання даних з бази даних називається " +"*запит*. У мові SQL для визначення запитів використовується команда " +"``SELECT``." + +#: ../../src/rdbms/query.txt:13 +msgid "" +"``SELECT`` retrieves rows from zero or more tables. The general processing " +"of ``SELECT`` is as follows:" +msgstr "" +"``SELECT`` вибирає рядки з нуля або більше таблиць. Загальна обробка " +"``SELECT`` відбувається наступним чином:" + +#: ../../src/rdbms/query.txt:16 +msgid "" +"All queries in the ``WITH`` list are computed. This effectively serve as " +"temporary tables that can be referenced in the ``FROM`` list." +msgstr "" +"Всі запити у списку ``WITH`` обчислюються. Це фактично слугує тимчасовими " +"таблицями, на які можна посилатися у списку ``FROM``." + +#: ../../src/rdbms/query.txt:19 +msgid "" +"All elements in the ``FROM`` list are computed. If more than one element is " +"specified in the ``FROM`` list, they are cross-joined together." +msgstr "" +"Обчислюються всі елементи списку ``FROM``. Якщо у списку ``FROM`` вказано " +"більше одного елемента, вони об'єднуються разом." + +#: ../../src/rdbms/query.txt:21 +msgid "" +"If ``WHERE`` clause is specified, all rows that do not satisfy the condition " +"are eliminated from the output." +msgstr "" +"Якщо вказано оператор ``WHERE``, то всі рядки, які не задовольняють умові, " +"вилучаються з виводу." + +#: ../../src/rdbms/query.txt:23 +msgid "" +"If the ``GROUP BY`` clause is specified, or if there are aggregate function " +"calls, the output is combined into groups of rows that match on one or more " +"values, and the result of aggregate functions are computed. If the " +"``HAVING`` clause is present, it eliminates groups that does not satisfy the " +"given condition." +msgstr "" +"Якщо вказано речення ``GROUP BY`` або якщо є виклики агрегатних функцій, то " +"вихідні дані об'єднуються в групи рядків, які збігаються за одним або " +"декількома значеннями, і обчислюються результати агрегатних функцій. Якщо " +"присутній оператор ``HAVING``, то вилучаються групи, які не задовольняють " +"заданій умові." + +#: ../../src/rdbms/query.txt:28 +msgid "" +"The actual output rows are computed using the ``SELECT`` output expressions " +"for each row or row of group." +msgstr "" +"Фактичні вихідні рядки обчислюються за допомогою виразів ``SELECT`` для " +"кожного рядка або рядка групи." + +#: ../../src/rdbms/query.txt:30 +msgid "" +"``SELECT DISTINCT`` eliminates duplicate rows from the result. ``SELECT " +"DISTINCT ON`` eliminates rows that match on all the specified expressions." +msgstr "" +"``SELECT DISTINCT`` видаляє повторювані рядки з результату. ``SELECT " +"DISTINCT ON`` вилучає рядки, які збігаються за всіма вказаними виразами." + +#: ../../src/rdbms/query.txt:33 +msgid "" +"Using the operators ``UNION``, ``INTERSECT``, and ``EXCEPT``, the output of " +"more than one ``SELECT`` statement can be combined to form a single result " +"set." +msgstr "" +"За допомогою операторів ``UNION``, ``INTERSECT`` і ``EXCEPT`` можна " +"об'єднати результати виконання кількох інструкцій ``SELECT``, щоб сформувати " +"єдиний набір результатів." + +#: ../../src/rdbms/query.txt:37 +msgid "" +"The ``UNION`` operator returns **all** rows that are in one or both result " +"sets." +msgstr "" +"Оператор ``UNION`` повертає **всі** рядки, які є в одному або обох наборах " +"результатів." + +#: ../../src/rdbms/query.txt:39 +msgid "" +"The ``INTERSECT`` operator returns all rows that are strictly in both result " +"sets." +msgstr "" +"Оператор ``INTERSECT`` повертає всі рядки, які строго знаходяться в обох " +"наборах результатів." + +#: ../../src/rdbms/query.txt:41 +msgid "" +"The ``EXCEPT`` operator returns the rows that are in the first result set, " +"but not in the second." +msgstr "" +"Оператор ``EXCEPT`` повертає рядки, які є в першому наборі результатів, але " +"відсутні в другому." + +#: ../../src/rdbms/query.txt:44 +msgid "" +"If the ``ORDER BY`` clause is specified, the returned rows are sorted in the " +"specific order." +msgstr "" +"Якщо вказано параметр ``ORDER BY``, повернуті рядки буде відсортовано у " +"певному порядку." + +#: ../../src/rdbms/query.txt:46 +msgid "" +"if the ``LIMIT`` or ``OFFSET`` clause is specified, the ``SELECT`` statement " +"only returns a subset of the result rows." +msgstr "" +"якщо вказано оператор ``LIMIT`` або ``OFFSET``, то інструкція ``SELECT`` " +"повертає лише підмножину рядків результату." + +#: ../../src/rdbms/query.txt:48 +msgid "" +"If ``FOR UPDATE``, ``FOR NO KEY UPDATE``, ``FOR SHARE`` or ``FOR KEY SHARE`` " +"is specified, the ``SELECT`` statement locks the selected rows against " +"concurrent updates." +msgstr "" +"Якщо вказано ``FOR UPDATE``, ``FOR NO KEY UPDATE``, ``FOR SHARE`` або ``FOR " +"KEY SHARE``, оператор ``SELECT`` блокує вибрані рядки від одночасного " +"оновлення." + +#: ../../src/rdbms/query.txt:57 +msgid "Select rows from a table" +msgstr "Виберіть рядки з таблиці" + +#: ../../src/rdbms/query.txt:59 +msgid "A simple kind of query has the form:" +msgstr "Простий вид запиту має вигляд:" + +#: ../../src/rdbms/query.txt:65 +msgid "" +"This command would retrieve all rows and all user-defined columns from " +"``publisher`` table. A select list can also select a subset of the available " +"columns or make calculations using the columns." +msgstr "" +"Ця команда вилучить усі рядки і всі визначені користувачем стовпці з таблиці " +"``publisher``. Список вибору може також вибирати підмножину доступних " +"стовпців або виконувати обчислення за цими стовпцями." + +#: ../../src/rdbms/query.txt:74 +msgid "" +"``FROM`` clause is a simple kind of table expression: it reads just one " +"table. In general, table expression can be complex constructs of base " +"tables, joins and sub-queries. But it is possible to omit the table " +"expression entirely and use the ``SELECT`` command as a calculator (or in " +"some another way):" +msgstr "" +"речення ``FROM`` є простим різновидом табличного виразу: воно зчитує лише " +"одну таблицю. Взагалі, табличний вираз може бути складною конструкцією з " +"базових таблиць, з'єднань і підзапитів. Але можна взагалі не використовувати " +"табличний вираз і використовувати команду ``SELECT`` як калькулятор (або в " +"інший спосіб):" + +#: ../../src/rdbms/query.txt:83 +msgid "" +"The ``FROM`` clause derives a table from one or more other tables given in a " +"comma-separated table reference list. A table reference can a table name, or " +"derived table such as sub-query, a ``JOIN`` construct, or complex " +"combinations of these. If more than one table reference is listed in the " +"``FROM`` clause, the table are cross-joined. The result of the ``FROM`` list " +"is an intermediate virtual table which can then be subject to " +"transformations by the ``WHERE``, ``GROUP BY``, and ``HAVING`` clauses and " +"is finally the result of the overall table expression." +msgstr "" +"Речення ``FROM`` виводить таблицю з однієї або кількох інших таблиць, " +"наведених у списку посилань на таблиці, розділених комами. Посилання на " +"таблицю може бути ім'ям таблиці або похідною таблицею, наприклад, " +"підзапитом, конструкцією ``JOIN`` або їх складними комбінаціями. Якщо в " +"реченні ``FROM`` вказано більше одного посилання на таблицю, то таблиці " +"з'єднуються перехресним зв'язком. Результатом списку ``FROM`` є проміжна " +"віртуальна таблиця, яка потім може бути піддана перетворенням за допомогою " +"речень ``WHERE``, ``GROUP BY`` і ``HAVING`` і, нарешті, є результатом " +"загального табличного виразу." + +#: ../../src/rdbms/query.txt:93 +msgid "Search conditions" +msgstr "Умови пошуку" + +#: ../../src/rdbms/query.txt:95 +msgid "" +"After the processing of the ``FROM`` clause is done, each row of the derived " +"virtual table can be checked against the search condition. If the result of " +"the condition is ``true``, the row is kept in the output table, otherwise it " +"is discarded. The ``WHERE`` clause is used to handle search condition checks." +msgstr "" +"Після обробки оператора ``FROM`` кожен рядок отриманої віртуальної таблиці " +"може бути перевірений на відповідність умові пошуку. Якщо результат умови " +"рівний ``true``, то рядок зберігається у вихідній таблиці, інакше він " +"відкидається. Для перевірки умови пошуку використовується оператор `WHERE`." + +#: ../../src/rdbms/query.txt:100 +msgid "Here are some examples of ``WHERE`` clause:" +msgstr "Ось кілька прикладів речення ``WHERE``:" + +#: ../../src/rdbms/query.txt:102 +msgid "WHERE clause usage examples" +msgstr "Приклади використання речення WHERE" + +#: ../../src/rdbms/query.txt:124 +msgid "Grouping data" +msgstr "Дані для групування" + +#: ../../src/rdbms/query.txt:126 +msgid "" +"After passing the ``WHERE`` filter, the derived input table might be subject " +"to grouping, using ``GROUP BY`` clause, and elimination of group rows using " +"the ``HAVING`` clause. The ``GROUP BY`` clause is used to group together " +"those rows in a table that have the same values in all the columns listed. " +"The order in the columns are listed does not matter. The effect is to " +"combine each set of rows having common values into one group row that " +"represents all rows in the group. This is done to eliminate redundancy in " +"the output and/or compute aggregates that apply to these groups." +msgstr "" +"Після проходження фільтра ``WHERE`` отримана таблиця може бути згрупована за " +"допомогою речення ``GROUP BY`` і видалена з групи рядків за допомогою " +"речення ``HAVING``. Речення ``GROUP BY`` використовується для групування тих " +"рядків таблиці, які мають однакові значення у всіх перелічених стовпчиках. " +"Порядок перерахування стовпчиків не має значення. Ефект полягає в об'єднанні " +"кожного набору рядків зі спільними значеннями в один груповий рядок, який " +"представляє всі рядки в групі. Це робиться для того, щоб усунути надмірність " +"у вихідних даних та/або обчислювальних агрегатах, які застосовуються до цих " +"груп." + +#: ../../src/rdbms/query.txt:136 +msgid "Select lists" +msgstr "Виберіть списки" + +#: ../../src/rdbms/query.txt:138 +msgid "" +"As shown is the previous section, the table expression in the ``SELECT`` " +"command constructs an intermediate virtual table by possibly combining " +"tables, views, eliminating rows, grouping etc. This table is finally passed " +"on to processing by the *select list*. The select list determines which " +"*columns* of the intermediate table are actually output." +msgstr "" +"Як показано у попередньому розділі, вираз table у команді ``SELECT`` створює " +"проміжну віртуальну таблицю шляхом можливого об'єднання таблиць, " +"представлень, вилучення рядків, групування тощо. Ця таблиця нарешті " +"передається для обробки за допомогою *списку вибору*. Список вибору " +"визначає, які саме *стовпці* проміжної таблиці буде виведено на екран." + +#: ../../src/rdbms/query.txt:145 +msgid "Select list items" +msgstr "Вибір елементів списку" + +#: ../../src/rdbms/query.txt:147 +msgid "" +"The simplest kind of select is ``*`` which emits that the table expression " +"produces. Otherwise, a select list is a comma-separated list of value " +"expressions. For instance:" +msgstr "" +"Найпростішим видом вибору є ``*``, який виводить те, що створює табличний " +"вираз. Інакше, список вибору - це список виразів значень, розділених комами. " +"Наприклад:" + +#: ../../src/rdbms/query.txt:157 +msgid "Columns labels" +msgstr "Мітки стовпців" + +#: ../../src/rdbms/query.txt:159 +msgid "" +"The entries listed in the select list can be assigned names for subsequent " +"processing." +msgstr "" +"Записам, переліченим у списку вибору, можна присвоїти імена для подальшої " +"обробки." + +#: ../../src/rdbms/query.txt:166 +msgid "" +"If no output column name is specified using ``AS``, the system will assign " +"a default column name. For simple column references, this is the name of the " +"referenced column. For function calls, this is the name of the function. For " +"complex expressions, the system will generate a generic name." +msgstr "" +"Якщо за допомогою ``AS`` не вказано назву вихідного стовпця, система " +"призначить назву стовпця за замовчуванням. Для простих посилань на стовпці - " +"це ім'я стовпця, на який є посилання. Для викликів функцій - це назва " +"функції. Для складних виразів система згенерує загальну назву." + +#: ../../src/rdbms/query.txt:173 +msgid "Labels are often referenced as \"aliases\"." +msgstr "Мітки часто називають \"псевдонімами\"." + +#: ../../src/rdbms/query.txt:176 +msgid "DISTINCT" +msgstr "DISTINCT" + +#: ../../src/rdbms/query.txt:178 +msgid "" +"After the select list has been processed, the result table can optionally be " +"subject to the elimination of duplicate rows. The ``DISTINCT`` key word is " +"written directly after ``SELECT`` to specify this:" +msgstr "" +"Після обробки списку вибірки таблиця результатів може бути піддана вилученню " +"рядків, що повторюються. Для цього безпосередньо після команди ``SELECT`` " +"записується ключове слово ``DISTINCT``:" + +#: ../../src/rdbms/query.txt:186 +msgid "" +"Obviously, two rows are considered distinct if they differ in at least one " +"column value. Null values are considered equal in comparison. Alternatively, " +"an arbitrary expression can determine what rows are to be considered " +"distinct." +msgstr "" +"Очевидно, що два рядки вважаються різними, якщо вони відрізняються принаймні " +"в одному стовпчику. Нульові значення вважаються рівними при порівнянні. Крім " +"того, довільний вираз може визначати, які рядки вважати різними." + +#: ../../src/rdbms/query.txt:195 +msgid "Sorting rows" +msgstr "Сортування рядків" + +#: ../../src/rdbms/query.txt:197 +msgid "" +"After a query has produced an output table it can optionally be sorted. If " +"sorting is not chosen, the rows will be returned in an unspecified order. " +"The actual order in this case will depend on the scan and join plan types " +"and the order on disk, but it must not be relied on." +msgstr "" +"Після того, як запит створив вихідну таблицю, її можна відсортувати за " +"бажанням. Якщо сортування не вибрано, рядки будуть повернуті в невизначеному " +"порядку. Фактичний порядок у цьому випадку залежатиме від типів планів " +"сканування та об'єднання, а також порядку на диску, але на нього не можна " +"покладатися." + +#: ../../src/rdbms/query.txt:202 +msgid "The ``ORDER BY`` clause specifies the sort order:" +msgstr "Речення ``ORDER BY`` задає порядок сортування:" + +#: ../../src/rdbms/query.txt:208 +msgid "" +"The sort expression(s) can be any expression that would be valid in the " +"query's select list." +msgstr "" +"Вираз(и) сортування може бути будь-яким виразом, який буде допустимим у " +"списку вибору запиту." + +#: ../../src/rdbms/query.txt:211 +msgid "" +"When more than one expression is specified, the later values are used to " +"sort rows that are equal according to the earlier values. Each expression " +"can be followed by an option ``ASC`` or ``DESC`` keyword to set the sort " +"direction to ascending or descending. ``ASC`` order is the default." +msgstr "" +"Якщо вказано більше одного виразу, пізніші значення використовуються для " +"сортування рядків, які є рівними за попередніми значеннями. Кожен вираз може " +"супроводжуватися ключовим словом ``ASC`` або ``DESC`` для встановлення " +"напрямку сортування за зростанням або спаданням. за замовчуванням " +"використовується порядок ``ASC``." + +#: ../../src/rdbms/query.txt:216 +msgid "" +"The ``NULL FIRST`` and ``NULL LAST`` options can be used to determine " +"whether null appear before or after non-null values in the sort ordering. By " +"default, null values sort as if larger than any non-null value; that's, " +"``NULL FIRST`` is the default for ``DESC`` order, and ``NULL LAST`` " +"otherwise." +msgstr "" +"Опції ``NULL FIRST`` та ``NULL LAST`` можна використовувати для визначення " +"того, чи з'являтимуться нулі до або після ненульових значень у порядку " +"сортування. За замовчуванням, нульові значення сортуються так, ніби вони " +"більші за будь-яке ненульове значення; тобто ``NULL FIRST`` за замовчуванням " +"для порядку ``DESC``, а ``NULL LAST`` в іншому випадку." + +#: ../../src/rdbms/query.txt:221 +msgid "" +"Note that the ordering options are considered independently for each sort " +"column. For example ``ORDER BY x, y DESC`` means ``ORDER BY x ASC, y DESC``, " +"which is not the same as ``ORDER BY x DESC, y DESC``." +msgstr "" +"Зверніть увагу, що варіанти впорядкування розглядаються незалежно для " +"кожного стовпця сортування. Наприклад, ``ORDER BY x, y DESC`` означає " +"``ORDER BY x ASC, y DESC``, що не те саме, що ``ORDER BY x DESC, y DESC``." + +#: ../../src/rdbms/query.txt:225 +msgid "" +"A sort expression can also be the column label or number of an output column." +msgstr "" +"Вираз сортування також може бути міткою стовпця або номером вихідного " +"стовпця." + +#: ../../src/rdbms/query.txt:227 +msgid "" +"``ORDER BY`` can be applied to the result of a ``UNION``, ``INTERSECT``, or " +"``EXCEPT`` combination, but in this case it is only permitted to sort by " +"output column names or numbers, not by expressions." +msgstr "" +"оператор ``ORDER BY`` можна застосувати до результату комбінації ``UNION``, " +"``INTERSECT`` або ``EXCEPT``, але в цьому випадку дозволяється сортування " +"лише за іменами або номерами вихідних стовпців, а не за виразами." + +#: ../../src/rdbms/query.txt:232 +msgid "Limit and Offset" +msgstr "Ліміт і зміщення" + +#: ../../src/rdbms/query.txt:234 +msgid "" +"``LIMIT`` and ``OFFSET`` allow you to retrieve just a portion of the rows " +"that are generated by the rest of the query." +msgstr "" +"``LIMIT`` і ``OFFSET`` дозволяють вам отримати лише частину рядків, " +"згенерованих рештою запиту." + +#: ../../src/rdbms/query.txt:241 +msgid "" +"The query above fetches only first 10 rows from the \"publisher\" table." +msgstr "" +"Наведений вище запит витягує лише перші 10 рядків з таблиці \"publisher\"." + +#: ../../src/rdbms/query.txt:243 +msgid "" +"If a limit count is given, no more than that many rows will be returned. But " +"possibly fewer, if the query itself yields fewer rows. ``LIMIT ALL`` is the " +"same as omitting the ``LIMIT`` clause, as is ``LIMIT`` with ``NULL`` " +"argument." +msgstr "" +"Якщо вказано граничну кількість рядків, буде повернуто не більше цієї " +"кількості. Але, можливо, і менше, якщо сам запит повертає менше рядків. " +"``LIMIT ALL`` - це те саме, що опустити пункт ``LIMIT``, так само як і " +"``LIMIT`` з аргументом ``NULL``." + +#: ../../src/rdbms/query.txt:248 +msgid "" +"``OFFSET`` says to skip that many rows before beginning to return rows. " +"``OFFSET 0`` is the same as omitting the ``OFFSET`` clause, as is ``OFFSET`` " +"with a ``NULL`` argument." +msgstr "" +"``OFFSET`` вказує пропустити стільки-то рядків перед початком повернення " +"рядків. ``OFFSET 0`` - це те саме, що опустити вираз ``OFFSET``, так само як " +"і ``OFFSET`` з аргументом ``NULL``." + +#: ../../src/rdbms/query.txt:256 +msgid "The query above fetches 10 publishers starting from the 11-th one." +msgstr "Наведений вище запит показує 10 видавництв, починаючи з 11-го." + +#: ../../src/rdbms/query.txt:258 +msgid "" +"When using ``LIMIT`` and/or ``OFFSET``, it's important to use ``ORDER BY`` " +"clause that constraints the result rows into a unique order. Otherwise you " +"will get an unpredictable subset of the query's rows." +msgstr "" +"При використанні ``LIMIT`` та/або ``OFFSET`` важливо використовувати речення " +"``ORDER BY``, яке обмежує рядки результатів в унікальному порядку. Інакше ви " +"отримаєте непередбачувану підмножину рядків запиту." + +#: ../../src/rdbms/query.txt:263 +msgid "WITH queries" +msgstr "WITH" + +#: ../../src/rdbms/query.txt:265 +msgid "" +"``WITH`` provides a way to write auxiliary statements for use in a larger " +"query. These statements, which are often referred to as :abbr:`CTE (Common " +"Table Expression)`, can be thought of as defining temporary tables that " +"exist just for one query. Each auxiliary statement in a ``WITH`` clause can " +"be a ``SELECT``, ``INSERT``, ``UPDATE`` or ``DELETE``; and the ``WITH`` " +"clause itself is attached to a primary statement that can be a ``SELECT``, " +"``INSERT``, ``UPDATE``, ``DELETE`` or ``MERGE``." +msgstr "" +"Команда ``WITH`` надає можливість писати допоміжні оператори для " +"використання у великих запитах. Ці оператори, які часто називають :abbr:`CTE " +"(Common Table Expression)`, можна розглядати як визначення тимчасових " +"таблиць, які існують лише для одного запиту. Кожен допоміжний оператор у " +"реченні ``WITH`` може бути оператором ``SELECT``, ``INSERT``, ``UPDATE`` або " +"``DELETE``; а саме речення ``WITH`` приєднується до основного оператора, " +"який може бути оператором ``SELECT``, ``INSERT``, ``UPDATE``, ``DELETE`` або " +"``MERGE``." + +#: ../../src/rdbms/query.txt:274 +msgid "Select in WITH" +msgstr "Вибірка у WITH" + +#: ../../src/rdbms/query.txt:276 +msgid "" +"The basic value of ``SELECT`` in ``WITH`` is to break down complicated " +"queries into simpler parts." +msgstr "" +"Основне значення ``SELECT`` у ``WITH`` полягає в тому, щоб розбивати складні " +"запити на простіші частини." + +#: ../../src/rdbms/query.txt:279 +msgid "Get most profitable months" +msgstr "Отримайте найприбутковіші місяці" + +#: ../../src/rdbms/query.txt:295 +msgid "Recursive queries" +msgstr "Рекурсивні запити" + +#: ../../src/rdbms/query.txt:297 +msgid "" +"The optional ``RECURSIVE`` modifier changes WITH from a mere syntactic " +"convenience into a feature that accomplishes things not otherwise possible " +"in standard SQL. Using ``RECURSIVE``, a ``WITH`` query can refer to its own " +"output." +msgstr "" +"Додатковий модифікатор ``RECURSIVE`` перетворює WITH з простої синтаксичної " +"зручності на функцію, яка виконує речі, неможливі у стандартному SQL. " +"Використовуючи ``RECURSIVE``, запит ``WITH`` може посилатися на свій власний " +"вивід." + +#: ../../src/rdbms/query.txt:302 +msgid "Sum of first 10 numbers starting from 1" +msgstr "Сума перших 10 чисел, починаючи з 1" + +#: ../../src/rdbms/query.txt:311 +msgid "" +"When working with recursive queries it is important to be sure that the " +"recursive part of the query will eventually return no tuple, or else the " +"query will loop indefinitely." +msgstr "" +"При роботі з рекурсивними запитами важливо бути впевненим, що рекурсивна " +"частина запиту в кінцевому підсумку не поверне жодного кортежу, інакше запит " +"зациклиться на невизначений час." + +#: ../../src/rdbms/query.txt:316 +msgid "Data modifying statements in WITH" +msgstr "Оператори, що модифікують дані в операторі WITH" + +#: ../../src/rdbms/query.txt:318 +msgid "" +"You can use most data-modifying statements (``INSERT``, ``UPDATE``, " +"``DELETE``) in ``WITH``. This allows you to perform several different " +"operations at a time, in the same query." +msgstr "" +"Ви можете використовувати більшість операторів модифікації даних " +"(``INSERT``, ``UPDATE``, ``DELETE``) в ``WITH``. Це дозволяє виконувати " +"кілька різних операцій одночасно в одному запиті." + +#: ../../src/rdbms/query.txt:322 +msgid "Remove old revenue records and store them into history table" +msgstr "Видаліть старі записи про доходи та збережіть їх у таблиці історії" + +#: ../../src/rdbms/query.txt:335 +msgid "Combining queries" +msgstr "Об'єднання запитів" + +#: ../../src/rdbms/query.txt:337 +msgid "" +"The results of two queries can be combined using the set operations union, " +"intersection, and difference." +msgstr "" +"Результати двох запитів можна об'єднати за допомогою операцій об'єднання, " +"перетину та різниці." + +#: ../../src/rdbms/query.txt:346 +msgid "" +"``UNION`` effectively appends the result of ``query2`` to the result of " +"``query1`` (although there is no guarantee that this is the order in which " +"the rows are actually returned). Furthermore, it eliminates duplicate rows " +"from its result, in the same way as ``DISTINCT``, unless ``UNION ALL`` is " +"used." +msgstr "" +"``UNION`` ефективно додає результат ``query2`` до результату ``query1`` " +"(хоча немає жодних гарантій, що це саме той порядок, в якому повертаються " +"рядки). Крім того, вона вилучає з результату повторювані рядки так само, як " +"і ``DISTINCT``, якщо не використовується ``UNION ALL``." + +#: ../../src/rdbms/query.txt:378 ../../src/rdbms/query.txt:432 +#: ../../src/rdbms/query.txt:470 ../../src/rdbms/query.txt:527 +#: ../../src/rdbms/query.txt:545 ../../src/rdbms/query.txt:587 +#: ../../src/rdbms/query.txt:630 ../../src/rdbms/query.txt:668 +#: ../../src/rdbms/query.txt:693 ../../src/rdbms/query.txt:714 +msgid "id" +msgstr "id" + +#: ../../src/rdbms/query.txt:378 ../../src/rdbms/query.txt:432 +#: ../../src/rdbms/query.txt:470 +msgid "first_name" +msgstr "first_name" + +#: ../../src/rdbms/query.txt:378 ../../src/rdbms/query.txt:432 +#: ../../src/rdbms/query.txt:470 +msgid "last_name" +msgstr "last_name" + +#: ../../src/rdbms/query.txt:380 ../../src/rdbms/query.txt:472 +#: ../../src/rdbms/query.txt:529 ../../src/rdbms/query.txt:589 +#: ../../src/rdbms/query.txt:595 ../../src/rdbms/query.txt:601 +#: ../../src/rdbms/query.txt:607 ../../src/rdbms/query.txt:613 +#: ../../src/rdbms/query.txt:701 ../../src/rdbms/query.txt:728 +msgid "1" +msgstr "1" + +#: ../../src/rdbms/query.txt:380 ../../src/rdbms/query.txt:472 +msgid "Mariska" +msgstr "Mariska" + +#: ../../src/rdbms/query.txt:380 ../../src/rdbms/query.txt:472 +msgid "Syson" +msgstr "Syson" + +#: ../../src/rdbms/query.txt:382 ../../src/rdbms/query.txt:474 +#: ../../src/rdbms/query.txt:547 ../../src/rdbms/query.txt:553 +#: ../../src/rdbms/query.txt:555 ../../src/rdbms/query.txt:589 +#: ../../src/rdbms/query.txt:591 ../../src/rdbms/query.txt:593 +#: ../../src/rdbms/query.txt:607 ../../src/rdbms/query.txt:609 +#: ../../src/rdbms/query.txt:611 ../../src/rdbms/query.txt:613 +#: ../../src/rdbms/query.txt:615 ../../src/rdbms/query.txt:617 +#: ../../src/rdbms/query.txt:670 ../../src/rdbms/query.txt:676 +#: ../../src/rdbms/query.txt:678 ../../src/rdbms/query.txt:716 +#: ../../src/rdbms/query.txt:722 ../../src/rdbms/query.txt:724 +msgid "2" +msgstr "2" + +#: ../../src/rdbms/query.txt:382 ../../src/rdbms/query.txt:474 +msgid "Robenia" +msgstr "Robenia" + +#: ../../src/rdbms/query.txt:382 ../../src/rdbms/query.txt:474 +msgid "Dimitriades" +msgstr "Dimitriades" + +#: ../../src/rdbms/query.txt:384 ../../src/rdbms/query.txt:476 +#: ../../src/rdbms/query.txt:531 ../../src/rdbms/query.txt:549 +#: ../../src/rdbms/query.txt:551 ../../src/rdbms/query.txt:591 +#: ../../src/rdbms/query.txt:595 ../../src/rdbms/query.txt:597 +#: ../../src/rdbms/query.txt:599 ../../src/rdbms/query.txt:601 +#: ../../src/rdbms/query.txt:603 ../../src/rdbms/query.txt:605 +#: ../../src/rdbms/query.txt:609 ../../src/rdbms/query.txt:615 +#: ../../src/rdbms/query.txt:632 ../../src/rdbms/query.txt:634 +#: ../../src/rdbms/query.txt:672 ../../src/rdbms/query.txt:674 +#: ../../src/rdbms/query.txt:695 ../../src/rdbms/query.txt:697 +#: ../../src/rdbms/query.txt:718 ../../src/rdbms/query.txt:720 +msgid "3" +msgstr "3" + +#: ../../src/rdbms/query.txt:384 ../../src/rdbms/query.txt:476 +msgid "Loren" +msgstr "Loren" + +#: ../../src/rdbms/query.txt:384 ../../src/rdbms/query.txt:476 +msgid "Goretti" +msgstr "Goretti" + +#: ../../src/rdbms/query.txt:386 ../../src/rdbms/query.txt:478 +#: ../../src/rdbms/query.txt:593 ../../src/rdbms/query.txt:599 +#: ../../src/rdbms/query.txt:605 ../../src/rdbms/query.txt:611 +#: ../../src/rdbms/query.txt:617 ../../src/rdbms/query.txt:699 +#: ../../src/rdbms/query.txt:726 +msgid "4" +msgstr "4" + +#: ../../src/rdbms/query.txt:386 ../../src/rdbms/query.txt:478 +msgid "Dianna" +msgstr "Dianna" + +#: ../../src/rdbms/query.txt:386 ../../src/rdbms/query.txt:478 +msgid "Giacomuzzo" +msgstr "Giacomuzzo" + +#: ../../src/rdbms/query.txt:388 ../../src/rdbms/query.txt:434 +msgid "5" +msgstr "5" + +#: ../../src/rdbms/query.txt:388 ../../src/rdbms/query.txt:434 +msgid "Anett" +msgstr "Anett" + +#: ../../src/rdbms/query.txt:388 ../../src/rdbms/query.txt:434 +msgid "Hayland" +msgstr "Hayland" + +#: ../../src/rdbms/query.txt:390 ../../src/rdbms/query.txt:436 +msgid "6" +msgstr "6" + +#: ../../src/rdbms/query.txt:390 ../../src/rdbms/query.txt:436 +msgid "Keeley" +msgstr "Keeley" + +#: ../../src/rdbms/query.txt:390 ../../src/rdbms/query.txt:436 +msgid "Grishelyov" +msgstr "Grishelyov" + +#: ../../src/rdbms/query.txt:392 +msgid "7" +msgstr "7" + +#: ../../src/rdbms/query.txt:392 +msgid "Say" +msgstr "Say" + +#: ../../src/rdbms/query.txt:392 +msgid "Kliner" +msgstr "Kliner" + +#: ../../src/rdbms/query.txt:394 +msgid "8" +msgstr "8" + +#: ../../src/rdbms/query.txt:394 +msgid "Charles" +msgstr "Charles" + +#: ../../src/rdbms/query.txt:394 +msgid "Ede" +msgstr "Ede" + +#: ../../src/rdbms/query.txt:396 +msgid "9" +msgstr "9" + +#: ../../src/rdbms/query.txt:396 +msgid "Florentia" +msgstr "Florentia" + +#: ../../src/rdbms/query.txt:396 +msgid "Core" +msgstr "Core" + +#: ../../src/rdbms/query.txt:398 +msgid "10" +msgstr "10" + +#: ../../src/rdbms/query.txt:398 +msgid "Tiffany" +msgstr "Tiffany" + +#: ../../src/rdbms/query.txt:398 +msgid "Tingly" +msgstr "Tingly" + +#: ../../src/rdbms/query.txt:401 +msgid "" +"``INTERSECT`` returns all rows that are both in the result of ``query1`` and " +"in the result of ``query2``. Duplicate rows are eliminated unless " +"``INTERSECT ALL`` is used." +msgstr "" +"``INTERSECT`` повертає всі рядки, які є і в результаті ``query1``, і в " +"результаті ``query2``. Повторювані рядки вилучаються, якщо не " +"використовується ``INTERSECT ALL``." + +#: ../../src/rdbms/query.txt:439 +msgid "" +"``EXCEPT`` returns all rows that are in the result of ``query1`` but not in " +"the result of ``query2``. (This is sometimes called the difference between " +"two queries.) Again, duplicates are eliminated unless ``EXCEPT ALL`` is used." +msgstr "" +"``EXCEPT`` повертає всі рядки, які є в результаті ``query1``, але не є в " +"результаті ``query2``. (Це іноді називають різницею між двома запитами.) " +"Знову ж таки, дублікати вилучаються, якщо не використовується ``EXCEPT ALL``." + +#: ../../src/rdbms/query.txt:482 +msgid "Join data from different tables" +msgstr "Об'єднання даних з різних таблиць" + +#: ../../src/rdbms/query.txt:484 +msgid "" +"A ``JOIN`` clause combines two ``FROM`` items, which for convenience we will " +"refer as \"tables\", though in reality they can be any type of ``FROM`` " +"items. Available join types are:" +msgstr "" +"Речення ``JOIN`` об'єднує два елементи ``FROM``, які для зручності будемо " +"називати \"таблицями\", хоча насправді це може бути будь-який тип елементів " +"``FROM``. Доступні типи з'єднання:" + +#: ../../src/rdbms/query.txt:488 +msgid "``[INNER] JOIN``" +msgstr "``[INNER] JOIN``" + +#: ../../src/rdbms/query.txt:489 +msgid "``LEFT [OUTER] JOIN``" +msgstr "``LEFT [OUTER] JOIN``" + +#: ../../src/rdbms/query.txt:490 +msgid "``RIGHT [OUTER] JOIN``" +msgstr "``RIGHT [OUTER] JOIN``" + +#: ../../src/rdbms/query.txt:491 +msgid "``FULL [OUTER] JOIN``" +msgstr "``FULL [OUTER] JOIN``" + +#: ../../src/rdbms/query.txt:495 +msgid "Key words in bracket parentheses above are optional." +msgstr "Ключові слова в дужках вище є необов'язковими." + +#: ../../src/rdbms/query.txt:498 +msgid "Joins between tables" +msgstr "З'єднання між столами" + +#: ../../src/rdbms/query.txt:500 +msgid "Publishers and books tables definitions" +msgstr "Визначення таблиць видавництв та книг" + +#: ../../src/rdbms/query.txt:505 +msgid "" +"Following tables are related via ``FOREIGN KEY`` constraint. Each record in " +"the ``book`` table references some record in the ``publisher`` table." +msgstr "" +"Наступні таблиці пов'язані між собою за допомогою обмеження ``FOREIGN KEY``. " +"Кожен запис у таблиці ``book`` посилається на деякий запис у таблиці " +"``publisher``." + +#: ../../src/rdbms/query.txt:510 +msgid "" +"Since original tables contain lots of data, temporary tables will be created " +"instead before join query. Full tables content may be downloaded via links: :" +"download:`publisher `, :download:" +"`book `." +msgstr "" +"Оскільки вихідні таблиці містять багато даних, перед об'єднанням запитів " +"буде створено тимчасові таблиці. Повний вміст таблиць можна завантажити за " +"посиланнями: :download:`publisher `, :" +"download:`book `." + +#: ../../src/rdbms/query.txt:516 +msgid "The subsets from original queries defined as:" +msgstr "Підмножини з вихідних запитів визначаються як:" + +#: ../../src/rdbms/query.txt:527 ../../src/rdbms/query.txt:587 +#: ../../src/rdbms/query.txt:630 ../../src/rdbms/query.txt:668 +#: ../../src/rdbms/query.txt:693 ../../src/rdbms/query.txt:714 +msgid "name" +msgstr "name" + +#: ../../src/rdbms/query.txt:529 ../../src/rdbms/query.txt:589 +#: ../../src/rdbms/query.txt:595 ../../src/rdbms/query.txt:601 +#: ../../src/rdbms/query.txt:607 ../../src/rdbms/query.txt:613 +#: ../../src/rdbms/query.txt:701 ../../src/rdbms/query.txt:728 +msgid "Zoonoodle" +msgstr "Zoonoodle" + +#: ../../src/rdbms/query.txt:531 ../../src/rdbms/query.txt:591 +#: ../../src/rdbms/query.txt:597 ../../src/rdbms/query.txt:603 +#: ../../src/rdbms/query.txt:609 ../../src/rdbms/query.txt:615 +#: ../../src/rdbms/query.txt:632 ../../src/rdbms/query.txt:634 +#: ../../src/rdbms/query.txt:672 ../../src/rdbms/query.txt:674 +#: ../../src/rdbms/query.txt:695 ../../src/rdbms/query.txt:697 +#: ../../src/rdbms/query.txt:718 ../../src/rdbms/query.txt:720 +msgid "Tanoodle" +msgstr "Tanoodle" + +#: ../../src/rdbms/query.txt:545 ../../src/rdbms/query.txt:587 +#: ../../src/rdbms/query.txt:630 ../../src/rdbms/query.txt:668 +#: ../../src/rdbms/query.txt:693 ../../src/rdbms/query.txt:714 +msgid "title" +msgstr "title" + +#: ../../src/rdbms/query.txt:545 ../../src/rdbms/query.txt:587 +#: ../../src/rdbms/query.txt:630 ../../src/rdbms/query.txt:668 +#: ../../src/rdbms/query.txt:693 ../../src/rdbms/query.txt:714 +msgid "publisher_id" +msgstr "publisher_id" + +#: ../../src/rdbms/query.txt:547 ../../src/rdbms/query.txt:589 +#: ../../src/rdbms/query.txt:591 ../../src/rdbms/query.txt:593 +#: ../../src/rdbms/query.txt:670 ../../src/rdbms/query.txt:716 +msgid "22" +msgstr "22" + +#: ../../src/rdbms/query.txt:547 ../../src/rdbms/query.txt:589 +#: ../../src/rdbms/query.txt:591 ../../src/rdbms/query.txt:593 +#: ../../src/rdbms/query.txt:670 ../../src/rdbms/query.txt:716 +msgid "pretium nisl" +msgstr "pretium nisl" + +#: ../../src/rdbms/query.txt:549 ../../src/rdbms/query.txt:595 +#: ../../src/rdbms/query.txt:597 ../../src/rdbms/query.txt:599 +#: ../../src/rdbms/query.txt:632 ../../src/rdbms/query.txt:672 +#: ../../src/rdbms/query.txt:695 ../../src/rdbms/query.txt:718 +msgid "38" +msgstr "38" + +#: ../../src/rdbms/query.txt:549 ../../src/rdbms/query.txt:595 +#: ../../src/rdbms/query.txt:597 ../../src/rdbms/query.txt:599 +#: ../../src/rdbms/query.txt:632 ../../src/rdbms/query.txt:672 +#: ../../src/rdbms/query.txt:695 ../../src/rdbms/query.txt:718 +msgid "ac est lacinia nisi venenatis" +msgstr "ac est lacinia nisi venenatis" + +#: ../../src/rdbms/query.txt:551 ../../src/rdbms/query.txt:601 +#: ../../src/rdbms/query.txt:603 ../../src/rdbms/query.txt:605 +#: ../../src/rdbms/query.txt:634 ../../src/rdbms/query.txt:674 +#: ../../src/rdbms/query.txt:697 ../../src/rdbms/query.txt:720 +msgid "69" +msgstr "69" + +#: ../../src/rdbms/query.txt:551 ../../src/rdbms/query.txt:601 +#: ../../src/rdbms/query.txt:603 ../../src/rdbms/query.txt:605 +#: ../../src/rdbms/query.txt:634 ../../src/rdbms/query.txt:674 +#: ../../src/rdbms/query.txt:697 ../../src/rdbms/query.txt:720 +msgid "vel accumsan tellus nisi" +msgstr "vel accumsan tellus nisi" + +#: ../../src/rdbms/query.txt:553 ../../src/rdbms/query.txt:607 +#: ../../src/rdbms/query.txt:609 ../../src/rdbms/query.txt:611 +#: ../../src/rdbms/query.txt:676 ../../src/rdbms/query.txt:722 +msgid "72" +msgstr "72" + +#: ../../src/rdbms/query.txt:553 ../../src/rdbms/query.txt:607 +#: ../../src/rdbms/query.txt:609 ../../src/rdbms/query.txt:611 +#: ../../src/rdbms/query.txt:676 ../../src/rdbms/query.txt:722 +msgid "nam dui proin" +msgstr "nam dui proin" + +#: ../../src/rdbms/query.txt:555 ../../src/rdbms/query.txt:613 +#: ../../src/rdbms/query.txt:615 ../../src/rdbms/query.txt:617 +#: ../../src/rdbms/query.txt:678 ../../src/rdbms/query.txt:724 +msgid "85" +msgstr "85" + +#: ../../src/rdbms/query.txt:555 ../../src/rdbms/query.txt:613 +#: ../../src/rdbms/query.txt:615 ../../src/rdbms/query.txt:617 +#: ../../src/rdbms/query.txt:678 ../../src/rdbms/query.txt:724 +msgid "nam tristique" +msgstr "nam tristique" + +#: ../../src/rdbms/query.txt:558 +msgid "" +"By passing multiple tables to the ``FROM`` clause a ``CROSS JOIN`` query is " +"executed. This means the resulting table is the Cartesian product of two " +"original tables." +msgstr "" +"При передачі декількох таблиць в речення ``FROM`` виконується запит ``CROSS " +"JOIN`` (перехресне об'єднання). Це означає, що результуюча таблиця є " +"декартовим добутком двох вихідних таблиць." + +#: ../../src/rdbms/query.txt:562 +msgid "Cross join (Cartesian product)" +msgstr "Поперечне з'єднання (декартовий добуток)" + +#: ../../src/rdbms/query.txt:584 +msgid "Query result" +msgstr "Результат запиту" + +#: ../../src/rdbms/query.txt:593 ../../src/rdbms/query.txt:599 +#: ../../src/rdbms/query.txt:605 ../../src/rdbms/query.txt:611 +#: ../../src/rdbms/query.txt:617 ../../src/rdbms/query.txt:699 +#: ../../src/rdbms/query.txt:726 +msgid "Skivee" +msgstr "Skivee" + +#: ../../src/rdbms/query.txt:620 +msgid "" +"By defining the ``WHERE`` clause rows that do not match the condition may be " +"eliminated from the result." +msgstr "" +"За допомогою оператора `WHERE` рядки, які не відповідають умові, можуть бути " +"вилучені з результату." + +#: ../../src/rdbms/query.txt:637 +msgid "" +"This is called ``INNER JOIN``, which means that the result table will " +"contain only whose rows from left-hard and right-hand tables, that have " +"corresponding records to each other." +msgstr "" +"Це називається ``INNER JOIN``, що означає, що результуюча таблиця буде " +"містити тільки ті рядки з лівої та правої таблиць, які мають відповідні " +"записи один одному." + +#: ../../src/rdbms/query.txt:641 +msgid "" +"The same result may be obtained using ``JOIN`` clause. All ``JOIN`` options " +"are just a notation convenience, since they do nothing you couldn't do with " +"plain ``FROM`` and ``WHERE``." +msgstr "" +"Той самий результат можна отримати за допомогою оператора ``JOIN``. Всі " +"опції ``JOIN`` є лише зручністю для нотації, оскільки вони не роблять нічого " +"такого, чого не можна було б зробити за допомогою звичайних ``FROM`` і " +"``WHERE``." + +#: ../../src/rdbms/query.txt:651 +msgid "``INNER JOIN`` is the default while joining two tables with each other." +msgstr "" +"``INNER JOIN`` використовується за замовчуванням при з'єднанні двох таблиць " +"одна з одною." + +#: ../../src/rdbms/query.txt:654 +msgid "Right and left joins" +msgstr "Праве та ліве з'єднання" + +#: ../../src/rdbms/query.txt:656 +msgid "" +"``LEFT OUTER JOIN`` returns all rows in the qualified Cartesian product (i." +"e., all combined rows that pass its condition), plus one copy of each row in " +"the left-hand table for which there was no right-hand row that passed the " +"join condition." +msgstr "" +"``LEFT OUTER JOIN`` повертає всі рядки кваліфікованого декартового добутку " +"(тобто всі об'єднані рядки, які задовольняють його умову), плюс по одній " +"копії кожного рядка лівої таблиці, для якого не було рядка правої таблиці, " +"що задовольняє умову об'єднання." + +#: ../../src/rdbms/query.txt:670 ../../src/rdbms/query.txt:676 +#: ../../src/rdbms/query.txt:678 ../../src/rdbms/query.txt:699 +#: ../../src/rdbms/query.txt:701 ../../src/rdbms/query.txt:716 +#: ../../src/rdbms/query.txt:722 ../../src/rdbms/query.txt:724 +#: ../../src/rdbms/query.txt:726 ../../src/rdbms/query.txt:728 +msgid "null" +msgstr "null" + +#: ../../src/rdbms/query.txt:681 +msgid "" +"Conversely, ``RIGHT OUTER JOIN`` returns all the joined rows, plus one row " +"for each unmatched right-hand row. This is just a notation convenience, " +"since you could convert it to a ``LEFT OUTER JOIN`` by switching the left " +"and right tables." +msgstr "" +"І навпаки, ``RIGHT OUTER JOIN`` повертає всі об'єднані рядки, плюс один " +"рядок для кожного невідповідного правого рядка. Це просто зручність " +"позначення, оскільки ви можете перетворити його на ``LEFT OUTER JOIN``, " +"помінявши місцями ліву та праву таблиці." + +#: ../../src/rdbms/query.txt:705 +msgid "Full outer join" +msgstr "Full outer join" diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/relations.po b/src/_locales/uk/LC_MESSAGES/rdbms/relations.po new file mode 100644 index 000000000..f99345d48 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/relations.po @@ -0,0 +1,305 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2024.03.dev\n" +"Report-Msgid-Bugs-To: https://github.com/edu-python-course/edu-python-course." +"github.io/issues\n" +"POT-Creation-Date: 2023-12-16 13:55+0000\n" +"PO-Revision-Date: 2024-03-05 16:13+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/rdbms/relations.txt:-1 +msgid "This document describes the database relationships" +msgstr "Цей документ описує відносини в базах даних" + +#: ../../src/rdbms/relations.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/rdbms/relations.txt:-1 +msgid "" +"sql, db, database, relationship, primary key, foreign key, pk, fk, one-to-" +"one, one-to-many, many-to-many, 1-1, 1-n, n-m" +msgstr "" +"sql, db, база даних, відношення, первинний ключ, зовнішній ключ, pk, fk, " +"один-до-одного, один-до-багатьох, багато-до-багатьох, 1-1, 1-n, n-m" + +#: ../../src/rdbms/relations.txt:9 +msgid "Data Relationships" +msgstr "Зв'язки даних" + +#: ../../src/rdbms/relations.txt:11 +msgid "" +"Before dive into relationships, there is a need explain core concepts on how " +"data are referenced between different tables." +msgstr "" +"Перш ніж зануритися у взаємозв'язки, необхідно пояснити основні поняття про " +"те, як дані посилаються між різними таблицями." + +#: ../../src/rdbms/relations.txt:15 +msgid "Primary key" +msgstr "Первинний ключ (Primary key)" + +#: ../../src/rdbms/relations.txt:17 +msgid "" +"A primary key constraint indicates that a column, or group of columns, can " +"be used as a unique identifier for rows in the table. This requires that " +"values be both unique and not null. So, the following two table definitions " +"accept the same data:" +msgstr "" +"Первинний ключ вказує на те, що стовпець або група стовпців може " +"використовуватися як унікальний ідентифікатор для рядків у таблиці. Це " +"вимагає, щоб значення були і унікальними, і не нульовими. Отже, наступні два " +"визначення таблиці приймають однакові дані:" + +#: ../../src/rdbms/relations.txt:36 +msgid "" +"Primary keys can span more than one column; the syntax is similar to unique " +"constraint:" +msgstr "" +"Первинні ключі можуть охоплювати більше одного стовпця; синтаксис подібний " +"до унікального обмеження:" + +#: ../../src/rdbms/relations.txt:49 +msgid "" +"Adding a primary key will automatically create a unique B-tree index on the " +"column or group of columns listed in the primary key, and will force the " +"column(s) to be marked ``NOT NULL``." +msgstr "" +"Додавання первинного ключа автоматично створить унікальний індекс B-дерева " +"для стовпця або групи стовпців, перелічених у первинному ключі, і примусить " +"стовпець(и) позначити ``NOT NULL``." + +#: ../../src/rdbms/relations.txt:53 +msgid "A table can have at most one primary key." +msgstr "Таблиця може мати не більше одного первинного ключа." + +#: ../../src/rdbms/relations.txt:57 +msgid "" +"There can be any number of unique and not-null constraints, which are " +"functionally almost the same thing, but only one can be identified as the " +"primary key." +msgstr "" +"Обмежень може бути будь-яка кількість унікальних і не нульових, які " +"функціонально майже однакові, але тільки одне з них може бути ідентифіковане " +"як первинний ключ." + +#: ../../src/rdbms/relations.txt:62 +msgid "Foreign key (FK)" +msgstr "Зовнішній ключ (FK)" + +#: ../../src/rdbms/relations.txt:64 +msgid "" +"A foreign key constraint specifies that the value in a column (or a group of " +"columns) must match the values appearing in some row of another table. We " +"say this maintains the *referential integrity* between two tables." +msgstr "" +"Зовнішній ключ визначає, що значення у стовпчику (або групі стовпчиків) має " +"збігатися зі значеннями, що з'являються у деякому рядку іншої таблиці. Ми " +"говоримо, що це підтримує *посилальну цілісність* між двома таблицями." + +#: ../../src/rdbms/relations.txt:68 +msgid "" +"A table can have more than one foreign key constraint. Foreign key can also " +"overlaps with the primary key." +msgstr "" +"Таблиця може мати більше одного обмеження зовнішнього ключа. Зовнішній ключ " +"також може перекриватися з первинним ключем." + +#: ../../src/rdbms/relations.txt:71 +msgid "To define a FK constraint:" +msgstr "Щоб визначити FK:" + +#: ../../src/rdbms/relations.txt:94 +msgid "" +"In this situation the ``book`` table is the *referencing* table, and the " +"``publisher`` table is the *referenced* table. Similarly there are " +"referencing and referenced columns." +msgstr "" +"У цій ситуації таблиця ``book`` є таблицею *посилання*, а таблиця " +"``publisher`` є таблицею *посилання*. Аналогічно існують стовпці, на які є " +"посилання, і стовпці, на які є посилання." + +#: ../../src/rdbms/relations.txt:98 +msgid "" +"In case the referenced column is not explicitly defined, the primary key of " +"the referenced table will be used as the referenced column." +msgstr "" +"Якщо стовпець, на який є посилання, не визначено явно, буде використано " +"первинний ключ таблиці, на яку посилаються." + +#: ../../src/rdbms/relations.txt:101 +msgid "" +"It is not possible to create a row with non-null foreign key, that does not " +"appear in the referenced table." +msgstr "" +"Неможливо створити рядок з ненульовим зовнішнім ключем, який не з'являється " +"в таблиці, на яку посилається." + +#: ../../src/rdbms/relations.txt:105 +msgid "Self-referential foreign key" +msgstr "Самореферентний зовнішній ключ" + +#: ../../src/rdbms/relations.txt:107 +msgid "" +"Sometimes it is useful to the referenced table to be the same table as " +"referencing. This makes possible to create a tree-structures with nodes, " +"there a top-level node would have ``NULL`` ``parent_id``." +msgstr "" +"Іноді корисно, щоб таблиця, на яку посилаються, збігалася з таблицею, на яку " +"посилаються. Це дозволяє створювати деревоподібні структури з вузлами, де " +"вузол верхнього рівня матиме ``NULL`` ``parent_id``." + +#: ../../src/rdbms/relations.txt:120 +msgid "Deleting referenced rows" +msgstr "Видалення рядків з посиланнями" + +#: ../../src/rdbms/relations.txt:122 +msgid "" +"So far we know that the foreign keys disallows creation of rows that do not " +"relate to any row inside the referenced table. But what if a referenced row " +"needs to be removed? Intuitively, there are few options:" +msgstr "" +"Досі ми знали, що зовнішні ключі не дозволяють створювати рядки, які не " +"пов'язані з жодним рядком всередині таблиці, на яку посилаються. Але що " +"робити, якщо рядок, на який є посилання, потрібно видалити? Інтуїтивно " +"зрозуміло, що варіантів небагато:" + +#: ../../src/rdbms/relations.txt:126 +msgid "disallow deletion" +msgstr "заборонити видалення" + +#: ../../src/rdbms/relations.txt:127 +msgid "delete referencing rows as well" +msgstr "також видалити рядки посилань" + +#: ../../src/rdbms/relations.txt:128 +msgid "something else..." +msgstr "щось інше..." + +#: ../../src/rdbms/relations.txt:130 +msgid "" +"Restricting and cascading deletes are the two most common options. " +"``RESTRICT`` prevents deletion of a referenced row. ``CASCADE`` will also " +"delete all referencing rows as well as the referenced one." +msgstr "" +"Обмеження та каскадне видалення є двома найпоширенішими варіантами. " +"``ОБМЕЖЕННЯ`` запобігає видаленню рядка, на який є посилання. ``CASCADE`` " +"також видаляє всі рядки, на які є посилання, а також рядок, на який є " +"посилання." + +#: ../../src/rdbms/relations.txt:148 +msgid "There are others options." +msgstr "Є й інші варіанти." + +#: ../../src/rdbms/relations.txt:150 +msgid "" +"``NO ACTION`` means that if any referencing rows still exist when the " +"constraint is checked, an error is raised; this is the default behavior." +msgstr "" +"``NO ACTION`` означає, що якщо будь-які рядки посилань все ще існують, коли " +"перевіряється обмеження, буде видано помилку; це поведінка за замовчуванням." + +#: ../../src/rdbms/relations.txt:153 +msgid "" +"``SET NULL`` will replace all referencing rows foreign key values with " +"``NULL`` values." +msgstr "" +"``SET NULL`` замінить значення зовнішнього ключа у всіх рядках, що " +"посилаються, на значення ``NULL``." + +#: ../../src/rdbms/relations.txt:156 +msgid "" +"``SET DEFAULT`` will replace all referencing rows foreign key values with " +"default values." +msgstr "" +"``SET DEFAULT`` замінить значення зовнішніх ключів усіх посилальних рядків " +"значеннями за замовчуванням." + +#: ../../src/rdbms/relations.txt:160 +msgid "Relationships" +msgstr "Відносини" + +#: ../../src/rdbms/relations.txt:162 +msgid "" +"From the point of view of the RDBMS there are no other relationships between " +"two tables except the **foreign key**. But the way the foreign keys are " +"designed brings us three concepts of the data relations." +msgstr "" +"З точки зору СУБД, між двома таблицями не існує інших зв'язків, окрім " +"**зовнішнього ключа**. Але те, як спроектовані зовнішні ключі, надає три " +"концепції зв'язків між даними." + +#: ../../src/rdbms/relations.txt:168 +msgid "One-to-many" +msgstr "" +"``article`` та ``comment`` мають відношення *один-до-багатьох*. Стаття може " +"бути контейнером для багатьох коментарів, але коментар пов'язаний лише з " +"однією статтею." + +#: ../../src/rdbms/relations.txt:169 +msgid "" +"In a relational database, two tables have a one-to-many relationship if each " +"row in one table references multiple rows of the other table. For example " +"``publisher`` can publish many books, but a single ``book`` is published by " +"some specific publisher." +msgstr "" +"У реляційній базі даних дві таблиці мають зв'язок \"один до багатьох\", якщо " +"кожен рядок однієї таблиці посилається на декілька рядків іншої таблиці. " +"Наприклад, ``видавець`` може видавати багато книжок, але кожна окрема " +"``книжка`` видається певним видавництвом." + +#: ../../src/rdbms/relations.txt:180 +msgid "One-to-one" +msgstr "Один-до-одного" + +#: ../../src/rdbms/relations.txt:183 +msgid "" +"You can think of one-to-one relationship as a limited version of *one-to-" +"many*." +msgstr "" +"Ви можете думати про відносини один-на-один як про обмежену версію \"один-до-" +"багатьох\"." + +#: ../../src/rdbms/relations.txt:186 +msgid "" +"In a relational database, two tables have a one-to-one relationship if each " +"row in one table links to exactly one row in the other table, and vice " +"versa. For example a table of ``members`` and a table of ``contacts`` might " +"have a one-to-one relationship." +msgstr "" +"У реляційній базі даних дві таблиці мають зв'язок \"один до одного\", якщо " +"кожен рядок в одній таблиці посилається на точно такий самий рядок в іншій " +"таблиці, і навпаки. Наприклад, таблиця ``members`` і таблиця ``contacts`` " +"можуть мати зв'язок \"один до одного\"." + +#: ../../src/rdbms/relations.txt:197 +msgid "Many-to-many" +msgstr "Багато до багатьох" + +#: ../../src/rdbms/relations.txt:198 +msgid "" +"In relational database, two table have many-to-many relationship if each row " +"in one table can reference multiple rows in another table, and vice versa. " +"For example table ``book`` may contain records for books authored by many " +"``authors``. On the other hand author can write multiple books. Implementing " +"a many-to-many relationship requires creation of an intermediate table, that " +"applies one-to-many relationship with both original tables." +msgstr "" +"У реляційній базі даних дві таблиці мають зв'язок \"багато до багатьох\", " +"якщо кожен рядок в одній таблиці може посилатися на декілька рядків в іншій " +"таблиці, і навпаки. Наприклад, таблиця ``book`` може містити записи про " +"книги, написані багатьма ``authors``. З іншого боку, автор може написати " +"декілька книг. Реалізація зв'язку \"багато-до-багатьох\" вимагає створення " +"проміжної таблиці, яка застосовує зв'язок \"один-до-багатьох\" до обох " +"вихідних таблиць." diff --git a/src/_locales/uk/LC_MESSAGES/rdbms/structure.po b/src/_locales/uk/LC_MESSAGES/rdbms/structure.po new file mode 100644 index 000000000..a5a12bd20 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/rdbms/structure.po @@ -0,0 +1,409 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-16 13:55+0000\n" +"PO-Revision-Date: 2023-12-21 04:01+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Poedit 3.4.1\n" + +#: ../../src/rdbms/structure.txt:3 +msgid "Structure of Data in RDBMS" +msgstr "Структура даних в СУБД" + +#: ../../src/rdbms/structure.txt:5 +msgid "" +"The database itself is a set of data stored in a computer. This data is " +"usually structured in a way that makes them easily accessible. Relational " +"databases use the structure that allows us to identify and access data in " +"*relation* to another piece of data in the database." +msgstr "" +"База даних - це набір даних, що зберігається в комп'ютері. Ці дані зазвичай " +"структуровані таким чином, щоб зробити їх легкодоступними. Реляційні бази " +"даних використовують структуру, яка дозволяє ідентифікувати та отримувати " +"доступ до даних у \"зв'язку\" з іншими даними в базі даних." + +#: ../../src/rdbms/structure.txt:10 +msgid "" +"Understanding the basic structure of an RDBMS is crucial for effectively " +"managing and querying data. In this section, we delve into the core " +"components: *tables*, *rows*, and *columns*, and how they form the " +"foundation of a relational database." +msgstr "" +"Розуміння базової структури СКБД має вирішальне значення для ефективного " +"керування даними та запитами до них. У цьому розділі ми заглибимося в " +"основні компоненти: *таблиці*, *рядки* та *стовпці*, а також те, як вони " +"формують основу реляційної бази даних." + +#: ../../src/rdbms/structure.txt:20 +msgid "Tables" +msgstr "Таблиці" + +#: ../../src/rdbms/structure.txt:25 +msgid "Tables are the building blocks." +msgstr "Столи - це будівельні блоки." + +#: ../../src/rdbms/structure.txt:29 +msgid "Some documents may name tables as *relations*." +msgstr "У деяких документах таблиці можуть називатися *зв'язками*." + +#: ../../src/rdbms/structure.txt:31 +msgid "" +"A table in an RDBMS is akin to a spreadsheet. It is where data is stored and " +"organized. Each table in a database represents a specific entity or concept, " +"like ``Customers`` or ``Orders``." +msgstr "" +"Таблиця в СКБД схожа на електронну таблицю. Це місце, де зберігаються та " +"організовуються дані. Кожна таблиця в базі даних представляє певну сутність " +"або концепцію, наприклад, \"Клієнти\" або \"Замовлення\"." + +#: ../../src/rdbms/structure.txt:36 +msgid "Structure and purpose" +msgstr "Структура та призначення" + +#: ../../src/rdbms/structure.txt:38 +msgid "" +"A table consists of rows and columns, similar to a grid. All the rows and " +"cols together are the data *related* to some subject or concept within a " +"database." +msgstr "" +"Таблиця складається з рядків і стовпців, подібно до сітки. Всі рядки і " +"стовпчики разом - це дані, \"пов'язані\" з певним предметом або поняттям у " +"базі даних." + +#: ../../src/rdbms/structure.txt:41 +msgid "" +"Tables hold data about a particular subject, such as all the information " +"related to customer transactions, or books available in a local library." +msgstr "" +"Таблиці містять дані про певний предмет, наприклад, всю інформацію, " +"пов'язану з транзакціями клієнтів, або книги, доступні в місцевій бібліотеці." + +#: ../../src/rdbms/structure.txt:45 +msgid "Naming conventions" +msgstr "Умовні позначення" + +#: ../../src/rdbms/structure.txt:49 +msgid "" +"The conventions below aren't related to tables only, but also they are used " +"when naming databases and columns." +msgstr "" +"Умовні позначення, наведені нижче, стосуються не лише таблиць, вони також " +"використовуються при іменуванні баз даних і стовпців." + +#: ../../src/rdbms/structure.txt:52 +msgid "Use nouns that describe the subject the best." +msgstr "Використовуйте іменники, які найкраще описують предмет." + +#: ../../src/rdbms/structure.txt:53 +msgid "Use lowercase names, e.g. ``user`` instead of ``Users`` or ``USERS``." +msgstr "" +"Використовуйте малі літери, наприклад, ``user`` замість ``Users`` або " +"``USERS``." + +#: ../../src/rdbms/structure.txt:54 +msgid "" +"If the name must consist of two or more words, use underscore to connect " +"them, e.g. ``snake_case``, ``user_account``." +msgstr "" +"Якщо назва складається з двох або більше слів, використовуйте підкреслення, " +"щоб з'єднати їх, наприклад, ``nake_case``, ``user_account``." + +#: ../../src/rdbms/structure.txt:56 +msgid "Avoid use of dots, spaces, or dashes." +msgstr "Уникайте використання крапок, пробілів або тире." + +#: ../../src/rdbms/structure.txt:57 +msgid "" +"When naming objects, balance the objective of keeping names short and easy " +"to use with the objective of making names as descriptive as possible." +msgstr "" +"Називаючи об'єкти, балансуйте між бажанням, щоб назви були короткими і " +"простими у використанні, та бажанням, щоб вони були максимально описовими." + +#: ../../src/rdbms/structure.txt:59 +msgid "Singular names are preferred over plurals." +msgstr "Імена в однині мають перевагу над множиною." + +#: ../../src/rdbms/structure.txt:62 +msgid "Rows: Individual Records" +msgstr "Ряди: Індивідуальні записи" + +#: ../../src/rdbms/structure.txt:64 +msgid "" +"Tables can have hundreds, thousands, sometimes even millions of rows of " +"data. These rows are offer called *records*. Each row in a table represents " +"a single entity of a subject. For example, ``book`` table represents an " +"abstract book with all its attributes, like title, author etc. And a " +"specific row within this table represents a concrete book." +msgstr "" +"Таблиці можуть містити сотні, тисячі, іноді навіть мільйони рядків даних. Ці " +"рядки називаються *записами*. Кожен рядок у таблиці представляє одну " +"сутність предмета. Наприклад, таблиця ``книга`` представляє абстрактну книгу " +"з усіма її атрибутами, такими як назва, автор тощо. А конкретний рядок у цій " +"таблиці представляє конкретну книгу." + +#: ../../src/rdbms/structure.txt:70 +msgid "Every row should ideally have something that make it unique." +msgstr "В ідеалі кожен ряд повинен мати щось, що робить його унікальним." + +#: ../../src/rdbms/structure.txt:72 +msgid "" +"Rows in a table can be linked to other rows in other tables or within the " +"same table, maintaining relationships and data integrity." +msgstr "" +"Рядки в таблиці можуть бути пов'язані з іншими рядками в інших таблицях або " +"в межах однієї таблиці, зберігаючи зв'язки і цілісність даних." + +#: ../../src/rdbms/structure.txt:76 +msgid "Columns: Attributes of Data" +msgstr "Стовпці: Атрибути даних" + +#: ../../src/rdbms/structure.txt:78 +msgid "" +"Columns in a table represent the attributes of the entity. For instance, " +"``book`` table may contain columns ``title``, ``author``, ``publisher`` etc." +msgstr "" +"Стовпці у таблиці представляють атрибути сутності. Наприклад, таблиця " +"``книга`` може містити стовпці ``назва``, ``автор``, ``видавництво`` тощо." + +#: ../../src/rdbms/structure.txt:81 +msgid "Each column has a defined data type, like ``integer``, ``string`` etc." +msgstr "" +"Кожен стовпець має певний тип даних, наприклад, ``ціле число``, ``рядок`` " +"тощо." + +#: ../../src/rdbms/structure.txt:84 +msgid "Constraints" +msgstr "Обмеження" + +#: ../../src/rdbms/structure.txt:86 +msgid "" +"Columns can have constraints to enforce data integrity. For example, some " +"columns cannot be empty, or store values under or above some threshold. " +"Several constraints can be combined together." +msgstr "" +"Стовпці можуть мати обмеження для забезпечення цілісності даних. Наприклад, " +"деякі стовпці не можуть бути порожніми або зберігати значення нижче або вище " +"певного порогу. Кілька обмежень можна комбінувати разом." + +#: ../../src/rdbms/structure.txt:91 +msgid "Examples" +msgstr "Приклади" + +#: ../../src/rdbms/structure.txt:93 +msgid "Authors table" +msgstr "Таблиця авторів" + +#: ../../src/rdbms/structure.txt:1 +msgid "id" +msgstr "id" + +#: ../../src/rdbms/structure.txt:1 +msgid "first_name" +msgstr "first_name" + +#: ../../src/rdbms/structure.txt:1 +msgid "last_name" +msgstr "last_name" + +#: ../../src/rdbms/structure.txt:1 +msgid "country" +msgstr "country" + +#: ../../src/rdbms/structure.txt:1 +msgid "birthdate" +msgstr "birthdate" + +#: ../../src/rdbms/structure.txt:1 +msgid "1" +msgstr "1" + +#: ../../src/rdbms/structure.txt:1 +msgid "Letta" +msgstr "Letta" + +#: ../../src/rdbms/structure.txt:1 +msgid "Casbolt" +msgstr "Casbolt" + +#: ../../src/rdbms/structure.txt:1 +msgid "Poland" +msgstr "Poland" + +#: ../../src/rdbms/structure.txt:1 +msgid "1947-04-18" +msgstr "1947-04-18" + +#: ../../src/rdbms/structure.txt:1 +msgid "2" +msgstr "2" + +#: ../../src/rdbms/structure.txt:1 +msgid "Robbyn" +msgstr "Robbyn" + +#: ../../src/rdbms/structure.txt:1 +msgid "Attwoul" +msgstr "Attwoul" + +#: ../../src/rdbms/structure.txt:1 +msgid "1954-10-17" +msgstr "1954-10-17" + +#: ../../src/rdbms/structure.txt:1 +msgid "3" +msgstr "3" + +#: ../../src/rdbms/structure.txt:1 +msgid "Hesther" +msgstr "Hesther" + +#: ../../src/rdbms/structure.txt:1 +msgid "Kisby" +msgstr "Kisby" + +#: ../../src/rdbms/structure.txt:1 +msgid "Ukraine" +msgstr "Ukraine" + +#: ../../src/rdbms/structure.txt:1 +msgid "1941-07-21" +msgstr "1941-07-21" + +#: ../../src/rdbms/structure.txt:1 +msgid "4" +msgstr "4" + +#: ../../src/rdbms/structure.txt:1 +msgid "Gav" +msgstr "Gav" + +#: ../../src/rdbms/structure.txt:1 +msgid "Jewett" +msgstr "Jewett" + +#: ../../src/rdbms/structure.txt:1 +msgid "Czech Republic" +msgstr "Czech Republic" + +#: ../../src/rdbms/structure.txt:1 +msgid "1988-02-05" +msgstr "1988-02-05" + +#: ../../src/rdbms/structure.txt:1 +msgid "5" +msgstr "5" + +#: ../../src/rdbms/structure.txt:1 +msgid "Jorrie" +msgstr "Jorrie" + +#: ../../src/rdbms/structure.txt:1 +msgid "Klehyn" +msgstr "Klehyn" + +#: ../../src/rdbms/structure.txt:1 +msgid "United States" +msgstr "United States" + +#: ../../src/rdbms/structure.txt:1 +msgid "1941-08-07" +msgstr "1941-08-07" + +#: ../../src/rdbms/structure.txt:1 +msgid "6" +msgstr "6" + +#: ../../src/rdbms/structure.txt:1 +msgid "Genevieve" +msgstr "Genevieve" + +#: ../../src/rdbms/structure.txt:1 +msgid "Ollington" +msgstr "Ollington" + +#: ../../src/rdbms/structure.txt:1 +msgid "1921-08-27" +msgstr "1921-08-27" + +#: ../../src/rdbms/structure.txt:1 +msgid "7" +msgstr "7" + +#: ../../src/rdbms/structure.txt:1 +msgid "Carrissa" +msgstr "Carrissa" + +#: ../../src/rdbms/structure.txt:1 +msgid "Arrandale" +msgstr "Arrandale" + +#: ../../src/rdbms/structure.txt:1 +msgid "United Kingdom" +msgstr "United Kingdom" + +#: ../../src/rdbms/structure.txt:1 +msgid "1982-08-20" +msgstr "1982-08-20" + +#: ../../src/rdbms/structure.txt:1 +msgid "8" +msgstr "8" + +#: ../../src/rdbms/structure.txt:1 +msgid "Josepha" +msgstr "Josepha" + +#: ../../src/rdbms/structure.txt:1 +msgid "Dominichelli" +msgstr "Dominichelli" + +#: ../../src/rdbms/structure.txt:1 +msgid "1976-12-03" +msgstr "1976-12-03" + +#: ../../src/rdbms/structure.txt:1 +msgid "9" +msgstr "9" + +#: ../../src/rdbms/structure.txt:1 +msgid "Ario" +msgstr "Ario" + +#: ../../src/rdbms/structure.txt:1 +msgid "Hepher" +msgstr "Hepher" + +#: ../../src/rdbms/structure.txt:1 +msgid "2003-10-11" +msgstr "2003-10-11" + +#: ../../src/rdbms/structure.txt:1 +msgid "10" +msgstr "10" + +#: ../../src/rdbms/structure.txt:1 +msgid "Walker" +msgstr "Walker" + +#: ../../src/rdbms/structure.txt:1 +msgid "Grolmann" +msgstr "Grolmann" + +#: ../../src/rdbms/structure.txt:1 +msgid "1964-02-17" +msgstr "1964-02-17" diff --git a/src/_locales/uk/LC_MESSAGES/spec/blog/index.po b/src/_locales/uk/LC_MESSAGES/spec/blog/index.po new file mode 100644 index 000000000..8f2e14416 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/spec/blog/index.po @@ -0,0 +1,1224 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-11-17 23:49+0200\n" +"PO-Revision-Date: 2023-11-17 23:56+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Poedit 3.4.1\n" + +#: ../../src/spec/blog/index.rst:10 +msgid "Blog Site" +msgstr "Сайт Блогу" + +#: ../../src/spec/blog/index.rst:12 +msgid "" +"The project aims to develop a robust and user-friendly web application using " +"the Django framework. The primary objective is to create a blogging platform " +"that allows users to publish and manage articles on various topics. The " +"application will provide an intuitive interface for authors to compose and " +"format their articles, while also offering a seamless reading experience for " +"visitors." +msgstr "" +"Проект має на меті розробку міцного та зручного у використанні веб-додатка " +"за допомогою фреймворку Django. Основна мета полягає у створенні платформи " +"для блогів, яка дозволить користувачам публікувати та керувати статтями на " +"різні теми. Додаток надасть інтуїтивний інтерфейс авторам для створення та " +"форматування своїх статей, а також забезпечить безперешкодний досвід читання " +"для відвідувачів." + +#: ../../src/spec/blog/index.rst:19 +msgid "**Key Features**" +msgstr "**Основні функції**" + +#: ../../src/spec/blog/index.rst:22 +msgid "User Registration and Authentication" +msgstr "Реєстрація та Аутентифікація Користувачів" + +#: ../../src/spec/blog/index.rst:23 +msgid "" +"The application will provide user registration and authentication " +"functionality, allowing individuals to create accounts, log in, and manage " +"their profile information. This feature will enable authors to have " +"personalized accounts and maintain ownership of their published articles." +msgstr "" +"Застосунок надасть функціональність реєстрації та аутентифікації " +"користувачів, дозволяючи індивідуумам створювати облікові записи, входити в " +"систему та керувати інформацією свого профілю. Ця функція дозволить авторам " +"мати персоналізовані облікові записи та зберігати право власності на їхні " +"опубліковані статті." + +#: ../../src/spec/blog/index.rst:30 +msgid "Article Management" +msgstr "Керування Статтями" + +#: ../../src/spec/blog/index.rst:31 +msgid "" +"Authors will have the ability to create, edit, and delete articles within " +"the application. The system will offer a user-friendly editor. Additionally, " +"authors will be able to categorize articles by assigning relevant topics to " +"them." +msgstr "" +"Автори матимуть можливість створювати, редагувати та видаляти статті в " +"рамках додатка. Система надасть зручний редактор. Крім того, автори зможуть " +"категоризувати статті, присвоюючи їм відповідні теми." + +#: ../../src/spec/blog/index.rst:37 +msgid "Topic Subscription:" +msgstr "Підписка на Теми:" + +#: ../../src/spec/blog/index.rst:38 +msgid "" +"The application will include a subscription feature that allows users to " +"subscribe to topics of interest. By subscribing to specific topics, users " +"will receive notifications or updates whenever new articles are published in " +"those categories. This feature will enhance user engagement and ensure that " +"readers stay informed about the topics they find most valuable." +msgstr "" +"Автори матимуть можливість створювати, редагувати та видаляти статті в " +"рамках додатка. Система надасть зручний редактор. Крім того, автори зможуть " +"категоризувати статті, присвоюючи їм відповідні теми." + +#: ../../src/spec/blog/index.rst:45 +msgid "" +"Overall, the project aims to deliver an efficient blogging platform that " +"caters to both authors and readers. By providing a seamless user experience " +"and incorporating essential functionalities such as user authentication, " +"article management, and topic subscriptions, the application will empower " +"users to create, share, and explore engaging content within a well-" +"structured and organized platform." +msgstr "" +"Застосунок буде містити функцію підписки, яка дозволить користувачам " +"підписуватися на цікаві їм теми. Підписавшись на конкретні теми, користувачі " +"отримуватимуть повідомлення або оновлення кожного разу, коли в цих " +"категоріях будуть публікуватися нові статті. Ця функція покращить " +"залученість користувачів та забезпечить, що читачі будуть інформовані про " +"найцікавіші для них теми." + +#: ../../src/spec/blog/index.rst:52 +msgid "" +"Here is a starter repository template, that may helps: `Starter template`_." +msgstr "" +"Ось шаблон стартового репозиторію, який може допомогти: `Starter template`_." + +#: ../../src/spec/blog/index.rst:55 +msgid "Challenge: Functional views" +msgstr "Виклик: Функціональні представлення" + +#: ../../src/spec/blog/index.rst:57 +msgid "" +"It's ok not to return **actual** content for now. Just ensure all the routes " +"are available and provide correct data. Use anything you like to return " +"within HTTP response." +msgstr "" +"Зараз немає потреби повертати **фактичний** вміст. Просто переконайтеся, що " +"всі маршрути доступні та надають правильні дані. Використовуйте будь-що, що " +"ви хочете повернути в HTTP-відповіді." + +#: ../../src/spec/blog/index.rst:61 +msgid "" +"``/about/``: Provides a regular text for a user, describing the " +"functionalities of the django site." +msgstr "" +"``/about/``: надає звичайний текст для користувача, що описує функції сайту " +"django." + +#: ../../src/spec/blog/index.rst:63 +msgid "" +"``/``: A site's homepage. This will contain a list of blogs published via " +"the django site." +msgstr "" +"``/``: Головна сторінка сайту. Тут буде перелік блогів, опублікованих через " +"сайт Django." + +#: ../../src/spec/blog/index.rst:65 +msgid "" +"``/
/``: A single article detail view. The URL contains dynamic part " +"in it. This will be used to fetch a single article from the database." +msgstr "" +"``/
/``: Представлення деталей однієї статті. URL містить динамічну " +"частину. Вона буде використовуватися для отримання однієї статті з бази " +"даних." + +#: ../../src/spec/blog/index.rst:68 +msgid "" +"``/
/comment/``: This view will be used to add comments to a article." +msgstr "" +"``/
/comment/``: Це представлення буде використовуватися для " +"додавання коментарів до статті." + +#: ../../src/spec/blog/index.rst:70 +msgid "``/create/``: A article creation form." +msgstr "``/create/``: Форма створення статті." + +#: ../../src/spec/blog/index.rst:71 +msgid "``/
/update/``: A view to update an existing article data." +msgstr "" +"``/
/update/``: Представлення для оновлення існуючих даних статті." + +#: ../../src/spec/blog/index.rst:72 +msgid "``/
/delete/``: A view to confirm article deletion." +msgstr "" +"``/
/delete/``: Представлення для підтвердження видалення статті." + +#: ../../src/spec/blog/index.rst:73 +msgid "``/topics/``: A list of topics available on the site." +msgstr "``/topics/``: Перелік доступних тем на сайті." + +#: ../../src/spec/blog/index.rst:74 +msgid "" +"``/topics//add/``: Add the selected topic to preferred topics list." +msgstr "``/topics//add/``: Додати обрану тему до списку обраних тем." + +#: ../../src/spec/blog/index.rst:75 +msgid "``/topics//remove/``: Removes the selected topic from preferred." +msgstr "``/topics//remove/``: Видаляє вибрану тему з обраних." + +#: ../../src/spec/blog/index.rst:76 +msgid "``/topics//subscribe/``: A view to subscribe for a topic." +msgstr "``/topics//subscribe/``: Представлення для підписки на тему." + +#: ../../src/spec/blog/index.rst:77 +msgid "``/topics//unsubscribe/``: A view to unsubscribe from a topic." +msgstr "``/topics//unsubscribe/``: Представлення для відписки від теми." + +#: ../../src/spec/blog/index.rst:78 +msgid "``/profile//``: A site user's personal page." +msgstr "``/profile//``: Особиста сторінка користувача сайту." + +#: ../../src/spec/blog/index.rst:79 +msgid "" +"``/set-password/``: This route will be used to change users' credential data." +msgstr "" +"``/set-password/``: Цей маршрут буде використовуватися для зміни облікових " +"даних користувачів." + +#: ../../src/spec/blog/index.rst:81 +msgid "``/set-userdata/``: This route will be user to change users' data." +msgstr "" +"``/set-userdata/``: Цей маршрут буде використовуватися для зміни даних " +"користувачів." + +#: ../../src/spec/blog/index.rst:82 +msgid "``/deactivate/``: Account deactivation (deletion) view." +msgstr "" +"``/deactivate/``: Представлення для деактивації облікового запису " +"(видалення)." + +#: ../../src/spec/blog/index.rst:83 +msgid "``/register/``: This view contains a user registration form." +msgstr "``/register/``: Сторінка з формою для реєстрації нового користувача." + +#: ../../src/spec/blog/index.rst:84 +msgid "``/login/``: This view contains a login form." +msgstr "``/login/``: Сторінка з формою для логіна." + +#: ../../src/spec/blog/index.rst:85 +msgid "" +"``/logout/``: Logout page. This view should redirect user back to homepage." +msgstr "" +"``/logout/``: Логаут. Має перенаправляти користувача назад на домашню " +"сторінку.." + +#: ../../src/spec/blog/index.rst:89 ../../src/spec/blog/index.rst:201 +#: ../../src/spec/blog/index.rst:231 ../../src/spec/blog/index.rst:409 +msgid "Optional task(s)" +msgstr "Додаткові завдання" + +#: ../../src/spec/blog/index.rst:91 +msgid "" +"``/archive///``: This view provides a list of articles " +"published on a specified month of a specified year. This view should apply " +"date validation and raise ``Http404`` for invalid paths. The valid date is a " +"year's 4-digits form followed by 1 or 2 digits representing month. Month " +"range should be limited as [1..12], leading zero may be omitted. Valid URLs " +"are:" +msgstr "" +"``/archive///``: Це представлення надає список статей, " +"опублікованих у певному місяці певного року. Це представлення повинно " +"застосовувати перевірку дати та викидати помилку ``Http404`` для " +"неприпустимих шляхів. Припустимою датою є 4-значний формат року, за яким " +"слідує 1 або 2 цифри, що представляють місяць. Діапазон місяця повинен бути " +"обмежений [1..12], ведучий нуль може бути пропущений. Приклади правильних " +"URL-адрес:" + +#: ../../src/spec/blog/index.rst:105 +msgid "Challenge: Data models" +msgstr "Завдання: моделі даних" + +#: ../../src/spec/blog/index.rst:108 +msgid "" +"Django admin may be used to create some dummy data. To gather access to " +"admin section you need to create a superuser. The easiest way to do that is " +"to use a django command:" +msgstr "" +"Для створення деяких фіктивних даних можна використовувати Django Admin. Щоб " +"отримати доступ до адміністративного розділу, вам потрібно створити " +"суперкористувача. Найпростіший спосіб зробити це - використовувати команду " +"Django:" + +#: ../../src/spec/blog/index.rst:117 ../../src/spec/blog/index.rst:218 +msgid "General" +msgstr "Основне" + +#: ../../src/spec/blog/index.rst:118 +msgid "Each model will be registered for admin site." +msgstr "Кожна модель буде зареєстрована на сторінці адміністрації сайту." + +#: ../../src/spec/blog/index.rst:121 ../../src/spec/blog/index.rst:456 +msgid "Article topic" +msgstr "Тема статті" + +#: ../../src/spec/blog/index.rst:122 +msgid "This is a simple model, that contains information about topic:" +msgstr "Ось проста модель, що містить інформацію про тему:" + +#: ../../src/spec/blog/index.rst:124 +msgid "topic title (unique value, 64 characters or fewer)" +msgstr "назва теми (унікальне значення, не більше 64 символів)" + +#: ../../src/spec/blog/index.rst:125 +msgid "topic short description (255 characters or fewer)" +msgstr "короткий опис теми (не більше 255 символів)" + +#: ../../src/spec/blog/index.rst:128 ../../src/spec/blog/index.rst:470 +msgid "Article" +msgstr "Стаття" + +#: ../../src/spec/blog/index.rst:129 +msgid "Article requires title (255 characters or fewer)." +msgstr "Стаття вимагає наявності заголовка (не більше 255 символів)." + +#: ../../src/spec/blog/index.rst:130 +msgid "Article requires content (at least 255 characters)." +msgstr "Стаття вимагає наявності змісту (принаймні 255 символів)." + +#: ../../src/spec/blog/index.rst:131 +msgid "" +"Creation date should be autogenerated at article creation, and would never " +"be updated." +msgstr "" +"Дата створення буде автоматично генеруватися при створенні статті і не буде " +"оновлюватися пізніше." + +#: ../../src/spec/blog/index.rst:133 +msgid "Updated date will be update at each article save." +msgstr "Дата оновлення буде оновлюватися при кожному збереженні статті." + +#: ../../src/spec/blog/index.rst:136 ../../src/spec/blog/index.rst:463 +msgid "Article comment" +msgstr "Коментар до статті" + +#: ../../src/spec/blog/index.rst:137 +msgid "Comment requires creation date (autogenerated)." +msgstr "Коментар вимагає наявності дати створення (автоматично генерується)." + +#: ../../src/spec/blog/index.rst:138 +msgid "Comment requires message text." +msgstr "Коментар вимагає наявності тексту повідомлення." + +#: ../../src/spec/blog/index.rst:141 +msgid "Relationships" +msgstr "Відносини" + +#: ../../src/spec/blog/index.rst:143 +msgid "" +"Standard Django user model **will be** used for now. To apply model " +"reference pass ``\"auth.User\"`` as related model. Users can be created via " +"admin page. You can also refer the same model as shown below:" +msgstr "" +"Стандартна модель користувача Django **буде** використовуватися наразі. Для " +"застосування посилання на модель передайте ``\"auth.User\"`` як пов'язану " +"модель. Користувачі можуть бути створені через адміністративну сторінку. Ви " +"також можете посилатися на ту саму модель, як показано нижче:" + +#: ../../src/spec/blog/index.rst:156 +msgid "``article`` and ``topics`` have *many-to-many* relationship." +msgstr "``article`` та ``topics`` мають *багато-до-багатьох* відношення." + +#: ../../src/spec/blog/index.rst:157 +msgid "" +"``article`` and ``user`` have *one-to-many* relationship. A article can have " +"**only one** author, but users can create as many articles as they want." +msgstr "" +"``article`` та ``user`` мають *один-до-багатьох* відношення. У статті може " +"бути **лише один** автор, але користувачі можуть створювати стільки статей, " +"скільки їм потрібно." + +#: ../../src/spec/blog/index.rst:160 +msgid "" +"``article`` and ``comment`` have *one-to-many* relationship. A article may " +"be a container for many comments, but a comment is related to a single " +"article." +msgstr "" +"``article`` та ``comment`` мають *один-до-багатьох* відношення. Стаття може " +"бути контейнером для багатьох коментарів, але коментар пов'язаний лише з " +"однією статтею." + +#: ../../src/spec/blog/index.rst:163 +msgid "" +"``comment`` and ``user`` have *one-to-many* relationship. It's similar to " +"*article - user* relationship." +msgstr "" +"``comment`` та ``user`` мають *один-до-багатьох* відношення. Це схоже на " +"відношення *стаття - користувач*." + +#: ../../src/spec/blog/index.rst:165 +msgid "" +"``topic`` and ``user`` use *many-to-many* relationship. A single user can " +"prefer none or as many topics as needed and vice versa. This relationship " +"represents topics preferred by a certain blog user. Also this provides an " +"additional option to mark some of preferred topics with a **notify** flag, " +"to receive newsletters about specified topics updates. The difference " +"between *prefer* and *notify* is that *preferred* topics affect the articles " +"list for a user, and *notify* is responsible for newsletters for the user." +msgstr "" +"``topic`` та ``user`` використовують відношення *багато-до-багатьох*. Один " +"користувач може вибрати будь-яку кількість тем, і навпаки. Це відношення " +"представляє теми, які вибрані певним користувачем блогу. Крім того, це надає " +"додаткову опцію позначити деякі з вибраних тем прапорцем **notify**, щоб " +"отримувати розсилки про оновлення зазначених тем. Відмінність між *prefer* " +"(вибір) та *notify* (сповіщення) полягає в тому, що *prefer* впливає на " +"список статей для користувача, а *notify* відповідає за розсилку новин для " +"користувача." + +#: ../../src/spec/blog/index.rst:176 +msgid "UML diagram" +msgstr "UML діаграми" + +#: ../../src/spec/blog/index.rst:181 +msgid "Challenge: ORM" +msgstr "Завдання: ORM" + +#: ../../src/spec/blog/index.rst:183 +msgid "" +"Update existing views to represent entities that are actually stored inside " +"the project's database." +msgstr "" +"Оновіть існуючі подання, щоб представити сутності, які фактично зберігаються " +"в базі даних проекту." + +#: ../../src/spec/blog/index.rst:186 +msgid "``/``: should represent a list of existing articles." +msgstr "``/``: повинен представляти список існуючих статей." + +#: ../../src/spec/blog/index.rst:187 +msgid "``/
/``: should represent a single existing article." +msgstr "``/
/``: повинен представляти окрему існуючу статтю." + +#: ../../src/spec/blog/index.rst:188 +msgid "Detail view should obtain a list of article related comments." +msgstr "" +"Вью для перегляду окремої статті повинен отримувати зв'язані коментарі." + +#: ../../src/spec/blog/index.rst:189 +msgid "" +"``/profile//``: should contain information about user and a " +"list of articles authored by this user." +msgstr "" +"``/profile//``: повинен містити інформацію про користувача та " +"список статей, написаних цим користувачем." + +#: ../../src/spec/blog/index.rst:191 +msgid "" +"All views related to a single entity (*detail*, *update*, *delete*, " +"*profile*) should raise ``Http404`` in case entity could not be fetched." +msgstr "" +"Усі ресурси, пов'язані з окремою сутністю (*деталі*, *оновлення*, " +"*видалення*, *профіль*) мають викликати ``Http404`` у випадку, якщо сутність " +"не вдалося отримати." + +#: ../../src/spec/blog/index.rst:196 +msgid "" +"It's common to store dedicated functions/classes that supports some specific " +"business logic in a separate module called ``services.py`` or ``utils.py`` " +"within an application directory." +msgstr "" +"Звичайно, функції/класи, що підтримують певну специфічну бізнес-логіку, " +"розумно зберігати в окремому модулі з назвою ``services.py`` або ``utils." +"py`` всередині директорії додатку." + +#: ../../src/spec/blog/index.rst:203 +msgid "" +"Create a service to fetch articles, ordered by a specified user preferences. " +"This means, topics preferred by a user affects articles orders. Queryset " +"should be ordered in way, to have articles with most corresponding topics at " +"the begging." +msgstr "" +"Створіть сервіс для того, щоб отримувати статі у вигляді відсортованому " +"згідно вподобань зазначеного користувача. Це означає, що чим більше тем " +"зазначених у статті співпадає з вподобаннями користувача, тим ближче вона до " +"початку видачі." + +#: ../../src/spec/blog/index.rst:209 +msgid "Challenge: Templates" +msgstr "Завдання: Шаблони" + +#: ../../src/spec/blog/index.rst:212 +msgid "Helpful link: `Bootstrap template`_" +msgstr "Корисне посилання: `Bootstrap template`_" + +#: ../../src/spec/blog/index.rst:215 +msgid "Links related to user data **may be** placeholders for now." +msgstr "" +"Посилання, що стосуються даних користувача, **можуть бути** плейсхолдерами " +"наразі." + +#: ../../src/spec/blog/index.rst:219 +msgid "**All** templates should be inherited from the ``base.html`` template." +msgstr "**Усі** шаблони повинні успадковувати ``base.html`` шаблон." + +#: ../../src/spec/blog/index.rst:220 +msgid "" +"Each page has a descriptive title HTML tag, which included ``| Blog`` " +"suffix, e.g. \"Articles | Blogs\", \"Sample | Blog\", \"Login | Blog\" etc." +msgstr "" +"Кожна сторінка має описовий тег HTML заголовка, включаючи суфікс ``| Blog``, " +"наприклад, \"Articles | Blogs\", \"Sample | Blog\", \"Login | Blog\" і т.д." + +#: ../../src/spec/blog/index.rst:222 +msgid "Each page should contain a link to homepage (``/`` URL route)." +msgstr "" +"Кожна сторінка повинна містити посилання на головну сторінку (шлях URL ``/" +"``)." + +#: ../../src/spec/blog/index.rst:223 +msgid "" +"Each page contains a list of registered topics. Each view of this kind " +"filters only articles of a relevant topic. This should be implemented with a " +"custom template context processor." +msgstr "" +"Кожна сторінка містить список зареєстрованих тем. Кожне представлення цього " +"типу фільтрує лише статті відповідної теми. Це слід реалізувати за допомогою " +"власного обробника контексту шаблону (template context processor)." + +#: ../../src/spec/blog/index.rst:226 +msgid "Replace content block for *about* page with some static content." +msgstr "" +"Замініть блок вмісту (content block) для сторінки *about* на деякий " +"статичний вміст." + +#: ../../src/spec/blog/index.rst:227 +msgid "" +"Application-level templates should be located within appropriate " +"applications." +msgstr "Шаблони рівня застосунків розташовуватися у відповідних застосунках." + +#: ../../src/spec/blog/index.rst:233 +msgid "" +"Each page should contain a list of links to archive views for the last year." +msgstr "" +"Кожна сторінка має містити список посилань на перегляди архіву за останній " +"рік." + +#: ../../src/spec/blog/index.rst:235 +msgid "Each page should contain an inclusion-block(s) with following links:" +msgstr "Кожна сторінка повинна містити блок(и) включення з такими посиланнями:" + +#: ../../src/spec/blog/index.rst:237 +msgid "``/registration/``: new user registration form" +msgstr "``/register/``: форма реєстрації нового користувача" + +#: ../../src/spec/blog/index.rst:238 +msgid "``/login/``: user login form" +msgstr "``/login/``: форма логіна користувача" + +#: ../../src/spec/blog/index.rst:239 +msgid "``/create/``: article creation page" +msgstr "``/create/``: форма створення статті" + +#: ../../src/spec/blog/index.rst:242 +msgid "Articles list" +msgstr "Список статей" + +#: ../../src/spec/blog/index.rst:243 +msgid "Main page contains a list of published articles." +msgstr "Головна сторінка містить список опублікованих статей." + +#: ../../src/spec/blog/index.rst:244 +msgid "Each article entity is rendered using a custom template tag." +msgstr "" +"Кожен елемент статті відображається за допомогою власного шаблонного тегу." + +#: ../../src/spec/blog/index.rst:245 +msgid "``article`` template tag renders information about a article object:" +msgstr "Шаблонний тег ``article`` відображає інформацію про об'єкт статті:" + +#: ../../src/spec/blog/index.rst:247 +msgid "article title" +msgstr "заголовок статті" + +#: ../../src/spec/blog/index.rst:248 +msgid "article content (trimmed to ~50 characters)" +msgstr "зміст статті (обрізаний до ~50 символів)" + +#: ../../src/spec/blog/index.rst:249 +msgid "article creation date" +msgstr "дата створення статті" + +#: ../../src/spec/blog/index.rst:250 +msgid "related topics (3 topics or fewer)" +msgstr "пов'язані теми (3 або менше)" + +#: ../../src/spec/blog/index.rst:251 +msgid "number of related comments" +msgstr "кількість коментарів до статті" + +#: ../../src/spec/blog/index.rst:258 +msgid "Article details" +msgstr "Деталі статті" + +#: ../../src/spec/blog/index.rst:260 +msgid "Article update and deletion views **would not** affect data for now." +msgstr "Оновлення та видалення статей **не будуть** впливати на дані наразі." + +#: ../../src/spec/blog/index.rst:262 +msgid "" +"A article detail page contains links to **update** or **delete** current " +"article." +msgstr "" +"На сторінці деталей статті мають бути посилання на **оновлення** або " +"**видалення** поточної статті." + +#: ../../src/spec/blog/index.rst:264 +msgid "Page provides information about article:" +msgstr "Сторінка надає інформацію про статтю:" + +#: ../../src/spec/blog/index.rst:266 +msgid "Article title" +msgstr "Заголовок статті" + +#: ../../src/spec/blog/index.rst:267 +msgid "Creation date" +msgstr "Дата створення" + +#: ../../src/spec/blog/index.rst:268 ../../src/spec/blog/index.rst:275 +msgid "Author name" +msgstr "Ім'я автора" + +#: ../../src/spec/blog/index.rst:269 +msgid "Related topics" +msgstr "Пов'язані теми" + +#: ../../src/spec/blog/index.rst:270 +msgid "Article content" +msgstr "Вміст статті" + +#: ../../src/spec/blog/index.rst:272 +msgid "Page contains a list of related comments." +msgstr "Сторінка містить список пов'язаних коментарів." + +#: ../../src/spec/blog/index.rst:273 +msgid "Each comment contains:" +msgstr "Кожен коментар містить:" + +#: ../../src/spec/blog/index.rst:276 +msgid "Comment creation time" +msgstr "Час створення коментаря" + +#: ../../src/spec/blog/index.rst:277 +msgid "Comment message" +msgstr "Текст комментаря" + +#: ../../src/spec/blog/index.rst:280 +msgid "Profile page" +msgstr "Строніка профілю" + +#: ../../src/spec/blog/index.rst:281 +msgid "Author page contains information about author:" +msgstr "Сторінка автора містить інформацію про автора:" + +#: ../../src/spec/blog/index.rst:283 +msgid "First name" +msgstr "Ім'я" + +#: ../../src/spec/blog/index.rst:284 +msgid "Last name" +msgstr "Прізвище" + +#: ../../src/spec/blog/index.rst:286 +msgid "Add more information, if needed." +msgstr "Додайте більше інформації за бажанням." + +#: ../../src/spec/blog/index.rst:288 +msgid "Author page contains a list of articles created by this author." +msgstr "Сторінка автора містить список статей, створених цим автором." + +#: ../../src/spec/blog/index.rst:289 +msgid "" +"Author page contains buttons/links to change user data and password or " +"deactivate a user's account." +msgstr "" +"Сторінка автора містить кнопки/посилання для зміни користувача та пароля або " +"деактивації облікового запису користувача." + +#: ../../src/spec/blog/index.rst:293 +msgid "Forms" +msgstr "Форми" + +#: ../../src/spec/blog/index.rst:295 +msgid "" +"There is **no need** to add actual forms now. They will be generated by " +"Django. This section describes the final view of these pages. It's ok just " +"to create a dedicated templates for future use." +msgstr "" +"Наразі **немає потреби** додавати фактичні форми. Вони будуть створені " +"Django. Цей розділ описує кінцевий вигляд цих сторінок. Для майбутнього " +"використання достатньо створити окремі шаблони." + +#: ../../src/spec/blog/index.rst:299 +msgid "" +"``/register/`` page contains a new user registration form. It should take " +"inputs from the user:" +msgstr "" +"Сторінка ``/register/`` містить форму реєстрації нового користувача. Вона " +"повинна отримувати введені дані від користувача:" + +#: ../../src/spec/blog/index.rst:302 ../../src/spec/blog/index.rst:310 +msgid "username" +msgstr "username" + +#: ../../src/spec/blog/index.rst:303 +msgid "email" +msgstr "email" + +#: ../../src/spec/blog/index.rst:304 ../../src/spec/blog/index.rst:311 +msgid "password" +msgstr "password" + +#: ../../src/spec/blog/index.rst:305 ../../src/spec/blog/index.rst:324 +msgid "confirm password" +msgstr "confirm password" + +#: ../../src/spec/blog/index.rst:307 +msgid "" +"``/login/`` page contains a user login form. It should take the inputs from " +"the user:" +msgstr "" +"Сторінка ``/login/`` містить форму входу користувача. Вона повинна " +"отримувати введені дані від користувача:" + +#: ../../src/spec/blog/index.rst:313 +msgid "" +"``/create/`` and ``/
/update/`` pages contain a form to collect a " +"article's data:" +msgstr "" +"Сторінки ``/create/`` та ``/
/update/`` містять форму для збору " +"даних статті:" + +#: ../../src/spec/blog/index.rst:316 +msgid "title" +msgstr "title" + +#: ../../src/spec/blog/index.rst:317 +msgid "relevant topics" +msgstr "відповідні теми" + +#: ../../src/spec/blog/index.rst:318 +msgid "content" +msgstr "content" + +#: ../../src/spec/blog/index.rst:320 +msgid "``/
/delete`` page contains a simple delete confirmation form." +msgstr "" +"Сторінка ``/
/delete`` містить просту форму для підтвердження " +"видалення." + +#: ../../src/spec/blog/index.rst:321 +msgid "Change password form has two fields:" +msgstr "Форма зміни пароля має два поля:" + +#: ../../src/spec/blog/index.rst:323 +msgid "new password" +msgstr "new password" + +#: ../../src/spec/blog/index.rst:326 +msgid "" +"Change user's data form collects all information, that can be changed, e.g. " +"``username``, ``first name``, ``last name`` etc." +msgstr "" +"Форма зміни даних користувача збирає всю інформацію, яка може бути змінена, " +"наприклад, ``username``, ``first name``, ``last name`` та інше." + +#: ../../src/spec/blog/index.rst:328 +msgid "" +"User preferences page contains a list of available topics. User can mark " +"some topics as preferred. Also for preferred topics an option to *subscribe* " +"for the newsletters becomes available." +msgstr "" +"Сторінка налаштувань користувача містить список доступних тем. Користувач " +"може відмітити деякі теми як пріоритетні (переваги). Також для пріоритетних " +"тем стає доступною опція *підписки* на розсилку новинних листів." + +#: ../../src/spec/blog/index.rst:333 +msgid "Challenge: Articles' slugs" +msgstr "Виклик: Slug-и статей" + +#: ../../src/spec/blog/index.rst:336 +msgid "This is an optional challenge in addition to:" +msgstr "Це додатковий виклик у додаток до:" + +#: ../../src/spec/blog/index.rst:338 +msgid "`Challenge: Functional views`_" +msgstr "`Challenge: Functional views`_" + +#: ../../src/spec/blog/index.rst:339 +msgid "`Challenge: Templates`_" +msgstr "`Challenge: Templates`_" + +#: ../../src/spec/blog/index.rst:340 +msgid "`Challenge: Data models`_" +msgstr "`Challenge: Data models`_" + +#: ../../src/spec/blog/index.rst:341 +msgid "`Challenge: ORM`_" +msgstr "`Challenge: ORM`_" + +#: ../../src/spec/blog/index.rst:343 +msgid "Update ``Article`` model with ``slug`` field. The slug value is:" +msgstr "" +"Оновіть модель ``Article``, додавши поле ``slug``. Значення slug поля є:" + +#: ../../src/spec/blog/index.rst:345 +msgid "required for each article" +msgstr "обов'язкове для кожної статті" + +#: ../../src/spec/blog/index.rst:346 +msgid "unique for each article" +msgstr "унікальне для кожної статті" + +#: ../../src/spec/blog/index.rst:348 +msgid "Create a data migration to provide slugs for existing articles." +msgstr "Створіть міграцію даних для надання slug-ів існуючим статтям." + +#: ../../src/spec/blog/index.rst:349 +msgid "" +"``slug`` should be auto-generated on article save. The pattern is ``article." +"title-article.created_date``, e.g. \"Sample article\" created at " +"\"03/24/2023\" should receive slug: ``sample-article-2023-03-24``." +msgstr "" +"Поле ``slug`` повинно автоматично генеруватися при збереженні статті. Шаблон " +"для генерації поля ``slug``: ``назва-статті-дата-створення-статті``, " +"наприклад, стаття з назвою \"Sample article\", створена \"24/03/2023\", " +"отримає slug: ``sample-article-2023-03-24``." + +#: ../../src/spec/blog/index.rst:353 +msgid "Update detail view URL path with article slug as dynamic portion." +msgstr "" +"Оновіть шлях URL для представлення деталей статті з динамічною частиною, " +"якою буде slug статті." + +#: ../../src/spec/blog/index.rst:356 +msgid "Challenge: Auth forms" +msgstr "Завдання: форми авторизації" + +#: ../../src/spec/blog/index.rst:358 +msgid "Create form for new users registration with required fields:" +msgstr "" +"Створити форму для реєстрації нових користувачів із обов'язковими полями:" + +#: ../../src/spec/blog/index.rst:360 +msgid "``username``" +msgstr "``username``" + +#: ../../src/spec/blog/index.rst:361 +msgid "``email``" +msgstr "``email``" + +#: ../../src/spec/blog/index.rst:362 +msgid "``password``" +msgstr "``password``" + +#: ../../src/spec/blog/index.rst:363 +msgid "``confirm password``" +msgstr "``confirm password``" + +#: ../../src/spec/blog/index.rst:365 +msgid "``username`` value should be validated against existing values." +msgstr "" +"Значення ``username`` повинно перевірятися на відповідність існуючим " +"значенням." + +#: ../../src/spec/blog/index.rst:366 +msgid "``password`` and ``confirm password`` values should match." +msgstr "Значення ``password`` і ``confirm password`` мають збігатися." + +#: ../../src/spec/blog/index.rst:367 +msgid "Create form for existing users login." +msgstr "Створити форму для входу існуючих користувачів." + +#: ../../src/spec/blog/index.rst:368 +msgid "Validations errors are to be rendered on the template." +msgstr "Помилки перевірки повинні відображатися на шаблоні." + +#: ../../src/spec/blog/index.rst:371 +msgid "Challenge: Authentication" +msgstr "Завдання: Автентифікація" + +#: ../../src/spec/blog/index.rst:373 +msgid "" +"For anonymous users ``/register/`` and ``/login/`` links should be visible " +"in navbar." +msgstr "" +"Для анонімних користувачів посилання ``/register/`` і ``/login/`` мають бути " +"видимими на панелі навігації." + +#: ../../src/spec/blog/index.rst:375 +msgid "" +"For authenticated users ``/logout/`` and ``/create/`` links should be " +"visible in navbar." +msgstr "" +"Для автентифікованих користувачів посилання ``/logout/`` і ``/create/`` " +"мають бути видимими на панелі навігації." + +#: ../../src/spec/blog/index.rst:377 +msgid "" +"If authenticated user is admin or stuff they should see a link to admin page." +msgstr "" +"Якщо автентифікований користувач є адміністратором або іншим, він має " +"побачити посилання на сторінку адміністратора." + +#: ../../src/spec/blog/index.rst:379 +msgid "" +"``/register/``: Users should provide all required information about them: " +"desired username and email. Name data (both first and last) is optional. " +"After user creation they should be redirected to login page to perform " +"authentication process. Invalid form should provide information about " +"error(s)." +msgstr "" +"``/register/``: користувачі повинні надати всю необхідну інформацію про " +"себе: бажане ім'я користувача та електронну адресу. Дані імені (ім'я та " +"прізвище) необов'язкові. Після створення користувача вони повинні бути " +"перенаправлені на сторінку входу для виконання процесу автентифікації. " +"Недійсна форма повинна надавати інформацію про помилку(и)." + +#: ../../src/spec/blog/index.rst:384 +msgid "" +"``/login/``: Users should provide their credentials to login. In case login " +"is successful they should be redirected to their profile (if no ``?" +"next=url`` query string available)." +msgstr "" +"``/login/``: користувачі повинні надати свої облікові дані для входу. У разі " +"успішного входу вони повинні бути перенаправлені до свого профілю (якщо " +"немає рядка запиту ``?next=url``)." + +#: ../../src/spec/blog/index.rst:387 +msgid "" +"``/create/``: Only authenticated users should be able to visit this page. In " +"case anonymous user is trying to request this view they should be redirected " +"to the login view first, and after successful authentication get back to " +"article creation. Then a article is created, it should be authored by the " +"currently authenticated user." +msgstr "" +"``/create/``: Лише аутентифіковані користувачі повинні мати доступ до цієї " +"сторінки. Якщо анонімний користувач намагається отримати доступ до цього " +"представлення, його повинно перенаправити спочатку на сторінку входу, а " +"після успішної аутентифікації повернути на сторінку створення статті. При " +"створенні статті вона повинна мати автором поточного аутентифікованого " +"користувача." + +#: ../../src/spec/blog/index.rst:392 +msgid "" +"``/
/comment/``: Currently authenticated user should be referenced " +"as a comment's author." +msgstr "" +"``/
/comment/``: У коментарі поточного аутентифікованого користувача " +"повинна бути зазначена його ідентифікація як автора." + +#: ../../src/spec/blog/index.rst:394 +msgid "" +"Articles may be modified or deleted only by their authors from the detail " +"article page. However, admins can still performs articles actions from the " +"admin page." +msgstr "" +"Змінювати або видаляти статті можуть тільки їх автори на сторінці деталей " +"статті. Однак адміністратори все ще можуть виконувати дії зі статтями через " +"адміністративну сторінку." + +#: ../../src/spec/blog/index.rst:397 +msgid "User related paths are restricted for non-authorized users." +msgstr "" +"Шляхи, пов'язані з користувачем, обмежені для неаутентифікованих " +"користувачів." + +#: ../../src/spec/blog/index.rst:399 +msgid "``/set-password/``" +msgstr "``/set-password/``" + +#: ../../src/spec/blog/index.rst:400 +msgid "``/set-userdata/``" +msgstr "``/set-userdata/``" + +#: ../../src/spec/blog/index.rst:402 +msgid "" +"``POST`` request ``/deactivate/`` should mark current authenticated user as " +"*deleted* and log them user." +msgstr "" +"Запит ``POST`` на ``/deactivate/`` повинен позначати поточного " +"аутентифікованого користувача як *видаленого* і виходити з системи для цього " +"користувача." + +#: ../../src/spec/blog/index.rst:404 +msgid "" +"Authenticated users should be able to adjust their preferred topics lists." +msgstr "" +"Авторизовані користувачі повинні мати можливість налаштовувати свої списки " +"обраних тем." + +#: ../../src/spec/blog/index.rst:405 +msgid "" +"Authenticated users should be able to **subscribe** or **unsubscribe** for a " +"selected topic." +msgstr "" +"Авторизовані користувачі повинні мати можливість **підписатися** або " +"**відписатися** на обрану тему." + +#: ../../src/spec/blog/index.rst:411 +msgid "" +"Adjust the order of article list according to authenticated user " +"preferences. For anonymous users keep default ordering." +msgstr "" +"Призначте зміну порядку списку статей відповідно до вподобань " +"аутентифікованого користувача. Для анонімних користувачів залиште типове " +"сортування за замовчуванням." + +#: ../../src/spec/blog/index.rst:413 +msgid "" +"Implement account reactivation behavior. The exact workflow does not mater. " +"The sample scenario is to collect email for the user and check it for " +"existing in the database. After that create a request for admin to activate " +"an account and send a confirmation email, when all is done." +msgstr "" +"Реалізуйте поведінку щодо відновлення облікового запису. Точний порядок дій " +"не має значення. Один зі зразків сценаріїв може полягати у зборі електронної " +"пошти користувача та перевірки наявності цієї адреси в базі даних. Після " +"цього створіть запит для адміністратора на активацію облікового запису та " +"надішліть підтверджувальний лист електронною поштою, коли все буде готово." + +#: ../../src/spec/blog/index.rst:419 +msgid "Challenge: Article related forms" +msgstr "Виклик: Форми пов'язані зі статтями" + +#: ../../src/spec/blog/index.rst:421 +msgid "" +"Implement a article form. This form will be used to create new articles and " +"to update existing ones." +msgstr "" +"Реалізуйте форму статті. Ця форма буде використовуватися для створення нових " +"статей та оновлення існуючих." + +#: ../../src/spec/blog/index.rst:423 +msgid "Each created article should have at least one related topic." +msgstr "Кожна створена стаття повинна мати принаймні одну пов'язану тему." + +#: ../../src/spec/blog/index.rst:424 +msgid "Implement a comment form to gather a comment from a user." +msgstr "Реалізуйте форму коментаря, щоб збирати коментарі від користувача." + +#: ../../src/spec/blog/index.rst:425 +msgid "" +"Only ``POST`` requests to ``/
/comment/`` are allowed from this " +"moment." +msgstr "" +"З даного моменту дозволені лише запити типу ``POST`` до ``/
/comment/" +"``." + +#: ../../src/spec/blog/index.rst:427 +msgid "Implement functionality:" +msgstr "Реалізуйте функціональність:" + +#: ../../src/spec/blog/index.rst:429 +msgid "article creation" +msgstr "створення статті" + +#: ../../src/spec/blog/index.rst:430 +msgid "article update" +msgstr "оновлення статті" + +#: ../../src/spec/blog/index.rst:431 +msgid "article comment (create a related comment)" +msgstr "коментування статті (створення коментаря)" + +#: ../../src/spec/blog/index.rst:432 +msgid "article deletion" +msgstr "видалення статті" + +#: ../../src/spec/blog/index.rst:434 +msgid "Only authenticated users can create articles." +msgstr "Лише аутентифіковані користувачі можуть створювати статі." + +#: ../../src/spec/blog/index.rst:435 +msgid "Article can be edited only by its author." +msgstr "Стаття може редагуватись лише її автором." + +#: ../../src/spec/blog/index.rst:436 +msgid "Article can be deleted only by its author." +msgstr "Стаття може видалятись лише її автором." + +#: ../../src/spec/blog/index.rst:437 +msgid "Only authenticated users can comment articles." +msgstr "Лише аутентифіковані користувачі можуть коментувати статті." + +#: ../../src/spec/blog/index.rst:444 +msgid "Challenge: Class-Based Views" +msgstr "Завдання: Class-Based Views" + +#: ../../src/spec/blog/index.rst:446 +msgid "Replace **all** existing views via ``CBV``." +msgstr "Замінити **всі** існуючі перегляди через ``CBV``." + +#: ../../src/spec/blog/index.rst:447 +msgid "Existing functionality should not be corrupted." +msgstr "Існуюча функціональність не повинна бути пошкоджена." + +#: ../../src/spec/blog/index.rst:450 +msgid "It's ok to use built-in Django CBV if needed." +msgstr "" +"Якщо потрібно, можна використовувати вбудовані класи відображення у Django " +"(CBV)." + +#: ../../src/spec/blog/index.rst:453 +msgid "Challenge: Serializers" +msgstr "Завдання: Серіалізатори" + +#: ../../src/spec/blog/index.rst:457 +msgid "" +"Topic serializer is for read-only purposes only. Topics can be created via " +"admin page only." +msgstr "" +"Серіалізатор для теми призначений лише для операцій читання (read-only). " +"Теми можна створювати лише через адміністративну сторінку." + +#: ../../src/spec/blog/index.rst:459 +msgid "" +"Serialized data should contain all available data, e.g. ``pk``, ``title``, " +"``description``." +msgstr "" +"Серіалізовані дані повинні містити всю доступну інформацію, наприклад, " +"``pk``, ``title``, ``description``." + +#: ../../src/spec/blog/index.rst:464 +msgid "" +"article comment serializer can perform both reading and writing operations. " +"But it can't be used to *update* or *delete* comment." +msgstr "" +"серіалізатор коментаря статті може виконувати як операції читання, так і " +"операції запису. Проте він не може використовуватися для оновлення або " +"видалення коментаря." + +#: ../../src/spec/blog/index.rst:466 +msgid "" +"Random, or pre-defined user may be used as comment's author for now. This " +"will be fixed in the future." +msgstr "" +"Наразі можна використовувати випадкового або попередньо визначеного " +"користувача як автора коментаря. Це буде виправлено у майбутньому." + +#: ../../src/spec/blog/index.rst:471 +msgid "" +"article serializer provides full access to articles. All operations are " +"available: list, retrieve, create, update and destroy." +msgstr "" +"серіалізатор статей надає повний доступ до статей. Доступні всі операції: " +"отримання списку, отримання окремої статті, створення нової статті, " +"оновлення та видалення." + +#: ../../src/spec/blog/index.rst:475 +msgid "User" +msgstr "Користувач" + +#: ../../src/spec/blog/index.rst:476 +msgid "" +"User serializer provides full access to site users data. All operations are " +"available for now: list, retrieve, create, update and destroy. This behavior " +"will be fixed in the future, to prevent unauthorized data modifications." +msgstr "" +"Серіалізатор користувача надає повний доступ до даних користувачів сайту. " +"Усі операції доступні наразі: отримання списку користувачів, отримання " +"окремого користувача, створення нового користувача, оновлення та видалення. " +"Однак, ця поведінка буде виправлена у майбутньому для запобігання " +"несанкціонованим змінам даних." + +#: ../../src/spec/blog/index.rst:482 +msgid "Challenge: API views" +msgstr "Завдання: API views" + +#: ../../src/spec/blog/index.rst:484 +msgid "All blog-site functionality are to be mirrored via REST API." +msgstr "" +"Вся функціональність сайту повинна бути відображена за допомогою REST API." + +#: ../../src/spec/blog/index.rst:487 +msgid "" +"It's ok to pass *pre-defined* user as argument in request's body. This will " +"be fixed in the next challenge." +msgstr "" +"Наразі дозволяється передавати *наперед визначеного* користувача у тілі " +"запиту. Це буде виправлено у наступному розділі." + +#: ../../src/spec/blog/index.rst:491 +msgid "Challenge: Authentication and Permissions" +msgstr "Завдання: Автентифікація та Дозволи" + +#: ../../src/spec/blog/index.rst:493 +msgid "Implement authentication system for REST API." +msgstr "Реалізуйте систему аутентифікації для REST API." + +#: ../../src/spec/blog/index.rst:495 +msgid "For non-authenticated users it is possible to create a new account" +msgstr "" +"Для неаутентифікованих користувачів можлива створення нового облікового " +"запису" + +#: ../../src/spec/blog/index.rst:496 +msgid "" +"For non-authenticated users it is possible to obtain authentication data." +msgstr "" +"Для неаутентифікованих користувачів можлива отримання даних аутентифікації." + +#: ../../src/spec/blog/index.rst:499 +msgid "" +"Access to user data is restricted. Authorized users can manipulate only " +"their own data (e.g. ``retrieve``, ``update``)." +msgstr "" +"Доступ до даних користувача обмежений. Авторизовані користувачі можуть " +"маніпулювати лише своїми власними даними (наприклад, ``retrieve``, " +"``update``)." + +#: ../../src/spec/blog/index.rst:501 +msgid "" +"Admins can retrieve all users data (``list``), but can't change them via " +"REST API. However, it is still possible via admin page." +msgstr "" +"Адміністратори можуть отримати дані всіх користувачів (``list``), але не " +"можуть змінювати їх через REST API. Однак це все ще можливо через " +"адміністративну сторінку." + +#: ../../src/spec/blog/index.rst:503 +msgid "" +"Authorized users can ``create`` articles or ``update`` and ``delete`` " +"articles created by them." +msgstr "" +"Авторизовані користувачі можуть ``create`` статті або ``update`` та " +"``delete`` статті, створені ними." + +#: ../../src/spec/blog/index.rst:505 +msgid "Authorized users can add comments to a specified article." +msgstr "Авторизовані користувачі можуть додавати коментарі до вказаної статті." + +#: ../../src/spec/blog/index.rst:506 +msgid "Authorized users can adjust their topics preferences." +msgstr "" +"Авторизовані користувачі можуть налаштовувати свої уподобання щодо тем." diff --git a/src/_locales/uk/LC_MESSAGES/spec/giver/index.po b/src/_locales/uk/LC_MESSAGES/spec/giver/index.po new file mode 100644 index 000000000..a6cf6410e --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/spec/giver/index.po @@ -0,0 +1,391 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.09.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-02 14:46+0200\n" +"PO-Revision-Date: 2023-12-02 16:54+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.1\n" +"X-Generator: Poedit 3.4.1\n" + +#: ../../src/spec/giver/index.rst:4 +msgid "Anonymous Giver Site" +msgstr "Сайт Анонімних Дарульвальників" + +#: ../../src/spec/giver/index.rst:6 +msgid "" +"The project is inspired by \"Secret Santa\" (aka \"Secret Nicholas\") " +"Christmas tradition, but it does not focus on specific celebrations or " +"events. The primary objective is to create a place on the internet where " +"people can gather together in groups and anonymously give gifts to each " +"other." +msgstr "" +"Проект натхненний різдвяною традицією \"Таємного Санти\" (також відомого як " +"\"Таємний Миколай\"), але він не фокусується на конкретних святкуваннях чи " +"подіях. Основна мета - створити в інтернеті місце, де люди можуть збиратися " +"в групи і анонімно дарувати один одному подарунки." + +#: ../../src/spec/giver/index.rst:12 +msgid "Key features" +msgstr "Ключові особливості" + +#: ../../src/spec/giver/index.rst:15 ../../src/spec/giver/index.rst:46 +msgid "Wish lists" +msgstr "Списки побажань" + +#: ../../src/spec/giver/index.rst:16 +msgid "" +"Any registered user can create and modify their own wish lists. The wish " +"list is generally private and is not visible to other users, unless they are " +"assigned as a gift-giver to the wish list owner." +msgstr "" +"Будь-який зареєстрований користувач може створювати і змінювати власні " +"списки бажань. Список бажань, як правило, є приватним і не видимим для інших " +"користувачів, якщо тільки вони не призначені дарувальником для власника " +"списку." + +#: ../../src/spec/giver/index.rst:21 +msgid "Many gift-giving campaigns" +msgstr "Багаточисельні кампанії з роздачі подарунків" + +#: ../../src/spec/giver/index.rst:22 +msgid "Users can join multiple gift-giving campaigns without any limit." +msgstr "Користувачі можуть долучатися до кількох кампаній без обмежень." + +#: ../../src/spec/giver/index.rst:25 +msgid "Personal reminders" +msgstr "Персональні нагадування" + +#: ../../src/spec/giver/index.rst:26 +msgid "" +"Users with empty wish lists will be prompted to place something there. " +"Similarly, dormant users will be prompted to join an existing gift-giving " +"campaign." +msgstr "" +"Користувачам з порожніми списками бажань буде запропоновано додати туди " +"щось. Так само неактивним користувачам буде запропоновано приєднатися до вже " +"існуючої кампанії з дарування подарунків." + +#: ../../src/spec/giver/index.rst:31 +msgid "Administration can't interfere" +msgstr "Адміністрація не може втручатися" + +#: ../../src/spec/giver/index.rst:32 +msgid "" +"Site admins provide moderation for wish lists and support gift-giving " +"campaigns. But they cannot create their own campaigns, or modify or remove " +"existing campaigns created by other users." +msgstr "" +"Адміністратори сайту модерують списки бажань і підтримують кампанії з " +"дарування подарунків. Але вони не можуть створювати власні кампанії, " +"змінювати або видаляти існуючі кампанії, створені іншими користувачами." + +#: ../../src/spec/giver/index.rst:37 +msgid "Registration and authentication" +msgstr "Реєстрація та аутентифікація користувачів" + +#: ../../src/spec/giver/index.rst:39 +msgid "Anonymous users may access any publicly available page." +msgstr "" +"Анонімні користувачі можуть отримати доступ до будь-якої загальнодоступної " +"сторінки." + +#: ../../src/spec/giver/index.rst:40 +msgid "" +"Anonymous users can register by providing a username, fullname, and password." +msgstr "" +"Анонімні користувачі можуть зареєструватися, вказавши ім'я користувача, " +"повне ім'я та пароль." + +#: ../../src/spec/giver/index.rst:42 +msgid "Anonymous users can log in to their existing account." +msgstr "Анонімні користувачі можуть увійти до свого облікового запису." + +#: ../../src/spec/giver/index.rst:43 +msgid "Authenticated users can log out at any time." +msgstr "Авторизовані користувачі можуть вийти з системи в будь-який час." + +#: ../../src/spec/giver/index.rst:48 +msgid "Wish lists are personal collections of desired gifts." +msgstr "Список бажань - це особиста колекція бажаних подарунків." + +#: ../../src/spec/giver/index.rst:50 +msgid "A wish list is created for any registered user, except admins." +msgstr "" +"Список побажань створюється для будь-якого зареєстрованого користувача, " +"окрім адміністраторів." + +#: ../../src/spec/giver/index.rst:51 +msgid "" +"Users must add at least one item to their wish list before using the site." +msgstr "" +"Перед тим, як користуватися сайтом, користувачі повинні додати принаймні " +"один пункт до свого списку бажань." + +#: ../../src/spec/giver/index.rst:52 +msgid "A wish list is available only to its owner and site admins." +msgstr "Список побажань доступний лише його власнику та адміністраторам сайту." + +#: ../../src/spec/giver/index.rst:53 +msgid "" +"A wish list is temporary available to other users assigned as a gift-giver " +"to its owner." +msgstr "" +"Список бажань тимчасово доступний іншим користувачам, призначеним " +"дарувальником його власнику." + +#: ../../src/spec/giver/index.rst:55 +msgid "Owners can add, modify, or remove entries in their wish lists." +msgstr "" +"Власники можуть додавати, змінювати або видаляти записи у своїх списках " +"бажань." + +#: ../../src/spec/giver/index.rst:56 +msgid "" +"Admins can mark any wish list item as restricted, which makes it act as a " +"deleted one." +msgstr "" +"Адміністратори можуть позначити будь-яку позицію списку бажань як обмежену, " +"і тоді вона буде діяти як видалена." + +#: ../../src/spec/giver/index.rst:60 +msgid "Gift-giving campaigns" +msgstr "Кампанії з роздачі подарунків" + +#: ../../src/spec/giver/index.rst:62 +msgid "Non-admin users can create their own gift-giving campaigns." +msgstr "" +"Користувачі, які не є адміністраторами, можуть створювати власні кампанії з " +"дарування подарунків." + +#: ../../src/spec/giver/index.rst:63 +msgid "Each campaign should have name, description and members list." +msgstr "Кожна кампанія повинна мати назву, опис та список учасників." + +#: ../../src/spec/giver/index.rst:64 +msgid "The campaign creator is automatically a member and cannot be excluded." +msgstr "Творець кампанії автоматично стає учасником і не може бути виключений." + +#: ../../src/spec/giver/index.rst:65 +msgid "Campaigns status can be draft, public, private, or completed." +msgstr "Статус кампанії може бути чернетка, публічна, приватна або завершена." + +#: ../../src/spec/giver/index.rst:66 +msgid "" +"Admins or the campaign creator can run the campaign if it has at least 3 " +"members." +msgstr "" +"Адміни або творець кампанії можуть запустити кампанію, якщо в ній є " +"щонайменше 3 учасники." + +#: ../../src/spec/giver/index.rst:68 +msgid "Campaigns cannot be joined once they have started." +msgstr "Приєднатися до кампанії після її початку неможливо." + +#: ../../src/spec/giver/index.rst:69 +msgid "" +"Any user, except the creator, can leave the campaign if it hasn't started." +msgstr "" +"Будь-який користувач, окрім автора, може вийти з кампанії, якщо вона не " +"розпочалася." + +#: ../../src/spec/giver/index.rst:70 +msgid "" +"The creator can remove non-running campaigns regardless of members list, " +"creation time, or status." +msgstr "" +"Творець може видалити неактивні кампанії незалежно від списку учасників, " +"часу створення або статусу." + +#: ../../src/spec/giver/index.rst:72 +msgid "" +"Admins can remove the campaigns with 3 or fewer members that hasn't started " +"within a specified time." +msgstr "" +"Адміністратори можуть видаляти кампанії з 3 або менше учасниками, які не " +"розпочалися протягом певного часу." + +#: ../../src/spec/giver/index.rst:74 +msgid "" +"Admins can remove draft campaigns that haven't been published within a " +"specified time." +msgstr "" +"Адміністратори можуть видаляти чернетки кампаній, які не були опубліковані " +"протягом певного часу." + +#: ../../src/spec/giver/index.rst:76 +msgid "" +"The number of campaigns a user can be member of is limited by the number of " +"items in their wish list." +msgstr "" +"Кількість кампаній, в яких може брати участь користувач, обмежена кількістю " +"пунктів у його списку бажань." + +#: ../../src/spec/giver/index.rst:80 +msgid "Draft campaigns" +msgstr "Проекти (чернетки) кампаній" + +#: ../../src/spec/giver/index.rst:81 +msgid "No user can join a draft campaign." +msgstr "Жоден користувач не може приєднатися до неопублікованної кампанії." + +#: ../../src/spec/giver/index.rst:82 +msgid "Campaigns can are marked as drafts by default at creation." +msgstr "Кампанії за замовчуванням позначаються як чернетки під час створення." + +#: ../../src/spec/giver/index.rst:83 +msgid "" +"The creator can publish the campaign by making campaign private or public." +msgstr "Автор може опублікувати кампанію, зробивши її приватною або публічною." + +#: ../../src/spec/giver/index.rst:84 +msgid "Draft campaigns cannot be initiated." +msgstr "Чернетки кампанії не можуть бути ініційовані." + +#: ../../src/spec/giver/index.rst:87 +msgid "Public campaigns" +msgstr "Публічні кампанії" + +#: ../../src/spec/giver/index.rst:88 +msgid "" +"Public campaigns are accessible to both anonymous and authenticated users." +msgstr "" +"Публічні кампанії доступні як анонімним, так і авторизованим користувачам." + +#: ../../src/spec/giver/index.rst:89 +msgid "" +"Authenticated users can join any public campaign, unless it hasn't started." +msgstr "" +"Авторизовані користувачі можуть приєднатися до будь-якої публічної кампанії, " +"якщо вона ще не розпочалася." + +#: ../../src/spec/giver/index.rst:92 +msgid "Private campaigns" +msgstr "Приватні кампанії" + +#: ../../src/spec/giver/index.rst:93 +msgid "Private campaign are available only to their members." +msgstr "Приватні кампанії доступні тільки їх учасникам." + +#: ../../src/spec/giver/index.rst:94 +msgid "The campaign creator can share a join link with other users." +msgstr "" +"Творець кампанії може поділитися посиланням для приєднання з іншими " +"користувачами." + +#: ../../src/spec/giver/index.rst:95 +msgid "Once joined, the campaign becomes visible in the user's campaigns list." +msgstr "Після приєднання кампанія стає видимою у списку кампаній користувача." + +#: ../../src/spec/giver/index.rst:98 +msgid "Completed campaigns" +msgstr "Завершені кампанії" + +#: ../../src/spec/giver/index.rst:99 +msgid "" +"Actually this means the campaign has been completed and archived. Admins can " +"remove archived campaigns at any time (campaigns clean-up). Running " +"campaigns cannot be manually moved to completed status. This is done " +"automatically." +msgstr "" +"Насправді це означає, що кампанія завершена і заархівована. Адміністратори " +"можуть видалити заархівовані кампанії в будь-який час (очищення кампаній). " +"Кампанії, що тривають, не можна вручну перевести в статус завершених. Це " +"відбувається автоматично." + +#: ../../src/spec/giver/index.rst:105 +msgid "Campaign life-cycle" +msgstr "Життєвий цикл кампанії" + +#: ../../src/spec/giver/index.rst:110 +msgid "Running the gift-giving campaign" +msgstr "Проведення кампанії з роздачі подарунків" + +#: ../../src/spec/giver/index.rst:112 +msgid "The option to start campaigns is available to their creators or admins." +msgstr "" +"Можливість запускати кампанії доступна їхнім творцям або адміністраторам." + +#: ../../src/spec/giver/index.rst:113 +msgid "Once the campaign has started, no one can join or leave it." +msgstr "" +"Після початку кампанії ніхто не може приєднатися до неї або вийти з неї." + +#: ../../src/spec/giver/index.rst:114 +msgid "" +"Each campaign member is assigned to give a gift to a randomly chosen person " +"within the same campaign members list." +msgstr "" +"Кожному учаснику кампанії доручено подарувати подарунок випадково обраній " +"людині з того ж списку учасників кампанії." + +#: ../../src/spec/giver/index.rst:118 +msgid "Giver access for wish list" +msgstr "Доступ до списку бажань для дарувальника" + +#: ../../src/spec/giver/index.rst:119 +msgid "The wish list of the assigned person becomes visible to the gift giver." +msgstr "Список побажань призначеної особи стає видимим для дарувальника." + +#: ../../src/spec/giver/index.rst:120 +msgid "The giver can mark any single item within this list as a given gift." +msgstr "" +"Дарувальник може позначити будь-яку позицію з цього списку як подарунок." + +#: ../../src/spec/giver/index.rst:121 +msgid "After the gift is given, wish list returns to normal." +msgstr "" +"Після вручення подарунка список бажань повертається до нормального стану." + +#: ../../src/spec/giver/index.rst:122 +msgid "Wish list entry marked as given, cannot be changed by other givers." +msgstr "" +"Пункт списку бажань, позначений як подарований, не може бути змінений іншими " +"дарувальниками." + +#: ../../src/spec/giver/index.rst:125 +msgid "Multiple gifts" +msgstr "Кілька подарунків" + +#: ../../src/spec/giver/index.rst:126 +msgid "" +"Generally, gift-giving campaigns allow for one gift at a time. However, if a " +"user is assigned twice to the same giver from different campaigns, the giver " +"can mark as many entries as the number of assignments." +msgstr "" +"Зазвичай, кампанії дозволяють дарувати один подарунок за раз. Однак, якщо " +"користувач двічі призначений одному і тому ж дарувальнику з різних кампаній, " +"дарувальник може позначити стільки записів, скільки має призначень." + +#: ../../src/spec/giver/index.rst:131 +msgid "Autocomplete" +msgstr "Автозавершення" + +#: ../../src/spec/giver/index.rst:132 +msgid "" +"Once all the assignments within a campaign are completed, the campaign " +"itself is considered to be completed." +msgstr "" +"Як тільки всі завдання в рамках кампанії виконані, сама кампанія вважається " +"завершеною." + +#: ../../src/spec/giver/index.rst:136 +msgid "REST API" +msgstr "REST API" + +#: ../../src/spec/giver/index.rst:138 +msgid "**All site functions** will be implemented within REST API." +msgstr "**Всі функції сайту** будуть реалізовані за допомогою REST API." diff --git a/src/_locales/uk/LC_MESSAGES/spec/libms/index.po b/src/_locales/uk/LC_MESSAGES/spec/libms/index.po new file mode 100644 index 000000000..36a59002a --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/spec/libms/index.po @@ -0,0 +1,1191 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2022.11.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-01-09 03:59+0200\n" +"PO-Revision-Date: 2024-01-09 04:02+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: ua \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Generated-By: Babel 2.14.0\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/spec/libms/index.rst:3 +msgid "Library Management System" +msgstr "Система Керування Бібліотекою" + +#: ../../src/spec/libms/index.rst:5 +msgid "" +"The Library Management System is a Django-based web application that offers " +"a digital platform for managing and interacting with a library's collection. " +"It streamlines the processes of book lending, returns, and inventory " +"management, while ensuring easy access for users and librarians alike. " +"Through this system, users can search for available books, place borrowing " +"requests, and manage their borrowed items. Librarians, on the other hand, " +"oversee the addition, update, and removal of book records, and can approve " +"or decline borrowing requests. The system also supports diverse user roles, " +"from regular members to staff and administrators, each with distinct " +"capabilities." +msgstr "" +"Система Керування Бібліотекою є веб-застосуванням на базі Django, яке " +"пропонує цифрову платформу для управління та взаємодії з колекцією " +"бібліотеки. Вона оптимізує процеси надання книг, повернення та управління " +"інвентарем, забезпечуючи легкий доступ як для користувачів, так і для " +"бібліотекарів. За допомогою цієї системи користувачі можуть шукати доступні " +"книги, робити запити на позику та керувати позиченими предметами. " +"Бібліотекарі, з свого боку, контролюють додавання, оновлення та видалення " +"записів книг та можуть схвалювати або відхиляти запити на позику. Система " +"також підтримує різноманітні ролі користувачів, від звичайних членів до " +"персоналу та адміністраторів, кожен з яких має відмінні можливості." + +#: ../../src/spec/libms/index.rst:15 +msgid "" +"A well-structured user interface ensures that all functionalities are easily " +"accessible, making the library management process seamless and efficient. " +"This project aims to merge traditional library functions with modern " +"technological innovations, promoting efficiency and an enhanced user " +"experience." +msgstr "" +"Добре структурований користувацький інтерфейс забезпечує легкий доступ до " +"всіх функцій, роблячи процес управління бібліотекою безперешкодним та " +"ефективним. Цей проект має на меті об'єднати традиційні бібліотечні функції " +"з сучасними технологічними інноваціями, сприяючи підвищенню ефективності та " +"покращенню користувацького досвіду." + +#: ../../src/spec/libms/index.rst:22 +msgid "User roles" +msgstr "Ролі користувачів" + +#: ../../src/spec/libms/index.rst:25 +msgid "" +"It is essential for developers to consider security aspects when " +"implementing these roles to ensure that users cannot perform actions outside " +"their designated role's scope." +msgstr "" +"Розробникам важливо враховувати аспекти безпеки при впровадженні цих ролей, " +"щоб гарантувати, що користувачі не зможуть виконувати дії, які виходять за " +"рамки призначеної їм ролі." + +#: ../../src/spec/libms/index.rst:30 +msgid "Admins" +msgstr "Адміністратори" + +#: ../../src/spec/libms/index.rst:32 +msgid "" +"Superusers have full control over the entire system. They can access and " +"manage all functionalities provided by the Django admin site." +msgstr "" +"Адміністратори мають повний контроль над усією системою. Вони можуть " +"отримати доступ до всіх функцій, що надаються адмін-сайтом Django, і " +"керувати ними." + +#: ../../src/spec/libms/index.rst:35 +msgid "Admins can create, modify, or delete any record within the application." +msgstr "" +"Адміністратори можуть створювати, змінювати або видаляти будь-які записи в " +"додатку." + +#: ../../src/spec/libms/index.rst:38 ../../src/spec/libms/index.rst:49 +#: ../../src/spec/libms/index.rst:68 ../../src/spec/libms/index.rst:82 +msgid "Capabilities" +msgstr "Можливості" + +#: ../../src/spec/libms/index.rst:39 +msgid "Access Django admin site" +msgstr "Доступ до адміністративного сайту Django" + +#: ../../src/spec/libms/index.rst:42 +msgid "Librarians" +msgstr "Бібліотекарі" + +#: ../../src/spec/libms/index.rst:44 +msgid "" +"Staff personnel are in charge of day-to-day operations within the library. " +"They can add new books to the library's collection, manage existing books' " +"details, and accept or decline borrow requests from regular users." +msgstr "" +"Працівники бібліотеки відповідають за повсякденну роботу в бібліотеці. Вони " +"можуть додавати нові книги до бібліотечної колекції, керувати даними про " +"наявні книги, а також приймати або відхиляти запити від постійних " +"користувачів." + +#: ../../src/spec/libms/index.rst:50 +msgid "Management of the library catalogue" +msgstr "Управління бібліотечним каталогом" + +#: ../../src/spec/libms/index.rst:52 +msgid "Add, modify or delete authors" +msgstr "Додавати, змінювати або видаляти авторів" + +#: ../../src/spec/libms/index.rst:53 +msgid "Add, modify or delete genres" +msgstr "Додавати, змінювати або видаляти жанри" + +#: ../../src/spec/libms/index.rst:54 +msgid "Add, modify or delete books' details" +msgstr "Додавати, змінювати або видаляти дані про книги" + +#: ../../src/spec/libms/index.rst:56 +msgid "Review borrow requests from regular users" +msgstr "Переглядати запити на позичення від користувачів" + +#: ../../src/spec/libms/index.rst:57 +msgid "Accept or decline borrow requests" +msgstr "Приймати або відхиляти запити на позичення" + +#: ../../src/spec/libms/index.rst:58 +msgid "Register returned books and update their status" +msgstr "Реєструвати повернені книги та оновлювати їх статус" + +#: ../../src/spec/libms/index.rst:61 +msgid "Regular" +msgstr "Звичайний" + +#: ../../src/spec/libms/index.rst:63 +msgid "" +"Regular registered users are the members of the library. They can search " +"books, request to borrow them, and are responsible for returning borrowed " +"books on time." +msgstr "" +"Постійні зареєстровані користувачі є членами бібліотеки. Вони можуть шукати " +"книги, запитувати їх, а також несуть відповідальність за своєчасне " +"повернення позичених книг." + +#: ../../src/spec/libms/index.rst:69 ../../src/spec/libms/index.rst:83 +msgid "Browse the books' catalogue" +msgstr "Переглядати каталог книг" + +#: ../../src/spec/libms/index.rst:70 ../../src/spec/libms/index.rst:84 +msgid "View details of a book" +msgstr "Переглядати деталі книги" + +#: ../../src/spec/libms/index.rst:71 ../../src/spec/libms/index.rst:85 +msgid "Search books" +msgstr "Шукати книги" + +#: ../../src/spec/libms/index.rst:72 +msgid "Request to borrow available books" +msgstr "Робити запит на позичення доступних книжок" + +#: ../../src/spec/libms/index.rst:73 +msgid "Check due date for returned books" +msgstr "Перевіряти термін повернення запозичених книжок" + +#: ../../src/spec/libms/index.rst:74 +msgid "Return borrowed books" +msgstr "Повертати запозичені книги" + +#: ../../src/spec/libms/index.rst:77 +msgid "Anonymous" +msgstr "Анонімні" + +#: ../../src/spec/libms/index.rst:79 +msgid "Anonymous users are visitors who haven't logged into the system." +msgstr "Анонімні користувачі - це відвідувачі, які не ввійшли в систему." + +#: ../../src/spec/libms/index.rst:86 +msgid "Access to the registration or login pages" +msgstr "Доступ до сторінок реєстрації або входу" + +#: ../../src/spec/libms/index.rst:90 +msgid "Models" +msgstr "Моделі" + +#: ../../src/spec/libms/index.rst:93 +msgid "Author model" +msgstr "Модель авторів" + +#: ../../src/spec/libms/index.rst:95 +msgid "" +"The ``Author`` model captures the details of the person, or group " +"responsible for creating the book." +msgstr "" +"Модель ``Author`` фіксує інформацію про особу або групу осіб, відповідальних " +"за створення книги." + +#: ../../src/spec/libms/index.rst:99 ../../src/spec/libms/index.rst:116 +#: ../../src/spec/libms/index.rst:128 ../../src/spec/libms/index.rst:170 +msgid "Attributes" +msgstr "Атрибути" + +#: ../../src/spec/libms/index.rst +msgid "Name" +msgstr "Name" + +#: ../../src/spec/libms/index.rst:102 +msgid "The full name of the author. This should be limited to 255 characters." +msgstr "Повне ім'я автора. Не більше 255 символів." + +#: ../../src/spec/libms/index.rst +msgid "Bio" +msgstr "Bio" + +#: ../../src/spec/libms/index.rst:105 +msgid "A brief biography or description of the author." +msgstr "Коротка біографія або опис автора." + +#: ../../src/spec/libms/index.rst:108 +msgid "Genre model" +msgstr "Модель жанра" + +#: ../../src/spec/libms/index.rst:110 +msgid "" +"The ``Genre`` model represents the category or type of content a book " +"belongs to, such as \"Fiction\", \"Non-fiction\", \"Science\", \"Romance\" " +"etc. Since a book can belong to more than one category at a time, it is " +"implemented as a dedicated model." +msgstr "" +"Модель ``Genre`` представляє категорію або тип контенту, до якого належить " +"книга, наприклад, \"Художня література\", \"Нехудожня література\", " +"\"Наука\", \"Романтика\" тощо. Оскільки книга може належати до кількох " +"категорій одночасно, вона реалізована як окрема модель." + +#: ../../src/spec/libms/index.rst:118 +msgid "The name of the genre." +msgstr "Назва жанру." + +#: ../../src/spec/libms/index.rst:121 +msgid "Book model" +msgstr "Модель книги" + +#: ../../src/spec/libms/index.rst:123 +msgid "" +"The ``Book`` model represents a physical book in the library's collection. " +"Each book record captures essential bibliographic information, as well as " +"details related to its current status in the library (e.g. available, " +"borrowed etc.)." +msgstr "" +"Модель ``Book`` представляє фізичну книгу в бібліотечній колекції. Кожен " +"запис про книгу містить основну бібліографічну інформацію, а також деталі, " +"пов'язані з її поточним статусом у бібліотеці (наприклад, доступна, позичена " +"тощо)." + +#: ../../src/spec/libms/index.rst +msgid "Title" +msgstr "Title" + +#: ../../src/spec/libms/index.rst:131 +msgid "The name or title of the book (255 characters or fewer)." +msgstr "Назва книги (255 символів або менше)." + +#: ../../src/spec/libms/index.rst +msgid "Summary" +msgstr "Summary" + +#: ../../src/spec/libms/index.rst:134 +msgid "A brief description or synopsis of the book." +msgstr "Короткий опис або синопсис книги." + +#: ../../src/spec/libms/index.rst +msgid "ISBN" +msgstr "ISBN" + +#: ../../src/spec/libms/index.rst:137 +msgid "International Standard Book Number, a unique identifier for books." +msgstr "" +"International Standard Book Number, унікальний ідентифікатор для книг.." + +#: ../../src/spec/libms/index.rst +msgid "Available" +msgstr "Available" + +#: ../../src/spec/libms/index.rst:140 +msgid "" +"Current available status of the book. Either ``True`` or ``False``. Books " +"are available by default." +msgstr "" +"Поточний статус доступності книги. Або ``True``, або ``False``. За " +"замовчуванням книги доступні." + +#: ../../src/spec/libms/index.rst +msgid "Published date" +msgstr "Published date" + +#: ../../src/spec/libms/index.rst:144 +msgid "The date when the book was published." +msgstr "Дата, коли книга була опублікована." + +#: ../../src/spec/libms/index.rst +msgid "Publisher" +msgstr "Publisher" + +#: ../../src/spec/libms/index.rst:147 +msgid "" +"The entity or company responsible for the production and distribution of the " +"book." +msgstr "" +"Організація або компанія, відповідальна за виробництво та розповсюдження " +"книги." + +#: ../../src/spec/libms/index.rst +msgid "Genre(s)" +msgstr "Genre(s)" + +#: ../../src/spec/libms/index.rst:151 +msgid "" +"The category or type of content the book falls under (e.g., Fiction, Non-" +"Fiction, Science)." +msgstr "" +"Категорія або тип контенту, до якого належить книга (наприклад, художня " +"література, нон-фікшн, наукова література)." + +#: ../../src/spec/libms/index.rst +msgid "Author(s)" +msgstr "Author(s)" + +#: ../../src/spec/libms/index.rst:156 +msgid "" +"The name of the person or group responsible for creating the content of the " +"book." +msgstr "Ім'я особи або групи осіб, відповідальних за створення змісту книги." + +#: ../../src/spec/libms/index.rst +msgid "Borrower" +msgstr "Borrower" + +#: ../../src/spec/libms/index.rst:160 +msgid "The user who has currently borrowed the book, if applicable." +msgstr "Користувач, який наразі позичив книгу, якщо це можливо." + +#: ../../src/spec/libms/index.rst:163 +msgid "Borrow request model" +msgstr "Модель запиту на позику" + +#: ../../src/spec/libms/index.rst:165 +msgid "" +"The ``BorrowRequest`` model captures the intent of a user to borrow a " +"specific book. It tracks the status of the request, whether it's pending, " +"approved, declined, or completed." +msgstr "" +"Модель ``BorrowRequest`` фіксує намір користувача взяти конкретну книгу. " +"Вона відстежує статус запиту: очікує, схвалений, відхилений чи завершений." + +#: ../../src/spec/libms/index.rst +msgid "Book" +msgstr "Book" + +#: ../../src/spec/libms/index.rst:173 +msgid "A reference to a book to be borrowed." +msgstr "Посилання на книгу, яку потрібно взяти." + +#: ../../src/spec/libms/index.rst:176 +msgid "A reference to a user who wants to borrow a book." +msgstr "Посилання на користувача, який хоче взяти книгу." + +#: ../../src/spec/libms/index.rst +msgid "Status" +msgstr "Status" + +#: ../../src/spec/libms/index.rst:179 +msgid "The current status of the request." +msgstr "Поточний статус заявки." + +#: ../../src/spec/libms/index.rst:181 +msgid "pending" +msgstr "pending" + +#: ../../src/spec/libms/index.rst:182 +msgid "approved" +msgstr "approved" + +#: ../../src/spec/libms/index.rst:183 +msgid "collected" +msgstr "collected" + +#: ../../src/spec/libms/index.rst:184 +msgid "complete" +msgstr "complete" + +#: ../../src/spec/libms/index.rst:185 +msgid "declined" +msgstr "declined" + +#: ../../src/spec/libms/index.rst:187 +msgid "" +"The status constants should be encapsulated within the ``BorrowRequest`` " +"model." +msgstr "" +"Константи стану повинні бути інкапсульовані в моделі ``BorrowRequest``." + +#: ../../src/spec/libms/index.rst +msgid "Overdue" +msgstr "Overdue" + +#: ../../src/spec/libms/index.rst:202 +msgid "A flag indicating if a borrow request was overdue." +msgstr "Прапорець, що вказує на те, чи був запит на позику прострочений." + +#: ../../src/spec/libms/index.rst +msgid "Request date" +msgstr "Request date" + +#: ../../src/spec/libms/index.rst:205 +msgid "The date the borrow request was made. This is required." +msgstr "Дата подання запиту на позику. Це обов'язкова інформація." + +#: ../../src/spec/libms/index.rst +msgid "Approval date" +msgstr "Approval date" + +#: ../../src/spec/libms/index.rst:208 +msgid "The date the request was approved, if applicable. Optional." +msgstr "Дата схвалення запиту, якщо це можливо. Необов'язково." + +#: ../../src/spec/libms/index.rst +msgid "Due date" +msgstr "Due date" + +#: ../../src/spec/libms/index.rst:211 +msgid "" +"The date by which the book should be returned. Optional, should only be set " +"if the request if approved." +msgstr "" +"Дата, до якої книга має бути повернута. Необов'язкова, має бути вказана лише " +"у разі схвалення запиту." + +#: ../../src/spec/libms/index.rst +msgid "Complete date" +msgstr "Complete date" + +#: ../../src/spec/libms/index.rst:215 +msgid "" +"The date the book was returned and the borrowing request was completed. " +"Optional, should only be set if the request has reached the \"Complete\" " +"status." +msgstr "" +"Дата повернення книги та завершення запиту на позику. Необов'язкова, має " +"бути встановлена тільки якщо запит досяг статусу \"Завершено\"." + +#: ../../src/spec/libms/index.rst:220 +msgid "Relationships" +msgstr "Відносини" + +#: ../../src/spec/libms/index.rst:234 +msgid "Entity relationship diagram" +msgstr "Діаграма зв'язків" + +#: ../../src/spec/libms/index.rst:237 +msgid "Book to author" +msgstr "Книга до автору" + +#: ../../src/spec/libms/index.rst:239 +msgid "" +"Each ``Author`` can be associated with multiple ``Books``, and each ``Book`` " +"can have **one or more** ``authors``. This establishes a **many-to-many** " +"relationship between the two entities." +msgstr "" +"Кожен ``Автор`` може бути пов'язаний з декількома ``Книгами``, а кожна " +"``Книга`` може мати **одного або більше** ``авторів``. Це встановлює зв'язок " +"**багато-до-багатьох** між цими двома сутностями." + +#: ../../src/spec/libms/index.rst:244 +msgid "Book to genre" +msgstr "Книга до жанру" + +#: ../../src/spec/libms/index.rst:246 +msgid "" +"Each ``Genre`` can be associated with multiple ``Books``, and vice-versa. " +"However a ``Book`` might not belong to any genre. This relationship between " +"``Genre`` and ``Book`` is still considered **many-to-many**, but with the " +"possibility of zero genres for a book." +msgstr "" +"Кожен ``Жанр`` може бути пов'язаний з декількома ``Книгами``, і навпаки. " +"Однак ``Книга`` може не належати до жодного жанру. Цей зв'язок між " +"``Жанром`` і ``Книгою`` все ще вважається **багато-до-багатьох**, але з " +"можливістю нульових жанрів для книги." + +#: ../../src/spec/libms/index.rst:252 +msgid "Book to borrow request" +msgstr "Книга до запиту на позику" + +#: ../../src/spec/libms/index.rst:254 +msgid "" +"Each ``Book`` can be associated with multiple ``BorrowRequests``, but each " +"``BorrowRequest`` refers only one ``book``, forming a **many-to-one** " +"relationship." +msgstr "" +"Кожна ``Книга`` може бути пов'язана з декількома ``Запитами на позику``, але " +"кожен ``Запит на позику`` посилається тільки на одну ``Книгу``, утворюючи " +"зв'язок **багато-до-одного**." + +#: ../../src/spec/libms/index.rst:259 +msgid "User to borrow request" +msgstr "Користувач до запиту на позику" + +#: ../../src/spec/libms/index.rst:261 +msgid "" +"Each ``User`` can make multiple ``BorrowRequests``, but each " +"``BorrowRequest`` refers to only one book, forming a **many-to-one** " +"relationship." +msgstr "" +"Кожен ``Користувач`` може зробити кілька ``Запитів на позику``, але кожен " +"``Запит на позику`` відноситься тільки до однієї книги, формуючи зв'язок " +"``багато до однієї``." + +#: ../../src/spec/libms/index.rst:265 +msgid "User to book (as a borrower)" +msgstr "Користувач до книги (як запозичувач)" + +#: ../../src/spec/libms/index.rst:267 +msgid "" +"A ``Book`` may have been borrowed by a ``User``, but at any given time, each " +"``Book`` can be borrowed by one user only. This forms a **one-to-one** " +"relationship." +msgstr "" +"Книга\" може бути позичена \"Користувачем\", але в будь-який момент часу " +"кожна \"Книга\" може бути позичена тільки одним користувачем. Це формує " +"відносини \"один до одного\"." + +#: ../../src/spec/libms/index.rst:273 +msgid "Views and templates" +msgstr "Подання та шаблони" + +#: ../../src/spec/libms/index.rst:276 +msgid "Admin site" +msgstr "Адмін-сайт" + +#: ../../src/spec/libms/index.rst:278 +msgid "" +"Admin site provides the full control over the entire system. Only admins are " +"permitted to use admin site. Librarians should use their dedicated views to " +"perform operations, except special cases." +msgstr "" +"Адмін-сайт забезпечує повний контроль над всією системою. Тільки " +"адміністратори мають право користуватися сайтом адміністратора. Бібліотекарі " +"повинні використовувати свої виділені подання для виконання операцій, за " +"винятком особливих випадків." + +#: ../../src/spec/libms/index.rst:284 +msgid "Authentication" +msgstr "Автентифікація" + +#: ../../src/spec/libms/index.rst:287 +msgid "Login" +msgstr "Логін" + +#: ../../src/spec/libms/index.rst:290 ../../src/spec/libms/index.rst:302 +#: ../../src/spec/libms/index.rst:333 ../../src/spec/libms/index.rst:353 +#: ../../src/spec/libms/index.rst:380 ../../src/spec/libms/index.rst:504 +#: ../../src/spec/libms/index.rst:521 +msgid "Template" +msgstr "Template" + +#: ../../src/spec/libms/index.rst:291 +msgid "" +"A form with fields for entering a username and a password, and a submit " +"button." +msgstr "" +"Форма з полями для введення імені користувача та пароля, а також кнопкою " +"\"Надіслати\"." + +#: ../../src/spec/libms/index.rst:294 ../../src/spec/libms/index.rst:312 +#: ../../src/spec/libms/index.rst:338 ../../src/spec/libms/index.rst:362 +#: ../../src/spec/libms/index.rst:399 ../../src/spec/libms/index.rst:485 +#: ../../src/spec/libms/index.rst:508 +msgid "View logic" +msgstr "View logic" + +#: ../../src/spec/libms/index.rst:295 +msgid "" +"Validate entered credentials and authenticate the user. In case of incorrect " +"credentials, display an error message." +msgstr "" +"Перевірити введені облікові дані та автентифікувати користувача. У разі " +"неправильних облікових даних вивести повідомлення про помилку." + +#: ../../src/spec/libms/index.rst:299 +msgid "Registration" +msgstr "Реєстрація" + +#: ../../src/spec/libms/index.rst:303 +msgid "A form for new user registration. **Required** fields are:" +msgstr "Форма для реєстрації нового користувача. **Обов'язковими** полями є:" + +#: ../../src/spec/libms/index.rst:305 +msgid "username" +msgstr "username" + +#: ../../src/spec/libms/index.rst:306 +msgid "first name" +msgstr "first name" + +#: ../../src/spec/libms/index.rst:307 +msgid "last name" +msgstr "last name" + +#: ../../src/spec/libms/index.rst:308 +msgid "password" +msgstr "password" + +#: ../../src/spec/libms/index.rst:309 +msgid "confirm password" +msgstr "confirm password" + +#: ../../src/spec/libms/index.rst:313 +msgid "Upon submission, the view should validate the provided data:" +msgstr "Після відправлення, перегляд повинен підтвердити надані дані:" + +#: ../../src/spec/libms/index.rst:315 +msgid "Check if username is already taken." +msgstr "Перевірте, чи не зайнято вже ім'я користувача." + +#: ../../src/spec/libms/index.rst:316 +msgid "Ensure that password and confirm password fields match." +msgstr "" +"Переконайтеся, що поля \"Пароль\" і \"Підтвердження пароля\" збігаються." + +#: ../../src/spec/libms/index.rst:317 +msgid "" +"Save the user's data if all validations pass. Otherwise, display appropriate " +"error messages." +msgstr "" +"Зберегти дані користувача, якщо всі перевірки пройдено. В іншому випадку, " +"відобразити відповідні повідомлення про помилки." + +#: ../../src/spec/libms/index.rst:320 +msgid "" +"When saving passwords in the database, always store them in a hashed format, " +"never in plain text." +msgstr "" +"Зберігаючи паролі в базі даних, завжди зберігайте їх у хешованому форматі, а " +"не у вигляді простого тексту." + +#: ../../src/spec/libms/index.rst:324 +msgid "" +"Django's built-in ``User`` model and authentication system handle password " +"hashing by default, which is a big plus." +msgstr "" +"Вбудована в Django модель ``User`` та система автентифікації за " +"замовчуванням обробляє хешування паролів, що є великим плюсом." + +#: ../../src/spec/libms/index.rst:328 +msgid "Borrowing History" +msgstr "Історія запозичень" + +#: ../../src/spec/libms/index.rst:330 +msgid "This view is available only for authenticated users." +msgstr "Це подання доступне лише для авторизованих користувачів." + +#: ../../src/spec/libms/index.rst:334 +msgid "" +"Users can see the list of **all** their borrows requests, regardless of " +"approve/decline status." +msgstr "" +"Користувачі можуть бачити список **всіх** своїх заявок на позики, незалежно " +"від статусу схвалення/відхилення." + +#: ../../src/spec/libms/index.rst:339 +msgid "Authenticated users can see only their own borrow requests." +msgstr "Авторизовані користувачі можуть бачити лише власні заявки на позики." + +#: ../../src/spec/libms/index.rst:340 +msgid "" +"Librarians and admins can access borrows requests list for any user, " +"registered in the library system." +msgstr "" +"Бібліотекарі та адміністратори мають доступ до списку запитів на позики для " +"будь-якого користувача, зареєстрованого в бібліотечній системі." + +#: ../../src/spec/libms/index.rst:344 +msgid "Library collection" +msgstr "Бібліотечний фонд" + +#: ../../src/spec/libms/index.rst:346 +msgid "" +"These views are generally available for all (including anonymous) users. The " +"functionality for authenticated users include books borrowing." +msgstr "" +"Ці перегляди загалом доступні для всіх (в тому числі анонімних) " +"користувачів. Функціонал для аутентифікованих користувачів включає в себе " +"можливість позичати книги." + +#: ../../src/spec/libms/index.rst:350 +msgid "Books list" +msgstr "Список літератури" + +#: ../../src/spec/libms/index.rst:354 +msgid "A list (or table) of books. Each book entry should provide information:" +msgstr "" +"Список (або таблиця) книг. Кожна позиція повинна містити інформацію про " +"книгу:" + +#: ../../src/spec/libms/index.rst:356 +msgid "title" +msgstr "title" + +#: ../../src/spec/libms/index.rst:357 +msgid "author(s)" +msgstr "автор(и)" + +#: ../../src/spec/libms/index.rst:358 +msgid "summary (truncated if too long, 30 words or fewer)" +msgstr "опис (скорочене, якщо занадто довге, до 30 слів або менше)" + +#: ../../src/spec/libms/index.rst:359 +msgid "availability status (either **Available** or **Unavailable**)" +msgstr "статус доступності (**Доступний** або **Не доступний**)" + +#: ../../src/spec/libms/index.rst:363 +msgid "Querying the data" +msgstr "Запит даних" + +#: ../../src/spec/libms/index.rst:365 +msgid "Fetch **all** books from the database" +msgstr "Отримати **усі** книги з бази даних" + +#: ../../src/spec/libms/index.rst:367 +msgid "Checking availability status (visual mark)" +msgstr "Перевірка статусу доступності (візуальна позначка)" + +#: ../../src/spec/libms/index.rst:369 +msgid "" +"For each book, determine its availability status. Check ``Book.available`` " +"flag." +msgstr "" +"Для кожної книги визначте її статус доступності. Встановіть прапорець ``Book." +"available``." + +#: ../../src/spec/libms/index.rst:373 +msgid "" +"A user can still create a borrowing request, regardless of the book " +"availability status. This is only the visual mark." +msgstr "" +"Користувач все одно може створити запит на позику, незалежно від статусу " +"доступності книги. Це лише візуальна позначка." + +#: ../../src/spec/libms/index.rst:377 +msgid "Detail view" +msgstr "Детальний перегляд" + +#: ../../src/spec/libms/index.rst:381 +msgid "" +"The detailed view of a specific book, presenting comprehensive information:" +msgstr "Детальний огляд конкретної книги, що містить вичерпну інформацію:" + +#: ../../src/spec/libms/index.rst:383 +msgid "**Title**: Display the book's title prominently." +msgstr "**Назва**: Покажіть назву книги на видному місці." + +#: ../../src/spec/libms/index.rst:384 +msgid "**Genre(s)**: List all associated genres (if any)." +msgstr "**Жанр(и)**: Перелічіть усі пов'язані жанри (якщо такі є)." + +#: ../../src/spec/libms/index.rst:385 +msgid "**Author(s)**: List all associated authors." +msgstr "**Автор(и)**: Перерахуйте всіх асоційованих авторів." + +#: ../../src/spec/libms/index.rst:386 +msgid "**ISBN**: The International Standard Book Number." +msgstr "**ISBN**: Міжнародний стандартний номер книги." + +#: ../../src/spec/libms/index.rst:387 +msgid "**Published Date**: When the book was published." +msgstr "**Дата публікації**: Коли вийшла друком книга." + +#: ../../src/spec/libms/index.rst:388 +msgid "" +"**Publisher**: The name of the entity or company responsible for publishing" +msgstr "" +"**Видавець**: Назва організації або компанії, відповідальної за публікацію" + +#: ../../src/spec/libms/index.rst:389 +msgid "**Summary**: A full summary or description of the book. the book." +msgstr "**Коротка анотація**: Повне резюме або опис книги. книги." + +#: ../../src/spec/libms/index.rst:391 +msgid "**Action Buttons** (For authenticated users only):" +msgstr "**Кнопки дій** (Тільки для авторизованих користувачів):" + +#: ../../src/spec/libms/index.rst:393 +msgid "" +"**Borrow Request Button**: If the user has no associated borrow request they " +"can create a new one." +msgstr "" +"**Кнопка запиту на позику**: Якщо користувач не має пов'язаного запиту на " +"позику, він може створити новий." + +#: ../../src/spec/libms/index.rst:395 +msgid "" +"**Gather Book Button**: If the user's borrow request for this book has been " +"approved, allow the user to confirm they've picked up the book." +msgstr "" +"**Кнопка Забрати книгу**: Якщо запит користувача на позику цієї книги було " +"схвалено, дозвольте користувачеві підтвердити, що він забрав книгу." + +#: ../../src/spec/libms/index.rst:400 +msgid "**Fetching Book Details**:" +msgstr "**Доступ до деталей книги**:" + +#: ../../src/spec/libms/index.rst:402 +msgid "" +"Use the book's identifier (usually a primary key) to fetch its details from " +"the database." +msgstr "" +"Використовуйте ідентифікатор книги (зазвичай первинний ключ), щоб отримати " +"інформацію про неї з бази даних." + +#: ../../src/spec/libms/index.rst:405 +msgid "**Checking User Authentication**:" +msgstr "**Перевірка автентичності користувача**:" + +#: ../../src/spec/libms/index.rst:407 +msgid "" +"Determine if a user is authenticated. If they are, display the appropriate " +"action buttons based on the book's availability status and any existing " +"borrow requests by the user." +msgstr "" +"Визначити, чи користувач автентифікований. Якщо так, відобразити відповідні " +"кнопки дій на основі статусу доступності книги та наявних запитів " +"користувача на позику." + +#: ../../src/spec/libms/index.rst:411 +msgid "**Handling Borrow Requests**:" +msgstr "**Обробка запитів на позику**:" + +#: ../../src/spec/libms/index.rst:413 +msgid "If an authenticated user clicks on the \"Borrow Request\" button:" +msgstr "Якщо авторизований користувач натискає кнопку \"Запит на позику\":" + +#: ../../src/spec/libms/index.rst:415 +msgid "" +"Create a new borrow request in the ``BorrowRequest`` model with status " +"\"pending\"." +msgstr "" +"Створіть новий запит на позику в моделі ``BorrowRequest`` зі статусом \"на " +"розгляді\"." + +#: ../../src/spec/libms/index.rst:417 +msgid "Update the book's status to \"Awaiting approval\"." +msgstr "Оновіть статус книги на \"Очікує затвердження\"." + +#: ../../src/spec/libms/index.rst:418 +msgid "" +"Redirect the user to a confirmation page or display a message indicating the " +"request has been made." +msgstr "" +"Перенаправлення користувача на сторінку підтвердження або відображення " +"повідомлення про те, що запит було зроблено." + +#: ../../src/spec/libms/index.rst:421 +msgid "**Handling Book Gathering**:" +msgstr "**Опрацювання Позики Книги**:" + +#: ../../src/spec/libms/index.rst:423 +msgid "" +"If an authenticated user has an approved borrow request and clicks the " +"\"Gather Book\" button:" +msgstr "" +"Якщо авторизований користувач має схвалений запит на позику і натискає " +"кнопку \"Зібрати книгу\":" + +#: ../../src/spec/libms/index.rst:426 +msgid "Update the book's status to \"Borrowed\"." +msgstr "Оновіть статус книги на \"Позичена\"." + +#: ../../src/spec/libms/index.rst:427 +msgid "Update the borrow request's status to \"complete\"." +msgstr "Оновіть статус запиту на позику до \"завершено\"." + +#: ../../src/spec/libms/index.rst:428 +msgid "" +"Redirect the user to a confirmation page or display a message indicating " +"they've picked up the book." +msgstr "" +"Перенаправляйте користувача на сторінку підтвердження або показуйте " +"повідомлення про те, що він забрав книгу." + +#: ../../src/spec/libms/index.rst:432 +msgid "" +"Always ensure the user's actions are authenticated and authorized. This " +"prevents unauthorized borrow requests or gathering of books. Also, consider " +"adding error handling to manage cases where the book's details cannot be " +"fetched or any other unexpected issues." +msgstr "" +"Завжди переконуйтеся, що дії користувача автентифіковані та санкціоновані. " +"Це запобігає несанкціонованим запитам на позику або збору книг. Також " +"подумайте про те, щоб додати обробку помилок для випадків, коли не вдається " +"отримати дані про книгу, або будь-яких інших непередбачуваних проблем." + +#: ../../src/spec/libms/index.rst:438 +msgid "Books management" +msgstr "Управління книгами" + +#: ../../src/spec/libms/index.rst:440 +msgid "These views are available only for staff (librarians and admins)." +msgstr "" +"Ці перегляди доступні лише для персоналу (бібліотекарів та адміністраторів)." + +#: ../../src/spec/libms/index.rst:443 +msgid "Authors and genres management" +msgstr "Управління авторами та жанрами" + +#: ../../src/spec/libms/index.rst:445 +msgid "" +"Only librarians and admins can add, modify or delete authors and genres. No " +"additional views for CRUD operations required (except admin site). " +"Librarians are allowed to access authors and genres via admin site. Only " +"admins can remove authors or genres." +msgstr "" +"Тільки бібліотекарі та адміністратори можуть додавати, змінювати або " +"видаляти авторів і жанри. Для виконання CRUD-операцій не потрібні додаткові " +"перегляди (окрім адмін-сайту). Бібліотекарі мають доступ до авторів і жанрів " +"через сайт адміністратора. Тільки адміністратори можуть видаляти авторів або " +"жанри." + +#: ../../src/spec/libms/index.rst:451 +msgid "Book creation and update" +msgstr "Створення та оновлення книг" + +#: ../../src/spec/libms/index.rst:453 +msgid "" +"The template should comprise a form with fields corresponding to the book's " +"attributes. Here are the essential elements for the form:" +msgstr "" +"Шаблон повинен містити форму з полями, що відповідають атрибутам книги. Ось " +"основні елементи форми:" + +#: ../../src/spec/libms/index.rst:457 ../../src/spec/libms/index.rst:472 +msgid "A text input field." +msgstr "Поле для введення тексту." + +#: ../../src/spec/libms/index.rst:460 +msgid "A textarea for a brief description or synopsis." +msgstr "Текстова область для короткого опису або синопсису." + +#: ../../src/spec/libms/index.rst:463 +msgid "A text input field for the book's International Standard Book Number." +msgstr "Поле для введення міжнародного стандартного номера книги." + +#: ../../src/spec/libms/index.rst:466 +msgid "A checkbox indicating if a book is available. Defaults to ``True``." +msgstr "" +"Прапорець, що вказує на наявність книги. За замовчуванням стоїть ``True``." + +#: ../../src/spec/libms/index.rst:469 +msgid "A date input field." +msgstr "Поле для введення дати." + +#: ../../src/spec/libms/index.rst +msgid "Genres" +msgstr "Жанри" + +#: ../../src/spec/libms/index.rst:475 +msgid "" +"A multi-select list of genres (e.g. dropdown, checkboxes etc.). This should " +"fetch available genres from the database and allow users to select zero or " +"more genres." +msgstr "" +"Список жанрів з можливістю вибору (наприклад, випадаючий список, прапорці " +"тощо). Він повинен отримувати доступні жанри з бази даних і дозволяти " +"користувачам вибирати нуль або більше жанрів." + +#: ../../src/spec/libms/index.rst +msgid "Authors" +msgstr "Автори" + +#: ../../src/spec/libms/index.rst:480 +msgid "" +"A multi-select list of authors (e.g. dropdown, checkboxes etc.). This should " +"fetch available authors from the database and allow users to select one or " +"more authors." +msgstr "" +"Список авторів з можливістю вибору (наприклад, випадаючий список, прапорці " +"тощо). Він повинен отримувати доступних авторів з бази даних і дозволяти " +"користувачам вибирати одного або декількох авторів." + +#: ../../src/spec/libms/index.rst:486 +msgid "" +"If it's an *update* action, pre-populate the form fields with the existing " +"details of the book fetched from the database." +msgstr "" +"Якщо це дія *оновлення*, попередньо заповніть поля форми існуючими даними " +"книги, отриманими з бази даних." + +#: ../../src/spec/libms/index.rst:488 +msgid "For *creation*, provide an empty form for the librarian to fill in." +msgstr "Для *створення* надайте бібліотекарю порожню форму для заповнення." + +#: ../../src/spec/libms/index.rst:489 +msgid "Ensure the published date is logical (e.g. not a future date)." +msgstr "" +"Переконайтеся, що опублікована дата є логічною (наприклад, не є датою " +"майбутнього)." + +#: ../../src/spec/libms/index.rst:490 +msgid "Validate required inputs, according to general ``Book`` model rules." +msgstr "" +"Перевірити необхідні вхідні дані відповідно до загальних правил моделі " +"``Book``." + +#: ../../src/spec/libms/index.rst:491 +msgid "" +"If validations pass: save changes to the database; otherwise, provide " +"helpful error messages." +msgstr "" +"Якщо перевірка пройшла успішно: збережіть зміни в базі даних; в іншому " +"випадку надайте корисні повідомлення про помилки." + +#: ../../src/spec/libms/index.rst:495 +msgid "" +"You MAY provide a mechanism (like modal or a quick entry form) to add a new " +"genre or author without leaving the book form page." +msgstr "" +"Ви МОЖЕТЕ надати механізм (наприклад, модальну форму або форму швидкого " +"введення) для додавання нового жанру або автора, не виходячи зі сторінки " +"форми книги." + +#: ../../src/spec/libms/index.rst:499 +msgid "Book deletion" +msgstr "Видалення книги" + +#: ../../src/spec/libms/index.rst:501 +msgid "" +"Only librarians and administrators are permitted to perform this action." +msgstr "Тільки бібліотекарі та адміністратори мають право виконувати цю дію." + +#: ../../src/spec/libms/index.rst:505 +msgid "A confirm delete form with **Submit** and **Cancel** buttons." +msgstr "Форма підтвердження видалення з кнопками **Подати** та **Скасувати**." + +#: ../../src/spec/libms/index.rst:509 +msgid "Authorize user before deleting performing deletion." +msgstr "Авторизуйте користувача перед виконанням видалення." + +#: ../../src/spec/libms/index.rst:510 +msgid "" +"If a form is submitted, a book should be removed from the library collection." +msgstr "Якщо формуляр подано, книга має бути вилучена з бібліотечної колекції." + +#: ../../src/spec/libms/index.rst:512 +msgid "" +"If deletion is canceled view should redirect back to book detail view page." +msgstr "" +"Якщо видалення скасовано, перегляд має бути перенаправлений назад на " +"сторінку детального перегляду книги." + +#: ../../src/spec/libms/index.rst:515 +msgid "Borrow requests" +msgstr "Запити на позики" + +#: ../../src/spec/libms/index.rst:517 +msgid "" +"This view facilitates the management of borrowing requests for librarians " +"and admins, aiding in their prompt handling." +msgstr "" +"Цей перегляд полегшує бібліотекарям і адміністраторам управління запитами на " +"позики, допомагаючи оперативно їх обробляти." + +#: ../../src/spec/libms/index.rst:522 +msgid "" +"Present a table showcasing the list of borrow requests. Each row embodies a " +"borrow request and encompasses:" +msgstr "" +"Уявіть таблицю, що відображає список запитів на позики. Кожен рядок " +"відображає один запит на позику і включає в себе всі запити:" + +#: ../../src/spec/libms/index.rst:525 +msgid "**Book Title**: Title of the requested book." +msgstr "**Назва книги**: Назва запитуваної книги." + +#: ../../src/spec/libms/index.rst:526 +msgid "**User**: Identifier of the user who initiated the request." +msgstr "**Користувач**: Ідентифікатор користувача, який ініціював запит." + +#: ../../src/spec/libms/index.rst:527 +msgid "**Request Date**: Date of the request's inception." +msgstr "**Дата запиту**: Дата створення запиту." + +#: ../../src/spec/libms/index.rst:528 +msgid "" +"**Due Date**: - Input field for librarians to set upon approval for new " +"requests. - For approved ones, display the librarian-set date." +msgstr "" +"**Дата виконання**: - Поле для введення бібліотекарями при затвердженні " +"нових запитів. - Для затверджених запитів відображатиметься дата, " +"встановлена бібліотекарем." + +#: ../../src/spec/libms/index.rst:531 +msgid "" +"**Status**: Present state of the request (New, Approved, Completed, " +"Declined)." +msgstr "" +"**Статус**: Поточний стан запиту (Новий, Затверджений, Завершений, " +"Відхилений)." + +#: ../../src/spec/libms/index.rst:533 +msgid "" +"**Approve Button**: Visible for new requests. Toggles status to \"Approved\" " +"and freezes the due date." +msgstr "" +"**Кнопка \"Затвердити\"**: Відображається для нових запитів. Перемикає " +"статус на \"Затверджено\" і заморожує дату виконання." + +#: ../../src/spec/libms/index.rst:535 +msgid "" +"**Decline Button**: Appears for new requests. Sets status to \"Declined\" " +"and can prompt for a decline reason." +msgstr "" +"**Кнопка \"Відхилити\"**: З'являється для нових запитів. Встановлює статус " +"\"Відхилено\" і може запитувати причину відхилення." + +#: ../../src/spec/libms/index.rst:537 +msgid "" +"**Complete Button**: Displayed for approved requests. Marks the request as " +"completed." +msgstr "" +"**Кнопка \"Завершити\"**: Відображається для затверджених запитів. Позначає " +"запит як завершений." + +#: ../../src/spec/libms/index.rst:541 +msgid "View Logic" +msgstr "View Logic" + +#: ../../src/spec/libms/index.rst:542 +msgid "" +"**Approve Borrow Request**: - Validate book availability. - Modify book " +"status to \"Borrowed\". - Switch borrow request to \"Approved\". - " +"Define the return due date as per librarian. - Inform the user about the " +"approval and due date." +msgstr "" +"**Схвалити запит на позику**: - Підтвердити наявність книги. - Змінити " +"статус книги на \"Позичена\". - Переключіть запит на позику на " +"\"Затверджено\". - Визначте дату повернення відповідно до побажань " +"бібліотекаря. - Повідомте користувача про схвалення та дату повернення." + +#: ../../src/spec/libms/index.rst:549 +msgid "" +"**Decline Borrow Request**: - Change borrow request status to " +"\"Declined\". - Optionally, procure decline reason from librarian. - " +"Notify user regarding the declination." +msgstr "" +"**Відхилити запит на позику**: - Змінити статус запиту на \"Відхилено\". - " +"За бажанням, запитайте причину відмови у бібліотекаря. - Повідомте " +"користувача про відхилення." + +#: ../../src/spec/libms/index.rst:554 +msgid "" +"**Complete Borrow Request**: - Ensure book's return. - Update book " +"status to \"Available\". - Toggle borrow request status to \"Completed\". " +"- If needed, record any notes or damages during return." +msgstr "" +"**Завершити запит на позику**: - Переконайтеся, що книга повернулася. - " +"Оновити статус книги до \"Доступна\". - Змінити статус запиту на " +"\"Виконано\". - Якщо потрібно, запишіть будь-які примітки або пошкодження " +"під час повернення." + +#: ../../src/spec/libms/index.rst:561 +msgid "" +"Implementing reminders for near-due borrow requests can function as an alert " +"system for both the librarian and the user." +msgstr "" +"Впровадження нагадувань про прострочені запити може функціонувати як система " +"оповіщення як для бібліотекаря, так і для користувача." diff --git a/src/_locales/uk/LC_MESSAGES/vcs/basics.po b/src/_locales/uk/LC_MESSAGES/vcs/basics.po new file mode 100644 index 000000000..0955e6e57 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/vcs/basics.po @@ -0,0 +1,954 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.06.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-01-09 03:59+0200\n" +"PO-Revision-Date: 2024-01-09 04:03+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.14.0\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/vcs/basics.txt:-1 +msgid "Version control system" +msgstr "Система контролю версій" + +#: ../../src/vcs/basics.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/vcs/basics.txt:-1 +msgid "version, control, system, vcs, git, basics" +msgstr "version, control, system, vcs, git, basics" + +#: ../../src/vcs/basics.txt:8 +msgid "Git Basics" +msgstr "Основи Git" + +#: ../../src/vcs/basics.txt:11 +msgid "Getting a Git repository" +msgstr "Отримання Git-репозиторію" + +#: ../../src/vcs/basics.txt:13 +msgid "You typically obtain a Git repository in one of two ways:" +msgstr "Зазвичай ви отримуєте Git-репозиторій одним з двох способів:" + +#: ../../src/vcs/basics.txt:15 +msgid "" +"You can take a local directory that is currently not under version control, " +"and turn it into a Git repository." +msgstr "" +"Ви можете взяти локальний каталог, який наразі не перебуває під контролем " +"версій, і перетворити його на Git-репозиторій." + +#: ../../src/vcs/basics.txt:17 +msgid "You can clone an existing Git repository from elsewhere." +msgstr "Ви можете клонувати існуюче сховище Git'а з іншого місця." + +#: ../../src/vcs/basics.txt:19 +msgid "" +"In either case, you end up with a Git repository on your local machine, " +"ready for work." +msgstr "" +"У будь-якому випадку, ви отримаєте Git-репозиторій на вашій локальній " +"машині, готовий до роботи." + +#: ../../src/vcs/basics.txt:23 +msgid "Initializing repo in an existing directory" +msgstr "Ініціалізація репо в існуючому каталозі" + +#: ../../src/vcs/basics.txt:25 +msgid "" +"If you have a project directory that is currently not under version control " +"and you want to start controlling it with Git, you first need to go to that " +"project's directory. If you've never done this, it looks a little different " +"depending on which system you're running:" +msgstr "" +"Якщо у вас є каталог проекту, який наразі не перебуває під контролем версій, " +"і ви хочете почати контролювати його за допомогою Git'а, спершу вам потрібно " +"перейти до каталогу цього проекту. Якщо ви ніколи цього не робили, це " +"виглядає трохи інакше, залежно від того, якою системою ви користуєтеся:" + +#: ../../src/vcs/basics.txt:30 +msgid "Change directory in bash (Linux)" +msgstr "Зміна каталогу в bash (Linux)" + +#: ../../src/vcs/basics.txt:35 +msgid "Change directory in bash (MacOS)" +msgstr "Зміна каталогу в bash (MacOS)" + +#: ../../src/vcs/basics.txt:40 +msgid "Change directory in PowerShell (Windows)" +msgstr "Зміна каталогу в PowerShell (Windows)" + +#: ../../src/vcs/basics.txt:45 +msgid "In the project's directory initialize a new Git repository." +msgstr "У каталозі проекту ініціалізуйте новий Git-репозиторій." + +#: ../../src/vcs/basics.txt:51 +msgid "" +"This creates a new subdirectory named .git that contains all of your " +"necessary repository files -- a Git repository skeleton." +msgstr "" +"Це створить новий підкаталог з ім'ям .git, який міститиме всі необхідні " +"файли сховища - скелет сховища Git." + +#: ../../src/vcs/basics.txt:55 +msgid "Cloning an existing repo" +msgstr "Клонування існуючого репо" + +#: ../../src/vcs/basics.txt:57 +msgid "" +"If you want to get a copy of an existing Git repository -- for example, a " +"project you'd like to contribute to -- the command you need is ``git clone``." +msgstr "" +"Якщо ви хочете отримати копію існуючого сховища Git'а - наприклад, проекту, " +"до якого ви хочете долучитися, - вам потрібна команда ``git clone``." + +#: ../../src/vcs/basics.txt:64 +msgid "" +"That creates a directory named *edu-python-course.github.io*, initializes a " +"*.git* directory inside it, pulls down all the data for that repository, and " +"checks out a working copy of the latest version." +msgstr "" +"Він створює каталог з назвою *edu-python-course.github.io*, ініціалізує " +"каталог *.git* всередині нього, витягує всі дані для цього сховища і " +"перевіряє робочу копію останньої версії." + +#: ../../src/vcs/basics.txt:72 +msgid "" +"That command does the same thing as the previous one, but the target " +"directory is called *python-course*." +msgstr "" +"Ця команда робить те саме, що й попередня, але цільовий каталог називається " +"*python-course*." + +#: ../../src/vcs/basics.txt:75 +msgid "" +"Git has a number of different transfer protocols you can use. The previous " +"example uses the ``https://`` protocol, but you may also see ``git://`` or " +"``user@server:path/to/repo.git``, which uses the SSH transfer protocol." +msgstr "" +"Git має декілька різних протоколів передачі даних, які ви можете " +"використовувати. У попередньому прикладі використовується протокол ``https://" +"``, але ви також можете побачити ``git://`` або ``user@server:path/to/repo." +"git``, який використовує протокол передачі SSH." + +#: ../../src/vcs/basics.txt:80 +msgid "Making changes to the repo" +msgstr "Внесення змін до репозиторію" + +#: ../../src/vcs/basics.txt:82 +msgid "" +"At this point, you should have a *bona fide* Git repository on your local " +"machine, and a checkout or *working copy* of all of its files in front of " +"you. Typically, you'll want to start making changes and committing snapshots " +"of those changes into your repository each time the project reaches a state " +"you want to record." +msgstr "" +"На цьому етапі у вас має бути *справжній* Git-репозиторій на локальному " +"комп'ютері, а також контрольна або *робоча копія* всіх його файлів перед " +"вами. Зазвичай, ви захочете почати вносити зміни і фіксувати знімки цих змін " +"у вашому сховищі кожного разу, коли проект досягне стану, який ви хочете " +"зафіксувати." + +#: ../../src/vcs/basics.txt:88 +msgid "" +"Remember that each file in your working directory can be in one of two " +"states: **tracked** or **untracked**." +msgstr "" +"Пам'ятайте, що кожен файл у вашому робочому каталозі може перебувати в " +"одному з двох станів: **відстежується** або **невідстежується**." + +#: ../../src/vcs/basics.txt:91 +msgid "" +"Tracked files are files that were in the last snapshot, as well as any newly " +"staged files; they can be unmodified, modified, or staged. In short, tracked " +"files are files that Git knows about." +msgstr "" +"Відстежувані файли - це файли, які були в останньому знімку, а також будь-" +"які нещодавно покладені файли; вони можуть бути незміненими, зміненими або " +"покладеними. Коротше кажучи, відстежувані файли - це файли, про які відомо " +"Git'у." + +#: ../../src/vcs/basics.txt:94 +msgid "" +"Untracked files are everything else -- any files in your working directory " +"that were not in your last snapshot and are not in your staging area. " +"Untracked basically means that Git sees a file you didn't have in a previous " +"snapshot (commit), and which hasn't been yet staged." +msgstr "" +"Невідстежені файли - це все інше - будь-які файли у вашому робочому " +"каталозі, яких не було у вашому останньому знімку і які не перебувають у " +"вашій області сховища. По суті, це означає, що Git бачить файл, якого не " +"було у попередньому знімку (комміті), і який ще не було покладено у сховище." + +#: ../../src/vcs/basics.txt:110 +msgid "The lifecycle of the status of repo's files" +msgstr "Життєвий цикл статусу файлів репозиторію" + +#: ../../src/vcs/basics.txt:113 +msgid "Checking out status of the file(s)" +msgstr "Перевірка стану файлу(ів)" + +#: ../../src/vcs/basics.txt:115 +msgid "" +"The main tool you use to determine which files are in which state is the " +"``git status`` command." +msgstr "" +"Основним інструментом для визначення стану файлів є команда ``git status``." + +#: ../../src/vcs/basics.txt:142 +msgid "" +"Newly added *README.md* file is untracked, because it's under \"Untracked " +"files\" heading the status output." +msgstr "" +"Щойно доданий файл *README.md* не відстежується, оскільки він знаходиться у " +"розділі \"Файли, що не відстежуються\" у виведенні статусу." + +#: ../../src/vcs/basics.txt:146 +msgid "Tracking new files" +msgstr "Відстеження нових файлів" + +#: ../../src/vcs/basics.txt:148 +msgid "In order to begin tracking a new file, you use the ``git add`` command." +msgstr "" +"Для того, щоб почати відстеження нового файлу, скористайтеся командою ``git " +"add``." + +#: ../../src/vcs/basics.txt:162 +msgid "" +"From now *README.md* file is **added** to the stage area and ready to be " +"committed (is under \"Changes to be committed\" heading)." +msgstr "" +"Відтепер файл *README.md* **додано** до області сцени і він готовий до " +"фіксації (знаходиться під заголовком \"Зміни, що підлягають фіксації\")." + +#: ../../src/vcs/basics.txt:166 +msgid "" +"You can use wildcards, to stage multiple files at once. The most common use " +"cases is to add **all** modified files, or files inside of a specific " +"directory." +msgstr "" +"Ви можете використовувати підстановочні знаки, щоб вносити зміни до кількох " +"файлів одночасно. Найпоширенішим випадком використання є додавання **усіх** " +"змінених файлів або файлів у певному каталозі." + +#: ../../src/vcs/basics.txt:177 +msgid "Staging modified files" +msgstr "Зберігання змінених файлів" + +#: ../../src/vcs/basics.txt:179 +msgid "" +"If a staged (or already committed) file has been changed, it will be moved " +"under \"Modified\" heading. These changes wouldn't be committed unless they " +"are staged." +msgstr "" +"Якщо файл, що перебуває на етапі (або вже зафіксований), було змінено, його " +"буде переміщено у рубрику \"Змінено\". Ці зміни не будуть зафіксовані, якщо " +"вони не були поетапними." + +#: ../../src/vcs/basics.txt:199 +msgid "" +"Changes may be added to the stage area by repeating ``git add`` command." +msgstr "Зміни можна додати до області сцени, повторивши команду ``git add``." + +#: ../../src/vcs/basics.txt:200 +msgid "" +"Changes may be discard by ``git restore `` command. This action will " +"restore file to its **staged** version." +msgstr "" +"Зміни можна відкинути командою ``git restore ``. Ця дія відновить файл " +"до його **попередньої** версії." + +#: ../../src/vcs/basics.txt:204 +msgid "Committing changes" +msgstr "Фіксація змін" + +#: ../../src/vcs/basics.txt:206 +msgid "" +"Now that the stage area is set up the way required, it's time to commit " +"changes. Remember that anything that is still unstaged -- any files you have " +"created or modified that you haven't run git add on since you edited them -- " +"won't go into this commit." +msgstr "" +"Тепер, коли область змін налаштована належним чином, настав час зафіксувати " +"зміни. Пам'ятайте, що все, що ще не є стадією - будь-які файли, які ви " +"створили або змінили, але не запустили git-додаток з моменту редагування, - " +"не потраплять до цього коміту." + +#: ../../src/vcs/basics.txt:211 +msgid "The simplest way to commit is to type ``git commit``:" +msgstr "Найпростіший спосіб фіксації - ввести ``git commit``:" + +#: ../../src/vcs/basics.txt:217 +msgid "Doing so launches your editor of choice." +msgstr "Після цього запуститься обраний вами редактор." + +#: ../../src/vcs/basics.txt:220 +msgid "" +"This is set by your shell's EDITOR environment variable -- usually vim or " +"emacs, although you can configure it with whatever you want using the ``git " +"config --global core.editor``" +msgstr "" +"Це задається змінною оточення EDITOR вашої оболонки - зазвичай vim або " +"emacs, хоча ви можете налаштувати її як завгодно за допомогою ``git config --" +"global core.editor``" + +#: ../../src/vcs/basics.txt:224 +msgid "" +"Alternatively, you can type your commit message inline with the ``commit`` " +"command by specifying it after a ``-m`` flag, like this:" +msgstr "" +"Крім того, ви можете ввести повідомлення про фіксацію у рядку з командою " +"``commit``, вказавши його після прапорця ``-m``, як показано нижче:" + +#: ../../src/vcs/basics.txt:231 +msgid "" +"Although it can be amazingly useful for crafting commits exactly how you " +"want them, the staging area is sometimes a bit more complex than you need in " +"your workflow. If you want to skip the staging area, Git provides a simple " +"shortcut. Adding the ``-a`` option to the ``git commit`` command makes Git " +"automatically stage every file that is already tracked before doing the " +"commit, letting you skip the git add part:" +msgstr "" +"Хоча вона може бути надзвичайно корисною для створення коммітів саме так, як " +"вам потрібно, область підготовки іноді буває трохи складнішою, ніж вам " +"потрібно у вашому робочому процесі. Якщо ви хочете пропустити область " +"підготовки, Git надає простий ярлик. Додавання опції ``-a`` до команди ``git " +"commit`` змушує Git автоматично стадіювати кожен файл, який вже " +"відстежується, перед виконанням комміту, дозволяючи вам пропустити частину " +"git add:" + +#: ../../src/vcs/basics.txt:272 +msgid "Ignoring files" +msgstr "Ігнорування файлів" + +#: ../../src/vcs/basics.txt:274 +msgid "" +"Often, there is a class of files, that should not be a part of a repo. You " +"want these files to be prevent from being automatically added or even shown " +"as being untracked. These are generally files produced by loggers or a build " +"system, or some local settings for the project that shouldn't be shared " +"across other developers or maintainers. In such cases you can create a *." +"gitignore* file. Here is the content of *.gitignore* used in current " +"repository:" +msgstr "" +"Часто існує клас файлів, які не повинні бути частиною репозиторію. Ви " +"хочете, щоб ці файли не додавалися автоматично або навіть показувалися як " +"такі, що не відстежуються. Зазвичай це файли, створені логгерами або " +"системою збірки, або деякі локальні налаштування проекту, які не повинні " +"бути доступними для інших розробників або супровідників. У таких випадках ви " +"можете створити файл *.gitignore*. Ось вміст *.gitignore*, який " +"використовується у поточному сховищі:" + +#: ../../src/vcs/basics.txt:314 +msgid "These lines mean:" +msgstr "Ці рядки означають:" + +#: ../../src/vcs/basics.txt:316 +msgid "" +"Content within directories named \".venv\", \".env\", \"venv\" or \"env\" " +"will be ignored completely." +msgstr "" +"Вміст каталогів з іменами \".venv\", \".env\", \"venv\" або \"env\" буде " +"повністю проігноровано." + +#: ../../src/vcs/basics.txt:318 +msgid "Content within \"node_modules\" directory will be ignored completely." +msgstr "Вміст каталогу \"node_modules\" буде повністю проігноровано." + +#: ../../src/vcs/basics.txt:319 +msgid "" +"Any files within directories named \".vscode\" or \".idea\" will be ignored " +"completely." +msgstr "" +"Будь-які файли в каталогах з іменами \".vscode\" або \".idea\" будуть " +"повністю проігноровані." + +#: ../../src/vcs/basics.txt:321 +msgid "Any file with name starting with hash (#) will be ignored." +msgstr "" +"Будь-який файл з іменем, що починається з хешу (#), буде проігноровано." + +#: ../../src/vcs/basics.txt:322 +msgid "Any file with name ending with tilda (~) will be ignored." +msgstr "" +"Будь-який файл, ім'я якого закінчується на тильду (~), буде проігноровано." + +#: ../../src/vcs/basics.txt:323 +msgid "" +"Content within directories named \"temp\" or \"tmp\" will be ignored " +"completely." +msgstr "" +"Вміст каталогів з іменами \"temp\" або \"tmp\" буде повністю проігноровано." + +#: ../../src/vcs/basics.txt:325 +msgid "" +"Content within directories named \"_builds\", \"_build\", \"builds\" or " +"\"build\" will be ignored completely." +msgstr "" +"Вміст каталогів з іменами \"_builds\", \"_build\", \"builds\" або \"build\" " +"буде повністю проігноровано." + +#: ../../src/vcs/basics.txt:327 +msgid "Any file with name ending with \".pot\" will be ignored." +msgstr "" +"Будь-який файл з іменем, що закінчується на \".pot\", буде проігноровано." + +#: ../../src/vcs/basics.txt:328 +msgid "Any file with name ending with \".mo\" will be ignored." +msgstr "" +"Будь-який файл з іменем, що закінчується на \".mo\", буде проігноровано." + +#: ../../src/vcs/basics.txt:330 +msgid "" +"Setting up a *.gitignore* file for your new repository before you get going " +"is generally a good idea so you don't accidentally commit files that you " +"really don't want in your Git repository." +msgstr "" +"Створення файлу *.gitignore* для вашого нового сховища перед початком " +"роботи, як правило, є гарною ідеєю, щоб випадково не зафіксувати файли, які " +"вам насправді не потрібні у вашому Git-репозиторії." + +#: ../../src/vcs/basics.txt:334 +msgid "" +"The rules for the patterns you can put in the *.gitignore* file are as " +"follows:" +msgstr "" +"Правила для шаблонів, які ви можете помістити у *.gitignore* файл, такі:" + +#: ../../src/vcs/basics.txt:336 +msgid "Blank lines or lines starting with # are ignored." +msgstr "Порожні рядки або рядки, що починаються з #, ігноруються." + +#: ../../src/vcs/basics.txt:337 +msgid "" +"Standard glob patterns work, and will be applied recursively throughout the " +"entire working tree." +msgstr "" +"Працюють стандартні глобальні шаблони, які будуть застосовуватися рекурсивно " +"по всьому робочому дереву." + +#: ../../src/vcs/basics.txt:339 +msgid "" +"You can start patterns with a forward slash (/) to avoid recursive inclusion." +msgstr "" +"Щоб уникнути рекурсивного включення, ви можете починати шаблони з прямої " +"похилої риски (/)." + +#: ../../src/vcs/basics.txt:341 +msgid "You can end patterns with a forward slash (/) to specify a directory." +msgstr "" +"Ви можете закінчувати шаблони прямою похилою рискою (/), щоб вказати каталог." + +#: ../../src/vcs/basics.txt:342 +msgid "You can negate a pattern by starting it with an exclamation point (!)." +msgstr "Ви можете заперечити шаблон, почавши його зі знаку оклику (!)." + +#: ../../src/vcs/basics.txt:344 +msgid "" +"Glob patterns are like simplified regular expressions that shells use. An " +"asterisk (\\*) matches zero or more characters; [ab] matches any character " +"inside the brackets (in this case a or b); a question mark (?) matches a " +"single character; and brackets enclosing characters separated by a hyphen " +"([0-9]) matches any character between them (in this case 0 through 9). You " +"can also use two asterisks to match nested directories; a/\\*\\*/z would " +"match *a/z*, *a/b/z*, *a/b/c/z*, and so on." +msgstr "" +"Глобальні шаблони подібні до спрощених регулярних виразів, які " +"використовують оболонки. Зірочка (\\*) відповідає нулю або більше символів; " +"[ab] відповідає будь-якому символу всередині дужок (у цьому випадку a або " +"b); знак питання (?) відповідає одному символу; а дужки, що містять символи, " +"розділені дефісом ([0-9]), відповідають будь-якому символу між ними (у цьому " +"випадку від 0 до 9). Ви також можете використовувати дві зірочки для " +"вкладених каталогів; a/\\*\\*/z буде відповідати *a/z*, *a/b/z*, *a/b/c/z* і " +"так далі." + +#: ../../src/vcs/basics.txt:353 +msgid "Viewing the commit history" +msgstr "Перегляд історії коммітів" + +#: ../../src/vcs/basics.txt:355 +msgid "" +"After you have created several commits, or if you have cloned a repository " +"with an existing commit history, you'll probably want to look back to see " +"what has happened. The most basic and powerful tool to do this is the ``git " +"log`` command." +msgstr "" +"Після того, як ви створили кілька коммітів, або якщо ви клонували сховище з " +"існуючою історією коммітів, ви, ймовірно, захочете озирнутися назад, щоб " +"побачити, що сталося. Найпростішим і найпотужнішим інструментом для цього є " +"команда ``git log``." + +#: ../../src/vcs/basics.txt:381 +msgid "" +"By default, with no arguments, ``git log`` lists the commits made in that " +"repository in reverse chronological order; that is, the most recent commits " +"show up first. As you can see, this command lists each commit with its SHA-1 " +"checksum, the author's name and email, the date written, and the commit " +"message." +msgstr "" +"За замовчуванням, без аргументів, ``git log`` виводить список коммітів, " +"зроблених у цьому сховищі, у зворотному хронологічному порядку; тобто, " +"найновіші комміти показуються першими. Як ви можете бачити, ця команда " +"показує кожне внесення з його контрольною сумою SHA-1, ім'ям та електронною " +"адресою автора, датою створення та повідомленням про внесення." + +#: ../../src/vcs/basics.txt:387 +msgid "" +"One of the more helpful options is ``-p`` or ``--patch``, which shows the " +"difference (the *patch* output) introduced in each commit. You can also " +"limit the number of log entries displayed, such as using ``-`` to " +"show only desired number of latest entries." +msgstr "" +"Однією з найбільш корисних опцій є ``-p`` або ``--patch``, яка показує " +"відмінності (виведення *patch*), внесені у кожну фіксацію. Ви також можете " +"обмежити кількість відображуваних записів, наприклад, за допомогою ``-" +"``, щоб показати лише потрібну кількість останніх записів." + +#: ../../src/vcs/basics.txt:423 +msgid "" +"This option display the same information but with a diff directly following " +"each entry. This is very helpful for code review or to quickly browse what " +"happened during a series of commits that a collaborator has added. You can " +"also use a series of summarizing options with ``git log``." +msgstr "" +"Цей параметр показує ту саму інформацію, але з різницею безпосередньо після " +"кожного запису. Це дуже корисно для перегляду коду або для швидкого " +"перегляду того, що сталося під час серії коммітів, доданих співавторами. Ви " +"також можете скористатися низкою параметрів підсумовування за допомогою " +"``git log``." + +#: ../../src/vcs/basics.txt:428 +msgid "" +"If you want to see some abbreviated stats for each commit, you can use the " +"``--stat`` option:" +msgstr "" +"Якщо ви хочете побачити скорочену статистику для кожного коміту, ви можете " +"скористатися опцією ``--stat``:" + +#: ../../src/vcs/basics.txt:452 +msgid "" +"Another really useful option is ``--pretty``. This option changes the log " +"output to formats other that the default. A few prebuilt option values are " +"available for you to use. The ``oneline`` value for this option prints each " +"commit on a single line, which is useful if you're look a lot of commits. In " +"addition, the ``short``, ``full``, and ``fuller`` values show the output in " +"roughly the same format but with less or more information." +msgstr "" +"Ще одним дійсно корисним параметром є ``--pretty``. Цей параметр змінює " +"формат виведення журналу на формат, відмінний від стандартного. Ви можете " +"скористатися кількома готовими значеннями цього параметра. Значення " +"``oneline`` для цього параметра виводить кожну фіксацію в одному рядку, що є " +"корисним, якщо ви переглядаєте багато фіксацій. Крім того, значення " +"``short``, ``full`` і ``fuller`` показують виведення у приблизно однаковому " +"форматі, але з меншою або більшою кількістю інформації." + +#: ../../src/vcs/basics.txt:485 +msgid "Specifier" +msgstr "Специфікатор" + +#: ../../src/vcs/basics.txt:485 +msgid "Description of Output" +msgstr "Опис Результатів" + +#: ../../src/vcs/basics.txt:487 +msgid "%H" +msgstr "%H" + +#: ../../src/vcs/basics.txt:487 +msgid "Commit hash" +msgstr "Хеш комміту" + +#: ../../src/vcs/basics.txt:489 +msgid "%h" +msgstr "%h" + +#: ../../src/vcs/basics.txt:489 +msgid "Abbreviated commit hash" +msgstr "Скорочений хеш коміту" + +#: ../../src/vcs/basics.txt:491 +msgid "%T" +msgstr "%T" + +#: ../../src/vcs/basics.txt:491 +msgid "Tree hash" +msgstr "Дерево хешу" + +#: ../../src/vcs/basics.txt:493 +msgid "%t" +msgstr "%t" + +#: ../../src/vcs/basics.txt:493 +msgid "Abbreviated tree hash" +msgstr "Скорочений хеш дерева" + +#: ../../src/vcs/basics.txt:495 +msgid "%P" +msgstr "%P" + +#: ../../src/vcs/basics.txt:495 +msgid "Parent hashes" +msgstr "Батьківські хеші" + +#: ../../src/vcs/basics.txt:497 +msgid "%p" +msgstr "%p" + +#: ../../src/vcs/basics.txt:497 +msgid "Abbreviated parent hashes" +msgstr "Скорочені батьківські хеші" + +#: ../../src/vcs/basics.txt:499 +msgid "%an" +msgstr "%an" + +#: ../../src/vcs/basics.txt:499 +msgid "Author name" +msgstr "Ім'я автора" + +#: ../../src/vcs/basics.txt:501 +msgid "%ae" +msgstr "%ae" + +#: ../../src/vcs/basics.txt:501 +msgid "Author email" +msgstr "Електронна пошта автора" + +#: ../../src/vcs/basics.txt:503 +msgid "%ad" +msgstr "%ad" + +#: ../../src/vcs/basics.txt:503 +msgid "Author date (format respects the --date=option)" +msgstr "Дата автора (формат відповідає параметру --date=option)" + +#: ../../src/vcs/basics.txt:505 +msgid "%ar" +msgstr "%ar" + +#: ../../src/vcs/basics.txt:505 +msgid "Author date, relative" +msgstr "Дата автора, відносна" + +#: ../../src/vcs/basics.txt:507 +#, python-format +msgid "%cn" +msgstr "%cn" + +#: ../../src/vcs/basics.txt:507 +msgid "Committer name" +msgstr "Ім'я коммітера" + +#: ../../src/vcs/basics.txt:509 +#, python-format +msgid "%ce" +msgstr "%ce" + +#: ../../src/vcs/basics.txt:509 +msgid "Committer email" +msgstr "Електронна пошта коммітера" + +#: ../../src/vcs/basics.txt:511 +#, python-format +msgid "%cd" +msgstr "%cd" + +#: ../../src/vcs/basics.txt:511 +msgid "Committer date" +msgstr "Дата коммітера" + +#: ../../src/vcs/basics.txt:513 +#, python-format +msgid "%cr" +msgstr "%cr" + +#: ../../src/vcs/basics.txt:513 +msgid "Committer date, relative" +msgstr "Дата коммітера, відносна" + +#: ../../src/vcs/basics.txt:515 +#, python-format +msgid "%s" +msgstr "%s" + +#: ../../src/vcs/basics.txt:515 +msgid "Subject" +msgstr "Тема" + +#: ../../src/vcs/basics.txt:518 +msgid "" +"The ``oneline`` and ``format`` option values are particularly useful with " +"another ``log`` option called ``--graph``. This option adds a nice little " +"ASCII graph showing your branch and merge history:" +msgstr "" +"Значення параметрів ``online`` і ``format`` особливо корисні з іншим " +"параметром ``log``, який називається ``--graph``. Цей параметр додає " +"невеликий гарний графік у форматі ASCII, який показує історію ваших гілок і " +"злиття:" + +#: ../../src/vcs/basics.txt:547 +msgid "" +"There are many more output-formatting options to ``git log``. Common options " +"to ``git log`` are:" +msgstr "" +"Існує набагато більше варіантів форматування виводу для ``git log``. " +"Загальними параметрами ``git log`` є наступні:" + +#: ../../src/vcs/basics.txt:551 +msgid "Option" +msgstr "Опція" + +#: ../../src/vcs/basics.txt:551 +msgid "Description" +msgstr "Опис" + +#: ../../src/vcs/basics.txt:553 +msgid "-p" +msgstr "-p" + +#: ../../src/vcs/basics.txt:553 +msgid "Show the patch introduced with each commit." +msgstr "Показувати виправлення, внесені з кожним коммітом." + +#: ../../src/vcs/basics.txt:555 +msgid "--stat" +msgstr "--stat" + +#: ../../src/vcs/basics.txt:555 +msgid "Show statistics for files modified in each commit." +msgstr "Показувати статистику для файлів, змінених у кожному коміті." + +#: ../../src/vcs/basics.txt:557 +msgid "--shortstat" +msgstr "--shortstat" + +#: ../../src/vcs/basics.txt:557 +msgid "" +"Display only the changed/insertions/deletions line from the --stat command." +msgstr "Відображати лише змінений/вставлений/видалений рядок з команди --stat." + +#: ../../src/vcs/basics.txt:560 +msgid "--name-only" +msgstr "--name-only" + +#: ../../src/vcs/basics.txt:560 +msgid "Show the list of files modified after the commit information." +msgstr "Показати список файлів, змінених після фіксації інформації." + +#: ../../src/vcs/basics.txt:563 +msgid "--name-status" +msgstr "--name-status" + +#: ../../src/vcs/basics.txt:563 +msgid "" +"Show the list of files affected with added/modified/deleted information as " +"well." +msgstr "" +"Також покажіть список файлів, яких торкнулася додана/змінена/видалена " +"інформація." + +#: ../../src/vcs/basics.txt:566 +msgid "--abbrev-commit" +msgstr "--abbrev-commit" + +#: ../../src/vcs/basics.txt:566 +msgid "" +"Show only the first few characters of the SHA-1 checksum instead of all 40." +msgstr "" +"Показувати лише перші кілька символів контрольної суми SHA-1 замість усіх 40." + +#: ../../src/vcs/basics.txt:569 +msgid "--relative-date" +msgstr "--relative-date" + +#: ../../src/vcs/basics.txt:569 +msgid "" +"Display the date in a relative format (for example, \"2 weeks ago\") instead " +"of using the full date format." +msgstr "" +"Відображати дату у відносному форматі (наприклад, \"2 тижні тому\") замість " +"повного формату дати." + +#: ../../src/vcs/basics.txt:572 +msgid "--graph" +msgstr "--graph" + +#: ../../src/vcs/basics.txt:572 +msgid "" +"Display an ASCII graph of the branch and merge history beside the log output." +msgstr "" +"Відобразити ASCII-графік гілки та історію злиття поряд з виведенням журналу." + +#: ../../src/vcs/basics.txt:575 +msgid "--pretty" +msgstr "--pretty" + +#: ../../src/vcs/basics.txt:575 +msgid "" +"Show commits in an alternate format. Option values include oneline, short, " +"full, fuller, and format (where you specify your own format)." +msgstr "" +"Показувати комміти в альтернативному форматі. Значення опції включають: " +"online, short, full, fuller і format (де ви можете вказати свій власний " +"формат)." + +#: ../../src/vcs/basics.txt:579 +msgid "--oneline" +msgstr "--oneline" + +#: ../../src/vcs/basics.txt:579 +msgid "Shorthand for --pretty=oneline --abbrev-commit used together." +msgstr "" +"Скорочення для --pretty=online --abbrev-commit, що використовується разом." + +#: ../../src/vcs/basics.txt:584 +msgid "Limiting log output" +msgstr "Обмеження виводу журналу" + +#: ../../src/vcs/basics.txt:586 +msgid "" +"In addition to output-formatting options, ``git log`` takes a number of " +"useful limiting options; that is options that let you show only a subset of " +"commits. You've seen one such option already -- the ``-`` (e.g. " +"``-2`` or ``-10``) option, which displays only the given number of latest " +"commits." +msgstr "" +"На додаток до параметрів форматування виводу, ``git log`` приймає ряд " +"корисних обмежувальних параметрів, тобто параметрів, які дозволяють вам " +"показувати лише підмножину коммітів. Ви вже бачили одну з таких опцій - ``-" +"<число>`` (наприклад, ``-2`` або ``-10``), яка показує лише вказану " +"кількість останніх коммітів." + +#: ../../src/vcs/basics.txt:600 +msgid "" +"However, the time-limiting options such as ``--since`` and ``--until`` are " +"very useful. For example, the command to get the list of commits made in the " +"last two weeks:" +msgstr "" +"Однак, дуже корисними є опції, що обмежують час, такі як ``--since`` і ``--" +"until``. Наприклад, команда для отримання списку коммітів, зроблених за " +"останні два тижні:" + +#: ../../src/vcs/basics.txt:608 +msgid "" +"This command works with lots of formats - you can specify a specific date " +"like ``\"2022-02-24\"``, or relative date such as ``\"2 years 1 days 3 " +"minutes ago\"``." +msgstr "" +"Ця команда працює з багатьма форматами - ви можете вказати конкретну дату, " +"наприклад, ``\"2022-02-24\"``, або відносну дату, наприклад, ``\"2 роки 1 " +"день 3 хвилини тому\"``." + +#: ../../src/vcs/basics.txt:611 +msgid "" +"The last really useful option to pass to ``git log`` as a filter is a path. " +"If you specify a directory or file name, you can limit the log output to " +"commits that introduced a change to those files. This is always the last " +"option and is generally preceded by double dashes (``--``) to separate the " +"paths from the options:" +msgstr "" +"Останньою дійсно корисною опцією, яку можна передати ``git log`` як фільтр, " +"є шлях. Якщо ви вкажете каталог або ім'я файлу, ви зможете обмежити " +"виведення журналу лише тими комітами, які внесли зміни до цих файлів. Це " +"завжди останній параметр, і йому зазвичай передують подвійні тире (``--``), " +"щоб відокремити шлях від параметрів:" + +#: ../../src/vcs/basics.txt:630 +msgid "Undoing things" +msgstr "Виправлення помилок" + +#: ../../src/vcs/basics.txt:632 +msgid "At any stage, you may want to undo something." +msgstr "На будь-якому етапі ви можете захотіти щось виправити." + +#: ../../src/vcs/basics.txt:634 +msgid "" +"One of the common undos takes place when you commit too early and possibly " +"forget to add some files, or you mess up your commit message. If you want to " +"redo that commit, make the additional changes you forgot, stage them, and " +"commit again using the ``--amend`` option:" +msgstr "" +"Одне з найпоширеніших випадків скасування відбувається, коли ви коммітуєте " +"занадто рано і, можливо, забуваєте додати деякі файли, або ви псуєте своє " +"повідомлення про коммітування. Якщо ви хочете повторити фіксацію, внесіть " +"додаткові зміни, про які ви забули, збережіть їх і зафіксуйте ще раз, " +"використовуючи опцію ``--amend``:" + +#: ../../src/vcs/basics.txt:643 +msgid "E.g." +msgstr "Наприклад." + +#: ../../src/vcs/basics.txt:652 +msgid "Unstaging a staged file" +msgstr "Скасування додавання файла до індексу" + +#: ../../src/vcs/basics.txt:654 +msgid "" +"The next two sections demonstrate how to work with your staging area and " +"working directory changes. The nice part is that the command you use to " +"determine the state of those two areas also reminds you how to undo changes " +"to them." +msgstr "" +"У наступних двох розділах продемонстровано, як працювати зі змінами у вашій " +"збірці та робочому каталозі. Приємним моментом є те, що команда, за " +"допомогою якої ви визначаєте стан цих двох областей, також нагадує вам про " +"те, як скасувати внесені до них зміни." + +#: ../../src/vcs/basics.txt:685 +msgid "Unmodifiyng a modified file" +msgstr "Скасування модифікації зміненого файлу" + +#: ../../src/vcs/basics.txt:687 +msgid "" +"What if you realize that you don't want to keep your changes to some file? " +"You can easily unmodify it -- **revert** it back to what it looked like when " +"you last committed. ``git status`` also tells you how to do that:" +msgstr "" +"Що робити, якщо ви зрозуміли, що не хочете зберігати зміни у якомусь файлі? " +"Ви можете легко скасувати зміни - **повернути** його до того, як він " +"виглядав під час останнього компонування. ``git status`` також покаже вам, " +"як це зробити:" + +#: ../../src/vcs/basics.txt:695 +msgid "It tells you pretty explicitly how to discard the changes you've make." +msgstr "Він досить чітко розповідає, як відкинути зміни, які ви зробили." + +#: ../../src/vcs/basics.txt:708 +msgid "Undoing things with git restore" +msgstr "Скасування змін за допомогою git restore" + +#: ../../src/vcs/basics.txt:710 +msgid "" +"``git restore`` is basically an alternative to ``git reset``, from Git " +"version 2.23.0 onwards, Git will use ``git restore`` instead of ``git " +"reset`` for many undo operations." +msgstr "" +"``git restore`` є альтернативою ``git reset``, починаючи з версії 2.23.0, " +"Git використовуватиме ``git restore`` замість ``git reset`` для багатьох " +"операцій скасування." + +#: ../../src/vcs/basics.txt:746 +msgid "" +"It’s important to understand that git restore is a dangerous command. " +"Any local changes you made to that file are gone -- Git just replaced that " +"file with the last staged or committed version. Don't ever use this command " +"unless you absolutely know that you don’t want those unsaved local changes." +msgstr "" +"Важливо розуміти, що відновлення git'ом <файлу> є небезпечною командою. Усі " +"локальні зміни, які ви зробили у цьому файлі, буде втрачено - Git просто " +"замінить цей файл на останню версію, що перебуває у стадії виконання або " +"фіксації. Ніколи не використовуйте цю команду, якщо ви точно не знаєте, що " +"вам не потрібні ці незбережені локальні зміни." diff --git a/src/_locales/uk/LC_MESSAGES/vcs/branch.po b/src/_locales/uk/LC_MESSAGES/vcs/branch.po new file mode 100644 index 000000000..e833e4a02 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/vcs/branch.po @@ -0,0 +1,533 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2024.03.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-03-08 08:45+0000\n" +"PO-Revision-Date: 2024-03-08 10:56+0200\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.14.0\n" +"X-Generator: Poedit 3.4.2\n" + +#: ../../src/vcs/branch.txt:-1 +msgid "Version control system" +msgstr "Система контролю версій" + +#: ../../src/vcs/branch.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/vcs/branch.txt:-1 +msgid "version, control, system, vcs, git, branch, merge, cherry-pick" +msgstr "version, control, system, vcs, git, branch, merge, cherry-pick" + +#: ../../src/vcs/branch.txt:8 +msgid "Branches and Merging" +msgstr "Гілки та злиття" + +#: ../../src/vcs/branch.txt:11 +msgid "About branches" +msgstr "Про гілки" + +#: ../../src/vcs/branch.txt:13 +msgid "" +"To really understand the way Git does branching, we need to take a step back " +"and examine how Git stores its data. Git doesn't store data as a series of " +"changesets or differences, but instead as a series of snapshots. When you " +"make a commit, Git stores a commit object that contains a pointer to the " +"snapshot of the content you staged. This object also contains the author's " +"name and email address, the message that you typed, and pointers to the " +"commit or commits that directly came before this commit (its parent or " +"parents): zero parents for the initial commit, one parent for a normal " +"commit, and multiple parents for a commit that results from a merge of two " +"or more branches." +msgstr "" +"Щоб по-справжньому зрозуміти, як Git працює з розгалуженнями, нам потрібно " +"зробити крок назад і розглянути, як Git зберігає свої дані. Git зберігає " +"дані не у вигляді серії наборів змін або відмінностей, а у вигляді серії " +"знімків. Коли ви робите коміт, Git зберігає об'єкт коміту, який містить " +"вказівник на створений вами знімок вмісту. Цей об'єкт також містить ім'я та " +"адресу електронної пошти автора, повідомлення, яке ви набрали, і вказівники " +"на комміт або комміти, які безпосередньо передували цьому комміту (його " +"батька або батьків): нульовий батько для початкового комміту, один батько " +"для звичайного комміту і кілька батьків для комміту, який є результатом " +"злиття двох або більше гілок." + +#: ../../src/vcs/branch.txt:35 +msgid "Commits tree" +msgstr "Дерево комітів" + +#: ../../src/vcs/branch.txt:37 +msgid "" +"A branch in Git is simply a lightweight movable pointer to one of these " +"commits. The default branch name in Git is master. As you start making " +"commits, you're given a master branch that points to the last commit you " +"made. Every time you commit, the master branch pointer moves forward " +"automatically." +msgstr "" +"Гілка в Git'і - це просто легкий рухомий вказівник на одну з цих коммітів. " +"Стандартна назва гілки у Git'і - master. Коли ви починаєте робити комміти, " +"ви отримуєте головну гілку, яка вказує на останній зроблений вами комміт. " +"Кожного разу, коли ви робите комміт, вказівник головної гілки автоматично " +"пересувається вперед." + +#: ../../src/vcs/branch.txt:47 +msgid "Branch management" +msgstr "Управління гілками" + +#: ../../src/vcs/branch.txt:49 +msgid "" +"The ``git branch`` command does more that create and delete branches. If you " +"run it with no arguments, you get a simple listing of your current branches:" +msgstr "" +"Команда ``git branch`` робить більше, ніж просто створює і видаляє гілки. " +"Якщо ви запустите її без аргументів, ви отримаєте простий список ваших " +"поточних гілок:" + +#: ../../src/vcs/branch.txt:64 +msgid "" +"To see all the branches that contain work you haven't yet merged in, use ``--" +"no-merged`` option:" +msgstr "" +"Щоб побачити всі гілки, які містять роботи, до яких ви ще не приєдналися, " +"використовуйте опцію ``--no-merged``:" + +#: ../../src/vcs/branch.txt:74 +msgid "" +"Branches listed in the output has work, that isn't merged to current branch. " +"So, deleting them via ``git branch -d`` will fail." +msgstr "" +"У гілках, перелічених у виводі, є напрацювання, які не злито з поточною " +"гілкою. Отже, їх видалення за допомогою ``git branch -d`` не спрацює." + +#: ../../src/vcs/branch.txt:78 +msgid "Create branches" +msgstr "Створення гілок" + +#: ../../src/vcs/branch.txt:80 +msgid "" +"There are few ways to create a new branch in a Git repository. The most " +"common way is to use ``git branch`` command." +msgstr "" +"Існує декілька способів створити нову гілку в Git-сховищі. Найпоширеніший з " +"них - використання команди ``git branch``." + +#: ../../src/vcs/branch.txt:87 +msgid "" +"Pointer to a parent commit is optional. By default the parent commit is set " +"to the latest one available (HEAD pointer) at the moment of the branch " +"creation. You can also switch to the newly created branch just after its " +"creation using:" +msgstr "" +"Вказівник на батьківський коміт не є обов'язковим. За замовчуванням " +"батьківський коміт встановлюється на найновіший доступний (вказівник HEAD) " +"на момент створення гілки. Ви також можете переключитися на новостворену " +"гілку одразу після її створення за допомогою:" + +#: ../../src/vcs/branch.txt:97 +msgid "Switching branches" +msgstr "Перемикання гілок" + +#: ../../src/vcs/branch.txt:99 +msgid "To switch to an existing branch, you run the ``git checkout`` command." +msgstr "Щоб перейти до існуючої гілки, виконайте команду ``git checkout``." + +#: ../../src/vcs/branch.txt:118 +msgid "Basic branching and merging" +msgstr "Основи розгалуження та злиття" + +#: ../../src/vcs/branch.txt:120 +msgid "" +"First, let's say you're working on your project and have a couple of commits " +"already on the ``master`` branch. You've decided that you're going to work " +"on **feature #53** in whatever issue-tracking system your company uses. To " +"create a new branch and switch to it at the same time, you can run the ``git " +"checkout`` command with the ``-b`` switch:" +msgstr "" +"По-перше, припустимо, що ви працюєте над своїм проектом і вже маєте кілька " +"комітів на гілці ``master``. Ви вирішили, що будете працювати над **feature " +"#53** в будь-якій системі моніторінгу завдань, яку використовує ваша " +"компанія. Щоб створити нову гілку і одночасно переключитися на неї, ви " +"можете виконати команду ``git checkout`` з ключем ``-b``:" + +#: ../../src/vcs/branch.txt:131 +msgid "This is shorthand for:" +msgstr "Це скорочено означає:" + +#: ../../src/vcs/branch.txt:138 +msgid "" +"In deed this creates a new branch pointer, aimed to the latest commit " +"present on ``master`` branch. But, from now your branch is ``feature/" +"GH-53``. So, doing commits moves the feature branch pointer forward, because " +"you have it checkout out (that is, your ``HEAD`` is pointing to it)." +msgstr "" +"Насправді це створить новий покажчик гілки, спрямований на останню фіксацію, " +"наявну у гілці ``master``. Але відтепер ваша гілка називається ``feature/" +"GH-53``. Отже, створення коммітів пересуває вказівник гілки вперед, тому що " +"ви її вилучили (тобто ``HEAD`` вказує на неї)." + +#: ../../src/vcs/branch.txt:143 +msgid "" +"Now, lets assume the \"GH-53\" is done, and you need to bring commits from " +"the ``feature/GH-53`` branch back to ``master``." +msgstr "" +"Тепер припустимо, що працю над \"GH-53\" завершено, і вам потрібно перенести " +"коміти з гілки ``feature/GH-53`` назад до ``master``." + +#: ../../src/vcs/branch.txt:147 +msgid "Merging branches" +msgstr "Злиття гілок" + +#: ../../src/vcs/branch.txt:149 +msgid "" +"You need to switch back to ``master`` branch and use ``git merge`` command, " +"to merge changes (commits) from the source branch into target." +msgstr "" +"Вам потрібно повернутися до гілки ``master`` і скористатися командою ``git " +"merge``, щоб об'єднати зміни (коміти) з вихідної гілки в цільову." + +#: ../../src/vcs/branch.txt:161 +msgid "" +"You'll notice phrase \"fast-forward\" in that merge. Because the commit " +"pointed to by the branch ``feature/GH-53`` you merged in was directly ahead " +"of the last commit on ``master`` branch, Git simply moves the pointer " +"forward." +msgstr "" +"Ви помітите фразу \"fast-forward\" у цьому злитті. Оскільки коміт, на який " +"вказує гілка ``feature/GH-53``, до якої ви приєдналися, був безпосередньо " +"перед останнім комітом у гілці ``master``, Git просто пересуне вказівник " +"вперед." + +#: ../../src/vcs/branch.txt:165 +msgid "" +"Changes from ``feature/GH-53`` are now in the snapshot of the commit pointed " +"to by the ``master`` branch." +msgstr "" +"Зміни з ``feature/GH-53`` тепер містяться у знімку коміту, на який вказує " +"гілка ``master``." + +#: ../../src/vcs/branch.txt:179 +msgid "Fast-forward merge" +msgstr "Злиття fast-forward" + +#: ../../src/vcs/branch.txt:181 +msgid "" +"Now, lets assume another developer started working on ``feature/GH-54`` at " +"the same time. And there are few commits on this feature branch. Suppose, " +"the developer decided that work on **GH-54** is finished and they want to " +"merge their feature branch into ``master``." +msgstr "" +"Тепер припустимо, що інший розробник почав працювати над ``feature/GH-54`` в " +"той самий час. І у цій гілці мало комітів. Припустимо, що розробник вирішив, " +"що робота над **GH-54** завершена і він хоче об'єднати свою гілку з " +"``master``." + +#: ../../src/vcs/branch.txt:197 +msgid "" +"This looks a bit different than the ``feature/GH-53`` merge. In this case, " +"development history has diverged from some older point. Because the commit " +"on the branch you're on isn't a direct ancestor of the branch you're merging " +"in, Git has to do some work. In this case, Git does a simple three-way " +"merge, using two snapshots pointed to by the branch tips and the common " +"ancestor of the two." +msgstr "" +"Це виглядає дещо інакше, ніж злиття ``feature/GH-53``. У цьому випадку " +"історія розробки розійшлася з якоїсь давнішої точки. Оскільки коміт на " +"гілці, в якій ви перебуваєте, не є прямим предком гілки, в яку ви виконуєте " +"злиття, Git'у доведеться виконати деяку роботу. У цьому випадку Git виконує " +"просте тристороннє злиття, використовуючи два знімки, на які вказують " +"кінчики гілок, і їхнього спільного предка." + +#: ../../src/vcs/branch.txt:204 +msgid "" +"Instead of just moving the branch pointer forward, Git creates a new " +"snapshot that results from this three-way merge and automatically creates a " +"new commit that points to it. This is referred to as a *merge commit*, and " +"is a special in that it has more than one parent." +msgstr "" +"Замість того, щоб просто перемістити вказівник гілки вперед, Git створює " +"новий знімок, який є результатом цього тристороннього злиття, і автоматично " +"створює новий коміт, який вказує на нього. Це називається *коммітом злиття*, " +"і він особливий тим, що має більше одного батька." + +#: ../../src/vcs/branch.txt:220 ../../src/vcs/branch.txt:312 +msgid "Merge commit" +msgstr "Комміт злиття" + +#: ../../src/vcs/branch.txt:223 +msgid "Merge conflicts" +msgstr "Конфлікти об'єднання" + +#: ../../src/vcs/branch.txt:225 +msgid "" +"Occasionally, the merge process doesn't go smoothly. If the same part of the " +"same file is changed differently in the two branches you're merging, Git " +"won't be able to merge them cleanly." +msgstr "" +"Іноді процес злиття відбувається не зовсім гладко. Якщо у двох гілках, які " +"ви об'єднуєте, однакова частина одного і того ж файлу змінена по-різному, " +"Git не зможе об'єднати їх чисто." + +#: ../../src/vcs/branch.txt:236 +msgid "" +"Git hasn't automatically created a new merge commit. It has paused the " +"process while you resolve the conflict. If you want to see which files are " +"unmerged at any point after a merge conflict, you can run ``git status``:" +msgstr "" +"Git не створив автоматично новий коміт злиття. Він призупинив процес, поки " +"ви вирішуєте конфлікт. Якщо ви хочете побачити, які файли було від'єднано " +"після конфлікту злиття, ви можете запустити ``git status``:" + +#: ../../src/vcs/branch.txt:255 +msgid "" +"Anything that has merge conflicts and hasn't been resolved is listed as " +"unmerged. Git adds standard conflict-resolution markers to the files that " +"have conflicts, so you can open them manually and resolve those conflicts. " +"Your file contains a section that looks something like this:" +msgstr "" +"Все, що має конфлікти злиття, які не було вирішено, позначається як не " +"об'єднане. Git додає стандартні маркери вирішення конфліктів до файлів, які " +"мають конфлікти, щоб ви могли відкрити їх вручну і вирішити ці конфлікти. " +"Ваш файл містить розділ, який виглядає приблизно так:" + +#: ../../src/vcs/branch.txt:270 +msgid "" +"This means the version in ``HEAD`` (your ``master`` branch, because that was " +"what you had checked out when you ran merge command) is the top part of that " +"block (everything above the \"=======\"), while the version in ``vcs`` " +"branch looks like everything in the bottom part. In order to resolve the " +"conflict, you have to either choose one side or the other or merge the " +"contents yourself." +msgstr "" +"Це означає, що версія у гілці ``HEAD`` (ваша гілка ``master``, тому що саме " +"її ви перевірили, коли виконували команду merge) - це верхня частина блоку " +"(все, що вище \"=======\"), тоді як версія у гілці ``vcs`` виглядає як все, " +"що знаходиться у нижній частині. Для того, щоб вирішити конфлікт, вам " +"доведеться або стати на чийсь бік, або об'єднати вміст самостійно." + +#: ../../src/vcs/branch.txt:276 +msgid "When conflicts are resolved, you can run ``git status`` command again:" +msgstr "" +"Коли конфлікти буде вирішено, ви можете знову запустити команду ``git " +"status``:" + +#: ../../src/vcs/branch.txt:289 +msgid "" +"If you're happy with that, and you verify that everything that had conflicts " +"has been staged, you can run ``git commit`` for finalize the merge commit." +msgstr "" +"Якщо вас все влаштовує, і ви переконалися, що все, що викликало конфлікти, " +"було усунуто, ви можете запустити ``git commit`` для остаточного завершення " +"злиття." + +#: ../../src/vcs/branch.txt:293 +msgid "Rebasing" +msgstr "Перебазування" + +#: ../../src/vcs/branch.txt:295 +msgid "" +"In Git, there two main ways to integrate changes from one branch into " +"another: the ``merge`` and the ``rebase``." +msgstr "" +"У Git'і існує два основних способи інтеграції змін з однієї гілки в іншу: " +"``merge`` (злиття) і ``rebase`` (перебазування)." + +#: ../../src/vcs/branch.txt:298 +msgid "" +"Earlier, there was an example of diverged work and commits made on two " +"different branches." +msgstr "" +"Раніше ми вже наводили приклад розбіжностей у роботі та зобов'язаннях, " +"зроблених на двох різних гілках." + +#: ../../src/vcs/branch.txt:314 +msgid "" +"The easiest way to integrate the branches, as we've already covered, is the " +"``merge`` command. It performs a three-way merge between the two latest " +"branch snapshots, and the most recent common ancestor of the two, creating a " +"new snapshot (and commit)." +msgstr "" +"Найпростішим способом об'єднання гілок, як ми вже розглядали, є команда " +"``merge``. Вона виконує тристороннє злиття між двома останніми знімками " +"гілок і останнім спільним предком, створюючи новий знімок (і фіксацію)." + +#: ../../src/vcs/branch.txt:319 +msgid "" +"However, there is another way: you can take the patch of the change that was " +"introduced in ``master`` and reapply it on top of ``feature``. In Git, this " +"is called *rebasing*. With ``rebase`` command, you can take all the changes " +"that were committed on one branch and replay them on a different branch." +msgstr "" +"Втім, є й інший спосіб: ви можете взяти патч зі змінами, які було внесено до " +"``master``, і повторно застосувати його поверх ``feature``. У Git'і це " +"називається *rebasing*. За допомогою команди ``rebase`` ви можете взяти всі " +"зміни, які були зафіксовані на одній гілці, і відтворити їх на іншій гілці." + +#: ../../src/vcs/branch.txt:331 +msgid "" +"This operation works by going to the common ancestor of the two branches, " +"getting the diff introduced by each commit of the branch you're on, saving " +"those diffs to temporary files, resetting the current branch to the same " +"commit as the branch you are rebasing onto, and finally applying each change " +"in turn." +msgstr "" +"Ця операція виконується шляхом переходу до спільного предка двох гілок, " +"отримання відмінностей, внесених кожним коммітом гілки, на якій ви " +"перебуваєте, збереження цих відмінностей у тимчасових файлах, скидання " +"поточної гілки до того ж комміту, що і гілка, на яку ви перебазуєтесь, і, " +"нарешті, застосування кожної зміни по черзі." + +#: ../../src/vcs/branch.txt:348 +msgid "After rebase" +msgstr "Після ребазування" + +#: ../../src/vcs/branch.txt:351 +msgid "" +"Other maintainers prefer to rebase (or cherry-pick) contributed work on top " +"of their ``master`` branch, rather then merging it in, to keep a mostly " +"linear history." +msgstr "" +"Інші супроводжувачі надають перевагу перебазуванню (або вилученню) внесених " +"напрацювань на кінці своєї ``master`` гілки, замість того, щоб об'єднувати " +"їх, щоб зберегти переважно лінійну історію." + +#: ../../src/vcs/branch.txt:356 +msgid "Cherry-picking" +msgstr "Cherry-picking" + +#: ../../src/vcs/branch.txt:358 +msgid "" +"The other way to move introduced work from one branch to another is to " +"*cherry-pick* it. A cherry-pick in Git is a rebase for a single commit. It " +"takes the patch that was introduced in a commit and tries to reapply it on " +"the branch you're currently on. This is useful if you have a number of " +"commits on a topic branch and you want to integrate only one of them, or if " +"you only have one commit on a topic branch and you'd prefer to cherry-pick " +"it rather than run rebase." +msgstr "" +"Інший спосіб перенесення внесеної роботи з однієї гілки в іншу - це " +"*збирання коммітів* (cherry-pick). Збирання вишень у Git'і - це відновлення " +"бази для одного коміту. Він бере патч, який було внесено в комміті, і " +"намагається повторно застосувати його на гілці, на якій ви зараз " +"перебуваєте. Це корисно, якщо ви маєте декілька коммітів у гілці теми і " +"хочете інтегрувати лише один з них, або якщо ви маєте лише один комміт у " +"гілці теми і вважаєте за краще вибрати його замість того, щоб запускати " +"rebase." + +#: ../../src/vcs/branch.txt:377 +msgid "Cherry-pick a commit" +msgstr "Перенос комміту (cherry-pick)" + +#: ../../src/vcs/branch.txt:387 +msgid "Branching strategies" +msgstr "Стратегії розгалуження" + +#: ../../src/vcs/branch.txt:389 +msgid "" +"Branching strategy in version control systems defines how branches are " +"created, managed, and used in a project's development process. It helps " +"teams collaborate effectively, isolate changes, and organize development " +"efforts. A good branching strategy provides clarity on how to work with " +"branches, minimizes conflicts, and enables a smooth and structured " +"development workflow." +msgstr "" +"Стратегія розгалуження в системах контролю версій визначає, як створюються, " +"управляються та використовуються гілки в процесі розробки проекту. Вона " +"допомагає командам ефективно співпрацювати, ізолювати зміни та " +"організовувати зусилля з розробки. Хороша стратегія розгалуження забезпечує " +"чіткість у роботі з гілками, мінімізує конфлікти та уможливлює плавний і " +"структурований робочий процес розробки." + +#: ../../src/vcs/branch.txt:396 +msgid "" +"GitFlow is a popular branching strategy that provides a well-defined model " +"for managing branches in a Git repository. It was introduced by Vincent " +"Driessen and is based on the idea of using two main branches: \"master\" and " +"\"develop.\"" +msgstr "" +"GitFlow - це популярна стратегія розгалуження, яка надає чітко визначену " +"модель для управління гілками в Git-репозиторії. Вона була представлена " +"Вінсентом Дріссеном (Vincent Driessen) і базується на ідеї використання двох " +"основних гілок: \"master\" і \"develop\"." + +#: ../../src/vcs/branch.txt:400 +msgid "" +"**Master Branch**: The \"master\" branch represents the stable version of " +"the codebase. It should always contain production-ready code and be free " +"from any major issues. The \"master\" branch is protected, and only release " +"versions are merged into it." +msgstr "" +"**Майстер-гілка**: \"Майстер-гілка\" представляє стабільну версію кодової " +"бази. Вона завжди повинна містити готовий до використання код і не містити " +"жодних серйозних проблем. Майстер-гілка захищена, і в неї зливаються тільки " +"релізні версії." + +#: ../../src/vcs/branch.txt:404 +msgid "" +"**Develop Branch**: The \"develop\" branch is where the ongoing development " +"and integration of features take place. It serves as the integration branch " +"for various feature branches and should also contain a stable version of the " +"code." +msgstr "" +"**Гілка розробки**: Гілка \"develop\" - це місце, де відбувається постійна " +"розробка та інтеграція функцій. Вона слугує інтеграційною гілкою для різних " +"функціональних гілок, а також повинна містити стабільну версію коду." + +#: ../../src/vcs/branch.txt:408 +msgid "" +"**Feature Branches**: For each new feature or bug fix, a dedicated " +"\"feature\" branch is created off the \"develop\" branch. These branches are " +"short-lived and exist only for the duration of the feature development." +msgstr "" +"**Гілки функцій**: Для кожної нової функції або виправлення помилки " +"створюється окрема гілка \"feature\" у гілці \"develop\". Ці гілки " +"недовговічні і існують лише на час розробки функції." + +#: ../../src/vcs/branch.txt:411 +msgid "" +"**Release Branches**: When the development on the \"develop\" branch is " +"ready for a release, a \"release\" branch is created. The release branch is " +"used for testing, bug fixing, and preparing for deployment." +msgstr "" +"**Гілки релізу**: Коли розробка на гілці \"develop\" готова до релізу, " +"створюється гілка \"release\". Релізна гілка використовується для " +"тестування, виправлення помилок і підготовки до розгортання." + +#: ../../src/vcs/branch.txt:414 +msgid "" +"**Hotfix Branches**: If a critical issue is discovered in the production " +"version, a \"hotfix\" branch is created from the \"master\" branch. This " +"allows for a quick fix without affecting ongoing development on the " +"\"develop\" branch." +msgstr "" +"**Гілки виправлень**: Якщо у виробничій версії виявлено критичну проблему, " +"на основі основної гілки створюється гілка \"hotfix\". Це дозволяє швидко " +"виправити проблему, не впливаючи на поточну розробку на гілці \"develop\"." + +#: ../../src/vcs/branch.txt:419 +msgid "" +"GitFlow provides a structured approach to managing branching in a " +"collaborative development environment. It ensures that the main branches " +"remain stable, and new features and bug fixes are integrated smoothly before " +"being released. This strategy is particularly useful for projects with " +"regular releases and a team working on multiple features concurrently." +msgstr "" +"GitFlow забезпечує структурований підхід до управління розгалуженням у " +"середовищі спільної розробки. Він гарантує, що основні гілки залишаються " +"стабільними, а нові функції та виправлення помилок плавно інтегруються перед " +"випуском. Ця стратегія особливо корисна для проектів з регулярними випусками " +"і командою, яка працює над декількома функціями одночасно." + +#: ../../src/vcs/branch.txt:436 +msgid "GitFlow diagram" +msgstr "Діаграма GitFlow" diff --git a/src/_locales/uk/LC_MESSAGES/vcs/github.po b/src/_locales/uk/LC_MESSAGES/vcs/github.po new file mode 100644 index 000000000..530c87eea --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/vcs/github.po @@ -0,0 +1,259 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.06.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:17+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/vcs/github.txt:-1 +msgid "Version control system" +msgstr "Система контролю версій" + +#: ../../src/vcs/github.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/vcs/github.txt:-1 +msgid "version, control, system, vcs, git, github" +msgstr "version, control, system, vcs, git, github" + +#: ../../src/vcs/github.txt:10 +msgid "GitHub" +msgstr "GitHub" + +#: ../../src/vcs/github.txt:12 +msgid "" +"`GitHub`_ is the single largest host for Git repositories, and is the " +"central point of collaboration for millions of developers and projects." +msgstr "" +"`GitHub`_ - найбільший хостинг для Git-репозиторіїв, який є центральною " +"точкою співпраці для мільйонів розробників і проектів." + +#: ../../src/vcs/github.txt:16 +msgid "Account setup and configuration" +msgstr "Налаштування та конфігурація акаунта" + +#: ../../src/vcs/github.txt:18 +msgid "" +"The first thing you need to do is set up a free user account. Visit " +"`GitHub`_ and press \"Sign Up\" button. The GitHub will lead you through the " +"account creation process. Just follow the hints and provide an email " +"address, username and a strong password." +msgstr "" +"Перше, що вам потрібно зробити, це створити безкоштовний обліковий запис " +"користувача. Відвідайте `GitHub`_ і натисніть кнопку \"Зареєструватися\". " +"GitHub проведе вас через процес створення облікового запису. Просто " +"дотримуйтесь підказок і вкажіть адресу електронної пошти, ім'я користувача " +"та надійний пароль." + +#: ../../src/vcs/github.txt:24 +msgid "About authentication to GitHub" +msgstr "Про автентифікацію на GitHub" + +#: ../../src/vcs/github.txt:27 +msgid "" +"Starting in March 2023 and through the end of 2023, GitHub gradually began " +"to require all users who contribute code on GitHub to enable two-factor " +"authentication (2FA)." +msgstr "" +"Починаючи з березня 2023 року і до кінця 2023 року, GitHub поступово почав " +"вимагати від усіх користувачів, які публікують код на GitHub, увімкнути " +"двофакторну автентифікацію (2FA)." + +#: ../../src/vcs/github.txt:32 +msgid "Connect with SSH" +msgstr "Підключення за допомогою SSH" + +#: ../../src/vcs/github.txt:34 +msgid "" +"You can access and write data in repositories on GitHub using :abbr:`SSH " +"(Secure Shell Protocol)`. When you connect to via SSH, you authenticate " +"using a private key file on your local machine." +msgstr "" +"Ви можете отримати доступ до даних у репозиторіях на GitHub і писати їх за " +"допомогою :abbr:`SSH (Secure Shell Protocol)`. При підключенні по SSH ви " +"автентифікуєтесь за допомогою файлу приватного ключа на вашому локальному " +"комп'ютері." + +#: ../../src/vcs/github.txt:39 +msgid "Generating a new SSH key" +msgstr "Генерація нового SSH-ключа" + +#: ../../src/vcs/github.txt:41 +msgid "" +"You can generate a new SSH key on your local machine. After you do that, you " +"can add the **public** key to your account on GitHub to enable " +"authentication for Git operations over SSH." +msgstr "" +"Ви можете згенерувати новий SSH-ключ на своїй локальній машині. Після цього " +"ви можете додати **public** ключ до свого облікового запису на GitHub, щоб " +"увімкнути автентифікацію для операцій з Git'ом через SSH." + +#: ../../src/vcs/github.txt:45 +msgid "Open terminal (git-bash will suite for Windows users)" +msgstr "Відкритий термінал (для користувачів Windows підійде git-bash)" + +#: ../../src/vcs/github.txt:46 +msgid "Run command:" +msgstr "Виконати команду:" + +#: ../../src/vcs/github.txt:53 +msgid "" +"If you are using a legacy system that doesn't support the **Ed25519** " +"algorithm, use:" +msgstr "" +"Якщо ви використовуєте застарілу систему, яка не підтримує алгоритм " +"**Ed25519**, використовуйте його:" + +#: ../../src/vcs/github.txt:60 +msgid "" +"When you're prompted to \"Enter a file in which to save the key\", you can " +"press **Enter** to accept the default file location." +msgstr "" +"Коли з'явиться запит \"Введіть файл для збереження ключа\", ви можете " +"натиснути **Enter**, щоб прийняти розташування файлу за замовчуванням." + +#: ../../src/vcs/github.txt:67 +msgid "" +"Type a secure passphrase, if you want -- this is an extra layer of security." +msgstr "" +"Введіть безпечну парольну фразу, якщо хочете -- це додатковий рівень безпеки." + +#: ../../src/vcs/github.txt:75 +msgid "This will create a new SSH key, using the provided email as label." +msgstr "" +"Буде створено новий SSH-ключ, з використанням наданої адреси електронної " +"пошти як мітки." + +#: ../../src/vcs/github.txt:77 +msgid "" +"Navigate to ssh key location -- \".ssh\" folder at your homedir by default " +"and ensure there are two files generated:" +msgstr "" +"Перейдіть до розташування ключа ssh -- теки \".ssh\" у вашому домашньому " +"каталозі за замовчуванням і переконайтеся, що згенеровано два файли:" + +#: ../../src/vcs/github.txt:80 +msgid "**id_ALGORITHM** (e.g. \"id_rsa\", \"id_ed252519\" etc.)" +msgstr "**id_ALGORITHM** (наприклад, \"id_rsa\", \"id_ed252519\" тощо)." + +#: ../../src/vcs/github.txt:81 +msgid "**id_ALGORITHM.pub** (e.g. \"id_rsa.pub\", \"id_ed25519.pub\" etc.)" +msgstr "" +"**id_ALGORITHM.pub** (наприклад, \"id_rsa.pub\", \"id_ed25519.pub\" тощо)." + +#: ../../src/vcs/github.txt:84 +msgid "" +"The private key (the one without \".pub\") should be kept secure and " +"private. You should never share this." +msgstr "" +"Закритий ключ (той, що без \".pub\") слід зберігати в безпеці і не " +"розголошувати. Ви ніколи не повинні ділитися ним." + +#: ../../src/vcs/github.txt:87 +msgid "" +"The public key is what you add to servers or services to which you want to " +"authenticate using your private key." +msgstr "" +"Відкритий ключ - це те, що ви додаєте до серверів або сервісів, на яких ви " +"хочете пройти автентифікацію за допомогою вашого закритого ключа." + +#: ../../src/vcs/github.txt:91 +msgid "Adding your SSH key to the ssh-agent and GitHub" +msgstr "Додавання SSH-ключа до ssh-агента та GitHub" + +#: ../../src/vcs/github.txt:93 +msgid "" +"Before adding a new SSH key to the ssh-agent to manage your keys, you should " +"have checked for existing SSH keys and generated SSH keys." +msgstr "" +"Перш ніж додавати новий SSH-ключ до ssh-агента для керування ключами, вам " +"слід перевірити наявність наявних SSH-ключів і згенерувати SSH-ключі." + +#: ../../src/vcs/github.txt:96 +msgid "" +"Ensure the ssh-agent is running. You can use the \"Auto-launching\" or start " +"it manually:" +msgstr "" +"Переконайтеся, що ssh-агент запущено. Ви можете скористатися " +"\"Автозапуском\" або запустити його вручну:" + +#: ../../src/vcs/github.txt:104 +msgid "Add you SSH private key to the ssh-agent." +msgstr "Додайте ваш приватний ключ SSH до ssh-агента." + +#: ../../src/vcs/github.txt:110 +msgid "" +"Add the SSH public key to your account on GitHub. Copy the SSH public key to " +"your clipboard." +msgstr "" +"Додайте публічний ключ SSH до свого облікового запису на GitHub. Скопіюйте " +"відкритий ключ SSH до буфера обміну." + +#: ../../src/vcs/github.txt:117 +msgid "" +"Alternatively, if ``clip`` isn't working, just type public key content to " +"the terminal using ``cat``," +msgstr "" +"Крім того, якщо ``clip`` не працює, просто введіть вміст відкритого ключа у " +"терміналі за допомогою ``cat``," + +#: ../../src/vcs/github.txt:124 +msgid "" +"or simply navigate to the file and open it with any text editor. At the end, " +"you need to copy public key content." +msgstr "" +"або просто перейдіть до файлу і відкрийте його за допомогою будь-якого " +"текстового редактора. В кінці потрібно скопіювати вміст відкритого ключа." + +#: ../../src/vcs/github.txt:127 +msgid "" +"On GitHub, in the upper-right corner of any page, click your profile photo, " +"then click **Settings**." +msgstr "" +"На GitHub у правому верхньому куті будь-якої сторінки натисніть на " +"фотографію свого профілю, а потім натисніть **Налаштування**." + +#: ../../src/vcs/github.txt:129 +msgid "" +"In the \"Access\" section of the sidebar, click **SSH and GPG keys** and " +"press **New SSH key** button." +msgstr "" +"У розділі \"Доступ\" бічної панелі натисніть **Ключі SSH і GPG** і натисніть " +"кнопку **Новий ключ SSH**." + +#: ../../src/vcs/github.txt:131 +msgid "In the \"Title\" field, add a descriptive label for the new key." +msgstr "У полі \"Назва\" додайте описову мітку для нового ключа." + +#: ../../src/vcs/github.txt:132 +msgid "Select the type of key -- \"Authentication key\"." +msgstr "Виберіть тип ключа - \"Ключ автентифікації\"." + +#: ../../src/vcs/github.txt:133 +msgid "In the \"Key\" field, paste your public key." +msgstr "У полі \"Ключ\" вставте ваш відкритий ключ." + +#: ../../src/vcs/github.txt:134 +msgid "Click **Add SSH key**." +msgstr "Натисніть **Додати SSH-ключ**." + +#: ../../src/vcs/github.txt:135 +msgid "If prompted, confirm access to your account on GitHub." +msgstr "" +"Якщо з'явиться відповідний запит, підтвердіть доступ до свого облікового " +"запису на GitHub." diff --git a/src/_locales/uk/LC_MESSAGES/vcs/index.po b/src/_locales/uk/LC_MESSAGES/vcs/index.po new file mode 100644 index 000000000..b23852bdb --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/vcs/index.po @@ -0,0 +1,74 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.06.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:17+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/vcs/index.txt:-1 +msgid "Version control system" +msgstr "Система контролю версій" + +#: ../../src/vcs/index.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/vcs/index.txt:-1 +msgid "version, control, system, vcs, git" +msgstr "version, control, system, vcs, git" + +#: ../../src/vcs/index.txt:8 +msgid "Version Control System" +msgstr "Система контролю версій" + +#: ../../src/vcs/index.txt:10 +msgid "" +":abbr:`VCS (Version Control Systems)` play an integral role in modern " +"software development. They allow multiple developers to work on a project " +"simultaneously without overwriting each other's changes. VCSs track the " +"history of changes to the source code, making it possible to revert to " +"previous states, compare versions, and more." +msgstr "" +":abbr:`VCS (Version Control Systems)` відіграють невід'ємну роль у сучасній " +"розробці програмного забезпечення. Вони дозволяють декільком розробникам " +"працювати над проектом одночасно, не перезаписуючи зміни один одного. VCS " +"відстежують історію змін у вихідному коді, дозволяючи повертатися до " +"попередніх станів, порівнювати версії тощо." + +#: ../../src/vcs/index.txt:16 +msgid "" +"Among the VCSs available, Git stands out as one of the most popular and " +"powerful tools. It's used by small projects and large-scale software alike, " +"owing to its flexibility, distributed nature, and efficient handling of " +"codebase versions." +msgstr "" +"Серед наявних VCS Git є одним з найпопулярніших і найпотужніших " +"інструментів. Його використовують як у невеликих проектах, так і у великому " +"програмному забезпеченні, завдяки його гнучкості, розподіленості та " +"ефективній роботі з версіями кодової бази." + +#: ../../src/vcs/index.txt:21 +msgid "" +"In this part, you'll learn about the fundamentals of version control, how to " +"set up your environment for Git, dive into the basics of commits, branches, " +"and merges, understand the significance of tags, and finally, explore how to " +"collaborate using remote repositories and platforms like GitHub." +msgstr "" +"У цій частині ви дізнаєтеся про основи управління версіями, як налаштувати " +"середовище для Git'а, зануритеся в основи коммітів, гілок і злиття, " +"зрозумієте значення тегів і, нарешті, вивчите, як співпрацювати за допомогою " +"віддалених репозиторіїв і платформ на кшталт GitHub." diff --git a/src/_locales/uk/LC_MESSAGES/vcs/intro.po b/src/_locales/uk/LC_MESSAGES/vcs/intro.po new file mode 100644 index 000000000..c40a07462 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/vcs/intro.po @@ -0,0 +1,221 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.06.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:17+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/vcs/intro.txt:-1 +msgid "Version control system" +msgstr "Система контролю версій" + +#: ../../src/vcs/intro.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/vcs/intro.txt:-1 +msgid "version, control, system, vcs, git" +msgstr "version, control, system, vcs, git" + +#: ../../src/vcs/intro.txt:8 +msgid "About version control (Git)" +msgstr "Про контроль версій (Git)" + +#: ../../src/vcs/intro.txt:10 +msgid "" +"Version control is a system that records changes to a file or set of files " +"over time so that you can recall specific versions later. It allows you to " +"revert selected files back to a previous state, revert the entire project " +"back to a previous state, compare changes over time, see who last modified " +"something that might be causing a problem, who introduced an issue and when, " +"and more." +msgstr "" +"Контроль версій - це система, яка реєструє зміни у файлі або наборі файлів з " +"плином часу, щоб ви могли пізніше згадати конкретні версії. Він дозволяє " +"повернути вибрані файли до попереднього стану, повернути весь проект до " +"попереднього стану, порівняти зміни в часі, побачити, хто востаннє змінював " +"щось, що може спричинити проблему, хто і коли створив проблему, тощо." + +#: ../../src/vcs/intro.txt:16 +msgid "" +"In a :abbr:`DVCS (Distributed Version Control Systems)` clients don't just " +"check out the latest snapshot of the files; rather, they fully mirror the " +"repository, including its full history. Thus, if any server dies, and these " +"systems were collaborating via that server, any of the client repositories " +"can be copied back up to the server to restore it. Every clone is really a " +"full backup of all the data." +msgstr "" +"У :abbr:`DVCS (Distributed Version Control Systems)` клієнти не просто " +"перевіряють останній знімок файлів, а повністю дзеркально копіюють сховище, " +"включно з його повною історією. Таким чином, якщо якийсь сервер вийде з " +"ладу, а ці системи працювали через нього, будь-який з клієнтських " +"репозиторіїв можна скопіювати на сервер, щоб відновити його роботу. Кожен " +"клон - це фактично повна резервна копія всіх даних." + +#: ../../src/vcs/intro.txt:26 +msgid "Distributed version control diagram" +msgstr "Розподілена схема управління версіями" + +#: ../../src/vcs/intro.txt:29 +msgid "What is Git?" +msgstr "Що таке Git?" + +#: ../../src/vcs/intro.txt:30 +msgid "" +"The major difference between Git and any other VCS is the way Git thinks " +"about its data. Conceptually, most other systems store information as a list " +"of file-based changes. Git doesn't think of or store its data this way. " +"Instead, Git thinks of its data more like a series of snapshots of a " +"miniature filesystem." +msgstr "" +"Основна відмінність між Git'ом та будь-якою іншою VCS полягає в тому, як " +"Git'ом мислить про свої дані. Концептуально, більшість інших систем " +"зберігають інформацію у вигляді списку змін у файлах. Git не думає про свої " +"дані і не зберігає їх таким чином. Натомість, Git думає про свої дані як про " +"серію знімків мініатюрної файлової системи." + +#: ../../src/vcs/intro.txt:36 +msgid "" +"This is an important distinction between Git and nearly all other VCSs. It " +"makes Git reconsider almost every aspect of version control that most other " +"systems copied from the previous generation. This makes Git more like a mini " +"filesystem with some incredibly powerful tools built on top of it, rather " +"than simply a VCS." +msgstr "" +"Це важлива відмінність між Git'ом та майже всіма іншими VCS. Вона змушує " +"Git'а переосмислити майже кожен аспект контролю версій, який більшість інших " +"систем скопіювали з попереднього покоління. Це робить Git більше схожим на " +"міні-файлову систему з деякими неймовірно потужними інструментами, " +"побудованими поверх неї, ніж на звичайну VCS." + +#: ../../src/vcs/intro.txt:45 +msgid "Storing data as snapshots of the project over time" +msgstr "Зберігання даних у вигляді знімків проекту з плином часу" + +#: ../../src/vcs/intro.txt:48 +msgid "Local operations" +msgstr "Локальні операції" + +#: ../../src/vcs/intro.txt:49 +msgid "" +"Most operations in Git need only local files and resources to operate -- " +"generally no information is needed from another computer on your network. " +"Because you have the entire history of the project right there on your local " +"disk, most operations seem almost instantaneous." +msgstr "" +"Для виконання більшості операцій у Git'і потрібні лише локальні файли та " +"ресурси - зазвичай не потрібна інформація з іншого комп'ютера у вашій " +"мережі. Оскільки вся історія проекту зберігається на вашому локальному " +"диску, більшість операцій виконуються майже миттєво." + +#: ../../src/vcs/intro.txt:55 +msgid "Integrity" +msgstr "Цілісність" + +#: ../../src/vcs/intro.txt:56 +msgid "" +"Everything in Git is checksummed before it is stored and is then referred to " +"by that checksum. This means it's impossible to change the contents of any " +"file or directory without Git knowing about it." +msgstr "" +"Усе в Git'і має контрольну суму перед збереженням і потім посилається на цю " +"контрольну суму. Це означає, що неможливо змінити вміст будь-якого файлу або " +"каталогу без відома Git'а." + +#: ../../src/vcs/intro.txt:61 +msgid "Repository files states" +msgstr "Стани файлів сховища" + +#: ../../src/vcs/intro.txt:62 +msgid "" +"Git has three main states that your files can reside in: **modified**, " +"**staged**, and **committed**:" +msgstr "" +"Git має три основні стани, в яких можуть перебувати ваші файли: " +"**модифіковані**, **на стадії розробки** та **зафіксовані**:" + +#: ../../src/vcs/intro.txt:65 +msgid "" +"Modified means that you have changed the file but have not committed it to " +"your database yet." +msgstr "" +"Змінено означає, що ви змінили файл, але ще не зафіксували його у вашій базі " +"даних." + +#: ../../src/vcs/intro.txt:67 +msgid "" +"Staged means that you have marked a modified file in its current version to " +"go into your next commit snapshot." +msgstr "" +"Поетапний означає, що ви позначили змінений файл у його поточній версії, щоб " +"він потрапив до наступного знімка фіксації." + +#: ../../src/vcs/intro.txt:69 +msgid "Committed means that the data is safely stored in your local database." +msgstr "" +"Фіксація означає, що дані безпечно зберігаються у вашій локальній базі даних." + +#: ../../src/vcs/intro.txt:76 +msgid "The basic Git workflow goes something like this:" +msgstr "Базовий робочий процес Git'а виглядає приблизно так:" + +#: ../../src/vcs/intro.txt:78 +msgid "You modify files in your working tree." +msgstr "Ви змінюєте файли у вашому робочому дереві." + +#: ../../src/vcs/intro.txt:79 +msgid "" +"You selectively stage just those changes you want to be part of your next " +"commit, which adds only those changes to the staging area." +msgstr "" +"Ви вибірково стабілізуєте лише ті зміни, які ви хочете включити в наступний " +"коміт, що додає тільки ці зміни в область стабілізації." + +#: ../../src/vcs/intro.txt:81 +msgid "" +"You do a commit, which takes the files as they are in the staging area and " +"stores that snapshot permanently to your Git directory." +msgstr "" +"Ви робите фіксацію, яка бере файли в тому вигляді, в якому вони знаходяться " +"в області підготовки, і зберігає цей знімок назавжди у вашому каталозі Git'а." + +#: ../../src/vcs/intro.txt:85 +msgid "Command line" +msgstr "Командний рядок" + +#: ../../src/vcs/intro.txt:87 +msgid "" +"There are a lot of different ways to use Git. There are the original command-" +"line tools, and there are many graphical user interfaces of varying " +"capabilities. For one, the command line is the only place you can run all " +"Git commands -- most of the GUIs implement only a partial subset of Git " +"functionality for simplicity. If you know how to run the command-line " +"version, you can probably also figure out how to run the GUI version, while " +"the opposite is not necessarily true. Also, while your choice of graphical " +"client is a matter of personal taste, all users will have the command-line " +"tools installed and available." +msgstr "" +"Існує багато різних способів використання Git'у. Існують оригінальні " +"інструменти командного рядка, а також багато графічних інтерфейсів " +"користувача з різними можливостями. З одного боку, командний рядок є єдиним " +"місцем, де ви можете виконувати всі команди Git'а - більшість графічних " +"інтерфейсів реалізують лише часткову підмножину функціональності Git'а для " +"спрощення. Якщо ви знаєте, як запустити версію з командного рядка, ви, " +"ймовірно, також зможете з'ясувати, як запустити версію з графічним " +"інтерфейсом, хоча зворотне не обов'язково вірно. Крім того, хоча ваш вибір " +"графічного клієнта є справою особистого смаку, всі користувачі матимуть " +"встановлені та доступні інструменти командного рядка." diff --git a/src/_locales/uk/LC_MESSAGES/vcs/pullrequest.po b/src/_locales/uk/LC_MESSAGES/vcs/pullrequest.po new file mode 100644 index 000000000..e44a4939f --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/vcs/pullrequest.po @@ -0,0 +1,223 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.06.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:17+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/vcs/pullrequest.txt:-1 +msgid "Version Control System - Pull Requests" +msgstr "Система контролю версій - Запити на Злиття (Pull Requests)" + +#: ../../src/vcs/pullrequest.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/vcs/pullrequest.txt:-1 +msgid "Vladyslav Ponomaryov" +msgstr "Vladyslav Ponomaryov" + +#: ../../src/vcs/pullrequest.txt:-1 +msgid "version, control, system, vcs, git, pull request, merge" +msgstr "version, control, system, vcs, git, pull request, merge" + +#: ../../src/vcs/pullrequest.txt:9 +msgid "Pull Request" +msgstr "Запит на Злиття (Pull Request)" + +#: ../../src/vcs/pullrequest.txt:11 +msgid "" +"Pull request let you tell others about changes you've pushed to a branch in " +"a repository on GitHub. Once a pull request is opened, you can discuss and " +"review the potential changes with collaborators and add follow-up commits " +"before your changes are merged into the base branch:cite:`github:about-pr`." +msgstr "" +"Pull-запит дозволяє вам повідомити інших про зміни, які ви перенесли до " +"гілки в репозиторії на GitHub. Після того, як запит відкрито, ви можете " +"обговорити і переглянути потенційні зміни з колегами і додати подальші " +"коміти, перш ніж ваші зміни будуть злиті в базову гілку branch:cite:`github:" +"about-pr`." + +#: ../../src/vcs/pullrequest.txt:17 +msgid "Draft pull requests" +msgstr "Чернетки pull requests" + +#: ../../src/vcs/pullrequest.txt:19 +msgid "" +"Draft pull requests are available in public repositories on GitHub. When you " +"create a pull request, you can choose to a create a pull request that is " +"ready for review or a draft pull request. Draft pull requests cannot be " +"merged. When you're ready to get feedback on your pull request, you can mark " +"your draft pull request as ready for review." +msgstr "" +"Чернетки pull-запитів доступні в публічних репозиторіях на GitHub. Коли ви " +"створюєте пул-запит, ви можете вибрати між створенням готового до розгляду " +"пул-запиту та чернетки пул-запиту. Чернетки пул-запитів не можна " +"об'єднувати. Коли ви будете готові отримати відгук на свій запит, ви можете " +"позначити свій чернетковий запит як готовий до розгляду." + +#: ../../src/vcs/pullrequest.txt:26 +msgid "Difference between commits on compare and pull request pages" +msgstr "Різниця між коммітами на сторінках порівняння та pull-запитів" + +#: ../../src/vcs/pullrequest.txt:28 +msgid "" +"The compare and pull request pages use different methods to calculate the " +"diff for changed files:" +msgstr "" +"Сторінки запитів порівняння і витягування використовують різні методи для " +"обчислення різниці для змінених файлів:" + +#: ../../src/vcs/pullrequest.txt:31 +msgid "" +"Compare pages show the diff between the tip of the head ref and the current " +"common ancestor (that is, the merge base) of the head and base ref." +msgstr "" +"На сторінках порівняння показано різницю між кінчиком головного референта і " +"поточним спільним предком (тобто, основою злиття) головного і основного " +"референта." + +#: ../../src/vcs/pullrequest.txt:33 +msgid "" +"Pull request pages show the diff between the tip of the head ref and the " +"common ancestor of the head and base ref at the time when the pull request " +"was created. Consequently, the merge base used for the comparison might be " +"different." +msgstr "" +"Сторінки запитів на злиття показують різницю між вершиною головного рефа і " +"спільним предком головного і базового рефів на момент створення запиту на " +"злиття. Отже, база злиття, яка використовується для порівняння, може " +"відрізнятися." + +#: ../../src/vcs/pullrequest.txt:39 +msgid "About comparing branches" +msgstr "Про порівняння гілок" + +#: ../../src/vcs/pullrequest.txt:41 +msgid "" +"Pull requests display diffs to compare the changes you made in your topic " +"branch against the base branch that you want to merge your changes into." +msgstr "" +"Витягніть запити на відображення відмінностей, щоб порівняти зміни, зроблені " +"у вашій гілці теми, з базовою гілкою, до якої ви хочете об'єднати ваші зміни." + +#: ../../src/vcs/pullrequest.txt:44 +msgid "" +"Rather that viewing the commits themselves, you can view the proposed " +"changes as they'll appear in the files once the pull request is merged. The " +"files appear in alphabetical order within the Files changed tab. Additions " +"to the files appear in green and are prefaced by a ``+`` sign while content " +"that has been removed appears in red and is prefaced by a ``-`` sign :cite:" +"`github:compare-pr`." +msgstr "" +"Замість того, щоб переглядати самі комміти, ви можете переглянути " +"запропоновані зміни, які з'являться у файлах після об'єднання запиту на " +"витягування. Файли відображаються в алфавітному порядку на вкладці Змінені " +"файли. Доповнення до файлів відображаються зеленим кольором зі знаком ``+``, " +"тоді як вміст, який було вилучено, відображається червоним кольором зі " +"знаком ``-`` :cite:`github:compare-pr`." + +#: ../../src/vcs/pullrequest.txt:52 ../../src/vcs/pullrequest.txt:73 +msgid "Creating a pull request" +msgstr "Створення pull-запиту" + +#: ../../src/vcs/pullrequest.txt:54 +msgid "" +"Create a pull request to propose and collaborate on changes to a repository. " +"These changes are proposed in a *branch*, which ensures that the default " +"branch only contains finished and approved work:cite:`github:create-pr`." +msgstr "" +"Створіть pull request, щоб пропонувати зміни до сховища та співпрацювати над " +"ними. Ці зміни пропонуються у *гілці*, що гарантує, що гілка за " +"замовчуванням містить лише завершені та затверджені роботи:cite:`github:" +"create-pr`." + +#: ../../src/vcs/pullrequest.txt:59 +msgid "About branches" +msgstr "Про гілки" + +#: ../../src/vcs/pullrequest.txt:61 +msgid "" +"Use a branch to isolate development work without affecting other branches in " +"the repository. Each repository has one default branch, and can have " +"multiple other branches. You can merge a branch into another branch using a " +"pull request." +msgstr "" +"Використовуйте гілку, щоб ізолювати роботу над розробкою, не впливаючи на " +"інші гілки у сховищі. Кожне сховище має одну гілку за замовчуванням і може " +"мати декілька інших гілок. Ви можете об'єднати гілку з іншою гілкою за " +"допомогою pull-запиту." + +#: ../../src/vcs/pullrequest.txt:66 +msgid "" +"Branches allow you to develop features, fix bugs, or safely experiment with " +"new ideas in a contained area of your repository." +msgstr "" +"Гілки дозволяють розробляти функції, виправляти помилки або безпечно " +"експериментувати з новими ідеями в обмеженій області вашого сховища." + +#: ../../src/vcs/pullrequest.txt:69 +msgid "" +"You always create a branch from an existing branch. Typically, you might " +"create a new branch from the default branch of your repository." +msgstr "" +"Ви завжди створюєте гілку з існуючої гілки. Зазвичай, ви можете створити " +"нову гілку з гілки за замовчуванням вашого сховища." + +#: ../../src/vcs/pullrequest.txt:75 +msgid "On GitHub, navigate to the main page of the repository." +msgstr "На GitHub перейдіть на головну сторінку репозиторію." + +#: ../../src/vcs/pullrequest.txt:76 +msgid "Switch to \"Pull requests\" tab." +msgstr "Перейдіть на вкладку \"Pull requests\"." + +#: ../../src/vcs/pullrequest.txt:77 +msgid "Press \"New pull request\" button." +msgstr "Натисніть кнопку \"New pull request\"." + +#: ../../src/vcs/pullrequest.txt:78 +msgid "Select base and source branches." +msgstr "Виберіть базову і вихідну гілки." + +#: ../../src/vcs/pullrequest.txt:79 +msgid "Press \"Create pull request\" button." +msgstr "Натисніть кнопку \"Create pull request\"." + +#: ../../src/vcs/pullrequest.txt:80 +msgid "Provide a meaningful title and description." +msgstr "Надайте змістовну назву та опис." + +#: ../../src/vcs/pullrequest.txt:81 +msgid "Draft or create a pull request." +msgstr "Створіть pull request або його чорнетку." + +#: ../../src/vcs/pullrequest.txt:83 +msgid "" +"To create pull request that is ready for review, click **Create Pull " +"Request**." +msgstr "" +"Щоб створити запит, готовий до перегляду, натисніть **Create Pull Request**." + +#: ../../src/vcs/pullrequest.txt:85 +msgid "" +"To create a draft pull request, use the drop-down and select **Create Draft " +"Pull Request**, then click **Draft Pull Request**." +msgstr "" +"Щоб створити чернетку запиту на вилучення, скористайтеся випадаючим списком " +"і виберіть **Create Draft Pull Request**, а потім натисніть **Draft Pull " +"Request**." diff --git a/src/_locales/uk/LC_MESSAGES/vcs/remotes.po b/src/_locales/uk/LC_MESSAGES/vcs/remotes.po new file mode 100644 index 000000000..407cb8da6 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/vcs/remotes.po @@ -0,0 +1,227 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.06.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:16+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/vcs/remotes.txt:3 +msgid "Remotes" +msgstr "Віддалені репозиторії" + +#: ../../src/vcs/remotes.txt:5 +msgid "" +"To be able to collaborate on any Git project, you need to know how to manage " +"your remote repositories. Remote repositories are versions of your project " +"that are hosted on the Internet or network somewhere. You can have several " +"of them, each of which generally is either read-only or read/write for you. " +"Managing remotes includes knowing how to add remote repositories, remove " +"remote repositories that are no longer valid, manage various branches and " +"define them as being tracked or not, and more." +msgstr "" +"Щоб мати можливість співпрацювати над будь-яким Git-проектом, вам потрібно " +"знати, як керувати вашими віддаленими сховищами. Віддалені сховища - це " +"версії вашого проекту, розміщені десь в інтернеті або мережі. Ви можете мати " +"декілька таких сховищ, кожне з яких, як правило, доступне лише для читання " +"або читання/запису. Керування віддаленими сховищами включає в себе вміння " +"додавати віддалені сховища, видаляти віддалені сховища, які більше не є " +"дійсними, керувати різними гілками і визначати їх як такі, що відстежуються " +"чи ні, і багато іншого." + +#: ../../src/vcs/remotes.txt:21 +msgid "Showing your remote" +msgstr "Перелік віддалених репозиторіїв" + +#: ../../src/vcs/remotes.txt:23 +msgid "" +"To see which remote servers you have configured, you can run the ``git " +"remote`` command. It lists the shortnames of each remote handle you're " +"specified. If you've cloned your repository, you should at least see " +"``origin`` - that is default name Git gives to the server you clone from:" +msgstr "" +"Щоб побачити, які віддалені сервери ви налаштували, ви можете виконати " +"команду ``git remote``. Вона покаже короткі імена кожного вказаного вами " +"віддаленого дескриптора. Якщо ви клонували свій репозиторій, ви маєте " +"побачити принаймні ``origin`` - ім'я за замовчуванням, яке Git дає серверу, " +"з якого ви клонуєте:" + +#: ../../src/vcs/remotes.txt:41 +msgid "" +"This means we can pull contributions from any of these users pretty easily. " +"We may additionally have permission to push to one or more of these." +msgstr "" +"Це означає, що ми можемо досить легко отримувати внески від будь-якого з цих " +"користувачів. Крім того, ми можемо мати дозвіл на проштовхування до одного " +"або декількох з них." + +#: ../../src/vcs/remotes.txt:45 +msgid "Adding remote repositories" +msgstr "Додавання віддалених репозиторіїв" + +#: ../../src/vcs/remotes.txt:47 +msgid "" +"To add a new remote Git repository as a shortname you can reference easily, " +"run ``git remote add ``:" +msgstr "" +"Щоб додати новий віддалений репозиторій Git'у у вигляді короткого імені, на " +"яке можна легко посилатися, виконайте ``git remote add <назва> <адреса>``:" + +#: ../../src/vcs/remotes.txt:61 +msgid "" +"Now you can use the string \"personal\" on the command line in lieu of the " +"whole URL. ``master`` branch of \"https://github.com/shorodilov/python-" +"course\" is now accessible as ``personal/master``, while shortname to the " +"same branch in origin will be -- ``origin/master``." +msgstr "" +"Тепер ви можете використовувати рядок \"personal\" в командному рядку " +"замість повної URL-адреси. Гілка ``master`` в \"https://github.com/" +"shorodilov/python-course\" тепер доступна як ``personal/master``, тоді як " +"скорочена назва тієї ж гілки в origin буде -- ``origin/master``." + +#: ../../src/vcs/remotes.txt:67 +msgid "Fetching and pulling from remotes" +msgstr "Отримання та витягування з віддаленого репозиторію" + +#: ../../src/vcs/remotes.txt:69 +msgid "" +"To get data from remote project, you can run ``git fetch`` command. The " +"command goes out to that remote project and pulls down all the information " +"from that remote project that you don't have yet. After you do this, you " +"should have references to all the branches from that remote, which you can " +"merge in or inspect at any time." +msgstr "" +"Щоб отримати дані з віддаленого проекту, ви можете виконати команду ``git " +"fetch``. Команда звернеться до цього віддаленого проекту і витягне всю " +"інформацію з нього, якої ви ще не маєте. Після цього ви матимете посилання " +"на всі гілки з цього віддаленого проекту, які ви можете об'єднати або " +"переглянути у будь-який час." + +#: ../../src/vcs/remotes.txt:79 +msgid "" +"If your current branch is set up to track a remote branch, you can use ``git " +"pull`` command to automatically fetch and then merge that remote branch into " +"your current branch. By default, the ``git clone`` command automatically " +"sets up your local ``master`` branch to track the remote ``master`` branch " +"(or whatever default remote branch)." +msgstr "" +"Якщо вашу поточну гілку налаштовано на відстеження віддаленої гілки, ви " +"можете скористатися командою ``git pull`` для автоматичного отримання і " +"подальшого об'єднання цієї віддаленої гілки у вашу поточну гілку. За " +"замовчуванням, команда ``git clone`` автоматично налаштовує вашу локальну " +"гілку ``master`` на відстеження віддаленої гілки ``master`` (або будь-якої " +"іншої віддаленої гілки за замовчуванням)." + +#: ../../src/vcs/remotes.txt:85 +msgid "" +"From Git version 2.27 onward, ``git pull`` will give a warning if the ``pull." +"rebase`` variable is not set. Git will keep warning you until you set the " +"variable." +msgstr "" +"Починаючи з версії 2.27, ``git pull`` видаватиме попередження, якщо змінну " +"``pull.rebase`` не встановлено. Git продовжуватиме видавати попередження, " +"доки ви не встановите змінну." + +#: ../../src/vcs/remotes.txt:90 +msgid "" +"If you want the default behavior of Git (fast-forward if possible, else " +"create a merge commit): ``git config --global pull.rebase \"false\"``." +msgstr "" +"Якщо ви хочете отримати поведінку Git'а за замовчуванням (перемотування " +"вперед, якщо можливо, інакше створіть комміт злиття): ``git config --global " +"pull.rebase \"false\"``." + +#: ../../src/vcs/remotes.txt:93 +msgid "" +"If you want to rebase when pulling: ``git config --global pull.rebase " +"\"true\"``." +msgstr "" +"Якщо ви хочете перебазувати базу при витягуванні: ``git config --global pull." +"rebase \"true\"``." + +#: ../../src/vcs/remotes.txt:97 +msgid "Pushing to remotes" +msgstr "Відправка до віддаленого репозиторію" + +#: ../../src/vcs/remotes.txt:99 +msgid "" +"When you have your project at a point that you want to share, you have to " +"push it upstream. The command for this is simple: ``git push " +"``." +msgstr "" +"Коли ваш проект знаходиться на етапі, яким ви хочете поділитися, вам " +"потрібно перемістити його вгору за течією. Команда для цього проста: ``git " +"push <віддалений> <гілка>``." + +#: ../../src/vcs/remotes.txt:106 +msgid "" +"This command works only if you cloned from a server to which you have write " +"access and if nobody has pushed in the meantime. If you and someone else " +"clone at the same time and they push upstream and then you push upstream, " +"you push will rightly be rejected. You'll have to fetch their work first and " +"incorporate it into yours before you'll be allowed to push." +msgstr "" +"Ця команда працює тільки якщо ви клонували з сервера, до якого у вас є " +"доступ на запис, і якщо в цей час ніхто не робив поштовх. Якщо ви клонуєте " +"одночасно з кимось іншим, і він зробить поштовх вище за течією, а потім ви, " +"ваш поштовх буде справедливо відхилено. Вам доведеться спочатку отримати " +"їхню роботу і включити її до своєї, перш ніж вам дозволять проштовхувати." + +#: ../../src/vcs/remotes.txt:113 +msgid "Pushing a new branch to remote" +msgstr "Переміщення нової гілки до віддаленого репозиторію" + +#: ../../src/vcs/remotes.txt:115 +msgid "" +"In case you have created a local branch for some specific needs and you want " +"to share this branch, you need to set up track for this branch. This can be " +"done by using: ``git push --set-upstream origin ``. This will " +"create a new remote branch and set up track to your current local branch. " +"There is a shortcut for this command: ``git push -u origin ``." +msgstr "" +"Якщо ви створили локальну гілку для якихось конкретних потреб і хочете " +"надати до неї доступ, вам потрібно налаштувати трек для цієї гілки. Це можна " +"зробити за допомогою ``git push --set-upstream origin <віддалена_гілка>``. " +"Це створить нову віддалену гілку і налаштує трек до вашої поточної локальної " +"гілки. Для цієї команди існує комбінація клавіш: ``git push -u origin " +"<віддалена_гілка>``." + +#: ../../src/vcs/remotes.txt:122 +msgid "Inspecting a remote" +msgstr "Перевірка віддаленого репозиторію" + +#: ../../src/vcs/remotes.txt:124 +msgid "" +"If you want to see more information about a particular remote, you can use " +"the ``git remote show , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.06.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:16+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/vcs/setup.txt:-1 +msgid "Version control system" +msgstr "Система контролю версій" + +#: ../../src/vcs/setup.txt:-1 +msgid "Serhii Horodilov" +msgstr "Serhii Horodilov" + +#: ../../src/vcs/setup.txt:-1 +msgid "version, control, system, vcs, git, setup" +msgstr "version, control, system, vcs, git, setup" + +#: ../../src/vcs/setup.txt:8 +msgid "Git Setup" +msgstr "Налаштування Git'а" + +#: ../../src/vcs/setup.txt:10 +msgid "" +"Now that you have Git on your system, you'll want to do a few things to " +"customize your Git environment. Git comes with a tool called ``git config`` " +"that lets you get and set configuration variables that control all aspects " +"of how Git looks and operates. These variables can be stored in three " +"different places:" +msgstr "" +"Тепер, коли у вашій системі встановлено Git, ви захочете зробити кілька " +"речей, щоб налаштувати середовище Git'а. Git постачається з інструментом під " +"назвою ``git config``, який дозволяє вам отримувати та встановлювати " +"конфігураційні змінні, що контролюють всі аспекти вигляду та роботи Git'у. " +"Ці змінні можна зберігати у трьох різних місцях:" + +#: ../../src/vcs/setup.txt:16 +msgid "" +"*[path]/etc/gitconfig* file: Contains values applied to every user on the " +"system and all their repositories. If you pass the option ``--system`` to " +"git config, it reads and writes from this file specifically. Because this is " +"a system configuration file, you would need administrative or superuser " +"privilege to make changes to it." +msgstr "" +"Файл *[path]/etc/gitconfig*: Містить значення, що застосовуються до кожного " +"користувача у системі та всіх його сховищ. Якщо ви передасте git config " +"параметр ``--system``, він буде читати і писати саме з цього файлу. Оскільки " +"це файл конфігурації системи, вам знадобляться адміністративні привілеї або " +"привілеї суперкористувача, щоб вносити до нього зміни." + +#: ../../src/vcs/setup.txt:21 +msgid "" +"*~/.gitconfig* or *~/.config/git/config* file: Values specific personally to " +"you, the user. You can make Git read and write to this file specifically by " +"passing the ``--global`` option, and this affects all of the repositories " +"you work with on your system." +msgstr "" +"*~/.gitconfig* або *~/.config/git/config* файл: Значення, характерні " +"особисто для вас, користувача. Ви можете змусити Git'а читати і писати до " +"цього файлу спеціально, передавши опцію ``--global``, і це вплине на всі " +"сховища, з якими ви працюєте у вашій системі." + +#: ../../src/vcs/setup.txt:25 +msgid "" +"*config* file in the Git directory (that is, *.git/config*) of whatever " +"repository you're currently using: Specific to that single repository. You " +"can force Git to read from and write to this file with the ``--local`` " +"option, but that is in fact the default. Unsurprisingly, you need to be " +"located somewhere in a Git repository for this option to work properly." +msgstr "" +"файл *config* у каталозі Git (тобто *.git/config*) того сховища, яке ви " +"зараз використовуєте: Специфічний для цього окремого сховища. Ви можете " +"змусити Git'а читати з цього файлу і писати до нього за допомогою опції ``--" +"local``, але за замовчуванням так і є. Не дивно, що для правильної роботи " +"цієї опції вам потрібно знаходитися десь у сховищі Git'а." + +#: ../../src/vcs/setup.txt:31 +msgid "" +"Each level overrides values in the previous level, so values in *.git/" +"config* trump those in *[path]/etc/gitconfig*." +msgstr "" +"Кожен рівень перевизначає значення попереднього рівня, тому значення у *.git/" +"config* мають перевагу над значеннями у *[path]/etc/gitconfig*." + +#: ../../src/vcs/setup.txt:34 +msgid "You can view all of your settings and where they are coming from using:" +msgstr "" +"Ви можете переглянути всі свої налаштування і те, звідки вони надходять, " +"використовуючи:" + +#: ../../src/vcs/setup.txt:41 +msgid "Your identity" +msgstr "Ваша особистість" + +#: ../../src/vcs/setup.txt:43 +msgid "" +"The first thing you should do when you install Git is to set your user name " +"and email address. This is important because every Git commit uses this " +"information." +msgstr "" +"Перше, що вам слід зробити під час встановлення Git'у, це вказати своє ім'я " +"користувача та адресу електронної пошти. Це важливо, оскільки кожна фіксація " +"Git'а використовує цю інформацію." diff --git a/src/_locales/uk/LC_MESSAGES/vcs/tagging.po b/src/_locales/uk/LC_MESSAGES/vcs/tagging.po new file mode 100644 index 000000000..e1b8a53e9 --- /dev/null +++ b/src/_locales/uk/LC_MESSAGES/vcs/tagging.po @@ -0,0 +1,169 @@ +# Copyright (C) 2023, Python training course authors and contributors +# This file is distributed under the same license as the Python Training +# Course package. +# SERHII HORODILOV , 2023. +msgid "" +msgstr "" +"Project-Id-Version: Python Training Course 2023.06.dev\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-05 19:49+0300\n" +"PO-Revision-Date: 2023-10-05 20:16+0300\n" +"Last-Translator: Serhii Horodilov \n" +"Language-Team: uk \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.13.0\n" +"X-Generator: Poedit 3.4\n" + +#: ../../src/vcs/tagging.txt:3 +msgid "Tagging" +msgstr "Тегування" + +#: ../../src/vcs/tagging.txt:5 +msgid "" +"Like most VCSs, Git has the ability to tag specific points in a repository's " +"history as being important. Typically, people use this functionality to mark " +"release points (``v1.0``, ``v2.0`` and so on)." +msgstr "" +"Як і більшість VCS, Git має можливість позначати певні моменти в історії " +"сховища як важливі. Зазвичай люди використовують цю функцію для позначення " +"точок релізу (``v1.0``, ``v2.0`` і так далі)." + +#: ../../src/vcs/tagging.txt:10 +msgid "Listing tags" +msgstr "Перелік тегів" + +#: ../../src/vcs/tagging.txt:12 +msgid "" +"Listing the existing tags in Git is straightforward. Just type ``git tag`` " +"(with optional ``-l`` or ``--list``)." +msgstr "" +"Перерахувати існуючі теги у Git'і дуже просто. Просто введіть ``git tag`` (з " +"необов'язковим ``-l`` або ``--list``)." + +#: ../../src/vcs/tagging.txt:21 +msgid "" +"This command lists the tags in alphabetical order, the order in which they " +"are displayed has no real importance. You can also search for tags that " +"match a particular pattern. The Git source repo, for instance contains more " +"than 500 tags. If you're interested only in looking at the 1.8.4 series, you " +"can run this:" +msgstr "" +"Ця команда перелічує мітки в алфавітному порядку, порядок їх відображення не " +"має особливого значення. Ви також можете шукати теги, які відповідають " +"певному шаблону. Наприклад, сховище коду Git містить понад 500 тегів. Якщо " +"вас цікавить лише серія 1.8.4, ви можете виконати цю команду:" + +#: ../../src/vcs/tagging.txt:37 +msgid "Creating tags" +msgstr "Створення тегів" + +#: ../../src/vcs/tagging.txt:39 +msgid "Git supports two types of tags: *lightweight* and *annotated*." +msgstr "Git підтримує два типи тегів: *легкі* та *анотовані*." + +#: ../../src/vcs/tagging.txt:41 +msgid "" +"A lightweight tag is very much like a branch that doesn't change -- it's " +"just a pointer to a specific commit." +msgstr "" +"Полегшений тег дуже схожий на гілку, яка не змінюється -- це просто " +"вказівник на конкретний комміт." + +#: ../../src/vcs/tagging.txt:44 +msgid "" +"Annotated tags, however, are stored as full objects in the Git database. " +"They're checksummed; contain the tagger name, email, and date; have a " +"tagging message; and can be signed and verified with GBU Privacy Guard " +"(GPG). It's generally recommended that you create annotated tags so you can " +"have all this information; but if you want a temporary tag or for some " +"reason don't want to keep the other information, lightweight tags are " +"available too." +msgstr "" +"Анотовані мітки, однак, зберігаються як повноцінні об'єкти в базі даних Git. " +"Вони мають контрольну суму, містять ім'я тегувальника, електронну пошту та " +"дату, мають повідомлення про тегування, а також можуть бути підписані та " +"перевірені за допомогою GBU Privacy Guard (GPG). Зазвичай рекомендується " +"створювати анотовані мітки, щоб мати всю цю інформацію; але якщо вам " +"потрібна тимчасова мітка або з якихось причин ви не хочете зберігати іншу " +"інформацію, доступні також полегшені мітки." + +#: ../../src/vcs/tagging.txt:52 +msgid "Annotated tags" +msgstr "Анотовані теги" + +#: ../../src/vcs/tagging.txt:53 +msgid "" +"Creating an annotated tag in Git is simple. The easiest way is to specify ``-" +"a`` when you run the ``tag`` command:" +msgstr "" +"Створити анотовану мітку в Git'і дуже просто. Найпростіший спосіб - вказати " +"``-a`` при виконанні команди ``tag``:" + +#: ../../src/vcs/tagging.txt:69 +msgid "Lightweight tags" +msgstr "Легкі мітки" + +#: ../../src/vcs/tagging.txt:70 +msgid "" +"Another way to tag commits is with a lightweight tag. this is basically the " +"commit checksum stored in a file -- no other information is kept. To create " +"a lightweight tag, don't supply any of the ``-a``, ``-s``, or ``-m`` " +"options, just provide a tag name:" +msgstr "" +"Інший спосіб позначення коммітів - використання полегшених тегів. Це, по " +"суті, контрольна сума комміту, яка зберігається у файлі - ніяка інша " +"інформація не зберігається. Щоб створити полегшену мітку, не вказуйте жодної " +"з опцій ``-a``, ``-s`` або ``-m``, просто вкажіть назву мітки:" + +#: ../../src/vcs/tagging.txt:89 +msgid "Tagging later" +msgstr "Відмітити пізніше" + +#: ../../src/vcs/tagging.txt:90 +msgid "You can also tag commits after you're moved past them." +msgstr "Ви також можете позначати коміти після того, як ви пройшли повз них." + +#: ../../src/vcs/tagging.txt:107 +msgid "Deleting tags" +msgstr "Видалення тегів" + +#: ../../src/vcs/tagging.txt:109 +msgid "" +"To delete a tag on your local repository, you can use ``git tag -d " +"``." +msgstr "" +"Щоб видалити тег у вашому локальному сховищі, ви можете скористатися ``git " +"tag -d ``." + +#: ../../src/vcs/tagging.txt:117 +msgid "Checking out tags" +msgstr "Перевірка тегів" + +#: ../../src/vcs/tagging.txt:119 +msgid "" +"If you want to view the versions of files a tag is pointing to, you can do a " +"``git checkout`` of that tag, although this puts your repository in " +"\"detached HEAD\" state, which has some ill side effects:" +msgstr "" +"Якщо ви хочете переглянути версії файлів, на які вказує тег, ви можете " +"виконати ``git checkout`` цього тегу, хоча це переводить ваше сховище у стан " +"\"відокремленої ГОЛОВИ\", що має деякі погані побічні ефекти:" + +#: ../../src/vcs/tagging.txt:145 +msgid "" +"In \"detached HEAD\" state, if you make changes and then create a commit, " +"the tag will stay the same, but your new commit won’t belong to any branch " +"and will be unreachable, except by the exact commit hash. Thus, if you need " +"to make changes -- say you’re fixing a bug on an older version, for instance " +"-- you will generally want to create a branch:" +msgstr "" +"У стані \"detached HEAD\", якщо ви внесете зміни, а потім створите коміт, " +"тег залишиться незмінним, але ваш новий коміт не належатиме до жодної гілки " +"і буде недоступним, окрім як за точним хешем коміту. Таким чином, якщо вам " +"потрібно внести зміни - скажімо, ви виправляєте ваду у старій версії - вам, " +"як правило, краще створити гілку:" diff --git a/src/_static/js/theme.js b/src/_static/js/theme.js new file mode 100644 index 000000000..0f6c68f0f --- /dev/null +++ b/src/_static/js/theme.js @@ -0,0 +1,33 @@ +// theme variables +const themeAttribute = "data-theme" +const theme = { + light: "light", + dark: "dark", +} +const userTheme = localStorage.getItem(themeAttribute) +const isSystemThemeDark = window.matchMedia("(prefers-color-scheme: dark)").matches + + +// initial theme check +const checkTheme = () => { + if (userTheme === theme.dark || (!userTheme && isSystemThemeDark)) { + document.documentElement.setAttribute(themeAttribute, theme.dark) + } else document.documentElement.setAttribute(themeAttribute, theme.light) +} + + +// manual theme select +const swapTheme = () => { + const currentTheme = document.documentElement.getAttribute(themeAttribute) + const themeValue = currentTheme === theme.light ? theme.dark : theme.light + localStorage.setItem(themeAttribute, themeValue) + document.documentElement.setAttribute(themeAttribute, themeValue) +} + + +const swapThemeBtn = document.getElementById("swap-theme-btn"); +if (swapThemeBtn) swapThemeBtn.addEventListener("click", swapTheme) + +document.addEventListener("DOMContentLoaded", () => { + checkTheme() +}) diff --git a/src/appx/_keywords.txt b/src/appx/_keywords.txt new file mode 100644 index 000000000..db30e5ef6 --- /dev/null +++ b/src/appx/_keywords.txt @@ -0,0 +1,18 @@ +.. table:: Python Keywords + :align: center + + +------------+--------------+-------------+--------------+------------+ + | ``False`` | ``await`` | ``else`` | ``import`` | ``pass`` | + +------------+--------------+-------------+--------------+------------+ + | ``None`` | ``break`` | ``except`` | ``in`` | ``raise`` | + +------------+--------------+-------------+--------------+------------+ + | ``True`` | ``class`` | ``finally`` | ``is`` | ``return`` | + +------------+--------------+-------------+--------------+------------+ + | ``and`` | ``continue`` | ``for`` | ``lambda`` | ``try`` | + +------------+--------------+-------------+--------------+------------+ + | ``as`` | ``def`` | ``from`` | ``nonlocal`` | ``while`` | + +------------+--------------+-------------+--------------+------------+ + | ``assert`` | ``del`` | ``global`` | ``not`` | ``with`` | + +------------+--------------+-------------+--------------+------------+ + | ``async`` | ``elif`` | ``if`` | ``or`` | ``yield`` | + +------------+--------------+-------------+--------------+------------+ diff --git a/src/appx/assignments.txt b/src/appx/assignments.txt new file mode 100644 index 000000000..715232126 --- /dev/null +++ b/src/appx/assignments.txt @@ -0,0 +1,213 @@ +.. meta:: + :description: How-to handle in assignments via GitHub pull request(s) + :author: Vladyslav Ponomaryov + :author: Serhii Horodilov sgorodil@gmail.com + :keywords: git, github, pull request, review, merge, howto + +############################### +Handing in Homework Assignments +############################### + +****************************** +Repository content description +****************************** + +What to include +=============== + +- Code base +- Project dependencies (if applicable) +- *(Optional)* Additional project information: + README, CONTRIBUTING, LICENSE etc. + +.. hint:: + Always start new repository from creating ``README`` and ``.gitignore`` + files. + +What to exclude +=============== + +- Virtual environment, typically ``venv`` or ``env`` folder +- Byte compiled Python code (``__pycache__``) +- IDE configurations, typically ``.vscode`` or ``.idea`` folder +- Database files, like ``db.sqlite3`` +- Other stuff not related to the assignment directly + +.. hint:: + Set up **.gitignore** to exclude all name patterns from appending + to the stage area. Common content of this file may look like: + + :: + + /venv/ + /env/ + __pycache__/ + +************************* +Repository initialization +************************* + +#. Create and activate virtual environment. +#. Create common repository files: + + - README + - .gitignore + - requirements.txt *(if applicable)* + +#. *(Optional)* Create a code base draft. This can be an empty module + like **main.py** or an empty :ref:`Django project `. +#. Initialize a new repository using ``git init`` command. +#. Set up **.gitignore** name patterns. +#. Stage your changes. +#. Commit your changes. +#. Set up remote repository. +#. Push changes from local branch to remote. + +.. _django_init: + +Initializing new Django project +=============================== + +Base Django project may be added to the repository with the first commit. +Initialize Django project in current repository root to avoid directories +nesting. + +.. code-block:: shell + + $ django-admin startproject . + +.. important:: + Do not forget to create **requirements.txt**. + +After that, you may proceed with "staging" and "commit" steps. + +**************************** +Sharing project dependencies +**************************** + +The **requirements.txt** file is a plain text file that lists all the Python +packages required for a specific project. This file is used to specify +dependencies in a version-controlled and easily shareable manner. It allows +for a consistent environment across different team members' local setups. + +Where to place "requirements.txt" file +====================================== + +The **requirements.txt** file is generally placed in the root directory of +the project. + +Creating "requirements.txt" file +================================ + +To generate file use ``pip freeze`` command and place its output to a file: + +.. code-block:: shell + + $ pip freeze > requirements.txt + +This will create **requirements.txt** file. Its content may look like: + +:: + + asgiref==3.6.0 + Django==4.1.5 + psycopg2==2.9.5 + sqlparse==0.4.3 + tzdata==2022.7 + +Installing dependencies from "requirements.txt" file +==================================================== + +Another team member may easily install all the requirements for the project +by using ``pip install`` command: + +.. code-block:: shell + + $ pip install -r requirements.txt + +************************************ +Dealing with home tasks (challenges) +************************************ + +#. Create a new topic branch +#. Switch to a topic branch +#. Do the work and commit changes + +.. hint:: + You can create a new branch and immediately switch to it: + + .. code-block:: shell + + git checkout -b + +Creating a pull request +======================= + +#. Make sure your working branch is up-to-date with the default one. + You can pull changes for the default branch and rebase your feature + branch onto it. +#. Push feature branch to the remote repository. By default, the current + active branch is pushed via ``git push`` command. You may need to + set upstream branch if it isn't yet. + + .. code-block:: shell + + git push -u origin + +#. Navigate to your remote repository homepage on GitHub and switch to + **Pull requests** tab. +#. Click **New pull request** button. +#. Select your default branch as *target* and your feature branch as + *source*. +#. Click **Create pull request** button. +#. Provide meaningful title and a brief description for your pull request. +#. Submit pull request creation. +#. *(Optional)* Select reviewer(s) in **Reviewers** section. +#. Wait until your pull request is reviewed. + +Set up reviewers +================ + +You may share a link to pull request to a reviewer directly, but it's better +to set reviewer(s) on the pull request's page. +Before you can select reviewers, you need to add them as project contributors. + +Append collaborators +-------------------- + +Reviews allow collaborators to comment on the changes proposed in pull +requests, approve the changes, or request further changes before the pull +request is merged. Repository administrators can require that pull requests +are approved before being merged. + +#. Navigate to your repository homepage on GitHub and switch to **Settings** + tab. +#. Select **Collaborators and teams** menu item. +#. Under **Manage access** section click **Add people** button. +#. In modal window start typing GitHub username. +#. Select a contributor from the dropdown menu. + +This will send a *contributing request* to a specified user. + +Merging changes +=============== + +In case your pull request is **approved** - merge it to the trunk branch. +Select one of the options available: + +- Create a merge commit +- Rebase and merge +- Squash and merge + +**Create a merge commit** suits in most of the cases. + +Making changes +============== + +In case your pull request is **rejected** or has comments - you may need to +provide some fixes. + +#. Do the work in your local topic branch +#. Push these changes to remote +#. Re-request review (if applicable) +#. Wait until review is done diff --git a/src/appx/code_edit.txt b/src/appx/code_edit.txt new file mode 100644 index 000000000..7ee5f2619 --- /dev/null +++ b/src/appx/code_edit.txt @@ -0,0 +1,21 @@ +.. meta:: + :description: Code editors and IDEs for Python + :author: Serhii Horodilov sgorodil@gmail.com + :keywords: python, editor, ide + +.. todo + +.. attention:: Page is under construction + + .. figure:: /../assets/img/construction.svg + :figwidth: 250 + :align: center + +############ +Code Editors +############ + +Writing Python using IDLE or the Python Shell is great for simple things, but +those tools quickly turn larger programming projects into frustrating pits of +despair. Using an IDE, or even just a good dedicated code editor, makes coding +fun — but which one is best for you? :cite:`realpython:code-edit` diff --git a/src/appx/conv_store.txt b/src/appx/conv_store.txt new file mode 100644 index 000000000..5ac896ec7 --- /dev/null +++ b/src/appx/conv_store.txt @@ -0,0 +1,6 @@ +.. meta:: + :description: Convenience store challenge + :author: Serhii Horodilov sgorodil@gmail.com + :keywords: python, basics, oop, object-oriented programming + +.. include:: /../problem-sets/src/conv_store/challenge.rst diff --git a/src/appx/env_path.txt b/src/appx/env_path.txt new file mode 100644 index 000000000..07e7680c1 --- /dev/null +++ b/src/appx/env_path.txt @@ -0,0 +1,16 @@ +.. meta:: + :description: Setting up environment variables + :author: Serhii Horodilov sgorodil@gmail.com + :keywords: settings, environment, variables + +.. todo + +.. attention:: Page is under construction + + .. figure:: /../assets/img/construction.svg + :figwidth: 250 + :align: center + +############################### +Issue - System Environment PATH +############################### diff --git a/src/appx/pg_func_ops.txt b/src/appx/pg_func_ops.txt new file mode 100644 index 000000000..1da2a028a --- /dev/null +++ b/src/appx/pg_func_ops.txt @@ -0,0 +1,307 @@ +:orphan: + +Comparison +========== + +Comparison predicates +--------------------- + +.. data:: datatype BETWEEN datatype AND datatype + + Test if a value is within the range endpoints (inclusive) + + .. code-block:: postgresql + + 2 BETWEEN 1 AND 3 -- true + 2 BETWEEN 3 AND 1 -- false + +.. data:: datatype NOT BETWEEN datatype AND datatype + + Not between (the negation of BETWEEN). + + .. code-block:: postgresql + + 2 NOT BETWEEN 1 AND 3 -- false + +.. data:: datatype BETWEEN SYMMETRIC datatype AND datatype + + Between, after sorting the two endpoint values. + + .. code-block:: postgresql + + 2 BETWEEN SYMMETRIC 3 AND 1 -- true + +.. data:: datatype NOT BETWEEN SYMMETRIC datatype AND datatype + + Not between, after sorting the two endpoint values. + + .. code-block:: postgresql + + 2 NOT BETWEEN SYMMETRIC 3 AND 1 -- false + +.. data:: datatype IS DISTINCT FROM datatype + + Not equal, treating null as a comparable value. + + .. code-block:: postgresql + + 1 IS DISTINCT FROM NULL -- true (rather than NULL) + NULL IS DISTINCT FROM NULL -- false (rather than NULL) + +.. data:: datatype IS NOT DISTINCT FROM datatype + + Equal, treating null as a comparable value. + + .. code-block:: postgresql + + 1 IS NOT DISTINCT FROM NULL -- false (rather than NULL) + NULL IS NOT DISTINCT FROM NULL -- true (rather than NULL) + +.. data:: datatype IS NULL + + Test whether value is null. + + .. code-block:: postgresql + + 1.5 IS NULL -- false + +.. data:: datatype IS NOT NULL + + Test whether value is not null. + + .. code-block:: postgresql + + 'null' IS NOT NULL -- true + +.. data:: datatype ISNULL + + Test whether value is null (nonstandard syntax). + +.. data:: datatype NOTNULL + + Test whether value is not null (nonstandard syntax). + +.. data:: boolean IS TRUE + + Test whether boolean expression yields true. + + .. code-block:: postgresql + + true IS TRUE -- true + NULL::boolean IS TRUE -- false (rather than NULL) + +.. data:: boolean IS NOT TRUE + + Test whether boolean expression yields false or unknown. + + .. code-block:: postgresql + + true IS NOT TRUE -- false + NULL::boolean IS NOT TRUE -- true (rather than NULL) + +.. data:: boolean IS FALSE + + Test whether boolean expression yields false. + + .. code-block:: postgresql + + true IS FALSE -- false + NULL::boolean IS FALSE -- false (rather than NULL) + +.. data:: boolean IS NOT FALSE + + Test whether boolean expression yields true or unknown. + + .. code-block:: postgresql + + true IS NOT FALSE -- true + NULL::boolean IS NOT FALSE -- true (rather than NULL) + +.. data:: boolean IS UNKNOWN + + Test whether boolean expression yields unknown. + + .. code-block:: postgresql + + true IS UNKNOWN -- false + NULL::boolean IS UNKNOWN -- true (rather than NULL) + +.. data:: boolean IS NOT UNKNOWN + + Test whether boolean expression yields true or false. + + .. code-block:: postgresql + + true IS NOT UNKNOWN -- true + NULL::boolean IS NOT UNKNOWN -- false (rather than NULL) + +Comparison functions +-------------------- + +.. function:: num_nonnulls(VARIADIC "any") + + Returns the number of non-null arguments + +.. code-block:: postgresql + + SELECT num_nonnulls(1, NULL, 2) -- return 2 + +.. function:: num_nulls(VARIADIC "any") + + Returns the number of null arguments + +.. code-block:: postgresql + + SELECT num_nulls(1, NULL, 2) -- return 1 + +Mathematical functions and operators +==================================== + +.. data:: numeric_type + numeric_type + + Addition + + .. code-block:: sql + + SELECT 2 + 3 -- returns 5 + +.. data:: + numeric_type + + Unary plus (no operation) + + .. code-block:: sql + + SELECT + 3.5 -- returns 3.5 + +.. data:: numeric_type - numeric_type + + Subtraction + + .. code-block:: sql + + SELECT 2 - 3 -- returns -1 + +.. data:: - numeric_type + + Negation + + .. code-block:: sql + + SELECT - (-4) -- returns 4 + +.. data:: numeric_type * numeric_type + + Multiplication + + .. code-block:: sql + + SELECT 2 * 3 -- returns 6 + +.. data:: numeric_type / numeric_type + + Division (for integral types, division truncates the result towards zero) + + .. code-block:: sql + + SELECT 5.0 / 2 -- returns 2.5000000000000000 + + SELECT 5 / 2 -- returns 2 + + SELECT (-5) / 2 -- returns -2 + +.. data:: numeric_type % numeric_type + + Modulo (remainder); available for smallint, integer, bigint, and numeric + + .. code-block:: sql + + SELECT 5 % 4 -- returns 1 + +.. data:: numeric ^ numeric +.. data:: double precision ^ double precision + + Exponentiation + + .. code-block:: sql + + SELECT 2 ^ 3 -- returns 8 + + Unlike typical mathematical practice, multiple uses of ``^`` will associate + left to right by default: + + .. code-block:: sql + + SELECT 2 ^ 3 ^ 3 -- returns 512 + SELECT 2 ^ (3 ^ 3) -- returns 134217728 + +.. data:: |/ double precision + + Square root + + .. code-block:: sql + + SELECT |/ 25.0 -- returns 5 + +.. data:: ||/ double precision + + Cube root + + .. code-block:: sql + + SELECT ||/ 64.0 -- returns 4 + +.. data:: @ numeric_type + + Absolute value + + .. code-block:: sql + + SELECT @ -5.0 -- returns 5.0 + +.. data:: integral_type & integral_type + + Bitwise AND + + .. code-block:: sql + + SELECT 91 & 15 -- returns 11 + +.. data:: integral_type | integral_type + + Bitwise OR + + .. code-block:: sql + + SELECT 32 | 3 -- returns 35 + +.. data:: integral_type # integral_type + + Bitwise exclusive OR + + .. code-block:: sql + + SELECT 17 # 5 -- returns 20 + +.. data:: ~ integral_type + + Bitwise NOT + + .. code-block:: sql + + SELECT ~1 -- returns -2 + +.. data:: integral_type << integer + + Bitwise shift left + + .. code-block:: sql + + SELECT 1 << 4 -- returns 16 + +.. data:: integral_type >> integer + + Bitwise shift right + + .. code-block:: sql + + SELECT 8 >> 2 -- returns 2 diff --git a/src/appx/pg_local.txt b/src/appx/pg_local.txt new file mode 100644 index 000000000..9d851974a --- /dev/null +++ b/src/appx/pg_local.txt @@ -0,0 +1,20 @@ +:orphan: + +.. page title + +.. raw:: html + +
+ +########################## +PostgreSQL server binaries +########################## + +.. raw:: html + +
+ +.. include embed gist document (local postgres binaries) +.. raw:: html + + diff --git a/src/appx/postgres.txt b/src/appx/postgres.txt new file mode 100644 index 000000000..2c0127a7a --- /dev/null +++ b/src/appx/postgres.txt @@ -0,0 +1,38 @@ +.. _PostgreSQL downloads: https://www.postgresql.org/download/ + +############################################################################### + PostgreSQL +############################################################################### + +Overview +======== + +PostgreSQL is a powerful, open source object-relational database system that +uses and extends the SQL language combined with many features that safely store +and scale the most complicated data workloads. + +PostgreSQL has earned a strong reputation for its proven architecture, +reliability, data integrity, robust feature set, extensibility, and the +dedication of the open source community behind the software to consistently +deliver performant and innovative solutions. + +.. todo: add ref to acid document + +PostgreSQL runs on **all major operating systems**, and is ACID +compliant. + +Installation +============ + +If you are not able to install postgres to your local computer, it is +possible to use binaries distributions. +Refer :doc:`Local PostgreSQL server using binaries <./pg_local>` for +more information. + +PostgreSQL is available for download as ready-to-use packages or installers +for various platforms, as well as a source code archive if you want to build +it yourself. + +Refer to `PostgreSQL downloads`_ page to get the installer for your operating +system. Follow the installation process instruction to get postgres server +running on your local computer. diff --git a/src/appx/precedence.txt b/src/appx/precedence.txt new file mode 100644 index 000000000..80af144d1 --- /dev/null +++ b/src/appx/precedence.txt @@ -0,0 +1,68 @@ +.. meta:: + :description: Operator precedence in Python + :author: Serhii Horodilov sgorodil@gmail.com + :keywords: python, basics, operator, precedence + +################### +Operator Precedence +################### + +The following table summarizes the operator precedence in Python, from highest +precedence (most binding) to lowest precedence (least binding) +:cite:`docs-python:operator-precedence`. Operators in the same cell have the +same precedence (use left-to-right precedence). + ++------------------------+----------------------------------------------------+ +| Operator | Description | ++========================+====================================================+ +| ``(expressions...)``, | Binding or parenthesized expression, list display, | +| ``[expressions...]``, | dictionary display, set display | +| ``{key: value...}``, | | +| ``{expressions...}`` | | ++------------------------+----------------------------------------------------+ +| ``x[index]``, | Subscription, slicing, call, attribute reference | +| ``x[index:index]``, | | +| ``x(arguments...)``, | | +| ``x.attribute`` | | ++------------------------+----------------------------------------------------+ +| ``await x`` | Await expression | ++------------------------+----------------------------------------------------+ +| ``**`` | Exponentiation [#]_ | ++------------------------+----------------------------------------------------+ +| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT | ++------------------------+----------------------------------------------------+ +| ``*``, ``@``, ``/``, | Multiplication, matrix multiplication, division, | +| ``//``, ``%`` | floor division, remainder [#]_ | ++------------------------+----------------------------------------------------+ +| ``+``, ``-`` | Addition and subtraction | ++------------------------+----------------------------------------------------+ +| ``<<``, ``>>`` | Shifts | ++------------------------+----------------------------------------------------+ +| ``&`` | Bitwise AND | ++------------------------+----------------------------------------------------+ +| ``^`` | Bitwise XOR | ++------------------------+----------------------------------------------------+ +| ``|`` | Bitwise OR | ++------------------------+----------------------------------------------------+ +| ``in``, ``not in``, | Comparisons, including membership tests and | +| ``is``, ``is not``, | identity tests | +| ``<``, ``<=``, ``>``, | | +| ``>=``, ``==``, ``!=`` | | ++------------------------+----------------------------------------------------+ +| ``not x`` | Boolean NOT | ++------------------------+----------------------------------------------------+ +| ``and`` | Boolean AND | ++------------------------+----------------------------------------------------+ +| ``or`` | Boolean OR | ++------------------------+----------------------------------------------------+ +| ``if - else`` | Conditional expression (ternary ``if``) | ++------------------------+----------------------------------------------------+ +| ``lambda`` | Lambda expression | ++------------------------+----------------------------------------------------+ +| ``=``, ``:=`` | Assignment expression | ++------------------------+----------------------------------------------------+ + +.. [#] the power operator binds less tightly than an arithmetic or bitwise + unary operator on its right (``2 ** -1`` is ``0.5``). +.. [#] the ``%`` operator is also used for string formatting; + the same precedence applies. diff --git a/src/appx/printf.txt b/src/appx/printf.txt new file mode 100644 index 000000000..d5ad84d62 --- /dev/null +++ b/src/appx/printf.txt @@ -0,0 +1,76 @@ +.. meta:: + :description: Formatted strings usage in Python + :author: Serhii Horodilov sgorodil@gmail.com + :keywords: python, string, formatting + +.. todo: add code examples + +############################### +String Formatting: printf-style +############################### + +String objects have one unique built-in operation: the ``%`` operator (modulo). +This is also known as the string *formatting* or *interpolation* operator +:cite:`docs-python:printf-formatting`. Given ``format % values`` (where +*format* is a string), ``%`` conversion specifications in *format* are replaced +with zero or more elements of *values*. If *format* requires a single argument, +*values* may be a single non-tuple object. + +The conversion flag characters are: + ++------------+----------------------------------------------------------------+ +| Flag | Meaning | ++============+================================================================+ +| ``#`` | The value conversion will use the "alternative form" | ++------------+----------------------------------------------------------------+ +| ``0`` | The conversion will be zero padded for numeric values | ++------------+----------------------------------------------------------------+ +| ``'-'`` | The converted value is left adjusted (override the ``'0'`` if | +| | both are given) | ++------------+----------------------------------------------------------------+ +| ``' '`` | (a space) A blank should be left before a positive number | ++------------+----------------------------------------------------------------+ +| ``'+'`` | A sign character (``'+'`` or ``'-'``) will precede | +| | the conversion (overrides a "space" flag) | ++------------+----------------------------------------------------------------+ + +The conversion types are: + ++------------+----------------------------------------------------------------+ +| Conversion | Meaning | ++============+================================================================+ +| ``'d'`` | Signed integer decimal | ++------------+----------------------------------------------------------------+ +| ``'i'`` | Signed integer decimal | ++------------+----------------------------------------------------------------+ +| ``'o'`` | Signed octal value | ++------------+----------------------------------------------------------------+ +| ``'u'`` | Obsolete type - it is identical to ``'d'`` | ++------------+----------------------------------------------------------------+ +| ``'x'`` | Signed hexadecimal (lowercase) | ++------------+----------------------------------------------------------------+ +| ``'X'`` | Signed hexadecimal (uppercase) | ++------------+----------------------------------------------------------------+ +| ``'e'`` | Floating point exponential format (lowercase) | ++------------+----------------------------------------------------------------+ +| ``'E'`` | Floating point exponential format (uppercase) | ++------------+----------------------------------------------------------------+ +| ``'f'`` | Floating point decimal format | +| ``'F'`` | | ++------------+----------------------------------------------------------------+ +| ``'g'`` | Floating point format. Uses lowercase exponential format if | +| | exponent is less that -4 or not less than precision, decimal | +| | format otherwise. | +| ``'G'`` | | ++------------+----------------------------------------------------------------+ +| ``'c'`` | Single character (accepts integer or single character string) | ++------------+----------------------------------------------------------------+ +| ``'r'`` | Converts any Python object using ``repr()`` | ++------------+----------------------------------------------------------------+ +| ``'s'`` | Converts any Python object using ``str()`` | ++------------+----------------------------------------------------------------+ +| ``'a'`` | Converts any Python object using ``ascii()`` | ++------------+----------------------------------------------------------------+ +| ``'%'`` | No arguments is converted, results in a ``'%'`` character in | +| | the result. | ++------------+----------------------------------------------------------------+ diff --git a/src/appx/software_list.rst b/src/appx/software_list.rst new file mode 100644 index 000000000..b3203ddb1 --- /dev/null +++ b/src/appx/software_list.rst @@ -0,0 +1,136 @@ +.. meta:: + :description: Useful software list + :author: Serhii Horodilov + :keywords: software + +Software List +============= + +yEd - Graph editor +------------------ + +yEd is a powerful desktop application that can be used to quickly and +effectively generate high-quality diagrams. Create diagrams manually, or +import your external data for analysis. Our automatic layout algorithms +arrange even large data sets with just the press of a button. +yEd is freely available and runs on all major platforms: +Windows, Unix/Linux, and macOS. + +https://www.yworks.com/products/yed + +`Online live version `_ +is also available. + +7zip +---- + +**7-Zip** is **free software** with **open source**. + +- High compression ratio in `7z format `__ + with **LZMA** and **LZMA2** compression +- Supported formats: + + - Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM + - Unpacking only: APFS, AR, ARJ, CAB, CHM, CPIO, CramFS, DMG, EXT, + FAT, GPT, HFS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, + RAR, RPM, SquashFS, UDF, UEFI, VDI, VHD, VHDX, VMDK, XAR and Z. + +- Self-extracting capability for 7z format +- Integration with Windows Shell + +https://7-zip.org/ + +cygwin +------ + +It is a large collection of GNU and Open Source tools which provide +functionality similar to a `Linux +distribution `__ on +Windows and a DLL (cygwin1.dll) which provides substantial POSIX API +functionality. + +**Cygwin is not**: + +- a way to run native Linux apps on Windows. You must rebuild your + application *from source* if you want it to run on Windows. +- a way to magically make native Windows apps aware of UNIX® + functionality like ``signals``, ``ptys`` etc. Again, you need to + build your apps *from source* if you want to take advantage of Cygwin + functionality. + +https://www.cygwin.com/ + +git [#cygwin]_ +-------------- + +Git is a `free and open +source `__ distributed +version control system designed to handle everything from small to very +large projects with speed and efficiency. + +https://git-scm.com/ + +Docker +------ + + The most-loved Tool in Stack Overflow’s 2022 Developer Survey. + +Docker helps developers bring their ideas to life by conquering the +complexity of app development. We simplify and accelerate development +workflows with an integrated dev pipeline and through the consolidation +of application components. Actively used by millions of developers +around the world, Docker Desktop and Docker Hub provide unmatched +simplicity, agility and choice. + +https://www.docker.com/ + +PostgreSQL [#cygwin]_ +--------------------- + +PostgreSQL is a powerful, open source object-relational database system +with over 35 years of active development that has earned it a strong +reputation for reliability, feature robustness, and performance. + +https://www.postgresql.org/ + +psql [#cygwin]_ +--------------- + +A terminal-based front-end to PostgreSQL. It enables you to type in +queries interactively, issue them to PostgreSQL, and see the query +results. Alternatively, input can be from a file or from command line +arguments. In addition, psql provides a number of meta-commands and +various shell-like features to facilitate writing scripts and automating +a wide variety of tasks. + +On Windows it will be installed within PostgreSQL RDBMS. For macOS and +Linux look for ``postgresql-client`` package. + +https://www.postgresql.org/docs/current/app-psql.html + +pgAdmin +------- + +pgAdmin is the most popular and feature rich Open Source administration +and development platform for PostgreSQL, the most advanced Open Source +database in the world. + +It is a PostgreSQL client (like a ``psql``), but with web based GUI. + +https://pgadmin.org/ + +SQLite [#cygwin]_ +----------------- + +SQLite is a C-language library that implements a +`small `__, +`fast `__, +`self-contained `__, +`high-reliability `__, +`full-featured `__, SQL database +engine. + +https://sqlite.org/ + +.. [#cygwin] + available for installation as a cygwin package diff --git a/src/appx/wtk.txt b/src/appx/wtk.txt new file mode 100644 index 000000000..ef0a62d5d --- /dev/null +++ b/src/appx/wtk.txt @@ -0,0 +1,6 @@ +.. meta:: + :description: Knights, thieves and wizards game project + :author: Serhii Horodilov sgorodil@gmail.com + :keywords: python, game, oop, object-oriented programming + +.. include:: /../problem-sets/src/wtk/challenge.rst diff --git a/src/basics/bool_logic.txt b/src/basics/bool_logic.txt new file mode 100644 index 000000000..51c52eeb7 --- /dev/null +++ b/src/basics/bool_logic.txt @@ -0,0 +1,268 @@ +.. meta:: + :description: this document covers usage of logic and comparison + operators in Python + :author: Serhii Horodilov + :keywords: python, boolean, logic, comparison, operator + +.. _George Boole: + https://en.wikipedia.org/wiki/George_Boole +.. _Boolean algebra: + https://en.wikipedia.org/wiki/Boolean_algebra + +******************************************************************************* + Boolean Logic +******************************************************************************* + +.. image:: /../assets/img/george_boole.jpg + :align: center + :height: 248 + +`George Boole`_ put together what is now known as `Boolean algebra`_, which +relies on **true** and **false** values and define a set of boolean operations: +**not**, **and**, and **or**. + +These Boolean values and operators are helpful in programming because they help +you decide the course of action in your programs. + +The **Python boolean** type is one of Python's built-in data types. It's used +to represent the truth value of an expression. For example, the expression +``1 < 2`` is ``True``, while the expression ``0 == 1`` is ``False``. +Understanding how Python Boolean values behave is important to programming well +in Python. + +Understanding Boolean +===================== + +The Boolean type has only two possible values: + +- ``True`` +- ``False`` + +No other value will have ``bool`` as it type. + +.. code-block:: + + >>> type(True) + + >>> type(False) + + +The type ``bool`` is **built-in**, meaning it's always available in Python. +``True`` and ``False`` are keywords in Python and can't be used as +variable names. but ``bool`` type isn't and it's possible assign to the name +``bool``, however this is considered bad style. + +Boolean as numbers +------------------ + +Booleans are a subtype of **numeric** type in Python. This means they're +numbers for all intents and purposes. In other words, you can apply arithmetic +operations to Boolean, and you can also compare them to numbers. ``True`` +value is treated to be 1, and ``False`` value is treated to be 0. + +There aren't many uses of the numerical nature of Boolean values. + +Truth value testing +=================== + +Any object can be tested for truth value. By default an object considered +``True``, unless its class defines either. Here are most of built-in objects +considered ``False``: + +- constant values: ``None`` and ``False`` +- zero of any numeric type: ``0``, ``0.0``, ``0j``, ``Decimal(0)``, + ``Fraction(0, 1)`` +- empty sequences and collections: ``''``, ``[]``, ``()``, ``{}``, ``set()``, + ``range(0)``. + +.. hint:: + + If ``len(something)`` is equal to 0, than ``something`` is cast to ``bool`` + as ``False``. + +Boolean comparison +================== + +Python provides 3 logical operators: + +.. table:: + :align: center + + +----------+----------------+ + | Operator | Logic operator | + +==========+================+ + | ``not`` | Negation | + +----------+----------------+ + | ``and`` | Conjunction | + +----------+----------------+ + | ``or`` | Disjunction | + +----------+----------------+ + +With these operators, you can build expressions by connecting Boolean +expressions with each other. These operators are **keywords** of the language, +so you cannot use them as identifiers without causing a *SyntaxError*. + +Getting started with ``not`` operator +------------------------------------- + +The ``not`` operator is the Boolean or logic operator that implements negation +in Python. It's **unary**, which means that it takes only one **operand**. +The operand can be a Boolean expression or any Python object. The task of +``not`` is to reverse the truth value of its operand. + +.. table:: not operator truth table + :align: center + + +-------------+-----------------+ + | ``operand`` | ``not operand`` | + +=============+=================+ + | ``True`` | ``False`` | + +-------------+-----------------+ + | ``False`` | ``True`` | + +-------------+-----------------+ + +This functionality makes it worthwhile in several situations: + + +- Checking **unmet conditions** in the context of ``if`` statements and + ``while`` loops +- **Inverting the truth value** of an object or expression +- Checking if a **value is not in a given container** +- Checking for an **object's identity** + +Getting started with ``and`` operator +------------------------------------- + +Python's ``and`` operator is **binary**, which means it takes two **operands**. +The operands in an ``and`` expression are commonly known as *conditions*. +The result of the operator depends on the truth values of its operands. It'll +be ``True`` if **both** are true. + +.. table:: and operator truth table + :align: center + + +---------------+---------------+-----------------------------+ + | ``operand_1`` | ``operand_2`` | ``operand_1 and operand_2`` | + +===============+===============+=============================+ + | ``True`` | ``True`` | ``True`` | + +---------------+---------------+-----------------------------+ + | ``False`` | ``False`` | ``False`` | + +---------------+---------------+-----------------------------+ + | ``True`` | ``False`` | ``False`` | + +---------------+---------------+-----------------------------+ + | ``False`` | ``True`` | ``False`` | + +---------------+---------------+-----------------------------+ + +``and`` operator works not only with operands of Boolean type. +It's behavior: + +- evaluate 1st operand; return it, if it's ``False`` and finish +- evaluate 2nd operand; return it, if it's ``False`` and finish +- return 2nd operand + +.. code-block:: python + + >>> 1 and 5 + 5 + >>> '' and None + '' + >>> 0 and True + 0 + >>> 5 and False + False + +Getting started with ``or`` operator +------------------------------------ + +With Boolean ``or`` operator, you can connect two Boolean expressions into one +compound expression. This makes ``or`` the **binary** operator. At least one +subexpression must be ``True`` for the compound expression to be considered +``True``, and it doesn't matter which. If both subexpressions are ``False``, +then the expression is ``False``. + +.. table:: or operator truth table + :align: center + + +---------------+---------------+----------------------------+ + | ``operand_1`` | ``operand_2`` | ``operand_1 or operand_2`` | + +===============+===============+============================+ + | ``True`` | ``True`` | ``True`` | + +---------------+---------------+----------------------------+ + | ``False`` | ``False`` | ``False`` | + +---------------+---------------+----------------------------+ + | ``True`` | ``False`` | ``True`` | + +---------------+---------------+----------------------------+ + | ``False`` | ``True`` | ``True`` | + +---------------+---------------+----------------------------+ + +``or`` operator works not only with operands of Boolean type. +It's behavior: + +- evaluate 1st operand; return it, if it's ``True`` and finish +- evaluate 2nd operand; return it, if it's ``True`` and finish +- return 2nd operand + +.. code-block:: python + + >>> 42 or True + 42 + >>> None or [] + [] + >>> 0 or True + True + >>> [[]] or '' + [[]] + +Comparison +========== + +There are eight comparison operations in Python. They all have the same +priority (which is higher than that of the Boolean operations). + +.. table:: Comparison operators + :align: center + + +------------+-----------------------------------+ + | Operator | Meaning | + +============+===================================+ + | ``<`` | strictly less than | + +------------+-----------------------------------+ + | ``<=`` | less than or equal | + +------------+-----------------------------------+ + | ``>`` | strictly greater than | + +------------+-----------------------------------+ + | ``>=`` | greater or equal | + +------------+-----------------------------------+ + | ``==`` | equal (aka *equality* comparison) | + +------------+-----------------------------------+ + | ``!=`` | not equal | + +------------+-----------------------------------+ + | ``is`` | object identity | + +------------+-----------------------------------+ + | ``is not`` | negated object identity | + +------------+-----------------------------------+ + +Each of these comparison operators return a Boolean value, it's always +``True`` or ``False``. + +You can chain comparison operators together: ``x < y < z`` is equal to +``x < y and y < z``. + +Equality vs Identity +-------------------- + +It's easier to understand the difference between those by asking the question +each answers to. + +The question for ``==`` (*equality*) is: + + Is object on the left **equal** to the object on the right + +The question for ``is`` (*identity*) is: + + Is object on the left **the same** as the object on the right + +For example, if there are two cars of the same model, same color etc. in front +of you - these cars are equal, but they aren't ident to each other. But if you +are shown two pictures of the same car, you understand that the cars on those +pictures are the same object. diff --git a/src/basics/controlflow.txt b/src/basics/controlflow.txt new file mode 100644 index 000000000..f75b9671a --- /dev/null +++ b/src/basics/controlflow.txt @@ -0,0 +1,143 @@ +.. meta:: + :description: Control flow in Python + :author: Serhii Horodilov + :keywords: python, basics, control, if, for, while, condition, loop + +******************************************************************************* + Control Flow +******************************************************************************* + +.. todo: split into "if" statement and loop documents + +``if`` statement +================ + +Perhaps the most well-known statement type is ``if`` statement. For example: + +.. code-block:: python + :caption: if statement base example + + >>> x = int(input("Please enter an integer: ")) + >>> if x < 0: + ... x = 0 + ... print("Negative x changed to 0") + ... elif x == 0: + ... print("x is equal to zero") + ... elif x == 1: + ... print("x is equal to one") + ... else: + ... print("x is greater than one") + +But let's dive into ``if`` statement with more simple examples. + +How it works +------------ + +**if** statement is defined with a keyword ``if`` followed by a Boolean +expression or any object and finished with colon. The statement requires +a *body*: other statements to execute, also called an *if block*. +The body is indented at the same distance from the left (in Python we use +4 spaces to indent a single block of code). + +The body's statements will be executed only in case **if** expression is +``True``. + +.. code-block:: python + :linenos: + + from random import randint + + number: int = randint(1, 2) + + if not number % 2: # the as number % 2 == 0 + print(number, "is even") + +The ``print`` statement on line #6 will be executed only for even value of +``number`` variable. + +``else`` block +-------------- + +``if`` can be used by its own, it can extend its behavior with ``else`` block. +The general syntax for ``else`` body is the same: at least one indented +statement. But ``else`` doesn't take any expression after it. This block of +code will be executed only that the ``if`` statement truth check fails. + +.. code-block:: python + :linenos: + + from random import randint + + number: int = randint(1, 2) + + if not number % 2: + print(number, "is even") + else: + print(number, "is odd") + +You can attach **only one** else block to **if statement**. And you cannot use +``else`` statement on its own - this will cause *SyntaxError*. + +``elif`` block(s) +----------------- + +``elif`` (*else if*) statement may be considered as semi-statement between +``if`` and ``else`` statements. In case your program has more than two +dedicated choices you are able to extends control flow by appending +``elif`` blocks after ``if`` statement. The syntax is pretty similar to ``if`` +statement. Each ``elif`` has its own boolean expression or an object to test +for the truth value. + +You can attach as many ``elif`` statements as it needed. But you cannot use +``elif`` without ``if`` statement. + +Python will test conditions in ``if`` and ``elif`` statements from top to +bottom. The first one, which considered to be ``True`` will be executed. +All others will be skipped. + +If there were no truth conditions ``else`` block will be executed (if exists). + +.. code-block:: python + + >>> x = int(input("Enter some integer number: ")) + >>> if not x % 5 and not x % 3: # the same as x % 5 == 0 and x % 3 == 0 + ... print(x, "is divisible by 5 and 3") + ... elif not x % 5: + ... print(x, "is divisible by 5") + ... elif not x % 3: + ... print(x, "is divisible by 3") + ... else: + ... print(x, "is not divisible by 5 or 3") + +.. note:: + + The order conditions appears matter. + The truth test goes from top to bottom and stops at first expression + which is ``True``. + +Usage +----- + +``if/elif/else`` statements help you to control which portion of your code is +executed based on conditions from outer scope. + +.. code-block:: python + :linenos: + + # Ask user for input + grade = int(input("Enter your grade (0-100): ")) + + # Use if/elif/else statements to assign letter grade + if grade >= 90: + letter_grade = "A" + elif grade >= 80: + letter_grade = "B" + elif grade >= 70: + letter_grade = "C" + elif grade >= 60: + letter_grade = "D" + else: + letter_grade = "F" + + # Print the letter grade + print("Your letter grade is:", letter_grade) diff --git a/src/basics/decorators.txt b/src/basics/decorators.txt new file mode 100644 index 000000000..62dbfeeb5 --- /dev/null +++ b/src/basics/decorators.txt @@ -0,0 +1,447 @@ +.. meta:: + :description: Python decorators + :author: Serhii Horodilov + :keywords: python, basics, decorators + +.. _first-class objects: + https://dbader.org/blog/python-first-class-functions + +******************************************************************************* + Decorators +******************************************************************************* + +Decorators provide a simple syntax for calling higher-order functions +:cite:`realpython:decorators`. + +.. important:: + + There is some kind of misunderstanding in definitions. + + **Decorator** is a function returning another function, usually applied + as a function transformation using the ``@wrapper`` syntax + :cite:`docs-python:term-decorator`. + + However, that's no quit enough to describe it. The more complete + definition is: + + **Decorator** is a structural design pattern that lets you attach new + behaviors to objects by placing these objects inside special wrapper + objects that contain the behaviors :cite:`refactoring.guru:decorator`. + +Before you understand decorators, you must first understand how functions +work. + +First-class objects +=================== + +In Python functions are `first-class objects`_. Everything in Python is an +object. Functions are objects too. + +Inner functions +--------------- + +Functions can be nested. This means it is possible to define functions +inside other functions. + +.. code-block:: python + :caption: Nested functions example + + def heap_sort(origin: List[int]) -> List[int]: + """Return a sorted collection using the heap sort algorithm""" + + def heapify(_ds: List[int], _size: int, _idx: int) -> List[int]: + ... + + ... + for idx in range(size, -1, -1): + heapify(result, size, idx) + ... + +The order in which inner functions are defined no matters. The function +definition does not execute the function body; this gets executed only when +the function is called. Furthermore, the inner functions are not defined until +the parent function is called. They are locally scoped to their parent. Trying +to call ``heapify`` function outside of ``heap_sort`` will cause ``NameError`` +exception. + +Functions are objects +--------------------- + +This means functions can be passed around and used as arguments, just like any +other object (e.g. *int*, *str* etc.). + +.. code-block:: python + + from typing import Callable + + + def say_hello(name: str) -> str: + return f"Hello, {name}!" + + + def be_awesome(name: str) -> str: + return f"Yo, {name}!" + + + def greet_serhii(greeting_func: Callable) -> str: + return greeting_func("Serhii") + + + if __name__ == "__main__": + print(f"{greet_serhii(say_hello) = }") + print(f"{greet_serhii(be_awesome) = }") + +Returning functions +------------------- + +Since function can be passed as an argument, it may be returned from another +function. + +.. code-block:: python + + from typing import Callable + + + def parent(idx: int) -> Callable: + def first_child(): + return "this is the first child" + + def second_child(): + return "this is the second child" + + return second if not num % 2 else first + + + first = parent(1) + second = parent(2) + +.. note:: + + ``parent`` returns functions themselves, there are no parentheses. + +After running the code snippet above, ``first`` refers the ``first_child`` +function from the inner ``parent`` scope. From now it can be used to call +the target function it refers. + +.. code-block:: + + >>> first() + "this is the first child" + >>> second() + "this is the second child" + +Simple decorators +================= + +Now you're ready to move on and see the magical beast that is the Python +decorators. Let's start with a simple example: + +.. code-block:: python + + def decorator(func: Callable) -> Callable: + def wrapper(): + print(f"before {func.__name__} call") + func() + print(f"after {func.__name__} call") + + return wrapper # no wrapper call, return reference to wrapper function + + def say_hello(): + print("Hello!") + + say_hello_decorated = decorator(say_hello) + +Running function: + +.. code-block:: + + >>> say_hello() + Hello! + >>> say_hello_decorated() + before say_hello call + Hello! + after say_hello call + +The common way to use decorators is to replace the original function with +a decorated one: + +.. code-block:: + + >>> say_hello = decorator(say_hello) + >>> say_hello() + before say_hello call + Hello! + after say_hello call + +``say_hello`` function is the reference to the ``decorator..wrapper``, +which itself is bound to the original ``say_hello`` function. There is a +syntactic sugar to do this, called *pie-syntax*. The following example does +exact the same things as the first decorator example: + +.. code-block:: python + + def decorator(func: Callable) -> Callable: + def wrapper(): + print(f"before {func.__name__} call") + func() + print(f"after {func.__name__} call") + + return wrapper # no wrapper call, return reference to wrapper function + + + @decorator + def say_hello(): + print("Hello!") + +.. important:: + + There is no way to *undecorate* object in Python. Once something is bound + to the decorator's wrapper - it is decorated forever. + +A decorated function still remains a **function**. So, it can be decorated +once more time again, and again, and again... + +.. code-block:: python + + from typing import Callable + + + def bread(func: Callable) -> Callable: + def wrapper(): + print("<--bread-->") + func() + print("<--bread-->") + + return wrapper + + + def vegetables(func: Callable) -> Callable: + def wrapper(): + print("~~~salad~~~") + print("***tomato***") + func() + + return wrapper + + + def cheese(func: Callable) -> Callable: + def wrapper(): + func() + print("---cheese---") + + return wrapper + + + @bread + @vegetables + @cheese + def sandwich(): + print("_sliced_meat_") + +.. code-block:: + + >>> sandwich() + <--bread--> + ~~~salad~~~ + ***tomato*** + _sliced_meat_ + ---cheese--- + <--bread--> + +.. note:: + + "Wrapper" is the alternative nickname for the Decorator pattern that + clearly expresses the main idea of the pattern. A wrapper is an object that + can be linked with some target object. The wrapper contains the same set of + methods as the target and delegates to it all requests it receives. + However, the wrapper may alter the result by doing something either before + or after it passes the request to the target. + +Passing arguments to the wrapper +================================ + +Until now the examples use *simple* decorators. But what if the decorated +function gets some arguments? This will cause ``TypeError`` exception that tell +that "arguments are missed". This can be fixed with just passing arguments to +the ``wrapper`` inner function. + +.. code-block:: python + + import logging + from typing import Callable + + logging.basicConfig(level=logging.INFO) + logger = logging.getLogger(__name__) + + + def log(func: Callable) -> Callable: + def wrapper(x, y): + logger.info("%s called", func.__name__) + return func(x, y) + + return wrapper + + + @log + def sum_numbers(x, y): + return x + y + +If case you're trying to make a generic decorator, you may pass ``*args`` and +``**kwargs`` instead of exact arguments: + +.. code-block:: python + + from typing import Callable + + + def generic_decorator(func: Callable) -> Callable: + def wrapper(*args, **kwargs): + ... # do something before + result = func(*args, **kwargs) + ... # do something after + + return result + + return wrapper + +Passing arguments to decorator +============================== + +At last it's time to know how to pass arguments to the decorator. +Here is a simple implementation of ``defer`` decorator which deferred +the function execution for some time: + +.. code-block:: python + + import time + from typing import Callable + + + def slow_down(seconds: int = 3) -> Callable: + def decorator(func: Callable) -> Callable: + def wrapper(*args, **kwargs): + started_at = time.perf_counter() + time.sleep(seconds) + result = func(*args, **kwargs) + completed_in = round(time.perf_counter() - started_at, 2) + print("Completed in %.2f" % completed_in) + + return result + + return wrapper + + return decorator + + + @slow_down() + def function_a(): + return 42 + + + @slow_down(10) + def function_b(): + return 24 + +.. code-block:: + + function_a() + Completed in 3.00 + function_b() + Completed in 10.00 + +Class decorators +================ + +There are some pre-defined decorators exists for usage together with classes. +They are: + +- ``classmethod`` +- ``staticmethod`` +- ``property`` + +If you develop an intuitive understanding for their differences you'll be able +to write object-oriented Python that communicates its intent more clearly and +will be easier to maintain in the long run +:cite:`realpython:methods-demystified`. + +Class methods +------------- + +Instead of accepting a ``self`` parameter, class methods take a ``cls`` +parameter that points to the class — and not the object instance — when +the method is called. + +Because the class method only has access to this ``cls`` argument, it can't +modify object instance state. That would require access to ``self``. +However, class methods can still modify class state that applies across all +instances of the class. + +The common usage for ``classmethod`` is provide alternative initializers. + +Static methods +-------------- + +This type of method takes neither a ``self`` nor a ``cls`` parameter (but of +course it's free to accept an arbitrary number of other parameters). + +Therefore a static method can neither modify object state nor class state. +Static methods are restricted in what data they can access - and they're +primarily a way to namespace your methods. + +It's tricky to explain ``staticmethod`` usage. Almost always you can create +a dedicated function instead of static method. But sometimes you need to +bind some logic independent from class itself or its instances to a class - +it common to encapsulate it with ``staticmethod``. + +Properties +---------- + +It's a way to bind a method name to access it as an attribute. Properties are +**read-only** by default. This means a value cannot be assigned to ``property +member``. + +Some examples +------------- + +.. code-block:: python + + import datetime + + + class Person: + """Person class implementation""" + + def __init__(self, first_name: str, last_name: str) -> None: + """Initialize instance""" + + self.first_name = first_name + self.last_name = last_name + + @classmethod + def from_fullname(cls, name: str) -> "Person": + """Return a person instance""" + + first_name, last_name = name.rsplit(" ", 1) + + return cls(first_name, last_name) + + @staticmethod + def format_date(date: datetime.date) -> str: + """Return a formatted date as string""" + + return date.strftime("%d-%m-%Y") + + @property + def fullname(self) -> str: + """Return person's fullname""" + + return " ".join([self.first_name, self.last_name]) + +.. code-block:: + + >>> sh = Person("Serhii", "Horodilov") + >>> vp = Person.from_fullname("Vladyslav Ponomaryov") + >>> sh.fullname + 'Serhii Horodilov' + >>> vp.fullname + 'Vladyslav Ponomaryov' diff --git a/src/basics/exceptions.txt b/src/basics/exceptions.txt new file mode 100644 index 000000000..d2ca9c37f --- /dev/null +++ b/src/basics/exceptions.txt @@ -0,0 +1,344 @@ +.. meta:: + :description: Handling exceptions in Python + :author: Serhii Horodilov + :keywords: python, exceptions, handling, try, except, finally + +.. _built-in exceptions: + https://docs.python.org/library/exceptions.html#bltin-exceptions + +******************************************************************************* + Errors and Exceptions +******************************************************************************* + +There are (at least) two distinguishable kinds of errors: +*syntax errors* and *exceptions* :cite:`docs-python:errors`. + +Syntax errors +============= + +Syntax errors are also known as parsing errors. + +.. code-block:: python + + >>> while True print("the loop is running...") + File "", line 1 + while True print('the loop is running...') + ^^^^^ + SyntaxError: invalid syntax + +The parser repeats the offending line and displays a little "arrow" pointing at +the earliest point in the line where the error was detected. The error is +caused by (or at least detected at) the token preceding the arrow. + +Exceptions +========== + +Even if a statement or expression is syntactically correct, it may cause an +error when an attempt is made to execute it. Errors detected during execution +are called exceptions and are not unconditionally fatal: you will soon learn +how to handle them in Python programs. + +Exceptions come in different types, and the type is printed as part of +the message. + +For example, the ``div`` function implemented as + +.. code-block:: python + + def div(x: Union[int, float], y: Union[int, float]) -> float: + """Return the result of dividing `x` by `y`.""" + + return x / y + +may cause a ``ZeroDivisionError`` exception in case 0 is passed as ``y`` +parameter. + +Standard exception names are built-in identifiers (not reserved keywords). + +.. seealso:: The list of `built-in exceptions`_ + +Tracebacks +========== + +.. note:: "File" is replaced with a *dummy string* within the examples. + +Let's assume the following modules structure: + +:: + + / + |-- main.py + |-- func.py + +The **main** module imports a ``div`` function implemented above from the +**func** module. The code in main is implemented as follows: + +.. code-block:: python + + from func import div + + if __name__ == "__main__": + x = int(input("Please enter a number: ")) + y = int(input("Please enter a number: ")) + print(f"{x = }, {y = } -> {div(x, y) = }") + +While running the code with correct inputs it will work fine. But there are +at two exceptions for this script. + +The first one is related on type conversion. While running the main script +there is case of invalid input. + +:: + + Please enter a number: 100 + Please enter a number: one + Traceback (most recent call last): + File "path/to/module.py", line 5, in + y = int(input("Please enter a number: ")) + ValueError: invalid literal for int() with base 10: 'one' + +Note the **traceback** indicates the module and the exact line of code that +causes the exception. + +The second one exception occurs when a 0 is passed as the second parameter to +``div`` function. The traceback would look like: + +:: + + Please enter a number: 100 + Please enter a number: 0 + Traceback (most recent call last): + File "path/to/main.py", line 6, in + print(f"{x = }, {y = } -> {div(x, y) = }") + File "path/to/func.py", line 11, in div + return x / y + ZeroDivisionError: division by zero + +The traceback indicates all calls (top to bottom) that cause an exception. + +Exception handling +================== + +It is possible to write programs that handle selected exceptions. +The ``try`` statement is used to do that. + +The try statement works as follows. + +#. First, the try clause (the statement(s) between the try and except + keywords) is executed. +#. If no exception occurs, the except clause is skipped and execution of + the try statement is finished. +#. If an exception occurs during execution of the try clause, the rest of + the clause is skipped. Then, if its type matches the exception named after + the except keyword, the except clause is executed, and then execution + continues after the try/except block. +#. If an exception occurs which does not match the exception named in + the except clause, it is passed on to outer try statements; if no handler + is found, it is an unhandled exception and execution stops with a message + as shown above. + +.. code-block:: python + + from func import div + + if __name__ == "__main__": + x = int(input("Please enter a number: ")) + y = int(input("Please enter a number: ")) + try: + print(f"{x = }, {y = } -> {div(x, y) = }") + except: + print("An exception occurs") + +A try statement may have more than one except clause, to specify handlers for +different exceptions. + +.. code-block:: python + + from func import div + + if __name__ == "__main__": + x = int(input("Please enter a number: ")) + y = int(input("Please enter a number: ")) + try: + print(f"{x = }, {y = } -> {div(x, y) = }") + except (ValueError, ZeroDivisionError): + print("An exception occurs") + +.. code-block:: python + + from func import div + + if __name__ == "__main__": + x = int(input("Please enter a number: ")) + y = int(input("Please enter a number: ")) + try: + print(f"{x = }, {y = } -> {div(x, y) = }") + except ValueError as exc: + print(f"Value cannot be converted, {exc}") + except ZeroDivisionError: + print(f"Zero division error: {y = }") + +Handling ALL exception +---------------------- + +It's a bad practice to handle **all** exceptions. + +When indicating an ``except`` block without specifying an exception to catch it +will work for any exception, that occurs in ``try`` block. The same is relevant +for handling ``BaseException`` and ``Exception``. But you can never say what +exact goes wrong. + +.. note:: However, this scenario may work for logging an exception and raising + it again to be handled on upper levels. + + .. code-block:: python + + try: + ... # some code that may raise an exception + except: + ... # logging actions + raise # raise an exception again + +:: + + except: + ... + + except (BaseException, Exception): + ... + + except Exception: + ... + +All exceptions are inherited from ``Exception`` class, which is subclass of +``BaseException``. So, you can never know what exactly goes wrong with your +code. + +``finally`` statement +--------------------- + +The ``try`` statement cannot be used itself. This will cause ``SyntaxError``. +Either ``except`` or ``finally`` block is required to be included. + +While the ``except`` block tries to catch the exceptions if any, +the ``finally`` block will be always executed regardless of the exception +occurs. + +.. code-block:: python + + try: + ... # some code that may cause an exception + finally: + ... # this code will be always executed + + try: + result = 10 // 2 + except ZeroDivisionError: + print("zero division") + finally: + print("it's finished") + + try: + result = 10 // 0 + except ZeroDivisionError: + print("zero division") + finally: + print("it's finished") + +``else`` statement +------------------ + +The ``try`` statement can also use ``else`` (which is optional). +The statements within this block will be execute only in case there were +no exceptions raised while running the ``try``. + +.. code-block:: python + + try: + result = 10 // 2 + except ZeroDivisionError: + print("zero division") + else: + print("no errors occurred") # this **WILL** be printed out + + try: + result = 10 // 0 + except ZeroDivisionError: + print("zero division") + else: + print("no errors occurred") # this **WILL NOT** be printed out + + +Raising exceptions +================== + +The ``raise`` statement allows the programmer to force a specified exception +to occur. The sole argument to raise indicates the exception to be raised. +This must be either an exception instance or an exception class (a class that +derives from ``BaseException``, such as ``Exception`` or one of its +subclasses). If an exception class is passed, it will be implicitly +instantiated by calling its constructor with no arguments. + +.. code-block:: python + + raise NameError("name error") + raise NameError + +``raise`` statement itself will re-raise all the exceptions within the context. +Also exceptions can be raised again from the ``except`` block. It's a common +pattern to catch the exception for loggers and when re-raise it. + +.. code-block:: python + + try: + result = 10 // 0 + except: + print("zero division") + raise + +Creating custom exceptions +========================== + +Programs may name their own exceptions by creating a new exception class. +Exceptions should typically be derived from the Exception class, either +directly or indirectly. + +Exception classes can be defined which do anything any other class can do, +but are usually kept simple, often only offering a number of attributes that +allow information about the error to be extracted by handlers for +the exception. + +Most exceptions are defined with names that end in "Error", similar to the +naming of the standard exceptions. + +Many standard modules define their own exceptions to report errors that may +occur in functions they define. + +.. code-block:: python + :caption: User-defined exception + + class InvalidInputError(Exception): + """This is a custom exception for demo needs""" + + + class NegativeError(ValueError): + """Raised when a negative value passed""" + + + def sum_positive(x: int, y: int) -> int: + """Return the sum of positive integers""" + + if x < 0 or y < 0: + raise NegativeError + + return x + y + + + try: + x = int(input("Enter number x: ")) + y = int(input("Enter number y: ")) + result = sum_positive(x, y) + except ValueError: + raise InvalidInputError("could not convert to integer") + except NegativeError: + print("this function works only with positive integers") diff --git a/src/basics/functions.txt b/src/basics/functions.txt new file mode 100644 index 000000000..1f3f1d186 --- /dev/null +++ b/src/basics/functions.txt @@ -0,0 +1,526 @@ +.. meta:: + :description: Python functions + :author: Serhii Horodilov + :keywords: python, basics, functions + +******************************************************************************* + Functions +******************************************************************************* + +You may be familiar with the mathematical concept of a **function**. It is +a relationship or mapping between one or more inputs and a set of outputs. + +.. math:: + + z = f(x, y) + +Here ``f`` is a function that operates on the inputs ``x`` and ``y``, and +its output is bind to ``z``. + +In programming a **function** is a self-contained block of code that +encapsulate a specific task or related group of tasks. + +You may be familiar with some built-in functions like ``max``, ``min``, ``len`` +etc. + +The usual syntax for defining a Python function is as follows: + +:: + + def ([]): + + ++---------------------+-------------------------------------------------------+ +| Component | Meaning | ++=====================+=======================================================+ +| ``def`` | The keyword that informs Python that a function is | +| | being defined | ++---------------------+-------------------------------------------------------+ +| ```` | A valid Python identifier that names the function | ++---------------------+-------------------------------------------------------+ +| ```` | An optional, comma-separated list of parameters that | +| | may be passed to the function | ++---------------------+-------------------------------------------------------+ +| ```` | A block of valid Python statements; | +| | **body** of the function | ++---------------------+-------------------------------------------------------+ + +The syntax for calling a Python function is as follows: + +:: + + ([]) + +The ```` are the values passed into the function. They correspond +to the ```` in the function definition. You can define a function +that doesn't take any arguments, but the parentheses are still required. Both +a function definition and a function call must always include parentheses, +even if they're empty. + +Argument passing +================ + +More often, you want to **pass data into a function**. + +Positional arguments +-------------------- + +.. note:: + + Because of the way they're defined and used, positional arguments are also + called *required arguments*. + +The most straightforward way to pass arguments to a function is with +**positional arguments**. +In the function definition, you specify a comma-separated list of parameters +inside the parentheses. +When the function is called, you specify a corresponding list of arguments. + +The parameters behave like **variables** that are defined locally to the +function. + +Although positional arguments are the most straightforward way to pass data to +a function, they also afford the least flexibility. For starters, the **order** +of the arguments in the call must match the order of the parameters in the +definition. + +There's nothing to stop you from specifying positional arguments out of order. +The function even may still run, but it's very unlikely to produce the correct +results. + +.. note:: + + It's responsibility of the programmer who defines the function to document + what the appropriate arguments should be, and it's the responsibility of + the user of the function to be aware of that information and abide by it. + +With positional arguments, the arguments in the call and the parameters in the +definition must agree not only in order, but in number as well. + +Keyword arguments +----------------- + +When calling a function, you can specify arguments in the form +``=``. In that case, each ```` must match a parameter +in the function definition. Referencing a keyword that doesn't match any of +these declared parameters generates an exception. + +Using keyword arguments lifts the restriction on arguments order. Each keyword +argument explicitly designates a specific parameter by name, so you can specify +them in any order and Python will still know which argument goes with which +parameter. + +Like with positional arguments, though, the number of arguments and parameters +must still match. + +You can call a function using both positional and keyword arguments. +Once you've specified a keyword argument, there can't be any positional +arguments to the right of it. + +Default values +-------------- + +If a parameter specified in the function definition has the form of +``==``, then ```` becomes a default value for that +parameter. Parameters defined this way are referred to as +**default or optional parameters**. + +.. rubric:: Mutable default parameter values + +Things can get weird if you specify a default parameter value that is +a mutable object. + +.. code-block:: python + + >>> def add_to_container(item, container = []): + ... container.append(item) + ... + >>> + >>> add_to_container(42, [1, 2, 3]) + [1, 2, 3, 42] + >>> add_to_container("foobar", ["foo", "bar"]) + ["foo", "bar", "foobar"] + >>> add_to_container(42) + [42] + >>> add_to_container("foobar") # ["foobar"] + [42, "foobar"] + +In Python default parameter values are **defined only once** when the function +is defined. The default value isn't re-defined each time the function is +called. For the example above, each time the ``add_to_container`` function is +called without passing ``container`` argument, the ``.append`` statement is +performed on the same list. + +Mutable and immutable arguments +------------------------------- + +.. note:: + + Roughly, you may consider immutable object as passed-by-value, + and mutable objects as passed-by-reference. + However, that's not actual true. + +In programming language design, there are two common paradigms for passing an +argument to a function: + +- **pass-by-value** means a copy of the argument is passed to the function. +- **pass-by-reference** means a reference to the argument is passed to + the function. + +Are parameters in Python pass-by-value or pass-by-reference? They're neither, +exactly. That's because a reference doesn't mean quite the same thing in +Python as it does in C-like languages. + +Recall that in Python, every piece of data is an **object**. A reference points +to an object, not a specific memory location. + +Take a look on the code below: + +.. code-block:: python + :linenos: + + value = 24 + value = 42 + +These assignment statements have the following meaning: + +- **Line 1** cause ``value`` to point to an object whose value is ``24``. +- **Line 2** reassign ``value`` as a new reference to a different object + whose value is ``42``. + +In Python, when you pass an argument to a function, a similar *rebinding* +occurs. + +.. code-block:: python + :linenos: + + def reassign(fx: int) -> None: + fx = 10 + + + x = 5 + reassign(x) + +In the main program, the statement ``x = 5`` on line 5 creates a reference +named ``x`` bound to an object whose value is ``5``. +``reassign`` is then called on line 6 with ``x`` as its argument. +When a function first starts, a new reference called ``fx`` is created, which +initially points to the same ``5`` object. However, when the statement +``fx = 10`` on line 2 is executed, ``reassign`` rebinds ``fx`` to a new +object whose value is ``10``. From now, the two references ``x`` and ``fx`` are +uncoupled one from another. Nothing else that function does will affect ``x``, +and when function terminates, ``x`` will still point to the object ``5``, as it +did prior to the function call. + +You can confirm all this using ``id()``. Here's a slightly augmented version of +the code above: + +.. code-block:: python + :linenos: + + def reassign(fx: int) -> None: + print(f"{fx = }, {id(fx) = }") + fx = 10 + print(f"{fx = }, {id(fx) = }") + + + x = 5 + print(f"{x = }, {id(x) = }") + reassign(x) + print(f"{x = }, {id(x) = }") + +The outputs will look like: + +:: + + x = 5, id(x) = 140706772804520 + fx = 5, id(fx) = 140706772804520 + fx = 42, id(fx) = 140706772805704 + x = 5, id(x) = 140706772804520 + +.. note:: + + Python's argument-passing mechanism has been called **pass-by-assignment**. + You may also see terms pass-by-object, pass-by-object-reference, or + pass-by-sharing. This is because parameter names are bound to objects on + function entry in Python, and assignment is also the process of binding + a name to an object. + +The key takeaway here is that Python function can't change the value of an +argument by reassigning the corresponding parameter to something else. + +However, functions can use references to make modifications inside of a mutable +objects. + +.. code-block:: python + :linenos: + + >>> def insert_into_container(item, container, idx = 0): + ... container.insert(idx, item) + ... + >>> + >>> numbers = [1, 2, 3] + >>> insert_into_container(42, numbers) + >>> numbers + [42, 1, 2, 3] + +The return statement +==================== + +It serves two purposes: + +- It immediately terminates the function and passes execution control back + to the caller. +- It provides a mechanism by which the function can pass data back + to the caller. + +The return statement can be used inside of a function or a method to send +the result back to the caller. It consists of the ``return`` Python keyword +and an optional return value. + +The return value of a Python function can be any Python object (and you should +remember - everything in Python is an object). + +You can omit the return value and use bare ``return`` without a return value. +You can also omit the entire ``return`` statement. In both cases, the return +value will be ``None``. So, Python functions always have the return value; in +case it hasn't been specified - it's ``None``. + +.. important:: **Returning vs Printing** + + If you're working in an interactive session, then you might think that + printing a value and returning a value are equivalent. + Consider the following two functions: + + .. code-block:: python + + from typing import List + + + def print_evens(numbers: List[int]) -> None: + print([number for number in numbers if not number % 2]) + + + def return_evens(numbers: List[int]) -> List[int]: + return [number for number in numbers if not number % 2] + + And their output: + + :: + + >>> print_evens([1, 2, 3, 4, 5, 6, 7, 8, 9]) + [2, 4, 6, 8] + >>> return_evens([1, 2, 3, 4, 5, 6, 7, 8, 9]) + [2, 4, 6, 8] + + Both functions seems to do the same thing. But only the second one + function actually returns a value, when the first one returns nothing + (or **NoneType object**). + +Return multiple values +---------------------- + +You can use a return statement to return multiple values from a function. +To do that, you just need to supply several return values separated by commas. +The function will return a tuple of values. + +.. code-block:: python + + import statistics as st + + + def describe(data): + return st.mean(data), st.median(data), st.mode(data) + + + sample = [8, 1, 9, 1, 4, 6, 1, 9, 8, 3] + mean, median, mode = describe(sample) + +The built-in ``divmod`` function is also an example of a function that returns +multiple values. The function takes two (non-complex) numbers as arguments and +returns two numbers, the quotient of the two input values and the remainder of +the division. + +Variable-length argument list +============================= + +In some cases, when you're defining a function, you may not know beforehand how +many arguments you'll want it to take. + +For example, a function that computes an average of several values may look +something like this: + +.. code-block:: python + + def avg(a, b, c): + return (a + b + c) / 3 + +However, as you're already seen, when positional arguments are used, the number +of arguments passed must match the number of parameters declared. + +Argument tuple packing +---------------------- + +When a parameter name in a function definition is preceded by an asterisk (\*), +it indicates **argument tuple packing**. Any corresponding arguments in +a function call are packed into a tuple that the function can refer to by +the given parameter name. + +.. code-block:: python + + def avg(*args): + return sum(args) / len(args) + +Any name can be used, but *args* is so commonly chosen that it's practically +a standard. + +Argument tuple unpacking +------------------------ + +An analogous operation is available on the other side of the equation in +a function call. When an argument in a function call is preceded by an asterisk, +it indicates that the argument is a tuple that should be **unpacked** and +passed to the function as separate values. + +.. code-block:: python + + def demo_args_unpacking(a, b, c): + print(f"{a = }, {b = }, {c = }") + + + args = 10, 20, 30 + demo_args_unpacking(*args) + +.. note:: + + Although this type of unpacking is called **tuple** unpacking, it doesn't + only work with tuples. The asterisk can be applied to any iterable in + a function call. + + .. code-block:: python + + arguments_list = [10, 20, 30] + demo_args_unpacking(*arguments_list) + arguments_set = {10, 20, 30} + demo_args_unpacking(*arguments_set) + arguments_str = "ABC" + demo_args_unpacking(*arguments_str) + +.. note:: + + You can even do tuple packing and unpacking at the same time. + + .. code-block:: python + + def avg(*args) -> float: + return sum(args) / len(args) + + + numbers = 10, 20, 30 + average = avg(*numbers) + +Argument dictionary packing +--------------------------- + +Python has a similar operator, the double asterisk (\*\*), which can be used +with function parameters to specify **dictionary packing**. Preceding parameter +in a function definition be a double asterisk indicates that the corresponding +arguments, which are expected to be keyword arguments (``key=value`` pairs), +should be packed into a dictionary. + +.. code-block:: python + + def display_person(first_name: str, last_name: str, **kwargs) -> None: + print(f"{first_name.title()} {last_name.title()}") + for key, value in kwargs.items(): + print(f"{key}:\t{value}") + + + display_person("serhii", "horodilov", school="A-Level", course="Python") + +Again, any name can be used, but the peculiar *kwargs* (which is short for +*keyword args*) is nearly standard. + +Argument dictionary unpacking +----------------------------- + +This is analogous to argument tuple unpacking. +When the double asterisk precedes an argument in a function call, it specifies +that the argument is a dictionary that should be unpacked, with the resulting +items passed to the function as keyword arguments. + +.. code-block:: python + + person_data = { + "first_name": "Serhii", + "last_name": "Horodilov", + "school": "A-Level", + "course": "Python", + "school_occupation": "teacher/mentor", + "job_title": "Software Engineer", + } + display_person(**person_data) + +Lambda functions +================ + +Lambda expressions in Python and other programming languages have their roots +in lambda calculus, a model of computation invented by Alonzo Church. +Python is not inherently a functional language, but it adopted some functional +concepts early on. In January 1994, ``map()``, ``filter()``, ``reduce()``, and +the lambda operator were added to the language. + +General lambda function syntax is: + +:: + + lambda []: + ++---------------------+-------------------------------------------------------+ +| Component | Meaning | ++=====================+=======================================================+ +| ``lambda`` | The keyword that informs Python that a function is | +| | being defined | ++---------------------+-------------------------------------------------------+ +| ```` | An optional, comma-separated list of parameters that | +| | may be passed to the function | ++---------------------+-------------------------------------------------------+ +| ```` | A valid Python expression; return statement | ++---------------------+-------------------------------------------------------+ + +.. code-block:: python + + def get_fullname(first_name: str, last_name: str): + return f"{first_name.title()} {last_name.title()}" + + + lambda first_name, last_name: f"{first_name.title()} {last_name.title()}" + +The code sample above demonstrates the ``get_fullname`` Python function and its +lambda version. A lambda form presents syntactic distinctions from a normal +function. In particular, a lambda function has the following characteristics: + +- It can only contain expressions and can’t include statements in its body. +- It is written as a single line of execution. +- It does not support type annotations. +- It can be immediately invoked + (:abbr:`IIFE (Immediately Invoked Function Execution)`). + + .. code-block:: python + + (lambda number: "odd" if number % 2 else "even")(42) + +.. rubric:: Classic functional constructs + +.. code-block:: python + + >>> # in-place data modifications + >>> list(map(lambda x: x.upper(), ["foo", "bar", "foobar"])) + ["FOO", "BAR", "FOOBAR"] + >>> # filtering values + >>> list(filter(lambda x: not x % 2, [1, 2, 3, 4, 5, 6, 7])) + [2, 4, 6] + >>> # reduce values + >>> from functools import reduce + >>> reduce(lambda acc, x: acc ^ x, [1, 2, 3, 1234, 3, 2, 1]) + 1234 diff --git a/src/basics/index.txt b/src/basics/index.txt new file mode 100644 index 000000000..759b1ca6b --- /dev/null +++ b/src/basics/index.txt @@ -0,0 +1,23 @@ +.. meta:: + :description: Python course - Basics + :author: Serhii Horodilov + :keywords: python, basics, index + +############################################################################### + Python Basics +############################################################################### + +.. toctree:: + :name: basics + + variables + syntax + stdtypes + bool_logic + controlflow + functions + modules + exceptions + decorators + pep8 + testing diff --git a/src/basics/modules.txt b/src/basics/modules.txt new file mode 100644 index 000000000..f188916a2 --- /dev/null +++ b/src/basics/modules.txt @@ -0,0 +1,20 @@ +.. meta:: + :description: Modules and imports in Python + :author: Serhii Horodilov + :keywords: python, basics, modules, import + +.. attention:: Page is under construction + + .. figure:: /../assets/img/construction.svg + :figwidth: 250 + :align: center + +******************************************************************************* + Pythons Modules and Imports +******************************************************************************* + +.. todo: module definition + +.. todo: imports + +.. todo: if __name__ == "__main__" diff --git a/src/basics/pep8.txt b/src/basics/pep8.txt new file mode 100644 index 000000000..0a847606f --- /dev/null +++ b/src/basics/pep8.txt @@ -0,0 +1,16 @@ +.. meta:: + :description: PEP-8 style guide + :author: Serhii Horodilov + :keywords: python, style, guide + +.. todo + +.. attention:: Page is under construction + + .. figure:: /../assets/img/construction.svg + :figwidth: 250 + :align: center + +******************************************************************************* + Style Guides: PEP8 +******************************************************************************* diff --git a/src/basics/stdtypes.txt b/src/basics/stdtypes.txt new file mode 100644 index 000000000..d5bdbbc92 --- /dev/null +++ b/src/basics/stdtypes.txt @@ -0,0 +1,338 @@ +.. meta:: + :description: Python built-in types + :author: Serhii Horodilov + :keywords: python, basics + +.. todo + split into separate documents: numbers, booleans, sequences etc. + +******************************************************************************* + Built-in Types +******************************************************************************* + +The principal built-in types are numerics, sequences, mappings, classes, +instances and exceptions :cite:`docs-python:stdtypes`. This section covers +only the most base of them. Others will be discussed in the future within +their own topics. + +Numeric types +============= + +There are 3 distinct numeric types: *integers*, *floating point numbers*, and +*complex numbers*. In addition, Booleans are a subtype of integers. Integers +have unlimited precision. Floating point numbers are usually implemented using +``double`` in C. Complex numbers have a real and imaginary part, which are each +a floating point number. + +Numbers are created by numeric literals or as the result of built-in functions +and operators. Unadorned integer literals (including hex, octal and binary +numbers) yield integers. Numeric literals containing a decimal point or an +exponent sign yield floating point numbers. Appending ``j`` or ``J`` to a +numeric literal yields an imaginary number (a complex number with a zero real +part) which you can add to an integer or float to get a complex number with +real and imaginary parts. + +Supported operations +-------------------- + ++---------------------+-------------------------------------------------------+ +| Operation | Result | ++=====================+=======================================================+ +| ``x + y`` | sum of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x - y`` | difference of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x * y`` | product of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x / y`` | quotient of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x // y`` | floored quotient of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x % y`` | remainder of ``x / y`` | ++---------------------+-------------------------------------------------------+ +| ``-x`` | *x* negated | ++---------------------+-------------------------------------------------------+ +| ``+x`` | *x* unchanged | ++---------------------+-------------------------------------------------------+ +| ``abs(x)`` | absolute value or magnitude of *x* | ++---------------------+-------------------------------------------------------+ +| ``int(x)`` | *x* converted to integer | ++---------------------+-------------------------------------------------------+ +| ``float(x)`` | *x* converted to floating point | ++---------------------+-------------------------------------------------------+ +| ``complex(re, im)`` | a complex number with real part *re*, imaginary part | +| | *im*. *im* defaults to zero. | ++---------------------+-------------------------------------------------------+ +| ``divmod(x, y)`` | the pair ``(x // y, x % y)`` | ++---------------------+-------------------------------------------------------+ +| ``pow(x, y)`` | *x* to the power *y* | +| ``x ** y`` | | ++---------------------+-------------------------------------------------------+ + +.. note:: ``x // y`` also referred to as integer division. The resultant value + is a whole integer, through the result's type is not necessarily int. + The result is always rounded towards minus infinity: + ``1 // 2`` is ``0`` + +.. note:: ``float(x)`` also accepts the strings ``"nan"`` and ``"inf"`` with + an optional prefix "+" or "-" for :abbr:`NaN(Not a Number)` and + positive and negative infinity. + +Code examples +------------- + +.. code-block:: python + :caption: Integer numbers + :linenos: + + >>> x = 42 + >>> y = 24 + >>> a = int(42) + >>> b = int(42.24) + >>> # result is of the integer type + >>> result_add = x + y # for both int operands only + >>> result_sub = x - y # for both int operands only + >>> result_mul = x * y # for both int operands only + >>> result_div = x // y # for any numeric operands + +.. code-block:: python + :caption: Floating point numbers + :linenos: + + >>> x = 42. + >>> y = .24 + >>> z = 42.24 + >>> a = float(42) + >>> b = float(42.24) + >>> # result is of the float type + >>> result_add = x + y # for any float operand + >>> result_sub = x - y # for any float operand + >>> result_mul = x * y # for any float operand + >>> result_div = x / y # for any numeric operands + +Value comparisons +----------------- + +Numbers of built-in numeric types can be compared within and across their types +(with the restriction that complex numbers do not support order comparison). +Within the limits of the types involved, they compare mathematically correct +without loss of precision. + +The "not-a-number" values ``float("NaN")`` and ``decimal.Decimal('NaN')`` are +special. Any ordered comparison of a number to a not-a-number value is false. + +Sequence types +============== + +There are 3 basic sequence types: *lists*, *tuples*, and *range objects*. +Additional sequence types tailored for processing of binary data and text +strings are described in dedicated sections. + +Lists +----- + +Lists are mutable sequences, typically used to store collections of items. +They may be constructed in several ways: + +- using a pair of square brackets to denote the empty list: ``[]`` +- using square brackets, separating items with commas: ``[a]``, ``[a, b, c]`` +- using a list comprehension: ``[x for x in iterable]`` +- using the type constructor: ``list()`` or ``list(iterable)`` + +Tuples +------ + +Tuples are immutable sequences, typically used to store collections of data or +for cases where an immutable sequence of data is needed (such as allowing +storage in a ``set`` or ``dict`` instances). +They may be constructed in a number of ways: + +- using a pair of parentheses to denote the empty tuple: ``()`` +- using a trailing comma for a singleton tuple: ``a,`` or ``(a, b, c)`` +- separating items with commas: ``a, b, c`` or ``(a, b, c)`` +- using the type constructor: ``tuple()`` or ``tuple(iterable)`` + +Common operations +----------------- + ++----------------------+------------------------------------------------------+ +| Operation | Result | ++======================+======================================================+ +| ``x in s`` | ``True`` if an item of *s* equal to *x* | +| ``x not in s`` | ``False`` if an item of *s* equal to *x* | ++----------------------+------------------------------------------------------+ +| ``s + t`` | the concatenation of *s* and *t* | ++----------------------+------------------------------------------------------+ +| ``s * n`` | equivalent to adding *s* to itself *n* times | ++----------------------+------------------------------------------------------+ +| ``s[i]`` | *i*-th item of *s*, origin 0 | ++----------------------+------------------------------------------------------+ +| ``s[i:j]`` | slice of *s* from *i* to *j* with step *k*. any of | +| ``s[i:j:k]`` | these (or even all 3) may be omitted. | ++----------------------+------------------------------------------------------+ +| ``len(s)`` | length of *s* | ++----------------------+------------------------------------------------------+ +| ``min(s)`` | smallest item of *s* | ++----------------------+------------------------------------------------------+ +| ``max(s)`` | largest item of *s* | ++----------------------+------------------------------------------------------+ +| ``s.count(x)`` | total number of occurrences of *x* in *s* | ++----------------------+------------------------------------------------------+ +| ``s.index(x)`` | index of the first occurrence of *x* in *s* | +| ``s.index(x, i)`` | at or after index *i* and before index *j* | +| ``s.index(x, i, j)`` | | ++----------------------+------------------------------------------------------+ + +Value comparisons +----------------- + +Sequences can be compared only within each of their types, with the restriction +that ranges do not support order comparison. Equality comparison across these +types results in inequality, and ordering comparison across these types raises +``TypeError``. + +Sequences compare lexicographically using comparison of corresponding elements. +The built-in containers typically assume identical objects are equal to +themselves. Lexicographical comparison between built-in collections works as +follows: + +- For two collections to compare equal, they must be of the same type, have + the same length, and each pair of corresponding elements must compare equal. +- Collections that supports order comparison are ordered the same as their + first unequal elements. If corresponding element does not exist, the shorter + collection is ordered first. + +Mutable sequence types +---------------------- + ++--------------------+--------------------------------------------------------+ +| Operation | Result | ++====================+========================================================+ +| ``s[i] = x`` | item *i* of *s* is replaced by *x* | ++--------------------+--------------------------------------------------------+ +| ``s[i:j] = t`` | slice of *s* from *i* to *j* replaced by the contents | +| | of *t* | ++--------------------+--------------------------------------------------------+ +| ``del s[i:j]`` | same as ``s[i:j] = []`` | ++--------------------+--------------------------------------------------------+ +| ``s[i:j:k] = t`` | the elements of *s* are replaced by those of *t* [#]_ | ++--------------------+--------------------------------------------------------+ +| ``del s[i:j:k]`` | removes the elements of ``s[i:j:k]`` from the list | ++--------------------+--------------------------------------------------------+ +| ``s.append(x)`` | appends *x* to the end of the sequence; the same as | +| | ``s[len(s):len(s)] = [x]`` | ++--------------------+--------------------------------------------------------+ +| ``s.clear()`` | removes all items from *s* (``del s[:]``) [#py33]_ | ++--------------------+--------------------------------------------------------+ +| ``s.copy()`` | creates a shallow copy of *s* (``s[:]``) [#py33]_ | ++--------------------+--------------------------------------------------------+ +| ``s.extend(t)`` | extends *s* with the contents of *t* | +| ``s += t`` | | ++--------------------+--------------------------------------------------------+ +| ``s.insert(i, x)`` | inserts *x* into *s* at the index *i*; same as | +| | ``s[i:i] = [x]`` | ++--------------------+--------------------------------------------------------+ +| ``s.pop()``, | retrieves the item at *i* and also removes it from *s* | +| ``s.pop(i)`` | (if *i* is omitted - use the last one available index) | ++--------------------+--------------------------------------------------------+ +| ``s.remove(x)`` | remove the first item that is equal to *x* from *s* | ++--------------------+--------------------------------------------------------+ +| ``s.reverse()`` | reverses the items of *s* in place | ++--------------------+--------------------------------------------------------+ + +.. [#] *t* must have the same length as the slice it is replacing +.. [#py33] new in Python version 3.3 + +Text sequence type +================== + +String methods +-------------- + +Strings implement all of the common sequence operations, along with the +additional methods. + +.. todo: methods to be described + str.capitalize() + str.center() + str.count() + str.encode() + str.endswith(suffix) + str.expandtabs(tabsize=8) + str.find(sub) + str.format() + str.index(sub) + str.isalnum() + srt.isalpha() + str.isascii() + str.isdecimal() + str.isdigit() + str.islower() + str.isnumeric() + str.isprintable() + str.isspace() + str.istitle() + str.isupper() + str.join() + str.ljust() + str.lower() + str.lstrip() + str.replace() + str.rfind() + str.rindex() + str.rjust() + str.rsplit() + str.rstrip() + str.split() + str.splitlines() + str.startswith(prefix) + str.strip() + str.swapcase() + str.title() + str.upper() + +Value comparisons +----------------- + +Strings compare lexicographically using the numerical Unicode code points of +their characters. + +Set types +========= + +Value comparisons +----------------- + +Sets (instances of ``set`` or ``frozenset``) can be compared within and across +their types. They define order comparison operators to mean subset and superset +tests. Those relations do not define total ordering (e.g. two sets ``{1, 2}`` +and ``{2, 3}`` are not equal, nor subsets of one another, nor supersets of one +another). + +Mapping type +============ + +A mapping object maps hashable values to arbitrary objects. Mappings are +mutable objects. There is currently ony one standard mapping type, the +*dictionary*. In few words mappings are collections of keys and their values. + +A dictionary's keys are almost arbitrary values. Values that are not hashable +may not be used as keys. Values that compare equal (such as ``1``, ``1.0`` and +``True``) can be used interchangeably to index the same dictionary entry. + +Dictionaries can be created by several means: + +- Use braces to denote the empty dictionary: ``{}`` +- Use a comma-separated list of ``key: value`` pairs with braces: + ``{'first_name': 'Serhii', 'last_name': 'Horodilov', 'age': 34}`` +- Use a dict comprehension: ``{x: x ** 2 for x in range(10)}`` +- Use the type constructor: ``dict()``, ``dict([('key', 100)])``, + ``dict(key=100)`` + +Value comparisons +----------------- + +Instances of ``dict`` compare equal if and only if they have equal key-value +pairs. + +Order comparisons raise ``TypeError``. diff --git a/src/basics/syntax.txt b/src/basics/syntax.txt new file mode 100644 index 000000000..503ebd54b --- /dev/null +++ b/src/basics/syntax.txt @@ -0,0 +1,114 @@ +.. meta:: + :description: Python syntax + :author: Serhii Horodilov + :keywords: python, basics, syntax + +******************************************************************************* + Python Syntax +******************************************************************************* + +.. note:: As a natural language like English or Ukrainian has its own rules to + write down something, programming languages do. + This makes them programming **languages**. + +A programming language syntax is the set of rules and principles that govern +how code is written and structured in a given programming language. Syntax +encompasses the rules for writing statements, expressions, variables, data +types, control structures, and other constructs that make up the language. + +The syntax of a programming language defines how code is organized and +interpreted by a compiler or interpreter. It defines the rules for writing +valid statements and expressions that can be understood and executed by +the language's runtime system. + +A programming language's syntax is designed to be both readable and expressive, +allowing programmers to write code that is easy to understand and modify. +Syntax often influences the style and structure of code, as well as its +maintainability and performance. + +Different programming languages have different syntax, with some languages +being more concise and expressive than others. While syntax is an important +aspect of a programming language, it is only one of several factors that +determine its ease of use, flexibility, and suitability for different +programming tasks. + +In the case of Python, the language's syntax defines how code is written and +structured in a way that is consistent, readable, and easy to understand. +A general overview is provided below, no need to dive deep in this now. All of +the following is to be discussed during the course. So, some of the key aspects +of Python's syntax include: + +:Indentation: + Python uses whitespace, specifically indentation, to delimit blocks of + code, such as loops, conditionals, and functions. This means that + the indentation level of a line determines which block of code it belongs + to. + +:Statement structure: + Python statements are typically written on one line, with the end of + the line indicating the end of the statement. However, if a statement is + too long to fit on one line, it can be continued across multiple lines + using backslashes. + +:Variables: + In Python, variables are created automatically when a value is assigned to + them, and their type is inferred from the value. Variables can be assigned + values of different types, including integers, floats, strings, and more + complex data structures like lists and dictionaries. + +:Operators: + Python supports a wide range of operators for performing arithmetic, + comparison, and logical operations. These include arithmetic operators like + ``+``, ``-``, ``*``, and ``/``, as well as comparison operators like + ``<``, ``>``, ``==``, and ``!=``. + +:Control flow: + Python provides control flow statements like if, else, elif, for, and + while to control the flow of execution in a program. These statements are + used to make decisions, repeat code, or perform actions based on + conditions. + +:Functions: + In Python, functions are defined using the def keyword and can take + arguments and return values. The body of a function is defined using + a block of indented code. + +:Modules: + Python has a large library of modules that provide pre-written code for + a variety of tasks. Modules can be imported into a program using the import + statement. + +:Exception handling: + Python provides a way to handle errors and exceptions in a program using + the try, except, else, and finally keywords. These statements allow + a program to gracefully recover from errors and continue executing. + +In few words: + +.. code-block:: python + :caption: Input/Output example script + + # This is a comment. + # It is used to provide additional information or context in a script. + + # Getting input from the user + name = input("What is your name? ") # stores string input by the user + age = int(input("How old are you? ")) + is_student = input("Are you a student? (yes/no) ") + + # Converting user input to boolean + is_student = is_student.lower() == "yes" + + # Displaying values of variables + print("My name is", name) + print("I am", age, "years old") + print("I am a student:", is_student) + +The code snippet above demonstrates some basics abilities of Python to gather +data from the user, process it and print out back. Note the words starting with +a # (hash) symbol. This is a comment. Any sequence of characters after +the hash and till the line end are considered to be a comment. These are for +those people, who see the code and they are ignored by the interpreter. + +On the other hand each individual line is the instruction for the interpreter +to perform some action, like gather inputs, do math, store data in memory etc. diff --git a/src/basics/testing.txt b/src/basics/testing.txt new file mode 100644 index 000000000..ec4ca804a --- /dev/null +++ b/src/basics/testing.txt @@ -0,0 +1,16 @@ +.. meta:: + :description: Testing software in Python + :author: Serhii Horodilov + :keywords: python, testing, unittest, pytest + +.. todo + +.. attention:: Page is under construction + + .. figure:: /../assets/img/construction.svg + :figwidth: 250 + :align: center + +******************************************************************************* + Testing +******************************************************************************* diff --git a/src/basics/variables.txt b/src/basics/variables.txt new file mode 100644 index 000000000..96738f374 --- /dev/null +++ b/src/basics/variables.txt @@ -0,0 +1,57 @@ +.. meta:: + :description: Variables in programming + :author: Serhii Horodilov + :keywords: programming, basics, variables + +******************************************************************************* + Variables +******************************************************************************* + +In computer science a **variable** is a named storage location in memory that +can hold a value (*data*). The value stored in a variable can be changed or +accessed by the program during its execution. + +In Python, variables are created dynamically once a value is assigned to them. +This makes Python a dynamically typed language, which means that the data type +of a variable is inferred from the value assigned to it. So, you do not need +to declare a variable before using it, as in statically typed languages. + +The ability to create variables dynamically and infer their data type makes +Python code more concise and easier to read. However, it also requires careful +attention to variable naming and assignment to avoid unexpected behavior. + +In Python ``=`` (assignment operator) is used to set a value to some variable, +the portion on the left of the operator is a *variable name* and the portion +on the right is a *value* to assign to a variable. + +.. code-block:: python + :caption: Variable assignment in Python + + number_of_students = 10 + greeting = "hello" + pi = 3.14 + +.. code-block:: java + :caption: Variable assignment in Java + + int number_of_students = 10; + String greeting = "hello"; + double pi = 3.14; + +Naming +====== + +In Python there are several rules that describe how to name your variables. +Some of these are requirements and cannot be ignored, others are rather +recommended than required and can be omitted. For now note, that a variable +name **cannot**: + +- a language keyword (like ``pass``, ``def`` or ``class``) +- start with a number (e.g. ``123``, ``1_something``) +- contain special operators in it (``+``, ``-``, ``=`` etc.) +- contain white spaces + +Also here are some general recommendation on naming anything: + +- do not use built-in functions as a variable name (e.g. ``len = 42``) +- keep names meaningful (``x = 10`` vs ``number_of_student = 100``) diff --git a/src/conf.js b/src/conf.js new file mode 100644 index 000000000..71b3fbb11 --- /dev/null +++ b/src/conf.js @@ -0,0 +1,21 @@ +/** + * Webpack entry point + */ + +// add JS modules +// todo: GH-211 + +// add stylesheets to webpack bundle +// todo: GH-211 + +// add assets/resources to webpack bundle +import "../assets/icons/check-mark-svgrepo-com.svg" +import "../assets/icons/cross-mark-svgrepo-com.svg" +import "../assets/icons/moon-svgrepo-com.svg" +import "../assets/icons/sun-svgrepo-com.svg" + +// import and initialize impress.js presentation framework +import "../assets/impress.js/js/impress" +import "../assets/impress.js/css/impress-common.css" + +impress().init() diff --git a/src/conf.py b/src/conf.py new file mode 100644 index 000000000..44ca0bbe9 --- /dev/null +++ b/src/conf.py @@ -0,0 +1,80 @@ +# Sphinx documentation generator configuration + +import sys +from datetime import datetime +from pathlib import Path + +import toml + +# set up paths +BASE_DIR = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(BASE_DIR / "problem-sets" / "src")) + +# read project data from toml file +with open(BASE_DIR / "pyproject.toml") as io_buff: + project_data = toml.load(io_buff)["tool"]["poetry"] + +# project information +project = "Python Training Course" +project_copyright = \ + f"{datetime.now().year}, Python training course authors and contributors" +authors = " \\and ".join(project_data["authors"]) +version = project_data["version"] + +# general configuration +master_doc = root_doc = "index" +extensions = [ + "sphinx.ext.autodoc", + + "sphinxcontrib.inkscapeconverter", + "sphinxcontrib.bibtex", + "sphinxcontrib.mermaid", + "sphinx_rtd_theme", + "myst_parser", + "sphinx_copybutton", + "sphinx_reredirects", +] +source_suffix = { + ".txt": "restructuredtext", + ".rst": "restructuredtext", + ".md": "markdown", +} +needs_sphinx = "4.0" +exclude_patterns = [ + "**/_legacy/**", + "**/legacy/**", + "**/README.*", +] +suppress_warnings = [] + +# options for bibliography +bibtex_bibfiles = ["refs.bib"] +bibtex_reference_style = "label" + +# options for redirects +redirects = { + "appx/blog/spec": "../../spec/blog/index.html", + "appx/blog/index": "../../spec/blog/index.html", + "appx/libms/spec": "../../spec/libms/index.html", + "appx/libms/index": "../../spec/libms/index.html", +} + +# options for internationalization +gettext_compact = False +language = "en" +locale_dirs = ["_locales"] + +# options for HTML output +html_theme = "sphinx_rtd_theme" +html_favicon = str(BASE_DIR / "assets" / "favicon.ico") + +# options for LaTeX output +latex_doc = project.title().replace(" ", "") + ".tex" +latex_engine = "xelatex" +latex_documents = [ + (master_doc, latex_doc, project, authors, "manual", False), + # TODO: add separate documents to build +] +latex_appendices = [ + # TODO: review appendices list +] diff --git a/src/deploy/index.txt b/src/deploy/index.txt new file mode 100644 index 000000000..3c4d0446f --- /dev/null +++ b/src/deploy/index.txt @@ -0,0 +1,19 @@ +.. meta:: + :description: Deploy Python application + :author: Serhii Horodilov + :keywords: python, deployment, index + +.. todo + +.. attention:: Page is under construction + + .. figure:: /../assets/img/construction.svg + :figwidth: 250 + :align: center + +############################################################################### + Application Deployment +############################################################################### + +.. toctree:: + :name: deploy diff --git a/src/django/index.txt b/src/django/index.txt new file mode 100644 index 000000000..ae818a672 --- /dev/null +++ b/src/django/index.txt @@ -0,0 +1,19 @@ +.. meta:: + :description: Django web-framework + :author: Serhii Horodilov + :keywords: python, web, django, index + +.. todo + +.. attention:: Page is under construction + + .. figure:: /../assets/img/construction.svg + :figwidth: 250 + :align: center + +############################################################################### + Django Framework +############################################################################### + +.. toctree:: + :name: django diff --git a/src/index.txt b/src/index.txt new file mode 100644 index 000000000..25b428dca --- /dev/null +++ b/src/index.txt @@ -0,0 +1,40 @@ +.. master document + +############################################################################### + PYTHON TRAINING COURSE +############################################################################### + +.. toctree:: + :name: master + + intro/index + basics/index + rdbms/index + vcs/index + oop/index + django/index + linux/index + deploy/index + +.. only:: builder_html + + .. toctree:: + :name: appx + :caption: Additional materials + + appx/software_list + appx/code_edit + appx/env_path + appx/precedence + appx/printf + appx/postgres + appx/assignments + appx/conv_store + appx/wtk + spec/blog/index + spec/libms/index + +.. rubric:: References + +.. bibliography:: + :all: diff --git a/src/intro/index.txt b/src/intro/index.txt new file mode 100644 index 000000000..9a095e652 --- /dev/null +++ b/src/intro/index.txt @@ -0,0 +1,159 @@ + + There are a whole bunch of common programming tasks that are easy in + Python. For someone who is not yet a programmer, who wants to become + a programmer, for those people Python is particularly easy to get. + In Python, every symbol you type is essential. + + |guido| Guido van Rossum + +############################################################################### + Introduction to Python +############################################################################### + +|python| **Python** is a high-level, interpreted scripting language. +It was created in the early 1990s by Guido van Rossum at Stichting Mathematisch +Centrum (CWI, see https://www.cwi.nl/) in the Netherlands as a successor of +a language called ABC. Guido remains Python’s principal author, although it +includes many contributions from others. + +Python 2.0 was released in 2000, and the 2.x versions were the prevalent +releases until December 2008. At that time, the development team made +the decision to release version 3.0, which contained a few relatively small but +significant changes that were not backward compatible with the 2.x versions. +Python 2 and 3 are very similar, and some features of Python 3 have been +backported to Python 2. But in general, they remain not quite compatible. + +Both Python 2 and 3 have continued to be maintained and developed, with +periodic release updates for both. However, an official End Of Life date of +January 1, 2020 has been established for Python 2, after which time it will no +longer be maintained. + +Python is still maintained by a core development team at the Institute, and +Guido is still in charge, having been given the title of BDFL (Benevolent +Dictator For Life) by the Python community. The name Python, by the way, +derives not from the snake, but from the British comedy troupe Monty Python’s +Flying Circus, of which Guido was, and presumably still is, a fan. It is common +to find references to Monty Python sketches and movies scattered throughout +the Python documentation. + +Here are some significant facts about Python. + +.. rubric:: Python is popular + +Python has been growing in popularity over the last few years. +The 2018 Stack Overflow Developer Survey ranked Python as the 7th most popular +and the number one most wanted technology of the year. +By the end of Q-4 in 2022 Python is the **top** language on all GitHut metrics +:cite:`github:stats`. + +Here are some logos of unknown companies across the globe who uses Python: + +.. centered:: + |google| |facebook| |instagram| |spotify| |quora| |netflix| |dropbox| + |reddit| + +.. rubric:: Python is interpreted + +Many languages are compiled, meaning the source code you create needs to be +translated into machine code, the language of your computer’s processor, before +it can be run. Programs written in an interpreted language are passed straight +to an interpreter that runs them directly. + +This makes for a quicker development cycle because you just type in your code +and run it, without the intermediate compilation step. + +.. rubric:: Python is free + +The Python interpreter is developed under an OSI-approved open-source license, +making it free to install, use, and distribute, even for commercial purposes. + +.. rubric:: Python is portable + +Because Python code is interpreted and not compiled into native machine +instructions, code written for one platform will work on any other platform +that has the Python interpreter installed. +This is true of any interpreted language, not just Python. + +.. rubric:: Python is simple + +As programming languages go, Python is relatively uncluttered, +and the developers have deliberately kept it that way. A rough estimate of +the complexity of a language can be gleaned from the number of keywords or +reserved words in the language. These are words that are reserved for special +meaning by the compiler or interpreter because they designate specific built-in +functionality of the language. +There are only 35 :cite:`docs-python:keywords` in Python and they are: + +.. include:: /appx/_keywords.txt + +.. rubric:: Python is general purpose + +Python is everywhere. Talking more specific common scopes for Python developers +are :cite:`python-usage`: + +- Web Scraping Applications +- Data Science Solutions +- Machine Learning Applications +- Web Development +- Game Development +- Scientific and Numeric Applications +- Image Design and Graphic Design Applications +- Finance Fintech Platform +- Language Development +- Operating Systems + + +.. toctree:: + :caption: Contents + :name: intro + + install + interact + +.. static files within this document + +.. |python| image:: /../assets/img/python.svg + :width: 24 + +.. |google| image:: /../assets/img/google.svg + :width: 64 + :alt: Google + :target: https://about.google/ + +.. |facebook| image:: /../assets/img/facebook.svg + :width: 64 + :alt: Facebook + :target: https://www.facebook.com/ + +.. |instagram| image:: /../assets/img/instagram.svg + :width: 64 + :alt: Instagram + :target: https://about.instagram.com/ + +.. |spotify| image:: /../assets/img/spotify.svg + :width: 64 + :alt: Spotify + :target: https://support.spotify.com/us/article/what-is-spotify/ + +.. |quora| image:: /../assets/img/quora.svg + :width: 64 + :alt: Quora + :target: https://www.quora.com/about + +.. |netflix| image:: /../assets/img/netflix.svg + :width: 64 + :alt: Netflix + :target: https://about.netflix.com + +.. |dropbox| image:: /../assets/img/dropbox.svg + :width: 64 + :alt: Dropbox + :target: https://www.dropbox.com/about + +.. |reddit| image:: /../assets/img/reddit.svg + :width: 64 + :alt: Reddit + :target: https://www.redditinc.com/ + +.. |guido| image:: /../assets/img/guido-headshot-2019.jpg + :width: 100 diff --git a/src/intro/install.txt b/src/intro/install.txt new file mode 100644 index 000000000..359ba78ef --- /dev/null +++ b/src/intro/install.txt @@ -0,0 +1,136 @@ +******************************************************************************* + Install Python +******************************************************************************* + +The `Python wiki `_ +briefly describes the installation process. + +.. note:: To become a **true** professional, you need a special software called + :abbr:`IDE (Integrated Development Environment)` or at least a code + editor supporting syntax highlight. Refer :doc:`/appx/code_edit` for + more information. + +Linux +===== + +On most Linux distros Python comes pre-installed and/or all distro have it +available in their package repository (I haven't seen the one which does have). +The installation process depends on the distro, but here are some examples how +you can install it: + +.. code-block:: + :caption: Install Python + + # Debian / Ubuntu (and other distros that uses ``apt``) + apt install python3 python3-dev + + # ArchLinux + pacman -S python3 + + # RedHat, CentOS, Fedora + dnf install python3 python3-devel + + # Gentoo + # ... you should know what to do + +MacOS +===== + +For newer versions of MacOS Python is no longer included by default and you +will have to download and install it. + +The process is described at: `Using Python on a Mac`_. + +Briefly, you are invited to visit `downloads`_ and download the latest +stable version of Python. A "universal binary" build of Python runs natively on +Mac's new Intel and legacy PPC CPUs. + +After the installation you would get: + +- `Python 3.x` folder in `Applications` folder. + Standard development environment (`IDLE`) and `PythonLauncher` included. +- A framework `/Library/Frameworks/Python.framework` included libraries and + executables. + +Install from Homebrew +--------------------- + +Python for MacOS is available via Homebrew. You are to search `formulae`_ for +the latest available version. In general, it's as easy as: + +.. code-block:: shell + + brew install python@3.9 + +Windows +======= + +As for MacOS, here is the official documentation: `Using Python on Windows`_. + +For Windows' users the stable release is available from `downloads`_. Just +download the installer and proceed to common steps to install software. + +.. important:: It's recommended to **Add Python3.x to PATH**, this will avoid + problems at the beginning of your journey with Python + +.. figure:: https://docs.python.org/3/_images/win_installer.png + :width: 600 + :align: center + + Python installer first page + +Going on with **Install Now**: + +- Python will be installed to your user directory +- Python Launcher will be installed according to the option at the bottom + of the page + +Using **Customize installation** will perform an *all-users* installation. + +Removing the MAX_PATH Limitation +-------------------------------- + +Windows historically has limited path lengths to 260 characters. This meant +that paths longer than this would not resolve and errors would result. In the +latest versions of Windows, this limitation can be expanded to approximately +32,000 characters. This allows the open() function, the os module and most +other path functionality to accept and return paths longer than 260 characters. + +You will need PC administrator assistance to perform this action. + +Install from the Microsoft Store +-------------------------------- + +You can install from the Microsoft Store in two steps: + +#. Open the Microsoft Store app and search for ``Python`` + The result should look like: + + .. figure:: /../assets/img/microsoft-store-search.png + :align: center + + Microsoft Store - search results for "Python" + + Select ``Python 3.9`` or the higher available version. + +#. Click **GET** and wait until the installer is downloaded. The installation + process should run automatically. Follow the installer's instructions. + + .. figure:: /../assets/img/microsoft-store-get.png + :scale: 50% + :align: center + +Online Interpreters +=================== + +Installing or updating Python on your computer is the first step to becoming +a Python programmer :cite:`realpython:install-and-setup`. + +But if you cannot install Python at the moment for some reason, are can go +with online interpreters. `repl.it `_ provides the ability +to create and store Python scripts (they are called *repl* here) for free. + +.. _formulae: https://formulae.brew.sh/formula/ +.. _Using Python on Windows: https://docs.python.org/3/using/windows.html +.. _Using Python on a Mac: https://docs.python.org/3/using/mac.html +.. _downloads: https://www.python.org/downloads/ diff --git a/src/intro/interact.txt b/src/intro/interact.txt new file mode 100644 index 000000000..9b78646f2 --- /dev/null +++ b/src/intro/interact.txt @@ -0,0 +1,151 @@ +******************************************************************************* + Interacting with Python Interpreter +******************************************************************************* + + It’s time to write some Python code! + + :cite:t:`realpython:interact` + +In short there are three major ways to do something with Python: + +- interactive Python console +- running code from file [#]_ +- use online editors (like `repl.it `_) + +Using Python interpreter interactively +====================================== + +Using :abbr:`REPL (Read-Eval-Print-Loop)` environment is the most straight +forward way to start talking to Python. This simply means starting up the +interpreter and typing commands to it directly :cite:`realpython:interact`. +The interpreter: + +- Reads the command you enter +- Evaluates and executes it +- Prints the output (if any) back to the console +- Loops back and repeats + +Starting the interpreter +------------------------ + +In :abbr:`GUI (Graphic User Interface)` environment, it's likely that the +installer placed a shortcut on the desktop to launch the Python. + +For example in Windows the interpreter can be found in the **Start** menu +labeled **Python 3.x**: + +.. figure:: /../assets/img/start-menu-python.png + :align: center + + Windows start menu Python group + +.. hint:: In case you are getting error saying python is not installed, but you + are sure that the interpreter **is installed** - this means you have + no Python in your ``PATH``. Message may look like: + ``'python' is not recognized as an internal or external command`` / + ``python: command not found`` + + Refer :doc:`/appx/env_path` for problem solution. + +The alternative is to launch from a terminal window: + +- **Command Prompt** in Windows +- **Terminal** both in macOS and Linux + +.. figure:: /../assets/img/cmd-python.png + :align: center + + Start Python via Command Prompt + +.. figure:: /../assets/img/terminal-python.png + :align: center + + Start Python via Terminal + +Running code +------------ + +Put the Python code in interactive console and press enter to execute it. + +#. Ensure that the ``>>>`` prompt is displayed and the cursor is pointed after + it +#. Type the command ``print("Hello, World!")`` +#. Press enter + +.. code-block:: python + + print("Hello, World!") + +Your session should look like: + +:: + + print("Hello, World!") + "Hello, World!" + +If you've seen string "Hello, World!" printed back, congrats - you've run your +first program in Python. + +.. image:: /../assets/img/celebrate.svg + :width: 200 + :align: center + +Exiting the interpreter +----------------------- + +To exit the interactive console type "exit" and hit enter. + +.. code-block:: python + + exit() + +Running code from file +====================== + +A Python script is a reusable set of code. It is essentially a Python program - +a sequence of Python instructions - contained in a file. You can run the +program by specifying the name of the script file to the interpreter. + +Python scripts are just plain text, so you can edit them with any text editor. +If you have a favorite programmer’s editor that operates on text files, it +should be fine to use. Otherwise here are some options for the first time: + +- Windows: |npp| `Notepad++ `_ +- Linux: |geany| `Geany `_ + +Using whatever editor create a script file called ``hello.py`` and put the code +in it: + +.. code-block:: python + + print("Hello, World!") + +Save file keeping track on the directory you choose to save into. Now, open +the terminal or command prompt in this directory. + +.. hint:: In window you may open Command Prompt in the directory by typing + "cmd" to the address bar in explorer. + +In the terminal (or command prompt) type: + +.. code-block:: + + python hello.py + +Python will print string "Hello, World!". Your session should look like: + +:: + + python hello.py + Hello, World! + +.. footnotes + +.. [#] Files containing Python code are called *modules*. + +.. static files within document + +.. |npp| image:: /../assets/img/npp.svg + :width: 24 +.. |geany| image:: /../assets/img/geany.svg + :width: 24 diff --git a/src/linux/index.txt b/src/linux/index.txt new file mode 100644 index 000000000..2addd6581 --- /dev/null +++ b/src/linux/index.txt @@ -0,0 +1,19 @@ +.. meta:: + :description: Linux basics for Python developers + :author: Serhii Horodilov + :keywords: linux, basics, index + +.. todo + +.. attention:: Page is under construction + + .. figure:: /../assets/img/construction.svg + :figwidth: 250 + :align: center + +############################################################################### + Linux Basics +############################################################################### + +.. toctree:: + :name: linux diff --git a/src/oop/index.txt b/src/oop/index.txt new file mode 100644 index 000000000..c0f491cae --- /dev/null +++ b/src/oop/index.txt @@ -0,0 +1,20 @@ +.. meta:: + :description: Object-oriented programming in Python + :author: Serhii Horodilov + :keywords: python, oop, object-oriented programming, index + +############################################################################### + Object-Oriented Programming +############################################################################### + +Object-oriented programming (OOP) is one of the biggest and most important +subjects in all of programming. It is a method of structuring a program by +bundling related properties and behavior into individual objects. + +.. toctree:: + :name: oop + + intro + inheritance + patterns + solid diff --git a/src/oop/inheritance.txt b/src/oop/inheritance.txt new file mode 100644 index 000000000..1b90b6b18 --- /dev/null +++ b/src/oop/inheritance.txt @@ -0,0 +1,8 @@ +.. meta:: + :description: Inheritance in Python + :author: Serhii Horodilov + :keywords: python, inheritance, oop, object-oriented programming + +******************************************************************************* + Inheritance +******************************************************************************* diff --git a/src/oop/intro.txt b/src/oop/intro.txt new file mode 100644 index 000000000..7d065fa47 --- /dev/null +++ b/src/oop/intro.txt @@ -0,0 +1,351 @@ +.. meta:: + :description: Introduction to OOP + :author: Serhii Horodilov + :keywords: python, intro, introduction, oop, object-oriented programming + +******************************************************************************* + Classes and Objects +******************************************************************************* + +Conceptually, objects are like the components of a system. Think of a program +as a factory assembly line of sorts. At each step of the assembly line a system +component processes some material, ultimately transforming raw material into a +finished product. + +An object contains data, like the raw or preprocessed materials at each step on +an assembly line, and behavior, like the action each assembly line component +performs. + +Paradigm of Object-Oriented Programming +======================================= + +Object-oriented programming is a programming paradigm that provides a means of +structuring programs so that properties and behaviors are bundled together +into individual **objects**. + +For instance, an object could represent a person with **properties** like +a name, age, and address and **behaviors** such as walking, talking, running. +Or it could represent an email with properties like a recipient list, subject, +and body and behaviors like adding attachments and sending. + +Put another way, object-oriented programming is an approach for modeling +concrete, real-world things, like cars, as well as relations between things, +like companies and employees, students and teachers, and so on. OOP models +real-world entities as software objects that have some data associated with +them and can perform certain functions. + + +Object-Oriented Programming Concepts +==================================== + +So far, we can discuss the major concepts within the OOP paradigm. +And they are: + +:**encapsulation**: + + In OOP refers to the bundling of data with methods that operate that data, + or restricting of direct access to some of an object's components. + + .. note:: Encapsulation mechanism is often confused with *hiding*. It's not + actually that encapsulation does, but data hiding is available to + us due to the encapsulation. + +:**inheritance**: + + It's a mechanism of basing an object or a class upon another object + (prototype-based inheritance) or class (class-based inheritance), + retaining similar implementation. Also defined as deriving new classes + (subclasses) from existing ones such as a super class or base class and + forming them into a hierarchy of classes. + +:**polymorphism**: + + It's a provision of a single interface to entities of different types or + the use of a single symbol to represent multiple different types. + The concept is borrowed from a principle in biology where an organism or + species can have many different forms or stages. + +:**abstraction**: + + The process of removing or generalizing details or attributes in the study + of objects or systems to focus attention on details of greater importance, + it is similar in nature to the process of generalization. + The creation of abstract concept-objects by mirroring common features or + attributes of various non-abstract objects or systems of study is the + result of the process of abstraction. + +Define a Class in Python +======================== + +Primitive data-structures - like numbers, strings, lists etc. - are designed to +represent simple pieces of information, such as the cost of a product, the name +of a novel, or someone's favorite colors. What if you want to represent things +that are more complex? + +For example, let's say you want to track employees in an organization. You need +to store some basic information about each employee. Let's start from a very +beginning and try to represent an individual employee as a bunch of variables: + +.. code-block:: python + + first_name = "Serhii" + last_name = "Horodilov" + job_title = "Software Engineer" + +This approach has number of issues. Once it's required to store information +for more that one person, you are to create another set of variables: +``first_name_1``, ``first_name_2`` etc. The most terrifying issue is that these +portions of data have no relations to each other. Let's try to use ``list`` for +this purpose: + +.. code-block:: python + + serhii = ["Serhii", "Horodilov", "Software Engineer"] + vlad = ["Vladyslav", "Ponomaryov", "Release Manager"] + +There are number of issues with this approach as well. + +First, it can make larger code files more difficult to manage. If you reference +``serhii[0]`` several lines away from where ``serhii`` list is declared, will +you remember that the element with ``index 0`` is the person's name? Of course, +you can use ``dict`` structure, but... + +Second, it can introduce errors if not every person has the same number of +properties. + +A great way to make this type of code more manageable and more maintainable is +to use **classes**. + +All classes definitions in Python start with the keyword ``class``, which is +followed by the name of the class and a colon. Any code that is indented below +the class definition is considered the part of the class's body. + +.. code-block:: python + + class Person: + """Person class implementation""" + +Classes vs Instances +==================== + +Classes are used to create user-defined data structures. As it was mentioned +above OOP is about bundling data and behaviors. Classes define data structures; +each portion of data bundled within a classes is called **property** or +**field**. Classes also define functions called **methods**, which identify the +behavior and actions that an object created from the class can perform with its +data. + +.. code-block:: python + + class Person: + """Person class implementation""" + + first_name: str = "" + last_name: str = "" + job_title: str = "" + +A class is a blueprint for how something should be defined. It doesn't actually +contain any data. The person class above specifies that ``first_name`` and +``last_name`` properties are bundled within this class, but it don't actually +contain the person's name. + +While classes are blueprints, an **instance** is an **object** that is built +from a form has been filled out with information. Just like many people can +fill out the same form with their own unique information, many instances can +be created from a single class. + +.. code-block:: python + + serhii = Person() + serhii.first_name = "Serhii" + serhii.last_name = "Horodilov" + serhii.job_title = "Software Engineer" + + vlad = Person() + vlad.first_name = "Vladyslav" + vlad.last_name = "Ponomaryov" + vlad.job_title = "Release Manager" + +Methods +======= + +A function bundled within a class is called **method**. There are several ways +to define a class method. For now it's needed to know, that each method will +get a special argument at the first position. This argument is a reference to +an actual object. By convention, this argument is called ``self``. + +.. code-block:: python + + class Person: + """Person class implementation""" + + first_name: str = "" + last_name: str = "" + job_title: str = "" + + def get_fullname(self) -> str: + """Return a person's fullname""" + + return " ".join([self.first_name, self.last_name]) + +Initializing Instance with Data +------------------------------- + +There are several methods surrounded with double underscores (``__method__``) +that are called **dunder methods** or **magic methods**. We'll take a closer +look at these methods in the future. For now, it's ok to just one of these +special methods: ``__init__``. It initializes an instance with some specific +data. + +.. code-block:: python + + class Person: + """Person class implementation""" + + programming_language: str = "Python" + + def __init__( + self, first_name: str, last_name: str, job_title: str + ) -> None: + """Initialize a person instance""" + + self.first_name = first_name + self.last_name = last_name + self.job_title = job_title + + def get_fullname(self) -> str: + """Return a person's fullname""" + + return " ".join([self.first_name, self.last_name]) + + + serhii = Person("Serhii", "Horodilov", "Software Engineer") + vlad = Person("Vladyslav", "Ponomaryov", "Release Manager") + + serhii.first_name # Serhii + serhii.last_name # Horodilov + +Note, this call definition has a property called ``programming_language`` +defined outside of the ``__init__`` method. This property is shared across +all the class instances. + +Some More Details on ``self`` +----------------------------- + +``self`` is nothing except the convention. Instance methods will receive +a pointer to the instance itself as the first argument. In two words: it is +the actual object to call the method with. For example, the student class +defines attributes (student's name and scores) and methods available for +each student instance: complete the challenge or skip classes. While the +actual student instance contains data and methods related to the exact one +student. The ``self`` is a referer to this exact object. + +Data Hiding +=========== + +Many programming languages has *access modifiers* implemented. The Python has +also. + +.. image:: /../assets/img/wy_ban.jpg + :align: center + +"Private" instance variables that cannot be accessed except from inside an +object don't exist in Python :cite:`docs-python:private-variables`. It's +implemented as a convention-level. + +A name prefixed with an underscore (e.g. ``_spam``) should be treated as +a non-public part of the API (whether it is a function, a method or a data +member). These should not be used outside the class itself and can be changed +without notice. + +Since there is a valid use case for class-private members (namely to avoid name +clashes of names with names defined by subclasses), there is limited support +for such a mechanism, called *name mangling*. Any identifier with at least two +leading underscore (e.g. ``__spam``) is textually replaced with +``_classname__spam``, where ``_classname`` is the current class name with +leading underscore stripped. + +.. code-block:: python + + class Employee: + """Employee superclass example""" + + first_name: str = "" + last_name: str = "" + + _rate: int = 0 + __tax: float = 0.18 + + def _get_amount(self, hours: int) -> int: + return self._rate * hours + + def _get_tax(self, amount: int) -> int: + return int(round(self.__tax * amount, 0)) + + def get_balance(self, hours: int) -> int: + amount = self._get_amount(hours) + tax = self._get_tax(amount) + + return amount - tax + + def set_rate(self, rate: int) -> None: + self._rate = rate + + + class Employee10PercentTax(Employee): + _Employee__tax = 0.10 + + +Few Words about Inheritance +=========================== + +.. note:: Just in two words. This topic is discovered in the future articles. + +You can derive your classes from a super class. Derived classes are called +*sub classes* and the class used to inherit from is called *super class*. +Other terms are *child* class and *parent* class, but they are not common +(this is author's personal opinion). + +Just put a super class in parenthesis two inherit from it: + +.. code-block:: python + + class Dog(): + """Abstract dog implementation""" + + + class JackRussellTerrier(Dog): + """Jack russell terrier species implementation""" + +Few Words about Polymorphism +============================ + +You've already use this. The most simple explanation is **addition operator**. +For different types of data it would produce different types of output: + +.. code-block:: python + + ["a", "b", "c"] + ["d"] # the result is ["a", "b", "c", "d"] + "a" + "b" + "cd" # the result is "abcd" + +For example you may have various classes inherited from a base class, that +provides a common interface, but each derived class may implement the method +in its own way. + +.. code-block:: python + + class Animal: + """Abstract animal""" + + def voice(self): + pass + + + class Cat(Animal): + def voice(self): + print("MEOW") + + + class Dog(Animal): + def voice(self): + print("ARF) diff --git a/src/oop/patterns.txt b/src/oop/patterns.txt new file mode 100644 index 000000000..bc2cdda15 --- /dev/null +++ b/src/oop/patterns.txt @@ -0,0 +1,8 @@ +.. meta:: + :description: Design patterns + :author: Serhii Horodilov + :keywords: python, programming, design, patterns + +******************************************************************************* + Design Patterns +******************************************************************************* diff --git a/src/oop/solid.txt b/src/oop/solid.txt new file mode 100644 index 000000000..107b3d668 --- /dev/null +++ b/src/oop/solid.txt @@ -0,0 +1,10 @@ +.. meta:: + :description: SOLID principles + :author: Serhii Horodilov + :keywords: python, solid, single, responsibility, open, closed, liskov, + substitution, interface, segregation, dependency, inversion, + oop, object-oriented programming + +******************************************************************************* + SOLID Principles +******************************************************************************* diff --git a/src/rdbms/acid.txt b/src/rdbms/acid.txt new file mode 100644 index 000000000..9e80f10c2 --- /dev/null +++ b/src/rdbms/acid.txt @@ -0,0 +1,97 @@ +.. meta:: + :description: Database normalization + :author: Serhii Horodilov + :keywords: sql, db, database, acid, atomic, consistent, isolated, durable + +******************************************************************************* + ACID +******************************************************************************* + +:abbr:`ACID (Atomicity, Consistency, Isolation, Durability)` is a set of +properties of database transactions intended to guarantee data validity despite +errors, power failures, and other mishaps. In the context of databases, +a sequence of database operations that satisfies the ACID properties is called +a transaction. + +Atomicity +========= + +Transactions are often composed of multiple statements. Atomicity guarantees +that each transaction is treated as a single "unit", which either succeeds +completely, or fails completely: if any of the statements constituting +a transaction fails to complete, the entire transaction fails and the database +left unchanged. A guarantee of atomicity prevents updates to the database from +occurring only partially, which can cause greater problems, than rejecting the +whole series outright. + +As an example, there are few rows in an accounting table: + +.. table:: accounting + + +-----------+-----------------+---------+ + | person_id | name | balance | + +===========+=================+=========+ + | ... | ... | ... | + +-----------+-----------------+---------+ + | 529 | Dora Headstrong | $1,000 | + +-----------+-----------------+---------+ + | 402 | Toby Mugwort | $100 | + +-----------+-----------------+---------+ + | ... | ... | ... | + +-----------+-----------------+---------+ + +In case, Dora wants to transfer $100 to Toby, this can be split into +3 statements: + +- Check if $100 is available +- Deduct $100 from Dora's balance +- Add $100 to Toby's balance + +In case the 3rd statement fails, the data may stay as: + ++-----------+-----------------+---------+ +| 529 | Dora Headstrong | $900 | ++-----------+-----------------+---------+ +| 402 | Toby Mugwort | $100 | ++-----------+-----------------+---------+ + +Atomicity guarantee reverting database to an old state, in case any statement +fails. + +Consistency +=========== + +You can think "consistency" as "correctness". It ensures that a transaction +can only bring the database from one consistent state to another, preserving +database invariants: any data written to the database must be valid according +to all defined rules, including constraints, cascades, triggers, and any +combination of thereof. This prevents database corruption by an illegal +transaction. As example, referential integrity guarantees the primary key -- +foreign key relationship. + +Isolation +========= + +Transactions are often executed concurrently (e.g. multiple transactions +reading and writing to a table at the same time). Isolation ensures that +concurrent execution of transactions leaves the database in the state that +would have been obtained if the transactions were executed sequentially. +Isolation is the main goal of concurrency control; depending on the isolation +level used, the effects of an incomplete transaction might not be visible to +other transaction. + +For example, two persons have access to the same account having $1,000 on it, +and both persons tries to get the money out of this account. Dora tries to +get $1,000, and Toby tries to get $100. + +The sum of the money to get out of the account is $1,100, which cause an issue +of leaving negative amount of money. So, one of these transactions fails. + +Isolation ensures the concurrent executions are safe. + +Durability +========== + +The durability means once the transaction has been committed, the data must +be writen to non-volatile memory. So, even if a crash happens, or something +wrong with the database, the data must be where, and must not be corrupted. diff --git a/src/rdbms/datatypes.txt b/src/rdbms/datatypes.txt new file mode 100644 index 000000000..485695d50 --- /dev/null +++ b/src/rdbms/datatypes.txt @@ -0,0 +1,449 @@ +**************************** +PostgreSQL RDBMS: Data types +**************************** + +PostgreSQL has a rich set of data types available to users. + +Users can add new types to PostgreSQL using the ``CREATE TYPE`` command. + +.. literalinclude:: /../libms-db/libms.sql + :caption: Custom data type definition + :language: postgresql + :lines: 81-98 + ++-------------------------------+-------------------+------------------------------------------------------------------+ +| Name | Aliases | Description | ++===============================+===================+==================================================================+ +| ``bigint`` | ``int8`` | signed eight-byte integer | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``bigserial`` | ``serial8`` | auto incrementing eight-byte integer | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``bit`` | | fixed-length bit string | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``bit varying`` | ``varbit`` | variable-length bit string | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``boolean`` | ``bool`` | logical Boolean (true/false) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``box`` | | rectangular box on a plane | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``bytea`` | | binary data (“byte array”) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``character`` | ``char`` | fixed-length character string | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``character varying`` | ``varchar`` | variable-length character string | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``cidr`` | | IPv4 or IPv6 network address | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``circle`` | | circle on a plane | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``double precision`` | ``float8`` | double precision floating-point number (8 bytes) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``date`` | | calendar date (year, month, day) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``inet`` | | IPv4 or IPv6 host address | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``integer`` | ``int``, ``int4`` | signed four-byte integer | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``interval`` | | time span | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``json`` | | textual JSON data | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``jsonb`` | | binary JSON data, decomposed | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``line`` | | infinite line on a plane | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``lseg`` | | line segment on a plane | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``macaddr`` | | MAC (Media Access Control) address | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``macaddr8`` | | MAC (Media Access Control) address (EUI-64 format) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``money`` | | currency amount | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``numeric`` | ``decimal`` | exact numeric of selectable precision | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``path`` | | geometric path on a plane | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``pg_lsn`` | | PostgreSQL Log Sequence Number | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``pg_snapshot`` | | user-level transaction ID snapshot | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``point`` | | geometric point on a plane | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``polygon`` | | closed geometric path on a plane | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``real`` | ``float4`` | single precision floating-point number (4 bytes) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``smallint`` | ``int2`` | signed two-byte integer | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``smallserial`` | ``serial2`` | auto incrementing two-byte integer | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``serial`` | ``serial4`` | auto incrementing four-byte integer | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``text`` | | variable-length character string | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``time`` | | time of day (no time zone) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``time with time zone`` | ``timetz`` | time of day, including time zone | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``timestamp`` | | date and time (no time zone) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``timestamp with time zone`` | ``timestamptz`` | date and time, including time zone | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``tsquery`` | | text search query | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``tsvector`` | | text search document | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``txid_snapshot`` | | user-level transaction ID snapshot (deprecated; see pg_snapshot) | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``uuid`` | | universally unique identifier | ++-------------------------------+-------------------+------------------------------------------------------------------+ +| ``xml`` | | XML data | ++-------------------------------+-------------------+------------------------------------------------------------------+ + +Types casting +============= + +SQL is a strong type language. That is, every data item has an associated data +type which determines its behavior and allowed usage. PostgreSQL has an +extensible type system that is more general and flexible than other SQL +implementations. + +You can cast some types in place using ``::`` notation, like: + +.. code-block:: postgresql + + SELECT '42'::INT; + SELECT '24.5'::REAL; + SELECT 'today'::DATE; + SELECT 'tomorrow'::TIMESTAMP; + +Numeric types +============= + +Numeric types consist of two-, four-, and eight-byte integers, four- and +eight-byte floating-point numbers, and selectable-precision decimals. + +Type types ``smallint``, ``integer`` and ``bigint`` store whole numbers, that +is, numbers without fractional component, of various ranges. Attempts to store +values outside of the allowed range will result an error. + ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| Name | Storage Size | Description | Range | ++==================+==============+=================================+==================================================+ +| smallint | 2 bytes | small-range integer | -32768 to +32767 | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| integer | 4 bytes | typical choice for integer | -2147483648 to +2147483647 | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| bigint | 8 bytes | large-range integer | -9223372036854775808 to +9223372036854775807 | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| decimal | variable | user-specified precision, | up to 131072 digits before the decimal point; | +| | | exact | up to 16383 digits after the decimal point | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| numeric | variable | user-specified precision, | up to 131072 digits before the decimal point; | +| | | exact | up to 16383 digits after the decimal point | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| real | 4 bytes | variable-precision, | 6 decimal digits precision | +| | | inexact | | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| double precision | 8 bytes | variable-precision, | 15 decimal digits precision | +| | | inexact | | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| smallserial | 2 bytes | small auto incrementing integer | 1 to 32767 | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| serial | 4 bytes | auto incrementing integer | 1 to 2147483647 | ++------------------+--------------+---------------------------------+--------------------------------------------------+ +| bigserial | 8 bytes | large auto incrementing integer | 1 to 9223372036854775807 | ++------------------+--------------+---------------------------------+--------------------------------------------------+ + +Character types +=============== + ++-------------------------------------+----------------------------+ +| Name | Description | ++=====================================+============================+ +| ``character varying``, ``varchar`` | variable-length with limit | ++-------------------------------------+----------------------------+ +| ``character``, ``char``, ``bpchar`` | fixed-length, blank-padded | ++-------------------------------------+----------------------------+ +| ``bpchar`` without length specifier | variable unlimited length, | +| | blank-trimmed | ++-------------------------------------+----------------------------+ +| ``text`` | variable-unlimited length | ++-------------------------------------+----------------------------+ + +SQL defines two primary character types: ``character varying(n)`` and +``character(n)``, where ``n`` is a positive integer. Both of these types can +store string up to ``n`` characters length. An attempt to store a longer string +into a column of these types will result an error, unless all the excess +characters are all spaces, in which case the string will be truncated to +the maximum length. However, if one explicitly casts a value to ``varchar(n)`` +or ``char(n)``, then an over-length value will be truncated to ``n`` characters +without raising an error. If the string to be stored is shorter than the +declared length, value of type ``char`` will be space-padded; values of +``varchar`` will simply store the shorter string. + +In addition postgres provides the ``text`` type, which stores strings of any +length. + +If specified, the length ``n`` must be greater than 0 and cannot exceed +10,485,760. If ``character varying`` is used without length specifier, +the type accepts strings of any length. If ``bpchar`` lacks a length specifier, +it also accepts strings of any length, but trailing spaces are semantically +insignificant. If ``character`` lacks a specifier, it is equivalent to +``character(1)``. + +Date/Time types +=============== + +PostgreSQL supports the full set of SQL date and time types. Dates are counted +according to the Gregorian calendar, even in years before that calendar was +introduced. + +``time``, ``timestamp``, and ``interval`` accept an optional precision value, +which specifies the number of fractional digits retained in the seconds field. +By default, there is no explicit bound on precision. The allowed of this value +is from 0 to 6. + +The ``interval`` type has an additional option, which is to restrict the of +stored fields by writing one of these phrases: + +.. code-block:: + + YEAR + MONTH + DAY + HOUR + MINUTE + SECOND + YEAR TO MONTH + DAY TO HOUR + DAY TO MINUTE + DAY TO SECOND + HOUR TO MINUTE + HOUR TO SECOND + MINUTE TO SECOND + +Dates +----- + +Some possible inputs for the ``date`` type. + ++-----------------------+-----------------------------------------------------+ +| Example | Description | ++=======================+=====================================================+ +| ``1999-01-08`` | ISO 8601; January 8 in any mode | +| | (**recommended format**) | ++-----------------------+-----------------------------------------------------+ +| ``January 8, 1999`` | unambiguous in any date style input mode | ++-----------------------+-----------------------------------------------------+ +| ``1/8/1999`` | January 8 in MDY mode; August 1 in DMY mode | ++-----------------------+-----------------------------------------------------+ +| ``1/18/1999`` | January 18 in MDY mode; | +| | rejected in other modes | ++-----------------------+-----------------------------------------------------+ +| ``01/02/03`` | January 2, 2003 in MDY mode; | +| | February 1, 2003 in DMY mode; | +| | February 3, 2001 in YMD mode | ++-----------------------+-----------------------------------------------------+ +| ``1999-Jan-08`` | January 8 in any mode | +| ``Jan-08-1999`` | | +| ``08-Jan-1999`` | | ++-----------------------+-----------------------------------------------------+ +| ``99-Jan-08`` | January 8 in YMD mode, else error | ++-----------------------+-----------------------------------------------------+ +| ``08-Jan-99`` | January 8, except error in YMD mode | +| ``Jan-08-99`` | | ++-----------------------+-----------------------------------------------------+ +| ``19990108`` | ISO 8601; January 8, 1999 in any mode | +| ``990108`` | | ++-----------------------+-----------------------------------------------------+ +| ``1999.008`` | year and day of year | ++-----------------------+-----------------------------------------------------+ +| ``J2451187`` | Julian date | ++-----------------------+-----------------------------------------------------+ +| ``January 8, 99 BC`` | year 99 BC | ++-----------------------+-----------------------------------------------------+ + +Times +----- + +Some possible inputs for the ``time`` type. + ++-----------------------+-----------------------------------------------------+ +| Example | Description | ++=======================+=====================================================+ +| ``04:05:06.789`` | ISO 8601 | +| ``04:05:06`` | | +| ``04:05`` | | +| ``040506`` | | ++-----------------------+-----------------------------------------------------+ +| ``04:05 AM`` | same as 04:05; AM does not affect value | ++-----------------------+-----------------------------------------------------+ +| ``04:05 PM`` | same as 16:05; input hour must be <= 12 | ++-----------------------+-----------------------------------------------------+ +| ``04:05:06.789-8`` | ISO 8601, with time zone as UTC offset | +| ``04:05:06-08:00`` | | +| ``04:05-08:00`` | | +| ``040506-08`` | | ++-----------------------+-----------------------------------------------------+ +| ``040506+0730`` | ISO 8601, | +| | with fractional-hour time zone as UTC offset | ++-----------------------+-----------------------------------------------------+ +| ``040506+07:30:00`` | UTC offset specified to seconds | +| | (not allowed in ISO 8601) | ++-----------------------+-----------------------------------------------------+ +| ``04:05:06 PST`` | time zone specified by abbreviation | ++-----------------------+-----------------------------------------------------+ +| ``2003-04-12 04:05:06 | time zone specified by full | +| America/New_York`` | | ++-----------------------+-----------------------------------------------------+ + +.. rubric:: Time zone input + ++-----------------------+-----------------------------------------------------+ +| Example | Description | ++=======================+=====================================================+ +| ``PST`` | Abbreviation (for Pacific Standard Time) | ++-----------------------+-----------------------------------------------------+ +| ``America/New_York`` | Full time zone name | ++-----------------------+-----------------------------------------------------+ +| ``PST8PDT`` | POSIX-style time zone specification | ++-----------------------+-----------------------------------------------------+ +| ``-8:00:00`` | UTC offset for PST | ++-----------------------+-----------------------------------------------------+ +| ``-8:00`` | UTC offset for PST (ISO 8601 extended format) | ++-----------------------+-----------------------------------------------------+ +| ``-800`` | UTC offset for PST (ISO 8601 basic format) | ++-----------------------+-----------------------------------------------------+ +| ``-8`` | UTC offset for PST (ISO 8601 basic format) | ++-----------------------+-----------------------------------------------------+ +| ``zulu`` | Military abbreviation for UTC | ++-----------------------+-----------------------------------------------------+ +| ``z`` | Short form of zulu (also in ISO 8601) | ++-----------------------+-----------------------------------------------------+ + +Special date/time inputs +------------------------ + ++--------------+---------------+----------------------------------------------+ +| Input String | Valid Types | Description | ++==============+===============+==============================================+ +| epoch | ``date``, | 1970-01-01 00:00:00+00 | +| | ``timestamp`` | (Unix system time zero) | ++--------------+---------------+----------------------------------------------+ +| infinity | ``date``, | later than all other time stamps | +| | ``timestamp`` | | ++--------------+---------------+----------------------------------------------+ +| -infinity | ``date, | earlier than all other time stamps | +| | ``timestamp`` | | ++--------------+---------------+----------------------------------------------+ +| now | ``date``, | current transaction's start time | +| | ``time``, | | +| | ``timestamp`` | | ++--------------+---------------+----------------------------------------------+ +| today | ``date``, | midnight (00:00) today | +| | ``timestamp`` | | ++--------------+---------------+----------------------------------------------+ +| tomorrow | ``date``, | midnight (00:00) tomorrow | +| | ``timestamp`` | | ++--------------+---------------+----------------------------------------------+ +| yesterday | ``date``, | midnight (00:00) yesterday | +| | ``timestamp`` | | ++--------------+---------------+----------------------------------------------+ +| allballs | ``time`` | 00:00:00.00 UTC | ++--------------+---------------+----------------------------------------------+ + +Intervals +--------- + +``interval`` values can be written using the following verbose syntax: + +:: + + [@] quantity unit [quantity unit...] [direction] + +Intervals are useful when you need to move timestamp back in past or to +the future. + ++--------------+----------+ +| Abbreviation | Meaning | ++==============+==========+ +| Y | Years | ++--------------+----------+ +| M | Months | ++--------------+----------+ +| W | Weeks | ++--------------+----------+ +| D | Days | ++--------------+----------+ +| H | Hours | ++--------------+----------+ +| M | Minutes | ++--------------+----------+ +| S | Seconds | ++--------------+----------+ + +.. code-block:: postgresql + :caption: 7 days before yesterday + + SELECT 'yesterday'::TIMESTAMP + INTERVAL '7d ago'; + SELECT 'yesterday'::TIMESTAMP - INTERVAL '7' DAY; + +Boolean type +============ + +PostgreSQL provides the standard SQL type ``boolean``. The ``boolean`` type can +have several states: **true**, **false**, and a third state, **unknown**, which +is represented by the SQL ``NULL`` value. + +The datetype input function for type ``boolean`` accepts these strings +representations for the **true** state: + +- ``true`` +- ``yes`` +- ``on`` +- ``1`` + +and these representations for the **false** state: + +- ``false`` +- ``no`` +- ``off`` +- ``0`` + +The key words ``TRUE`` or ``FALSE`` are preferred (SQL-compliant) method for +writing Boolean constants in SQL queries. But, you can also use string +representations by following the generic string-literal constant syntax, for +example ``'yes'::boolean``. + +Enumerated types +================ + +Enumerated (enums) types are data types that comprise a static, ordered set of +values. They are equivalent to the ``enum`` types supported in a number of +programming languages. An example of an enum might be the days of the week, +or a set of status values for a piece of data. + +Enum types are created using the ``CREATE TYPE`` command; and once created, +the enum type can be used in table in function definitions, much like other +types: + +.. code-block:: postgresql + + CREATE TYPE WORK_DAY AS ENUM ('mon', 'tue', 'wed', 'thu', 'fri'); + CREATE TABLE work_log + ( + amount INTEGER, + date DATE, + day WORK_DAY + ); + +Ordering +-------- + +The ordering of the values in an enum type is the order in which the values +were listed when the type was created. All standard comparison operators and +related aggregate functions are supported for enums. However, remember that +each enumerated data type is separated and cannot be compared with other +enumerated types. diff --git a/src/rdbms/ddl.txt b/src/rdbms/ddl.txt new file mode 100644 index 000000000..b3841caa6 --- /dev/null +++ b/src/rdbms/ddl.txt @@ -0,0 +1,409 @@ +.. meta:: + :description: Data definition language, DDL + :author: Serhii Horodilov + :keywords: sql, db, database, ddl, create, alter, drop + +************************ +Data Definition Language +************************ + +:abbr:`DDL (Data Definition Language)` is a subset of SQL used for defining and +modifying the database structure. Understanding DDL is fundamental to working +with RDBMS. It allows you to define the structure of your data and make +necessary changes as your requirements evolve. + +- ``CREATE`` used to create new objects within a RDBMS +- ``ALTER`` used to modify existing objects +- ``DROP`` used to delete database objects +- ``TRUNCATE`` used to remove all records from a table + +.. contents:: + :local: + :depth: 2 + +Create objects +============== + +Creating database roles +----------------------- + +.. note:: + + SQLite is a small database in a single file and it doesn't implement + role based access to data. Any user who have access to DB file will + have access to data within the database as well. + +In RDBMS, roles are used to manage database permissions. They are an essential +part of database security and user management. + +In PostgreSQL a **role** is an entity that can own database objects and have +database privileges; a role can be considered a *user*, a *group*, or both +depending on how it is used. + +``CREATE ROLE`` statement defines a new database role. + +.. code-block:: postgresql + + CREATE ROLE name; + +This statement also can have options: + +.. code-block:: postgresql + + CREATE ROLE name WITH LOGIN SUPERUSER PASSWORD 'password'; + +Options clarify if a role can login to the database server, connect to specific +databases, create other roles etc. The full list of options is available in the +official postgres documentation. + +Creating databases +------------------ + +``CREATE DATABASE`` statement creates a new PostgreSQL database. To create +a database, you must be a superuser or have ``CREATEDB`` privilege. + +.. code-block:: postgresql + + CREATE DATABASE name; + +Databases within a PostgreSQL server have owners. By default a user who creates +a database is assigned as its owner. To specify another user as a database +owner options may be used: + +.. code-block:: postgresql + + CREATE DATABASE name OWNER role_name; + +There are lots of options for this statement available in the official postgres +documentation. + +Creating tables +--------------- + +To create a table, you use the aptly names ``CREATE TABLE`` command. +In this command you specify at least a name for the new table, the names of +the columns and the data type of each column. + +.. code-block:: postgresql + + CREATE TABLE table_name + ( + first_column INTEGER, + second_column NUMERIC, + third_column VARCHAR(32), + fourth_column TEXT + ); + +.. rubric:: Default value + +Constraints also can be applied for columns while creating a table. +In this section, only most notable constraints will be described. + +A column can be assigned a default value. When a new row is created and +no values are specified for some of the columns, those columns will be +filled with their respective default values. If no default value is declared +explicitly, the default value is the ``NULL`` value. This usually makes sense +because a null value can be considered to represent unknown data. + +In a table definition the default values are listed after the data type. + +.. code-block:: postgresql + + CREATE TABLE product + ( + product_no INTEGER, + name TEXT + price NUMERIC DEFAULT 9.99 + ); + +The default value can be an expression, which will be evaluated whenever +the default value is inserted (**not when the table is created**). +A common example are timestamps columns representing the time a record was +created and a "serial number" generator. + +.. code-block:: postgresql + + CREATE TABLE product + ( + product_no INTEGER DEFAULT nextval('product_no_seq'), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ); + +There is a shorthand to generate serial numbers: + +.. code-block:: postgresql + + product_no SERIAL + +.. rubric:: Generated Columns + +In case you need to calculate some column value based on other columns, you may +use generated columns. A generated column is a special column that is always +computed from other columns. Thus, it is for columns what a view is for tables. +There are two kinds of generated columns: stored and virtual. + +A stored generated column is computed when it is written (inserted or updated) +and occupies storage as if it were a normal column. A virtual generated column +occupies no storage and is computed when it is read. + +.. code-block:: postgresql + + CREATE TABLE person + ( + height_cm NUMERIC, + height_in NUMERIC GENERATED ALWAYS AS (height_cm / 2.54) STORED + ); + +.. note:: + + There are several restrictions applied to the definitions of generated + columns and tables involving generated columns (not all listed): + + - The generation expression can only use immutable functions and cannot + use sub-queries or reference anything other than the current row. + - The generation expression cannot reference another generated column. + - A generated column cannot have column default. + +.. rubric:: Constraints + +A check constraint is the most generic constraint type. It allows you to +specify that the value in a certain column must satisfy a Boolean (truth-value) +expression. + +.. code-block:: postgresql + + CREATE TABLE product + ( + product_no INTEGER, + name TEXT, + price NUMERIC CONSTRAINT price_positive CHECK (price > 0), + discounted_price NUMERIC CHECK (discounted_price > 0), + CHECK (price > discounted_price) + ); + +A not-null constraint simply specifies that a column must not assume the null +value. + +.. code-block:: postgresql + + CREATE TABLE product + ( + product_no SERIAL NOT NULL, + name TEXT NOT NULL CHECK(length(name) > 0) + ); + +Unique constraints ensure that the data contained in a column, or a group of +columns, is unique among all the rows in the table. + +.. code-block:: postgresql + + CREATE TABLE example + ( + a INTEGER, + b INTEGER UNIQUE, + c INTEGER, + UNIQUE (a, c) + ); + +.. rubric:: System columns + +Every table has several system columns that are implicitly defined by +the system. Therefore, these names cannot be used as names of user-defined +columns. These columns cannot be used in the generated columns (except +``tableoid``). Columns are: + +- ``tableoid`` +- ``xmin`` +- ``cmin`` +- ``xmax`` +- ``cmax`` +- ``ctid`` + +Modify objects +============== + +When you create a table and you realize that you made a mistake, or the +requirements of the application change, you can drop the table and create +it again. But this is not a convenient option if the table is already filled +with data, or if the table is referenced by other database objects. + +PostgreSQL provides a family of commands to make modifications to existing +tables. You can: + +- add columns +- remove columns +- add constraints +- remove constraints +- change default values +- change column data types +- rename columns +- rename tables + +All these actions are performed using the ``ALTER TABLE`` command. + +Adding a column +--------------- + +To add a column, use a command like: + +.. code-block:: postgresql + + ALTER TABLE tbl_name ADD COLUMN cln_name cln_type + +.. literalinclude:: /../libms-db/libms.sql + :language: postgresql + :lines: 57-69,102-104 + +.. note:: + + Constraints can be also defined on the column at the same time, using + general syntax. + + In fact all the options that can be applied to a column description in + ``CREATE TABLE`` can be used here. Keep in mind however that the default + value must satisfy the given constraints, or the ``ADD`` will fail. + +Adding a constraint +------------------- + +To add a constraint, the table constraint syntax is used. + +.. literalinclude:: /../libms-db/libms.sql + :language: postgresql + :start-after: -- label: ddl-borrow_request + :end-before: -- label: + +Other examples: + +.. code-block:: postgresql + + ALTER TABLE tbl_name + ADD CONSTRAINT cst_name UNIQUE (cln_name); + + ALTER TABLE tbl_name + ADD FOREIGN KEY (cln_name) REFERENCES tbl_another; + +To add a non-null constraint, which cannot be written as a table constraint, +use this syntax: + +.. code-block:: postgresql + + ALTER TABLE tbl_name + ALTER COLUMN cln_name SET NOT NULL; + +Changing a column's default value +--------------------------------- + +To set a new default for a column, use command like this: + +.. code-block:: postgresql + + ALTER TABLE tbl_name + ALTER COLUMN cln_name SET DEFAULT 0.0; + +To remove any default value, use: + +.. code-block:: postgresql + + ALTER TABLE tbl_name + ALTER COLUMN cln_name DROP DEFAULT; + +This is effectively the same as settings the default to ``NULL``. + +Changing a column's data type +----------------------------- + +To convert a column to a different data type, use a command like this: + +.. code-block:: postgresql + + ALTER TABLE tbl_name + ALTER COLUMN cln_name TYPE NUMERIC(10, 2); + +This will succeed only if each existing entry in the column can be converted +to the new type by an implicit cast. If a more complex conversion is needed, +you can add a ``USING`` clause that specifies how to compute the new values +from old ones. + +PostgreSQL will attempt to convert the column's default value (if any) to the +new type, as well as any constraint that involve the column. But these +conversions might fail, or might produce surprising results. It's often best +to drop any constraints on the column before altering its type, and then add +back suitably modified constraints afterwards. + +Renaming objects +---------------- + +To rename objects use ``RENAME`` command, like this: + +.. code-block:: postgresql + + ALTER TABLE tbl_name + RENAME COLUMN cln_name TO new_cln_name; + ALTER TABLE tbl_name + RENAME CONSTRAINT cst_name TO new_cst_name; + +To rename a table: + +.. code-block:: postgresql + + ALTER TABLE tbl_name + RENAME TO new_tbl_name; + +Remove objects +============== + +Removing tables +--------------- + +``DROP`` command is used to remove objects. + +.. code-block:: postgresql + + DROP TABLE tbl_name; + +Remember, attempting to remove a table that does not exist is an error. +Nevertheless, it is common in SQL script files to unconditionally try to +drop each table before creating it, ignoring any error message, so that +the script works whether or not the table exists. ``IF EXISTS`` variant +can be used to avoid the error message, but this is not standard SQL. + +.. literalinclude:: /../libms-db/libms.sql + :language: postgresql + :lines: 5-13 + +In case there are other objects referencing the object to drop ``CASCADE`` may +be used to also remove any referencing objects. + +Removing a column +----------------- + +To remove a column, use ``DROP`` command like this: + +.. code-block:: postgresql + + ALTER TABLE book + DROP COLUMN genre; + +Whatever data was in the column disappears. Table constraints involving +the column are dropped, too. However, if the column is referenced by a +foreign key constraint of another table, PostgreSQL will not silently drop +that constraint. You can authorize dropping everything that depends on +the column by adding ``CASCADE``: + +.. code-block:: postgresql + + ALTER TABLE tbl_name + DROP COLUMN cln_name CASCADE; + +Removing a constraint +--------------------- + +To remove a constraint you need to know its name. The **psql** command +``\d table_name`` can be helpful to get the detailed information on +a specific table, including all constraints' names assigned to it. + +.. code-block:: postgresql + + ALTER TABLE tbl_name + DROP CONSTRAINT cst_name; diff --git a/src/rdbms/dml.txt b/src/rdbms/dml.txt new file mode 100644 index 000000000..4cb6b4f71 --- /dev/null +++ b/src/rdbms/dml.txt @@ -0,0 +1,155 @@ +.. meta:: + :description: Data manipulation language, DML + :author: Serhii Horodilov + :keywords: sql, db, database, dml, insert, update, delete + +************************** +Data Manipulation Language +************************** + +:abbr:`DML (Data Manipulation Language)` is a subset of SQL used for adding, +updating, and deleting data within database tables. + +- ``SELECT`` used to query data from the database +- ``INSERT`` used to insert new data into a table +- ``UPDATE`` used to modify existing data +- ``DELETE`` used to remove data from a table + +.. contents:: + :local: + :depth: 2 + +Creating new records +==================== + +When a table is created, it contains no data. Inserting data will populate +a table with values. Data is inserted one row at a time. You can also insert +multiple rows with a single command. But it impossible to insert something +that is not a complete row. + +To create a new row use ``INSERT`` command. + +The data values are listed in the order in which the columns appear in +the table, separated by commas. This syntax has the drawback that you need to +know the order of the columns in the table. To avoid this you can also list +the columns explicitly. If you don't have values for all the columns, you can +omit some of them. In that case, the columns will be filled with their default +values. + +.. literalinclude:: /../libms-db/libms.sql + :caption: Create publisher table + :language: postgresql + :start-after: -- label: ddl-publisher + :end-before: -- label: + +.. literalinclude:: /../libms-db/libms.sql + :caption: Insert data to publisher table + :language: postgresql + :start-after: -- label: dml-publisher + :end-before: -- label: + +You can insert multiple rows in a single command. + +.. literalinclude:: /../libms-db/libms.sql + :caption: Create author table + :language: postgresql + :start-after: -- label: ddl-author + :end-before: -- label: + +.. literalinclude:: /../libms-db/libms.sql + :caption: Inserting multiple values at a time + :language: postgresql + :lines: 250-251,278-286,428-429 + +.. note:: + + There is a reference to the "publisher" table present below. Think of it + like placing the publisher information directly into "book" table for now. + +.. literalinclude:: /../libms-db/libms.sql + :caption: Create book table + :language: postgresql + :start-after: -- label: ddl-book + :end-before: -- label: + +.. literalinclude:: /../libms-db/libms.sql + :caption: Inserting records from file + :language: postgresql + :start-after: -- label: dml-book + :end-before: -- label: + +Modifying records +================= + +The modification of data that is already in the database is referred as +updating. To update the existing rows, use the ``UPDATE`` command. +This requires three pieces of information: + +#. The name of the table and column(s) to update +#. The new value of the column(s) +#. Which row(s) to update + +.. code-block:: postgresql + + UPDATE book SET language = 'uk' WHERE publisher = 3; + +This might cause zero, one, or many rows to be updated. The update syntax +is pretty straightforward. First the key word ``UPDATE`` followed by the table +name. Next is the key word ``SET`` followed by the column name, an equal sign, +and the new column value. The new column value can be any scalar expression, +not just a constant. More than one column can be updated at a time by listing +more than one assignment in the ``SET`` clause. + +.. important:: + + ``WHERE`` clause is optional, but it limits the rows affected by + ``UPDATE`` command. If there is no limitations all the records + within a table will be updated with new values. + + .. code-block:: postgresql + + UPDATE book SET language = 'uk'; + +Removing data +============= + +So far we have explained how to add data to tables and how to change data. +What remains to discuss how to remove data that is no longer needed. Just +as adding data is only possible in whole rows, you can only remove entire +rows from a table. + +You use ``DELETE`` command to remove rows; the syntax is very similar to +the ``UPDATE`` command. + +.. code-block:: postgresql + + DELETE FROM book WHERE publisher = 3; + +If you simply write: + +.. code-block:: postgresql + + DELETE FROM book; + +then all rows in the table will be deleted! + +Returning data from modified rows +================================= + +Sometimes it is useful to obtain data from modified rows while they are being +manipulated. The ``INSERT``, ``UPDATE`` and ``DELETE`` commands all have an +optional ``RETURNING`` clause that supports this. Use of ``RETURNING`` avoids +performing an extra database query to collect the data, and is especially +valuable when it would otherwise be difficult to identify the modified rows +reliably. + +.. code-block:: postgresql + + INSERT INTO author (first_name, last_name, country, birthdate) + VALUES ('Wendye', 'Rowbotham', 'Poland', '1932-12-16'), + ('Grannie', 'Kidner', 'United States', '1940-02-21'), + ('Godart', 'Van Driel', 'United Kingdom', '1980-01-02'), + ('Meara', 'Meenehan', 'United States', '1994-12-13') + RETURNING id; + +For example the query above provides the identifiers to new rows. diff --git a/src/rdbms/functions.txt b/src/rdbms/functions.txt new file mode 100644 index 000000000..c2aeb5dc1 --- /dev/null +++ b/src/rdbms/functions.txt @@ -0,0 +1,613 @@ +*********************** +Functions and operators +*********************** + +Logical and comparison operators +================================ + +The usual logical operators are still available: + +.. code-block:: sql + + boolean AND boolean -> boolean + boolean OR boolean -> boolean + NOT boolean -> boolean + +SQL uses a three-valued logic system with ``true``, ``false``, and ``null``, +which represents *unknown*. + +.. table:: Truth table + + +-----------+-----------+-------------+------------+-----------+ + | ``a`` | ``b`` | ``a AND b`` | ``a OR b`` | ``NOT a`` | + +===========+===========+=============+============+===========+ + | ``TRUE`` | ``TRUE`` | ``TRUE`` | ``TRUE`` | ``FALSE`` | + +-----------+-----------+-------------+------------+-----------+ + | ``TRUE`` | ``FALSE`` | ``FALSE`` | ``TRUE`` | ``FALSE`` | + +-----------+-----------+-------------+------------+-----------+ + | ``TRUE`` | ``NULL`` | ``NULL`` | ``TRUE`` | ``FALSE`` | + +-----------+-----------+-------------+------------+-----------+ + | ``FALSE`` | ``FALSE`` | ``FALSE`` | ``FALSE`` | ``TRUE`` | + +-----------+-----------+-------------+------------+-----------+ + | ``FALSE`` | ``NULL`` | ``FALSE`` | ``NULL`` | ``TRUE`` | + +-----------+-----------+-------------+------------+-----------+ + | ``NULL`` | ``NULL`` | ``NULL`` | ``NULL`` | ``NULL`` | + +-----------+-----------+-------------+------------+-----------+ + +The operators ``AND`` and ``OR`` are commutative, that is, you can switch +the left and right operands without affecting the result. However, it is not +guaranteed that the left operand is evaluated before the right operand. + +Comparison operators +-------------------- + +The usual comparison operators are available. + ++-------------------------------------+--------------------------+ +| Operator | Description | ++=====================================+==========================+ +| ``datatype < datatype -> boolean`` | Less than | ++-------------------------------------+--------------------------+ +| ``datatype > datatype -> boolean`` | Greater than | ++-------------------------------------+--------------------------+ +| ``datatype <= datatype -> boolean`` | Less than or equal to | ++-------------------------------------+--------------------------+ +| ``datatype >= datatype -> boolean`` | Greater than or equal to | ++-------------------------------------+--------------------------+ +| ``datatype = datatype -> boolean`` | Equal | ++-------------------------------------+--------------------------+ +| ``datatype <> datatype -> boolean`` | Not equal | ++-------------------------------------+--------------------------+ +| ``datatype != datatype -> boolean`` | Not equal | ++-------------------------------------+--------------------------+ + +Mathematical functions and operators +==================================== + +Mathematical operators and provided for many PostgreSQL types. + ++-----------------------------------------+-----------------------------------+ +| Operation | Description | ++=========================================+===================================+ +| ``numeric_type + numeric_type`` | Addition | ++-----------------------------------------+-----------------------------------+ +| ``+ numeric_type`` | Unary plus (no operation) | ++-----------------------------------------+-----------------------------------+ +| ``numeric_type - numeric_type`` | Subtraction | ++-----------------------------------------+-----------------------------------+ +| ``- numeric_type`` | Negation | ++-----------------------------------------+-----------------------------------+ +| ``numeric_type * numeric_type`` | Multiplication | ++-----------------------------------------+-----------------------------------+ +| ``numeric_type / numeric_type`` | Division (for integral types, | +| | division truncates the result | +| | towards zero) | ++-----------------------------------------+-----------------------------------+ +| ``numeric_type % numeric_type`` | Modulo (remainder); available for | +| | ``smallint``, ``integer``, | +| | ``bigint``, and ``numeric`` | ++-----------------------------------------+-----------------------------------+ +| ``numeric ^ numeric`` | Exponentiation | +| ``double precision ^ double precision`` | | ++-----------------------------------------+-----------------------------------+ +| ``|/ double precision`` | Square root | ++-----------------------------------------+-----------------------------------+ +| ``||/ double precision`` | Cube root | ++-----------------------------------------+-----------------------------------+ +| ``@ numeric_type`` | Absolute value | ++-----------------------------------------+-----------------------------------+ +| ``integral_type & integral_type`` | Bitwise AND | ++-----------------------------------------+-----------------------------------+ +| ``integral_type | integral_type`` | Bitwise OR | ++-----------------------------------------+-----------------------------------+ +| ``integral_type # integral_type`` | Bitwise exclusive OR | ++-----------------------------------------+-----------------------------------+ +| ``~ integral_type`` | Bitwise NOT | ++-----------------------------------------+-----------------------------------+ +| ``integral_type << integer`` | Bitwise shift left | ++-----------------------------------------+-----------------------------------+ +| ``integral_type >> integer`` | Bitwise shift right | ++-----------------------------------------+-----------------------------------+ + +String functions +================ + +*Strings* in this context include values of the types ``character``, ``text`` +and ``character varying``. + +.. function:: text || text -> text + + Concatenates the two strings. + + ``'Post' || 'greSQL' -> PostgreSQL`` + +.. function:: text || anynonarray -> text + anynonarray || text -> text + + Converts the non-string input to text, then concatenates the two strings. + (The non-string input cannot be of an array type, because that would create + ambiguity with the array ``||`` operators. If you want to concatenate + an array's text equivalent, cast it to text explicitly.) + + ``'Value: ' || 42 -> Value: 42`` + +.. function:: char_length ( text ) -> integer + character_length ( text ) -> integer + + Returns number of characters in the string. + + ``char_length('josé') -> 4`` + +.. function:: lower ( text ) -> text + + Converts the string to all lower case, according to the rules of + the database's locale. + + ``lower('TOM') -> tom`` + +.. function:: ltrim ( string text [, characters text ] ) -> text + + Removes the longest string containing only characters in characters + (a space by default) from the start of string. + + ``ltrim('zzzytest', 'xyz') -> test`` + +.. function:: rtrim ( string text [, characters text ] ) -> text + + Removes the longest string containing only characters in characters + (a space by default) from the end of string. + + ``rtrim('testxxzx', 'xyz') -> test`` + +.. function:: trim ( [ LEADING | TRAILING | BOTH ] [ characters text ] FROM string text ) -> text + + Removes the longest string containing only characters in characters + (a space by default) from the start, end, or both ends + (BOTH is the default) of string. + + ``trim(both 'xyz' from 'yxTomxx') -> Tom`` + +Pattern matching +---------------- + +There are three separate approaches to pattern matching provided by PostgreSQL: +the traditional ``LIKE`` operator, the most recent ``SIMILAR TO`` operator, and +POSIX-style regular expressions. + +This section will focus on ``LIKE`` operator only. + +:: + + string LIKE pattern [ESCAPE escape-character] + string NOT LIKE pattern [ESCAPE escape-character] + +The ``LIKE`` expression returns ``true`` if the ``string`` matches the supplied +``pattern`` (as expected, the ``NOT LIKE`` expression returns ``false`` if +``LIKE`` returns ``true``, and vice versa). + +If ``pattern`` does not contain percent signs or underscores, then the pattern +only represents the string itself; in than case ``LIKE`` acts like the equals +operator. An underscore (``_``) in ``pattern`` stands for (matches) any single +character; a percent sign (``%``) matches any sequence of zero or more +characters. + +Some examples: + +:: + + 'abc' LIKE 'abc' -- true + 'abc' LIKE 'a%' -- true + 'abc' LIKE '_b_' -- true + 'abc' LIKE 'c' -- false + +``LIKE`` patterns matching always covers the entire string. Therefore, if it's +desired to match a sequence anywhere within a string, the pattern must start +and end with a percent sign. + +To match a literal underscore or percent sing without matching other characters +the respective character in ``pattern`` must be preceded by the escape +character. The default escape character is backslash but a different one can be +selected by using the ``ESCAPE`` clause. To match the escape character itself, +write two escape characters. + +The key word ``ILIKE`` can be used instead of ``LIKE`` to make the match +case-insensitive according to the active locale. This is not in the SQL +standard but is a PostgreSQL extension. + +Date/Time functions and operators +================================= + +Extract +------- + +.. function:: exctract(field FROM source) + + The ``extract`` function retrieves subfields such as year or hour from + date/time value. The ``source`` must be a value expression of type + ``timestamp``, ``time``, or ``interval``. Expressions of type ``date`` + are cast to ``timestamp`` and can therefore be used as well. ``field`` is + an identifier or string that selects what field to extract from the source + value. The extract function returns value of type ``numeric``. + The following are valid field names: + + - ``centurty`` + - ``day`` + - ``decade`` + - ``dow`` + - ``doy`` + - ``epoch`` + - ``hour`` + - ``isodow`` + - ``isoyear`` + - ``julian`` + - ``microseconds`` + - ``millennium`` + - ``milliseconds`` + - ``minute`` + - ``month`` + - ``quarter`` + - ``second`` + - ``timezone`` + - ``timezone_hour`` + - ``timezone_minute`` + - ``week`` + - ``year`` + +The ``date_part`` function is modeled on the traditional Ingres equivalent to +the SQL-standard function ``extract``: + +.. function:: date_part('field', source) + +Current date/time +----------------- + +PostgreSQL provides a number of functions that return values related to the +current date and time. These SQL-standard functions all return values based on +the start time of the current transaction: + +.. function:: CURRENT_DATE +.. function:: CURRENT_TIME + CURRENT_TIME(precision) + + Deliver current time value with time zone. + + :precision: + An optional parameter, which causes the result to be rounded to that + many fractional digits in the second field. Without a precision, + the result is given to the full available precision. + +.. function:: CURRENT_TIMESTAMP + CURRENT_TIMESTAMP(precision) + + Deliver current timestamp value with time zone. + + :precision: + An optional parameter, which causes the result to be rounded to that + many fractional digits in the second field. Without a precision, + the result is given to the full available precision. + +.. function:: LOCALTIME + LOCALTIME(precision) + + Deliver current time value without time zone. + + :precision: + An optional parameter, which causes the result to be rounded to that + many fractional digits in the second field. Without a precision, + the result is given to the full available precision. + +.. function:: LOCALTIMESTAMP + LOCALTIMESTAMP(precision) + + Deliver current time value without time zone. + + :precision: + An optional parameter, which causes the result to be rounded to that + many fractional digits in the second field. Without a precision, + the result is given to the full available precision. + +Formatting functions +-------------------- + +.. todo: move to its own section + +The PostgreSQL formatting functions provide a powerful set of tools for +converting various data types (date/time, integer, floatting point, numeric) +to formatted strings and for converting from formatted strings to specific +data types. + +These functions all follow a common calling convention: the first argument is +the value to be formatted and the second argument is a template that defines +the output or input format. + +.. function:: to_char ( timestamp, text ) → text + to_char ( timestamp with time zone, text ) → text + + Converts time stamp to string according to the given format. + + ``to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS') → 05:31:12`` + +.. function:: to_char ( interval, text ) → text + + Converts interval to string according to the given format. + + ``to_char(interval '15h 2m 12s', 'HH24:MI:SS') → 15:02:12`` + +.. function:: to_char ( numeric_type, text ) → text + + Converts number to string according to the given format; + available for integer, bigint, numeric, real, double precision. + + - ``to_char(125, '999') → 125`` + - ``to_char(125.8::real, '999D9') → 125.8`` + - ``to_char(-125.8, '999D99S') → 125.80-`` + +.. function:: to_date ( text, text ) → date + + Converts string to date according to the given format. + + ``to_date('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05`` + +.. function:: to_number ( text, text ) → numeric + + Converts string to numeric according to the given format. + + ``to_number('12,454.8-', '99G999D9S') → -12454.8`` + +.. function:: to_timestamp ( text, text ) → timestamp with time zone + + Converts string to time stamp according to the given format. + + ``to_timestamp('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05 00:00:00-05`` + +.. todo: add template patterns for date/time formatting + +Conditional expressions +======================= + +CASE +---- + +The SQL ``CASE`` expression is a generic conditional expression, similar to +if/else statements in other programming languages. + +.. todo: add case example + +COALESCE +-------- + +The ``COALESCE`` function returns the first of its arguments that is not null. +Null is returned only if all arguments are null. It is often used to substitute +a default value for null values when data is retrieved for display: + +.. code-block:: postgresql + + SELECT COALESCE(description, short_description, '(none)') ... + +This returns ``description`` if it is not null, otherwise ``short_description`` +if it is not null, otherwise ``(none)``. + +Like the ``CASE`` expression, ``COALESCE`` only evaluates the arguments that +are needed to determine the result; that is, arguments to the right of the +first non-null argument are not evaluated. + +NULLIF +------ + +.. code-block:: postgresql + + NULLIF(value_1, value_2) + +The ``NULLIF`` function returns a null ``value_1`` equals ``value_2``; +otherwise it returns ``value_1``. This can be used to perform the inverse +operation of the ``COALESCE``. + +.. code-block:: postgresql + + SELECT NULLIF(value, '(none)') ... + +In the example above, if ``value`` is ``(none)``, null is returned, otherwise +the value of ``value`` is returned. + +The two arguments must be of comparable types. +To be specific, they are compared exactly as if you had written +``value_1 = value_2``, so there must be a suitable ``=`` operator available. + +The result has the same type as the first argument -- but there is a subtlety. +What is actual returned is the first argument of the implied ``=`` operator, +and in some cases that will have been promoted to match the second argument's +type. + +Aggregate functions +=================== + +*Aggregate functions* compute a single result from a set of input values. +There are lots of these, and different RDBMS implement different aggregation +functions. In this section, we will focus on the most wide spread and often +used aggregate functions only. + +The general schema of using is presented below: + +.. image:: /../assets/img/aggregate-function.svg + +Average value +------------- + +.. function:: avg ( smallint ) -> numeric + avg ( integer ) -> numeric + avg ( bigint ) -> numeric + avg ( numeric ) -> numeric + avg ( real ) -> double precision + avg ( double precision ) -> double precision + avg ( interval ) -> interval + + Computes the average (arithmetic mean) of all the non-null input values + within a group + +.. important:: + + SQLite implements ``avg`` function in a manner to return ``NULL`` if and + only if all the inputs are nulls. On the other hand PostgreSQL will raise + an error in this scenario. + +.. code-block:: postgresql + + SELECT extract(year from date) as year, + extract(month from date) as month, + ceil(avg(amount)) as avg + FROM revenue + GROUP BY month, year + ORDER BY year, month + LIMIT 5; + ++------+-------+-------+ +| year | month | avg | ++======+=======+=======+ +| 2013 | 11 | 7798 | ++------+-------+-------+ +| 2013 | 12 | 6709 | ++------+-------+-------+ +| 2014 | 1 | 6523 | ++------+-------+-------+ +| 2014 | 2 | 6832 | ++------+-------+-------+ +| 2014 | 3 | 10218 | ++------+-------+-------+ + +Count +----- + +.. function:: count ( * ) -> bigint + + Computes the number of input rows + +.. function:: count ( "any" ) -> bigint + :noindex: + + Computes the number of input rows in which the input value is not null + +.. code-block:: postgresql + + SELECT extract(year from date) as year, + extract(month from date) as month, + count(*) + FROM revenue + GROUP BY month, year + ORDER BY year, month + LIMIT 5; + ++------+-------+-------+ +| year | month | count | ++======+=======+=======+ +| 2013 | 11 | 5 | ++------+-------+-------+ +| 2013 | 12 | 7 | ++------+-------+-------+ +| 2014 | 1 | 5 | ++------+-------+-------+ +| 2014 | 2 | 8 | ++------+-------+-------+ +| 2014 | 3 | 5 | ++------+-------+-------+ + +Maximum value +------------- + +.. function:: max ( see text ) -> same as input type + + Computes the maximum of the non-null input values. + Available for any numeric, string, date/time or enum type. + +.. code-block:: postgresql + + SELECT extract(year from date) as year, + extract(month from date) as month, + max(amount) + FROM revenue + GROUP BY month, year + ORDER BY year, month + LIMIT 5; + ++------+-------+-------+ +| year | month | max | ++======+=======+=======+ +| 2013 | 11 | 12383 | ++------+-------+-------+ +| 2013 | 12 | 12264 | ++------+-------+-------+ +| 2014 | 1 | 8853 | ++------+-------+-------+ +| 2014 | 2 | 12919 | ++------+-------+-------+ +| 2014 | 3 | 14661 | ++------+-------+-------+ + +Minimum value +------------- + +.. function:: min ( see text ) -> same as input type + + Computes the minimum of the non-null inpout values. + Available for any numeric, string, date/time or enum type. + +.. code-block:: postgresql + + SELECT extract(year from date) as year, + extract(month from date) as month, + min(amount) + FROM revenue + GROUP BY month, year + ORDER BY year, month + LIMIT 5; + ++------+-------+------+ +| year | month | min | ++======+=======+======+ +| 2013 | 11 | 3365 | ++------+-------+------+ +| 2013 | 12 | 3564 | ++------+-------+------+ +| 2014 | 1 | 2636 | ++------+-------+------+ +| 2014 | 2 | 3442 | ++------+-------+------+ +| 2014 | 3 | 2654 | ++------+-------+------+ + +Sum of values +------------- + +.. function:: sum ( smallint ) -> bigint + sum ( integer ) -> bigint + sum ( bigint ) -> numeric + sum ( numeric ) -> numeric + sum ( real ) -> real + sum ( double precision ) -> double precision + sum ( interval ) -> interval + sum ( money ) -> money + + Computes the sum of the non-null values + +.. code-block:: postgresql + + SELECT extract(year from date) as year, + extract(month from date) as month, + sum(amount) + FROM revenue + GROUP BY month, year + ORDER BY year, month + LIMIT 5; + ++------+-------+-------+ +| year | month | sum | ++======+=======+=======+ +| 2013 | 11 | 38988 | ++------+-------+-------+ +| 2013 | 12 | 46958 | ++------+-------+-------+ +| 2014 | 1 | 32611 | ++------+-------+-------+ +| 2014 | 2 | 54652 | ++------+-------+-------+ +| 2014 | 3 | 51087 | ++------+-------+-------+ diff --git a/src/rdbms/index.txt b/src/rdbms/index.txt new file mode 100644 index 000000000..4a20ba034 --- /dev/null +++ b/src/rdbms/index.txt @@ -0,0 +1,72 @@ +.. meta:: + :description: Relational databases + :author: Serhii Horodilov + :keywords: sql, db, database, intro, introduction, index + +.. |postgres| image:: /../assets/img/postgres.svg + :width: 32 + :alt: PostgreSQL + :target: https://www.postgresql.org + +.. |mysql| image:: /../assets/img/mysql.svg + :width: 32 + :alt: SQLite + :target: https://www.sqlite.org + +.. |sqlite| image:: /../assets/img/sqlite.svg + :width: 32 + :alt: MySQL + :target: https://www.mysql.com + +############################################################################### + Relational Database +############################################################################### + +:abbr:`RDBMS (Relational Database Management System)` is a type of software +that helps users to create, update, manage, and access relational databases. +Relational databases organize data into tables, which consist of rows and +columns. Each column represents a specific attribute of the data, while each +row represents a specific instance of that data. + +RDBMS allow users to interact with the database using +:abbr:`SQL (Structured Query Language)`, which is a standard language for +managing and manipulating relational databases. SQL allows users to perform +a variety of operations on the database, including adding, updating, and +deleting data, as well as retrieving data based on specific criteria. + +RDBMS also provide a range of features to ensure data integrity, such as +enforcing data constraints, supporting transactions, and providing backup +and recovery capabilities. Additionally, RDBMS systems often provide tools +for managing the database, such as user interfaces for creating and modifying +tables and views, and monitoring tools for optimizing database performance. + +Security is a paramount aspect of managing databases. Even at the introductory +level, it's crucial to be aware of the basic security measures: + +- **Authentication and Authorization**: Ensuring that only authorized users + have access to the database. +- **Role-Based Access Control**: Assigning permissions based on roles within + the organization. +- **Data Encryption**: Protecting sensitive data both at rest and in transit. + +There are dozens of RDBMS, used in nowadays projects. But most widespread are: + +- |postgres| **PostgreSQL**: + A Powerful, open source object-relational database system. +- |sqlite| **SQLite**: + A C-library that implements a small, full featured SQL database engine. +- |mysql| **MySQL**: + A fast, multithread, multi-user, and robust SQL database server. + +.. toctree:: + :name: rdbms + + structure + datatypes + ddl + dml + query + relations + functions + acid + normalization diff --git a/src/rdbms/normalization.txt b/src/rdbms/normalization.txt new file mode 100644 index 000000000..6eded8ab4 --- /dev/null +++ b/src/rdbms/normalization.txt @@ -0,0 +1,401 @@ +.. meta:: + :description: Database normalization + :author: Serhii Horodilov + :keywords: sql, db, database, normalization + +******************************************************************************* + Database Normalization +******************************************************************************* + +Normalization is a process of organizing data in a database so that it is free +from redundancy and dependency. It helps to eliminate data inconsistencies and +anomalies, thereby improving data integrity. Normalization is a set of rules or +guidelines to design a database schema in such a way that it avoids data +duplication, data redundancy, and data inconsistency. + +The main purpose of database normalization is to avoid complexities, eliminate +duplicates, and organize data in a consistent way. Normalization reduces data +redundancy and dependency, making the database more efficient, flexible, and +scalable. It also helps in maintaining data consistency and accuracy, and +ensures that updates and deletions are properly handled. + +There are 6 + 3 **normal forms**, but this chapter focuses on the first 3 only, +since the commonest normal form you'll see out there is *3NF* (third normal +form). + +Normalized tables are: + +- Easier to understand +- Easier to enhance and extend +- Protected from: + + - insertion anomalies + - update anomalies + - deletion anomalies + +Anomalies +========= + +Insertion anomalies +------------------- + +There are circumstances in which certain facts cannot be recorded at all. +For example, each record in the "Faculty and Their Courses" relation might +contain a *Faculty ID*, *Faculty Name* and *Course Code*. Therefore, the +details of any faculty member who teaches at least one course can be recorded, +but a newly hired faculty member who has not yet been assigned to teach any +courses cannot be recorded, except by setting the course code to ``null``. + ++------------+----------------+-------------+ +| Faculty ID | Faculty Name | Course Code | ++============+================+=============+ +| 389 | Dr. Headstrong | ENG-206 | ++------------+----------------+-------------+ +| 407 | Dr. Mugwort | CMP-101 | ++------------+----------------+-------------+ +| 407 | Dr. Mugwort | CMP-201 | ++------------+----------------+-------------+ + ++------------+----------------+-------------+ +| Faculty ID | Faculty Name | Course Code | ++============+================+=============+ +| 389 | Dr. Newone | ??? | ++------------+----------------+-------------+ + +Update anomalies +---------------- + +The same information can be expressed on multiple rows; therefore updates to +the relation may result in logical inconsistencies. For example, each record +in an "Employees' Skills" relation might contain ah *Employee ID*, *Employee +Address*, and *Skill*; thus a charge of address for a particular employee may +need to be applied to multiple records (one for each skill). If the update is +only partially successful -- the employee's address is updated on some records +but not others -- then the relation is left in an inconsistent state. +Specifically, the relation provides conflicting answers to the question of what +this particular employee's address is. + ++-------------+-----------------------+-----------------+ +| Employee ID | Employee Address | Skill | ++=============+=======================+=================+ +| 426 | 230 Parkland Crescent | typing | ++-------------+-----------------------+-----------------+ +| 426 | 230 Parkland Crescent | shorthand | ++-------------+-----------------------+-----------------+ +| 529 | 158 Watkins Place | public speaking | ++-------------+-----------------------+-----------------+ +| 529 | 108 Church Street | carpentry | ++-------------+-----------------------+-----------------+ + +Deletion anomalies +------------------ + +Under certain circumstances, the deletion of data representing certain facts +necessitates the deletion of data representing completely different facts. +The "Faculty and Their Courses" relation described in the previous example +suffers from this type of anomaly, for if a faculty member temporary ceases to +be assigned to any courses, the last of the records on which that faculty +member appears must be deleted, effectively also deleting the faculty member, +unless the *Course Code* field is set to ``null``. + +First normal form (1NF) +======================= + +.. rubric:: Data example + +The table below represents players and their characters inventory, ordered by +their characters' levels. + ++------------+----------------------------------------------------------------+ +| username | inventory | ++============+================================================================+ +| prombery87 | 2 amulets, 3 rings | ++------------+----------------------------------------------------------------+ +| wheed1997 | 18 copper coins, 1 bow, 5 arrows | ++------------+----------------------------------------------------------------+ +| acen1999 | 1 sword, 1 shield, 4 rings | ++------------+----------------------------------------------------------------+ + +Requirements +------------ + +- Row order should not be used to convey information. +- Data types should not be mixed within the same column + (and the RDBMS won't let you do in anyway). +- Tables should have their primary keys. +- Repeating groups should be eliminated. + +Applying 1NF +------------ + +First of all, using the rows order to represent the information violates 1NF. +This can be easily fixed by adding additional column *level* to store the info +about the character's level. From this, the ordered sequences can be fetched +by using the query: + +.. code-block:: sql + + SELECT username FROM player ORDER BY level; + +The second rule is **do not** mix data types within the same column. +As example, the characters' level might be described as follows: + ++------------+----------------------------------+-----------------------------+ +| username | inventory | level | ++============+==================================+=============================+ +| prombery87 | 2 amulets, 3 rings | 9 | ++------------+----------------------------------+-----------------------------+ +| wheed1997 | 18 copper coins, 1 bow, 5 arrows | almost 8 | ++------------+----------------------------------+-----------------------------+ +| acen1999 | 1 sword, 1 shield, 4 rings | 5.5 | ++------------+----------------------------------+-----------------------------+ + +The data types are mixed in *level* column, which violates 1NF; and normally, +RDBMS won't let you do this. + +The tables without a **primary key** violates 1NF as well. *username* field +may be used as **PK** for the players relation example. This would prevent +the data duplication, like having both ``wheed1997`` players at level 7 and 8 +at the same time, which makes no sense. + ++------------+----------------------------------+-----------------------------+ +| username | inventory | level | ++============+==================================+=============================+ +| prombery87 | 2 amulets, 3 rings | 9 | ++------------+----------------------------------+-----------------------------+ +| wheed1997 | 18 copper coins, 1 bow, 5 arrows | 8 | ++------------+----------------------------------+-----------------------------+ +| wheed1997 | 18 copper coins, 1 bow, 5 arrows | 7 | ++------------+----------------------------------+-----------------------------+ +| acen1999 | 1 sword, 1 shield, 4 rings | 5 | ++------------+----------------------------------+-----------------------------+ + +At last, *inventory* column contains repeating groups of data (also called +*non-atomic data*), which violates 1NF. To normalize the table, it should be +altered in a way, to represent only one inventory item per row. + ++------------+-------------+---------------+ +| player_id | item_type | item_quantity | ++============+=============+===============+ +| prombery87 | amulet | 2 | ++------------+-------------+---------------+ +| prombery87 | ring | 3 | ++------------+-------------+---------------+ +| wheed1997 | copper coin | 18 | ++------------+-------------+---------------+ +| wheed1997 | bow | 1 | ++------------+-------------+---------------+ +| wheed1997 | arrow | 5 | ++------------+-------------+---------------+ +| acen1999 | sword | 1 | ++------------+-------------+---------------+ +| acen1999 | shield | 1 | ++------------+-------------+---------------+ +| acen1999 | ring | 4 | ++------------+-------------+---------------+ + +The primary key for this table is the combination of *player_id* and +*item_type* -- a composite primary key. + +Second normal form (2NF) +======================== + +Here, 2NF starts. For example, let's bring back *level* info to the table, +representing players and theirs inventory. + ++------------+-------------+---------------+--------------+ +| player_id | item_type | item_quantity | player_level | ++============+=============+===============+==============+ +| prombery87 | amulet | 2 | 9 | ++------------+-------------+---------------+--------------+ +| prombery87 | ring | 3 | 9 | ++------------+-------------+---------------+--------------+ +| wheed1997 | copper coin | 18 | 6 | ++------------+-------------+---------------+--------------+ +| wheed1997 | bow | 1 | 6 | ++------------+-------------+---------------+--------------+ +| wheed1997 | arrow | 5 | 6 | ++------------+-------------+---------------+--------------+ +| acen1999 | sword | 1 | 3 | ++------------+-------------+---------------+--------------+ +| acen1999 | shield | 1 | 3 | ++------------+-------------+---------------+--------------+ +| acen1999 | ring | 4 | 3 | ++------------+-------------+---------------+--------------+ + +The player's *level* should be duplicated for each row. This table design +keeps the doors open for **insertion**, **update** and **deletion** anomalies. + +Requirements +------------ + +- Each non-key attribute must depend on the entire primary key + +Applying 2NF +------------ + +The 2NF is all about "how non-key columns related to the primary key". +The example above has *non-key attributes* (which is another term for +the "non-key columns") are: *item_quantity* and *player_level*. + +The relations between the *primary key* and *non-key attributes* can be +described as: + +:: + + { player_id, item_type } -> { item_quantity } + { player_id } -> { player_level } + +The *item_quantity* column depends on the *player_id* and *item_type* columns, +which creates a 1-to-1 dependency for this column on the entire primary key. +This means, there is no way to place different values in the *item_quantity* +column for the same primary key. + +But, the *player_level* column depends on the *player_id* only. It's a problem, +because the *player_id* is not the primary key, but a part of a primary key. +This violates the 2NF, and what's why the table is vulnerable to the problems. + +The **player** is the important concept for representing the data. +So, it's the best solution to store player related data in a separate table. + +.. table:: player + + +------------+--------------+ + | player_id | player_level | + +============+==============+ + | prombery87 | 9 | + +------------+--------------+ + | wheed1997 | 6 | + +------------+--------------+ + | acen1999 | 3 | + +------------+--------------+ + +.. table:: player_inventory + + +------------+-------------+---------------+ + | player_id | item_type | item_quantity | + +============+=============+===============+ + | prombery87 | amulet | 2 | + +------------+-------------+---------------+ + | prombery87 | ring | 3 | + +------------+-------------+---------------+ + | wheed1997 | copper coin | 18 | + +------------+-------------+---------------+ + | wheed1997 | bow | 1 | + +------------+-------------+---------------+ + | wheed1997 | arrow | 5 | + +------------+-------------+---------------+ + | acen1999 | sword | 1 | + +------------+-------------+---------------+ + | acen1999 | shield | 1 | + +------------+-------------+---------------+ + | acen1999 | ring | 4 | + +------------+-------------+---------------+ + +Third normal form (3NF) +======================= + +Let's assume, the player table is extended with the *player_rating* column, +which describes the players' skills as "beginner", "intermediate", or +"advanced". And let's assume, the skills are arranged in some like: + ++--------------+-----------+--------------+-----------+ +| Skill Level | Beginner | Intermediate | Advanced | ++--------------+---+---+---+----+----+----+---+---+---+ +| Player Level | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ++--------------+---+---+---+----+----+----+---+---+---+ + +.. table:: player + + +------------+--------------+---------------+ + | player_id | player_level | player_rating | + +============+==============+===============+ + | prombery87 | 9 | advanced | + +------------+--------------+---------------+ + | wheed1997 | 6 | intermediate | + +------------+--------------+---------------+ + | acen1999 | 3 | beginner | + +------------+--------------+---------------+ + +The *non-key attributes* dependencies can be described as follows: + +:: + + { player_id } -> { player_level } + { player_id } -> { player_level } -> { player_skill } + +The *player_rating* does not depend on the primary key, but it depends on +the *player_level* attribute, which is dependent on the primary key. These +type of dependencies is called **transitive dependency**. Having these in +a table opens a way for having data in an inconsistent form. E.g. let's assume +player "acen1999" have increase their level to 4, but something went wrong, +and *player_rating* has not been updated. + ++------------+--------------+---------------+ +| acen1999 | 4 | beginner | ++------------+--------------+---------------+ + +Requirements +------------ + +- Every non-key attribute in a table should depend on the key, the whole key, + and nothing but the key (no transitive dependency). + +.. note:: + + **Boyce-Codd normal form** + + :abbr:`BCNF (Boyce-Codd Normal Form)` is the stronger version of 3NF. + It also is called as 3.5NF (three-and-a-half normal form). + + **Every attribute** in a table should depend on the key, the whole key, + and nothing but the key. + +Applying 3NF +------------ + +Introducing the "player_rating_levels" will fix the problem. + +.. table:: player + + +------------+--------------+ + | player_id | player_level | + +============+==============+ + | prombery87 | 9 | + +------------+--------------+ + | wheed1997 | 6 | + +------------+--------------+ + | acen1999 | 3 | + +------------+--------------+ + +.. table:: player_rating_levels + + +--------------+---------------+ + | player_level | player_rating | + +==============+===============+ + | 9 | advanced | + +--------------+---------------+ + | 8 | advanced | + +--------------+---------------+ + | 7 | advanced | + +--------------+---------------+ + | 6 | intermediate | + +--------------+---------------+ + | 5 | intermediate | + +--------------+---------------+ + | 4 | intermediate | + +--------------+---------------+ + | 3 | beginner | + +--------------+---------------+ + | 2 | beginner | + +--------------+---------------+ + | 1 | beginner | + +--------------+---------------+ + +Conclusion +========== + +Each next normal form includes all the requirements for the previous one. + +Following the rules above will lead you to having a fully normalized tables +in 99% of time. diff --git a/src/rdbms/presentations/normalization.html b/src/rdbms/presentations/normalization.html new file mode 100644 index 000000000..f854adf09 --- /dev/null +++ b/src/rdbms/presentations/normalization.html @@ -0,0 +1,681 @@ + + + + + + + + + Database Normalization + + + + + + +
+

+ Your browser doesn't support the features required by impress.js, so you are presented with + a simplified + version of this presentation. +

+

+ For the best experience please use the latest Chrome, Safari or Firefox browser. +

+
+ +
+
+ +
+

Database Normalization

+
+
+

+ + Normalization is a process of organizing data in a database so that it is free from redundancy and + dependency. + It helps to eliminate data inconsistencies and anomalies, thereby improving data integrity.
+ Normalization is a set of rules or guidelines to design a database schema in such a way that it avoids + data + duplication, data redundancy, and data inconsistency. +
+

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877.75Advanced1 sword, 4 rings
wheed1997Almost 7Intermediate18 copper coins
+
+
+
+

Insertion anomalies

+

+ + There are circumstances in which certain facts cannot be recorded at all. + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877.75Advanced1 sword, 4 rings
wheed1997Almost 7Intermediate18 copper coins
acen19971Beginner
+
+
+ When a new player acen1999 join the game, they have nothing in their inventory. + Therefore, the details of any player who have at least one item can be recorded, but a newly game member + who has no items cannot be recorded, except by setting the inventory to null. +
+
+
+

Update anomalies

+

+ + The same information can be expressed on multiple rows;
+ therefore updates to the relation may result in logical inconsistencies. +
+

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877.75Advanced1 sword, 4 rings
acen1997 + 1 + 1 + Beginner1 robe, 1 wizard hat
wheed1997Almost 7Intermediate18 copper coins
acen1997 + 2 + 1 + Beginner1 robe, 1 wizard hat
+
+
+ The same information can be expressed on multiple rows, therefore updates to the relation may result in + logical inconsistencies. If the wheed1997 increase their level, when the + rank should be updated as well. But if the update is only partial successful, then the + relation is left in an inconsistent state. Specifically. the relation provides conflicting information + on "level -- rank" for "wheed1997" player, and on "inventory" and "level" for "acen1999". +
+
+
+

Deletion anomalies

+

+ + Under certain circumstances, the deletion of data representing certain facts + necessitates the deletion of data representing completely different facts. + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877.75Advanced1 sword, 4 rings
wheed1997Almost 7Intermediate18 copper coins
acen19971Beginner1 robe, 1 wizard hat
+
+
+ If a player looses their items completely, the record must be deleted, unless the inventory + field is set to null. This leads to the loosing all other information about a player. +
+
+
+

+ First
+ normal form +

+
+

Requirements

+
    +
  • + Row order should not be used to convey information. +
  • +
  • + Data types should not be mixed within the same column.
    + (and the RDBMS won't let you do it anyway) +
  • +
  • + Tables should have their primary keys. +
  • +
  • + Repeating groups should be eliminated. +
  • +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery87 + 7.75 + 7 + Advanced1 sword, 4 rings
wheed1997 + + 6 + Intermediate18 copper coins
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877Advanced + 1 sword, 4 rings + 1 sword +
wheed19976Intermediate18 copper coins
prombery877Advanced4 rings
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Inventory
namelevelratingitem_typeitem_quantity
prombery877Advancedsword1
prombery877Advancedring4
wheed19976Intermediatecopper coin18
acen19971Beginnerrobe1
acen19971Beginnerwizard hat1
+
+
+
    +
  • + icon-pass + Row order should not be used to convey information. +
  • +
  • + icon-pass + Data types should not be mixed within the same column. +
  • +
  • + icon-pass + Tables should have their primary keys. +
  • +
  • + icon-pass + Repeating groups should be eliminated. +
  • +
+
+
+
+

+ Second
+ normal form +

+
+

Requirements

+
    +
  • + Each non-key attribute must depend on the entire primary key. +
  • +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Inventory
namelevelratingitem_typeitem_quantity
prombery877Advancedsword1
prombery877Advancedring4
wheed19976Intermediatecopper coin18
acen19971Beginnerrobe1
acen19971Beginnerwizard hat1
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Inventory
nameitem_typeitem_quantity
prombery87sword1
prombery87ring4
wheed1997copper coin18
acen1997robe1
acen1997wizard hat1
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Level
namelevelrating
prombery877Advanced
wheed19976Intermediate
acen19971Beginner
+
+
+
    +
  • + icon-pass + Each non-key attribute must depend on the entire primary key. +
  • +
+
+
+
+

+ Third
+ normal form +

+
+

Requirements

+
    +
  • + Every non-key attribute in a table should depend on the key, the whole key, and nothing but the key. +
  • +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Level
namelevelrating
prombery877Advanced
wheed19976Intermediate
acen19971Beginner
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
Player Level
namelevel
prombery877
wheed19976
acen19971
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level Ranking
levelrating
1Beginner
2Beginner
3Beginner
4Intermediate
5Intermediate
6Intermediate
7Advanced
8Advanced
9Advanced
+
+
+
    +
  • + icon-pass + Every non-key attribute in a table should depend on the key, the whole key, and nothing but the key. +
  • +
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/src/rdbms/presentations/normalization/_index.hbs b/src/rdbms/presentations/normalization/_index.hbs new file mode 100644 index 000000000..6221251fd --- /dev/null +++ b/src/rdbms/presentations/normalization/_index.hbs @@ -0,0 +1,118 @@ +{{! + ********************************************************************* + Database Normalization - Presentation + ********************************************************************* + +}} + + + + + + + + + + Database Normalization + + + + +{{! + Presentation theme selector +}} +
+ +
+ +{{! + impress.js fallback message + + The fallback message is visible only in case there is `impress-not-supported` class on body. + If all required features are supported by the browser, this class is removed by impress.js script. + +}} +
+

+ Your browser doesn't support the features required by impress.js, so you are presented with a simplified + version of this presentation. +

+

+ For the best experience please use the latest Chrome, Safari or Firefox browser. +

+
+ +
+
+ + {{! introduction }} +
+

Database Normalization

+
+
{{>definition}}
+
{{>example}}
+ {{! anomalies }} +
{{>anomalies-insert}}
+
{{>anomalies-update}}
+
{{>anomalies-delete}}
+ {{! 1NF -- First Normal Form }} +
{{>req-1nf}}
+
{{>problem-1nf}}
+
{{>example-1nf}}
+ {{! 2NF -- Second Normal Form }} +
{{>req-2nf}}
+
{{>problem-2nf}}
+
{{>example-2nf}}
+ {{! 3NF -- Third Normal Form }} +
{{>req-3nf}}
+
{{>problem-3nf}}
+
{{>example-3nf}}
+ {{! overview step }} +
+ +
+
+ + + + diff --git a/src/rdbms/presentations/normalization/anomalies-delete.hbs b/src/rdbms/presentations/normalization/anomalies-delete.hbs new file mode 100644 index 000000000..2d889c5dc --- /dev/null +++ b/src/rdbms/presentations/normalization/anomalies-delete.hbs @@ -0,0 +1,15 @@ +

Deletion anomalies

+

+ + Under certain circumstances, the deletion of data representing certain facts + necessitates the deletion of data representing completely different facts. + +

+
+
+ {{>tbl-anomalies-delete}} +
+
+ If a player looses their items completely, the record must be deleted, unless the inventory + field is set to null. This leads to the loosing all other information about a player. +
diff --git a/src/rdbms/presentations/normalization/anomalies-insert.hbs b/src/rdbms/presentations/normalization/anomalies-insert.hbs new file mode 100644 index 000000000..23afd5a09 --- /dev/null +++ b/src/rdbms/presentations/normalization/anomalies-insert.hbs @@ -0,0 +1,15 @@ +

Insertion anomalies

+

+ + There are circumstances in which certain facts cannot be recorded at all. + +

+
+
+ {{>tbl-anomalies-insert}} +
+
+ When a new player acen1999 join the game, they have nothing in their inventory. + Therefore, the details of any player who have at least one item can be recorded, but a newly game member + who has no items cannot be recorded, except by setting the inventory to null. +
diff --git a/src/rdbms/presentations/normalization/anomalies-update.hbs b/src/rdbms/presentations/normalization/anomalies-update.hbs new file mode 100644 index 000000000..4fdbe1549 --- /dev/null +++ b/src/rdbms/presentations/normalization/anomalies-update.hbs @@ -0,0 +1,18 @@ +

Update anomalies

+

+ + The same information can be expressed on multiple rows;
+ therefore updates to the relation may result in logical inconsistencies. +
+

+
+
+ {{>tbl-anomalies-update}} +
+
+ The same information can be expressed on multiple rows, therefore updates to the relation may result in + logical inconsistencies. If the wheed1997 increase their level, when the + rank should be updated as well. But if the update is only partial successful, then the + relation is left in an inconsistent state. Specifically. the relation provides conflicting information + on "level -- rank" for "wheed1997" player, and on "inventory" and "level" for "acen1999". +
diff --git a/src/rdbms/presentations/normalization/definition.hbs b/src/rdbms/presentations/normalization/definition.hbs new file mode 100644 index 000000000..1eb38b476 --- /dev/null +++ b/src/rdbms/presentations/normalization/definition.hbs @@ -0,0 +1,8 @@ +

+ + Normalization is a process of organizing data in a database so that it is free from redundancy and dependency. + It helps to eliminate data inconsistencies and anomalies, thereby improving data integrity.
+ Normalization is a set of rules or guidelines to design a database schema in such a way that it avoids data + duplication, data redundancy, and data inconsistency. +
+

diff --git a/src/rdbms/presentations/normalization/example-1nf.hbs b/src/rdbms/presentations/normalization/example-1nf.hbs new file mode 100644 index 000000000..4847ffb22 --- /dev/null +++ b/src/rdbms/presentations/normalization/example-1nf.hbs @@ -0,0 +1,23 @@ +
+ {{>tbl-1nf-itm}} +
+
+
    +
  • + icon-pass + Row order should not be used to convey information. +
  • +
  • + icon-pass + Data types should not be mixed within the same column. +
  • +
  • + icon-pass + Tables should have their primary keys. +
  • +
  • + icon-pass + Repeating groups should be eliminated. +
  • +
+
diff --git a/src/rdbms/presentations/normalization/example-2nf.hbs b/src/rdbms/presentations/normalization/example-2nf.hbs new file mode 100644 index 000000000..6050f03f9 --- /dev/null +++ b/src/rdbms/presentations/normalization/example-2nf.hbs @@ -0,0 +1,12 @@ +
+ {{>tbl-2nf-itm}} + {{>tbl-2nf-lvl}} +
+
+
    +
  • + icon-pass + Each non-key attribute must depend on the entire primary key. +
  • +
+
diff --git a/src/rdbms/presentations/normalization/example-3nf.hbs b/src/rdbms/presentations/normalization/example-3nf.hbs new file mode 100644 index 000000000..0c69bf719 --- /dev/null +++ b/src/rdbms/presentations/normalization/example-3nf.hbs @@ -0,0 +1,13 @@ +
+ {{>tbl-3nf-lvl}} + {{>tbl-3nf-rtg}} +
+
+
    +
  • + icon-pass + Every non-key attribute in a table should depend on the key, the whole key, and nothing but the key. +
  • +
+
+ diff --git a/src/rdbms/presentations/normalization/example.hbs b/src/rdbms/presentations/normalization/example.hbs new file mode 100644 index 000000000..fe19ef1ef --- /dev/null +++ b/src/rdbms/presentations/normalization/example.hbs @@ -0,0 +1,3 @@ +
+ {{>tbl-example}} +
diff --git a/src/rdbms/presentations/normalization/problem-1nf.hbs b/src/rdbms/presentations/normalization/problem-1nf.hbs new file mode 100644 index 000000000..d78d22da7 --- /dev/null +++ b/src/rdbms/presentations/normalization/problem-1nf.hbs @@ -0,0 +1,2 @@ +
{{>tbl-1nf-mxd}}
+
{{>tbl-1nf-rpg}}
diff --git a/src/rdbms/presentations/normalization/problem-2nf.hbs b/src/rdbms/presentations/normalization/problem-2nf.hbs new file mode 100644 index 000000000..e8c8c2268 --- /dev/null +++ b/src/rdbms/presentations/normalization/problem-2nf.hbs @@ -0,0 +1,7 @@ +{{! + Each non-key attribute must depend on the entire primary key. + + *primary key*: `(name, item_type)` + `level` attribute depends on `(name)` key only, which violates 2NF. +}} +
{{>tbl-2nf-nka}}
diff --git a/src/rdbms/presentations/normalization/problem-3nf.hbs b/src/rdbms/presentations/normalization/problem-3nf.hbs new file mode 100644 index 000000000..71a36b2e3 --- /dev/null +++ b/src/rdbms/presentations/normalization/problem-3nf.hbs @@ -0,0 +1,4 @@ +{{! + transitive dependencies should be eliminated +}} +
{{>tbl-3nf-tdp}}
diff --git a/src/rdbms/presentations/normalization/req-1nf.hbs b/src/rdbms/presentations/normalization/req-1nf.hbs new file mode 100644 index 000000000..caa2127f2 --- /dev/null +++ b/src/rdbms/presentations/normalization/req-1nf.hbs @@ -0,0 +1,22 @@ +

+ First
+ normal form +

+
+

Requirements

+
    +
  • + Row order should not be used to convey information. +
  • +
  • + Data types should not be mixed within the same column.
    + (and the RDBMS won't let you do it anyway) +
  • +
  • + Tables should have their primary keys. +
  • +
  • + Repeating groups should be eliminated. +
  • +
+
diff --git a/src/rdbms/presentations/normalization/req-2nf.hbs b/src/rdbms/presentations/normalization/req-2nf.hbs new file mode 100644 index 000000000..32687bb67 --- /dev/null +++ b/src/rdbms/presentations/normalization/req-2nf.hbs @@ -0,0 +1,12 @@ +

+ Second
+ normal form +

+
+

Requirements

+
    +
  • + Each non-key attribute must depend on the entire primary key. +
  • +
+
diff --git a/src/rdbms/presentations/normalization/req-3nf.hbs b/src/rdbms/presentations/normalization/req-3nf.hbs new file mode 100644 index 000000000..20eef549c --- /dev/null +++ b/src/rdbms/presentations/normalization/req-3nf.hbs @@ -0,0 +1,12 @@ +

+ Third
+ normal form +

+
+

Requirements

+
    +
  • + Every non-key attribute in a table should depend on the key, the whole key, and nothing but the key. +
  • +
+
diff --git a/src/rdbms/presentations/normalization/tbl-1nf-itm.hbs b/src/rdbms/presentations/normalization/tbl-1nf-itm.hbs new file mode 100644 index 000000000..0e39255b1 --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-1nf-itm.hbs @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Inventory
namelevelratingitem_typeitem_quantity
prombery877Advancedsword1
prombery877Advancedring4
wheed19976Intermediatecopper coin18
acen19971Beginnerrobe1
acen19971Beginnerwizard hat1
diff --git a/src/rdbms/presentations/normalization/tbl-1nf-mxd.hbs b/src/rdbms/presentations/normalization/tbl-1nf-mxd.hbs new file mode 100644 index 000000000..53f16239b --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-1nf-mxd.hbs @@ -0,0 +1,32 @@ +{{! mixed data types }} + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery87 + 7.75 + 7 + Advanced1 sword, 4 rings
wheed1997 + + 6 + Intermediate18 copper coins
diff --git a/src/rdbms/presentations/normalization/tbl-1nf-rpg.hbs b/src/rdbms/presentations/normalization/tbl-1nf-rpg.hbs new file mode 100644 index 000000000..ae0e362f3 --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-1nf-rpg.hbs @@ -0,0 +1,35 @@ +{{! repeating groups }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877Advanced + 1 sword, 4 rings + 1 sword +
wheed19976Intermediate18 copper coins
prombery877Advanced4 rings
diff --git a/src/rdbms/presentations/normalization/tbl-2nf-itm.hbs b/src/rdbms/presentations/normalization/tbl-2nf-itm.hbs new file mode 100644 index 000000000..5dcaf8dc7 --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-2nf-itm.hbs @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Inventory
nameitem_typeitem_quantity
prombery87sword1
prombery87ring4
wheed1997copper coin18
acen1997robe1
acen1997wizard hat1
diff --git a/src/rdbms/presentations/normalization/tbl-2nf-lvl.hbs b/src/rdbms/presentations/normalization/tbl-2nf-lvl.hbs new file mode 100644 index 000000000..87547c460 --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-2nf-lvl.hbs @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Level
namelevelrating
prombery877Advanced
wheed19976Intermediate
acen19971Beginner
diff --git a/src/rdbms/presentations/normalization/tbl-2nf-nka.hbs b/src/rdbms/presentations/normalization/tbl-2nf-nka.hbs new file mode 100644 index 000000000..886dd6cfd --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-2nf-nka.hbs @@ -0,0 +1,50 @@ +{{! non-key attributes }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Inventory
namelevelratingitem_typeitem_quantity
prombery877Advancedsword1
prombery877Advancedring4
wheed19976Intermediatecopper coin18
acen19971Beginnerrobe1
acen19971Beginnerwizard hat1
diff --git a/src/rdbms/presentations/normalization/tbl-3nf-lvl.hbs b/src/rdbms/presentations/normalization/tbl-3nf-lvl.hbs new file mode 100644 index 000000000..be923227c --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-3nf-lvl.hbs @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + +
Player Level
namelevel
prombery877
wheed19976
acen19971
diff --git a/src/rdbms/presentations/normalization/tbl-3nf-rtg.hbs b/src/rdbms/presentations/normalization/tbl-3nf-rtg.hbs new file mode 100644 index 000000000..d416c74e9 --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-3nf-rtg.hbs @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Level Ranking
levelrating
1Beginner
2Beginner
3Beginner
4Intermediate
5Intermediate
6Intermediate
7Advanced
8Advanced
9Advanced
diff --git a/src/rdbms/presentations/normalization/tbl-3nf-tdp.hbs b/src/rdbms/presentations/normalization/tbl-3nf-tdp.hbs new file mode 100644 index 000000000..d6e98f629 --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-3nf-tdp.hbs @@ -0,0 +1,28 @@ +{{! transitive dependencies }} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Level
namelevelrating
prombery877Advanced
wheed19976Intermediate
acen19971Beginner
diff --git a/src/rdbms/presentations/normalization/tbl-anomalies-delete.hbs b/src/rdbms/presentations/normalization/tbl-anomalies-delete.hbs new file mode 100644 index 000000000..07300f6cd --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-anomalies-delete.hbs @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877.75Advanced1 sword, 4 rings
wheed1997Almost 7Intermediate18 copper coins
acen19971Beginner1 robe, 1 wizard hat
diff --git a/src/rdbms/presentations/normalization/tbl-anomalies-insert.hbs b/src/rdbms/presentations/normalization/tbl-anomalies-insert.hbs new file mode 100644 index 000000000..69f2e0f77 --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-anomalies-insert.hbs @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877.75Advanced1 sword, 4 rings
wheed1997Almost 7Intermediate18 copper coins
acen19971Beginner
diff --git a/src/rdbms/presentations/normalization/tbl-anomalies-update.hbs b/src/rdbms/presentations/normalization/tbl-anomalies-update.hbs new file mode 100644 index 000000000..41e4230ad --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-anomalies-update.hbs @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877.75Advanced1 sword, 4 rings
acen1997 + 1 + 1 + Beginner1 robe, 1 wizard hat
wheed1997Almost 7Intermediate18 copper coins
acen1997 + 2 + 1 + Beginner1 robe, 1 wizard hat
diff --git a/src/rdbms/presentations/normalization/tbl-example.hbs b/src/rdbms/presentations/normalization/tbl-example.hbs new file mode 100644 index 000000000..a81126a66 --- /dev/null +++ b/src/rdbms/presentations/normalization/tbl-example.hbs @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
Player Info
namelevelratinginventory
prombery877.75Advanced1 sword, 4 rings
wheed1997Almost 7Intermediate18 copper coins
diff --git a/src/rdbms/query.txt b/src/rdbms/query.txt new file mode 100644 index 000000000..d5e2f0eb4 --- /dev/null +++ b/src/rdbms/query.txt @@ -0,0 +1,729 @@ +.. meta:: + :description: Query data from database + :author: Serhii Horodilov + :keywords: sql, db, database, query, select, fetch + +************* +Querying data +************* + +The process of retrieving or the command to retrieve data from a database is +called a *query*. In SQL the ``SELECT`` command is used to specify queries. + +``SELECT`` retrieves rows from zero or more tables. The general processing of +``SELECT`` is as follows: + +#. All queries in the ``WITH`` list are computed. + This effectively serve as temporary tables that can be referenced in the + ``FROM`` list. +#. All elements in the ``FROM`` list are computed. If more than one element + is specified in the ``FROM`` list, they are cross-joined together. +#. If ``WHERE`` clause is specified, all rows that do not satisfy + the condition are eliminated from the output. +#. If the ``GROUP BY`` clause is specified, or if there are aggregate function + calls, the output is combined into groups of rows that match on one or more + values, and the result of aggregate functions are computed. + If the ``HAVING`` clause is present, it eliminates groups that does not + satisfy the given condition. +#. The actual output rows are computed using the ``SELECT`` output expressions + for each row or row of group. +#. ``SELECT DISTINCT`` eliminates duplicate rows from the result. + ``SELECT DISTINCT ON`` eliminates rows that match on all the specified + expressions. +#. Using the operators ``UNION``, ``INTERSECT``, and ``EXCEPT``, the output + of more than one ``SELECT`` statement can be combined to form a single + result set. + + - The ``UNION`` operator returns **all** rows that are in one or both + result sets. + - The ``INTERSECT`` operator returns all rows that are strictly in both + result sets. + - The ``EXCEPT`` operator returns the rows that are in the first result + set, but not in the second. + +#. If the ``ORDER BY`` clause is specified, the returned rows are sorted in + the specific order. +#. if the ``LIMIT`` or ``OFFSET`` clause is specified, the ``SELECT`` + statement only returns a subset of the result rows. +#. If ``FOR UPDATE``, ``FOR NO KEY UPDATE``, ``FOR SHARE`` or + ``FOR KEY SHARE`` is specified, the ``SELECT`` statement locks the selected + rows against concurrent updates. + +.. contents:: + :local: + :depth: 2 + +Select rows from a table +======================== + +A simple kind of query has the form: + +.. code-block:: postgresql + + SELECT * FROM publisher; + +This command would retrieve all rows and all user-defined columns from +``publisher`` table. A select list can also select a subset of the available +columns or make calculations using the columns. + +.. code-block:: postgresql + + SELECT title, page_count / 2 + FROM book; + +``FROM`` clause is a simple kind of table expression: it reads just one table. +In general, table expression can be complex constructs of base tables, joins +and sub-queries. But it is possible to omit the table expression entirely and +use the ``SELECT`` command as a calculator (or in some another way): + +.. code-block:: sql + + SELECT 40 + 2; + +The ``FROM`` clause derives a table from one or more other tables given in +a comma-separated table reference list. A table reference can a table name, +or derived table such as sub-query, a ``JOIN`` construct, or complex +combinations of these. If more than one table reference is listed in the +``FROM`` clause, the table are cross-joined. The result of the ``FROM`` list +is an intermediate virtual table which can then be subject to transformations +by the ``WHERE``, ``GROUP BY``, and ``HAVING`` clauses and is finally the +result of the overall table expression. + +Search conditions +================= + +After the processing of the ``FROM`` clause is done, each row of the derived +virtual table can be checked against the search condition. If the result of +the condition is ``true``, the row is kept in the output table, otherwise it +is discarded. The ``WHERE`` clause is used to handle search condition checks. + +Here are some examples of ``WHERE`` clause: + +.. code-block:: sql + :caption: WHERE clause usage examples + + SELECT ... FROM tbl + WHERE c1 > 5; + + SELECT ... FROM tbl + WHERE c1 IN (1, 2, 3); + + SELECT ... FROM tbl + WHERE c1 IN (SELECT c1 FROM t2); + + SELECT ... FROM tbl + WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = tbl.c1 + 10); + + SELECT ... FROM tbl + WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = tbl.c1 + 10) AND 100; + + SELECT ... FROM tbl + WHERE EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1); + +Grouping data +============= + +After passing the ``WHERE`` filter, the derived input table might be subject +to grouping, using ``GROUP BY`` clause, and elimination of group rows using +the ``HAVING`` clause. The ``GROUP BY`` clause is used to group together those +rows in a table that have the same values in all the columns listed. The order +in the columns are listed does not matter. The effect is to combine each set of +rows having common values into one group row that represents all rows in the +group. This is done to eliminate redundancy in the output and/or compute +aggregates that apply to these groups. + +Select lists +============ + +As shown is the previous section, the table expression in the ``SELECT`` +command constructs an intermediate virtual table by possibly combining tables, +views, eliminating rows, grouping etc. This table is finally passed on to +processing by the *select list*. The select list determines which *columns* +of the intermediate table are actually output. + +Select list items +----------------- + +The simplest kind of select is ``*`` which emits that the table expression +produces. Otherwise, a select list is a comma-separated list of value +expressions. For instance: + +.. code-block:: sql + + SELECT first_name, last_name + FROM author; + +Columns labels +-------------- + +The entries listed in the select list can be assigned names for subsequent +processing. + +.. code-block:: sql + + SELECT title, page_count / 2 as sheets FROM book; + +If no output column name is specified using ``AS``, the system will assign +a default column name. For simple column references, this is the name of +the referenced column. For function calls, this is the name of the function. +For complex expressions, the system will generate a generic name. + +.. note:: + + Labels are often referenced as "aliases". + +DISTINCT +-------- + +After the select list has been processed, the result table can optionally be +subject to the elimination of duplicate rows. The ``DISTINCT`` key word is +written directly after ``SELECT`` to specify this: + +.. code-block:: postgresql + + SELECT DISTINCT publisher FROM book; + +Obviously, two rows are considered distinct if they differ in at least one +column value. Null values are considered equal in comparison. Alternatively, +an arbitrary expression can determine what rows are to be considered distinct. + +.. code-block:: + + SELECT DISTINCT ON (expression [, expression ...]) select_list ... + +Sorting rows +============ + +After a query has produced an output table it can optionally be sorted. +If sorting is not chosen, the rows will be returned in an unspecified order. +The actual order in this case will depend on the scan and join plan types and +the order on disk, but it must not be relied on. + +The ``ORDER BY`` clause specifies the sort order: + +.. code-block:: postgresql + + SELECT title, publisher_id FROM book ORDER BY title; + +The sort expression(s) can be any expression that would be valid in the query's +select list. + +When more than one expression is specified, the later values are used to sort +rows that are equal according to the earlier values. Each expression can be +followed by an option ``ASC`` or ``DESC`` keyword to set the sort direction +to ascending or descending. ``ASC`` order is the default. + +The ``NULL FIRST`` and ``NULL LAST`` options can be used to determine whether +null appear before or after non-null values in the sort ordering. By default, +null values sort as if larger than any non-null value; that's, ``NULL FIRST`` +is the default for ``DESC`` order, and ``NULL LAST`` otherwise. + +Note that the ordering options are considered independently for each sort +column. For example ``ORDER BY x, y DESC`` means ``ORDER BY x ASC, y DESC``, +which is not the same as ``ORDER BY x DESC, y DESC``. + +A sort expression can also be the column label or number of an output column. + +``ORDER BY`` can be applied to the result of a ``UNION``, ``INTERSECT``, or +``EXCEPT`` combination, but in this case it is only permitted to sort by +output column names or numbers, not by expressions. + +Limit and Offset +================ + +``LIMIT`` and ``OFFSET`` allow you to retrieve just a portion of the rows that +are generated by the rest of the query. + +.. code-block:: postgresql + + SELECT * FROM publisher LIMIT 10; + +The query above fetches only first 10 rows from the "publisher" table. + +If a limit count is given, no more than that many rows will be returned. +But possibly fewer, if the query itself yields fewer rows. +``LIMIT ALL`` is the same as omitting the ``LIMIT`` clause, as is ``LIMIT`` +with ``NULL`` argument. + +``OFFSET`` says to skip that many rows before beginning to return rows. +``OFFSET 0`` is the same as omitting the ``OFFSET`` clause, as is ``OFFSET`` +with a ``NULL`` argument. + +.. code-block:: postgresql + + SELECT * FROM publisher LIMIT 10 OFFSET 10; + +The query above fetches 10 publishers starting from the 11-th one. + +When using ``LIMIT`` and/or ``OFFSET``, it's important to use ``ORDER BY`` +clause that constraints the result rows into a unique order. Otherwise you +will get an unpredictable subset of the query's rows. + +WITH queries +============ + +``WITH`` provides a way to write auxiliary statements for use in a larger +query. These statements, which are often referred to as +:abbr:`CTE (Common Table Expression)`, can be thought of as defining temporary +tables that exist just for one query. Each auxiliary statement in a ``WITH`` +clause can be a ``SELECT``, ``INSERT``, ``UPDATE`` or ``DELETE``; and the +``WITH`` clause itself is attached to a primary statement that can be a +``SELECT``, ``INSERT``, ``UPDATE``, ``DELETE`` or ``MERGE``. + +Select in WITH +-------------- + +The basic value of ``SELECT`` in ``WITH`` is to break down complicated queries +into simpler parts. + +.. code-block:: postgresql + :caption: Get most profitable months + + -- select top revenue months + WITH monthly_revenue AS (SELECT EXTRACT(YEAR FROM date) AS year, + EXTRACT(MONTH FROM date) AS month, + SUM(amount) AS total_amount + FROM revenue + GROUP BY year, month + ORDER BY year, month) + SELECT * + FROM monthly_revenue + WHERE total_amount > (SELECT SUM(total_amount) / 100 FROM monthly_revenue) + ORDER BY total_amount DESC; + +Recursive queries +----------------- + +The optional ``RECURSIVE`` modifier changes WITH from a mere syntactic +convenience into a feature that accomplishes things not otherwise possible in +standard SQL. Using ``RECURSIVE``, a ``WITH`` query can refer to its own +output. + +.. code-block:: postgresql + :caption: Sum of first 10 numbers starting from 1 + + WITH RECURSIVE t(n) AS (VALUES (1) UNION SELECT n + 1 FROM t WHERE n < 10) + SELECT sum(n) + FROM t; + +.. important:: + + When working with recursive queries it is important to be sure that + the recursive part of the query will eventually return no tuple, or else + the query will loop indefinitely. + +Data modifying statements in WITH +--------------------------------- + +You can use most data-modifying statements (``INSERT``, ``UPDATE``, ``DELETE``) +in ``WITH``. This allows you to perform several different operations at a time, +in the same query. + +.. code-block:: postgresql + :caption: Remove old revenue records and store them into history table + + WITH deleted_rows AS ( + DELETE FROM revenue + WHERE date < '2020-01-01' + RETURNING *) + INSERT + INTO revenue_log + SELECT * + FROM deleted_rows; + +Combining queries +================= + +The results of two queries can be combined using the set operations union, +intersection, and difference. + +.. code-block:: + + query1 UNION [ALL] query2 + query1 INTERSECT [ALL] query2 + query1 EXCEPT [ALL] query2 + +``UNION`` effectively appends the result of ``query2`` to the result of +``query1`` (although there is no guarantee that this is the order in which +the rows are actually returned). Furthermore, it eliminates duplicate rows from +its result, in the same way as ``DISTINCT``, unless ``UNION ALL`` is used. + +.. code-block:: postgresql + + WITH north_lib_member AS + (SELECT * + FROM (VALUES (1, 'Mariska', 'Syson'), + (2, 'Robenia', 'Dimitriades'), + (3, 'Loren', 'Goretti'), + (4, 'Dianna', 'Giacomuzzo'), + (5, 'Anett', 'Hayland'), + (6, 'Keeley', 'Grishelyov')) AS tbl(id, first_name, last_name)), + south_lib_member AS + (SELECT * + FROM (VALUES (5, 'Anett', 'Hayland'), + (6, 'Keeley', 'Grishelyov'), + (7, 'Say', 'Kliner'), + (8, 'Charles', 'Ede'), + (9, 'Florentia', 'Core'), + (10, 'Tiffany', 'Tingly')) + AS tbl(id, first_name, last_name)) + SELECT * + FROM north_lib_member + UNION + SELECT * + FROM south_lib_member + ORDER BY id; + ++----+------------+-------------+ +| id | first_name | last_name | ++====+============+=============+ +| 1 | Mariska | Syson | ++----+------------+-------------+ +| 2 | Robenia | Dimitriades | ++----+------------+-------------+ +| 3 | Loren | Goretti | ++----+------------+-------------+ +| 4 | Dianna | Giacomuzzo | ++----+------------+-------------+ +| 5 | Anett | Hayland | ++----+------------+-------------+ +| 6 | Keeley | Grishelyov | ++----+------------+-------------+ +| 7 | Say | Kliner | ++----+------------+-------------+ +| 8 | Charles | Ede | ++----+------------+-------------+ +| 9 | Florentia | Core | ++----+------------+-------------+ +| 10 | Tiffany | Tingly | ++----+------------+-------------+ + +``INTERSECT`` returns all rows that are both in the result of ``query1`` and in +the result of ``query2``. Duplicate rows are eliminated unless +``INTERSECT ALL`` is used. + +.. code-block:: postgresql + + WITH north_lib_member AS + (SELECT * + FROM (VALUES (1, 'Mariska', 'Syson'), + (2, 'Robenia', 'Dimitriades'), + (3, 'Loren', 'Goretti'), + (4, 'Dianna', 'Giacomuzzo'), + (5, 'Anett', 'Hayland'), + (6, 'Keeley', 'Grishelyov')) AS tbl(id, first_name, last_name)), + south_lib_member AS + (SELECT * + FROM (VALUES (5, 'Anett', 'Hayland'), + (6, 'Keeley', 'Grishelyov'), + (7, 'Say', 'Kliner'), + (8, 'Charles', 'Ede'), + (9, 'Florentia', 'Core'), + (10, 'Tiffany', 'Tingly')) + AS tbl(id, first_name, last_name)) + SELECT * + FROM north_lib_member + INTERSECT + SELECT * + FROM south_lib_member + ORDER BY id; + ++----+------------+------------+ +| id | first_name | last_name | ++====+============+============+ +| 5 | Anett | Hayland | ++----+------------+------------+ +| 6 | Keeley | Grishelyov | ++----+------------+------------+ + +``EXCEPT`` returns all rows that are in the result of ``query1`` but not in +the result of ``query2``. (This is sometimes called the difference between two +queries.) Again, duplicates are eliminated unless ``EXCEPT ALL`` is used. + +.. code-block:: postgresql + + WITH north_lib_member AS + (SELECT * + FROM (VALUES (1, 'Mariska', 'Syson'), + (2, 'Robenia', 'Dimitriades'), + (3, 'Loren', 'Goretti'), + (4, 'Dianna', 'Giacomuzzo'), + (5, 'Anett', 'Hayland'), + (6, 'Keeley', 'Grishelyov')) AS tbl(id, first_name, last_name)), + south_lib_member AS + (SELECT * + FROM (VALUES (5, 'Anett', 'Hayland'), + (6, 'Keeley', 'Grishelyov'), + (7, 'Say', 'Kliner'), + (8, 'Charles', 'Ede'), + (9, 'Florentia', 'Core'), + (10, 'Tiffany', 'Tingly')) + AS tbl(id, first_name, last_name)) + SELECT * + FROM north_lib_member + EXCEPT + SELECT * + FROM south_lib_member + ORDER BY id; + ++----+------------+-------------+ +| id | first_name | last_name | ++====+============+=============+ +| 1 | Mariska | Syson | ++----+------------+-------------+ +| 2 | Robenia | Dimitriades | ++----+------------+-------------+ +| 3 | Loren | Goretti | ++----+------------+-------------+ +| 4 | Dianna | Giacomuzzo | ++----+------------+-------------+ + +Join data from different tables +=============================== + +A ``JOIN`` clause combines two ``FROM`` items, which for convenience we will +refer as "tables", though in reality they can be any type of ``FROM`` items. +Available join types are: + +- ``[INNER] JOIN`` +- ``LEFT [OUTER] JOIN`` +- ``RIGHT [OUTER] JOIN`` +- ``FULL [OUTER] JOIN`` + +.. note:: + + Key words in bracket parentheses above are optional. + +Joins between tables +-------------------- + +.. literalinclude:: /../libms-db/libms.sql + :caption: Publishers and books tables definitions + :language: postgresql + :lines: 15-23,57-69 + +Following tables are related via ``FOREIGN KEY`` constraint. Each record in +the ``book`` table references some record in the ``publisher`` table. + +.. important:: + + Since original tables contain lots of data, temporary tables will be + created instead before join query. Full tables content may be downloaded + via links: + :download:`publisher `, + :download:`book `. + + The subsets from original queries defined as: + + .. code-block:: postgresql + + SELECT * + FROM (VALUES (1, 'Zoonoodle'), + (3, 'Tanoodle'), + (4, 'Skivee')) + AS publisher(id, name); + + +----+-----------+ + | id |name | + +====+===========+ + | 1 | Zoonoodle | + +----+-----------+ + | 3 | Tanoodle | + +----+-----------+ + + .. code-block:: postgresql + + SELECT * + FROM (VALUES (22, 'pretium nisl', 2), + (38, 'ac est lacinia nisi venenatis', 3), + (69, 'vel accumsan tellus nisi', 3), + (72, 'nam dui proin', 2), + (85, 'nam tristique', 2)) + AS book(id, title, publisher_id); + + +----+-------------------------------+--------------+ + | id | title | publisher_id | + +====+===============================+==============+ + | 22 | pretium nisl | 2 | + +----+-------------------------------+--------------+ + | 38 | ac est lacinia nisi venenatis | 3 | + +----+-------------------------------+--------------+ + | 69 | vel accumsan tellus nisi | 3 | + +----+-------------------------------+--------------+ + | 72 | nam dui proin | 2 | + +----+-------------------------------+--------------+ + | 85 | nam tristique | 2 | + +----+-------------------------------+--------------+ + +By passing multiple tables to the ``FROM`` clause a ``CROSS JOIN`` query is +executed. This means the resulting table is the Cartesian product of two +original tables. + +.. code-block:: postgresql + :caption: Cross join (Cartesian product) + + WITH publisher AS + (SELECT * + FROM (VALUES (1, 'Zoonoodle'), + (3, 'Tanoodle'), + (4, 'Skivee')) + AS publisher(id, name)), + book AS + (SELECT * + FROM (VALUES (22, 'pretium nisl', 2), + (38, 'ac est lacinia nisi venenatis', 3), + (69, 'vel accumsan tellus nisi', 3), + (72, 'nam dui proin', 2), + (85, 'nam tristique', 2)) + AS book(id, title, publisher_id)) + -- querying the joined result + SELECT * + FROM book, + publisher; + +.. table:: Query result + + +----+-------------------------------+--------------+----+-----------+ + | id | title | publisher_id | id | name | + +====+===============================+==============+====+===========+ + | 22 | pretium nisl | 2 | 1 | Zoonoodle | + +----+-------------------------------+--------------+----+-----------+ + | 22 | pretium nisl | 2 | 3 | Tanoodle | + +----+-------------------------------+--------------+----+-----------+ + | 22 | pretium nisl | 2 | 4 | Skivee | + +----+-------------------------------+--------------+----+-----------+ + | 38 | ac est lacinia nisi venenatis | 3 | 1 | Zoonoodle | + +----+-------------------------------+--------------+----+-----------+ + | 38 | ac est lacinia nisi venenatis | 3 | 3 | Tanoodle | + +----+-------------------------------+--------------+----+-----------+ + | 38 | ac est lacinia nisi venenatis | 3 | 4 | Skivee | + +----+-------------------------------+--------------+----+-----------+ + | 69 | vel accumsan tellus nisi | 3 | 1 | Zoonoodle | + +----+-------------------------------+--------------+----+-----------+ + | 69 | vel accumsan tellus nisi | 3 | 3 | Tanoodle | + +----+-------------------------------+--------------+----+-----------+ + | 69 | vel accumsan tellus nisi | 3 | 4 | Skivee | + +----+-------------------------------+--------------+----+-----------+ + | 72 | nam dui proin | 2 | 1 | Zoonoodle | + +----+-------------------------------+--------------+----+-----------+ + | 72 | nam dui proin | 2 | 3 | Tanoodle | + +----+-------------------------------+--------------+----+-----------+ + | 72 | nam dui proin | 2 | 4 | Skivee | + +----+-------------------------------+--------------+----+-----------+ + | 85 | nam tristique | 2 | 1 | Zoonoodle | + +----+-------------------------------+--------------+----+-----------+ + | 85 | nam tristique | 2 | 3 | Tanoodle | + +----+-------------------------------+--------------+----+-----------+ + | 85 | nam tristique | 2 | 4 | Skivee | + +----+-------------------------------+--------------+----+-----------+ + +By defining the ``WHERE`` clause rows that do not match the condition may +be eliminated from the result. + +.. code-block:: postgresql + + SELECT * + FROM book, publisher + WHERE book.publisher_id = publisher.id; + ++----+-------------------------------+--------------+----+----------+ +| id | title | publisher_id | id | name | ++====+===============================+==============+====+==========+ +| 38 | ac est lacinia nisi venenatis | 3 | 3 | Tanoodle | ++----+-------------------------------+--------------+----+----------+ +| 69 | vel accumsan tellus nisi | 3 | 3 | Tanoodle | ++----+-------------------------------+--------------+----+----------+ + +This is called ``INNER JOIN``, which means that the result table will contain +only whose rows from left-hard and right-hand tables, that have corresponding +records to each other. + +The same result may be obtained using ``JOIN`` clause. All ``JOIN`` options are +just a notation convenience, since they do nothing you couldn't do with plain +``FROM`` and ``WHERE``. + +.. code-block:: postgresql + + SELECT * + FROM book b + JOIN publisher p ON b.publisher_id = p.id; + +``INNER JOIN`` is the default while joining two tables with each other. + +Right and left joins +-------------------- + +``LEFT OUTER JOIN`` returns all rows in the qualified Cartesian product +(i.e., all combined rows that pass its condition), plus one copy of each +row in the left-hand table for which there was no right-hand row that passed +the join condition. + +.. code-block:: postgresql + + SELECT * + FROM book b + LEFT JOIN publisher p ON b.publisher_id = p.id; + ++----+-------------------------------+--------------+------+----------+ +| id | title | publisher_id | id | name | ++====+===============================+==============+======+==========+ +| 22 | pretium nisl | 2 | null | null | ++----+-------------------------------+--------------+------+----------+ +| 38 | ac est lacinia nisi venenatis | 3 | 3 | Tanoodle | ++----+-------------------------------+--------------+------+----------+ +| 69 | vel accumsan tellus nisi | 3 | 3 | Tanoodle | ++----+-------------------------------+--------------+------+----------+ +| 72 | nam dui proin | 2 | null | null | ++----+-------------------------------+--------------+------+----------+ +| 85 | nam tristique | 2 | null | null | ++----+-------------------------------+--------------+------+----------+ + +Conversely, ``RIGHT OUTER JOIN`` returns all the joined rows, plus one row for +each unmatched right-hand row. This is just a notation convenience, since you +could convert it to a ``LEFT OUTER JOIN`` by switching the left and right +tables. + +.. code-block:: postgresql + + SELECT * + FROM book b + RIGHT JOIN publisher p ON b.publisher_id = p.id; + ++------+-------------------------------+--------------+----+-----------+ +| id | title | publisher_id | id | name | ++======+===============================+==============+====+===========+ +| 38 | ac est lacinia nisi venenatis | 3 | 3 | Tanoodle | ++------+-------------------------------+--------------+----+-----------+ +| 69 | vel accumsan tellus nisi | 3 | 3 | Tanoodle | ++------+-------------------------------+--------------+----+-----------+ +| null | null | null | 4 | Skivee | ++------+-------------------------------+--------------+----+-----------+ +| null | null | null | 1 | Zoonoodle | ++------+-------------------------------+--------------+----+-----------+ + +Full outer join +--------------- + +.. code-block:: postgresql + + SELECT * + FROM book b + FULL JOIN publisher p ON b.publisher_id = p.id; + ++------+-------------------------------+--------------+------+-----------+ +| id | title | publisher_id | id | name | ++======+===============================+==============+======+===========+ +| 22 | pretium nisl | 2 | null | null | ++------+-------------------------------+--------------+------+-----------+ +| 38 | ac est lacinia nisi venenatis | 3 | 3 | Tanoodle | ++------+-------------------------------+--------------+------+-----------+ +| 69 | vel accumsan tellus nisi | 3 | 3 | Tanoodle | ++------+-------------------------------+--------------+------+-----------+ +| 72 | nam dui proin | 2 | null | null | ++------+-------------------------------+--------------+------+-----------+ +| 85 | nam tristique | 2 | null | null | ++------+-------------------------------+--------------+------+-----------+ +| null | null | null | 4 | Skivee | ++------+-------------------------------+--------------+------+-----------+ +| null | null | null | 1 | Zoonoodle | ++------+-------------------------------+--------------+------+-----------+ diff --git a/src/rdbms/relations.txt b/src/rdbms/relations.txt new file mode 100644 index 000000000..6c71f8ba8 --- /dev/null +++ b/src/rdbms/relations.txt @@ -0,0 +1,208 @@ +.. meta:: + :description: This document describes the database relationships + :author: Serhii Horodilov + :keywords: sql, db, database, relationship, primary key, foreign key, + pk, fk, one-to-one, one-to-many, many-to-many, 1-1, 1-n, n-m + +******************************************************************************* + Data Relationships +******************************************************************************* + +Before dive into relationships, there is a need explain core concepts on how +data are referenced between different tables. + +Primary key +=========== + +A primary key constraint indicates that a column, or group of columns, can be +used as a unique identifier for rows in the table. This requires that values +be both unique and not null. So, the following two table definitions accept +the same data: + +.. code-block:: postgresql + + CREATE TABLE publisher + ( + id INTEGER PRIMARY KEY, + ... + ); + + CREATE TABLE publisher + ( + id INTEGER NOT NULL UNIQUE, + ... + ); + +Primary keys can span more than one column; the syntax is similar to unique +constraint: + +.. code-block:: postgresql + + CREATE TABLE example + ( + a INTEGER, + b INTEGER, + c INTEGER, + PRIMARY KEY (a, c) + ); + +Adding a primary key will automatically create a unique B-tree index on +the column or group of columns listed in the primary key, and will force +the column(s) to be marked ``NOT NULL``. + +A table can have at most one primary key. + +.. note:: + + There can be any number of unique and not-null constraints, which are + functionally almost the same thing, but only one can be identified as + the primary key. + +Foreign key (FK) +================ + +A foreign key constraint specifies that the value in a column (or a group of +columns) must match the values appearing in some row of another table. We say +this maintains the *referential integrity* between two tables. + +A table can have more than one foreign key constraint. Foreign key can also +overlaps with the primary key. + +To define a FK constraint: + +.. code-block:: postgresql + + CREATE TABLE book + ( + id SERIAL PRIMARY KEY, + publisher_id INTEGER REFERENCES publisher + ); + + CREATE TABLE book + ( + id SERIAL PRIMARY KEY, + publisher_id INTEGER REFERENCES publisher (id) + ); + + CREATE TABLE book + ( + id SERIAL PRIMARY KEY, + publisher_id INTEGER, + FOREIGN KEY (publisher_id) REFERENCES publisher + ); + +In this situation the ``book`` table is the *referencing* table, and +the ``publisher`` table is the *referenced* table. Similarly there are +referencing and referenced columns. + +In case the referenced column is not explicitly defined, the primary key +of the referenced table will be used as the referenced column. + +It is not possible to create a row with non-null foreign key, that does not +appear in the referenced table. + +Self-referential foreign key +---------------------------- + +Sometimes it is useful to the referenced table to be the same table as +referencing. This makes possible to create a tree-structures with nodes, +there a top-level node would have ``NULL`` ``parent_id``. + +.. code-block:: postgresql + + CREATE TABLE tree + ( + id SERIAL PRIMARY KEY, + parent_id INTEGER REFERENCES tree + ); + +Deleting referenced rows +------------------------ + +So far we know that the foreign keys disallows creation of rows that do not +relate to any row inside the referenced table. But what if a referenced row +needs to be removed? Intuitively, there are few options: + +- disallow deletion +- delete referencing rows as well +- something else... + +Restricting and cascading deletes are the two most common options. +``RESTRICT`` prevents deletion of a referenced row. ``CASCADE`` will also +delete all referencing rows as well as the referenced one. + +.. code-block:: postgresql + + CREATE TABLE book + ( + id SERIAL PRIMARY KEY, + publisher_id INTEGER REFERENCES publisher ON DELETE RESTRICT + ); + + CREATE TABLE book + ( + id SERIAL PRIMARY KEY, + publisher_id INTEGER REFERENCES publisher ON DELETE CASCADE + ); + +There are others options. + +``NO ACTION`` means that if any referencing rows still exist when +the constraint is checked, an error is raised; this is the default behavior. + +``SET NULL`` will replace all referencing rows foreign key values with ``NULL`` +values. + +``SET DEFAULT`` will replace all referencing rows foreign key values with +default values. + +Relationships +------------- + +From the point of view of the RDBMS there are no other relationships between +two tables except the **foreign key**. +But the way the foreign keys are designed brings us three concepts of the data +relations. + +.. rubric:: One-to-many + +In a relational database, two tables have a one-to-many relationship if each +row in one table references multiple rows of the other table. For example +``publisher`` can publish many books, but a single ``book`` is published by +some specific publisher. + +.. literalinclude:: /../libms-db/libms.sql + :language: postgresql + :start-after: -- label: ddl-book + :end-before: -- label: + +.. rubric:: One-to-one + +.. note:: + + You can think of one-to-one relationship as a limited version of + *one-to-many*. + +In a relational database, two tables have a one-to-one relationship if each row +in one table links to exactly one row in the other table, and vice versa. +For example a table of ``members`` and a table of ``contacts`` might have +a one-to-one relationship. + +.. literalinclude:: /../libms-db/libms.sql + :language: postgresql + :start-after: -- label: ddl-member + :end-before: -- label: + +.. rubric:: Many-to-many + +In relational database, two table have many-to-many relationship if each row +in one table can reference multiple rows in another table, and vice versa. +For example table ``book`` may contain records for books authored by many +``authors``. On the other hand author can write multiple books. Implementing +a many-to-many relationship requires creation of an intermediate table, that +applies one-to-many relationship with both original tables. + +.. literalinclude:: /../libms-db/libms.sql + :language: postgresql + :start-after: -- label: ddl-book_author + :end-before: -- label: diff --git a/src/rdbms/structure.txt b/src/rdbms/structure.txt new file mode 100644 index 000000000..18220f438 --- /dev/null +++ b/src/rdbms/structure.txt @@ -0,0 +1,107 @@ +************************** +Structure of Data in RDBMS +************************** + +The database itself is a set of data stored in a computer. This data is usually +structured in a way that makes them easily accessible. Relational databases +use the structure that allows us to identify and access data in *relation* to +another piece of data in the database. + +Understanding the basic structure of an RDBMS is crucial for effectively +managing and querying data. In this section, we delve into the core components: +*tables*, *rows*, and *columns*, and how they form the foundation of +a relational database. + +.. contents:: + :local: + :depth: 2 + +Tables +====== + +.. in case updates are required - refer to documentation + https://www.postgresql.org/docs/current/ddl-basics.html + +Tables are the building blocks. + +.. note:: + + Some documents may name tables as *relations*. + +A table in an RDBMS is akin to a spreadsheet. It is where data is stored and +organized. Each table in a database represents a specific entity or concept, +like ``Customers`` or ``Orders``. + +Structure and purpose +--------------------- + +A table consists of rows and columns, similar to a grid. All the rows and cols +together are the data *related* to some subject or concept within a database. + +Tables hold data about a particular subject, such as all the information +related to customer transactions, or books available in a local library. + +Naming conventions +------------------ + +.. important:: + + The conventions below aren't related to tables only, but also they are + used when naming databases and columns. + +- Use nouns that describe the subject the best. +- Use lowercase names, e.g. ``user`` instead of ``Users`` or ``USERS``. +- If the name must consist of two or more words, use underscore to connect + them, e.g. ``snake_case``, ``user_account``. +- Avoid use of dots, spaces, or dashes. +- When naming objects, balance the objective of keeping names short and easy + to use with the objective of making names as descriptive as possible. +- Singular names are preferred over plurals. + +Rows: Individual Records +======================== + +Tables can have hundreds, thousands, sometimes even millions of rows of data. +These rows are offer called *records*. Each row in a table represents a single +entity of a subject. For example, ``book`` table represents an abstract book +with all its attributes, like title, author etc. And a specific row within this +table represents a concrete book. + +Every row should ideally have something that make it unique. + +Rows in a table can be linked to other rows in other tables or within the same +table, maintaining relationships and data integrity. + +Columns: Attributes of Data +=========================== + +Columns in a table represent the attributes of the entity. For instance, +``book`` table may contain columns ``title``, ``author``, ``publisher`` etc. + +Each column has a defined data type, like ``integer``, ``string`` etc. + +Constraints +----------- + +Columns can have constraints to enforce data integrity. For example, some +columns cannot be empty, or store values under or above some threshold. +Several constraints can be combined together. + +Examples +======== + +.. csv-table:: Authors table + :header-rows: 1 + :stub-columns: 1 + + id,first_name,last_name,country,birthdate + 1,Letta,Casbolt,Poland,1947-04-18 + 2,Robbyn,Attwoul,Poland,1954-10-17 + 3,Hesther,Kisby,Ukraine,1941-07-21 + 4,Gav,Jewett,Czech Republic,1988-02-05 + 5,Jorrie,Klehyn,United States,1941-08-07 + 6,Genevieve,Ollington,United States,1921-08-27 + 7,Carrissa,Arrandale,United Kingdom,1982-08-20 + 8,Josepha,Dominichelli,Poland,1976-12-03 + 9,Ario,Hepher,Ukraine,2003-10-11 + 10,Walker,Grolmann,Poland,1964-02-17 diff --git a/src/refs.bib b/src/refs.bib new file mode 100644 index 000000000..e4f38ef8d --- /dev/null +++ b/src/refs.bib @@ -0,0 +1,268 @@ +############################################################################### +# Python training course bibliography database # +############################################################################### +# This document provides references to resources used during course creation. +# Most of them are online documentation from official resource and articles +# published at thematic sites. + + +@misc{docs-python, + title = "{Python Documentation}", + url = {https://docs.python.org}, +} + +@misc{realpython:py3-intro, + title = "Intoduction to Python 3", + author = "John Sturtz", + url = {https://realpython.com/python-introduction/}, + urldate = {2018.5.21}, +} + +@misc{github:stats, + title = "{GitHut 2.0}", + author = "Fabian Beuke", + url = {https://madnight.github.io/githut/#/2022/4}, +} + +@misc{docs-python:keywords, + title = "{Python Documentation}", + url = {https://docs.python.org/3.10/reference/lexical_analysis.html#keywords}, +} + +@misc{python-usage, + title = "Top 10 Python Uses for 2022", + author = "Yancy Dennis", + url = {https://python.plainenglish.io/top-10-python-uses-for-2022-a10cbfb5f041}, + urldate = {2022.1.24}, +} + +@misc{realpython:install-and-setup, + title = "Python 3 Installation & Setup Guide", + author = "{Real Python}", + url = {https://realpython.com/installing-python/}, + urldate = {2020.8.31}, +} + +@misc{realpython:interact, + title = "Interacting with Python", + author = "John Sturtz", + url = {https://realpython.com/interacting-with-python/}, + urldate = {2018.5.28}, +} + +@misc{realpython:code-edit, + title = "Python IDEs and Code Editors (Guide)", + author = "Jon Fincher", + url = {https://realpython.com/python-ides-code-editors-guide/}, + urldata = {2018.3.13}, +} + +@misc{docs-python:operator-precedence, + title = "{Python Documentation}", + url = {https://docs.python.org/3/reference/expressions.html#operator-precedence}, +} + +@misc{docs-python:printf-formatting, + title = "{Python Documentation}", + url = {https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting}, +} + +@misc{docs-python:stdtypes, + title = "{Python Documentation}", + url = {https://docs.python.org/library/stdtypes.html}, +} + +@misc{docs-python:errors, + title = "{Python Documentation: Errors and Exceptions}", + url = {https://docs.python.org/3.11/tutorial/errors.html}, +} + +@misc{docs-python:private-variables, + title = "{Python Documentation: Private Variables}", + url = {https://docs.python.org/3/tutorial/classes.html?highlight=private#private-variables}, +} + +@misc{realpython:decorators, + title = "{Primer on Python Decorators}", + author = "{Geir Arne Hjelle }", + url = {https://realpython.com/primer-on-python-decorators/}, +} + +@misc{docs-python:term-decorator, + title = "{Python Documentation}", + url = {https://docs.python.org/glossary.html#term-decorator}, +} + +@misc{docs-python:function-definition, + title = "{Python Documentation}", + url = {https://docs.python.org/3/reference/compound_stmts.html#function}, +} + +@misc{refactoring.guru:decorator, + title = "{Refactoring Guru: Decorator}", + url = {https://refactoring.guru/design-patterns/decorator}, +} + +@misc{realpython:methods-demystified, + title = "{Python's Instance, Class, and Static Methods Demystified}", + author = "{Dan Bader}", + url = {https://realpython.com/instance-class-and-static-methods-demystified/}, +} + +@misc{realpython:boolean, + title = "{Python Booleans: Use Truth Values in Your Code}", + author = "{Moshe Zadka}", + url = {https://realpython.com/python-boolean/}, +} + +@misc{realpython:boolean-not, + title = "{Using the \"not\" Boolean Operator in Python}", + author = "{Leodanis Pozo Ramos}", + url = {https://realpython.com/python-not-operator/}, +} + +@misc{realpython:boolean-and, + title = "{Using the \"and\" Boolean Operator in Python}", + author = "{Leodanis Pozo Ramos}", + url = {https://realpython.com/python-and-operator/}, +} + +@misc{realpython:boolean-or, + title = "{Using the \"or\" Boolean Operator in Python}", + author = "{Leodanis Pozo Ramos}", + url = {https://realpython.com/python-or-operator/}, +} + +@misc{docs-python:controlflow, + title = "{Python Documentation: 4. More Control Flow Tools}", + url = {https://docs.python.org/tutorial/controlflow.html}, +} + +@misc{github:create-pr, + title = {Creating a pull request}, + author = {GitHub Docs}, + url = {https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request}, +} + +@misc{github:about-pr, + title = {About pull requests}, + author = {GitHub Docs}, + url = {https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests}, +} + +@misc{github:compare-pr, + title = {About comparing branches in pull request}, + author = {GitHub Docs}, + url = {https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-comparing-branches-in-pull-requests}, +} + +@misc{github:ssh, + title = {Generating a new SSH key and adding it to the ssh-agent}, + author = {GitHub Docs}, + url = {https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent}, +} + +@book{progit, + title = {ProGit (2nd Edition)}, + author = {Scott Chacon and Ben Straub}, + year = {2014}, + publisher = {Apress}, + url = {https://git-scm.com/book/en/v2}, + note = {Online Version}, +} + +@misc{realpython:user-func, + title = {Defining Your Own Python Function}, + author = {John Sturtz}, + date = {2020.3.9}, + url = {https://realpython.com/defining-your-own-python-function/}, +} + +@misc{realpython:lambda-func, + title = {How to use Python lambda functions}, + author = {Andre Burgaud}, + date = {2019.6.19}, + url = {https://realpython.com/python-lambda/}, +} + +@misc{medium:db-nf-tut, + title = {A Complete Database Normalization Tutorial}, + author = {Anuradha Wickramarachchi}, + date = {2020.8.27}, + url = {https://medium.com/swlh/a-complete-database-normalization-tutorial-732df3748d0e}, +} + +@misc{medium:db-nf-2, + title = {Database Normalization Demystified}, + author = {Dr. Roi Yehoshua}, + date = {2023.3.10}, + url = {https://medium.com/@roiyeho/what-is-database-normalization-3b66ded5fc4d}, +} + +@misc{medium:db-acid-1, + title = {ACID, MVCC, and how PostgreSQL handles concurrent queries}, + author = {Igor Atakhanov}, + date = {2020.6.15}, + url = {https://medium.com/@igor.atakhanov/acid-mvcc-and-how-postgresql-handles-concurrent-queries-27fb48692db8}, +} + +@misc{medium:db-acid-2, + title = {Database ACID}, + author = {John Lu}, + date = {2023.4.12}, + url = {https://lush93md.medium.com/database-acid-c9eb55d10e20}, +} + +@misc{medium:db-acid-3, + title = {Database ACID Usage}, + author = {Murat Aslan}, + date = {2023.3.8}, + url = {https://medium.com/@murataslan1/database-acid-usage-f9b259091c11}, +} + +@misc{medium:db-acid-cap, + title = {Database:ACID CAP Isolation Levels}, + date = {2017.1.12}, + url = {https://cinish.medium.com/database-acid-cap-isolation-levels-371b7e06a112} +} + +@misc{medium:db-acid-4, + title = {Database : ACID transactions}, + author = {Pier-Jean Malandrino}, + url = {https://medium.com/scub-lab/database-acid-transactions-d2fcc99d8834}, +} + +@misc{realpython:functional, + title = {Functional Programming in Python: When and How to Use It}, + author = {John Sturtz}, + date = {2017.2.17}, + url = {https://realpython.com/python-functional-programming/}, +} + +@misc{medium:func, + title = {Python Function MindMap}, + author = {Ushadeep P.}, + date = {2021.9.25}, + url = {https://medium.com/@ushadeep123/python-function-mindmap-c1c747f5d4da}, +} + +@misc{medium:db-idx, + title = {Understanding Database Indexing}, + author = {Aditya Barik}, + date = {2023.6.11}, + url = {https://medium.com/@aditya.barik32/database-indexing-secrets-d1f93e67bb1b}, +} + +@misc{freecodecamp:db-idx, + title = {An in-depth look at Database Indexing}, + author = {Kousik Nath}, + date = {2019.4.16}, + url = {https://www.freecodecamp.org/news/database-indexing-at-a-glance-bb50809d48bd/}, +} + +@misc{codecademy:db-idx, + title = {What is a Database Index?}, + author = {Codecademy Team}, + date = {}, + url = {https://www.codecademy.com/article/sql-indexes}, +} diff --git a/src/spec/blog b/src/spec/blog new file mode 160000 index 000000000..7432eb332 --- /dev/null +++ b/src/spec/blog @@ -0,0 +1 @@ +Subproject commit 7432eb3321cc6a417ff4adea932e03f1b95e50ad diff --git a/src/spec/giver b/src/spec/giver new file mode 160000 index 000000000..b06b9da62 --- /dev/null +++ b/src/spec/giver @@ -0,0 +1 @@ +Subproject commit b06b9da6287646c51d4145f5dd0ab64e4745ef2f diff --git a/src/spec/libms b/src/spec/libms new file mode 160000 index 000000000..20ce2effb --- /dev/null +++ b/src/spec/libms @@ -0,0 +1 @@ +Subproject commit 20ce2effb90877f3dd93f51ffe242f6fda0c3c6d diff --git a/src/vcs/basics.txt b/src/vcs/basics.txt new file mode 100644 index 000000000..7bf6b5951 --- /dev/null +++ b/src/vcs/basics.txt @@ -0,0 +1,750 @@ +.. meta:: + :description: Version control system + :author: Serhii Horodilov + :keywords: version, control, system, vcs, git, basics + +******************************************************************************* + Git Basics +******************************************************************************* + +Getting a Git repository +======================== + +You typically obtain a Git repository in one of two ways: + +#. You can take a local directory that is currently not under version control, + and turn it into a Git repository. +#. You can clone an existing Git repository from elsewhere. + +In either case, you end up with a Git repository on your local machine, +ready for work. + +Initializing repo in an existing directory +------------------------------------------ + +If you have a project directory that is currently not under version control and +you want to start controlling it with Git, you first need to go to that +project's directory. If you've never done this, it looks a little different +depending on which system you're running: + +.. code-block:: shell + :caption: Change directory in bash (Linux) + + cd /home/user/project + +.. code-block:: shell + :caption: Change directory in bash (MacOS) + + cd /Users/user/project + +.. code-block:: powershell + :caption: Change directory in PowerShell (Windows) + + cd C:\Users\user\project + +In the project's directory initialize a new Git repository. + +:: + + git init + +This creates a new subdirectory named .git that contains all of your necessary +repository files -- a Git repository skeleton. + +Cloning an existing repo +------------------------ + +If you want to get a copy of an existing Git repository -- for example, +a project you'd like to contribute to -- the command you need is ``git clone``. + +.. code-block:: shell + + git clone https://github.com/edu-python-course/edu-python-course.github.io + +That creates a directory named *edu-python-course.github.io*, initializes a +*.git* directory inside it, pulls down all the data for that repository, +and checks out a working copy of the latest version. + +.. code-block:: shell + + git clone https://github.com/edu-python-course/edu-python-course.github.io python-course + +That command does the same thing as the previous one, but the target directory +is called *python-course*. + +Git has a number of different transfer protocols you can use. The previous +example uses the ``https://`` protocol, but you may also see ``git://`` or +``user@server:path/to/repo.git``, which uses the SSH transfer protocol. + +Making changes to the repo +========================== + +At this point, you should have a *bona fide* Git repository on your local +machine, and a checkout or *working copy* of all of its files in front of you. +Typically, you'll want to start making changes and committing snapshots of +those changes into your repository each time the project reaches a state you +want to record. + +Remember that each file in your working directory can be in one of two states: +**tracked** or **untracked**. + +- Tracked files are files that were in the last snapshot, as well as any + newly staged files; they can be unmodified, modified, or staged. In short, + tracked files are files that Git knows about. +- Untracked files are everything else -- any files in your working directory + that were not in your last snapshot and are not in your staging area. + Untracked basically means that Git sees a file you didn't have in + a previous snapshot (commit), and which hasn't been yet staged. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/lifecycle.mmd + :align: center + :caption: The lifecycle of the status of repo's files + +.. only:: latex + + .. figure:: /../assets/mermaid/git/lifecycle.mmd.png + :align: center + + The lifecycle of the status of repo's files + +Checking out status of the file(s) +---------------------------------- + +The main tool you use to determine which files are in which state is +the ``git status`` command. + +:: + + $ # check status + $ git status + On branch devel + + No commits yet + + nothing to commit (create/copy files and use "git add" to track) + + $ # add file to the repository + $ echo "# Project Title" > README.md + $ # check status once again + $ git status + On branch devel + + No commits yet + + Untracked files: + (use "git add ..." to include in what will be committed) + README.md + + nothing added to commit but untracked files present (use "git add" to track) + +Newly added *README.md* file is untracked, because it's under "Untracked files" +heading the status output. + +Tracking new files +------------------ + +In order to begin tracking a new file, you use the ``git add`` command. + +:: + + $ git add README.md + $ git status + On branch devel + + No commits yet + + Changes to be committed: + (use "git rm --cached ..." to unstage) + new file: README.md + +From now *README.md* file is **added** to the stage area and ready to be +committed (is under "Changes to be committed" heading). + +.. hint:: + You can use wildcards, to stage multiple files at once. The most common + use cases is to add **all** modified files, or files inside of a specific + directory. + + :: + + git add * # stage all changes + git add . # stage all changes in current directory + git add docs # stage all changes in "docs" directory + +Staging modified files +---------------------- + +If a staged (or already committed) file has been changed, it will be moved +under "Modified" heading. These changes wouldn't be committed unless they are +staged. + +:: + + $ git status + On branch devel + + No commits yet + + Changes to be committed: + (use "git rm --cached ..." to unstage) + new file: README.md + + Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git restore ..." to discard changes in working directory) + modified: README.md + +- Changes may be added to the stage area by repeating ``git add`` command. +- Changes may be discard by ``git restore `` command. This action will + restore file to its **staged** version. + +Committing changes +------------------ + +Now that the stage area is set up the way required, it's time to commit +changes. Remember that anything that is still unstaged -- any files you +have created or modified that you haven't run git add on since you edited +them -- won't go into this commit. + +The simplest way to commit is to type ``git commit``: + +:: + + git commit + +Doing so launches your editor of choice. + +.. note:: + This is set by your shell's EDITOR environment variable -- usually vim or + emacs, although you can configure it with whatever you want using + the ``git config --global core.editor`` + +Alternatively, you can type your commit message inline with the ``commit`` +command by specifying it after a ``-m`` flag, like this: + +:: + + git commit -m "Add GitHub workflow to test Sphinx builds for PRs to devel" + +Although it can be amazingly useful for crafting commits exactly how you want +them, the staging area is sometimes a bit more complex than you need in your +workflow. If you want to skip the staging area, Git provides a simple shortcut. +Adding the ``-a`` option to the ``git commit`` command makes Git automatically +stage every file that is already tracked before doing the commit, letting you +skip the git add part: + +:: + + $ git status + On branch devel + + No commits yet + + Changes to be committed: + (use "git rm --cached ..." to unstage) + new file: README.md + + Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git restore ..." to discard changes in working directory) + modified: README.md + + Untracked files: + (use "git add ..." to include in what will be committed) + example.json + + $ git commit -a -m "Commit tracked files" + [devel (root-commit) 7acb7a1] Commit tracked files + 1 file changed, 3 insertions(+) + create mode 100644 README.md + + $ git status + On branch devel + Untracked files: + (use "git add ..." to include in what will be committed) + example.json + + nothing added to commit but untracked files present (use "git add" to track) + +Ignoring files +-------------- + +Often, there is a class of files, that should not be a part of a repo. You +want these files to be prevent from being automatically added or even shown +as being untracked. These are generally files produced by loggers or a build +system, or some local settings for the project that shouldn't be shared across +other developers or maintainers. In such cases you can create a *.gitignore* +file. Here is the content of *.gitignore* used in current repository: + +:: + + # virtual environment + /.venv/ + /.env/ + /venv/ + /env/ + + # node packages + /node_modules/ + + # ide configs + /.vscode/ + /.idea/ + + # emacs cache and backup files + \#* + *~ + + # temporary files storage + /temp/ + /tmp/ + + # documentation builds + _builds/ + _build/ + builds/ + build/ + + # translation object files + *.pot + *.mo + +These lines mean: + +- Content within directories named ".venv", ".env", "venv" or "env" + will be ignored completely. +- Content within "node_modules" directory will be ignored completely. +- Any files within directories named ".vscode" or ".idea" will be ignored + completely. +- Any file with name starting with hash (#) will be ignored. +- Any file with name ending with tilda (~) will be ignored. +- Content within directories named "temp" or "tmp" will be ignored + completely. +- Content within directories named "_builds", "_build", "builds" or + "build" will be ignored completely. +- Any file with name ending with ".pot" will be ignored. +- Any file with name ending with ".mo" will be ignored. + +Setting up a *.gitignore* file for your new repository before you get going is +generally a good idea so you don't accidentally commit files that you really +don't want in your Git repository. + +The rules for the patterns you can put in the *.gitignore* file are as follows: + +- Blank lines or lines starting with # are ignored. +- Standard glob patterns work, and will be applied recursively throughout + the entire working tree. +- You can start patterns with a forward slash (/) to avoid recursive + inclusion. +- You can end patterns with a forward slash (/) to specify a directory. +- You can negate a pattern by starting it with an exclamation point (!). + +Glob patterns are like simplified regular expressions that shells use. +An asterisk (\*) matches zero or more characters; [ab] matches any character +inside the brackets (in this case a or b); a question mark (?) matches +a single character; and brackets enclosing characters separated by a hyphen +([0-9]) matches any character between them (in this case 0 through 9). +You can also use two asterisks to match nested directories; +a/\*\*/z would match *a/z*, *a/b/z*, *a/b/c/z*, and so on. + +Viewing the commit history +========================== + +After you have created several commits, or if you have cloned a repository with +an existing commit history, you'll probably want to look back to see what has +happened. The most basic and powerful tool to do this is the ``git log`` +command. + +:: + + $ git log + co mmit 8b755eb400a1db7f88ca2058094321dcefea7f9c (HEAD -> feature/vcs, origin/feature/vcs) + Author: Serhii Horodilov + Date: Wed Aug 16 15:26:39 2023 +0300 + + Update gitflow diagram + + commit 1e131a0c9faee2a22ea2bae8f31f8c7ee04fefc5 + Author: Serhii Horodilov + Date: Wed Aug 16 14:46:39 2023 +0300 + + fixup! Add translations to VSC documents + + commit 895dc24343fbbe25c3c94b25091ac64ac8aea53d + Author: Serhii Horodilov + Date: Wed Aug 16 14:42:10 2023 +0300 + + Add translations to VSC documents + +By default, with no arguments, ``git log`` lists the commits made in that +repository in reverse chronological order; that is, the most recent commits +show up first. As you can see, this command lists each commit with its SHA-1 +checksum, the author's name and email, the date written, and the commit +message. + +One of the more helpful options is ``-p`` or ``--patch``, which shows the +difference (the *patch* output) introduced in each commit. You can also +limit the number of log entries displayed, such as using ``-`` to +show only desired number of latest entries. + +:: + + $ git log -p -1 + commit 8b755eb400a1db7f88ca2058094321dcefea7f9c (HEAD -> feature/vcs, origin/feature/vcs) + Author: Serhii Horodilov + Date: Wed Aug 16 15:26:39 2023 +0300 + + Update gitflow diagram + + diff --git a/assets/mermaid/git/gitflow.mmd b/assets/mermaid/git/gitflow.mmd + index 6287bbb..4e4eab7 100644 + --- a/assets/mermaid/git/gitflow.mmd + +++ b/assets/mermaid/git/gitflow.mmd + @@ -19,8 +19,6 @@ gitGraph + commit + branch feature/C + commit + - commit + - commit + + %% working with hotfix branch + checkout hotfix + @@ -35,7 +33,6 @@ gitGraph + %% working with feature-b branch + checkout feature/A + commit + - commit + checkout develop + merge feature/A + %% work with feature-a branch + +This option display the same information but with a diff directly following +each entry. This is very helpful for code review or to quickly browse what +happened during a series of commits that a collaborator has added. You can also +use a series of summarizing options with ``git log``. + +If you want to see some abbreviated stats for each commit, you can use the +``--stat`` option: + +:: + + $ git log -1 --stat + commit 8b755eb400a1db7f88ca2058094321dcefea7f9c (HEAD -> feature/vcs, origin/feature/vcs) + Author: Serhii Horodilov + Date: Wed Aug 16 15:26:39 2023 +0300 + + Update gitflow diagram + + assets/mermaid/git/gitflow.mmd | 3 --- + 1 file changed, 3 deletions(-) + + commit 1e131a0c9faee2a22ea2bae8f31f8c7ee04fefc5 + Author: Serhii Horodilov + Date: Wed Aug 16 14:46:39 2023 +0300 + + fixup! Add translations to VSC documents + + src/_locales/uk/LC_MESSAGES/vcs.po | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +Another really useful option is ``--pretty``. This option changes the log +output to formats other that the default. A few prebuilt option values are +available for you to use. The ``oneline`` value for this option prints each +commit on a single line, which is useful if you're look a lot of commits. +In addition, the ``short``, ``full``, and ``fuller`` values show the output +in roughly the same format but with less or more information. + +:: + + $ git log --pretty=oneline + 8b755eb400a1db7f88ca2058094321dcefea7f9c (HEAD -> feature/vcs, origin/feature/vcs) Update gitflow diagram + 1e131a0c9faee2a22ea2bae8f31f8c7ee04fefc5 fixup! Add translations to VSC documents + 895dc24343fbbe25c3c94b25091ac64ac8aea53d Add translations to VSC documents + 30cb1a2db3d62210010b05df634e1ec87e5ef748 Fix apostrophe for VCS files + 79427a88defef82bc92482cfaf7da5fba3260f5e Add commit document (draft) + 0786a699e6901a6c968090422b3cec789402ad21 Update branches document + 74710531809a9cbbdec1979ef8ae775a034c2027 Fixed GitFlow branches list + +:: + + $ git log -10 --pretty=format:"%h - %an - %ad" + 8b755eb - Serhii Horodilov - Wed Aug 16 15:26:39 2023 +0300 + 1e131a0 - Serhii Horodilov - Wed Aug 16 14:46:39 2023 +0300 + 895dc24 - Serhii Horodilov - Wed Aug 16 14:42:10 2023 +0300 + 30cb1a2 - Serhii Horodilov - Wed Aug 16 14:41:49 2023 +0300 + 79427a8 - Serhii Horodilov - Mon Jul 31 14:31:08 2023 +0300 + 0786a69 - Serhii Horodilov - Mon Jul 31 14:30:54 2023 +0300 + 7471053 - Serhii Horodilov - Fri Jul 28 15:13:15 2023 +0300 + be60eb3 - Serhii Horodilov - Fri Jul 28 14:54:09 2023 +0300 + 24972b1 - Serhii Horodilov - Fri Jul 28 14:53:37 2023 +0300 + 4a9cfe4 - Serhii Horodilov - Fri Jul 28 14:32:53 2023 +0300 + ++-----------+---------------------------------------------------+ +| Specifier | Description of Output | ++===========+===================================================+ +| %H | Commit hash | ++-----------+---------------------------------------------------+ +| %h | Abbreviated commit hash | ++-----------+---------------------------------------------------+ +| %T | Tree hash | ++-----------+---------------------------------------------------+ +| %t | Abbreviated tree hash | ++-----------+---------------------------------------------------+ +| %P | Parent hashes | ++-----------+---------------------------------------------------+ +| %p | Abbreviated parent hashes | ++-----------+---------------------------------------------------+ +| %an | Author name | ++-----------+---------------------------------------------------+ +| %ae | Author email | ++-----------+---------------------------------------------------+ +| %ad | Author date (format respects the --date=option) | ++-----------+---------------------------------------------------+ +| %ar | Author date, relative | ++-----------+---------------------------------------------------+ +| %cn | Committer name | ++-----------+---------------------------------------------------+ +| %ce | Committer email | ++-----------+---------------------------------------------------+ +| %cd | Committer date | ++-----------+---------------------------------------------------+ +| %cr | Committer date, relative | ++-----------+---------------------------------------------------+ +| %s | Subject | ++-----------+---------------------------------------------------+ + +The ``oneline`` and ``format`` option values are particularly useful with +another ``log`` option called ``--graph``. This option adds a nice little +ASCII graph showing your branch and merge history: + +:: + + $ git log --pretty=format:"%h %s" --graph + * f9b988f Created base documentation structure + * 3fabf55 Started global course updated + * 06662ae Merge pull request #13 from edu-python-course/master + |\ + | * 3579eea Update to suite edu-python-course/blog#74 + |/ + * 3fb7725 Merge remote-tracking branch 'origin/master' + |\ + | * 181b66d Merge remote-tracking branch 'origin/master' + | |\ + | * | 52e0ef8 add lesson21 hw + * | | 830a246 fix lesson32 hw + | |/ + |/| + * | 59697e9 fix lesson2 typos + * | a6f77db fix lesson2 typos + * | 213b220 fix lesson2 typos + * | 9b69f5f fix lesson2 typos + * | 6a0b9c8 fix lesson2 typos + |/ + * bda497f add lesson2 + +There are many more output-formatting options to ``git log``. Common options to +``git log`` are: + ++-------------------+---------------------------------------------------------+ +| Option | Description | ++===================+=========================================================+ +| -p | Show the patch introduced with each commit. | ++-------------------+---------------------------------------------------------+ +| --stat | Show statistics for files modified in each commit. | ++-------------------+---------------------------------------------------------+ +| --shortstat | Display only the changed/insertions/deletions line | +| | from the --stat command. | ++-------------------+---------------------------------------------------------+ +| --name-only | Show the list of files modified after the commit | +| | information. | ++-------------------+---------------------------------------------------------+ +| --name-status | Show the list of files affected with | +| | added/modified/deleted information as well. | ++-------------------+---------------------------------------------------------+ +| --abbrev-commit | Show only the first few characters of the SHA-1 | +| | checksum instead of all 40. | ++-------------------+---------------------------------------------------------+ +| --relative-date | Display the date in a relative format (for example, | +| | "2 weeks ago") instead of using the full date format. | ++-------------------+---------------------------------------------------------+ +| --graph | Display an ASCII graph of the branch and merge history | +| | beside the log output. | ++-------------------+---------------------------------------------------------+ +| --pretty | Show commits in an alternate format. Option values | +| | include oneline, short, full, fuller, and format (where | +| | you specify your own format). | ++-------------------+---------------------------------------------------------+ +| --oneline | Shorthand for --pretty=oneline --abbrev-commit used | +| | together. | ++-------------------+---------------------------------------------------------+ + +Limiting log output +------------------- + +In addition to output-formatting options, ``git log`` takes a number of useful +limiting options; that is options that let you show only a subset of commits. +You've seen one such option already -- the ``-`` (e.g. ``-2`` or +``-10``) option, which displays only the given number of latest commits. + +:: + + $ git log -5 --oneline + db87ca0 (HEAD -> feature/vcs) fixup! Add commit history section (git log) + df9d599 Add commit history section (git log) + 8b755eb (origin/feature/vcs) Update gitflow diagram + 1e131a0 fixup! Add translations to VSC documents + 895dc24 Add translations to VSC documents + +However, the time-limiting options such as ``--since`` and ``--until`` are very +useful. For example, the command to get the list of commits made in the last +two weeks: + +:: + + $ git log --since=2.weeks + +This command works with lots of formats - you can specify a specific date like +``"2022-02-24"``, or relative date such as ``"2 years 1 days 3 minutes ago"``. + +The last really useful option to pass to ``git log`` as a filter is a path. If +you specify a directory or file name, you can limit the log output to commits +that introduced a change to those files. This is always the last option and +is generally preceded by double dashes (``--``) to separate the paths from +the options: + +:: + + $ git log --oneline -- src/vcs/basics.txt + 30cb1a2 Fix apostrophe for VCS files + 4a9cfe4 Move mermaid diagrams to a dedicated folder (git) + 80a1ab3 Add branching and merging document + 3978779 Add committing changes section + a40712a Add git ignore section + e92b12f Add making changes section + c23f8ff Update getting repository section + 582569d Add Git basics document (draft) + +Undoing things +============== + +At any stage, you may want to undo something. + +One of the common undos takes place when you commit too early and possibly +forget to add some files, or you mess up your commit message. If you want +to redo that commit, make the additional changes you forgot, stage them, +and commit again using the ``--amend`` option: + +:: + + $ git commit --amend + +E.g. + +:: + + $ git commit -m "Initial commit" + $ git add forgotten_file + $ git commit --amend + +Unstaging a staged file +----------------------- + +The next two sections demonstrate how to work with your staging area and +working directory changes. The nice part is that the command you use to +determine the state of those two areas also reminds you how to undo changes +to them. + +:: + + $ git add * + $ git status + On branch master + + Changes to be committed: + (use "git reset HEAD ..." to unstage) + renamed: README.md -> README + modified: CONTRIBUTING.md + $ git reset HEAD CONTRIBUTING.md + Unstaged changes after reset: + M CONTRIBUTING.md + $ git status + On branch master + + Changes to be committed: + (use "git reset HEAD ..." to unstage) + renamed: README.md -> README + + Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git checkout -- ..." to discard changes in working directory) + modified: CONTRIBUTING.md + +Unmodifiyng a modified file +--------------------------- + +What if you realize that you don't want to keep your changes to some file? +You can easily unmodify it -- **revert** it back to what it looked like when +you last committed. ``git status`` also tells you how to do that: + +:: + + (use "git checkout -- ..." to discard changes in working directory) + +It tells you pretty explicitly how to discard the changes you've make. + +:: + + $ git checkout -- CONTRIBUTING.md + $ git status + On branch master + + Changes to be committed: + (use "git reset HEAD ..." to unstage) + renamed: README.md -> README + +Undoing things with git restore +------------------------------- + +.. versionadded:: 2.23.0 + ``git restore`` is basically an alternative to ``git reset``, from + Git version 2.23.0 onwards, Git will use ``git restore`` instead of + ``git reset`` for many undo operations. + +:: + + $ git add * + $ git status + On branch master + + Changes to be committed: + (use "git restore --staged ..." to unstage) + modified: CONTRIBUTING.md + renamed: README.md -> README + $ git restore --staged CONTRIBUTING.md + $ git status + On branch master + + Changes to be committed: + (use "git restore --staged ..." to unstage) + renamed: README.md -> README + + Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git restore ..." to discard changes in working directory) + modified: CONTRIBUTING.md + $ git restore CONTRIBUTING.md + $ git status + On branch master + + Changes to be committed: + (use "git restore --staged ..." to unstage) + renamed: README.md -> README + +.. important:: + It’s important to understand that git restore is a dangerous + command. Any local changes you made to that file are gone -- Git just + replaced that file with the last staged or committed version. Don't ever + use this command unless you absolutely know that you don’t want those + unsaved local changes. diff --git a/src/vcs/branch.txt b/src/vcs/branch.txt new file mode 100644 index 000000000..23742933f --- /dev/null +++ b/src/vcs/branch.txt @@ -0,0 +1,436 @@ +.. meta:: + :description: Version control system + :author: Serhii Horodilov + :keywords: version, control, system, vcs, git, branch, merge, cherry-pick + +******************************************************************************* + Branches and Merging +******************************************************************************* + +About branches +============== + +To really understand the way Git does branching, we need to take a step back +and examine how Git stores its data. Git doesn't store data as a series of +changesets or differences, but instead as a series of snapshots. When you make +a commit, Git stores a commit object that contains a pointer to the snapshot +of the content you staged. This object also contains the author's name and +email address, the message that you typed, and pointers to the commit or +commits that directly came before this commit (its parent or parents): +zero parents for the initial commit, one parent for a normal commit, +and multiple parents for a commit that results from a merge of two or more +branches. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/commits.mmd + :align: center + :caption: Commits tree + +.. only:: latex + + .. figure:: /../assets/mermaid/git/commits.mmd.png + :align: center + + Commits tree + +A branch in Git is simply a lightweight movable pointer to one of these +commits. The default branch name in Git is master. As you start making commits, +you're given a master branch that points to the last commit you made. +Every time you commit, the master branch pointer moves forward automatically. + +.. figure:: /../assets/img/git-commits.svg + :align: center + + +Branch management +================= + +The ``git branch`` command does more that create and delete branches. If you +run it with no arguments, you get a simple listing of your current branches: + +:: + + $ git branch + devel + feature/contributing + feature/legacy + feature/lib-ms + feature/libms + feature/pdf-builder + * feature/vcs + master + +To see all the branches that contain work you haven't yet merged in, use +``--no-merged`` option: + +:: + + $ git branch --no-merged + feature/contributing + feature/lib-ms + feature/libms + +Branches listed in the output has work, that isn't merged to current branch. +So, deleting them via ``git branch -d`` will fail. + +Create branches +--------------- + +There are few ways to create a new branch in a Git repository. The most common +way is to use ``git branch`` command. + +:: + + git branch [parent_commit] + +Pointer to a parent commit is optional. By default the parent commit is set +to the latest one available (HEAD pointer) at the moment of the branch +creation. You can also switch to the newly created branch just after its +creation using: + +:: + + git checkout -b [parent_commit] + +Switching branches +------------------ + +To switch to an existing branch, you run the ``git checkout`` command. + +:: + + $ git branch + devel + feature/contributing + feature/legacy + feature/lib-ms + feature/libms + feature/pdf-builder + * feature/vcs + master + + $ git checkout devel + Switched to branch 'devel' + Your branch is up to date with 'origin/devel'. + +Basic branching and merging +=========================== + +First, let's say you're working on your project and have a couple of commits +already on the ``master`` branch. You've decided that you're going to work on +**feature #53** in whatever issue-tracking system your company uses. To create +a new branch and switch to it at the same time, you can run the +``git checkout`` command with the ``-b`` switch: + +:: + + $ git checkout -b feature/GH-53 + Switched to a new branch "feature/GH-53" + +This is shorthand for: + +:: + + $ git branch feature/GH-53 + $ git checkout feature/GH-53 + +In deed this creates a new branch pointer, aimed to the latest commit present +on ``master`` branch. But, from now your branch is ``feature/GH-53``. So, doing +commits moves the feature branch pointer forward, because you have it checkout +out (that is, your ``HEAD`` is pointing to it). + +Now, lets assume the "GH-53" is done, and you need to bring commits from +the ``feature/GH-53`` branch back to ``master``. + +Merging branches +---------------- + +You need to switch back to ``master`` branch and use ``git merge`` command, to +merge changes (commits) from the source branch into target. + +:: + + $ git checkout master + $ git merge feature/GH-53 + Updating f42c576..3a0874c + Fast-forward + index.html | 2 ++ + 1 file changed, 2 insertions(+) + +You'll notice phrase "fast-forward" in that merge. Because the commit pointed +to by the branch ``feature/GH-53`` you merged in was directly ahead of the last +commit on ``master`` branch, Git simply moves the pointer forward. + +Changes from ``feature/GH-53`` are now in the snapshot of the commit pointed +to by the ``master`` branch. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/merge-1.mmd + :align: center + :caption: Fast-forward merge + +.. only:: latex + + .. figure:: /../assets/mermaid/git/merge-1.mmd.png + :align: center + + Fast-forward merge + +Now, lets assume another developer started working on ``feature/GH-54`` at +the same time. And there are few commits on this feature branch. Suppose, +the developer decided that work on **GH-54** is finished and they want to +merge their feature branch into ``master``. + +:: + + $ git branch + master + * feature/GH-54 + $ git checkout master + $ git merge feature/GH-54 + Merge made by the 'recursive' strategy. + index.html | 1 + + 1 file changed, 1 insertion(+) + +This looks a bit different than the ``feature/GH-53`` merge. In this case, +development history has diverged from some older point. Because the commit +on the branch you're on isn't a direct ancestor of the branch you're merging +in, Git has to do some work. In this case, Git does a simple three-way merge, +using two snapshots pointed to by the branch tips and the common ancestor of +the two. + +Instead of just moving the branch pointer forward, Git creates a new snapshot +that results from this three-way merge and automatically creates a new commit +that points to it. This is referred to as a *merge commit*, and is a special in +that it has more than one parent. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/merge-2.mmd + :align: center + :caption: Merge commit + +.. only:: latex + + .. figure:: /../assets/mermaid/git/merge-2.mmd.png + :align: center + + Merge commit + +Merge conflicts +--------------- + +Occasionally, the merge process doesn't go smoothly. If the same part of +the same file is changed differently in the two branches you're merging, Git +won't be able to merge them cleanly. + +:: + + $ git merge vcs + Auto-merging branches.txt + CONFLICT (content): Merge conflict in branches.txt + Automatic merge failed; fix conflicts and then commit the result + +Git hasn't automatically created a new merge commit. It has paused the process +while you resolve the conflict. If you want to see which files are unmerged at +any point after a merge conflict, you can run ``git status``: + +:: + + $ git status + On branch master + + You have unmerged paths. + (fix conflicts and run "git commit") + + Unmerged paths: + (use "git add ..." to mark resolution) + + both modified: branches.txt + + no changes added to commit (use "git add" and/or "git commit -a") + +Anything that has merge conflicts and hasn't been resolved is listed as +unmerged. Git adds standard conflict-resolution markers to the files that +have conflicts, so you can open them manually and resolve those conflicts. +Your file contains a section that looks something like this: + +:: + + <<<<<<< HEAD:branches.txt + Anything that has merge conflicts and has not been resolved is listed as + ======= + Anything that has merge conflicts + and hasn't been resolved is listed as + + >>>>>>> vcs:branches.txt + +This means the version in ``HEAD`` (your ``master`` branch, because that was +what you had checked out when you ran merge command) is the top part of that +block (everything above the "======="), while the version in ``vcs`` branch +looks like everything in the bottom part. In order to resolve the conflict, +you have to either choose one side or the other or merge the contents yourself. + +When conflicts are resolved, you can run ``git status`` command again: + +:: + + $ git status + On branch master + + All conflicts fixed but you are still merging. + (use "git commit" to conclude merge) + + Changes to be committed: + modified: branches.txt + +If you're happy with that, and you verify that everything that had conflicts +has been staged, you can run ``git commit`` for finalize the merge commit. + +Rebasing +======== + +In Git, there two main ways to integrate changes from one branch into another: +the ``merge`` and the ``rebase``. + +Earlier, there was an example of diverged work and commits made on two +different branches. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/rebase-1.mmd + :align: center + :caption: Before rebase + +.. only:: latex + + .. figure:: /../assets/mermaid/git/merge-2.mmd.png + :align: center + + Merge commit + +The easiest way to integrate the branches, as we've already covered, is +the ``merge`` command. It performs a three-way merge between the two latest +branch snapshots, and the most recent common ancestor of the two, creating +a new snapshot (and commit). + +However, there is another way: you can take the patch of the change that was +introduced in ``master`` and reapply it on top of ``feature``. In Git, this is +called *rebasing*. With ``rebase`` command, you can take all the changes that +were committed on one branch and replay them on a different branch. + +:: + + $ git checkout feature + $ git rebase master + First, rewinding head to replay your work on top of it... + Applying: added staged command + +This operation works by going to the common ancestor of the two branches, +getting the diff introduced by each commit of the branch you're on, saving +those diffs to temporary files, resetting the current branch to the same +commit as the branch you are rebasing onto, and finally applying each change +in turn. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/rebase-2.mmd + :align: center + :caption: After rebase + +.. only:: latex + + .. figure:: /../assets/mermaid/git/rebase-2.mmd.png + :align: center + + After rebase + +.. note:: + Other maintainers prefer to rebase (or cherry-pick) contributed work on + top of their ``master`` branch, rather then merging it in, to keep + a mostly linear history. + +Cherry-picking +============== + +The other way to move introduced work from one branch to another is to +*cherry-pick* it. A cherry-pick in Git is a rebase for a single commit. +It takes the patch that was introduced in a commit and tries to reapply +it on the branch you're currently on. This is useful if you have a number +of commits on a topic branch and you want to integrate only one of them, +or if you only have one commit on a topic branch and you'd prefer to +cherry-pick it rather than run rebase. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/cherry-pick.mmd + :align: center + :caption: Cherry-pick a commit + +.. only:: latex + + .. figure:: /../assets/mermaid/git/cherry-pick.mmd.png + :align: center + + Cherry-pick a commit + +:: + + $ git cherry-pick e43a6 + [master 0288270] Important commit + Date: Thu Aug 17 20:30:05 2023 +0300 + 3 files changed, 17 insertions(+), 3 deletions(-) + +Branching strategies +==================== + +Branching strategy in version control systems defines how branches are created, +managed, and used in a project's development process. +It helps teams collaborate effectively, isolate changes, and organize +development efforts. A good branching strategy provides clarity on how to work +with branches, minimizes conflicts, and enables a smooth and structured +development workflow. + +GitFlow is a popular branching strategy that provides a well-defined model for +managing branches in a Git repository. It was introduced by Vincent Driessen +and is based on the idea of using two main branches: "master" and "develop." + +- **Master Branch**: The "master" branch represents the stable version of + the codebase. It should always contain production-ready code and be free + from any major issues. The "master" branch is protected, and only release + versions are merged into it. +- **Develop Branch**: The "develop" branch is where the ongoing development + and integration of features take place. It serves as the integration branch + for various feature branches and should also contain a stable version of + the code. +- **Feature Branches**: For each new feature or bug fix, a dedicated + "feature" branch is created off the "develop" branch. These branches are + short-lived and exist only for the duration of the feature development. +- **Release Branches**: When the development on the "develop" branch is ready + for a release, a "release" branch is created. The release branch is used + for testing, bug fixing, and preparing for deployment. +- **Hotfix Branches**: If a critical issue is discovered in the production + version, a "hotfix" branch is created from the "master" branch. This allows + for a quick fix without affecting ongoing development on the "develop" + branch. + +GitFlow provides a structured approach to managing branching in a collaborative +development environment. It ensures that the main branches remain stable, and +new features and bug fixes are integrated smoothly before being released. +This strategy is particularly useful for projects with regular releases and +a team working on multiple features concurrently. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/gitflow.mmd + :align: center + :caption: GitFlow diagram + +.. only:: latex + + .. figure:: /../assets/mermaid/git/gitflow.mmd.png + :align: center + + GitFlow diagram diff --git a/src/vcs/github.txt b/src/vcs/github.txt new file mode 100644 index 000000000..6ed39d2c3 --- /dev/null +++ b/src/vcs/github.txt @@ -0,0 +1,139 @@ +.. meta:: + :description: Version control system + :author: Serhii Horodilov + :keywords: version, control, system, vcs, git, github + +.. _GitHub: https://github.com + +******************************************************************************* + GitHub +******************************************************************************* + +`GitHub`_ is the single largest host for Git repositories, and is the central +point of collaboration for millions of developers and projects. + +Account setup and configuration +=============================== + +The first thing you need to do is set up a free user account. Visit `GitHub`_ +and press "Sign Up" button. The GitHub will lead you through the account +creation process. Just follow the hints and provide an email address, username +and a strong password. + +About authentication to GitHub +------------------------------ + +.. note:: + Starting in March 2023 and through the end of 2023, GitHub gradually began + to require all users who contribute code on GitHub to enable two-factor + authentication (2FA). + +Connect with SSH +================ + +You can access and write data in repositories on GitHub using +:abbr:`SSH (Secure Shell Protocol)`. When you connect to via SSH, you +authenticate using a private key file on your local machine. + +Generating a new SSH key +------------------------ + +You can generate a new SSH key on your local machine. After you do that, +you can add the **public** key to your account on GitHub to enable +authentication for Git operations over SSH. + +#. Open terminal (git-bash will suite for Windows users) +#. Run command: + + :: + + ssh-keygen -t ed25519 -C "your@email.com" + + .. note:: + If you are using a legacy system that doesn't support the **Ed25519** + algorithm, use: + + :: + + ssh-keygen -t rsa -b 4096 -C "your@email.com" + + When you're prompted to "Enter a file in which to save the key", you can + press **Enter** to accept the default file location. + + :: + + $ Enter a file in which to save the key (~/.ssh/id_ALGORITHM):[Press enter] + + Type a secure passphrase, if you want -- this is an extra layer of + security. + + :: + + $ Enter passphrase (empty for no passphrase): [Type a passphrase] + $ Enter same passphrase again: [Type passphrase again] + + This will create a new SSH key, using the provided email as label. + +Navigate to ssh key location -- ".ssh" folder at your homedir by default and +ensure there are two files generated: + +- **id_ALGORITHM** (e.g. "id_rsa", "id_ed252519" etc.) +- **id_ALGORITHM.pub** (e.g. "id_rsa.pub", "id_ed25519.pub" etc.) + +.. important:: + The private key (the one without ".pub") should be kept secure and private. + You should never share this. + + The public key is what you add to servers or services to which you want + to authenticate using your private key. + +Adding your SSH key to the ssh-agent and GitHub +----------------------------------------------- + +Before adding a new SSH key to the ssh-agent to manage your keys, you should +have checked for existing SSH keys and generated SSH keys. + +#. Ensure the ssh-agent is running. You can use the "Auto-launching" or + start it manually: + + :: + + $ eval "$(ssh-agent -s)" + > Agent pid 12345 + +#. Add you SSH private key to the ssh-agent. + + :: + + ssh-add ~/.ssh/id_ALGORITHM + +#. Add the SSH public key to your account on GitHub. + Copy the SSH public key to your clipboard. + + :: + + clip < ~/.ssh/id_ALGORITHM.pub + + Alternatively, if ``clip`` isn't working, just type public key content + to the terminal using ``cat``, + + :: + + cat ~/.ssh/id_ALGORITHM.pub + + or simply navigate to the file and open it with any text editor. + At the end, you need to copy public key content. + +#. On GitHub, in the upper-right corner of any page, click your profile photo, + then click **Settings**. +#. In the "Access" section of the sidebar, click + **SSH and GPG keys** and press **New SSH key** button. +#. In the "Title" field, add a descriptive label for the new key. +#. Select the type of key -- "Authentication key". +#. In the "Key" field, paste your public key. +#. Click **Add SSH key**. +#. If prompted, confirm access to your account on GitHub. + +.. todo: + GNU Privacy Guard + diff --git a/src/vcs/index.txt b/src/vcs/index.txt new file mode 100644 index 000000000..d52522ad2 --- /dev/null +++ b/src/vcs/index.txt @@ -0,0 +1,36 @@ +.. meta:: + :description: Version control system + :author: Serhii Horodilov + :keywords: version, control, system, vcs, git + +############################################################################### + Version Control System +############################################################################### + +:abbr:`VCS (Version Control Systems)` play an integral role in modern software +development. They allow multiple developers to work on a project simultaneously +without overwriting each other's changes. VCSs track the history of changes +to the source code, making it possible to revert to previous states, compare +versions, and more. + +Among the VCSs available, Git stands out as one of the most popular and +powerful tools. It's used by small projects and large-scale software alike, +owing to its flexibility, distributed nature, and efficient handling of +codebase versions. + +In this part, you'll learn about the fundamentals of version control, how to +set up your environment for Git, dive into the basics of commits, branches, and +merges, understand the significance of tags, and finally, explore how to +collaborate using remote repositories and platforms like GitHub. + +.. toctree:: + :name: vcs + + intro + setup + basics + tagging + branch + remotes + github + pullrequest diff --git a/src/vcs/intro.txt b/src/vcs/intro.txt new file mode 100644 index 000000000..054765204 --- /dev/null +++ b/src/vcs/intro.txt @@ -0,0 +1,100 @@ +.. meta:: + :description: Version control system + :author: Serhii Horodilov + :keywords: version, control, system, vcs, git + +******************************************************************************* + About version control (Git) +******************************************************************************* + +Version control is a system that records changes to a file or set of files over +time so that you can recall specific versions later. It allows you to revert +selected files back to a previous state, revert the entire project back to +a previous state, compare changes over time, see who last modified something +that might be causing a problem, who introduced an issue and when, and more. + +In a :abbr:`DVCS (Distributed Version Control Systems)` clients don't just +check out the latest snapshot of the files; rather, they fully mirror +the repository, including its full history. Thus, if any server dies, and +these systems were collaborating via that server, any of the client +repositories can be copied back up to the server to restore it. Every clone +is really a full backup of all the data. + +.. figure:: /../assets/img/vcs-dvcs.svg + :align: center + + Distributed version control diagram + +.. rubric:: What is Git? + +The major difference between Git and any other VCS is the way Git thinks about +its data. Conceptually, most other systems store information as a list of +file-based changes. Git doesn't think of or store its data this way. +Instead, Git thinks of its data more like a series of snapshots of a miniature +filesystem. + +This is an important distinction between Git and nearly all other VCSs. +It makes Git reconsider almost every aspect of version control that most +other systems copied from the previous generation. This makes Git more like +a mini filesystem with some incredibly powerful tools built on top of it, +rather than simply a VCS. + +.. figure:: /../assets/img/git-snapshots.svg + :align: center + + Storing data as snapshots of the project over time + +.. rubric:: Local operations + +Most operations in Git need only local files and resources to operate -- +generally no information is needed from another computer on your network. +Because you have the entire history of the project right there on your local +disk, most operations seem almost instantaneous. + +.. rubric:: Integrity + +Everything in Git is checksummed before it is stored and is then referred +to by that checksum. This means it's impossible to change the contents of +any file or directory without Git knowing about it. + +.. rubric:: Repository files states + +Git has three main states that your files can reside in: +**modified**, **staged**, and **committed**: + +- Modified means that you have changed the file but have not committed it + to your database yet. +- Staged means that you have marked a modified file in its current version + to go into your next commit snapshot. +- Committed means that the data is safely stored in your local database. + +.. only:: html + + .. mermaid:: /../assets/mermaid/git/states.mmd + :align: center + +.. only:: latex + + .. figure:: /../assets/mermaid/git/states.mmd.png + :align: center + +The basic Git workflow goes something like this: + +#. You modify files in your working tree. +#. You selectively stage just those changes you want to be part of your next + commit, which adds only those changes to the staging area. +#. You do a commit, which takes the files as they are in the staging area and + stores that snapshot permanently to your Git directory. + +Command line +============ + +There are a lot of different ways to use Git. There are the original +command-line tools, and there are many graphical user interfaces of varying +capabilities. For one, the command line is the only place you can run all Git +commands -- most of the GUIs implement only a partial subset of Git +functionality for simplicity. If you know how to run the command-line version, +you can probably also figure out how to run the GUI version, while the opposite +is not necessarily true. Also, while your choice of graphical client is +a matter of personal taste, all users will have the command-line tools +installed and available. diff --git a/src/vcs/pullrequest.txt b/src/vcs/pullrequest.txt new file mode 100644 index 000000000..72b9ea32e --- /dev/null +++ b/src/vcs/pullrequest.txt @@ -0,0 +1,86 @@ +.. meta:: + :description: Version Control System - Pull Requests + :author: Serhii Horodilov + :author: Vladyslav Ponomaryov + :keywords: version, control, system, vcs, git, pull request, merge + +******************************************************************************* + Pull Request +******************************************************************************* + +Pull request let you tell others about changes you've pushed to a branch in +a repository on GitHub. Once a pull request is opened, you can discuss and +review the potential changes with collaborators and add follow-up commits +before your changes are merged into the base branch:cite:`github:about-pr`. + +Draft pull requests +------------------- + +Draft pull requests are available in public repositories on GitHub. +When you create a pull request, you can choose to a create a pull request that +is ready for review or a draft pull request. Draft pull requests cannot be +merged. When you're ready to get feedback on your pull request, you can mark +your draft pull request as ready for review. + +Difference between commits on compare and pull request pages +------------------------------------------------------------ + +The compare and pull request pages use different methods to calculate the diff +for changed files: + +- Compare pages show the diff between the tip of the head ref and the current + common ancestor (that is, the merge base) of the head and base ref. +- Pull request pages show the diff between the tip of the head ref and + the common ancestor of the head and base ref at the time when the pull + request was created. + Consequently, the merge base used for the comparison might be different. + +About comparing branches +======================== + +Pull requests display diffs to compare the changes you made in your topic +branch against the base branch that you want to merge your changes into. + +Rather that viewing the commits themselves, you can view the proposed changes +as they'll appear in the files once the pull request is merged. The files +appear in alphabetical order within the Files changed tab. Additions to +the files appear in green and are prefaced by a ``+`` sign while content that +has been removed appears in red and is prefaced by a ``-`` sign +:cite:`github:compare-pr`. + +Creating a pull request +======================= + +Create a pull request to propose and collaborate on changes to a repository. +These changes are proposed in a *branch*, which ensures that the default +branch only contains finished and approved work:cite:`github:create-pr`. + +About branches +-------------- + +Use a branch to isolate development work without affecting other branches in +the repository. Each repository has one default branch, and can have multiple +other branches. You can merge a branch into another branch using a pull +request. + +Branches allow you to develop features, fix bugs, or safely experiment with +new ideas in a contained area of your repository. + +You always create a branch from an existing branch. Typically, you might create +a new branch from the default branch of your repository. + +Creating a pull request +----------------------- + +#. On GitHub, navigate to the main page of the repository. +#. Switch to "Pull requests" tab. +#. Press "New pull request" button. +#. Select base and source branches. +#. Press "Create pull request" button. +#. Provide a meaningful title and description. +#. Draft or create a pull request. + + * To create pull request that is ready for review, click + **Create Pull Request**. + * To create a draft pull request, use the drop-down and select + **Create Draft Pull Request**, then click **Draft Pull Request**. diff --git a/src/vcs/remotes.txt b/src/vcs/remotes.txt new file mode 100644 index 000000000..94c7c7ce9 --- /dev/null +++ b/src/vcs/remotes.txt @@ -0,0 +1,170 @@ +******************************************************************************* + Remotes +******************************************************************************* + +To be able to collaborate on any Git project, you need to know how to manage +your remote repositories. Remote repositories are versions of your project +that are hosted on the Internet or network somewhere. You can have several of +them, each of which generally is either read-only or read/write for you. +Managing remotes includes knowing how to add remote repositories, remove +remote repositories that are no longer valid, manage various branches and +define them as being tracked or not, and more. + +.. + .. note:: + It is entirely possible that you can be working with a "remote" + repository that is, in fact, on the same host you are. + The word "remote" does not necessary imply that repository is somewhere + else on the network or Internet, only that it is elsewhere. + +Showing your remote +=================== + +To see which remote servers you have configured, you can run the ``git remote`` +command. It lists the shortnames of each remote handle you're specified. If +you've cloned your repository, you should at least see ``origin`` - that is +default name Git gives to the server you clone from: + +:: + + $ git remote + origin + upstream + + $ git remote -v + origin git@github.com:edu-python-course/edu-python-course.github.io (fetch) + origin git@github.com:edu-python-course/edu-python-course.github.io (push) + upstream git@github.com:PonomaryovVladyslav/PythonCources.git (fetch) + upstream git@github.com:PonomaryovVladyslav/PythonCources.git (push) + + +This means we can pull contributions from any of these users pretty easily. +We may additionally have permission to push to one or more of these. + +Adding remote repositories +========================== + +To add a new remote Git repository as a shortname you can reference easily, run +``git remote add ``: + +:: + + $ git remote + origin + upstream + $ git remote add personal https://github.com/shorodilov/python-course + $ git remote + origin + upstream + personal + +Now you can use the string "personal" on the command line in lieu of the whole +URL. ``master`` branch of "https://github.com/shorodilov/python-course" is now +accessible as ``personal/master``, while shortname to the same branch in origin +will be -- ``origin/master``. + +Fetching and pulling from remotes +================================= + +To get data from remote project, you can run ``git fetch`` command. +The command goes out to that remote project and pulls down all the information +from that remote project that you don't have yet. After you do this, you should +have references to all the branches from that remote, which you can merge in or +inspect at any time. + +:: + + $ git fetch + +If your current branch is set up to track a remote branch, you can use +``git pull`` command to automatically fetch and then merge that remote branch +into your current branch. By default, the ``git clone`` command automatically +sets up your local ``master`` branch to track the remote ``master`` branch +(or whatever default remote branch). + +.. versionadded:: 2.27 + From Git version 2.27 onward, ``git pull`` will give a warning if the + ``pull.rebase`` variable is not set. Git will keep warning you until + you set the variable. + + If you want the default behavior of Git (fast-forward if possible, else + create a merge commit): ``git config --global pull.rebase "false"``. + + If you want to rebase when pulling: + ``git config --global pull.rebase "true"``. + +Pushing to remotes +================== + +When you have your project at a point that you want to share, you have to push +it upstream. The command for this is simple: ``git push ``. + +:: + + $ git push origin master + +This command works only if you cloned from a server to which you have write +access and if nobody has pushed in the meantime. If you and someone else clone +at the same time and they push upstream and then you push upstream, you push +will rightly be rejected. You'll have to fetch their work first and incorporate +it into yours before you'll be allowed to push. + +Pushing a new branch to remote +------------------------------ + +In case you have created a local branch for some specific needs and you want +to share this branch, you need to set up track for this branch. This can be +done by using: ``git push --set-upstream origin ``. This will +create a new remote branch and set up track to your current local branch. +There is a shortcut for this command: ``git push -u origin ``. + +Inspecting a remote +=================== + +If you want to see more information about a particular remote, you can use the +``git remote show + Date: Wed Aug 16 19:04:24 2023 +0300 + + Version Control System - tags + +.. rubric:: Lightweight tags + +Another way to tag commits is with a lightweight tag. this is basically +the commit checksum stored in a file -- no other information is kept. To +create a lightweight tag, don't supply any of the ``-a``, ``-s``, or ``-m`` +options, just provide a tag name: + +:: + + $ git tag tagging + $ git tag + VCS + tagging + $ git show tagging + commit 21ae739f891c6ee6a77d8986402cb1e69a9b6a88 (HEAD -> feature/vcs, tag: tagging, tag: VCS) + Author: Serhii Horodilov + Date: Wed Aug 16 18:45:23 2023 +0300 + + Move commits.txt content to "basics" document + +.. rubric:: Tagging later + +You can also tag commits after you're moved past them. + +:: + + $ git log --pretty=format:%h -3 + 21ae739 + ea4ac00 + df216cf + $ git tag v1.4 ea4ac00 + $ git show v1.4 + commit ea4ac002604ca897ba05c846d63af1618c123b6f (tag: v1.4) + Author: Serhii Horodilov + Date: Wed Aug 16 18:32:27 2023 +0300 + + Fix code-block outputs + +Deleting tags +============= + +To delete a tag on your local repository, you can use ``git tag -d ``. + +:: + + $ git tag -d VCS + Deleted tag 'VCS' (was eef3831) + +Checking out tags +================= + +If you want to view the versions of files a tag is pointing to, you can do +a ``git checkout`` of that tag, although this puts your repository in +"detached HEAD" state, which has some ill side effects: + +:: + + $ git checkout VCS + Note: switching to 'vcs'. + + You are in 'detached HEAD' state. You can look around, make experimental + changes and commit them, and you can discard any commits you make in this + state without impacting any branches by switching back to a branch. + + If you want to create a new branch to retain commits you create, you may + do so (now or later) by using -c with the switch command. Example: + + git switch -c + + Or undo this operation with: + + git switch - + + Turn off this advice by setting config variable advice.detachedHead to false + + HEAD is now at 60565a1 Fix GitFlow branches list + +In "detached HEAD" state, if you make changes and then create a commit, the tag +will stay the same, but your new commit won’t belong to any branch and will be +unreachable, except by the exact commit hash. Thus, if you need to make changes +-- say you’re fixing a bug on an older version, for instance -- you will +generally want to create a branch: + +:: + + $ git checkout -b vcs-tag-branch VCS + Switched to a new branch 'vcs-tag-branch' diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 000000000..06e5d9761 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,79 @@ +const path = require("path") +const MiniCSSExtractPlugin = require("mini-css-extract-plugin") +const HTMLWebpackPlugin = require("html-webpack-plugin") + +const BASE_DIR = path.resolve(__dirname, "src") +const BUILD_DIR = path.resolve(__dirname, "_build", "webpack") +const ASSETS_DIR = path.resolve(__dirname, "assets") + +const commonHTMLWebpackPluginConfig = { + favicon: path.resolve(ASSETS_DIR, "favicon.ico"), + inject: "body", // inject scripts at the bottom of the body +} + +const icons = { + moonIcon: "../assets/moon-svgrepo-com.svg", + sunIcon: "../assets/sun-svgrepo-com.svg", + passIcon: "../assets/check-mark-svgrepo-com.svg", + failIcon: "../assets/cross-mark-svgrepo-com.svg", +} + +const config = { + mode: "development", + entry: path.resolve(BASE_DIR, "conf.js"), + output: { + filename: "js/main.bundle.js", + path: BUILD_DIR, + clean: true, + }, + devServer: { + static: BUILD_DIR, + port: 3000, + hot: true, + }, + plugins: [ + new MiniCSSExtractPlugin({ filename: "css/main.min.css" }), + new HTMLWebpackPlugin({ + ...commonHTMLWebpackPluginConfig, + template: path.resolve(BASE_DIR, "rdbms", "presentations", "normalization", "_index.hbs"), + filename: path.resolve(BUILD_DIR, "normalization", "index.html"), + templateParameters: { + ...icons, + }, + }), + ], + module: { + rules: [ + { + test: /\.scss$/, + use: [ + { loader: MiniCSSExtractPlugin.loader }, + { loader: "css-loader" }, + { loader: "sass-loader" }, + ] + }, + { + test: /\.css$/, + use: [ + { loader: MiniCSSExtractPlugin.loader }, + { loader: "css-loader" }, + ] + }, + { + test: /\.(png|svg|jpg|jpeg|gif|ico)$/, + type: "asset/resource", + generator: { filename: "assets/[name][ext]" }, + }, + { + test: /\.(handlebars|hbs)$/, + loader: "handlebars-loader", + }, + { + test: /\.html$/, + loader: "html-loader", + }, + ] + }, +} + +module.exports = config