# packages

pkgId: d41459f4630a44b619d7c0ae64847706c147983237076300f70aecff5266bc9f
name: python-atlas-hfdatasets
arch: src
version: 1.3.7
epoch: 0
release: 1
summary: Manage your datasets on the Hugging Face Hub
url: https://github.com/yourusername/atlas_hfdatasets
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlas-hfdatasets-1.3.7-1.src.rpm
checksum_type: sha256
description:
  A command-line tool to manage your datasets on the Hugging Face Hub - upload, download, list, check and remove datasets with ease.




  - Python 3.7 or higher



  Install the package via pip:

  ```bash
  pip install atlas_hfdatasets
  ```



  Before using the tool, initialise your Hugging Face credentials:

  ```bash
  atlas_hfdatasets init
  ```



  - **Upload a dataset**
    ```bash
    atlas_hfdatasets upload /path/to/dataset [-n username/repo_name] [-p True/False]
    ```
    Options:
    - `-n`: Repository name (format: username/repo_name). Defaults to dataset folder name
    - `-p`: Make dataset public (default: False)

  - **List your datasets**
    ```bash
    atlas_hfdatasets list [-f keyword]
    ```
    Options:
    - `-f`: Filter datasets by keyword (case-insensitive)

  - **Remove a dataset**
    ```bash
    atlas_hfdatasets remove username/repo_name [-f True/False]
    ```
    Options:
    - `-f`: Force deletion without confirmation (default: False)

  - **Download a dataset**
    ```bash
    atlas_hfdatasets download username/repo_name [-o output_directory]
    ```
    Options:
    - `-o`: Output directory path (default: current directory)

  - **Check dataset statistics**
    ```bash
    atlas_hfdatasets check username/repo_name
    ```



  - Python ≥ 3.7
  - huggingface-hub
  - datasets



  This project is licensed under the MIT Licence - see the [LICENSE](LICENSE) file for details.



  Contributions are welcome! Please feel free to submit a Pull Request.
  ```


pkgId: 9040d45e2b57827bcb587b78f3fca6f7fee8ed35ae364ec9ad3222da46317a29
name: python-atlas-mpl-style
arch: src
version: 0.23.3
epoch: 0
release: 1
summary: ATLAS style for Matplotlib 3.0+
url: https://pypi.org/project/atlas-mpl-style/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlas-mpl-style-0.23.3-1.src.rpm
checksum_type: sha256
description:
  **Despite the last commit date, this package is still maintained. If you have any comments or improvements, open an issue or PR.**
  Provides a Matplotlib style replicating that used by the
  `ATLAS <http://atlas.cern>`__ collaboration.
  **Please open an issue if you find this style deviates from the guidelines.**
  Install from PyPI using pip: :code:`pip install atlas-mpl-style`
  Documentation: https://atlas-mpl.readthedocs.io/en/latest/index.html
  In addition, this package also provides:
  - A function to draw the ATLAS label
  - A ``plot`` module containing functions to plot pre-binned histograms and
     limits. This includes functionality for plotting stacked backgrounds along
     with data and ratios in the usual ATLAS style.
  - A matplotlib style based on the background / foreground from the VIM `Paper <https://github.com/NLKNguyen/papercolor-theme>`__ color scheme, along with a print version with a white background.
    - The default color cycle in all three styles is generated with HCL Wizard
  - Additional Matplotlib color definitions based on the Paper theme, and the
     `Oceanic Next <https://github.com/voronianski/oceanic-next-color-scheme>`__
     theme


pkgId: 0b88868ae47553f7572237768aa45827e09480a535c4cb97d3b5b4d30360234c
name: python-atlas-provider-django
arch: src
version: 0.2.1
epoch: 0
release: 1
summary: please add a summary manually as the author left a blank one
url: https://pypi.org/project/atlas-provider-django/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlas-provider-django-0.2.1-1.src.rpm
checksum_type: sha256
description:
  Load [Django](https://www.djangoproject.com/) models into an [Atlas](https://atlasgo.io) project.


  1. **Declarative migrations** - use a Terraform-like `atlas schema apply --env django` to apply your Django schema to the database.
  2. **Automatic migration planning** - use `atlas migrate diff --env django` to automatically plan a migration from the current database version to the Django schema.



  Install Atlas for macOS or Linux by running:
  ```bash
  curl -sSf https://atlasgo.sh | sh
  ```

  See [atlasgo.io](https://atlasgo.io/getting-started#installation) for more installation options.

  Install the provider by running:

  ```bash
  pip install atlas-provider-django
  ```



  Add the provider to your Django project's `INSTALLED_APPS` in `settings.py`:

  ```python
  INSTALLED_APPS = [
      ...,
      'atlas_provider_django',
      ...
  ]
  ```

  In your project directory, create a new file named `atlas.hcl` with the following contents:

  ```hcl
  data "external_schema" "django" {
    program = [
      "python",
      "manage.py",
      "atlas-provider-django",
      "--dialect", "mysql" // mariadb | postgresql | sqlite | mssql
      // if you want to only load a subset of your app models, you can specify the apps by adding
      // "--apps", "app1", "app2", "app3"
    ]
  }

  env "django" {
    src = data.external_schema.django.url
    dev = "docker://mysql/8/dev"
    migration {
      dir = "file://migrations"
    }
    format {
      migrate {
        diff = "{{ sql . \"  \" }}"
      }
    }
  }
  ```






  You can use the `atlas schema apply` command to plan and apply a migration of your database to your current Django schema.
  This works by inspecting the target database and comparing it to the Django Apps models and creating a migration plan.
  Atlas will prompt you to confirm the migration plan before applying it to the database.

  ```bash
  atlas schema apply --env django -u "mysql://root:password@localhost:3306/mydb"
  ```
  Where the `-u` flag accepts the [URL](https://atlasgo.io/concepts/url) to the
  target database.



  Atlas supports a [versioned migrations](https://atlasgo.io/concepts/declarative-vs-versioned#versioned-migrations)
  workflow, where each change to the database is versioned and recorded in a migration file. You can use the
  `atlas migrate diff` command to automatically generate a migration file that will migrate the database
  from its latest revision to the current Django schema.

  ```bash
  atlas migrate diff --env django
  ````



  The provider supports the following databases:
  * MySQL
  * MariaDB
  * PostgreSQL
  * SQLite
  * Microsoft SQL Server



  Please report any issues or feature requests in the [ariga/atlas](https://github.com/ariga/atlas/issues) repository.



  This project is licensed under the [Apache License 2.0](LICENSE).


pkgId: 6d560a8a40843712c52ca9b342768fe08e33b9260cecc462d5de415031fa178b
name: python-atlas-provider-sqlalchemy
arch: src
version: 0.2.3
epoch: 0
release: 1
summary: Load sqlalchemy models into an Atlas project.
url: https://pypi.org/project/atlas-provider-sqlalchemy/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlas-provider-sqlalchemy-0.2.3-1.src.rpm
checksum_type: sha256
description:
  Load [SQLAlchemy](https://www.sqlalchemy.org/) models into an [Atlas](https://atlasgo.io) project.


  1. **Declarative migrations** - use a Terraform-like `atlas schema apply --env sqlalchemy` to apply your SQLAlchemy schema to the database.
  2. **Automatic migration planning** - use `atlas migrate diff --env sqlalchemy` to automatically plan a migration from the current database version to the SQLAlchemy schema.



  Install Atlas from macOS or Linux by running:
  ```bash
  curl -sSf https://atlasgo.sh | sh
  ```

  See [atlasgo.io](https://atlasgo.io/getting-started#installation) for more installation options.

  Install the provider by running:
  ```bash


  pip install atlas-provider-sqlalchemy
  ```



  If all of your SQLAlchemy models exist in a single package,
  you can use the provider directly to load your SQLAlchemy schema into Atlas.

  In your project directory, create a new file named `atlas.hcl` with the following contents:

  ```hcl
  data "external_schema" "sqlalchemy" {
    program = [
      "atlas-provider-sqlalchemy",
      "--path", "./path/to/models",
      "--dialect", "mysql" // mariadb | postgresql | sqlite | mssql
    ]
  }

  env "sqlalchemy" {
    src = data.external_schema.sqlalchemy.url
    dev = "docker://mysql/8/dev"
    migration {
      dir = "file://migrations"
    }
    format {
      migrate {
        diff = "{{ sql . \"  \" }}"
      }
    }
  }
  ```



  If you want to use the provider as a python script, you can use the provider as follows:

  Create a new file named `load_models.py` with the following contents:

  ```python

  from models import User, Task
  from atlas_provider_sqlalchemy.ddl import print_ddl
  print_ddl("mysql", [User, Task])
  ```

  Next, in your project directory, create a new file named `atlas.hcl` with the following contents:

  ```hcl
  data "external_schema" "sqlalchemy" {
      program = [
          "python",
          "load_models.py"
      ]
  }

  env "sqlalchemy" {
    src = data.external_schema.sqlalchemy.url
    dev = "docker://mysql/8/dev"
    migration {
      dir = "file://migrations"
    }
    format {
      migrate {
        diff = "{{ sql . \"  \" }}"
      }
    }
  }
  ```



  Once you have the provider installed, you can use it to apply your SQLAlchemy schema to the database:



  You can use the `atlas schema apply` command to plan and apply a migration of your database to your current SQLAlchemy schema.
  This works by inspecting the target database and comparing it to the SQLAlchemy schema and creating a migration plan.
  Atlas will prompt you to confirm the migration plan before applying it to the database.

  ```bash
  atlas schema apply --env sqlalchemy -u "mysql://root:password@localhost:3306/mydb"
  ```
  Where the `-u` flag accepts the [URL](https://atlasgo.io/concepts/url) to the
  target database.



  Atlas supports a [version migration](https://atlasgo.io/concepts/declarative-vs-versioned#versioned-migrations)
  workflow, where each change to the database is versioned and recorded in a migration file. You can use the
  `atlas migrate diff` command to automatically generate a migration file that will migrate the database
  from its latest revision to the current SQLAlchemy schema.

  ```bash
  atlas migrate diff --env sqlalchemy
  ````



  The provider supports the following databases:
  * MySQL
  * MariaDB
  * PostgreSQL
  * SQLite
  * Microsoft SQL Server



  The code in this repository is based on [noamtamir/atlas-provider-sqlalchemy](https://github.com/noamtamir/atlas-provider-sqlalchemy).



  Please report any issues or feature requests in the [ariga/atlas](https://github.com/ariga/atlas/issues) repository.



  This project is licensed under the [Apache License 2.0](LICENSE).


pkgId: 49eaafccf2db4fd0e24da33454dd65ad3a58930ceff8ae5ac8824aaff1ddd1e7
name: python-atlas-rfp
arch: src
version: 0.1.8
epoch: 0
release: 1
summary: Programmatically access the Atlas RFP interface
url: https://github.com/meson800/atlas-rfp
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlas-rfp-0.1.8-1.src.rpm
checksum_type: sha256
description:
  [![PyPI-downloads](https://img.shields.io/pypi/dm/atlas-rfp)](https://pypi.org/project/atlas-rfp)
  [![PyPI-version](https://img.shields.io/pypi/v/atlas-rfp)](https://pypi.org/project/atlas-rfp)
  [![PyPI-license](https://img.shields.io/pypi/l/atlas-rfp)](https://pypi.org/project/atlas-rfp)
  [![Supported python versions](https://img.shields.io/pypi/pyversions/atlas-rfp)](https://pypi.org/project/atlas-rfp)


  MIT's reimbursement system is aging. Having a high-performance, statically-typed
  interface to the RFP system enables higher-level financial scripts and programs
  to be created.

  This script uses `touchstone-auth`, another one of my Python packages that is
  a Python user-agent capable of properly two-factor authenticating your scripts,
  without requiring a browser.


  This package is on Pip, so you can just:
  ```
  pip install atlas-rfp
  ```

  Alternatively, you can get built wheels from the [Releases tab on Github](https://github.com/meson800/atlas-rfp/releases).


  To perform Touchstone authentication, we need a client-side certificate.
  Remember to **not hard-code** your credentials!
  The example here loads credentials from a json file called `credentials.json`:
  ```
  {
      "certfile": "some_client_credential.p12",
      "password": "horse-battery-staple-correct"
  }
  ```

  Then, in your Python file, you can do the following:
  ```
  import json
  from touchstone_auth import TouchstoneSession

  with open('credentials.json') as cred_file:
      credentials = json.load(cred_file)

  with TouchstoneSession(
      base_url='https://atlas.mit.edu',
      pkcs12_filename=credentials['certfile'],
      pkcs12_pass=credentials['password'],
      cookiejar_filename='cookies.pickle') as s:

      response = s.get('https://atlas.mit.edu/atlas/Main.action')
  ```

  For more examples on how to authenticate,
  see the [touchstone-auth documentation](https://github.com/meson800/touchstone-auth).




  If you'd like to hack locally on `atlas-rfp`, after cloning this repository:
  ```
  $ git clone https://github.com/meson800/atlas-rfp.git
  $ cd git
  ```
  you can create a local virtual environment, and install `atlas-rfp` in "development mode"
  ```
  $ python -m venv env
  $ .\env\Scripts\activate    (on Windows)
  $ source env/bin/activate   (on Mac/Linux)
  $ pip install -e .
  ```
  After this 'local install', you can use and import `atlas-rfp` freely without
  having to re-install after each update.


  See the [CHANGELOG](CHANGELOG.md) for detailed changes.
  ```


  - Added Pydantic field serializers for Money type
  ```


  This is licensed by the MIT license. Use freely!


pkgId: aef2aee815817165bb3399ea2aaedd8109c6a95ac5b429db3ddf6b1e65fc4039
name: python-atlas-rucio-policy-package
arch: src
version: 0.1.1
epoch: 0
release: 1
summary: Rucio policy package for the ATLAS experiment
url: https://pypi.org/project/atlas-rucio-policy-package/
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlas-rucio-policy-package-0.1.1-1.src.rpm
checksum_type: sha256
description:
  - [Rucio documentation for policy packages](https://rucio.github.io/documentation/operator/policy_packages/)

rpm_license:
[cell repeats an earlier one in this file: 10254 characters]


pkgId: a7db8969b82f079b1a87865f0115d1c3718596a804f362602f9a95bb8dfb83a3
name: python-atlas-schema
arch: src
version: 0.1.0
epoch: 0
release: 1
summary: Helper python package for ATLAS Common NTuple Analysis work.
url: https://github.com/scipp-atlas/atlas-schema
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlas-schema-0.1.0-1.src.rpm
checksum_type: sha256
description:
  [![Actions Status][actions-badge]][actions-link]
  [![Documentation Status][rtd-badge]][rtd-link]

  [![PyPI version][pypi-version]][pypi-link]
  [![Conda-Forge][conda-badge]][conda-link]
  [![PyPI platforms][pypi-platforms]][pypi-link]

  [![GitHub Discussion][github-discussions-badge]][github-discussions-link]

  <!-- SPHINX-START -->

  <!-- prettier-ignore-start -->
  [actions-badge]:            https://github.com/scipp-atlas/atlas-schema/workflows/CI/badge.svg
  [actions-link]:             https://github.com/scipp-atlas/atlas-schema/actions
  [conda-badge]:              https://img.shields.io/conda/vn/conda-forge/atlas-schema
  [conda-link]:               https://github.com/conda-forge/atlas-schema-feedstock
  [github-discussions-badge]: https://img.shields.io/static/v1?label=Discussions&message=Ask&color=blue&logo=github
  [github-discussions-link]:  https://github.com/scipp-atlas/atlas-schema/discussions
  [pypi-link]:                https://pypi.org/project/atlas-schema/
  [pypi-platforms]:           https://img.shields.io/pypi/pyversions/atlas-schema
  [pypi-version]:             https://img.shields.io/pypi/v/atlas-schema
  [rtd-badge]:                https://readthedocs.org/projects/atlas-schema/badge/?version=latest
  [rtd-link]:                 https://atlas-schema.readthedocs.io/en/latest/?badge=latest

  <!-- prettier-ignore-end -->





  This useful `vim` substitution helps:

  ```
  %s/    \([A-Za-z]\+\)\s\+=  \(\d\+\),\?/    \1: Annotated[int, "\1"] = \2
  ```

rpm_license:
  Apache License Version 2.0, January 2004 http://www.apache.org/licenses/  TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION  1. Definitions.  "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.  "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.  "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.  "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.  "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.  "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.  "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).  "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.  "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."  "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:  (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and  (b) You must cause any modified files to carry prominent notices stating that You changed the files; and  (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and  (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.  You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.  END OF TERMS AND CONDITIONS  APPENDIX: How to apply the Apache License to your work.  To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!)  The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.  Copyright 2024 Giordon Stark  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at  http://www.apache.org/licenses/LICENSE-2.0  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


pkgId: 47c44cc166f97425af57ba13763bac057c4df6d322bcc8444762565b12ffed92
name: python-atlasapi
arch: src
version: 2.0.11
epoch: 0
release: 1
summary: Expose MongoDB Atlas Cloud provider APIs
url: https://github.com/mgmonteleone/python-atlasapi
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlasapi-2.0.11-1.src.rpm
checksum_type: sha256
description:
  Python Bindings for the Atlas Public API
  This project intends to create a fairly opinionated set of bindings for the Atlas Public API which makes interacting
  with Atlas using Python easier. The API makes extensive use of enums and other helper type objects to take some
  of the guess work of administering Atlas clusters with Python.
  In most cases objects will be returned based upon the structure of the json returned but the API Endpoints. These objects
  are defined either in the `specs.py` module or in a module named after the objects themselves (`alerts.py` for example).
  All calls to the Atlas API require API credentials, you can configure them in your Atlas project.
  `Atlas API <https://docs.atlas.mongodb.com/api/>`__
  `Configure Atlas API Access <https://docs.atlas.mongodb.com/configure-api-access/>`__
  `Current state of the python-atlasapi support <https://github.com/mgmonteleone/python-atlasapi/blob/master/API.rst>`__


pkgId: 33dbc04515d8799719a7e8dfafe8e98fe485d57da0b66101823aba5c425bf51c
name: python-atlasapprox
arch: src
version: 0.2.4
epoch: 0
release: 1
summary: Cell atlas approximations, Python API
url: https://atlasapprox.org
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlasapprox-0.2.4-1.src.rpm
checksum_type: sha256
description:
  Cell atlases such as Tabula Muris and Tabula Sapiens are multi-organ single cell omics data sets describing entire organisms. A cell atlas approximation is a lossy and lightweight compression of a cell atlas that can be streamed via the internet.
  This project enables biologists, doctors, and data scientist to quickly find answers for questions such as:
  - *What is the expression of a specific gene in human lung?*
  - *What are the marker genes of a specific cell type in mouse pancreas*?
  - *What fraction of cells (of a specific type) express a gene of interest?*
  In addition to this interface, these questions can be asked in R or in a language agnostic manner using the REST API. See the documentation for more info.
  **Documentation**: https://atlasapprox.readthedocs.io/en/latest/python/index.html
  **Development**: https://github.com/fabilab/cell_atlas_approximations_API

rpm_license:
  Copyright 2024 Fabio Zanini  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: 6be4d6c97888dba8fe84ca3ce1c848b512e34d66231609aebcd4a9438049243c
name: python-atlasq
arch: src
version: 0.15.0
epoch: 0
release: 1
summary: Query proxy that allows the usage of AtlasSearch with mongoengine specific syntax
url: https://pypi.org/project/atlasq/
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlasq-0.15.0-1.src.rpm
checksum_type: sha256
description:
  AtlasQ allows the usage of [AtlasSearch](https://www.mongodb.com/docs/atlas/atlas-search/) keeping the [MongoEngine](https://github.com/MongoEngine/mongoengine) syntax.


  The package tries to follow the MongoEngine structure;
  the major differences reside in the `transform.py` and `queryset.py` files.


  Like in MongoEngine, a step in the pipeline is the creation of a query from a `Q` object:
  we have to find a correspondence between the MongoEngine common syntax and what AtlasSearch allows.
  For doing this, we had to find some compromises.

  Not every keyword is supported at the moment: if you have an actual use case that you would like to support,
  please be free to open an issue or a PR at any moment.


  There are probably a thousand of better implementation, if you actually knew MongoEngine and above all [PyMongo](https://pymongo.readthedocs.io/en/stable/).
  Unfortunately, our knowledge is limited, so here we go. If you find a solution that works better, again, feel free to open an issue or a PR.

  The main idea, is that the `filter` should work like an `aggregation`.
  For doing so, and with keeping the compatibility on how MongoEngine works (i.e. the filter should return a queryset of `Document`) we had to do some work.
  Calling `.aggregate` instead has to work as MongoEngine expect, meaning a list of dictionaries.




  Now the most important part: how do you use this package?


  ```python3
  from mongoengine import Document, fields

  from atlasq import AtlasManager, AtlasQ, AtlasQuerySet

  index_name = str("my_index")

  class MyDocument(Document):
      name = fields.StringField(required=True)
      surname = fields.StringField(required=True)
      atlas = AtlasManager(index_name)

  obj = MyDocument.objects.create(name="value", surname="value2")

  qs = MyDocument.atlas.filter(name="value")
  assert isinstance(qs, AtlasQuerySet)
  obj_from_atlas = qs.first()
  assert obj == obj_from_atlas

  obj2_from_atlas = MyDocument.atlas.get(AtlasQ(name="value") & AtlasQ(surname="value2"))
  assert obj == obj2_from_atlas


  obj3_from_atlas = MyDocument.atlas.get(AtlasQ(wrong_field="value"))
  assert obj3_from_atlas is None
  ```




  We also decided to have, optionally, a validation of the index.
  Two things are checked:
  - The index actually exists (If you query a non-existing index, Atlas as default behaviour will not raise any error).
  - The fields that you are querying are actually indexed(If you query a field that is not indexed, Atlas as default behaviour will not raise any error, and will return an empty list).
  To make these check, you need to call the function `ensure_index` on the queryset.

  ```python3
  from mongoengine import Document, fields

  from atlasq import AtlasManager, AtlasQ

  index_name = str("my_index")

  class MyDocument(Document):
      name = fields.StringField(required=True)
      surname = fields.StringField(required=True)
      atlas = AtlasManager(index_name)

  result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
  assert result is True
  obj1_from_atlas = MyDocument.atlas.get(AtlasQ(name="value"))
  obj2_from_atlas = MyDocument.atlas.get(AtlasQ(wrong_field="value")) # raises AtlasIndexFieldError
  ```


  Embedded documents are queried in two different ways, depending on how you created your Search Index.
  Remember to ensure the index so that AtlasQ can know how your index is defined
  If you used the [embeddedDocuments](https://www.mongodb.com/docs/atlas/atlas-search/define-field-mappings/#std-label-bson-data-types-embedded-documents) type, AtlasQ will use the [embeddedDocument](https://www.mongodb.com/docs/atlas/atlas-search/embedded-document/) query syntax.
  Otherwise, if you used the [document](https://www.mongodb.com/docs/atlas/atlas-search/define-field-mappings/#document) type, or you did not ensure the index, a normal `text` search with the `.` syntax will be used.


  It is possible to upload directly the Search index using AtlasQ, calling the function `upload_index` on the queryset. Syntax checks on the index itself are performed.
  If the `_id` is not present but `pk` or `id` was specified, it will be automatically added, allowing valid text query on the
  primary key.

  ```python3
  from mongoengine import Document, fields

  from atlasq import AtlasManager

  index_name = str("my_index")
  index = {
    "analyzer": "lucene.keyword",
    "mappings": {
      "dynamic": False,
      "fields": {
        "_id": {
          "type": "objectId"
        },
          "name": {
          "type": "string"
        },
        "surname": {
          "type": "string"
        },
      }
    }
  }
  class MyDocument(Document):
      name = fields.StringField(required=True)
      surname = fields.StringField(required=True)
      atlas = AtlasManager(index_name)

  result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
  assert result is False
  MyDocument.atlas.upload_index(index, "user", "pwd", "group", "cluster")
  result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
  assert result is True

  ```



  On the [10th of July 2023](https://www.mongodb.com/docs/atlas/atlas-search/changelog/#10-july-2023-release), the `Sort` functionality was released for Atlas search.

  AtlasQ, from version 0.12.0, will support this feature inside the `order_by` function.
  To have the old behaviour of the order_by (useful if you want to sort _after_ aggregations and not after the search stage), you can set the kwarg `as_aggregation` as `True`.

rpm_license:
  MIT License  Copyright (c) 2022 Certego  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: 5e405f06694ae0f7904cf821f6fd93ee41255b9abd845aeaef569b982f089985
name: python-atlassian-api-py
arch: src
version: 0.5.4
epoch: 0
release: 1
summary: Python Wrapper for Atlassian REST API
url: https://pypi.org/project/atlassian-api-py/
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlassian-api-py-0.5.4-1.src.rpm
checksum_type: sha256
description:
  [![PyPI](https://img.shields.io/pypi/v/atlassian-api-py)](https://pypi.org/project/atlassian-api-py/)
  [![CodeFactor](https://www.codefactor.io/repository/github/shenxianpeng/atlassian-api-py/badge/main?s=3f5b565625069f5c5ab303a02b120197cd3abdde)](https://www.codefactor.io/repository/github/shenxianpeng/atlassian-api-py/overview/main)
  ![PyPI - Downloads](https://img.shields.io/pypi/dw/atlassian-api-py)
  [![commit-check](https://img.shields.io/badge/commit--check-enabled-brightgreen?logo=Git&logoColor=white)](https://github.com/commit-check/commit-check)



  This is a package wrapper of Atlassian REST API written in Python, currently, it supports JIRA and Bitbucket.

  This package was created to simplify the implementation of integration with JIRA and Bitbucket.





  ```bash

  $ pip install atlassian-api-py


  $ pip install atlassian-api-py --upgrade
  ```



  Connect with username and password

  ```python
  >>> from atlassian import Jira
  >>> jira = Jira(url='https://jira.company.com', username="username", password="password")
  ```

  Or connect with token

  ```python
  >>> from atlassian import Jira
  >>> jira = Jira(url='https://jira.company.com', token="yourToken")
  ```

  Or write your credentials in a configuration file `config.ini`, and get the credential though the configuration file.

  ```markdown
  [jira]
  url = https://jira.company.com
  username = username
  password = password

  token = yourToken
  ```

  ```python
  >>> import configparser
  >>> config = configparser.ConfigParser()
  >>> config.read('config.ini')

  >>> jira_url = config['jira']['url']
  >>> jira_usr = config['jira']['username']
  >>> jira_psw = config['jira']['password']
  >>> jira_token = config['jira']['token']
  ```



  Next, you can get the issue's fields as follow:

  ```python
  >>> issue = jira.issue('TEST-1')
  >>> print(issue.fields.status.name)
  Triage
  >>> print(issue.fields.description)
  this is a demo jira ticket
  >>> print(issue.fields.status.name)
  Triage
  >>> print(issue.fields.issuetype.name)
  Bug
  ```



  ```python
  >>> print(issue.id)
  1684517
  >>> print(issue.key)
  TEST-1
  >>> print(issue.fields.assignee.key)
  xpshen
  >>> print(issue.fields.summary)
  Jira REST API Unit Test Example
  >>> ...
  ```



  Run unittest

  ```bash
  cd tests
  python -m unittest
  ```

  Run coverage

  ```bash
  cd tests
  coverage run -m unittest
  coverage report -m              # to report on the results
  coverage html                   # to get annotated HTML
  ```





  > For Jira I used Jira v8.5.9 and Jira Cloud.
  >
  > For BitBucket I used Bitbucket v5.13.1. not support Bitbucket cloud for now.


pkgId: 4d42ab1ff22e0b51159021d70835165e1dca2dbe45ae239d4bc7fb0de7fe8f57
name: python-atlassian-api-py
arch: src
version: 0.5.5
epoch: 0
release: 1
summary: Python Wrapper for Atlassian REST API
url: https://pypi.org/project/atlassian-api-py/
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlassian-api-py-0.5.5-1.src.rpm
checksum_type: sha256
description:
  [![PyPI](https://img.shields.io/pypi/v/atlassian-api-py)](https://pypi.org/project/atlassian-api-py/)
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/atlassian-api-py?style=flat-square)](https://pypi.org/project/atlassian-api-py)
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=shenxianpeng_atlassian-api-py&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=shenxianpeng_atlassian-api-py)
  ![PyPI - Downloads](https://img.shields.io/pypi/dw/atlassian-api-py)
  [![commit-check](https://img.shields.io/badge/commit--check-enabled-brightgreen?logo=Git&logoColor=white)](https://github.com/commit-check/commit-check)



  This package is a Python wrapper for the Atlassian REST API, currently supporting JIRA and Bitbucket. It simplifies the implementation of integration with these tools.



  To install the package, run the following command:

  ```bash
  $ pip install atlassian-api-py
  ```

  To upgrade to the latest version, use:

  ```bash
  $ pip install atlassian-api-py --upgrade
  ```

  **Establish connection**

  You can connect to JIRA using a username and password or a token.

  Using Username and Password

  ```python
  >>> from atlassian import Jira
  >>> jira = Jira(url='https://jira.company.com', username="username", password="password")
  ```

  Using a Token

  ```python
  >>> from atlassian import Jira
  >>> jira = Jira(url='https://jira.company.com', token="yourToken")
  ```

  Using a Configuration File

  Alternatively, you can store your credentials in a `config.ini` file:

  ```markdown
  [jira]
  url = https://jira.company.com
  username = username
  password = password

  token = yourToken
  ```

  Then, you can use the configuration file to establish a connection:

  ```python
  >>> import configparser
  >>> config = configparser.ConfigParser()
  >>> config.read('config.ini')

  >>> jira_url = config['jira']['url']
  >>> jira_usr = config['jira']['username']
  >>> jira_psw = config['jira']['password']
  >>> jira_token = config['jira']['token']
  ```



  Next, you can get the issue's fields as follow:

  ```python
  >>> issue = jira.issue('TEST-1')
  >>> print(issue.fields.status.name)
  Triage
  >>> print(issue.fields.description)
  this is a demo jira ticket
  >>> print(issue.fields.status.name)
  Triage
  >>> print(issue.fields.issuetype.name)
  Bug
  ```



  ```python
  >>> print(issue.id)
  1684517
  >>> print(issue.key)
  TEST-1
  >>> print(issue.fields.assignee.key)
  xpshen
  >>> print(issue.fields.summary)
  Jira REST API Unit Test Example
  >>> ...
  ```



  This project is released under the [MIT License](LICENSE).


pkgId: 733cf491f845929fa382f650bde6f52c491ab8cb815fa68779aa7ffa24cbe15b
name: python-atlassian-doc-builder
arch: src
version: 0.5
epoch: 0
release: 1
summary: Creating Atlassian Document in a programmatic way.
url: https://pypi.org/project/atlassian-doc-builder/
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlassian-doc-builder-0.5-1.src.rpm
checksum_type: sha256
description:
  Creating Atlassian Document in a programmatic way.



  Provide an automatic way to generate documents and report on Atlassian Platform (e.g. Confluence, Jira).
  Developer may automate report publication (e.g. functional verification report / requirement documents) into CI.





  - Python3.8+



  ```shell
  pip install atlassian-doc-builder
  ```



  - Tree-Like Document Representation
  - JSON ADF Rendering and Parsing
  - Reusable Template with variable filling
  - Document Validation



  Please refer to [this document](Implemented_nodes.md).



  - [x] Create Base Class for ADF Object
  - [x] Implement Basic Features above
  - [x] Derive common classes for easy access (e.g. Text, Paragraph)
  - [ ] Add short hands functions to create document
  - [x] Table Editor and Table Row Editor
  - [ ] Media Display



  Please refer to [the "examples" directory](examples).



  - 0.5
    - Implement Task, Decision List and related item
    - Implement Expand (Collapsible Section) and Placeholder
    - Implement Date and a more marks for text decoration
  - 0.4
    - Implement Table Objects with creation routine
    - Implement a set of Block Nodes with children
    - Index access to child nodes with `[]`. Multiple indexes supported. e.g. `doc[1,2,3]`
  - 0.3
    - Support `ADFText`, `ADFLink` and a bunch of one line classes
    - ADFObject Class Factory for quick Class Development
  - 0.2
    - Add Test Suite
    - Improve ADFObject Implementations
  - 0.1
    - Initial Release



  Pull Requests and Discussion are welcome on GitHub.



  This project is licensed under the MIT License - see the LICENSE file for details



  This Project is inspired by:
  - [pyadf project from Atlassian](https://bitbucket.org/atlassian/pyadf)

rpm_license:
  MIT License  Copyright (c) 2023 Kin Hin Wong  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: e64c28d0dd56c17cd85c93289422981c8de2a984943a3b3668e90849506ed75b
name: python-atlassian-jwt
arch: src
version: 3.0.0
epoch: 0
release: 1
summary: JSON web token: pyjwt plus Atlassian query-string-hash claim
url: https://bitbucket.org/atlassian/atlassian-jwt-py
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlassian-jwt-3.0.0-1.src.rpm
checksum_type: sha256
description:
  `codebeat
  badge <https://codebeat.co/projects/bitbucket-org-atlassian-atlassian-jwt-py/ratings>`__
  `JSON Web Token <https://jwt.io/>`__ (JWT) authentication and encoding
  library for Python 2 and 3. Extends
  `pyjwt <https://github.com/jpadilla/pyjwt>`__ to include Atlassian
  Connect’s custom `query string
  hash <https://developer.atlassian.com/blog/2015/01/understanding-jwt/>`__
  (qsh) claim.
  This package is on `pypi <https://pypi.python.org/pypi/atlassian-jwt>`__
  so you can use pip to install it
     pip install atlassian-jwt


pkgId: ae683f85c1029d7d9ca837b6807c7e7db95e79cc0f432cbfcd7d639d1c163772
name: python-atlassian-modules
arch: src
version: 0.4.1
epoch: 0
release: 1
summary: Modules for interacting with Atlassian cloud products.
url: https://pypi.org/project/atlassian-modules/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlassian-modules-0.4.1-1.src.rpm
checksum_type: sha256
description:
  The best way to interact with Atlassian Jira/Confluence API.

  > **Note:** _This module is useful for the Atlassian Cloud_ <br>
  > Your URL should look like this https://domain.atlassian.net



  ```python
  from atlassian_modules import JiraHelper # for Jira
  from atlassian_modules import  WikiHelper # for Wiki
  ```





  To initialize a connection to Jira, instantiate the `JiraHelper` class with your Jira URL, email, and API token:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  ```
  ______________________________________________________________________________
  ______________________________________________________________________________

  ______________________________________________________________________________
  ______________________________________________________________________________


  - You can create a new Jira ticket using the `create_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_url = jira_helper.create_ticket("PRJ", "Issue Summary", "Detailed issue description.", "Bug")
  if ticket_url:
      print(f"Ticket created: {ticket_url}")
  else:
      print("Failed to create ticket.")
  ```
  Parameters:
  - `project_key` (str): Key of the project where the new ticket will be created. This is usually a short, capitalized identifier for a project in JIRA.
  - `summary` (str): Summary of the new ticket. This is a concise overview of the issue or task.
  - `description` (str): Detailed description of the new ticket. This field is used to provide all necessary details about the issue or task.
  - `issue_type` (str): Type of the issue (e.g., `Bug`, `Task`, `Story`). This specifies what kind of ticket is being created.

  Output:
  - The function outputs informational messages about the process of creating a ticket, including preparing issue data, sending a request to create the ticket, and the result of that request.

  Return:
  - `URL of the created ticket (str)`: If the ticket creation is successful, the function returns the URL to access the newly created ticket directly.
  - `False`: If the ticket creation fails (for example, due to incorrect input parameters or server errors), the function returns `False`.
  ______________________________________________________________________________

  - You can create a new custom Jira ticket using the `create_custom_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)


  additional_fields = {
      "customfield_12345": "Custom value",
      "labels": ["label1", "label2"]
  }

  ticket_url = jira_helper.create_custom_ticket("PRJ", "Issue Summary", "Detailed issue description.", "Bug", additional_fields)
  if ticket_url:
      print(f"Ticket created: {ticket_url}")
  else:
      print("Failed to create ticket.")

  ```
  Parameters:
  - `project_key` (str): The key of the project where the new ticket will be created. This is typically a short, capitalized identifier specific to a project in Jira.
  - `summary` (str): A concise overview of the issue or task that the new ticket will represent.
  - `description` (str): A detailed description of the issue or task, providing all necessary details for understanding and addressing it.
  - `issue_type` (str): Specifies the type of issue being created (e.g., `Bug`, `Task`, `Story`), determining how the issue is categorized within Jira.
  - `additional_fields` (dict, optional): A dictionary of additional fields that are required for ticket creation. This parameter allows for the inclusion of project-specific or issue-specific information that is not covered by the standard fields.

  Output:
  - The function provides informational messages throughout the process of creating a ticket.
  - These messages include details on preparing the issue data, sending a request to create the ticket, and the outcome of that request.
  Return:
  - `URL of the created ticket` (str): If the ticket creation is successful, the function returns the URL to access the newly created ticket directly. This allows for immediate navigation to the ticket for review or further action.
  - `False`: If the ticket creation process fails, whether due to incorrect input parameters, server errors, or issues with the additional fields, the function returns `False`. This indicates that the ticket was not created and provides an opportunity to address any issues before retrying.
  ______________________________________________________________________________

  - You can update any custom field of Jira ticket using the `update_ticket_with_fields` method:
  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)


  additional_fields = {
      "customfield_12345": "New custom value",
      "labels": ["newlabel1", "newlabel2"]
  }

  ticket_id = "PRJ-123"  # Example ticket ID to be updated

  update_success = jira_helper.update_ticket_with_fields(ticket_id, additional_fields)
  if update_success:
      print(f"Ticket {ticket_id} updated successfully.")
  else:
      print(f"Failed to update ticket {ticket_id}.")
  ```
  Parameters:
  - `ticket_id` (str): ID (also known as the key) of the ticket to be updated. This identifier is typically a combination of the project key and a sequence number, like `PRJ-123`.
  - `additional_fields` (dict): A dictionary of fields to update the ticket with. This parameter allows specifying values for any standard or custom field in the ticket that supports updates.
  Output:
  - The function prints messages about the process of updating the ticket, including preparing the update data, making the request to update the ticket, and the result of that request.
  Return:
  - `True` if the update was successful. This indicates that the server accepted the update request and applied the changes to the ticket.
  - `False` otherwise. If the ticket update fails (for example, due to incorrect ticket ID, fields that cannot be updated, or server errors), the function returns `False`, and additional error information is printed to help diagnose the issue.
  ______________________________________________________________________________


  - To delete a ticket, use the `delete_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  if jira_helper.delete_ticket(ticket_key):
      print("Ticket deleted successfully.")
  else:
      print("Failed to delete ticket or ticket does not exist.")
  ```
  Parameters:
  - `ticket_key` (str): The unique identifier for the ticket you wish to delete. This key is usually a combination of the project key and a number (e.g., "`PRJ-123`").

  Output:
  - The function itself does not print any output, but it performs a `DELETE` request to the JIRA REST API to delete the specified ticket.

  Return:
  - `True`: If the ticket is successfully deleted. This is indicated by a `204` HTTP status code from the JIRA API, meaning "`No Content`" but signifying successful deletion.
  - `False`: If the deletion fails, which can occur if the ticket does not exist or if there's an issue with the API request (e.g., permissions, invalid ticket key). This is communicated by returning `False`.
  ______________________________________________________________________________


  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  transition_name = "Close"
  transition_id = jira_helper.get_transitions(ticket_key, transition_name)
  if transition_id:
      print(f"Transition ID for '{transition_name}' is {transition_id}.")
  else:
      print(f"Transition '{transition_name}' not found for ticket {ticket_key} or failed to fetch transitions.")
  ```

  Parameters:
  - `ticket_key` (str): The key of the ticket for which transitions are being fetched. This is typically a unique identifier like "`PRJ-123`".
  - `transition_to` (str): The name of the desired transition to look for. This is the human-readable name of the transition (e.g., "`Close`", "`Resolve`").

  Output:
  - The function prints messages about the process of fetching transitions for the ticket, including whether the transitions were successfully fetched, if the specific transition was found, and any errors encountered during the request.

  Return:
  - `Transition ID` (str): If the specified transition is found for the given ticket, the function returns the transition's ID, which can be used for further actions like transitioning the ticket to another status.
  - `False`: If the specified transition is not found for the ticket, or if there is any failure in fetching transitions (e.g., due to an invalid ticket key, network issues, or server errors), the function returns `False`.
  ______________________________________________________________________________


  - To transition a ticket to a different status, use the `transition_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  transition_input = "Done"  # Can be a transition name like 'Done' or an ID like '31'
  if jira_helper.transition_ticket(ticket_key, transition_input):
      print("Ticket transitioned successfully.")
  else:
      print("Failed to transition ticket.")
  ```

  Parameters:
  - `ticket_key` (str): The key of the ticket you want to transition. This is a unique identifier for the ticket within JIRA.
  - `transition_input` (str or int): The desired transition for the ticket. This can be specified as either the name of the transition (e.g., "`Done`") or the transition ID (e.g., `31`).

  Output:
  - The function outputs informational messages regarding the transition process, including attempts to find the transition ID if a name is provided, and the result of the transition attempt.

  Return:
  - `True`: If the ticket transition is successful. This is indicated by a `204` HTTP status code, which means "`No Content`" but signifies that the operation completed successfully.
  - `False`: If the ticket transition fails. This could be due to various reasons, such as an invalid ticket key, an unrecognized transition name or ID, or a failure in the HTTP request itself.

  ______________________________________________________________________________


  - To check if a ticket exist, use the `if_ticket_exist` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  if jira_helper.if_ticket_exist(ticket_key):
      print("The ticket exists.")
  else:
      print("The ticket does not exist.")
  ```
  Parameters:
  - `ticket_key` (str): The key of the ticket you want to check. This is a unique identifier for the ticket within JIRA.

  Output:
  - The function outputs messages that indicate whether it is checking for the existence of the specified ticket and the result of that check.

  Return:
  - `True`: If the ticket exists. This is confirmed by a `200` HTTP status code, indicating that the ticket was found.
  - `False`: If the ticket does not exist or if there was an error in checking. A `404` HTTP status code indicates the ticket does not exist. Other status codes indicate a failure in the request to check the ticket.
  ______________________________________________________________________________


  - To comment on the ticket, use the `comment_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  comment_text = "This is an example comment."
  comment_url = jira_helper.comment_ticket(ticket_key, comment_text)
  if comment_url:
      print(f"Comment added successfully: {comment_url}")
  else:
      print("Failed to add comment to the ticket.")
  ```
  Parameters:
  - `ticket_key` (str): The key of the ticket to which you want to add a comment. This is a unique identifier for the ticket within JIRA.
  - `comment_text` (str): The text of the comment you wish to add to the ticket.

  Output:
  - The function outputs messages that indicate the process of adding a comment to the specified ticket, including checking if the ticket exists and attempting to add the comment.

  Return:
  - `URL of the created comment` (str): If adding the comment is successful, the function returns the URL to access the newly created comment directly. This is indicated by a `201` HTTP status code, meaning "`Created`".
  - `False`: If adding the comment fails. This could be because the ticket does not exist, the comment text is invalid, or there was an error in the request itself. In such cases, the function returns `False`.
  ______________________________________________________________________________


  - To query tickets using JQL, use the `jql_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  jql_query = "project = PRJ AND status = 'Open'"
  max_results = 100  # Optional
  ticket_keys = jira_helper.jql_ticket(jql_query, max_results)
  if ticket_keys:
      print(f"Found tickets: {', '.join(ticket_keys)}")
  else:
      print("Failed to retrieve tickets based on the JQL query.")
  ```

  Parameters:
  - `jql_query` (str): The Jira Query Language query string used to retrieve tickets. This string specifies the criteria that the returned tickets must meet.
  - `max_results` (int, optional): The maximum number of tickets to retrieve. If not specified, the method attempts to fetch all tickets that match the query.

  Output:
  - The function outputs messages that detail the execution of the JQL query, including the number of tickets fetched in each batch and the total number of requested tickets.

  Return:
  - `List of ticket keys` (list): If successful, the function returns a list containing the keys of the tickets that match the JQL query criteria. Each key is a unique identifier for a ticket within JIRA.
  - `False`: If the retrieval fails. This could be due to an issue with the JQL query, a problem with the request to JIRA, or if the JIRA server returns an unexpected status code. In such cases, the function returns `False`.
  ______________________________________________________________________________
  ______________________________________________________________________________

  ______________________________________________________________________________
  ______________________________________________________________________________

  - To create wiki page, use the `create_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  space_key = "DEV"
  title = "API Documentation"
  content = "<p>This is the API documentation for our project.</p>"
  parent_page_id = 123456  # Optional
  page_url = wiki_helper.create_wiki_page(space_key, title, content, parent_page_id)
  if page_url:
      print(f"Wiki page created successfully: {page_url}")
  else:
      print("Failed to create wiki page.")
  ```
  Parameters:
  - `space_key` (str): The key of the Confluence space where the new page will be created. Confluence spaces are containers for related content.
  - `title` (str): The title of the new page. Titles are used to identify pages within Confluence.
  - `content` (str): The content of the new page. This is usually HTML or Confluence storage format markup that defines the page's body.
  - `parent_page_id` (int, optional): The ID of a parent page if the new page is to be a child page. This parameter is optional; if not provided, the page will be created at the root of the specified space.

  Output:
  - The function outputs messages detailing the process of creating the Confluence page, including the attempt to create the page and the result of that attempt.

  Return:
  - `URL of the created Confluence page` (str): If the page creation is successful, the function returns the URL to access the newly created page. This is indicated by a `200` HTTP status code.
  - `False`: If the page creation fails. This could be due to various issues, such as invalid input parameters, permissions problems, or server errors. In such cases, the function returns `False`.
  ______________________________________________________________________________

  - To duplicate wiki page, use the `duplicate_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  source_page_id = "12345"  # Example source page ID
  target_space_key = "TGT"  # Example target space key
  target_title = "Duplicated Page Title"  # New title for the duplicated page
  target_parent_page_id = "67890"  # Optional parent page ID for the new page

  duplicated_page_url = wiki_helper.duplicate_wiki_page(source_page_id, target_space_key, target_title, target_parent_page_id)
  if duplicated_page_url:
      print(f"Duplicated page successfully. View at: {duplicated_page_url}")
  else:
      print("Failed to duplicate the page.")
  ```
  Parameters:
  - `source_page_id` (str): ID of the Confluence page you wish to duplicate.
  - `target_space_key` (str): Key of the Confluence space where the duplicated page will reside.
  - `target_title` (str): Title of the duplicated page.
  - `target_parent_page_id` (str, optional): ID of the parent page if the duplicated page is to be a child within the hierarchy. If not specified, the page will be created at the top level of the specified space.
  Output:
  - The method outputs messages detailing the process of duplicating a page, including fetching content from the source page and creating a new page with this content in the target space.

  Return:
  - `URL of the duplicated Confluence page` (str): If the duplication is successful, the method returns the URL to access the newly created duplicated page. This URL is constructed from the response of the page creation process.
  - `None`: If the duplication fails at any point (e.g., retrieving content from the source page, creating the new page), the method returns `None`. This indicates that the operation was not successful, and no new page was created.
  ______________________________________________________________________________

  - To create a wiki page from template use the `create_page_from_template` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  template_id = "12345"  # Example template ID
  space_key = "TGT"  # Example space key
  title = "New Page from Template"  # Title for the new page
  parent_page_id = "67890"  # Optional parent page ID

  created_page_url = wiki_helper.create_page_from_template(template_id, space_key, title, parent_page_id)
  if created_page_url:
      print(f"New page created successfully. View at: {created_page_url}")
  else:
      print("Failed to create the new page from template.")
  ```
  Parameters:
  - `template_id` (str): ID of the Confluence template you wish to use for creating the new page.
  - `space_key` (str): Key of the Confluence space where the new page will be created.
  - `title` (str): Title of the new page.
  - `parent_page_id` (str, optional): ID of the parent page if the new page is to be a child within the space hierarchy. If not specified, the page will be created at the top level of the specified space.
  Output:
  - The function outputs messages that detail the process of creating a new page from a template, including checking for duplicate titles in the target space, retrieving content from the specified template, and the creation of the new page.
  Return:
  - `URL of the created Confluence page` (str): If the page creation is successful, the function returns the URL to access the newly created page. This indicates that the page was created successfully and is accessible at the returned URL.
  - `None` or `False`: If the page creation fails, due to reasons such as template retrieval failure, duplicate title, or any error in the creation process, the function returns `None` or `False`. This indicates that no new page was created.
  ______________________________________________________________________________

  - To move wiki page from one location to another location without changing title use `move_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "12345"  # Example page ID to be moved
  target_space_key = "NEWSPACE"  # Target space key
  target_position = "append"  # Position of the page relative to the parent page ('append', 'above', 'below')
  target_parent_page_id = "67890"  # Optional new parent page ID

  moved_page_url = wiki_helper.move_wiki_page(page_id, target_space_key, target_position, target_parent_page_id)
  if moved_page_url:
      print(f"Page moved successfully. View at: {moved_page_url}")
  else:
      print("Failed to move the page.")
  ```
  Parameters:
  - `page_id` (str): ID of the Confluence page you wish to move.
  - `target_space_key` (str): Key of the Confluence space where the page will be moved to.
  - `target_position` (str): Position to place the moved page relative to the parent page. Default is '`append`', but '`above`' and '`below`' are also valid options.
  - `target_parent_page_id` (str, optional): ID of the parent page if the moved page is to be nested under another page. If not specified, the page will be moved to the top level of the target space or as specified by `target_position`.
  Output:
  - The function outputs messages detailing the process of moving the page, including retrieving the current page title, preparing the move operation, and executing the move.
  Return:
  - `URL of the moved Confluence page` (str): If the move operation is successful, the function returns the URL to access the moved page. This indicates that the page was successfully moved to the new space and position.
  - `None` or `False`: If the move operation fails, due to reasons such as an error retrieving the current page details, an error in the move operation, or inability to retrieve the moved page URL, the function returns `None` or `False`. This indicates that the page was not successfully moved.
  ______________________________________________________________________________

  - To move wiki page from one location to another location without changing title use `move_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  title = "Example Page Title"  # Title of the Confluence wiki page to check
  space_key = "EX"  # Key of the Confluence space

  if wiki_helper.wiki_page_exists(title, space_key):
      print(f"The page '{title}' exists in space '{space_key}'.")
  else:
      print(f"The page '{title}' does not exist in space '{space_key}'.")
  ```
  Parameters:
  - `title` (str): Title of the Confluence wiki page to check for existence.
  - `space_key` (str): Key of the Confluence space where the page might reside.
  Output:
  - The function outputs a message indicating the start of the check process and then reports whether the specified page exists in the given space based on the title.
  Return:
  - `True`: If the page exists. This is determined by the presence of results matching the specified title in the specified space.
  - `False`: If the page does not exist or if there was an error during the request. This could be due to the specified page not being found in the given space or an issue with the Confluence API response.
  ______________________________________________________________________________

  - Recursively retrieve all descendant pages of a given parent page ID.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  parent_id = "12345"  # Example parent page ID
  child_pages = wiki_helper.get_child_pages_recursive(parent_id)
  if child_pages:
      print("Child pages found:")
      for page in child_pages:
          print(f"Title: {page['title']}, ID: {page['id']}, Parent ID: {page['parentid']}")
  else:
      print("No child pages found or failed to fetch.")
  ```
  Parameters:
  - `parent_id` (str): ID of the parent Confluence wiki page from which to start retrieving descendant pages.
  Output:
  - The method does not directly print any output but provides a mechanism for recursively fetching and listing all child pages beneath a given parent page. It operates by:
    - Fetching the direct children of the provided parent ID.
    - Recursively calling itself for each child to fetch further descendants, accumulating all pages in a list.

  Return:
  - `List of child pages`: Returns a list of dictionaries, each containing the title, ID, and parent ID of each descendant page found. This allows for a comprehensive view of the hierarchy and content under the specified parent page.
  - If the retrieval fails at any point (due to an error in fetching child pages, for instance), the recursive fetching process is designed to continue for other branches of the tree, aiming to return as complete a list as possible of descendant pages.
  ______________________________________________________________________________

  - Retrieve the ID of a Confluence wiki page by its title.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  title = "Example Page"  # Title of the Confluence wiki page to search for
  space_key = "EX"  # Key of the Confluence space

  page_id = wiki_helper.get_page_id(title, space_key)
  if page_id:
      print(f"Found page '{title}' with ID: {page_id} in space '{space_key}'.")
  else:
      print(f"No page found with the title '{title}' in space '{space_key}'.")
  ```
  Parameters:
  - `title` (str): Title of the Confluence wiki page you're looking for.
  - `space_key` (str): Key of the Confluence space where you're searching for the page.
  Output:
  - The function outputs a message indicating the process of searching for the page by its title within the specified space and then reports the outcome of the search:
    - If a page with the specified title exists in the given space, it prints the page ID and confirms the page was found.
    - If no page with the specified title exists in the given space, it indicates no page was found.
    - If there's an error in the search process (e.g., issues with the Confluence API response), it reports the failure.

  Return:
  - `ID of the page` (str): If a page with the specified title is found in the given space, the function returns the ID of the page.
  - `False`: If no page is found with the given title in the specified space, or if there was an error during the request, the function returns `False`.
  ______________________________________________________________________________

  - Replace all occurrences of a string in a Confluence wiki page.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID
  from_string = "old text"  # Text to be replaced
  to_string = "new text"  # Replacement text

  if wiki_helper.replace_in_page(page_id, from_string, to_string):
      print(f"Replaced all occurrences of '{from_string}' with '{to_string}' in page ID: {page_id}.")
  else:
      print("Failed to replace text in the page.")
  ```
  Parameters:
  - `page_id` (str): ID of the Confluence wiki page where the replacement will be made.
  - `from_string` (str): The string to be replaced in the page's content.
  - `to_string` (str): The string to use as a replacement.
  Output:
  - The function outputs messages detailing the process of fetching the page content, performing the replacement, and updating the page with the new content:
    - It starts by fetching the current content and version number of the specified page.
    - It then replaces all occurrences of the `from_string` with the `to_string` within the page's content.
    - If replacements are made, it updates the page with the new content and increments the version number. If no occurrences are found, it indicates so and considers the operation successful without making an update.

  Return:
  - `True`: If the replacement operation was successful, whether replacements were made or not (including the case where the `from_string` was not found).
  - `False`: If there was a failure at any point during the process, such as an error fetching the page content, or updating the page with the new content.
  ______________________________________________________________________________

  - Fetch all tables from a Confluence wiki page.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  tables_json = wiki_helper.get_tables_from_page(page_id)
  if tables_json:
      print("Found tables on the page:")
      print(tables_json)
  else:
      print("Failed to fetch tables or no tables found on the page.")
  ```
  Parameter
  - `page_id` (str): ID of the Confluence wiki page from which to fetch tables.

  Output:
  - The function initiates by fetching the content of the specified Confluence wiki page. It then parses the HTML content of the page to find and extract data from all tables present on the page. Each table's data is converted into a JSON structure, providing an easy-to-read format of the tables' contents.
  Return:
  - JSON structure: Returns a JSON string that represents all the tables found on the page. Each table is structured into a JSON object with keys representing the table headers and values representing the row data. If multiple tables are found, they are indexed as `table1`, `table2`, etc., in the JSON structure.
  - If the fetching fails (due to an unsuccessful API call) or if no tables are found on the page, the function returns an empty JSON object (`{}`).
  ______________________________________________________________________________

  - Replace the entire Confluence wiki page with the new content
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "12345"  # Example page ID
  new_content = "<p>This is the new content for the page.</p>"  # HTML content

  if wiki_helper.update_wiki_page(page_id, new_content):
      print(f"Page ID: {page_id} was updated successfully.")
  else:
      print(f"Failed to update the page ID: {page_id}.")
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page that you want to update.
  - `new_content` (str): The new content to replace the existing content of the page. This content is typically in `HTML` format.

  Output:
  - The method prints messages to inform the user about the process steps, including fetching current page data and attempting to update the page with new content.
  Return:
  - `True`: If the page content update is successful. This is indicated by a status code of `200` from the Confluence REST API, showing that the update request was processed correctly.
  - `False`: If the update fails. This could be due to various reasons such as an invalid page ID, issues with the Confluence server, or improper formatting of the new content. Failure is indicated by any status code other than `200`, and the method prints the error details received from the server.
  ______________________________________________________________________________

  - Retrieve the parent ID of a Confluence wiki page by passed page ID.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  parent_id = wiki_helper.get_parent_page_id(page_id)
  if parent_id:
      print(f"Parent page ID for page ID {page_id}: {parent_id}")
  else:
      print(f"No parent page found for page ID {page_id}, or failed to fetch.")
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page for which you want to find the parent page.

  Output:
  - The method outputs a message indicating it is fetching the parent page ID for the specified page. It then either reports the ID of the parent page, states that no parent page was found, or indicates a failure to fetch the parent page ID.

  Return:
  - `ID of the parent page` (str): If the specified page has a parent page, the method returns the ID of the parent page. This is useful for understanding the hierarchy of pages within Confluence spaces.
  - `False`: If no parent page exists for the specified page or if there was an error in the fetch operation (such as an invalid page ID or a problem with the Confluence server), the method returns False. This helps to identify pages that are at the top level of their space or when an issue occurs with the retrieval process.
  ______________________________________________________________________________

  - Add a Table of Contents (TOC) to a Confluence wiki page if it doesn't already have one.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  result_message = wiki_helper.add_toc_to_page(page_id)
  print(result_message)
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page where you want to add a Table of Contents.

  Output and Return
  - The function returns a **message** indicating the operation's result. This could be a confirmation that the TOC was added successfully, a message stating that the TOC already exists, or an error message if the operation failed.
  - **Error Handling**: If there are issues fetching the page data or updating the page, the function provides detailed error messages including the status code and response text from Confluence's API. This is helpful for diagnosing problems with the operation.
  ______________________________________________________________________________

  - Pass the header to identify the table and then add the row to that identified table
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  page_id = "123456"  # Example page ID
  headers = ["Header1", "Header2", "Header3"]  # The headers of the table you're targeting
  row_data = ["Data1", "Data2", "Data3"]  # The data for the new row

  result_message = wiki_helper.add_row_to_table(page_id, headers, row_data)
  print(result_message)
  ```
  Parameters
  - `page_id` (str): The ID of the Confluence page you're modifying.
  - `headers` (list of str): A list of headers representing the columns of the table. This ensures that the data is added to the correct column.
  - `row_data` (list of str): A list of values corresponding to each header, forming the new row.

  Output and Return
  - The function returns a message indicating the result of the operation. This could be a confirmation of successful row addition, or an error message detailing why the operation failed.

  ______________________________________________________________________________

  - Pass the header to identify the table and then add/update the row to that identified table
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID
  headers = ["Cluster Name", "Component Name", "Next Version"]  # The headers of your table
  new_row_data = ["Cluster1", "ComponentA", "v2.0"]  # Data for the new or updated row

  result_message = wiki_helper.update_or_add_table_row(page_id, headers, new_row_data)
  print(result_message)
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence page containing the table.
  - `headers` (list of str): A list of headers representing the columns of the table. It's crucial for identifying the correct columns when updating or adding rows.
  - `new_row_data` (list of str): The values for the new or updated row, aligned with the headers order.
  Output and Return
  - The function returns a message indicating the result of the operation, such as successful row update, successful addition of a new row, or an error if the operation failed.
  ______________________________________________________________________________


  🔒 **We respect your privacy**: This module does **not** store any of your data anywhere. It simply interacts with the Atlassian Jira API to perform the requested operations. Ensure you manage your connection details securely.




  - Revision in documentation for better understanding
    - Based on the internal design now `JIRA_URL`, `CONFLUENCE_URL` is replaced with `ATLASSIAN_URL`
    - Technically we are using `https://domain.atlassian.net` only to address Jira and Wiki both
    - This is mentioned in the top of the document as well
  - Beta Features (Continued from previous release):
    - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.


  - New Features:
    - JIRA Integration Enhancements:
      - Custom Ticket Creation: The `create_custom_ticket` function has been introduced, allowing for more flexible ticket creation in JIRA projects. This function supports additional fields, enabling users to specify custom data during ticket creation.
      - Ticket Field Updates: The `update_ticket_with_fields` method has been added, offering the ability to update existing tickets with new or modified fields. This feature is crucial for maintaining accurate and up-to-date ticket information.
  - Beta Features (Continued from previous release):
    - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.


  - 0.3 (21 Mar 2024)
    - Enhancements:
      - Updated `readme.md` documentation.
      - Introduced beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
  - 0.2.8 (21 Mar 2024)
    - Minor updates and enhancements (details forthcoming).
  - 0.2.7 (08 Jan 2024)
    - New Features:
      - `add_toc_to_page`: Automatically adds a table of contents to wiki pages lacking one.
    - Documentation:
      - Updated `README.md` with guidance on using `add_toc_to_page`.
  - 0.2.6 (05 Jan 2024)
    - New Features:
      - `get_parent_page_id`: Retrieves the parent ID for a given wiki page ID.
    - Documentation:
      - Updated `README.md` with instructions for `get_parent_page_id`.
  - 0.2.5.4 (04 Jan 2024)
    - New Features:
      - `update_wiki_page`: Replaces entire wiki page content with new content.
    - Documentation:
      - Updated `README.md` with usage information for `update_wiki_page`.
  - 0.2.5.3 (04 Jan 2024)
    - Internal testing release; not intended for general use.
  - 0.2.5.2 - 0.2.5 (04 Jan 2024)
    - Withdrawn due to potential bugs.
  - 0.2.4 (13 Oct 2023)
    - New Features:
      - `get_tables_from_page`: Fetches all tables from a wiki page in JSON format, simplifying table extraction.
    - Documentation:
      - Updated `README.md` with `get_tables_from_page` usage details.
  - 0.2.3.1 (21 Sep 2023)
    - Documentation:
      - Updated `README.md` with usage information for `get_page_id` and `replace_in_page`.
  - 0.2.3 (21 Sep 2023)
    - Confluence Integration:
      - Added `get_page_id` to retrieve wiki page IDs.
  - 0.2.2.1 (21 Sep 2023)
    - Performance improvements and extra output suppression.
    - Confluence Integration:
      - Added `replace_in_page` for in-page text replacement.
  - 0.2.2 (20 Sep 2023)
    - Documentation:
      - Enhanced `README.md` for better clarity.
    - Confluence Integration:
      - Added `get_child_pages_recursive` to fetch child pages recursively.
  - 0.2.1 (20 Sep 2023) - Major Release
    - Enhancements:
      - Comprehensive `README.md` update for improved understanding.
      - Fine-tuned output monitoring and improved return format.
    - Confluence Integration:
      - Multiple functionalities added, including page creation, duplication, template usage, moving pages, and existence checks.
  - 0.2 (20 Sep 2023)
    - Withdrawn due to potential bugs.
  - 0.1.4.1 (18 Sep 2023)
    - Documentation:
      - Updated `README.md` for enhanced understanding.
  - 0.1.4 (18 Sep 2023)
    - Improvements:
      - Suppressed extraneous output for cleaner integration.
      - Detailed function outputs in `README.md`.
    - Features:
      - Added Jira ticket search, commenting, and JQL processing functions.
  - 0.1.3 (18 Sep 2023)
    - Withdrawn due to potential bugs.
  - 0.1.2.1 (16 Sep 2023)
    - Documentation:
      - Reformatted `README.md`.
  - 0.1.2 (16 Sep 2023)
    - Features:
      - Added `if_exist_ticket` for Jira ticket existence checks.
    - Documentation:
      - Updated `README.md` format.
  - 0.1.1 (16 Sep 2023)
    - Features:
      - Added `transition_ticket` for Jira ticket transitions, with ID flexibility.
    - Documentation:
      - Clarified module usage in `README.md`.
  - 0.1 (16 Sep 2023)
    - Initial Release:
      - Introduced Jira ticket management functions: `create`, `delete`, and `transition tickets`.


pkgId: e37931b57006fd1722d1856a750ea879225a90e0053d6e0b0229fe334e01e036
name: python-atlassian-modules
arch: src
version: 0.5.0
epoch: 0
release: 1
summary: Modules for interacting with Atlassian cloud products.
url: https://pypi.org/project/atlassian-modules/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlassian-modules-0.5.0-1.src.rpm
checksum_type: sha256
description:
  The best way to interact with Atlassian Jira/Confluence API.

  > **Note:** _This module is useful for the Atlassian Cloud_ <br>
  > Your URL should look like this https://domain.atlassian.net



  ```python
  from atlassian_modules import JiraHelper # for Jira
  from atlassian_modules import  WikiHelper # for Wiki
  ```





  To initialize a connection to Jira, instantiate the `JiraHelper` class with your Jira URL, email, and API token:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  ```
  ______________________________________________________________________________
  ______________________________________________________________________________

  ______________________________________________________________________________
  ______________________________________________________________________________


  - You can create a new Jira ticket using the `create_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_url = jira_helper.create_ticket("PRJ", "Issue Summary", "Detailed issue description.", "Bug")
  if ticket_url:
      print(f"Ticket created: {ticket_url}")
  else:
      print("Failed to create ticket.")
  ```
  Parameters:
  - `project_key` (str): Key of the project where the new ticket will be created. This is usually a short, capitalized identifier for a project in JIRA.
  - `summary` (str): Summary of the new ticket. This is a concise overview of the issue or task.
  - `description` (str): Detailed description of the new ticket. This field is used to provide all necessary details about the issue or task.
  - `issue_type` (str): Type of the issue (e.g., `Bug`, `Task`, `Story`). This specifies what kind of ticket is being created.

  Output:
  - The function outputs informational messages about the process of creating a ticket, including preparing issue data, sending a request to create the ticket, and the result of that request.

  Return:
  - `URL of the created ticket (str)`: If the ticket creation is successful, the function returns the URL to access the newly created ticket directly.
  - `False`: If the ticket creation fails (for example, due to incorrect input parameters or server errors), the function returns `False`.
  ______________________________________________________________________________

  - You can create a new custom Jira ticket using the `create_custom_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)


  additional_fields = {
      "customfield_12345": "Custom value",
      "labels": ["label1", "label2"]
  }

  ticket_url = jira_helper.create_custom_ticket("PRJ", "Issue Summary", "Detailed issue description.", "Bug", additional_fields)
  if ticket_url:
      print(f"Ticket created: {ticket_url}")
  else:
      print("Failed to create ticket.")

  ```
  Parameters:
  - `project_key` (str): The key of the project where the new ticket will be created. This is typically a short, capitalized identifier specific to a project in Jira.
  - `summary` (str): A concise overview of the issue or task that the new ticket will represent.
  - `description` (str): A detailed description of the issue or task, providing all necessary details for understanding and addressing it.
  - `issue_type` (str): Specifies the type of issue being created (e.g., `Bug`, `Task`, `Story`), determining how the issue is categorized within Jira.
  - `additional_fields` (dict, optional): A dictionary of additional fields that are required for ticket creation. This parameter allows for the inclusion of project-specific or issue-specific information that is not covered by the standard fields.

  Output:
  - The function provides informational messages throughout the process of creating a ticket.
  - These messages include details on preparing the issue data, sending a request to create the ticket, and the outcome of that request.
  Return:
  - `URL of the created ticket` (str): If the ticket creation is successful, the function returns the URL to access the newly created ticket directly. This allows for immediate navigation to the ticket for review or further action.
  - `False`: If the ticket creation process fails, whether due to incorrect input parameters, server errors, or issues with the additional fields, the function returns `False`. This indicates that the ticket was not created and provides an opportunity to address any issues before retrying.
  ______________________________________________________________________________

  - You can update any custom field of Jira ticket using the `update_ticket_with_fields` method:
  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)


  additional_fields = {
      "customfield_12345": "New custom value",
      "labels": ["newlabel1", "newlabel2"]
  }

  ticket_id = "PRJ-123"  # Example ticket ID to be updated

  update_success = jira_helper.update_ticket_with_fields(ticket_id, additional_fields)
  if update_success:
      print(f"Ticket {ticket_id} updated successfully.")
  else:
      print(f"Failed to update ticket {ticket_id}.")
  ```
  Parameters:
  - `ticket_id` (str): ID (also known as the key) of the ticket to be updated. This identifier is typically a combination of the project key and a sequence number, like `PRJ-123`.
  - `additional_fields` (dict): A dictionary of fields to update the ticket with. This parameter allows specifying values for any standard or custom field in the ticket that supports updates.
  Output:
  - The function prints messages about the process of updating the ticket, including preparing the update data, making the request to update the ticket, and the result of that request.
  Return:
  - `True` if the update was successful. This indicates that the server accepted the update request and applied the changes to the ticket.
  - `False` otherwise. If the ticket update fails (for example, due to incorrect ticket ID, fields that cannot be updated, or server errors), the function returns `False`, and additional error information is printed to help diagnose the issue.
  ______________________________________________________________________________


  - To delete a ticket, use the `delete_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  if jira_helper.delete_ticket(ticket_key):
      print("Ticket deleted successfully.")
  else:
      print("Failed to delete ticket or ticket does not exist.")
  ```
  Parameters:
  - `ticket_key` (str): The unique identifier for the ticket you wish to delete. This key is usually a combination of the project key and a number (e.g., "`PRJ-123`").

  Output:
  - The function itself does not print any output, but it performs a `DELETE` request to the JIRA REST API to delete the specified ticket.

  Return:
  - `True`: If the ticket is successfully deleted. This is indicated by a `204` HTTP status code from the JIRA API, meaning "`No Content`" but signifying successful deletion.
  - `False`: If the deletion fails, which can occur if the ticket does not exist or if there's an issue with the API request (e.g., permissions, invalid ticket key). This is communicated by returning `False`.
  ______________________________________________________________________________


  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  transition_name = "Close"
  transition_id = jira_helper.get_transitions(ticket_key, transition_name)
  if transition_id:
      print(f"Transition ID for '{transition_name}' is {transition_id}.")
  else:
      print(f"Transition '{transition_name}' not found for ticket {ticket_key} or failed to fetch transitions.")
  ```

  Parameters:
  - `ticket_key` (str): The key of the ticket for which transitions are being fetched. This is typically a unique identifier like "`PRJ-123`".
  - `transition_to` (str): The name of the desired transition to look for. This is the human-readable name of the transition (e.g., "`Close`", "`Resolve`").

  Output:
  - The function prints messages about the process of fetching transitions for the ticket, including whether the transitions were successfully fetched, if the specific transition was found, and any errors encountered during the request.

  Return:
  - `Transition ID` (str): If the specified transition is found for the given ticket, the function returns the transition's ID, which can be used for further actions like transitioning the ticket to another status.
  - `False`: If the specified transition is not found for the ticket, or if there is any failure in fetching transitions (e.g., due to an invalid ticket key, network issues, or server errors), the function returns `False`.
  ______________________________________________________________________________


  - To transition a ticket to a different status, use the `transition_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  transition_input = "Done"  # Can be a transition name like 'Done' or an ID like '31'
  if jira_helper.transition_ticket(ticket_key, transition_input):
      print("Ticket transitioned successfully.")
  else:
      print("Failed to transition ticket.")
  ```

  Parameters:
  - `ticket_key` (str): The key of the ticket you want to transition. This is a unique identifier for the ticket within JIRA.
  - `transition_input` (str or int): The desired transition for the ticket. This can be specified as either the name of the transition (e.g., "`Done`") or the transition ID (e.g., `31`).

  Output:
  - The function outputs informational messages regarding the transition process, including attempts to find the transition ID if a name is provided, and the result of the transition attempt.

  Return:
  - `True`: If the ticket transition is successful. This is indicated by a `204` HTTP status code, which means "`No Content`" but signifies that the operation completed successfully.
  - `False`: If the ticket transition fails. This could be due to various reasons, such as an invalid ticket key, an unrecognized transition name or ID, or a failure in the HTTP request itself.

  ______________________________________________________________________________


  - To check if a ticket exist, use the `if_ticket_exist` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  if jira_helper.if_ticket_exist(ticket_key):
      print("The ticket exists.")
  else:
      print("The ticket does not exist.")
  ```
  Parameters:
  - `ticket_key` (str): The key of the ticket you want to check. This is a unique identifier for the ticket within JIRA.

  Output:
  - The function outputs messages that indicate whether it is checking for the existence of the specified ticket and the result of that check.

  Return:
  - `True`: If the ticket exists. This is confirmed by a `200` HTTP status code, indicating that the ticket was found.
  - `False`: If the ticket does not exist or if there was an error in checking. A `404` HTTP status code indicates the ticket does not exist. Other status codes indicate a failure in the request to check the ticket.
  ______________________________________________________________________________


  - To comment on the ticket, use the `comment_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  comment_text = "This is an example comment."
  comment_url = jira_helper.comment_ticket(ticket_key, comment_text)
  if comment_url:
      print(f"Comment added successfully: {comment_url}")
  else:
      print("Failed to add comment to the ticket.")
  ```
  Parameters:
  - `ticket_key` (str): The key of the ticket to which you want to add a comment. This is a unique identifier for the ticket within JIRA.
  - `comment_text` (str): The text of the comment you wish to add to the ticket.

  Output:
  - The function outputs messages that indicate the process of adding a comment to the specified ticket, including checking if the ticket exists and attempting to add the comment.

  Return:
  - `URL of the created comment` (str): If adding the comment is successful, the function returns the URL to access the newly created comment directly. This is indicated by a `201` HTTP status code, meaning "`Created`".
  - `False`: If adding the comment fails. This could be because the ticket does not exist, the comment text is invalid, or there was an error in the request itself. In such cases, the function returns `False`.
  ______________________________________________________________________________


  - To query tickets using JQL, use the `jql_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  jql_query = "project = PRJ AND status = 'Open'"
  max_results = 100  # Optional
  ticket_keys = jira_helper.jql_ticket(jql_query, max_results)
  if ticket_keys:
      print(f"Found tickets: {', '.join(ticket_keys)}")
  else:
      print("Failed to retrieve tickets based on the JQL query.")
  ```

  Parameters:
  - `jql_query` (str): The Jira Query Language query string used to retrieve tickets. This string specifies the criteria that the returned tickets must meet.
  - `max_results` (int, optional): The maximum number of tickets to retrieve. If not specified, the method attempts to fetch all tickets that match the query.

  Output:
  - The function outputs messages that detail the execution of the JQL query, including the number of tickets fetched in each batch and the total number of requested tickets.

  Return:
  - `List of ticket keys` (list): If successful, the function returns a list containing the keys of the tickets that match the JQL query criteria. Each key is a unique identifier for a ticket within JIRA.
  - `False`: If the retrieval fails. This could be due to an issue with the JQL query, a problem with the request to JIRA, or if the JIRA server returns an unexpected status code. In such cases, the function returns `False`.
  ______________________________________________________________________________


  - To get the subject of a Jira ticket, use the `get_ticket_subject` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  subject = jira_helper.get_ticket_subject(ticket_key)
  if subject:
      print(f"Subject of the ticket: {subject}")
  else:
      print("Failed to retrieve the subject of the ticket.")
  ```
  Parameters:
  - `ticket_key` (str): The key of the ticket for which you want to retrieve the subject. This is a unique identifier for the ticket within JIRA.

  Output:
  - The function prints the subject of the specified ticket if it is successfully retrieved.

  Return:
  - Subject of the ticket (str): If the subject is successfully retrieved, the function returns the subject of the ticket.
  - `False`: If the retrieval fails, the function returns False.
  ______________________________________________________________________________
  ______________________________________________________________________________

  ______________________________________________________________________________
  ______________________________________________________________________________

  - To create wiki page, use the `create_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  space_key = "DEV"
  title = "API Documentation"
  content = "<p>This is the API documentation for our project.</p>"
  parent_page_id = 123456  # Optional
  page_url = wiki_helper.create_wiki_page(space_key, title, content, parent_page_id)
  if page_url:
      print(f"Wiki page created successfully: {page_url}")
  else:
      print("Failed to create wiki page.")
  ```
  Parameters:
  - `space_key` (str): The key of the Confluence space where the new page will be created. Confluence spaces are containers for related content.
  - `title` (str): The title of the new page. Titles are used to identify pages within Confluence.
  - `content` (str): The content of the new page. This is usually HTML or Confluence storage format markup that defines the page's body.
  - `parent_page_id` (int, optional): The ID of a parent page if the new page is to be a child page. This parameter is optional; if not provided, the page will be created at the root of the specified space.

  Output:
  - The function outputs messages detailing the process of creating the Confluence page, including the attempt to create the page and the result of that attempt.

  Return:
  - `URL of the created Confluence page` (str): If the page creation is successful, the function returns the URL to access the newly created page. This is indicated by a `200` HTTP status code.
  - `False`: If the page creation fails. This could be due to various issues, such as invalid input parameters, permissions problems, or server errors. In such cases, the function returns `False`.
  ______________________________________________________________________________

  - To duplicate wiki page, use the `duplicate_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  source_page_id = "12345"  # Example source page ID
  target_space_key = "TGT"  # Example target space key
  target_title = "Duplicated Page Title"  # New title for the duplicated page
  target_parent_page_id = "67890"  # Optional parent page ID for the new page

  duplicated_page_url = wiki_helper.duplicate_wiki_page(source_page_id, target_space_key, target_title, target_parent_page_id)
  if duplicated_page_url:
      print(f"Duplicated page successfully. View at: {duplicated_page_url}")
  else:
      print("Failed to duplicate the page.")
  ```
  Parameters:
  - `source_page_id` (str): ID of the Confluence page you wish to duplicate.
  - `target_space_key` (str): Key of the Confluence space where the duplicated page will reside.
  - `target_title` (str): Title of the duplicated page.
  - `target_parent_page_id` (str, optional): ID of the parent page if the duplicated page is to be a child within the hierarchy. If not specified, the page will be created at the top level of the specified space.
  Output:
  - The method outputs messages detailing the process of duplicating a page, including fetching content from the source page and creating a new page with this content in the target space.

  Return:
  - `URL of the duplicated Confluence page` (str): If the duplication is successful, the method returns the URL to access the newly created duplicated page. This URL is constructed from the response of the page creation process.
  - `None`: If the duplication fails at any point (e.g., retrieving content from the source page, creating the new page), the method returns `None`. This indicates that the operation was not successful, and no new page was created.
  ______________________________________________________________________________

  - To create a wiki page from template use the `create_page_from_template` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  template_id = "12345"  # Example template ID
  space_key = "TGT"  # Example space key
  title = "New Page from Template"  # Title for the new page
  parent_page_id = "67890"  # Optional parent page ID

  created_page_url = wiki_helper.create_page_from_template(template_id, space_key, title, parent_page_id)
  if created_page_url:
      print(f"New page created successfully. View at: {created_page_url}")
  else:
      print("Failed to create the new page from template.")
  ```
  Parameters:
  - `template_id` (str): ID of the Confluence template you wish to use for creating the new page.
  - `space_key` (str): Key of the Confluence space where the new page will be created.
  - `title` (str): Title of the new page.
  - `parent_page_id` (str, optional): ID of the parent page if the new page is to be a child within the space hierarchy. If not specified, the page will be created at the top level of the specified space.
  Output:
  - The function outputs messages that detail the process of creating a new page from a template, including checking for duplicate titles in the target space, retrieving content from the specified template, and the creation of the new page.
  Return:
  - `URL of the created Confluence page` (str): If the page creation is successful, the function returns the URL to access the newly created page. This indicates that the page was created successfully and is accessible at the returned URL.
  - `None` or `False`: If the page creation fails, due to reasons such as template retrieval failure, duplicate title, or any error in the creation process, the function returns `None` or `False`. This indicates that no new page was created.
  ______________________________________________________________________________

  - To move wiki page from one location to another location without changing title use `move_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "12345"  # Example page ID to be moved
  target_space_key = "NEWSPACE"  # Target space key
  target_position = "append"  # Position of the page relative to the parent page ('append', 'above', 'below')
  target_parent_page_id = "67890"  # Optional new parent page ID

  moved_page_url = wiki_helper.move_wiki_page(page_id, target_space_key, target_position, target_parent_page_id)
  if moved_page_url:
      print(f"Page moved successfully. View at: {moved_page_url}")
  else:
      print("Failed to move the page.")
  ```
  Parameters:
  - `page_id` (str): ID of the Confluence page you wish to move.
  - `target_space_key` (str): Key of the Confluence space where the page will be moved to.
  - `target_position` (str): Position to place the moved page relative to the parent page. Default is '`append`', but '`above`' and '`below`' are also valid options.
  - `target_parent_page_id` (str, optional): ID of the parent page if the moved page is to be nested under another page. If not specified, the page will be moved to the top level of the target space or as specified by `target_position`.
  Output:
  - The function outputs messages detailing the process of moving the page, including retrieving the current page title, preparing the move operation, and executing the move.
  Return:
  - `URL of the moved Confluence page` (str): If the move operation is successful, the function returns the URL to access the moved page. This indicates that the page was successfully moved to the new space and position.
  - `None` or `False`: If the move operation fails, due to reasons such as an error retrieving the current page details, an error in the move operation, or inability to retrieve the moved page URL, the function returns `None` or `False`. This indicates that the page was not successfully moved.
  ______________________________________________________________________________

  - To move wiki page from one location to another location without changing title use `move_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  title = "Example Page Title"  # Title of the Confluence wiki page to check
  space_key = "EX"  # Key of the Confluence space

  if wiki_helper.wiki_page_exists(title, space_key):
      print(f"The page '{title}' exists in space '{space_key}'.")
  else:
      print(f"The page '{title}' does not exist in space '{space_key}'.")
  ```
  Parameters:
  - `title` (str): Title of the Confluence wiki page to check for existence.
  - `space_key` (str): Key of the Confluence space where the page might reside.
  Output:
  - The function outputs a message indicating the start of the check process and then reports whether the specified page exists in the given space based on the title.
  Return:
  - `True`: If the page exists. This is determined by the presence of results matching the specified title in the specified space.
  - `False`: If the page does not exist or if there was an error during the request. This could be due to the specified page not being found in the given space or an issue with the Confluence API response.
  ______________________________________________________________________________

  - Recursively retrieve all descendant pages of a given parent page ID.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  parent_id = "12345"  # Example parent page ID
  child_pages = wiki_helper.get_child_pages_recursive(parent_id)
  if child_pages:
      print("Child pages found:")
      for page in child_pages:
          print(f"Title: {page['title']}, ID: {page['id']}, Parent ID: {page['parentid']}")
  else:
      print("No child pages found or failed to fetch.")
  ```
  Parameters:
  - `parent_id` (str): ID of the parent Confluence wiki page from which to start retrieving descendant pages.
  Output:
  - The method does not directly print any output but provides a mechanism for recursively fetching and listing all child pages beneath a given parent page. It operates by:
    - Fetching the direct children of the provided parent ID.
    - Recursively calling itself for each child to fetch further descendants, accumulating all pages in a list.

  Return:
  - `List of child pages`: Returns a list of dictionaries, each containing the title, ID, and parent ID of each descendant page found. This allows for a comprehensive view of the hierarchy and content under the specified parent page.
  - If the retrieval fails at any point (due to an error in fetching child pages, for instance), the recursive fetching process is designed to continue for other branches of the tree, aiming to return as complete a list as possible of descendant pages.
  ______________________________________________________________________________

  - Retrieve the ID of a Confluence wiki page by its title.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  title = "Example Page"  # Title of the Confluence wiki page to search for
  space_key = "EX"  # Key of the Confluence space

  page_id = wiki_helper.get_page_id(title, space_key)
  if page_id:
      print(f"Found page '{title}' with ID: {page_id} in space '{space_key}'.")
  else:
      print(f"No page found with the title '{title}' in space '{space_key}'.")
  ```
  Parameters:
  - `title` (str): Title of the Confluence wiki page you're looking for.
  - `space_key` (str): Key of the Confluence space where you're searching for the page.
  Output:
  - The function outputs a message indicating the process of searching for the page by its title within the specified space and then reports the outcome of the search:
    - If a page with the specified title exists in the given space, it prints the page ID and confirms the page was found.
    - If no page with the specified title exists in the given space, it indicates no page was found.
    - If there's an error in the search process (e.g., issues with the Confluence API response), it reports the failure.

  Return:
  - `ID of the page` (str): If a page with the specified title is found in the given space, the function returns the ID of the page.
  - `False`: If no page is found with the given title in the specified space, or if there was an error during the request, the function returns `False`.
  ______________________________________________________________________________

  - Replace all occurrences of a string in a Confluence wiki page.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID
  from_string = "old text"  # Text to be replaced
  to_string = "new text"  # Replacement text

  if wiki_helper.replace_in_page(page_id, from_string, to_string):
      print(f"Replaced all occurrences of '{from_string}' with '{to_string}' in page ID: {page_id}.")
  else:
      print("Failed to replace text in the page.")
  ```
  Parameters:
  - `page_id` (str): ID of the Confluence wiki page where the replacement will be made.
  - `from_string` (str): The string to be replaced in the page's content.
  - `to_string` (str): The string to use as a replacement.
  Output:
  - The function outputs messages detailing the process of fetching the page content, performing the replacement, and updating the page with the new content:
    - It starts by fetching the current content and version number of the specified page.
    - It then replaces all occurrences of the `from_string` with the `to_string` within the page's content.
    - If replacements are made, it updates the page with the new content and increments the version number. If no occurrences are found, it indicates so and considers the operation successful without making an update.

  Return:
  - `True`: If the replacement operation was successful, whether replacements were made or not (including the case where the `from_string` was not found).
  - `False`: If there was a failure at any point during the process, such as an error fetching the page content, or updating the page with the new content.
  ______________________________________________________________________________

  - Fetch all tables from a Confluence wiki page.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  tables_json = wiki_helper.get_tables_from_page(page_id)
  if tables_json:
      print("Found tables on the page:")
      print(tables_json)
  else:
      print("Failed to fetch tables or no tables found on the page.")
  ```
  Parameter
  - `page_id` (str): ID of the Confluence wiki page from which to fetch tables.

  Output:
  - The function initiates by fetching the content of the specified Confluence wiki page. It then parses the HTML content of the page to find and extract data from all tables present on the page. Each table's data is converted into a JSON structure, providing an easy-to-read format of the tables' contents.
  Return:
  - JSON structure: Returns a JSON string that represents all the tables found on the page. Each table is structured into a JSON object with keys representing the table headers and values representing the row data. If multiple tables are found, they are indexed as `table1`, `table2`, etc., in the JSON structure.
  - If the fetching fails (due to an unsuccessful API call) or if no tables are found on the page, the function returns an empty JSON object (`{}`).
  ______________________________________________________________________________

  - Replace the entire Confluence wiki page with the new content
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "12345"  # Example page ID
  new_content = "<p>This is the new content for the page.</p>"  # HTML content

  if wiki_helper.update_wiki_page(page_id, new_content):
      print(f"Page ID: {page_id} was updated successfully.")
  else:
      print(f"Failed to update the page ID: {page_id}.")
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page that you want to update.
  - `new_content` (str): The new content to replace the existing content of the page. This content is typically in `HTML` format.

  Output:
  - The method prints messages to inform the user about the process steps, including fetching current page data and attempting to update the page with new content.
  Return:
  - `True`: If the page content update is successful. This is indicated by a status code of `200` from the Confluence REST API, showing that the update request was processed correctly.
  - `False`: If the update fails. This could be due to various reasons such as an invalid page ID, issues with the Confluence server, or improper formatting of the new content. Failure is indicated by any status code other than `200`, and the method prints the error details received from the server.
  ______________________________________________________________________________

  - Retrieve the parent ID of a Confluence wiki page by passed page ID.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  parent_id = wiki_helper.get_parent_page_id(page_id)
  if parent_id:
      print(f"Parent page ID for page ID {page_id}: {parent_id}")
  else:
      print(f"No parent page found for page ID {page_id}, or failed to fetch.")
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page for which you want to find the parent page.

  Output:
  - The method outputs a message indicating it is fetching the parent page ID for the specified page. It then either reports the ID of the parent page, states that no parent page was found, or indicates a failure to fetch the parent page ID.

  Return:
  - `ID of the parent page` (str): If the specified page has a parent page, the method returns the ID of the parent page. This is useful for understanding the hierarchy of pages within Confluence spaces.
  - `False`: If no parent page exists for the specified page or if there was an error in the fetch operation (such as an invalid page ID or a problem with the Confluence server), the method returns False. This helps to identify pages that are at the top level of their space or when an issue occurs with the retrieval process.
  ______________________________________________________________________________

  - Add a Table of Contents (TOC) to a Confluence wiki page if it doesn't already have one.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  result_message = wiki_helper.add_toc_to_page(page_id)
  print(result_message)
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page where you want to add a Table of Contents.

  Output and Return
  - The function returns a **message** indicating the operation's result. This could be a confirmation that the TOC was added successfully, a message stating that the TOC already exists, or an error message if the operation failed.
  - **Error Handling**: If there are issues fetching the page data or updating the page, the function provides detailed error messages including the status code and response text from Confluence's API. This is helpful for diagnosing problems with the operation.
  ______________________________________________________________________________

  - Pass the header to identify the table and then add the row to that identified table
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  page_id = "123456"  # Example page ID
  headers = ["Header1", "Header2", "Header3"]  # The headers of the table you're targeting
  row_data = ["Data1", "Data2", "Data3"]  # The data for the new row

  result_message = wiki_helper.add_row_to_table(page_id, headers, row_data)
  print(result_message)
  ```
  Parameters
  - `page_id` (str): The ID of the Confluence page you're modifying.
  - `headers` (list of str): A list of headers representing the columns of the table. This ensures that the data is added to the correct column.
  - `row_data` (list of str): A list of values corresponding to each header, forming the new row.

  Output and Return
  - The function returns a message indicating the result of the operation. This could be a confirmation of successful row addition, or an error message detailing why the operation failed.

  ______________________________________________________________________________

  - Pass the header to identify the table and then add/update the row to that identified table
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID
  headers = ["Cluster Name", "Component Name", "Next Version"]  # The headers of your table
  new_row_data = ["Cluster1", "ComponentA", "v2.0"]  # Data for the new or updated row

  result_message = wiki_helper.update_or_add_table_row(page_id, headers, new_row_data)
  print(result_message)
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence page containing the table.
  - `headers` (list of str): A list of headers representing the columns of the table. It's crucial for identifying the correct columns when updating or adding rows.
  - `new_row_data` (list of str): The values for the new or updated row, aligned with the headers order.
  Output and Return
  - The function returns a message indicating the result of the operation, such as successful row update, successful addition of a new row, or an error if the operation failed.
  ______________________________________________________________________________


  🔒 **We respect your privacy**: This module does **not** store any of your data anywhere. It simply interacts with the Atlassian Jira API to perform the requested operations. Ensure you manage your connection details securely.




  - New Features:
    - Added `get_ticket_subject` function to `JiraHelper` class for retrieving the subject of a Jira ticket by its ID.
  - Beta Features (Continued from previous release):
    - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
  - Minor documentation updates for clarity and consistency.


  - 0.4.1 (28 May 2024)
  - Revision in documentation for better understanding
    - Based on the internal design now `JIRA_URL`, `CONFLUENCE_URL` is replaced with `ATLASSIAN_URL`
    - Technically we are using `https://domain.atlassian.net` only to address Jira and Wiki both
    - This is mentioned in the top of the document as well
  - Beta Features (Continued from previous release):
    - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
  - 0.4 (21 Mar 2024)
  - New Features:
    - JIRA Integration Enhancements:
      - Custom Ticket Creation: The `create_custom_ticket` function has been introduced, allowing for more flexible ticket creation in JIRA projects. This function supports additional fields, enabling users to specify custom data during ticket creation.
      - Ticket Field Updates: The `update_ticket_with_fields` method has been added, offering the ability to update existing tickets with new or modified fields. This feature is crucial for maintaining accurate and up-to-date ticket information.
  - Beta Features (Continued from previous release):
    - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
  - 0.3 (21 Mar 2024)
    - Enhancements:
      - Updated `readme.md` documentation.
      - Introduced beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
  - 0.2.8 (21 Mar 2024)
    - Minor updates and enhancements (details forthcoming).
  - 0.2.7 (08 Jan 2024)
    - New Features:
      - `add_toc_to_page`: Automatically adds a table of contents to wiki pages lacking one.
    - Documentation:
      - Updated `README.md` with guidance on using `add_toc_to_page`.
  - 0.2.6 (05 Jan 2024)
    - New Features:
      - `get_parent_page_id`: Retrieves the parent ID for a given wiki page ID.
    - Documentation:
      - Updated `README.md` with instructions for `get_parent_page_id`.
  - 0.2.5.4 (04 Jan 2024)
    - New Features:
      - `update_wiki_page`: Replaces entire wiki page content with new content.
    - Documentation:
      - Updated `README.md` with usage information for `update_wiki_page`.
  - 0.2.5.3 (04 Jan 2024)
    - Internal testing release; not intended for general use.
  - 0.2.5.2 - 0.2.5 (04 Jan 2024)
    - Withdrawn due to potential bugs.
  - 0.2.4 (13 Oct 2023)
    - New Features:
      - `get_tables_from_page`: Fetches all tables from a wiki page in JSON format, simplifying table extraction.
    - Documentation:
      - Updated `README.md` with `get_tables_from_page` usage details.
  - 0.2.3.1 (21 Sep 2023)
    - Documentation:
      - Updated `README.md` with usage information for `get_page_id` and `replace_in_page`.
  - 0.2.3 (21 Sep 2023)
    - Confluence Integration:
      - Added `get_page_id` to retrieve wiki page IDs.
  - 0.2.2.1 (21 Sep 2023)
    - Performance improvements and extra output suppression.
    - Confluence Integration:
      - Added `replace_in_page` for in-page text replacement.
  - 0.2.2 (20 Sep 2023)
    - Documentation:
      - Enhanced `README.md` for better clarity.
    - Confluence Integration:
      - Added `get_child_pages_recursive` to fetch child pages recursively.
  - 0.2.1 (20 Sep 2023) - Major Release
    - Enhancements:
      - Comprehensive `README.md` update for improved understanding.
      - Fine-tuned output monitoring and improved return format.
    - Confluence Integration:
      - Multiple functionalities added, including page creation, duplication, template usage, moving pages, and existence checks.
  - 0.2 (20 Sep 2023)
    - Withdrawn due to potential bugs.
  - 0.1.4.1 (18 Sep 2023)
    - Documentation:
      - Updated `README.md` for enhanced understanding.
  - 0.1.4 (18 Sep 2023)
    - Improvements:
      - Suppressed extraneous output for cleaner integration.
      - Detailed function outputs in `README.md`.
    - Features:
      - Added Jira ticket search, commenting, and JQL processing functions.
  - 0.1.3 (18 Sep 2023)
    - Withdrawn due to potential bugs.
  - 0.1.2.1 (16 Sep 2023)
    - Documentation:
      - Reformatted `README.md`.
  - 0.1.2 (16 Sep 2023)
    - Features:
      - Added `if_exist_ticket` for Jira ticket existence checks.
    - Documentation:
      - Updated `README.md` format.
  - 0.1.1 (16 Sep 2023)
    - Features:
      - Added `transition_ticket` for Jira ticket transitions, with ID flexibility.
    - Documentation:
      - Clarified module usage in `README.md`.
  - 0.1 (16 Sep 2023)
    - Initial Release:
      - Introduced Jira ticket management functions: `create`, `delete`, and `transition tickets`.


pkgId: 4af0998411b1ba3d40dda1b602663c52a101daef21fd8f6490c3c7f93f94c86f
name: python-atlassian-modules
arch: src
version: 1.0.0
epoch: 0
release: 1
summary: Modules for interacting with Atlassian cloud products.
url: https://pypi.org/project/atlassian-modules/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlassian-modules-1.0.0-1.src.rpm
checksum_type: sha256
description:
  - *What happened to the older releases?*
    - On *November 11, 2024*, while working on potential improvements for older releases, I unintentionally deleted the entire repository. This was due to a mistake made during the deletion of the older releases, which led to the module being absent from Python for approximately *30 minutes*.
  - *How did I recover it?*
    - To recover from this incident, I incremented the version to *6.0.2* and re-released the entire module back to the public.
  - *What if you have older versions in place?*
    - I recommend upgrading to the latest version, which is now *1.0.0*. This version is the most advanced module I have released, featuring separate functions for each functionality. This design will help modify only the particular function without requiring the deletion of any releases in the future.
    - Unfortunately, *6.0.2* is now the base for you

  _I am still learning, and mistakes may happen. However, based on the download history, I am now more sensible and accurate than ever. Please feel free to contact me at the email address provided in my profile, and I will quickly reach out to you. Additionally, I am planning to make the GitHub repository *public* for all of us to improve this module and avoid the chaos that occurred on *November 11, 2024*. Thank you for understanding._
  ______________________________________________________________________________
  ______________________________________________________________________________
  The best way to interact with Atlassian Jira/Confluence API.

  > **Note:** _This module is useful for the Atlassian Cloud_ <br>
  > Your URL should look like this https://domain.atlassian.net



  ```python
  from atlassian_modules import JiraHelper # for Jira
  from atlassian_modules import WikiHelper # for Wiki
  ```





  To initialize a connection to Jira, instantiate the `JiraHelper` class with your Jira URL, email, and API token:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  ```
  ______________________________________________________________________________
  ______________________________________________________________________________

  ______________________________________________________________________________
  ______________________________________________________________________________


  - You can create a new Jira ticket using the `create_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_url = jira_helper.create_ticket("PRJ", "Issue Summary", "Detailed issue description.", "Bug")
  if ticket_url:
      print(f"Ticket created: {ticket_url}")
  else:
      print("Failed to create ticket.")
  ```
  Parameters:
  - `project_key` (str): Key of the project where the new ticket will be created. This is usually a short, capitalized identifier for a project in JIRA.
  - `summary` (str): Summary of the new ticket. This is a concise overview of the issue or task.
  - `description` (str): Detailed description of the new ticket. This field is used to provide all necessary details about the issue or task.
  - `issue_type` (str): Type of the issue (e.g., `Bug`, `Task`, `Story`). This specifies what kind of ticket is being created.

  Output:
  - The function outputs informational messages about the process of creating a ticket, including preparing issue data, sending a request to create the ticket, and the result of that request.

  Return:
  - `URL of the created ticket (str)`: If the ticket creation is successful, the function returns the URL to access the newly created ticket directly.
  - `False`: If the ticket creation fails (for example, due to incorrect input parameters or server errors), the function returns `False`.
  ______________________________________________________________________________

  - You can create a new custom Jira ticket using the `create_custom_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)


  additional_fields = {
      "customfield_12345": "Custom value",
      "labels": ["label1", "label2"]
  }

  ticket_url = jira_helper.create_custom_ticket("PRJ", "Issue Summary", "Detailed issue description.", "Bug", additional_fields)
  if ticket_url:
      print(f"Ticket created: {ticket_url}")
  else:
      print("Failed to create ticket.")

  ```
  Parameters:
  - `project_key` (str): The key of the project where the new ticket will be created. This is typically a short, capitalized identifier specific to a project in Jira.
  - `summary` (str): A concise overview of the issue or task that the new ticket will represent.
  - `description` (str): A detailed description of the issue or task, providing all necessary details for understanding and addressing it.
  - `issue_type` (str): Specifies the type of issue being created (e.g., `Bug`, `Task`, `Story`), determining how the issue is categorized within Jira.
  - `additional_fields` (dict, optional): A dictionary of additional fields that are required for ticket creation. This parameter allows for the inclusion of project-specific or issue-specific information that is not covered by the standard fields.

  Output:
  - The function provides informational messages throughout the process of creating a ticket.
  - These messages include details on preparing the issue data, sending a request to create the ticket, and the outcome of that request.
  Return:
  - `URL of the created ticket` (str): If the ticket creation is successful, the function returns the URL to access the newly created ticket directly. This allows for immediate navigation to the ticket for review or further action.
  - `False`: If the ticket creation process fails, whether due to incorrect input parameters, server errors, or issues with the additional fields, the function returns `False`. This indicates that the ticket was not created and provides an opportunity to address any issues before retrying.
  ______________________________________________________________________________

  - You can update any custom field of Jira ticket using the `update_ticket_with_fields` method:
  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)


  additional_fields = {
      "customfield_12345": "New custom value",
      "labels": ["newlabel1", "newlabel2"]
  }

  ticket_id = "PRJ-123"  # Example ticket ID to be updated

  update_success = jira_helper.update_ticket_with_fields(ticket_id, additional_fields)
  if update_success:
      print(f"Ticket {ticket_id} updated successfully.")
  else:
      print(f"Failed to update ticket {ticket_id}.")
  ```
  Parameters:
  - `ticket_id` (str): ID (also known as the key) of the ticket to be updated. This identifier is typically a combination of the project key and a sequence number, like `PRJ-123`.
  - `additional_fields` (dict): A dictionary of fields to update the ticket with. This parameter allows specifying values for any standard or custom field in the ticket that supports updates.
  Output:
  - The function prints messages about the process of updating the ticket, including preparing the update data, making the request to update the ticket, and the result of that request.
  Return:
  - `True` if the update was successful. This indicates that the server accepted the update request and applied the changes to the ticket.
  - `False` otherwise. If the ticket update fails (for example, due to incorrect ticket ID, fields that cannot be updated, or server errors), the function returns `False`, and additional error information is printed to help diagnose the issue.
  ______________________________________________________________________________


  - To delete a ticket, use the `delete_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  if jira_helper.delete_ticket(ticket_key):
      print("Ticket deleted successfully.")
  else:
      print("Failed to delete ticket or ticket does not exist.")
  ```
  Parameters:
  - `ticket_key` (str): The unique identifier for the ticket you wish to delete. This key is usually a combination of the project key and a number (e.g., "`PRJ-123`").

  Output:
  - The function itself does not print any output, but it performs a `DELETE` request to the JIRA REST API to delete the specified ticket.

  Return:
  - `True`: If the ticket is successfully deleted. This is indicated by a `204` HTTP status code from the JIRA API, meaning "`No Content`" but signifying successful deletion.
  - `False`: If the deletion fails, which can occur if the ticket does not exist or if there's an issue with the API request (e.g., permissions, invalid ticket key). This is communicated by returning `False`.
  ______________________________________________________________________________


  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  transition_name = "Close"
  transition_id = jira_helper.get_transitions(ticket_key, transition_name)
  if transition_id:
      print(f"Transition ID for '{transition_name}' is {transition_id}.")
  else:
      print(f"Transition '{transition_name}' not found for ticket {ticket_key} or failed to fetch transitions.")
  ```

  Parameters:
  - `ticket_key` (str): The key of the ticket for which transitions are being fetched. This is typically a unique identifier like "`PRJ-123`".
  - `transition_to` (str): The name of the desired transition to look for. This is the human-readable name of the transition (e.g., "`Close`", "`Resolve`").

  Output:
  - The function prints messages about the process of fetching transitions for the ticket, including whether the transitions were successfully fetched, if the specific transition was found, and any errors encountered during the request.

  Return:
  - `Transition ID` (str): If the specified transition is found for the given ticket, the function returns the transition's ID, which can be used for further actions like transitioning the ticket to another status.
  - `False`: If the specified transition is not found for the ticket, or if there is any failure in fetching transitions (e.g., due to an invalid ticket key, network issues, or server errors), the function returns `False`.
  ______________________________________________________________________________


  - To transition a ticket to a different status, use the `transition_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  transition_input = "Done"  # Can be a transition name like 'Done' or an ID like '31'
  if jira_helper.transition_ticket(ticket_key, transition_input):
      print("Ticket transitioned successfully.")
  else:
      print("Failed to transition ticket.")
  ```

  Parameters:
  - `ticket_key` (str): The key of the ticket you want to transition. This is a unique identifier for the ticket within JIRA.
  - `transition_input` (str or int): The desired transition for the ticket. This can be specified as either the name of the transition (e.g., "`Done`") or the transition ID (e.g., `31`).

  Output:
  - The function outputs informational messages regarding the transition process, including attempts to find the transition ID if a name is provided, and the result of the transition attempt.

  Return:
  - `True`: If the ticket transition is successful. This is indicated by a `204` HTTP status code, which means "`No Content`" but signifies that the operation completed successfully.
  - `False`: If the ticket transition fails. This could be due to various reasons, such as an invalid ticket key, an unrecognized transition name or ID, or a failure in the HTTP request itself.

  ______________________________________________________________________________


  - To check if a ticket exist, use the `if_ticket_exist` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  if jira_helper.if_ticket_exist(ticket_key):
      print("The ticket exists.")
  else:
      print("The ticket does not exist.")
  ```
  Parameters:
  - `ticket_key` (str): The key of the ticket you want to check. This is a unique identifier for the ticket within JIRA.

  Output:
  - The function outputs messages that indicate whether it is checking for the existence of the specified ticket and the result of that check.

  Return:
  - `True`: If the ticket exists. This is confirmed by a `200` HTTP status code, indicating that the ticket was found.
  - `False`: If the ticket does not exist or if there was an error in checking. A `404` HTTP status code indicates the ticket does not exist. Other status codes indicate a failure in the request to check the ticket.
  ______________________________________________________________________________


  - To comment on the ticket, use the `comment_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  comment_text = "This is an example comment."
  comment_url = jira_helper.comment_ticket(ticket_key, comment_text)
  if comment_url:
      print(f"Comment added successfully: {comment_url}")
  else:
      print("Failed to add comment to the ticket.")
  ```
  Parameters:
  - `ticket_key` (str): The key of the ticket to which you want to add a comment. This is a unique identifier for the ticket within JIRA.
  - `comment_text` (str): The text of the comment you wish to add to the ticket.

  Output:
  - The function outputs messages that indicate the process of adding a comment to the specified ticket, including checking if the ticket exists and attempting to add the comment.

  Return:
  - `URL of the created comment` (str): If adding the comment is successful, the function returns the URL to access the newly created comment directly. This is indicated by a `201` HTTP status code, meaning "`Created`".
  - `False`: If adding the comment fails. This could be because the ticket does not exist, the comment text is invalid, or there was an error in the request itself. In such cases, the function returns `False`.
  ______________________________________________________________________________


  - To query tickets using JQL, use the `jql_ticket` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  jql_query = "project = PRJ AND status = 'Open'"
  max_results = 100  # Optional
  ticket_keys = jira_helper.jql_ticket(jql_query, max_results)
  if ticket_keys:
      print(f"Found tickets: {', '.join(ticket_keys)}")
  else:
      print("Failed to retrieve tickets based on the JQL query.")
  ```

  Parameters:
  - `jql_query` (str): The Jira Query Language query string used to retrieve tickets. This string specifies the criteria that the returned tickets must meet.
  - `max_results` (int, optional): The maximum number of tickets to retrieve. If not specified, the method attempts to fetch all tickets that match the query.

  Output:
  - The function outputs messages that detail the execution of the JQL query, including the number of tickets fetched in each batch and the total number of requested tickets.

  Return:
  - `List of ticket keys` (list): If successful, the function returns a list containing the keys of the tickets that match the JQL query criteria. Each key is a unique identifier for a ticket within JIRA.
  - `False`: If the retrieval fails. This could be due to an issue with the JQL query, a problem with the request to JIRA, or if the JIRA server returns an unexpected status code. In such cases, the function returns `False`.
  ______________________________________________________________________________


  - To get the subject of a Jira ticket, use the `get_ticket_subject` method:

  ```python
  jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  ticket_key = "PRJ-123"  # Example ticket key
  subject = jira_helper.get_ticket_subject(ticket_key)
  if subject:
      print(f"Subject of the ticket: {subject}")
  else:
      print("Failed to retrieve the subject of the ticket.")
  ```
  Parameters:
  - `ticket_key` (str): The key of the ticket for which you want to retrieve the subject. This is a unique identifier for the ticket within JIRA.

  Output:
  - The function prints the subject of the specified ticket if it is successfully retrieved.

  Return:
  - Subject of the ticket (str): If the subject is successfully retrieved, the function returns the subject of the ticket.
  - `False`: If the retrieval fails, the function returns False.
  ______________________________________________________________________________


  This function allows you to attach a file to a JIRA ticket.



  - `ticket_id` (str): The ID of the ticket to which the file will be attached.
  - `file_path` (str): The path to the file that will be attached.
  - `file_name` (str): The name of the file to be attached.



  - `bool`: Returns `True` if the file was successfully attached, `False` otherwise.



  ```python
  jira_helper = JiraHelper(server_url, email, api_token)
  ticket_id = "PROJECT-123"
  file_path = "/path/to/your/file.txt"

  success = jira_helper.attach_file_to_ticket(ticket_id, file_path)
  if success:
      print("File attached successfully!")
  else:
      print("Failed to attach file.")
  ```
  ______________________________________________________________________________
  ______________________________________________________________________________

  ______________________________________________________________________________
  ______________________________________________________________________________

  - To create wiki page, use the `create_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  space_key = "DEV"
  title = "API Documentation"
  content = "<p>This is the API documentation for our project.</p>"
  parent_page_id = 123456  # Optional
  page_url = wiki_helper.create_wiki_page(space_key, title, content, parent_page_id)
  if page_url:
      print(f"Wiki page created successfully: {page_url}")
  else:
      print("Failed to create wiki page.")
  ```
  Parameters:
  - `space_key` (str): The key of the Confluence space where the new page will be created. Confluence spaces are containers for related content.
  - `title` (str): The title of the new page. Titles are used to identify pages within Confluence.
  - `content` (str): The content of the new page. This is usually HTML or Confluence storage format markup that defines the page's body.
  - `parent_page_id` (int, optional): The ID of a parent page if the new page is to be a child page. This parameter is optional; if not provided, the page will be created at the root of the specified space.

  Output:
  - The function outputs messages detailing the process of creating the Confluence page, including the attempt to create the page and the result of that attempt.

  Return:
  - `URL of the created Confluence page` (str): If the page creation is successful, the function returns the URL to access the newly created page. This is indicated by a `200` HTTP status code.
  - `False`: If the page creation fails. This could be due to various issues, such as invalid input parameters, permissions problems, or server errors. In such cases, the function returns `False`.
  ______________________________________________________________________________

  - To duplicate wiki page, use the `duplicate_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  source_page_id = "12345"  # Example source page ID
  target_space_key = "TGT"  # Example target space key
  target_title = "Duplicated Page Title"  # New title for the duplicated page
  target_parent_page_id = "67890"  # Optional parent page ID for the new page

  duplicated_page_url = wiki_helper.duplicate_wiki_page(source_page_id, target_space_key, target_title, target_parent_page_id)
  if duplicated_page_url:
      print(f"Duplicated page successfully. View at: {duplicated_page_url}")
  else:
      print("Failed to duplicate the page.")
  ```
  Parameters:
  - `source_page_id` (str): ID of the Confluence page you wish to duplicate.
  - `target_space_key` (str): Key of the Confluence space where the duplicated page will reside.
  - `target_title` (str): Title of the duplicated page.
  - `target_parent_page_id` (str, optional): ID of the parent page if the duplicated page is to be a child within the hierarchy. If not specified, the page will be created at the top level of the specified space.
  Output:
  - The method outputs messages detailing the process of duplicating a page, including fetching content from the source page and creating a new page with this content in the target space.

  Return:
  - `URL of the duplicated Confluence page` (str): If the duplication is successful, the method returns the URL to access the newly created duplicated page. This URL is constructed from the response of the page creation process.
  - `None`: If the duplication fails at any point (e.g., retrieving content from the source page, creating the new page), the method returns `None`. This indicates that the operation was not successful, and no new page was created.
  ______________________________________________________________________________

  - To create a wiki page from template use the `create_page_from_template` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  template_id = "12345"  # Example template ID
  space_key = "TGT"  # Example space key
  title = "New Page from Template"  # Title for the new page
  parent_page_id = "67890"  # Optional parent page ID

  created_page_url = wiki_helper.create_page_from_template(template_id, space_key, title, parent_page_id)
  if created_page_url:
      print(f"New page created successfully. View at: {created_page_url}")
  else:
      print("Failed to create the new page from template.")
  ```
  Parameters:
  - `template_id` (str): ID of the Confluence template you wish to use for creating the new page.
  - `space_key` (str): Key of the Confluence space where the new page will be created.
  - `title` (str): Title of the new page.
  - `parent_page_id` (str, optional): ID of the parent page if the new page is to be a child within the space hierarchy. If not specified, the page will be created at the top level of the specified space.
  Output:
  - The function outputs messages that detail the process of creating a new page from a template, including checking for duplicate titles in the target space, retrieving content from the specified template, and the creation of the new page.
  Return:
  - `URL of the created Confluence page` (str): If the page creation is successful, the function returns the URL to access the newly created page. This indicates that the page was created successfully and is accessible at the returned URL.
  - `None` or `False`: If the page creation fails, due to reasons such as template retrieval failure, duplicate title, or any error in the creation process, the function returns `None` or `False`. This indicates that no new page was created.
  ______________________________________________________________________________

  - To move wiki page from one location to another location without changing title use `move_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "12345"  # Example page ID to be moved
  target_space_key = "NEWSPACE"  # Target space key
  target_position = "append"  # Position of the page relative to the parent page ('append', 'above', 'below')
  target_parent_page_id = "67890"  # Optional new parent page ID

  moved_page_url = wiki_helper.move_wiki_page(page_id, target_space_key, target_position, target_parent_page_id)
  if moved_page_url:
      print(f"Page moved successfully. View at: {moved_page_url}")
  else:
      print("Failed to move the page.")
  ```
  Parameters:
  - `page_id` (str): ID of the Confluence page you wish to move.
  - `target_space_key` (str): Key of the Confluence space where the page will be moved to.
  - `target_position` (str): Position to place the moved page relative to the parent page. Default is '`append`', but '`above`' and '`below`' are also valid options.
  - `target_parent_page_id` (str, optional): ID of the parent page if the moved page is to be nested under another page. If not specified, the page will be moved to the top level of the target space or as specified by `target_position`.
  Output:
  - The function outputs messages detailing the process of moving the page, including retrieving the current page title, preparing the move operation, and executing the move.
  Return:
  - `URL of the moved Confluence page` (str): If the move operation is successful, the function returns the URL to access the moved page. This indicates that the page was successfully moved to the new space and position.
  - `None` or `False`: If the move operation fails, due to reasons such as an error retrieving the current page details, an error in the move operation, or inability to retrieve the moved page URL, the function returns `None` or `False`. This indicates that the page was not successfully moved.
  ______________________________________________________________________________

  - To move wiki page from one location to another location without changing title use `move_wiki_page` method:
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  title = "Example Page Title"  # Title of the Confluence wiki page to check
  space_key = "EX"  # Key of the Confluence space

  if wiki_helper.wiki_page_exists(title, space_key):
      print(f"The page '{title}' exists in space '{space_key}'.")
  else:
      print(f"The page '{title}' does not exist in space '{space_key}'.")
  ```
  Parameters:
  - `title` (str): Title of the Confluence wiki page to check for existence.
  - `space_key` (str): Key of the Confluence space where the page might reside.
  Output:
  - The function outputs a message indicating the start of the check process and then reports whether the specified page exists in the given space based on the title.
  Return:
  - `True`: If the page exists. This is determined by the presence of results matching the specified title in the specified space.
  - `False`: If the page does not exist or if there was an error during the request. This could be due to the specified page not being found in the given space or an issue with the Confluence API response.
  ______________________________________________________________________________

  - Recursively retrieve all descendant pages of a given parent page ID.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  parent_id = "12345"  # Example parent page ID
  child_pages = wiki_helper.get_child_pages_recursive(parent_id)
  if child_pages:
      print("Child pages found:")
      for page in child_pages:
          print(f"Title: {page['title']}, ID: {page['id']}, Parent ID: {page['parentid']}")
  else:
      print("No child pages found or failed to fetch.")
  ```
  Parameters:
  - `parent_id` (str): ID of the parent Confluence wiki page from which to start retrieving descendant pages.
  Output:
  - The method does not directly print any output but provides a mechanism for recursively fetching and listing all child pages beneath a given parent page. It operates by:
    - Fetching the direct children of the provided parent ID.
    - Recursively calling itself for each child to fetch further descendants, accumulating all pages in a list.

  Return:
  - `List of child pages`: Returns a list of dictionaries, each containing the title, ID, and parent ID of each descendant page found. This allows for a comprehensive view of the hierarchy and content under the specified parent page.
  - If the retrieval fails at any point (due to an error in fetching child pages, for instance), the recursive fetching process is designed to continue for other branches of the tree, aiming to return as complete a list as possible of descendant pages.
  ______________________________________________________________________________

  - Retrieve the ID of a Confluence wiki page by its title.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  title = "Example Page"  # Title of the Confluence wiki page to search for
  space_key = "EX"  # Key of the Confluence space

  page_id = wiki_helper.get_page_id(title, space_key)
  if page_id:
      print(f"Found page '{title}' with ID: {page_id} in space '{space_key}'.")
  else:
      print(f"No page found with the title '{title}' in space '{space_key}'.")
  ```
  Parameters:
  - `title` (str): Title of the Confluence wiki page you're looking for.
  - `space_key` (str): Key of the Confluence space where you're searching for the page.
  Output:
  - The function outputs a message indicating the process of searching for the page by its title within the specified space and then reports the outcome of the search:
    - If a page with the specified title exists in the given space, it prints the page ID and confirms the page was found.
    - If no page with the specified title exists in the given space, it indicates no page was found.
    - If there's an error in the search process (e.g., issues with the Confluence API response), it reports the failure.

  Return:
  - `ID of the page` (str): If a page with the specified title is found in the given space, the function returns the ID of the page.
  - `False`: If no page is found with the given title in the specified space, or if there was an error during the request, the function returns `False`.
  ______________________________________________________________________________

  - Replace all occurrences of a string in a Confluence wiki page.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID
  from_string = "old text"  # Text to be replaced
  to_string = "new text"  # Replacement text

  if wiki_helper.replace_in_page(page_id, from_string, to_string):
      print(f"Replaced all occurrences of '{from_string}' with '{to_string}' in page ID: {page_id}.")
  else:
      print("Failed to replace text in the page.")
  ```
  Parameters:
  - `page_id` (str): ID of the Confluence wiki page where the replacement will be made.
  - `from_string` (str): The string to be replaced in the page's content.
  - `to_string` (str): The string to use as a replacement.
  Output:
  - The function outputs messages detailing the process of fetching the page content, performing the replacement, and updating the page with the new content:
    - It starts by fetching the current content and version number of the specified page.
    - It then replaces all occurrences of the `from_string` with the `to_string` within the page's content.
    - If replacements are made, it updates the page with the new content and increments the version number. If no occurrences are found, it indicates so and considers the operation successful without making an update.

  Return:
  - `True`: If the replacement operation was successful, whether replacements were made or not (including the case where the `from_string` was not found).
  - `False`: If there was a failure at any point during the process, such as an error fetching the page content, or updating the page with the new content.
  ______________________________________________________________________________

  - Fetch all tables from a Confluence wiki page.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  tables_json = wiki_helper.get_tables_from_page(page_id)
  if tables_json:
      print("Found tables on the page:")
      print(tables_json)
  else:
      print("Failed to fetch tables or no tables found on the page.")
  ```
  Parameter
  - `page_id` (str): ID of the Confluence wiki page from which to fetch tables.

  Output:
  - The function initiates by fetching the content of the specified Confluence wiki page. It then parses the HTML content of the page to find and extract data from all tables present on the page. Each table's data is converted into a JSON structure, providing an easy-to-read format of the tables' contents.
  Return:
  - JSON structure: Returns a JSON string that represents all the tables found on the page. Each table is structured into a JSON object with keys representing the table headers and values representing the row data. If multiple tables are found, they are indexed as `table1`, `table2`, etc., in the JSON structure.
  - If the fetching fails (due to an unsuccessful API call) or if no tables are found on the page, the function returns an empty JSON object (`{}`).
  ______________________________________________________________________________

  - Replace the entire Confluence wiki page with the new content
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "12345"  # Example page ID
  new_content = "<p>This is the new content for the page.</p>"  # HTML content

  if wiki_helper.update_wiki_page(page_id, new_content):
      print(f"Page ID: {page_id} was updated successfully.")
  else:
      print(f"Failed to update the page ID: {page_id}.")
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page that you want to update.
  - `new_content` (str): The new content to replace the existing content of the page. This content is typically in `HTML` format.

  Output:
  - The method prints messages to inform the user about the process steps, including fetching current page data and attempting to update the page with new content.
  Return:
  - `True`: If the page content update is successful. This is indicated by a status code of `200` from the Confluence REST API, showing that the update request was processed correctly.
  - `False`: If the update fails. This could be due to various reasons such as an invalid page ID, issues with the Confluence server, or improper formatting of the new content. Failure is indicated by any status code other than `200`, and the method prints the error details received from the server.
  ______________________________________________________________________________

  - Retrieve the parent ID of a Confluence wiki page by passed page ID.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  parent_id = wiki_helper.get_parent_page_id(page_id)
  if parent_id:
      print(f"Parent page ID for page ID {page_id}: {parent_id}")
  else:
      print(f"No parent page found for page ID {page_id}, or failed to fetch.")
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page for which you want to find the parent page.

  Output:
  - The method outputs a message indicating it is fetching the parent page ID for the specified page. It then either reports the ID of the parent page, states that no parent page was found, or indicates a failure to fetch the parent page ID.

  Return:
  - `ID of the parent page` (str): If the specified page has a parent page, the method returns the ID of the parent page. This is useful for understanding the hierarchy of pages within Confluence spaces.
  - `False`: If no parent page exists for the specified page or if there was an error in the fetch operation (such as an invalid page ID or a problem with the Confluence server), the method returns False. This helps to identify pages that are at the top level of their space or when an issue occurs with the retrieval process.
  ______________________________________________________________________________

  - Add a Table of Contents (TOC) to a Confluence wiki page if it doesn't already have one.
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID

  result_message = wiki_helper.add_toc_to_page(page_id)
  print(result_message)
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence wiki page where you want to add a Table of Contents.

  Output and Return
  - The function returns a **message** indicating the operation's result. This could be a confirmation that the TOC was added successfully, a message stating that the TOC already exists, or an error message if the operation failed.
  - **Error Handling**: If there are issues fetching the page data or updating the page, the function provides detailed error messages including the status code and response text from Confluence's API. This is helpful for diagnosing problems with the operation.
  ______________________________________________________________________________

  - Pass the header to identify the table and then add the row to that identified table
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
  page_id = "123456"  # Example page ID
  headers = ["Header1", "Header2", "Header3"]  # The headers of the table you're targeting
  row_data = ["Data1", "Data2", "Data3"]  # The data for the new row

  result_message = wiki_helper.add_row_to_table(page_id, headers, row_data)
  print(result_message)
  ```
  Parameters
  - `page_id` (str): The ID of the Confluence page you're modifying.
  - `headers` (list of str): A list of headers representing the columns of the table. This ensures that the data is added to the correct column.
  - `row_data` (list of str): A list of values corresponding to each header, forming the new row.

  Output and Return
  - The function returns a message indicating the result of the operation. This could be a confirmation of successful row addition, or an error message detailing why the operation failed.

  ______________________________________________________________________________

  - Pass the header to identify the table and then add/update the row to that identified table
  ```python
  wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)

  page_id = "123456"  # Example page ID
  headers = ["Cluster Name", "Component Name", "Next Version"]  # The headers of your table
  new_row_data = ["Cluster1", "ComponentA", "v2.0"]  # Data for the new or updated row

  result_message = wiki_helper.update_or_add_table_row(page_id, headers, new_row_data)
  print(result_message)
  ```
  Parameter
  - `page_id` (str): The ID of the Confluence page containing the table.
  - `headers` (list of str): A list of headers representing the columns of the table. It's crucial for identifying the correct columns when updating or adding rows.
  - `new_row_data` (list of str): The values for the new or updated row, aligned with the headers order.
  Output and Return
  - The function returns a message indicating the result of the operation, such as successful row update, successful addition of a new row, or an error if the operation failed.
  ______________________________________________________________________________


  🔒 **We respect your privacy**: This module does **not** store any of your data anywhere. It simply interacts with the Atlassian Jira API to perform the requested operations. Ensure you manage your connection details securely.




  - Addressing many minor bugs
  - Restructured the entire release to improve the user experience
  - Added *Important Notes* section to highlight critical information


  - 0.6.2 (11 Nov 2024)
    - Dummy release to recover the incident happened on 11 Nov 2024
    - Please review the *Important Notes* section for more details


  - 0.6.1 (11 Nov 2024)
    - Minor documentation updates for clarity and consistency.
  - 0.6.0 (11 Nov 2024)
    - New Features:
      - Added `attach_file_to_ticket` function to `JiraHelper` class to attach files to Jira tickets.
    - Beta Features (Continued from previous release):
      - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
    - Minor documentation updates for clarity and consistency.
  - 0.5.0 (11 Nov 2024)
    - New Features:
      - Added `get_ticket_subject` function to `JiraHelper` class for retrieving the subject of a Jira ticket by its ID.
    - Beta Features (Continued from previous release):
      - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
    - Minor documentation updates for clarity and consistency.
  - 0.4.1 (28 May 2024)
    - Revision in documentation for better understanding
      - Based on the internal design now `JIRA_URL`, `CONFLUENCE_URL` is replaced with `ATLASSIAN_URL`
      - Technically we are using `https://domain.atlassian.net` only to address Jira and Wiki both
      - This is mentioned in the top of the document as well
    - Beta Features (Continued from previous release):
      - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
  - 0.4 (21 Mar 2024)
    - New Features:
      - JIRA Integration Enhancements:
        - Custom Ticket Creation: The `create_custom_ticket` function has been introduced, allowing for more flexible ticket creation in JIRA projects. This function supports additional fields, enabling users to specify custom data during ticket creation.
        - Ticket Field Updates: The `update_ticket_with_fields` method has been added, offering the ability to update existing tickets with new or modified fields. This feature is crucial for maintaining accurate and up-to-date ticket information.
    - Beta Features (Continued from previous release):
      - Beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
  - 0.3 (21 Mar 2024)
    - Enhancements:
      - Updated `readme.md` documentation.
      - Introduced beta functions `wiki_helper.add_row_to_table` & `wiki_helper.update_or_add_table_row` for improved table management.
  - 0.2.8 (21 Mar 2024)
    - Minor updates and enhancements (details forthcoming).
  - 0.2.7 (08 Jan 2024)
    - New Features:
      - `add_toc_to_page`: Automatically adds a table of contents to wiki pages lacking one.
    - Documentation:
      - Updated `README.md` with guidance on using `add_toc_to_page`.
  - 0.2.6 (05 Jan 2024)
    - New Features:
      - `get_parent_page_id`: Retrieves the parent ID for a given wiki page ID.
    - Documentation:
      - Updated `README.md` with instructions for `get_parent_page_id`.
  - 0.2.5.4 (04 Jan 2024)
    - New Features:
      - `update_wiki_page`: Replaces entire wiki page content with new content.
    - Documentation:
      - Updated `README.md` with usage information for `update_wiki_page`.
  - 0.2.5.3 (04 Jan 2024)
    - Internal testing release; not intended for general use.
  - 0.2.5.2 - 0.2.5 (04 Jan 2024)
    - Withdrawn due to potential bugs.
  - 0.2.4 (13 Oct 2023)
    - New Features:
      - `get_tables_from_page`: Fetches all tables from a wiki page in JSON format, simplifying table extraction.
    - Documentation:
      - Updated `README.md` with `get_tables_from_page` usage details.
  - 0.2.3.1 (21 Sep 2023)
    - Documentation:
      - Updated `README.md` with usage information for `get_page_id` and `replace_in_page`.
  - 0.2.3 (21 Sep 2023)
    - Confluence Integration:
      - Added `get_page_id` to retrieve wiki page IDs.
  - 0.2.2.1 (21 Sep 2023)
    - Performance improvements and extra output suppression.
    - Confluence Integration:
      - Added `replace_in_page` for in-page text replacement.
  - 0.2.2 (20 Sep 2023)
    - Documentation:
      - Enhanced `README.md` for better clarity.
    - Confluence Integration:
      - Added `get_child_pages_recursive` to fetch child pages recursively.
  - 0.2.1 (20 Sep 2023) - Major Release
    - Enhancements:
      - Comprehensive `README.md` update for improved understanding.
      - Fine-tuned output monitoring and improved return format.
    - Confluence Integration:
      - Multiple functionalities added, including page creation, duplication, template usage, moving pages, and existence checks.
  - 0.2 (20 Sep 2023)
    - Withdrawn due to potential bugs.
  - 0.1.4.1 (18 Sep 2023)
    - Documentation:
      - Updated `README.md` for enhanced understanding.
  - 0.1.4 (18 Sep 2023)
    - Improvements:
      - Suppressed extraneous output for cleaner integration.
      - Detailed function outputs in `README.md`.
    - Features:
      - Added Jira ticket search, commenting, and JQL processing functions.
  - 0.1.3 (18 Sep 2023)
    - Withdrawn due to potential bugs.
  - 0.1.2.1 (16 Sep 2023)
    - Documentation:
      - Reformatted `README.md`.
  - 0.1.2 (16 Sep 2023)
    - Features:
      - Added `if_exist_ticket` for Jira ticket existence checks.
    - Documentation:
      - Updated `README.md` format.
  - 0.1.1 (16 Sep 2023)
    - Features:
      - Added `transition_ticket` for Jira ticket transitions, with ID flexibility.
    - Documentation:
      - Clarified module usage in `README.md`.
  - 0.1 (16 Sep 2023)
    - Initial Release:
      - Introduced Jira ticket management functions: `create`, `delete`, and `transition tickets`.


pkgId: 402616aac08d5b7b76af97152f07b3789e456d34239211e5c50c60d245403234
name: python-atlassian-statuspage
arch: src
version: 1.0.2
epoch: 0
release: 1
summary: Statuspage.io API Client
url: https://pypi.org/project/atlassian-statuspage/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlassian-statuspage-1.0.2-1.src.rpm
checksum_type: sha256
description:
  *ComponentGroupsApi* | [**delete_pages_page_id_component_groups_id**](docs/ComponentGroupsApi.md#delete_pages_page_id_component_groups_id) | **DELETE** /pages/{page_id}/component-groups/{id} | Delete a component group
  *ComponentGroupsApi* | [**get_pages_page_id_component_groups**](docs/ComponentGroupsApi.md#get_pages_page_id_component_groups) | **GET** /pages/{page_id}/component-groups | Get a list of component groups
  *ComponentGroupsApi* | [**get_pages_page_id_component_groups_id**](docs/ComponentGroupsApi.md#get_pages_page_id_component_groups_id) | **GET** /pages/{page_id}/component-groups/{id} | Get a component group
  *ComponentGroupsApi* | [**get_pages_page_id_component_groups_id_uptime**](docs/ComponentGroupsApi.md#get_pages_page_id_component_groups_id_uptime) | **GET** /pages/{page_id}/component-groups/{id}/uptime | Get uptime data for a component group
  *ComponentGroupsApi* | [**patch_pages_page_id_component_groups_id**](docs/ComponentGroupsApi.md#patch_pages_page_id_component_groups_id) | **PATCH** /pages/{page_id}/component-groups/{id} | Update a component group
  *ComponentGroupsApi* | [**post_pages_page_id_component_groups**](docs/ComponentGroupsApi.md#post_pages_page_id_component_groups) | **POST** /pages/{page_id}/component-groups | Create a component group
  *ComponentGroupsApi* | [**put_pages_page_id_component_groups_id**](docs/ComponentGroupsApi.md#put_pages_page_id_component_groups_id) | **PUT** /pages/{page_id}/component-groups/{id} | Update a component group
  *ComponentsApi* | [**delete_pages_page_id_components_component_id**](docs/ComponentsApi.md#delete_pages_page_id_components_component_id) | **DELETE** /pages/{page_id}/components/{component_id} | Delete a component
  *ComponentsApi* | [**delete_pages_page_id_components_component_id_page_access_groups**](docs/ComponentsApi.md#delete_pages_page_id_components_component_id_page_access_groups) | **DELETE** /pages/{page_id}/components/{component_id}/page_access_groups | Remove page access groups from a component
  *ComponentsApi* | [**delete_pages_page_id_components_component_id_page_access_users**](docs/ComponentsApi.md#delete_pages_page_id_components_component_id_page_access_users) | **DELETE** /pages/{page_id}/components/{component_id}/page_access_users | Remove page access users from component
  *ComponentsApi* | [**get_pages_page_id_components**](docs/ComponentsApi.md#get_pages_page_id_components) | **GET** /pages/{page_id}/components | Get a list of components
  *ComponentsApi* | [**get_pages_page_id_components_component_id**](docs/ComponentsApi.md#get_pages_page_id_components_component_id) | **GET** /pages/{page_id}/components/{component_id} | Get a component
  *ComponentsApi* | [**get_pages_page_id_components_component_id_uptime**](docs/ComponentsApi.md#get_pages_page_id_components_component_id_uptime) | **GET** /pages/{page_id}/components/{component_id}/uptime | Get uptime data for a component
  *ComponentsApi* | [**patch_pages_page_id_components_component_id**](docs/ComponentsApi.md#patch_pages_page_id_components_component_id) | **PATCH** /pages/{page_id}/components/{component_id} | Update a component
  *ComponentsApi* | [**post_pages_page_id_components**](docs/ComponentsApi.md#post_pages_page_id_components) | **POST** /pages/{page_id}/components | Create a component
  *ComponentsApi* | [**post_pages_page_id_components_component_id_page_access_groups**](docs/ComponentsApi.md#post_pages_page_id_components_component_id_page_access_groups) | **POST** /pages/{page_id}/components/{component_id}/page_access_groups | Add page access groups to a component
  *ComponentsApi* | [**post_pages_page_id_components_component_id_page_access_users**](docs/ComponentsApi.md#post_pages_page_id_components_component_id_page_access_users) | **POST** /pages/{page_id}/components/{component_id}/page_access_users | Add page access users to a component
  *ComponentsApi* | [**put_pages_page_id_components_component_id**](docs/ComponentsApi.md#put_pages_page_id_components_component_id) | **PUT** /pages/{page_id}/components/{component_id} | Update a component
  *IncidentPostmortemApi* | [**delete_pages_page_id_incidents_incident_id_postmortem**](docs/IncidentPostmortemApi.md#delete_pages_page_id_incidents_incident_id_postmortem) | **DELETE** /pages/{page_id}/incidents/{incident_id}/postmortem | Delete Postmortem
  *IncidentPostmortemApi* | [**get_pages_page_id_incidents_incident_id_postmortem**](docs/IncidentPostmortemApi.md#get_pages_page_id_incidents_incident_id_postmortem) | **GET** /pages/{page_id}/incidents/{incident_id}/postmortem | Get Postmortem
  *IncidentPostmortemApi* | [**put_pages_page_id_incidents_incident_id_postmortem**](docs/IncidentPostmortemApi.md#put_pages_page_id_incidents_incident_id_postmortem) | **PUT** /pages/{page_id}/incidents/{incident_id}/postmortem | Create Postmortem
  *IncidentPostmortemApi* | [**put_pages_page_id_incidents_incident_id_postmortem_publish**](docs/IncidentPostmortemApi.md#put_pages_page_id_incidents_incident_id_postmortem_publish) | **PUT** /pages/{page_id}/incidents/{incident_id}/postmortem/publish | Publish Postmortem
  *IncidentPostmortemApi* | [**put_pages_page_id_incidents_incident_id_postmortem_revert**](docs/IncidentPostmortemApi.md#put_pages_page_id_incidents_incident_id_postmortem_revert) | **PUT** /pages/{page_id}/incidents/{incident_id}/postmortem/revert | Revert Postmortem
  *IncidentSubscribersApi* | [**delete_pages_page_id_incidents_incident_id_subscribers_subscriber_id**](docs/IncidentSubscribersApi.md#delete_pages_page_id_incidents_incident_id_subscribers_subscriber_id) | **DELETE** /pages/{page_id}/incidents/{incident_id}/subscribers/{subscriber_id} | Unsubscribe an incident subscriber
  *IncidentSubscribersApi* | [**get_pages_page_id_incidents_incident_id_subscribers**](docs/IncidentSubscribersApi.md#get_pages_page_id_incidents_incident_id_subscribers) | **GET** /pages/{page_id}/incidents/{incident_id}/subscribers | Get a list of incident subscribers
  *IncidentSubscribersApi* | [**get_pages_page_id_incidents_incident_id_subscribers_subscriber_id**](docs/IncidentSubscribersApi.md#get_pages_page_id_incidents_incident_id_subscribers_subscriber_id) | **GET** /pages/{page_id}/incidents/{incident_id}/subscribers/{subscriber_id} | Get an incident subscriber
  *IncidentSubscribersApi* | [**post_pages_page_id_incidents_incident_id_subscribers**](docs/IncidentSubscribersApi.md#post_pages_page_id_incidents_incident_id_subscribers) | **POST** /pages/{page_id}/incidents/{incident_id}/subscribers | Create an incident subscriber
  *IncidentSubscribersApi* | [**post_pages_page_id_incidents_incident_id_subscribers_subscriber_id_resend_confirmation**](docs/IncidentSubscribersApi.md#post_pages_page_id_incidents_incident_id_subscribers_subscriber_id_resend_confirmation) | **POST** /pages/{page_id}/incidents/{incident_id}/subscribers/{subscriber_id}/resend_confirmation | Resend confirmation to an incident subscriber
  *IncidentUpdatesApi* | [**patch_pages_page_id_incidents_incident_id_incident_updates_incident_update_id**](docs/IncidentUpdatesApi.md#patch_pages_page_id_incidents_incident_id_incident_updates_incident_update_id) | **PATCH** /pages/{page_id}/incidents/{incident_id}/incident_updates/{incident_update_id} | Update a previous incident update
  *IncidentUpdatesApi* | [**put_pages_page_id_incidents_incident_id_incident_updates_incident_update_id**](docs/IncidentUpdatesApi.md#put_pages_page_id_incidents_incident_id_incident_updates_incident_update_id) | **PUT** /pages/{page_id}/incidents/{incident_id}/incident_updates/{incident_update_id} | Update a previous incident update
  *IncidentsApi* | [**delete_pages_page_id_incidents_incident_id**](docs/IncidentsApi.md#delete_pages_page_id_incidents_incident_id) | **DELETE** /pages/{page_id}/incidents/{incident_id} | Delete an incident
  *IncidentsApi* | [**get_pages_page_id_incidents**](docs/IncidentsApi.md#get_pages_page_id_incidents) | **GET** /pages/{page_id}/incidents | Get a list of incidents
  *IncidentsApi* | [**get_pages_page_id_incidents_active_maintenance**](docs/IncidentsApi.md#get_pages_page_id_incidents_active_maintenance) | **GET** /pages/{page_id}/incidents/active_maintenance | Get a list of active maintenances
  *IncidentsApi* | [**get_pages_page_id_incidents_incident_id**](docs/IncidentsApi.md#get_pages_page_id_incidents_incident_id) | **GET** /pages/{page_id}/incidents/{incident_id} | Get an incident
  *IncidentsApi* | [**get_pages_page_id_incidents_scheduled**](docs/IncidentsApi.md#get_pages_page_id_incidents_scheduled) | **GET** /pages/{page_id}/incidents/scheduled | Get a list of scheduled incidents
  *IncidentsApi* | [**get_pages_page_id_incidents_unresolved**](docs/IncidentsApi.md#get_pages_page_id_incidents_unresolved) | **GET** /pages/{page_id}/incidents/unresolved | Get a list of unresolved incidents
  *IncidentsApi* | [**get_pages_page_id_incidents_upcoming**](docs/IncidentsApi.md#get_pages_page_id_incidents_upcoming) | **GET** /pages/{page_id}/incidents/upcoming | Get a list of upcoming incidents
  *IncidentsApi* | [**patch_pages_page_id_incidents_incident_id**](docs/IncidentsApi.md#patch_pages_page_id_incidents_incident_id) | **PATCH** /pages/{page_id}/incidents/{incident_id} | Update an incident
  *IncidentsApi* | [**post_pages_page_id_incidents**](docs/IncidentsApi.md#post_pages_page_id_incidents) | **POST** /pages/{page_id}/incidents | Create an incident
  *IncidentsApi* | [**put_pages_page_id_incidents_incident_id**](docs/IncidentsApi.md#put_pages_page_id_incidents_incident_id) | **PUT** /pages/{page_id}/incidents/{incident_id} | Update an incident
  *MetricProvidersApi* | [**delete_pages_page_id_metrics_providers_metrics_provider_id**](docs/MetricProvidersApi.md#delete_pages_page_id_metrics_providers_metrics_provider_id) | **DELETE** /pages/{page_id}/metrics_providers/{metrics_provider_id} | Delete a metric provider
  *MetricProvidersApi* | [**get_pages_page_id_metrics_providers**](docs/MetricProvidersApi.md#get_pages_page_id_metrics_providers) | **GET** /pages/{page_id}/metrics_providers | Get a list of metric providers
  *MetricProvidersApi* | [**get_pages_page_id_metrics_providers_metrics_provider_id**](docs/MetricProvidersApi.md#get_pages_page_id_metrics_providers_metrics_provider_id) | **GET** /pages/{page_id}/metrics_providers/{metrics_provider_id} | Get a metric provider
  *MetricProvidersApi* | [**get_pages_page_id_metrics_providers_metrics_provider_id_metrics**](docs/MetricProvidersApi.md#get_pages_page_id_metrics_providers_metrics_provider_id_metrics) | **GET** /pages/{page_id}/metrics_providers/{metrics_provider_id}/metrics | List metrics for a metric provider
  *MetricProvidersApi* | [**patch_pages_page_id_metrics_providers_metrics_provider_id**](docs/MetricProvidersApi.md#patch_pages_page_id_metrics_providers_metrics_provider_id) | **PATCH** /pages/{page_id}/metrics_providers/{metrics_provider_id} | Update a metric provider
  *MetricProvidersApi* | [**post_pages_page_id_metrics_providers**](docs/MetricProvidersApi.md#post_pages_page_id_metrics_providers) | **POST** /pages/{page_id}/metrics_providers | Create a metric provider
  *MetricProvidersApi* | [**post_pages_page_id_metrics_providers_metrics_provider_id_metrics**](docs/MetricProvidersApi.md#post_pages_page_id_metrics_providers_metrics_provider_id_metrics) | **POST** /pages/{page_id}/metrics_providers/{metrics_provider_id}/metrics | Create a metric for a metric provider
  *MetricProvidersApi* | [**put_pages_page_id_metrics_providers_metrics_provider_id**](docs/MetricProvidersApi.md#put_pages_page_id_metrics_providers_metrics_provider_id) | **PUT** /pages/{page_id}/metrics_providers/{metrics_provider_id} | Update a metric provider
  *MetricsApi* | [**delete_pages_page_id_metrics_metric_id**](docs/MetricsApi.md#delete_pages_page_id_metrics_metric_id) | **DELETE** /pages/{page_id}/metrics/{metric_id} | Delete a metric
  *MetricsApi* | [**delete_pages_page_id_metrics_metric_id_data**](docs/MetricsApi.md#delete_pages_page_id_metrics_metric_id_data) | **DELETE** /pages/{page_id}/metrics/{metric_id}/data | Reset data for a metric
  *MetricsApi* | [**get_pages_page_id_metrics**](docs/MetricsApi.md#get_pages_page_id_metrics) | **GET** /pages/{page_id}/metrics | Get a list of metrics
  *MetricsApi* | [**get_pages_page_id_metrics_metric_id**](docs/MetricsApi.md#get_pages_page_id_metrics_metric_id) | **GET** /pages/{page_id}/metrics/{metric_id} | Get a metric
  *MetricsApi* | [**get_pages_page_id_metrics_providers_metrics_provider_id_metrics**](docs/MetricsApi.md#get_pages_page_id_metrics_providers_metrics_provider_id_metrics) | **GET** /pages/{page_id}/metrics_providers/{metrics_provider_id}/metrics | List metrics for a metric provider
  *MetricsApi* | [**patch_pages_page_id_metrics_metric_id**](docs/MetricsApi.md#patch_pages_page_id_metrics_metric_id) | **PATCH** /pages/{page_id}/metrics/{metric_id} | Update a metric
  *MetricsApi* | [**post_pages_page_id_metrics_data**](docs/MetricsApi.md#post_pages_page_id_metrics_data) | **POST** /pages/{page_id}/metrics/data | Add data points to metrics
  *MetricsApi* | [**post_pages_page_id_metrics_metric_id_data**](docs/MetricsApi.md#post_pages_page_id_metrics_metric_id_data) | **POST** /pages/{page_id}/metrics/{metric_id}/data | Add data to a metric
  *MetricsApi* | [**post_pages_page_id_metrics_providers_metrics_provider_id_metrics**](docs/MetricsApi.md#post_pages_page_id_metrics_providers_metrics_provider_id_metrics) | **POST** /pages/{page_id}/metrics_providers/{metrics_provider_id}/metrics | Create a metric for a metric provider
  *MetricsApi* | [**put_pages_page_id_metrics_metric_id**](docs/MetricsApi.md#put_pages_page_id_metrics_metric_id) | **PUT** /pages/{page_id}/metrics/{metric_id} | Update a metric
  *PageAccessGroupComponentsApi* | [**delete_pages_page_id_page_access_groups_page_access_group_id_components**](docs/PageAccessGroupComponentsApi.md#delete_pages_page_id_page_access_groups_page_access_group_id_components) | **DELETE** /pages/{page_id}/page_access_groups/{page_access_group_id}/components | Delete components for a page access group
  *PageAccessGroupComponentsApi* | [**delete_pages_page_id_page_access_groups_page_access_group_id_components_component_id**](docs/PageAccessGroupComponentsApi.md#delete_pages_page_id_page_access_groups_page_access_group_id_components_component_id) | **DELETE** /pages/{page_id}/page_access_groups/{page_access_group_id}/components/{component_id} | Remove a component from a page access group
  *PageAccessGroupComponentsApi* | [**get_pages_page_id_page_access_groups_page_access_group_id_components**](docs/PageAccessGroupComponentsApi.md#get_pages_page_id_page_access_groups_page_access_group_id_components) | **GET** /pages/{page_id}/page_access_groups/{page_access_group_id}/components | List components for a page access group
  *PageAccessGroupComponentsApi* | [**patch_pages_page_id_page_access_groups_page_access_group_id_components**](docs/PageAccessGroupComponentsApi.md#patch_pages_page_id_page_access_groups_page_access_group_id_components) | **PATCH** /pages/{page_id}/page_access_groups/{page_access_group_id}/components | Add components to page access group
  *PageAccessGroupComponentsApi* | [**post_pages_page_id_page_access_groups_page_access_group_id_components**](docs/PageAccessGroupComponentsApi.md#post_pages_page_id_page_access_groups_page_access_group_id_components) | **POST** /pages/{page_id}/page_access_groups/{page_access_group_id}/components | Replace components for a page access group
  *PageAccessGroupComponentsApi* | [**put_pages_page_id_page_access_groups_page_access_group_id_components**](docs/PageAccessGroupComponentsApi.md#put_pages_page_id_page_access_groups_page_access_group_id_components) | **PUT** /pages/{page_id}/page_access_groups/{page_access_group_id}/components | Add components to page access group
  *PageAccessGroupsApi* | [**delete_pages_page_id_page_access_groups_page_access_group_id**](docs/PageAccessGroupsApi.md#delete_pages_page_id_page_access_groups_page_access_group_id) | **DELETE** /pages/{page_id}/page_access_groups/{page_access_group_id} | Remove a page access group
  *PageAccessGroupsApi* | [**get_pages_page_id_page_access_groups**](docs/PageAccessGroupsApi.md#get_pages_page_id_page_access_groups) | **GET** /pages/{page_id}/page_access_groups | Get a list of page access groups
  *PageAccessGroupsApi* | [**get_pages_page_id_page_access_groups_page_access_group_id**](docs/PageAccessGroupsApi.md#get_pages_page_id_page_access_groups_page_access_group_id) | **GET** /pages/{page_id}/page_access_groups/{page_access_group_id} | Get a page access group
  *PageAccessGroupsApi* | [**patch_pages_page_id_page_access_groups_page_access_group_id**](docs/PageAccessGroupsApi.md#patch_pages_page_id_page_access_groups_page_access_group_id) | **PATCH** /pages/{page_id}/page_access_groups/{page_access_group_id} | Update a page access group
  *PageAccessGroupsApi* | [**post_pages_page_id_page_access_groups**](docs/PageAccessGroupsApi.md#post_pages_page_id_page_access_groups) | **POST** /pages/{page_id}/page_access_groups | Create a page access group
  *PageAccessGroupsApi* | [**put_pages_page_id_page_access_groups_page_access_group_id**](docs/PageAccessGroupsApi.md#put_pages_page_id_page_access_groups_page_access_group_id) | **PUT** /pages/{page_id}/page_access_groups/{page_access_group_id} | Update a page access group
  *PageAccessUserComponentsApi* | [**delete_pages_page_id_page_access_users_page_access_user_id_components**](docs/PageAccessUserComponentsApi.md#delete_pages_page_id_page_access_users_page_access_user_id_components) | **DELETE** /pages/{page_id}/page_access_users/{page_access_user_id}/components | Remove components for page access user
  *PageAccessUserComponentsApi* | [**delete_pages_page_id_page_access_users_page_access_user_id_components_component_id**](docs/PageAccessUserComponentsApi.md#delete_pages_page_id_page_access_users_page_access_user_id_components_component_id) | **DELETE** /pages/{page_id}/page_access_users/{page_access_user_id}/components/{component_id} | Remove component for page access user
  *PageAccessUserComponentsApi* | [**get_pages_page_id_page_access_users_page_access_user_id_components**](docs/PageAccessUserComponentsApi.md#get_pages_page_id_page_access_users_page_access_user_id_components) | **GET** /pages/{page_id}/page_access_users/{page_access_user_id}/components | Get components for page access user
  *PageAccessUserComponentsApi* | [**patch_pages_page_id_page_access_users_page_access_user_id_components**](docs/PageAccessUserComponentsApi.md#patch_pages_page_id_page_access_users_page_access_user_id_components) | **PATCH** /pages/{page_id}/page_access_users/{page_access_user_id}/components | Add components for page access user
  *PageAccessUserComponentsApi* | [**post_pages_page_id_page_access_users_page_access_user_id_components**](docs/PageAccessUserComponentsApi.md#post_pages_page_id_page_access_users_page_access_user_id_components) | **POST** /pages/{page_id}/page_access_users/{page_access_user_id}/components | Replace components for page access user
  *PageAccessUserComponentsApi* | [**put_pages_page_id_page_access_users_page_access_user_id_components**](docs/PageAccessUserComponentsApi.md#put_pages_page_id_page_access_users_page_access_user_id_components) | **PUT** /pages/{page_id}/page_access_users/{page_access_user_id}/components | Add components for page access user
  *PageAccessUserMetricsApi* | [**delete_pages_page_id_page_access_users_page_access_user_id_metrics**](docs/PageAccessUserMetricsApi.md#delete_pages_page_id_page_access_users_page_access_user_id_metrics) | **DELETE** /pages/{page_id}/page_access_users/{page_access_user_id}/metrics | Delete metrics for page access user
  *PageAccessUserMetricsApi* | [**delete_pages_page_id_page_access_users_page_access_user_id_metrics_metric_id**](docs/PageAccessUserMetricsApi.md#delete_pages_page_id_page_access_users_page_access_user_id_metrics_metric_id) | **DELETE** /pages/{page_id}/page_access_users/{page_access_user_id}/metrics/{metric_id} | Delete metric for page access user
  *PageAccessUserMetricsApi* | [**get_pages_page_id_page_access_users_page_access_user_id_metrics**](docs/PageAccessUserMetricsApi.md#get_pages_page_id_page_access_users_page_access_user_id_metrics) | **GET** /pages/{page_id}/page_access_users/{page_access_user_id}/metrics | Get metrics for page access user
  *PageAccessUserMetricsApi* | [**patch_pages_page_id_page_access_users_page_access_user_id_metrics**](docs/PageAccessUserMetricsApi.md#patch_pages_page_id_page_access_users_page_access_user_id_metrics) | **PATCH** /pages/{page_id}/page_access_users/{page_access_user_id}/metrics | Add metrics for page access user
  *PageAccessUserMetricsApi* | [**post_pages_page_id_page_access_users_page_access_user_id_metrics**](docs/PageAccessUserMetricsApi.md#post_pages_page_id_page_access_users_page_access_user_id_metrics) | **POST** /pages/{page_id}/page_access_users/{page_access_user_id}/metrics | Replace metrics for page access user
  *PageAccessUserMetricsApi* | [**put_pages_page_id_page_access_users_page_access_user_id_metrics**](docs/PageAccessUserMetricsApi.md#put_pages_page_id_page_access_users_page_access_user_id_metrics) | **PUT** /pages/{page_id}/page_access_users/{page_access_user_id}/metrics | Add metrics for page access user
  *PageAccessUsersApi* | [**delete_pages_page_id_page_access_users_page_access_user_id**](docs/PageAccessUsersApi.md#delete_pages_page_id_page_access_users_page_access_user_id) | **DELETE** /pages/{page_id}/page_access_users/{page_access_user_id} | Delete page access user
  *PageAccessUsersApi* | [**get_pages_page_id_page_access_users**](docs/PageAccessUsersApi.md#get_pages_page_id_page_access_users) | **GET** /pages/{page_id}/page_access_users | Get a list of page access users
  *PageAccessUsersApi* | [**get_pages_page_id_page_access_users_page_access_user_id**](docs/PageAccessUsersApi.md#get_pages_page_id_page_access_users_page_access_user_id) | **GET** /pages/{page_id}/page_access_users/{page_access_user_id} | Get page access user
  *PageAccessUsersApi* | [**patch_pages_page_id_page_access_users_page_access_user_id**](docs/PageAccessUsersApi.md#patch_pages_page_id_page_access_users_page_access_user_id) | **PATCH** /pages/{page_id}/page_access_users/{page_access_user_id} | Update page access user
  *PageAccessUsersApi* | [**post_pages_page_id_page_access_users**](docs/PageAccessUsersApi.md#post_pages_page_id_page_access_users) | **POST** /pages/{page_id}/page_access_users | Add a page access user
  *PageAccessUsersApi* | [**put_pages_page_id_page_access_users_page_access_user_id**](docs/PageAccessUsersApi.md#put_pages_page_id_page_access_users_page_access_user_id) | **PUT** /pages/{page_id}/page_access_users/{page_access_user_id} | Update page access user
  *PagesApi* | [**get_pages**](docs/PagesApi.md#get_pages) | **GET** /pages | Get a list of pages
  *PagesApi* | [**get_pages_page_id**](docs/PagesApi.md#get_pages_page_id) | **GET** /pages/{page_id} | Get a page
  *PagesApi* | [**patch_pages_page_id**](docs/PagesApi.md#patch_pages_page_id) | **PATCH** /pages/{page_id} | Update a page
  *PagesApi* | [**put_pages_page_id**](docs/PagesApi.md#put_pages_page_id) | **PUT** /pages/{page_id} | Update a page
  *PermissionsApi* | [**get_organizations_organization_id_permissions_user_id**](docs/PermissionsApi.md#get_organizations_organization_id_permissions_user_id) | **GET** /organizations/{organization_id}/permissions/{user_id} | Get a user&#x27;s permissions
  *PermissionsApi* | [**put_organizations_organization_id_permissions_user_id**](docs/PermissionsApi.md#put_organizations_organization_id_permissions_user_id) | **PUT** /organizations/{organization_id}/permissions/{user_id} | Update a user&#x27;s role permissions
  *StatusEmbedConfigApi* | [**get_pages_page_id_status_embed_config**](docs/StatusEmbedConfigApi.md#get_pages_page_id_status_embed_config) | **GET** /pages/{page_id}/status_embed_config | Get status embed config settings
  *StatusEmbedConfigApi* | [**patch_pages_page_id_status_embed_config**](docs/StatusEmbedConfigApi.md#patch_pages_page_id_status_embed_config) | **PATCH** /pages/{page_id}/status_embed_config | Update status embed config settings
  *StatusEmbedConfigApi* | [**put_pages_page_id_status_embed_config**](docs/StatusEmbedConfigApi.md#put_pages_page_id_status_embed_config) | **PUT** /pages/{page_id}/status_embed_config | Update status embed config settings
  *SubscribersApi* | [**delete_pages_page_id_subscribers_subscriber_id**](docs/SubscribersApi.md#delete_pages_page_id_subscribers_subscriber_id) | **DELETE** /pages/{page_id}/subscribers/{subscriber_id} | Unsubscribe a subscriber
  *SubscribersApi* | [**get_pages_page_id_subscribers**](docs/SubscribersApi.md#get_pages_page_id_subscribers) | **GET** /pages/{page_id}/subscribers | Get a list of subscribers
  *SubscribersApi* | [**get_pages_page_id_subscribers_count**](docs/SubscribersApi.md#get_pages_page_id_subscribers_count) | **GET** /pages/{page_id}/subscribers/count | Get a count of subscribers by type
  *SubscribersApi* | [**get_pages_page_id_subscribers_histogram_by_state**](docs/SubscribersApi.md#get_pages_page_id_subscribers_histogram_by_state) | **GET** /pages/{page_id}/subscribers/histogram_by_state | Get a histogram of subscribers by type and then state
  *SubscribersApi* | [**get_pages_page_id_subscribers_subscriber_id**](docs/SubscribersApi.md#get_pages_page_id_subscribers_subscriber_id) | **GET** /pages/{page_id}/subscribers/{subscriber_id} | Get a subscriber
  *SubscribersApi* | [**get_pages_page_id_subscribers_unsubscribed**](docs/SubscribersApi.md#get_pages_page_id_subscribers_unsubscribed) | **GET** /pages/{page_id}/subscribers/unsubscribed | Get a list of unsubscribed subscribers
  *SubscribersApi* | [**patch_pages_page_id_subscribers_subscriber_id**](docs/SubscribersApi.md#patch_pages_page_id_subscribers_subscriber_id) | **PATCH** /pages/{page_id}/subscribers/{subscriber_id} | Update a subscriber
  *SubscribersApi* | [**post_pages_page_id_subscribers**](docs/SubscribersApi.md#post_pages_page_id_subscribers) | **POST** /pages/{page_id}/subscribers | Create a subscriber
  *SubscribersApi* | [**post_pages_page_id_subscribers_reactivate**](docs/SubscribersApi.md#post_pages_page_id_subscribers_reactivate) | **POST** /pages/{page_id}/subscribers/reactivate | Reactivate a list of subscribers
  *SubscribersApi* | [**post_pages_page_id_subscribers_resend_confirmation**](docs/SubscribersApi.md#post_pages_page_id_subscribers_resend_confirmation) | **POST** /pages/{page_id}/subscribers/resend_confirmation | Resend confirmations to a list of subscribers
  *SubscribersApi* | [**post_pages_page_id_subscribers_subscriber_id_resend_confirmation**](docs/SubscribersApi.md#post_pages_page_id_subscribers_subscriber_id_resend_confirmation) | **POST** /pages/{page_id}/subscribers/{subscriber_id}/resend_confirmation | Resend confirmation to a subscriber
  *SubscribersApi* | [**post_pages_page_id_subscribers_unsubscribe**](docs/SubscribersApi.md#post_pages_page_id_subscribers_unsubscribe) | **POST** /pages/{page_id}/subscribers/unsubscribe | Unsubscribe a list of subscribers
  *TemplatesApi* | [**get_pages_page_id_incident_templates**](docs/TemplatesApi.md#get_pages_page_id_incident_templates) | **GET** /pages/{page_id}/incident_templates | Get a list of templates
  *TemplatesApi* | [**post_pages_page_id_incident_templates**](docs/TemplatesApi.md#post_pages_page_id_incident_templates) | **POST** /pages/{page_id}/incident_templates | Create a template
  *UsersApi* | [**delete_organizations_organization_id_users_user_id**](docs/UsersApi.md#delete_organizations_organization_id_users_user_id) | **DELETE** /organizations/{organization_id}/users/{user_id} | Delete a user
  *UsersApi* | [**get_organizations_organization_id_permissions_user_id**](docs/UsersApi.md#get_organizations_organization_id_permissions_user_id) | **GET** /organizations/{organization_id}/permissions/{user_id} | Get a user&#x27;s permissions
  *UsersApi* | [**get_organizations_organization_id_users**](docs/UsersApi.md#get_organizations_organization_id_users) | **GET** /organizations/{organization_id}/users | Get a list of users
  *UsersApi* | [**post_organizations_organization_id_users**](docs/UsersApi.md#post_organizations_organization_id_users) | **POST** /organizations/{organization_id}/users | Create a user

   - [Component](docs/Component.md)
   - [ComponentGroupUptime](docs/ComponentGroupUptime.md)
   - [ComponentGroupUptimeRelatedEvents](docs/ComponentGroupUptimeRelatedEvents.md)
   - [ComponentIdPageAccessUsersBody](docs/ComponentIdPageAccessUsersBody.md)
   - [ComponentUptime](docs/ComponentUptime.md)
   - [ComponentUptimeRelatedEvents](docs/ComponentUptimeRelatedEvents.md)
   - [DeletePagesPageIdPageAccessGroupsPageAccessGroupIdComponents](docs/DeletePagesPageIdPageAccessGroupsPageAccessGroupIdComponents.md)
   - [DeletePagesPageIdPageAccessUsersPageAccessUserIdComponents](docs/DeletePagesPageIdPageAccessUsersPageAccessUserIdComponents.md)
   - [DeletePagesPageIdPageAccessUsersPageAccessUserIdMetrics](docs/DeletePagesPageIdPageAccessUsersPageAccessUserIdMetrics.md)
   - [ErrorEntity](docs/ErrorEntity.md)
   - [GroupComponent](docs/GroupComponent.md)
   - [Incident](docs/Incident.md)
   - [IncidentTemplate](docs/IncidentTemplate.md)
   - [IncidentUpdate](docs/IncidentUpdate.md)
   - [Metric](docs/Metric.md)
   - [MetricAddResponse](docs/MetricAddResponse.md)
   - [MetricAddResponseMetricId](docs/MetricAddResponseMetricId.md)
   - [MetricsProvider](docs/MetricsProvider.md)
   - [Page](docs/Page.md)
   - [PageAccessGroup](docs/PageAccessGroup.md)
   - [PageAccessUser](docs/PageAccessUser.md)
   - [PatchPages](docs/PatchPages.md)
   - [PatchPagesPage](docs/PatchPagesPage.md)
   - [PatchPagesPageIdComponentGroups](docs/PatchPagesPageIdComponentGroups.md)
   - [PatchPagesPageIdComponents](docs/PatchPagesPageIdComponents.md)
   - [PatchPagesPageIdIncidents](docs/PatchPagesPageIdIncidents.md)
   - [PatchPagesPageIdIncidentsIncident](docs/PatchPagesPageIdIncidentsIncident.md)
   - [PatchPagesPageIdIncidentsIncidentComponents](docs/PatchPagesPageIdIncidentsIncidentComponents.md)
   - [PatchPagesPageIdIncidentsIncidentIdIncidentUpdates](docs/PatchPagesPageIdIncidentsIncidentIdIncidentUpdates.md)
   - [PatchPagesPageIdIncidentsIncidentIdIncidentUpdatesIncidentUpdate](docs/PatchPagesPageIdIncidentsIncidentIdIncidentUpdatesIncidentUpdate.md)
   - [PatchPagesPageIdMetrics](docs/PatchPagesPageIdMetrics.md)
   - [PatchPagesPageIdMetricsMetric](docs/PatchPagesPageIdMetricsMetric.md)
   - [PatchPagesPageIdMetricsProviders](docs/PatchPagesPageIdMetricsProviders.md)
   - [PatchPagesPageIdMetricsProvidersMetricsProvider](docs/PatchPagesPageIdMetricsProvidersMetricsProvider.md)
   - [PatchPagesPageIdPageAccessGroups](docs/PatchPagesPageIdPageAccessGroups.md)
   - [PatchPagesPageIdPageAccessGroupsPageAccessGroupIdComponents](docs/PatchPagesPageIdPageAccessGroupsPageAccessGroupIdComponents.md)
   - [PatchPagesPageIdPageAccessUsersPageAccessUserIdComponents](docs/PatchPagesPageIdPageAccessUsersPageAccessUserIdComponents.md)
   - [PatchPagesPageIdPageAccessUsersPageAccessUserIdMetrics](docs/PatchPagesPageIdPageAccessUsersPageAccessUserIdMetrics.md)
   - [PatchPagesPageIdStatusEmbedConfig](docs/PatchPagesPageIdStatusEmbedConfig.md)
   - [PatchPagesPageIdStatusEmbedConfigStatusEmbedConfig](docs/PatchPagesPageIdStatusEmbedConfigStatusEmbedConfig.md)
   - [PatchPagesPageIdSubscribers](docs/PatchPagesPageIdSubscribers.md)
   - [Permissions](docs/Permissions.md)
   - [PermissionsData](docs/PermissionsData.md)
   - [PermissionsDataPages](docs/PermissionsDataPages.md)
   - [PostOrganizationsOrganizationIdUsers](docs/PostOrganizationsOrganizationIdUsers.md)
   - [PostOrganizationsOrganizationIdUsersUser](docs/PostOrganizationsOrganizationIdUsersUser.md)
   - [PostPagesPageIdComponentGroups](docs/PostPagesPageIdComponentGroups.md)
   - [PostPagesPageIdComponentGroupsComponentGroup](docs/PostPagesPageIdComponentGroupsComponentGroup.md)
   - [PostPagesPageIdComponents](docs/PostPagesPageIdComponents.md)
   - [PostPagesPageIdComponentsComponent](docs/PostPagesPageIdComponentsComponent.md)
   - [PostPagesPageIdIncidentTemplates](docs/PostPagesPageIdIncidentTemplates.md)
   - [PostPagesPageIdIncidentTemplatesTemplate](docs/PostPagesPageIdIncidentTemplatesTemplate.md)
   - [PostPagesPageIdIncidents](docs/PostPagesPageIdIncidents.md)
   - [PostPagesPageIdIncidentsIncident](docs/PostPagesPageIdIncidentsIncident.md)
   - [PostPagesPageIdIncidentsIncidentComponents](docs/PostPagesPageIdIncidentsIncidentComponents.md)
   - [PostPagesPageIdIncidentsIncidentIdSubscribers](docs/PostPagesPageIdIncidentsIncidentIdSubscribers.md)
   - [PostPagesPageIdIncidentsIncidentIdSubscribersSubscriber](docs/PostPagesPageIdIncidentsIncidentIdSubscribersSubscriber.md)
   - [PostPagesPageIdMetricsData](docs/PostPagesPageIdMetricsData.md)
   - [PostPagesPageIdMetricsMetricIdData](docs/PostPagesPageIdMetricsMetricIdData.md)
   - [PostPagesPageIdMetricsMetricIdDataData](docs/PostPagesPageIdMetricsMetricIdDataData.md)
   - [PostPagesPageIdMetricsProviders](docs/PostPagesPageIdMetricsProviders.md)
   - [PostPagesPageIdMetricsProvidersMetricsProvider](docs/PostPagesPageIdMetricsProvidersMetricsProvider.md)
   - [PostPagesPageIdMetricsProvidersMetricsProviderIdMetrics](docs/PostPagesPageIdMetricsProvidersMetricsProviderIdMetrics.md)
   - [PostPagesPageIdMetricsProvidersMetricsProviderIdMetricsMetric](docs/PostPagesPageIdMetricsProvidersMetricsProviderIdMetricsMetric.md)
   - [PostPagesPageIdPageAccessGroups](docs/PostPagesPageIdPageAccessGroups.md)
   - [PostPagesPageIdPageAccessGroupsPageAccessGroup](docs/PostPagesPageIdPageAccessGroupsPageAccessGroup.md)
   - [PostPagesPageIdPageAccessGroupsPageAccessGroupIdComponents](docs/PostPagesPageIdPageAccessGroupsPageAccessGroupIdComponents.md)
   - [PostPagesPageIdPageAccessUsers](docs/PostPagesPageIdPageAccessUsers.md)
   - [PostPagesPageIdPageAccessUsersPageAccessUser](docs/PostPagesPageIdPageAccessUsersPageAccessUser.md)
   - [PostPagesPageIdPageAccessUsersPageAccessUserIdComponents](docs/PostPagesPageIdPageAccessUsersPageAccessUserIdComponents.md)
   - [PostPagesPageIdPageAccessUsersPageAccessUserIdMetrics](docs/PostPagesPageIdPageAccessUsersPageAccessUserIdMetrics.md)
   - [PostPagesPageIdSubscribers](docs/PostPagesPageIdSubscribers.md)
   - [PostPagesPageIdSubscribersReactivate](docs/PostPagesPageIdSubscribersReactivate.md)
   - [PostPagesPageIdSubscribersResendConfirmation](docs/PostPagesPageIdSubscribersResendConfirmation.md)
   - [PostPagesPageIdSubscribersSubscriber](docs/PostPagesPageIdSubscribersSubscriber.md)
   - [PostPagesPageIdSubscribersUnsubscribe](docs/PostPagesPageIdSubscribersUnsubscribe.md)
   - [Postmortem](docs/Postmortem.md)
   - [PutOrganizationsOrganizationIdPermissions](docs/PutOrganizationsOrganizationIdPermissions.md)
   - [PutOrganizationsOrganizationIdPermissionsPages](docs/PutOrganizationsOrganizationIdPermissionsPages.md)
   - [PutOrganizationsOrganizationIdPermissionsPagesPageId](docs/PutOrganizationsOrganizationIdPermissionsPagesPageId.md)
   - [PutPages](docs/PutPages.md)
   - [PutPagesPageIdComponentGroups](docs/PutPagesPageIdComponentGroups.md)
   - [PutPagesPageIdComponents](docs/PutPagesPageIdComponents.md)
   - [PutPagesPageIdIncidents](docs/PutPagesPageIdIncidents.md)
   - [PutPagesPageIdIncidentsIncidentIdIncidentUpdates](docs/PutPagesPageIdIncidentsIncidentIdIncidentUpdates.md)
   - [PutPagesPageIdIncidentsIncidentIdPostmortem](docs/PutPagesPageIdIncidentsIncidentIdPostmortem.md)
   - [PutPagesPageIdIncidentsIncidentIdPostmortemPostmortem](docs/PutPagesPageIdIncidentsIncidentIdPostmortemPostmortem.md)
   - [PutPagesPageIdIncidentsIncidentIdPostmortemPublish](docs/PutPagesPageIdIncidentsIncidentIdPostmortemPublish.md)
   - [PutPagesPageIdIncidentsIncidentIdPostmortemPublishPostmortem](docs/PutPagesPageIdIncidentsIncidentIdPostmortemPublishPostmortem.md)
   - [PutPagesPageIdMetrics](docs/PutPagesPageIdMetrics.md)
   - [PutPagesPageIdMetricsProviders](docs/PutPagesPageIdMetricsProviders.md)
   - [PutPagesPageIdPageAccessGroups](docs/PutPagesPageIdPageAccessGroups.md)
   - [PutPagesPageIdPageAccessGroupsPageAccessGroupIdComponents](docs/PutPagesPageIdPageAccessGroupsPageAccessGroupIdComponents.md)
   - [PutPagesPageIdPageAccessUsersPageAccessUserIdComponents](docs/PutPagesPageIdPageAccessUsersPageAccessUserIdComponents.md)
   - [PutPagesPageIdPageAccessUsersPageAccessUserIdMetrics](docs/PutPagesPageIdPageAccessUsersPageAccessUserIdMetrics.md)
   - [PutPagesPageIdStatusEmbedConfig](docs/PutPagesPageIdStatusEmbedConfig.md)
   - [SingleMetricAddResponse](docs/SingleMetricAddResponse.md)
   - [StatusEmbedConfig](docs/StatusEmbedConfig.md)
   - [Subscriber](docs/Subscriber.md)
   - [SubscriberCountByState](docs/SubscriberCountByState.md)
   - [SubscriberCountByType](docs/SubscriberCountByType.md)
   - [SubscriberCountByTypeAndState](docs/SubscriberCountByTypeAndState.md)
   - [User](docs/User.md)


  - **Type**: API key
  - **API key parameter name**: Authorization
  - **Location**: HTTP header

  spkishore007@guidewire.com


pkgId: ccc94cbb6d797a79224f136bfddf6468fc15c1fc83f3bfcbaed409d5ca5feb81
name: python-atlastk
arch: src
version: 0.13.3
epoch: 0
release: 1
url: https://atlastk.org
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlastk-0.13.3-1.src.rpm
checksum_type: sha256
summary:
  World's lightest toolkit to quickly and easily add a GUI to your Python programs and bring them online.

description:
  Click the animation to see a screencast of programming this ["Hello, World!" program](https://en.wikipedia.org/wiki/%22Hello,_World!%22_program) with *Python* in a matter of minutes:
  [![Building a GUI in with *Python* in less then 10 minutes](https://q37.info/s/qp4z37pg.gif)](https://q37.info/s/rt9wr4w3)
  Same video on [*Peertube*](https://en.wikipedia.org/wiki/PeerTube): <https://q37.info/s/qfcng9j4>.
  Source code:
  ```python
  import atlastk
  BODY = """
  <fieldset>
   <input id="Input" xdh:onevent="Submit" value="World"/>
   <button xdh:onevent="Submit">Hello</button>
   <hr/>
   <fieldset>
    <output id="Output">Greetings displayed here!</output>
   </fieldset>
  </fieldset>
  """
  def acConnect(dom):
    dom.inner("", BODY)
    dom.focus("Input")
  def acSubmit(dom):
    name = dom.getValue("Input")
    dom.begin("Output", f"<div>Hello, {name}!</div>")
    dom.setValue("Input", "")
    dom.focus("Input")
  CALLBACKS = {
    "": acConnect,
    "Submit": acSubmit
  }
  atlastk.launch(CALLBACKS)
  ```


  To run above "Hello, World!" program directly in your browser, as seen in corresponding video, follow this link: <https://replit.com/@AtlasTK/hello-python>.
  Thanks to [*Replit*](https://q37.info/s/mxmgq3qm), an [online IDE](https://q37.info/s/zzkzbdw7), you can write and run programs using the *Atlas* toolkit directly in your web browser, without having to install *Python* on your computer [![About online demonstrations](https://img.shields.io/badge/about-online%20demonstrations-informational)](https://q37.info/s/sssznrb4).
  To see more examples, like the following [*TodoMVC*](http://todomvc.com/), simply:
  - go [here](https://q37.info/s/vwpsw73v) (also accessible with the [![Run on Repl.it](https://q37.info/s/kpm7xhfm.png)](https://q37.info/s/vwpsw73v) button at the top of this page),
  - click on the green `Run` button,
  - choose the *Python* entry (this clones the corresponding *GitHub* repository),
  - choose the demonstration to launch,
  - wait for the application to open,
  - … and, as you wish, fork the *Replit* repository and run your own tests directly in your browser, by modifying the code of the examples or by writing your own code.
  [![TodoMVC](https://q37.info/download/TodoMVC.gif "The TodoMVC application made with the Atlas toolkit")](https://q37.info/s/vwpsw73v)

  ```shell


  git clone http://github.com/epeios-q37/atlas-python
  cd atlas-python/examples
  python Hello/
  ```

  Programs made with the *Atlas* toolkit work perfectly on your [*Android*](https://en.wikipedia.org/wiki/Android_(operating_system)) devices (smartphone or tablet) using the [*Termux*](https://termux.com/) application. Simply install (``pkg intall …``) the *git* and *python* packages. That's all!

  When using the *Atlas* toolkit in a [*Jupyter* notebook](https://en.wikipedia.org/wiki/Project_Jupyter#Jupyter_Notebook), the GUI is embedded in the notebook, as shown here:
  ![](https://q37.info/s/f7qqvhs3.gif)
  *Jupyter* notebook examples can be found in the *tutorials* directory.

  If you want to take your code to the next level, from [CLI](https://q37.info/s/cnh9nrw9) to [GUI](https://q37.info/s/hw9n3pjs), then you found the right toolkit.
  With the [*Atlas* toolkit](http://atlastk.org/), you transform your programs in modern web applications ([*SPA*](https://q37.info/s/7sbmxd3j)) without the usual hassles:
  - no *JavaScript* to write; only *HTML*(/*CSS*) and *Python*,
  - no [front and back end architecture](https://q37.info/s/px7hhztd) to bother with,
  - no [web server](https://q37.info/s/n3hpwsht) (*Apache*, *Nginx*…) to install,
  - no need to deploy your application on a remote server,
  - no incoming port to open on your internet box or routeur.
  The *Atlas* toolkit is written in pure *Python*, with no native code and no dependencies, allowing the *Atlas* toolkit to be used on all environments where *Python* is available.
  And simply by running them on a local computer connected to internet, applications using the *Atlas* toolkit will be accessible from the entire internet on laptops, smartphones, tablets…
  The *Atlas* toolkit is particularly well suited for educational purposes, to write modern programming exercises, i.e. with a true graphical interface instead of the usual outdated textual one. More about this can be found [here](https://q37.info/s/cbms43s9).
  *Python* is much more powerful then *Excel* macros to automate (boring) tasks, and you can also work with *PDF*, *Word*, *Google* files…. And with the *Atlas* toolkit, you have much more possibilities then with *VBA* forms. There are some examples [here](https://q37.info/s/97p44nh4).
  There is also a stub to for this library at address <https://q37.info/s/zzcn3wnx>.
  > You will also find programs from [*The Big Book of Small Python Projects*](https://inventwithpython.com/bigbookpython/) by [Al Sweigart](http://alsweigart.com) to which a graphical user interface using the *Atlas* toolkit were added in this repository: [epeios-q37/AlSweigartTheBigBookPython](https://q37.info/s/kd3bwchj).

  The `atlastk` directory contains the *Python* source code of the *Atlas* toolkit, which is the directory you have to reference in `PYTHONPATH` in order to use the *Atlas* toolkit in your own program, unless you have installed the [*atlastk* package](http://q37.info/s/9srmskcm) (`pip install atlastk`…).
  You can also retrieve the `atlastk.zip` file, and add to your source code :
  ```python
  __import__("sys").path.append("<path to>/atlastk.zip")
  import atlastk
  ```
  If the `atlastk.zip` file is in the current folder, replace `<path-to>/atlastk.zip` with `./atlastk.zip` and not only `atlastk.zip`.
  In the `examples` directory, you will found following examples:
  - `Blank`: very basic example,
  - `Hello`: ["*Hello, World!*"](https://en.wikipedia.org/wiki/%22Hello,_World!%22_program),
  - `Chatroom`: multi-user chatroom,
  - `Notes`: note taking program,
  - `TodoMVC`: [*TodoMVC*](http://todomvc.com/),
  - `Hangman`: [Hangman game](http://q37.info/s/gtdtk4hp),
  - `15-puzzle`: [15-puzzle game](https://q37.info/s/jn9zg3bn),
  - `Contacts`: a basic address book,
  - `Widgets`: some widgets handled with the *Atlas* toolkit,
  - `Chatrooms` : same as above `Chatroom`, but with several rooms,
  - `PigGame`: [Pig game](https://en.wikipedia.org/wiki/Pig_(dice_game)) for one or two players,
  - `Reversi`: [*Reversi* game](http://q37.info/s/zz3dzmf7) for one or two players,
  - `MatPlotLib` : the *Atlas* toolkit displaying some graphics made with [*matplotlib*](https://matplotlib.org/); this example needs, of course, the *matplotlib* package to be installed…
  Other examples are detailed in the next section.
  Except for the *ErgoJr*, *GPIO* and *RGB* applications, which are detailed in the next section, to run an example, launch, from within the `examples` directory, `python <Name>/` (don't forget the final `/`), where `<Name>` is the name of the example (`Blank`, `Chatroom`…).
  The *Stars* application is an example where the *Atlas* *toolkit* is used to control a [*Pygame*](https://en.wikipedia.org/wiki/Pygame) based application. Of course, *Pygame* needs to be installed.
  The `tutorials` directory contains some [*Jupyter* notebooks](https://en.wikipedia.org/wiki/Project_Jupyter#Jupyter_Notebook) about  the *Atlas* *toolkit*.

  **If the applications does not work on your *Raspberry Pi*, please see this issue: <https://github.com/epeios-q37/atlas-python/issues/1>**
  The *GPIO* and *RGB* applications are designed to be used on a *Raspberry Pi* or a *ODROID-C2*.
  Here is how the *WebGPIO* application looks like:
  ![*WebGPIO* interface](https://q37.info/s/htkhqb9x.png)
  For the *Raspberry Pi*, the `RPi.GPIO` *Python* module have to be installed (this is probably already the case).
  For the *ODROID-C2*, The *Python* version of *WiringPi* must be installed, and the application has to be launched, from within the `examples` directory, with `sudo` (`sudo python GPIO/` or `sudo python RGB/`).
  The *ErgoJr* application is experimental and to control a *Poppy* *Ergo Jr* robot.
  The *RGB* application is dedicated to the control of a RGB led, and the *GPIO* (aka *WebGPIO*) application allows to control the basic pins. Click below picture to see a *YouTube* video on how they work (same video on [*PeerTube*](https://en.wikipedia.org/wiki/PeerTube): <https://q37.info/s/49pbmwv9>):
  [![RGB video](https://img.youtube.com/vi/C4p2iX6gc-Q/0.jpg)](https://www.youtube.com/watch?v=C4p2iX6gc-Q)


pkgId: 1a7caac574ba6deb7c06ebe2a16bfd57238898188fc2ac7deaacfa1efa291c20
name: python-atlite
arch: src
version: 0.3.0
epoch: 0
release: 1
summary: Library for fetching and converting weather data to power systems data
url: https://github.com/PyPSA/atlite
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atlite-0.3.0-1.src.rpm
checksum_type: sha256
rpm_license:
  MIT License  Copyright (c) Contributors to atlite  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: f50ab222536b94194aad39b823cbb557e10471be239441110e5d3880a554bca9
name: python-atmos-toolbox
arch: src
version: 1.1.0
epoch: 0
release: 1
summary: A python toolbox for data analysis in meteorology & atmospheric sciences
url: https://pypi.org/project/atmos-toolbox/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atmos-toolbox-1.1.0-1.src.rpm
checksum_type: sha256
description:
  A python toolbox for data analysis in meteorology & atmospheric sciences.
  For details please contact the author via the email address below.


  Mingxi Zhang: zhang.mingxi@outlook.com


  MIT liecnse


pkgId: 42a82d85da5adb6278fc6695fb2a9f37bf590b0695f39b78e18fd11f017f9f8d
name: python-atmos-validation
arch: src
version: 1.6.2
epoch: 0
release: 1
summary: A python library containing automated data validation tools for the Atmos Data Service
url: https://github.com/equinor/atmos-validation
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atmos-validation-1.6.2-1.src.rpm
checksum_type: sha256
description:
  [![SCM Compliance](https://scm-compliance-api.radix.equinor.com/repos/equinor/8f11dd2d-6bdc-4544-9aba-de642f86ec3e/badge)](https://developer.equinor.com/governance/scm-policy/)
  [![Build](https://github.com/equinor/atmos-validation/actions/workflows/ci-test-pr.yml/badge.svg)](https://github.com/equinor/atmos-validation/actions/workflows/ci-test-pr.yml)
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
  [![License](https://img.shields.io/badge/license-MIT-blue)](https://opensource.org/licenses/mit)
  [![Coverage badge](https://github.com/equinor/atmos-validation/raw/python-coverage-comment-action-data/badge.svg)](https://github.com/equinor/atmos-validation/tree/python-coverage-comment-action-data)

  A library containing validation checks to be run on hindcast or measurement data to ensure API compliance and standardization.

  Atmos is a project to streamline discoverability and data access for weather data sources through APIs. The first step to building a lean and efficient API is converting data to the standard format.



  In order to ingest measurement or hindcast data into the Atmos Data Store, each source file needs to pass validation. Validation ensures that the file is compliant with the data conventions specified in [Conventions](https://github.com/equinor/atmos-validation/blob/main/docs/conventions.md). The standard file formats for source files are NetCDF files for hindcasts and ASCII or NetCDF for measurements.

  Measurements by definition contain data for a single geographical location, whereas hindcasts are bigger models containing time series for a multitude of locations in (possibly rotated) grids. A measurement file is therefore expected to contain all of its data in a single file. A hindcast is comprised of a set of NetCDF files - all with the same coordinates, attributes, and variables, - where a single file contains data for a unique time period. Depending on the size of the files, the time separation should be either monthly or yearly. A rule-of-thumb is that if the file size grows more than 4 GB, it should be split into smaller files. See [docs](https://github.com/equinor/atmos-validation/blob/main/docs/conventions.md#11-time) or [example](https://github.com/equinor/atmos-validation/tree/main/examples/hindcast_example) for how to name hindcast files.

  To run validation on NetCDF and ASCII source files, we have built the atmos_validation CLI/library. The documentation below describes these checks, the standard format, and how to run validation using the CLI tool.



  - [Conventions](https://github.com/equinor/atmos-validation/blob/main/docs/conventions.md)
  - [ASCII Format](https://github.com/equinor/atmos-validation/blob/main/docs/ascii_format.md)
  - [Running CLI](https://github.com/equinor/atmos-validation/blob/main/docs/run.md)



  - [Hindcast netcdfs format example](https://github.com/equinor/atmos-validation/tree/main/examples/hindcast_example)
  - [Measurement netcdf format example](https://github.com/equinor/atmos-validation/blob/main/examples/example_netcdf_measurement.nc)
  - [Measurement ascii format example](https://github.com/equinor/atmos-validation/blob/main/examples/example_ascii_measurement.dat)



  We welcome different types of contributions, including code, bug reports, issues, feature requests, and documentation. The preferred method of submitting a contribution is either to make an issue on GitHub or to fork the project on GitHub and make a pull request. In the case of bug reports, please provide a detailed explanation describing how to reproduce before submitting.





  - [Dimensions and Coordinates](#1-dimensions-and-coordinate-variables)
    - [Time](#11-time)
    - [Height / Depth](#12-height--depth)
    - [Spatial coordinates](#13-spatial-coordinates)
    - [Longitude / Latitude](#14-latitude-longitude)
  - [Data variables](#2-data-variables)
    - [Naming](#21-naming)
    - [Attributes](#22-attributes-for-data-variables)
    - [Measurements](#23-measurments)
    - [Data checks](#24-data-integrity)
  - [File attributes](#3-global-attributes)
    - [Common data model](#31-common)
    - [Hindcast data model](#32-hindcast)
    - [Measurment data model](#33-measurement)



  - All dimensions shall be attached to at least one variable
  - Dimensions on variables shall match the following naming conventions and sequences:
    - ["south_north", "west_east"]
    - ["Time", "south_north", "west_east"]
    - ["height_[variable_name]", "south_north", "west_east"]
    - ["Time", "height_[variable_name]", "south_north", "west_east"]



  - Shall be named exactly "Time"
  - Shall not be empty (length > 0)
  - Timestamps shall appear in increasing order
  - Shall only contain unique values
  - The "units" attribute shall be "microseconds since 1900-01-01"
  - If source data is a hindcast or single point hindcast, then:
    - The file shall be named according to the time values it contains and contain the length of the time index, in the following format: "datasetName_startTime_endTime_TtimeLenght.nc" with the corresponding time format: "YYYYMMDD". For example, a Nora10 file
    covering the whole year of 1982 and containing 2920 timestamps (a whole year with 3hr resolution) will be named e.g.: "Nora10_19820101_19821231_T2920.nc". Not adhering to startTime and endTime convention would yield a WARNING.
    - Strictly enforced: The files must be named such that they can be sorted in chronological order by timestamp values. For example, naming two files "Nora10_part1.nc" and "Nora10_part2.nc" would yield an error IF part2 contains data for a period before part1. The time-length marker "T[time_length]" is non-optional and not adhering to this convention also yields an error.
  - If source data is a measurment, then:
    - the file shall include values for the whole measurment period



  - Shall be named according to the data variable it is attached to. For example, air pressure (with corresponding key "P") will be named: "height_P".
  - Depths will still be named "height_XX" but shall be signified by negative values.
  - Attribute "units" shall be "m"
  - Attribute "CF_standard_name" shall be "height"
  - Attribute "long_name" shall be "Height for parameter XX", where XX is e.g. CS, WS, WD etc.



  - All data variables shall have "south_north" at the second-to-last index of it's dimensions list, in accordance with the accepted dimensions seen in [Dimensions](#1-dimensions-and-coordinate-variables)
  - All data variables shall have "east_west" at the last index of it's dimensions list, in accordance with the accepted dimensions seen in [Dimensions](#1-dimensions-and-coordinate-variables)
  - Attribute "units" shall be "degree_north" / "degree_east"
  - Attribute "CF_standard_name" shall be "latitude" / "longitude"
  - Attribute "long_name" shall be "latitude" / "longitude"



  - Datasets that contains data with spatial coordinates shall contain "LAT" as a coordinate variable
  - Datasets that contains data with spatial coordinates shall contain "LON" as a coordinate variable
  - "LAT" and "LON" shall be both be defined by dimensions ["south_north", "west_east"]





  - Shall have valid "key", i.e. be listed in the official database document: [https://atmos.app.radix.equinor.com/config/parameters]



  - Shall have attribute "units", "CF_standard_name" and "long_name" with values according to database document.



  If data source is "measurement", then:

  - Shall have attribute "instruments".
  - "instruments" shall be a stringified dictionary, i.e. a string that can be evaluated in python as a dictionary, with keys given by "{instrument_type}, {instrument_specification}" to ensure uniqueness. This key shall map to a list of numbers that describe the heights at which the following instrument was being used.
  (The reason for using stringified dict is that NetCDF does not allow for objects on attributes. Carrying information over from ASCII files to NetCDF for requires some "nesting" of the information, hence the choice to use a dict with the described keys)
  - Example value for key WS (wind speed): '{"PROPELLER ANEMOMETER, some spec": [10.0], "PULSE LIDAR, some spec": [100.0, 150.0, 200.0]}'.
  - All instrument types are validated with respect to the "allowed_instruments" entry from the database document.
  - Instrument specifications are not validated and can therefore be any string value as long as the keys in the dictionary are unique.



  - Shall contain no values outside the range given in the database document by entries "min" and "max". E.g. "AT" (air temperature) shall have values between -50 and 50 degC.



  General instruction: When information is not available "NA" shall be used in place.



  The required common attributes can be seen underneath,

  ```py


  class CommonMetadata(BaseModel, use_enum_values=True):
      """Common required attributes for all data types"""

      comments: Union[List[str], str]
      contractor: str
      classification_level: ClassificationLevel = Field(default="Internal")
      data_type: DataType
      data_history: str
      final_reports: List[str]
      project_name: str
      qc_provider: str
  ```

  *comments*: Any relevant comments related to how the data has been treated shall be provided. It could be basic preprocessing steps etc.

  *contractor*: Name of data provider

  *classification_level*: Signifies data access according to classification level

  *data_type*: If source data is hindcast, single point hindcast, or measurement

  *data_history*: Any information about the origin of the data (if not measured directly by the contractor) or changes made to the data (if there has been previous versions of the same data) shall be stated here. If the data has been measured/created directly by the contractor and it is the first version delivered “Original data” shall be stated

  *final_reports*:  A list of report file names, separated by comma, shall be provided. All stated report files shall follow the data

  *project_name*: Name of the project requesting data

  *qc_provider*: Company responsible for the QC. It can be different from the contractor.

  where data_type should take either value from the enum:

  ```py


  class DataType(str, Enum):
      HINDCAST = "Hindcast"
      MEASUREMENT = "Measurement"
      SP_HINDCAST = "SinglePointHindcast"
  ```

  The data_type value defines secondary requirements on the global attributes on the data file.

  The classifcation level should take either value from the enum:

  ```py


  class ClassificationLevel(OrderedEnum):
      OPEN = "Open"
      INTERNAL = "Internal"
      RESTRICTED = "Restricted"
  ```



  Single point hindcast and hindcast both use the hindcast metadata schema.

  ```py


  class HindcastMetadata(CommonMetadata, UnprotectedNamespaceModel):
      """Extra global attributes required if data_type == "Hindcast" or data_type == "SinglePointHindcast"."""

      calibration: str
      delivery_date: str
      forcing_data: str
      memos: Union[str, List[str]]
      modelling_software: str
      model_name: str
      nests: Union[str, List[str]]
      setup: str
      spatial_resolution: Union[str, List[str]]
      sst_source: str
      task_manager_external: Union[str, List[str]]
      task_manager_internal: Union[str, List[str]]
      time_resolution: str
      topography_source: str
  ```

  *calibration*: Indicate whether calibration is applied to he data ‘yes’/ ‘no’

  *delivery_date*: Date of the hindcast delivery

  *forcing_data*: Data used as the boundary conditions

  *memos*: Filenames of memos shall be specified

  *model_name*: Name of the model. It shall be unique in the project

  *modelling software*: Software and version used in hindcast computation

  *nests*: Nests used to create given data

  *setup*: Setup storage place in the cold storage. Valid for internal hindcasts only. For external hindcasts ‘NA’ shall be specified

  *spatial_resolution*: Spatial resolution in km

  *sst_source*:  Source of SST data

  *task_manager_external*: Hindcast provider task manager

  *task_manager_internal: Equinor task manager handling the project

  *time_resolution*: Temporal resolution



  ```py


  class MeasurementMetadata(CommonMetadata):
      """Extra global attributes if data_type == "Measurement"."""

      asset: Optional[str] = Field(default=None)
      averaging_period: str
      country: str = Field(default="NA")
      data_usability: str
      instrument_types: str
      instrument_specifications: str
      installation_type: str
      location: Union[str, List[str]]
      mooring_name: str
      source_file: str
      total_water_depth: Union[str, float]
  ```

  *asset*: Name of the asset which paid for the data.  In case of sharing data to the third party, permission from the asset is required.

  *averaging_period*: Averaging period of measurements in minutes

  *country*: Country name on which territory data are acquired. In case of sharing data to the third party, one need obey to country regulation rules related to data sharing.

  *data_usability*: Level of the data readiness

  *location*: Latitude and longitude of the measurements in degrees (at least three decimals are required after ‘.’)  and corresponding reference datum.
  Format of the location: lat lon, reference

  *instrument_specifications*:  Instrument specifications for given measurement locations. Instrument specifications shall be listed in the same order as
  the corresponding instrument types.

  *installation_types*: Measurement installation type.

  *instrument_types*: Types of instruments used for the measurement location.

  *mooring_name*: The mooring name shall be unique for each delivered measurement file (across projects, instruments, data deliveries etc) and shall be constructed as follows: project_name + mooring_name + instrument + phase. FOXTROT_MOOR1_GPS_Ph1. Only put single instrumentation in the name in cases where there are multiple instruments.

  *total_water_depth*: Total water depth in meters. For wind data total water depth is NA (this parameter is not in the list, it should be included)

  *source_file*: A reference to the original data file the NetCDF file was generated from. "NA" can be used if not applicable.

  To avoid ambiguous terminology, "data_usability" and "installation_types" are validated against database documents, respectively:

  - [https://atmos.app.radix.equinor.com/config/data-usability]
  - [https://atmos.app.radix.equinor.com/config/installation-types]



  Extra attributes relevant for the data source can be added using snake_case.



  The ASCII format is only applicable for measurements. Hindcasts or single point hindcasts shall be delivered in netCDF (See [conventions](./conventions.md) for details).

  ASCII format contains three sections: Common Metadata, Parameters Related Metadata and Data. See [example](../examples/example_ascii_measurement.dat) for a template to follow.



  Common Metadata shall be given in the header lines of the timeseries. All header lines must start with a percentage symbol, %. There shall be one space between the percentage sign and the following text. There shall be minimum two spaces after ‘:’ in each line of the header. In case of missing data "NA" should be used.

  The following metadata shall be included in all Metocean timeseries:

  - **Contractor/Data Responsible**: Name of data provider
  - **Project name**: Name of the project requesting data
  - **Location**: Latitude and longitude of the measurements in degrees (at least three decimals are required after ‘.’) and corresponding reference datum. Format of the location: "% Location: lat lon, reference"
  - **Duration of data**: Start and end dates of the measurements in format dd.mm.yyyy -dd.mm.yyyy (Dates shall be in UTC and agree with Start and End dates of the data).
  - **Averaging period**: Averaging period of measurements in minutes
  - **TotalWaterDepth**: Total water depth in meters. For wind data total water depth is NA
  - **Mooring Name**: The mooring name shall be unique for each delivered measurement file (across projects, instruments, data deliveries etc) and shall be constructed as follows: project_name + mooring_name + instrument + phase. FOXTROT_MOOR1_GPS_Ph1. Only put single instrumentation in the name in cases where there are multiple instruments
  - **Type of instrument**: Types of instruments used for the measurement location. If there are several instrument types, please, list them with comma separator. If there are no instruments available, use NA. Instrument types shall be chosen from the database list <https://atmos.app.radix.equinor.com/config/instrument-types>. If appropriate type is not available, please, contact CR to include it in the database
  - **Specification of Instrument**: Instrument specifications for given measurement locations. Instrument specifications shall be listed in the same order as the corresponding instrument types
  - **Measurement installation type**: Measurement installation type. One of the options listed in <https://atmos.app.radix.equinor.com/config/installation-types> database shall be specified
  - **QC provider**: Company responsible for the QC. It can be different from the contractor.
  - **Data Usability Level**: Level of the data readiness. One or more options from https://atmos.app.radix.equinor.com/config/data-usability shall be chosen. These metadata reflect how good the data are.
  - **Data history**: Any information about the origin of the data (if not measured directly by the contractor) or changes made to the data (if there has been previous versions of the same data) shall be stated here. If the data has been measured directly by the contractor and it is the first version delivered “Original data” shall be stated.
  - **Missing data**: Element reflecting missing data in the measurements shall be stated. NaN is preferred.
  - **Final Reports**: A list of report file names, separated by comma, shall be provided. All stated report files shall follow the data
  - **Data type**: word ‘Measurement’ shall be stated in this field
  - **Classification level**: Signifies data access according to classification level: Open, Internal or Restricted
  - **Comments**: Any relevant comments related to how the data has been treated shall be provided. It could be basic preprocessing steps etc
  - **Asset**: Name of the asset which paid for the data. In case of sharing data to the third party, permission from the asset is required. NA can be used if asset is not applicable
  - **Country**: Country name on which territory data are acquired. In case of sharing data to the third party, one need obey to country regulation rules related to data sharing
  - **Auxilary information**: Other information about measurements shall be specified in the section below line % Comments . Format shall be similar as in the section above: Each line starts with a % sign and the metadata name shall be separated from the content by ‘:’ The metadata names in this section can be specified by the data provider.



  Parameter Related Metadata shall be given in a table. Each line of the table shall be started from % sign.  The content of the table shall list all the measurement parameters and their metadata, therefore the number of rows of this table should be equal to the number of data columns in the in the Data section.  The metadata of each parameter except time quantities shall contain the following attributes indicated as a header of the table (See ASCII example):

  - **Parameters**: Description of the measured quantity.
  - **Abbrev**: Short name of the measured quantity. This name will be used in the data table as a header. Therefore, each abbreviation shall be unique in the entire file. Abbrev for the measured parameters shall be constructed as the key from the database with standardized parameter names (see Section 5.3) and absolute value of height/depth. For example, WS100, WD100, CS10, CD10 etc.
  - **Unit**: The units of all the corresponding measurements. All units shall follow the units given in Section 5.3 for the corresponding parameter.
  - **Height**: Height of the corresponding measurement in m (only number) above/below MSL. For currents, sea temperature etc the depth below mean sea level shall be given with sign ‘-‘.
  - **Base**: Key from the database with standardized parameter names (see <https://atmos.app.radix.equinor.com/config/parameters>)
  - **Instrument**: Instrument type used to measure given parameter at given height. If given parameter is the merge of measurements from several instrument types, please, list them with comma separator. If there are no instruments available, use NA. Instrument types shall be chosen from the list in Section 5.4.
  - **InstrSpec**: Instrument specifications for given quantity. Instrument specifications shall be listed in the same order as the corresponding instrument types.

  First 5 rows of the table shall contain time quantities, where only the columns Parameters and Abbrev are filled. Time quantities shall be represented as Year, Month, Day, Hour, Minute in Parameters with corresponding abbreviations YY, MM, DD, HH and Min in Abbrev column.



  The measured data shall be provided in columns below the metadata. In the first row of the data section the column names shall be given. The number of columns with data shall be the same as the number of parameters listed in Parameter Related Metadata section. The first 5 columns shall provide the time as YY (year), MM (month), DD (day), HH (hour), Min (minute). The following columns shall be given names corresponding to the Abbrev name from the header. All parameters shall be in the units specified in the header. Missing values shall be represented by the value given in the header line Missing data.





  Prerequisites: Python >=3.8.

  Run in your preferred environment:

  ```pip install atmos_validation```

  Or, if using poetry as package manager, replace ```pip install``` with ```poetry add```.

  If using conda, run before the pip install command above:

  ```conda install git pip```



  After installing, run ```python -m atmos_validation``` to see docstring for available commands and options.

  Example usage using the example datasets (need to clone/download repository and run from root for this to work):

  - Validating hindcast NetCDF format: ```python -m atmos_validation validate-netcdf examples/hindcast_example```
  - Validating measurement NetCDF format: ```python -m atmos_validation validate-netcdf examples/example_netcdf_measurement.nc```
  - Validating measurement ascii format: ```python -m atmos_validation validate-ascii examples/example_ascii_measurement.dat```
  - Convert an ascii file to NetCDF: ```python -m atmos_validation convert-ascii examples/example_ascii_measurement.dat```

  All commands can be run without arguments to trigger docstring output to list args and options documentation.


pkgId: 57e7a39e418512e22af51bfd87a2c99fa57d952d58a9e275c69c2ff787acba60
name: python-atmosphere-gost
arch: src
version: 0.2.3
epoch: 0
release: 1
summary: Standard Atmosphere, GOST 4401-81
url: https://github.com/0x13b/atmosphere_gost/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atmosphere-gost-0.2.3-1.src.rpm
checksum_type: sha256
description:
  Пакет `atmosphere_gost` является python3-модулем, реализующим расчёт параметров
  воздуха в соответствии с моделью стандартной атмосферы ГОСТ 4401-81



  Весь функционал реализован в импортируемом объекте `sa`
  ```python
  from atmosphere_gost import sa

  h = 1530  # геометрическая высота над средним уровнем моря
  p, T, rho, mu, lam, mfp = sa.get_all(h)
  print(f'Параметры стандартной атмосферы на высоте {h} м:')
  print(f'Давление: {p:.1f} Па')
  print(f'Температура: {T:.1f} К')
  print(f'Плотность: {rho:.3e} кг/м3')
  print(f'Динамическая вязкость: {mu:.3e} Па*с')
  print(f'Теплопроводность: {lam:.3e} Вт/(м*К)')
  print(f'Средняя длина свободного пробега молекул: {fmp:.3e} м')
  ```


  Модель Международной стандартной атмосферы (International Standard Atmosphere)
  реализована в пакете `ambiance`, который доступен
  по [ссылке.](https://pypi.org/project/ambiance)
  Параметры воздуха, посчитанные с помощью `ambiance` и с помощью
  `atmosphere_gost` очень близки.


pkgId: 42030f33861a8fb39697af8c6f1e838c7bb42e5b1e02670a80194d0f21381737
name: python-atmospheric-lidar
arch: src
version: 0.5.4
epoch: 0
release: 1
summary: Package for reading raw atmospheric lidar data.
url: https://bitbucket.org/iannis_b/atmospheric-lidar/
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atmospheric-lidar-0.5.4-1.src.rpm
checksum_type: sha256
description:
  This package provides utilities to handle raw (atmospheric) lidar input data.
  The main format supported are Licel binary files (including the Raymetrics modified format).
  The package provides a single command line tool, called licel2scc that can convert Licel binary files to the
  EARLINET's Single Calculus Chain NetCDF format.


pkgId: 52f515a601070e27c2e48dd6835a8f5d81659c536ff11e58ea9c1f1ccf92d40a
name: python-atmosphericRadiationDoseAndFlux
arch: src
version: 1.0.11
epoch: 0
release: 1
summary: Python library for calculating doses and fluxes at a particular altitude given an input spectrum
url: https://github.com/ssc-maire/DoseAndFluxCalculator
rpm_license: CC BY-NC-SA 4.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atmosphericRadiationDoseAndFlux-1.0.11-1.src.rpm
checksum_type: sha256
description:
  A calculation toolkit for determining radiation dose rates in the atmosphere due to an incoming spectrum of particles from space.



  After cloning this directory to your computer, install this package from the cloned directory using the command

  ```
  sudo pip3 install .
  ```
  or alternatively,
  ```
  sudo python3 setup.py install
  ```





  Radiation dose rates that aircraft experience are dependent on the incoming radiation spectrum from space for each incoming particle type,
  altitude above ground level and the 'vertical cut-off rigidity' (which is a function of latitude and longitude).

  You can directly calculate radiation dose rates from an incoming rigidity spectrum using the `calculate_from_rigidity_spec` function.
  `calculate_from_rigidity_spec` takes in an input rigidity specrum as a Python function, as well as an altitude or a list of altitudes,
  and outputs the dose rates aircraft will experience at that altitude. You can optionally also include a vertical cut-off rigidity (the
  default vertical cut-off rigidity is set to 0.0 GV).

  The usage of `calculate_from_rigidity_spec` is:

  ```
  calculate_from_rigidity_spec(rigiditySpectrum:Function,
                               altitudesInkm:float|list,
                               particleName="proton",
                               inputRigidityBins=None,
                               verticalCutOffRigidity=0.0)
  ```
  where the input parameters are:

  | parameter | description |
  | --------- | ----------- |
  | rigiditySpectrum | *callable function*: must be specified in units of **particles/cm2/sr/GV/s**, and as a function of rigidity in GV. rigiditySpectrum can be specified as any callable single argument function, representing an incoming particle spectrum with any distribution. You may wish to use Python's [lambda function](https://www.w3schools.com/python/python_lambda.asp) to do this.
  | altitudesInkm | *float* or *list*: if specified as a list, calculations will be performed in a loop over each of the specified altitudes and returned in the output Pandas DataFrame.
  | particleName | *str*: must be either "proton" or "alpha". Currently using the setting "alpha" actually calculates dose rates associated with all particles species with atomic numbers 2 and greater rather than just for alpha particles. Default = "proton".
  | inputRigidityBins | *list*: an optional input parameter, do not use unless experienced with using this library. Setting this parameter to a value overrides this module's internal application of the `rigiditySpectrum` parameter to an internal default set of energy bins for the purpose of calculating dose rates and fluxes. |
  | verticalCutOffRigidity | *float*: units of gigavolts (GV). Default = 0.0.

  For example, after importing the module using
  ```
  from atmosphericRadiationDoseAndFlux import doseAndFluxCalculator as DAFcalc
  ```
  and defining an input rigidity spectrum as a function;
  ```
  testA = 2.77578789
  testmu = 2.82874076

  testRigiditySpectrum = lambda x:testA*(x**(-testmu))
  ```
  running
  ```
  DAFcalc.calculate_from_rigidity_spec(testRigiditySpectrum,
                                      particleName="proton",altitudesInkm=18.5928, verticalCutOffRigidity=0.0)
  ```
  will return
  ```
     altitude (km)      edose      adose      dosee        tn1       tn2  \
  0        18.5928  62.219856  41.774429  34.169926  12.323553  7.639987

          tn3           SEU           SEL
  0  5.108492  7.639987e-13  7.639987e-08
  ```
  as a [Pandas DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html). Here `testRigiditySpectrum` is a power law distribution in rigidity, with a spectral index of `testmu` and a value at x = 1 of `testA`.

  The outputted dose rate (or flux) labels represent the following dose rate/flux types:

  |label | dose rate/flux type|
  |------|--------------------|
  |adose| ambient dose equivalent in µSv/hr |
  |edose| effective dose in µSv/hr |
  |dosee| dose equivalent in µSv/hr |
  |tn1| >1 MeV neutron flux, in n/cm2/s |
  |tn2| >10 MeV neutron flux, in n/cm2/s |
  |tn3| >60 MeV neutron flux, in n/cm2/s |
  |SEU| single event upset rate for an SRAM device in upsets/second/bit |
  |SEL| single event latch-up rate for an SRAM device in latch-ups/second/device |

  Dose rates can also be generated from an energy spectrum using `calculate_from_energy_spec`, which has the same syntax as `calculate_from_rigidity_spec`,
  but where the incoming spectrum (now in units of *particles/cm2/sr/MeV/s*) must be specified in terms of energy in MeV instead of rigidity and the optional `inputRigidityBins` parameter is instead `inputEnergyBins` in MeV.



  While it is recommended that the user uses functions as the method of inputting spectra, you can also use the `calculate_from_rigidity_spec_array` and `calculate_from_energy_spec_array` functions to calculate dose rates directly from an array of spectral flux values and energy bins.

  The general syntax for inputs to these are:

  ```
  calculate_from_rigidity_spec_array(
                              inputRigidityBins:list,
                              inputFluxesGV:list,
                              altitudesInkm:list,
                              particleName="proton",
                              verticalCutOffRigidity = 0.0)
  ```

  where `inputRigidityBins` is the full list of rigidity bin edge locations in GV that the input fluxes specified by `inputFluxesGV` are specified for. As `inputRigidityBins` represent the bin edge locations for `inputFluxesGV`, the length of `inputRigidityBins` must therefore be exactly 1 greater than the length of `inputFluxesGV`.

  `calculate_from_energy_spec_array` has a nearly identical syntax to `calculate_from_rigidity_spec_array`, where the only difference is that the first argument of `calculate_from_energy_spec_array` must be specified in MeV instead of GV, and the second argument is the energy spectrum in particles/cm2/sr/MeV/s instead of the rigidity spectrum in particles/cm2/sr/GV/s.


pkgId: 3ea9787888308f7e463c49e88e51ecc17850cc191bba66254cd6d31526afff83
name: python-atmoswing-vigicrues
arch: src
version: 1.1.6
epoch: 0
release: 1
summary: Package to integrate AtmoSwing in the Vigicrues network.
url: https://pypi.org/project/atmoswing-vigicrues/
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atmoswing-vigicrues-1.1.6-1.src.rpm
checksum_type: sha256
description:
  Le module a pour but la gestion du flux de la prévision par AtmoSwing. Il permet :
  * de télécharger les fichiers de sortie de modèles météo (p. ex. GFS),
  * de transformer de tels fichiers en un format netCDF générique,
  * d'exécuter les prévisions par AtmoSwing,
  * d'extraire les résultats en d'autres formats (p.ex. json),
  * et de diffuser ces fichiers par SFTP.


pkgId: 213b8112845cbe579a014859a2ec902d1997384e98b8e5daa9fce08f6a85af66
name: python-atmst
arch: src
version: 0.0.3
epoch: 0
release: 1
summary: A Python library for wrangling atproto-flavoured Merkle Search Trees
url: https://github.com/DavidBuchanan314/atmst
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atmst-0.0.3-1.src.rpm
checksum_type: sha256
description:
  [![Static Badge](https://img.shields.io/badge/license-MIT-blue)](./LICENSE) ![Static Badge](https://img.shields.io/badge/works%20on%20my%20machine-forestgreen) ![Static Badge](https://img.shields.io/badge/test%20coverage-nonzero-red) [![Static Badge](https://img.shields.io/badge/docs-exist!-orange)](https://davidbuchanan314.github.io/atmst/) ![Static Badge](https://img.shields.io/badge/cryptography-certified%20hand--rolled-yellow)

  A Python library for wrangling atproto-flavoured Merkle Search Trees

  Current status: ⚠️ prototype ⚠️



  ```
  git clone https://github.com/DavidBuchanan314/atmst
  cd atmst
  python3 -m pip install .
  ```

  dev install: (editable)

  ```
  python3 -m pip install -e .
  ```

  Running the tests:

  ```
  python3 -m unittest discover -v
  ```

  build the docs:

  ```
  cd docs/
  sphinx-apidoc -f -o _apidocs/ ../src/atmst ../src/atmst/all.py
  make html

  ```

  publishing to pypi: (this one is mainly for my benefit!)

  ```
  python3 -m build
  python3 -m twine upload --repository pypi dist/*
  ```


pkgId: 85a82c2e9aa5ac3d09ed35ed1e6624c0582807591af3c0da1762c2db54a90595
name: python-atolibrary
arch: src
version: 0.0.14
epoch: 0
release: 1
summary: A utility library for image processing and random number generation
url: https://github.com/attojeon/atolibrary
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atolibrary-0.0.14-1.src.rpm
checksum_type: sha256
description:
  * `ato.names.get_human_name`: 사람 이름을 생성하는 함수입니다.
  ```python
  import atolibrary as ato
  name = ato.names.get_human_name()
  print("생성된 사람 이름:", name)


pkgId: 227685194117bb39aeb8c0c62051465545851165947bb5593ba0bf164b12a41c
name: python-atom
arch: src
version: 0.11.0
epoch: 0
release: 1
summary: Memory efficient Python objects
url: https://pypi.org/project/atom/
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atom-0.11.0-1.src.rpm
checksum_type: sha256
description:
  Atom is a framework for creating memory efficient Python objects with enhanced
  features such as dynamic initialization, validation, and change notification for
  object attributes. It provides the default model binding behavior for the
  `Enaml <https://enaml.readthedocs.io/en/latest/>`_ UI framework.
  Examples:
      from atom.api import Atom, Str, Range, Bool, observe
      class Person(Atom):
          """ A simple class representing a person object.
          """
          last_name = Str()
          first_name = Str()
          age = Range(low=0)
          debug = Bool(False)
          @observe('age')
          def debug_print(self, change):
              """ Prints out a debug message whenever the person's age changes.
              """
              if self.debug:
                  templ = "{first} {last} is {age} years old."
                  s = templ.format(
                      first=self.first_name, last=self.last_name, age=self.age,
                  )
                  print(s)
          def _default_first_name(self):
              return 'John'
      john = Person(last_name='Doe', age=42)
      john.debug = True
      john.age = 43  # prints message
      john.age = 'forty three'   # raises TypeError
  Starting with atom 0.8.0 atom object can also be defined using type annotations.
      from atom.api import Atom, observe
      class InventoryItem(Atom):
          """Class for keeping track of an item in inventory."""
          name: str
          unit_price: float
          quantity_on_hand: int = 0
          def total_cost(self) -> float:
              return self.unit_price * self.quantity_on_hand
          @observe("unit_price")
          def check_for_price_reduction(self, change):
              savings = change.get("oldvalue", 0) - change.get("value")
              if savings > 0:
                  print(f"Save ${savings} now on {self.name}s!")
      >>> w = InventoryItem(name="widget", unit_price=1.99, quantity_on_hand=10)
      >>> w.unit_price = 1.00
      Save $0.99 now on widgets!
  For version information, see `the Revision History <https://github.com/nucleic/atom/blob/main/releasenotes.rst>`_.

rpm_license:
  ========================= The Atom licensing terms ========================= Atom is licensed under the terms of the Modified BSD License (also known as New or Revised BSD), as follows:  Copyright (c) 2013-2024, Nucleic Development Team Copyright (c) 2013, Enthought, Inc.  All rights reserved.  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:  Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.  Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.  Neither the name of the Nucleic Development Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  About Atom ---------- Chris Colbert began the Atom project under the umbrella of Enthought, Inc. in February 2013. The project was forked into the Nucleic project in March 2013. Chris is still the project lead.  The Nucleic Development Team is the set of all contributors to the Nucleic project and its subprojects.  The core team that coordinates development on GitHub can be found here: http://github.com/nucleic. The current team consists of:  Core Developers: * Chris Colbert * Matthieu Dartiailh  Active Contributors: * Steven  Silvester * Dave Willmer  Our Copyright Policy -------------------- Nucleic uses a shared copyright model. Each contributor maintains copyright over their contributions to Nucleic. But, it is important to note that these contributions are typically only changes to the repositories. Thus, the Nucleic source code, in its entirety is not the copyright of any single person or institution. Instead, it is the collective copyright of the entire Nucleic Development Team. If individual contributors want to maintain a record of what changes/contributions they have specific copyright on, they should indicate their copyright in the commit message of the change, when they commit the change to one of the Nucleic repositories.  With this in mind, the following banner should be used in any source code file to indicate the copyright and license terms:  #------------------------------------------------------------------------------ # Copyright (c) 2013-2024, Nucleic Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. #------------------------------------------------------------------------------


pkgId: c457d9cd7e5641a42f1bc0a6a67022baac497a5b9766953ff993cfb293f36a3a
name: python-atom3d
arch: src
version: 0.2.6
epoch: 0
release: 1
summary: ATOM3D: Tasks On Molecules in 3 Dimensions
url: https://www.atom3d.ai
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atom3d-0.2.6-1.src.rpm
checksum_type: sha256
description:
  [![Documentation
  Status](https://readthedocs.org/projects/atom3d/badge/?version=latest)](http://atom3d.readthedocs.io/?badge=latest)
  ![Package](https://github.com/drorlab/atom3d/workflows/package/badge.svg)
  [![codecov](https://codecov.io/gh/drorlab/atom3d/branch/master/graph/badge.svg?token=DHH78W45AB)](https://codecov.io/gh/drorlab/atom3d)
  [![PyPI version](https://badge.fury.io/py/atom3d.svg)](https://badge.fury.io/py/atom3d)

  [ATOM3D](https://www.atom3d.ai/) enables machine learning on three-dimensional molecular structure.



  * Access to several datasets involving 3D molecular structure.
  * LMDB data format for storing lots of molecules (and associated metadata).
  * Utilities for splitting/filtering data based on many criteria.

  For more detailed information, [read the documentation](https://atom3d.readthedocs.io/en/latest/).



  Install with:

  ```
  pip install atom3d
  ```

  To use rdkit functionality, please install within conda:

  ```
  conda create -n atom3d python=3.6 pip rdkit
  conda activate atom3d
  pip install atom3d
  ```






  From python:
  ```
  import atom3d.datasets as da
  da.download_dataset('lba', PATH_TO_DATASET) # Download LBA dataset.
  ```

  Or, download and unzip from the [website](https://www.atom3d.ai/).



  From python:
  ```
  import atom3d.datasets as da
  dataset = da.load_dataset(PATH_TO_DATASET, {'lmdb','pdb','silent','sdf','xyz','xyz-gdb'})
  print(len(dataset))  # Print length
  print(dataset[0].keys())  # Print keys
  ```



  LMDB allows for compressed, fast, random access to your structures, all within a
  single database.  Currently, we support creating LMDB datasets from PDB files, silent files, and xyz files.



  From command line:
  ```
  python -m atom3d.datasets PATH_TO_PDB_DIR PATH_TO_DATASET --filetype {pdb,silent,xyz,xyz-gdb}
  ```

  For more usage, please see the [documentation](https://atom3d.readthedocs.io/en/latest/).



  As a living repository, we welcome contributions of additional datasets, methods, and functionality!  See the [Contributing](https://atom3d.readthedocs.io/en/latest/contributing.html) section of the documentation for details.



  For support, please file an issue at https://github.com/drorlab/atom3d/issues.



  The project is licensed under the [MIT license](https://github.com/drorlab/atom3d/blob/master/LICENSE).



  We provide an overview on ATOM3D and details on the preparation of all datasets in our preprint:

  > R. J. L. Townshend, M. Vögele, P. Suriana, A. Derry, A. Powers, Y. Laloudakis, S. Balachandar, B. Jing, B. Anderson, S. Eismann, R. Kondor, R. B. Altman, R. O. Dror "ATOM3D: Tasks On Molecules in Three Dimensions", [arXiv:2012.04035](https://arxiv.org/abs/2012.04035)

  Please cite this work if some of the ATOM3D code or datasets are helpful in your scientific endeavours. For specific datasets, please also cite the respective original source(s), given in the preprint.


pkgId: dba7282f17c88a9ae186d67de73a818c60fec4b0f87414df2acde71abb681f2d
name: python-atomacos
arch: src
version: 3.3.0
epoch: 0
release: 1
summary: Automated Testing on macOS
url: https://github.com/daveenguyen/atomacos
rpm_license: GNU General Public License v2 (GPLv2)
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomacos-3.3.0-1.src.rpm
checksum_type: sha256
description:
  [![license](https://img.shields.io/github/license/daveenguyen/atomacos.svg?style=flat-square)](https://github.com/daveenguyen/atomacos/blob/master/LICENSE)
  [![pypi](https://img.shields.io/pypi/v/atomacos.svg?style=flat-square)](https://pypi.org/project/atomacos/)
  [![Build Status](https://img.shields.io/travis/daveenguyen/atomacos/master.svg?style=flat-square)](https://travis-ci.org/daveenguyen/atomacos)
  [![codecov](https://img.shields.io/codecov/c/github/daveenguyen/atomacos/master.svg?style=flat-square)](https://codecov.io/gh/daveenguyen/atomacos/)
  [![style](https://img.shields.io/badge/code%20style-black-black.svg?style=flat-square)](https://github.com/ambv/black)

  This library is a fork of [atomac].
  It was created to provide a release with python 3 support because
  there has not been a release [since 2013](https://github.com/pyatom/pyatom/releases)

  Atomacos is a library to enable GUI testing of macOS applications via the Apple Accessibility API.
  Atomacos has direct access to the API via [pyobjc]. It's fast and easy to use to write tests.



  Requirements
  - macOS
  - [pyobjc]
  - Systemwide Accesibility enabled

  On travis, it's only on 10.11 because we are able to enable accessibility API.

  If you experience issues, please open a ticket in the [issue tracker][issues].


  Check the checkbox:
  ```
  System Preferences > Universal Access > Enable access for assistive devices
  System Preferences > Security & Privacy > Privacy > Accessibility
  ```

  Failure to enable this will result in `AXErrorAPIDisabled` exceptions during some module usage.




  For release
  ```bash
  $ pip install atomacos
  ```

  For pre-release
  ```bash
  $ pip install --pre atomacos
  ```



  Once installed, you should be able to use it to launch an application:

  ```python
  >>> import atomacos
  >>> atomacos.launchAppByBundleId('com.apple.Automator')
  ```

  This should launch Automator.


  Next, get a reference to the UI Element for the application itself:

  ```python
  >>> automator = atomacos.getAppRefByBundleId('com.apple.Automator')
  >>> automator
  <atomacos.AXClasses.NativeUIElement AXApplication Automator>
  ```


  Now, we can find objects in the accessibility hierarchy:

  ```python
  >>> window = automator.windows()[0]
  >>> window.AXTitle
  u'Untitled'
  >>> sheet = window.sheets()[0]
  ```

  Note that we retrieved an accessibility attribute from the Window object - `AXTitle`.
  Atomacos supports reading and writing of most attributes.
  Xcode's included `Accessibility Inspector` can provide a quick way to find these attributes.


  There is a shortcut for getting the sheet object which
  bypasses accessing it through the Window object.
  Atomacos can search all objects in the hierarchy:

  ```python
  >>> sheet = automator.sheetsR()[0]
  ```


  There are search methods for most types of accessibility objects.
  Each search method, such as `windows`,
  has a corresponding recursive search function, such as `windowsR`.

  The recursive search finds items that aren't just direct children, but children of children.
  These search methods can be given terms to identify specific elements.
  Note that `*` and `?` can be used as wildcard match characters in all search methods:

  ```python
  >>> close = sheet.buttons('Close')[0]
  ```


  There are methods to search for UI Elements that match any number of criteria.
  The criteria are accessibility attributes:

  ```python
  >>> close = sheet.findFirst(AXRole='AXButton', AXTitle='Close')
  ```

  `findFirst` and `findFirstR` return the first item found to match the criteria or `None`.
  `findAll` and `findAllR` return a list of all items that match the criteria or an empty list(`[]`).


  Objects are fairly versatile.
  You can get a list of supported attributes and actions on an object:

  ```python
  >>> close.getAttributes()
  [u'AXRole', u'AXRoleDescription', u'AXHelp', u'AXEnabled', u'AXFocused',
  u'AXParent', u'AXWindow', u'AXTopLevelUIElement', u'AXPosition', u'AXSize',
  u'AXTitle']
  >>> close.AXTitle
  u'Close'
  >>> close.getActions()
  [u'Press']
  ```


  Performing an action is as natural as:

  ```python
  >>> close.Press()
  ```

  Any action can be triggered this way.




  - [License]
  - [Issues]
  - [Source] Code
  - Changes
      - [Commits] page has all changes to the project.
      - [Release] page will also outline changes
  - Thanks [ATOMac] and [PyObjC]


  [source]:  https://github.com/daveenguyen/atomacos
  [release]: https://github.com/daveenguyen/atomacos/releases
  [commits]: https://github.com/daveenguyen/atomacos/commits
  [license]: https://github.com/daveenguyen/atomacos/blob/master/LICENSE
  [issues]:  https://github.com/daveenguyen/atomacos/issues
  [pypi]:    https://pypi.org/project/atomacos/
  [travis]:  https://travis-ci.org/daveenguyen/atomacos
  [codecov]: https://codecov.io/gh/daveenguyen/atomacos/
  [black]:   https://github.com/ambv/black
  [atomac]:  https://github.com/pyatom/pyatom
  [pyobjc]:  https://bitbucket.org/ronaldoussoren/pyobjc


pkgId: 7aca06be9f4caceddfed3dfb2717951df64fbff73d89f12de52f05b88be48764
name: python-atomap
arch: src
version: 0.4.1
epoch: 0
release: 1
summary: Library for analysing atomic resolution images
url: https://atomap.org/
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomap-0.4.1-1.src.rpm
checksum_type: sha256
description:
  The easiest way is via the Anaconda Python distribution, and installing with:
  ```bash
  conda install atomap -c conda-forge
  ```
  It can also be installed via PyPI:
  ```bash
  pip3 install atomap
  ```
  More install instructions: https://atomap.org/install.html

rpm_license:
  GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.  Preamble  The GNU General Public License is a free, copyleft license for software and other kinds of works.  The licenses for most software and other practical works are designed to take away your freedom to share and change the works.  By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users.  We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors.  You can apply it to your programs, too.  When we speak of free software, we are referring to freedom, not price.  Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.  To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights.  Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.  For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received.  You must make sure that they, too, receive or can get the source code.  And you must show them these terms so they know their rights.  Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.  For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software.  For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.  Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so.  This is fundamentally incompatible with the aim of protecting users' freedom to change the software.  The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable.  Therefore, we have designed this version of the GPL to prohibit the practice for those products.  If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.  Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary.  To prevent this, the GPL assures that patents cannot be used to render the program non-free.  The precise terms and conditions for copying, distribution and modification follow.  TERMS AND CONDITIONS  0. Definitions.  "This License" refers to version 3 of the GNU General Public License.  "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.  "The Program" refers to any copyrightable work licensed under this License.  Each licensee is addressed as "you".  "Licensees" and "recipients" may be individuals or organizations.  To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy.  The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.  A "covered work" means either the unmodified Program or a work based on the Program.  To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy.  Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.  To "convey" a work means any kind of propagation that enables other parties to make or receive copies.  Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.  An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License.  If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.  1. Source Code.  The "source code" for a work means the preferred form of the work for making modifications to it.  "Object code" means any non-source form of a work.  A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.  The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form.  A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.  The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities.  However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work.  For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.  The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.  The Corresponding Source for a work in source code form is that same work.  2. Basic Permissions.  All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met.  This License explicitly affirms your unlimited permission to run the unmodified Program.  The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work.  This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.  You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force.  You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright.  Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.  Conveying under any other circumstances is permitted solely under the conditions stated below.  Sublicensing is not allowed; section 10 makes it unnecessary.  3. Protecting Users' Legal Rights From Anti-Circumvention Law.  No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.  When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.  4. Conveying Verbatim Copies.  You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.  You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.  5. Conveying Modified Source Versions.  You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:  a) The work must carry prominent notices stating that you modified it, and giving a relevant date.  b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7.  This requirement modifies the requirement in section 4 to "keep intact all notices".  c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy.  This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged.  This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.  d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.  A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit.  Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.  6. Conveying Non-Source Forms.  You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:  a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.  b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.  c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source.  This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.  d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge.  You need not require recipients to copy the Corresponding Source along with the object code.  If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source.  Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.  e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.  A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.  A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling.  In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage.  For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product.  A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.  "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source.  The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.  If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information.  But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).  The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed.  Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.  Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.  7. Additional Terms.  "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law.  If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.  When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it.  (Additional permissions may be written to require their own removal in certain cases when you modify the work.)  You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.  Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:  a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or  b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or  c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or  d) Limiting the use for publicity purposes of names of licensors or authors of the material; or  e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or  f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.  All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10.  If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term.  If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.  If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.  Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.  8. Termination.  You may not propagate or modify a covered work except as expressly provided under this License.  Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).  However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.  Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.  Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License.  If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.  9. Acceptance Not Required for Having Copies.  You are not required to accept this License in order to receive or run a copy of the Program.  Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance.  However, nothing other than this License grants you permission to propagate or modify any covered work.  These actions infringe copyright if you do not accept this License.  Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.  10. Automatic Licensing of Downstream Recipients.  Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License.  You are not responsible for enforcing compliance by third parties with this License.  An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations.  If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.  You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License.  For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.  11. Patents.  A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based.  The work thus licensed is called the contributor's "contributor version".  A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version.  For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.  Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.  In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement).  To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.  If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients.  "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.  If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.  A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License.  You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.  Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.  12. No Surrender of Others' Freedom.  If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License.  If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all.  For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.  13. Use with the GNU Affero General Public License.  Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work.  The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.  14. Revised Versions of this License.  The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time.  Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.  Each version is given a distinguishing version number.  If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation.  If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.  If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.  Later license versions may give you additional or different permissions.  However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.  15. Disclaimer of Warranty.  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.  16. Limitation of Liability.  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  17. Interpretation of Sections 15 and 16.  If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.  END OF TERMS AND CONDITIONS  How to Apply These Terms to Your New Programs  If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.  To do so, attach the following notices to the program.  It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.  atomap Copyright (C) 2016  atomap  This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.  You should have received a copy of the GNU General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.  Also add information on how to contact you by electronic and paper mail.  If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:  atomap  Copyright (C) 2016  atomap This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.  The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License.  Of course, your program's commands might be different; for a GUI interface, you would use an "about box".  You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.  The GNU General Public License does not permit incorporating your program into proprietary programs.  If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library.  If this is what you want to do, use the GNU Lesser General Public License instead of this License.  But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.


pkgId: acf838bb0152193db2d66eb24a8f0f1913db391f246af55850e7e271221cfa5e
name: python-atomate
arch: src
version: 1.1.0
epoch: 0
release: 1
summary: atomate has implementations of FireWorks workflows for Materials Science
url: https://github.com/hackingmaterials/atomate
rpm_license: modified BSD
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomate-1.1.0-1.src.rpm
checksum_type: sha256
description:
  [![Tests](https://github.com/hackingmaterials/atomate/actions/workflows/test.yml/badge.svg)](https://github.com/hackingmaterials/atomate/actions/workflows/test.yml)
  [![PyPI Downloads](https://img.shields.io/pypi/dm/atomate?label=PyPI%20Downloads)](https://pypi.org/project/atomate)
  [![PyPI](https://img.shields.io/pypi/v/atomate?logo=pypi&logoColor=white)](https://pypi.org/project/atomate)
  [![Requires Python 3.8+](https://img.shields.io/badge/Python-3.8+-blue.svg?logo=python&logoColor=white)](https://python.org/downloads)

  atomate is a software for computational materials science that contains pre-built workflows to compute and analyze the properties of materials.

  - **Website (including documentation):** <https://hackingmaterials.github.io/atomate/>
  - **Help/Support:** <https://discuss.matsci.org/c/atomate>
  - **Source:** <https://github.com/hackingmaterials/atomate>

  If you find atomate useful, please encourage its development by citing the following paper in your research output:

  ```txt
  Mathew, K., Montoya, J. H., Faghaninia, A., Dwarakanath, S., Aykol,
  M., Tang, H., Chu, I., Smidt, T., Bocklund, B., Horton, M., Dagdelen,
  J., Wood, B., Liu, Z.-K., Neaton, J., Ong, S. P., Persson, K., Jain,
  A., Atomate: A high-level interface to generate, execute, and analyze
  computational materials science workflows. Comput. Mater. Sci. 139,
  140-152 (2017).
  ```


pkgId: 8b3b817532c3e57418e506311801e82cd4dee48d387206bac298aa522df6bd27
name: python-atomate2
arch: src
version: 0.0.17
epoch: 0
release: 1
summary: atomate2 is a library of materials science workflows
url: https://pypi.org/project/atomate2/
rpm_license: modified BSD
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomate2-0.0.17-1.src.rpm
checksum_type: sha256
description:
  [![tests](https://img.shields.io/github/actions/workflow/status/materialsproject/atomate2/testing.yml?branch=main&label=tests)](https://github.com/materialsproject/atomate2/actions?query=workflow%3Atesting)
  [![code coverage](https://img.shields.io/codecov/c/gh/materialsproject/atomate2)](https://codecov.io/gh/materialsproject/atomate2)
  [![pypi version](https://img.shields.io/pypi/v/atomate2?color=blue)](https://pypi.org/project/atomate2)
  ![supported python versions](https://img.shields.io/pypi/pyversions/atomate2)
  [![Zenodo](https://img.shields.io/badge/DOI-10.5281/zenodo.10677081-blue?logo=Zenodo&logoColor=white)](https://zenodo.org/records/10677081)
  [![This project supports Python 3.10+](https://img.shields.io/badge/Python-3.10+-blue.svg?logo=python&logoColor=white)](https://python.org/downloads)

  [Documentation][docs] | [PyPI][pypi] | [GitHub][github]

  Atomate2 is a free, open-source software for performing complex materials science
  workflows using simple Python functions. Features of atomate2 include

  - It is built on open-source libraries: [pymatgen], [custodian], [jobflow], and
    [FireWorks].
  - A library of "standard" workflows to compute a wide variety of desired materials
    properties.
  - The ability scale from a single material, to 100 materials, or 100,000 materials.
  - Easy routes to modifying and chaining workflows together.
  - It can build large databases of output properties that you can query, analyze, and
    share in a systematic way.
  - It automatically keeps meticulous records of jobs, their directories, runtime
    parameters, and more.



  Some of the workflows available in atomate2 are:

  - electronic band structures
  - elastic, dielectric, and piezoelectric tensors
  - one-shot electron-phonon interactions
  - electronic transport using [AMSET]
  - phonons using [phonopy]
  - defect formation energy diagrams
  - [Lobster] bonding analysis with [lobsterpy]

  It is easy to customise and compose any of the above workflows.



  Workflows in atomate2 are written using the [jobflow] library. Workflows are generated using
  `Maker` objects which have a consistent API for modifying input settings and chaining
  workflows together. Below, we demonstrate how to run a band structure workflow
  (see the [documentation][RelaxBandStructure] for more details). In total, 4 VASP
  calculations will be performed:

  1. A structural optimisation.
  2. A self-consistent static calculation on the relaxed geometry.
  3. A non-self-consistent calculation on a uniform k-point mesh (for the density of
     states).
  4. A non-self-consistent calculation on a high symmetry k-point path (for the line mode
     band structure).

  ```py
  from atomate2.vasp.flows.core import RelaxBandStructureMaker
  from jobflow import run_locally
  from pymatgen.core import Structure


  mgo_structure = Structure(
      lattice=[[0, 2.13, 2.13], [2.13, 0, 2.13], [2.13, 2.13, 0]],
      species=["Mg", "O"],
      coords=[[0, 0, 0], [0.5, 0.5, 0.5]],
  )


  bandstructure_flow = RelaxBandStructureMaker().make(mgo_structure)


  run_locally(bandstructure_flow, create_folders=True)
  ```

  Before the above code can run successfully, you'll need to

  - tell pymatgen where to [find your pseudopotential files](https://pymatgen.org/installation.html#potcar-setup)
  - tell atomate2 where to find your VASP binary
  - (optionally) prepare an external database to store the job output

  See the [installation] steps for details how to set all of this up.

  In this example, we execute the workflow immediately. In many cases, you might want
  to perform calculations on several materials simultaneously. To achieve this, all
  atomate2 workflows can be run using the [FireWorks] software. See the
  [documentation][atomate2_fireworks] for more details.



  Atomate2 is a Python 3.10+ library and can be installed using pip. Full installation
  and configuration instructions are provided in the [installation tutorial][installation].



  The documentation includes comprehensive tutorials and reference information to get you
  started:

  - [Introduction to running workflows][running-workflows]
  - [Using atomate2 with FireWorks][atomate2_fireworks]
  - [List of VASP workflows][vasp_workflows]



  Ask questions about atomate2 on the [atomate2 support forum][help-forum].
  If you've found an issue with atomate2, please submit a bug report on [GitHub Issues][issues].



  Track changes to atomate2 through the [changelog][changelog].



  We greatly appreciate any contributions in the form of a pull request.
  Additional information on contributing to atomate2 can be found [here][contributing].
  We maintain a list of all contributors [here][contributors].



  Atomate2 is released under a modified BSD license; the full text can be found [here][license].



  The development of atomate2 has benefited from many people across several research groups.
  A full list of contributors can be found [here][contributors].



  A journal submission for `atomate2` is planned. In the meantime, please use [`citation.cff`](citation.cff) and the [Zenodo record](https://zenodo.org/badge/latestdoi/306414371) to cite `atomate2`.

  ```bib
  @software{ganose_atomate2_2024,
    author = {Ganose, Alex and Riebesell, Janosh and George, J. and Shen, Jimmy and S. Rosen, Andrew and Ashok Naik, Aakash and nwinner and Wen, Mingjian and rdguha1995 and Kuner, Matthew and Petretto, Guido and Zhu, Zhuoying and Horton, Matthew and Sahasrabuddhe, Hrushikesh and Kaplan, Aaron and Schmidt, Jonathan and Ertural, Christina and Kingsbury, Ryan and McDermott, Matt and Goodall, Rhys and Bonkowski, Alexander and Purcell, Thomas and Zügner, Daniel and Qi, Ji},
    doi = {10.5281/zenodo.10677081},
    license = {cc-by-4.0},
    month = jan,
    title = {atomate2},
    url = {https://github.com/materialsproject/atomate2},
    version = {0.0.13},
    year = {2024}
  }
  ```

  [pymatgen]: https://pymatgen.org
  [fireworks]: https://materialsproject.github.io/fireworks/
  [jobflow]: https://materialsproject.github.io/jobflow/
  [custodian]: https://materialsproject.github.io/custodian/
  [VASP]: https://www.vasp.at
  [AMSET]: https://hackingmaterials.lbl.gov/amset/
  [help-forum]: https://matsci.org/c/atomate
  [issues]: https://github.com/materialsproject/atomate2/issues
  [changelog]: https://materialsproject.github.io/atomate2/about/changelog.html
  [installation]: https://materialsproject.github.io/atomate2/user/install.html
  [contributing]: https://materialsproject.github.io/atomate2/about/contributing.html
  [contributors]: https://materialsproject.github.io/atomate2/about/contributors.html
  [license]: https://raw.githubusercontent.com/materialsproject/atomate2/main/LICENSE
  [running-workflows]: https://materialsproject.github.io/atomate2/user/running-workflows.html
  [atomate2_fireworks]: https://materialsproject.github.io/atomate2/user/fireworks.html
  [vasp_workflows]: https://materialsproject.github.io/atomate2/user/codes/vasp.html
  [RelaxBandStructure]: https://materialsproject.github.io/atomate2/user/codes/vasp.html#relax-and-band-structure
  [Lobster]: http://www.cohp.de
  [lobsterpy]: https://github.com/JaGeo/LobsterPy
  [phonopy]: https://github.com/phonopy/phonopy
  [docs]: https://materialsproject.github.io/atomate2/
  [github]: https://github.com/materialsproject/atomate2
  [pypi]: https://pypi.org/project/atomate2


pkgId: 3a17be7d01652f3020852d43c2bbc63d3d8cd1d92f74be528c9fab1b342b2286
name: python-atomate2-turbomole
arch: src
version: 0.3
epoch: 0
release: 1
summary: The atomate2-turbomole package is a workflow package for Turbomole
url: https://pypi.org/project/atomate2-turbomole/
rpm_license: modified BSD
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomate2-turbomole-0.3-1.src.rpm
checksum_type: sha256
description:
  [![tests](https://img.shields.io/github/actions/workflow/status/Matgenix/atomate2-turbomole/testing.yml?branch=main&label=tests)](https://github.com/Matgenix/atomate2-turbomole/actions?query=workflow%3Atesting)
  [![code coverage](https://img.shields.io/codecov/c/gh/Matgenix/atomate2-turbomole)](https://codecov.io/gh/Matgenix/atomate2-turbomole)
  [![pypi version](https://img.shields.io/pypi/v/atomate2-turbomole?color=blue)](https://pypi.org/project/atomate2-turbomole)
  ![supported python versions](https://img.shields.io/pypi/pyversions/atomate2-turbomole)

  **[Full Documentation][docs]**

  Atomate2-turbomole is an add-on package for [atomate2](https://github.com/materialsproject/atomate2).

  Atomate2-turbomole is built to work with Turbomole, and is built on top of open source
  libraries such as [pymatgen](https://github.com/materialsproject/pymatgen),
  [custodian](https://github.com/materialsproject/custodian),
  [jobflow](https://github.com/materialsproject/jobflow)
  and [turbomoleio](https://github.com/Matgenix/turbomoleio).

  Currently, the jobs and flows have been implemented and tested for Turbomole version 7.6 and 7.7 series. The
  atomate2-turbomole thus relies on the turbomoleio version that is compatible with Turbomole version used.
  For information, hereafter is a table with compatible versions of Turbomole:

  | TURBOMOLE version(s) | atomate2-turbomole version(s) | turbomoleio version(s) |
  |:---------------------|:-----------------------------:|-----------------------:|
  | 7.8 series           |         0.3.x series          |           1.6.x series |
  | 7.7 series           |         0.2.x series          |           1.5.x series |
  | 7.6 series           |         0.1.x series          |           1.4.x series |

  Note that the turbomoleio version is pinned in the atomate2-turbomole version, i.e. if you install a given
  atomate2-turbomole version, the corresponding (compatible) turbomoleio version will be installed. You only
  have to choose which atomate2-turbomole version to use based on the Turbomole release you have.



  If you've found an issue with atomate2-turbomole, please submit a bug report on [GitHub Issues][issues].



  Track changes to atomate2-turbomole through the [changelog][changelog].



  We greatly appreciate any contributions in the form of a pull request.
  Additional information on contributing to atomate2-turbomole can be found [here][contributing].
  We maintain a list of all contributors [here][contributors].



  Help us keep atomate2-turbomole open and inclusive.
  Please read and follow our [Code of Conduct][codeofconduct].

  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)



  This add-on is released under the same license as atomate2, modified BSD; the full text can be found [here][license].



  If you use atomate2-turbomole in your work, please cite it as follows:

  - "atomate2-turbomole: an open-source add-on to atomate2 workflows for
  Turbomole, [https://github.com/Matgenix/atomate2-turbomole](https://github.com/Matgenix/atomate2-turbomole)



  atomate2-turbomole is developed and maintained by Matgenix SRL.
  The copyright of atomate2-turbomole is shared by Matgenix SRL and Toyota Motor Europe SA.

  A full list of all contributors can be found [here][contributors].

  [issues]: https://github.com//Matgenix/atomate2-turbomole/issues
  [changelog]: https://github.com//Matgenix/atomate2-turbomole/blob/main/CHANGELOG.md
  [contributors]: https://github.com/Matgenix/atomate2-turbomole/graphs/contributors
  [contributing]: https://github.com/Matgenix/atomate2-turbomole/blob/main/CONTRIBUTING.md
  [codeofconduct]: https://github.com/Matgenix/atomate2-turbomole/blob/main/CODE_OF_CONDUCT.md
  [license]: https://raw.githubusercontent.com/Matgenix/atomate2-turbomole/blob/main/LICENSE
  [docs]: https://Matgenix.github.io/atomate2-turbomole/


pkgId: bf5c81910dd783f0acdf9a7f273379b1be18bda5db603e62c3192df2ae187878
name: python-atomcache
arch: src
version: 0.7.6
epoch: 0
release: 1
summary: Asynchronous cache manager designed for horizontally scaled web applications.
url: https://github.com/pysergio/atomcache
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomcache-0.7.6-1.src.rpm
checksum_type: sha256
description:
  ```

  ![Class Diagram](http://www.plantuml.com/plantuml/proxy?src=https://raw.githubusercontent.com/pysergio/atomcache/master/README.md)
  <details markdown="1">
  <summary>As UML</summary>
  ```plantuml
  @startuml
      !theme materia
      participant Redis
      participant Instance_A as A
      participant Instance_B as B
      participant Instance_N as C
      B <-> Redis: GET: Cache=null & GET: Lock=null
      B <-> Redis: SET: Lock = true
      activate B #Red
      A <--> Redis: GET: Cache=null & GET: Lock=true
      activate A #Transparent
      C <--> Redis: GET: Cache=null & GET: Lock=true
      activate C #Transparent
      B <--> B: Do the computation
      B -> Redis: SET: Cache={...}
      deactivate B
      group Notify Cache SET
          Redis -> C
          Redis -> A
      end
      group GET Cache
          Redis <-> C
      deactivate C
          Redis <-> A
      deactivate A
      end
  @enduml
  ```
  </details>


  * Create a file `events.py` with:
  ```Python
  from typing import Optional, Callable
  from redis.asyncio import Redis
  from fastapi import FastAPI, Depends
  from atomcache import Cache
  def create_start_app_handler(app: FastAPI) -> Callable:
      async def start_app() -> None:
          redis: Redis = await Redis.from_url(url="redis://localhost", encoding="utf-8")
          await Cache.init(app, redis)
      return start_app
  def create_stop_app_handler(app: FastAPI) -> Callable:
      async def stop_app() -> None:
          await Cache.backend.close()
      return stop_app
  ```
  * Create a file `main.py` with:
  ```Python
  from typing import Optional
  from fastapi import FastAPI, Depends
  from atomcache import Cache
  from .events import create_start_app_handler, create_stop_app_handler
  app = FastAPI()
  app.add_event_handler("startup", create_start_app_handler(app))
  app.add_event_handler("shutdown", create_stop_app_handler(app))
  @router.get("/resources", response_model=List[TheResponseModel], name="main:test-example")
  async def resources(offset: int = 0, items: int = 10, cache: Cache = Depends(Cache(exp=600)):
      cache_id = f"{offset}-{items}"  # Build cache identifier
      await cache.raise_try(cache_id)  # Try to respond from cache
      response = await db.find(TheResponseModel, skip=offset, limit=items)
      await asyncio.sleep(10)  # Do some heavy work for 10 sec, see `lock_timeout`
      return cache.set(response, cache_id=cache_id)
  ```

  ```Python
  from aiohttp import ClientSession
  from atomcache import Cache
  cache = Cache(exp=1200, namespace="my-namespace:")
  async def requesting_helper(ref: str) -> List[dict]:
      cached_value = await cache.get(cache_id=ref)
      if cached_value is not None:
          return cached_value
      async with ClientSession() as session:
          async with session.get(f"https://external-api.io/{ref}") as response:
              if response.ok:
                  cached_value = response.json()
                  return cache.set(cached_value, cache_id=ref)
      return []
  ```


pkgId: c4b98aef9e8e7d9888f2c13c42be07d31ec86fa0fe0be4a5cf8141e6af331d0e
name: python-atomdriver-qc
arch: src
version: 0.1.3
epoch: 0
release: 1
summary: An standardized interface to QM Codes
url: https://john-herbert-group.gitlab.io
rpm_license: Apache
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomdriver-qc-0.1.3-1.src.rpm
checksum_type: sha256
description:
  <!--
  Copyright 2018-2024 Fragment Contributors
  SPDX-License-Identifier: Apache-2.0
  -->


  Glue for all your QC codes.



  * [Q-Chem](https://www.q-chem.com)
  * [MOPAC](http://openmopac.net)
  * [NWChem](https://www.nwchem-sw.org)
  * [ORCA](https://orcaforum.kofo.mpg.de/app.php/portal)
  * [PySCF](https://pyscf.org)
  * [xTB](https://xtb-docs.readthedocs.io/en/latest/contents.html)



  Atom Driver can be installed using `pip`; however, you must install QC codes yourself.

  ```sh

  pip install git+https://gitlab.com/john-herbert-group/conformer.git

  pip install git+https://gitlab.com/john-herbert-group/atomdriver.git
  ```



  If you would like a handful of QC backends you can start a Conda environment and install xTB and PySCF and install Atom Driver on top of it [^conda]

  ```sh

  conda config --add channels conda-forge


  conda create -n atomdriver python=3.11 xtb-python xtb pyscf


  conda activate atomdriver




  pip install git+ssh://git@gitlab.com/john-herbert-group/conformer.git git+ssh://git@gitlab.com/john-herbert-group/atomdriver.git


  pip install git+https://gitlab.com/john-herbert-group/conformer.git git+https://gitlab.com/john-herbert-group/atomdriver.git
  ```

  [^conda]: Strickly speaking Conda and Pip should not be mixed! You can have a relativly stable environment if you install Python and a handful of dependencies with Conda and then install the pip dependencies. Do not go back and add addional Conda packages! You may have to remove and recreate the environment to make changes.



  For simple workflow you can run calculations with the `atomdriver.util.run`. For more complex workflows you may wish to use the `atomdriver.util.Worker` class.

  ```python
  from atomdriver.util import run
  from atomdriver.drivers.libxtb import LibxTB
  from conformer.systems import System

  methanol = System.from_tuples([
      ("C",    0.0000000,   -0.0107162,   -0.6532941),
      ("O",    0.0000000,   -0.0950958,    0.7424134),
      ("H",    0.9153226,    0.5105599,   -1.0084225),
      ("H",   -0.9153226,    0.5105599,   -1.0084225),
      ("H",    0.0000000,   -1.0368018,   -1.0751488),
      ("H",    0.0000000,    0.8407457,    1.0724513),
  ])
  xtb_driver = LibxTB.from_options("xtb", calc_gradient=True, calc_charges=True)
  res = run(methanol, xtb_driver)

  print(res.status)


  print(res.properties["total_energy"])


  print(res.properties["partial_charges"].data)







  print(res.properties["nuclear_gradient"].data)






  ```

  ![Yes it's a pun!](https://media.giphy.com/media/IcjQNoFcxRuZVBePw2/giphy.gif?cid=ecf05e47uwcshvap3ad26ivtehhprtbqlau5scu932gwhm7d&ep=v1_gifs_search&rid=giphy.gif&ct=g)


pkgId: 36e343a2af6e4fce102a5de46d80105c1acd0e19f5ea07f5d5d2f2cc06730c43
name: python-atomea
arch: src
version: 0.0.0.post171
epoch: 0
release: 1
summary: Extensible schema for atomistic data and calculations.
url: https://pypi.org/project/atomea/
rpm_license: Apache-2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomea-0.0.0.post171-1.src.rpm
checksum_type: sha256
description:
  <h1 align="center">atomea</h1>
  <h4 align="center">Extensible schema for atomistic data and calculations.</h4>
  <p align="center">
      <a href="https://github.com/oasci/atomea/actions/workflows/tests.yml">
          <img src="https://github.com/oasci/atomea/actions/workflows/tests.yml/badge.svg" alt="Build Status ">
      </a>
      <a href="https://github.com/oasci/atomea/actions/workflows/docs.yml">
          <img src="https://github.com/oasci/atomea/actions/workflows/docs.yml/badge.svg" alt="Build Status ">
      </a>
      <a href="https://badge.fury.io/py/atomea">
          <img src="https://badge.fury.io/py/atomea.svg" alt="PyPI version" height="18">
      </a>
      <img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/atomea">
      <a href="https://codecov.io/gh/oasci/simlify">
          <img src="https://codecov.io/gh/oasci/simlify/branch/main/graph/badge.svg" alt="codecov">
      </a>
      <a href="https://github.com/oasci/atomea/releases">
          <img src="https://img.shields.io/github/v/release/oasci/atomea" alt="GitHub release (latest by date)">
      </a>
      <a href="https://github.com/oasci/atomea/blob/main/LICENSE" target="_blank">
          <img src="https://img.shields.io/github/license/oasci/atomea" alt="License">
      </a>
      <a href="https://github.com/oasci/atomea/" target="_blank">
          <img src="https://img.shields.io/github/repo-size/oasci/atomea" alt="GitHub repo size">
      </a>
      <a href="https://github.com/psf/black" target="_blank">
          <img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Black style">
      </a>
      <a href="https://github.com/PyCQA/pylint" target="_blank">
          <img src="https://img.shields.io/badge/linting-pylint-yellowgreen" alt="Black style">
      </a>
      <a href="https://github.com/astral-sh/ruff" target="_blank">
          <img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Black style">
      </a>
  </p>
  <h4 align="center"><a href="https://atomea.oasci.org">Documentation</a></h4>



  Atomea is a Python package designed to simplify and standardize the setup and data management for atomistic data and calculations.
  It leverages the power of [Pydantic][pydantic] for schema definition and [Jinja2][jinja] templates for input file generation, making it easy to automate, document, and prepare input files for various computational chemistry and biology tools.



  -   **Extensible Schema Definition:** Easily define schemas for various computational packages using [Pydantic][pydantic].
  -   **Automated Input File Preparation:** Generate input files with [Jinja2][jinja] templates to ensure consistency and reproducibility.
  -   **Data Digestion:** Convert raw output files into optimized storage formats (e.g., [Zarr][zarr]) with a consistent interface.
  -   **YAML Integration:** Save and load configurations and data in YAML format for easy sharing and reproducibility.



  Atomea requires Python 3.10 or later.
  You can install it using pip, the Python package installer.
  This will install atomea along with its core dependencies: loguru, pydantic, pyyaml, and numpy.

  ```bash
  pip install atomea
  ```

  Atomea has several optional dependency groups that you can install based on your needs.
  You can include these when installing atomea or add them later.

  -   `storage`: Allows saving digested outputs to several file types.
  -   `sim`: Allows digesting simulations using MDAnalysis.

  For example, we can install both of these optional dependencies.

  ```bash
  pip install atomea[storage,sim]
  ```



  We use [bump-my-version](https://github.com/callowayproject/bump-my-version) to release a new version.
  This will create a git tag that is used by [poetry-dynamic-version](https://github.com/mtkennerly/poetry-dynamic-versioning) to generate version strings and update [`CHANGELOG.md`](https://gitlab.com/oasci/software/atomea/-/blob/main/CHANGELOG.md).

  For example, to bump the `minor` version you would run the following command.

  ```bash
  poetry run bump-my-version bump minor
  ```

  After releasing a new version, you need to push and include all tags.

  ```bash
  git push --follow-tags
  ```



  This project is released under the Apache-2.0 License as specified in [`LICENSE.md`](https://gitlab.com/oasci/software/atomea/-/blob/main/LICENSE.md).

  <!-- REFERENCES -->

  [pydantic]: https://docs.pydantic.dev/latest/
  [jinja]: https://palletsprojects.com/p/jinja/
  [zarr]: https://zarr.dev/


pkgId: 3b9543e5c8cb163690514f6a13a0d6b305709f2f2fcf4fe386c1405139e0c1ef
name: python-atomgrad
arch: src
version: 0.3.0
epoch: 0
release: 1
summary: An autocgrad engine that is between micrograd and tinygrad with a PyTorch-like neural network API:)
url: https://github.com/tanaydesai/atomgrad
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomgrad-0.3.0-1.src.rpm
checksum_type: sha256
description:
  ![pic](pic.jpeg)

  Atomgrad is a simple autograd engine that aims to be between [micrograd](https://github.com/karpathy/micrograd/) and [tinygrad](https://github.com/tinygrad/tinygrad) that performs autodiff on vector-valued and scalar-valued tensors (atoms) coupled with a neural network api library.



  - Supports Pytorch-like vector-valued and scalar-valued tensors.
  - Supports basic unary ops, binary ops, reduce ops and movement ops i.e (activn funcs, `sum`, `exp`, `reshape`, `randint`, `uniform`, etc).
  - Supports activation functions such as `relu`, `sigmoid`, `tanh`, etc.
  - Supports `binary_cross_entropy` & `binary_accuracy`.
  - Supports Graph Visualizations.



  You can install atomgrad using pip:

  ```bash
  pip install atomgrad==0.3.0
  ```



  Here is a simple example of using atomgrad to compute the gradient of a function:

  ```python
  from atomgrad.atom import Atom
  from atomgrad.graph import draw_dot



  x = Atom(2.0, requires_grad=True)
  y = Atom(3.0, requires_grad=True)


  z = x * y + x ** 2


  z.backward()


  print(x.grad) # 7.0
  print(y.grad) # 2.0

  draw_dot(z)
  ```
  ![pic](graph.png)

  Here is a simple example of using atomgrad to train a one 16-node hidden layer neural network for binary classification.

  ```python
  import numpy as np
  from atomgrad.atom import Atom
  from atomgrad.nn import AtomNet, Layer
  from atomgrad.optim import SGD
  from atomgrad.metrics import binary_cross_entropy, binary_accuracy


  model = AtomNet(
    Layer(2, 16),
    Layer(16, 16),
    Layer(16, 1)
  )

  optim = SGD(model.parameters(), lr=0.01)


  x = [[2.0, 3.0, -1.0],
    [3.0, -1.0, 0.5],
    [0.5, 1.0, 1.0],
    [1.0, 1.0, -1.0],
    [0.0, 4.0, 0.5],
    [3.0, -1.0, 0.5]]
  y = [1, 1, 0, 1, 0, 1]

  x = Atom(x)
  y = Atom(y)

  model.fit(x, y, optim, binary_cross_entropy, binary_accuracy, epochs=100)


  '''
  ...
  epoch: 30 | loss: 0.14601783454418182  | accuracy: 100.0%
  epoch: 35 | loss: 0.11600304394960403  | accuracy: 100.0%
  epoch: 40 | loss: 0.09604986757040024  | accuracy: 100.0%
  epoch: 45 | loss: 0.0816292017698288  | accuracy: 100.0%
  '''
  ```



  An example of simple autodiff and four binary classifiers including `make_moons` dataset and MNIST digits dataset is in the `examples/demos.ipynb` notebook.

  Note: Although `atom.nn` includes `softmax` activation and `cat_cross_entropy`, model results are quite dissapointing and are likely due to some bug (plz lmk if you find it!). As a result the `AtomNet` model is best suited for binary classification neural net tasks.


pkgId: ec56137c57b23b108a56b3c804f34f9a1d22b1b0f519c976f30fa83a38ae449f
name: python-atomic-agents
arch: src
version: 1.0.11
epoch: 0
release: 1
summary: A versatile framework for creating and managing intelligent agents.
url: https://pypi.org/project/atomic-agents/
rpm_license: LICENSE
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomic-agents-1.0.11-1.src.rpm
checksum_type: sha256
description:
  [![PyPI version](https://badge.fury.io/py/atomic-agents.svg)](https://badge.fury.io/py/atomic-agents)


pkgId: 8deadb5f591d02c0dbdf639bab5fdb06a499584038fd3360f2fc95bf9b2adc93
name: python-atomica
arch: src
version: 1.28.5
epoch: 0
release: 1
summary: Toolbox for compartment-based dynamic systems with costing and optimization
url: https://atomica.tools
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomica-1.28.5-1.src.rpm
checksum_type: sha256
description:
  [![Build Status](https://dev.azure.com/AtomicaTeam/Atomica/_apis/build/status/atomicateam.atomica?branchName=master)](https://dev.azure.com/AtomicaTeam/Atomica/_build/latest?definitionId=1&branchName=master)

  [![PyPi version](https://badgen.net/pypi/v/atomica/)](https://pypi.com/project/atomica)

  Atomica is a simulation engine for compartmental models. It can be used to simulate disease epidemics, health care cascades, and many other things.

  For detailed documentation, visit [https://atomica.tools/docs](https://atomica.tools/docs)



  Atomica is available for Python 3 only. Because we develop using Python 3.7, it is possible that dictionary order is relevant (although we endeavour to use ordered dictionaries via `Sciris` in places where order matters). Therefore, we only _officially_ support Python 3.7, as this is the first Python release that guarantees ordering of all dictionaries.

  Atomica is distributed via PyPI, and the PyPI version corresponds to `master` branch of this repository. To install via PyPI, it is only necessary to run

  ```
  pip install atomica
  ```

  Installation of `numpy`, `scipy` and `matplotlib` will automatically take place via `pip` because they are dependencies of Atomica. However, in practice these packages may require system-level setup so it is usually easiest to install them separately beforehand. We recommend using Anaconda, which facilitates getting the binaries and dependencies like QT installed in a platform-agnostic manner. We also recommend working within an Anaconda environment.

  You may also wish to install `mkl` first, before installing `numpy` etc. to improve performance. So for example:

  ```
  conda install mkl
  conda install numpy scipy matplotlib
  ```



  If you want to install a different branch of Atomica, or plan to make changes to the Atomica source code, you will need to install Atomica via Git rather than via PyPI. This can be performed using

  ```
  git clone https://github.com/atomicateam/atomica.git
  cd atomica
  pip install -e .
  ```



  Atomica includes a suite of tests, some of which get automatically run and others that are used manually. The automated test suite can be executed with `pytest`, and can be run from within an isolated environment using `tox`. To use the tests, you will need to follow the steps above to perform a 'Git installation' because the tests are not included in the PyPI distribution. After installation, you can run individual test scripts from the `tests` directory with commands like:

  ```
  python tests/testworkflow.py
  ```

  Note that many of the tests open `matplotlib` figures as part of the test. If the test script is run on a machine without a display available, the error

  ```
  _tkinter.TclError: couldn't connect to display "localhost:0.0"
  ```

  will be raised. In that case, simply set the `matplotlib` backend to `agg` which allows the calls to succeed with a display present. For example, run

  ```
  export MPLBACKEND=agg
  python tests/testworkflow.py
  ```

  To run the automated suite, install the test dependencies using

  ```
  pip install -r requirements.txt
  ```

  which will install the additional development dependencies. Then, to run the automated suite, from the root directory (the one containing `README.md`) run:

  ```
  pytest
  ```

  To run the tests in an isolated virtual environment, from the root directory, run

  ```
  tox
  ```

  If you don't have `tox`, install it using `pip install tox`. The default configuration expects Python 3.6 and Python 3.7 to be on your system - to test only against a specific version, pass the python version as an argument to `tox` e.g.

  ```
  tox -e py37
  ```

  to test Python 3.7 only.





  If running `pip install -e .` in a new environment, `numpy` must be installed prior to `scipy`. In some cases,
  installing `numpy` may fail due to missing compiler options. In that case, you may wish to install `numpy` via Anaconda
  (by installing Python through Anaconda, and using `conda install numpy scipy matplotlib`). In general, our experience
  has been that it is easier to set up the C binaries for `numpy` and the QT dependencies for `matplotlib` via Anaconda
  rather than doing this via the system, which involves different steps on every platform.



  On some systems, the default `matplotlib` backend may hang - this is not an issue with `atomica`. To resolve, try changing the backend by including

  ```
  import matplotlib
  matplotlib.use("Qt5Agg")
  ```

  at the very start of your script. A different backend may be required for your system. You can make the change persistant by setting the backend in your `matplotlibrc` file.


pkgId: ad031de8f93df97bdf62e0b2b724672864ce60c28107561fba7c446e5e4a0abb
name: python-atomicds
arch: src
version: 0.0.15
epoch: 0
release: 1
summary: API client for Atomic Data Sciences.
url: https://www.atomicdatasciences.com
rpm_license: GPL-3.0-only
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomicds-0.0.15-1.src.rpm
checksum_type: sha256
description:
  [![Testing](https://github.com/artificial-atomic-intelligence/api-client/workflows/Testing/badge.svg)](https://github.com/artificial-atomic-intelligence/api-client/actions?query=workflow:"Testing")
  [![GitHub tag](https://img.shields.io/github/tag/artificial-atomic-intelligence/api-client?include_prereleases=&sort=semver&color=blue)](https://github.com/artificial-atomic-intelligence/api-client/releases/)
  ![Python](https://img.shields.io/badge/Python-3.9+-blue.svg?logo=python&logoColor=white)
  [![License](https://img.shields.io/badge/License-GPLv3-blue)](#license)

  [![view - Documentation](https://img.shields.io/badge/view-Documentation-blue?style=for-the-badge)](https://atomic-data-sciences.github.io/api-client/)


pkgId: b7d78ce85e9f57ba40314fed9118d666fbaceedb75f6318342b8f2db5ebe8333
name: python-atomkraft
arch: src
version: 0.1.2
epoch: 0
release: 1
summary: Testing for Cosmos Blockchains
url: https://github.com/informalsystems/atomkraft
rpm_license: Apache-2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomkraft-0.1.2-1.src.rpm
checksum_type: sha256
description:
  Below we describe what Atomkraft is about, and explain the concepts behind the tool. In case you would like to skip that, and jump directly into action, please read our [Installation guide](./INSTALLATION.md) to install the tool; afterwards it's worth following either our [Cosmos SDK Token Transfer tutorial](examples/cosmos-sdk/transfer/transfer.md), or [CosmWasm tutorial](examples/cosmwasm/counter/README.md).

  We cover the following topics in this file:

  - [Atomkraft Introduction](#atomkraft-introduction)
  - [Conceptual overview](#conceptual-overview)
    - [Atomkraft project](#atomkraft-project)
    - [Local testnets](#local-testnets)
    - [Traces and reactors](#traces-and-reactors)
    - [Generating traces from TLA+ models](#generating-traces-from-tla-models)
    - [Running the tests against testnet](#running-the-tests-against-testnet)
  - [What's next: Atomkraft's immediate future](#whats-next-atomkrafts-immediate-future)
  - [Introductory video](#introductory-video)



  The [Cosmos Network](https://cosmos.network) of [IBC](https://ibcprotocol.org)-connected blockchains is growing tremendously fast. There is one aspect though, which has not been fully addressed yet, namely **quality assurance**: how do we make sure that Cosmos-based blockchains are secure, and don't contain security issues that pose hazards for user funds?

  **Atomkraft** is our answer to that question: it allows to generate and execute massive end-to-end (E2E) test suites for Cosmos SDK based blockchains. When designing the tool, we keep two main categories of users for it: **security auditors**, and **Cosmos SDK blockchain developers**. Those roles are abstract and non-exclusive, and they serve only to summarize some important concerns wrt. the deployed blockchains. Is Atomkraft the right tool for you? Below are some possible hints.

  Atomkraft is likely to benefit you as a _Security auditor_ if:

  - your blockchain (or the new version of it) is about to be launched, but you are unsure whether incentivized testnets allowed you to discover all critical vulnerabilities;
  - you are on tight time schedule for the new release, and you feel that the implementation has been rushed a little, so you are unsure that all corner cases of the new functionality has been covered.

  Atomkraft is likely to benefit you as a _Cosmos SDK developer_ if:

  - the new functionality you've implemented interacts in non-trivial ways with other important modules (e.g. with [bank](https://docs.cosmos.network/master/modules/bank/), [staking](https://docs.cosmos.network/master/modules/staking/), [authz](https://docs.cosmos.network/master/modules/authz/), etc.), and you are unsure whether some important invariants of those modules are preserved;
  - you want to grow and maintain a regression test suite for the blockchain modules you are developing, to make sure of their correctness as your blockchain evolves;
  - you want to automate quality assurance for your blockchain modules, and integrate fast E2E testing solution that's executed on every PR.

  **Key Atomkraft features** that allow to address the above concerns:

  - Push-button, but fully customizable, automation of local testnet creation
  - Clean, fully customizable trajectory from test case generation to its execution on the local testnet
  - Support for automatic generation of massive test suites from compact TLA+ models
  - Easy execution of test cases generated via other means (e.g. manual, BDD, PBT)
  - Anytime ready-to-integrate regression test suite in the form of a standard Pytest project
  - Ready-to-execute standard test suites for important Cosmos SDK modules (coming soon!)
  - Generation of reports and dashboards for presentation and analysis of testing results (coming soon!)



  In itself, Atomkraft is nothing more than a command-line application, which is as easy to obtain for your system as executing `pip install atomkraft`; please consult the detailed [Installation Instructions](INSTALLATION.md) if needed. At the top-level, Atomkraft provides you the commands illustrated in the diagram below.

  ![Atomkraft users](docs/images/atomkraft-users.svg)



  Working with Atomkraft takes place in the scope of an _Atomkraft project_, which is initialized via `atomkraft init` command. The command will setup a new project in a given directory and install all necessary software for it, all fully automatically.

  The good news is that an Atomkraft project is simultaneously a [Pytest](https://docs.pytest.org/) project! At any point in time you can execute `pytest` inside your Atomkraft project, and this command will rerun all tests you've created in the scope of this project. So, when you've executed `atomkraft init`, you've also started to create your regression test suite; congratulations!

  More than that, an Atomkraft project is also a [Python Poetry](https://python-poetry.org) project: you can treat it just as a normal Python project, and add your custom Python tests there.

  At the top level, an Atomkraft project contains the following:

  - Folders that hold the corresponding artifacts:
    - `models` is meant to keep your TLA+ models, if you are willing to generate test cases from formal models;
    - `traces` contain abstract test cases, represented in the form of [ITF traces](https://apalache.informal.systems/docs/adr/015adr-trace.html) (a JSON encoding of a sequence of test case steps);
    - `reactors` hold Python functions that interpret ITF traces, and map trace steps to concrete blockchain transactions;
    - in `tests` we collect all reproducible Pytest tests that are executed in the scope of this Atomkraft project;
    - finally, `reports` hold the test reports.
  - Configuration files:
    - `atomkraft.toml` contains Atomkraft project configuration;
    - `chain.toml` contains the blockchain configuration parameters, such as the number of nodes or the number of validators;
    - `model.toml` contains the TLA+ model configuration parameters, used to run model checkers;
    - `pyproject.toml` contains the Poetry project configuration.

  All of the above configuration files are filled with the default configuration, so you don't need to worry about them, if you don't want to. On the other hand, when needed, everything is fully customizable.



  With Atomkraft project created, you should be ready to go. By default, we configure local testnets to use the `gaiad` (Cosmos Hub) binary. If it is available via your `PATH`, executing `atomkraft chain testnet` should bring up a local testnet with 2 nodes and 3 validators. If you would like to configure any parameters differently (e.g. to run your custom blockchain binary), you can do it either via `atomkraft chain config` command, or by directly editing `chain.toml` config file. Please make sure your changes are valid by executing `atomkraft chain testnet`; we use the local testnet to run the tests.



  For describing test cases we use the [_Informal Trace Format_](https://apalache.informal.systems/docs/adr/015adr-trace.html), which is a JSON encoding of a sequence of steps, and each step encodes values of key state variables; please see [this example trace](examples/cosmos-sdk/transfer/example_trace.itf.json). The trace has been produced by our in-house [Apalache model checker](https://apalache.informal.systems) from [this TLA+ model](examples/cosmos-sdk/transfer/transfer.tla).

  ITF traces are abstract; in the example trace above, it holds wallet balances as a simple mapping `balances` from abstract addresses, represented as integers, to their balances, also represented as integers without denomination. There are two abstract actions in this trace: `Init`, and `Transfer`. In order to be able to replay the abstract trace on a blockchain, each of those abstract actions needs to be translated to a concrete transaction, as well as all abstract parameters of an action need to be translated to concrete values (e.g. an abstract integer address needs to be translated into a concrete Cosmos address). This translation step is performed by a component that we call `reactor`: a reactor is a centerpiece for an Atomkraft project, without which it can't function, similar to a nuclear reactor for the atomic power plant. You can see [this example reactor](examples/cosmos-sdk/transfer/reactor.py) that is able to playback the above trace on the blockchain.

  This separation between abstract traces and reactors, which apply abstract traces to concrete blockchains, is the crucial aspect of Atomkraft infrastructure; here is why:

  - Abstract traces are more maintainable than concrete tests. Concrete tests need to be updated on every small change in encoding, API, etc.; we have seen PRs with thousands of LOC concerning only with updating manually written tests. With the separation into traces and reactors, traces won't need to be updated in most cases; only the relatively small reactors will need small tweaks.
  - Abstract traces can be generated by whatever means: from model checkers such as [Apalache](https://apalache.informal.systems), via fuzzing, PBT, BDD, or even manually. How the abstract trace is produced, doesn't matter; it still can be executed using Atomkraft's infrastructure.
  - It is much easier to understand the intent of a test case expressed as an abstract trace, because of absence of excessive details.
  - Abstract traces are lightweight in terms of storage, which allows us to generate and maintain thousands of them, covering many corner cases, at no extra cost.

  We have automated the process of writing a reactor via `atomkraft reactor` command. A user needs only to supply the lists of actions, and of state variables, and the command will generate a reactor stub with a function for each action; what remains is only to fill the body of each such function.



  As explained above, abstract traces can be obtained by whatever means; we do not constrain the user in this respect. The most time efficient method, from our point of view, is to generate traces from formal models expressed in [TLA+](https://lamport.azurewebsites.net/tla/tla.html), the specification language designed by Leslie Lamport. For a gentle introduction to TLA+ you may use the Informal's [TLA+ Language Reference Manual](https://apalache.informal.systems/docs/lang/index.html) and [TLA+ Basics Tutorial](https://mbt.informal.systems/docs/tla_basics_tutorials/). While TLA+ may look scary for beginners, we can assure you that learning it will greatly improve your productivity when reasoning about (and testing!) both protocols and code.

  The good news is that we have done a thorough work in making user's life as easy as possible when working with TLA+ models, and using them to generate abstract test traces. All heavy-lifting work wrt. TLA+ models is done by our [Apalache](https://apalache.informal.systems) model checker. The model checker itself is meant for expert users; Atomkraft tries its best to hide excessive complexity from its users and exposes only the most essential functionality for working with models. You can access this functionality via `atomkraft model` command, which provides you with the functions like listed in the screenshot below:

  ![Atomkraft model](docs/images/atomkraft-model.png)

  The most important command in the scope of test case generation is `atomkraft model sample`. E.g. the command below (assuming you are in the Atomkraft project)

  ```sh
  atomkraft model sample --model-path models/transfer.tla --traces-dir traces --tests Ex
  ```

  will generate an abstract trace from the [transfer.tla](examples/cosmos-sdk/transfer/transfer.tla) model and the test predicate `Ex`, and store the generated trace in the `traces` directory of your Atomkraft project.



  Let's assume you've done all the steps outlined above:

  1. created a fresh Atomkraft project using `atomkraft init`
  2. configured a Cosmos-based blockchain of your choice using `atomkraft chain`
  3. created a reactor stub using `atomkraft reactor`, and populated it with code
  4. generated abstract traces from a TLA+ model using `atomkraft model sample`, or created abstract traces by some other means

  Then you are ready to go, and execute your tests! We provide two commands for doing that:

  - `atomkraft test trace` will accept an abstract trace and a reactor, spin the local testnet, and execute the trace against the testnet
  - `atomkraft test model` is a convenience shorthand that combines step 4 above (`atomkraft model sample`) with `atomkraft test trace`, and allows you to execute tests directly from a TLA+ model, sidestepping explicit trace generation.

  Both of the above `atomkraft test` commands populate the `tests` directory of your project with Pytest-based tests; so executing `pytest` inside your Atomkraft project at any point in time will reproduce all of your tests. In fact, the complete Atomkraft project directory is ready at any point in time to be exported, and used as a Pytest project, for example for reproducing your tests in the CI.



  Atomkraft's functionality outlined above represents the tool MVP: please feel free to employ it in your projects, and let us know of your experience: we are always ready to assist!

  There are many more features that are planned or are already being implemented; so stay tuned. Below is the preview of the future Atomkraft functionality:

  - **Standard test suites**: we have already started the effort to provide standard reactors and tests for most important Cosmos SDK modules: [bank](https://docs.cosmos.network/master/modules/bank/), [staking](https://docs.cosmos.network/master/modules/staking/), [authz](https://docs.cosmos.network/master/modules/authz/); you name it! This will serve the community at large, and will allow you, as an Atomkraft user, to easily bootstrap your new Atomkraft projects:
    - running standard test suites in your CI will make sure that your new functionality doesn't break the important blockchain invariants;
    - using standard test suites as blueprints will allow you to easily create your own tests suites via examination and adaptation of already existing tests.
  - **Test understanding and debugging**: we started to work in the direction of assisting the user in simplified creation and understanding of the test scenarios, as well as debugging the failed test runs:
    - for the former, we will provide the differential trace viewer, which highlights only the changes between the trace steps;
    - for the latter, we will provide the built-in blockchain explorer, and integrate into it the capabilities to trace back and forth between abstract trace steps and concrete blockchain transactions.
  - **Test reports and dashboards**: we plan to implement the functionality for generation of test reports as well as live dashboards that would provide an easy-to-grasp overview and categorization of executed and running tests.
  - **Exhaustiveness**: we plan to implement certain coverage metrics (e.g. transaction sequences up to specified length), and to help user achieving full coverage according to those metrics to provide confidence in the code in case no bugs are discovered.



  We have recorded a short video illustrating the basic Atomkraft usage:

  [![Atomkraft Introduction](https://img.youtube.com/vi/EBPypESyzqo/0.jpg)](https://www.youtube.com/watch?v=EBPypESyzqo)


pkgId: 3644bd47aa40c89632d242cdad06a73d6d834290ec1c919ed6fd19279d27b24b
name: python-atomos
arch: src
version: 0.3.1
epoch: 0
release: 1
summary: Atomic primitives for Python.
url: https://github.com/maxcountryman/atomos
rpm_license: BSD
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomos-0.3.1-1.src.rpm
checksum_type: sha256
description:
  Atomic primitives for Python.
  Links
  `````
  * `documentation <https://atomos.readthedocs.org/en/latest/>`_
  * `development version <https://github.com/maxcountryman/atomos>`_


pkgId: 928e0b8da2758bfd485f59ad1987d428a8eb04acfab3e2482bc041592f630aed
name: python-atomrdf
arch: src
version: 0.9.17
epoch: 0
release: 1
summary: Ontology based structural manipulation and quering
url: https://pyscal.org
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atomrdf-0.9.17-1.src.rpm
checksum_type: sha256
description:
  > [!NOTE]
  > `atomRDF` was previously called `pyscal-rdf`.

  [![codecov](https://codecov.io/gh/pyscal/atomRDF/graph/badge.svg?token=X7S3TP2MP6)](https://codecov.io/gh/pyscal/atomRDF)
  [![Conda Version](https://img.shields.io/conda/vn/conda-forge/atomrdf.svg)](https://anaconda.org/conda-forge/atomrdf)
  ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/atomrdf?label=pypi&link=https%3A%2F%2Fpypi.org%2Fproject%2Fatomrdf%2F)
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10973374.svg)](https://doi.org/10.5281/zenodo.10973374)

  `atomRDF` is a python tool for ontology-based creation, manipulation, and quering of structures. `atomRDF` uses the [Computational Material Sample Ontology (CMSO)](https://github.com/Materials-Data-Science-and-Informatics/cmso-ontology).

  The package is currently under activate development and could be  unstable .

  More details coming soon...



  This work is supported by the [NFDI-Matwerk](https://nfdi-matwerk.de/) consortia.

  Funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) under the National Research Data Infrastructure – NFDI 38/1 – project number 460247524


pkgId: 0f95871ff9de53e58f30b5d9ae338eddae2a9d4a5e25c3287ee3393a9ad2b92a
name: python-atools
arch: src
version: 0.14.2
epoch: 0
release: 1
summary: Python 3.6+ async/sync memoize and rate decorators
url: https://github.com/cevans87/atools
rpm_license: mit
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atools-0.14.2-1.src.rpm
checksum_type: sha256
description:
  [![Coverage Status](https://coveralls.io/repos/github/cevans87/atools/badge.svg?branch=master&kill_cache=1)](https://coveralls.io/github/cevans87/atools?branch=master)

  Python 3.6+ decorators including

  - `@memoize` - a function decorator for sync and async functions that memoizes results.
  - `@rate` - a function decorator for sync and async functions that rate limits calls.


  Decorates a function call and caches return value for given inputs.
  - If `db_path` is provided, memos will persist on disk and reloaded during initialization.
  - If `duration` is provided, memos will only be valid for given `duration`.
  - If `keygen` is provided, memo hash keys will be created with given `keygen`.
  - If `pickler` is provided, persistent memos will (de)serialize using given `pickler`.
  - If `size` is provided, LRU memo will be evicted if current count exceeds given `size`.



  - Body will run once for unique input `bar` and result is cached.
      ```python3
      @memoize
      def foo(bar) -> Any: ...

      foo(1)  # Function actually called. Result cached.
      foo(1)  # Function not called. Cached result returned.
      foo(2)  # Function actually called. Result cached.
      ```

  - Same as above, but async.
      ```python3
      @memoize
      async def foo(bar) -> Any: ...

      
      
      await asyncio.gather(*[foo(1) for _ in range(10)])
      ```

  - Classes may be memoized.
      ```python3
      @memoize
      Class Foo:
          def init(self, _): ...

      Foo(1)  # Instance is actually created.
      Foo(1)  # Instance not created. Cached instance returned.
      Foo(2)  # Instance is actually created.
      ```

  - Calls `foo(1)`, `foo(bar=1)`, and `foo(1, baz='baz')` are equivalent and only cached once.
      ```python3
      @memoize
      def foo(bar, baz='baz'): ...
      ```

  - Only 2 items are cached. Acts as an LRU.
      ```python3
      @memoize(size=2)
      def foo(bar) -> Any: ...

      foo(1)  # LRU cache order [foo(1)]
      foo(2)  # LRU cache order [foo(1), foo(2)]
      foo(1)  # LRU cache order [foo(2), foo(1)]
      foo(3)  # LRU cache order [foo(1), foo(3)], foo(2) is evicted to keep cache size at 2
      ```

  - Items are evicted after 1 minute.
      ```python3
      @memoize(duration=datetime.timedelta(minutes=1))
      def foo(bar) -> Any: ...

      foo(1)  # Function actually called. Result cached.
      foo(1)  # Function not called. Cached result returned.
      sleep(61)
      foo(1)  # Function actually called. Cached result was too old.
      ```

  - Memoize can be explicitly reset through the function's `.memoize` attribute
      ```python3
      @memoize
      def foo(bar) -> Any: ...

      foo(1)  # Function actually called. Result cached.
      foo(1)  # Function not called. Cached result returned.
      foo.memoize.reset()
      foo(1)  # Function actually called. Cache was emptied.
      ```

  - Current cache length can be accessed through the function's `.memoize` attribute
      ```python3
      @memoize
      def foo(bar) -> Any: ...

      foo(1)
      foo(2)
      len(foo.memoize)  # returns 2
      ```

  - Alternate memo hash function can be specified. The inputs must match the function's.
      ```python3
      Class Foo:
          @memoize(keygen=lambda self, a, b, c: (a, b, c))  # Omit 'self' from hash key.
          def bar(self, a, b, c) -> Any: ...

      a, b = Foo(), Foo()

      
      a.bar(1, 2, 3)  # LRU cache order [Foo.bar(a, 1, 2, 3)]

      
      
      b.bar(1, 2, 3)  # Function not called. Cached result returned.
      ```

  - If part of the returned key from keygen is awaitable, it will be awaited.
      ```python3
      async def awaitable_key_part() -> Hashable: ...

      @memoize(keygen=lambda bar: (bar, awaitable_key_part()))
      async def foo(bar) -> Any: ...
      ```

  - If the memoized function is async and any part of the key is awaitable, it is awaited.
      ```python3
      async def morph_a(a: int) -> int: ...

      @memoize(keygen=lambda a, b, c: (morph_a(a), b, c))
      def foo(a, b, c) -> Any: ...
      ```

  - Properties can be memoized.
      ```python3
      Class Foo:
          @property
          @memoize
          def bar(self) -> Any: ...

      a = Foo()
      a.bar  # Function actually called. Result cached.
      a.bar  # Function not called. Cached result returned.

      b = Foo() # Memoize uses 'self' parameter in hash. 'b' does not share returns with 'a'
      b.bar  # Function actually called. Result cached.
      b.bar  # Function not called. Cached result returned.
      ```

  - Be careful with eviction on instance methods. Memoize is not instance-specific.
      ```python3
      Class Foo:
          @memoize(size=1)
          def bar(self, baz) -> Any: ...

      a, b = Foo(), Foo()
      a.bar(1)  # LRU cache order [Foo.bar(a, 1)]
      b.bar(1)  # LRU cache order [Foo.bar(b, 1)], Foo.bar(a, 1) is evicted
      a.bar(1)  # Foo.bar(a, 1) is actually called and cached again.
      ```

  - Values can persist to disk and be reloaded when memoize is initialized again.
      ```python3
      @memoize(db_path=Path.home() / '.memoize')
      def foo(a) -> Any: ...

      foo(1)  # Function actually called. Result cached.

      

      foo(1)  # Function not called. Cached result returned.
      ```

  - If not applied to a function, calling the decorator returns a partial application.
      ```python3
      memoize_db = memoize(db_path=Path.home() / '.memoize')

      @memoize_db(size=1)
      def foo(a) -> Any: ...

      @memoize_db(duration=datetime.timedelta(hours=1))
      def bar(b) -> Any: ...
      ```

  - Comparison equality does not affect memoize. Only hash equality matters.
      ```python3
      
      class Foo:
          
          def __eq__(self, other: Foo) -> bool:
              return True

      @memoize
      def bar(foo: Foo) -> Any: ...

      foo0, foo1 = Foo(), Foo()
      assert foo0 == foo1
      bar(foo0)  # Function called. Result cached.
      bar(foo1)  # Function called again, despite equality, due to different hash.
      ```



  It doesn't make sense to keep a memo if it's impossible to generate the same input again. Inputs
  that inherit the default `object.__hash__` are unique based on their id, and thus, their
  location in memory. If such inputs are garbage-collected, they are gone forever. For that
  reason, when those inputs are garbage collected, `memoize` will drop memos created using those
  inputs.

  - Memo lifetime is bound to the lifetime of any arguments that inherit `object.__hash__`.
      ```python3
      
      class Foo:
          ...

      @memoize
      def bar(foo: Foo) -> Any: ...

      bar(Foo())  # Memo is immediately deleted since Foo() is garbage collected.

      foo = Foo()
      bar(foo)  # Memo isn't deleted until foo is deleted.
      del foo  # Memo is deleted at the same time as foo.
      ```

  - Types that have specific, consistent hash functions (int, str, etc.) won't cause problems.
      ```python3
      @memoize
      def foo(a: int, b: str, c: Tuple[int, ...], d: range) -> Any: ...

      foo(1, 'bar', (1, 2, 3), range(42))  # Function called. Result cached.
      foo(1, 'bar', (1, 2, 3), range(42))  # Function not called. Cached result returned.
      ```

  - Classmethods rely on classes, which inherit from `object.__hash__`. However, classes are
    almost never garbage collected until a process exits so memoize will work as expected.

      ```python3
      class Foo:
        @classmethod
        @memoize
        def bar(cls) -> Any: ...

      foo = Foo()
      foo.bar()  # Function called. Result cached.
      foo.bar()  # Function not called. Cached result returned.

      del foo  # Memo not cleared since lifetime is bound to class Foo.

      foo = Foo()
      foo.bar()  # Function not called. Cached result returned.
      foo.bar()  # Function not called. Cached result returned.
      ```

  - Long-lasting object instances that inherit from `object.__hash__`.

      ```python3
      class Foo:

          @memoize
          def bar(self) -> Any: ...

      foo = Foo()
      foo.bar()  # Function called. Result cached.

      
      foo.bar()  # Function not called. Cached result returned.
      ```

  - Custom pickler may be specified for persistent memo (de)serialization.

      ```python3
      import dill

      @memoize(db_path='~/.memoize`, pickler=dill)
      def foo() -> Callable[[], None]:
          return lambda: None
      ```


  Function decorator that rate limits the number of calls to function.

  - `size` must be provided. It specifies the maximum number of calls that may be made
    concurrently and optionally within a given `duration` time window.
  - If `duration` is provided it limits the maximum call count to `size` in any given `duration`
    time window.


  - Only 2 concurrent calls allowed.
      ```python3
      @rate(size=2)
      def foo(): ...
      ```

  - Only 2 calls allowed per minute.
      ```python3
      @rate(size=2, duration=60)
      def foo(): ...
      ```

  - Same as above, but duration specified with a timedelta.
      ```python3
      @rate(size=2, duration=datetime.timedelta(minutes=1))
      def foo(): ...
      ```

  - Same as above, but async.
      ```python3
      @rate(size=2, duration=datetime.timedelta(minutes=1))
      async def foo(): ...
      ```

  - More advanced rate limiting is possible by composing multiple rate decorators.
      ```python3
      
      @rate(size=100, duration=60)
      @rate(size=10)
      def foo(): ...
      ```


pkgId: dcae927940a69350be6d2a32e4e86fd7f5bb886cbf41bbd7ba2de85fc3a3837c
name: python-atooms-pp
arch: src
version: 4.0.2
epoch: 0
release: 1
summary: Post-processing tools for particle simulations
url: https://pypi.org/project/atooms-pp/
rpm_license: GPLv3
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atooms-pp-4.0.2-1.src.rpm
checksum_type: sha256
description:
  [![pypi](https://img.shields.io/pypi/v/atooms-pp.svg)](https://pypi.python.org/pypi/atooms-pp/)
  [![version](https://img.shields.io/pypi/pyversions/atooms-pp.svg)](https://pypi.python.org/pypi/atooms-pp/)
  [![license](https://img.shields.io/pypi/l/atooms-pp.svg)](https://en.wikipedia.org/wiki/GNU_General_Public_License)
  [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/git/https%3A%2F%2Fframagit.org%2Fatooms%2Fpostprocessing/HEAD?labpath=docs%2Findex.ipynb)
  [![pipeline](https://framagit.org/atooms/postprocessing/badges/master/pipeline.svg)](https://framagit.org/atooms/postprocessing/badges/master/pipeline.svg)
  [![coverage report](https://framagit.org/atooms/postprocessing/badges/master/coverage.svg)](https://framagit.org/atooms/postprocessing/-/commits/master)

  A Python package to compute static and dynamic correlation functions from simulations of interacting particles, such as molecular dynamics or Monte Carlo simulations. Based on [atooms](https://framagit.org/atooms/atooms).



  Postprocessing works on trajectories. Any trajectory format recognized by
  [atooms](https://framagit.org/atooms/atooms.git) can be processed, for instance most "xyz" files
  should work fine. If you use a custom trajectory format, it is easy to [add it](https://atooms.frama.io/atooms/).

  As an example, we compute the structure factor S(k) from the file `trajectory.xyz` in the `data/` folder.



  ```sh
  pp.py --norigins 0.2 msd data/trajectory.xyz
  ```
  We just used 20% of the available time frames to compute the averages using the `--norigins` flag. Without it, `atooms-pp` applies an heuristics to determine the number of time frames required to achieve a reasonable data quality. The results of the calculation are stored in the file `data/trajectory.xyz.pp.sk`.



  The same calculation can be done from Python:

  ```python
  from atooms.trajectory import Trajectory
  import atooms.postprocessing as pp

  with Trajectory('data/trajectory.xyz') as t:
       p = pp.StructureFactor(t)
       p.do()
  ```



  Available correlation and distribution functions

  - *Real space*
    - radial distribution function
    - mean square displacement
    - velocity auto-correlation function
    - self overlap functions
    - collective overlap functions
    - dynamic susceptibility of the self overlap function
    - non-Gaussian parameter
    - bond-angle distribution
  - *Fourier space*
    - structure factor
    - spectral density
    - self intermediate scattering functions
    - collective intermediate scattering functions
    - four-point dynamic susceptibility



  Check out the [tutorial](https://atooms.frama.io/postprocessing/tutorial) for more examples and the [public API](https://atooms.frama.io/postprocessing/api/postprocessing) for full details.

  Org-mode and jupyter notebooks are available under `docs/`. You can run the tutorial interactively on [Binder]( https://mybinder.org/v2/git/https%3A%2F%2Fframagit.org%2Fatooms%2Fpostprocessing/HEAD?labpath=docs%2Findex.ipynb).



  Install with `pip`
  ```
  pip install atooms-pp
  ```

  Or clone the project repository
  ```
  git clone https://framagit.org/atooms/postprocessing.git
  cd postprocessing
  make install
  ```



  Contributions to the project are welcome. If you wish to contribute, check out [these guidelines](https://framagit.org/atooms/atooms/-/blob/master/CONTRIBUTING.md).



  Daniele Coslovich: https://www.units.it/daniele.coslovich/


pkgId: 6c7991a761a503d52d473edcdbea31ce9672d10b530117cf4a33f3dfb6f66560
name: python-atop
arch: src
version: 0.2.25
epoch: 0
release: 1
url: https://github.com/aaarghhh/a_TON_of_privacy
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atop-0.2.25-1.src.rpm
checksum_type: sha256
summary:
  "A TON of Privacy" formally called ATOP ... is a tool for conducting OSINT investigations on TON NFTs.

description:
  "A TON of Privacy" formally called ATOP ... is a tool for conducting OSINT investigations on TON (Telegram 🙃) NFTs.

  The TON network is increasingly integrated with the Telegram ecosystem, via NFT. Telegram allows people to purchase numbers, domains and nicknames through cryptocurrency.

  ATOP aims to give visibility into the addresses and details of the holders of these assets. Using this tool you will be able to retrieve:
  - Address of the owner
  - Scam status
  - Balance
  - Other related NFT

  ATOP supports:
  - TON DNS
  - TON NICKNAME
  - TON PHONE NUMBERS (+888)



  ```
  $ git clone https://github.com/aaarghhh/a_TON_of_privacy.git
  $ cd a_TON_of_privacy
  ```
  Install dependencies using pip and the file requirements.
  ```
  $ pip install -r requirements.txt
  ```

  ```
  $ pipx install atop
  ```



  If atop was installed as a **global package** (pipx):
  ```
  $ a-ton-of-privacy --target "+888 12345678"
  ```
  If atop was installed cloning the repository, from the root directory of the repository:
  ```
  cd src/

  ```
  It retrieves information about a:
  - Telephone numbers
  ```
  $ python3 /src/atop/atop.py --target "+888 12345678"
  ```
  - Nickname
  ```
  $ python3 /src/atop/atop.py --target @telegram_nickname
  ```
  - Domain
  ```
  $ python3 /src/atop/atop.py --target atop.ton
  ```
  The OUTPUT will contain information about the owner of the asset.
  ```
  Welcome in the realm of.....

   ▄▄▄         ▄▄▄█████▓ ▒█████   ███▄    █     ▒█████    █████▒
  ▒████▄       ▓  ██▒ ▓▒▒██▒  ██▒ ██ ▀█   █    ▒██▒  ██▒▓██   ▒
  ▒██  ▀█▄     ▒ ▓██░ ▒░▒██░  ██▒▓██  ▀█ ██▒   ▒██░  ██▒▒████ ░
  ░██▄▄▄▄██    ░ ▓██▓ ░ ▒██   ██░▓██▒  ▐▌██▒   ▒██   ██░░▓█▒  ░
   ▓█   ▓██▒     ▒██▒ ░ ░ ████▓▒░▒██░   ▓██░   ░ ████▓▒░░▒█░
   ▒▒   ▓▒█░     ▒ ░░   ░ ▒░▒░▒░ ░ ▒░   ▒ ▒    ░ ▒░▒░▒░  ▒ ░
    ▒   ▒▒ ░       ░      ░ ▒ ▒░ ░ ░░   ░ ▒░     ░ ▒ ▒░  ░
    ░   ▒        ░      ░ ░ ░ ▒     ░   ░ ░    ░ ░ ░ ▒   ░ ░
        ░  ░                ░ ░           ░        ░ ░

   ██▓███   ██▀███   ██▓ ██▒   █▓ ▄▄▄       ▄████▄▓██   ██▓
  ▓██░  ██▒▓██ ▒ ██▒▓██▒▓██░   █▒▒████▄    ▒██▀ ▀█ ▒██  ██▒
  ▓██░ ██▓▒▓██ ░▄█ ▒▒██▒ ▓██  █▒░▒██  ▀█▄  ▒▓█    ▄ ▒██ ██░
  ▒██▄█▓▒ ▒▒██▀▀█▄  ░██░  ▒██ █░░░██▄▄▄▄██ ▒▓▓▄ ▄██▒░ ▐██▓░
  ▒██▒ ░  ░░██▓ ▒██▒░██░   ▒▀█░   ▓█   ▓██▒▒ ▓███▀ ░░ ██▒▓░
  ▒▓▒░ ░  ░░ ▒▓ ░▒▓░░▓     ░ ▐░   ▒▒   ▓▒█░░ ░▒ ▒  ░ ██▒▒▒
  ░▒ ░       ░▒ ░ ▒░ ▒ ░   ░ ░░    ▒   ▒▒ ░  ░  ▒  ▓██ ░▒░
  ░░         ░░   ░  ▒ ░     ░░    ░   ▒   ░       ▒ ▒ ░░
              ░      ░        ░        ░  ░░ ░     ░ ░
                             ░             ░       ░ ░
  v 0.2.25

   [!] START CRAWLING.... NUMBER: +888XXXXXXXXXXXX

   [+]  Details for number: +8880XXXXXXXXXXXXXXXXX
    ├  Owner address:  0:c8351922XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ├  Is scam:  False
    ├  Last activity:  2023-XXXXXXXXXXXXx
    ├  Balance:  0.9XXXXXXXXXX
    └  ------------------------------------

   [+]  NFTs found: 2
    ├  Address: EQCJXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    |  Name: +888 XXXXXX, Kind: CollectionItem
    |  Collection: Anonymous Telegram Numbers
    |  Url: https://nft.fragment.com/number/XXXXX.webp
    |
    ├  Address: EQCnIG-ZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    |  Name: +888 XXXXXXX, Kind: CollectionItem
    |  Collection: Anonymous Telegram Numbers
    |  Url: https://nft.fragment.com/number/XXXXXX.webp
    └  ------------------------------------

  Process finished with exit code 0
  ```

  - The flag `-c` supports pivots and in depth analysis, ATM it helps to correlate TON domains to ENS domains, simply pivoting on the second-level domain.
  ```
  [+]  Details for domain ENS domain: xxxxxx.eth
    ├  Owner address:  0xd8xxxxxxxxxxxxxxxxxxxxxxx
    ├  Registration:  2020-xxxxxxxxxxxxxxxx
    ├  Expiry:  2034-xxxxxxxxxxxxxxxxxxxxxx
    └  ------------------------------------
  ```
  - The flag `-t` enable a TOR SOCK5 proxy for each connection.

  - The flag `-s` is silent so it doesn't print any result on stdout.

  - The flag `-p` will enable the pivot from TON NFT to TELEGRAM account, this is a new feature that requires a fine tune in order to avoid bad OPSEC mistake. **PLEASE READ THE NEXT CHAPTER CAREFULLY**

  - The flag `-l` it's a flag that let to create a session string. The session string is a string that could be used to authenticate to Telegram avoiding the use of SQLLITE, this string could be used in .env file in order to investigate on +888 TON numbers.

  ```
   [!] Please enter your API ID: 123232132131
   [!] Please enter your API Hash: 12321312321321321321321
   [!] Please enter your phone number: +112312312312 ( sock puppet account BEWARE!! )
  Please enter your phone (or bot token): >? +112312312312 ( sock puppet account BEWARE!! )
  Please enter the code you received: >? 12345
  Warning: Password input may be echoed.
  Please enter your password: xxxxxxxx
  ```

  - The parameter `--picpath`, if `-p` enabled, can contain a path where Telegram profile pics will be stored. Each file will be renamed as Telegram_id[.]extension.



  For using this new feature you need to be sure that you properly **‼️ setup a clean dedicated sock puppet ‼️**.
  You can follow different guide on how to create them with a disposable number.
  The sockpuppet need to be hardened as much is possible.



  Use this setting in order to hardening your Telegram account.
  ```
  Phone number -> Nobody
  Last Seen / Online -> Nobody
  Profile Pics -> Nobody
  Bio -> Nobody
  Forwarded Message -> Nobody
  Calls -> Nobody
  Group & Channel -> Nobody
  ```

  <p align="center">
    <img src="https://github-production-user-asset-6210df.s3.amazonaws.com/968839/271731626-75fdfdde-a997-40c9-8cca-d32f444ad276.png" />
  </p>

  After the sock puppet creation, You'll need API HASH and API KEY.
  Telegram 'API_ID' and 'API_HASH', which you can get by creating a developers account using this link: https://my.telegram.org/.
  Place these values in a .env file in the directory where you launch or set environment variable for the session, along with the phone number of your Telegram account:

  ```
  API_ID=123456
  API_HASH=aaaaaaaavvvvvvbbbbbbbbb1223
  PHONE_NUMBER=+11234XXXXXX
  SESSION_STRING=aabababababbababab123123...
  ```
  If your Telegram account was properly created and your file .env was installed in the directory where you launch the tool, a new SQLlite containing your Telegram session information will be created. If you'll use SESSION_STRING, the SQLlite file will be ignored and the authentication phase will skipped.


  Special thanks to Bellingcat Group for creating this project [Telegram Phone Number Checker](https://github.com/bellingcat/telegram-phone-number-checker), it helped me to realize that this method could be used on TON network too.


pkgId: 5a3e1b088ba09cba9ddc495cbe5804a25b4924a9d390a3ce11ee131a15589e0a
name: python-atoparser
arch: src
version: 3.3.0
epoch: 0
release: 1
summary: Utilities for reading Atop files natively in Python
url: https://pypi.org/project/atoparser/
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atoparser-3.3.0-1.src.rpm
checksum_type: sha256
description:
  [![os: linux](https://img.shields.io/badge/os-linux-blue)](https://docs.python.org/3.10/)
  [![python: 3.10+](https://img.shields.io/badge/python-3.10_|_3.11-blue)](https://devguide.python.org/versions)
  [![python style: google](https://img.shields.io/badge/python%20style-google-blue)](https://google.github.io/styleguide/pyguide.html)
  [![imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://github.com/PyCQA/isort)
  [![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
  [![code style: pycodestyle](https://img.shields.io/badge/code%20style-pycodestyle-green)](https://github.com/PyCQA/pycodestyle)
  [![doc style: pydocstyle](https://img.shields.io/badge/doc%20style-pydocstyle-green)](https://github.com/PyCQA/pydocstyle)
  [![static typing: mypy](https://img.shields.io/badge/static_typing-mypy-green)](https://github.com/python/mypy)
  [![linting: pylint](https://img.shields.io/badge/linting-pylint-yellowgreen)](https://github.com/PyCQA/pylint)
  [![testing: pytest](https://img.shields.io/badge/testing-pytest-yellowgreen)](https://github.com/pytest-dev/pytest)
  [![security: bandit](https://img.shields.io/badge/security-bandit-black)](https://github.com/PyCQA/bandit)
  [![license: MIT](https://img.shields.io/badge/license-MIT-lightgrey)](LICENSE)




  Atoparser is a zero dependency Atop log processing library written in Python. The library supports reading binary C data
  directly from compressed or uncompressed Atop log files, without the need to install Atop or call a subprocess.
  The converted data contains structured Python objects, that can then be used for JSON, CSV, or other types of output,
  storage, and analysis.

  For full information on the amazing performance monitoring software that creates these files, known as "Atop", refer to:
  [Atop - The one stop shop for all your tops](https://www.atoptool.nl/)




    * [Compatibility](#compatibility)
    * [Getting Started](#getting-started)
      * [Installation](#installation)
    * [How Tos](#how-tos)
      * [Read an Atop log with the example JSON command](#read-an-atop-log-with-the-example-json-command)
      * [Iterate over the C structs as Python objects](#iterate-over-the-c-structs-as-python-objects)
      * [Convert the C structs into JSON compatible objects](#convert-the-c-structs-into-json-compatible-objects)
      * [Contribute](#contribute)
      * [Advanced Guides](#advanced-guides)




  - Supports Python 3.10+
  - Supports Atop 1.26 and 2.3 through 2.11.






  Install Atoparser via pip:
  ```shell
  pip install atoparser
  ```

  Or via git clone:
  ```shell
  git clone <path to fork>
  cd atoparser
  pip install .
  ```

  Or build and install from wheel:
  ```shell

  git clone <path to fork>
  cd atoparser
  make wheel


  pip install dist/atoparser*.tar.gz
  ```





  ```shell
  atoparser ~/atop.log -P CPU --pretty
  ```


  ```python
  import atoparser

  with open(file, 'rb') as raw_file:
      header = atoparser.get_header(raw_file)
      for record, sstat, tstats, cgroups in atoparser.generate_statistics(raw_file, header):
          total_cycles = record.interval * sstat.cpu.nrcpu * header.hertz
          usage = 1 - sstat.cpu.all.itime / total_cycles
          print(f'CPU usage was {usage:.02%}')
  ```


  ```python
  import json
  import atoparser

  with open(file, 'rb') as raw_file:
      header = atoparser.get_header(raw_file)
      print(json.dumps(atoparser.struct_to_dict(header), indent=2))
  ```



  Refer to the [Contributing Guide](CONTRIBUTING.md) for information on how to contribute to this project.



  Refer to [Advanced How Tos](docs/HOW_TO.md) for more advanced topics, such as adding a new Atop version.


pkgId: 159e75fdff4d0d9aea121c7ab3c4d4e655a6b2be3f8f4620ad75b4fa71251e12
name: python-atopile
arch: src
version: 0.2.67
epoch: 0
release: 1
summary: A toolchain bringing the best of software development to the real-world!
url: https://github.com/atopile/atopile
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atopile-0.2.67-1.src.rpm
checksum_type: sha256
description:
  <h1 align="center">
      <picture>
      <source media="(prefers-color-scheme: dark)" srcset="https://github.com/atopile/atopile/assets/9785003/00f19584-18a2-4b5f-9ce4-1248798974dd">
      <source media="(prefers-color-scheme: light)" src="https://github.com/atopile/atopile/assets/9785003/d38941c1-d7c1-42e6-9b94-a62a0996bc19">
      <img alt="Shows a black logo in light color mode and a white one in dark color mode." src="https://github.com/atopile/atopile/assets/9785003/d38941c1-d7c1-42e6-9b94-a62a0996bc19">
      </picture>
  </h1>

  <div align="center">
      <a href="#">
          <img src="https://img.shields.io/pypi/v/atopile.svg" alt="Version" style="vertical-align:top; margin:6px 4px">
      </a>
      <a href="#">
          <img src="https://img.shields.io/github/license/atopile/atopile.svg" alt="License" style="vertical-align:top; margin:6px 4px">
      </a>
      <a href="#">
          <img src="https://github.com/atopile/atopile/actions/workflows/ci.yml/badge.svg" alt="Build status" style="vertical-align:top; margin:6px 4px">
      </a>
  </div>
  <h1 align="center">
      <br>
          <img src="docs/assets/images/code-layout-pcb.png" alt="Logo atopile" title="Logo atopile" />
      <br>
  </h1>


  `atopile` is a tool to build electronic circuit boards with code.


  What's your story in electronics? What would you like us to build? Come talk on discord.

  [![Discord Banner 3](https://discordapp.com/api/guilds/1022538123915300865/widget.png?style=banner2)](https://discord.gg/nr5V3QRUd3)




  ```python
  from "generics/resistors.ato" import Resistor
  from "generics/interfaces.ato" import Power, Pair

  module VDiv: #this name needs to match the name in the ato.yaml config file
      power = new Power
      output = new Pair

      r_top = new Resistor
      r_top.package = "0402"

      r_bottom = new Resistor
      r_bottom.package = "0402"

      power.vcc ~ r_top.p1; r_top.p2 ~ output.io
      output.io ~ r_bottom.p1; r_bottom.p2 ~ power.gnd; power.gnd ~ output.gnd

      v_in: voltage
      v_out: voltage
      i_q: current

      assert v_in * r_bottom.value / (r_top.value + r_bottom.value) within v_out
      assert v_in / (r_bottom.value + r_top.value) within i_q

      v_in = 3.3V +/- 2%
      v_out = 1.8V +/- 5%
      i_q = 1mA +/- 10%
  ```



  Define your design with **ato code**
  ```python
  import RP2040Kit from "rp2040/RP2040Kit.ato" # run `ato install rp2040` to install
  import LEDIndicatorRed from "generics/leds.ato"
  import LV2842Kit from "lv2842xlvddcr/lv2842kit.ato" # run `ato install lv2842xlvddcr` to install
  import USBCConn from "usb-connectors/usb-connectors.ato" # run `ato install usb-connectors` to install

  module Blinky:
      micro_controller = new RP2040Kit
      led_indicator = new LEDIndicatorRed
      voltage_regulator = new LV2842Kit
      usb_c_connector = new USBCConn

      usb_c_connector.power ~ voltage_regulator.power_in
      voltage_regulator.power_out ~ micro_controller.power
      micro_controller.gpio13 ~ led_indicator.input
      micro_controller.power.gnd ~ led_indicator.gnd

      led_indicator.v_in = 3.3volt +/-10%
  ```
  Generate a **block diagram** from code
  <h1 align="center">
      <picture>
      <img alt="Schematics example" src="docs/assets/images/block_diagram_example.png" style="width: 80%;">
      </picture>
  </h1>

  Produce **schematics** for documentation
  <h1 align="center">
      <picture>
      <img alt="Schematics example" src="docs/assets/images/schematic_example.png" style="width: 80%;">
      </picture>
  </h1>



  Checkout out the [servo drive project](https://github.com/atopile/spin-servo-drive) or the [swoop motion controller](https://github.com/atopile/swoop).



  Find our [documentation](https://atopile.io/), [installation video](https://www.youtube.com/watch?v=XqFhFs-FhQ0) and getting started [video](https://www.youtube.com/watch?v=7aeZLlA_VYA).

  `atopile` is on pypi.org: https://pypi.org/project/atopile/



  `atopile` requires *python3.11* or later, which you can install using your package manager or from [python.org](https://www.python.org/downloads/).

  Then just `pipx install atopile` and you're good to go!



  The objective of atopile is to help push forward these paradigms from the software world to hardware, mainly these points:

  * **Intelligent Design Capture**: Define hardware specifications like ratios and tolerances in code, enabling precise control and easy reuse of designs.
  * **Version Control Integration**: Use git to manage design changes, facilitating collaboration and ensuring each iteration is thoroughly reviewed and validated.
  * **Continuous Integration (CI)**: Implement CI to guarantee high-quality, compliant designs with every commit, represented by a green checkmark for assurance.

  Describing hardware with code might seem odd at first glance. But once you realize it introduces software development paradigms and toolchains to hardware design, you'll be hooked, just like we've become.

  Code can **capture the intelligence** you put into your work. Imagine configuring not the resistance values of a voltage divider, but its ratio and total resistance, all using **physical units** and **tolerances**. You can do this because someone before you described precisely what this module is and described the relationships between the values of the components and the function you care about. Now instead imagine what you can gain from **reusing** a buck design you can merely **configure** the target voltage and ripple of. Now imagine **installing** a [servo drive](https://github.com/atopile/spin-servo-drive) the same way you might numpy.

  Version controlling your designs using **git** means you can deeply **validate** and **review** changes a feature at a time, **isolated** from impacting others' work. It means you can detangle your organisation and **collaborate** on an unprecedented scale. We can forgo half-baked "releases" in favor of stamping a simple git-hash on our prototypes, providing an anchor off which to **associate test data** and expectations.

  Implementing CI to **test** our work ensures both **high-quality** and **compliance**, all summarised in a green check mark, emboldening teams to target excellence.



  Browse and submit your modules at [packages.atopile.io](https://packages.atopile.io)


pkgId: 80dc57ba157040467eb8b190fd9f9076ae3bc238ad67958e680932c2497d436d
name: python-atopile
arch: src
version: 0.2.69
epoch: 0
release: 1
summary: A toolchain bringing the best of software development to the real-world!
url: https://github.com/atopile/atopile
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-atopile-0.2.69-1.src.rpm
checksum_type: sha256
description:
  <h1 align="center">
      <picture>
      <source media="(prefers-color-scheme: dark)" srcset="https://github.com/atopile/atopile/assets/9785003/00f19584-18a2-4b5f-9ce4-1248798974dd">
      <source media="(prefers-color-scheme: light)" src="https://github.com/atopile/atopile/assets/9785003/d38941c1-d7c1-42e6-9b94-a62a0996bc19">
      <img alt="Shows a black logo in light color mode and a white one in dark color mode." src="https://github.com/atopile/atopile/assets/9785003/d38941c1-d7c1-42e6-9b94-a62a0996bc19">
      </picture>
  </h1>

  <div align="center">
      <a href="#">
          <img src="https://img.shields.io/pypi/v/atopile.svg" alt="Version" style="vertical-align:top; margin:6px 4px">
      </a>
      <a href="#">
          <img src="https://img.shields.io/github/license/atopile/atopile.svg" alt="License" style="vertical-align:top; margin:6px 4px">
      </a>
      <a href="#">
          <img src="https://github.com/atopile/atopile/actions/workflows/ci.yml/badge.svg" alt="Build status" style="vertical-align:top; margin:6px 4px">
      </a>
  </div>
  <h1 align="center">
      <br>
          <img src="docs/assets/images/code-layout-pcb.png" alt="Logo atopile" title="Logo atopile" />
      <br>
  </h1>


  `atopile` is a tool to build electronic circuit boards with code.


  What's your story in electronics? What would you like us to build? Come talk on discord.

  [![Discord Banner 3](https://discordapp.com/api/guilds/1022538123915300865/widget.png?style=banner2)](https://discord.gg/nr5V3QRUd3)




  ```python
  from "generics/resistors.ato" import Resistor
  from "generics/interfaces.ato" import Power, Pair

  module VDiv: #this name needs to match the name in the ato.yaml config file
      power = new Power
      output = new Pair

      r_top = new Resistor
      r_top.package = "0402"

      r_bottom = new Resistor
      r_bottom.package = "0402"

      power.vcc ~ r_top.p1; r_top.p2 ~ output.io
      output.io ~ r_bottom.p1; r_bottom.p2 ~ power.gnd; power.gnd ~ output.gnd

      v_in: voltage
      v_out: voltage
      i_q: current

      assert v_in * r_bottom.value / (r_top.value + r_bottom.value) within v_out
      assert v_in / (r_bottom.value + r_top.value) within i_q

      v_in = 3.3V +/- 2%
      v_out = 1.8V +/- 5%
      i_q = 1mA +/- 10%
  ```



  Define your design with **ato code**
  ```python
  import RP2040Kit from "rp2040/RP2040Kit.ato" # run `ato install rp2040` to install
  import LEDIndicatorRed from "generics/leds.ato"
  import LV2842Kit from "lv2842xlvddcr/lv2842kit.ato" # run `ato install lv2842xlvddcr` to install
  import USBCConn from "usb-connectors/usb-connectors.ato" # run `ato install usb-connectors` to install

  module Blinky:
      micro_controller = new RP2040Kit
      led_indicator = new LEDIndicatorRed
      voltage_regulator = new LV2842Kit
      usb_c_connector = new USBCConn

      usb_c_connector.power ~ voltage_regulator.power_in
      voltage_regulator.power_out ~ micro_controller.power
      micro_controller.gpio13 ~ led_indicator.input
      micro_controller.power.gnd ~ led_indicator.gnd

      led_indicator.v_in = 3.3volt +/-10%
  ```
  Generate a **block diagram** from code
  <h1 align="center">
      <picture>
      <img alt="Schematics example" src="docs/assets/images/block_diagram_example.png" style="width: 80%;">
      </picture>
  </h1>

  Produce **schematics** for documentation
  <h1 align="center">
      <picture>
      <img alt="Schematics example" src="docs/assets/images/schematic_example.png" style="width: 80%;">
      </picture>
  </h1>



  Checkout out the [servo drive project](https://github.com/atopile/spin-servo-drive) or the [swoop motion controller](https://github.com/atopile/swoop).



  Find our [documentation](https://atopile.io/), [installation video](https://www.youtube.com/watch?v=XqFhFs-FhQ0) and getting started [video](https://www.youtube.com/watch?v=7aeZLlA_VYA).

  `atopile` is on pypi.org: https://pypi.org/project/atopile/



  `atopile` requires *python3.11* or later, which you can install using your package manager or from [python.org](https://www.python.org/downloads/).

  Then just `pipx install atopile` and you're good to go!



  The objective of atopile is to help push forward these paradigms from the software world to hardware, mainly these points:

  * **Intelligent Design Capture**: Define hardware specifications like ratios and tolerances in code, enabling precise control and easy reuse of designs.
  * **Version Control Integration**: Use git to manage design changes, facilitating collaboration and ensuring each iteration is thoroughly reviewed and validated.
  * **Continuous Integration (CI)**: Implement CI to guarantee high-quality, compliant designs with every commit, represented by a green checkmark for assurance.

  Describing hardware with code might seem odd at first glance. But once you realize it introduces software development paradigms and toolchains to hardware design, you'll be hooked, just like we've become.

  Code can **capture the intelligence** you put into your work. Imagine configuring not the resistance values of a voltage divider, but its ratio and total resistance, all using **physical units** and **tolerances**. You can do this because someone before you described precisely what this module is and described the relationships between the values of the components and the function you care about. Now instead imagine what you can gain from **reusing** a buck design you can merely **configure** the target voltage and ripple of. Now imagine **installing** a [servo drive](https://github.com/atopile/spin-servo-drive) the same way you might numpy.

  Version controlling your designs using **git** means you can deeply **validate** and **review** changes a feature at a time, **isolated** from impacting others' work. It means you can detangle your organisation and **collaborate** on an unprecedented scale. We can forgo half-baked "releases" in favor of stamping a simple git-hash on our prototypes, providing an anchor off which to **associate test data** and expectations.

  Implementing CI to **test** our work ensures both **high-quality** and **compliance**, all summarised in a green check mark, emboldening teams to target excellence.



  Browse and submit your modules at [packages.atopile.io](https://packages.atopile.io)

rpm_license:
  Apache License Version 2.0, January 2004 http://www.apache.org/licenses/  TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION  1. Definitions.  "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.  "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.  "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.  "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.  "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.  "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.  "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).  "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.  "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."  "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:  (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and  (b) You must cause any modified files to carry prominent notices stating that You changed the files; and  (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and  (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.  You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.  END OF TERMS AND CONDITIONS  APPENDIX: How to apply the Apache License to your work.  To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!)  The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.  Copyright 2024 atopile  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at  http://www.apache.org/licenses/LICENSE-2.0  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


